/*!
* surveyjs - Survey JavaScript library v0.10.4
* (c) Devsoft Baltic O� - http://surveyjs.io/
* License: MIT (http://www.opensource.org/licenses/mit-license.php)
*/
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory();
else if(typeof define === 'function' && define.amd)
define("Survey", [], factory);
else if(typeof exports === 'object')
exports["Survey"] = factory();
else
root["Survey"] = factory();
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _react = __webpack_require__(1);
Object.keys(_react).forEach(function (key) {
if (key === "default" || key === "__esModule") return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function get() {
return _react[key];
}
});
});
var _assign = __webpack_require__(74);
Object.defineProperty(exports, "__assign", {
enumerable: true,
get: function get() {
return _assign.__assign;
}
});
var _SurveyNG = __webpack_require__(75);
Object.defineProperty(exports, "SurveyNG", {
enumerable: true,
get: function get() {
return _SurveyNG.SurveyNG;
}
});
Object.defineProperty(exports, "SurveyWindowNG", {
enumerable: true,
get: function get() {
return _SurveyNG.SurveyWindowNG;
}
});
/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.__extends = exports.QuestionFactory = exports.ReactQuestionFactory = exports.SurveyWindow = exports.SurveyQuestionRating = exports.SurveyProgress = exports.SurveyQuestionMatrixDynamicRow = exports.SurveyQuestionMatrixDynamic = exports.SurveyQuestionText = exports.SurveyQuestionRadiogroup = exports.SurveyQuestionMultipleTextItem = exports.SurveyQuestionMultipleText = exports.SurveyQuestionFile = exports.SurveyQuestionHtml = exports.SurveyQuestionMatrixRow = exports.SurveyQuestionMatrix = exports.SurveyQuestionMatrixDropdownRow = exports.SurveyQuestionMatrixDropdown = exports.SurveyQuestionDropdown = exports.SurveyQuestionCheckboxItem = exports.SurveyQuestionCheckbox = exports.SurveyQuestionComment = exports.SurveyQuestionCommentItem = exports.SurveyQuestionElementBase = exports.SurveyElementBase = exports.SurveyQuestionErrors = exports.SurveyQuestion = exports.SurveyRow = exports.SurveyPage = exports.SurveyNavigation = exports.SurveyNavigationBase = exports.Model = exports.ReactSurveyModel = exports.Survey = exports.defaultBootstrapCss = exports.defaultStandardCss = undefined;
var _model = __webpack_require__(2);
Object.keys(_model).forEach(function (key) {
if (key === "default" || key === "__esModule") return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function get() {
return _model[key];
}
});
});
var _cssstandard = __webpack_require__(36);
Object.defineProperty(exports, "defaultStandardCss", {
enumerable: true,
get: function get() {
return _cssstandard.defaultStandardCss;
}
});
var _cssbootstrap = __webpack_require__(37);
Object.defineProperty(exports, "defaultBootstrapCss", {
enumerable: true,
get: function get() {
return _cssbootstrap.defaultBootstrapCss;
}
});
var _reactSurvey = __webpack_require__(38);
Object.defineProperty(exports, "Survey", {
enumerable: true,
get: function get() {
return _reactSurvey.Survey;
}
});
var _reactsurveymodel = __webpack_require__(43);
Object.defineProperty(exports, "ReactSurveyModel", {
enumerable: true,
get: function get() {
return _reactsurveymodel.ReactSurveyModel;
}
});
Object.defineProperty(exports, "Model", {
enumerable: true,
get: function get() {
return _reactsurveymodel.ReactSurveyModel;
}
});
var _reactSurveyNavigationBase = __webpack_require__(50);
Object.defineProperty(exports, "SurveyNavigationBase", {
enumerable: true,
get: function get() {
return _reactSurveyNavigationBase.SurveyNavigationBase;
}
});
var _reactSurveyNavigation = __webpack_require__(49);
Object.defineProperty(exports, "SurveyNavigation", {
enumerable: true,
get: function get() {
return _reactSurveyNavigation.SurveyNavigation;
}
});
var _reactpage = __webpack_require__(44);
Object.defineProperty(exports, "SurveyPage", {
enumerable: true,
get: function get() {
return _reactpage.SurveyPage;
}
});
Object.defineProperty(exports, "SurveyRow", {
enumerable: true,
get: function get() {
return _reactpage.SurveyRow;
}
});
var _reactquestion = __webpack_require__(45);
Object.defineProperty(exports, "SurveyQuestion", {
enumerable: true,
get: function get() {
return _reactquestion.SurveyQuestion;
}
});
Object.defineProperty(exports, "SurveyQuestionErrors", {
enumerable: true,
get: function get() {
return _reactquestion.SurveyQuestionErrors;
}
});
var _reactquestionelement = __webpack_require__(47);
Object.defineProperty(exports, "SurveyElementBase", {
enumerable: true,
get: function get() {
return _reactquestionelement.SurveyElementBase;
}
});
Object.defineProperty(exports, "SurveyQuestionElementBase", {
enumerable: true,
get: function get() {
return _reactquestionelement.SurveyQuestionElementBase;
}
});
var _reactquestioncomment = __webpack_require__(46);
Object.defineProperty(exports, "SurveyQuestionCommentItem", {
enumerable: true,
get: function get() {
return _reactquestioncomment.SurveyQuestionCommentItem;
}
});
Object.defineProperty(exports, "SurveyQuestionComment", {
enumerable: true,
get: function get() {
return _reactquestioncomment.SurveyQuestionComment;
}
});
var _reactquestioncheckbox = __webpack_require__(52);
Object.defineProperty(exports, "SurveyQuestionCheckbox", {
enumerable: true,
get: function get() {
return _reactquestioncheckbox.SurveyQuestionCheckbox;
}
});
Object.defineProperty(exports, "SurveyQuestionCheckboxItem", {
enumerable: true,
get: function get() {
return _reactquestioncheckbox.SurveyQuestionCheckboxItem;
}
});
var _reactquestiondropdown = __webpack_require__(53);
Object.defineProperty(exports, "SurveyQuestionDropdown", {
enumerable: true,
get: function get() {
return _reactquestiondropdown.SurveyQuestionDropdown;
}
});
var _reactquestionmatrixdropdown = __webpack_require__(54);
Object.defineProperty(exports, "SurveyQuestionMatrixDropdown", {
enumerable: true,
get: function get() {
return _reactquestionmatrixdropdown.SurveyQuestionMatrixDropdown;
}
});
Object.defineProperty(exports, "SurveyQuestionMatrixDropdownRow", {
enumerable: true,
get: function get() {
return _reactquestionmatrixdropdown.SurveyQuestionMatrixDropdownRow;
}
});
var _reactquestionmatrix = __webpack_require__(55);
Object.defineProperty(exports, "SurveyQuestionMatrix", {
enumerable: true,
get: function get() {
return _reactquestionmatrix.SurveyQuestionMatrix;
}
});
Object.defineProperty(exports, "SurveyQuestionMatrixRow", {
enumerable: true,
get: function get() {
return _reactquestionmatrix.SurveyQuestionMatrixRow;
}
});
var _reactquestionhtml = __webpack_require__(56);
Object.defineProperty(exports, "SurveyQuestionHtml", {
enumerable: true,
get: function get() {
return _reactquestionhtml.SurveyQuestionHtml;
}
});
var _reactquestionfile = __webpack_require__(57);
Object.defineProperty(exports, "SurveyQuestionFile", {
enumerable: true,
get: function get() {
return _reactquestionfile.SurveyQuestionFile;
}
});
var _reactquestionmultipletext = __webpack_require__(58);
Object.defineProperty(exports, "SurveyQuestionMultipleText", {
enumerable: true,
get: function get() {
return _reactquestionmultipletext.SurveyQuestionMultipleText;
}
});
Object.defineProperty(exports, "SurveyQuestionMultipleTextItem", {
enumerable: true,
get: function get() {
return _reactquestionmultipletext.SurveyQuestionMultipleTextItem;
}
});
var _reactquestionradiogroup = __webpack_require__(59);
Object.defineProperty(exports, "SurveyQuestionRadiogroup", {
enumerable: true,
get: function get() {
return _reactquestionradiogroup.SurveyQuestionRadiogroup;
}
});
var _reactquestiontext = __webpack_require__(60);
Object.defineProperty(exports, "SurveyQuestionText", {
enumerable: true,
get: function get() {
return _reactquestiontext.SurveyQuestionText;
}
});
var _reactquestionmatrixdynamic = __webpack_require__(61);
Object.defineProperty(exports, "SurveyQuestionMatrixDynamic", {
enumerable: true,
get: function get() {
return _reactquestionmatrixdynamic.SurveyQuestionMatrixDynamic;
}
});
Object.defineProperty(exports, "SurveyQuestionMatrixDynamicRow", {
enumerable: true,
get: function get() {
return _reactquestionmatrixdynamic.SurveyQuestionMatrixDynamicRow;
}
});
var _reactSurveyProgress = __webpack_require__(51);
Object.defineProperty(exports, "SurveyProgress", {
enumerable: true,
get: function get() {
return _reactSurveyProgress.SurveyProgress;
}
});
var _reactquestionrating = __webpack_require__(62);
Object.defineProperty(exports, "SurveyQuestionRating", {
enumerable: true,
get: function get() {
return _reactquestionrating.SurveyQuestionRating;
}
});
var _reactSurveyWindow = __webpack_require__(63);
Object.defineProperty(exports, "SurveyWindow", {
enumerable: true,
get: function get() {
return _reactSurveyWindow.SurveyWindow;
}
});
var _reactquestionfactory = __webpack_require__(48);
Object.defineProperty(exports, "ReactQuestionFactory", {
enumerable: true,
get: function get() {
return _reactquestionfactory.ReactQuestionFactory;
}
});
Object.defineProperty(exports, "QuestionFactory", {
enumerable: true,
get: function get() {
return _reactquestionfactory.ReactQuestionFactory;
}
});
var _extends = __webpack_require__(4);
Object.defineProperty(exports, "__extends", {
enumerable: true,
get: function get() {
return _extends.__extends;
}
});
__webpack_require__(64);
/***/ },
/* 2 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _validator = __webpack_require__(3);
Object.defineProperty(exports, "AnswerCountValidator", {
enumerable: true,
get: function get() {
return _validator.AnswerCountValidator;
}
});
Object.defineProperty(exports, "EmailValidator", {
enumerable: true,
get: function get() {
return _validator.EmailValidator;
}
});
Object.defineProperty(exports, "NumericValidator", {
enumerable: true,
get: function get() {
return _validator.NumericValidator;
}
});
Object.defineProperty(exports, "RegexValidator", {
enumerable: true,
get: function get() {
return _validator.RegexValidator;
}
});
Object.defineProperty(exports, "SurveyValidator", {
enumerable: true,
get: function get() {
return _validator.SurveyValidator;
}
});
Object.defineProperty(exports, "TextValidator", {
enumerable: true,
get: function get() {
return _validator.TextValidator;
}
});
Object.defineProperty(exports, "ValidatorResult", {
enumerable: true,
get: function get() {
return _validator.ValidatorResult;
}
});
Object.defineProperty(exports, "ValidatorRunner", {
enumerable: true,
get: function get() {
return _validator.ValidatorRunner;
}
});
var _base = __webpack_require__(5);
Object.defineProperty(exports, "Base", {
enumerable: true,
get: function get() {
return _base.Base;
}
});
Object.defineProperty(exports, "Event", {
enumerable: true,
get: function get() {
return _base.Event;
}
});
Object.defineProperty(exports, "ItemValue", {
enumerable: true,
get: function get() {
return _base.ItemValue;
}
});
Object.defineProperty(exports, "SurveyError", {
enumerable: true,
get: function get() {
return _base.SurveyError;
}
});
var _choicesRestfull = __webpack_require__(9);
Object.defineProperty(exports, "ChoicesRestfull", {
enumerable: true,
get: function get() {
return _choicesRestfull.ChoicesRestfull;
}
});
var _conditions = __webpack_require__(10);
Object.defineProperty(exports, "Condition", {
enumerable: true,
get: function get() {
return _conditions.Condition;
}
});
Object.defineProperty(exports, "ConditionNode", {
enumerable: true,
get: function get() {
return _conditions.ConditionNode;
}
});
Object.defineProperty(exports, "ConditionRunner", {
enumerable: true,
get: function get() {
return _conditions.ConditionRunner;
}
});
var _conditionsParser = __webpack_require__(11);
Object.defineProperty(exports, "ConditionsParser", {
enumerable: true,
get: function get() {
return _conditionsParser.ConditionsParser;
}
});
var _conditionProcessValue = __webpack_require__(12);
Object.defineProperty(exports, "ProcessValue", {
enumerable: true,
get: function get() {
return _conditionProcessValue.ProcessValue;
}
});
var _error = __webpack_require__(6);
Object.defineProperty(exports, "CustomError", {
enumerable: true,
get: function get() {
return _error.CustomError;
}
});
Object.defineProperty(exports, "ExceedSizeError", {
enumerable: true,
get: function get() {
return _error.ExceedSizeError;
}
});
Object.defineProperty(exports, "RequreNumericError", {
enumerable: true,
get: function get() {
return _error.RequreNumericError;
}
});
var _jsonobject = __webpack_require__(8);
Object.defineProperty(exports, "JsonError", {
enumerable: true,
get: function get() {
return _jsonobject.JsonError;
}
});
Object.defineProperty(exports, "JsonIncorrectTypeError", {
enumerable: true,
get: function get() {
return _jsonobject.JsonIncorrectTypeError;
}
});
Object.defineProperty(exports, "JsonMetadata", {
enumerable: true,
get: function get() {
return _jsonobject.JsonMetadata;
}
});
Object.defineProperty(exports, "JsonMetadataClass", {
enumerable: true,
get: function get() {
return _jsonobject.JsonMetadataClass;
}
});
Object.defineProperty(exports, "JsonMissingTypeError", {
enumerable: true,
get: function get() {
return _jsonobject.JsonMissingTypeError;
}
});
Object.defineProperty(exports, "JsonMissingTypeErrorBase", {
enumerable: true,
get: function get() {
return _jsonobject.JsonMissingTypeErrorBase;
}
});
Object.defineProperty(exports, "JsonObject", {
enumerable: true,
get: function get() {
return _jsonobject.JsonObject;
}
});
Object.defineProperty(exports, "JsonObjectProperty", {
enumerable: true,
get: function get() {
return _jsonobject.JsonObjectProperty;
}
});
Object.defineProperty(exports, "JsonRequiredPropertyError", {
enumerable: true,
get: function get() {
return _jsonobject.JsonRequiredPropertyError;
}
});
Object.defineProperty(exports, "JsonUnknownPropertyError", {
enumerable: true,
get: function get() {
return _jsonobject.JsonUnknownPropertyError;
}
});
var _question_matrixdropdownbase = __webpack_require__(13);
Object.defineProperty(exports, "MatrixDropdownCell", {
enumerable: true,
get: function get() {
return _question_matrixdropdownbase.MatrixDropdownCell;
}
});
Object.defineProperty(exports, "MatrixDropdownColumn", {
enumerable: true,
get: function get() {
return _question_matrixdropdownbase.MatrixDropdownColumn;
}
});
Object.defineProperty(exports, "MatrixDropdownRowModelBase", {
enumerable: true,
get: function get() {
return _question_matrixdropdownbase.MatrixDropdownRowModelBase;
}
});
Object.defineProperty(exports, "QuestionMatrixDropdownModelBase", {
enumerable: true,
get: function get() {
return _question_matrixdropdownbase.QuestionMatrixDropdownModelBase;
}
});
var _question_matrixdropdown = __webpack_require__(19);
Object.defineProperty(exports, "MatrixDropdownRowModel", {
enumerable: true,
get: function get() {
return _question_matrixdropdown.MatrixDropdownRowModel;
}
});
Object.defineProperty(exports, "QuestionMatrixDropdownModel", {
enumerable: true,
get: function get() {
return _question_matrixdropdown.QuestionMatrixDropdownModel;
}
});
var _question_matrixdynamic = __webpack_require__(20);
Object.defineProperty(exports, "MatrixDynamicRowModel", {
enumerable: true,
get: function get() {
return _question_matrixdynamic.MatrixDynamicRowModel;
}
});
Object.defineProperty(exports, "QuestionMatrixDynamicModel", {
enumerable: true,
get: function get() {
return _question_matrixdynamic.QuestionMatrixDynamicModel;
}
});
var _question_matrix = __webpack_require__(21);
Object.defineProperty(exports, "MatrixRowModel", {
enumerable: true,
get: function get() {
return _question_matrix.MatrixRowModel;
}
});
Object.defineProperty(exports, "QuestionMatrixModel", {
enumerable: true,
get: function get() {
return _question_matrix.QuestionMatrixModel;
}
});
var _question_multipletext = __webpack_require__(22);
Object.defineProperty(exports, "MultipleTextItemModel", {
enumerable: true,
get: function get() {
return _question_multipletext.MultipleTextItemModel;
}
});
Object.defineProperty(exports, "QuestionMultipleTextModel", {
enumerable: true,
get: function get() {
return _question_multipletext.QuestionMultipleTextModel;
}
});
var _page = __webpack_require__(23);
Object.defineProperty(exports, "PageModel", {
enumerable: true,
get: function get() {
return _page.PageModel;
}
});
Object.defineProperty(exports, "QuestionRowModel", {
enumerable: true,
get: function get() {
return _page.QuestionRowModel;
}
});
var _question = __webpack_require__(14);
Object.defineProperty(exports, "Question", {
enumerable: true,
get: function get() {
return _question.Question;
}
});
var _questionbase = __webpack_require__(15);
Object.defineProperty(exports, "QuestionBase", {
enumerable: true,
get: function get() {
return _questionbase.QuestionBase;
}
});
var _question_baseselect = __webpack_require__(17);
Object.defineProperty(exports, "QuestionCheckboxBase", {
enumerable: true,
get: function get() {
return _question_baseselect.QuestionCheckboxBase;
}
});
Object.defineProperty(exports, "QuestionSelectBase", {
enumerable: true,
get: function get() {
return _question_baseselect.QuestionSelectBase;
}
});
var _question_checkbox = __webpack_require__(24);
Object.defineProperty(exports, "QuestionCheckboxModel", {
enumerable: true,
get: function get() {
return _question_checkbox.QuestionCheckboxModel;
}
});
var _question_comment = __webpack_require__(25);
Object.defineProperty(exports, "QuestionCommentModel", {
enumerable: true,
get: function get() {
return _question_comment.QuestionCommentModel;
}
});
var _question_dropdown = __webpack_require__(26);
Object.defineProperty(exports, "QuestionDropdownModel", {
enumerable: true,
get: function get() {
return _question_dropdown.QuestionDropdownModel;
}
});
var _questionfactory = __webpack_require__(18);
Object.defineProperty(exports, "QuestionFactory", {
enumerable: true,
get: function get() {
return _questionfactory.QuestionFactory;
}
});
var _question_file = __webpack_require__(27);
Object.defineProperty(exports, "QuestionFileModel", {
enumerable: true,
get: function get() {
return _question_file.QuestionFileModel;
}
});
var _question_html = __webpack_require__(28);
Object.defineProperty(exports, "QuestionHtmlModel", {
enumerable: true,
get: function get() {
return _question_html.QuestionHtmlModel;
}
});
var _question_radiogroup = __webpack_require__(29);
Object.defineProperty(exports, "QuestionRadiogroupModel", {
enumerable: true,
get: function get() {
return _question_radiogroup.QuestionRadiogroupModel;
}
});
var _question_rating = __webpack_require__(30);
Object.defineProperty(exports, "QuestionRatingModel", {
enumerable: true,
get: function get() {
return _question_rating.QuestionRatingModel;
}
});
var _question_text = __webpack_require__(31);
Object.defineProperty(exports, "QuestionTextModel", {
enumerable: true,
get: function get() {
return _question_text.QuestionTextModel;
}
});
var _survey = __webpack_require__(32);
Object.defineProperty(exports, "SurveyModel", {
enumerable: true,
get: function get() {
return _survey.SurveyModel;
}
});
var _trigger = __webpack_require__(34);
Object.defineProperty(exports, "SurveyTrigger", {
enumerable: true,
get: function get() {
return _trigger.SurveyTrigger;
}
});
Object.defineProperty(exports, "SurveyTriggerComplete", {
enumerable: true,
get: function get() {
return _trigger.SurveyTriggerComplete;
}
});
Object.defineProperty(exports, "SurveyTriggerSetValue", {
enumerable: true,
get: function get() {
return _trigger.SurveyTriggerSetValue;
}
});
Object.defineProperty(exports, "SurveyTriggerVisible", {
enumerable: true,
get: function get() {
return _trigger.SurveyTriggerVisible;
}
});
Object.defineProperty(exports, "Trigger", {
enumerable: true,
get: function get() {
return _trigger.Trigger;
}
});
var _surveyWindow = __webpack_require__(35);
Object.defineProperty(exports, "SurveyWindowModel", {
enumerable: true,
get: function get() {
return _surveyWindow.SurveyWindowModel;
}
});
var _textPreProcessor = __webpack_require__(16);
Object.defineProperty(exports, "TextPreProcessor", {
enumerable: true,
get: function get() {
return _textPreProcessor.TextPreProcessor;
}
});
var _dxSurveyService = __webpack_require__(33);
Object.defineProperty(exports, "dxSurveyService", {
enumerable: true,
get: function get() {
return _dxSurveyService.dxSurveyService;
}
});
var _surveyStrings = __webpack_require__(7);
Object.defineProperty(exports, "surveyLocalization", {
enumerable: true,
get: function get() {
return _surveyStrings.surveyLocalization;
}
});
Object.defineProperty(exports, "surveyStrings", {
enumerable: true,
get: function get() {
return _surveyStrings.surveyStrings;
}
});
/***/ },
/* 3 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.EmailValidator = exports.RegexValidator = exports.AnswerCountValidator = exports.TextValidator = exports.NumericValidator = exports.ValidatorRunner = exports.SurveyValidator = exports.ValidatorResult = undefined;
var _base = __webpack_require__(5);
var _error = __webpack_require__(6);
var _surveyStrings = __webpack_require__(7);
var _jsonobject = __webpack_require__(8);
var ValidatorResult = exports.ValidatorResult = function () {
function ValidatorResult(value, error) {
if (error === void 0) {
error = null;
}
this.value = value;
this.error = error;
}
return ValidatorResult;
}();
var SurveyValidator = exports.SurveyValidator = function (_super) {
__extends(SurveyValidator, _super);
function SurveyValidator() {
_super.call(this);
this.text = "";
}
SurveyValidator.prototype.getErrorText = function (name) {
if (this.text) return this.text;
return this.getDefaultErrorText(name);
};
SurveyValidator.prototype.getDefaultErrorText = function (name) {
return "";
};
SurveyValidator.prototype.validate = function (value, name) {
if (name === void 0) {
name = null;
}
return null;
};
return SurveyValidator;
}(_base.Base);
var ValidatorRunner = exports.ValidatorRunner = function () {
function ValidatorRunner() {}
ValidatorRunner.prototype.run = function (owner) {
for (var i = 0; i < owner.validators.length; i++) {
var validatorResult = owner.validators[i].validate(owner.value, owner.getValidatorTitle());
if (validatorResult != null) {
if (validatorResult.error) return validatorResult.error;
if (validatorResult.value) {
owner.value = validatorResult.value;
}
}
}
return null;
};
return ValidatorRunner;
}();
var NumericValidator = exports.NumericValidator = function (_super) {
__extends(NumericValidator, _super);
function NumericValidator(minValue, maxValue) {
if (minValue === void 0) {
minValue = null;
}
if (maxValue === void 0) {
maxValue = null;
}
_super.call(this);
this.minValue = minValue;
this.maxValue = maxValue;
}
NumericValidator.prototype.getType = function () {
return "numericvalidator";
};
NumericValidator.prototype.validate = function (value, name) {
if (name === void 0) {
name = null;
}
if (!value || !this.isNumber(value)) {
return new ValidatorResult(null, new _error.RequreNumericError());
}
var result = new ValidatorResult(parseFloat(value));
if (this.minValue && this.minValue > result.value) {
result.error = new _error.CustomError(this.getErrorText(name));
return result;
}
if (this.maxValue && this.maxValue < result.value) {
result.error = new _error.CustomError(this.getErrorText(name));
return result;
}
return typeof value === 'number' ? null : result;
};
NumericValidator.prototype.getDefaultErrorText = function (name) {
var vName = name ? name : "value";
if (this.minValue && this.maxValue) {
return _surveyStrings.surveyLocalization.getString("numericMinMax")["format"](vName, this.minValue, this.maxValue);
} else {
if (this.minValue) {
return _surveyStrings.surveyLocalization.getString("numericMin")["format"](vName, this.minValue);
}
return _surveyStrings.surveyLocalization.getString("numericMax")["format"](vName, this.maxValue);
}
};
NumericValidator.prototype.isNumber = function (value) {
return !isNaN(parseFloat(value)) && isFinite(value);
};
return NumericValidator;
}(SurveyValidator);
var TextValidator = exports.TextValidator = function (_super) {
__extends(TextValidator, _super);
function TextValidator(minLength) {
if (minLength === void 0) {
minLength = 0;
}
_super.call(this);
this.minLength = minLength;
}
TextValidator.prototype.getType = function () {
return "textvalidator";
};
TextValidator.prototype.validate = function (value, name) {
if (name === void 0) {
name = null;
}
if (this.minLength <= 0) return;
if (value.length < this.minLength) {
return new ValidatorResult(null, new _error.CustomError(this.getErrorText(name)));
}
return null;
};
TextValidator.prototype.getDefaultErrorText = function (name) {
return _surveyStrings.surveyLocalization.getString("textMinLength")["format"](this.minLength);
};
return TextValidator;
}(SurveyValidator);
var AnswerCountValidator = exports.AnswerCountValidator = function (_super) {
__extends(AnswerCountValidator, _super);
function AnswerCountValidator(minCount, maxCount) {
if (minCount === void 0) {
minCount = null;
}
if (maxCount === void 0) {
maxCount = null;
}
_super.call(this);
this.minCount = minCount;
this.maxCount = maxCount;
}
AnswerCountValidator.prototype.getType = function () {
return "answercountvalidator";
};
AnswerCountValidator.prototype.validate = function (value, name) {
if (name === void 0) {
name = null;
}
if (value == null || value.constructor != Array) return null;
var count = value.length;
if (this.minCount && count < this.minCount) {
return new ValidatorResult(null, new _error.CustomError(this.getErrorText(_surveyStrings.surveyLocalization.getString("minSelectError")["format"](this.minCount))));
}
if (this.maxCount && count > this.maxCount) {
return new ValidatorResult(null, new _error.CustomError(this.getErrorText(_surveyStrings.surveyLocalization.getString("maxSelectError")["format"](this.maxCount))));
}
return null;
};
AnswerCountValidator.prototype.getDefaultErrorText = function (name) {
return name;
};
return AnswerCountValidator;
}(SurveyValidator);
var RegexValidator = exports.RegexValidator = function (_super) {
__extends(RegexValidator, _super);
function RegexValidator(regex) {
if (regex === void 0) {
regex = null;
}
_super.call(this);
this.regex = regex;
}
RegexValidator.prototype.getType = function () {
return "regexvalidator";
};
RegexValidator.prototype.validate = function (value, name) {
if (name === void 0) {
name = null;
}
if (!this.regex || !value) return null;
var re = new RegExp(this.regex);
if (re.test(value)) return null;
return new ValidatorResult(value, new _error.CustomError(this.getErrorText(name)));
};
return RegexValidator;
}(SurveyValidator);
var EmailValidator = exports.EmailValidator = function (_super) {
__extends(EmailValidator, _super);
function EmailValidator() {
_super.call(this);
this.re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
}
EmailValidator.prototype.getType = function () {
return "emailvalidator";
};
EmailValidator.prototype.validate = function (value, name) {
if (name === void 0) {
name = null;
}
if (!value) return null;
if (this.re.test(value)) return null;
return new ValidatorResult(value, new _error.CustomError(this.getErrorText(name)));
};
EmailValidator.prototype.getDefaultErrorText = function (name) {
return _surveyStrings.surveyLocalization.getString("invalidEmail");
};
return EmailValidator;
}(SurveyValidator);
_jsonobject.JsonObject.metaData.addClass("surveyvalidator", ["text"]);
_jsonobject.JsonObject.metaData.addClass("numericvalidator", ["minValue:number", "maxValue:number"], function () {
return new NumericValidator();
}, "surveyvalidator");
_jsonobject.JsonObject.metaData.addClass("textvalidator", ["minLength:number"], function () {
return new TextValidator();
}, "surveyvalidator");
_jsonobject.JsonObject.metaData.addClass("answercountvalidator", ["minCount:number", "maxCount:number"], function () {
return new AnswerCountValidator();
}, "surveyvalidator");
_jsonobject.JsonObject.metaData.addClass("regexvalidator", ["regex"], function () {
return new RegexValidator();
}, "surveyvalidator");
_jsonobject.JsonObject.metaData.addClass("emailvalidator", [], function () {
return new EmailValidator();
}, "surveyvalidator");
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 4 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.__extends = __extends;
function __extends(d, b) {
for (var p in b) {
if (b.hasOwnProperty(p)) d[p] = b[p];
}function __() {
this.constructor = d;
}
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
if (typeof module !== 'undefined' && module.exports) {
exports = module.exports = __extends;
}
exports.__extends = __extends;
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 5 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var ItemValue = exports.ItemValue = function () {
function ItemValue(value, text) {
if (text === void 0) {
text = null;
}
this.text = text;
this.value = value;
}
ItemValue.setData = function (items, values) {
items.length = 0;
for (var i = 0; i < values.length; i++) {
var value = values[i];
var item = new ItemValue(null);
if (typeof value.value !== 'undefined') {
var exception = null;
if (typeof value.getType !== 'undefined' && value.getType() == 'itemvalue') {
value.itemValue = value.itemValue;
item.itemText = value.itemText;
exception = ItemValue.itemValueProp;
}
ItemValue.copyAttributes(value, item, exception);
} else {
item.value = value;
}
items.push(item);
}
};
ItemValue.getData = function (items) {
var result = new Array();
for (var i = 0; i < items.length; i++) {
var item = items[i];
if (item.hasText) {
result.push({ value: item.value, text: item.text });
} else {
result.push(item.value);
}
}
return result;
};
ItemValue.getItemByValue = function (items, val) {
for (var i = 0; i < items.length; i++) {
if (items[i].value == val) return items[i];
}
return null;
};
ItemValue.copyAttributes = function (src, dest, exceptons) {
for (var key in src) {
if (typeof src[key] == 'function') continue;
if (exceptons && exceptons.indexOf(key) > -1) continue;
dest[key] = src[key];
}
};
ItemValue.prototype.getType = function () {
return "itemvalue";
};
Object.defineProperty(ItemValue.prototype, "value", {
get: function get() {
return this.itemValue;
},
set: function set(newValue) {
this.itemValue = newValue;
if (!this.itemValue) return;
var str = this.itemValue.toString();
var index = str.indexOf(ItemValue.Separator);
if (index > -1) {
this.itemValue = str.slice(0, index);
this.text = str.slice(index + 1);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(ItemValue.prototype, "hasText", {
get: function get() {
return this.itemText ? true : false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ItemValue.prototype, "text", {
get: function get() {
if (this.hasText) return this.itemText;
if (this.value) return this.value.toString();
return null;
},
set: function set(newText) {
this.itemText = newText;
},
enumerable: true,
configurable: true
});
ItemValue.Separator = '|';
ItemValue.itemValueProp = ["text", "value", "hasText"];
return ItemValue;
}();
var Base = exports.Base = function () {
function Base() {}
Base.prototype.getType = function () {
throw new Error('This method is abstract');
};
return Base;
}();
var SurveyError = exports.SurveyError = function () {
function SurveyError() {}
SurveyError.prototype.getText = function () {
throw new Error('This method is abstract');
};
return SurveyError;
}();
var SurveyPageId = exports.SurveyPageId = "sq_page";
var SurveyElement = exports.SurveyElement = function () {
function SurveyElement() {}
SurveyElement.ScrollElementToTop = function (elementId) {
if (!elementId) return false;
var el = document.getElementById(elementId);
if (!el || !el.scrollIntoView) return false;
var elemTop = el.getBoundingClientRect().top;
if (elemTop < 0) el.scrollIntoView();
return elemTop < 0;
};
SurveyElement.FocusElement = function (elementId) {
if (!elementId) return false;
var el = document.getElementById(elementId);
if (el) {
el.focus();
return true;
}
return false;
};
return SurveyElement;
}();
var Event = exports.Event = function () {
function Event() {}
Object.defineProperty(Event.prototype, "isEmpty", {
get: function get() {
return this.callbacks == null || this.callbacks.length == 0;
},
enumerable: true,
configurable: true
});
Event.prototype.fire = function (sender, options) {
if (this.callbacks == null) return;
for (var i = 0; i < this.callbacks.length; i++) {
var callResult = this.callbacks[i](sender, options);
}
};
Event.prototype.add = function (func) {
if (this.callbacks == null) {
this.callbacks = new Array();
}
this.callbacks.push(func);
};
Event.prototype.remove = function (func) {
if (this.callbacks == null) return;
var index = this.callbacks.indexOf(func, 0);
if (index != undefined) {
this.callbacks.splice(index, 1);
}
};
return Event;
}();
/***/ },
/* 6 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.CustomError = exports.ExceedSizeError = exports.RequreNumericError = exports.AnswerRequiredError = undefined;
var _surveyStrings = __webpack_require__(7);
var _base = __webpack_require__(5);
var AnswerRequiredError = exports.AnswerRequiredError = function (_super) {
__extends(AnswerRequiredError, _super);
function AnswerRequiredError() {
_super.call(this);
}
AnswerRequiredError.prototype.getText = function () {
return _surveyStrings.surveyLocalization.getString("requiredError");
};
return AnswerRequiredError;
}(_base.SurveyError);
var RequreNumericError = exports.RequreNumericError = function (_super) {
__extends(RequreNumericError, _super);
function RequreNumericError() {
_super.call(this);
}
RequreNumericError.prototype.getText = function () {
return _surveyStrings.surveyLocalization.getString("numericError");
};
return RequreNumericError;
}(_base.SurveyError);
var ExceedSizeError = exports.ExceedSizeError = function (_super) {
__extends(ExceedSizeError, _super);
function ExceedSizeError(maxSize) {
_super.call(this);
this.maxSize = maxSize;
}
ExceedSizeError.prototype.getText = function () {
return _surveyStrings.surveyLocalization.getString("exceedMaxSize")["format"](this.getTextSize());
};
ExceedSizeError.prototype.getTextSize = function () {
var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
var fixed = [0, 0, 2, 3, 3];
if (this.maxSize == 0) return '0 Byte';
var i = Math.floor(Math.log(this.maxSize) / Math.log(1024));
var value = this.maxSize / Math.pow(1024, i);
return value.toFixed(fixed[i]) + ' ' + sizes[i];
};
return ExceedSizeError;
}(_base.SurveyError);
var CustomError = exports.CustomError = function (_super) {
__extends(CustomError, _super);
function CustomError(text) {
_super.call(this);
this.text = text;
}
CustomError.prototype.getText = function () {
return this.text;
};
return CustomError;
}(_base.SurveyError);
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 7 */
/***/ function(module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var surveyLocalization = exports.surveyLocalization = {
currentLocale: "",
locales: {},
getString: function getString(strName) {
var loc = this.currentLocale ? this.locales[this.currentLocale] : surveyStrings;
if (!loc || !loc[strName]) loc = surveyStrings;
return loc[strName];
},
getLocales: function getLocales() {
var res = [];
res.push("");
for (var key in this.locales) {
res.push(key);
}
res.sort();
return res;
}
};
var surveyStrings = exports.surveyStrings = {
pagePrevText: "Previous",
pageNextText: "Next",
completeText: "Complete",
otherItemText: "Other (describe)",
progressText: "Page {0} of {1}",
emptySurvey: "There is no visible page or question in the survey.",
completingSurvey: "Thank you for completing the survey!",
loadingSurvey: "Survey is loading...",
optionsCaption: "Choose...",
requiredError: "Please answer the question.",
requiredInAllRowsError: "Please answer questions in all rows.",
numericError: "The value should be numeric.",
textMinLength: "Please enter at least {0} symbols.",
minRowCountError: "Please fill in at least {0} rows.",
minSelectError: "Please select at least {0} variants.",
maxSelectError: "Please select no more than {0} variants.",
numericMinMax: "The '{0}' should be equal or more than {1} and equal or less than {2}",
numericMin: "The '{0}' should be equal or more than {1}",
numericMax: "The '{0}' should be equal or less than {1}",
invalidEmail: "Please enter a valid e-mail address.",
urlRequestError: "The request returned error '{0}'. {1}",
urlGetChoicesError: "The request returned empty data or the 'path' property is incorrect",
exceedMaxSize: "The file size should not exceed {0}.",
otherRequiredError: "Please enter the other value.",
uploadingFile: "Your file is uploading. Please wait several seconds and try again.",
addRow: "Add row",
removeRow: "Remove"
};
surveyLocalization.locales["en"] = surveyStrings;
if (!String.prototype["format"]) {
String.prototype["format"] = function () {
var args = arguments;
return this.replace(/{(\d+)}/g, function (match, number) {
return typeof args[number] != 'undefined' ? args[number] : match;
});
};
}
/***/ },
/* 8 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var JsonObjectProperty = exports.JsonObjectProperty = function () {
function JsonObjectProperty(name) {
this.name = name;
this.typeValue = null;
this.choicesValue = null;
this.choicesfunc = null;
this.className = null;
this.classNamePart = null;
this.baseClassName = null;
this.defaultValue = null;
this.onGetValue = null;
}
Object.defineProperty(JsonObjectProperty.prototype, "type", {
get: function get() {
return this.typeValue ? this.typeValue : "string";
},
set: function set(value) {
this.typeValue = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "hasToUseGetValue", {
get: function get() {
return this.onGetValue;
},
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.isDefaultValue = function (value) {
return this.defaultValue ? this.defaultValue == value : !value;
};
JsonObjectProperty.prototype.getValue = function (obj) {
if (this.onGetValue) return this.onGetValue(obj);
return null;
};
Object.defineProperty(JsonObjectProperty.prototype, "hasToUseSetValue", {
get: function get() {
return this.onSetValue;
},
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.setValue = function (obj, value, jsonConv) {
if (this.onSetValue) {
this.onSetValue(obj, value, jsonConv);
}
};
JsonObjectProperty.prototype.getObjType = function (objType) {
if (!this.classNamePart) return objType;
return objType.replace(this.classNamePart, "");
};
JsonObjectProperty.prototype.getClassName = function (className) {
return this.classNamePart && className.indexOf(this.classNamePart) < 0 ? className + this.classNamePart : className;
};
Object.defineProperty(JsonObjectProperty.prototype, "choices", {
get: function get() {
if (this.choicesValue != null) return this.choicesValue;
if (this.choicesfunc != null) return this.choicesfunc();
return null;
},
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.setChoices = function (value, valueFunc) {
this.choicesValue = value;
this.choicesfunc = valueFunc;
};
return JsonObjectProperty;
}();
var JsonMetadataClass = exports.JsonMetadataClass = function () {
function JsonMetadataClass(name, properties, creator, parentName) {
if (creator === void 0) {
creator = null;
}
if (parentName === void 0) {
parentName = null;
}
this.name = name;
this.creator = creator;
this.parentName = parentName;
this.properties = null;
this.requiredProperties = null;
this.properties = new Array();
for (var i = 0; i < properties.length; i++) {
var prop = this.createProperty(properties[i]);
if (prop) {
this.properties.push(prop);
}
}
}
JsonMetadataClass.prototype.find = function (name) {
for (var i = 0; i < this.properties.length; i++) {
if (this.properties[i].name == name) return this.properties[i];
}
return null;
};
JsonMetadataClass.prototype.createProperty = function (propInfo) {
var propertyName = typeof propInfo === "string" ? propInfo : propInfo.name;
if (!propertyName) return;
var propertyType = null;
var typeIndex = propertyName.indexOf(JsonMetadataClass.typeSymbol);
if (typeIndex > -1) {
propertyType = propertyName.substring(typeIndex + 1);
propertyName = propertyName.substring(0, typeIndex);
}
propertyName = this.getPropertyName(propertyName);
var prop = new JsonObjectProperty(propertyName);
if (propertyType) {
prop.type = propertyType;
}
if ((typeof propInfo === "undefined" ? "undefined" : _typeof(propInfo)) === "object") {
if (propInfo.type) {
prop.type = propInfo.type;
}
if (propInfo.default) {
prop.defaultValue = propInfo.default;
}
if (propInfo.isRequired) {
this.makePropertyRequired(prop.name);
}
if (propInfo.choices) {
var choicesFunc = typeof propInfo.choices === "function" ? propInfo.choices : null;
var choicesValue = typeof propInfo.choices !== "function" ? propInfo.choices : null;
prop.setChoices(choicesValue, choicesFunc);
}
if (propInfo.onGetValue) {
prop.onGetValue = propInfo.onGetValue;
}
if (propInfo.onSetValue) {
prop.onSetValue = propInfo.onSetValue;
}
if (propInfo.className) {
prop.className = propInfo.className;
}
if (propInfo.baseClassName) {
prop.baseClassName = propInfo.baseClassName;
}
if (propInfo.classNamePart) {
prop.classNamePart = propInfo.classNamePart;
}
}
return prop;
};
JsonMetadataClass.prototype.getPropertyName = function (propertyName) {
if (propertyName.length == 0 || propertyName[0] != JsonMetadataClass.requiredSymbol) return propertyName;
propertyName = propertyName.slice(1);
this.makePropertyRequired(propertyName);
return propertyName;
};
JsonMetadataClass.prototype.makePropertyRequired = function (propertyName) {
if (!this.requiredProperties) {
this.requiredProperties = new Array();
}
this.requiredProperties.push(propertyName);
};
JsonMetadataClass.requiredSymbol = '!';
JsonMetadataClass.typeSymbol = ':';
return JsonMetadataClass;
}();
var JsonMetadata = exports.JsonMetadata = function () {
function JsonMetadata() {
this.classes = {};
this.childrenClasses = {};
this.classProperties = {};
this.classRequiredProperties = {};
}
JsonMetadata.prototype.addClass = function (name, properties, creator, parentName) {
if (creator === void 0) {
creator = null;
}
if (parentName === void 0) {
parentName = null;
}
var metaDataClass = new JsonMetadataClass(name, properties, creator, parentName);
this.classes[name] = metaDataClass;
if (parentName) {
var children = this.childrenClasses[parentName];
if (!children) {
this.childrenClasses[parentName] = [];
}
this.childrenClasses[parentName].push(metaDataClass);
}
return metaDataClass;
};
JsonMetadata.prototype.overrideClassCreatore = function (name, creator) {
var metaDataClass = this.findClass(name);
if (metaDataClass) {
metaDataClass.creator = creator;
}
};
JsonMetadata.prototype.getProperties = function (name) {
var properties = this.classProperties[name];
if (!properties) {
properties = new Array();
this.fillProperties(name, properties);
this.classProperties[name] = properties;
}
return properties;
};
JsonMetadata.prototype.createClass = function (name) {
var metaDataClass = this.findClass(name);
if (!metaDataClass) return null;
return metaDataClass.creator();
};
JsonMetadata.prototype.getChildrenClasses = function (name, canBeCreated) {
if (canBeCreated === void 0) {
canBeCreated = false;
}
var result = [];
this.fillChildrenClasses(name, canBeCreated, result);
return result;
};
JsonMetadata.prototype.getRequiredProperties = function (name) {
var properties = this.classRequiredProperties[name];
if (!properties) {
properties = new Array();
this.fillRequiredProperties(name, properties);
this.classRequiredProperties[name] = properties;
}
return properties;
};
JsonMetadata.prototype.addProperty = function (className, propertyInfo) {
var metaDataClass = this.findClass(className);
if (!metaDataClass) return;
var property = metaDataClass.createProperty(propertyInfo);
if (property) {
this.addPropertyToClass(metaDataClass, property);
this.emptyClassPropertiesHash(metaDataClass);
}
};
JsonMetadata.prototype.removeProperty = function (className, propertyName) {
var metaDataClass = this.findClass(className);
if (!metaDataClass) return false;
var property = metaDataClass.find(propertyName);
if (property) {
this.removePropertyFromClass(metaDataClass, property);
this.emptyClassPropertiesHash(metaDataClass);
}
};
JsonMetadata.prototype.addPropertyToClass = function (metaDataClass, property) {
if (metaDataClass.find(property.name) != null) return;
metaDataClass.properties.push(property);
};
JsonMetadata.prototype.removePropertyFromClass = function (metaDataClass, property) {
var index = metaDataClass.properties.indexOf(property);
if (index < 0) return;
metaDataClass.properties.splice(index, 1);
if (metaDataClass.requiredProperties) {
index = metaDataClass.requiredProperties.indexOf(property.name);
if (index >= 0) {
metaDataClass.requiredProperties.splice(index, 1);
}
}
};
JsonMetadata.prototype.emptyClassPropertiesHash = function (metaDataClass) {
this.classProperties[metaDataClass.name] = null;
var childClasses = this.getChildrenClasses(metaDataClass.name);
for (var i = 0; i < childClasses.length; i++) {
this.classProperties[childClasses[i].name] = null;
}
};
JsonMetadata.prototype.fillChildrenClasses = function (name, canBeCreated, result) {
var children = this.childrenClasses[name];
if (!children) return;
for (var i = 0; i < children.length; i++) {
if (!canBeCreated || children[i].creator) {
result.push(children[i]);
}
this.fillChildrenClasses(children[i].name, canBeCreated, result);
}
};
JsonMetadata.prototype.findClass = function (name) {
return this.classes[name];
};
JsonMetadata.prototype.fillProperties = function (name, list) {
var metaDataClass = this.findClass(name);
if (!metaDataClass) return;
if (metaDataClass.parentName) {
this.fillProperties(metaDataClass.parentName, list);
}
for (var i = 0; i < metaDataClass.properties.length; i++) {
this.addPropertyCore(metaDataClass.properties[i], list, list.length);
}
};
JsonMetadata.prototype.addPropertyCore = function (property, list, endIndex) {
var index = -1;
for (var i = 0; i < endIndex; i++) {
if (list[i].name == property.name) {
index = i;
break;
}
}
if (index < 0) {
list.push(property);
} else {
list[index] = property;
}
};
JsonMetadata.prototype.fillRequiredProperties = function (name, list) {
var metaDataClass = this.findClass(name);
if (!metaDataClass) return;
if (metaDataClass.requiredProperties) {
Array.prototype.push.apply(list, metaDataClass.requiredProperties);
}
if (metaDataClass.parentName) {
this.fillRequiredProperties(metaDataClass.parentName, list);
}
};
return JsonMetadata;
}();
var JsonError = exports.JsonError = function () {
function JsonError(type, message) {
this.type = type;
this.message = message;
this.description = "";
this.at = -1;
}
JsonError.prototype.getFullDescription = function () {
return this.message + (this.description ? "\n" + this.description : "");
};
return JsonError;
}();
var JsonUnknownPropertyError = exports.JsonUnknownPropertyError = function (_super) {
__extends(JsonUnknownPropertyError, _super);
function JsonUnknownPropertyError(propertyName, className) {
_super.call(this, "unknownproperty", "The property '" + propertyName + "' in class '" + className + "' is unknown.");
this.propertyName = propertyName;
this.className = className;
var properties = JsonObject.metaData.getProperties(className);
if (properties) {
this.description = "The list of available properties are: ";
for (var i = 0; i < properties.length; i++) {
if (i > 0) this.description += ", ";
this.description += properties[i].name;
}
this.description += '.';
}
}
return JsonUnknownPropertyError;
}(JsonError);
var JsonMissingTypeErrorBase = exports.JsonMissingTypeErrorBase = function (_super) {
__extends(JsonMissingTypeErrorBase, _super);
function JsonMissingTypeErrorBase(baseClassName, type, message) {
_super.call(this, type, message);
this.baseClassName = baseClassName;
this.type = type;
this.message = message;
this.description = "The following types are available: ";
var types = JsonObject.metaData.getChildrenClasses(baseClassName, true);
for (var i = 0; i < types.length; i++) {
if (i > 0) this.description += ", ";
this.description += "'" + types[i].name + "'";
}
this.description += ".";
}
return JsonMissingTypeErrorBase;
}(JsonError);
var JsonMissingTypeError = exports.JsonMissingTypeError = function (_super) {
__extends(JsonMissingTypeError, _super);
function JsonMissingTypeError(propertyName, baseClassName) {
_super.call(this, baseClassName, "missingtypeproperty", "The property type is missing in the object. Please take a look at property: '" + propertyName + "'.");
this.propertyName = propertyName;
this.baseClassName = baseClassName;
}
return JsonMissingTypeError;
}(JsonMissingTypeErrorBase);
var JsonIncorrectTypeError = exports.JsonIncorrectTypeError = function (_super) {
__extends(JsonIncorrectTypeError, _super);
function JsonIncorrectTypeError(propertyName, baseClassName) {
_super.call(this, baseClassName, "incorrecttypeproperty", "The property type is incorrect in the object. Please take a look at property: '" + propertyName + "'.");
this.propertyName = propertyName;
this.baseClassName = baseClassName;
}
return JsonIncorrectTypeError;
}(JsonMissingTypeErrorBase);
var JsonRequiredPropertyError = exports.JsonRequiredPropertyError = function (_super) {
__extends(JsonRequiredPropertyError, _super);
function JsonRequiredPropertyError(propertyName, className) {
_super.call(this, "requiredproperty", "The property '" + propertyName + "' is required in class '" + className + "'.");
this.propertyName = propertyName;
this.className = className;
}
return JsonRequiredPropertyError;
}(JsonError);
var JsonObject = exports.JsonObject = function () {
function JsonObject() {
this.errors = new Array();
}
Object.defineProperty(JsonObject, "metaData", {
get: function get() {
return JsonObject.metaDataValue;
},
enumerable: true,
configurable: true
});
JsonObject.prototype.toJsonObject = function (obj) {
return this.toJsonObjectCore(obj, null);
};
JsonObject.prototype.toObject = function (jsonObj, obj) {
if (!jsonObj) return;
var properties = null;
if (obj.getType) {
properties = JsonObject.metaData.getProperties(obj.getType());
}
if (!properties) return;
for (var key in jsonObj) {
if (key == JsonObject.typePropertyName) continue;
if (key == JsonObject.positionPropertyName) {
obj[key] = jsonObj[key];
continue;
}
var property = this.findProperty(properties, key);
if (!property) {
this.addNewError(new JsonUnknownPropertyError(key.toString(), obj.getType()), jsonObj);
continue;
}
this.valueToObj(jsonObj[key], obj, key, property);
}
};
JsonObject.prototype.toJsonObjectCore = function (obj, property) {
if (!obj.getType) return obj;
var result = {};
if (property != null && !property.className) {
result[JsonObject.typePropertyName] = property.getObjType(obj.getType());
}
var properties = JsonObject.metaData.getProperties(obj.getType());
for (var i = 0; i < properties.length; i++) {
this.valueToJson(obj, result, properties[i]);
}
return result;
};
JsonObject.prototype.valueToJson = function (obj, result, property) {
var value = null;
if (property.hasToUseGetValue) {
value = property.getValue(obj);
} else {
value = obj[property.name];
}
if (value === undefined || value === null) return;
if (property.isDefaultValue(value)) return;
if (this.isValueArray(value)) {
var arrValue = [];
for (var i = 0; i < value.length; i++) {
arrValue.push(this.toJsonObjectCore(value[i], property));
}
value = arrValue.length > 0 ? arrValue : null;
} else {
value = this.toJsonObjectCore(value, property);
}
if (!property.isDefaultValue(value)) {
result[property.name] = value;
}
};
JsonObject.prototype.valueToObj = function (value, obj, key, property) {
if (value == null) return;
if (property != null && property.hasToUseSetValue) {
property.setValue(obj, value, this);
return;
}
if (this.isValueArray(value)) {
this.valueToArray(value, obj, key, property);
return;
}
var newObj = this.createNewObj(value, property);
if (newObj.newObj) {
this.toObject(value, newObj.newObj);
value = newObj.newObj;
}
if (!newObj.error) {
obj[key] = value;
}
};
JsonObject.prototype.isValueArray = function (value) {
return value && value.constructor.toString().indexOf("Array") > -1;
};
JsonObject.prototype.createNewObj = function (value, property) {
var result = { newObj: null, error: null };
var className = value[JsonObject.typePropertyName];
if (!className && property != null && property.className) {
className = property.className;
}
className = property.getClassName(className);
result.newObj = className ? JsonObject.metaData.createClass(className) : null;
result.error = this.checkNewObjectOnErrors(result.newObj, value, property, className);
return result;
};
JsonObject.prototype.checkNewObjectOnErrors = function (newObj, value, property, className) {
var error = null;
if (newObj) {
var requiredProperties = JsonObject.metaData.getRequiredProperties(className);
if (requiredProperties) {
for (var i = 0; i < requiredProperties.length; i++) {
if (!value[requiredProperties[i]]) {
error = new JsonRequiredPropertyError(requiredProperties[i], className);
break;
}
}
}
} else {
if (property.baseClassName) {
if (!className) {
error = new JsonMissingTypeError(property.name, property.baseClassName);
} else {
error = new JsonIncorrectTypeError(property.name, property.baseClassName);
}
}
}
if (error) {
this.addNewError(error, value);
}
return error;
};
JsonObject.prototype.addNewError = function (error, jsonObj) {
if (jsonObj && jsonObj[JsonObject.positionPropertyName]) {
error.at = jsonObj[JsonObject.positionPropertyName].start;
}
this.errors.push(error);
};
JsonObject.prototype.valueToArray = function (value, obj, key, property) {
if (!this.isValueArray(obj[key])) {
obj[key] = [];
}
for (var i = 0; i < value.length; i++) {
var newValue = this.createNewObj(value[i], property);
if (newValue.newObj) {
obj[key].push(newValue.newObj);
this.toObject(value[i], newValue.newObj);
} else {
if (!newValue.error) {
obj[key].push(value[i]);
}
}
}
};
JsonObject.prototype.findProperty = function (properties, key) {
if (!properties) return null;
for (var i = 0; i < properties.length; i++) {
if (properties[i].name == key) return properties[i];
}
return null;
};
JsonObject.typePropertyName = "type";
JsonObject.positionPropertyName = "pos";
JsonObject.metaDataValue = new JsonMetadata();
return JsonObject;
}();
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 9 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ChoicesRestfull = undefined;
var _base = __webpack_require__(5);
var _jsonobject = __webpack_require__(8);
var _surveyStrings = __webpack_require__(7);
var _error = __webpack_require__(6);
var ChoicesRestfull = exports.ChoicesRestfull = function (_super) {
__extends(ChoicesRestfull, _super);
function ChoicesRestfull() {
_super.call(this);
this.url = "";
this.path = "";
this.valueName = "";
this.titleName = "";
this.error = null;
}
ChoicesRestfull.prototype.run = function () {
if (!this.url || !this.getResultCallback) return;
this.error = null;
var xhr = new XMLHttpRequest();
xhr.open('GET', this.url);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
var self = this;
xhr.onload = function () {
if (xhr.status == 200) {
self.onLoad(JSON.parse(xhr.response));
} else {
self.onError(xhr.statusText, xhr.responseText);
}
};
xhr.send();
};
ChoicesRestfull.prototype.getType = function () {
return "choicesByUrl";
};
Object.defineProperty(ChoicesRestfull.prototype, "isEmpty", {
get: function get() {
return !this.url && !this.path && !this.valueName && !this.titleName;
},
enumerable: true,
configurable: true
});
ChoicesRestfull.prototype.setData = function (json) {
this.clear();
if (json.url) this.url = json.url;
if (json.path) this.path = json.path;
if (json.valueName) this.valueName = json.valueName;
if (json.titleName) this.titleName = json.titleName;
};
ChoicesRestfull.prototype.clear = function () {
this.url = "";
this.path = "";
this.valueName = "";
this.titleName = "";
};
ChoicesRestfull.prototype.onLoad = function (result) {
var items = [];
result = this.getResultAfterPath(result);
if (result && result["length"]) {
for (var i = 0; i < result.length; i++) {
var itemValue = result[i];
if (!itemValue) continue;
var value = this.getValue(itemValue);
var title = this.getTitle(itemValue);
items.push(new _base.ItemValue(value, title));
}
} else {
this.error = new _error.CustomError(_surveyStrings.surveyLocalization.getString("urlGetChoicesError"));
}
this.getResultCallback(items);
};
ChoicesRestfull.prototype.onError = function (status, response) {
this.error = new _error.CustomError(_surveyStrings.surveyLocalization.getString("urlRequestError")["format"](status, response));
this.getResultCallback([]);
};
ChoicesRestfull.prototype.getResultAfterPath = function (result) {
if (!result) return result;
if (!this.path) return result;
var pathes = this.getPathes();
for (var i = 0; i < pathes.length; i++) {
result = result[pathes[i]];
if (!result) return null;
}
return result;
};
ChoicesRestfull.prototype.getPathes = function () {
var pathes = [];
if (this.path.indexOf(';') > -1) {
pathes = this.path.split(';');
} else {
pathes = this.path.split(',');
}
if (pathes.length == 0) pathes.push(this.path);
return pathes;
};
ChoicesRestfull.prototype.getValue = function (item) {
if (this.valueName) return item[this.valueName];
var len = Object.keys(item).length;
if (len < 1) return null;
return item[Object.keys(item)[0]];
};
ChoicesRestfull.prototype.getTitle = function (item) {
if (!this.titleName) return null;
return item[this.titleName];
};
return ChoicesRestfull;
}(_base.Base);
_jsonobject.JsonObject.metaData.addClass("choicesByUrl", ["url", "path", "valueName", "titleName"], function () {
return new ChoicesRestfull();
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 10 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ConditionRunner = exports.ConditionNode = exports.Condition = undefined;
var _conditionsParser = __webpack_require__(11);
var _conditionProcessValue = __webpack_require__(12);
var Condition = exports.Condition = function () {
function Condition() {
this.opValue = "equal";
}
Object.defineProperty(Condition, "operators", {
get: function get() {
if (Condition.operatorsValue != null) return Condition.operatorsValue;
Condition.operatorsValue = {
empty: function empty(left, right) {
return !left;
},
notempty: function notempty(left, right) {
return !!left;
},
equal: function equal(left, right) {
return left == right;
},
notequal: function notequal(left, right) {
return left != right;
},
contains: function contains(left, right) {
return left && left["indexOf"] && left.indexOf(right) > -1;
},
notcontains: function notcontains(left, right) {
return !left || !left["indexOf"] || left.indexOf(right) == -1;
},
greater: function greater(left, right) {
return left > right;
},
less: function less(left, right) {
return left < right;
},
greaterorequal: function greaterorequal(left, right) {
return left >= right;
},
lessorequal: function lessorequal(left, right) {
return left <= right;
}
};
return Condition.operatorsValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Condition.prototype, "operator", {
get: function get() {
return this.opValue;
},
set: function set(value) {
if (!value) return;
value = value.toLowerCase();
if (!Condition.operators[value]) return;
this.opValue = value;
},
enumerable: true,
configurable: true
});
Condition.prototype.perform = function (left, right) {
if (left === void 0) {
left = null;
}
if (right === void 0) {
right = null;
}
if (!left) left = this.left;
if (!right) right = this.right;
return Condition.operators[this.operator](this.getPureValue(left), this.getPureValue(right));
};
Condition.prototype.getPureValue = function (val) {
if (!val || typeof val != "string") return val;
var str = "";
if (val.length > 0 && (val[0] == "'" || val[0] == '"')) val = val.substr(1);
var len = val.length;
if (len > 0 && (val[len - 1] == "'" || val[len - 1] == '"')) val = val.substr(0, len - 1);
return val;
};
Condition.operatorsValue = null;
return Condition;
}();
var ConditionNode = exports.ConditionNode = function () {
function ConditionNode() {
this.connectiveValue = "and";
this.children = [];
}
Object.defineProperty(ConditionNode.prototype, "connective", {
get: function get() {
return this.connectiveValue;
},
set: function set(value) {
if (!value) return;
value = value.toLowerCase();
if (value == "&" || value == "&&") value = "and";
if (value == "|" || value == "||") value = "or";
if (value != "and" && value != "or") return;
this.connectiveValue = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ConditionNode.prototype, "isEmpty", {
get: function get() {
return this.children.length == 0;
},
enumerable: true,
configurable: true
});
ConditionNode.prototype.clear = function () {
this.children = [];
this.connective = "and";
};
return ConditionNode;
}();
var ConditionRunner = exports.ConditionRunner = function () {
function ConditionRunner(expression) {
this.root = new ConditionNode();
this.expression = expression;
this.processValue = new _conditionProcessValue.ProcessValue();
}
Object.defineProperty(ConditionRunner.prototype, "expression", {
get: function get() {
return this.expressionValue;
},
set: function set(value) {
if (this.expression == value) return;
this.expressionValue = value;
new _conditionsParser.ConditionsParser().parse(this.expressionValue, this.root);
},
enumerable: true,
configurable: true
});
ConditionRunner.prototype.run = function (values) {
this.values = values;
return this.runNode(this.root);
};
ConditionRunner.prototype.runNode = function (node) {
var onFirstFail = node.connective == "and";
for (var i = 0; i < node.children.length; i++) {
var res = this.runNodeCondition(node.children[i]);
if (!res && onFirstFail) return false;
if (res && !onFirstFail) return true;
}
return onFirstFail;
};
ConditionRunner.prototype.runNodeCondition = function (value) {
if (!value) return false;
if (value["children"]) return this.runNode(value);
if (value["left"]) return this.runCondition(value);
return false;
};
ConditionRunner.prototype.runCondition = function (condition) {
var left = condition.left;
var name = this.getValueName(left);
if (name) {
if (!this.processValue.hasValue(name, this.values)) return false;
left = this.processValue.getValue(name, this.values);
}
var right = condition.right;
name = this.getValueName(right);
if (name) {
if (!this.processValue.hasValue(name, this.values)) return false;
right = this.processValue.getValue(name, this.values);
}
return condition.perform(left, right);
};
ConditionRunner.prototype.getValueName = function (nodeValue) {
if (!nodeValue) return null;
if (typeof nodeValue !== 'string') return null;
if (nodeValue.length < 3 || nodeValue[0] != '{' || nodeValue[nodeValue.length - 1] != '}') return null;
return nodeValue.substr(1, nodeValue.length - 2);
};
return ConditionRunner;
}();
/***/ },
/* 11 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ConditionsParser = undefined;
var _conditions = __webpack_require__(10);
var ConditionsParser = exports.ConditionsParser = function () {
function ConditionsParser() {}
ConditionsParser.prototype.parse = function (text, root) {
this.text = text;
this.root = root;
this.root.clear();
this.at = 0;
this.length = this.text.length;
var res = this.parseText();
return res;
};
ConditionsParser.prototype.toString = function (root) {
this.root = root;
return this.nodeToString(root);
};
ConditionsParser.prototype.toStringCore = function (value) {
if (!value) return "";
if (value["children"]) return this.nodeToString(value);
if (value["left"]) return this.conditionToString(value);
return "";
};
ConditionsParser.prototype.nodeToString = function (node) {
if (node.isEmpty) return "";
var res = "";
for (var i = 0; i < node.children.length; i++) {
var nodeText = this.toStringCore(node.children[i]);
if (nodeText) {
if (res) res += ' ' + node.connective + ' ';
res += nodeText;
}
}
if (node != this.root && node.children.length > 1) {
res = '(' + res + ')';
}
return res;
};
ConditionsParser.prototype.conditionToString = function (condition) {
if (!condition.right || !condition.operator) return "";
var left = condition.left;
if (left && !this.isNumeric(left)) left = "'" + left + "'";
var res = left + ' ' + this.operationToString(condition.operator);
if (this.isNoRightOperation(condition.operator)) return res;
var right = condition.right;
if (right && !this.isNumeric(right)) right = "'" + right + "'";
return res + ' ' + right;
};
ConditionsParser.prototype.operationToString = function (op) {
if (op == "equal") return "=";
if (op == "notequal") return "!=";
if (op == "greater") return ">";
if (op == "less") return "<";
if (op == "greaterorequal") return ">=";
if (op == "lessorequal") return "<=";
return op;
};
ConditionsParser.prototype.isNumeric = function (value) {
var val = parseFloat(value);
if (isNaN(val)) return false;
return isFinite(val);
};
ConditionsParser.prototype.parseText = function () {
this.node = this.root;
this.expressionNodes = [];
this.expressionNodes.push(this.node);
var res = this.readConditions();
return res && this.at >= this.length;
};
ConditionsParser.prototype.readConditions = function () {
var res = this.readCondition();
if (!res) return res;
var connective = this.readConnective();
if (connective) {
this.addConnective(connective);
return this.readConditions();
}
return true;
};
ConditionsParser.prototype.readCondition = function () {
if (!this.readExpression()) return false;
var left = this.readString();
if (!left) return false;
var op = this.readOperator();
if (!op) return false;
var c = new _conditions.Condition();
c.left = left;
c.operator = op;
if (!this.isNoRightOperation(op)) {
var right = this.readString();
if (!right) return false;
c.right = right;
}
this.addCondition(c);
return true;
};
ConditionsParser.prototype.readExpression = function () {
this.skip();
if (this.at >= this.length || this.ch != '(') return true;
this.at++;
this.pushExpression();
var res = this.readConditions();
if (res) {
this.skip();
res = this.ch == ')';
this.at++;
this.popExpression();
}
return res;
};
Object.defineProperty(ConditionsParser.prototype, "ch", {
get: function get() {
return this.text.charAt(this.at);
},
enumerable: true,
configurable: true
});
ConditionsParser.prototype.skip = function () {
while (this.at < this.length && this.isSpace(this.ch)) {
this.at++;
}
};
ConditionsParser.prototype.isSpace = function (c) {
return c == ' ' || c == '\n' || c == '\t' || c == '\r';
};
ConditionsParser.prototype.isQuotes = function (c) {
return c == "'" || c == '"';
};
ConditionsParser.prototype.isOperatorChar = function (c) {
return c == '>' || c == '<' || c == '=' || c == '!';
};
ConditionsParser.prototype.isBrackets = function (c) {
return c == '(' || c == ')';
};
ConditionsParser.prototype.readString = function () {
this.skip();
if (this.at >= this.length) return null;
var start = this.at;
var hasQuotes = this.isQuotes(this.ch);
if (hasQuotes) this.at++;
var isFirstOpCh = this.isOperatorChar(this.ch);
while (this.at < this.length) {
if (!hasQuotes && this.isSpace(this.ch)) break;
if (this.isQuotes(this.ch)) {
if (hasQuotes) this.at++;
break;
}
if (!hasQuotes) {
if (isFirstOpCh != this.isOperatorChar(this.ch)) break;
if (this.isBrackets(this.ch)) break;
}
this.at++;
}
if (this.at <= start) return null;
var res = this.text.substr(start, this.at - start);
if (res) {
if (res.length > 1 && this.isQuotes(res[0])) {
var len = res.length - 1;
if (this.isQuotes(res[res.length - 1])) len--;
res = res.substr(1, len);
}
}
return res;
};
ConditionsParser.prototype.isNoRightOperation = function (op) {
return op == "empty" || op == "notempty";
};
ConditionsParser.prototype.readOperator = function () {
var op = this.readString();
if (!op) return null;
op = op.toLowerCase();
if (op == '>') op = "greater";
if (op == '<') op = "less";
if (op == '>=' || op == '=>') op = "greaterorequal";
if (op == '<=' || op == '=<') op = "lessorequal";
if (op == '=' || op == '==') op = "equal";
if (op == '<>' || op == '!=') op = "notequal";
if (op == 'contain') op = "contains";
if (op == 'notcontain') op = "notcontains";
return op;
};
ConditionsParser.prototype.readConnective = function () {
var con = this.readString();
if (!con) return null;
con = con.toLowerCase();
if (con == "&" || con == "&&") con = "and";
if (con == "|" || con == "||") con = "or";
if (con != "and" && con != "or") con = null;
return con;
};
ConditionsParser.prototype.pushExpression = function () {
var node = new _conditions.ConditionNode();
this.expressionNodes.push(node);
this.node = node;
};
ConditionsParser.prototype.popExpression = function () {
var node = this.expressionNodes.pop();
this.node = this.expressionNodes[this.expressionNodes.length - 1];
this.node.children.push(node);
};
ConditionsParser.prototype.addCondition = function (c) {
this.node.children.push(c);
};
ConditionsParser.prototype.addConnective = function (con) {
if (this.node.children.length < 2) {
this.node.connective = con;
} else {
if (this.node.connective != con) {
var oldCon = this.node.connective;
var oldChildren = this.node.children;
this.node.clear();
this.node.connective = con;
var oldNode = new _conditions.ConditionNode();
oldNode.connective = oldCon;
oldNode.children = oldChildren;
this.node.children.push(oldNode);
var newNode = new _conditions.ConditionNode();
this.node.children.push(newNode);
this.node = newNode;
}
}
};
return ConditionsParser;
}();
/***/ },
/* 12 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var ProcessValue = exports.ProcessValue = function () {
function ProcessValue() {}
ProcessValue.prototype.getFirstName = function (text) {
if (!text) return text;
var res = "";
for (var i = 0; i < text.length; i++) {
var ch = text[i];
if (ch == '.' || ch == '[') break;
res += ch;
}
return res;
};
ProcessValue.prototype.hasValue = function (text, values) {
var res = this.getValueCore(text, values);
return res.hasValue;
};
ProcessValue.prototype.getValue = function (text, values) {
var res = this.getValueCore(text, values);
return res.value;
};
ProcessValue.prototype.getValueCore = function (text, values) {
var res = { hasValue: false, value: null };
var curValue = values;
if (!curValue) return res;
var isFirst = true;
while (text && text.length > 0) {
var isArray = !isFirst && text[0] == '[';
if (!isArray) {
if (!isFirst) text = text.substr(1);
var curName = this.getFirstName(text);
if (!curName) return res;
if (!curValue[curName]) return res;
curValue = curValue[curName];
text = text.substr(curName.length);
} else {
if (!Array.isArray(curValue)) return res;
var index = 1;
var str = "";
while (index < text.length && text[index] != ']') {
str += text[index];
index++;
}
text = index < text.length ? text.substr(index + 1) : "";
index = this.getIntValue(str);
if (index < 0 || index >= curValue.length) return res;
curValue = curValue[index];
}
isFirst = false;
}
res.value = curValue;
res.hasValue = true;
return res;
};
ProcessValue.prototype.getIntValue = function (str) {
if (str == "0" || (str | 0) > 0 && str % 1 == 0) return Number(str);
return -1;
};
return ProcessValue;
}();
/***/ },
/* 13 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.QuestionMatrixDropdownModelBase = exports.MatrixDropdownRowModelBase = exports.MatrixDropdownCell = exports.MatrixDropdownColumn = undefined;
var _jsonobject = __webpack_require__(8);
var _question = __webpack_require__(14);
var _base = __webpack_require__(5);
var _surveyStrings = __webpack_require__(7);
var _question_baseselect = __webpack_require__(17);
var _questionfactory = __webpack_require__(18);
var MatrixDropdownColumn = exports.MatrixDropdownColumn = function (_super) {
__extends(MatrixDropdownColumn, _super);
function MatrixDropdownColumn(name, title) {
if (title === void 0) {
title = null;
}
_super.call(this);
this.name = name;
this.choicesValue = [];
this.isRequired = false;
this.hasOther = false;
this.minWidth = "";
this.cellType = "default";
this.colCountValue = -1;
}
MatrixDropdownColumn.prototype.getType = function () {
return "matrixdropdowncolumn";
};
Object.defineProperty(MatrixDropdownColumn.prototype, "title", {
get: function get() {
return this.titleValue ? this.titleValue : this.name;
},
set: function set(value) {
this.titleValue = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "choices", {
get: function get() {
return this.choicesValue;
},
set: function set(newValue) {
_base.ItemValue.setData(this.choicesValue, newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "colCount", {
get: function get() {
return this.colCountValue;
},
set: function set(value) {
if (value < -1 || value > 4) return;
this.colCountValue = value;
},
enumerable: true,
configurable: true
});
return MatrixDropdownColumn;
}(_base.Base);
var MatrixDropdownCell = exports.MatrixDropdownCell = function () {
function MatrixDropdownCell(column, row, data) {
this.column = column;
this.row = row;
this.questionValue = data.createQuestion(this.row, this.column);
this.questionValue.setData(row);
}
Object.defineProperty(MatrixDropdownCell.prototype, "question", {
get: function get() {
return this.questionValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownCell.prototype, "value", {
get: function get() {
return this.question.value;
},
set: function set(value) {
this.question.value = value;
},
enumerable: true,
configurable: true
});
return MatrixDropdownCell;
}();
var MatrixDropdownRowModelBase = exports.MatrixDropdownRowModelBase = function () {
function MatrixDropdownRowModelBase(data, value) {
this.rowValues = {};
this.rowComments = {};
this.isSettingValue = false;
this.cells = [];
this.data = data;
this.value = value;
this.idValue = MatrixDropdownRowModelBase.getId();
this.buildCells();
}
MatrixDropdownRowModelBase.getId = function () {
return "srow_" + MatrixDropdownRowModelBase.idCounter++;
};
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "id", {
get: function get() {
return this.idValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "rowName", {
get: function get() {
return null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "value", {
get: function get() {
return this.rowValues;
},
set: function set(value) {
this.isSettingValue = true;
this.rowValues = {};
if (value != null) {
for (var key in value) {
this.rowValues[key] = value[key];
}
}
for (var i = 0; i < this.cells.length; i++) {
this.cells[i].question.onSurveyValueChanged(this.getValue(this.cells[i].column.name));
}
this.isSettingValue = false;
},
enumerable: true,
configurable: true
});
MatrixDropdownRowModelBase.prototype.getValue = function (name) {
return this.rowValues[name];
};
MatrixDropdownRowModelBase.prototype.setValue = function (name, newValue) {
if (this.isSettingValue) return;
if (newValue === "") newValue = null;
if (newValue != null) {
this.rowValues[name] = newValue;
} else {
delete this.rowValues[name];
}
this.data.onRowChanged(this, this.value);
};
MatrixDropdownRowModelBase.prototype.getComment = function (name) {
return this.rowComments[name];
};
MatrixDropdownRowModelBase.prototype.setComment = function (name, newValue) {
this.rowComments[name] = newValue;
};
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "isEmpty", {
get: function get() {
var val = this.value;
if (!val) return true;
for (var key in val) {
return false;
}return true;
},
enumerable: true,
configurable: true
});
MatrixDropdownRowModelBase.prototype.buildCells = function () {
var columns = this.data.columns;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
this.cells.push(this.createCell(column));
}
};
MatrixDropdownRowModelBase.prototype.createCell = function (column) {
return new MatrixDropdownCell(column, this, this.data);
};
MatrixDropdownRowModelBase.idCounter = 1;
return MatrixDropdownRowModelBase;
}();
var QuestionMatrixDropdownModelBase = exports.QuestionMatrixDropdownModelBase = function (_super) {
__extends(QuestionMatrixDropdownModelBase, _super);
function QuestionMatrixDropdownModelBase(name) {
_super.call(this, name);
this.name = name;
this.columnsValue = [];
this.choicesValue = [];
this.isRowChanging = false;
this.cellTypeValue = "dropdown";
this.columnColCountValue = 0;
this.columnMinWidth = "";
this.horizontalScroll = false;
}
QuestionMatrixDropdownModelBase.prototype.getType = function () {
return "matrixdropdownbase";
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columns", {
get: function get() {
return this.columnsValue;
},
set: function set(value) {
this.columnsValue = value;
this.fireCallback(this.columnsChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "cellType", {
get: function get() {
return this.cellTypeValue;
},
set: function set(newValue) {
if (this.cellType == newValue) return;
this.cellTypeValue = newValue;
this.fireCallback(this.updateCellsCallbak);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnColCount", {
get: function get() {
return this.columnColCountValue;
},
set: function set(value) {
if (value < 0 || value > 4) return;
this.columnColCountValue = value;
this.fireCallback(this.updateCellsCallbak);
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.getColumnTitle = function (column) {
var result = column.title;
if (column.isRequired && this.survey) {
var requireText = this.survey.requiredText;
if (requireText) requireText += " ";
result = requireText + result;
}
return result;
};
QuestionMatrixDropdownModelBase.prototype.getColumnWidth = function (column) {
return column.minWidth ? column.minWidth : this.columnMinWidth;
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "choices", {
get: function get() {
return this.choicesValue;
},
set: function set(newValue) {
_base.ItemValue.setData(this.choicesValue, newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "optionsCaption", {
get: function get() {
return this.optionsCaptionValue ? this.optionsCaptionValue : _surveyStrings.surveyLocalization.getString("optionsCaption");
},
set: function set(newValue) {
this.optionsCaptionValue = newValue;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.addColumn = function (name, title) {
if (title === void 0) {
title = null;
}
var column = new MatrixDropdownColumn(name, title);
this.columnsValue.push(column);
return column;
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "visibleRows", {
get: function get() {
this.generatedVisibleRows = this.generateRows();
return this.generatedVisibleRows;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.generateRows = function () {
return null;
};
QuestionMatrixDropdownModelBase.prototype.createMatrixRow = function (name, text, value) {
return null;
};
QuestionMatrixDropdownModelBase.prototype.createNewValue = function (curValue) {
return !curValue ? {} : curValue;
};
QuestionMatrixDropdownModelBase.prototype.getRowValue = function (row, questionValue, create) {
if (create === void 0) {
create = false;
}
var result = questionValue[row.rowName] ? questionValue[row.rowName] : null;
if (!result && create) {
result = {};
questionValue[row.rowName] = result;
}
return result;
};
QuestionMatrixDropdownModelBase.prototype.onBeforeValueChanged = function (val) {};
QuestionMatrixDropdownModelBase.prototype.onValueChanged = function () {
if (this.isRowChanging) return;
this.onBeforeValueChanged(this.value);
if (!this.generatedVisibleRows || this.generatedVisibleRows.length == 0) return;
this.isRowChanging = true;
var val = this.createNewValue(this.value);
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var row = this.generatedVisibleRows[i];
this.generatedVisibleRows[i].value = this.getRowValue(row, val);
}
this.isRowChanging = false;
};
QuestionMatrixDropdownModelBase.prototype.supportGoNextPageAutomatic = function () {
var rows = this.generatedVisibleRows;
if (!rows) rows = this.visibleRows;
if (!rows) return true;
for (var i = 0; i < rows.length; i++) {
var cells = this.generatedVisibleRows[i].cells;
if (!cells) continue;
for (var colIndex = 0; colIndex < cells.length; colIndex++) {
var question = cells[colIndex].question;
if (question && (!question.supportGoNextPageAutomatic() || !question.value)) return false;
}
}
return true;
};
QuestionMatrixDropdownModelBase.prototype.hasErrors = function (fireCallback) {
if (fireCallback === void 0) {
fireCallback = true;
}
var errosInColumns = this.hasErrorInColumns(fireCallback);
return _super.prototype.hasErrors.call(this, fireCallback) || errosInColumns;
};
QuestionMatrixDropdownModelBase.prototype.hasErrorInColumns = function (fireCallback) {
if (!this.generatedVisibleRows) return false;
var res = false;
for (var colIndex = 0; colIndex < this.columns.length; colIndex++) {
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var cells = this.generatedVisibleRows[i].cells;
res = cells && cells[colIndex] && cells[colIndex].question && cells[colIndex].question.hasErrors(fireCallback) || res;
}
}
return res;
};
QuestionMatrixDropdownModelBase.prototype.getFirstInputElementId = function () {
var question = this.getFirstCellQuestion(false);
return question ? question.inputId : _super.prototype.getFirstInputElementId.call(this);
};
QuestionMatrixDropdownModelBase.prototype.getFirstErrorInputElementId = function () {
var question = this.getFirstCellQuestion(true);
return question ? question.inputId : _super.prototype.getFirstErrorInputElementId.call(this);
};
QuestionMatrixDropdownModelBase.prototype.getFirstCellQuestion = function (onError) {
if (!this.generatedVisibleRows) return null;
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var cells = this.generatedVisibleRows[i].cells;
for (var colIndex = 0; colIndex < this.columns.length; colIndex++) {
if (!onError) return cells[colIndex].question;
if (cells[colIndex].question.currentErrorCount > 0) return cells[colIndex].question;
}
}
return null;
};
//IMatrixDropdownData
QuestionMatrixDropdownModelBase.prototype.createQuestion = function (row, column) {
var question = this.createQuestionCore(row, column);
question.name = column.name;
question.isRequired = column.isRequired;
question.hasOther = column.hasOther;
if (column.hasOther) {
if (question instanceof _question_baseselect.QuestionSelectBase) {
question.storeOthersAsComment = false;
}
}
return question;
};
QuestionMatrixDropdownModelBase.prototype.createQuestionCore = function (row, column) {
var cellType = column.cellType == "default" ? this.cellType : column.cellType;
var name = this.getQuestionName(row, column);
if (cellType == "checkbox") return this.createCheckbox(name, column);
if (cellType == "radiogroup") return this.createRadiogroup(name, column);
if (cellType == "text") return this.createText(name, column);
if (cellType == "comment") return this.createComment(name, column);
return this.createDropdown(name, column);
};
QuestionMatrixDropdownModelBase.prototype.getQuestionName = function (row, column) {
return row.rowName + "_" + column.name;
};
QuestionMatrixDropdownModelBase.prototype.getColumnChoices = function (column) {
return column.choices && column.choices.length > 0 ? column.choices : this.choices;
};
QuestionMatrixDropdownModelBase.prototype.getColumnOptionsCaption = function (column) {
return column.optionsCaption ? column.optionsCaption : this.optionsCaption;
};
QuestionMatrixDropdownModelBase.prototype.createDropdown = function (name, column) {
var q = this.createCellQuestion("dropdown", name);
q.choices = this.getColumnChoices(column);
q.optionsCaption = this.getColumnOptionsCaption(column);
return q;
};
QuestionMatrixDropdownModelBase.prototype.createCheckbox = function (name, column) {
var q = this.createCellQuestion("checkbox", name);
q.choices = this.getColumnChoices(column);
q.colCount = column.colCount > -1 ? column.colCount : this.columnColCount;
return q;
};
QuestionMatrixDropdownModelBase.prototype.createRadiogroup = function (name, column) {
var q = this.createCellQuestion("radiogroup", name);
q.choices = this.getColumnChoices(column);
q.colCount = column.colCount > -1 ? column.colCount : this.columnColCount;
return q;
};
QuestionMatrixDropdownModelBase.prototype.createText = function (name, column) {
return this.createCellQuestion("text", name);
};
QuestionMatrixDropdownModelBase.prototype.createComment = function (name, column) {
return this.createCellQuestion("comment", name);
};
QuestionMatrixDropdownModelBase.prototype.createCellQuestion = function (questionType, name) {
return _questionfactory.QuestionFactory.Instance.createQuestion(questionType, name);
};
QuestionMatrixDropdownModelBase.prototype.deleteRowValue = function (newValue, row) {
delete newValue[row.rowName];
return Object.keys(newValue).length == 0 ? null : newValue;
};
QuestionMatrixDropdownModelBase.prototype.onRowChanged = function (row, newRowValue) {
var newValue = this.createNewValue(this.value);
var rowValue = this.getRowValue(row, newValue, true);
for (var key in rowValue) {
delete rowValue[key];
}if (newRowValue) {
newRowValue = JSON.parse(JSON.stringify(newRowValue));
for (var key in newRowValue) {
rowValue[key] = newRowValue[key];
}
}
if (Object.keys(rowValue).length == 0) {
newValue = this.deleteRowValue(newValue, row);
}
this.isRowChanging = true;
this.setNewValue(newValue);
this.isRowChanging = false;
};
return QuestionMatrixDropdownModelBase;
}(_question.Question);
_jsonobject.JsonObject.metaData.addClass("matrixdropdowncolumn", ["name", { name: "title", onGetValue: function onGetValue(obj) {
return obj.titleValue;
} }, { name: "choices:itemvalues", onGetValue: function onGetValue(obj) {
return _base.ItemValue.getData(obj.choices);
}, onSetValue: function onSetValue(obj, value) {
obj.choices = value;
} }, "optionsCaption", { name: "cellType", default: "default", choices: ["default", "dropdown", "checkbox", "radiogroup", "text", "comment"] }, { name: "colCount", default: -1, choices: [-1, 0, 1, 2, 3, 4] }, "isRequired:boolean", "hasOther:boolean", "minWidth"], function () {
return new MatrixDropdownColumn("");
});
_jsonobject.JsonObject.metaData.addClass("matrixdropdownbase", [{ name: "columns:matrixdropdowncolumns", className: "matrixdropdowncolumn" }, "horizontalScroll:boolean", { name: "choices:itemvalues", onGetValue: function onGetValue(obj) {
return _base.ItemValue.getData(obj.choices);
}, onSetValue: function onSetValue(obj, value) {
obj.choices = value;
} }, { name: "optionsCaption", onGetValue: function onGetValue(obj) {
return obj.optionsCaptionValue;
} }, { name: "cellType", default: "dropdown", choices: ["dropdown", "checkbox", "radiogroup", "text", "comment"] }, { name: "columnColCount", default: 0, choices: [0, 1, 2, 3, 4] }, "columnMinWidth"], function () {
return new QuestionMatrixDropdownModelBase("");
}, "question");
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 14 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Question = undefined;
var _jsonobject = __webpack_require__(8);
var _questionbase = __webpack_require__(15);
var _base = __webpack_require__(5);
var _surveyStrings = __webpack_require__(7);
var _error = __webpack_require__(6);
var _validator = __webpack_require__(3);
var _textPreProcessor = __webpack_require__(16);
var Question = exports.Question = function (_super) {
__extends(Question, _super);
function Question(name) {
_super.call(this, name);
this.name = name;
this.titleValue = null;
this.isRequiredValue = false;
this.hasCommentValue = false;
this.hasOtherValue = false;
this.commentTextValue = "";
this.errors = [];
this.validators = new Array();
this.isValueChangedInSurvey = false;
}
Object.defineProperty(Question.prototype, "hasTitle", {
get: function get() {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasInput", {
get: function get() {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "inputId", {
get: function get() {
return this.id + "i";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "title", {
get: function get() {
return this.titleValue ? this.titleValue : this.name;
},
set: function set(newValue) {
this.titleValue = newValue;
this.fireCallback(this.titleChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "processedTitle", {
get: function get() {
return this.survey != null ? this.survey.processText(this.title) : this.title;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "fullTitle", {
get: function get() {
if (this.survey && this.survey.questionTitleTemplate) {
if (!this.textPreProcessor) {
var self = this;
this.textPreProcessor = new _textPreProcessor.TextPreProcessor();
this.textPreProcessor.onHasValue = function (name) {
return self.canProcessedTextValues(name.toLowerCase());
};
this.textPreProcessor.onProcess = function (name) {
return self.getProcessedTextValue(name);
};
}
return this.textPreProcessor.process(this.survey.questionTitleTemplate);
}
var requireText = this.requiredText;
if (requireText) requireText += " ";
var no = this.no;
if (no) no += ". ";
return no + requireText + this.processedTitle;
},
enumerable: true,
configurable: true
});
Question.prototype.focus = function (onError) {
if (onError === void 0) {
onError = false;
}
_base.SurveyElement.ScrollElementToTop(this.id);
var id = !onError ? this.getFirstInputElementId() : this.getFirstErrorInputElementId();
if (_base.SurveyElement.FocusElement(id)) {
this.fireCallback(this.focusCallback);
}
};
Question.prototype.getFirstInputElementId = function () {
return this.inputId;
};
Question.prototype.getFirstErrorInputElementId = function () {
return this.getFirstInputElementId();
};
Question.prototype.canProcessedTextValues = function (name) {
return name == "no" || name == "title" || name == "require";
};
Question.prototype.getProcessedTextValue = function (name) {
if (name == "no") return this.no;
if (name == "title") return this.processedTitle;
if (name == "require") return this.requiredText;
return null;
};
Question.prototype.supportComment = function () {
return false;
};
Question.prototype.supportOther = function () {
return false;
};
Object.defineProperty(Question.prototype, "isRequired", {
get: function get() {
return this.isRequiredValue;
},
set: function set(val) {
if (this.isRequired == val) return;
this.isRequiredValue = val;
this.fireCallback(this.titleChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasComment", {
get: function get() {
return this.hasCommentValue;
},
set: function set(val) {
if (!this.supportComment()) return;
this.hasCommentValue = val;
if (this.hasComment) this.hasOther = false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "commentText", {
get: function get() {
return this.commentTextValue ? this.commentTextValue : _surveyStrings.surveyLocalization.getString("otherItemText");
},
set: function set(value) {
this.commentTextValue = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasOther", {
get: function get() {
return this.hasOtherValue;
},
set: function set(val) {
if (!this.supportOther() || this.hasOther == val) return;
this.hasOtherValue = val;
if (this.hasOther) this.hasComment = false;
this.hasOtherChanged();
},
enumerable: true,
configurable: true
});
Question.prototype.hasOtherChanged = function () {};
Object.defineProperty(Question.prototype, "no", {
get: function get() {
if (this.visibleIndex < 0) return "";
var startIndex = 1;
var isNumeric = true;
var str = "";
if (this.survey && this.survey.questionStartIndex) {
str = this.survey.questionStartIndex;
if (parseInt(str)) startIndex = parseInt(str);else if (str.length == 1) isNumeric = false;
}
if (isNumeric) return (this.visibleIndex + startIndex).toString();
return String.fromCharCode(str.charCodeAt(0) + this.visibleIndex);
},
enumerable: true,
configurable: true
});
Question.prototype.onSetData = function () {
_super.prototype.onSetData.call(this);
this.onSurveyValueChanged(this.value);
};
Object.defineProperty(Question.prototype, "value", {
get: function get() {
return this.valueFromData(this.getValueCore());
},
set: function set(newValue) {
this.setNewValue(newValue);
this.fireCallback(this.valueChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "comment", {
get: function get() {
return this.getComment();
},
set: function set(newValue) {
if (this.comment == newValue) return;
this.setComment(newValue);
this.fireCallback(this.commentChangedCallback);
},
enumerable: true,
configurable: true
});
Question.prototype.getComment = function () {
return this.data != null ? this.data.getComment(this.name) : this.questionComment;
};
Question.prototype.setComment = function (newValue) {
this.setNewComment(newValue);
};
Question.prototype.isEmpty = function () {
return this.value == null;
};
Question.prototype.hasErrors = function (fireCallback) {
if (fireCallback === void 0) {
fireCallback = true;
}
this.checkForErrors(fireCallback);
return this.errors.length > 0;
};
Object.defineProperty(Question.prototype, "currentErrorCount", {
get: function get() {
return this.errors.length;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "requiredText", {
get: function get() {
return this.survey != null && this.isRequired ? this.survey.requiredText : "";
},
enumerable: true,
configurable: true
});
Question.prototype.addError = function (error) {
this.errors.push(error);
this.fireCallback(this.errorsChangedCallback);
};
Question.prototype.checkForErrors = function (fireCallback) {
var errorLength = this.errors ? this.errors.length : 0;
this.errors = [];
this.onCheckForErrors(this.errors);
if (this.errors.length == 0 && this.value) {
var error = this.runValidators();
if (error) {
this.errors.push(error);
}
}
if (this.survey && this.errors.length == 0) {
var error = this.survey.validateQuestion(this.name);
if (error) {
this.errors.push(error);
}
}
if (fireCallback && (errorLength != this.errors.length || errorLength > 0)) {
this.fireCallback(this.errorsChangedCallback);
}
};
Question.prototype.onCheckForErrors = function (errors) {
if (this.hasRequiredError()) {
this.errors.push(new _error.AnswerRequiredError());
}
};
Question.prototype.hasRequiredError = function () {
return this.isRequired && this.isEmpty();
};
Question.prototype.runValidators = function () {
return new _validator.ValidatorRunner().run(this);
};
Question.prototype.setNewValue = function (newValue) {
this.setNewValueInData(newValue);
this.onValueChanged();
};
Question.prototype.setNewValueInData = function (newValue) {
if (!this.isValueChangedInSurvey) {
newValue = this.valueToData(newValue);
this.setValueCore(newValue);
}
};
Question.prototype.getValueCore = function () {
return this.data != null ? this.data.getValue(this.name) : this.questionValue;
};
Question.prototype.setValueCore = function (newValue) {
if (this.data != null) {
this.data.setValue(this.name, newValue);
} else {
this.questionValue = newValue;
}
};
Question.prototype.valueFromData = function (val) {
return val;
};
Question.prototype.valueToData = function (val) {
return val;
};
Question.prototype.onValueChanged = function () {};
Question.prototype.setNewComment = function (newValue) {
if (this.data != null) {
this.data.setComment(this.name, newValue);
} else this.questionComment = newValue;
};
//IQuestion
Question.prototype.onSurveyValueChanged = function (newValue) {
this.isValueChangedInSurvey = true;
this.value = this.valueFromData(newValue);
this.fireCallback(this.commentChangedCallback);
this.isValueChangedInSurvey = false;
};
//IValidatorOwner
Question.prototype.getValidatorTitle = function () {
return null;
};
return Question;
}(_questionbase.QuestionBase);
_jsonobject.JsonObject.metaData.addClass("question", [{ name: "title:text", onGetValue: function onGetValue(obj) {
return obj.titleValue;
} }, { name: "commentText", onGetValue: function onGetValue(obj) {
return obj.commentTextValue;
} }, "isRequired:boolean", { name: "validators:validators", baseClassName: "surveyvalidator", classNamePart: "validator" }], null, "questionbase");
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 15 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.QuestionBase = undefined;
var _base = __webpack_require__(5);
var _jsonobject = __webpack_require__(8);
var _conditions = __webpack_require__(10);
var QuestionBase = exports.QuestionBase = function (_super) {
__extends(QuestionBase, _super);
function QuestionBase(name) {
_super.call(this);
this.name = name;
this.conditionRunner = null;
this.visibleIf = "";
this.visibleValue = true;
this.startWithNewLine = true;
this.visibleIndexValue = -1;
this.width = "";
this.renderWidthValue = "";
this.rightIndentValue = 0;
this.indent = 0;
this.idValue = QuestionBase.getQuestionId();
this.onCreating();
}
QuestionBase.getQuestionId = function () {
return "sq_" + QuestionBase.questionCounter++;
};
Object.defineProperty(QuestionBase.prototype, "visible", {
get: function get() {
return this.visibleValue;
},
set: function set(val) {
if (val == this.visible) return;
this.visibleValue = val;
this.fireCallback(this.visibilityChangedCallback);
this.fireCallback(this.rowVisibilityChangedCallback);
if (this.survey) {
this.survey.questionVisibilityChanged(this, this.visible);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "visibleIndex", {
get: function get() {
return this.visibleIndexValue;
},
enumerable: true,
configurable: true
});
QuestionBase.prototype.hasErrors = function (fireCallback) {
if (fireCallback === void 0) {
fireCallback = true;
}
return false;
};
Object.defineProperty(QuestionBase.prototype, "currentErrorCount", {
get: function get() {
return 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "hasTitle", {
get: function get() {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "hasInput", {
get: function get() {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "hasComment", {
get: function get() {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "id", {
get: function get() {
return this.idValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "renderWidth", {
get: function get() {
return this.renderWidthValue;
},
set: function set(val) {
if (val == this.renderWidth) return;
this.renderWidthValue = val;
this.fireCallback(this.renderWidthChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBase.prototype, "rightIndent", {
get: function get() {
return this.rightIndentValue;
},
set: function set(val) {
if (val == this.rightIndent) return;
this.rightIndentValue = val;
this.fireCallback(this.renderWidthChangedCallback);
},
enumerable: true,
configurable: true
});
QuestionBase.prototype.focus = function (onError) {
if (onError === void 0) {
onError = false;
}
};
QuestionBase.prototype.setData = function (newValue) {
this.data = newValue;
this.survey = newValue && newValue["questionAdded"] ? newValue : null;
this.onSetData();
};
QuestionBase.prototype.fireCallback = function (callback) {
if (callback) callback();
};
QuestionBase.prototype.onSetData = function () {};
QuestionBase.prototype.onCreating = function () {};
QuestionBase.prototype.runCondition = function (values) {
if (!this.visibleIf) return;
if (!this.conditionRunner) this.conditionRunner = new _conditions.ConditionRunner(this.visibleIf);
this.conditionRunner.expression = this.visibleIf;
this.visible = this.conditionRunner.run(values);
};
//IQuestion
QuestionBase.prototype.onSurveyValueChanged = function (newValue) {};
QuestionBase.prototype.onSurveyLoad = function () {};
QuestionBase.prototype.setVisibleIndex = function (value) {
if (this.visibleIndexValue == value) return;
this.visibleIndexValue = value;
this.fireCallback(this.visibleIndexChangedCallback);
};
QuestionBase.prototype.supportGoNextPageAutomatic = function () {
return false;
};
QuestionBase.questionCounter = 100;
return QuestionBase;
}(_base.Base);
_jsonobject.JsonObject.metaData.addClass("questionbase", ["!name", { name: "visible:boolean", default: true }, "visibleIf:text", { name: "width" }, { name: "startWithNewLine:boolean", default: true }, { name: "indent:number", default: 0, choices: [0, 1, 2, 3] }]);
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 16 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var TextPreProcessorItem = exports.TextPreProcessorItem = function () {
function TextPreProcessorItem() {}
return TextPreProcessorItem;
}();
var TextPreProcessor = exports.TextPreProcessor = function () {
function TextPreProcessor() {}
TextPreProcessor.prototype.process = function (text) {
if (!text) return text;
if (!this.onProcess) return text;
var items = this.getItems(text);
for (var i = items.length - 1; i >= 0; i--) {
var item = items[i];
var name = this.getName(text.substring(item.start + 1, item.end));
if (!this.canProcessName(name)) continue;
if (this.onHasValue && !this.onHasValue(name)) continue;
var value = this.onProcess(name);
if (value == null) value = "";
text = text.substr(0, item.start) + value + text.substr(item.end + 1);
}
return text;
};
TextPreProcessor.prototype.getItems = function (text) {
var items = [];
var length = text.length;
var start = -1;
var ch = '';
for (var i = 0; i < length; i++) {
ch = text[i];
if (ch == '{') start = i;
if (ch == '}') {
if (start > -1) {
var item = new TextPreProcessorItem();
item.start = start;
item.end = i;
items.push(item);
}
start = -1;
}
}
return items;
};
TextPreProcessor.prototype.getName = function (name) {
if (!name) return;
return name.trim();
};
TextPreProcessor.prototype.canProcessName = function (name) {
if (!name) return false;
for (var i = 0; i < name.length; i++) {
var ch = name[i];
//TODO
if (ch == ' ' || ch == '-' || ch == '&') return false;
}
return true;
};
return TextPreProcessor;
}();
/***/ },
/* 17 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.QuestionCheckboxBase = exports.QuestionSelectBase = undefined;
var _jsonobject = __webpack_require__(8);
var _question = __webpack_require__(14);
var _base = __webpack_require__(5);
var _surveyStrings = __webpack_require__(7);
var _error = __webpack_require__(6);
var _choicesRestfull = __webpack_require__(9);
var QuestionSelectBase = exports.QuestionSelectBase = function (_super) {
__extends(QuestionSelectBase, _super);
function QuestionSelectBase(name) {
_super.call(this, name);
this.visibleChoicesCache = null;
this.otherItem = new _base.ItemValue("other", _surveyStrings.surveyLocalization.getString("otherItemText"));
this.choicesFromUrl = null;
this.cachedValueForUrlRequestion = null;
this.choicesValues = new Array();
this.otherErrorText = null;
this.storeOthersAsComment = true;
this.choicesOrderValue = "none";
this.isSettingComment = false;
this.choicesByUrl = this.createRestfull();
var self = this;
this.choicesByUrl.getResultCallback = function (items) {
self.onLoadChoicesFromUrl(items);
};
}
Object.defineProperty(QuestionSelectBase.prototype, "isOtherSelected", {
get: function get() {
return this.getStoreOthersAsComment() ? this.getHasOther(this.value) : this.getHasOther(this.cachedValue);
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.getHasOther = function (val) {
return val == this.otherItem.value;
};
QuestionSelectBase.prototype.createRestfull = function () {
return new _choicesRestfull.ChoicesRestfull();
};
QuestionSelectBase.prototype.getComment = function () {
if (this.getStoreOthersAsComment()) return _super.prototype.getComment.call(this);
return this.commentValue;
};
QuestionSelectBase.prototype.setComment = function (newValue) {
if (this.getStoreOthersAsComment()) _super.prototype.setComment.call(this, newValue);else {
if (!this.isSettingComment && newValue != this.commentValue) {
this.isSettingComment = true;
this.commentValue = newValue;
if (this.isOtherSelected) {
this.setNewValueInData(this.cachedValue);
}
this.isSettingComment = false;
}
}
};
QuestionSelectBase.prototype.setNewValue = function (newValue) {
if (newValue) this.cachedValueForUrlRequestion = newValue;
_super.prototype.setNewValue.call(this, newValue);
};
QuestionSelectBase.prototype.valueFromData = function (val) {
if (this.getStoreOthersAsComment()) return _super.prototype.valueFromData.call(this, val);
this.cachedValue = this.valueFromDataCore(val);
return this.cachedValue;
};
QuestionSelectBase.prototype.valueToData = function (val) {
if (this.getStoreOthersAsComment()) return _super.prototype.valueToData.call(this, val);
this.cachedValue = val;
return this.valueToDataCore(val);
};
QuestionSelectBase.prototype.valueFromDataCore = function (val) {
if (!this.hasUnknownValue(val)) return val;
if (val == this.otherItem.value) return val;
this.comment = val;
return this.otherItem.value;
};
QuestionSelectBase.prototype.valueToDataCore = function (val) {
if (val == this.otherItem.value && this.getComment()) {
val = this.getComment();
}
return val;
};
QuestionSelectBase.prototype.hasUnknownValue = function (val) {
if (!val) return false;
var items = this.activeChoices;
for (var i = 0; i < items.length; i++) {
if (items[i].value == val) return false;
}
return true;
};
Object.defineProperty(QuestionSelectBase.prototype, "choices", {
get: function get() {
return this.choicesValues;
},
set: function set(newValue) {
_base.ItemValue.setData(this.choicesValues, newValue);
this.onVisibleChoicesChanged();
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.hasOtherChanged = function () {
this.onVisibleChoicesChanged();
};
Object.defineProperty(QuestionSelectBase.prototype, "choicesOrder", {
get: function get() {
return this.choicesOrderValue;
},
set: function set(newValue) {
if (newValue == this.choicesOrderValue) return;
this.choicesOrderValue = newValue;
this.onVisibleChoicesChanged();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "otherText", {
get: function get() {
return this.otherItem.text;
},
set: function set(value) {
this.otherItem.text = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "visibleChoices", {
get: function get() {
if (!this.hasOther && this.choicesOrder == "none") return this.activeChoices;
if (!this.visibleChoicesCache) {
this.visibleChoicesCache = this.sortVisibleChoices(this.activeChoices.slice());
if (this.hasOther) {
this.visibleChoicesCache.push(this.otherItem);
}
}
return this.visibleChoicesCache;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "activeChoices", {
get: function get() {
return this.choicesFromUrl ? this.choicesFromUrl : this.choices;
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.supportComment = function () {
return true;
};
QuestionSelectBase.prototype.supportOther = function () {
return true;
};
QuestionSelectBase.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
if (!this.isOtherSelected || this.comment) return;
var text = this.otherErrorText;
if (!text) {
text = _surveyStrings.surveyLocalization.getString("otherRequiredError");
}
errors.push(new _error.CustomError(text));
};
QuestionSelectBase.prototype.getStoreOthersAsComment = function () {
return this.storeOthersAsComment && (this.survey != null ? this.survey.storeOthersAsComment : true);
};
QuestionSelectBase.prototype.onSurveyLoad = function () {
if (this.choicesByUrl) this.choicesByUrl.run();
};
QuestionSelectBase.prototype.onLoadChoicesFromUrl = function (array) {
var errorCount = this.errors.length;
this.errors = [];
if (this.choicesByUrl && this.choicesByUrl.error) {
this.errors.push(this.choicesByUrl.error);
}
if (errorCount > 0 || this.errors.length > 0) {
this.fireCallback(this.errorsChangedCallback);
}
var newChoices = null;
if (array && array.length > 0) {
newChoices = new Array();
_base.ItemValue.setData(newChoices, array);
}
this.choicesFromUrl = newChoices;
this.onVisibleChoicesChanged();
if (this.cachedValueForUrlRequestion) {
this.value = this.cachedValueForUrlRequestion;
}
};
QuestionSelectBase.prototype.onVisibleChoicesChanged = function () {
this.visibleChoicesCache = null;
this.fireCallback(this.choicesChangedCallback);
};
QuestionSelectBase.prototype.sortVisibleChoices = function (array) {
var order = this.choicesOrder.toLowerCase();
if (order == "asc") return this.sortArray(array, 1);
if (order == "desc") return this.sortArray(array, -1);
if (order == "random") return this.randomizeArray(array);
return array;
};
QuestionSelectBase.prototype.sortArray = function (array, mult) {
return array.sort(function (a, b) {
if (a.text < b.text) return -1 * mult;
if (a.text > b.text) return 1 * mult;
return 0;
});
};
QuestionSelectBase.prototype.randomizeArray = function (array) {
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
return array;
};
return QuestionSelectBase;
}(_question.Question);
var QuestionCheckboxBase = exports.QuestionCheckboxBase = function (_super) {
__extends(QuestionCheckboxBase, _super);
function QuestionCheckboxBase(name) {
_super.call(this, name);
this.name = name;
this.colCountValue = 1;
}
Object.defineProperty(QuestionCheckboxBase.prototype, "colCount", {
get: function get() {
return this.colCountValue;
},
set: function set(value) {
if (value < 0 || value > 4) return;
this.colCountValue = value;
this.fireCallback(this.colCountChangedCallback);
},
enumerable: true,
configurable: true
});
return QuestionCheckboxBase;
}(QuestionSelectBase);
_jsonobject.JsonObject.metaData.addClass("selectbase", ["hasComment:boolean", "hasOther:boolean", { name: "choices:itemvalues", onGetValue: function onGetValue(obj) {
return _base.ItemValue.getData(obj.choices);
}, onSetValue: function onSetValue(obj, value) {
obj.choices = value;
} }, { name: "choicesOrder", default: "none", choices: ["none", "asc", "desc", "random"] }, { name: "choicesByUrl:restfull", className: "ChoicesRestfull", onGetValue: function onGetValue(obj) {
return obj.choicesByUrl.isEmpty ? null : obj.choicesByUrl;
}, onSetValue: function onSetValue(obj, value) {
obj.choicesByUrl.setData(value);
} }, { name: "otherText", default: _surveyStrings.surveyLocalization.getString("otherItemText") }, "otherErrorText", { name: "storeOthersAsComment:boolean", default: true }], null, "question");
_jsonobject.JsonObject.metaData.addClass("checkboxbase", [{ name: "colCount:number", default: 1, choices: [0, 1, 2, 3, 4] }], null, "selectbase");
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 18 */
/***/ function(module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var QuestionFactory = exports.QuestionFactory = function () {
function QuestionFactory() {
this.creatorHash = {};
}
QuestionFactory.prototype.registerQuestion = function (questionType, questionCreator) {
this.creatorHash[questionType] = questionCreator;
};
QuestionFactory.prototype.getAllTypes = function () {
var result = new Array();
for (var key in this.creatorHash) {
result.push(key);
}
return result.sort();
};
QuestionFactory.prototype.createQuestion = function (questionType, name) {
var creator = this.creatorHash[questionType];
if (creator == null) return null;
return creator(name);
};
QuestionFactory.Instance = new QuestionFactory();
QuestionFactory.DefaultChoices = ["one", "two|second value", "three|third value"];
return QuestionFactory;
}();
/***/ },
/* 19 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.QuestionMatrixDropdownModel = exports.MatrixDropdownRowModel = undefined;
var _question_matrixdropdownbase = __webpack_require__(13);
var _jsonobject = __webpack_require__(8);
var _base = __webpack_require__(5);
var _questionfactory = __webpack_require__(18);
var MatrixDropdownRowModel = exports.MatrixDropdownRowModel = function (_super) {
__extends(MatrixDropdownRowModel, _super);
function MatrixDropdownRowModel(name, text, data, value) {
_super.call(this, data, value);
this.name = name;
this.text = text;
}
Object.defineProperty(MatrixDropdownRowModel.prototype, "rowName", {
get: function get() {
return this.name;
},
enumerable: true,
configurable: true
});
return MatrixDropdownRowModel;
}(_question_matrixdropdownbase.MatrixDropdownRowModelBase);
var QuestionMatrixDropdownModel = exports.QuestionMatrixDropdownModel = function (_super) {
__extends(QuestionMatrixDropdownModel, _super);
function QuestionMatrixDropdownModel(name) {
_super.call(this, name);
this.name = name;
this.rowsValue = [];
}
QuestionMatrixDropdownModel.prototype.getType = function () {
return "matrixdropdown";
};
Object.defineProperty(QuestionMatrixDropdownModel.prototype, "rows", {
get: function get() {
return this.rowsValue;
},
set: function set(newValue) {
_base.ItemValue.setData(this.rowsValue, newValue);
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModel.prototype.generateRows = function () {
var result = new Array();
if (!this.rows || this.rows.length === 0) return result;
var val = this.value;
if (!val) val = {};
for (var i = 0; i < this.rows.length; i++) {
if (!this.rows[i].value) continue;
result.push(this.createMatrixRow(this.rows[i].value, this.rows[i].text, val[this.rows[i].value]));
}
return result;
};
QuestionMatrixDropdownModel.prototype.createMatrixRow = function (name, text, value) {
return new MatrixDropdownRowModel(name, text, this, value);
};
return QuestionMatrixDropdownModel;
}(_question_matrixdropdownbase.QuestionMatrixDropdownModelBase);
_jsonobject.JsonObject.metaData.addClass("matrixdropdown", [{ name: "rows:itemvalues", onGetValue: function onGetValue(obj) {
return _base.ItemValue.getData(obj.rows);
}, onSetValue: function onSetValue(obj, value) {
obj.rows = value;
} }], function () {
return new QuestionMatrixDropdownModel("");
}, "matrixdropdownbase");
_questionfactory.QuestionFactory.Instance.registerQuestion("matrixdropdown", function (name) {
var q = new QuestionMatrixDropdownModel(name);q.choices = [1, 2, 3, 4, 5];q.rows = ["Row 1", "Row 2"];q.addColumn("Column 1");q.addColumn("Column 2");q.addColumn("Column 3");return q;
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 20 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.QuestionMatrixDynamicModel = exports.MatrixDynamicRowModel = undefined;
var _question_matrixdropdownbase = __webpack_require__(13);
var _jsonobject = __webpack_require__(8);
var _questionfactory = __webpack_require__(18);
var _surveyStrings = __webpack_require__(7);
var _error = __webpack_require__(6);
var MatrixDynamicRowModel = exports.MatrixDynamicRowModel = function (_super) {
__extends(MatrixDynamicRowModel, _super);
function MatrixDynamicRowModel(index, data, value) {
_super.call(this, data, value);
this.index = index;
}
Object.defineProperty(MatrixDynamicRowModel.prototype, "rowName", {
get: function get() {
return "row" + this.index;
},
enumerable: true,
configurable: true
});
return MatrixDynamicRowModel;
}(_question_matrixdropdownbase.MatrixDropdownRowModelBase);
var QuestionMatrixDynamicModel = exports.QuestionMatrixDynamicModel = function (_super) {
__extends(QuestionMatrixDynamicModel, _super);
function QuestionMatrixDynamicModel(name) {
_super.call(this, name);
this.name = name;
this.rowCounter = 0;
this.rowCountValue = 2;
this.addRowTextValue = null;
this.removeRowTextValue = null;
this.minRowCount = 0;
}
QuestionMatrixDynamicModel.prototype.getType = function () {
return "matrixdynamic";
};
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "rowCount", {
get: function get() {
return this.rowCountValue;
},
set: function set(val) {
if (val < 0 || val > QuestionMatrixDynamicModel.MaxRowCount) return;
this.rowCountValue = val;
if (this.value && this.value.length > val) {
var qVal = this.value;
qVal.splice(val);
this.value = qVal;
}
this.fireCallback(this.rowCountChangedCallback);
},
enumerable: true,
configurable: true
});
QuestionMatrixDynamicModel.prototype.addRow = function () {
if (this.generatedVisibleRows) {
this.generatedVisibleRows.push(this.createMatrixRow(null));
}
this.rowCount++;
};
QuestionMatrixDynamicModel.prototype.removeRow = function (index) {
if (index < 0 || index >= this.rowCount) return;
if (this.generatedVisibleRows && index < this.generatedVisibleRows.length) {
this.generatedVisibleRows.splice(index, 1);
}
if (this.value) {
var val = this.createNewValue(this.value);
val.splice(index, 1);
val = this.deleteRowValue(val, null);
this.value = val;
}
this.rowCount--;
};
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "addRowText", {
get: function get() {
return this.addRowTextValue ? this.addRowTextValue : _surveyStrings.surveyLocalization.getString("addRow");
},
set: function set(value) {
this.addRowTextValue = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "removeRowText", {
get: function get() {
return this.removeRowTextValue ? this.removeRowTextValue : _surveyStrings.surveyLocalization.getString("removeRow");
},
set: function set(value) {
this.removeRowTextValue = value;
},
enumerable: true,
configurable: true
});
QuestionMatrixDynamicModel.prototype.supportGoNextPageAutomatic = function () {
return false;
};
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "cachedVisibleRows", {
get: function get() {
if (this.generatedVisibleRows && this.generatedVisibleRows.length == this.rowCount) return this.generatedVisibleRows;
return this.visibleRows;
},
enumerable: true,
configurable: true
});
QuestionMatrixDynamicModel.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
if (this.hasErrorInRows()) {
errors.push(new _error.CustomError(_surveyStrings.surveyLocalization.getString("minRowCountError")["format"](this.minRowCount)));
}
};
QuestionMatrixDynamicModel.prototype.hasErrorInRows = function () {
if (this.minRowCount <= 0 || !this.generatedVisibleRows) return false;
var res = false;
var setRowCount = 0;
for (var rowIndex = 0; rowIndex < this.generatedVisibleRows.length; rowIndex++) {
var row = this.generatedVisibleRows[rowIndex];
if (!row.isEmpty) setRowCount++;
}
return setRowCount < this.minRowCount;
};
QuestionMatrixDynamicModel.prototype.generateRows = function () {
var result = new Array();
if (this.rowCount === 0) return result;
var val = this.createNewValue(this.value);
for (var i = 0; i < this.rowCount; i++) {
result.push(this.createMatrixRow(this.getRowValueByIndex(val, i)));
}
return result;
};
QuestionMatrixDynamicModel.prototype.createMatrixRow = function (value) {
return new MatrixDynamicRowModel(this.rowCounter++, this, value);
};
QuestionMatrixDynamicModel.prototype.onBeforeValueChanged = function (val) {
var newRowCount = val && Array.isArray(val) ? val.length : 0;
if (newRowCount <= this.rowCount) return;
this.rowCountValue = newRowCount;
if (this.generatedVisibleRows) {
this.generatedVisibleRows = this.visibleRows;
}
};
QuestionMatrixDynamicModel.prototype.createNewValue = function (curValue) {
var result = curValue;
if (!result) result = [];
var r = [];
if (result.length > this.rowCount) result.splice(this.rowCount - 1);
for (var i = result.length; i < this.rowCount; i++) {
result.push({});
}
return result;
};
QuestionMatrixDynamicModel.prototype.deleteRowValue = function (newValue, row) {
var isEmpty = true;
for (var i = 0; i < newValue.length; i++) {
if (Object.keys(newValue[i]).length > 0) {
isEmpty = false;
break;
}
}
return isEmpty ? null : newValue;
};
QuestionMatrixDynamicModel.prototype.getRowValueByIndex = function (questionValue, index) {
return index >= 0 && index < questionValue.length ? questionValue[index] : null;
};
QuestionMatrixDynamicModel.prototype.getRowValue = function (row, questionValue, create) {
if (create === void 0) {
create = false;
}
return this.getRowValueByIndex(questionValue, this.generatedVisibleRows.indexOf(row));
};
QuestionMatrixDynamicModel.MaxRowCount = 100;
return QuestionMatrixDynamicModel;
}(_question_matrixdropdownbase.QuestionMatrixDropdownModelBase);
_jsonobject.JsonObject.metaData.addClass("matrixdynamic", [{ name: "rowCount:number", default: 2 }, { name: "minRowCount:number", default: 0 }, { name: "addRowText", onGetValue: function onGetValue(obj) {
return obj.addRowTextValue;
} }, { name: "removeRowText", onGetValue: function onGetValue(obj) {
return obj.removeRowTextValue;
} }], function () {
return new QuestionMatrixDynamicModel("");
}, "matrixdropdownbase");
_questionfactory.QuestionFactory.Instance.registerQuestion("matrixdynamic", function (name) {
var q = new QuestionMatrixDynamicModel(name);q.choices = [1, 2, 3, 4, 5];q.addColumn("Column 1");q.addColumn("Column 2");q.addColumn("Column 3");return q;
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 21 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.QuestionMatrixModel = exports.MatrixRowModel = undefined;
var _base = __webpack_require__(5);
var _question = __webpack_require__(14);
var _jsonobject = __webpack_require__(8);
var _surveyStrings = __webpack_require__(7);
var _error = __webpack_require__(6);
var _questionfactory = __webpack_require__(18);
var MatrixRowModel = exports.MatrixRowModel = function (_super) {
__extends(MatrixRowModel, _super);
function MatrixRowModel(name, text, fullName, data, value) {
_super.call(this);
this.name = name;
this.text = text;
this.fullName = fullName;
this.data = data;
this.rowValue = value;
}
Object.defineProperty(MatrixRowModel.prototype, "value", {
get: function get() {
return this.rowValue;
},
set: function set(newValue) {
this.rowValue = newValue;
if (this.data) this.data.onMatrixRowChanged(this);
this.onValueChanged();
},
enumerable: true,
configurable: true
});
MatrixRowModel.prototype.onValueChanged = function () {};
return MatrixRowModel;
}(_base.Base);
var QuestionMatrixModel = exports.QuestionMatrixModel = function (_super) {
__extends(QuestionMatrixModel, _super);
function QuestionMatrixModel(name) {
_super.call(this, name);
this.name = name;
this.columnsValue = [];
this.rowsValue = [];
this.isRowChanging = false;
this.isAllRowRequired = false;
}
QuestionMatrixModel.prototype.getType = function () {
return "matrix";
};
Object.defineProperty(QuestionMatrixModel.prototype, "hasRows", {
get: function get() {
return this.rowsValue.length > 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "columns", {
get: function get() {
return this.columnsValue;
},
set: function set(newValue) {
_base.ItemValue.setData(this.columnsValue, newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "rows", {
get: function get() {
return this.rowsValue;
},
set: function set(newValue) {
_base.ItemValue.setData(this.rowsValue, newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "visibleRows", {
get: function get() {
var result = new Array();
var val = this.value;
if (!val) val = {};
for (var i = 0; i < this.rows.length; i++) {
if (!this.rows[i].value) continue;
result.push(this.createMatrixRow(this.rows[i].value, this.rows[i].text, this.name + '_' + this.rows[i].value.toString(), val[this.rows[i].value]));
}
if (result.length == 0) {
result.push(this.createMatrixRow(null, "", this.name, val));
}
this.generatedVisibleRows = result;
return result;
},
enumerable: true,
configurable: true
});
QuestionMatrixModel.prototype.supportGoNextPageAutomatic = function () {
return this.hasValuesInAllRows();
};
QuestionMatrixModel.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
if (this.hasErrorInRows()) {
this.errors.push(new _error.CustomError(_surveyStrings.surveyLocalization.getString("requiredInAllRowsError")));
}
};
QuestionMatrixModel.prototype.hasErrorInRows = function () {
if (!this.isAllRowRequired) return false;
return !this.hasValuesInAllRows();
};
QuestionMatrixModel.prototype.hasValuesInAllRows = function () {
var rows = this.generatedVisibleRows;
if (!rows) rows = this.visibleRows;
if (!rows) return true;
for (var i = 0; i < rows.length; i++) {
var val = rows[i].value;
if (!val) return false;
}
return true;
};
QuestionMatrixModel.prototype.createMatrixRow = function (name, text, fullName, value) {
return new MatrixRowModel(name, text, fullName, this, value);
};
QuestionMatrixModel.prototype.onValueChanged = function () {
if (this.isRowChanging || !this.generatedVisibleRows || this.generatedVisibleRows.length == 0) return;
this.isRowChanging = true;
var val = this.value;
if (!val) val = {};
if (this.rows.length == 0) {
this.generatedVisibleRows[0].value = val;
} else {
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var row = this.generatedVisibleRows[i];
var rowVal = val[row.name] ? val[row.name] : null;
this.generatedVisibleRows[i].value = rowVal;
}
}
this.isRowChanging = false;
};
//IMatrixData
QuestionMatrixModel.prototype.onMatrixRowChanged = function (row) {
if (this.isRowChanging) return;
this.isRowChanging = true;
if (!this.hasRows) {
this.setNewValue(row.value);
} else {
var newValue = this.value;
if (!newValue) {
newValue = {};
}
newValue[row.name] = row.value;
this.setNewValue(newValue);
}
this.isRowChanging = false;
};
return QuestionMatrixModel;
}(_question.Question);
_jsonobject.JsonObject.metaData.addClass("matrix", [{ name: "columns:itemvalues", onGetValue: function onGetValue(obj) {
return _base.ItemValue.getData(obj.columns);
}, onSetValue: function onSetValue(obj, value) {
obj.columns = value;
} }, { name: "rows:itemvalues", onGetValue: function onGetValue(obj) {
return _base.ItemValue.getData(obj.rows);
}, onSetValue: function onSetValue(obj, value) {
obj.rows = value;
} }, "isAllRowRequired:boolean"], function () {
return new QuestionMatrixModel("");
}, "question");
_questionfactory.QuestionFactory.Instance.registerQuestion("matrix", function (name) {
var q = new QuestionMatrixModel(name);q.rows = ["Row 1", "Row 2"];q.columns = ["Column 1", "Column 2", "Column 3"];return q;
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 22 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.QuestionMultipleTextModel = exports.MultipleTextItemModel = undefined;
var _base = __webpack_require__(5);
var _validator = __webpack_require__(3);
var _question = __webpack_require__(14);
var _jsonobject = __webpack_require__(8);
var _questionfactory = __webpack_require__(18);
var MultipleTextItemModel = exports.MultipleTextItemModel = function (_super) {
__extends(MultipleTextItemModel, _super);
function MultipleTextItemModel(name, title) {
if (name === void 0) {
name = null;
}
if (title === void 0) {
title = null;
}
_super.call(this);
this.name = name;
this.validators = new Array();
this.title = title;
}
MultipleTextItemModel.prototype.getType = function () {
return "multipletextitem";
};
MultipleTextItemModel.prototype.setData = function (data) {
this.data = data;
};
Object.defineProperty(MultipleTextItemModel.prototype, "title", {
get: function get() {
return this.titleValue ? this.titleValue : this.name;
},
set: function set(newText) {
this.titleValue = newText;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "value", {
get: function get() {
return this.data ? this.data.getMultipleTextValue(this.name) : null;
},
set: function set(value) {
if (this.data != null) {
this.data.setMultipleTextValue(this.name, value);
}
},
enumerable: true,
configurable: true
});
MultipleTextItemModel.prototype.onValueChanged = function (newValue) {};
//IValidatorOwner
MultipleTextItemModel.prototype.getValidatorTitle = function () {
return this.title;
};
return MultipleTextItemModel;
}(_base.Base);
var QuestionMultipleTextModel = exports.QuestionMultipleTextModel = function (_super) {
__extends(QuestionMultipleTextModel, _super);
function QuestionMultipleTextModel(name) {
_super.call(this, name);
this.name = name;
this.colCountValue = 1;
this.itemSize = 25;
this.itemsValues = new Array();
this.isMultipleItemValueChanging = false;
var self = this;
this.items.push = function (value) {
value.setData(self);
var result = Array.prototype.push.call(this, value);
self.fireCallback(self.colCountChangedCallback);
return result;
};
}
QuestionMultipleTextModel.prototype.getType = function () {
return "multipletext";
};
Object.defineProperty(QuestionMultipleTextModel.prototype, "items", {
get: function get() {
return this.itemsValues;
},
set: function set(value) {
this.itemsValues = value;
this.fireCallback(this.colCountChangedCallback);
},
enumerable: true,
configurable: true
});
QuestionMultipleTextModel.prototype.addItem = function (name, title) {
if (title === void 0) {
title = null;
}
var item = this.createTextItem(name, title);
this.items.push(item);
return item;
};
//TODO-remove later. Delay removing in case somebody use this function.
QuestionMultipleTextModel.prototype.AddItem = function (name, title) {
if (title === void 0) {
title = null;
}
return this.addItem(name, title);
};
QuestionMultipleTextModel.prototype.supportGoNextPageAutomatic = function () {
for (var i = 0; i < this.items.length; i++) {
if (!this.items[i].value) return false;
}
return true;
};
Object.defineProperty(QuestionMultipleTextModel.prototype, "colCount", {
get: function get() {
return this.colCountValue;
},
set: function set(value) {
if (value < 1 || value > 4) return;
this.colCountValue = value;
this.fireCallback(this.colCountChangedCallback);
},
enumerable: true,
configurable: true
});
QuestionMultipleTextModel.prototype.getRows = function () {
var colCount = this.colCount;
var items = this.items;
var rows = [];
var index = 0;
for (var i = 0; i < items.length; i++) {
if (index == 0) {
rows.push([]);
}
rows[rows.length - 1].push(items[i]);
index++;
if (index >= colCount) {
index = 0;
}
}
return rows;
};
QuestionMultipleTextModel.prototype.onValueChanged = function () {
_super.prototype.onValueChanged.call(this);
this.onItemValueChanged();
};
QuestionMultipleTextModel.prototype.createTextItem = function (name, title) {
return new MultipleTextItemModel(name, title);
};
QuestionMultipleTextModel.prototype.onItemValueChanged = function () {
if (this.isMultipleItemValueChanging) return;
for (var i = 0; i < this.items.length; i++) {
var itemValue = null;
if (this.value && this.items[i].name in this.value) {
itemValue = this.value[this.items[i].name];
}
this.items[i].onValueChanged(itemValue);
}
};
QuestionMultipleTextModel.prototype.runValidators = function () {
var error = _super.prototype.runValidators.call(this);
if (error != null) return error;
for (var i = 0; i < this.items.length; i++) {
error = new _validator.ValidatorRunner().run(this.items[i]);
if (error != null) return error;
}
return null;
};
//IMultipleTextData
QuestionMultipleTextModel.prototype.getMultipleTextValue = function (name) {
if (!this.value) return null;
return this.value[name];
};
QuestionMultipleTextModel.prototype.setMultipleTextValue = function (name, value) {
this.isMultipleItemValueChanging = true;
var newValue = this.value;
if (!newValue) {
newValue = {};
}
newValue[name] = value;
this.setNewValue(newValue);
this.isMultipleItemValueChanging = false;
};
return QuestionMultipleTextModel;
}(_question.Question);
_jsonobject.JsonObject.metaData.addClass("multipletextitem", ["name", { name: "title", onGetValue: function onGetValue(obj) {
return obj.titleValue;
} }, { name: "validators:validators", baseClassName: "surveyvalidator", classNamePart: "validator" }], function () {
return new MultipleTextItemModel("");
});
_jsonobject.JsonObject.metaData.addClass("multipletext", [{ name: "!items:textitems", className: "multipletextitem" }, { name: "itemSize:number", default: 25 }, { name: "colCount:number", default: 1, choices: [1, 2, 3, 4] }], function () {
return new QuestionMultipleTextModel("");
}, "question");
_questionfactory.QuestionFactory.Instance.registerQuestion("multipletext", function (name) {
var q = new QuestionMultipleTextModel(name);q.addItem("text1");q.addItem("text2");return q;
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 23 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.PageModel = exports.QuestionRowModel = undefined;
var _jsonobject = __webpack_require__(8);
var _base = __webpack_require__(5);
var _conditions = __webpack_require__(10);
var _questionfactory = __webpack_require__(18);
var QuestionRowModel = exports.QuestionRowModel = function () {
function QuestionRowModel(page, question) {
this.page = page;
this.question = question;
this.visibleValue = false;
this.questions = [];
var self = this;
this.question.rowVisibilityChangedCallback = function () {
self.onRowVisibilityChanged();
};
}
Object.defineProperty(QuestionRowModel.prototype, "visible", {
get: function get() {
return this.visibleValue;
},
set: function set(val) {
if (val == this.visible) return;
this.visibleValue = val;
this.onVisibleChanged();
},
enumerable: true,
configurable: true
});
QuestionRowModel.prototype.updateVisible = function () {
this.visible = this.calcVisible();
this.setWidth();
};
QuestionRowModel.prototype.addQuestion = function (q) {
this.questions.push(q);
this.updateVisible();
};
QuestionRowModel.prototype.onVisibleChanged = function () {
if (this.visibilityChangedCallback) this.visibilityChangedCallback();
};
QuestionRowModel.prototype.setWidth = function () {
var visCount = this.getVisibleCount();
if (visCount == 0) return;
var counter = 0;
for (var i = 0; i < this.questions.length; i++) {
if (this.isQuestionVisible(this.questions[i])) {
this.questions[i].renderWidth = this.question.width ? this.question.width : Math.floor(100 / visCount) + '%';
this.questions[i].rightIndent = counter < visCount - 1 ? 1 : 0;
counter++;
}
}
};
QuestionRowModel.prototype.onRowVisibilityChanged = function () {
this.page.onRowVisibilityChanged(this);
};
QuestionRowModel.prototype.getVisibleCount = function () {
var res = 0;
for (var i = 0; i < this.questions.length; i++) {
if (this.isQuestionVisible(this.questions[i])) res++;
}
return res;
};
QuestionRowModel.prototype.isQuestionVisible = function (q) {
return this.page.isQuestionVisible(q);
};
QuestionRowModel.prototype.calcVisible = function () {
return this.getVisibleCount() > 0;
};
return QuestionRowModel;
}();
var PageModel = exports.PageModel = function (_super) {
__extends(PageModel, _super);
function PageModel(name) {
if (name === void 0) {
name = "";
}
_super.call(this);
this.name = name;
this.rowValues = null;
this.conditionRunner = null;
this.questions = new Array();
this.data = null;
this.visibleIf = "";
this.title = "";
this.visibleIndex = -1;
this.numValue = -1;
this.visibleValue = true;
this.idValue = PageModel.getPageId();
var self = this;
this.questions.push = function (value) {
if (self.data != null) {
value.setData(self.data);
}
return Array.prototype.push.call(this, value);
};
}
PageModel.getPageId = function () {
return "sp_" + PageModel.pageCounter++;
};
Object.defineProperty(PageModel.prototype, "id", {
get: function get() {
return this.idValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "rows", {
get: function get() {
this.rowValues = this.buildRows();
return this.rowValues;
},
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "isActive", {
get: function get() {
return !this.data || this.data.currentPage == this;
},
enumerable: true,
configurable: true
});
PageModel.prototype.isQuestionVisible = function (question) {
return question.visible || this.isDesignMode;
};
PageModel.prototype.createRow = function (question) {
return new QuestionRowModel(this, question);
};
Object.defineProperty(PageModel.prototype, "isDesignMode", {
get: function get() {
return this.data && this.data.isDesignMode;
},
enumerable: true,
configurable: true
});
PageModel.prototype.buildRows = function () {
var result = new Array();
var lastRowVisibleIndex = -1;
var self = this;
for (var i = 0; i < this.questions.length; i++) {
var q = this.questions[i];
result.push(this.createRow(q));
if (q.startWithNewLine) {
lastRowVisibleIndex = i;
result[i].addQuestion(q);
} else {
if (lastRowVisibleIndex < 0) lastRowVisibleIndex = i;
result[lastRowVisibleIndex].addQuestion(q);
}
}
for (var i = 0; i < result.length; i++) {
result[i].setWidth();
}
return result;
};
PageModel.prototype.onRowVisibilityChanged = function (row) {
if (!this.isActive || !this.rowValues) return;
var index = this.rowValues.indexOf(row);
for (var i = index; i >= 0; i--) {
if (this.rowValues[i].questions.indexOf(row.question) > -1) {
this.rowValues[i].updateVisible();
break;
}
}
};
Object.defineProperty(PageModel.prototype, "processedTitle", {
get: function get() {
return this.data != null ? this.data.processText(this.title) : this.title;
},
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "num", {
get: function get() {
return this.numValue;
},
set: function set(value) {
if (this.numValue == value) return;
this.numValue = value;
this.onNumChanged(value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "visible", {
get: function get() {
return this.visibleValue;
},
set: function set(value) {
if (value === this.visible) return;
this.visibleValue = value;
if (this.data != null) {
this.data.pageVisibilityChanged(this, this.visible);
}
},
enumerable: true,
configurable: true
});
PageModel.prototype.getType = function () {
return "page";
};
Object.defineProperty(PageModel.prototype, "isVisible", {
get: function get() {
return this.getIsPageVisible(null);
},
enumerable: true,
configurable: true
});
PageModel.prototype.getIsPageVisible = function (exceptionQuestion) {
if (!this.visible) return false;
for (var i = 0; i < this.questions.length; i++) {
if (this.questions[i] == exceptionQuestion) continue;
if (this.questions[i].visible) return true;
}
return false;
};
PageModel.prototype.addQuestion = function (question, index) {
if (index === void 0) {
index = -1;
}
if (question == null) return;
if (index < 0 || index >= this.questions.length) {
this.questions.push(question);
} else {
this.questions.splice(index, 0, question);
}
if (this.data != null) {
question.setData(this.data);
this.data.questionAdded(question, index);
}
};
PageModel.prototype.addNewQuestion = function (questionType, name) {
var question = _questionfactory.QuestionFactory.Instance.createQuestion(questionType, name);
this.addQuestion(question);
return question;
};
PageModel.prototype.removeQuestion = function (question) {
var index = this.questions.indexOf(question);
if (index < 0) return;
this.questions.splice(index, 1);
if (this.data != null) this.data.questionRemoved(question);
};
PageModel.prototype.focusFirstQuestion = function () {
for (var i = 0; i < this.questions.length; i++) {
var question = this.questions[i];
if (!question.visible || !question.hasInput) continue;
this.questions[i].focus();
break;
}
};
PageModel.prototype.focusFirstErrorQuestion = function () {
for (var i = 0; i < this.questions.length; i++) {
if (!this.questions[i].visible || this.questions[i].currentErrorCount == 0) continue;
this.questions[i].focus(true);
break;
}
};
PageModel.prototype.scrollToTop = function () {
_base.SurveyElement.ScrollElementToTop(_base.SurveyPageId);
};
PageModel.prototype.hasErrors = function (fireCallback, focuseOnFirstError) {
if (fireCallback === void 0) {
fireCallback = true;
}
if (focuseOnFirstError === void 0) {
focuseOnFirstError = false;
}
var result = false;
var firstErrorQuestion = null;
for (var i = 0; i < this.questions.length; i++) {
if (this.questions[i].visible && this.questions[i].hasErrors(fireCallback)) {
if (focuseOnFirstError && firstErrorQuestion == null) {
firstErrorQuestion = this.questions[i];
}
result = true;
}
}
if (firstErrorQuestion) firstErrorQuestion.focus(true);
return result;
};
PageModel.prototype.addQuestionsToList = function (list, visibleOnly) {
if (visibleOnly === void 0) {
visibleOnly = false;
}
if (visibleOnly && !this.visible) return;
for (var i = 0; i < this.questions.length; i++) {
if (visibleOnly && !this.questions[i].visible) continue;
list.push(this.questions[i]);
}
};
PageModel.prototype.runCondition = function (values) {
if (!this.visibleIf) return;
if (!this.conditionRunner) this.conditionRunner = new _conditions.ConditionRunner(this.visibleIf);
this.conditionRunner.expression = this.visibleIf;
this.visible = this.conditionRunner.run(values);
};
PageModel.prototype.onNumChanged = function (value) {};
PageModel.pageCounter = 100;
return PageModel;
}(_base.Base);
_jsonobject.JsonObject.metaData.addClass("page", ["name", { name: "questions", baseClassName: "question" }, { name: "visible:boolean", default: true }, "visibleIf", "title"], function () {
return new PageModel();
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 24 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.QuestionCheckboxModel = undefined;
var _jsonobject = __webpack_require__(8);
var _questionfactory = __webpack_require__(18);
var _question_baseselect = __webpack_require__(17);
var QuestionCheckboxModel = exports.QuestionCheckboxModel = function (_super) {
__extends(QuestionCheckboxModel, _super);
function QuestionCheckboxModel(name) {
_super.call(this, name);
this.name = name;
}
QuestionCheckboxModel.prototype.getHasOther = function (val) {
if (!val || !Array.isArray(val)) return false;
return val.indexOf(this.otherItem.value) >= 0;
};
QuestionCheckboxModel.prototype.valueFromDataCore = function (val) {
if (!val || !Array.isArray(val)) return val;
for (var i = 0; i < val.length; i++) {
if (val[i] == this.otherItem.value) return val;
if (this.hasUnknownValue(val[i])) {
this.comment = val[i];
var newVal = val.slice();
newVal[i] = this.otherItem.value;
return newVal;
}
}
return val;
};
QuestionCheckboxModel.prototype.valueToDataCore = function (val) {
if (!val || !val.length) return val;
for (var i = 0; i < val.length; i++) {
if (val[i] == this.otherItem.value) {
if (this.getComment()) {
var newVal = val.slice();
newVal[i] = this.getComment();
return newVal;
}
}
}
return val;
};
QuestionCheckboxModel.prototype.getType = function () {
return "checkbox";
};
return QuestionCheckboxModel;
}(_question_baseselect.QuestionCheckboxBase);
_jsonobject.JsonObject.metaData.addClass("checkbox", [], function () {
return new QuestionCheckboxModel("");
}, "checkboxbase");
_questionfactory.QuestionFactory.Instance.registerQuestion("checkbox", function (name) {
var q = new QuestionCheckboxModel(name);q.choices = _questionfactory.QuestionFactory.DefaultChoices;return q;
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 25 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.QuestionCommentModel = undefined;
var _question = __webpack_require__(14);
var _jsonobject = __webpack_require__(8);
var _questionfactory = __webpack_require__(18);
var QuestionCommentModel = exports.QuestionCommentModel = function (_super) {
__extends(QuestionCommentModel, _super);
function QuestionCommentModel(name) {
_super.call(this, name);
this.name = name;
this.rows = 4;
this.cols = 50;
}
QuestionCommentModel.prototype.getType = function () {
return "comment";
};
QuestionCommentModel.prototype.isEmpty = function () {
return _super.prototype.isEmpty.call(this) || this.value == "";
};
return QuestionCommentModel;
}(_question.Question);
_jsonobject.JsonObject.metaData.addClass("comment", [{ name: "cols:number", default: 50 }, { name: "rows:number", default: 4 }], function () {
return new QuestionCommentModel("");
}, "question");
_questionfactory.QuestionFactory.Instance.registerQuestion("comment", function (name) {
return new QuestionCommentModel(name);
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 26 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.QuestionDropdownModel = undefined;
var _jsonobject = __webpack_require__(8);
var _questionfactory = __webpack_require__(18);
var _question_baseselect = __webpack_require__(17);
var _surveyStrings = __webpack_require__(7);
var QuestionDropdownModel = exports.QuestionDropdownModel = function (_super) {
__extends(QuestionDropdownModel, _super);
function QuestionDropdownModel(name) {
_super.call(this, name);
this.name = name;
}
Object.defineProperty(QuestionDropdownModel.prototype, "optionsCaption", {
get: function get() {
return this.optionsCaptionValue ? this.optionsCaptionValue : _surveyStrings.surveyLocalization.getString("optionsCaption");
},
set: function set(newValue) {
this.optionsCaptionValue = newValue;
},
enumerable: true,
configurable: true
});
QuestionDropdownModel.prototype.getType = function () {
return "dropdown";
};
QuestionDropdownModel.prototype.supportGoNextPageAutomatic = function () {
return true;
};
return QuestionDropdownModel;
}(_question_baseselect.QuestionSelectBase);
_jsonobject.JsonObject.metaData.addClass("dropdown", [{ name: "optionsCaption", onGetValue: function onGetValue(obj) {
return obj.optionsCaptionValue;
} }], function () {
return new QuestionDropdownModel("");
}, "selectbase");
_questionfactory.QuestionFactory.Instance.registerQuestion("dropdown", function (name) {
var q = new QuestionDropdownModel(name);q.choices = _questionfactory.QuestionFactory.DefaultChoices;return q;
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 27 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.QuestionFileModel = undefined;
var _question = __webpack_require__(14);
var _jsonobject = __webpack_require__(8);
var _questionfactory = __webpack_require__(18);
var _error = __webpack_require__(6);
var _surveyStrings = __webpack_require__(7);
var QuestionFileModel = exports.QuestionFileModel = function (_super) {
__extends(QuestionFileModel, _super);
function QuestionFileModel(name) {
_super.call(this, name);
this.name = name;
this.showPreviewValue = false;
this.isUploading = false;
}
QuestionFileModel.prototype.getType = function () {
return "file";
};
Object.defineProperty(QuestionFileModel.prototype, "showPreview", {
get: function get() {
return this.showPreviewValue;
},
set: function set(value) {
this.showPreviewValue = value;
},
enumerable: true,
configurable: true
});
QuestionFileModel.prototype.loadFile = function (file) {
var self = this;
if (this.survey && !this.survey.uploadFile(this.name, file, this.storeDataAsText, function (status) {
self.isUploading = status == "uploading";
})) return;
this.setFileValue(file);
};
QuestionFileModel.prototype.setFileValue = function (file) {
if (!FileReader) return;
if (!this.showPreview && !this.storeDataAsText) return;
if (this.checkFileForErrors(file)) return;
var fileReader = new FileReader();
var self = this;
fileReader.onload = function (e) {
if (self.showPreview) {
self.previewValue = self.isFileImage(file) ? fileReader.result : null;
self.fireCallback(self.previewValueLoadedCallback);
}
if (self.storeDataAsText) {
self.value = fileReader.result;
}
};
fileReader.readAsDataURL(file);
};
QuestionFileModel.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
if (this.isUploading) {
this.errors.push(new _error.CustomError(_surveyStrings.surveyLocalization.getString("uploadingFile")));
}
};
QuestionFileModel.prototype.checkFileForErrors = function (file) {
var errorLength = this.errors ? this.errors.length : 0;
this.errors = [];
if (this.maxSize > 0 && file.size > this.maxSize) {
this.errors.push(new _error.ExceedSizeError(this.maxSize));
}
if (errorLength != this.errors.length || this.errors.length > 0) {
this.fireCallback(this.errorsChangedCallback);
}
return this.errors.length > 0;
};
QuestionFileModel.prototype.isFileImage = function (file) {
if (!file || !file.type) return;
var str = file.type.toLowerCase();
return str.indexOf("image") == 0;
};
return QuestionFileModel;
}(_question.Question);
_jsonobject.JsonObject.metaData.addClass("file", ["showPreview:boolean", "imageHeight", "imageWidth", "storeDataAsText:boolean", "maxSize:number"], function () {
return new QuestionFileModel("");
}, "question");
_questionfactory.QuestionFactory.Instance.registerQuestion("file", function (name) {
return new QuestionFileModel(name);
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 28 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.QuestionHtmlModel = undefined;
var _questionbase = __webpack_require__(15);
var _jsonobject = __webpack_require__(8);
var _questionfactory = __webpack_require__(18);
var QuestionHtmlModel = exports.QuestionHtmlModel = function (_super) {
__extends(QuestionHtmlModel, _super);
function QuestionHtmlModel(name) {
_super.call(this, name);
this.name = name;
}
QuestionHtmlModel.prototype.getType = function () {
return "html";
};
Object.defineProperty(QuestionHtmlModel.prototype, "html", {
get: function get() {
return this.htmlValue;
},
set: function set(value) {
this.htmlValue = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionHtmlModel.prototype, "processedHtml", {
get: function get() {
return this.survey ? this.survey.processHtml(this.html) : this.html;
},
enumerable: true,
configurable: true
});
return QuestionHtmlModel;
}(_questionbase.QuestionBase);
_jsonobject.JsonObject.metaData.addClass("html", ["html:html"], function () {
return new QuestionHtmlModel("");
}, "questionbase");
_questionfactory.QuestionFactory.Instance.registerQuestion("html", function (name) {
return new QuestionHtmlModel(name);
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 29 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.QuestionRadiogroupModel = undefined;
var _jsonobject = __webpack_require__(8);
var _questionfactory = __webpack_require__(18);
var _question_baseselect = __webpack_require__(17);
var QuestionRadiogroupModel = exports.QuestionRadiogroupModel = function (_super) {
__extends(QuestionRadiogroupModel, _super);
function QuestionRadiogroupModel(name) {
_super.call(this, name);
this.name = name;
}
QuestionRadiogroupModel.prototype.getType = function () {
return "radiogroup";
};
QuestionRadiogroupModel.prototype.supportGoNextPageAutomatic = function () {
return true;
};
return QuestionRadiogroupModel;
}(_question_baseselect.QuestionCheckboxBase);
_jsonobject.JsonObject.metaData.addClass("radiogroup", [], function () {
return new QuestionRadiogroupModel("");
}, "checkboxbase");
_questionfactory.QuestionFactory.Instance.registerQuestion("radiogroup", function (name) {
var q = new QuestionRadiogroupModel(name);q.choices = _questionfactory.QuestionFactory.DefaultChoices;return q;
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 30 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.QuestionRatingModel = undefined;
var _base = __webpack_require__(5);
var _question = __webpack_require__(14);
var _jsonobject = __webpack_require__(8);
var _questionfactory = __webpack_require__(18);
var QuestionRatingModel = exports.QuestionRatingModel = function (_super) {
__extends(QuestionRatingModel, _super);
function QuestionRatingModel(name) {
_super.call(this, name);
this.name = name;
this.rates = [];
this.mininumRateDescription = null;
this.maximumRateDescription = null;
}
Object.defineProperty(QuestionRatingModel.prototype, "rateValues", {
get: function get() {
return this.rates;
},
set: function set(newValue) {
_base.ItemValue.setData(this.rates, newValue);
this.fireCallback(this.rateValuesChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "visibleRateValues", {
get: function get() {
if (this.rateValues.length > 0) return this.rateValues;
return QuestionRatingModel.defaultRateValues;
},
enumerable: true,
configurable: true
});
QuestionRatingModel.prototype.getType = function () {
return "rating";
};
QuestionRatingModel.prototype.supportComment = function () {
return true;
};
QuestionRatingModel.prototype.supportOther = function () {
return true;
};
QuestionRatingModel.prototype.supportGoNextPageAutomatic = function () {
return true;
};
QuestionRatingModel.defaultRateValues = [];
return QuestionRatingModel;
}(_question.Question);
_base.ItemValue.setData(QuestionRatingModel.defaultRateValues, [1, 2, 3, 4, 5]);
_jsonobject.JsonObject.metaData.addClass("rating", ["hasComment:boolean", { name: "rateValues:itemvalues", onGetValue: function onGetValue(obj) {
return _base.ItemValue.getData(obj.rateValues);
}, onSetValue: function onSetValue(obj, value) {
obj.rateValues = value;
} }, "mininumRateDescription", "maximumRateDescription"], function () {
return new QuestionRatingModel("");
}, "question");
_questionfactory.QuestionFactory.Instance.registerQuestion("rating", function (name) {
return new QuestionRatingModel(name);
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 31 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.QuestionTextModel = undefined;
var _questionfactory = __webpack_require__(18);
var _jsonobject = __webpack_require__(8);
var _question = __webpack_require__(14);
var QuestionTextModel = exports.QuestionTextModel = function (_super) {
__extends(QuestionTextModel, _super);
function QuestionTextModel(name) {
_super.call(this, name);
this.name = name;
this.size = 25;
this.inputType = "text";
}
QuestionTextModel.prototype.getType = function () {
return "text";
};
QuestionTextModel.prototype.isEmpty = function () {
return _super.prototype.isEmpty.call(this) || this.value == "";
};
QuestionTextModel.prototype.supportGoNextPageAutomatic = function () {
return true;
};
QuestionTextModel.prototype.setNewValue = function (newValue) {
newValue = this.correctValueType(newValue);
_super.prototype.setNewValue.call(this, newValue);
};
QuestionTextModel.prototype.correctValueType = function (newValue) {
if (!newValue) return newValue;
if (this.inputType == "number" || this.inputType == "range") {
return this.isNumber(newValue) ? parseFloat(newValue) : "";
}
return newValue;
};
QuestionTextModel.prototype.isNumber = function (value) {
return !isNaN(parseFloat(value)) && isFinite(value);
};
return QuestionTextModel;
}(_question.Question);
_jsonobject.JsonObject.metaData.addClass("text", [{ name: "inputType", default: "text", choices: ["color", "date", "datetime", "datetime-local", "email", "month", "number", "password", "range", "tel", "text", "time", "url", "week"] }, { name: "size:number", default: 25 }], function () {
return new QuestionTextModel("");
}, "question");
_questionfactory.QuestionFactory.Instance.registerQuestion("text", function (name) {
return new QuestionTextModel(name);
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 32 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyModel = undefined;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _jsonobject = __webpack_require__(8);
var _base = __webpack_require__(5);
var _page = __webpack_require__(23);
var _textPreProcessor = __webpack_require__(16);
var _conditionProcessValue = __webpack_require__(12);
var _dxSurveyService = __webpack_require__(33);
var _surveyStrings = __webpack_require__(7);
var _error = __webpack_require__(6);
var SurveyModel = exports.SurveyModel = function (_super) {
__extends(SurveyModel, _super);
function SurveyModel(jsonObj) {
if (jsonObj === void 0) {
jsonObj = null;
}
_super.call(this);
this.surveyId = null;
this.surveyPostId = null;
this.clientId = null;
this.cookieName = null;
this.sendResultOnPageNext = false;
this.commentPrefix = "-Comment";
this.title = "";
this.showNavigationButtons = true;
this.showTitle = true;
this.showPageTitles = true;
this.completedHtml = "";
this.requiredText = "*";
this.questionStartIndex = "";
this.questionTitleTemplate = "";
this.showProgressBar = "off";
this.storeOthersAsComment = true;
this.goNextPageAutomatic = false;
this.pages = new Array();
this.triggers = new Array();
this.clearInvisibleValues = false;
this.currentPageValue = null;
this.valuesHash = {};
this.variablesHash = {};
this.showPageNumbersValue = false;
this.showQuestionNumbersValue = "on";
this.questionTitleLocationValue = "top";
this.localeValue = "";
this.isCompleted = false;
this.isLoading = false;
this.processedTextValues = {};
this.isValidatingOnServerValue = false;
this.modeValue = "edit";
this.isDesignModeValue = false;
this.onComplete = new _base.Event();
this.onPartialSend = new _base.Event();
this.onCurrentPageChanged = new _base.Event();
this.onValueChanged = new _base.Event();
this.onVisibleChanged = new _base.Event();
this.onPageVisibleChanged = new _base.Event();
this.onQuestionAdded = new _base.Event();
this.onQuestionRemoved = new _base.Event();
this.onValidateQuestion = new _base.Event();
this.onProcessHtml = new _base.Event();
this.onSendResult = new _base.Event();
this.onGetResult = new _base.Event();
this.onUploadFile = new _base.Event();
this.jsonErrors = null;
var self = this;
this.textPreProcessor = new _textPreProcessor.TextPreProcessor();
this.textPreProcessor.onHasValue = function (name) {
return self.hasProcessedTextValue(name);
};
this.textPreProcessor.onProcess = function (name) {
return self.getProcessedTextValue(name);
};
this.pages.push = function (value) {
value.data = self;
return Array.prototype.push.call(this, value);
};
this.triggers.push = function (value) {
value.setOwner(self);
return Array.prototype.push.call(this, value);
};
this.updateProcessedTextValues();
this.onBeforeCreating();
if (jsonObj) {
this.setJsonObject(jsonObj);
if (this.surveyId) {
this.loadSurveyFromService(this.surveyId);
}
}
this.onCreating();
}
SurveyModel.prototype.getType = function () {
return "survey";
};
Object.defineProperty(SurveyModel.prototype, "locale", {
get: function get() {
return this.localeValue;
},
set: function set(value) {
this.localeValue = value;
_surveyStrings.surveyLocalization.currentLocale = value;
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getLocString = function (str) {
return _surveyStrings.surveyLocalization.getString(str);
};
Object.defineProperty(SurveyModel.prototype, "emptySurveyText", {
get: function get() {
return this.getLocString("emptySurvey");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "pagePrevText", {
get: function get() {
return this.pagePrevTextValue ? this.pagePrevTextValue : this.getLocString("pagePrevText");
},
set: function set(newValue) {
this.pagePrevTextValue = newValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "pageNextText", {
get: function get() {
return this.pageNextTextValue ? this.pageNextTextValue : this.getLocString("pageNextText");
},
set: function set(newValue) {
this.pageNextTextValue = newValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "completeText", {
get: function get() {
return this.completeTextValue ? this.completeTextValue : this.getLocString("completeText");
},
set: function set(newValue) {
this.completeTextValue = newValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showPageNumbers", {
get: function get() {
return this.showPageNumbersValue;
},
set: function set(value) {
if (value === this.showPageNumbers) return;
this.showPageNumbersValue = value;
this.updateVisibleIndexes();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showQuestionNumbers", {
get: function get() {
return this.showQuestionNumbersValue;
},
set: function set(value) {
if (value === this.showQuestionNumbers) return;
this.showQuestionNumbersValue = value;
this.updateVisibleIndexes();
},
enumerable: true,
configurable: true
});
;
;
Object.defineProperty(SurveyModel.prototype, "questionTitleLocation", {
get: function get() {
return this.questionTitleLocationValue;
},
set: function set(value) {
if (value === this.questionTitleLocationValue) return;
this.questionTitleLocationValue = value;
},
enumerable: true,
configurable: true
});
;
;
Object.defineProperty(SurveyModel.prototype, "mode", {
get: function get() {
return this.modeValue;
},
set: function set(value) {
if (value == this.mode) return;
if (value != "edit" && value != "display") return;
this.modeValue = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "data", {
get: function get() {
var result = {};
for (var key in this.valuesHash) {
result[key] = this.valuesHash[key];
}
return result;
},
set: function set(data) {
this.valuesHash = {};
if (data) {
for (var key in data) {
this.valuesHash[key] = data[key];
this.checkTriggers(key, data[key], false);
}
}
this.notifyAllQuestionsOnValueChanged();
this.runConditions();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "comments", {
get: function get() {
var result = {};
for (var key in this.valuesHash) {
if (key.indexOf(this.commentPrefix) > 0) {
result[key] = this.valuesHash[key];
}
}
return result;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "visiblePages", {
get: function get() {
if (this.isDesignMode) return this.pages;
var result = new Array();
for (var i = 0; i < this.pages.length; i++) {
if (this.pages[i].isVisible) {
result.push(this.pages[i]);
}
}
return result;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isEmpty", {
get: function get() {
return this.pages.length == 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "PageCount", {
get: function get() {
return this.pages.length;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "visiblePageCount", {
get: function get() {
return this.visiblePages.length;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "currentPage", {
get: function get() {
var vPages = this.visiblePages;
if (this.currentPageValue != null) {
if (vPages.indexOf(this.currentPageValue) < 0) {
this.currentPage = null;
}
}
if (this.currentPageValue == null && vPages.length > 0) {
this.currentPage = vPages[0];
}
return this.currentPageValue;
},
set: function set(value) {
var vPages = this.visiblePages;
if (value != null && vPages.indexOf(value) < 0) return;
if (value == this.currentPageValue) return;
var oldValue = this.currentPageValue;
this.currentPageValue = value;
this.currentPageChanged(value, oldValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "currentPageNo", {
get: function get() {
return this.visiblePages.indexOf(this.currentPage);
},
set: function set(value) {
var vPages = this.visiblePages;
if (value < 0 || value >= this.visiblePages.length) return;
this.currentPage = this.visiblePages[value];
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.focusFirstQuestion = function () {
if (this.currentPageValue) {
this.currentPageValue.scrollToTop();
this.currentPageValue.focusFirstQuestion();
}
};
Object.defineProperty(SurveyModel.prototype, "state", {
get: function get() {
if (this.isLoading) return "loading";
if (this.isCompleted) return "completed";
return this.currentPage ? "running" : "empty";
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.clear = function (clearData, gotoFirstPage) {
if (clearData === void 0) {
clearData = true;
}
if (gotoFirstPage === void 0) {
gotoFirstPage = true;
}
if (clearData) {
this.data = null;
this.variablesHash = {};
}
this.isCompleted = false;
if (gotoFirstPage && this.visiblePageCount > 0) {
this.currentPage = this.visiblePages[0];
}
};
SurveyModel.prototype.mergeValues = function (src, dest) {
if (!dest || !src) return;
for (var key in src) {
var value = src[key];
if (value && (typeof value === "undefined" ? "undefined" : _typeof(value)) === 'object') {
if (!dest[key]) dest[key] = {};
this.mergeValues(value, dest[key]);
} else {
dest[key] = value;
}
}
};
SurveyModel.prototype.currentPageChanged = function (newValue, oldValue) {
this.onCurrentPageChanged.fire(this, { 'oldCurrentPage': oldValue, 'newCurrentPage': newValue });
};
SurveyModel.prototype.getProgress = function () {
if (this.currentPage == null) return 0;
var index = this.visiblePages.indexOf(this.currentPage) + 1;
return Math.ceil(index * 100 / this.visiblePageCount);
};
Object.defineProperty(SurveyModel.prototype, "isEditMode", {
get: function get() {
return this.mode == "edit";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isDisplayMode", {
get: function get() {
return this.mode == "display";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isDesignMode", {
get: function get() {
return this.isDesignModeValue;
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.setDesignMode = function (value) {
this.isDesignModeValue = value;
};
Object.defineProperty(SurveyModel.prototype, "hasCookie", {
get: function get() {
if (!this.cookieName) return false;
var cookies = document.cookie;
return cookies && cookies.indexOf(this.cookieName + "=true") > -1;
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.setCookie = function () {
if (!this.cookieName) return;
document.cookie = this.cookieName + "=true; expires=Fri, 31 Dec 9999 0:0:0 GMT";
};
SurveyModel.prototype.deleteCookie = function () {
if (!this.cookieName) return;
document.cookie = this.cookieName + "=;";
};
SurveyModel.prototype.nextPage = function () {
if (this.isLastPage) return false;
if (this.isEditMode && this.isCurrentPageHasErrors) return false;
if (this.doServerValidation()) return false;
this.doNextPage();
return true;
};
Object.defineProperty(SurveyModel.prototype, "isCurrentPageHasErrors", {
get: function get() {
if (this.currentPage == null) return true;
return this.currentPage.hasErrors(true, true);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.prevPage = function () {
if (this.isFirstPage) return false;
var vPages = this.visiblePages;
var index = vPages.indexOf(this.currentPage);
this.currentPage = vPages[index - 1];
};
SurveyModel.prototype.completeLastPage = function () {
if (this.isEditMode && this.isCurrentPageHasErrors) return false;
if (this.doServerValidation()) return false;
this.doComplete();
return true;
};
Object.defineProperty(SurveyModel.prototype, "isFirstPage", {
get: function get() {
if (this.currentPage == null) return true;
return this.visiblePages.indexOf(this.currentPage) == 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isLastPage", {
get: function get() {
if (this.currentPage == null) return true;
var vPages = this.visiblePages;
return vPages.indexOf(this.currentPage) == vPages.length - 1;
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.doComplete = function () {
if (this.clearInvisibleValues) {
this.clearInvisibleQuestionValues();
}
this.setCookie();
this.setCompleted();
this.onComplete.fire(this, null);
if (this.surveyPostId) {
this.sendResult();
}
};
Object.defineProperty(SurveyModel.prototype, "isValidatingOnServer", {
get: function get() {
return this.isValidatingOnServerValue;
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.setIsValidatingOnServer = function (val) {
if (val == this.isValidatingOnServer) return;
this.isValidatingOnServerValue = val;
this.onIsValidatingOnServerChanged();
};
SurveyModel.prototype.onIsValidatingOnServerChanged = function () {};
SurveyModel.prototype.doServerValidation = function () {
if (!this.onServerValidateQuestions) return false;
var self = this;
var options = { data: {}, errors: {}, survey: this, complete: function complete() {
self.completeServerValidation(options);
} };
for (var i = 0; i < this.currentPage.questions.length; i++) {
var question = this.currentPage.questions[i];
if (!question.visible) continue;
var value = this.getValue(question.name);
if (value) options.data[question.name] = value;
}
this.setIsValidatingOnServer(true);
this.onServerValidateQuestions(this, options);
return true;
};
SurveyModel.prototype.completeServerValidation = function (options) {
this.setIsValidatingOnServer(false);
if (!options && !options.survey) return;
var self = options.survey;
var hasErrors = false;
if (options.errors) {
for (var name in options.errors) {
var question = self.getQuestionByName(name);
if (question && question["errors"]) {
hasErrors = true;
question["addError"](new _error.CustomError(options.errors[name]));
}
}
}
if (!hasErrors) {
if (self.isLastPage) self.doComplete();else self.doNextPage();
}
};
SurveyModel.prototype.doNextPage = function () {
this.checkOnPageTriggers();
if (this.sendResultOnPageNext) {
this.sendResult(this.surveyPostId, this.clientId, true);
}
var vPages = this.visiblePages;
var index = vPages.indexOf(this.currentPage);
this.currentPage = vPages[index + 1];
};
SurveyModel.prototype.setCompleted = function () {
this.isCompleted = true;
};
Object.defineProperty(SurveyModel.prototype, "processedCompletedHtml", {
get: function get() {
if (this.completedHtml) {
return this.processHtml(this.completedHtml);
}
return "
" + this.getLocString("completingSurvey") + "
";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "processedLoadingHtml", {
get: function get() {
return "" + this.getLocString("loadingSurvey") + "
";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "progressText", {
get: function get() {
if (this.currentPage == null) return "";
var vPages = this.visiblePages;
var index = vPages.indexOf(this.currentPage) + 1;
return this.getLocString("progressText")["format"](index, vPages.length);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.uploadFile = function (name, file, storeDataAsText, uploadingCallback) {
var accept = true;
this.onUploadFile.fire(this, { name: name, file: file, accept: accept });
if (!accept) return false;
if (!storeDataAsText && this.surveyPostId) {
this.uploadFileCore(name, file, uploadingCallback);
}
return true;
};
SurveyModel.prototype.uploadFileCore = function (name, file, uploadingCallback) {
var self = this;
if (uploadingCallback) uploadingCallback("uploading");
new _dxSurveyService.dxSurveyService().sendFile(this.surveyPostId, file, function (success, response) {
if (uploadingCallback) uploadingCallback(success ? "success" : "error");
if (success) {
self.setValue(name, response);
}
});
};
SurveyModel.prototype.getPage = function (index) {
return this.pages[index];
};
SurveyModel.prototype.addPage = function (page) {
if (page == null) return;
this.pages.push(page);
this.updateVisibleIndexes();
};
SurveyModel.prototype.addNewPage = function (name) {
var page = this.createNewPage(name);
this.addPage(page);
return page;
};
SurveyModel.prototype.removePage = function (page) {
var index = this.pages.indexOf(page);
if (index < 0) return;
this.pages.splice(index, 1);
if (this.currentPageValue == page) {
this.currentPage = this.pages.length > 0 ? this.pages[0] : null;
}
this.updateVisibleIndexes();
};
SurveyModel.prototype.getQuestionByName = function (name, caseInsensitive) {
if (caseInsensitive === void 0) {
caseInsensitive = false;
}
var questions = this.getAllQuestions();
if (caseInsensitive) name = name.toLowerCase();
for (var i = 0; i < questions.length; i++) {
var questionName = questions[i].name;
if (caseInsensitive) questionName = questionName.toLowerCase();
if (questionName == name) return questions[i];
}
return null;
};
SurveyModel.prototype.getQuestionsByNames = function (names, caseInsensitive) {
if (caseInsensitive === void 0) {
caseInsensitive = false;
}
var result = [];
if (!names) return result;
for (var i = 0; i < names.length; i++) {
if (!names[i]) continue;
var question = this.getQuestionByName(names[i], caseInsensitive);
if (question) result.push(question);
}
return result;
};
SurveyModel.prototype.getPageByQuestion = function (question) {
for (var i = 0; i < this.pages.length; i++) {
var page = this.pages[i];
if (page.questions.indexOf(question) > -1) return page;
}
return null;
};
SurveyModel.prototype.getPageByName = function (name) {
for (var i = 0; i < this.pages.length; i++) {
if (this.pages[i].name == name) return this.pages[i];
}
return null;
};
SurveyModel.prototype.getPagesByNames = function (names) {
var result = [];
if (!names) return result;
for (var i = 0; i < names.length; i++) {
if (!names[i]) continue;
var page = this.getPageByName(names[i]);
if (page) result.push(page);
}
return result;
};
SurveyModel.prototype.getAllQuestions = function (visibleOnly) {
if (visibleOnly === void 0) {
visibleOnly = false;
}
var result = new Array();
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].addQuestionsToList(result, visibleOnly);
}
return result;
};
SurveyModel.prototype.createNewPage = function (name) {
return new _page.PageModel(name);
};
SurveyModel.prototype.notifyQuestionOnValueChanged = function (name, newValue) {
var questions = this.getAllQuestions();
var question = null;
for (var i = 0; i < questions.length; i++) {
if (questions[i].name != name) continue;
question = questions[i];
this.doSurveyValueChanged(question, newValue);
}
this.onValueChanged.fire(this, { 'name': name, 'question': question, 'value': newValue });
};
SurveyModel.prototype.notifyAllQuestionsOnValueChanged = function () {
var questions = this.getAllQuestions();
for (var i = 0; i < questions.length; i++) {
this.doSurveyValueChanged(questions[i], this.getValue(questions[i].name));
}
};
SurveyModel.prototype.doSurveyValueChanged = function (question, newValue) {
question.onSurveyValueChanged(newValue);
};
SurveyModel.prototype.checkOnPageTriggers = function () {
var questions = this.getCurrentPageQuestions();
for (var i = 0; i < questions.length; i++) {
var question = questions[i];
var value = this.getValue(question.name);
this.checkTriggers(question.name, value, true);
}
};
SurveyModel.prototype.getCurrentPageQuestions = function () {
var result = [];
var page = this.currentPage;
if (!page) return result;
for (var i = 0; i < page.questions.length; i++) {
var question = page.questions[i];
if (!question.visible || !question.name) continue;
result.push(question);
}
return result;
};
SurveyModel.prototype.checkTriggers = function (name, newValue, isOnNextPage) {
for (var i = 0; i < this.triggers.length; i++) {
var trigger = this.triggers[i];
if (trigger.name == name && trigger.isOnNextPage == isOnNextPage) {
trigger.check(newValue);
}
}
};
SurveyModel.prototype.doQuestionsOnLoad = function () {
var questions = this.getAllQuestions(false);
for (var i = 0; i < questions.length; i++) {
questions[i].onSurveyLoad();
}
};
SurveyModel.prototype.runConditions = function () {
this.runConditionsForList(this.getAllQuestions(false));
this.runConditionsForList(this.pages);
};
SurveyModel.prototype.runConditionsForList = function (list) {
for (var i = 0; i < list.length; i++) {
list[i].runCondition(this.valuesHash);
}
};
SurveyModel.prototype.sendResult = function (postId, clientId, isPartialCompleted) {
if (postId === void 0) {
postId = null;
}
if (clientId === void 0) {
clientId = null;
}
if (isPartialCompleted === void 0) {
isPartialCompleted = false;
}
if (!this.isEditMode) return;
if (isPartialCompleted && this.onPartialSend) {
this.onPartialSend.fire(this, null);
}
if (!this.surveyPostId && postId) {
this.surveyPostId = postId;
}
if (!this.surveyPostId) return;
if (clientId) {
this.clientId = clientId;
}
if (isPartialCompleted && !this.clientId) return;
var self = this;
new _dxSurveyService.dxSurveyService().sendResult(this.surveyPostId, this.data, function (success, response) {
self.onSendResult.fire(self, { success: success, response: response });
}, this.clientId, isPartialCompleted);
};
SurveyModel.prototype.getResult = function (resultId, name) {
var self = this;
new _dxSurveyService.dxSurveyService().getResult(resultId, name, function (success, data, dataList, response) {
self.onGetResult.fire(self, { success: success, data: data, dataList: dataList, response: response });
});
};
SurveyModel.prototype.loadSurveyFromService = function (surveyId) {
if (surveyId === void 0) {
surveyId = null;
}
if (surveyId) {
this.surveyId = surveyId;
}
var self = this;
this.isLoading = true;
this.onLoadingSurveyFromService();
new _dxSurveyService.dxSurveyService().loadSurvey(this.surveyId, function (success, result, response) {
self.isLoading = false;
if (success && result) {
self.setJsonObject(result);
self.notifyAllQuestionsOnValueChanged();
self.onLoadSurveyFromService();
}
});
};
SurveyModel.prototype.onLoadingSurveyFromService = function () {};
SurveyModel.prototype.onLoadSurveyFromService = function () {};
SurveyModel.prototype.checkPageVisibility = function (question, oldQuestionVisible) {
var page = this.getPageByQuestion(question);
if (!page) return;
var newValue = page.isVisible;
if (newValue != page.getIsPageVisible(question) || oldQuestionVisible) {
this.pageVisibilityChanged(page, newValue);
}
};
SurveyModel.prototype.updateVisibleIndexes = function () {
this.updatePageVisibleIndexes(this.showPageNumbers);
if (this.showQuestionNumbers == "onPage") {
var visPages = this.visiblePages;
for (var i = 0; i < visPages.length; i++) {
this.updateQuestionVisibleIndexes(visPages[i].questions, true);
}
} else {
this.updateQuestionVisibleIndexes(this.getAllQuestions(false), this.showQuestionNumbers == "on");
}
};
SurveyModel.prototype.updatePageVisibleIndexes = function (showIndex) {
var index = 0;
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].visibleIndex = this.pages[i].visible ? index++ : -1;
this.pages[i].num = showIndex && this.pages[i].visible ? this.pages[i].visibleIndex + 1 : -1;
}
};
SurveyModel.prototype.updateQuestionVisibleIndexes = function (questions, showIndex) {
var index = 0;
for (var i = 0; i < questions.length; i++) {
questions[i].setVisibleIndex(showIndex && questions[i].visible && questions[i].hasTitle ? index++ : -1);
}
};
SurveyModel.prototype.setJsonObject = function (jsonObj) {
if (!jsonObj) return;
this.jsonErrors = null;
var jsonConverter = new _jsonobject.JsonObject();
jsonConverter.toObject(jsonObj, this);
if (jsonConverter.errors.length > 0) {
this.jsonErrors = jsonConverter.errors;
}
this.updateProcessedTextValues();
if (this.hasCookie) {
this.doComplete();
}
this.doQuestionsOnLoad();
this.runConditions();
this.updateVisibleIndexes();
};
SurveyModel.prototype.onBeforeCreating = function () {};
SurveyModel.prototype.onCreating = function () {};
SurveyModel.prototype.updateProcessedTextValues = function () {
this.processedTextValues = {};
var self = this;
this.processedTextValues["pageno"] = function (name) {
return self.currentPage != null ? self.visiblePages.indexOf(self.currentPage) + 1 : 0;
};
this.processedTextValues["pagecount"] = function (name) {
return self.visiblePageCount;
};
var questions = this.getAllQuestions();
for (var i = 0; i < questions.length; i++) {
this.addQuestionToProcessedTextValues(questions[i]);
}
};
SurveyModel.prototype.addQuestionToProcessedTextValues = function (question) {
this.processedTextValues[question.name.toLowerCase()] = "question";
};
SurveyModel.prototype.hasProcessedTextValue = function (name) {
var firstName = new _conditionProcessValue.ProcessValue().getFirstName(name);
return this.processedTextValues[firstName.toLowerCase()];
};
SurveyModel.prototype.getProcessedTextValue = function (name) {
var firstName = new _conditionProcessValue.ProcessValue().getFirstName(name);
var val = this.processedTextValues[firstName.toLowerCase()];
if (!val) return null;
if (val == "variable") {
return this.getVariable(name.toLowerCase());
}
if (val == "question") {
var question = this.getQuestionByName(firstName, true);
if (!question) return null;
name = question.name + name.substr(firstName.length);
return new _conditionProcessValue.ProcessValue().getValue(name, this.valuesHash);
}
if (val == "value") {
return new _conditionProcessValue.ProcessValue().getValue(name, this.valuesHash);
}
return val(name);
};
SurveyModel.prototype.clearInvisibleQuestionValues = function () {
var questions = this.getAllQuestions();
for (var i = 0; i < questions.length; i++) {
if (questions[i].visible) continue;
this.setValue(questions[i].name, null);
}
};
SurveyModel.prototype.getVariable = function (name) {
if (!name) return null;
return this.variablesHash[name];
};
SurveyModel.prototype.setVariable = function (name, newValue) {
if (!name) return;
this.variablesHash[name] = newValue;
this.processedTextValues[name.toLowerCase()] = "variable";
};
//ISurvey data
SurveyModel.prototype.getUnbindValue = function (value) {
if (value && value instanceof Object) {
//do not return the same object instance!!!
return JSON.parse(JSON.stringify(value));
}
return value;
};
SurveyModel.prototype.getValue = function (name) {
if (!name || name.length == 0) return null;
var value = this.valuesHash[name];
return this.getUnbindValue(value);
};
SurveyModel.prototype.setValue = function (name, newValue) {
if (this.isValueEqual(name, newValue)) return;
if (newValue == "" || newValue == null) {
delete this.valuesHash[name];
} else {
newValue = this.getUnbindValue(newValue);
this.valuesHash[name] = newValue;
this.processedTextValues[name.toLowerCase()] = "value";
}
this.notifyQuestionOnValueChanged(name, newValue);
this.checkTriggers(name, newValue, false);
this.runConditions();
this.tryGoNextPageAutomatic(name);
};
SurveyModel.prototype.isValueEqual = function (name, newValue) {
if (newValue == "") newValue = null;
var oldValue = this.getValue(name);
if (newValue === null || oldValue === null) return newValue === oldValue;
return this.isTwoValueEquals(newValue, oldValue);
};
SurveyModel.prototype.isTwoValueEquals = function (x, y) {
if (x === y) return true;
if (!(x instanceof Object) || !(y instanceof Object)) return false;
for (var p in x) {
if (!x.hasOwnProperty(p)) continue;
if (!y.hasOwnProperty(p)) return false;
if (x[p] === y[p]) continue;
if (_typeof(x[p]) !== "object") return false;
if (!this.isTwoValueEquals(x[p], y[p])) return false;
}
for (p in y) {
if (y.hasOwnProperty(p) && !x.hasOwnProperty(p)) return false;
}
return true;
};
SurveyModel.prototype.tryGoNextPageAutomatic = function (name) {
if (!this.goNextPageAutomatic || !this.currentPage) return;
var question = this.getQuestionByName(name);
if (question && !question.supportGoNextPageAutomatic()) return;
var questions = this.getCurrentPageQuestions();
for (var i = 0; i < questions.length; i++) {
if (!this.getValue(questions[i].name)) return;
}
if (!this.currentPage.hasErrors(true, false)) {
if (!this.isLastPage) {
this.nextPage();
} else {
this.doComplete();
}
}
};
SurveyModel.prototype.getComment = function (name) {
var result = this.data[name + this.commentPrefix];
if (result == null) result = "";
return result;
};
SurveyModel.prototype.setComment = function (name, newValue) {
name = name + this.commentPrefix;
if (newValue == "" || newValue == null) {
delete this.valuesHash[name];
} else {
this.valuesHash[name] = newValue;
this.tryGoNextPageAutomatic(name);
}
};
SurveyModel.prototype.questionVisibilityChanged = function (question, newValue) {
this.updateVisibleIndexes();
this.onVisibleChanged.fire(this, { 'question': question, 'name': question.name, 'visible': newValue });
this.checkPageVisibility(question, !newValue);
};
SurveyModel.prototype.pageVisibilityChanged = function (page, newValue) {
this.updateVisibleIndexes();
this.onPageVisibleChanged.fire(this, { 'page': page, 'visible': newValue });
};
SurveyModel.prototype.questionAdded = function (question, index) {
this.updateVisibleIndexes();
this.addQuestionToProcessedTextValues(question);
this.onQuestionAdded.fire(this, { 'question': question, 'name': question.name, 'index': index });
};
SurveyModel.prototype.questionRemoved = function (question) {
this.updateVisibleIndexes();
this.onQuestionRemoved.fire(this, { 'question': question, 'name': question.name });
};
SurveyModel.prototype.validateQuestion = function (name) {
if (this.onValidateQuestion.isEmpty) return null;
var options = { name: name, value: this.getValue(name), error: null };
this.onValidateQuestion.fire(this, options);
return options.error ? new _error.CustomError(options.error) : null;
};
SurveyModel.prototype.processHtml = function (html) {
var options = { html: html };
this.onProcessHtml.fire(this, options);
return this.processText(options.html);
};
SurveyModel.prototype.processText = function (text) {
return this.textPreProcessor.process(text);
};
//ISurveyTriggerOwner
SurveyModel.prototype.getObjects = function (pages, questions) {
var result = [];
Array.prototype.push.apply(result, this.getPagesByNames(pages));
Array.prototype.push.apply(result, this.getQuestionsByNames(questions));
return result;
};
SurveyModel.prototype.setTriggerValue = function (name, value, isVariable) {
if (!name) return;
if (isVariable) {
this.setVariable(name, value);
} else {
this.setValue(name, value);
}
};
return SurveyModel;
}(_base.Base);
_jsonobject.JsonObject.metaData.addClass("survey", [{ name: "locale", choices: function choices() {
return _surveyStrings.surveyLocalization.getLocales();
} }, "title", "completedHtml:html", { name: "pages", className: "page" }, { name: "questions", baseClassName: "question", onGetValue: function onGetValue(obj) {
return null;
}, onSetValue: function onSetValue(obj, value, jsonConverter) {
var page = obj.addNewPage("");jsonConverter.toObject({ questions: value }, page);
} }, { name: "triggers:triggers", baseClassName: "surveytrigger", classNamePart: "trigger" }, "surveyId", "surveyPostId", "cookieName", "sendResultOnPageNext:boolean", { name: "showNavigationButtons:boolean", default: true }, { name: "showTitle:boolean", default: true }, { name: "showPageTitles:boolean", default: true }, "showPageNumbers:boolean", { name: "showQuestionNumbers", default: "on", choices: ["on", "onPage", "off"] }, { name: "questionTitleLocation", default: "top", choices: ["top", "bottom"] }, { name: "showProgressBar", default: "off", choices: ["off", "top", "bottom"] }, { name: "mode", default: "edit", choices: ["edit", "display"] }, { name: "storeOthersAsComment:boolean", default: true }, "goNextPageAutomatic:boolean", "clearInvisibleValues:boolean", { name: "pagePrevText", onGetValue: function onGetValue(obj) {
return obj.pagePrevTextValue;
} }, { name: "pageNextText", onGetValue: function onGetValue(obj) {
return obj.pageNextTextValue;
} }, { name: "completeText", onGetValue: function onGetValue(obj) {
return obj.completeTextValue;
} }, { name: "requiredText", default: "*" }, "questionStartIndex", "questionTitleTemplate"]);
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 33 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var dxSurveyService = exports.dxSurveyService = function () {
//public static serviceUrl: string = "http://localhost:50488/api/Survey";
function dxSurveyService() {}
dxSurveyService.prototype.loadSurvey = function (surveyId, onLoad) {
var xhr = new XMLHttpRequest();
xhr.open('GET', dxSurveyService.serviceUrl + '/getSurvey?surveyId=' + surveyId);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload = function () {
var result = JSON.parse(xhr.response);
onLoad(xhr.status == 200, result, xhr.response);
};
xhr.send();
};
dxSurveyService.prototype.sendResult = function (postId, result, onSendResult, clientId, isPartialCompleted) {
if (clientId === void 0) {
clientId = null;
}
if (isPartialCompleted === void 0) {
isPartialCompleted = false;
}
var xhr = new XMLHttpRequest();
xhr.open('POST', dxSurveyService.serviceUrl + '/post/');
xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
var data = { postId: postId, surveyResult: JSON.stringify(result) };
if (clientId) data['clientId'] = clientId;
if (isPartialCompleted) data['isPartialCompleted'] = true;
var dataStringify = JSON.stringify(data);
var self = this;
xhr.onload = xhr.onerror = function () {
if (!onSendResult) return;
onSendResult(xhr.status == 200, xhr.response);
};
xhr.send(dataStringify);
};
dxSurveyService.prototype.sendFile = function (postId, file, onSendFile) {
var xhr = new XMLHttpRequest();
xhr.onload = xhr.onerror = function () {
if (!onSendFile) return;
onSendFile(xhr.status == 200, JSON.parse(xhr.response));
};
xhr.open("POST", dxSurveyService.serviceUrl + '/upload/', true);
var formData = new FormData();
formData.append("file", file);
formData.append("postId", postId);
xhr.send(formData);
};
dxSurveyService.prototype.getResult = function (resultId, name, onGetResult) {
var xhr = new XMLHttpRequest();
var data = 'resultId=' + resultId + '&name=' + name;
xhr.open('GET', dxSurveyService.serviceUrl + '/getResult?' + data);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
var self = this;
xhr.onload = function () {
var result = null;
var list = null;
if (xhr.status == 200) {
result = JSON.parse(xhr.response);
list = [];
for (var key in result.QuestionResult) {
var el = { name: key, value: result.QuestionResult[key] };
list.push(el);
}
}
onGetResult(xhr.status == 200, result, list, xhr.response);
};
xhr.send();
};
dxSurveyService.prototype.isCompleted = function (resultId, clientId, onIsCompleted) {
var xhr = new XMLHttpRequest();
var data = 'resultId=' + resultId + '&clientId=' + clientId;
xhr.open('GET', dxSurveyService.serviceUrl + '/isCompleted?' + data);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
var self = this;
xhr.onload = function () {
var result = null;
if (xhr.status == 200) {
result = JSON.parse(xhr.response);
}
onIsCompleted(xhr.status == 200, result, xhr.response);
};
xhr.send();
};
dxSurveyService.serviceUrl = "https://dxsurveyapi.azurewebsites.net/api/Survey";
return dxSurveyService;
}();
/***/ },
/* 34 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyTriggerSetValue = exports.SurveyTriggerComplete = exports.SurveyTriggerVisible = exports.SurveyTrigger = exports.Trigger = undefined;
var _base = __webpack_require__(5);
var _jsonobject = __webpack_require__(8);
var Trigger = exports.Trigger = function (_super) {
__extends(Trigger, _super);
function Trigger() {
_super.call(this);
this.opValue = "equal";
}
Object.defineProperty(Trigger, "operators", {
get: function get() {
if (Trigger.operatorsValue != null) return Trigger.operatorsValue;
Trigger.operatorsValue = {
empty: function empty(value, expectedValue) {
return !value;
},
notempty: function notempty(value, expectedValue) {
return !!value;
},
equal: function equal(value, expectedValue) {
return value == expectedValue;
},
notequal: function notequal(value, expectedValue) {
return value != expectedValue;
},
contains: function contains(value, expectedValue) {
return value && value["indexOf"] && value.indexOf(expectedValue) > -1;
},
notcontains: function notcontains(value, expectedValue) {
return !value || !value["indexOf"] || value.indexOf(expectedValue) == -1;
},
greater: function greater(value, expectedValue) {
return value > expectedValue;
},
less: function less(value, expectedValue) {
return value < expectedValue;
},
greaterorequal: function greaterorequal(value, expectedValue) {
return value >= expectedValue;
},
lessorequal: function lessorequal(value, expectedValue) {
return value <= expectedValue;
}
};
return Trigger.operatorsValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Trigger.prototype, "operator", {
get: function get() {
return this.opValue;
},
set: function set(value) {
if (!value) return;
value = value.toLowerCase();
if (!Trigger.operators[value]) return;
this.opValue = value;
},
enumerable: true,
configurable: true
});
Trigger.prototype.check = function (value) {
if (Trigger.operators[this.operator](value, this.value)) {
this.onSuccess();
} else {
this.onFailure();
}
};
Trigger.prototype.onSuccess = function () {};
Trigger.prototype.onFailure = function () {};
Trigger.operatorsValue = null;
return Trigger;
}(_base.Base);
var SurveyTrigger = exports.SurveyTrigger = function (_super) {
__extends(SurveyTrigger, _super);
function SurveyTrigger() {
_super.call(this);
this.owner = null;
}
SurveyTrigger.prototype.setOwner = function (owner) {
this.owner = owner;
};
Object.defineProperty(SurveyTrigger.prototype, "isOnNextPage", {
get: function get() {
return false;
},
enumerable: true,
configurable: true
});
return SurveyTrigger;
}(Trigger);
var SurveyTriggerVisible = exports.SurveyTriggerVisible = function (_super) {
__extends(SurveyTriggerVisible, _super);
function SurveyTriggerVisible() {
_super.call(this);
this.pages = [];
this.questions = [];
}
SurveyTriggerVisible.prototype.getType = function () {
return "visibletrigger";
};
SurveyTriggerVisible.prototype.onSuccess = function () {
this.onTrigger(this.onItemSuccess);
};
SurveyTriggerVisible.prototype.onFailure = function () {
this.onTrigger(this.onItemFailure);
};
SurveyTriggerVisible.prototype.onTrigger = function (func) {
if (!this.owner) return;
var objects = this.owner.getObjects(this.pages, this.questions);
for (var i = 0; i < objects.length; i++) {
func(objects[i]);
}
};
SurveyTriggerVisible.prototype.onItemSuccess = function (item) {
item.visible = true;
};
SurveyTriggerVisible.prototype.onItemFailure = function (item) {
item.visible = false;
};
return SurveyTriggerVisible;
}(SurveyTrigger);
var SurveyTriggerComplete = exports.SurveyTriggerComplete = function (_super) {
__extends(SurveyTriggerComplete, _super);
function SurveyTriggerComplete() {
_super.call(this);
}
SurveyTriggerComplete.prototype.getType = function () {
return "completetrigger";
};
Object.defineProperty(SurveyTriggerComplete.prototype, "isOnNextPage", {
get: function get() {
return true;
},
enumerable: true,
configurable: true
});
SurveyTriggerComplete.prototype.onSuccess = function () {
if (this.owner) this.owner.doComplete();
};
return SurveyTriggerComplete;
}(SurveyTrigger);
var SurveyTriggerSetValue = exports.SurveyTriggerSetValue = function (_super) {
__extends(SurveyTriggerSetValue, _super);
function SurveyTriggerSetValue() {
_super.call(this);
}
SurveyTriggerSetValue.prototype.getType = function () {
return "setvaluetrigger";
};
SurveyTriggerSetValue.prototype.onSuccess = function () {
if (!this.setToName || !this.owner) return;
this.owner.setTriggerValue(this.setToName, this.setValue, this.isVariable);
};
return SurveyTriggerSetValue;
}(SurveyTrigger);
_jsonobject.JsonObject.metaData.addClass("trigger", ["operator", "!value"]);
_jsonobject.JsonObject.metaData.addClass("surveytrigger", ["!name"], null, "trigger");
_jsonobject.JsonObject.metaData.addClass("visibletrigger", ["pages", "questions"], function () {
return new SurveyTriggerVisible();
}, "surveytrigger");
_jsonobject.JsonObject.metaData.addClass("completetrigger", [], function () {
return new SurveyTriggerComplete();
}, "surveytrigger");
_jsonobject.JsonObject.metaData.addClass("setvaluetrigger", ["!setToName", "setValue", "isVariable:boolean"], function () {
return new SurveyTriggerSetValue();
}, "surveytrigger");
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 35 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyWindowModel = undefined;
var _base = __webpack_require__(5);
var _survey = __webpack_require__(32);
var SurveyWindowModel = exports.SurveyWindowModel = function (_super) {
__extends(SurveyWindowModel, _super);
function SurveyWindowModel(jsonObj) {
_super.call(this);
this.surveyValue = this.createSurvey(jsonObj);
this.surveyValue.showTitle = false;
this.windowElement = document.createElement("div");
}
SurveyWindowModel.prototype.getType = function () {
return "window";
};
Object.defineProperty(SurveyWindowModel.prototype, "survey", {
get: function get() {
return this.surveyValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyWindowModel.prototype, "isShowing", {
get: function get() {
return this.isShowingValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyWindowModel.prototype, "isExpanded", {
get: function get() {
return this.isExpandedValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyWindowModel.prototype, "title", {
get: function get() {
return this.titleValue ? this.titleValue : this.survey.title;
},
set: function set(value) {
this.titleValue = value;
},
enumerable: true,
configurable: true
});
SurveyWindowModel.prototype.expand = function () {
this.expandcollapse(true);
};
SurveyWindowModel.prototype.collapse = function () {
this.expandcollapse(false);
};
SurveyWindowModel.prototype.createSurvey = function (jsonObj) {
return new _survey.SurveyModel(jsonObj);
};
SurveyWindowModel.prototype.expandcollapse = function (value) {
this.isExpandedValue = value;
};
SurveyWindowModel.surveyElementName = "windowSurveyJS";
return SurveyWindowModel;
}(_base.Base);
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 36 */
/***/ function(module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var surveyCss = exports.surveyCss = {
currentType: "",
getCss: function getCss() {
var loc = this.currentType ? this[this.currentType] : defaultStandardCss;
if (!loc) loc = defaultStandardCss;
return loc;
}
};
var defaultStandardCss = exports.defaultStandardCss = {
root: "sv_main",
header: "",
body: "sv_body",
footer: "sv_nav",
navigationButton: "", navigation: { complete: "", prev: "", next: "" },
progress: "sv_progress", progressBar: "",
pageTitle: "sv_p_title",
row: "sv_row",
question: { root: "sv_q", title: "sv_q_title", comment: "", indent: 20 },
error: { root: "sv_q_erbox", icon: "", item: "" },
checkbox: { root: "sv_qcbc", item: "sv_q_checkbox", other: "sv_q_other" },
comment: "",
dropdown: "",
matrix: { root: "sv_q_matrix" },
matrixdropdown: { root: "sv_q_matrix" },
matrixdynamic: { root: "table", button: "" },
multipletext: { root: "", itemTitle: "", itemValue: "" },
radiogroup: { root: "sv_qcbc", item: "sv_q_radiogroup", other: "sv_q_other" },
rating: { root: "sv_q_rating", item: "sv_q_rating_item" },
text: "",
window: {
root: "sv_window", body: "sv_window_content",
header: {
root: "sv_window_title", title: "", button: "", buttonExpanded: "", buttonCollapsed: ""
}
}
};
surveyCss["standard"] = defaultStandardCss;
/***/ },
/* 37 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.defaultBootstrapCss = undefined;
var _cssstandard = __webpack_require__(36);
var defaultBootstrapCss = exports.defaultBootstrapCss = {
root: "",
header: "panel-heading",
body: "panel-body",
footer: "panel-footer",
navigationButton: "", navigation: { complete: "", prev: "", next: "" },
progress: "progress center-block", progressBar: "progress-bar",
pageTitle: "",
row: "",
question: { root: "", title: "", comment: "form-control", indent: 20 },
error: { root: "alert alert-danger", icon: "glyphicon glyphicon-exclamation-sign", item: "" },
checkbox: { root: "form-inline", item: "checkbox", other: "" },
comment: "form-control",
dropdown: "form-control",
matrix: { root: "table" },
matrixdropdown: { root: "table" },
matrixdynamic: { root: "table", button: "button" },
multipletext: { root: "table", itemTitle: "", itemValue: "form-control" },
radiogroup: { root: "form-inline", item: "radio", other: "" },
rating: { root: "btn-group", item: "btn btn-default" },
text: "form-control",
window: {
root: "modal-content", body: "modal-body",
header: {
root: "modal-header panel-title", title: "pull-left", button: "glyphicon pull-right",
buttonExpanded: "glyphicon pull-right glyphicon-chevron-up", buttonCollapsed: "glyphicon pull-right glyphicon-chevron-down"
}
}
};
_cssstandard.surveyCss["bootstrap"] = defaultBootstrapCss;
/***/ },
/* 38 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Survey = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactsurveymodel = __webpack_require__(43);
var _reactpage = __webpack_require__(44);
var _reactSurveyNavigation = __webpack_require__(49);
var _reactquestionfactory = __webpack_require__(48);
var _cssstandard = __webpack_require__(36);
var _reactSurveyProgress = __webpack_require__(51);
var _base = __webpack_require__(5);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var Survey = exports.Survey = function (_super) {
__extends(Survey, _super);
function Survey(props) {
_super.call(this, props);
this.isCurrentPageChanged = false;
this.updateSurvey(props);
}
Object.defineProperty(Survey, "cssType", {
get: function get() {
return _cssstandard.surveyCss.currentType;
},
set: function set(value) {
_cssstandard.surveyCss.currentType = value;
},
enumerable: true,
configurable: true
});
Survey.prototype.componentWillReceiveProps = function (nextProps) {
this.updateSurvey(nextProps);
};
Survey.prototype.componentDidUpdate = function () {
if (this.isCurrentPageChanged) {
this.isCurrentPageChanged = false;
this.survey.focusFirstQuestion();
}
};
Survey.prototype.render = function () {
if (this.survey.state == "completed") return this.renderCompleted();
if (this.survey.state == "loading") return this.renderLoading();
return this.renderSurvey();
};
Object.defineProperty(Survey.prototype, "css", {
get: function get() {
return _cssstandard.surveyCss.getCss();
},
set: function set(value) {
this.survey.mergeCss(value, this.css);
},
enumerable: true,
configurable: true
});
Survey.prototype.renderCompleted = function () {
var htmlValue = { __html: this.survey.processedCompletedHtml };
return React.createElement("div", { dangerouslySetInnerHTML: htmlValue });
};
Survey.prototype.renderLoading = function () {
var htmlValue = { __html: this.survey.processedLoadingHtml };
return React.createElement("div", { dangerouslySetInnerHTML: htmlValue });
};
Survey.prototype.renderSurvey = function () {
var title = this.survey.title && this.survey.showTitle ? this.renderTitle() : null;
var currentPage = this.survey.currentPage ? this.renderPage() : null;
var topProgress = this.survey.showProgressBar == "top" ? this.renderProgress(true) : null;
var bottomProgress = this.survey.showProgressBar == "bottom" ? this.renderProgress(false) : null;
var buttons = currentPage && this.survey.showNavigationButtons ? this.renderNavigation() : null;
if (!currentPage) {
currentPage = this.renderEmptySurvey();
}
return React.createElement("div", { className: this.css.root }, title, React.createElement("div", { id: _base.SurveyPageId, className: this.css.body }, topProgress, currentPage, bottomProgress), buttons);
};
Survey.prototype.renderTitle = function () {
return React.createElement("div", { className: this.css.header }, React.createElement("h3", null, this.survey.title));
};
Survey.prototype.renderPage = function () {
return React.createElement(_reactpage.SurveyPage, { survey: this.survey, page: this.survey.currentPage, css: this.css, creator: this });
};
Survey.prototype.renderProgress = function (isTop) {
return React.createElement(_reactSurveyProgress.SurveyProgress, { survey: this.survey, css: this.css, isTop: isTop });
};
Survey.prototype.renderNavigation = function () {
return React.createElement(_reactSurveyNavigation.SurveyNavigation, { survey: this.survey, css: this.css });
};
Survey.prototype.renderEmptySurvey = function () {
return React.createElement("span", null, this.survey.emptySurveyText);
};
Survey.prototype.updateSurvey = function (newProps) {
if (newProps) {
if (newProps.model) {
this.survey = newProps.model;
} else {
if (newProps.json) {
this.survey = new _reactsurveymodel.ReactSurveyModel(newProps.json);
}
}
} else {
this.survey = new _reactsurveymodel.ReactSurveyModel();
}
if (newProps) {
if (newProps.clientId) this.survey.clientId = newProps.clientId;
if (newProps.data) this.survey.data = newProps.data;
if (newProps.css) this.survey.mergeCss(newProps.css, this.css);
}
//set the first page
var dummy = this.survey.currentPage;
this.state = { pageIndexChange: 0, isCompleted: false, modelChanged: 0 };
this.setSurveyEvents(newProps);
};
Survey.prototype.setSurveyEvents = function (newProps) {
var self = this;
this.survey.renderCallback = function () {
self.state.modelChanged = self.state.modelChanged + 1;
self.setState(self.state);
};
this.survey.onComplete.add(function (sender) {
self.state.isCompleted = true;self.setState(self.state);
});
this.survey.onPartialSend.add(function (sender) {
self.setState(self.state);
});
this.survey.onCurrentPageChanged.add(function (sender, options) {
self.isCurrentPageChanged = true;
self.state.pageIndexChange = self.state.pageIndexChange + 1;
self.setState(self.state);
if (newProps && newProps.onCurrentPageChanged) newProps.onCurrentPageChanged(sender, options);
});
this.survey.onVisibleChanged.add(function (sender, options) {
if (options.question && options.question.react) {
var state = options.question.react.state;
state.visible = options.question.visible;
options.question.react.setState(state);
}
});
this.survey.onValueChanged.add(function (sender, options) {
if (options.question && options.question.react) {
var state = options.question.react.state;
state.value = options.value;
options.question.react.setState(state);
}
});
if (!newProps) return;
this.survey.onValueChanged.add(function (sender, options) {
if (newProps.data) newProps.data[options.name] = options.value;
if (newProps.onValueChanged) newProps.onValueChanged(sender, options);
});
if (newProps.onComplete) {
this.survey.onComplete.add(function (sender) {
newProps.onComplete(sender);
});
}
if (newProps.onPartialSend) {
this.survey.onPartialSend.add(function (sender) {
newProps.onPartialSend(sender);
});
}
this.survey.onPageVisibleChanged.add(function (sender, options) {
if (newProps.onPageVisibleChanged) newProps.onPageVisibleChanged(sender, options);
});
if (newProps.onQuestionAdded) {
this.survey.onQuestionAdded.add(function (sender, options) {
newProps.onQuestionAdded(sender, options);
});
}
if (newProps.onQuestionRemoved) {
this.survey.onQuestionRemoved.add(function (sender, options) {
newProps.onQuestionRemoved(sender, options);
});
}
if (newProps.onValidateQuestion) {
this.survey.onValidateQuestion.add(function (sender, options) {
newProps.onValidateQuestion(sender, options);
});
}
if (newProps.onServerValidateQuestions) {
this.survey.onServerValidateQuestions = newProps.onServerValidateQuestions;
}
if (newProps.onSendResult) {
this.survey.onSendResult.add(function (sender, options) {
newProps.onSendResult(sender, options);
});
}
if (newProps.onGetResult) {
this.survey.onGetResult.add(function (sender, options) {
newProps.onGetResult(sender, options);
});
}
if (newProps.onProcessHtml) {
this.survey.onProcessHtml.add(function (sender, options) {
newProps.onProcessHtml(sender, options);
});
}
};
//ISurveyCreator
Survey.prototype.createQuestionElement = function (question) {
var questionCss = this.css[question.getType()];
return _reactquestionfactory.ReactQuestionFactory.Instance.createQuestion(question.getType(), {
question: question, css: questionCss, rootCss: this.css, isDisplayMode: this.survey.isDisplayMode, creator: this
});
};
Survey.prototype.renderError = function (key, errorText) {
return React.createElement("div", { key: key, className: this.css.error.item }, errorText);
};
Survey.prototype.questionTitleLocation = function () {
return this.survey.questionTitleLocation;
};
return Survey;
}(React.Component);
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 39 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(process) {(function (global, factory) {
true ? module.exports = factory(__webpack_require__(41), __webpack_require__(42)) :
typeof define === 'function' && define.amd ? define(['proptypes', 'preact'], factory) :
(global.preactCompat = factory(global.PropTypes,global.preact));
}(this, (function (PropTypes,preact) {
PropTypes = 'default' in PropTypes ? PropTypes['default'] : PropTypes;
var version = '15.1.0'; // trick libraries to think we are react
var ELEMENTS = 'a abbr address area article aside audio b base bdi bdo big blockquote body br button canvas caption cite code col colgroup data datalist dd del details dfn dialog div dl dt em embed fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 head header hgroup hr html i iframe img input ins kbd keygen label legend li link main map mark menu menuitem meta meter nav noscript object ol optgroup option output p param picture pre progress q rp rt ruby s samp script section select small source span strong style sub summary sup table tbody td textarea tfoot th thead time title tr track u ul var video wbr circle clipPath defs ellipse g image line linearGradient mask path pattern polygon polyline radialGradient rect stop svg text tspan'.split(' ');
var REACT_ELEMENT_TYPE = (typeof Symbol === 'function' && Symbol.for && Symbol.for('react.element')) || 0xeac7;
// don't autobind these methods since they already have guaranteed context.
var AUTOBIND_BLACKLIST = {
constructor: 1,
render: 1,
shouldComponentUpdate: 1,
componentWillReceiveProps: 1,
componentWillUpdate: 1,
componentDidUpdate: 1,
componentWillMount: 1,
componentDidMount: 1,
componentWillUnmount: 1,
componentDidUnmount: 1
};
var CAMEL_PROPS = /^(?:accent|alignment|arabic|baseline|cap|clip|color|fill|flood|font|glyph|horiz|marker|overline|paint|stop|strikethrough|stroke|text|underline|unicode|units|v|vert|word|writing|x)[A-Z]/;
var BYPASS_HOOK = {};
/*global process*/
var DEV = typeof process==='undefined' || !process.env || process.env.NODE_ENV!=='production';
// a component that renders nothing. Used to replace components for unmountComponentAtNode.
var EmptyComponent = function () { return null; };
// make react think we're react.
var VNode = preact.h('').constructor;
VNode.prototype.$$typeof = REACT_ELEMENT_TYPE;
VNode.prototype.preactCompatUpgraded = false;
VNode.prototype.preactCompatNormalized = false;
Object.defineProperty(VNode.prototype, 'type', {
get: function get() { return this.nodeName; },
set: function set(v) { this.nodeName = v; },
configurable:true
});
Object.defineProperty(VNode.prototype, 'props', {
get: function get$1() { return this.attributes; },
set: function set$1(v) { this.attributes = v; },
configurable:true
});
var oldEventHook = preact.options.event;
preact.options.event = function (e) {
e.persist = Object;
if (oldEventHook) e = oldEventHook(e);
return e;
};
var oldVnodeHook = preact.options.vnode;
preact.options.vnode = function (vnode) {
if (!vnode.preactCompatUpgraded) {
vnode.preactCompatUpgraded = true;
var tag = vnode.nodeName,
attrs = vnode.attributes;
if (!attrs) attrs = vnode.attributes = {};
if (typeof tag==='function') {
if (tag[COMPONENT_WRAPPER_KEY]===true || (tag.prototype && 'isReactComponent' in tag.prototype)) {
if (!vnode.preactCompatNormalized) {
normalizeVNode(vnode);
}
handleComponentVNode(vnode);
}
}
else if (attrs) {
handleElementVNode(vnode, attrs);
}
}
if (oldVnodeHook) oldVnodeHook(vnode);
};
function handleComponentVNode(vnode) {
var tag = vnode.nodeName,
a = vnode.attributes;
vnode.attributes = {};
if (tag.defaultProps) extend(vnode.attributes, tag.defaultProps);
if (a) extend(vnode.attributes, a);
a = vnode.attributes;
if (vnode.children && !vnode.children.length) vnode.children = undefined;
if (vnode.children) a.children = vnode.children;
}
function handleElementVNode(vnode, a) {
var shouldSanitize, attrs, i;
if (a) {
for (i in a) if ((shouldSanitize = CAMEL_PROPS.test(i))) break;
if (shouldSanitize) {
attrs = vnode.attributes = {};
for (i in a) {
if (a.hasOwnProperty(i)) {
attrs[ CAMEL_PROPS.test(i) ? i.replace(/([A-Z0-9])/, '-$1').toLowerCase() : i ] = a[i];
}
}
}
}
}
// proxy render() since React returns a Component reference.
function render$1$1(vnode, parent, callback) {
var prev = parent && parent._preactCompatRendered;
// ignore impossible previous renders
if (prev && prev.parentNode!==parent) prev = null;
// default to first Element child
if (!prev) prev = parent.children[0];
// remove unaffected siblings
for (var i=parent.childNodes.length; i--; ) {
if (parent.childNodes[i]!==prev) {
parent.removeChild(parent.childNodes[i]);
}
}
var out = preact.render(vnode, parent, prev);
if (parent) parent._preactCompatRendered = out;
if (typeof callback==='function') callback();
return out && out._component || out.base;
}
var ContextProvider = function ContextProvider () {};
ContextProvider.prototype.getChildContext = function getChildContext () {
return this.props.context;
};
ContextProvider.prototype.render = function render$1 (props) {
return props.children[0];
};
function renderSubtreeIntoContainer(parentComponent, vnode, container, callback) {
var wrap = preact.h(ContextProvider, { context: parentComponent.context }, vnode);
var c = render$1$1(wrap, container);
if (callback) callback(c);
return c;
}
function unmountComponentAtNode(container) {
var existing = container._preactCompatRendered;
if (existing && existing.parentNode===container) {
preact.render(preact.h(EmptyComponent), container, existing);
return true;
}
return false;
}
var ARR = [];
// This API is completely unnecessary for Preact, so it's basically passthrough.
var Children = {
map: function map(children, fn, ctx) {
children = Children.toArray(children);
if (ctx && ctx!==children) fn = fn.bind(ctx);
return children.map(fn);
},
forEach: function forEach(children, fn, ctx) {
children = Children.toArray(children);
if (ctx && ctx!==children) fn = fn.bind(ctx);
children.forEach(fn);
},
count: function count(children) {
children = Children.toArray(children);
return children.length;
},
only: function only(children) {
children = Children.toArray(children);
if (children.length!==1) throw new Error('Children.only() expects only one child.');
return children[0];
},
toArray: function toArray(children) {
return Array.isArray && Array.isArray(children) ? children : ARR.concat(children);
}
};
/** Track current render() component for ref assignment */
var currentComponent;
function createFactory(type) {
return createElement.bind(null, type);
}
var DOM = {};
for (var i=ELEMENTS.length; i--; ) {
DOM[ELEMENTS[i]] = createFactory(ELEMENTS[i]);
}
function upgradeToVNodes(arr, offset) {
for (var i=offset || 0; i 0 ) children[ len ] = arguments[ len + 2 ];
if (!isValidElement(element)) return element;
var elementProps = element.attributes || element.props;
var node = preact.h(
element.nodeName || element.type,
elementProps,
element.children || elementProps && elementProps.children
);
return normalizeVNode(preact.cloneElement.apply(void 0, [ node, props ].concat( children )));
}
function isValidElement(element) {
return element && ((element instanceof VNode) || element.$$typeof===REACT_ELEMENT_TYPE);
}
function createStringRefProxy(name, component) {
return component._refProxies[name] || (component._refProxies[name] = function (resolved) {
if (component && component.refs) {
component.refs[name] = resolved;
if (resolved===null) {
delete component._refProxies[name];
component = null;
}
}
});
}
function applyEventNormalization(ref) {
var nodeName = ref.nodeName;
var attributes = ref.attributes;
if (!attributes || typeof nodeName!=='string') return;
var props = {};
for (var i in attributes) {
props[i.toLowerCase()] = i;
}
if (props.onchange) {
nodeName = nodeName.toLowerCase();
var attr = nodeName==='input' && String(attributes.type).toLowerCase()==='checkbox' ? 'onclick' : 'oninput',
normalized = props[attr] || attr;
if (!attributes[normalized]) {
attributes[normalized] = multihook([attributes[props[attr]], attributes[props.onchange]]);
}
}
}
function applyClassName(ref) {
var attributes = ref.attributes;
if (!attributes) return;
var cl = attributes.className || attributes.class;
if (cl) attributes.className = cl;
}
function extend(base, props) {
for (var key in props) {
if (props.hasOwnProperty(key)) {
base[key] = props[key];
}
}
return base;
}
function shallowDiffers(a, b) {
for (var i in a) if (!(i in b)) return true;
for (var i$1 in b) if (a[i$1]!==b[i$1]) return true;
return false;
}
var findDOMNode = function (component) { return component && component.base || component; };
function F(){}
function createClass(obj) {
var mixins = obj.mixins && collateMixins(obj.mixins);
function cl(props, context) {
extend(this, obj);
if (mixins) applyMixins(this, mixins);
bindAll(this);
Component$1.call(this, props, context, BYPASS_HOOK);
newComponentHook.call(this, props, context);
}
if (obj.statics) {
extend(cl, obj.statics);
}
if (obj.propTypes) {
cl.propTypes = obj.propTypes;
}
if (obj.defaultProps) {
cl.defaultProps = obj.defaultProps;
}
if (obj.getDefaultProps) {
cl.defaultProps = obj.getDefaultProps();
}
F.prototype = Component$1.prototype;
cl.prototype = new F();
cl.prototype.constructor = cl;
cl.displayName = obj.displayName || 'Component';
return cl;
}
// Flatten an Array of mixins to a map of method name to mixin implementations
function collateMixins(mixins) {
var keyed = {};
for (var i=0; i 1) {
for (var i = 1; i < arguments.length; i++) {
args[i - 1] = arguments[i];
}
}
queue.push(new Item(fun, args));
if (queue.length === 1 && !draining) {
runTimeout(drainQueue);
}
};
// v8 likes predictible objects
function Item(fun, array) {
this.fun = fun;
this.array = array;
}
Item.prototype.run = function () {
this.fun.apply(null, this.array);
};
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
process.version = ''; // empty string to avoid regexp issues
process.versions = {};
function noop() {}
process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.binding = function (name) {
throw new Error('process.binding is not supported');
};
process.cwd = function () { return '/' };
process.chdir = function (dir) {
throw new Error('process.chdir is not supported');
};
process.umask = function() { return 0; };
/***/ },
/* 41 */
/***/ function(module, exports, __webpack_require__) {
var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (global, factory) {
if (true) {
!(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports, module], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
} else if (typeof exports !== 'undefined' && typeof module !== 'undefined') {
factory(exports, module);
} else {
var mod = {
exports: {}
};
factory(mod.exports, mod);
global.PropTypes = mod.exports;
}
})(this, function (exports, module) {
'use strict';
var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7;
var ReactElement = {};
ReactElement.isValidElement = function (object) {
return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;
};
var ReactPropTypeLocationNames = {
prop: 'prop',
context: 'context',
childContext: 'child context'
};
var emptyFunction = {
thatReturns: function thatReturns(what) {
return function () {
return what;
};
}
};
var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
var FAUX_ITERATOR_SYMBOL = '@@iterator';
function getIteratorFn(maybeIterable) {
var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);
if (typeof iteratorFn === 'function') {
return iteratorFn;
}
}
var ANONYMOUS = '<>';
var ReactPropTypes = {
array: createPrimitiveTypeChecker('array'),
bool: createPrimitiveTypeChecker('boolean'),
func: createPrimitiveTypeChecker('function'),
number: createPrimitiveTypeChecker('number'),
object: createPrimitiveTypeChecker('object'),
string: createPrimitiveTypeChecker('string'),
any: createAnyTypeChecker(),
arrayOf: createArrayOfTypeChecker,
element: createElementTypeChecker(),
instanceOf: createInstanceTypeChecker,
node: createNodeChecker(),
objectOf: createObjectOfTypeChecker,
oneOf: createEnumTypeChecker,
oneOfType: createUnionTypeChecker,
shape: createShapeTypeChecker
};
function createChainableTypeChecker(validate) {
function checkType(isRequired, props, propName, componentName, location, propFullName) {
componentName = componentName || ANONYMOUS;
propFullName = propFullName || propName;
if (props[propName] == null) {
var locationName = ReactPropTypeLocationNames[location];
if (isRequired) {
return new Error('Required ' + locationName + ' `' + propFullName + '` was not specified in ' + ('`' + componentName + '`.'));
}
return null;
} else {
return validate(props, propName, componentName, location, propFullName);
}
}
var chainedCheckType = checkType.bind(null, false);
chainedCheckType.isRequired = checkType.bind(null, true);
return chainedCheckType;
}
function createPrimitiveTypeChecker(expectedType) {
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
var propType = getPropType(propValue);
if (propType !== expectedType) {
var locationName = ReactPropTypeLocationNames[location];
var preciseType = getPreciseType(propValue);
return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));
}
return null;
}
return createChainableTypeChecker(validate);
}
function createAnyTypeChecker() {
return createChainableTypeChecker(emptyFunction.thatReturns(null));
}
function createArrayOfTypeChecker(typeChecker) {
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
if (!Array.isArray(propValue)) {
var locationName = ReactPropTypeLocationNames[location];
var propType = getPropType(propValue);
return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));
}
for (var i = 0; i < propValue.length; i++) {
var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']');
if (error instanceof Error) {
return error;
}
}
return null;
}
return createChainableTypeChecker(validate);
}
function createElementTypeChecker() {
function validate(props, propName, componentName, location, propFullName) {
if (!ReactElement.isValidElement(props[propName])) {
var locationName = ReactPropTypeLocationNames[location];
return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a single ReactElement.'));
}
return null;
}
return createChainableTypeChecker(validate);
}
function createInstanceTypeChecker(expectedClass) {
function validate(props, propName, componentName, location, propFullName) {
if (!(props[propName] instanceof expectedClass)) {
var locationName = ReactPropTypeLocationNames[location];
var expectedClassName = expectedClass.name || ANONYMOUS;
var actualClassName = getClassName(props[propName]);
return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));
}
return null;
}
return createChainableTypeChecker(validate);
}
function createEnumTypeChecker(expectedValues) {
if (!Array.isArray(expectedValues)) {
return createChainableTypeChecker(function () {
return new Error('Invalid argument supplied to oneOf, expected an instance of array.');
});
}
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
for (var i = 0; i < expectedValues.length; i++) {
if (propValue === expectedValues[i]) {
return null;
}
}
var locationName = ReactPropTypeLocationNames[location];
var valuesString = JSON.stringify(expectedValues);
return new Error('Invalid ' + locationName + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));
}
return createChainableTypeChecker(validate);
}
function createObjectOfTypeChecker(typeChecker) {
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
var propType = getPropType(propValue);
if (propType !== 'object') {
var locationName = ReactPropTypeLocationNames[location];
return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));
}
for (var key in propValue) {
if (propValue.hasOwnProperty(key)) {
var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key);
if (error instanceof Error) {
return error;
}
}
}
return null;
}
return createChainableTypeChecker(validate);
}
function createUnionTypeChecker(arrayOfTypeCheckers) {
if (!Array.isArray(arrayOfTypeCheckers)) {
return createChainableTypeChecker(function () {
return new Error('Invalid argument supplied to oneOfType, expected an instance of array.');
});
}
function validate(props, propName, componentName, location, propFullName) {
for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
var checker = arrayOfTypeCheckers[i];
if (checker(props, propName, componentName, location, propFullName) == null) {
return null;
}
}
var locationName = ReactPropTypeLocationNames[location];
return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));
}
return createChainableTypeChecker(validate);
}
function createNodeChecker() {
function validate(props, propName, componentName, location, propFullName) {
if (!isNode(props[propName])) {
var locationName = ReactPropTypeLocationNames[location];
return new Error('Invalid ' + locationName + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));
}
return null;
}
return createChainableTypeChecker(validate);
}
function createShapeTypeChecker(shapeTypes) {
function validate(props, propName, componentName, location, propFullName) {
var propValue = props[propName];
var propType = getPropType(propValue);
if (propType !== 'object') {
var locationName = ReactPropTypeLocationNames[location];
return new Error('Invalid ' + locationName + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));
}
for (var key in shapeTypes) {
var checker = shapeTypes[key];
if (!checker) {
continue;
}
var error = checker(propValue, key, componentName, location, propFullName + '.' + key);
if (error) {
return error;
}
}
return null;
}
return createChainableTypeChecker(validate);
}
function isNode(propValue) {
switch (typeof propValue) {
case 'number':
case 'string':
case 'undefined':
return true;
case 'boolean':
return !propValue;
case 'object':
if (Array.isArray(propValue)) {
return propValue.every(isNode);
}
if (propValue === null || ReactElement.isValidElement(propValue)) {
return true;
}
var iteratorFn = getIteratorFn(propValue);
if (iteratorFn) {
var iterator = iteratorFn.call(propValue);
var step;
if (iteratorFn !== propValue.entries) {
while (!(step = iterator.next()).done) {
if (!isNode(step.value)) {
return false;
}
}
} else {
while (!(step = iterator.next()).done) {
var entry = step.value;
if (entry) {
if (!isNode(entry[1])) {
return false;
}
}
}
}
} else {
return false;
}
return true;
default:
return false;
}
}
function getPropType(propValue) {
var propType = typeof propValue;
if (Array.isArray(propValue)) {
return 'array';
}
if (propValue instanceof RegExp) {
return 'object';
}
return propType;
}
function getPreciseType(propValue) {
var propType = getPropType(propValue);
if (propType === 'object') {
if (propValue instanceof Date) {
return 'date';
} else if (propValue instanceof RegExp) {
return 'regexp';
}
}
return propType;
}
function getClassName(propValue) {
if (!propValue.constructor || !propValue.constructor.name) {
return ANONYMOUS;
}
return propValue.constructor.name;
}
module.exports = ReactPropTypes;
});
/***/ },
/* 42 */
/***/ function(module, exports, __webpack_require__) {
!function(global, factory) {
true ? factory(exports) : 'function' == typeof define && define.amd ? define([ 'exports' ], factory) : factory(global.preact = global.preact || {});
}(this, function(exports) {
function VNode(nodeName, attributes, children) {
this.nodeName = nodeName;
this.attributes = attributes;
this.children = children;
this.key = attributes && attributes.key;
}
function h(nodeName, attributes) {
var lastSimple, child, simple, i, children = [];
for (i = arguments.length; i-- > 2; ) stack.push(arguments[i]);
if (attributes && attributes.children) {
if (!stack.length) stack.push(attributes.children);
delete attributes.children;
}
while (stack.length) if ((child = stack.pop()) instanceof Array) for (i = child.length; i--; ) stack.push(child[i]); else if (null != child && child !== !1) {
if ('number' == typeof child || child === !0) child = String(child);
simple = 'string' == typeof child;
if (simple && lastSimple) children[children.length - 1] += child; else {
children.push(child);
lastSimple = simple;
}
}
var p = new VNode(nodeName, attributes || void 0, children);
if (options.vnode) options.vnode(p);
return p;
}
function extend(obj, props) {
if (props) for (var i in props) obj[i] = props[i];
return obj;
}
function clone(obj) {
return extend({}, obj);
}
function delve(obj, key) {
for (var p = key.split('.'), i = 0; i < p.length && obj; i++) obj = obj[p[i]];
return obj;
}
function isFunction(obj) {
return 'function' == typeof obj;
}
function isString(obj) {
return 'string' == typeof obj;
}
function hashToClassName(c) {
var str = '';
for (var prop in c) if (c[prop]) {
if (str) str += ' ';
str += prop;
}
return str;
}
function cloneElement(vnode, props) {
return h(vnode.nodeName, extend(clone(vnode.attributes), props), arguments.length > 2 ? [].slice.call(arguments, 2) : vnode.children);
}
function createLinkedState(component, key, eventPath) {
var path = key.split('.');
return function(e) {
var t = e && e.target || this, state = {}, obj = state, v = isString(eventPath) ? delve(e, eventPath) : t.nodeName ? t.type.match(/^che|rad/) ? t.checked : t.value : e, i = 0;
for (;i < path.length - 1; i++) obj = obj[path[i]] || (obj[path[i]] = !i && component.state[path[i]] || {});
obj[path[i]] = v;
component.setState(state);
};
}
function enqueueRender(component) {
if (!component._dirty && (component._dirty = !0) && 1 == items.push(component)) (options.debounceRendering || defer)(rerender);
}
function rerender() {
var p, list = items;
items = [];
while (p = list.pop()) if (p._dirty) renderComponent(p);
}
function isFunctionalComponent(vnode) {
var nodeName = vnode && vnode.nodeName;
return nodeName && isFunction(nodeName) && !(nodeName.prototype && nodeName.prototype.render);
}
function buildFunctionalComponent(vnode, context) {
return vnode.nodeName(getNodeProps(vnode), context || EMPTY);
}
function isSameNodeType(node, vnode) {
if (isString(vnode)) return node instanceof Text;
if (isString(vnode.nodeName)) return !node._componentConstructor && isNamedNode(node, vnode.nodeName);
if (isFunction(vnode.nodeName)) return (node._componentConstructor ? node._componentConstructor === vnode.nodeName : !0) || isFunctionalComponent(vnode); else ;
}
function isNamedNode(node, nodeName) {
return node.normalizedNodeName === nodeName || toLowerCase(node.nodeName) === toLowerCase(nodeName);
}
function getNodeProps(vnode) {
var props = clone(vnode.attributes);
props.children = vnode.children;
var defaultProps = vnode.nodeName.defaultProps;
if (defaultProps) for (var i in defaultProps) if (void 0 === props[i]) props[i] = defaultProps[i];
return props;
}
function removeNode(node) {
var p = node.parentNode;
if (p) p.removeChild(node);
}
function setAccessor(node, name, old, value, isSvg) {
if ('className' === name) name = 'class';
if ('class' === name && value && 'object' == typeof value) value = hashToClassName(value);
if ('key' === name) ; else if ('class' === name && !isSvg) node.className = value || ''; else if ('style' === name) {
if (!value || isString(value) || isString(old)) node.style.cssText = value || '';
if (value && 'object' == typeof value) {
if (!isString(old)) for (var i in old) if (!(i in value)) node.style[i] = '';
for (var i in value) node.style[i] = 'number' == typeof value[i] && !NON_DIMENSION_PROPS[i] ? value[i] + 'px' : value[i];
}
} else if ('dangerouslySetInnerHTML' === name) node.innerHTML = value && value.__html || ''; else if ('o' == name[0] && 'n' == name[1]) {
var l = node._listeners || (node._listeners = {});
name = toLowerCase(name.substring(2));
if (value) {
if (!l[name]) node.addEventListener(name, eventProxy, !!NON_BUBBLING_EVENTS[name]);
} else if (l[name]) node.removeEventListener(name, eventProxy, !!NON_BUBBLING_EVENTS[name]);
l[name] = value;
} else if ('list' !== name && 'type' !== name && !isSvg && name in node) {
setProperty(node, name, null == value ? '' : value);
if (null == value || value === !1) node.removeAttribute(name);
} else {
var ns = isSvg && name.match(/^xlink\:?(.+)/);
if (null == value || value === !1) if (ns) node.removeAttributeNS('http://www.w3.org/1999/xlink', toLowerCase(ns[1])); else node.removeAttribute(name); else if ('object' != typeof value && !isFunction(value)) if (ns) node.setAttributeNS('http://www.w3.org/1999/xlink', toLowerCase(ns[1]), value); else node.setAttribute(name, value);
}
}
function setProperty(node, name, value) {
try {
node[name] = value;
} catch (e) {}
}
function eventProxy(e) {
return this._listeners[e.type](options.event && options.event(e) || e);
}
function collectNode(node) {
removeNode(node);
if (node instanceof Element) {
node._component = node._componentConstructor = null;
var _name = node.normalizedNodeName || toLowerCase(node.nodeName);
(nodes[_name] || (nodes[_name] = [])).push(node);
}
}
function createNode(nodeName, isSvg) {
var name = toLowerCase(nodeName), node = nodes[name] && nodes[name].pop() || (isSvg ? document.createElementNS('http://www.w3.org/2000/svg', nodeName) : document.createElement(nodeName));
node.normalizedNodeName = name;
return node;
}
function flushMounts() {
var c;
while (c = mounts.pop()) {
if (options.afterMount) options.afterMount(c);
if (c.componentDidMount) c.componentDidMount();
}
}
function diff(dom, vnode, context, mountAll, parent, componentRoot) {
if (!diffLevel++) {
isSvgMode = parent instanceof SVGElement;
hydrating = dom && !(ATTR_KEY in dom);
}
var ret = idiff(dom, vnode, context, mountAll);
if (parent && ret.parentNode !== parent) parent.appendChild(ret);
if (!--diffLevel) {
hydrating = !1;
if (!componentRoot) flushMounts();
}
return ret;
}
function idiff(dom, vnode, context, mountAll) {
var originalAttributes = vnode && vnode.attributes;
while (isFunctionalComponent(vnode)) vnode = buildFunctionalComponent(vnode, context);
if (null == vnode) vnode = '';
if (isString(vnode)) {
if (dom && dom instanceof Text) {
if (dom.nodeValue != vnode) dom.nodeValue = vnode;
} else {
if (dom) recollectNodeTree(dom);
dom = document.createTextNode(vnode);
}
dom[ATTR_KEY] = !0;
return dom;
}
if (isFunction(vnode.nodeName)) return buildComponentFromVNode(dom, vnode, context, mountAll);
var out = dom, nodeName = String(vnode.nodeName), prevSvgMode = isSvgMode, vchildren = vnode.children;
isSvgMode = 'svg' === nodeName ? !0 : 'foreignObject' === nodeName ? !1 : isSvgMode;
if (!dom) out = createNode(nodeName, isSvgMode); else if (!isNamedNode(dom, nodeName)) {
out = createNode(nodeName, isSvgMode);
while (dom.firstChild) out.appendChild(dom.firstChild);
if (dom.parentNode) dom.parentNode.replaceChild(out, dom);
recollectNodeTree(dom);
}
var fc = out.firstChild, props = out[ATTR_KEY];
if (!props) {
out[ATTR_KEY] = props = {};
for (var a = out.attributes, i = a.length; i--; ) props[a[i].name] = a[i].value;
}
diffAttributes(out, vnode.attributes, props);
if (!hydrating && vchildren && 1 === vchildren.length && 'string' == typeof vchildren[0] && fc && fc instanceof Text && !fc.nextSibling) {
if (fc.nodeValue != vchildren[0]) fc.nodeValue = vchildren[0];
} else if (vchildren && vchildren.length || fc) innerDiffNode(out, vchildren, context, mountAll);
if (originalAttributes && 'function' == typeof originalAttributes.ref) (props.ref = originalAttributes.ref)(out);
isSvgMode = prevSvgMode;
return out;
}
function innerDiffNode(dom, vchildren, context, mountAll) {
var j, c, vchild, child, originalChildren = dom.childNodes, children = [], keyed = {}, keyedLen = 0, min = 0, len = originalChildren.length, childrenLen = 0, vlen = vchildren && vchildren.length;
if (len) for (var i = 0; i < len; i++) {
var _child = originalChildren[i], props = _child[ATTR_KEY], key = vlen ? (c = _child._component) ? c.__key : props ? props.key : null : null;
if (null != key) {
keyedLen++;
keyed[key] = _child;
} else if (hydrating || props) children[childrenLen++] = _child;
}
if (vlen) for (var i = 0; i < vlen; i++) {
vchild = vchildren[i];
child = null;
var key = vchild.key;
if (null != key) {
if (keyedLen && key in keyed) {
child = keyed[key];
keyed[key] = void 0;
keyedLen--;
}
} else if (!child && min < childrenLen) for (j = min; j < childrenLen; j++) {
c = children[j];
if (c && isSameNodeType(c, vchild)) {
child = c;
children[j] = void 0;
if (j === childrenLen - 1) childrenLen--;
if (j === min) min++;
break;
}
}
child = idiff(child, vchild, context, mountAll);
if (child && child !== dom) if (i >= len) dom.appendChild(child); else if (child !== originalChildren[i]) {
if (child === originalChildren[i + 1]) removeNode(originalChildren[i]);
dom.insertBefore(child, originalChildren[i] || null);
}
}
if (keyedLen) for (var i in keyed) if (keyed[i]) recollectNodeTree(keyed[i]);
while (min <= childrenLen) {
child = children[childrenLen--];
if (child) recollectNodeTree(child);
}
}
function recollectNodeTree(node, unmountOnly) {
var component = node._component;
if (component) unmountComponent(component, !unmountOnly); else {
if (node[ATTR_KEY] && node[ATTR_KEY].ref) node[ATTR_KEY].ref(null);
if (!unmountOnly) collectNode(node);
var c;
while (c = node.lastChild) recollectNodeTree(c, unmountOnly);
}
}
function diffAttributes(dom, attrs, old) {
for (var _name in old) if (!(attrs && _name in attrs) && null != old[_name]) setAccessor(dom, _name, old[_name], old[_name] = void 0, isSvgMode);
if (attrs) for (var _name2 in attrs) if (!('children' === _name2 || 'innerHTML' === _name2 || _name2 in old && attrs[_name2] === ('value' === _name2 || 'checked' === _name2 ? dom[_name2] : old[_name2]))) setAccessor(dom, _name2, old[_name2], old[_name2] = attrs[_name2], isSvgMode);
}
function collectComponent(component) {
var name = component.constructor.name, list = components[name];
if (list) list.push(component); else components[name] = [ component ];
}
function createComponent(Ctor, props, context) {
var inst = new Ctor(props, context), list = components[Ctor.name];
Component.call(inst, props, context);
if (list) for (var i = list.length; i--; ) if (list[i].constructor === Ctor) {
inst.nextBase = list[i].nextBase;
list.splice(i, 1);
break;
}
return inst;
}
function setComponentProps(component, props, opts, context, mountAll) {
if (!component._disable) {
component._disable = !0;
if (component.__ref = props.ref) delete props.ref;
if (component.__key = props.key) delete props.key;
if (!component.base || mountAll) {
if (component.componentWillMount) component.componentWillMount();
} else if (component.componentWillReceiveProps) component.componentWillReceiveProps(props, context);
if (context && context !== component.context) {
if (!component.prevContext) component.prevContext = component.context;
component.context = context;
}
if (!component.prevProps) component.prevProps = component.props;
component.props = props;
component._disable = !1;
if (0 !== opts) if (1 === opts || options.syncComponentUpdates !== !1 || !component.base) renderComponent(component, 1, mountAll); else enqueueRender(component);
if (component.__ref) component.__ref(component);
}
}
function renderComponent(component, opts, mountAll, isChild) {
if (!component._disable) {
var skip, rendered, inst, cbase, props = component.props, state = component.state, context = component.context, previousProps = component.prevProps || props, previousState = component.prevState || state, previousContext = component.prevContext || context, isUpdate = component.base, nextBase = component.nextBase, initialBase = isUpdate || nextBase, initialChildComponent = component._component;
if (isUpdate) {
component.props = previousProps;
component.state = previousState;
component.context = previousContext;
if (2 !== opts && component.shouldComponentUpdate && component.shouldComponentUpdate(props, state, context) === !1) skip = !0; else if (component.componentWillUpdate) component.componentWillUpdate(props, state, context);
component.props = props;
component.state = state;
component.context = context;
}
component.prevProps = component.prevState = component.prevContext = component.nextBase = null;
component._dirty = !1;
if (!skip) {
if (component.render) rendered = component.render(props, state, context);
if (component.getChildContext) context = extend(clone(context), component.getChildContext());
while (isFunctionalComponent(rendered)) rendered = buildFunctionalComponent(rendered, context);
var toUnmount, base, childComponent = rendered && rendered.nodeName;
if (isFunction(childComponent)) {
var childProps = getNodeProps(rendered);
inst = initialChildComponent;
if (inst && inst.constructor === childComponent && childProps.key == inst.__key) setComponentProps(inst, childProps, 1, context); else {
toUnmount = inst;
inst = createComponent(childComponent, childProps, context);
inst.nextBase = inst.nextBase || nextBase;
inst._parentComponent = component;
component._component = inst;
setComponentProps(inst, childProps, 0, context);
renderComponent(inst, 1, mountAll, !0);
}
base = inst.base;
} else {
cbase = initialBase;
toUnmount = initialChildComponent;
if (toUnmount) cbase = component._component = null;
if (initialBase || 1 === opts) {
if (cbase) cbase._component = null;
base = diff(cbase, rendered, context, mountAll || !isUpdate, initialBase && initialBase.parentNode, !0);
}
}
if (initialBase && base !== initialBase && inst !== initialChildComponent) {
var baseParent = initialBase.parentNode;
if (baseParent && base !== baseParent) {
baseParent.replaceChild(base, initialBase);
if (!toUnmount) {
initialBase._component = null;
recollectNodeTree(initialBase);
}
}
}
if (toUnmount) unmountComponent(toUnmount, base !== initialBase);
component.base = base;
if (base && !isChild) {
var componentRef = component, t = component;
while (t = t._parentComponent) (componentRef = t).base = base;
base._component = componentRef;
base._componentConstructor = componentRef.constructor;
}
}
if (!isUpdate || mountAll) mounts.unshift(component); else if (!skip) {
if (component.componentDidUpdate) component.componentDidUpdate(previousProps, previousState, previousContext);
if (options.afterUpdate) options.afterUpdate(component);
}
var fn, cb = component._renderCallbacks;
if (cb) while (fn = cb.pop()) fn.call(component);
if (!diffLevel && !isChild) flushMounts();
}
}
function buildComponentFromVNode(dom, vnode, context, mountAll) {
var c = dom && dom._component, oldDom = dom, isDirectOwner = c && dom._componentConstructor === vnode.nodeName, isOwner = isDirectOwner, props = getNodeProps(vnode);
while (c && !isOwner && (c = c._parentComponent)) isOwner = c.constructor === vnode.nodeName;
if (c && isOwner && (!mountAll || c._component)) {
setComponentProps(c, props, 3, context, mountAll);
dom = c.base;
} else {
if (c && !isDirectOwner) {
unmountComponent(c, !0);
dom = oldDom = null;
}
c = createComponent(vnode.nodeName, props, context);
if (dom && !c.nextBase) {
c.nextBase = dom;
oldDom = null;
}
setComponentProps(c, props, 1, context, mountAll);
dom = c.base;
if (oldDom && dom !== oldDom) {
oldDom._component = null;
recollectNodeTree(oldDom);
}
}
return dom;
}
function unmountComponent(component, remove) {
if (options.beforeUnmount) options.beforeUnmount(component);
var base = component.base;
component._disable = !0;
if (component.componentWillUnmount) component.componentWillUnmount();
component.base = null;
var inner = component._component;
if (inner) unmountComponent(inner, remove); else if (base) {
if (base[ATTR_KEY] && base[ATTR_KEY].ref) base[ATTR_KEY].ref(null);
component.nextBase = base;
if (remove) {
removeNode(base);
collectComponent(component);
}
var c;
while (c = base.lastChild) recollectNodeTree(c, !remove);
}
if (component.__ref) component.__ref(null);
if (component.componentDidUnmount) component.componentDidUnmount();
}
function Component(props, context) {
this._dirty = !0;
this.context = context;
this.props = props;
if (!this.state) this.state = {};
}
function render(vnode, parent, merge) {
return diff(merge, vnode, {}, !1, parent);
}
var options = {};
var stack = [];
var lcCache = {};
var toLowerCase = function(s) {
return lcCache[s] || (lcCache[s] = s.toLowerCase());
};
var resolved = 'undefined' != typeof Promise && Promise.resolve();
var defer = resolved ? function(f) {
resolved.then(f);
} : setTimeout;
var EMPTY = {};
var ATTR_KEY = 'undefined' != typeof Symbol ? Symbol.for('preactattr') : '__preactattr_';
var NON_DIMENSION_PROPS = {
boxFlex: 1,
boxFlexGroup: 1,
columnCount: 1,
fillOpacity: 1,
flex: 1,
flexGrow: 1,
flexPositive: 1,
flexShrink: 1,
flexNegative: 1,
fontWeight: 1,
lineClamp: 1,
lineHeight: 1,
opacity: 1,
order: 1,
orphans: 1,
strokeOpacity: 1,
widows: 1,
zIndex: 1,
zoom: 1
};
var NON_BUBBLING_EVENTS = {
blur: 1,
error: 1,
focus: 1,
load: 1,
resize: 1,
scroll: 1
};
var items = [];
var nodes = {};
var mounts = [];
var diffLevel = 0;
var isSvgMode = !1;
var hydrating = !1;
var components = {};
extend(Component.prototype, {
linkState: function(key, eventPath) {
var c = this._linkedStates || (this._linkedStates = {});
return c[key + eventPath] || (c[key + eventPath] = createLinkedState(this, key, eventPath));
},
setState: function(state, callback) {
var s = this.state;
if (!this.prevState) this.prevState = clone(s);
extend(s, isFunction(state) ? state(s, this.props) : state);
if (callback) (this._renderCallbacks = this._renderCallbacks || []).push(callback);
enqueueRender(this);
},
forceUpdate: function() {
renderComponent(this, 2);
},
render: function() {}
});
exports.h = h;
exports.cloneElement = cloneElement;
exports.Component = Component;
exports.render = render;
exports.rerender = rerender;
exports.options = options;
});
/***/ },
/* 43 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ReactSurveyModel = undefined;
var _survey = __webpack_require__(32);
var ReactSurveyModel = exports.ReactSurveyModel = function (_super) {
__extends(ReactSurveyModel, _super);
function ReactSurveyModel(jsonObj) {
if (jsonObj === void 0) {
jsonObj = null;
}
_super.call(this, jsonObj);
}
ReactSurveyModel.prototype.render = function () {
if (this.renderCallback) {
this.renderCallback();
}
};
ReactSurveyModel.prototype.mergeCss = function (src, dest) {
this.mergeValues(src, dest);
};
ReactSurveyModel.prototype.onLoadSurveyFromService = function () {
this.render();
};
ReactSurveyModel.prototype.onLoadingSurveyFromService = function () {
this.render();
};
return ReactSurveyModel;
}(_survey.SurveyModel);
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 44 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyRow = exports.SurveyPage = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactquestion = __webpack_require__(45);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyPage = exports.SurveyPage = function (_super) {
__extends(SurveyPage, _super);
function SurveyPage(props) {
_super.call(this, props);
this.page = props.page;
this.survey = props.survey;
this.creator = props.creator;
this.css = props.css;
}
SurveyPage.prototype.componentWillReceiveProps = function (nextProps) {
this.page = nextProps.page;
this.survey = nextProps.survey;
this.creator = nextProps.creator;
this.css = nextProps.css;
};
SurveyPage.prototype.render = function () {
if (this.page == null || this.survey == null || this.creator == null) return null;
var title = this.renderTitle();
var rows = [];
var questionRows = this.page.rows;
for (var i = 0; i < questionRows.length; i++) {
rows.push(this.createRow(questionRows[i], i));
}
return React.createElement("div", null, title, rows);
};
SurveyPage.prototype.createRow = function (row, index) {
var rowName = "row" + (index + 1);
return React.createElement(SurveyRow, { key: rowName, row: row, survey: this.survey, creator: this.creator, css: this.css });
};
SurveyPage.prototype.renderTitle = function () {
if (!this.page.title || !this.survey.showPageTitles) return null;
var text = this.page.processedTitle;
if (this.page.num > 0) {
text = this.page.num + ". " + text;
}
return React.createElement("h4", { className: this.css.pageTitle }, text);
};
return SurveyPage;
}(React.Component);
var SurveyRow = exports.SurveyRow = function (_super) {
__extends(SurveyRow, _super);
function SurveyRow(props) {
_super.call(this, props);
this.setProperties(props);
}
SurveyRow.prototype.componentWillReceiveProps = function (nextProps) {
this.setProperties(nextProps);
};
SurveyRow.prototype.setProperties = function (props) {
this.row = props.row;
if (this.row) {
var self = this;
this.row.visibilityChangedCallback = function () {
self.setState({ visible: self.row.visible });
};
}
this.survey = props.survey;
this.creator = props.creator;
this.css = props.css;
};
SurveyRow.prototype.render = function () {
if (this.row == null || this.survey == null || this.creator == null) return null;
if (!this.row.visible) return null;
var questions = [];
for (var i = 0; i < this.row.questions.length; i++) {
var question = this.row.questions[i];
questions.push(this.createQuestion(question));
}
return React.createElement("div", { className: this.css.row }, questions);
};
SurveyRow.prototype.createQuestion = function (question) {
return React.createElement(_reactquestion.SurveyQuestion, { key: question.name, question: question, creator: this.creator, css: this.css });
};
return SurveyRow;
}(React.Component);
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 45 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyQuestionErrors = exports.SurveyQuestion = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _question = __webpack_require__(14);
var _reactquestioncomment = __webpack_require__(46);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyQuestion = exports.SurveyQuestion = function (_super) {
__extends(SurveyQuestion, _super);
function SurveyQuestion(props) {
_super.call(this, props);
this.setQuestion(props.question);
this.creator = props.creator;
this.css = props.css;
}
SurveyQuestion.prototype.componentWillReceiveProps = function (nextProps) {
this.creator = nextProps.creator;
this.css = nextProps.css;
this.setQuestion(nextProps.question);
};
SurveyQuestion.prototype.setQuestion = function (question) {
this.questionBase = question;
this.question = question instanceof _question.Question ? question : null;
var value = this.question ? this.question.value : null;
this.state = {
visible: this.questionBase.visible, value: value, error: 0, renderWidth: 0,
visibleIndexValue: -1
};
};
SurveyQuestion.prototype.componentDidMount = function () {
if (this.questionBase) {
var self = this;
this.questionBase["react"] = self;
this.questionBase.renderWidthChangedCallback = function () {
self.state.renderWidth = self.state.renderWidth + 1;
self.setState(self.state);
};
this.questionBase.visibleIndexChangedCallback = function () {
self.state.visibleIndexValue = self.questionBase.visibleIndex;
self.setState(self.state);
};
}
};
SurveyQuestion.prototype.componentWillUnmount = function () {
if (this.questionBase) {
this.questionBase["react"] = null;
this.questionBase.renderWidthChangedCallback = null;
this.questionBase.visibleIndexChangedCallback = null;
}
};
SurveyQuestion.prototype.render = function () {
if (!this.questionBase || !this.creator) return null;
if (!this.questionBase.visible) return null;
var questionRender = this.creator.createQuestionElement(this.questionBase);
var title = this.questionBase.hasTitle ? this.renderTitle() : null;
var titleTop = this.creator.questionTitleLocation() == "top" ? title : null;
var titleBottom = this.creator.questionTitleLocation() == "bottom" ? title : null;
var comment = this.question && this.question.hasComment ? this.renderComment() : null;
var errors = this.renderErrors();
var marginLeft = this.questionBase.indent > 0 ? this.questionBase.indent * this.css.question.indent + "px" : null;
var paddingRight = this.questionBase.rightIndent > 0 ? this.questionBase.rightIndent * this.css.question.indent + "px" : null;
var rootStyle = { display: 'inline-block', verticalAlign: 'top' };
if (this.questionBase.renderWidth) rootStyle["width"] = this.questionBase.renderWidth;
if (marginLeft) rootStyle["marginLeft"] = marginLeft;
if (paddingRight) rootStyle["paddingRight"] = paddingRight;
return React.createElement("div", { id: this.questionBase.id, className: this.css.question.root, style: rootStyle }, titleTop, errors, questionRender, comment, titleBottom);
};
SurveyQuestion.prototype.renderTitle = function () {
var titleText = this.question.fullTitle;
return React.createElement("h5", { className: this.css.question.title }, titleText);
};
SurveyQuestion.prototype.renderComment = function () {
return React.createElement("div", null, React.createElement("div", null, this.question.commentText), React.createElement("div", { className: this.css.question.comment }, React.createElement(_reactquestioncomment.SurveyQuestionCommentItem, { question: this.question })));
};
SurveyQuestion.prototype.renderErrors = function () {
return React.createElement(SurveyQuestionErrors, { question: this.question, css: this.css, creator: this.creator });
};
return SurveyQuestion;
}(React.Component);
var SurveyQuestionErrors = exports.SurveyQuestionErrors = function (_super) {
__extends(SurveyQuestionErrors, _super);
function SurveyQuestionErrors(props) {
_super.call(this, props);
this.setQuestion(props.question);
this.creator = props.creator;
this.css = props.css;
}
SurveyQuestionErrors.prototype.componentWillReceiveProps = function (nextProps) {
this.setQuestion(nextProps.question);
this.creator = nextProps.creator;
this.css = nextProps.css;
};
SurveyQuestionErrors.prototype.setQuestion = function (question) {
this.question = question instanceof _question.Question ? question : null;
if (this.question) {
var self = this;
this.question.errorsChangedCallback = function () {
self.state.error = self.state.error + 1;
self.setState(self.state);
};
}
this.state = { error: 0 };
};
SurveyQuestionErrors.prototype.render = function () {
if (!this.question || this.question.errors.length == 0) return null;
var errors = [];
for (var i = 0; i < this.question.errors.length; i++) {
var errorText = this.question.errors[i].getText();
var key = "error" + i;
errors.push(this.creator.renderError(key, errorText));
}
return React.createElement("div", { className: this.css.error.root }, errors);
};
return SurveyQuestionErrors;
}(React.Component);
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 46 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyQuestionCommentItem = exports.SurveyQuestionComment = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactquestionelement = __webpack_require__(47);
var _reactquestionfactory = __webpack_require__(48);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyQuestionComment = exports.SurveyQuestionComment = function (_super) {
__extends(SurveyQuestionComment, _super);
function SurveyQuestionComment(props) {
_super.call(this, props);
this.state = { value: this.question.value || '' };
this.handleOnChange = this.handleOnChange.bind(this);
this.handleOnBlur = this.handleOnBlur.bind(this);
}
Object.defineProperty(SurveyQuestionComment.prototype, "question", {
get: function get() {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionComment.prototype.handleOnChange = function (event) {
this.setState({ value: event.target.value });
};
SurveyQuestionComment.prototype.handleOnBlur = function (event) {
this.question.value = event.target.value;
this.setState({ value: this.question.value || '' });
};
SurveyQuestionComment.prototype.render = function () {
if (!this.question) return null;
if (this.isDisplayMode) return React.createElement("div", { id: this.question.inputId, className: this.css }, this.question.value);
return React.createElement("textarea", { id: this.question.inputId, className: this.css, type: "text", value: this.state.value, onBlur: this.handleOnBlur, onChange: this.handleOnChange, cols: this.question.cols, rows: this.question.rows });
};
return SurveyQuestionComment;
}(_reactquestionelement.SurveyQuestionElementBase);
var SurveyQuestionCommentItem = exports.SurveyQuestionCommentItem = function (_super) {
__extends(SurveyQuestionCommentItem, _super);
function SurveyQuestionCommentItem(props) {
_super.call(this, props);
this.question = props.question;
this.comment = this.question.comment;
this.state = { value: this.comment };
this.handleOnChange = this.handleOnChange.bind(this);
this.handleOnBlur = this.handleOnBlur.bind(this);
}
SurveyQuestionCommentItem.prototype.handleOnChange = function (event) {
this.comment = event.target.value;
this.setState({ value: this.comment });
};
SurveyQuestionCommentItem.prototype.handleOnBlur = function (event) {
this.question.comment = this.comment;
};
SurveyQuestionCommentItem.prototype.componentWillReceiveProps = function (nextProps) {
this.question = nextProps.question;
};
SurveyQuestionCommentItem.prototype.render = function () {
if (!this.question) return null;
if (this.isDisplayMode) return React.createElement("div", { className: this.css.question.comment }, this.comment);
return React.createElement("input", { type: "text", className: this.css.question.comment, value: this.state.value, onChange: this.handleOnChange, onBlur: this.handleOnBlur });
};
return SurveyQuestionCommentItem;
}(_reactquestionelement.SurveyElementBase);
_reactquestionfactory.ReactQuestionFactory.Instance.registerQuestion("comment", function (props) {
return React.createElement(SurveyQuestionComment, props);
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 47 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyQuestionElementBase = exports.SurveyElementBase = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyElementBase = exports.SurveyElementBase = function (_super) {
__extends(SurveyElementBase, _super);
function SurveyElementBase(props) {
_super.call(this, props);
this.css = props.css;
this.rootCss = props.rootCss;
this.isDisplayMode = props.isDisplayMode || false;
}
SurveyElementBase.prototype.componentWillReceiveProps = function (nextProps) {
this.css = nextProps.css;
this.rootCss = nextProps.rootCss;
this.isDisplayMode = nextProps.isDisplayMode || false;
};
return SurveyElementBase;
}(React.Component);
var SurveyQuestionElementBase = exports.SurveyQuestionElementBase = function (_super) {
__extends(SurveyQuestionElementBase, _super);
function SurveyQuestionElementBase(props) {
_super.call(this, props);
this.questionBase = props.question;
this.creator = props.creator;
}
SurveyQuestionElementBase.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.questionBase = nextProps.question;
this.creator = nextProps.creator;
};
return SurveyQuestionElementBase;
}(SurveyElementBase);
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 48 */
/***/ function(module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var ReactQuestionFactory = exports.ReactQuestionFactory = function () {
function ReactQuestionFactory() {
this.creatorHash = {};
}
ReactQuestionFactory.prototype.registerQuestion = function (questionType, questionCreator) {
this.creatorHash[questionType] = questionCreator;
};
ReactQuestionFactory.prototype.getAllTypes = function () {
var result = new Array();
for (var key in this.creatorHash) {
result.push(key);
}
return result.sort();
};
ReactQuestionFactory.prototype.createQuestion = function (questionType, params) {
var creator = this.creatorHash[questionType];
if (creator == null) return null;
return creator(params);
};
ReactQuestionFactory.Instance = new ReactQuestionFactory();
ReactQuestionFactory.DefaultChoices = ["one", "two|second value", "three|third value"];
return ReactQuestionFactory;
}();
/***/ },
/* 49 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyNavigation = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactSurveyNavigationBase = __webpack_require__(50);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyNavigation = exports.SurveyNavigation = function (_super) {
__extends(SurveyNavigation, _super);
function SurveyNavigation(props) {
_super.call(this, props);
this.handlePrevClick = this.handlePrevClick.bind(this);
this.handleNextClick = this.handleNextClick.bind(this);
this.handleCompleteClick = this.handleCompleteClick.bind(this);
}
SurveyNavigation.prototype.handlePrevClick = function (event) {
this.survey.prevPage();
};
SurveyNavigation.prototype.handleNextClick = function (event) {
this.survey.nextPage();
};
SurveyNavigation.prototype.handleCompleteClick = function (event) {
this.survey.completeLastPage();
};
SurveyNavigation.prototype.render = function () {
if (!this.survey) return null;
var prevButton = !this.survey.isFirstPage ? this.renderButton(this.handlePrevClick, this.survey.pagePrevText, this.css.navigation.prev) : null;
var nextButton = !this.survey.isLastPage ? this.renderButton(this.handleNextClick, this.survey.pageNextText, this.css.navigation.next) : null;
var completeButton = this.survey.isLastPage ? this.renderButton(this.handleCompleteClick, this.survey.completeText, this.css.navigation.complete) : null;
return React.createElement("div", { className: this.css.footer }, prevButton, nextButton, completeButton);
};
SurveyNavigation.prototype.renderButton = function (click, text, btnClassName) {
var style = { marginRight: "5px" };
var className = this.css.navigationButton + (btnClassName ? ' ' + btnClassName : "");
return React.createElement("input", { className: className, style: style, type: "button", onClick: click, value: text });
};
return SurveyNavigation;
}(_reactSurveyNavigationBase.SurveyNavigationBase);
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 50 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyNavigationBase = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyNavigationBase = exports.SurveyNavigationBase = function (_super) {
__extends(SurveyNavigationBase, _super);
function SurveyNavigationBase(props) {
_super.call(this, props);
this.updateStateFunction = null;
this.survey = props.survey;
this.css = props.css;
this.state = { update: 0 };
}
SurveyNavigationBase.prototype.componentWillReceiveProps = function (nextProps) {
this.survey = nextProps.survey;
this.css = nextProps.css;
};
SurveyNavigationBase.prototype.componentDidMount = function () {
if (this.survey) {
var self = this;
this.updateStateFunction = function () {
self.state.update = self.state.update + 1;
self.setState(self.state);
};
this.survey.onPageVisibleChanged.add(this.updateStateFunction);
}
};
SurveyNavigationBase.prototype.componentWillUnmount = function () {
if (this.survey && this.updateStateFunction) {
this.survey.onPageVisibleChanged.remove(this.updateStateFunction);
this.updateStateFunction = null;
}
};
return SurveyNavigationBase;
}(React.Component);
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 51 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyProgress = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactSurveyNavigationBase = __webpack_require__(50);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyProgress = exports.SurveyProgress = function (_super) {
__extends(SurveyProgress, _super);
function SurveyProgress(props) {
_super.call(this, props);
this.isTop = props.isTop;
}
SurveyProgress.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.isTop = nextProps.isTop;
};
Object.defineProperty(SurveyProgress.prototype, "progress", {
get: function get() {
return this.survey.getProgress();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyProgress.prototype, "progressText", {
get: function get() {
return this.survey.progressText;
},
enumerable: true,
configurable: true
});
SurveyProgress.prototype.render = function () {
var style = this.isTop ? { width: "60%" } : { width: "60%", marginTop: "10px" };
var progressStyle = { width: this.progress + "%" };
return React.createElement("div", { className: this.css.progress, style: style }, React.createElement("div", { style: progressStyle, className: this.css.progressBar, role: "progressbar", "aria-valuemin": "0", "aria-valuemax": "100" }, React.createElement("span", null, this.progressText)));
};
return SurveyProgress;
}(_reactSurveyNavigationBase.SurveyNavigationBase);
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 52 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyQuestionCheckboxItem = exports.SurveyQuestionCheckbox = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactquestionelement = __webpack_require__(47);
var _reactquestioncomment = __webpack_require__(46);
var _reactquestionfactory = __webpack_require__(48);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyQuestionCheckbox = exports.SurveyQuestionCheckbox = function (_super) {
__extends(SurveyQuestionCheckbox, _super);
function SurveyQuestionCheckbox(props) {
_super.call(this, props);
this.state = { choicesChanged: 0 };
var self = this;
this.question.choicesChangedCallback = function () {
self.state.choicesChanged = self.state.choicesChanged + 1;
self.setState(self.state);
};
}
Object.defineProperty(SurveyQuestionCheckbox.prototype, "question", {
get: function get() {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionCheckbox.prototype.render = function () {
if (!this.question) return null;
return React.createElement("form", { className: this.css.root }, this.getItems());
};
SurveyQuestionCheckbox.prototype.getItems = function () {
var items = [];
for (var i = 0; i < this.question.visibleChoices.length; i++) {
var item = this.question.visibleChoices[i];
var key = "item" + i;
items.push(this.renderItem(key, item, i == 0));
}
return items;
};
Object.defineProperty(SurveyQuestionCheckbox.prototype, "textStyle", {
get: function get() {
return null;
},
enumerable: true,
configurable: true
});
SurveyQuestionCheckbox.prototype.renderItem = function (key, item, isFirst) {
return React.createElement(SurveyQuestionCheckboxItem, { key: key, question: this.question, css: this.css, rootCss: this.rootCss, isDisplayMode: this.isDisplayMode, item: item, textStyle: this.textStyle, isFirst: isFirst });
};
return SurveyQuestionCheckbox;
}(_reactquestionelement.SurveyQuestionElementBase);
var SurveyQuestionCheckboxItem = exports.SurveyQuestionCheckboxItem = function (_super) {
__extends(SurveyQuestionCheckboxItem, _super);
function SurveyQuestionCheckboxItem(props) {
_super.call(this, props);
this.item = props.item;
this.question = props.question;
this.textStyle = props.textStyle;
this.isFirst = props.isFirst;
this.handleOnChange = this.handleOnChange.bind(this);
}
SurveyQuestionCheckboxItem.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.item = nextProps.item;
this.textStyle = nextProps.textStyle;
this.question = nextProps.question;
this.isFirst = nextProps.isFirst;
};
SurveyQuestionCheckboxItem.prototype.handleOnChange = function (event) {
var newValue = this.question.value;
if (!newValue) {
newValue = [];
}
var index = newValue.indexOf(this.item.value);
if (event.target.checked) {
if (index < 0) {
newValue.push(this.item.value);
}
} else {
if (index > -1) {
newValue.splice(index, 1);
}
}
this.question.value = newValue;
this.setState({ value: this.question.value });
};
SurveyQuestionCheckboxItem.prototype.render = function () {
if (!this.item || !this.question) return null;
var itemWidth = this.question.colCount > 0 ? 100 / this.question.colCount + "%" : "";
var marginRight = this.question.colCount == 0 ? "5px" : "0px";
var divStyle = { marginRight: marginRight };
if (itemWidth) {
divStyle["width"] = itemWidth;
}
var isChecked = this.question.value && this.question.value.indexOf(this.item.value) > -1 || false;
var otherItem = this.item.value === this.question.otherItem.value && isChecked ? this.renderOther() : null;
return this.renderCheckbox(isChecked, divStyle, otherItem);
};
Object.defineProperty(SurveyQuestionCheckboxItem.prototype, "inputStyle", {
get: function get() {
return { marginRight: "3px" };
},
enumerable: true,
configurable: true
});
SurveyQuestionCheckboxItem.prototype.renderCheckbox = function (isChecked, divStyle, otherItem) {
var id = this.isFirst ? this.question.inputId : null;
return React.createElement("div", { className: this.css.item, style: divStyle }, React.createElement("label", { className: this.css.item }, React.createElement("input", { type: "checkbox", id: id, style: this.inputStyle, disabled: this.isDisplayMode, checked: isChecked, onChange: this.handleOnChange }), React.createElement("span", null, this.item.text)), otherItem);
};
SurveyQuestionCheckboxItem.prototype.renderOther = function () {
return React.createElement("div", { className: this.css.other }, React.createElement(_reactquestioncomment.SurveyQuestionCommentItem, { question: this.question, css: this.rootCss, isDisplayMode: this.isDisplayMode }));
};
return SurveyQuestionCheckboxItem;
}(_reactquestionelement.SurveyElementBase);
_reactquestionfactory.ReactQuestionFactory.Instance.registerQuestion("checkbox", function (props) {
return React.createElement(SurveyQuestionCheckbox, props);
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 53 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyQuestionDropdown = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactquestionelement = __webpack_require__(47);
var _reactquestioncomment = __webpack_require__(46);
var _reactquestionfactory = __webpack_require__(48);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyQuestionDropdown = exports.SurveyQuestionDropdown = function (_super) {
__extends(SurveyQuestionDropdown, _super);
function SurveyQuestionDropdown(props) {
_super.call(this, props);
this.state = { value: this.question.value, choicesChanged: 0 };
var self = this;
this.question.choicesChangedCallback = function () {
self.state.choicesChanged = self.state.choicesChanged + 1;
self.setState(self.state);
};
this.handleOnChange = this.handleOnChange.bind(this);
}
Object.defineProperty(SurveyQuestionDropdown.prototype, "question", {
get: function get() {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionDropdown.prototype.handleOnChange = function (event) {
this.question.value = event.target.value;
this.setState({ value: this.question.value });
};
SurveyQuestionDropdown.prototype.render = function () {
if (!this.question) return null;
var comment = this.question.value === this.question.otherItem.value ? this.renderOther() : null;
var select = this.renderSelect();
return React.createElement("div", null, select, comment);
};
SurveyQuestionDropdown.prototype.renderSelect = function () {
if (this.isDisplayMode) return React.createElement("div", { id: this.question.inputId, className: this.css }, this.question.value);
var options = [];
for (var i = 0; i < this.question.visibleChoices.length; i++) {
var item = this.question.visibleChoices[i];
var key = "item" + i;
var option = React.createElement("option", { key: key, value: item.value }, item.text);
options.push(option);
}
return React.createElement("select", { id: this.question.inputId, className: this.css, value: this.state.value, onChange: this.handleOnChange }, React.createElement("option", { value: "" }, this.question.optionsCaption), options);
};
SurveyQuestionDropdown.prototype.renderOther = function () {
var style = { marginTop: "3px" };
return React.createElement("div", { style: style }, React.createElement(_reactquestioncomment.SurveyQuestionCommentItem, { question: this.question, css: this.rootCss, isDisplayMode: this.isDisplayMode }));
};
return SurveyQuestionDropdown;
}(_reactquestionelement.SurveyQuestionElementBase);
_reactquestionfactory.ReactQuestionFactory.Instance.registerQuestion("dropdown", function (props) {
return React.createElement(SurveyQuestionDropdown, props);
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 54 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyQuestionMatrixDropdownRow = exports.SurveyQuestionMatrixDropdown = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactquestionelement = __webpack_require__(47);
var _reactquestion = __webpack_require__(45);
var _reactquestionfactory = __webpack_require__(48);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyQuestionMatrixDropdown = exports.SurveyQuestionMatrixDropdown = function (_super) {
__extends(SurveyQuestionMatrixDropdown, _super);
function SurveyQuestionMatrixDropdown(props) {
_super.call(this, props);
}
Object.defineProperty(SurveyQuestionMatrixDropdown.prototype, "question", {
get: function get() {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionMatrixDropdown.prototype.render = function () {
if (!this.question) return null;
var headers = [];
for (var i = 0; i < this.question.columns.length; i++) {
var column = this.question.columns[i];
var key = "column" + i;
var minWidth = this.question.getColumnWidth(column);
var columnStyle = minWidth ? { minWidth: minWidth } : {};
headers.push(React.createElement("th", { key: key, style: columnStyle }, this.question.getColumnTitle(column)));
}
var rows = [];
var visibleRows = this.question.visibleRows;
for (var i = 0; i < visibleRows.length; i++) {
var row = visibleRows[i];
rows.push(React.createElement(SurveyQuestionMatrixDropdownRow, { key: row.id, row: row, css: this.css, rootCss: this.rootCss, isDisplayMode: this.isDisplayMode, creator: this.creator }));
}
var divStyle = this.question.horizontalScroll ? { overflowX: 'scroll' } : {};
return React.createElement("div", { style: divStyle }, React.createElement("table", { className: this.css.root }, React.createElement("thead", null, React.createElement("tr", null, React.createElement("th", null), headers)), React.createElement("tbody", null, rows)));
};
return SurveyQuestionMatrixDropdown;
}(_reactquestionelement.SurveyQuestionElementBase);
var SurveyQuestionMatrixDropdownRow = exports.SurveyQuestionMatrixDropdownRow = function (_super) {
__extends(SurveyQuestionMatrixDropdownRow, _super);
function SurveyQuestionMatrixDropdownRow(props) {
_super.call(this, props);
this.setProperties(props);
}
SurveyQuestionMatrixDropdownRow.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.setProperties(nextProps);
};
SurveyQuestionMatrixDropdownRow.prototype.setProperties = function (nextProps) {
this.row = nextProps.row;
this.creator = nextProps.creator;
};
SurveyQuestionMatrixDropdownRow.prototype.render = function () {
if (!this.row) return null;
var tds = [];
for (var i = 0; i < this.row.cells.length; i++) {
var cell = this.row.cells[i];
var errors = React.createElement(_reactquestion.SurveyQuestionErrors, { question: cell.question, css: this.rootCss, creator: this.creator });
var select = this.renderSelect(cell);
tds.push(React.createElement("td", { key: "row" + i }, errors, select));
}
return React.createElement("tr", null, React.createElement("td", null, this.row.text), tds);
};
SurveyQuestionMatrixDropdownRow.prototype.renderSelect = function (cell) {
return this.creator.createQuestionElement(cell.question);
};
return SurveyQuestionMatrixDropdownRow;
}(_reactquestionelement.SurveyElementBase);
_reactquestionfactory.ReactQuestionFactory.Instance.registerQuestion("matrixdropdown", function (props) {
return React.createElement(SurveyQuestionMatrixDropdown, props);
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 55 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyQuestionMatrixRow = exports.SurveyQuestionMatrix = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactquestionelement = __webpack_require__(47);
var _reactquestionfactory = __webpack_require__(48);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyQuestionMatrix = exports.SurveyQuestionMatrix = function (_super) {
__extends(SurveyQuestionMatrix, _super);
function SurveyQuestionMatrix(props) {
_super.call(this, props);
}
Object.defineProperty(SurveyQuestionMatrix.prototype, "question", {
get: function get() {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionMatrix.prototype.render = function () {
if (!this.question) return null;
var firstTH = this.question.hasRows ? React.createElement("th", null) : null;
var headers = [];
for (var i = 0; i < this.question.columns.length; i++) {
var column = this.question.columns[i];
var key = "column" + i;
headers.push(React.createElement("th", { key: key }, column.text));
}
var rows = [];
var visibleRows = this.question.visibleRows;
for (var i = 0; i < visibleRows.length; i++) {
var row = visibleRows[i];
var key = "row" + i;
rows.push(React.createElement(SurveyQuestionMatrixRow, { key: key, question: this.question, css: this.css, rootCss: this.rootCss, isDisplayMode: this.isDisplayMode, row: row, isFirst: i == 0 }));
}
return React.createElement("table", { className: this.css.root }, React.createElement("thead", null, React.createElement("tr", null, firstTH, headers)), React.createElement("tbody", null, rows));
};
return SurveyQuestionMatrix;
}(_reactquestionelement.SurveyQuestionElementBase);
var SurveyQuestionMatrixRow = exports.SurveyQuestionMatrixRow = function (_super) {
__extends(SurveyQuestionMatrixRow, _super);
function SurveyQuestionMatrixRow(props) {
_super.call(this, props);
this.question = props.question;
this.row = props.row;
this.isFirst = props.isFirst;
this.handleOnChange = this.handleOnChange.bind(this);
}
SurveyQuestionMatrixRow.prototype.handleOnChange = function (event) {
this.row.value = event.target.value;
this.setState({ value: this.row.value });
};
SurveyQuestionMatrixRow.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.question = nextProps.question;
this.row = nextProps.row;
this.isFirst = nextProps.isFirst;
};
SurveyQuestionMatrixRow.prototype.render = function () {
if (!this.row) return null;
var firstTD = this.question.hasRows ? React.createElement("td", null, this.row.text) : null;
var tds = [];
for (var i = 0; i < this.question.columns.length; i++) {
var column = this.question.columns[i];
var key = "value" + i;
var isChecked = this.row.value == column.value;
var inputId = this.isFirst && i == 0 ? this.question.inputId : null;
var td = React.createElement("td", { key: key }, React.createElement("input", { id: inputId, type: "radio", name: this.row.fullName, value: column.value, disabled: this.isDisplayMode, checked: isChecked, onChange: this.handleOnChange }));
tds.push(td);
}
return React.createElement("tr", null, firstTD, tds);
};
return SurveyQuestionMatrixRow;
}(_reactquestionelement.SurveyElementBase);
_reactquestionfactory.ReactQuestionFactory.Instance.registerQuestion("matrix", function (props) {
return React.createElement(SurveyQuestionMatrix, props);
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 56 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyQuestionHtml = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactquestionelement = __webpack_require__(47);
var _reactquestionfactory = __webpack_require__(48);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyQuestionHtml = exports.SurveyQuestionHtml = function (_super) {
__extends(SurveyQuestionHtml, _super);
function SurveyQuestionHtml(props) {
_super.call(this, props);
}
Object.defineProperty(SurveyQuestionHtml.prototype, "question", {
get: function get() {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionHtml.prototype.render = function () {
if (!this.question || !this.question.html) return null;
var htmlValue = { __html: this.question.processedHtml };
return React.createElement("div", { dangerouslySetInnerHTML: htmlValue });
};
return SurveyQuestionHtml;
}(_reactquestionelement.SurveyQuestionElementBase);
_reactquestionfactory.ReactQuestionFactory.Instance.registerQuestion("html", function (props) {
return React.createElement(SurveyQuestionHtml, props);
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 57 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyQuestionFile = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactquestionelement = __webpack_require__(47);
var _reactquestionfactory = __webpack_require__(48);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyQuestionFile = exports.SurveyQuestionFile = function (_super) {
__extends(SurveyQuestionFile, _super);
function SurveyQuestionFile(props) {
_super.call(this, props);
this.state = { fileLoaded: 0 };
this.handleOnChange = this.handleOnChange.bind(this);
}
Object.defineProperty(SurveyQuestionFile.prototype, "question", {
get: function get() {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionFile.prototype.handleOnChange = function (event) {
var src = event.target || event.srcElement;
if (!window["FileReader"]) return;
if (!src || !src.files || src.files.length < 1) return;
this.question.loadFile(src.files[0]);
this.setState({ fileLoaded: this.state.fileLoaded + 1 });
};
SurveyQuestionFile.prototype.render = function () {
if (!this.question) return null;
var img = this.renderImage();
var fileInput = null;
if (!this.isDisplayMode) {
fileInput = React.createElement("input", { id: this.question.inputId, type: "file", onChange: this.handleOnChange });
}
return React.createElement("div", null, fileInput, img);
};
SurveyQuestionFile.prototype.renderImage = function () {
if (!this.question.previewValue) return null;
return React.createElement("div", null, " ", React.createElement("img", { src: this.question.previewValue, height: this.question.imageHeight, width: this.question.imageWidth }));
};
return SurveyQuestionFile;
}(_reactquestionelement.SurveyQuestionElementBase);
_reactquestionfactory.ReactQuestionFactory.Instance.registerQuestion("file", function (props) {
return React.createElement(SurveyQuestionFile, props);
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 58 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyQuestionMultipleTextItem = exports.SurveyQuestionMultipleText = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactquestionelement = __webpack_require__(47);
var _reactquestionfactory = __webpack_require__(48);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyQuestionMultipleText = exports.SurveyQuestionMultipleText = function (_super) {
__extends(SurveyQuestionMultipleText, _super);
function SurveyQuestionMultipleText(props) {
_super.call(this, props);
}
Object.defineProperty(SurveyQuestionMultipleText.prototype, "question", {
get: function get() {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionMultipleText.prototype.render = function () {
if (!this.question) return null;
var tableRows = this.question.getRows();
var rows = [];
for (var i = 0; i < tableRows.length; i++) {
rows.push(this.renderRow("item" + i, tableRows[i]));
}
return React.createElement("table", { className: this.css.root }, React.createElement("tbody", null, rows));
};
SurveyQuestionMultipleText.prototype.renderRow = function (key, items) {
var tds = [];
for (var i = 0; i < items.length; i++) {
var item = items[i];
tds.push(React.createElement("td", { key: "label" + i }, React.createElement("span", { className: this.css.itemTitle }, item.title)));
tds.push(React.createElement("td", { key: "value" + i }, this.renderItem(item, i == 0)));
}
return React.createElement("tr", { key: key }, tds);
};
SurveyQuestionMultipleText.prototype.renderItem = function (item, isFirst) {
var inputId = isFirst ? this.question.inputId : null;
return React.createElement(SurveyQuestionMultipleTextItem, { item: item, css: this.css, isDisplayMode: this.isDisplayMode, inputId: inputId });
};
return SurveyQuestionMultipleText;
}(_reactquestionelement.SurveyQuestionElementBase);
var SurveyQuestionMultipleTextItem = exports.SurveyQuestionMultipleTextItem = function (_super) {
__extends(SurveyQuestionMultipleTextItem, _super);
function SurveyQuestionMultipleTextItem(props) {
_super.call(this, props);
this.item = props.item;
this.inputId = props.inputId;
this.state = { value: this.item.value || '' };
this.handleOnChange = this.handleOnChange.bind(this);
this.handleOnBlur = this.handleOnBlur.bind(this);
}
SurveyQuestionMultipleTextItem.prototype.handleOnChange = function (event) {
this.setState({ value: event.target.value });
};
SurveyQuestionMultipleTextItem.prototype.handleOnBlur = function (event) {
this.item.value = event.target.value;
this.setState({ value: this.item.value });
};
SurveyQuestionMultipleTextItem.prototype.componentWillReceiveProps = function (nextProps) {
this.item = nextProps.item;
this.css = nextProps.css;
};
SurveyQuestionMultipleTextItem.prototype.render = function () {
if (!this.item) return null;
var style = { float: "left" };
if (this.isDisplayMode) return React.createElement("div", { id: this.inputId, className: this.css.itemValue, style: style }, this.item.value);
return React.createElement("input", { id: this.inputId, className: this.css.itemValue, style: style, type: "text", value: this.state.value, onBlur: this.handleOnBlur, onChange: this.handleOnChange });
};
Object.defineProperty(SurveyQuestionMultipleTextItem.prototype, "mainClassName", {
get: function get() {
return "";
},
enumerable: true,
configurable: true
});
return SurveyQuestionMultipleTextItem;
}(_reactquestionelement.SurveyElementBase);
_reactquestionfactory.ReactQuestionFactory.Instance.registerQuestion("multipletext", function (props) {
return React.createElement(SurveyQuestionMultipleText, props);
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 59 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyQuestionRadiogroup = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactquestionelement = __webpack_require__(47);
var _reactquestioncomment = __webpack_require__(46);
var _reactquestionfactory = __webpack_require__(48);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyQuestionRadiogroup = exports.SurveyQuestionRadiogroup = function (_super) {
__extends(SurveyQuestionRadiogroup, _super);
function SurveyQuestionRadiogroup(props) {
_super.call(this, props);
this.state = { choicesChanged: 0 };
var self = this;
this.question.choicesChangedCallback = function () {
self.state.choicesChanged = self.state.choicesChanged + 1;
self.setState(self.state);
};
this.handleOnChange = this.handleOnChange.bind(this);
}
Object.defineProperty(SurveyQuestionRadiogroup.prototype, "question", {
get: function get() {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionRadiogroup.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.handleOnChange = this.handleOnChange.bind(this);
};
SurveyQuestionRadiogroup.prototype.handleOnChange = function (event) {
this.question.value = event.target.value;
this.setState({ value: this.question.value });
};
SurveyQuestionRadiogroup.prototype.render = function () {
if (!this.question) return null;
return React.createElement("form", { className: this.css.root }, this.getItems());
};
SurveyQuestionRadiogroup.prototype.getItems = function () {
var items = [];
for (var i = 0; i < this.question.visibleChoices.length; i++) {
var item = this.question.visibleChoices[i];
var key = "item" + i;
items.push(this.renderItem(key, item, i == 0));
}
return items;
};
Object.defineProperty(SurveyQuestionRadiogroup.prototype, "textStyle", {
get: function get() {
return { marginLeft: "3px" };
},
enumerable: true,
configurable: true
});
SurveyQuestionRadiogroup.prototype.renderItem = function (key, item, isFirst) {
var itemWidth = this.question.colCount > 0 ? 100 / this.question.colCount + "%" : "";
var marginRight = this.question.colCount == 0 ? "5px" : "0px";
var divStyle = { marginRight: marginRight };
if (itemWidth) {
divStyle["width"] = itemWidth;
}
var isChecked = this.question.value == item.value;
var otherItem = isChecked && item.value === this.question.otherItem.value ? this.renderOther() : null;
return this.renderRadio(key, item, isChecked, divStyle, otherItem, isFirst);
};
SurveyQuestionRadiogroup.prototype.renderRadio = function (key, item, isChecked, divStyle, otherItem, isFirst) {
var id = isFirst ? this.question.inputId : null;
return React.createElement("div", { key: key, className: this.css.item, style: divStyle }, React.createElement("label", { className: this.css.item }, React.createElement("input", { id: id, type: "radio", checked: isChecked, value: item.value, disabled: this.isDisplayMode, onChange: this.handleOnChange }), React.createElement("span", { style: this.textStyle }, item.text)), otherItem);
};
SurveyQuestionRadiogroup.prototype.renderOther = function () {
return React.createElement("div", { className: this.css.other }, React.createElement(_reactquestioncomment.SurveyQuestionCommentItem, { question: this.question, css: this.rootCss, isDisplayMode: this.isDisplayMode }));
};
return SurveyQuestionRadiogroup;
}(_reactquestionelement.SurveyQuestionElementBase);
_reactquestionfactory.ReactQuestionFactory.Instance.registerQuestion("radiogroup", function (props) {
return React.createElement(SurveyQuestionRadiogroup, props);
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 60 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyQuestionText = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactquestionelement = __webpack_require__(47);
var _reactquestionfactory = __webpack_require__(48);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyQuestionText = exports.SurveyQuestionText = function (_super) {
__extends(SurveyQuestionText, _super);
function SurveyQuestionText(props) {
_super.call(this, props);
this.state = { value: this.question.value || '' };
this.handleOnChange = this.handleOnChange.bind(this);
this.handleOnBlur = this.handleOnBlur.bind(this);
}
Object.defineProperty(SurveyQuestionText.prototype, "question", {
get: function get() {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionText.prototype.handleOnChange = function (event) {
this.setState({ value: event.target.value });
};
SurveyQuestionText.prototype.handleOnBlur = function (event) {
this.question.value = event.target.value;
this.setState({ value: this.question.value || '' });
};
SurveyQuestionText.prototype.render = function () {
if (!this.question) return null;
if (this.isDisplayMode) return React.createElement("div", { id: this.question.inputId, className: this.css }, this.question.value);
return React.createElement("input", { id: this.question.inputId, className: this.css, type: this.question.inputType, value: this.state.value, size: this.question.size, onBlur: this.handleOnBlur, onChange: this.handleOnChange });
};
return SurveyQuestionText;
}(_reactquestionelement.SurveyQuestionElementBase);
_reactquestionfactory.ReactQuestionFactory.Instance.registerQuestion("text", function (props) {
return React.createElement(SurveyQuestionText, props);
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 61 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyQuestionMatrixDynamicRow = exports.SurveyQuestionMatrixDynamic = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactquestionelement = __webpack_require__(47);
var _reactquestion = __webpack_require__(45);
var _reactquestionfactory = __webpack_require__(48);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyQuestionMatrixDynamic = exports.SurveyQuestionMatrixDynamic = function (_super) {
__extends(SurveyQuestionMatrixDynamic, _super);
function SurveyQuestionMatrixDynamic(props) {
_super.call(this, props);
this.setProperties(props);
}
Object.defineProperty(SurveyQuestionMatrixDynamic.prototype, "question", {
get: function get() {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionMatrixDynamic.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.setProperties(nextProps);
};
SurveyQuestionMatrixDynamic.prototype.setProperties = function (nextProps) {
var self = this;
this.state = { rowCounter: 0 };
this.question.rowCountChangedCallback = function () {
self.state.rowCounter = self.state.rowCounter + 1;
self.setState(self.state);
};
this.handleOnRowAddClick = this.handleOnRowAddClick.bind(this);
};
SurveyQuestionMatrixDynamic.prototype.handleOnRowAddClick = function (event) {
this.question.addRow();
};
SurveyQuestionMatrixDynamic.prototype.render = function () {
if (!this.question) return null;
var headers = [];
for (var i = 0; i < this.question.columns.length; i++) {
var column = this.question.columns[i];
var key = "column" + i;
var minWidth = this.question.getColumnWidth(column);
var columnStyle = minWidth ? { minWidth: minWidth } : {};
headers.push(React.createElement("th", { key: key, style: columnStyle }, this.question.getColumnTitle(column)));
}
var rows = [];
var visibleRows = this.question.visibleRows;
for (var i = 0; i < visibleRows.length; i++) {
var row = visibleRows[i];
rows.push(React.createElement(SurveyQuestionMatrixDynamicRow, { key: row.id, row: row, question: this.question, index: i, css: this.css, rootCss: this.rootCss, isDisplayMode: this.isDisplayMode, creator: this.creator }));
}
var divStyle = this.question.horizontalScroll ? { overflowX: 'scroll' } : {};
var btnDeleteTD = !this.isDisplayMode ? React.createElement("th", null) : null;
return React.createElement("div", null, React.createElement("div", { style: divStyle }, React.createElement("table", { className: this.css.root }, React.createElement("thead", null, React.createElement("tr", null, headers, btnDeleteTD)), React.createElement("tbody", null, rows))), this.renderAddRowButton());
};
SurveyQuestionMatrixDynamic.prototype.renderAddRowButton = function () {
if (this.isDisplayMode) return null;
return React.createElement("input", { className: this.css.button, type: "button", onClick: this.handleOnRowAddClick, value: this.question.addRowText });
};
return SurveyQuestionMatrixDynamic;
}(_reactquestionelement.SurveyQuestionElementBase);
var SurveyQuestionMatrixDynamicRow = exports.SurveyQuestionMatrixDynamicRow = function (_super) {
__extends(SurveyQuestionMatrixDynamicRow, _super);
function SurveyQuestionMatrixDynamicRow(props) {
_super.call(this, props);
this.setProperties(props);
}
SurveyQuestionMatrixDynamicRow.prototype.componentWillReceiveProps = function (nextProps) {
_super.prototype.componentWillReceiveProps.call(this, nextProps);
this.setProperties(nextProps);
};
SurveyQuestionMatrixDynamicRow.prototype.setProperties = function (nextProps) {
this.row = nextProps.row;
this.question = nextProps.question;
this.index = nextProps.index;
this.creator = nextProps.creator;
this.handleOnRowRemoveClick = this.handleOnRowRemoveClick.bind(this);
};
SurveyQuestionMatrixDynamicRow.prototype.handleOnRowRemoveClick = function (event) {
this.question.removeRow(this.index);
};
SurveyQuestionMatrixDynamicRow.prototype.render = function () {
if (!this.row) return null;
var tds = [];
for (var i = 0; i < this.row.cells.length; i++) {
var cell = this.row.cells[i];
var errors = React.createElement(_reactquestion.SurveyQuestionErrors, { question: cell.question, css: this.rootCss, creator: this.creator });
var select = this.renderQuestion(cell);
tds.push(React.createElement("td", { key: "row" + i }, errors, select));
}
if (!this.isDisplayMode) {
var removeButton = this.renderButton();
tds.push(React.createElement("td", { key: "row" + this.row.cells.length + 1 }, removeButton));
}
return React.createElement("tr", null, tds);
};
SurveyQuestionMatrixDynamicRow.prototype.renderQuestion = function (cell) {
return this.creator.createQuestionElement(cell.question);
};
SurveyQuestionMatrixDynamicRow.prototype.renderButton = function () {
return React.createElement("input", { className: this.css.button, type: "button", onClick: this.handleOnRowRemoveClick, value: this.question.removeRowText });
};
return SurveyQuestionMatrixDynamicRow;
}(_reactquestionelement.SurveyElementBase);
_reactquestionfactory.ReactQuestionFactory.Instance.registerQuestion("matrixdynamic", function (props) {
return React.createElement(SurveyQuestionMatrixDynamic, props);
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 62 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyQuestionRating = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactquestionelement = __webpack_require__(47);
var _reactquestioncomment = __webpack_require__(46);
var _reactquestionfactory = __webpack_require__(48);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyQuestionRating = exports.SurveyQuestionRating = function (_super) {
__extends(SurveyQuestionRating, _super);
function SurveyQuestionRating(props) {
_super.call(this, props);
this.handleOnChange = this.handleOnChange.bind(this);
}
Object.defineProperty(SurveyQuestionRating.prototype, "question", {
get: function get() {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionRating.prototype.handleOnChange = function (event) {
this.question.value = event.target.value;
this.setState({ value: this.question.value });
};
SurveyQuestionRating.prototype.render = function () {
if (!this.question) return null;
var values = [];
for (var i = 0; i < this.question.visibleRateValues.length; i++) {
var minText = i == 0 ? this.question.mininumRateDescription + " " : null;
var maxText = i == this.question.visibleRateValues.length - 1 ? " " + this.question.maximumRateDescription : null;
values.push(this.renderItem("value" + i, this.question.visibleRateValues[i], minText, maxText));
}
var comment = this.question.hasOther ? this.renderOther() : null;
return React.createElement("div", { className: this.css.root }, values, comment);
};
SurveyQuestionRating.prototype.renderItem = function (key, item, minText, maxText) {
var isChecked = this.question.value == item.value;
var className = this.css.item;
if (isChecked) className += " active";
var min = minText ? React.createElement("span", null, minText) : null;
var max = maxText ? React.createElement("span", null, maxText) : null;
return React.createElement("label", { key: key, className: className }, React.createElement("input", { type: "radio", style: { display: "none" }, name: this.question.name, value: item.value, disabled: this.isDisplayMode, checked: this.question.value == item.value, onChange: this.handleOnChange }), min, React.createElement("span", null, item.text), max);
};
SurveyQuestionRating.prototype.renderOther = function () {
return React.createElement("div", { className: this.css.other }, React.createElement(_reactquestioncomment.SurveyQuestionCommentItem, { question: this.question, css: this.rootCss, isDisplayMode: this.isDisplayMode }));
};
return SurveyQuestionRating;
}(_reactquestionelement.SurveyQuestionElementBase);
_reactquestionfactory.ReactQuestionFactory.Instance.registerQuestion("rating", function (props) {
return React.createElement(SurveyQuestionRating, props);
});
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 63 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__extends) {"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyWindow = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactSurvey = __webpack_require__(38);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyWindow = exports.SurveyWindow = function (_super) {
__extends(SurveyWindow, _super);
function SurveyWindow(props) {
_super.call(this, props);
this.handleOnExpanded = this.handleOnExpanded.bind(this);
}
SurveyWindow.prototype.handleOnExpanded = function (event) {
this.state.expanded = !this.state.expanded;
this.setState(this.state);
};
SurveyWindow.prototype.render = function () {
if (this.state.hidden) return null;
var header = this.renderHeader();
var body = this.state.expanded ? this.renderBody() : null;
var style = { position: "fixed", bottom: "3px", right: "10px" };
return React.createElement("div", { className: this.css.window.root, style: style }, header, body);
};
SurveyWindow.prototype.renderHeader = function () {
var styleA = { width: "100%" };
var styleTitle = { paddingRight: "10px" };
var glyphClassName = this.state.expanded ? this.css.window.header.buttonCollapsed : this.css.window.header.buttonExpanded;
glyphClassName = "glyphicon pull-right " + glyphClassName;
return React.createElement("div", { className: this.css.window.header.root }, React.createElement("a", { href: "#", onClick: this.handleOnExpanded, style: styleA }, React.createElement("span", { className: this.css.window.header.title, style: styleTitle }, this.title), React.createElement("span", { className: glyphClassName, "aria-hidden": "true" })));
};
SurveyWindow.prototype.renderBody = function () {
return React.createElement("div", { class: this.css.window.body }, this.renderSurvey());
};
SurveyWindow.prototype.updateSurvey = function (newProps) {
_super.prototype.updateSurvey.call(this, newProps);
this.title = newProps.title ? newProps.title : this.survey.title;
var hasExpanded = newProps["expanded"] ? newProps.expanded : false;
this.state = { expanded: hasExpanded, hidden: false };
var self = this;
this.survey.onComplete.add(function (s) {
self.state.hidden = true;
self.setState(self.state);
});
};
return SurveyWindow;
}(_reactSurvey.Survey);
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4)))
/***/ },
/* 64 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
__webpack_require__(65);
__webpack_require__(66);
__webpack_require__(67);
__webpack_require__(68);
__webpack_require__(69);
__webpack_require__(70);
__webpack_require__(71);
__webpack_require__(72);
__webpack_require__(73);
/***/ },
/* 65 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.danishSurveyStrings = undefined;
var _surveyStrings = __webpack_require__(7);
var danishSurveyStrings = exports.danishSurveyStrings = {
pagePrevText: "Tilbage",
pageNextText: "Videre",
completeText: "Færdig",
progressText: "Side {0} af {1}",
emptySurvey: "Der er ingen synlige spørgsmål.",
completingSurvey: "Mange tak for din besvarelse!",
loadingSurvey: "Spørgeskemaet hentes fra serveren...",
otherItemText: "Valgfrit svar...",
optionsCaption: "Vælg...",
requiredError: "Besvar venligst spørgsmålet.",
numericError: "Angiv et tal.",
textMinLength: "Angiv mindst {0} tegn.",
minSelectError: "Vælg venligst mindst {0} svarmulighed(er).",
maxSelectError: "Vælg venligst færre {0} svarmuligheder(er).",
numericMinMax: "'{0}' skal være lig med eller større end {1} og lig med eller mindre end {2}",
numericMin: "'{0}' skal være lig med eller større end {1}",
numericMax: "'{0}' skal være lig med eller mindre end {1}",
invalidEmail: "Angiv venligst en gyldig e-mail adresse.",
exceedMaxSize: "Filstørrelsen må ikke overstige {0}.",
otherRequiredError: "Angiv en værdi for dit valgfrie svar."
};
_surveyStrings.surveyLocalization.locales["da"] = danishSurveyStrings;
/***/ },
/* 66 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.dutchSurveyStrings = undefined;
var _surveyStrings = __webpack_require__(7);
var dutchSurveyStrings = exports.dutchSurveyStrings = {
pagePrevText: "Vorige",
pageNextText: "Volgende",
completeText: "Afsluiten",
otherItemText: "Andere",
progressText: "Pagina {0} van {1}",
emptySurvey: "Er is geen zichtbare pagina of vraag in deze vragenlijst",
completingSurvey: "Bedankt om deze vragenlijst in te vullen",
loadingSurvey: "De vragenlijst is aan het laden...",
optionsCaption: "Kies...",
requiredError: "Gelieve een antwoord in te vullen",
numericError: "Het antwoord moet een getal zijn",
textMinLength: "Gelieve minsten {0} karakters in te vullen.",
minSelectError: "Gelieve minimum {0} antwoorden te selecteren.",
maxSelectError: "Gelieve niet meer dan {0} antwoorden te selecteren.",
numericMinMax: "Uw antwoord '{0}' moet groter of gelijk zijn aan {1} en kleiner of gelijk aan {2}",
numericMin: "Uw antwoord '{0}' moet groter of gelijk zijn aan {1}",
numericMax: "Uw antwoord '{0}' moet groter of gelijk zijn aan {1}",
invalidEmail: "Gelieve een geldig e-mailadres in te vullen.",
exceedMaxSize: "De grootte van het bestand mag niet groter zijn dan {0}.",
otherRequiredError: "Gelieve het veld 'Andere' in te vullen"
};
_surveyStrings.surveyLocalization.locales["nl"] = dutchSurveyStrings;
/***/ },
/* 67 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.finnishSurveyStrings = undefined;
var _surveyStrings = __webpack_require__(7);
var finnishSurveyStrings = exports.finnishSurveyStrings = {
pagePrevText: "Edellinen",
pageNextText: "Seuraava",
completeText: "Valmis",
otherItemText: "Muu (kuvaile)",
progressText: "Sivu {0}/{1}",
emptySurvey: "Tässä kyselyssä ei ole yhtäkään näkyvillä olevaa sivua tai kysymystä.",
completingSurvey: "Kiitos kyselyyn vastaamisesta!",
loadingSurvey: "Kyselyä ladataan palvelimelta...",
optionsCaption: "Valitse...",
requiredError: "Vastaa kysymykseen, kiitos.",
numericError: "Arvon tulee olla numeerinen.",
textMinLength: "Ole hyvä ja syötä vähintään {0} merkkiä.",
minSelectError: "Ole hyvä ja valitse vähintään {0} vaihtoehtoa.",
maxSelectError: "Ole hyvä ja valitse enintään {0} vaihtoehtoa.",
numericMinMax: "'{0}' täytyy olla enemmän tai yhtä suuri kuin {1} ja vähemmän tai yhtä suuri kuin {2}",
numericMin: "'{0}' täytyy olla enemmän tai yhtä suuri kuin {1}",
numericMax: "'{0}' täytyy olla vähemmän tai yhtä suuri kuin {1}",
invalidEmail: "Syötä validi sähköpostiosoite.",
otherRequiredError: "Ole hyvä ja syötä \"Muu (kuvaile)\""
};
_surveyStrings.surveyLocalization.locales["fi"] = finnishSurveyStrings;
/***/ },
/* 68 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.frenchSurveyStrings = undefined;
var _surveyStrings = __webpack_require__(7);
var frenchSurveyStrings = exports.frenchSurveyStrings = {
pagePrevText: "Pr\xE9c\xE9dent",
pageNextText: "Suivant",
completeText: "Terminer",
otherItemText: "Autre (pr\xE9ciser)",
progressText: "Page {0} sur {1}",
emptySurvey: "Il n'y a ni page visible ni question visible dans ce questionnaire",
completingSurvey: "Merci d'avoir r\xE9pondu au questionnaire!",
loadingSurvey: "Le questionnaire est en cours de chargement...",
optionsCaption: "Choisissez...",
requiredError: "La r\xE9ponse \xE0 cette question est obligatoire.",
numericError: "La r\xE9ponse doit \xEAtre un nombre.",
textMinLength: "Merci d'entrer au moins {0} symboles.",
minSelectError: "Merci de s\xE9lectionner au moins {0}r\xE9ponses.",
maxSelectError: "Merci de s\xE9lectionner au plus {0}r\xE9ponses.",
numericMinMax: "Votre r\xE9ponse '{0}' doit \xEAtresup\xE9rieure ou \xE9gale \xE0 {1} et inf\xE9rieure ou\xE9gale \xE0 {2}",
numericMin: "Votre r\xE9ponse '{0}' doit \xEAtresup\xE9rieure ou \xE9gale \xE0 {1}",
numericMax: "Votre r\xE9ponse '{0}' doit \xEAtreinf\xE9rieure ou \xE9gale \xE0 {1}",
invalidEmail: "Merci d'entrer une adresse mail valide.",
exceedMaxSize: "La taille du fichier ne doit pas exc\xE9der {0}.",
otherRequiredError: "Merci de pr\xE9ciser le champ 'Autre'."
};
_surveyStrings.surveyLocalization.locales["fr"] = frenchSurveyStrings;
/***/ },
/* 69 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.germanSurveyStrings = undefined;
var _surveyStrings = __webpack_require__(7);
var germanSurveyStrings = exports.germanSurveyStrings = {
pagePrevText: "Zurück",
pageNextText: "Weiter",
completeText: "Fertig",
progressText: "Seite {0} von {1}",
emptySurvey: "Es gibt keine sichtbare Frage.",
completingSurvey: "Vielen Dank für das Ausfüllen des Fragebogens!",
loadingSurvey: "Der Fragebogen wird vom Server geladen...",
otherItemText: "Benutzerdefinierte Antwort...",
optionsCaption: "Wählen...",
requiredError: "Bitte antworten Sie auf die Frage.",
numericError: "Der Wert sollte eine Zahl sein.",
textMinLength: "Bitte geben Sie mindestens {0} Symbole.",
minSelectError: "Bitte wählen Sie mindestens {0} Varianten.",
maxSelectError: "Bitte wählen Sie nicht mehr als {0} Varianten.",
numericMinMax: "'{0}' solte gleich oder größer sein als {1} und gleich oder kleiner als {2}",
numericMin: "'{0}' solte gleich oder größer sein als {1}",
numericMax: "'{0}' solte gleich oder kleiner als {1}",
invalidEmail: "Bitte geben Sie eine gültige Email-Adresse ein.",
exceedMaxSize: "Die Dateigröße soll nicht mehr als {0}.",
otherRequiredError: "Bitte geben Sie einen Wert für Ihre benutzerdefinierte Antwort ein."
};
_surveyStrings.surveyLocalization.locales["de"] = germanSurveyStrings;
/***/ },
/* 70 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.greekSurveyStrings = undefined;
var _surveyStrings = __webpack_require__(7);
var greekSurveyStrings = exports.greekSurveyStrings = {
pagePrevText: "Προηγούμενο",
pageNextText: "Επόμενο",
completeText: "Ολοκλήρωση",
otherItemText: "Άλλο (παρακαλώ διευκρινίστε)",
progressText: "Σελίδα {0} από {1}",
emptySurvey: "Δεν υπάρχει καμία ορατή σελίδα ή ορατή ερώτηση σε αυτό το ερωτηματολόγιο.",
completingSurvey: "Ευχαριστούμε για την συμπλήρωση αυτου του ερωτηματολογίου!",
loadingSurvey: "Το ερωτηματολόγιο φορτώνεται απο το διακομιστή...",
optionsCaption: "Επιλέξτε...",
requiredError: "Παρακαλώ απαντήστε στην ερώτηση.",
requiredInAllRowsError: "Παρακαλώ απαντήστε στις ερωτήσεις σε όλες τις γραμμές.",
numericError: "Η τιμή πρέπει να είναι αριθμιτική.",
textMinLength: "Παρακαλώ συμπληρώστε τουλάχιστον {0} σύμβολα.",
minRowCountError: "Παρακαλώ συμπληρώστε τουλάχιστον {0} γραμμές.",
minSelectError: "Παρακαλώ επιλέξτε τουλάχιστον {0} παραλλαγές.",
maxSelectError: "Παρακαλώ επιλέξτε όχι παραπάνω απο {0} παραλλαγές.",
numericMinMax: "Το '{0}' θα πρέπει να είναι ίσο ή μεγαλύτερο απο το {1} και ίσο ή μικρότερο απο το {2}",
numericMin: "Το '{0}' πρέπει να είναι μεγαλύτερο ή ισο με το {1}",
numericMax: "Το '{0}' πρέπει να είναι μικρότερο ή ίσο απο το {1}",
invalidEmail: "Παρακαλώ δώστε μια αποδεκτή διεύθυνση e-mail.",
urlRequestError: "Η αίτηση επέστρεψε σφάλμα '{0}'. {1}",
urlGetChoicesError: "Η αίτηση επέστρεψε κενά δεδομένα ή η ιδότητα 'μονοπάτι/path' είναι εσφαλέμένη",
exceedMaxSize: "Το μέγεθος δεν μπορεί να υπερβένει τα {0}.",
otherRequiredError: "Παρακαλώ συμπληρώστε την τιμή για το πεδίο 'άλλο'.",
uploadingFile: "Το αρχείο σας ανεβαίνει. Παρακαλώ περιμένετε καποια δευτερόλεπτα και δοκιμάστε ξανά.",
addRow: "Προσθήκη γραμμής",
removeRow: "Αφαίρεση"
};
_surveyStrings.surveyLocalization.locales["gr"] = greekSurveyStrings;
/***/ },
/* 71 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.polishSurveyStrings = undefined;
var _surveyStrings = __webpack_require__(7);
var polishSurveyStrings = exports.polishSurveyStrings = {
pagePrevText: "Wstecz",
pageNextText: "Dalej",
completeText: "Gotowe",
progressText: "Strona {0} z {1}",
emptySurvey: "Nie ma widocznych pytań.",
completingSurvey: "Dziękujemy za wypełnienie ankiety!",
loadingSurvey: "Trwa wczytywanie ankiety...",
otherItemText: "Inna odpowiedź...",
optionsCaption: "Wybierz...",
requiredError: "Proszę odpowiedzieć na to pytanie.",
numericError: "W tym polu można wpisać tylko liczby.",
textMinLength: "Proszę wpisać co najmniej {0} znaków.",
minSelectError: "Proszę wybrać co najmniej {0} pozycji.",
maxSelectError: "Proszę wybrać nie więcej niż {0} pozycji.",
numericMinMax: "Odpowiedź '{0}' powinna być większa lub równa {1} oraz mniejsza lub równa {2}",
numericMin: "Odpowiedź '{0}' powinna być większa lub równa {1}",
numericMax: "Odpowiedź '{0}' powinna być mniejsza lub równa {1}",
invalidEmail: "Proszę podać prawidłowy adres email.",
exceedMaxSize: "Rozmiar przesłanego pliku nie może przekraczać {0}.",
otherRequiredError: "Proszę podać inną odpowiedź."
};
_surveyStrings.surveyLocalization.locales["pl"] = polishSurveyStrings;
/***/ },
/* 72 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.russianSurveyStrings = undefined;
var _surveyStrings = __webpack_require__(7);
var russianSurveyStrings = exports.russianSurveyStrings = {
pagePrevText: "Назад",
pageNextText: "Далее",
completeText: "Готово",
progressText: "Страница {0} из {1}",
emptySurvey: "Нет ни одного вопроса.",
completingSurvey: "Благодарим Вас за заполнение анкеты!",
loadingSurvey: "Загрузка с сервера...",
otherItemText: "Другое (пожалуйста, опишите)",
optionsCaption: "Выбрать...",
requiredError: "Пожалуйста, ответьте на вопрос.",
numericError: "Ответ должен быть числом.",
textMinLength: "Пожалуйста, введите хотя бы {0} символов.",
minSelectError: "Пожалуйста, выберите хотя бы {0} вариантов.",
maxSelectError: "Пожалуйста, выберите не более {0} вариантов.",
numericMinMax: "'{0}' должно быть равным или больше, чем {1}, и равным или меньше, чем {2}",
numericMin: "'{0}' должно быть равным или больше, чем {1}",
numericMax: "'{0}' должно быть равным или меньше, чем {1}",
invalidEmail: "Пожалуйста, введите действительный адрес электронной почты.",
otherRequiredError: "Пожалуйста, введите данные в поле \"Другое\""
};
_surveyStrings.surveyLocalization.locales["ru"] = russianSurveyStrings;
/***/ },
/* 73 */
/***/ function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.turkishSurveyStrings = undefined;
var _surveyStrings = __webpack_require__(7);
var turkishSurveyStrings = exports.turkishSurveyStrings = {
pagePrevText: "Geri",
pageNextText: "İleri",
completeText: "Anketi Tamamla",
otherItemText: "Diğer (açıklayınız)",
progressText: "Sayfa {0} / {1}",
emptySurvey: "Ankette görüntülenecek sayfa ya da soru mevcut değil.",
completingSurvey: "Anketimizi tamamladığınız için teşekkür ederiz.",
loadingSurvey: "Anket sunucudan yükleniyor ...",
optionsCaption: "Seçiniz ...",
requiredError: "Lütfen soruya cevap veriniz",
numericError: "Girilen değer numerik olmalıdır",
textMinLength: "En az {0} sembol giriniz.",
minRowCountError: "Lütfen en az {0} satırı doldurun.",
minSelectError: "Lütfen en az {0} seçeneği seçiniz.",
maxSelectError: "Lütfen {0} adetten fazla seçmeyiniz.",
numericMinMax: "The '{0}' should be equal or more than {1} and equal or less than {2}",
numericMin: "'{0}' değeri {1} değerine eşit veya büyük olmalıdır",
numericMax: "'{0}' değeri {1} değerine eşit ya da küçük olmalıdır.",
invalidEmail: "Lütfen geçerli bir eposta adresi giriniz.",
urlRequestError: "Talebi şu hatayı döndü '{0}'. {1}",
urlGetChoicesError: "Talep herhangi bir veri dönmedi ya da 'path' özelliği hatalı.",
exceedMaxSize: "Dosya boyutu {0} değerini geçemez.",
otherRequiredError: "Lütfen diğer değerleri giriniz.",
uploadingFile: "Dosyanız yükleniyor. LÜtfen birkaç saniye bekleyin ve tekrar deneyin.",
addRow: "Satır Ekle",
removeRow: "Kaldır"
};
_surveyStrings.surveyLocalization.locales["tr"] = turkishSurveyStrings;
/***/ },
/* 74 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__assign) {'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.__assign = __assign;
function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) {
if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
}
return t;
}
;
if (typeof module !== 'undefined' && module.exports) {
exports = module.exports = __assign;
}
exports.__assign = __assign;
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(74)))
/***/ },
/* 75 */
/***/ function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(__assign) {'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.SurveyWindowNG = exports.SurveyNG = undefined;
var _react = __webpack_require__(39);
var React = _interopRequireWildcard(_react);
var _reactDom = __webpack_require__(39);
var ReactDOM = _interopRequireWildcard(_reactDom);
var _reactSurvey = __webpack_require__(38);
var _reactSurveyWindow = __webpack_require__(63);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var SurveyNG = exports.SurveyNG = function () {
function SurveyNG() {}
SurveyNG.render = function (elementId, props) {
ReactDOM.render(React.createElement(_reactSurvey.Survey, __assign({}, props)), document.getElementById(elementId));
};
return SurveyNG;
}();
var SurveyWindowNG = exports.SurveyWindowNG = function () {
function SurveyWindowNG() {}
SurveyWindowNG.render = function (elementId, props) {
ReactDOM.render(React.createElement(_reactSurveyWindow.SurveyWindow, __assign({}, props)), document.getElementById(elementId));
};
return SurveyWindowNG;
}();
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(74)))
/***/ }
/******/ ])
});
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBjNjk0OGY3NzIxNDliY2Q5ZmQzZiIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9hbmd1bGFyLnRzIiwid2VicGFjazovLy8uL3NyYy9lbnRyaWVzL3JlYWN0LnRzIiwid2VicGFjazovLy8uL3NyYy9lbnRyaWVzL2NodW5rcy9tb2RlbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdmFsaWRhdG9yLnRzIiwid2VicGFjazovLy8uL3NyYy9leHRlbmRzLnRzIiwid2VicGFjazovLy8uL3NyYy9iYXNlLnRzIiwid2VicGFjazovLy8uL3NyYy9lcnJvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc3VydmV5U3RyaW5ncy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvanNvbm9iamVjdC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY2hvaWNlc1Jlc3RmdWxsLnRzIiwid2VicGFjazovLy8uL3NyYy9jb25kaXRpb25zLnRzIiwid2VicGFjazovLy8uL3NyYy9jb25kaXRpb25zUGFyc2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9jb25kaXRpb25Qcm9jZXNzVmFsdWUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uYmFzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdGV4dFByZVByb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fYmFzZXNlbGVjdC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25mYWN0b3J5LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fbWF0cml4LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9tdWx0aXBsZXRleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BhZ2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX2NoZWNrYm94LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9jb21tZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fZmlsZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25faHRtbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fcmFkaW9ncm91cC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fcmF0aW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl90ZXh0LnRzIiwid2VicGFjazovLy8uL3NyYy9zdXJ2ZXkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2R4U3VydmV5U2VydmljZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHJpZ2dlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc3VydmV5V2luZG93LnRzIiwid2VicGFjazovLy8uL3NyYy9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkLnRzIiwid2VicGFjazovLy8uL3NyYy9kZWZhdWx0Q3NzL2Nzc2Jvb3RzdHJhcC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RTdXJ2ZXkudHN4Iiwid2VicGFjazovLy8uLi9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9+L25vZGUtbGlicy1icm93c2VyL34vcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L3ByZWFjdC9zcmMvaC5qcyIsIndlYnBhY2s6Ly8vLi9+L3ByZWFjdC9zcmMvdXRpbC5qcyIsIndlYnBhY2s6Ly8vLi9+L3ByZWFjdC9zcmMvY2xvbmUtZWxlbWVudC5qcyIsIndlYnBhY2s6Ly8vLi9+L3ByZWFjdC9zcmMvbGlua2VkLXN0YXRlLmpzIiwid2VicGFjazovLy8uL34vcHJlYWN0L3NyYy9yZW5kZXItcXVldWUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9wcmVhY3Qvc3JjL3Zkb20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9wcmVhY3Qvc3JjL2RvbS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L3ByZWFjdC9zcmMvZG9tL3JlY3ljbGVyLmpzIiwid2VicGFjazovLy8uL34vcHJlYWN0L3NyYy92ZG9tL2RpZmYuanMiLCJ3ZWJwYWNrOi8vLy4vfi9wcmVhY3Qvc3JjL3Zkb20vY29tcG9uZW50LXJlY3ljbGVyLmpzIiwid2VicGFjazovLy8uL34vcHJlYWN0L3NyYy92ZG9tL2NvbXBvbmVudC5qcyIsIndlYnBhY2s6Ly8vLi9+L3ByZWFjdC9zcmMvY29tcG9uZW50LmpzIiwid2VicGFjazovLy8uL34vcHJlYWN0L3NyYy9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9wcmVhY3Qvc3JjL3JlbmRlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RzdXJ2ZXltb2RlbC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cGFnZS50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb24udHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uY29tbWVudC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25lbGVtZW50LnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmZhY3RvcnkudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdFN1cnZleU5hdmlnYXRpb24udHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdFN1cnZleU5hdmlnYXRpb25CYXNlLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RTdXJ2ZXlQcm9ncmVzcy50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25jaGVja2JveC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25kcm9wZG93bi50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25tYXRyaXhkcm9wZG93bi50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25tYXRyaXgudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uaHRtbC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25maWxlLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbm11bHRpcGxldGV4dC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25yYWRpb2dyb3VwLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbnRleHQudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ubWF0cml4ZHluYW1pYy50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25yYXRpbmcudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdFN1cnZleVdpbmRvdy50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2VudHJpZXMvY2h1bmtzL2xvY2FsaXphdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2RhbmlzaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2R1dGNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZmlubmlzaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2ZyZW5jaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2dlcm1hbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2dyZWVrLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vcG9saXNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vcnVzc2lhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3R1cmtpc2gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2lnbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvYW5ndWxhci9TdXJ2ZXlORy50c3giXSwibmFtZXMiOlsiY29uc3QiLCJsZXQiLCJoIiwib3B0aW9ucyIsInJlbmRlciIsInByZWFjdFJlbmRlciIsImNsb25lRWxlbWVudCIsInByZWFjdENsb25lRWxlbWVudCIsImkiLCJDb21wb25lbnQiLCJ0aGlzIiwiYXJndW1lbnRzIiwiUHJlYWN0Q29tcG9uZW50IiwibGFzdFNpbXBsZSIsImNoaWxkIiwic2ltcGxlIiwiY2hpbGRyZW4iLCJsZW5ndGgiLCJzdGFjayIsInB1c2giLCJhdHRyaWJ1dGVzIiwicG9wIiwiQXJyYXkiLCJTdHJpbmciLCJwcm9wcyIsIm9iaiIsImV4dGVuZCIsInAiLCJrZXkiLCJzcGxpdCIsInN0ciIsInByb3AiLCJjIiwidm5vZGUiLCJub2RlTmFtZSIsImNsb25lIiwic2xpY2UiLCJjYWxsIiwidiIsImlzU3RyaW5nIiwiZXZlbnRQYXRoIiwiZGVsdmUiLCJlIiwidCIsInR5cGUiLCJtYXRjaCIsImNoZWNrZWQiLCJ2YWx1ZSIsInBhdGgiLCJjb21wb25lbnQiLCJzdGF0ZSIsInNldFN0YXRlIiwicmVyZW5kZXIiLCJsaXN0IiwiaXRlbXMiLCJpc0Z1bmN0aW9uIiwibm9kZSIsIl9jb21wb25lbnRDb25zdHJ1Y3RvciIsImlzRnVuY3Rpb25hbENvbXBvbmVudCIsImlzTmFtZWROb2RlIiwibm9ybWFsaXplZE5vZGVOYW1lIiwidG9Mb3dlckNhc2UiLCJkZWZhdWx0UHJvcHMiLCJ1bmRlZmluZWQiLCJwYXJlbnROb2RlIiwibmFtZSIsImlzU3ZnIiwiY2xhc3NOYW1lIiwic3R5bGUiLCJjc3NUZXh0Iiwib2xkIiwiTk9OX0RJTUVOU0lPTl9QUk9QUyIsImlubmVySFRNTCIsIl9faHRtbCIsImwiLCJfbGlzdGVuZXJzIiwic3Vic3RyaW5nIiwiYWRkRXZlbnRMaXN0ZW5lciIsImV2ZW50UHJveHkiLCJOT05fQlVCQkxJTkdfRVZFTlRTIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInNldFByb3BlcnR5IiwicmVtb3ZlQXR0cmlidXRlIiwibnMiLCJyZW1vdmVBdHRyaWJ1dGVOUyIsInNldEF0dHJpYnV0ZU5TIiwic2V0QXR0cmlidXRlIiwiZXZlbnQiLCJfY29tcG9uZW50IiwiX25hbWUiLCJub2RlcyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudE5TIiwiY3JlYXRlRWxlbWVudCIsIm1vdW50cyIsInJldCIsImlkaWZmIiwiZG9tIiwiY29udGV4dCIsIm1vdW50QWxsIiwicGFyZW50IiwiYXBwZW5kQ2hpbGQiLCJkaWZmTGV2ZWwiLCJjb21wb25lbnRSb290IiwiZmx1c2hNb3VudHMiLCJvcmlnaW5hbEF0dHJpYnV0ZXMiLCJub2RlVmFsdWUiLCJyZWNvbGxlY3ROb2RlVHJlZSIsImNyZWF0ZVRleHROb2RlIiwiYnVpbGRDb21wb25lbnRGcm9tVk5vZGUiLCJwcmV2U3ZnTW9kZSIsImlzU3ZnTW9kZSIsInZjaGlsZHJlbiIsIm91dCIsImNyZWF0ZU5vZGUiLCJyZXBsYWNlQ2hpbGQiLCJmYyIsImZpcnN0Q2hpbGQiLCJBVFRSX0tFWSIsImEiLCJkaWZmQXR0cmlidXRlcyIsImh5ZHJhdGluZyIsIlRleHQiLCJuZXh0U2libGluZyIsImlubmVyRGlmZk5vZGUiLCJyZWYiLCJqIiwidmNoaWxkIiwibGVuIiwib3JpZ2luYWxDaGlsZHJlbiIsImNoaWxkcmVuTGVuIiwidmxlbiIsIl9jaGlsZCIsIl9fa2V5Iiwia2V5ZWRMZW4iLCJrZXllZCIsIm1pbiIsImlzU2FtZU5vZGVUeXBlIiwiaW5zZXJ0QmVmb3JlIiwidW5tb3VudE9ubHkiLCJjb2xsZWN0Tm9kZSIsImxhc3RDaGlsZCIsImF0dHJzIiwiX25hbWUyIiwic2V0QWNjZXNzb3IiLCJjcmVhdGVDb21wb25lbnQiLCJDdG9yIiwiaW5zdCIsImNvbXBvbmVudHMiLCJjb25zdHJ1Y3RvciIsIm5leHRCYXNlIiwic3BsaWNlIiwiYmFzZSIsImNvbXBvbmVudFdpbGxNb3VudCIsImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLCJwcmV2Q29udGV4dCIsIl9kaXNhYmxlIiwib3B0cyIsInN5bmNDb21wb25lbnRVcGRhdGVzIiwicmVuZGVyQ29tcG9uZW50IiwiZW5xdWV1ZVJlbmRlciIsIl9fcmVmIiwiY2Jhc2UiLCJwcmV2aW91c1N0YXRlIiwicHJldlN0YXRlIiwicHJldmlvdXNDb250ZXh0IiwiaXNVcGRhdGUiLCJpbml0aWFsQmFzZSIsImluaXRpYWxDaGlsZENvbXBvbmVudCIsInByZXZpb3VzUHJvcHMiLCJjb21wb25lbnRXaWxsVXBkYXRlIiwicHJldlByb3BzIiwiX2RpcnR5Iiwic2tpcCIsInJlbmRlcmVkIiwiZ2V0Q2hpbGRDb250ZXh0IiwiY2hpbGRDb21wb25lbnQiLCJjaGlsZFByb3BzIiwiZ2V0Tm9kZVByb3BzIiwidG9Vbm1vdW50IiwiX3BhcmVudENvbXBvbmVudCIsInNldENvbXBvbmVudFByb3BzIiwiZGlmZiIsImJhc2VQYXJlbnQiLCJ1bm1vdW50Q29tcG9uZW50IiwiY29tcG9uZW50UmVmIiwidW5zaGlmdCIsImNvbXBvbmVudERpZFVwZGF0ZSIsImFmdGVyVXBkYXRlIiwiZm4iLCJjYiIsIl9yZW5kZXJDYWxsYmFja3MiLCJpc0NoaWxkIiwiaXNPd25lciIsImlzRGlyZWN0T3duZXIiLCJvbGREb20iLCJpbm5lciIsInJlbW92ZSIsInJlbW92ZU5vZGUiLCJjb2xsZWN0Q29tcG9uZW50IiwiY29tcG9uZW50RGlkVW5tb3VudCIsInMiLCJsY0NhY2hlIiwiZGVmZXIiLCJyZXNvbHZlZCIsImYiLCJ0aGVuIiwic2V0VGltZW91dCIsIlN5bWJvbCIsImJveEZsZXgiLCJib3hGbGV4R3JvdXAiLCJjb2x1bW5Db3VudCIsImZpbGxPcGFjaXR5IiwiZmxleCIsImZsZXhHcm93Iiwib3BhY2l0eSIsIm9yZGVyIiwib3JwaGFucyIsInN0cm9rZU9wYWNpdHkiLCJ3aWRvd3MiLCJ6SW5kZXgiLCJ6b29tIiwiYmx1ciIsImVycm9yIiwiZm9jdXMiLCJsb2FkIiwicmVzaXplIiwic2Nyb2xsIiwiY2FsbGJhY2siLCJmb3JjZVVwZGF0ZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDckNBOzs7Ozs7Ozs7Ozs7Ozs7b0JBQ0E7Ozs7Ozs7OztzQkFDQTs7Ozs7O3NCQUFtRDs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNGcEI7Ozs7Ozs7Ozs7Ozs7Ozt5QkFRL0I7Ozs7Ozs7OzswQkFHQTs7Ozs7Ozs7O3lCQUNBOzs7Ozs7Ozs7OEJBQ0E7Ozs7Ozs4QkFDQTs7Ozs7Ozs7O3VDQUNBOzs7Ozs7Ozs7bUNBQ0E7Ozs7Ozs7Ozt1QkFBa0I7Ozs7Ozt1QkFDbEI7Ozs7Ozs7OzsyQkFBc0I7Ozs7OzsyQkFDdEI7Ozs7Ozs7OztrQ0FBeUI7Ozs7OztrQ0FDekI7Ozs7Ozs7OztrQ0FBaUM7Ozs7OztrQ0FDakM7Ozs7Ozs7OzttQ0FBOEI7Ozs7OzttQ0FDOUI7Ozs7Ozs7OzttQ0FDQTs7Ozs7Ozs7O3lDQUFvQzs7Ozs7O3lDQUNwQzs7Ozs7Ozs7O2lDQUE0Qjs7Ozs7O2lDQUM1Qjs7Ozs7Ozs7OytCQUNBOzs7Ozs7Ozs7K0JBQ0E7Ozs7Ozs7Ozt1Q0FBa0M7Ozs7Ozt1Q0FDbEM7Ozs7Ozs7OztxQ0FDQTs7Ozs7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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0EsRUFBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFVBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBdUIsc0JBQXNCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXFCO0FBQ3JCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw0QkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsNkJBQTRCLFVBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hLdEMs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NERBQWMsU0FBVSxTQUFlLGVBQ3hFO0FBQUM7QUFDTCxZQUFDO0FBQUEsSyIsImZpbGUiOiJzdXJ2ZXkuYW5ndWxhci5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiU3VydmV5XCIsIFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlN1cnZleVwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJTdXJ2ZXlcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiBcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb25cbiAqKi8iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0ZXhwb3J0czoge30sXG4gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuIFx0XHRcdGxvYWRlZDogZmFsc2VcbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIHdlYnBhY2svYm9vdHN0cmFwIGM2OTQ4Zjc3MjE0OWJjZDlmZDNmXG4gKiovIiwiZXhwb3J0ICogZnJvbSBcIi4vcmVhY3RcIjtcclxuZXhwb3J0IHtfX2Fzc2lnbn0gZnJvbSBcIi4uL2Fzc2lnblwiO1xyXG5leHBvcnQge1N1cnZleU5HfSBmcm9tIFwiLi4vYW5ndWxhci9TdXJ2ZXlOR1wiO1xyXG5leHBvcnQge1N1cnZleVdpbmRvd05HfSBmcm9tIFwiLi4vYW5ndWxhci9TdXJ2ZXlOR1wiO1xyXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9lbnRyaWVzL2FuZ3VsYXIudHNcbiAqKi8iLCIvLyBtb2RlbFxyXG5leHBvcnQgKiBmcm9tIFwiLi9jaHVua3MvbW9kZWxcIjtcclxuXHJcbi8vIGxvY2FsaXphdGlvblxyXG5pbXBvcnQgJy4vY2h1bmtzL2xvY2FsaXphdGlvbic7XHJcblxyXG4vLyBjc3Mgc3RhbmRhcmRcclxuZXhwb3J0IHtkZWZhdWx0U3RhbmRhcmRDc3N9IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XHJcbi8vIGNzcyBib290c3RyYXBcclxuZXhwb3J0IHtkZWZhdWx0Qm9vdHN0cmFwQ3NzfSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3Nib290c3RyYXBcIjtcclxuXHJcbi8vIHJlYWN0XHJcbmV4cG9ydCB7U3VydmV5fSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RTdXJ2ZXlcIjtcclxuZXhwb3J0IHtSZWFjdFN1cnZleU1vZGVsfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RzdXJ2ZXltb2RlbFwiOyAvLyBUT0RPIG5lZWQgdG8gcmVtb3ZlIHNvbWVkYXlcclxuZXhwb3J0IHtSZWFjdFN1cnZleU1vZGVsIGFzIE1vZGVsfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RzdXJ2ZXltb2RlbFwiO1xyXG5leHBvcnQge1N1cnZleU5hdmlnYXRpb25CYXNlfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RTdXJ2ZXlOYXZpZ2F0aW9uQmFzZVwiO1xyXG5leHBvcnQge1N1cnZleU5hdmlnYXRpb259IGZyb20gXCIuLi9yZWFjdC9yZWFjdFN1cnZleU5hdmlnYXRpb25cIjtcclxuZXhwb3J0IHtTdXJ2ZXlQYWdlLCBTdXJ2ZXlSb3d9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHBhZ2VcIjtcclxuZXhwb3J0IHtTdXJ2ZXlRdWVzdGlvbiwgU3VydmV5UXVlc3Rpb25FcnJvcnN9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uXCI7XHJcbmV4cG9ydCB7U3VydmV5RWxlbWVudEJhc2UsIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2V9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xyXG5leHBvcnQge1N1cnZleVF1ZXN0aW9uQ29tbWVudEl0ZW0sIFN1cnZleVF1ZXN0aW9uQ29tbWVudH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25jb21tZW50XCI7XHJcbmV4cG9ydCB7U3VydmV5UXVlc3Rpb25DaGVja2JveCwgU3VydmV5UXVlc3Rpb25DaGVja2JveEl0ZW19IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uY2hlY2tib3hcIjtcclxuZXhwb3J0IHtTdXJ2ZXlRdWVzdGlvbkRyb3Bkb3dufSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbmRyb3Bkb3duXCI7XHJcbmV4cG9ydCB7U3VydmV5UXVlc3Rpb25NYXRyaXhEcm9wZG93biwgU3VydmV5UXVlc3Rpb25NYXRyaXhEcm9wZG93blJvd30gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25tYXRyaXhkcm9wZG93blwiO1xyXG5leHBvcnQge1N1cnZleVF1ZXN0aW9uTWF0cml4LCBTdXJ2ZXlRdWVzdGlvbk1hdHJpeFJvd30gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25tYXRyaXhcIjtcclxuZXhwb3J0IHtTdXJ2ZXlRdWVzdGlvbkh0bWx9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uaHRtbFwiO1xyXG5leHBvcnQge1N1cnZleVF1ZXN0aW9uRmlsZX0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25maWxlXCI7XHJcbmV4cG9ydCB7U3VydmV5UXVlc3Rpb25NdWx0aXBsZVRleHQsIFN1cnZleVF1ZXN0aW9uTXVsdGlwbGVUZXh0SXRlbX0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25tdWx0aXBsZXRleHRcIjtcclxuZXhwb3J0IHtTdXJ2ZXlRdWVzdGlvblJhZGlvZ3JvdXB9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9ucmFkaW9ncm91cFwiO1xyXG5leHBvcnQge1N1cnZleVF1ZXN0aW9uVGV4dH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb250ZXh0XCI7XHJcbmV4cG9ydCB7U3VydmV5UXVlc3Rpb25NYXRyaXhEeW5hbWljLCBTdXJ2ZXlRdWVzdGlvbk1hdHJpeER5bmFtaWNSb3d9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9ubWF0cml4ZHluYW1pY1wiO1xyXG5leHBvcnQge1N1cnZleVByb2dyZXNzfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RTdXJ2ZXlQcm9ncmVzc1wiO1xyXG5leHBvcnQge1N1cnZleVF1ZXN0aW9uUmF0aW5nfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbnJhdGluZ1wiO1xyXG5leHBvcnQge1N1cnZleVdpbmRvd30gZnJvbSBcIi4uL3JlYWN0L3JlYWN0U3VydmV5V2luZG93XCI7XHJcbmV4cG9ydCB7UmVhY3RRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiOyAvLyBUT0RPIG5lZWQgdG8gcmVtb3ZlIHNvbWVkYXlcclxuZXhwb3J0IHtSZWFjdFF1ZXN0aW9uRmFjdG9yeSBhcyBRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xyXG5cclxuZXhwb3J0IHtfX2V4dGVuZHN9IGZyb20gXCIuLi9leHRlbmRzXCI7XHJcblxyXG4vL1VuY29tbWVudCB0byBpbmNsdWRlIHRoZSBcImRhdGVcIiBxdWVzdGlvbiB0eXBlLlxyXG4vL2V4cG9ydCB7ZGVmYXVsdCBhcyBTdXJ2ZXlRdWVzdGlvbkRhdGV9IGZyb20gXCIuLi9wbHVnaW5zL3JlYWN0L3JlYWN0cXVlc3Rpb25kYXRlXCI7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvZW50cmllcy9yZWFjdC50c1xuICoqLyIsImV4cG9ydCB7XHJcbiAgICBBbnN3ZXJDb3VudFZhbGlkYXRvciwgRW1haWxWYWxpZGF0b3IsIE51bWVyaWNWYWxpZGF0b3IsIFJlZ2V4VmFsaWRhdG9yLFxyXG4gICAgU3VydmV5VmFsaWRhdG9yLCBUZXh0VmFsaWRhdG9yLCBWYWxpZGF0b3JSZXN1bHQsIFZhbGlkYXRvclJ1bm5lclxyXG59IGZyb20gXCIuLi8uLi92YWxpZGF0b3JcIjtcclxuZXhwb3J0IHtCYXNlLCBFdmVudCwgSXRlbVZhbHVlLCBTdXJ2ZXlFcnJvciwgSVN1cnZleX0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcclxuZXhwb3J0IHtDaG9pY2VzUmVzdGZ1bGx9IGZyb20gXCIuLi8uLi9jaG9pY2VzUmVzdGZ1bGxcIjtcclxuZXhwb3J0IHtDb25kaXRpb24sIENvbmRpdGlvbk5vZGUsIENvbmRpdGlvblJ1bm5lcn0gZnJvbSBcIi4uLy4uL2NvbmRpdGlvbnNcIjtcclxuZXhwb3J0IHtDb25kaXRpb25zUGFyc2VyfSBmcm9tIFwiLi4vLi4vY29uZGl0aW9uc1BhcnNlclwiO1xyXG5leHBvcnQge1Byb2Nlc3NWYWx1ZX0gZnJvbSBcIi4uLy4uL2NvbmRpdGlvblByb2Nlc3NWYWx1ZVwiO1xyXG5leHBvcnQge0N1c3RvbUVycm9yLCBFeGNlZWRTaXplRXJyb3IsIFJlcXVyZU51bWVyaWNFcnJvcn0gZnJvbSBcIi4uLy4uL2Vycm9yXCI7XHJcbmV4cG9ydCB7XHJcbiAgICBKc29uRXJyb3IsIEpzb25JbmNvcnJlY3RUeXBlRXJyb3IsIEpzb25NZXRhZGF0YSwgSnNvbk1ldGFkYXRhQ2xhc3MsXHJcbiAgICBKc29uTWlzc2luZ1R5cGVFcnJvciwgSnNvbk1pc3NpbmdUeXBlRXJyb3JCYXNlLCBKc29uT2JqZWN0LCBKc29uT2JqZWN0UHJvcGVydHksXHJcbiAgICBKc29uUmVxdWlyZWRQcm9wZXJ0eUVycm9yLCBKc29uVW5rbm93blByb3BlcnR5RXJyb3JcclxufSBmcm9tIFwiLi4vLi4vanNvbm9iamVjdFwiO1xyXG5leHBvcnQge1xyXG4gICAgTWF0cml4RHJvcGRvd25DZWxsLCBNYXRyaXhEcm9wZG93bkNvbHVtbiwgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXHJcbiAgICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlXHJcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZVwiO1xyXG5leHBvcnQge01hdHJpeERyb3Bkb3duUm93TW9kZWwsIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duXCI7XHJcbmV4cG9ydCB7TWF0cml4RHluYW1pY1Jvd01vZGVsLCBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX21hdHJpeGR5bmFtaWNcIjtcclxuZXhwb3J0IHtNYXRyaXhSb3dNb2RlbCwgUXVlc3Rpb25NYXRyaXhNb2RlbH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX21hdHJpeFwiO1xyXG5leHBvcnQge011bHRpcGxlVGV4dEl0ZW1Nb2RlbCwgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX211bHRpcGxldGV4dFwiO1xyXG5leHBvcnQge1BhZ2VNb2RlbCwgUXVlc3Rpb25Sb3dNb2RlbH0gZnJvbSBcIi4uLy4uL3BhZ2VcIjtcclxuZXhwb3J0IHtRdWVzdGlvbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uXCI7XHJcbmV4cG9ydCB7UXVlc3Rpb25CYXNlfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25iYXNlXCI7XHJcbmV4cG9ydCB7UXVlc3Rpb25DaGVja2JveEJhc2UsIFF1ZXN0aW9uU2VsZWN0QmFzZX0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcclxuZXhwb3J0IHtRdWVzdGlvbkNoZWNrYm94TW9kZWx9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9jaGVja2JveFwiO1xyXG5leHBvcnQge1F1ZXN0aW9uQ29tbWVudE1vZGVsfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fY29tbWVudFwiO1xyXG5leHBvcnQgeyBRdWVzdGlvbkRyb3Bkb3duTW9kZWx9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9kcm9wZG93blwiO1xyXG5leHBvcnQge1F1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xyXG5leHBvcnQge1F1ZXN0aW9uRmlsZU1vZGVsfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fZmlsZVwiO1xyXG5leHBvcnQge1F1ZXN0aW9uSHRtbE1vZGVsfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25faHRtbFwiO1xyXG5leHBvcnQge1F1ZXN0aW9uUmFkaW9ncm91cE1vZGVsfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fcmFkaW9ncm91cFwiO1xyXG5leHBvcnQge1F1ZXN0aW9uUmF0aW5nTW9kZWx9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9yYXRpbmdcIjtcclxuZXhwb3J0IHtRdWVzdGlvblRleHRNb2RlbH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX3RleHRcIjtcclxuZXhwb3J0IHtTdXJ2ZXlNb2RlbH0gZnJvbSBcIi4uLy4uL3N1cnZleVwiO1xyXG5leHBvcnQge1xyXG4gICAgU3VydmV5VHJpZ2dlciwgU3VydmV5VHJpZ2dlckNvbXBsZXRlLCBTdXJ2ZXlUcmlnZ2VyU2V0VmFsdWUsIFN1cnZleVRyaWdnZXJWaXNpYmxlLFxyXG4gICAgVHJpZ2dlclxyXG59IGZyb20gXCIuLi8uLi90cmlnZ2VyXCI7XHJcbmV4cG9ydCB7U3VydmV5V2luZG93TW9kZWx9IGZyb20gXCIuLi8uLi9zdXJ2ZXlXaW5kb3dcIjtcclxuZXhwb3J0IHtUZXh0UHJlUHJvY2Vzc29yfSBmcm9tIFwiLi4vLi4vdGV4dFByZVByb2Nlc3NvclwiO1xyXG5cclxuZXhwb3J0IHtkeFN1cnZleVNlcnZpY2V9IGZyb20gXCIuLi8uLi9keFN1cnZleVNlcnZpY2VcIjtcclxuZXhwb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb24sIHN1cnZleVN0cmluZ3N9IGZyb20gXCIuLi8uLi9zdXJ2ZXlTdHJpbmdzXCI7XHJcblxyXG4vL1VuY29tbWVudCB0byBpbmNsdWRlIHRoZSBcImRhdGVcIiBxdWVzdGlvbiB0eXBlLlxyXG4vL2V4cG9ydCB7ZGVmYXVsdCBhcyBRdWVzdGlvbkRhdGVNb2RlbH0gZnJvbSBcIi4uLy4uL3BsdWdpbnMvcXVlc3Rpb25fZGF0ZVwiO1xuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2VudHJpZXMvY2h1bmtzL21vZGVsLnRzXG4gKiovIiwiaW1wb3J0IHtCYXNlLCBTdXJ2ZXlFcnJvcn0gZnJvbSBcIi4vYmFzZVwiO1xyXG5pbXBvcnQge0N1c3RvbUVycm9yLCBSZXF1cmVOdW1lcmljRXJyb3J9IGZyb20gXCIuL2Vycm9yXCI7XHJcbmltcG9ydCB7c3VydmV5TG9jYWxpemF0aW9ufSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XHJcbmltcG9ydCB7SnNvbk9iamVjdH0gZnJvbSAnLi9qc29ub2JqZWN0JztcclxuXHJcbmV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSZXN1bHQge1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBhbnksIHB1YmxpYyBlcnJvcjogU3VydmV5RXJyb3IgPSBudWxsKSB7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTdXJ2ZXlWYWxpZGF0b3IgZXh0ZW5kcyBCYXNlIHtcclxuICAgIHB1YmxpYyB0ZXh0OiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBnZXRFcnJvclRleHQobmFtZTogc3RyaW5nKSA6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKHRoaXMudGV4dCkgcmV0dXJuIHRoaXMudGV4dDtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXREZWZhdWx0RXJyb3JUZXh0KG5hbWUpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyB2YWxpZGF0ZSh2YWx1ZTogYW55LCBuYW1lOiBzdHJpbmcgPSBudWxsKTogVmFsaWRhdG9yUmVzdWx0IHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIElWYWxpZGF0b3JPd25lciB7XHJcbiAgICB2YWxpZGF0b3JzOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+O1xyXG4gICAgdmFsdWU6IGFueTtcclxuICAgIGdldFZhbGlkYXRvclRpdGxlKCk6IHN0cmluZztcclxufVxyXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yUnVubmVyIHtcclxuICAgIHB1YmxpYyBydW4ob3duZXI6IElWYWxpZGF0b3JPd25lcik6IFN1cnZleUVycm9yIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG93bmVyLnZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHZhbGlkYXRvclJlc3VsdCA9IG93bmVyLnZhbGlkYXRvcnNbaV0udmFsaWRhdGUob3duZXIudmFsdWUsIG93bmVyLmdldFZhbGlkYXRvclRpdGxlKCkpO1xyXG4gICAgICAgICAgICBpZiAodmFsaWRhdG9yUmVzdWx0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3JSZXN1bHQuZXJyb3IpIHJldHVybiB2YWxpZGF0b3JSZXN1bHQuZXJyb3I7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yUmVzdWx0LnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3duZXIudmFsdWUgPSB2YWxpZGF0b3JSZXN1bHQudmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOdW1lcmljVmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtaW5WYWx1ZTogbnVtYmVyID0gbnVsbCwgcHVibGljIG1heFZhbHVlOiBudW1iZXIgPSBudWxsKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7IHJldHVybiBcIm51bWVyaWN2YWxpZGF0b3JcIjsgfVxyXG4gICAgcHVibGljIHZhbGlkYXRlKHZhbHVlOiBhbnksIG5hbWU6IHN0cmluZyA9IG51bGwpOiBWYWxpZGF0b3JSZXN1bHQge1xyXG4gICAgICAgIGlmICghdmFsdWUgfHwgIXRoaXMuaXNOdW1iZXIodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KG51bGwsIG5ldyBSZXF1cmVOdW1lcmljRXJyb3IoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgVmFsaWRhdG9yUmVzdWx0KHBhcnNlRmxvYXQodmFsdWUpKTtcclxuICAgICAgICBpZiAodGhpcy5taW5WYWx1ZSAmJiB0aGlzLm1pblZhbHVlID4gcmVzdWx0LnZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvciA9IG5ldyBDdXN0b21FcnJvcih0aGlzLmdldEVycm9yVGV4dChuYW1lKSk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm1heFZhbHVlICYmIHRoaXMubWF4VmFsdWUgPCByZXN1bHQudmFsdWUpIHtcclxuICAgICAgICAgICAgcmVzdWx0LmVycm9yID0gbmV3IEN1c3RvbUVycm9yKHRoaXMuZ2V0RXJyb3JUZXh0KG5hbWUpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSA/IG51bGwgOiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdEVycm9yVGV4dChuYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgdk5hbWUgPSBuYW1lID8gbmFtZSA6IFwidmFsdWVcIjtcclxuICAgICAgICBpZiAodGhpcy5taW5WYWx1ZSAmJiB0aGlzLm1heFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibnVtZXJpY01pbk1heFwiKVtcImZvcm1hdFwiXSh2TmFtZSwgdGhpcy5taW5WYWx1ZSwgdGhpcy5tYXhWYWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubWluVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibnVtZXJpY01pblwiKVtcImZvcm1hdFwiXSh2TmFtZSwgdGhpcy5taW5WYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJudW1lcmljTWF4XCIpW1wiZm9ybWF0XCJdKHZOYW1lLCB0aGlzLm1heFZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGlzTnVtYmVyKHZhbHVlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KHZhbHVlKSkgJiYgaXNGaW5pdGUodmFsdWUpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVGV4dFZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWluTGVuZ3RoOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7IHJldHVybiBcInRleHR2YWxpZGF0b3JcIjsgfVxyXG4gICAgcHVibGljIHZhbGlkYXRlKHZhbHVlOiBhbnksIG5hbWU6IHN0cmluZyA9IG51bGwpOiBWYWxpZGF0b3JSZXN1bHQge1xyXG4gICAgICAgIGlmICh0aGlzLm1pbkxlbmd0aCA8PSAwKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IHRoaXMubWluTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KG51bGwsIG5ldyBDdXN0b21FcnJvcih0aGlzLmdldEVycm9yVGV4dChuYW1lKSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwidGV4dE1pbkxlbmd0aFwiKVtcImZvcm1hdFwiXSh0aGlzLm1pbkxlbmd0aCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBBbnN3ZXJDb3VudFZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWluQ291bnQ6IG51bWJlciA9IG51bGwsIHB1YmxpYyBtYXhDb3VudDogbnVtYmVyID0gbnVsbCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcgeyByZXR1cm4gXCJhbnN3ZXJjb3VudHZhbGlkYXRvclwiOyB9XHJcbiAgICBwdWJsaWMgdmFsaWRhdGUodmFsdWU6IGFueSwgbmFtZTogc3RyaW5nID0gbnVsbCk6IFZhbGlkYXRvclJlc3VsdCB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuY29uc3RydWN0b3IgIT0gQXJyYXkpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHZhciBjb3VudCA9IHZhbHVlLmxlbmd0aDtcclxuICAgICAgICBpZiAodGhpcy5taW5Db3VudCAmJiBjb3VudCA8IHRoaXMubWluQ291bnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQobnVsbCwgbmV3IEN1c3RvbUVycm9yKHRoaXMuZ2V0RXJyb3JUZXh0KHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtaW5TZWxlY3RFcnJvclwiKVtcImZvcm1hdFwiXSh0aGlzLm1pbkNvdW50KSkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubWF4Q291bnQgJiYgY291bnQgPiB0aGlzLm1heENvdW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KG51bGwsIG5ldyBDdXN0b21FcnJvcih0aGlzLmdldEVycm9yVGV4dChzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibWF4U2VsZWN0RXJyb3JcIilbXCJmb3JtYXRcIl0odGhpcy5tYXhDb3VudCkpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSZWdleFZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVnZXg6IHN0cmluZyA9IG51bGwpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIFwicmVnZXh2YWxpZGF0b3JcIjsgfVxyXG4gICAgcHVibGljIHZhbGlkYXRlKHZhbHVlOiBhbnksIG5hbWU6IHN0cmluZyA9IG51bGwpOiBWYWxpZGF0b3JSZXN1bHQge1xyXG4gICAgICAgIGlmICghdGhpcy5yZWdleCB8fCAhdmFsdWUpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHZhciByZSA9IG5ldyBSZWdFeHAodGhpcy5yZWdleCk7XHJcbiAgICAgICAgaWYgKHJlLnRlc3QodmFsdWUpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdCh2YWx1ZSwgbmV3IEN1c3RvbUVycm9yKHRoaXMuZ2V0RXJyb3JUZXh0KG5hbWUpKSk7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIEVtYWlsVmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcclxuICAgIHByaXZhdGUgcmUgPSAvXigoW148PigpXFxbXFxdXFwuLDs6XFxzQFxcXCJdKyhcXC5bXjw+KClcXFtcXF1cXC4sOzpcXHNAXFxcIl0rKSopfChcXFwiLitcXFwiKSlAKChbXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdK1xcLikrW148PigpW1xcXVxcLiw7Olxcc0BcXFwiXXsyLH0pJC9pO1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7IHJldHVybiBcImVtYWlsdmFsaWRhdG9yXCI7IH1cclxuICAgIHB1YmxpYyB2YWxpZGF0ZSh2YWx1ZTogYW55LCBuYW1lOiBzdHJpbmcgPSBudWxsKTogVmFsaWRhdG9yUmVzdWx0IHtcclxuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5yZS50ZXN0KHZhbHVlKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQodmFsdWUsIG5ldyBDdXN0b21FcnJvcih0aGlzLmdldEVycm9yVGV4dChuYW1lKSkpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJpbnZhbGlkRW1haWxcIik7XHJcbiAgICB9XHJcbn1cclxuXHJcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJzdXJ2ZXl2YWxpZGF0b3JcIiwgW1widGV4dFwiXSk7XHJcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJudW1lcmljdmFsaWRhdG9yXCIsIFtcIm1pblZhbHVlOm51bWJlclwiLCBcIm1heFZhbHVlOm51bWJlclwiXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE51bWVyaWNWYWxpZGF0b3IoKTsgfSwgXCJzdXJ2ZXl2YWxpZGF0b3JcIik7XHJcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJ0ZXh0dmFsaWRhdG9yXCIsIFtcIm1pbkxlbmd0aDpudW1iZXJcIl0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBUZXh0VmFsaWRhdG9yKCk7IH0sIFwic3VydmV5dmFsaWRhdG9yXCIpO1xyXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwiYW5zd2VyY291bnR2YWxpZGF0b3JcIiwgW1wibWluQ291bnQ6bnVtYmVyXCIsIFwibWF4Q291bnQ6bnVtYmVyXCJdLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgQW5zd2VyQ291bnRWYWxpZGF0b3IoKTsgfSwgXCJzdXJ2ZXl2YWxpZGF0b3JcIik7XHJcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJyZWdleHZhbGlkYXRvclwiLCBbXCJyZWdleFwiXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFJlZ2V4VmFsaWRhdG9yKCk7IH0sIFwic3VydmV5dmFsaWRhdG9yXCIpO1xyXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwiZW1haWx2YWxpZGF0b3JcIiwgW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBFbWFpbFZhbGlkYXRvcigpOyB9LCBcInN1cnZleXZhbGlkYXRvclwiKTtcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy92YWxpZGF0b3IudHNcbiAqKi8iLCJleHBvcnQgZnVuY3Rpb24gX19leHRlbmRzIChkLCBiKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcclxuICAgIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF9fZXh0ZW5kcztcclxufVxyXG5cclxuZXhwb3J0cy5fX2V4dGVuZHMgPSBfX2V4dGVuZHM7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvZXh0ZW5kcy50c1xuICoqLyIsImV4cG9ydCBpbnRlcmZhY2UgSGFzaFRhYmxlPFQ+IHtcclxuICAgIFtrZXk6IHN0cmluZ106IFQ7XHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5RGF0YSB7XHJcbiAgICBnZXRWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnk7XHJcbiAgICBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpO1xyXG4gICAgZ2V0Q29tbWVudChuYW1lOiBzdHJpbmcpOiBzdHJpbmc7XHJcbiAgICBzZXRDb21tZW50KG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZyk7XHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5IGV4dGVuZHMgSVN1cnZleURhdGEge1xyXG4gICAgY3VycmVudFBhZ2U6IElQYWdlO1xyXG4gICAgcGFnZVZpc2liaWxpdHlDaGFuZ2VkKHBhZ2U6IElQYWdlLCBuZXdWYWx1ZTogYm9vbGVhbik7XHJcbiAgICBxdWVzdGlvblZpc2liaWxpdHlDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG5ld1ZhbHVlOiBib29sZWFuKTtcclxuICAgIHF1ZXN0aW9uQWRkZWQocXVlc3Rpb246IElRdWVzdGlvbiwgaW5kZXg6IG51bWJlcik7XHJcbiAgICBxdWVzdGlvblJlbW92ZWQocXVlc3Rpb246IElRdWVzdGlvbik7XHJcbiAgICB2YWxpZGF0ZVF1ZXN0aW9uKG5hbWU6IHN0cmluZyk6IFN1cnZleUVycm9yO1xyXG4gICAgcHJvY2Vzc0h0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nO1xyXG4gICAgcHJvY2Vzc1RleHQodGV4dDogc3RyaW5nKTogc3RyaW5nO1xyXG4gICAgaXNEZXNpZ25Nb2RlOiBib29sZWFuO1xyXG4gICAgcmVxdWlyZWRUZXh0OiBzdHJpbmc7XHJcbiAgICBxdWVzdGlvblN0YXJ0SW5kZXg6IHN0cmluZztcclxuICAgIHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZTogc3RyaW5nO1xyXG4gICAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IGJvb2xlYW47XHJcbiAgICB1cGxvYWRGaWxlKG5hbWU6IHN0cmluZywgZmlsZTogRmlsZSwgc3RvcmVEYXRhQXNUZXh0OiBib29sZWFuLCB1cGxvYWRpbmdDYWxsYmFjazogKHN0YXR1czogc3RyaW5nKSA9PiBhbnkpOiBib29sZWFuO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUNvbmRpdGlvblJ1bm5lciB7XHJcbiAgICBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55Pik7XHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBJUXVlc3Rpb24gZXh0ZW5kcyBJQ29uZGl0aW9uUnVubmVyIHtcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIHZpc2libGU6IGJvb2xlYW47XHJcbiAgICBoYXNUaXRsZTogYm9vbGVhbjtcclxuICAgIHNldFZpc2libGVJbmRleCh2YWx1ZTogbnVtYmVyKTtcclxuICAgIG9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBhbnkpO1xyXG4gICAgb25TdXJ2ZXlMb2FkKCk7XHJcbiAgICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpOiBib29sZWFuO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgSVBhZ2UgZXh0ZW5kcyBJQ29uZGl0aW9uUnVubmVyIHtcclxuICAgIHZpc2libGU6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBJdGVtVmFsdWUge1xyXG4gICAgcHVibGljIHN0YXRpYyBTZXBhcmF0b3IgPSAnfCc7XHJcbiAgICBwdWJsaWMgc3RhdGljIHNldERhdGEoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sIHZhbHVlczogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIGl0ZW1zLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVzW2ldO1xyXG4gICAgICAgICAgICB2YXIgaXRlbSA9IG5ldyBJdGVtVmFsdWUobnVsbCk7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHZhbHVlLnZhbHVlKSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgIHZhciBleGNlcHRpb24gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUuZ2V0VHlwZSkgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlLmdldFR5cGUoKSA9PSAnaXRlbXZhbHVlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLml0ZW1WYWx1ZSA9IHZhbHVlLml0ZW1WYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLml0ZW1UZXh0ID0gdmFsdWUuaXRlbVRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gSXRlbVZhbHVlLml0ZW1WYWx1ZVByb3A7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBJdGVtVmFsdWUuY29weUF0dHJpYnV0ZXModmFsdWUsIGl0ZW0sIGV4Y2VwdGlvbik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldERhdGEoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4pOiBhbnkge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtID0gaXRlbXNbaV07XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmhhc1RleHQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgdmFsdWU6IGl0ZW0udmFsdWUsIHRleHQ6IGl0ZW0udGV4dCB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0udmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldEl0ZW1CeVZhbHVlKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LCB2YWw6IGFueSk6IEl0ZW1WYWx1ZSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKyspIHtcclxuICAgICAgICAgICAgaWYgKGl0ZW1zW2ldLnZhbHVlID09IHZhbCkgcmV0dXJuIGl0ZW1zW2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHByaXZhdGUgc3RhdGljIGl0ZW1WYWx1ZVByb3AgPSBbIFwidGV4dFwiLCBcInZhbHVlXCIsIFwiaGFzVGV4dFwiXTtcclxuICAgIHByaXZhdGUgc3RhdGljIGNvcHlBdHRyaWJ1dGVzKHNyYzogYW55LCBkZXN0OiBhbnksIGV4Y2VwdG9uczogQXJyYXk8c3RyaW5nPikge1xyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzcmMpIHtcclxuICAgICAgICAgICAgaWYgKCh0eXBlb2Ygc3JjW2tleV0gPT0gJ2Z1bmN0aW9uJykpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAoZXhjZXB0b25zICYmIGV4Y2VwdG9ucy5pbmRleE9mKGtleSkgPiAtMSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGRlc3Rba2V5XSA9IHNyY1trZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgaXRlbVZhbHVlOiBhbnk7XHJcbiAgICBwcml2YXRlIGl0ZW1UZXh0OiBzdHJpbmc7XHJcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogYW55LCB0ZXh0OiBzdHJpbmcgPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcclxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcgeyByZXR1cm4gXCJpdGVtdmFsdWVcIjsgfVxyXG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkgeyByZXR1cm4gdGhpcy5pdGVtVmFsdWU7IH1cclxuICAgIHB1YmxpYyBzZXQgdmFsdWUobmV3VmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuaXRlbVZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICAgICAgaWYgKCF0aGlzLml0ZW1WYWx1ZSkgcmV0dXJuO1xyXG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IHRoaXMuaXRlbVZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgdmFyIGluZGV4ID0gc3RyLmluZGV4T2YoSXRlbVZhbHVlLlNlcGFyYXRvcik7XHJcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5pdGVtVmFsdWUgPSBzdHIuc2xpY2UoMCwgaW5kZXgpO1xyXG4gICAgICAgICAgICB0aGlzLnRleHQgPSBzdHIuc2xpY2UoaW5kZXggKyAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGhhc1RleHQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLml0ZW1UZXh0ID8gdHJ1ZSA6IGZhbHNlOyB9XHJcbiAgICBwdWJsaWMgZ2V0IHRleHQoKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAodGhpcy5oYXNUZXh0KSByZXR1cm4gdGhpcy5pdGVtVGV4dDtcclxuICAgICAgICBpZiAodGhpcy52YWx1ZSkgcmV0dXJuIHRoaXMudmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdGV4dChuZXdUZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLml0ZW1UZXh0ID0gbmV3VGV4dDtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEJhc2Uge1xyXG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgbWV0aG9kIGlzIGFic3RyYWN0Jyk7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFN1cnZleUVycm9yIHtcclxuICAgIHB1YmxpYyBnZXRUZXh0KCk6IHN0cmluZyB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBpcyBhYnN0cmFjdCcpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgU3VydmV5UGFnZUlkID0gXCJzcV9wYWdlXCI7XHJcbmV4cG9ydCBjbGFzcyBTdXJ2ZXlFbGVtZW50IHtcclxuICAgIHB1YmxpYyBzdGF0aWMgU2Nyb2xsRWxlbWVudFRvVG9wKGVsZW1lbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCFlbGVtZW50SWQpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xyXG4gICAgICAgIGlmICghZWwgfHwgIWVsLnNjcm9sbEludG9WaWV3KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgdmFyIGVsZW1Ub3AgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XHJcbiAgICAgICAgaWYgKGVsZW1Ub3AgPCAwKSAgZWwuc2Nyb2xsSW50b1ZpZXcoKTtcclxuICAgICAgICByZXR1cm4gZWxlbVRvcCA8IDA7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc3RhdGljIEZvY3VzRWxlbWVudChlbGVtZW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghZWxlbWVudElkKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTtcclxuICAgICAgICBpZiAoZWwpIHtcclxuICAgICAgICAgICAgZWwuZm9jdXMoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEV2ZW50PFQgZXh0ZW5kcyBGdW5jdGlvbiwgT3B0aW9ucz4gIHtcclxuICAgIHByaXZhdGUgY2FsbGJhY2tzOiBBcnJheTxUPjtcclxuICAgIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuY2FsbGJhY2tzID09IG51bGwgfHwgdGhpcy5jYWxsYmFja3MubGVuZ3RoID09IDA7IH1cclxuICAgIHB1YmxpYyBmaXJlKHNlbmRlcjogYW55LCBvcHRpb25zOiBPcHRpb25zKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzID09IG51bGwpIHJldHVybjtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2FsbGJhY2tzLmxlbmd0aDsgaSArKykge1xyXG4gICAgICAgICAgICB2YXIgY2FsbFJlc3VsdCA9IHRoaXMuY2FsbGJhY2tzW2ldKHNlbmRlciwgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBhZGQoZnVuYzogVCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNhbGxiYWNrcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IEFycmF5PFQ+KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goZnVuYyk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgcmVtb3ZlKGZ1bmM6IFQpIHtcclxuICAgICAgICBpZiAodGhpcy5jYWxsYmFja3MgPT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuY2FsbGJhY2tzLmluZGV4T2YoZnVuYywgMCk7XHJcbiAgICAgICAgaWYgKGluZGV4ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2Jhc2UudHNcbiAqKi8iLCJpbXBvcnQge3N1cnZleUxvY2FsaXphdGlvbn0gZnJvbSAnLi9zdXJ2ZXlTdHJpbmdzJztcclxuaW1wb3J0IHtTdXJ2ZXlFcnJvcn0gZnJvbSBcIi4vYmFzZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEFuc3dlclJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpICB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXRUZXh0KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZXF1aXJlZEVycm9yXCIpO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBjbGFzcyBSZXF1cmVOdW1lcmljRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFRleHQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm51bWVyaWNFcnJvclwiKTtcclxuICAgIH1cclxufVxyXG5leHBvcnQgY2xhc3MgRXhjZWVkU2l6ZUVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xyXG4gICAgcHJpdmF0ZSBtYXhTaXplOiBudW1iZXI7XHJcbiAgICBjb25zdHJ1Y3RvcihtYXhTaXplOiBudW1iZXIpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMubWF4U2l6ZSA9IG1heFNpemU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0VGV4dCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiZXhjZWVkTWF4U2l6ZVwiKVtcImZvcm1hdFwiXSh0aGlzLmdldFRleHRTaXplKCkpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBnZXRUZXh0U2l6ZSgpIHtcclxuICAgICAgICB2YXIgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ107XHJcbiAgICAgICAgdmFyIGZpeGVkID0gWzAsIDAsIDIsIDMsIDNdO1xyXG4gICAgICAgIGlmICh0aGlzLm1heFNpemUgPT0gMCkgcmV0dXJuICcwIEJ5dGUnO1xyXG4gICAgICAgIHZhciBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyh0aGlzLm1heFNpemUpIC8gTWF0aC5sb2coMTAyNCkpO1xyXG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMubWF4U2l6ZSAvIE1hdGgucG93KDEwMjQsIGkpO1xyXG4gICAgICAgIHJldHVybiB2YWx1ZS50b0ZpeGVkKGZpeGVkW2ldKSArICcgJyArIHNpemVzW2ldO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XHJcbiAgICBwcml2YXRlIHRleHQ6IHN0cmluZztcclxuICAgIGNvbnN0cnVjdG9yKHRleHQ6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXRUZXh0KCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dDtcclxuICAgIH1cclxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2Vycm9yLnRzXG4gKiovIiwiZXhwb3J0IHZhciBzdXJ2ZXlMb2NhbGl6YXRpb24gPSB7XHJcbiAgICBjdXJyZW50TG9jYWxlOiBcIlwiLFxyXG4gICAgbG9jYWxlczoge30sXHJcbiAgICBnZXRTdHJpbmc6IGZ1bmN0aW9uIChzdHJOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgbG9jID0gdGhpcy5jdXJyZW50TG9jYWxlID8gdGhpcy5sb2NhbGVzW3RoaXMuY3VycmVudExvY2FsZV0gOiBzdXJ2ZXlTdHJpbmdzO1xyXG4gICAgICAgIGlmICghbG9jIHx8ICFsb2Nbc3RyTmFtZV0pIGxvYyA9IHN1cnZleVN0cmluZ3M7XHJcbiAgICAgICAgcmV0dXJuIGxvY1tzdHJOYW1lXTtcclxuICAgIH0sXHJcbiAgICBnZXRMb2NhbGVzOiBmdW5jdGlvbiAoKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICAgICAgdmFyIHJlcyA9IFtdO1xyXG4gICAgICAgIHJlcy5wdXNoKFwiXCIpO1xyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmxvY2FsZXMpIHtcclxuICAgICAgICAgICAgcmVzLnB1c2goa2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzLnNvcnQoKTtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG59O1xyXG5leHBvcnQgdmFyIHN1cnZleVN0cmluZ3MgPSB7XHJcbiAgICBwYWdlUHJldlRleHQ6IFwiUHJldmlvdXNcIixcclxuICAgIHBhZ2VOZXh0VGV4dDogXCJOZXh0XCIsXHJcbiAgICBjb21wbGV0ZVRleHQ6IFwiQ29tcGxldGVcIixcclxuICAgIG90aGVySXRlbVRleHQ6IFwiT3RoZXIgKGRlc2NyaWJlKVwiLFxyXG4gICAgcHJvZ3Jlc3NUZXh0OiBcIlBhZ2UgezB9IG9mIHsxfVwiLFxyXG4gICAgZW1wdHlTdXJ2ZXk6IFwiVGhlcmUgaXMgbm8gdmlzaWJsZSBwYWdlIG9yIHF1ZXN0aW9uIGluIHRoZSBzdXJ2ZXkuXCIsXHJcbiAgICBjb21wbGV0aW5nU3VydmV5OiBcIlRoYW5rIHlvdSBmb3IgY29tcGxldGluZyB0aGUgc3VydmV5IVwiLFxyXG4gICAgbG9hZGluZ1N1cnZleTogXCJTdXJ2ZXkgaXMgbG9hZGluZy4uLlwiLFxyXG4gICAgb3B0aW9uc0NhcHRpb246IFwiQ2hvb3NlLi4uXCIsXHJcbiAgICByZXF1aXJlZEVycm9yOiBcIlBsZWFzZSBhbnN3ZXIgdGhlIHF1ZXN0aW9uLlwiLFxyXG4gICAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJQbGVhc2UgYW5zd2VyIHF1ZXN0aW9ucyBpbiBhbGwgcm93cy5cIixcclxuICAgIG51bWVyaWNFcnJvcjogXCJUaGUgdmFsdWUgc2hvdWxkIGJlIG51bWVyaWMuXCIsXHJcbiAgICB0ZXh0TWluTGVuZ3RoOiBcIlBsZWFzZSBlbnRlciBhdCBsZWFzdCB7MH0gc3ltYm9scy5cIixcclxuICAgIG1pblJvd0NvdW50RXJyb3I6IFwiUGxlYXNlIGZpbGwgaW4gYXQgbGVhc3QgezB9IHJvd3MuXCIsXHJcbiAgICBtaW5TZWxlY3RFcnJvcjogXCJQbGVhc2Ugc2VsZWN0IGF0IGxlYXN0IHswfSB2YXJpYW50cy5cIixcclxuICAgIG1heFNlbGVjdEVycm9yOiBcIlBsZWFzZSBzZWxlY3Qgbm8gbW9yZSB0aGFuIHswfSB2YXJpYW50cy5cIixcclxuICAgIG51bWVyaWNNaW5NYXg6IFwiVGhlICd7MH0nIHNob3VsZCBiZSBlcXVhbCBvciBtb3JlIHRoYW4gezF9IGFuZCBlcXVhbCBvciBsZXNzIHRoYW4gezJ9XCIsXHJcbiAgICBudW1lcmljTWluOiBcIlRoZSAnezB9JyBzaG91bGQgYmUgZXF1YWwgb3IgbW9yZSB0aGFuIHsxfVwiLFxyXG4gICAgbnVtZXJpY01heDogXCJUaGUgJ3swfScgc2hvdWxkIGJlIGVxdWFsIG9yIGxlc3MgdGhhbiB7MX1cIixcclxuICAgIGludmFsaWRFbWFpbDogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlLW1haWwgYWRkcmVzcy5cIixcclxuICAgIHVybFJlcXVlc3RFcnJvcjogXCJUaGUgcmVxdWVzdCByZXR1cm5lZCBlcnJvciAnezB9Jy4gezF9XCIsXHJcbiAgICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwiVGhlIHJlcXVlc3QgcmV0dXJuZWQgZW1wdHkgZGF0YSBvciB0aGUgJ3BhdGgnIHByb3BlcnR5IGlzIGluY29ycmVjdFwiLFxyXG4gICAgZXhjZWVkTWF4U2l6ZTogXCJUaGUgZmlsZSBzaXplIHNob3VsZCBub3QgZXhjZWVkIHswfS5cIixcclxuICAgIG90aGVyUmVxdWlyZWRFcnJvcjogXCJQbGVhc2UgZW50ZXIgdGhlIG90aGVyIHZhbHVlLlwiLFxyXG4gICAgdXBsb2FkaW5nRmlsZTogXCJZb3VyIGZpbGUgaXMgdXBsb2FkaW5nLiBQbGVhc2Ugd2FpdCBzZXZlcmFsIHNlY29uZHMgYW5kIHRyeSBhZ2Fpbi5cIixcclxuICAgIGFkZFJvdzogXCJBZGQgcm93XCIsXHJcbiAgICByZW1vdmVSb3c6IFwiUmVtb3ZlXCJcclxufTtcclxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJlblwiXSA9IHN1cnZleVN0cmluZ3M7XHJcblxyXG5pZiAoIVN0cmluZy5wcm90b3R5cGVbXCJmb3JtYXRcIl0pIHtcclxuICAgIFN0cmluZy5wcm90b3R5cGVbXCJmb3JtYXRcIl0gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZSgveyhcXGQrKX0vZywgZnVuY3Rpb24gKG1hdGNoLCBudW1iZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmdzW251bWJlcl0gIT0gJ3VuZGVmaW5lZCdcclxuICAgICAgICAgICAgICAgID8gYXJnc1tudW1iZXJdXHJcbiAgICAgICAgICAgICAgICA6IG1hdGNoXHJcbiAgICAgICAgICAgICAgICA7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvc3VydmV5U3RyaW5ncy50c1xuICoqLyIsImltcG9ydCB7SGFzaFRhYmxlfSBmcm9tICcuL2Jhc2UnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEpzb25PYmplY3RQcm9wZXJ0eSB7XHJcbiAgICBwcml2YXRlIHR5cGVWYWx1ZTogc3RyaW5nID0gbnVsbDtcclxuICAgIHByaXZhdGUgY2hvaWNlc1ZhbHVlOiBBcnJheTxhbnk+ID0gbnVsbDtcclxuICAgIHByaXZhdGUgY2hvaWNlc2Z1bmM6ICgpID0+IEFycmF5PGFueT4gPSBudWxsO1xyXG4gICAgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nID0gbnVsbDtcclxuICAgIHB1YmxpYyBjbGFzc05hbWVQYXJ0OiBzdHJpbmcgPSBudWxsO1xyXG4gICAgcHVibGljIGJhc2VDbGFzc05hbWU6IHN0cmluZyA9IG51bGw7XHJcbiAgICBwdWJsaWMgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsO1xyXG4gICAgcHVibGljIG9uR2V0VmFsdWU6IChvYmo6IGFueSkgPT4gYW55ID0gbnVsbDtcclxuICAgIHB1YmxpYyBvblNldFZhbHVlOiAob2JqOiBhbnksIHZhbHVlOiBhbnksIGpzb25Db252OiBKc29uT2JqZWN0KSA9PiBhbnlcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMudHlwZVZhbHVlID8gdGhpcy50eXBlVmFsdWUgOiBcInN0cmluZ1wiOyB9XHJcbiAgICBwdWJsaWMgc2V0IHR5cGUodmFsdWU6IHN0cmluZykgeyB0aGlzLnR5cGVWYWx1ZSA9IHZhbHVlOyB9XHJcbiAgICBwdWJsaWMgZ2V0IGhhc1RvVXNlR2V0VmFsdWUoKSB7IHJldHVybiB0aGlzLm9uR2V0VmFsdWU7IH1cclxuICAgIHB1YmxpYyBpc0RlZmF1bHRWYWx1ZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmRlZmF1bHRWYWx1ZSkgPyAodGhpcy5kZWZhdWx0VmFsdWUgPT0gdmFsdWUpIDogISh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0VmFsdWUob2JqOiBhbnkpOiBhbnkge1xyXG4gICAgICAgIGlmICh0aGlzLm9uR2V0VmFsdWUpIHJldHVybiB0aGlzLm9uR2V0VmFsdWUob2JqKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgaGFzVG9Vc2VTZXRWYWx1ZSgpIHsgcmV0dXJuIHRoaXMub25TZXRWYWx1ZTsgfVxyXG4gICAgcHVibGljIHNldFZhbHVlKG9iajogYW55LCB2YWx1ZTogYW55LCBqc29uQ29udjogSnNvbk9iamVjdCkge1xyXG4gICAgICAgIGlmICh0aGlzLm9uU2V0VmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5vblNldFZhbHVlKG9iaiwgdmFsdWUsIGpzb25Db252KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0T2JqVHlwZShvYmpUeXBlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoIXRoaXMuY2xhc3NOYW1lUGFydCkgcmV0dXJuIG9ialR5cGU7XHJcbiAgICAgICAgcmV0dXJuIG9ialR5cGUucmVwbGFjZSh0aGlzLmNsYXNzTmFtZVBhcnQsIFwiXCIpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldENsYXNzTmFtZShjbGFzc05hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLmNsYXNzTmFtZVBhcnQgJiYgY2xhc3NOYW1lLmluZGV4T2YodGhpcy5jbGFzc05hbWVQYXJ0KSA8IDApID8gY2xhc3NOYW1lICsgdGhpcy5jbGFzc05hbWVQYXJ0IDogY2xhc3NOYW1lO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBjaG9pY2VzKCk6IEFycmF5PGFueT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmNob2ljZXNWYWx1ZSAhPSBudWxsKSByZXR1cm4gdGhpcy5jaG9pY2VzVmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hvaWNlc2Z1bmMgIT0gbnVsbCkgcmV0dXJuIHRoaXMuY2hvaWNlc2Z1bmMoKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXRDaG9pY2VzKHZhbHVlOiBBcnJheTxhbnk+LCB2YWx1ZUZ1bmM6ICgpID0+IEFycmF5PGFueT4pIHtcclxuICAgICAgICB0aGlzLmNob2ljZXNWYWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuY2hvaWNlc2Z1bmMgPSB2YWx1ZUZ1bmM7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIEpzb25NZXRhZGF0YUNsYXNzIHtcclxuICAgIHN0YXRpYyByZXF1aXJlZFN5bWJvbCA9ICchJztcclxuICAgIHN0YXRpYyB0eXBlU3ltYm9sID0gJzonO1xyXG4gICAgcHJvcGVydGllczogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiA9IG51bGw7XHJcbiAgICByZXF1aXJlZFByb3BlcnRpZXM6IEFycmF5PHN0cmluZz4gPSBudWxsO1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHJvcGVydGllczogQXJyYXk8YW55PiwgcHVibGljIGNyZWF0b3I6ICgpID0+IGFueSA9IG51bGwsIHB1YmxpYyBwYXJlbnROYW1lOiBzdHJpbmcgPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gbmV3IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4oKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHByb3AgPSB0aGlzLmNyZWF0ZVByb3BlcnR5KHByb3BlcnRpZXNbaV0pO1xyXG4gICAgICAgICAgICBpZiAocHJvcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1c2gocHJvcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZmluZChuYW1lOiBzdHJpbmcpOiBKc29uT2JqZWN0UHJvcGVydHkge1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BlcnRpZXNbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzW2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBjcmVhdGVQcm9wZXJ0eShwcm9wSW5mbzogYW55KTogSnNvbk9iamVjdFByb3BlcnR5IHtcclxuICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gdHlwZW9mIHByb3BJbmZvID09PSBcInN0cmluZ1wiID8gcHJvcEluZm8gOiBwcm9wSW5mby5uYW1lO1xyXG4gICAgICAgIGlmICghcHJvcGVydHlOYW1lKSByZXR1cm47XHJcbiAgICAgICAgdmFyIHByb3BlcnR5VHlwZSA9IG51bGw7XHJcbiAgICAgICAgdmFyIHR5cGVJbmRleCA9IHByb3BlcnR5TmFtZS5pbmRleE9mKEpzb25NZXRhZGF0YUNsYXNzLnR5cGVTeW1ib2wpO1xyXG4gICAgICAgIGlmICh0eXBlSW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICBwcm9wZXJ0eVR5cGUgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKHR5cGVJbmRleCArIDEpO1xyXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIHR5cGVJbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0UHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7XHJcbiAgICAgICAgdmFyIHByb3AgPSBuZXcgSnNvbk9iamVjdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7XHJcbiAgICAgICAgaWYgKHByb3BlcnR5VHlwZSkge1xyXG4gICAgICAgICAgICBwcm9wLnR5cGUgPSBwcm9wZXJ0eVR5cGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgcHJvcEluZm8gPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgaWYgKHByb3BJbmZvLnR5cGUpIHtcclxuICAgICAgICAgICAgICAgIHByb3AudHlwZSA9IHByb3BJbmZvLnR5cGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHByb3BJbmZvLmRlZmF1bHQpIHtcclxuICAgICAgICAgICAgICAgIHByb3AuZGVmYXVsdFZhbHVlID0gcHJvcEluZm8uZGVmYXVsdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAocHJvcEluZm8uaXNSZXF1aXJlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUHJvcGVydHlSZXF1aXJlZChwcm9wLm5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcm9wSW5mby5jaG9pY2VzKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2hvaWNlc0Z1bmMgPSB0eXBlb2YgcHJvcEluZm8uY2hvaWNlcyA9PT0gXCJmdW5jdGlvblwiID8gcHJvcEluZm8uY2hvaWNlcyA6IG51bGw7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2hvaWNlc1ZhbHVlID0gdHlwZW9mIHByb3BJbmZvLmNob2ljZXMgIT09IFwiZnVuY3Rpb25cIiA/IHByb3BJbmZvLmNob2ljZXMgOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgcHJvcC5zZXRDaG9pY2VzKGNob2ljZXNWYWx1ZSwgY2hvaWNlc0Z1bmMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcm9wSW5mby5vbkdldFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9wLm9uR2V0VmFsdWUgPSBwcm9wSW5mby5vbkdldFZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcm9wSW5mby5vblNldFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9wLm9uU2V0VmFsdWUgPSBwcm9wSW5mby5vblNldFZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcm9wSW5mby5jbGFzc05hbWUpIHtcclxuICAgICAgICAgICAgICAgIHByb3AuY2xhc3NOYW1lID0gcHJvcEluZm8uY2xhc3NOYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcm9wSW5mby5iYXNlQ2xhc3NOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9wLmJhc2VDbGFzc05hbWUgPSBwcm9wSW5mby5iYXNlQ2xhc3NOYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcm9wSW5mby5jbGFzc05hbWVQYXJ0KSB7XHJcbiAgICAgICAgICAgICAgICBwcm9wLmNsYXNzTmFtZVBhcnQgPSBwcm9wSW5mby5jbGFzc05hbWVQYXJ0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm9wO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBnZXRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChwcm9wZXJ0eU5hbWUubGVuZ3RoID09IDAgfHwgcHJvcGVydHlOYW1lWzBdICE9IEpzb25NZXRhZGF0YUNsYXNzLnJlcXVpcmVkU3ltYm9sKSByZXR1cm4gcHJvcGVydHlOYW1lO1xyXG4gICAgICAgIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5zbGljZSgxKTtcclxuICAgICAgICB0aGlzLm1ha2VQcm9wZXJ0eVJlcXVpcmVkKHByb3BlcnR5TmFtZSk7XHJcbiAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgbWFrZVByb3BlcnR5UmVxdWlyZWQocHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVxdWlyZWRQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVxdWlyZWRQcm9wZXJ0aWVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZXF1aXJlZFByb3BlcnRpZXMucHVzaChwcm9wZXJ0eU5hbWUpO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBjbGFzcyBKc29uTWV0YWRhdGEge1xyXG4gICAgcHJpdmF0ZSBjbGFzc2VzOiBIYXNoVGFibGU8SnNvbk1ldGFkYXRhQ2xhc3M+ID0ge307XHJcbiAgICBwcml2YXRlIGNoaWxkcmVuQ2xhc3NlczogSGFzaFRhYmxlPEFycmF5PEpzb25NZXRhZGF0YUNsYXNzPj4gPSB7fTtcclxuICAgIHByaXZhdGUgY2xhc3NQcm9wZXJ0aWVzOiBIYXNoVGFibGU8QXJyYXk8SnNvbk9iamVjdFByb3BlcnR5Pj4gPSB7fTtcclxuICAgIHByaXZhdGUgY2xhc3NSZXF1aXJlZFByb3BlcnRpZXM6IEhhc2hUYWJsZTxBcnJheTxzdHJpbmc+PiA9IHt9O1xyXG4gICAgcHVibGljIGFkZENsYXNzKG5hbWU6IHN0cmluZywgcHJvcGVydGllczogQXJyYXk8YW55PiwgY3JlYXRvcjogKCkgPT4gYW55ID0gbnVsbCwgcGFyZW50TmFtZTogc3RyaW5nID0gbnVsbCk6IEpzb25NZXRhZGF0YUNsYXNzIHtcclxuICAgICAgICB2YXIgbWV0YURhdGFDbGFzcyA9IG5ldyBKc29uTWV0YWRhdGFDbGFzcyhuYW1lLCBwcm9wZXJ0aWVzLCBjcmVhdG9yLCBwYXJlbnROYW1lKTtcclxuICAgICAgICB0aGlzLmNsYXNzZXNbbmFtZV0gPSBtZXRhRGF0YUNsYXNzO1xyXG4gICAgICAgIGlmIChwYXJlbnROYW1lKSB7XHJcbiAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5DbGFzc2VzW3BhcmVudE5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIWNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuQ2xhc3Nlc1twYXJlbnROYW1lXSA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW5DbGFzc2VzW3BhcmVudE5hbWVdLnB1c2gobWV0YURhdGFDbGFzcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtZXRhRGF0YUNsYXNzO1xyXG4gICAgfVxyXG4gICAgcHVibGljIG92ZXJyaWRlQ2xhc3NDcmVhdG9yZShuYW1lOiBzdHJpbmcsIGNyZWF0b3I6ICgpID0+IGFueSkge1xyXG4gICAgICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MobmFtZSk7XHJcbiAgICAgICAgaWYgKG1ldGFEYXRhQ2xhc3MpIHtcclxuICAgICAgICAgICAgbWV0YURhdGFDbGFzcy5jcmVhdG9yID0gY3JlYXRvcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0UHJvcGVydGllcyhuYW1lOiBzdHJpbmcpOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcclxuICAgICAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuY2xhc3NQcm9wZXJ0aWVzW25hbWVdO1xyXG4gICAgICAgIGlmICghcHJvcGVydGllcykge1xyXG4gICAgICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4oKTtcclxuICAgICAgICAgICAgdGhpcy5maWxsUHJvcGVydGllcyhuYW1lLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgICAgICAgdGhpcy5jbGFzc1Byb3BlcnRpZXNbbmFtZV0gPSBwcm9wZXJ0aWVzO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcclxuICAgIH1cclxuICAgIHB1YmxpYyBjcmVhdGVDbGFzcyhuYW1lOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MobmFtZSk7XHJcbiAgICAgICAgaWYgKCFtZXRhRGF0YUNsYXNzKSByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gbWV0YURhdGFDbGFzcy5jcmVhdG9yKCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0Q2hpbGRyZW5DbGFzc2VzKG5hbWU6IHN0cmluZywgY2FuQmVDcmVhdGVkOiBib29sZWFuID0gZmFsc2UpOiBBcnJheTxKc29uTWV0YWRhdGFDbGFzcz4ge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcclxuICAgICAgICB0aGlzLmZpbGxDaGlsZHJlbkNsYXNzZXMobmFtZSwgY2FuQmVDcmVhdGVkLCByZXN1bHQpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKG5hbWU6IHN0cmluZyk6IEFycmF5PHN0cmluZz4ge1xyXG4gICAgICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5jbGFzc1JlcXVpcmVkUHJvcGVydGllc1tuYW1lXTtcclxuICAgICAgICBpZiAoIXByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgcHJvcGVydGllcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsbFJlcXVpcmVkUHJvcGVydGllcyhuYW1lLCBwcm9wZXJ0aWVzKTtcclxuICAgICAgICAgICAgdGhpcy5jbGFzc1JlcXVpcmVkUHJvcGVydGllc1tuYW1lXSA9IHByb3BlcnRpZXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFkZFByb3BlcnR5KGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wZXJ0eUluZm86IGFueSkge1xyXG4gICAgICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKTtcclxuICAgICAgICBpZiAoIW1ldGFEYXRhQ2xhc3MpIHJldHVybjtcclxuICAgICAgICB2YXIgcHJvcGVydHkgPSBtZXRhRGF0YUNsYXNzLmNyZWF0ZVByb3BlcnR5KHByb3BlcnR5SW5mbyk7XHJcbiAgICAgICAgaWYgKHByb3BlcnR5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkUHJvcGVydHlUb0NsYXNzKG1ldGFEYXRhQ2xhc3MsIHByb3BlcnR5KTtcclxuICAgICAgICAgICAgdGhpcy5lbXB0eUNsYXNzUHJvcGVydGllc0hhc2gobWV0YURhdGFDbGFzcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIHJlbW92ZVByb3BlcnR5KGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKTtcclxuICAgICAgICBpZiAoIW1ldGFEYXRhQ2xhc3MpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB2YXIgcHJvcGVydHkgPSBtZXRhRGF0YUNsYXNzLmZpbmQocHJvcGVydHlOYW1lKTtcclxuICAgICAgICBpZiAocHJvcGVydHkpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVQcm9wZXJ0eUZyb21DbGFzcyhtZXRhRGF0YUNsYXNzLCBwcm9wZXJ0eSk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1wdHlDbGFzc1Byb3BlcnRpZXNIYXNoKG1ldGFEYXRhQ2xhc3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgYWRkUHJvcGVydHlUb0NsYXNzKG1ldGFEYXRhQ2xhc3M6IEpzb25NZXRhZGF0YUNsYXNzLCBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5KSB7XHJcbiAgICAgICAgaWYgKG1ldGFEYXRhQ2xhc3MuZmluZChwcm9wZXJ0eS5uYW1lKSAhPSBudWxsKSByZXR1cm47XHJcbiAgICAgICAgbWV0YURhdGFDbGFzcy5wcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSByZW1vdmVQcm9wZXJ0eUZyb21DbGFzcyhtZXRhRGF0YUNsYXNzOiBKc29uTWV0YWRhdGFDbGFzcywgcHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eSkge1xyXG4gICAgICAgIHZhciBpbmRleCA9IG1ldGFEYXRhQ2xhc3MucHJvcGVydGllcy5pbmRleE9mKHByb3BlcnR5KTtcclxuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XHJcbiAgICAgICAgbWV0YURhdGFDbGFzcy5wcm9wZXJ0aWVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgaWYgKG1ldGFEYXRhQ2xhc3MucmVxdWlyZWRQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gbWV0YURhdGFDbGFzcy5yZXF1aXJlZFByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eS5uYW1lKTtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgICAgIG1ldGFEYXRhQ2xhc3MucmVxdWlyZWRQcm9wZXJ0aWVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGVtcHR5Q2xhc3NQcm9wZXJ0aWVzSGFzaChtZXRhRGF0YUNsYXNzOiBKc29uTWV0YWRhdGFDbGFzcykge1xyXG4gICAgICAgIHRoaXMuY2xhc3NQcm9wZXJ0aWVzW21ldGFEYXRhQ2xhc3MubmFtZV0gPSBudWxsO1xyXG4gICAgICAgIHZhciBjaGlsZENsYXNzZXMgPSB0aGlzLmdldENoaWxkcmVuQ2xhc3NlcyhtZXRhRGF0YUNsYXNzLm5hbWUpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDbGFzc2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xhc3NQcm9wZXJ0aWVzW2NoaWxkQ2xhc3Nlc1tpXS5uYW1lXSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBmaWxsQ2hpbGRyZW5DbGFzc2VzKG5hbWU6IHN0cmluZywgY2FuQmVDcmVhdGVkOiBib29sZWFuLCByZXN1bHQ6IEFycmF5PEpzb25NZXRhZGF0YUNsYXNzPikge1xyXG4gICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5DbGFzc2VzW25hbWVdO1xyXG4gICAgICAgIGlmICghY2hpbGRyZW4pIHJldHVybjtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICghY2FuQmVDcmVhdGVkIHx8IGNoaWxkcmVuW2ldLmNyZWF0b3IpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkcmVuW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmZpbGxDaGlsZHJlbkNsYXNzZXMoY2hpbGRyZW5baV0ubmFtZSwgY2FuQmVDcmVhdGVkLCByZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgZmluZENsYXNzKG5hbWU6IHN0cmluZyk6IEpzb25NZXRhZGF0YUNsYXNzIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jbGFzc2VzW25hbWVdO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBmaWxsUHJvcGVydGllcyhuYW1lOiBzdHJpbmcsIGxpc3Q6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4pIHtcclxuICAgICAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKG5hbWUpO1xyXG4gICAgICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuO1xyXG4gICAgICAgIGlmIChtZXRhRGF0YUNsYXNzLnBhcmVudE5hbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5maWxsUHJvcGVydGllcyhtZXRhRGF0YUNsYXNzLnBhcmVudE5hbWUsIGxpc3QpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1ldGFEYXRhQ2xhc3MucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFByb3BlcnR5Q29yZShtZXRhRGF0YUNsYXNzLnByb3BlcnRpZXNbaV0sIGxpc3QsIGxpc3QubGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGFkZFByb3BlcnR5Q29yZShwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5LCBsaXN0OiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+LCBlbmRJbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIGluZGV4ID0gLTE7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbmRJbmRleDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChsaXN0W2ldLm5hbWUgPT0gcHJvcGVydHkubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgaW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGluZGV4IDwgMCkge1xyXG4gICAgICAgICAgICBsaXN0LnB1c2gocHJvcGVydHkpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGlzdFtpbmRleF0gPSBwcm9wZXJ0eTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGZpbGxSZXF1aXJlZFByb3BlcnRpZXMobmFtZTogc3RyaW5nLCBsaXN0OiBBcnJheTxzdHJpbmc+KSB7XHJcbiAgICAgICAgdmFyIG1ldGFEYXRhQ2xhc3MgPSB0aGlzLmZpbmRDbGFzcyhuYW1lKTtcclxuICAgICAgICBpZiAoIW1ldGFEYXRhQ2xhc3MpIHJldHVybjtcclxuICAgICAgICBpZiAobWV0YURhdGFDbGFzcy5yZXF1aXJlZFByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkobGlzdCwgbWV0YURhdGFDbGFzcy5yZXF1aXJlZFByb3BlcnRpZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobWV0YURhdGFDbGFzcy5wYXJlbnROYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsbFJlcXVpcmVkUHJvcGVydGllcyhtZXRhRGF0YUNsYXNzLnBhcmVudE5hbWUsIGxpc3QpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5leHBvcnQgY2xhc3MgSnNvbkVycm9yIHtcclxuICAgIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBhdDogTnVtYmVyID0gLTE7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdHlwZTogc3RyaW5nLCBwdWJsaWMgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0RnVsbERlc2NyaXB0aW9uKCkgOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2UgKyAodGhpcy5kZXNjcmlwdGlvbiA/IFwiXFxuXCIgKyB0aGlzLmRlc2NyaXB0aW9uIDogXCJcIik7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIEpzb25Vbmtub3duUHJvcGVydHlFcnJvciBleHRlbmRzIEpzb25FcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHB1YmxpYyBjbGFzc05hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKFwidW5rbm93bnByb3BlcnR5XCIsIFwiVGhlIHByb3BlcnR5ICdcIiArIHByb3BlcnR5TmFtZSArIFwiJyBpbiBjbGFzcyAnXCIgKyBjbGFzc05hbWUgKyBcIicgaXMgdW5rbm93bi5cIik7XHJcbiAgICAgICAgdmFyIHByb3BlcnRpZXMgPSBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldFByb3BlcnRpZXMoY2xhc3NOYW1lKTtcclxuICAgICAgICBpZiAocHJvcGVydGllcykge1xyXG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gXCJUaGUgbGlzdCBvZiBhdmFpbGFibGUgcHJvcGVydGllcyBhcmU6IFwiO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChpID4gMCkgdGhpcy5kZXNjcmlwdGlvbiArPSBcIiwgXCI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uICs9IHByb3BlcnRpZXNbaV0ubmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uICs9ICcuJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIEpzb25NaXNzaW5nVHlwZUVycm9yQmFzZSBleHRlbmRzIEpzb25FcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgYmFzZUNsYXNzTmFtZTogc3RyaW5nLCBwdWJsaWMgdHlwZTogc3RyaW5nLCBwdWJsaWMgbWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIodHlwZSwgbWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IFwiVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgYXZhaWxhYmxlOiBcIjtcclxuICAgICAgICB2YXIgdHlwZXMgPSBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldENoaWxkcmVuQ2xhc3NlcyhiYXNlQ2xhc3NOYW1lLCB0cnVlKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChpID4gMCkgdGhpcy5kZXNjcmlwdGlvbiArPSBcIiwgXCI7XHJcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gKz0gXCInXCIgKyB0eXBlc1tpXS5uYW1lICsgXCInXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gKz0gXCIuXCI7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIEpzb25NaXNzaW5nVHlwZUVycm9yIGV4dGVuZHMgSnNvbk1pc3NpbmdUeXBlRXJyb3JCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIGJhc2VDbGFzc05hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKGJhc2VDbGFzc05hbWUsIFwibWlzc2luZ3R5cGVwcm9wZXJ0eVwiLCBcIlRoZSBwcm9wZXJ0eSB0eXBlIGlzIG1pc3NpbmcgaW4gdGhlIG9iamVjdC4gUGxlYXNlIHRha2UgYSBsb29rIGF0IHByb3BlcnR5OiAnXCIgKyBwcm9wZXJ0eU5hbWUgKyBcIicuXCIpO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBjbGFzcyBKc29uSW5jb3JyZWN0VHlwZUVycm9yIGV4dGVuZHMgSnNvbk1pc3NpbmdUeXBlRXJyb3JCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIGJhc2VDbGFzc05hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKGJhc2VDbGFzc05hbWUsIFwiaW5jb3JyZWN0dHlwZXByb3BlcnR5XCIsIFwiVGhlIHByb3BlcnR5IHR5cGUgaXMgaW5jb3JyZWN0IGluIHRoZSBvYmplY3QuIFBsZWFzZSB0YWtlIGEgbG9vayBhdCBwcm9wZXJ0eTogJ1wiICsgcHJvcGVydHlOYW1lICsgXCInLlwiKTtcclxuICAgIH1cclxufVxyXG5leHBvcnQgY2xhc3MgSnNvblJlcXVpcmVkUHJvcGVydHlFcnJvciBleHRlbmRzIEpzb25FcnJvciB7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHB1YmxpYyBjbGFzc05hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKFwicmVxdWlyZWRwcm9wZXJ0eVwiLCBcIlRoZSBwcm9wZXJ0eSAnXCIgKyBwcm9wZXJ0eU5hbWUgKyBcIicgaXMgcmVxdWlyZWQgaW4gY2xhc3MgJ1wiICsgY2xhc3NOYW1lICsgXCInLlwiKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEpzb25PYmplY3Qge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgdHlwZVByb3BlcnR5TmFtZSA9IFwidHlwZVwiO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcG9zaXRpb25Qcm9wZXJ0eU5hbWUgPSBcInBvc1wiO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbWV0YURhdGFWYWx1ZSA9IG5ldyBKc29uTWV0YWRhdGEoKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IG1ldGFEYXRhKCkgeyByZXR1cm4gSnNvbk9iamVjdC5tZXRhRGF0YVZhbHVlOyB9XHJcbiAgICBwdWJsaWMgZXJyb3JzID0gbmV3IEFycmF5PEpzb25FcnJvcj4oKTtcclxuICAgIHB1YmxpYyB0b0pzb25PYmplY3Qob2JqOiBhbnkpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRvSnNvbk9iamVjdENvcmUob2JqLCBudWxsKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyB0b09iamVjdChqc29uT2JqOiBhbnksIG9iajogYW55KSB7XHJcbiAgICAgICAgaWYgKCFqc29uT2JqKSByZXR1cm47XHJcbiAgICAgICAgdmFyIHByb3BlcnRpZXMgPSBudWxsO1xyXG4gICAgICAgIGlmIChvYmouZ2V0VHlwZSkge1xyXG4gICAgICAgICAgICBwcm9wZXJ0aWVzID0gSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRQcm9wZXJ0aWVzKG9iai5nZXRUeXBlKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXByb3BlcnRpZXMpIHJldHVybjtcclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4ganNvbk9iaikge1xyXG4gICAgICAgICAgICBpZiAoa2V5ID09IEpzb25PYmplY3QudHlwZVByb3BlcnR5TmFtZSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmIChrZXkgPT0gSnNvbk9iamVjdC5wb3NpdGlvblByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgICAgICAgICAgb2JqW2tleV0gPSBqc29uT2JqW2tleV07XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgcHJvcGVydHkgPSB0aGlzLmZpbmRQcm9wZXJ0eShwcm9wZXJ0aWVzLCBrZXkpO1xyXG4gICAgICAgICAgICBpZiAoIXByb3BlcnR5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZE5ld0Vycm9yKG5ldyBKc29uVW5rbm93blByb3BlcnR5RXJyb3Ioa2V5LnRvU3RyaW5nKCksIG9iai5nZXRUeXBlKCkpLCBqc29uT2JqKTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVUb09iaihqc29uT2JqW2tleV0sIG9iaiwga2V5LCBwcm9wZXJ0eSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHRvSnNvbk9iamVjdENvcmUob2JqOiBhbnksIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHkpOiBhbnkge1xyXG4gICAgICAgIGlmICghb2JqLmdldFR5cGUpIHJldHVybiBvYmo7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsICYmICghcHJvcGVydHkuY2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgICByZXN1bHRbSnNvbk9iamVjdC50eXBlUHJvcGVydHlOYW1lXSA9IHByb3BlcnR5LmdldE9ialR5cGUob2JqLmdldFR5cGUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBwcm9wZXJ0aWVzID0gSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRQcm9wZXJ0aWVzKG9iai5nZXRUeXBlKCkpO1xyXG4gICAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVUb0pzb24ob2JqLCByZXN1bHQsIHByb3BlcnRpZXNbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHZhbHVlVG9Kc29uKG9iajogYW55LCByZXN1bHQ6IGFueSwgcHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eSkge1xyXG4gICAgICAgIHZhciB2YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHByb3BlcnR5Lmhhc1RvVXNlR2V0VmFsdWUpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eS5nZXRWYWx1ZShvYmopO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gb2JqW3Byb3BlcnR5Lm5hbWVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgICAgIGlmIChwcm9wZXJ0eS5pc0RlZmF1bHRWYWx1ZSh2YWx1ZSkpIHJldHVybjtcclxuICAgICAgICBpZiAodGhpcy5pc1ZhbHVlQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHZhciBhcnJWYWx1ZSA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBhcnJWYWx1ZS5wdXNoKHRoaXMudG9Kc29uT2JqZWN0Q29yZSh2YWx1ZVtpXSwgcHJvcGVydHkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YWx1ZSA9IGFyclZhbHVlLmxlbmd0aCA+IDAgPyBhcnJWYWx1ZSA6IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnRvSnNvbk9iamVjdENvcmUodmFsdWUsIHByb3BlcnR5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFwcm9wZXJ0eS5pc0RlZmF1bHRWYWx1ZSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgcmVzdWx0W3Byb3BlcnR5Lm5hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHZhbHVlVG9PYmoodmFsdWU6IGFueSwgb2JqOiBhbnksIGtleTogYW55LCBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5KSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjtcclxuICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCAmJiBwcm9wZXJ0eS5oYXNUb1VzZVNldFZhbHVlKSB7XHJcbiAgICAgICAgICAgIHByb3BlcnR5LnNldFZhbHVlKG9iaiwgdmFsdWUsIHRoaXMpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmlzVmFsdWVBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZVRvQXJyYXkodmFsdWUsIG9iaiwga2V5LCBwcm9wZXJ0eSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG5ld09iaiA9IHRoaXMuY3JlYXRlTmV3T2JqKHZhbHVlLCBwcm9wZXJ0eSk7XHJcbiAgICAgICAgaWYgKG5ld09iai5uZXdPYmopIHtcclxuICAgICAgICAgICAgdGhpcy50b09iamVjdCh2YWx1ZSwgbmV3T2JqLm5ld09iaik7XHJcbiAgICAgICAgICAgIHZhbHVlID0gbmV3T2JqLm5ld09iajtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFuZXdPYmouZXJyb3IpIHtcclxuICAgICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGlzVmFsdWVBcnJheSh2YWx1ZTogYW55KTogYm9vbGVhbiB7IHJldHVybiB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci50b1N0cmluZygpLmluZGV4T2YoXCJBcnJheVwiKSA+IC0xOyB9XHJcbiAgICBwcml2YXRlIGNyZWF0ZU5ld09iaih2YWx1ZTogYW55LCBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5KTogYW55IHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0geyBuZXdPYmo6IG51bGwsIGVycm9yOiBudWxsIH07XHJcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IHZhbHVlW0pzb25PYmplY3QudHlwZVByb3BlcnR5TmFtZV07XHJcbiAgICAgICAgaWYgKCFjbGFzc05hbWUgJiYgcHJvcGVydHkgIT0gbnVsbCAmJiBwcm9wZXJ0eS5jbGFzc05hbWUpIHtcclxuICAgICAgICAgICAgY2xhc3NOYW1lID0gcHJvcGVydHkuY2xhc3NOYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjbGFzc05hbWUgPSBwcm9wZXJ0eS5nZXRDbGFzc05hbWUoY2xhc3NOYW1lKTtcclxuICAgICAgICByZXN1bHQubmV3T2JqID0gKGNsYXNzTmFtZSkgPyBKc29uT2JqZWN0Lm1ldGFEYXRhLmNyZWF0ZUNsYXNzKGNsYXNzTmFtZSkgOiBudWxsO1xyXG4gICAgICAgIHJlc3VsdC5lcnJvciA9IHRoaXMuY2hlY2tOZXdPYmplY3RPbkVycm9ycyhyZXN1bHQubmV3T2JqLCB2YWx1ZSwgcHJvcGVydHksIGNsYXNzTmFtZSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHByaXZhdGUgY2hlY2tOZXdPYmplY3RPbkVycm9ycyhuZXdPYmo6IGFueSwgdmFsdWU6IGFueSwgcHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eSwgY2xhc3NOYW1lOiBzdHJpbmcpOiBKc29uRXJyb3Ige1xyXG4gICAgICAgIHZhciBlcnJvciA9IG51bGw7XHJcbiAgICAgICAgaWYgKG5ld09iaikge1xyXG4gICAgICAgICAgICB2YXIgcmVxdWlyZWRQcm9wZXJ0aWVzID0gSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRSZXF1aXJlZFByb3BlcnRpZXMoY2xhc3NOYW1lKTtcclxuICAgICAgICAgICAgaWYgKHJlcXVpcmVkUHJvcGVydGllcykge1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXF1aXJlZFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlW3JlcXVpcmVkUHJvcGVydGllc1tpXV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgSnNvblJlcXVpcmVkUHJvcGVydHlFcnJvcihyZXF1aXJlZFByb3BlcnRpZXNbaV0sIGNsYXNzTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5iYXNlQ2xhc3NOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXNzTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IEpzb25NaXNzaW5nVHlwZUVycm9yKHByb3BlcnR5Lm5hbWUsIHByb3BlcnR5LmJhc2VDbGFzc05hbWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBKc29uSW5jb3JyZWN0VHlwZUVycm9yKHByb3BlcnR5Lm5hbWUsIHByb3BlcnR5LmJhc2VDbGFzc05hbWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aGlzLmFkZE5ld0Vycm9yKGVycm9yLCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBlcnJvcjtcclxuICAgIH1cclxuICAgIHByaXZhdGUgYWRkTmV3RXJyb3IoZXJyb3I6IEpzb25FcnJvciwganNvbk9iajogYW55KSB7XHJcbiAgICAgICAgaWYgKGpzb25PYmogJiYganNvbk9ialtKc29uT2JqZWN0LnBvc2l0aW9uUHJvcGVydHlOYW1lXSkge1xyXG4gICAgICAgICAgICBlcnJvci5hdCA9IGpzb25PYmpbSnNvbk9iamVjdC5wb3NpdGlvblByb3BlcnR5TmFtZV0uc3RhcnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSB2YWx1ZVRvQXJyYXkodmFsdWU6IEFycmF5PGFueT4sIG9iajogYW55LCBrZXk6IGFueSwgcHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc1ZhbHVlQXJyYXkob2JqW2tleV0pKSB7XHJcbiAgICAgICAgICAgIG9ialtrZXldID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdPYmoodmFsdWVbaV0sIHByb3BlcnR5KTtcclxuICAgICAgICAgICAgaWYgKG5ld1ZhbHVlLm5ld09iaikge1xyXG4gICAgICAgICAgICAgICAgb2JqW2tleV0ucHVzaChuZXdWYWx1ZS5uZXdPYmopO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b09iamVjdCh2YWx1ZVtpXSwgbmV3VmFsdWUubmV3T2JqKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghbmV3VmFsdWUuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBvYmpba2V5XS5wdXNoKHZhbHVlW2ldKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgZmluZFByb3BlcnR5KHByb3BlcnRpZXM6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4sIGtleTogYW55KTogSnNvbk9iamVjdFByb3BlcnR5IHtcclxuICAgICAgICBpZiAoIXByb3BlcnRpZXMpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAocHJvcGVydGllc1tpXS5uYW1lID09IGtleSkgcmV0dXJuIHByb3BlcnRpZXNbaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvanNvbm9iamVjdC50c1xuICoqLyIsImltcG9ydCB7QmFzZSwgSXRlbVZhbHVlLCBTdXJ2ZXlFcnJvcn0gZnJvbSBcIi4vYmFzZVwiO1xyXG5pbXBvcnQge0pzb25PYmplY3R9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcclxuaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcclxuaW1wb3J0IHtDdXN0b21FcnJvcn0gZnJvbSBcIi4vZXJyb3JcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDaG9pY2VzUmVzdGZ1bGwgZXh0ZW5kcyBCYXNlIHtcclxuICAgIHB1YmxpYyB1cmw6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgcGF0aDogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyB2YWx1ZU5hbWU6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgdGl0bGVOYW1lOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIGdldFJlc3VsdENhbGxiYWNrOiAoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4pID0+IHZvaWQ7XHJcbiAgICBwdWJsaWMgZXJyb3I6IFN1cnZleUVycm9yID0gbnVsbDtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgcnVuKCkge1xyXG4gICAgICAgIGlmICghdGhpcy51cmwgfHwgIXRoaXMuZ2V0UmVzdWx0Q2FsbGJhY2spIHJldHVybjtcclxuICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcclxuICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIHRoaXMudXJsKTtcclxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICAgICAgICAgIHNlbGYub25Mb2FkKEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLm9uRXJyb3IoeGhyLnN0YXR1c1RleHQsIHhoci5yZXNwb25zZVRleHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB4aHIuc2VuZCgpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIFwiY2hvaWNlc0J5VXJsXCI7IH1cclxuICAgIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMudXJsICYmICF0aGlzLnBhdGggJiYgIXRoaXMudmFsdWVOYW1lICYmICF0aGlzLnRpdGxlTmFtZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXREYXRhKGpzb246IGFueSkge1xyXG4gICAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgICBpZiAoanNvbi51cmwpIHRoaXMudXJsID0ganNvbi51cmw7XHJcbiAgICAgICAgaWYgKGpzb24ucGF0aCkgdGhpcy5wYXRoID0ganNvbi5wYXRoO1xyXG4gICAgICAgIGlmIChqc29uLnZhbHVlTmFtZSkgdGhpcy52YWx1ZU5hbWUgPSBqc29uLnZhbHVlTmFtZTtcclxuICAgICAgICBpZiAoanNvbi50aXRsZU5hbWUpIHRoaXMudGl0bGVOYW1lID0ganNvbi50aXRsZU5hbWU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgY2xlYXIoKSB7XHJcbiAgICAgICAgdGhpcy51cmwgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMucGF0aCA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy52YWx1ZU5hbWUgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMudGl0bGVOYW1lID0gXCJcIjtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBvbkxvYWQocmVzdWx0OiBhbnkpIHtcclxuICAgICAgICB2YXIgaXRlbXMgPSBbXTtcclxuICAgICAgICByZXN1bHQgPSB0aGlzLmdldFJlc3VsdEFmdGVyUGF0aChyZXN1bHQpO1xyXG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0W1wibGVuZ3RoXCJdKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgaXRlbVZhbHVlID0gcmVzdWx0W2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpdGVtVmFsdWUpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZShpdGVtVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHRpdGxlID0gdGhpcy5nZXRUaXRsZShpdGVtVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgaXRlbXMucHVzaChuZXcgSXRlbVZhbHVlKHZhbHVlLCB0aXRsZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IG5ldyBDdXN0b21FcnJvcihzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwidXJsR2V0Q2hvaWNlc0Vycm9yXCIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nZXRSZXN1bHRDYWxsYmFjayhpdGVtcyk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIG9uRXJyb3Ioc3RhdHVzOiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmVycm9yID0gbmV3IEN1c3RvbUVycm9yKHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ1cmxSZXF1ZXN0RXJyb3JcIilbXCJmb3JtYXRcIl0oc3RhdHVzLCByZXNwb25zZSkpO1xyXG4gICAgICAgIHRoaXMuZ2V0UmVzdWx0Q2FsbGJhY2soW10pO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBnZXRSZXN1bHRBZnRlclBhdGgocmVzdWx0OiBhbnkpIHtcclxuICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICBpZiAoIXRoaXMucGF0aCkgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB2YXIgcGF0aGVzID0gdGhpcy5nZXRQYXRoZXMoKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHRbcGF0aGVzW2ldXTtcclxuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBnZXRQYXRoZXMoKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICAgICAgdmFyIHBhdGhlcyA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLnBhdGguaW5kZXhPZignOycpID4gLTEpIHtcclxuICAgICAgICAgICAgcGF0aGVzID0gdGhpcy5wYXRoLnNwbGl0KCc7Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGF0aGVzID0gdGhpcy5wYXRoLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwYXRoZXMubGVuZ3RoID09IDApIHBhdGhlcy5wdXNoKHRoaXMucGF0aCk7XHJcbiAgICAgICAgcmV0dXJuIHBhdGhlcztcclxuICAgIH1cclxuICAgIHByaXZhdGUgZ2V0VmFsdWUoaXRlbTogYW55KTogYW55IHtcclxuICAgICAgICBpZiAodGhpcy52YWx1ZU5hbWUpIHJldHVybiBpdGVtW3RoaXMudmFsdWVOYW1lXTtcclxuICAgICAgICB2YXIgbGVuID0gT2JqZWN0LmtleXMoaXRlbSkubGVuZ3RoO1xyXG4gICAgICAgIGlmIChsZW4gPCAxKSByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gaXRlbVtPYmplY3Qua2V5cyhpdGVtKVswXV07XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGdldFRpdGxlKGl0ZW06IGFueSk6IGFueSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnRpdGxlTmFtZSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1bdGhpcy50aXRsZU5hbWVdO1xyXG4gICAgfVxyXG59XHJcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJjaG9pY2VzQnlVcmxcIiwgW1widXJsXCIsIFwicGF0aFwiLCBcInZhbHVlTmFtZVwiLCBcInRpdGxlTmFtZVwiXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IENob2ljZXNSZXN0ZnVsbCgpOyB9KTtcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9jaG9pY2VzUmVzdGZ1bGwudHNcbiAqKi8iLCJpbXBvcnQge0hhc2hUYWJsZX0gZnJvbSAnLi9iYXNlJztcclxuaW1wb3J0IHtDb25kaXRpb25zUGFyc2VyfSBmcm9tICcuL2NvbmRpdGlvbnNQYXJzZXInO1xyXG5pbXBvcnQge1Byb2Nlc3NWYWx1ZX0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uIHtcclxuICAgIHN0YXRpYyBvcGVyYXRvcnNWYWx1ZTogSGFzaFRhYmxlPEZ1bmN0aW9uPiA9IG51bGw7XHJcbiAgICBzdGF0aWMgZ2V0IG9wZXJhdG9ycygpIHtcclxuICAgICAgICBpZiAoQ29uZGl0aW9uLm9wZXJhdG9yc1ZhbHVlICE9IG51bGwpIHJldHVybiBDb25kaXRpb24ub3BlcmF0b3JzVmFsdWU7XHJcbiAgICAgICAgQ29uZGl0aW9uLm9wZXJhdG9yc1ZhbHVlID0ge1xyXG4gICAgICAgICAgICBlbXB0eTogZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7IHJldHVybiAhbGVmdDsgfSxcclxuICAgICAgICAgICAgbm90ZW1wdHk6IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkgeyByZXR1cm4gISghbGVmdCk7IH0sXHJcbiAgICAgICAgICAgIGVxdWFsOiBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsgcmV0dXJuIGxlZnQgPT0gcmlnaHQ7IH0sXHJcbiAgICAgICAgICAgIG5vdGVxdWFsOiBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsgcmV0dXJuIGxlZnQgIT0gcmlnaHQ7IH0sXHJcbiAgICAgICAgICAgIGNvbnRhaW5zOiBmdW5jdGlvbiAobGVmdCwgcmlnaHQpIHsgcmV0dXJuIGxlZnQgJiYgbGVmdFtcImluZGV4T2ZcIl0gJiYgbGVmdC5pbmRleE9mKHJpZ2h0KSA+IC0xOyB9LFxyXG4gICAgICAgICAgICBub3Rjb250YWluczogZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7IHJldHVybiAhbGVmdCB8fCAhbGVmdFtcImluZGV4T2ZcIl0gfHwgbGVmdC5pbmRleE9mKHJpZ2h0KSA9PSAtMTsgfSxcclxuICAgICAgICAgICAgZ3JlYXRlcjogZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7IHJldHVybiBsZWZ0ID4gcmlnaHQ7IH0sXHJcbiAgICAgICAgICAgIGxlc3M6IGZ1bmN0aW9uIChsZWZ0LCByaWdodCkgeyByZXR1cm4gbGVmdCA8IHJpZ2h0OyB9LFxyXG4gICAgICAgICAgICBncmVhdGVyb3JlcXVhbDogZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7IHJldHVybiBsZWZ0ID49IHJpZ2h0OyB9LFxyXG4gICAgICAgICAgICBsZXNzb3JlcXVhbDogZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7IHJldHVybiBsZWZ0IDw9IHJpZ2h0OyB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gQ29uZGl0aW9uLm9wZXJhdG9yc1ZhbHVlO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBvcFZhbHVlOiBzdHJpbmcgPSBcImVxdWFsXCI7XHJcbiAgICBwdWJsaWMgbGVmdDogYW55O1xyXG4gICAgcHVibGljIHJpZ2h0OiBhbnk7XHJcbiAgICBwdWJsaWMgZ2V0IG9wZXJhdG9yKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLm9wVmFsdWU7IH1cclxuICAgIHB1YmxpYyBzZXQgb3BlcmF0b3IodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybjtcclxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKCFDb25kaXRpb24ub3BlcmF0b3JzW3ZhbHVlXSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMub3BWYWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHBlcmZvcm0obGVmdDogYW55ID0gbnVsbCwgcmlnaHQ6IGFueSA9IG51bGwpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIWxlZnQpIGxlZnQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgaWYgKCFyaWdodCkgcmlnaHQgPSB0aGlzLnJpZ2h0O1xyXG5cclxuICAgICAgICByZXR1cm4gQ29uZGl0aW9uLm9wZXJhdG9yc1t0aGlzLm9wZXJhdG9yXSh0aGlzLmdldFB1cmVWYWx1ZShsZWZ0KSwgdGhpcy5nZXRQdXJlVmFsdWUocmlnaHQpKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgZ2V0UHVyZVZhbHVlKHZhbDogYW55KTogYW55IHtcclxuICAgICAgICBpZiAoIXZhbCB8fCAodHlwZW9mIHZhbCAhPSBcInN0cmluZ1wiKSkgcmV0dXJuIHZhbDtcclxuICAgICAgICB2YXIgc3RyID0gXCJcIjtcclxuICAgICAgICBpZiAodmFsLmxlbmd0aCA+IDAgJiYgKHZhbFswXSA9PSBcIidcIiB8fCB2YWxbMF0gPT0gJ1wiJykpICB2YWwgPSB2YWwuc3Vic3RyKDEpO1xyXG4gICAgICAgIHZhciBsZW4gPSB2YWwubGVuZ3RoO1xyXG4gICAgICAgIGlmIChsZW4gPiAwICYmICh2YWxbbGVuIC0gMV0gPT0gXCInXCIgfHwgdmFsW2xlbiAtIDFdID09ICdcIicpKSAgdmFsID0gdmFsLnN1YnN0cigwLCBsZW4gLSAxKTtcclxuICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBjbGFzcyBDb25kaXRpb25Ob2RlIHtcclxuICAgIHByaXZhdGUgY29ubmVjdGl2ZVZhbHVlOiBzdHJpbmcgPSBcImFuZFwiO1xyXG4gICAgcHVibGljIGNoaWxkcmVuOiBBcnJheTxhbnk+ID0gW107XHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7IH1cclxuICAgIHB1YmxpYyBnZXQgY29ubmVjdGl2ZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5jb25uZWN0aXZlVmFsdWU7IH1cclxuICAgIHB1YmxpYyBzZXQgY29ubmVjdGl2ZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xyXG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAodmFsdWUgPT0gXCImXCIgfHwgdmFsdWUgPT0gXCImJlwiKSB2YWx1ZSA9IFwiYW5kXCI7XHJcbiAgICAgICAgaWYgKHZhbHVlID09IFwifFwiIHx8IHZhbHVlID09IFwifHxcIikgdmFsdWUgPSBcIm9yXCI7XHJcbiAgICAgICAgaWYgKHZhbHVlICE9IFwiYW5kXCIgJiYgdmFsdWUgIT0gXCJvclwiKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5jb25uZWN0aXZlVmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgaXNFbXB0eSgpIHsgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09IDA7IH1cclxuICAgIHB1YmxpYyBjbGVhcigpIHtcclxuICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107XHJcbiAgICAgICAgdGhpcy5jb25uZWN0aXZlID0gXCJhbmRcIjtcclxuICAgIH1cclxufVxyXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uUnVubmVyIHtcclxuICAgIHByaXZhdGUgZXhwcmVzc2lvblZhbHVlOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIHByb2Nlc3NWYWx1ZTogUHJvY2Vzc1ZhbHVlO1xyXG4gICAgcHJpdmF0ZSByb290OiBDb25kaXRpb25Ob2RlO1xyXG4gICAgcHJpdmF0ZSB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+O1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMucm9vdCA9IG5ldyBDb25kaXRpb25Ob2RlKCk7XHJcbiAgICAgICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcclxuICAgICAgICB0aGlzLnByb2Nlc3NWYWx1ZSA9IG5ldyBQcm9jZXNzVmFsdWUoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5leHByZXNzaW9uVmFsdWU7IH1cclxuICAgIHB1YmxpYyBzZXQgZXhwcmVzc2lvbih2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbiA9PSB2YWx1ZSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvblZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgbmV3IENvbmRpdGlvbnNQYXJzZXIoKS5wYXJzZSh0aGlzLmV4cHJlc3Npb25WYWx1ZSwgdGhpcy5yb290KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBydW4odmFsdWVzOiBIYXNoVGFibGU8YW55Pik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJ1bk5vZGUodGhpcy5yb290KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgcnVuTm9kZShub2RlOiBDb25kaXRpb25Ob2RlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgdmFyIG9uRmlyc3RGYWlsID0gbm9kZS5jb25uZWN0aXZlID09IFwiYW5kXCI7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciByZXMgPSB0aGlzLnJ1bk5vZGVDb25kaXRpb24obm9kZS5jaGlsZHJlbltpXSk7XHJcbiAgICAgICAgICAgIGlmICghcmVzICYmIG9uRmlyc3RGYWlsKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChyZXMgJiYgIW9uRmlyc3RGYWlsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9uRmlyc3RGYWlsO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBydW5Ob2RlQ29uZGl0aW9uKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKHZhbHVlW1wiY2hpbGRyZW5cIl0pIHJldHVybiB0aGlzLnJ1bk5vZGUodmFsdWUpO1xyXG4gICAgICAgIGlmICh2YWx1ZVtcImxlZnRcIl0pIHJldHVybiB0aGlzLnJ1bkNvbmRpdGlvbih2YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBydW5Db25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb24pOiBib29sZWFuIHtcclxuICAgICAgICB2YXIgbGVmdCA9IGNvbmRpdGlvbi5sZWZ0O1xyXG4gICAgICAgIHZhciBuYW1lID0gdGhpcy5nZXRWYWx1ZU5hbWUobGVmdCk7XHJcbiAgICAgICAgaWYgKG5hbWUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnByb2Nlc3NWYWx1ZS5oYXNWYWx1ZShuYW1lLCB0aGlzLnZhbHVlcykpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgbGVmdCA9IHRoaXMucHJvY2Vzc1ZhbHVlLmdldFZhbHVlKG5hbWUsIHRoaXMudmFsdWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHJpZ2h0ID0gY29uZGl0aW9uLnJpZ2h0O1xyXG4gICAgICAgIG5hbWUgPSB0aGlzLmdldFZhbHVlTmFtZShyaWdodCk7XHJcbiAgICAgICAgaWYgKG5hbWUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnByb2Nlc3NWYWx1ZS5oYXNWYWx1ZShuYW1lLCB0aGlzLnZhbHVlcykpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgcmlnaHQgPSB0aGlzLnByb2Nlc3NWYWx1ZS5nZXRWYWx1ZShuYW1lLCB0aGlzLnZhbHVlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb25kaXRpb24ucGVyZm9ybShsZWZ0LCByaWdodCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGdldFZhbHVlTmFtZShub2RlVmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICghbm9kZVZhbHVlKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBpZiAodHlwZW9mIG5vZGVWYWx1ZSAhPT0gJ3N0cmluZycpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoIDwgMyB8fCBub2RlVmFsdWVbMF0gIT0gJ3snIHx8IG5vZGVWYWx1ZVtub2RlVmFsdWUubGVuZ3RoIC0gMV0gIT0gJ30nKSByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gbm9kZVZhbHVlLnN1YnN0cigxLCBub2RlVmFsdWUubGVuZ3RoIC0gMik7XHJcbiAgICB9XHJcbn1cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9jb25kaXRpb25zLnRzXG4gKiovIiwiaW1wb3J0IHtDb25kaXRpb24sIENvbmRpdGlvbk5vZGV9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBDb25kaXRpb25zUGFyc2VyIHtcclxuICAgIHByaXZhdGUgdGV4dDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSByb290OiBDb25kaXRpb25Ob2RlO1xyXG4gICAgcHJpdmF0ZSBleHByZXNzaW9uTm9kZXM6IEFycmF5PENvbmRpdGlvbk5vZGU+O1xyXG4gICAgcHJpdmF0ZSBub2RlOiBDb25kaXRpb25Ob2RlO1xyXG4gICAgcHJpdmF0ZSBhdDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBsZW5ndGg6IG51bWJlcjtcclxuICAgIHB1YmxpYyBwYXJzZSh0ZXh0OiBzdHJpbmcsIHJvb3Q6IENvbmRpdGlvbk5vZGUpOiBib29sZWFuIHtcclxuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xyXG4gICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7XHJcbiAgICAgICAgdGhpcy5yb290LmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5hdCA9IDA7XHJcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLnRleHQubGVuZ3RoO1xyXG4gICAgICAgIHZhciByZXMgPSB0aGlzLnBhcnNlVGV4dCgpO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgdG9TdHJpbmcocm9vdDogQ29uZGl0aW9uTm9kZSk6IHN0cmluZyB7XHJcbiAgICAgICAgdGhpcy5yb290ID0gcm9vdDtcclxuICAgICAgICByZXR1cm4gdGhpcy5ub2RlVG9TdHJpbmcocm9vdCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHRvU3RyaW5nQ29yZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gXCJcIjtcclxuICAgICAgICBpZiAodmFsdWVbXCJjaGlsZHJlblwiXSkgcmV0dXJuIHRoaXMubm9kZVRvU3RyaW5nKHZhbHVlKTtcclxuICAgICAgICBpZiAodmFsdWVbXCJsZWZ0XCJdKSByZXR1cm4gdGhpcy5jb25kaXRpb25Ub1N0cmluZyh2YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIG5vZGVUb1N0cmluZyhub2RlOiBDb25kaXRpb25Ob2RlKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAobm9kZS5pc0VtcHR5KSByZXR1cm4gXCJcIjtcclxuICAgICAgICB2YXIgcmVzID0gXCJcIjtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIG5vZGVUZXh0ID0gdGhpcy50b1N0cmluZ0NvcmUobm9kZS5jaGlsZHJlbltpXSk7XHJcbiAgICAgICAgICAgIGlmIChub2RlVGV4dCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlcykgcmVzICs9ICcgJyArIG5vZGUuY29ubmVjdGl2ZSArICcgJztcclxuICAgICAgICAgICAgICAgIHJlcyArPSBub2RlVGV4dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobm9kZSAhPSB0aGlzLnJvb3QgJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHJlcyA9ICcoJyArIHJlcyArICcpJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICAgIHByaXZhdGUgY29uZGl0aW9uVG9TdHJpbmcoY29uZGl0aW9uOiBDb25kaXRpb24pOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICghY29uZGl0aW9uLnJpZ2h0IHx8ICFjb25kaXRpb24ub3BlcmF0b3IpIHJldHVybiBcIlwiO1xyXG4gICAgICAgIHZhciBsZWZ0ID0gY29uZGl0aW9uLmxlZnQ7XHJcbiAgICAgICAgaWYgKGxlZnQgJiYgIXRoaXMuaXNOdW1lcmljKGxlZnQpKSBsZWZ0ID0gXCInXCIgKyBsZWZ0ICsgXCInXCI7XHJcbiAgICAgICAgdmFyIHJlcyA9IGxlZnQgKyAnICcgKyB0aGlzLm9wZXJhdGlvblRvU3RyaW5nKGNvbmRpdGlvbi5vcGVyYXRvcik7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNOb1JpZ2h0T3BlcmF0aW9uKGNvbmRpdGlvbi5vcGVyYXRvcikpIHJldHVybiByZXM7XHJcbiAgICAgICAgdmFyIHJpZ2h0ID0gY29uZGl0aW9uLnJpZ2h0O1xyXG4gICAgICAgIGlmIChyaWdodCAmJiAhdGhpcy5pc051bWVyaWMocmlnaHQpKSByaWdodCA9IFwiJ1wiICsgcmlnaHQgKyBcIidcIjtcclxuICAgICAgICByZXR1cm4gcmVzICsgJyAnICsgcmlnaHQ7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIG9wZXJhdGlvblRvU3RyaW5nKG9wOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChvcCA9PSBcImVxdWFsXCIpIHJldHVybiBcIj1cIjtcclxuICAgICAgICBpZiAob3AgPT0gXCJub3RlcXVhbFwiKSByZXR1cm4gXCIhPVwiO1xyXG4gICAgICAgIGlmIChvcCA9PSBcImdyZWF0ZXJcIikgcmV0dXJuIFwiPlwiO1xyXG4gICAgICAgIGlmIChvcCA9PSBcImxlc3NcIikgcmV0dXJuIFwiPFwiO1xyXG4gICAgICAgIGlmIChvcCA9PSBcImdyZWF0ZXJvcmVxdWFsXCIpIHJldHVybiBcIj49XCI7XHJcbiAgICAgICAgaWYgKG9wID09IFwibGVzc29yZXF1YWxcIikgcmV0dXJuIFwiPD1cIjtcclxuICAgICAgICByZXR1cm4gb3A7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGlzTnVtZXJpYyh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgdmFyIHZhbCA9IHBhcnNlRmxvYXQodmFsdWUpO1xyXG4gICAgICAgIGlmIChpc05hTih2YWwpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIGlzRmluaXRlKHZhbCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHBhcnNlVGV4dCgpOiBib29sZWFuIHtcclxuICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTm9kZXMgPSBbXTtcclxuICAgICAgICB0aGlzLmV4cHJlc3Npb25Ob2Rlcy5wdXNoKHRoaXMubm9kZSk7XHJcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMucmVhZENvbmRpdGlvbnMoKTtcclxuICAgICAgICByZXR1cm4gcmVzICYmIHRoaXMuYXQgPj0gdGhpcy5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHJlYWRDb25kaXRpb25zKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHZhciByZXMgPSB0aGlzLnJlYWRDb25kaXRpb24oKTtcclxuICAgICAgICBpZiAoIXJlcykgcmV0dXJuIHJlcztcclxuICAgICAgICB2YXIgY29ubmVjdGl2ZSA9IHRoaXMucmVhZENvbm5lY3RpdmUoKTtcclxuICAgICAgICBpZiAoY29ubmVjdGl2ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZENvbm5lY3RpdmUoY29ubmVjdGl2ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRDb25kaXRpb25zKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSByZWFkQ29uZGl0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdGhpcy5yZWFkRXhwcmVzc2lvbigpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgdmFyIGxlZnQgPSB0aGlzLnJlYWRTdHJpbmcoKTtcclxuICAgICAgICBpZiAoIWxlZnQpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB2YXIgb3AgPSB0aGlzLnJlYWRPcGVyYXRvcigpO1xyXG4gICAgICAgIGlmICghb3ApIHJldHVybiBmYWxzZTtcclxuICAgICAgICB2YXIgYyA9IG5ldyBDb25kaXRpb24oKTtcclxuICAgICAgICBjLmxlZnQgPSBsZWZ0OyBjLm9wZXJhdG9yID0gb3A7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTm9SaWdodE9wZXJhdGlvbihvcCkpIHtcclxuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5yZWFkU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGlmICghcmlnaHQpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgYy5yaWdodCA9IHJpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFkZENvbmRpdGlvbihjKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgcmVhZEV4cHJlc3Npb24oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgdGhpcy5za2lwKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuYXQgPj0gdGhpcy5sZW5ndGggfHwgdGhpcy5jaCAhPSAnKCcpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHRoaXMuYXQrKztcclxuICAgICAgICB0aGlzLnB1c2hFeHByZXNzaW9uKCk7XHJcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMucmVhZENvbmRpdGlvbnMoKTtcclxuICAgICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2tpcCgpO1xyXG4gICAgICAgICAgICByZXMgPSB0aGlzLmNoID09ICcpJztcclxuICAgICAgICAgICAgdGhpcy5hdCsrO1xyXG4gICAgICAgICAgICB0aGlzLnBvcEV4cHJlc3Npb24oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuICAgIHByaXZhdGUgZ2V0IGNoKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnRleHQuY2hhckF0KHRoaXMuYXQpOyB9XHJcbiAgICBwcml2YXRlIHNraXAoKSB7XHJcbiAgICAgICAgd2hpbGUgKHRoaXMuYXQgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLmlzU3BhY2UodGhpcy5jaCkpIHRoaXMuYXQrKztcclxuICAgIH1cclxuICAgIHByaXZhdGUgaXNTcGFjZShjOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXFxuJyB8fCBjID09ICdcXHQnIHx8IGMgPT0gJ1xccic7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGlzUXVvdGVzKGM6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBjID09IFwiJ1wiIHx8IGMgPT0gJ1wiJ1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBpc09wZXJhdG9yQ2hhcihjOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gYyA9PSAnPicgfHwgYyA9PSAnPCcgfHwgYyA9PSAnPScgfHwgYyA9PSAnISc7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGlzQnJhY2tldHMoYzogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIGMgPT0gJygnIHx8IGMgPT0gJyknO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSByZWFkU3RyaW5nKCk6IHN0cmluZyB7XHJcbiAgICAgICAgdGhpcy5za2lwKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuYXQgPj0gdGhpcy5sZW5ndGgpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHZhciBzdGFydCA9IHRoaXMuYXQ7XHJcbiAgICAgICAgdmFyIGhhc1F1b3RlcyA9IHRoaXMuaXNRdW90ZXModGhpcy5jaCk7XHJcbiAgICAgICAgaWYgKGhhc1F1b3RlcykgdGhpcy5hdCsrO1xyXG4gICAgICAgIHZhciBpc0ZpcnN0T3BDaCA9IHRoaXMuaXNPcGVyYXRvckNoYXIodGhpcy5jaCk7XHJcbiAgICAgICAgd2hpbGUgKHRoaXMuYXQgPCB0aGlzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBpZiAoIWhhc1F1b3RlcyAmJiB0aGlzLmlzU3BhY2UodGhpcy5jaCkpIGJyZWFrO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pc1F1b3Rlcyh0aGlzLmNoKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGhhc1F1b3RlcykgdGhpcy5hdCsrO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFoYXNRdW90ZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc0ZpcnN0T3BDaCAhPSB0aGlzLmlzT3BlcmF0b3JDaGFyKHRoaXMuY2gpKSBicmVhaztcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQnJhY2tldHModGhpcy5jaCkpIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYXQrKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuYXQgPD0gc3RhcnQpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHZhciByZXMgPSB0aGlzLnRleHQuc3Vic3RyKHN0YXJ0LCB0aGlzLmF0IC0gc3RhcnQpO1xyXG4gICAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICAgICAgaWYgKHJlcy5sZW5ndGggPiAxICYmIHRoaXMuaXNRdW90ZXMocmVzWzBdKSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGxlbiA9IHJlcy5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNRdW90ZXMocmVzW3Jlcy5sZW5ndGggLSAxXSkpIGxlbi0tO1xyXG4gICAgICAgICAgICAgICAgcmVzID0gcmVzLnN1YnN0cigxLCBsZW4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGlzTm9SaWdodE9wZXJhdGlvbihvcDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIG9wID09IFwiZW1wdHlcIiB8fCBvcCA9PSBcIm5vdGVtcHR5XCI7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHJlYWRPcGVyYXRvcigpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBvcCA9IHRoaXMucmVhZFN0cmluZygpO1xyXG4gICAgICAgIGlmICghb3ApIHJldHVybiBudWxsO1xyXG4gICAgICAgIG9wID0gb3AudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAob3AgPT0gJz4nKSBvcCA9IFwiZ3JlYXRlclwiO1xyXG4gICAgICAgIGlmIChvcCA9PSAnPCcpIG9wID0gXCJsZXNzXCI7XHJcbiAgICAgICAgaWYgKG9wID09ICc+PScgfHwgb3AgPT0gJz0+Jykgb3AgPSBcImdyZWF0ZXJvcmVxdWFsXCI7XHJcbiAgICAgICAgaWYgKG9wID09ICc8PScgfHwgb3AgPT0gJz08Jykgb3AgPSBcImxlc3NvcmVxdWFsXCI7XHJcbiAgICAgICAgaWYgKG9wID09ICc9JyB8fCBvcCA9PSAnPT0nKSBvcCA9IFwiZXF1YWxcIjtcclxuICAgICAgICBpZiAob3AgPT0gJzw+JyB8fCBvcCA9PSAnIT0nKSBvcCA9IFwibm90ZXF1YWxcIjtcclxuICAgICAgICBpZiAob3AgPT0gJ2NvbnRhaW4nKSBvcCA9IFwiY29udGFpbnNcIjtcclxuICAgICAgICBpZiAob3AgPT0gJ25vdGNvbnRhaW4nKSBvcCA9IFwibm90Y29udGFpbnNcIjtcclxuICAgICAgICByZXR1cm4gb3A7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHJlYWRDb25uZWN0aXZlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIGNvbiA9IHRoaXMucmVhZFN0cmluZygpO1xyXG4gICAgICAgIGlmICghY29uKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBjb24gPSBjb24udG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBpZiAoY29uID09IFwiJlwiIHx8IGNvbiA9PSBcIiYmXCIpIGNvbiA9IFwiYW5kXCI7XHJcbiAgICAgICAgaWYgKGNvbiA9PSBcInxcIiB8fCBjb24gPT0gXCJ8fFwiKSBjb24gPSBcIm9yXCI7XHJcbiAgICAgICAgaWYgKGNvbiAhPSBcImFuZFwiICYmIGNvbiAhPSBcIm9yXCIpIGNvbiA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIGNvbjtcclxuICAgIH1cclxuICAgIHByaXZhdGUgcHVzaEV4cHJlc3Npb24oKSB7XHJcbiAgICAgICAgdmFyIG5vZGUgPSBuZXcgQ29uZGl0aW9uTm9kZSgpO1xyXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk5vZGVzLnB1c2gobm9kZSk7XHJcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgcG9wRXhwcmVzc2lvbigpIHtcclxuICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZXhwcmVzc2lvbk5vZGVzLnBvcCgpO1xyXG4gICAgICAgIHRoaXMubm9kZSA9IHRoaXMuZXhwcmVzc2lvbk5vZGVzW3RoaXMuZXhwcmVzc2lvbk5vZGVzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIHRoaXMubm9kZS5jaGlsZHJlbi5wdXNoKG5vZGUpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBhZGRDb25kaXRpb24oYzogQ29uZGl0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5ub2RlLmNoaWxkcmVuLnB1c2goYyk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGFkZENvbm5lY3RpdmUoY29uOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy5ub2RlLmNoaWxkcmVuLmxlbmd0aCA8IDIpIHtcclxuICAgICAgICAgICAgdGhpcy5ub2RlLmNvbm5lY3RpdmUgPSBjb247XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5jb25uZWN0aXZlICE9IGNvbikge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9sZENvbiA9IHRoaXMubm9kZS5jb25uZWN0aXZlO1xyXG4gICAgICAgICAgICAgICAgdmFyIG9sZENoaWxkcmVuID0gdGhpcy5ub2RlLmNoaWxkcmVuO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGUuY29ubmVjdGl2ZSA9IGNvbjtcclxuICAgICAgICAgICAgICAgIHZhciBvbGROb2RlID0gbmV3IENvbmRpdGlvbk5vZGUoKTtcclxuICAgICAgICAgICAgICAgIG9sZE5vZGUuY29ubmVjdGl2ZSA9IG9sZENvbjtcclxuICAgICAgICAgICAgICAgIG9sZE5vZGUuY2hpbGRyZW4gPSBvbGRDaGlsZHJlbjtcclxuICAgICAgICAgICAgICAgIHRoaXMubm9kZS5jaGlsZHJlbi5wdXNoKG9sZE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgdmFyIG5ld05vZGUgPSBuZXcgQ29uZGl0aW9uTm9kZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub2RlLmNoaWxkcmVuLnB1c2gobmV3Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvY29uZGl0aW9uc1BhcnNlci50c1xuICoqLyIsImltcG9ydCB7SGFzaFRhYmxlfSBmcm9tICcuL2Jhc2UnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFByb2Nlc3NWYWx1ZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxyXG4gICAgcHVibGljIGdldEZpcnN0TmFtZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICghdGV4dCkgcmV0dXJuIHRleHQ7XHJcbiAgICAgICAgdmFyIHJlcyA9IFwiXCI7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjaCA9IHRleHRbaV07XHJcbiAgICAgICAgICAgIGlmIChjaCA9PSAnLicgfHwgY2ggPT0gJ1snKSBicmVhaztcclxuICAgICAgICAgICAgcmVzICs9IGNoO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGhhc1ZhbHVlKHRleHQ6IHN0cmluZywgdmFsdWVzOiBIYXNoVGFibGU8YW55Pik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHZhciByZXMgPSB0aGlzLmdldFZhbHVlQ29yZSh0ZXh0LCB2YWx1ZXMpO1xyXG4gICAgICAgIHJldHVybiByZXMuaGFzVmFsdWU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0VmFsdWUodGV4dDogc3RyaW5nLCB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+KTogYW55IHtcclxuICAgICAgICB2YXIgcmVzID0gdGhpcy5nZXRWYWx1ZUNvcmUodGV4dCwgdmFsdWVzKTtcclxuICAgICAgICByZXR1cm4gcmVzLnZhbHVlO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBnZXRWYWx1ZUNvcmUodGV4dDogc3RyaW5nLCB2YWx1ZXM6IGFueSk6IGFueSB7XHJcbiAgICAgICAgdmFyIHJlcyA9IHsgaGFzVmFsdWU6IGZhbHNlLCB2YWx1ZTogbnVsbCB9O1xyXG4gICAgICAgIHZhciBjdXJWYWx1ZSA9IHZhbHVlcztcclxuICAgICAgICBpZiAoIWN1clZhbHVlKSByZXR1cm4gcmVzO1xyXG4gICAgICAgIHZhciBpc0ZpcnN0ID0gdHJ1ZTtcclxuICAgICAgICB3aGlsZSAodGV4dCAmJiB0ZXh0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdmFyIGlzQXJyYXkgPSAhaXNGaXJzdCAmJiB0ZXh0WzBdID09ICdbJztcclxuICAgICAgICAgICAgaWYgKCFpc0FycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzRmlyc3QpIHRleHQgPSB0ZXh0LnN1YnN0cigxKTtcclxuICAgICAgICAgICAgICAgIHZhciBjdXJOYW1lID0gdGhpcy5nZXRGaXJzdE5hbWUodGV4dCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWN1ck5hbWUpIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWN1clZhbHVlW2N1ck5hbWVdKSByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICAgICAgY3VyVmFsdWUgPSBjdXJWYWx1ZVtjdXJOYW1lXVxyXG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyKGN1ck5hbWUubGVuZ3RoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJWYWx1ZSkpIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSAxO1xyXG4gICAgICAgICAgICAgICAgdmFyIHN0ciA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCB0ZXh0Lmxlbmd0aCAmJiB0ZXh0W2luZGV4XSAhPSAnXScpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gdGV4dFtpbmRleF07XHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRleHQgPSBpbmRleCA8IHRleHQubGVuZ3RoID8gdGV4dC5zdWJzdHIoaW5kZXggKyAxKSA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICBpbmRleCA9IHRoaXMuZ2V0SW50VmFsdWUoc3RyKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gY3VyVmFsdWUubGVuZ3RoKSByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICAgICAgY3VyVmFsdWUgPSBjdXJWYWx1ZVtpbmRleF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaXNGaXJzdCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXMudmFsdWUgPSBjdXJWYWx1ZTtcclxuICAgICAgICByZXMuaGFzVmFsdWUgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGdldEludFZhbHVlKHN0cjogYW55KSB7XHJcbiAgICAgICAgaWYgKHN0ciA9PSBcIjBcIiB8fCAoKHN0ciB8IDApID4gMCAmJiBzdHIgJSAxID09IDApKVxyXG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyKHN0cik7XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvY29uZGl0aW9uUHJvY2Vzc1ZhbHVlLnRzXG4gKiovIiwiaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XHJcbmltcG9ydCB7UXVlc3Rpb259IGZyb20gXCIuL3F1ZXN0aW9uXCI7XHJcbmltcG9ydCB7QmFzZSwgSXRlbVZhbHVlLCBJU3VydmV5RGF0YSwgSGFzaFRhYmxlfSBmcm9tIFwiLi9iYXNlXCI7XHJcbmltcG9ydCB7c3VydmV5TG9jYWxpemF0aW9ufSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XHJcbmltcG9ydCB7UXVlc3Rpb25TZWxlY3RCYXNlfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XHJcbmltcG9ydCB7UXVlc3Rpb25Ecm9wZG93bk1vZGVsfSBmcm9tIFwiLi9xdWVzdGlvbl9kcm9wZG93blwiO1xyXG5pbXBvcnQge1F1ZXN0aW9uQ2hlY2tib3hNb2RlbH0gZnJvbSBcIi4vcXVlc3Rpb25fY2hlY2tib3hcIjtcclxuaW1wb3J0IHtRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbH0gZnJvbSBcIi4vcXVlc3Rpb25fcmFkaW9ncm91cFwiO1xyXG5pbXBvcnQge1F1ZXN0aW9uVGV4dE1vZGVsfSBmcm9tIFwiLi9xdWVzdGlvbl90ZXh0XCI7XHJcbmltcG9ydCB7UXVlc3Rpb25Db21tZW50TW9kZWx9IGZyb20gXCIuL3F1ZXN0aW9uX2NvbW1lbnRcIjtcclxuaW1wb3J0IHtRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWF0cml4RHJvcGRvd25EYXRhIHtcclxuICAgIG9uUm93Q2hhbmdlZChjZWxsOiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSwgbmV3Um93VmFsdWU6IGFueSk7XHJcbiAgICBjb2x1bW5zOiBBcnJheTxNYXRyaXhEcm9wZG93bkNvbHVtbj47XHJcbiAgICBjcmVhdGVRdWVzdGlvbihyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLCBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogUXVlc3Rpb247XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNYXRyaXhEcm9wZG93bkNvbHVtbiBleHRlbmRzIEJhc2Uge1xyXG4gICAgcHJpdmF0ZSBjaG9pY2VzVmFsdWU6IEl0ZW1WYWx1ZVtdID0gW107XHJcbiAgICBwcml2YXRlIHRpdGxlVmFsdWU6IHN0cmluZztcclxuICAgIHB1YmxpYyBvcHRpb25zQ2FwdGlvbjogc3RyaW5nO1xyXG4gICAgcHVibGljIGlzUmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBoYXNPdGhlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIG1pbldpZHRoOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIGNlbGxUeXBlOiBzdHJpbmcgPSBcImRlZmF1bHRcIjtcclxuICAgIHByaXZhdGUgY29sQ291bnRWYWx1ZTogbnVtYmVyID0gLTE7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCB0aXRsZTogc3RyaW5nID0gbnVsbCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0VHlwZSgpIHsgcmV0dXJuIFwibWF0cml4ZHJvcGRvd25jb2x1bW5cIiB9XHJcbiAgICBwdWJsaWMgZ2V0IHRpdGxlKCkgeyByZXR1cm4gdGhpcy50aXRsZVZhbHVlID8gdGhpcy50aXRsZVZhbHVlIDogdGhpcy5uYW1lOyB9XHJcbiAgICBwdWJsaWMgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcpIHsgdGhpcy50aXRsZVZhbHVlID0gdmFsdWU7IH1cclxuICAgIHB1YmxpYyBnZXQgY2hvaWNlcygpOiBBcnJheTxhbnk+IHsgcmV0dXJuIHRoaXMuY2hvaWNlc1ZhbHVlOyB9XHJcbiAgICBwdWJsaWMgZ2V0IGNvbENvdW50KCk6IG51bWJlciB7IHJldHVybiB0aGlzLmNvbENvdW50VmFsdWU7IH1cclxuICAgIHB1YmxpYyBzZXQgY29sQ291bnQodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh2YWx1ZSA8IC0xIHx8IHZhbHVlID4gNCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuY29sQ291bnRWYWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBjaG9pY2VzKG5ld1ZhbHVlOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgSXRlbVZhbHVlLnNldERhdGEodGhpcy5jaG9pY2VzVmFsdWUsIG5ld1ZhbHVlKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duQ2VsbCB7XHJcbiAgICBwcml2YXRlIHF1ZXN0aW9uVmFsdWU6IFF1ZXN0aW9uO1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sIHB1YmxpYyByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLCBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhKSB7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvblZhbHVlID0gZGF0YS5jcmVhdGVRdWVzdGlvbih0aGlzLnJvdywgdGhpcy5jb2x1bW4pO1xyXG4gICAgICAgIHRoaXMucXVlc3Rpb25WYWx1ZS5zZXREYXRhKHJvdyk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uIHsgcmV0dXJuIHRoaXMucXVlc3Rpb25WYWx1ZTsgfVxyXG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkgeyByZXR1cm4gdGhpcy5xdWVzdGlvbi52YWx1ZTsgfVxyXG4gICAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbi52YWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UgaW1wbGVtZW50cyBJU3VydmV5RGF0YSB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBpZENvdW50ZXI6IG51bWJlciA9IDE7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRJZCgpOiBzdHJpbmcgeyByZXR1cm4gXCJzcm93X1wiICsgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UuaWRDb3VudGVyKys7IH1cclxuICAgIHByb3RlY3RlZCBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhO1xyXG4gICAgcHJpdmF0ZSByb3dWYWx1ZXM6IEhhc2hUYWJsZTxhbnk+ID0ge307XHJcbiAgICBwcml2YXRlIHJvd0NvbW1lbnRzOiBIYXNoVGFibGU8YW55PiA9IHt9O1xyXG4gICAgcHJpdmF0ZSBpc1NldHRpbmdWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBpZFZhbHVlOiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIGNlbGxzOiBBcnJheTxNYXRyaXhEcm9wZG93bkNlbGw+ID0gW107XHJcblxyXG4gICAgY29uc3RydWN0b3IoZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YSwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuaWRWYWx1ZSA9IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLmdldElkKCk7XHJcbiAgICAgICAgdGhpcy5idWlsZENlbGxzKCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmlkVmFsdWU7IH1cclxuICAgIHB1YmxpYyBnZXQgcm93TmFtZSgpIHsgcmV0dXJuIG51bGw7IH1cclxuICAgIHB1YmxpYyBnZXQgdmFsdWUoKSB7IHJldHVybiB0aGlzLnJvd1ZhbHVlczsgfVxyXG4gICAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5pc1NldHRpbmdWYWx1ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5yb3dWYWx1ZXMgPSB7fTtcclxuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucm93VmFsdWVzW2tleV0gPSB2YWx1ZVtrZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmNlbGxzW2ldLnF1ZXN0aW9uLm9uU3VydmV5VmFsdWVDaGFuZ2VkKHRoaXMuZ2V0VmFsdWUodGhpcy5jZWxsc1tpXS5jb2x1bW4ubmFtZSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzU2V0dGluZ1ZhbHVlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0VmFsdWUobmFtZTogc3RyaW5nKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3dWYWx1ZXNbbmFtZV07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0VmFsdWUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNTZXR0aW5nVmFsdWUpIHJldHVybjtcclxuICAgICAgICBpZiAobmV3VmFsdWUgPT09IFwiXCIpIG5ld1ZhbHVlID0gbnVsbDtcclxuICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLnJvd1ZhbHVlc1tuYW1lXSA9IG5ld1ZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnJvd1ZhbHVlc1tuYW1lXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kYXRhLm9uUm93Q2hhbmdlZCh0aGlzLCB0aGlzLnZhbHVlKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXRDb21tZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm93Q29tbWVudHNbbmFtZV07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0Q29tbWVudChuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnJvd0NvbW1lbnRzW25hbWVdID0gbmV3VmFsdWU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGlzRW1wdHkoKSB7XHJcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XHJcbiAgICAgICAgaWYgKCF2YWwpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiB2YWwpIHJldHVybiBmYWxzZTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgYnVpbGRDZWxscygpIHtcclxuICAgICAgICB2YXIgY29sdW1ucyA9IHRoaXMuZGF0YS5jb2x1bW5zO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgY29sdW1uID0gY29sdW1uc1tpXTtcclxuICAgICAgICAgICAgdGhpcy5jZWxscy5wdXNoKHRoaXMuY3JlYXRlQ2VsbChjb2x1bW4pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlQ2VsbChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogTWF0cml4RHJvcGRvd25DZWxsIHtcclxuICAgICAgICByZXR1cm4gbmV3IE1hdHJpeERyb3Bkb3duQ2VsbChjb2x1bW4sIHRoaXMsIHRoaXMuZGF0YSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlIGV4dGVuZHMgUXVlc3Rpb24gaW1wbGVtZW50cyBJTWF0cml4RHJvcGRvd25EYXRhIHtcclxuICAgIHByaXZhdGUgY29sdW1uc1ZhbHVlOiBBcnJheTxNYXRyaXhEcm9wZG93bkNvbHVtbj4gPSBbXTtcclxuICAgIHByaXZhdGUgY2hvaWNlc1ZhbHVlOiBJdGVtVmFsdWVbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBvcHRpb25zQ2FwdGlvblZhbHVlOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcclxuICAgIHByb3RlY3RlZCBnZW5lcmF0ZWRWaXNpYmxlUm93czogQXJyYXk8TWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2U+O1xyXG4gICAgcHJpdmF0ZSBjZWxsVHlwZVZhbHVlOiBzdHJpbmcgPSBcImRyb3Bkb3duXCI7XHJcbiAgICBwcml2YXRlIGNvbHVtbkNvbENvdW50VmFsdWU6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgY29sdW1uTWluV2lkdGg6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgaG9yaXpvbnRhbFNjcm9sbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIGNvbHVtbnNDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcbiAgICBwdWJsaWMgdXBkYXRlQ2VsbHNDYWxsYmFrOiAoKSA9PiB2b2lkO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihuYW1lKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIFwibWF0cml4ZHJvcGRvd25iYXNlXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogQXJyYXk8TWF0cml4RHJvcGRvd25Db2x1bW4+IHsgcmV0dXJuIHRoaXMuY29sdW1uc1ZhbHVlOyB9XHJcbiAgICBwdWJsaWMgc2V0IGNvbHVtbnModmFsdWU6IEFycmF5PE1hdHJpeERyb3Bkb3duQ29sdW1uPikge1xyXG4gICAgICAgIHRoaXMuY29sdW1uc1ZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jb2x1bW5zQ2hhbmdlZENhbGxiYWNrKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgY2VsbFR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuY2VsbFR5cGVWYWx1ZTsgfVxyXG4gICAgcHVibGljIHNldCBjZWxsVHlwZShuZXdWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2VsbFR5cGUgPT0gbmV3VmFsdWUpIHJldHVybjtcclxuICAgICAgICB0aGlzLmNlbGxUeXBlVmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnVwZGF0ZUNlbGxzQ2FsbGJhayk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGNvbHVtbkNvbENvdW50KCk6IG51bWJlciB7IHJldHVybiB0aGlzLmNvbHVtbkNvbENvdW50VmFsdWU7IH1cclxuICAgIHB1YmxpYyBzZXQgY29sdW1uQ29sQ291bnQodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiA0KSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5jb2x1bW5Db2xDb3VudFZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy51cGRhdGVDZWxsc0NhbGxiYWspO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldENvbHVtblRpdGxlKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBjb2x1bW4udGl0bGU7XHJcbiAgICAgICAgaWYgKGNvbHVtbi5pc1JlcXVpcmVkICYmIHRoaXMuc3VydmV5KSB7XHJcbiAgICAgICAgICAgIHZhciByZXF1aXJlVGV4dCA9IHRoaXMuc3VydmV5LnJlcXVpcmVkVGV4dDtcclxuICAgICAgICAgICAgaWYgKHJlcXVpcmVUZXh0KSByZXF1aXJlVGV4dCArPSBcIiBcIjtcclxuICAgICAgICAgICAgcmVzdWx0ID0gcmVxdWlyZVRleHQgKyByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0Q29sdW1uV2lkdGgoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGNvbHVtbi5taW5XaWR0aCA/IGNvbHVtbi5taW5XaWR0aCA6IHRoaXMuY29sdW1uTWluV2lkdGg7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGNob2ljZXMoKTogQXJyYXk8YW55PiB7IHJldHVybiB0aGlzLmNob2ljZXNWYWx1ZTsgfVxyXG4gICAgcHVibGljIHNldCBjaG9pY2VzKG5ld1ZhbHVlOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgSXRlbVZhbHVlLnNldERhdGEodGhpcy5jaG9pY2VzVmFsdWUsIG5ld1ZhbHVlKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgb3B0aW9uc0NhcHRpb24oKSB7IHJldHVybiAodGhpcy5vcHRpb25zQ2FwdGlvblZhbHVlKSA/IHRoaXMub3B0aW9uc0NhcHRpb25WYWx1ZSA6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvcHRpb25zQ2FwdGlvblwiKTsgfVxyXG4gICAgcHVibGljIHNldCBvcHRpb25zQ2FwdGlvbihuZXdWYWx1ZTogc3RyaW5nKSB7IHRoaXMub3B0aW9uc0NhcHRpb25WYWx1ZSA9IG5ld1ZhbHVlOyB9XHJcbiAgICBwdWJsaWMgYWRkQ29sdW1uKG5hbWU6IHN0cmluZywgdGl0bGU6IHN0cmluZyA9IG51bGwpOiBNYXRyaXhEcm9wZG93bkNvbHVtbiB7XHJcbiAgICAgICAgdmFyIGNvbHVtbiA9IG5ldyBNYXRyaXhEcm9wZG93bkNvbHVtbihuYW1lLCB0aXRsZSk7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zVmFsdWUucHVzaChjb2x1bW4pO1xyXG4gICAgICAgIHJldHVybiBjb2x1bW47XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCB2aXNpYmxlUm93cygpOiBBcnJheTxNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZT4ge1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSB0aGlzLmdlbmVyYXRlUm93cygpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdlbmVyYXRlUm93cygpOiBBcnJheTxNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZT4geyByZXR1cm4gbnVsbDsgfVxyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZU1hdHJpeFJvdyhuYW1lOiBhbnksIHRleHQ6IHN0cmluZywgdmFsdWU6IGFueSk6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBjcmVhdGVOZXdWYWx1ZShjdXJWYWx1ZTogYW55KTogYW55IHsgcmV0dXJuICFjdXJWYWx1ZSA/IHt9IDogY3VyVmFsdWU7IH1cclxuICAgIHByb3RlY3RlZCBnZXRSb3dWYWx1ZShyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLCBxdWVzdGlvblZhbHVlOiBhbnksIGNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlKTogYW55IHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gcXVlc3Rpb25WYWx1ZVtyb3cucm93TmFtZV0gPyBxdWVzdGlvblZhbHVlW3Jvdy5yb3dOYW1lXSA6IG51bGw7XHJcbiAgICAgICAgaWYgKCFyZXN1bHQgJiYgY3JlYXRlKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHt9O1xyXG4gICAgICAgICAgICBxdWVzdGlvblZhbHVlW3Jvdy5yb3dOYW1lXSA9IHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBvbkJlZm9yZVZhbHVlQ2hhbmdlZCh2YWw6IGFueSkge1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzUm93Q2hhbmdpbmcpIHJldHVybjtcclxuICAgICAgICB0aGlzLm9uQmVmb3JlVmFsdWVDaGFuZ2VkKHRoaXMudmFsdWUpO1xyXG4gICAgICAgIGlmKCEodGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgfHwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGggPT0gMCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XHJcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuY3JlYXRlTmV3VmFsdWUodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciByb3cgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldO1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLnZhbHVlID0gdGhpcy5nZXRSb3dWYWx1ZShyb3csIHZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XHJcbiAgICAgICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xyXG4gICAgICAgIGlmICghcm93cykgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XHJcbiAgICAgICAgaWYgKCFyb3dzKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGNlbGxzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS5jZWxscztcclxuICAgICAgICAgICAgaWYgKCFjZWxscykgY29udGludWU7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCBjZWxscy5sZW5ndGg7IGNvbEluZGV4KyspIHtcclxuICAgICAgICAgICAgICAgIHZhciBxdWVzdGlvbiA9IGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbjtcclxuICAgICAgICAgICAgICAgIGlmIChxdWVzdGlvbiAmJiAoIXF1ZXN0aW9uLnN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkgfHwgIXF1ZXN0aW9uLnZhbHVlKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgdmFyIGVycm9zSW5Db2x1bW5zID0gdGhpcy5oYXNFcnJvckluQ29sdW1ucyhmaXJlQ2FsbGJhY2spO1xyXG4gICAgICAgIHJldHVybiBzdXBlci5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrKSB8fCBlcnJvc0luQ29sdW1ucztcclxuICAgIH1cclxuICAgIHByaXZhdGUgaGFzRXJyb3JJbkNvbHVtbnMoZmlyZUNhbGxiYWNrOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgdmFyIHJlcyA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAodmFyIGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBjb2xJbmRleCsrKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIGNlbGxzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS5jZWxscztcclxuICAgICAgICAgICAgICAgIHJlcyA9IGNlbGxzICYmIGNlbGxzW2NvbEluZGV4XSAmJiBjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb24gJiYgY2VsbHNbY29sSW5kZXhdLnF1ZXN0aW9uLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2spIHx8IHJlcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcclxuICAgICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldEZpcnN0Q2VsbFF1ZXN0aW9uKGZhbHNlKTtcclxuICAgICAgICByZXR1cm4gcXVlc3Rpb24gPyBxdWVzdGlvbi5pbnB1dElkIDogc3VwZXIuZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldEZpcnN0RXJyb3JJbnB1dEVsZW1lbnRJZCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0Rmlyc3RDZWxsUXVlc3Rpb24odHJ1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHF1ZXN0aW9uID8gcXVlc3Rpb24uaW5wdXRJZCA6IHN1cGVyLmdldEZpcnN0RXJyb3JJbnB1dEVsZW1lbnRJZCgpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldEZpcnN0Q2VsbFF1ZXN0aW9uKG9uRXJyb3I6IGJvb2xlYW4pOiBRdWVzdGlvbiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGNlbGxzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS5jZWxscztcclxuICAgICAgICAgICAgZm9yICh2YXIgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGNvbEluZGV4KyspIHtcclxuICAgICAgICAgICAgICAgIGlmICghb25FcnJvcikgcmV0dXJuIGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbjtcclxuICAgICAgICAgICAgICAgIGlmIChjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb24uY3VycmVudEVycm9yQ291bnQgPiAwKSByZXR1cm4gY2VsbHNbY29sSW5kZXhdLnF1ZXN0aW9uXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvL0lNYXRyaXhEcm9wZG93bkRhdGFcclxuICAgIHB1YmxpYyBjcmVhdGVRdWVzdGlvbihyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLCBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogUXVlc3Rpb24ge1xyXG4gICAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuY3JlYXRlUXVlc3Rpb25Db3JlKHJvdywgY29sdW1uKTtcclxuICAgICAgICBxdWVzdGlvbi5uYW1lID0gY29sdW1uLm5hbWU7XHJcbiAgICAgICAgcXVlc3Rpb24uaXNSZXF1aXJlZCA9IGNvbHVtbi5pc1JlcXVpcmVkO1xyXG4gICAgICAgIHF1ZXN0aW9uLmhhc090aGVyID0gY29sdW1uLmhhc090aGVyO1xyXG4gICAgICAgIGlmIChjb2x1bW4uaGFzT3RoZXIpIHtcclxuICAgICAgICAgICAgaWYgKHF1ZXN0aW9uIGluc3RhbmNlb2YgUXVlc3Rpb25TZWxlY3RCYXNlKSB7XHJcbiAgICAgICAgICAgICAgICAoPFF1ZXN0aW9uU2VsZWN0QmFzZT5xdWVzdGlvbikuc3RvcmVPdGhlcnNBc0NvbW1lbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcXVlc3Rpb247XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlUXVlc3Rpb25Db3JlKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBRdWVzdGlvbiB7XHJcbiAgICAgICAgdmFyIGNlbGxUeXBlID0gY29sdW1uLmNlbGxUeXBlID09IFwiZGVmYXVsdFwiID8gdGhpcy5jZWxsVHlwZSA6IGNvbHVtbi5jZWxsVHlwZTtcclxuICAgICAgICB2YXIgbmFtZSA9IHRoaXMuZ2V0UXVlc3Rpb25OYW1lKHJvdywgY29sdW1uKTtcclxuICAgICAgICBpZiAoY2VsbFR5cGUgPT0gXCJjaGVja2JveFwiKSByZXR1cm4gdGhpcy5jcmVhdGVDaGVja2JveChuYW1lLCBjb2x1bW4pO1xyXG4gICAgICAgIGlmIChjZWxsVHlwZSA9PSBcInJhZGlvZ3JvdXBcIikgcmV0dXJuIHRoaXMuY3JlYXRlUmFkaW9ncm91cChuYW1lLCBjb2x1bW4pO1xyXG4gICAgICAgIGlmIChjZWxsVHlwZSA9PSBcInRleHRcIikgcmV0dXJuIHRoaXMuY3JlYXRlVGV4dChuYW1lLCBjb2x1bW4pO1xyXG4gICAgICAgIGlmIChjZWxsVHlwZSA9PSBcImNvbW1lbnRcIikgcmV0dXJuIHRoaXMuY3JlYXRlQ29tbWVudChuYW1lLCBjb2x1bW4pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZURyb3Bkb3duKG5hbWUsIGNvbHVtbik7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgZ2V0UXVlc3Rpb25OYW1lKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBzdHJpbmcgeyByZXR1cm4gcm93LnJvd05hbWUgKyBcIl9cIiArIGNvbHVtbi5uYW1lOyB9XHJcbiAgICBwcm90ZWN0ZWQgZ2V0Q29sdW1uQ2hvaWNlcyhjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogQXJyYXk8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIGNvbHVtbi5jaG9pY2VzICYmIGNvbHVtbi5jaG9pY2VzLmxlbmd0aCA+IDAgPyBjb2x1bW4uY2hvaWNlcyA6IHRoaXMuY2hvaWNlcztcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBnZXRDb2x1bW5PcHRpb25zQ2FwdGlvbihjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gY29sdW1uLm9wdGlvbnNDYXB0aW9uID8gY29sdW1uLm9wdGlvbnNDYXB0aW9uIDogdGhpcy5vcHRpb25zQ2FwdGlvbjtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBjcmVhdGVEcm9wZG93bihuYW1lOiBzdHJpbmcsIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBRdWVzdGlvbkRyb3Bkb3duTW9kZWwge1xyXG4gICAgICAgIHZhciBxID0gPFF1ZXN0aW9uRHJvcGRvd25Nb2RlbD50aGlzLmNyZWF0ZUNlbGxRdWVzdGlvbihcImRyb3Bkb3duXCIsIG5hbWUpO1xyXG4gICAgICAgIHEuY2hvaWNlcyA9IHRoaXMuZ2V0Q29sdW1uQ2hvaWNlcyhjb2x1bW4pO1xyXG4gICAgICAgIHEub3B0aW9uc0NhcHRpb24gPSB0aGlzLmdldENvbHVtbk9wdGlvbnNDYXB0aW9uKGNvbHVtbik7XHJcbiAgICAgICAgcmV0dXJuIHE7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlQ2hlY2tib3gobmFtZTogc3RyaW5nLCBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogUXVlc3Rpb25DaGVja2JveE1vZGVsIHtcclxuICAgICAgICB2YXIgcSA9IDxRdWVzdGlvbkNoZWNrYm94TW9kZWw+dGhpcy5jcmVhdGVDZWxsUXVlc3Rpb24oXCJjaGVja2JveFwiLCBuYW1lKTtcclxuICAgICAgICBxLmNob2ljZXMgPSB0aGlzLmdldENvbHVtbkNob2ljZXMoY29sdW1uKTtcclxuICAgICAgICBxLmNvbENvdW50ID0gY29sdW1uLmNvbENvdW50ID4gLSAxID8gY29sdW1uLmNvbENvdW50IDogdGhpcy5jb2x1bW5Db2xDb3VudDtcclxuICAgICAgICByZXR1cm4gcTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBjcmVhdGVSYWRpb2dyb3VwKG5hbWU6IHN0cmluZywgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIHtcclxuICAgICAgICB2YXIgcSA9IDxRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbD50aGlzLmNyZWF0ZUNlbGxRdWVzdGlvbihcInJhZGlvZ3JvdXBcIiwgbmFtZSk7XHJcbiAgICAgICAgcS5jaG9pY2VzID0gdGhpcy5nZXRDb2x1bW5DaG9pY2VzKGNvbHVtbik7XHJcbiAgICAgICAgcS5jb2xDb3VudCA9IGNvbHVtbi5jb2xDb3VudCA+IC0gMSA/IGNvbHVtbi5jb2xDb3VudCA6IHRoaXMuY29sdW1uQ29sQ291bnQ7XHJcbiAgICAgICAgcmV0dXJuIHE7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlVGV4dChuYW1lOiBzdHJpbmcsIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBRdWVzdGlvblRleHRNb2RlbCB7XHJcbiAgICAgICAgcmV0dXJuIDxRdWVzdGlvblRleHRNb2RlbD50aGlzLmNyZWF0ZUNlbGxRdWVzdGlvbihcInRleHRcIiwgbmFtZSk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlQ29tbWVudChuYW1lOiBzdHJpbmcsIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBRdWVzdGlvbkNvbW1lbnRNb2RlbCB7XHJcbiAgICAgICAgcmV0dXJuIDxRdWVzdGlvbkNvbW1lbnRNb2RlbD50aGlzLmNyZWF0ZUNlbGxRdWVzdGlvbihcImNvbW1lbnRcIiwgbmFtZSk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlQ2VsbFF1ZXN0aW9uKHF1ZXN0aW9uVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBRdWVzdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIDxRdWVzdGlvbj5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UuY3JlYXRlUXVlc3Rpb24ocXVlc3Rpb25UeXBlLCBuYW1lKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBkZWxldGVSb3dWYWx1ZShuZXdWYWx1ZTogYW55LCByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogYW55IHtcclxuICAgICAgICBkZWxldGUgbmV3VmFsdWVbcm93LnJvd05hbWVdO1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhuZXdWYWx1ZSkubGVuZ3RoID09IDAgPyBudWxsIDogbmV3VmFsdWU7XHJcbiAgICB9XHJcbiAgICBvblJvd0NoYW5nZWQocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSwgbmV3Um93VmFsdWU6IGFueSkge1xyXG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgdmFyIHJvd1ZhbHVlID0gdGhpcy5nZXRSb3dWYWx1ZShyb3csIG5ld1ZhbHVlLCB0cnVlKTtcclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcm93VmFsdWUpIGRlbGV0ZSByb3dWYWx1ZVtrZXldO1xyXG4gICAgICAgIGlmIChuZXdSb3dWYWx1ZSkge1xyXG4gICAgICAgICAgICBuZXdSb3dWYWx1ZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobmV3Um93VmFsdWUpKTtcclxuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIG5ld1Jvd1ZhbHVlKSByb3dWYWx1ZVtrZXldID0gbmV3Um93VmFsdWVba2V5XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHJvd1ZhbHVlKS5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHRoaXMuZGVsZXRlUm93VmFsdWUobmV3VmFsdWUsIHJvdyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XHJcbiAgICAgICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuXHJcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJtYXRyaXhkcm9wZG93bmNvbHVtblwiLCBbXCJuYW1lXCIsIHsgbmFtZTogXCJ0aXRsZVwiLCBvbkdldFZhbHVlOiBmdW5jdGlvbiAob2JqOiBhbnkpIHsgcmV0dXJuIG9iai50aXRsZVZhbHVlOyB9IH0sXHJcbiAgICAgICAgeyBuYW1lOiBcImNob2ljZXM6aXRlbXZhbHVlc1wiLCBvbkdldFZhbHVlOiBmdW5jdGlvbiAob2JqOiBhbnkpIHsgcmV0dXJuIEl0ZW1WYWx1ZS5nZXREYXRhKG9iai5jaG9pY2VzKTsgfSwgb25TZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55LCB2YWx1ZTogYW55KSB7IG9iai5jaG9pY2VzID0gdmFsdWU7IH19LFxyXG4gICAgICAgIFwib3B0aW9uc0NhcHRpb25cIiwgeyBuYW1lOiBcImNlbGxUeXBlXCIsIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLCBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIFwiZHJvcGRvd25cIiwgXCJjaGVja2JveFwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0ZXh0XCIsIFwiY29tbWVudFwiXSB9LFxyXG4gICAgICAgIHsgbmFtZTogXCJjb2xDb3VudFwiLCBkZWZhdWx0OiAtMSwgY2hvaWNlczogWy0xLCAwLCAxLCAyLCAzLCA0XSB9LCBcImlzUmVxdWlyZWQ6Ym9vbGVhblwiLCBcImhhc090aGVyOmJvb2xlYW5cIiwgXCJtaW5XaWR0aFwiXSxcclxuICAgIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXRyaXhEcm9wZG93bkNvbHVtbihcIlwiKTsgfSk7XHJcblxyXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwibWF0cml4ZHJvcGRvd25iYXNlXCIsIFt7IG5hbWU6IFwiY29sdW1uczptYXRyaXhkcm9wZG93bmNvbHVtbnNcIiwgY2xhc3NOYW1lOiBcIm1hdHJpeGRyb3Bkb3duY29sdW1uXCIgfSxcclxuICAgICAgICBcImhvcml6b250YWxTY3JvbGw6Ym9vbGVhblwiLFxyXG4gICAgICAgIHsgbmFtZTogXCJjaG9pY2VzOml0ZW12YWx1ZXNcIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55KSB7IHJldHVybiBJdGVtVmFsdWUuZ2V0RGF0YShvYmouY2hvaWNlcyk7IH0sIG9uU2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSwgdmFsdWU6IGFueSkgeyBvYmouY2hvaWNlcyA9IHZhbHVlOyB9fSxcclxuICAgICAgICB7IG5hbWU6IFwib3B0aW9uc0NhcHRpb25cIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55KSB7IHJldHVybiBvYmoub3B0aW9uc0NhcHRpb25WYWx1ZTsgfSB9LFxyXG4gICAgICAgIHsgbmFtZTogXCJjZWxsVHlwZVwiLCBkZWZhdWx0OiBcImRyb3Bkb3duXCIsIGNob2ljZXM6IFtcImRyb3Bkb3duXCIsIFwiY2hlY2tib3hcIiwgXCJyYWRpb2dyb3VwXCIsIFwidGV4dFwiLCBcImNvbW1lbnRcIl0gfSxcclxuICAgICAgICB7IG5hbWU6IFwiY29sdW1uQ29sQ291bnRcIiwgZGVmYXVsdDogMCwgY2hvaWNlczogWzAsIDEsIDIsIDMsIDRdIH0sIFwiY29sdW1uTWluV2lkdGhcIl0sXHJcbiAgICBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZShcIlwiKTsgfSwgXCJxdWVzdGlvblwiKTtcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2UudHNcbiAqKi8iLCJpbXBvcnQge0pzb25PYmplY3R9IGZyb20gJy4vanNvbm9iamVjdCc7XHJcbmltcG9ydCB7UXVlc3Rpb25CYXNlfSBmcm9tICcuL3F1ZXN0aW9uYmFzZSc7XHJcbmltcG9ydCB7U3VydmV5RXJyb3IsIFN1cnZleUVsZW1lbnR9IGZyb20gXCIuL2Jhc2VcIjtcclxuaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcclxuaW1wb3J0IHtBbnN3ZXJSZXF1aXJlZEVycm9yfSBmcm9tIFwiLi9lcnJvclwiO1xyXG5pbXBvcnQge1N1cnZleVZhbGlkYXRvciwgSVZhbGlkYXRvck93bmVyLCBWYWxpZGF0b3JSdW5uZXJ9IGZyb20gXCIuL3ZhbGlkYXRvclwiO1xyXG5pbXBvcnQge1RleHRQcmVQcm9jZXNzb3J9IGZyb20gXCIuL3RleHRQcmVQcm9jZXNzb3JcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWVzdGlvbiBleHRlbmRzIFF1ZXN0aW9uQmFzZSBpbXBsZW1lbnRzIElWYWxpZGF0b3JPd25lciB7XHJcbiAgICBwcml2YXRlIHRpdGxlVmFsdWU6IHN0cmluZyA9IG51bGw7XHJcbiAgICBwcml2YXRlIHF1ZXN0aW9uVmFsdWU6IGFueTtcclxuICAgIHByaXZhdGUgcXVlc3Rpb25Db21tZW50OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGlzUmVxdWlyZWRWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBoYXNDb21tZW50VmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgaGFzT3RoZXJWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBjb21tZW50VGV4dFZhbHVlOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSB0ZXh0UHJlUHJvY2Vzc29yOiBUZXh0UHJlUHJvY2Vzc29yO1xyXG4gICAgZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4gPSBbXTtcclxuICAgIHZhbGlkYXRvcnM6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4gPSBuZXcgQXJyYXk8U3VydmV5VmFsaWRhdG9yPigpO1xyXG4gICAgdmFsdWVDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcbiAgICBjb21tZW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xyXG4gICAgZXJyb3JzQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xyXG4gICAgdGl0bGVDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKG5hbWUpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBoYXNUaXRsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cclxuICAgIHB1YmxpYyBnZXQgaGFzSW5wdXQoKTogYm9vbGVhbiB7IHJldHVybiB0cnVlOyB9XHJcbiAgICBwdWJsaWMgZ2V0IGlucHV0SWQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuaWQgKyBcImlcIjsgfVxyXG4gICAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcgeyByZXR1cm4gKHRoaXMudGl0bGVWYWx1ZSkgPyB0aGlzLnRpdGxlVmFsdWUgOiB0aGlzLm5hbWU7IH1cclxuICAgIHB1YmxpYyBzZXQgdGl0bGUobmV3VmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMudGl0bGVWYWx1ZSA9IG5ld1ZhbHVlO1xyXG4gICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMudGl0bGVDaGFuZ2VkQ2FsbGJhY2spO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBwcm9jZXNzZWRUaXRsZSgpIHsgcmV0dXJuIHRoaXMuc3VydmV5ICE9IG51bGwgPyB0aGlzLnN1cnZleS5wcm9jZXNzVGV4dCh0aGlzLnRpdGxlKSA6IHRoaXMudGl0bGU7IH1cclxuICAgIHB1YmxpYyBnZXQgZnVsbFRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LnF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMudGV4dFByZVByb2Nlc3Nvcikge1xyXG4gICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yID0gbmV3IFRleHRQcmVQcm9jZXNzb3IoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMudGV4dFByZVByb2Nlc3Nvci5vbkhhc1ZhbHVlID0gZnVuY3Rpb24gKG5hbWU6IHN0cmluZykgeyByZXR1cm4gc2VsZi5jYW5Qcm9jZXNzZWRUZXh0VmFsdWVzKG5hbWUudG9Mb3dlckNhc2UoKSk7IH07XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3Iub25Qcm9jZXNzID0gZnVuY3Rpb24gKG5hbWU6IHN0cmluZykgeyByZXR1cm4gc2VsZi5nZXRQcm9jZXNzZWRUZXh0VmFsdWUobmFtZSk7IH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGV4dFByZVByb2Nlc3Nvci5wcm9jZXNzKHRoaXMuc3VydmV5LnF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciByZXF1aXJlVGV4dCA9IHRoaXMucmVxdWlyZWRUZXh0O1xyXG4gICAgICAgIGlmIChyZXF1aXJlVGV4dCkgcmVxdWlyZVRleHQgKz0gXCIgXCI7XHJcbiAgICAgICAgdmFyIG5vID0gdGhpcy5ubztcclxuICAgICAgICBpZiAobm8pIG5vICs9IFwiLiBcIjtcclxuICAgICAgICByZXR1cm4gbm8gKyByZXF1aXJlVGV4dCArIHRoaXMucHJvY2Vzc2VkVGl0bGU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZm9jdXMob25FcnJvcjogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgU3VydmV5RWxlbWVudC5TY3JvbGxFbGVtZW50VG9Ub3AodGhpcy5pZCk7XHJcbiAgICAgICAgdmFyIGlkID0gIW9uRXJyb3IgPyB0aGlzLmdldEZpcnN0SW5wdXRFbGVtZW50SWQoKSA6IHRoaXMuZ2V0Rmlyc3RFcnJvcklucHV0RWxlbWVudElkKCk7XHJcbiAgICAgICAgaWYgKFN1cnZleUVsZW1lbnQuRm9jdXNFbGVtZW50KGlkKSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmZvY3VzQ2FsbGJhY2spO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBnZXRGaXJzdElucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRJZDtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBnZXRGaXJzdEVycm9ySW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaXJzdElucHV0RWxlbWVudElkKCk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgY2FuUHJvY2Vzc2VkVGV4dFZhbHVlcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gbmFtZSA9PSBcIm5vXCIgfHwgbmFtZSA9PSBcInRpdGxlXCIgfHwgbmFtZSA9PSBcInJlcXVpcmVcIjtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBnZXRQcm9jZXNzZWRUZXh0VmFsdWUobmFtZTogc3RyaW5nKTogYW55IHtcclxuICAgICAgICBpZiAobmFtZSA9PSBcIm5vXCIpIHJldHVybiB0aGlzLm5vO1xyXG4gICAgICAgIGlmIChuYW1lID09IFwidGl0bGVcIikgcmV0dXJuIHRoaXMucHJvY2Vzc2VkVGl0bGU7XHJcbiAgICAgICAgaWYgKG5hbWUgPT0gXCJyZXF1aXJlXCIpIHJldHVybiB0aGlzLnJlcXVpcmVkVGV4dDtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdXBwb3J0Q29tbWVudCgpOiBib29sZWFuIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICBwdWJsaWMgc3VwcG9ydE90aGVyKCk6IGJvb2xlYW4geyByZXR1cm4gZmFsc2U7IH1cclxuICAgIHB1YmxpYyBnZXQgaXNSZXF1aXJlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuaXNSZXF1aXJlZFZhbHVlOyB9XHJcbiAgICBwdWJsaWMgc2V0IGlzUmVxdWlyZWQodmFsOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNSZXF1aXJlZCA9PSB2YWwpIHJldHVybjtcclxuICAgICAgICB0aGlzLmlzUmVxdWlyZWRWYWx1ZSA9IHZhbDtcclxuICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnRpdGxlQ2hhbmdlZENhbGxiYWNrKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgaGFzQ29tbWVudCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuaGFzQ29tbWVudFZhbHVlOyB9XHJcbiAgICBwdWJsaWMgc2V0IGhhc0NvbW1lbnQodmFsOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnN1cHBvcnRDb21tZW50KCkpIHJldHVybjtcclxuICAgICAgICB0aGlzLmhhc0NvbW1lbnRWYWx1ZSA9IHZhbDtcclxuICAgICAgICBpZiAodGhpcy5oYXNDb21tZW50KSB0aGlzLmhhc090aGVyID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGNvbW1lbnRUZXh0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmNvbW1lbnRUZXh0VmFsdWUgPyB0aGlzLmNvbW1lbnRUZXh0VmFsdWUgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3RoZXJJdGVtVGV4dFwiKTsgfVxyXG4gICAgcHVibGljIHNldCBjb21tZW50VGV4dCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5jb21tZW50VGV4dFZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGhhc090aGVyKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5oYXNPdGhlclZhbHVlOyB9XHJcbiAgICBwdWJsaWMgc2V0IGhhc090aGVyKHZhbDogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICghdGhpcy5zdXBwb3J0T3RoZXIoKSB8fCB0aGlzLmhhc090aGVyID09IHZhbCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuaGFzT3RoZXJWYWx1ZSA9IHZhbDtcclxuICAgICAgICBpZiAodGhpcy5oYXNPdGhlcikgdGhpcy5oYXNDb21tZW50ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5oYXNPdGhlckNoYW5nZWQoKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBoYXNPdGhlckNoYW5nZWQoKSB7IH1cclxuICAgIHByb3RlY3RlZCBnZXQgbm8oKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAodGhpcy52aXNpYmxlSW5kZXggPCAwKSByZXR1cm4gXCJcIjtcclxuICAgICAgICB2YXIgc3RhcnRJbmRleCA9IDE7XHJcbiAgICAgICAgdmFyIGlzTnVtZXJpYyA9IHRydWU7XHJcbiAgICAgICAgdmFyIHN0ciA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LnF1ZXN0aW9uU3RhcnRJbmRleCkge1xyXG4gICAgICAgICAgICBzdHIgPSB0aGlzLnN1cnZleS5xdWVzdGlvblN0YXJ0SW5kZXg7XHJcbiAgICAgICAgICAgIGlmIChwYXJzZUludChzdHIpKSBzdGFydEluZGV4ID0gcGFyc2VJbnQoc3RyKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAoc3RyLmxlbmd0aCA9PSAxKSBpc051bWVyaWMgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzTnVtZXJpYykgcmV0dXJuICh0aGlzLnZpc2libGVJbmRleCArIHN0YXJ0SW5kZXgpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoc3RyLmNoYXJDb2RlQXQoMCkgKyB0aGlzLnZpc2libGVJbmRleCk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgb25TZXREYXRhKCkge1xyXG4gICAgICAgIHN1cGVyLm9uU2V0RGF0YSgpO1xyXG4gICAgICAgIHRoaXMub25TdXJ2ZXlWYWx1ZUNoYW5nZWQodGhpcy52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVGcm9tRGF0YSh0aGlzLmdldFZhbHVlQ29yZSgpKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdmFsdWUobmV3VmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xyXG4gICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMudmFsdWVDaGFuZ2VkQ2FsbGJhY2spO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBjb21tZW50KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldENvbW1lbnQoKTsgfVxyXG4gICAgcHVibGljIHNldCBjb21tZW50KG5ld1ZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy5jb21tZW50ID09IG5ld1ZhbHVlKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5zZXRDb21tZW50KG5ld1ZhbHVlKTtcclxuICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmNvbW1lbnRDaGFuZ2VkQ2FsbGJhY2spO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldENvbW1lbnQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuZGF0YSAhPSBudWxsID8gdGhpcy5kYXRhLmdldENvbW1lbnQodGhpcy5uYW1lKSA6IHRoaXMucXVlc3Rpb25Db21tZW50OyB9XHJcbiAgICBwcm90ZWN0ZWQgc2V0Q29tbWVudChuZXdWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5zZXROZXdDb21tZW50KG5ld1ZhbHVlKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy52YWx1ZSA9PSBudWxsOyB9XHJcbiAgICBwdWJsaWMgaGFzRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHtcclxuICAgICAgICB0aGlzLmNoZWNrRm9yRXJyb3JzKGZpcmVDYWxsYmFjayk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JzLmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRFcnJvckNvdW50KCk6IG51bWJlciB7IHJldHVybiB0aGlzLmVycm9ycy5sZW5ndGg7IH1cclxuICAgIHB1YmxpYyBnZXQgcmVxdWlyZWRUZXh0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnN1cnZleSAhPSBudWxsICYmIHRoaXMuaXNSZXF1aXJlZCA/IHRoaXMuc3VydmV5LnJlcXVpcmVkVGV4dCA6IFwiXCI7IH1cclxuICAgIHB1YmxpYyBhZGRFcnJvcihlcnJvcjogU3VydmV5RXJyb3IpIHtcclxuICAgICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yKTtcclxuICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmVycm9yc0NoYW5nZWRDYWxsYmFjayk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGNoZWNrRm9yRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBlcnJvckxlbmd0aCA9IHRoaXMuZXJyb3JzID8gdGhpcy5lcnJvcnMubGVuZ3RoIDogMDtcclxuICAgICAgICB0aGlzLmVycm9ycyA9IFtdO1xyXG4gICAgICAgIHRoaXMub25DaGVja0ZvckVycm9ycyh0aGlzLmVycm9ycyk7XHJcbiAgICAgICAgaWYgKHRoaXMuZXJyb3JzLmxlbmd0aCA9PSAwICYmIHRoaXMudmFsdWUpIHtcclxuICAgICAgICAgICAgdmFyIGVycm9yID0gdGhpcy5ydW5WYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcnMucHVzaChlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMuZXJyb3JzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHZhciBlcnJvciA9IHRoaXMuc3VydmV5LnZhbGlkYXRlUXVlc3Rpb24odGhpcy5uYW1lKTtcclxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZmlyZUNhbGxiYWNrICYmIChlcnJvckxlbmd0aCAhPSB0aGlzLmVycm9ycy5sZW5ndGggfHwgZXJyb3JMZW5ndGggPiAwKSkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmVycm9yc0NoYW5nZWRDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIG9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcclxuICAgICAgICBpZiAodGhpcy5oYXNSZXF1aXJlZEVycm9yKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgQW5zd2VyUmVxdWlyZWRFcnJvcigpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgaGFzUmVxdWlyZWRFcnJvcigpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pc1JlcXVpcmVkICYmIHRoaXMuaXNFbXB0eSgpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHJ1blZhbGlkYXRvcnMoKTogU3VydmV5RXJyb3Ige1xyXG4gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUnVubmVyKCkucnVuKHRoaXMpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBpc1ZhbHVlQ2hhbmdlZEluU3VydmV5ID0gZmFsc2U7XHJcbiAgICBwcm90ZWN0ZWQgc2V0TmV3VmFsdWUobmV3VmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuc2V0TmV3VmFsdWVJbkRhdGEobmV3VmFsdWUpO1xyXG4gICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQoKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBzZXROZXdWYWx1ZUluRGF0YShuZXdWYWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsdWVDaGFuZ2VkSW5TdXJ2ZXkpIHtcclxuICAgICAgICAgICAgbmV3VmFsdWUgPSB0aGlzLnZhbHVlVG9EYXRhKG5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZUNvcmUobmV3VmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgZ2V0VmFsdWVDb3JlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEgIT0gbnVsbCA/IHRoaXMuZGF0YS5nZXRWYWx1ZSh0aGlzLm5hbWUpIDogdGhpcy5xdWVzdGlvblZhbHVlO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzZXRWYWx1ZUNvcmUobmV3VmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEuc2V0VmFsdWUodGhpcy5uYW1lLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvblZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHZhbHVlRnJvbURhdGEodmFsOiBhbnkpOiBhbnkgeyByZXR1cm4gdmFsOyB9XHJcbiAgICBwcm90ZWN0ZWQgdmFsdWVUb0RhdGEodmFsOiBhbnkpOiBhbnkgeyByZXR1cm4gdmFsOyB9XHJcbiAgICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7IH1cclxuICAgIHByb3RlY3RlZCBzZXROZXdDb21tZW50KG5ld1ZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy5kYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhLnNldENvbW1lbnQodGhpcy5uYW1lLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHRoaXMucXVlc3Rpb25Db21tZW50ID0gbmV3VmFsdWU7XHJcbiAgICB9XHJcbiAgICAvL0lRdWVzdGlvblxyXG4gICAgb25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuaXNWYWx1ZUNoYW5nZWRJblN1cnZleSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWVGcm9tRGF0YShuZXdWYWx1ZSk7XHJcbiAgICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jb21tZW50Q2hhbmdlZENhbGxiYWNrKTtcclxuICAgICAgICB0aGlzLmlzVmFsdWVDaGFuZ2VkSW5TdXJ2ZXkgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vSVZhbGlkYXRvck93bmVyXHJcbiAgICBnZXRWYWxpZGF0b3JUaXRsZSgpOiBzdHJpbmcgeyByZXR1cm4gbnVsbDsgfVxyXG59XHJcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJxdWVzdGlvblwiLCBbeyBuYW1lOiBcInRpdGxlOnRleHRcIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55KSB7IHJldHVybiBvYmoudGl0bGVWYWx1ZTsgfSB9LFxyXG4gICAgeyBuYW1lOiBcImNvbW1lbnRUZXh0XCIsIG9uR2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSkgeyByZXR1cm4gb2JqLmNvbW1lbnRUZXh0VmFsdWU7IH0gfSxcclxuICAgIFwiaXNSZXF1aXJlZDpib29sZWFuXCIsIHsgbmFtZTogXCJ2YWxpZGF0b3JzOnZhbGlkYXRvcnNcIiwgYmFzZUNsYXNzTmFtZTogXCJzdXJ2ZXl2YWxpZGF0b3JcIiwgY2xhc3NOYW1lUGFydDogXCJ2YWxpZGF0b3JcIn1dLCBudWxsLCBcInF1ZXN0aW9uYmFzZVwiKTtcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9xdWVzdGlvbi50c1xuICoqLyIsImltcG9ydCB7QmFzZSwgSVF1ZXN0aW9uLCBJQ29uZGl0aW9uUnVubmVyLCBJU3VydmV5RGF0YSwgSVN1cnZleSwgSGFzaFRhYmxlfSBmcm9tICcuL2Jhc2UnO1xyXG5pbXBvcnQge0pzb25PYmplY3R9IGZyb20gJy4vanNvbm9iamVjdCc7XHJcbmltcG9ydCB7Q29uZGl0aW9uUnVubmVyfSBmcm9tICcuL2NvbmRpdGlvbnMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQmFzZSBleHRlbmRzIEJhc2UgaW1wbGVtZW50cyBJUXVlc3Rpb24sIElDb25kaXRpb25SdW5uZXIge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcXVlc3Rpb25Db3VudGVyID0gMTAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0UXVlc3Rpb25JZCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcInNxX1wiICsgUXVlc3Rpb25CYXNlLnF1ZXN0aW9uQ291bnRlcisrO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGRhdGE6IElTdXJ2ZXlEYXRhO1xyXG4gICAgcHJvdGVjdGVkIHN1cnZleTogSVN1cnZleTtcclxuICAgIHByaXZhdGUgY29uZGl0aW9uUnVubmVyOiBDb25kaXRpb25SdW5uZXIgPSBudWxsO1xyXG4gICAgcHVibGljIHZpc2libGVJZjogc3RyaW5nID0gXCJcIjtcclxuICAgIHByaXZhdGUgaWRWYWx1ZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSB2aXNpYmxlVmFsdWU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHVibGljIHN0YXJ0V2l0aE5ld0xpbmU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSB2aXNpYmxlSW5kZXhWYWx1ZTogbnVtYmVyID0gLTE7XHJcbiAgICBwdWJsaWMgd2lkdGg6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIHJlbmRlcldpZHRoVmFsdWU6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwcml2YXRlIHJpZ2h0SW5kZW50VmFsdWU6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgaW5kZW50OiBudW1iZXIgPSAwO1xyXG4gICAgZm9jdXNDYWxsYmFjazogKCkgPT4gdm9pZDtcclxuICAgIHJlbmRlcldpZHRoQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xyXG4gICAgcm93VmlzaWJpbGl0eUNoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcclxuICAgIHZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcbiAgICB2aXNpYmxlSW5kZXhDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5pZFZhbHVlID0gUXVlc3Rpb25CYXNlLmdldFF1ZXN0aW9uSWQoKTtcclxuICAgICAgICB0aGlzLm9uQ3JlYXRpbmcoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMudmlzaWJsZVZhbHVlOyB9XHJcbiAgICBwdWJsaWMgc2V0IHZpc2libGUodmFsOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHZhbCA9PSB0aGlzLnZpc2libGUpIHJldHVybjtcclxuICAgICAgICB0aGlzLnZpc2libGVWYWx1ZSA9IHZhbDtcclxuICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2spO1xyXG4gICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucm93VmlzaWJpbGl0eUNoYW5nZWRDYWxsYmFjayk7XHJcbiAgICAgICAgaWYgKHRoaXMuc3VydmV5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uVmlzaWJpbGl0eUNoYW5nZWQoPElRdWVzdGlvbj50aGlzLCB0aGlzLnZpc2libGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgdmlzaWJsZUluZGV4KCk6IG51bWJlciB7IHJldHVybiB0aGlzLnZpc2libGVJbmRleFZhbHVlOyB9XHJcbiAgICBwdWJsaWMgaGFzRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRFcnJvckNvdW50KCk6IG51bWJlciB7IHJldHVybiAwOyB9XHJcbiAgICBwdWJsaWMgZ2V0IGhhc1RpdGxlKCk6IGJvb2xlYW4geyByZXR1cm4gZmFsc2U7IH1cclxuICAgIHB1YmxpYyBnZXQgaGFzSW5wdXQoKTogYm9vbGVhbiB7IHJldHVybiBmYWxzZTsgfVxyXG4gICAgcHVibGljIGdldCBoYXNDb21tZW50KCk6IGJvb2xlYW4geyByZXR1cm4gZmFsc2U7IH1cclxuICAgIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuaWRWYWx1ZTsgfVxyXG4gICAgcHVibGljIGdldCByZW5kZXJXaWR0aCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5yZW5kZXJXaWR0aFZhbHVlOyB9XHJcbiAgICBwdWJsaWMgc2V0IHJlbmRlcldpZHRoKHZhbDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHZhbCA9PSB0aGlzLnJlbmRlcldpZHRoKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5yZW5kZXJXaWR0aFZhbHVlID0gdmFsO1xyXG4gICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucmVuZGVyV2lkdGhDaGFuZ2VkQ2FsbGJhY2spO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCByaWdodEluZGVudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5yaWdodEluZGVudFZhbHVlOyB9XHJcbiAgICBwdWJsaWMgc2V0IHJpZ2h0SW5kZW50KHZhbDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHZhbCA9PSB0aGlzLnJpZ2h0SW5kZW50KSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5yaWdodEluZGVudFZhbHVlID0gdmFsO1xyXG4gICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucmVuZGVyV2lkdGhDaGFuZ2VkQ2FsbGJhY2spO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGZvY3VzKG9uRXJyb3I6IGJvb2xlYW4gPSBmYWxzZSkgeyB9XHJcbiAgICBzZXREYXRhKG5ld1ZhbHVlOiBJU3VydmV5RGF0YSkge1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IG5ld1ZhbHVlO1xyXG4gICAgICAgIHRoaXMuc3VydmV5ID0gKG5ld1ZhbHVlICYmIG5ld1ZhbHVlW1wicXVlc3Rpb25BZGRlZFwiXSkgPyA8SVN1cnZleT5uZXdWYWx1ZSA6IG51bGw7XHJcbiAgICAgICAgdGhpcy5vblNldERhdGEoKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBmaXJlQ2FsbGJhY2soY2FsbGJhY2s6ICgpID0+IHZvaWQpIHtcclxuICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKCk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgb25TZXREYXRhKCkgeyB9XHJcbiAgICBwcm90ZWN0ZWQgb25DcmVhdGluZygpIHsgfVxyXG4gICAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnZpc2libGVJZikgcmV0dXJuO1xyXG4gICAgICAgIGlmICghdGhpcy5jb25kaXRpb25SdW5uZXIpIHRoaXMuY29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLnZpc2libGVJZik7XHJcbiAgICAgICAgdGhpcy5jb25kaXRpb25SdW5uZXIuZXhwcmVzc2lvbiA9IHRoaXMudmlzaWJsZUlmO1xyXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IHRoaXMuY29uZGl0aW9uUnVubmVyLnJ1bih2YWx1ZXMpO1xyXG4gICAgfVxyXG4gICAgLy9JUXVlc3Rpb25cclxuICAgIG9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBhbnkpIHtcclxuICAgIH1cclxuICAgIG9uU3VydmV5TG9hZCgpIHtcclxuICAgIH1cclxuICAgIHNldFZpc2libGVJbmRleCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlzaWJsZUluZGV4VmFsdWUgPT0gdmFsdWUpIHJldHVybjtcclxuICAgICAgICB0aGlzLnZpc2libGVJbmRleFZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy52aXNpYmxlSW5kZXhDaGFuZ2VkQ2FsbGJhY2spO1xyXG4gICAgfVxyXG4gICAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7IHJldHVybiBmYWxzZTsgfVxyXG59XHJcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJxdWVzdGlvbmJhc2VcIiwgW1wiIW5hbWVcIiwgeyBuYW1lOiBcInZpc2libGU6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sIFwidmlzaWJsZUlmOnRleHRcIixcclxuICAgIHsgbmFtZTogXCJ3aWR0aFwiIH0sIHsgbmFtZTogXCJzdGFydFdpdGhOZXdMaW5lOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZX0sIHtuYW1lOiBcImluZGVudDpudW1iZXJcIiwgZGVmYXVsdDogMCwgY2hvaWNlczogWzAsIDEsIDIsIDNdfV0pO1xuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3F1ZXN0aW9uYmFzZS50c1xuICoqLyIsImV4cG9ydCBjbGFzcyBUZXh0UHJlUHJvY2Vzc29ySXRlbSB7XHJcbiAgICBwdWJsaWMgc3RhcnQ6IG51bWJlcjtcclxuICAgIHB1YmxpYyBlbmQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFRleHRQcmVQcm9jZXNzb3Ige1xyXG4gICAgcHVibGljIG9uUHJvY2VzczogKG5hbWU6IHN0cmluZykgPT4gYW55O1xyXG4gICAgcHVibGljIG9uSGFzVmFsdWU6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XHJcbiAgICBjb25zdHJ1Y3RvcigpIHsgfVxyXG4gICAgcHVibGljIHByb2Nlc3ModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoIXRleHQpIHJldHVybiB0ZXh0O1xyXG4gICAgICAgIGlmICghdGhpcy5vblByb2Nlc3MpIHJldHVybiB0ZXh0O1xyXG4gICAgICAgIHZhciBpdGVtcyA9IHRoaXMuZ2V0SXRlbXModGV4dCk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IGl0ZW1zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtID0gaXRlbXNbaV07XHJcbiAgICAgICAgICAgIHZhciBuYW1lID0gdGhpcy5nZXROYW1lKHRleHQuc3Vic3RyaW5nKGl0ZW0uc3RhcnQgKyAxLCBpdGVtLmVuZCkpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY2FuUHJvY2Vzc05hbWUobmFtZSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vbkhhc1ZhbHVlICYmICF0aGlzLm9uSGFzVmFsdWUobmFtZSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLm9uUHJvY2VzcyhuYW1lKTtcclxuICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHZhbHVlID0gXCJcIjtcclxuICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyKDAsIGl0ZW0uc3RhcnQpICsgdmFsdWUgKyB0ZXh0LnN1YnN0cihpdGVtLmVuZCArIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGV4dDtcclxuICAgIH1cclxuICAgIHByaXZhdGUgZ2V0SXRlbXModGV4dDogc3RyaW5nKTogQXJyYXk8VGV4dFByZVByb2Nlc3Nvckl0ZW0+IHtcclxuICAgICAgICB2YXIgaXRlbXMgPSBbXTtcclxuICAgICAgICB2YXIgbGVuZ3RoID0gdGV4dC5sZW5ndGg7XHJcbiAgICAgICAgdmFyIHN0YXJ0ID0gLTE7XHJcbiAgICAgICAgdmFyIGNoID0gJyc7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjaCA9IHRleHRbaV07XHJcbiAgICAgICAgICAgIGlmIChjaCA9PSAneycpIHN0YXJ0ID0gaTtcclxuICAgICAgICAgICAgaWYgKGNoID09ICd9Jykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG5ldyBUZXh0UHJlUHJvY2Vzc29ySXRlbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uc3RhcnQgPSBzdGFydDtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLmVuZCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHN0YXJ0ID0gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBnZXROYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKCFuYW1lKSByZXR1cm47XHJcbiAgICAgICAgcmV0dXJuIG5hbWUudHJpbSgpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBjYW5Qcm9jZXNzTmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIW5hbWUpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGNoID0gbmFtZVtpXTtcclxuICAgICAgICAgICAgLy9UT0RPXHJcbiAgICAgICAgICAgIGlmIChjaCA9PSAnICcgfHwgY2ggPT0gJy0nIHx8IGNoID09ICcmJykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3RleHRQcmVQcm9jZXNzb3IudHNcbiAqKi8iLCJpbXBvcnQge0pzb25PYmplY3R9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcclxuaW1wb3J0IHtRdWVzdGlvbn0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcclxuaW1wb3J0IHtJdGVtVmFsdWUsIFN1cnZleUVycm9yfSBmcm9tIFwiLi9iYXNlXCI7XHJcbmltcG9ydCB7c3VydmV5TG9jYWxpemF0aW9ufSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XHJcbmltcG9ydCB7Q3VzdG9tRXJyb3J9IGZyb20gXCIuL2Vycm9yXCI7XHJcbmltcG9ydCB7Q2hvaWNlc1Jlc3RmdWxsfSBmcm9tIFwiLi9jaG9pY2VzUmVzdGZ1bGxcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWVzdGlvblNlbGVjdEJhc2UgZXh0ZW5kcyBRdWVzdGlvbiB7XHJcbiAgICBwcml2YXRlIHZpc2libGVDaG9pY2VzQ2FjaGU6IEFycmF5PEl0ZW1WYWx1ZT4gPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBjb21tZW50VmFsdWU6IHN0cmluZztcclxuICAgIHByb3RlY3RlZCBjYWNoZWRWYWx1ZTogYW55O1xyXG4gICAgb3RoZXJJdGVtOiBJdGVtVmFsdWUgPSBuZXcgSXRlbVZhbHVlKFwib3RoZXJcIiwgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm90aGVySXRlbVRleHRcIikpO1xyXG4gICAgcHJpdmF0ZSBjaG9pY2VzRnJvbVVybDogQXJyYXk8SXRlbVZhbHVlPiA9IG51bGw7XHJcbiAgICBwcml2YXRlIGNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdGlvbjogYW55ID0gbnVsbDtcclxuICAgIHByaXZhdGUgY2hvaWNlc1ZhbHVlczogQXJyYXk8SXRlbVZhbHVlPiA9IG5ldyBBcnJheTxJdGVtVmFsdWU+KCk7XHJcbiAgICBwdWJsaWMgY2hvaWNlc0J5VXJsOiBDaG9pY2VzUmVzdGZ1bGw7XHJcbiAgICBwdWJsaWMgb3RoZXJFcnJvclRleHQ6IHN0cmluZyA9IG51bGw7XHJcbiAgICBwdWJsaWMgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgY2hvaWNlc09yZGVyVmFsdWU6IHN0cmluZyA9IFwibm9uZVwiO1xyXG4gICAgY2hvaWNlc0NoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcclxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKG5hbWUpO1xyXG4gICAgICAgIHRoaXMuY2hvaWNlc0J5VXJsID0gdGhpcy5jcmVhdGVSZXN0ZnVsbCgpO1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICB0aGlzLmNob2ljZXNCeVVybC5nZXRSZXN1bHRDYWxsYmFjayA9IGZ1bmN0aW9uIChpdGVtczogQXJyYXk8SXRlbVZhbHVlPikgeyBzZWxmLm9uTG9hZENob2ljZXNGcm9tVXJsKGl0ZW1zKSB9O1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBpc090aGVyU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RvcmVPdGhlcnNBc0NvbW1lbnQoKSA/IHRoaXMuZ2V0SGFzT3RoZXIodGhpcy52YWx1ZSkgOiB0aGlzLmdldEhhc090aGVyKHRoaXMuY2FjaGVkVmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldEhhc090aGVyKHZhbDogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHZhbCA9PSB0aGlzLm90aGVySXRlbS52YWx1ZTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBjcmVhdGVSZXN0ZnVsbCgpOiBDaG9pY2VzUmVzdGZ1bGwgeyByZXR1cm4gbmV3IENob2ljZXNSZXN0ZnVsbCgpOyB9XHJcbiAgICBwcm90ZWN0ZWQgZ2V0Q29tbWVudCgpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICh0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkpIHJldHVybiBzdXBlci5nZXRDb21tZW50KCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWVudFZhbHVlO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBpc1NldHRpbmdDb21tZW50OiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwcm90ZWN0ZWQgc2V0Q29tbWVudChuZXdWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0U3RvcmVPdGhlcnNBc0NvbW1lbnQoKSlcclxuICAgICAgICAgICAgc3VwZXIuc2V0Q29tbWVudChuZXdWYWx1ZSk7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1NldHRpbmdDb21tZW50ICYmIG5ld1ZhbHVlICE9IHRoaXMuY29tbWVudFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2V0dGluZ0NvbW1lbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb21tZW50VmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzT3RoZXJTZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TmV3VmFsdWVJbkRhdGEodGhpcy5jYWNoZWRWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2V0dGluZ0NvbW1lbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBzZXROZXdWYWx1ZShuZXdWYWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKG5ld1ZhbHVlKSB0aGlzLmNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdGlvbiA9IG5ld1ZhbHVlOyAgICAgICAgXHJcbiAgICAgICAgc3VwZXIuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHZhbHVlRnJvbURhdGEodmFsOiBhbnkpOiBhbnkge1xyXG4gICAgICAgIGlmICh0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkpIHJldHVybiBzdXBlci52YWx1ZUZyb21EYXRhKHZhbCk7XHJcbiAgICAgICAgdGhpcy5jYWNoZWRWYWx1ZSA9IHRoaXMudmFsdWVGcm9tRGF0YUNvcmUodmFsKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRWYWx1ZTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCB2YWx1ZVRvRGF0YSh2YWw6IGFueSk6IGFueSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0U3RvcmVPdGhlcnNBc0NvbW1lbnQoKSkgcmV0dXJuIHN1cGVyLnZhbHVlVG9EYXRhKHZhbCk7XHJcbiAgICAgICAgdGhpcy5jYWNoZWRWYWx1ZSA9IHZhbDtcclxuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZVRvRGF0YUNvcmUodmFsKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCB2YWx1ZUZyb21EYXRhQ29yZSh2YWw6IGFueSk6IGFueSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc1Vua25vd25WYWx1ZSh2YWwpKSByZXR1cm4gdmFsO1xyXG4gICAgICAgIGlmICh2YWwgPT0gdGhpcy5vdGhlckl0ZW0udmFsdWUpIHJldHVybiB2YWw7XHJcbiAgICAgICAgdGhpcy5jb21tZW50ID0gdmFsO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm90aGVySXRlbS52YWx1ZTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCB2YWx1ZVRvRGF0YUNvcmUodmFsOiBhbnkpOiBhbnkge1xyXG4gICAgICAgIGlmICh2YWwgPT0gdGhpcy5vdGhlckl0ZW0udmFsdWUgJiYgdGhpcy5nZXRDb21tZW50KCkpIHtcclxuICAgICAgICAgICAgdmFsID0gdGhpcy5nZXRDb21tZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWw7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgaGFzVW5rbm93blZhbHVlKHZhbDogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCF2YWwpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLmFjdGl2ZUNob2ljZXM7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoaXRlbXNbaV0udmFsdWUgPT0gdmFsKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNob2ljZXMoKTogQXJyYXk8YW55PiB7IHJldHVybiB0aGlzLmNob2ljZXNWYWx1ZXM7IH1cclxuICAgIHNldCBjaG9pY2VzKG5ld1ZhbHVlOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgSXRlbVZhbHVlLnNldERhdGEodGhpcy5jaG9pY2VzVmFsdWVzLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGhhc090aGVyQ2hhbmdlZCgpIHtcclxuICAgICAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgY2hvaWNlc09yZGVyKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmNob2ljZXNPcmRlclZhbHVlOyB9XHJcbiAgICBzZXQgY2hvaWNlc09yZGVyKG5ld1ZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAobmV3VmFsdWUgPT0gdGhpcy5jaG9pY2VzT3JkZXJWYWx1ZSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuY2hvaWNlc09yZGVyVmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgb3RoZXJUZXh0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLm90aGVySXRlbS50ZXh0OyB9XHJcbiAgICBzZXQgb3RoZXJUZXh0KHZhbHVlOiBzdHJpbmcpIHsgdGhpcy5vdGhlckl0ZW0udGV4dCA9IHZhbHVlOyB9XHJcbiAgICBnZXQgdmlzaWJsZUNob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc090aGVyICYmIHRoaXMuY2hvaWNlc09yZGVyID09IFwibm9uZVwiKSByZXR1cm4gdGhpcy5hY3RpdmVDaG9pY2VzO1xyXG4gICAgICAgIGlmKCF0aGlzLnZpc2libGVDaG9pY2VzQ2FjaGUpIHtcclxuICAgICAgICAgICAgdGhpcy52aXNpYmxlQ2hvaWNlc0NhY2hlID0gdGhpcy5zb3J0VmlzaWJsZUNob2ljZXModGhpcy5hY3RpdmVDaG9pY2VzLnNsaWNlKCkpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5oYXNPdGhlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aXNpYmxlQ2hvaWNlc0NhY2hlLnB1c2godGhpcy5vdGhlckl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2libGVDaG9pY2VzQ2FjaGU7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGdldCBhY3RpdmVDaG9pY2VzKCk6IEFycmF5PEl0ZW1WYWx1ZT4geyByZXR1cm4gdGhpcy5jaG9pY2VzRnJvbVVybCA/IHRoaXMuY2hvaWNlc0Zyb21VcmwgOiB0aGlzLmNob2ljZXM7IH1cclxuICAgIHB1YmxpYyBzdXBwb3J0Q29tbWVudCgpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cclxuICAgIHB1YmxpYyBzdXBwb3J0T3RoZXIoKTogYm9vbGVhbiB7IHJldHVybiB0cnVlOyB9XHJcbiAgICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xyXG4gICAgICAgIHN1cGVyLm9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzKTtcclxuICAgICAgICBpZiAoIXRoaXMuaXNPdGhlclNlbGVjdGVkIHx8IHRoaXMuY29tbWVudCkgcmV0dXJuO1xyXG4gICAgICAgIHZhciB0ZXh0ID0gdGhpcy5vdGhlckVycm9yVGV4dDtcclxuICAgICAgICBpZiAoIXRleHQpIHtcclxuICAgICAgICAgICAgdGV4dCA9IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlclJlcXVpcmVkRXJyb3JcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVycm9ycy5wdXNoKG5ldyBDdXN0b21FcnJvcih0ZXh0KSk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgZ2V0U3RvcmVPdGhlcnNBc0NvbW1lbnQoKSB7IHJldHVybiB0aGlzLnN0b3JlT3RoZXJzQXNDb21tZW50ICYmICh0aGlzLnN1cnZleSAhPSBudWxsID8gdGhpcy5zdXJ2ZXkuc3RvcmVPdGhlcnNBc0NvbW1lbnQgOiB0cnVlKTsgfVxyXG4gICAgb25TdXJ2ZXlMb2FkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNob2ljZXNCeVVybCkgdGhpcy5jaG9pY2VzQnlVcmwucnVuKCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIG9uTG9hZENob2ljZXNGcm9tVXJsKGFycmF5OiBBcnJheTxJdGVtVmFsdWU+KSB7XHJcbiAgICAgICAgdmFyIGVycm9yQ291bnQgPSB0aGlzLmVycm9ycy5sZW5ndGg7XHJcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5jaG9pY2VzQnlVcmwgJiYgdGhpcy5jaG9pY2VzQnlVcmwuZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvcnMucHVzaCh0aGlzLmNob2ljZXNCeVVybC5lcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlcnJvckNvdW50ID4gMCB8fCB0aGlzLmVycm9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuZXJyb3JzQ2hhbmdlZENhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG5ld0Nob2ljZXMgPSBudWxsO1xyXG4gICAgICAgIGlmIChhcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG5ld0Nob2ljZXMgPSBuZXcgQXJyYXk8SXRlbVZhbHVlPigpO1xyXG4gICAgICAgICAgICBJdGVtVmFsdWUuc2V0RGF0YShuZXdDaG9pY2VzLCBhcnJheSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2hvaWNlc0Zyb21VcmwgPSBuZXdDaG9pY2VzO1xyXG4gICAgICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcclxuICAgICAgICBpZiAodGhpcy5jYWNoZWRWYWx1ZUZvclVybFJlcXVlc3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0aW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgb25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKSB7XHJcbiAgICAgICAgdGhpcy52aXNpYmxlQ2hvaWNlc0NhY2hlID0gbnVsbDtcclxuICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmNob2ljZXNDaGFuZ2VkQ2FsbGJhY2spO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzb3J0VmlzaWJsZUNob2ljZXMoYXJyYXk6IEFycmF5PEl0ZW1WYWx1ZT4pOiBBcnJheTxJdGVtVmFsdWU+IHtcclxuICAgICAgICB2YXIgb3JkZXIgPSB0aGlzLmNob2ljZXNPcmRlci50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmIChvcmRlciA9PSBcImFzY1wiKSByZXR1cm4gdGhpcy5zb3J0QXJyYXkoYXJyYXksIDEpO1xyXG4gICAgICAgIGlmIChvcmRlciA9PSBcImRlc2NcIikgcmV0dXJuIHRoaXMuc29ydEFycmF5KGFycmF5LCAtMSk7XHJcbiAgICAgICAgaWYgKG9yZGVyID09IFwicmFuZG9tXCIpIHJldHVybiB0aGlzLnJhbmRvbWl6ZUFycmF5KGFycmF5KTtcclxuICAgICAgICByZXR1cm4gYXJyYXk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHNvcnRBcnJheShhcnJheTogQXJyYXk8SXRlbVZhbHVlPiwgbXVsdDogbnVtYmVyKTogQXJyYXk8SXRlbVZhbHVlPiB7XHJcbiAgICAgICAgcmV0dXJuIGFycmF5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgICAgICAgICAgaWYgKGEudGV4dCA8IGIudGV4dCkgcmV0dXJuIC0xICogbXVsdDtcclxuICAgICAgICAgICAgaWYgKGEudGV4dCA+IGIudGV4dCkgcmV0dXJuIDEgKiBtdWx0O1xyXG4gICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgcmFuZG9taXplQXJyYXkoYXJyYXk6IEFycmF5PEl0ZW1WYWx1ZT4pOiBBcnJheTxJdGVtVmFsdWU+IHtcclxuICAgICAgICBmb3IgKHZhciBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xyXG4gICAgICAgICAgICB2YXIgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xyXG4gICAgICAgICAgICB2YXIgdGVtcCA9IGFycmF5W2ldO1xyXG4gICAgICAgICAgICBhcnJheVtpXSA9IGFycmF5W2pdO1xyXG4gICAgICAgICAgICBhcnJheVtqXSA9IHRlbXA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcnJheTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ2hlY2tib3hCYXNlIGV4dGVuZHMgUXVlc3Rpb25TZWxlY3RCYXNlIHtcclxuICAgIHByaXZhdGUgY29sQ291bnRWYWx1ZTogbnVtYmVyID0gMTtcclxuICAgIGNvbENvdW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKG5hbWUpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBjb2xDb3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5jb2xDb3VudFZhbHVlOyB9XHJcbiAgICBwdWJsaWMgc2V0IGNvbENvdW50KHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuY29sQ291bnRWYWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xyXG4gICAgfVxyXG59XHJcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJzZWxlY3RiYXNlXCIsIFtcImhhc0NvbW1lbnQ6Ym9vbGVhblwiLCBcImhhc090aGVyOmJvb2xlYW5cIixcclxuICAgIHsgbmFtZTogXCJjaG9pY2VzOml0ZW12YWx1ZXNcIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55KSB7IHJldHVybiBJdGVtVmFsdWUuZ2V0RGF0YShvYmouY2hvaWNlcyk7IH0sIG9uU2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSwgdmFsdWU6IGFueSkgeyBvYmouY2hvaWNlcyA9IHZhbHVlOyB9fSxcclxuICAgIHsgbmFtZTogXCJjaG9pY2VzT3JkZXJcIiwgZGVmYXVsdDogXCJub25lXCIsIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJhc2NcIiwgXCJkZXNjXCIsIFwicmFuZG9tXCJdIH0sXHJcbiAgICB7IG5hbWU6IFwiY2hvaWNlc0J5VXJsOnJlc3RmdWxsXCIsIGNsYXNzTmFtZTogXCJDaG9pY2VzUmVzdGZ1bGxcIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55KSB7IHJldHVybiBvYmouY2hvaWNlc0J5VXJsLmlzRW1wdHkgPyBudWxsIDogb2JqLmNob2ljZXNCeVVybDsgfSwgb25TZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55LCB2YWx1ZTogYW55KSB7IG9iai5jaG9pY2VzQnlVcmwuc2V0RGF0YSh2YWx1ZSk7IH0gfSxcclxuICAgIHsgbmFtZTogXCJvdGhlclRleHRcIiwgZGVmYXVsdDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm90aGVySXRlbVRleHRcIikgfSwgXCJvdGhlckVycm9yVGV4dFwiLFxyXG4gICAgeyBuYW1lOiBcInN0b3JlT3RoZXJzQXNDb21tZW50OmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZX1dLCBudWxsLCBcInF1ZXN0aW9uXCIpO1xyXG5cclxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcImNoZWNrYm94YmFzZVwiLCBbeyBuYW1lOiBcImNvbENvdW50Om51bWJlclwiLCBkZWZhdWx0OiAxLCBjaG9pY2VzOiBbMCwgMSwgMiwgMywgNF0gfV0sIG51bGwsIFwic2VsZWN0YmFzZVwiKTtcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9xdWVzdGlvbl9iYXNlc2VsZWN0LnRzXG4gKiovIiwiaW1wb3J0IHtRdWVzdGlvbkJhc2V9IGZyb20gJy4vcXVlc3Rpb25iYXNlJztcclxuaW1wb3J0IHtIYXNoVGFibGV9IGZyb20gXCIuL2Jhc2VcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkZhY3Rvcnkge1xyXG4gICAgcHVibGljIHN0YXRpYyBJbnN0YW5jZTogUXVlc3Rpb25GYWN0b3J5ID0gbmV3IFF1ZXN0aW9uRmFjdG9yeSgpO1xyXG4gICAgcHVibGljIHN0YXRpYyBEZWZhdWx0Q2hvaWNlcyA9IFtcIm9uZVwiLCBcInR3b3xzZWNvbmQgdmFsdWVcIiwgXCJ0aHJlZXx0aGlyZCB2YWx1ZVwiXTtcclxuICAgIHByaXZhdGUgY3JlYXRvckhhc2g6IEhhc2hUYWJsZTwobmFtZTogc3RyaW5nKSA9PiBRdWVzdGlvbkJhc2U+ID0ge307XHJcblxyXG4gICAgcHVibGljIHJlZ2lzdGVyUXVlc3Rpb24ocXVlc3Rpb25UeXBlOiBzdHJpbmcsIHF1ZXN0aW9uQ3JlYXRvcjogKG5hbWU6IHN0cmluZykgPT4gUXVlc3Rpb25CYXNlKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdG9ySGFzaFtxdWVzdGlvblR5cGVdID0gcXVlc3Rpb25DcmVhdG9yO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldEFsbFR5cGVzKCk6IEFycmF5PHN0cmluZz4ge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG4gICAgICAgIGZvcih2YXIga2V5IGluIHRoaXMuY3JlYXRvckhhc2gpIHtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5zb3J0KCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgY3JlYXRlUXVlc3Rpb24ocXVlc3Rpb25UeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uQmFzZSB7XHJcbiAgICAgICAgdmFyIGNyZWF0b3IgPSB0aGlzLmNyZWF0b3JIYXNoW3F1ZXN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKGNyZWF0b3IgPT0gbnVsbCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIGNyZWF0b3IobmFtZSk7XHJcbiAgICB9XHJcbn1cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9xdWVzdGlvbmZhY3RvcnkudHNcbiAqKi8iLCJpbXBvcnQge1F1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UsXHJcbiAgICBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcclxuICAgIElNYXRyaXhEcm9wZG93bkRhdGFcclxufSBmcm9tIFwiLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2VcIjtcclxuaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XHJcbmltcG9ydCB7SXRlbVZhbHVlfSBmcm9tIFwiLi9iYXNlXCI7XHJcbmltcG9ydCB7UXVlc3Rpb25GYWN0b3J5fSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBNYXRyaXhEcm9wZG93blJvd01vZGVsIGV4dGVuZHMgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IGFueSwgcHVibGljIHRleHQ6IHN0cmluZywgZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YSwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIHN1cGVyKGRhdGEsIHZhbHVlKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgcm93TmFtZSgpIHsgcmV0dXJuIHRoaXMubmFtZTsgfVxyXG59XHJcbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlIGltcGxlbWVudHMgSU1hdHJpeERyb3Bkb3duRGF0YSB7XHJcbiAgICBwcml2YXRlIHJvd3NWYWx1ZTogSXRlbVZhbHVlW10gPSBbXTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcIm1hdHJpeGRyb3Bkb3duXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHJvd3MoKTogQXJyYXk8YW55PiB7IHJldHVybiB0aGlzLnJvd3NWYWx1ZTsgfVxyXG4gICAgcHVibGljIHNldCByb3dzKG5ld1ZhbHVlOiBBcnJheTxhbnk+KSB7XHJcbiAgICAgICAgSXRlbVZhbHVlLnNldERhdGEodGhpcy5yb3dzVmFsdWUsIG5ld1ZhbHVlKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBnZW5lcmF0ZVJvd3MoKTogQXJyYXk8TWF0cml4RHJvcGRvd25Sb3dNb2RlbD4ge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8TWF0cml4RHJvcGRvd25Sb3dNb2RlbD4oKTtcclxuICAgICAgICBpZiAoIXRoaXMucm93cyB8fCB0aGlzLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xyXG4gICAgICAgIGlmICghdmFsKSB2YWwgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMucm93c1tpXS52YWx1ZSkgY29udGludWU7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY3JlYXRlTWF0cml4Um93KHRoaXMucm93c1tpXS52YWx1ZSwgdGhpcy5yb3dzW2ldLnRleHQsIHZhbFt0aGlzLnJvd3NbaV0udmFsdWVdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlTWF0cml4Um93KG5hbWU6IGFueSwgdGV4dDogc3RyaW5nLCB2YWx1ZTogYW55KTogTWF0cml4RHJvcGRvd25Sb3dNb2RlbCB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNYXRyaXhEcm9wZG93blJvd01vZGVsKG5hbWUsIHRleHQsIHRoaXMsIHZhbHVlKTtcclxuICAgIH1cclxufVxyXG5cclxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcIm1hdHJpeGRyb3Bkb3duXCIsIFt7IG5hbWU6IFwicm93czppdGVtdmFsdWVzXCIsIG9uR2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSkgeyByZXR1cm4gSXRlbVZhbHVlLmdldERhdGEob2JqLnJvd3MpOyB9LCBvblNldFZhbHVlOiBmdW5jdGlvbiAob2JqOiBhbnksIHZhbHVlOiBhbnkpIHsgb2JqLnJvd3MgPSB2YWx1ZTsgfX1dLFxyXG4gICAgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbChcIlwiKTsgfSwgXCJtYXRyaXhkcm9wZG93bmJhc2VcIik7XHJcblxyXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeGRyb3Bkb3duXCIsIChuYW1lKSA9PiB7IHZhciBxID0gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbChuYW1lKTsgcS5jaG9pY2VzID0gWzEsIDIsIDMsIDQsIDVdOyBxLnJvd3MgPSBbXCJSb3cgMVwiLCBcIlJvdyAyXCJdOyBxLmFkZENvbHVtbihcIkNvbHVtbiAxXCIpOyBxLmFkZENvbHVtbihcIkNvbHVtbiAyXCIpOyBxLmFkZENvbHVtbihcIkNvbHVtbiAzXCIpOyByZXR1cm4gcTsgfSk7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHJvcGRvd24udHNcbiAqKi8iLCJpbXBvcnQge1F1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UsXHJcbiAgICBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSwgSU1hdHJpeERyb3Bkb3duRGF0YVxyXG59IGZyb20gXCIuL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZVwiO1xyXG5pbXBvcnQge0pzb25PYmplY3R9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcclxuaW1wb3J0IHtRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xyXG5pbXBvcnQge3N1cnZleUxvY2FsaXphdGlvbn0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xyXG5pbXBvcnQge1N1cnZleUVycm9yfSBmcm9tIFwiLi9iYXNlXCI7XHJcbmltcG9ydCB7Q3VzdG9tRXJyb3J9IGZyb20gXCIuL2Vycm9yXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgTWF0cml4RHluYW1pY1Jvd01vZGVsIGV4dGVuZHMgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIGluZGV4OiBudW1iZXIsIGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGEsIHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBzdXBlcihkYXRhLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHJvd05hbWUoKSB7IHJldHVybiBcInJvd1wiICsgdGhpcy5pbmRleDsgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlIGltcGxlbWVudHMgSU1hdHJpeERyb3Bkb3duRGF0YSB7XHJcbiAgICBzdGF0aWMgTWF4Um93Q291bnQgPSAxMDA7XHJcbiAgICBwcml2YXRlIHJvd0NvdW50ZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSByb3dDb3VudFZhbHVlOiBudW1iZXIgPSAyO1xyXG4gICAgcHJpdmF0ZSBhZGRSb3dUZXh0VmFsdWU6IHN0cmluZyA9IG51bGw7XHJcbiAgICBwcml2YXRlIHJlbW92ZVJvd1RleHRWYWx1ZTogc3RyaW5nID0gbnVsbDtcclxuICAgIHB1YmxpYyBtaW5Sb3dDb3VudCA9IDA7XHJcbiAgICBwdWJsaWMgcm93Q291bnRDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcIm1hdHJpeGR5bmFtaWNcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgcm93Q291bnQoKSB7IHJldHVybiB0aGlzLnJvd0NvdW50VmFsdWU7IH1cclxuICAgIHB1YmxpYyBzZXQgcm93Q291bnQodmFsOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodmFsIDwgMCB8fCB2YWwgPiBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbC5NYXhSb3dDb3VudCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucm93Q291bnRWYWx1ZSA9IHZhbDtcclxuICAgICAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+IHZhbCkge1xyXG4gICAgICAgICAgICB2YXIgcVZhbCA9IHRoaXMudmFsdWU7XHJcbiAgICAgICAgICAgIHFWYWwuc3BsaWNlKHZhbCk7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBxVmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnJvd0NvdW50Q2hhbmdlZENhbGxiYWNrKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhZGRSb3coKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHtcclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5wdXNoKHRoaXMuY3JlYXRlTWF0cml4Um93KG51bGwpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yb3dDb3VudCsrO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHJlbW92ZVJvdyhpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnJvd0NvdW50KSByZXR1cm47XHJcbiAgICAgICAgaWYgKHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgJiYgaW5kZXggPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKHRoaXMudmFsdWUpO1xyXG4gICAgICAgICAgICB2YWwuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgdmFsID0gdGhpcy5kZWxldGVSb3dWYWx1ZSh2YWwsIG51bGwpO1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJvd0NvdW50LS07XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGFkZFJvd1RleHQoKSB7IHJldHVybiB0aGlzLmFkZFJvd1RleHRWYWx1ZSA/IHRoaXMuYWRkUm93VGV4dFZhbHVlIDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImFkZFJvd1wiKTsgfVxyXG4gICAgcHVibGljIHNldCBhZGRSb3dUZXh0KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmFkZFJvd1RleHRWYWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCByZW1vdmVSb3dUZXh0KCkgeyByZXR1cm4gdGhpcy5yZW1vdmVSb3dUZXh0VmFsdWUgPyB0aGlzLnJlbW92ZVJvd1RleHRWYWx1ZSA6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZW1vdmVSb3dcIik7IH1cclxuICAgIHB1YmxpYyBzZXQgcmVtb3ZlUm93VGV4dCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVSb3dUZXh0VmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHsgICByZXR1cm4gZmFsc2U7ICB9XHJcbiAgICBwdWJsaWMgZ2V0IGNhY2hlZFZpc2libGVSb3dzKCk6IEFycmF5PE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlPiB7XHJcbiAgICAgICAgaWYgKHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgJiYgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGggPT0gdGhpcy5yb3dDb3VudCkgcmV0dXJuIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3M7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZVJvd3M7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xyXG4gICAgICAgIHN1cGVyLm9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzKTtcclxuICAgICAgICBpZiAodGhpcy5oYXNFcnJvckluUm93cygpKSB7XHJcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKG5ldyBDdXN0b21FcnJvcihzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibWluUm93Q291bnRFcnJvclwiKVtcImZvcm1hdFwiXSh0aGlzLm1pblJvd0NvdW50KSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgaGFzRXJyb3JJblJvd3MoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMubWluUm93Q291bnQgPD0gMCB8fCAhdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHZhciByZXMgPSBmYWxzZTtcclxuICAgICAgICB2YXIgc2V0Um93Q291bnQgPSAwO1xyXG4gICAgICAgIGZvciAodmFyIHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgcm93SW5kZXgrKykge1xyXG4gICAgICAgICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tyb3dJbmRleF07XHJcbiAgICAgICAgICAgIGlmICghcm93LmlzRW1wdHkpIHNldFJvd0NvdW50Kys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzZXRSb3dDb3VudCA8IHRoaXMubWluUm93Q291bnQ7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgZ2VuZXJhdGVSb3dzKCk6IEFycmF5PE1hdHJpeER5bmFtaWNSb3dNb2RlbD4ge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8TWF0cml4RHluYW1pY1Jvd01vZGVsPigpO1xyXG4gICAgICAgIGlmICh0aGlzLnJvd0NvdW50ID09PSAwKSByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKHRoaXMudmFsdWUpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY3JlYXRlTWF0cml4Um93KHRoaXMuZ2V0Um93VmFsdWVCeUluZGV4KHZhbCwgaSkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBjcmVhdGVNYXRyaXhSb3codmFsdWU6IGFueSk6IE1hdHJpeER5bmFtaWNSb3dNb2RlbCB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNYXRyaXhEeW5hbWljUm93TW9kZWwodGhpcy5yb3dDb3VudGVyICsrLCB0aGlzLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgb25CZWZvcmVWYWx1ZUNoYW5nZWQodmFsOiBhbnkpIHtcclxuICAgICAgICB2YXIgbmV3Um93Q291bnQgPSB2YWwgJiYgQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsLmxlbmd0aCA6IDA7XHJcbiAgICAgICAgaWYgKG5ld1Jvd0NvdW50IDw9IHRoaXMucm93Q291bnQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnJvd0NvdW50VmFsdWUgPSBuZXdSb3dDb3VudDtcclxuICAgICAgICBpZiAodGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzID0gdGhpcy52aXNpYmxlUm93cztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlTmV3VmFsdWUoY3VyVmFsdWU6IGFueSk6IGFueSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IGN1clZhbHVlO1xyXG4gICAgICAgIGlmICghcmVzdWx0KSByZXN1bHQgPSBbXTtcclxuICAgICAgICB2YXIgciA9IFtdO1xyXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gdGhpcy5yb3dDb3VudCkgcmVzdWx0LnNwbGljZSh0aGlzLnJvd0NvdW50IC0gMSk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IHJlc3VsdC5sZW5ndGg7IGkgPCB0aGlzLnJvd0NvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goe30pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGRlbGV0ZVJvd1ZhbHVlKG5ld1ZhbHVlOiBhbnksIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBhbnkge1xyXG4gICAgICAgIHZhciBpc0VtcHR5ID0gdHJ1ZTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld1ZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhuZXdWYWx1ZVtpXSkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaXNFbXB0eSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlzRW1wdHkgPyBudWxsIDogbmV3VmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRSb3dWYWx1ZUJ5SW5kZXgocXVlc3Rpb25WYWx1ZTogYW55LCBpbmRleDogbnVtYmVyKTogYW55IHtcclxuICAgICAgICByZXR1cm4gaW5kZXggPj0gMCAmJiBpbmRleCA8IHF1ZXN0aW9uVmFsdWUubGVuZ3RoID8gcXVlc3Rpb25WYWx1ZVtpbmRleF0gOiBudWxsO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldFJvd1ZhbHVlKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsIHF1ZXN0aW9uVmFsdWU6IGFueSwgY3JlYXRlOiBib29sZWFuID0gZmFsc2UpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFJvd1ZhbHVlQnlJbmRleChxdWVzdGlvblZhbHVlLCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmluZGV4T2Yocm93KSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJtYXRyaXhkeW5hbWljXCIsIFt7IG5hbWU6IFwicm93Q291bnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDIgfSwgeyBuYW1lOiBcIm1pblJvd0NvdW50Om51bWJlclwiLCBkZWZhdWx0OiAwIH0sXHJcbiAgICAgICAgeyBuYW1lOiBcImFkZFJvd1RleHRcIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55KSB7IHJldHVybiBvYmouYWRkUm93VGV4dFZhbHVlOyB9IH0sXHJcbiAgICAgICAgeyBuYW1lOiBcInJlbW92ZVJvd1RleHRcIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55KSB7IHJldHVybiBvYmoucmVtb3ZlUm93VGV4dFZhbHVlOyB9IH1dLFxyXG4gICAgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsKFwiXCIpOyB9LCBcIm1hdHJpeGRyb3Bkb3duYmFzZVwiKTtcclxuXHJcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4ZHluYW1pY1wiLCAobmFtZSkgPT4geyB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbChuYW1lKTsgcS5jaG9pY2VzID0gWzEsIDIsIDMsIDQsIDVdOyBxLmFkZENvbHVtbihcIkNvbHVtbiAxXCIpOyBxLmFkZENvbHVtbihcIkNvbHVtbiAyXCIpOyBxLmFkZENvbHVtbihcIkNvbHVtbiAzXCIpOyByZXR1cm4gcTsgfSk7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHluYW1pYy50c1xuICoqLyIsImltcG9ydCB7QmFzZSwgSXRlbVZhbHVlfSBmcm9tIFwiLi9iYXNlXCI7XHJcbmltcG9ydCB7UXVlc3Rpb259IGZyb20gXCIuL3F1ZXN0aW9uXCI7XHJcbmltcG9ydCB7SnNvbk9iamVjdH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xyXG5pbXBvcnQge1N1cnZleUVycm9yfSBmcm9tIFwiLi9iYXNlXCI7XHJcbmltcG9ydCB7c3VydmV5TG9jYWxpemF0aW9ufSBmcm9tICcuL3N1cnZleVN0cmluZ3MnO1xyXG5pbXBvcnQge0N1c3RvbUVycm9yfSBmcm9tIFwiLi9lcnJvclwiO1xyXG5pbXBvcnQge1F1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElNYXRyaXhEYXRhIHtcclxuICAgIG9uTWF0cml4Um93Q2hhbmdlZChyb3c6IE1hdHJpeFJvd01vZGVsKTtcclxufVxyXG5leHBvcnQgY2xhc3MgTWF0cml4Um93TW9kZWwgZXh0ZW5kcyBCYXNlIHtcclxuICAgIHByaXZhdGUgZGF0YTogSU1hdHJpeERhdGE7XHJcbiAgICBwcm90ZWN0ZWQgcm93VmFsdWU6IGFueTsgXHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IGFueSwgcHVibGljIHRleHQ6IHN0cmluZywgcHVibGljIGZ1bGxOYW1lOiBzdHJpbmcsIGRhdGE6IElNYXRyaXhEYXRhLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMucm93VmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgdmFsdWUoKSB7IHJldHVybiB0aGlzLnJvd1ZhbHVlOyB9XHJcbiAgICBwdWJsaWMgc2V0IHZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnJvd1ZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YSkgdGhpcy5kYXRhLm9uTWF0cml4Um93Q2hhbmdlZCh0aGlzKTtcclxuICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkKCk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4TW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiBpbXBsZW1lbnRzIElNYXRyaXhEYXRhIHtcclxuICAgIHByaXZhdGUgY29sdW1uc1ZhbHVlOiBJdGVtVmFsdWVbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSByb3dzVmFsdWU6IEl0ZW1WYWx1ZVtdID0gW107XHJcbiAgICBwcml2YXRlIGlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgZ2VuZXJhdGVkVmlzaWJsZVJvd3M6IEFycmF5PE1hdHJpeFJvd01vZGVsPjtcclxuICAgIHB1YmxpYyBpc0FsbFJvd1JlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcIm1hdHJpeFwiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBoYXNSb3dzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvd3NWYWx1ZS5sZW5ndGggPiAwO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNvbHVtbnMoKTogQXJyYXk8YW55PiB7IHJldHVybiB0aGlzLmNvbHVtbnNWYWx1ZTsgfVxyXG4gICAgc2V0IGNvbHVtbnMobmV3VmFsdWU6IEFycmF5PGFueT4pIHtcclxuICAgICAgICBJdGVtVmFsdWUuc2V0RGF0YSh0aGlzLmNvbHVtbnNWYWx1ZSwgbmV3VmFsdWUpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHJvd3MoKTogQXJyYXk8YW55PiB7IHJldHVybiB0aGlzLnJvd3NWYWx1ZTsgfVxyXG4gICAgc2V0IHJvd3MobmV3VmFsdWU6IEFycmF5PGFueT4pIHtcclxuICAgICAgICBJdGVtVmFsdWUuc2V0RGF0YSh0aGlzLnJvd3NWYWx1ZSwgbmV3VmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCB2aXNpYmxlUm93cygpOiBBcnJheTxNYXRyaXhSb3dNb2RlbD4ge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8TWF0cml4Um93TW9kZWw+KCk7XHJcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XHJcbiAgICAgICAgaWYgKCF2YWwpIHZhbCA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5yb3dzW2ldLnZhbHVlKSBjb250aW51ZTtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5jcmVhdGVNYXRyaXhSb3codGhpcy5yb3dzW2ldLnZhbHVlLCB0aGlzLnJvd3NbaV0udGV4dCwgdGhpcy5uYW1lICsgJ18nICsgdGhpcy5yb3dzW2ldLnZhbHVlLnRvU3RyaW5nKCksIHZhbFt0aGlzLnJvd3NbaV0udmFsdWVdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5jcmVhdGVNYXRyaXhSb3cobnVsbCwgXCJcIiwgdGhpcy5uYW1lLCB2YWwpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IHJlc3VsdDtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7IHJldHVybiB0aGlzLmhhc1ZhbHVlc0luQWxsUm93cygpOyB9XHJcbiAgICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xyXG4gICAgICAgIHN1cGVyLm9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzKTtcclxuICAgICAgICBpZiAodGhpcy5oYXNFcnJvckluUm93cygpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3JzLnB1c2gobmV3IEN1c3RvbUVycm9yKHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZXF1aXJlZEluQWxsUm93c0Vycm9yXCIpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBoYXNFcnJvckluUm93cygpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNBbGxSb3dSZXF1aXJlZCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHJldHVybiAhdGhpcy5oYXNWYWx1ZXNJbkFsbFJvd3MoKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgaGFzVmFsdWVzSW5BbGxSb3dzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcclxuICAgICAgICBpZiAoIXJvd3MpIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xyXG4gICAgICAgIGlmICghcm93cykgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciB2YWwgPSByb3dzW2ldLnZhbHVlO1xyXG4gICAgICAgICAgICBpZiAoIXZhbCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBjcmVhdGVNYXRyaXhSb3cobmFtZTogYW55LCB0ZXh0OiBzdHJpbmcsIGZ1bGxOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBNYXRyaXhSb3dNb2RlbCB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNYXRyaXhSb3dNb2RlbChuYW1lLCB0ZXh0LCBmdWxsTmFtZSwgdGhpcywgdmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzUm93Q2hhbmdpbmcgfHwgISh0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSB8fCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aCA9PSAwKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gdHJ1ZTtcclxuICAgICAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcclxuICAgICAgICBpZiAoIXZhbCkgdmFsID0ge307XHJcbiAgICAgICAgaWYgKHRoaXMucm93cy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzWzBdLnZhbHVlID0gdmFsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJvdyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV07XHJcbiAgICAgICAgICAgICAgICB2YXIgcm93VmFsID0gdmFsW3Jvdy5uYW1lXSA/IHZhbFtyb3cubmFtZV0gOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS52YWx1ZSA9IHJvd1ZhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vSU1hdHJpeERhdGFcclxuICAgIG9uTWF0cml4Um93Q2hhbmdlZChyb3c6IE1hdHJpeFJvd01vZGVsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNSb3dDaGFuZ2luZykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc1Jvd3MpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXROZXdWYWx1ZShyb3cudmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMudmFsdWU7XHJcbiAgICAgICAgICAgIGlmICghbmV3VmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbmV3VmFsdWVbcm93Lm5hbWVdID0gcm93LnZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuXHJcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJtYXRyaXhcIiwgW3sgbmFtZTogXCJjb2x1bW5zOml0ZW12YWx1ZXNcIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55KSB7IHJldHVybiBJdGVtVmFsdWUuZ2V0RGF0YShvYmouY29sdW1ucyk7IH0sIG9uU2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSwgdmFsdWU6IGFueSkgeyBvYmouY29sdW1ucyA9IHZhbHVlOyB9fSxcclxuICAgIHsgbmFtZTogXCJyb3dzOml0ZW12YWx1ZXNcIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55KSB7IHJldHVybiBJdGVtVmFsdWUuZ2V0RGF0YShvYmoucm93cyk7IH0sIG9uU2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSwgdmFsdWU6IGFueSkgeyBvYmoucm93cyA9IHZhbHVlOyB9IH0sXHJcbiAgICBcImlzQWxsUm93UmVxdWlyZWQ6Ym9vbGVhblwiXSwgIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBRdWVzdGlvbk1hdHJpeE1vZGVsKFwiXCIpOyB9LCBcInF1ZXN0aW9uXCIpO1xyXG5cclxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtYXRyaXhcIiwgKG5hbWUpID0+IHsgdmFyIHEgPSBuZXcgUXVlc3Rpb25NYXRyaXhNb2RlbChuYW1lKTsgcS5yb3dzID0gW1wiUm93IDFcIiwgXCJSb3cgMlwiXTsgcS5jb2x1bW5zID0gW1wiQ29sdW1uIDFcIiwgXCJDb2x1bW4gMlwiLCBcIkNvbHVtbiAzXCJdOyByZXR1cm4gcTsgfSk7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcXVlc3Rpb25fbWF0cml4LnRzXG4gKiovIiwiaW1wb3J0IHtCYXNlfSBmcm9tIFwiLi9iYXNlXCI7XHJcbmltcG9ydCB7U3VydmV5VmFsaWRhdG9yLCBJVmFsaWRhdG9yT3duZXIsIFZhbGlkYXRvclJ1bm5lcn0gZnJvbSBcIi4vdmFsaWRhdG9yXCI7XHJcbmltcG9ydCB7UXVlc3Rpb259IGZyb20gXCIuL3F1ZXN0aW9uXCI7XHJcbmltcG9ydCB7SnNvbk9iamVjdH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xyXG5pbXBvcnQge1F1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XHJcbmltcG9ydCB7U3VydmV5RXJyb3J9IGZyb20gXCIuL2Jhc2VcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU11bHRpcGxlVGV4dERhdGEge1xyXG4gICAgZ2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZTogc3RyaW5nKTogYW55O1xyXG4gICAgc2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCBleHRlbmRzIEJhc2UgaW1wbGVtZW50cyBJVmFsaWRhdG9yT3duZXIge1xyXG4gICAgcHJpdmF0ZSBkYXRhOiBJTXVsdGlwbGVUZXh0RGF0YTtcclxuICAgIHByaXZhdGUgdGl0bGVWYWx1ZTogc3RyaW5nO1xyXG4gICAgdmFsaWRhdG9yczogQXJyYXk8U3VydmV5VmFsaWRhdG9yPiA9IG5ldyBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+KCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IGFueSA9IG51bGwsIHRpdGxlOiBzdHJpbmcgPSBudWxsKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcIm11bHRpcGxldGV4dGl0ZW1cIjtcclxuICAgIH1cclxuICAgIHNldERhdGEoZGF0YTogSU11bHRpcGxlVGV4dERhdGEpIHtcclxuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCB0aXRsZSgpIHsgcmV0dXJuIHRoaXMudGl0bGVWYWx1ZSA/IHRoaXMudGl0bGVWYWx1ZSA6IHRoaXMubmFtZTsgfVxyXG4gICAgcHVibGljIHNldCB0aXRsZShuZXdUZXh0OiBzdHJpbmcpIHsgdGhpcy50aXRsZVZhbHVlID0gbmV3VGV4dDsgfVxyXG4gICAgcHVibGljIGdldCB2YWx1ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldE11bHRpcGxlVGV4dFZhbHVlKHRoaXMubmFtZSkgOiBudWxsO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zZXRNdWx0aXBsZVRleHRWYWx1ZSh0aGlzLm5hbWUsIHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBvblZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XHJcbiAgICB9XHJcbiAgICAvL0lWYWxpZGF0b3JPd25lclxyXG4gICAgZ2V0VmFsaWRhdG9yVGl0bGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMudGl0bGU7IH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiBpbXBsZW1lbnRzIElNdWx0aXBsZVRleHREYXRhIHtcclxuICAgIHByaXZhdGUgY29sQ291bnRWYWx1ZTogbnVtYmVyID0gMTtcclxuICAgIGNvbENvdW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xyXG4gICAgcHVibGljIGl0ZW1TaXplOiBudW1iZXIgPSAyNTtcclxuICAgIHByaXZhdGUgaXRlbXNWYWx1ZXM6IEFycmF5PE11bHRpcGxlVGV4dEl0ZW1Nb2RlbD4gPSBuZXcgQXJyYXk8TXVsdGlwbGVUZXh0SXRlbU1vZGVsPigpO1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKG5hbWUpO1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICB0aGlzLml0ZW1zLnB1c2ggPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdmFsdWUuc2V0RGF0YShzZWxmKTtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IEFycmF5LnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcywgdmFsdWUpO1xyXG4gICAgICAgICAgICBzZWxmLmZpcmVDYWxsYmFjayhzZWxmLmNvbENvdW50Q2hhbmdlZENhbGxiYWNrKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gXCJtdWx0aXBsZXRleHRcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgaXRlbXMoKTogQXJyYXk8TXVsdGlwbGVUZXh0SXRlbU1vZGVsPiB7IHJldHVybiB0aGlzLml0ZW1zVmFsdWVzOyB9XHJcbiAgICBwdWJsaWMgc2V0IGl0ZW1zKHZhbHVlOiBBcnJheTxNdWx0aXBsZVRleHRJdGVtTW9kZWw+KSB7XHJcbiAgICAgICAgdGhpcy5pdGVtc1ZhbHVlcyA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFkZEl0ZW0obmFtZTogc3RyaW5nLCB0aXRsZTogc3RyaW5nID0gbnVsbCk6IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCB7XHJcbiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmNyZWF0ZVRleHRJdGVtKG5hbWUsIHRpdGxlKTtcclxuICAgICAgICB0aGlzLml0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICB9XHJcbiAgICAvL1RPRE8tcmVtb3ZlIGxhdGVyLiBEZWxheSByZW1vdmluZyBpbiBjYXNlIHNvbWVib2R5IHVzZSB0aGlzIGZ1bmN0aW9uLlxyXG4gICAgcHJpdmF0ZSBBZGRJdGVtKG5hbWU6IHN0cmluZywgdGl0bGU6IHN0cmluZyA9IG51bGwpOiBNdWx0aXBsZVRleHRJdGVtTW9kZWwgeyByZXR1cm4gdGhpcy5hZGRJdGVtKG5hbWUsIHRpdGxlKTsgfVxyXG4gICAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pdGVtc1tpXS52YWx1ZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgY29sQ291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuY29sQ291bnRWYWx1ZTsgfVxyXG4gICAgcHVibGljIHNldCBjb2xDb3VudCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlIDwgMSB8fCB2YWx1ZSA+IDQpIHJldHVybjtcclxuICAgICAgICB0aGlzLmNvbENvdW50VmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmNvbENvdW50Q2hhbmdlZENhbGxiYWNrKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXRSb3dzKCk6IEFycmF5PGFueT4ge1xyXG4gICAgICAgIHZhciBjb2xDb3VudCA9IHRoaXMuY29sQ291bnQ7XHJcbiAgICAgICAgdmFyIGl0ZW1zID0gdGhpcy5pdGVtcztcclxuICAgICAgICB2YXIgcm93cyA9IFtdO1xyXG4gICAgICAgIHZhciBpbmRleCA9IDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcm93cy5wdXNoKFtdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByb3dzW3Jvd3MubGVuZ3RoIC0gMV0ucHVzaChpdGVtc1tpXSk7XHJcbiAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSBjb2xDb3VudCkge1xyXG4gICAgICAgICAgICAgICAgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByb3dzO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBpc011bHRpcGxlSXRlbVZhbHVlQ2hhbmdpbmcgPSBmYWxzZTtcclxuICAgIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdlZCgpIHtcclxuICAgICAgICBzdXBlci5vblZhbHVlQ2hhbmdlZCgpO1xyXG4gICAgICAgIHRoaXMub25JdGVtVmFsdWVDaGFuZ2VkKCk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlVGV4dEl0ZW0obmFtZTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsIHtcclxuICAgICAgICByZXR1cm4gbmV3IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbChuYW1lLCB0aXRsZSk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgb25JdGVtVmFsdWVDaGFuZ2VkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVJdGVtVmFsdWVDaGFuZ2luZykgcmV0dXJuO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgaXRlbVZhbHVlID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgJiYgKHRoaXMuaXRlbXNbaV0ubmFtZSBpbiB0aGlzLnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbVZhbHVlID0gdGhpcy52YWx1ZVt0aGlzLml0ZW1zW2ldLm5hbWVdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbXNbaV0ub25WYWx1ZUNoYW5nZWQoaXRlbVZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcnVuVmFsaWRhdG9ycygpOiBTdXJ2ZXlFcnJvciB7XHJcbiAgICAgICAgdmFyIGVycm9yID0gc3VwZXIucnVuVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIGlmIChlcnJvciAhPSBudWxsKSByZXR1cm4gZXJyb3I7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGVycm9yID0gbmV3IFZhbGlkYXRvclJ1bm5lcigpLnJ1bih0aGlzLml0ZW1zW2ldKTtcclxuICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHJldHVybiBlcnJvcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvL0lNdWx0aXBsZVRleHREYXRhXHJcbiAgICBnZXRNdWx0aXBsZVRleHRWYWx1ZShuYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlW25hbWVdO1xyXG4gICAgfVxyXG4gICAgc2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5pc011bHRpcGxlSXRlbVZhbHVlQ2hhbmdpbmcgPSB0cnVlO1xyXG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMudmFsdWU7XHJcbiAgICAgICAgaWYgKCFuZXdWYWx1ZSkge1xyXG4gICAgICAgICAgICBuZXdWYWx1ZSA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBuZXdWYWx1ZVtuYW1lXSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xyXG4gICAgICAgIHRoaXMuaXNNdWx0aXBsZUl0ZW1WYWx1ZUNoYW5naW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuXHJcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJtdWx0aXBsZXRleHRpdGVtXCIsIFtcIm5hbWVcIiwgeyBuYW1lOiBcInRpdGxlXCIsIG9uR2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSkgeyByZXR1cm4gb2JqLnRpdGxlVmFsdWU7IH0gfSxcclxuICAgIHsgbmFtZTogXCJ2YWxpZGF0b3JzOnZhbGlkYXRvcnNcIiwgYmFzZUNsYXNzTmFtZTogXCJzdXJ2ZXl2YWxpZGF0b3JcIiwgY2xhc3NOYW1lUGFydDogXCJ2YWxpZGF0b3JcIiB9XSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbChcIlwiKTsgfSk7XHJcblxyXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwibXVsdGlwbGV0ZXh0XCIsIFt7IG5hbWU6IFwiIWl0ZW1zOnRleHRpdGVtc1wiLCBjbGFzc05hbWU6IFwibXVsdGlwbGV0ZXh0aXRlbVwiIH0sXHJcbiAgICAgICAgeyBuYW1lOiBcIml0ZW1TaXplOm51bWJlclwiLCBkZWZhdWx0OiAyNSB9LCB7IG5hbWU6IFwiY29sQ291bnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDEsIGNob2ljZXM6IFsxLCAyLCAzLCA0XSB9XSxcclxuICAgIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsKFwiXCIpOyB9LCBcInF1ZXN0aW9uXCIpO1xyXG5cclxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtdWx0aXBsZXRleHRcIiwgKG5hbWUpID0+IHsgdmFyIHEgPSBuZXcgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbChuYW1lKTsgcS5hZGRJdGVtKFwidGV4dDFcIik7IHEuYWRkSXRlbShcInRleHQyXCIpOyByZXR1cm4gcTsgfSk7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcXVlc3Rpb25fbXVsdGlwbGV0ZXh0LnRzXG4gKiovIiwiaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XHJcbmltcG9ydCB7QmFzZSwgSVBhZ2UsIElDb25kaXRpb25SdW5uZXIsIElTdXJ2ZXksIElRdWVzdGlvbiwgSGFzaFRhYmxlLCBTdXJ2ZXlFbGVtZW50LCBTdXJ2ZXlQYWdlSWR9IGZyb20gXCIuL2Jhc2VcIjtcclxuaW1wb3J0IHtRdWVzdGlvbkJhc2V9IGZyb20gXCIuL3F1ZXN0aW9uYmFzZVwiO1xyXG5pbXBvcnQge0NvbmRpdGlvblJ1bm5lcn0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xyXG5pbXBvcnQge1F1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Sb3dNb2RlbCB7XHJcbiAgICBwcml2YXRlIHZpc2libGVWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgdmlzaWJpbGl0eUNoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBwYWdlOiBQYWdlTW9kZWwsIHB1YmxpYyBxdWVzdGlvbjogUXVlc3Rpb25CYXNlKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMucXVlc3Rpb24ucm93VmlzaWJpbGl0eUNoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHsgc2VsZi5vblJvd1Zpc2liaWxpdHlDaGFuZ2VkKCk7IH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBxdWVzdGlvbnM6IEFycmF5PFF1ZXN0aW9uQmFzZT4gPSBbXTtcclxuICAgIHB1YmxpYyBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMudmlzaWJsZVZhbHVlOyB9XHJcbiAgICBwdWJsaWMgc2V0IHZpc2libGUodmFsOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHZhbCA9PSB0aGlzLnZpc2libGUpIHJldHVybjtcclxuICAgICAgICB0aGlzLnZpc2libGVWYWx1ZSA9IHZhbDtcclxuICAgICAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZWQoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyB1cGRhdGVWaXNpYmxlKCkge1xyXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IHRoaXMuY2FsY1Zpc2libGUoKTtcclxuICAgICAgICB0aGlzLnNldFdpZHRoKCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgYWRkUXVlc3Rpb24ocTogUXVlc3Rpb25CYXNlKSB7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbnMucHVzaChxKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVZpc2libGUoKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBvblZpc2libGVDaGFuZ2VkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2spIHRoaXMudmlzaWJpbGl0eUNoYW5nZWRDYWxsYmFjaygpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldFdpZHRoKCkge1xyXG4gICAgICAgIHZhciB2aXNDb3VudCA9IHRoaXMuZ2V0VmlzaWJsZUNvdW50KCk7XHJcbiAgICAgICAgaWYgKHZpc0NvdW50ID09IDApIHJldHVybjtcclxuICAgICAgICB2YXIgY291bnRlciA9IDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9ucy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNRdWVzdGlvblZpc2libGUodGhpcy5xdWVzdGlvbnNbaV0pKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uc1tpXS5yZW5kZXJXaWR0aCA9IHRoaXMucXVlc3Rpb24ud2lkdGggPyB0aGlzLnF1ZXN0aW9uLndpZHRoIDogTWF0aC5mbG9vcigxMDAgLyB2aXNDb3VudCkgKyAnJSc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uc1tpXS5yaWdodEluZGVudCA9IGNvdW50ZXIgPCB2aXNDb3VudCAtIDEgPyAxIDogMDtcclxuICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBvblJvd1Zpc2liaWxpdHlDaGFuZ2VkKCkge1xyXG4gICAgICAgIHRoaXMucGFnZS5vblJvd1Zpc2liaWxpdHlDaGFuZ2VkKHRoaXMpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBnZXRWaXNpYmxlQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICB2YXIgcmVzID0gMDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUXVlc3Rpb25WaXNpYmxlKHRoaXMucXVlc3Rpb25zW2ldKSkgcmVzKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGlzUXVlc3Rpb25WaXNpYmxlKHE6IFF1ZXN0aW9uQmFzZSk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5wYWdlLmlzUXVlc3Rpb25WaXNpYmxlKHEpOyB9XHJcbiAgICBwcml2YXRlIGNhbGNWaXNpYmxlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5nZXRWaXNpYmxlQ291bnQoKSA+IDA7IH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFBhZ2VNb2RlbCBleHRlbmRzIEJhc2UgaW1wbGVtZW50cyBJUGFnZSwgSUNvbmRpdGlvblJ1bm5lciB7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBwYWdlQ291bnRlciA9IDEwMDtcclxuICAgIHByaXZhdGUgc3RhdGljIGdldFBhZ2VJZCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcInNwX1wiICsgUGFnZU1vZGVsLnBhZ2VDb3VudGVyKys7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpZFZhbHVlOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIHJvd1ZhbHVlczogQXJyYXk8UXVlc3Rpb25Sb3dNb2RlbD4gPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBjb25kaXRpb25SdW5uZXI6IENvbmRpdGlvblJ1bm5lciA9IG51bGw7XHJcbiAgICBxdWVzdGlvbnM6IEFycmF5PFF1ZXN0aW9uQmFzZT4gPSBuZXcgQXJyYXk8UXVlc3Rpb25CYXNlPigpO1xyXG4gICAgcHVibGljIGRhdGE6IElTdXJ2ZXkgPSBudWxsO1xyXG4gICAgcHVibGljIHZpc2libGVJZjogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICBwdWJsaWMgdGl0bGU6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgdmlzaWJsZUluZGV4OiBudW1iZXIgPSAtMTtcclxuICAgIHByaXZhdGUgbnVtVmFsdWU6IG51bWJlciA9IC0xO1xyXG4gICAgcHJpdmF0ZSB2aXNpYmxlVmFsdWU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuaWRWYWx1ZSA9IFBhZ2VNb2RlbC5nZXRQYWdlSWQoKTtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbnMucHVzaCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5kYXRhICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlLnNldERhdGEoc2VsZi5kYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCB2YWx1ZSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuaWRWYWx1ZTsgfVxyXG4gICAgcHVibGljIGdldCByb3dzKCk6IEFycmF5PFF1ZXN0aW9uUm93TW9kZWw+IHtcclxuICAgICAgICB0aGlzLnJvd1ZhbHVlcyA9IHRoaXMuYnVpbGRSb3dzKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm93VmFsdWVzO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBpc0FjdGl2ZSgpIHsgcmV0dXJuICghdGhpcy5kYXRhKSB8fCB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPT0gdGhpczsgfVxyXG4gICAgcHVibGljIGlzUXVlc3Rpb25WaXNpYmxlKHF1ZXN0aW9uOiBRdWVzdGlvbkJhc2UpOiBib29sZWFuIHsgcmV0dXJuIHF1ZXN0aW9uLnZpc2libGUgfHwgdGhpcy5pc0Rlc2lnbk1vZGU7IH1cclxuICAgIHByb3RlY3RlZCBjcmVhdGVSb3cocXVlc3Rpb246IFF1ZXN0aW9uQmFzZSk6IFF1ZXN0aW9uUm93TW9kZWwgeyByZXR1cm4gbmV3IFF1ZXN0aW9uUm93TW9kZWwodGhpcywgcXVlc3Rpb24pOyB9XHJcbiAgICBwcml2YXRlIGdldCBpc0Rlc2lnbk1vZGUoKSB7IHJldHVybiB0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLmlzRGVzaWduTW9kZTsgfVxyXG4gICAgcHJpdmF0ZSBidWlsZFJvd3MoKTogQXJyYXk8UXVlc3Rpb25Sb3dNb2RlbD4ge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8UXVlc3Rpb25Sb3dNb2RlbD4oKTtcclxuICAgICAgICB2YXIgbGFzdFJvd1Zpc2libGVJbmRleCA9IC0xO1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBxID0gdGhpcy5xdWVzdGlvbnNbaV07XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY3JlYXRlUm93KHEpKTtcclxuICAgICAgICAgICAgaWYgKHEuc3RhcnRXaXRoTmV3TGluZSkge1xyXG4gICAgICAgICAgICAgICAgbGFzdFJvd1Zpc2libGVJbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbaV0uYWRkUXVlc3Rpb24ocSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobGFzdFJvd1Zpc2libGVJbmRleCA8IDApIGxhc3RSb3dWaXNpYmxlSW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2xhc3RSb3dWaXNpYmxlSW5kZXhdLmFkZFF1ZXN0aW9uKHEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXS5zZXRXaWR0aCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgb25Sb3dWaXNpYmlsaXR5Q2hhbmdlZChyb3c6IFF1ZXN0aW9uUm93TW9kZWwpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNBY3RpdmUgfHwgIXRoaXMucm93VmFsdWVzKSByZXR1cm47XHJcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5yb3dWYWx1ZXMuaW5kZXhPZihyb3cpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSBpbmRleDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucm93VmFsdWVzW2ldLnF1ZXN0aW9ucy5pbmRleE9mKHJvdy5xdWVzdGlvbikgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3dWYWx1ZXNbaV0udXBkYXRlVmlzaWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHByb2Nlc3NlZFRpdGxlKCkgeyByZXR1cm4gdGhpcy5kYXRhICE9IG51bGwgPyB0aGlzLmRhdGEucHJvY2Vzc1RleHQodGhpcy50aXRsZSkgOiB0aGlzLnRpdGxlOyB9XHJcbiAgICBwdWJsaWMgZ2V0IG51bSgpIHsgcmV0dXJuIHRoaXMubnVtVmFsdWU7IH1cclxuICAgIHB1YmxpYyBzZXQgbnVtKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5udW1WYWx1ZSA9PSB2YWx1ZSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMubnVtVmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLm9uTnVtQ2hhbmdlZCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnZpc2libGVWYWx1ZTsgfVxyXG4gICAgcHVibGljIHNldCB2aXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSB0aGlzLnZpc2libGUpIHJldHVybjtcclxuICAgICAgICB0aGlzLnZpc2libGVWYWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEucGFnZVZpc2liaWxpdHlDaGFuZ2VkKHRoaXMsIHRoaXMudmlzaWJsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIFwicGFnZVwiOyB9XHJcbiAgICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHsgIHJldHVybiB0aGlzLmdldElzUGFnZVZpc2libGUobnVsbCk7IH1cclxuICAgIHB1YmxpYyBnZXRJc1BhZ2VWaXNpYmxlKGV4Y2VwdGlvblF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXRoaXMudmlzaWJsZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25zW2ldID09IGV4Y2VwdGlvblF1ZXN0aW9uKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25zW2ldLnZpc2libGUpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFkZFF1ZXN0aW9uKHF1ZXN0aW9uOiBRdWVzdGlvbkJhc2UsIGluZGV4OiBudW1iZXIgPSAtMSkge1xyXG4gICAgICAgIGlmIChxdWVzdGlvbiA9PSBudWxsKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnF1ZXN0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbnMucHVzaChxdWVzdGlvbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbnMuc3BsaWNlKGluZGV4LCAwLCBxdWVzdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBxdWVzdGlvbi5zZXREYXRhKHRoaXMuZGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YS5xdWVzdGlvbkFkZGVkKHF1ZXN0aW9uLCBpbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIGFkZE5ld1F1ZXN0aW9uKHF1ZXN0aW9uVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBRdWVzdGlvbkJhc2Uge1xyXG4gICAgICAgIHZhciBxdWVzdGlvbiA9IFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5jcmVhdGVRdWVzdGlvbihxdWVzdGlvblR5cGUsIG5hbWUpO1xyXG4gICAgICAgIHRoaXMuYWRkUXVlc3Rpb24ocXVlc3Rpb24pO1xyXG4gICAgICAgIHJldHVybiBxdWVzdGlvbjtcclxuICAgIH1cclxuICAgIHB1YmxpYyByZW1vdmVRdWVzdGlvbihxdWVzdGlvbjogUXVlc3Rpb25CYXNlKSB7XHJcbiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5xdWVzdGlvbnMuaW5kZXhPZihxdWVzdGlvbik7XHJcbiAgICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucXVlc3Rpb25zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YSAhPSBudWxsKSB0aGlzLmRhdGEucXVlc3Rpb25SZW1vdmVkKHF1ZXN0aW9uKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBmb2N1c0ZpcnN0UXVlc3Rpb24oKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLnF1ZXN0aW9uc1tpXTtcclxuICAgICAgICAgICAgaWYgKCFxdWVzdGlvbi52aXNpYmxlIHx8ICFxdWVzdGlvbi5oYXNJbnB1dCkgY29udGludWU7XHJcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25zW2ldLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBmb2N1c0ZpcnN0RXJyb3JRdWVzdGlvbigpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5xdWVzdGlvbnNbaV0udmlzaWJsZSB8fCB0aGlzLnF1ZXN0aW9uc1tpXS5jdXJyZW50RXJyb3JDb3VudCA9PSAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbnNbaV0uZm9jdXModHJ1ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBzY3JvbGxUb1RvcCgpIHtcclxuICAgICAgICBTdXJ2ZXlFbGVtZW50LlNjcm9sbEVsZW1lbnRUb1RvcChTdXJ2ZXlQYWdlSWQpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlLCBmb2N1c2VPbkZpcnN0RXJyb3I6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgICB2YXIgZmlyc3RFcnJvclF1ZXN0aW9uID0gbnVsbDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uc1tpXS52aXNpYmxlICYmIHRoaXMucXVlc3Rpb25zW2ldLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2spKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZm9jdXNlT25GaXJzdEVycm9yICYmIGZpcnN0RXJyb3JRdWVzdGlvbiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RFcnJvclF1ZXN0aW9uID0gdGhpcy5xdWVzdGlvbnNbaV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmaXJzdEVycm9yUXVlc3Rpb24pIGZpcnN0RXJyb3JRdWVzdGlvbi5mb2N1cyh0cnVlKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIGFkZFF1ZXN0aW9uc1RvTGlzdChsaXN0OiBBcnJheTxJUXVlc3Rpb24+LCB2aXNpYmxlT25seTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKHZpc2libGVPbmx5ICYmICF0aGlzLnZpc2libGUpIHJldHVybjtcclxuICAgICAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHZpc2libGVPbmx5ICYmICF0aGlzLnF1ZXN0aW9uc1tpXS52aXNpYmxlKSBjb250aW51ZTtcclxuICAgICAgICAgICAgbGlzdC5wdXNoKHRoaXMucXVlc3Rpb25zW2ldKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4pIHtcclxuICAgICAgICBpZiAoIXRoaXMudmlzaWJsZUlmKSByZXR1cm47XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbmRpdGlvblJ1bm5lcikgdGhpcy5jb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMudmlzaWJsZUlmKTtcclxuICAgICAgICB0aGlzLmNvbmRpdGlvblJ1bm5lci5leHByZXNzaW9uID0gdGhpcy52aXNpYmxlSWY7XHJcbiAgICAgICAgdGhpcy52aXNpYmxlID0gdGhpcy5jb25kaXRpb25SdW5uZXIucnVuKHZhbHVlcyk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgb25OdW1DaGFuZ2VkKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIH1cclxufVxyXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwicGFnZVwiLCBbXCJuYW1lXCIsIHsgbmFtZTogXCJxdWVzdGlvbnNcIiwgYmFzZUNsYXNzTmFtZTogXCJxdWVzdGlvblwiIH0sIHsgbmFtZTogXCJ2aXNpYmxlOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LCBcInZpc2libGVJZlwiLCBcInRpdGxlXCJdLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgUGFnZU1vZGVsKCk7IH0pO1xuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3BhZ2UudHNcbiAqKi8iLCJpbXBvcnQge0pzb25PYmplY3R9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcclxuaW1wb3J0IHtRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xyXG5pbXBvcnQge1F1ZXN0aW9uQ2hlY2tib3hCYXNlfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25DaGVja2JveE1vZGVsIGV4dGVuZHMgUXVlc3Rpb25DaGVja2JveEJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKG5hbWUpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldEhhc090aGVyKHZhbDogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCF2YWwgfHwgIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHJldHVybiB2YWwuaW5kZXhPZih0aGlzLm90aGVySXRlbS52YWx1ZSkgPj0gMDtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCB2YWx1ZUZyb21EYXRhQ29yZSh2YWw6IGFueSk6IGFueSB7XHJcbiAgICAgICAgaWYgKCF2YWwgfHwgIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIHZhbDtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHZhbFtpXSA9PSB0aGlzLm90aGVySXRlbS52YWx1ZSkgcmV0dXJuIHZhbDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzVW5rbm93blZhbHVlKHZhbFtpXSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29tbWVudCA9IHZhbFtpXTtcclxuICAgICAgICAgICAgICAgIHZhciBuZXdWYWwgPSB2YWwuc2xpY2UoKTtcclxuICAgICAgICAgICAgICAgIG5ld1ZhbFtpXSA9IHRoaXMub3RoZXJJdGVtLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHZhbHVlVG9EYXRhQ29yZSh2YWw6IGFueSk6IGFueSB7XHJcbiAgICAgICAgaWYgKCF2YWwgfHwgIXZhbC5sZW5ndGgpIHJldHVybiB2YWw7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHZhbFtpXSA9PSB0aGlzLm90aGVySXRlbS52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0Q29tbWVudCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1ZhbCA9IHZhbC5zbGljZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld1ZhbFtpXSA9IHRoaXMuZ2V0Q29tbWVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIFwiY2hlY2tib3hcIjtcclxuICAgIH1cclxufVxyXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwiY2hlY2tib3hcIiwgW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBRdWVzdGlvbkNoZWNrYm94TW9kZWwoXCJcIik7IH0sIFwiY2hlY2tib3hiYXNlXCIpO1xyXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImNoZWNrYm94XCIsIChuYW1lKSA9PiB7IHZhciBxID0gbmV3IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbChuYW1lKTsgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzOyByZXR1cm4gcTsgfSk7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcXVlc3Rpb25fY2hlY2tib3gudHNcbiAqKi8iLCJpbXBvcnQge1F1ZXN0aW9ufSBmcm9tIFwiLi9xdWVzdGlvblwiO1xyXG5pbXBvcnQge0pzb25PYmplY3R9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcclxuaW1wb3J0IHtRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ29tbWVudE1vZGVsIGV4dGVuZHMgUXVlc3Rpb24ge1xyXG4gICAgcHVibGljIHJvd3M6IG51bWJlciA9IDQ7XHJcbiAgICBwdWJsaWMgY29sczogbnVtYmVyID0gNTA7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcImNvbW1lbnRcIjtcclxuICAgIH1cclxuICAgIGlzRW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmlzRW1wdHkoKSB8fCB0aGlzLnZhbHVlID09IFwiXCI7XHJcbiAgICB9XHJcbn1cclxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcImNvbW1lbnRcIiwgW3sgbmFtZTogXCJjb2xzOm51bWJlclwiLCBkZWZhdWx0OiA1MCB9LCB7IG5hbWU6IFwicm93czpudW1iZXJcIiwgZGVmYXVsdDogNCB9XSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFF1ZXN0aW9uQ29tbWVudE1vZGVsKFwiXCIpOyB9LCBcInF1ZXN0aW9uXCIpO1xyXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImNvbW1lbnRcIiwgKG5hbWUpID0+IHsgcmV0dXJuIG5ldyBRdWVzdGlvbkNvbW1lbnRNb2RlbChuYW1lKTsgfSk7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcXVlc3Rpb25fY29tbWVudC50c1xuICoqLyIsImltcG9ydCB7SnNvbk9iamVjdH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xyXG5pbXBvcnQge1F1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XHJcbmltcG9ydCB7UXVlc3Rpb25TZWxlY3RCYXNlfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XHJcbmltcG9ydCB7c3VydmV5TG9jYWxpemF0aW9ufSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIGV4dGVuZHMgUXVlc3Rpb25TZWxlY3RCYXNlIHtcclxuICAgIHByaXZhdGUgb3B0aW9uc0NhcHRpb25WYWx1ZTogc3RyaW5nO1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKG5hbWUpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBvcHRpb25zQ2FwdGlvbigpIHsgcmV0dXJuICh0aGlzLm9wdGlvbnNDYXB0aW9uVmFsdWUpID8gdGhpcy5vcHRpb25zQ2FwdGlvblZhbHVlIDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIpOyB9XHJcbiAgICBwdWJsaWMgc2V0IG9wdGlvbnNDYXB0aW9uKG5ld1ZhbHVlOiBzdHJpbmcpIHsgdGhpcy5vcHRpb25zQ2FwdGlvblZhbHVlID0gbmV3VmFsdWU7IH1cclxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIFwiZHJvcGRvd25cIjtcclxuICAgIH1cclxuICAgIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkgeyByZXR1cm4gdHJ1ZTsgfVxyXG59XHJcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJkcm9wZG93blwiLCBbeyBuYW1lOiBcIm9wdGlvbnNDYXB0aW9uXCIsIG9uR2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSkgeyByZXR1cm4gb2JqLm9wdGlvbnNDYXB0aW9uVmFsdWU7IH19XSxcclxuICAgIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBRdWVzdGlvbkRyb3Bkb3duTW9kZWwoXCJcIik7IH0sIFwic2VsZWN0YmFzZVwiKTtcclxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJkcm9wZG93blwiLCAobmFtZSkgPT4geyB2YXIgcSA9IG5ldyBRdWVzdGlvbkRyb3Bkb3duTW9kZWwobmFtZSk7IHEuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlczsgcmV0dXJuIHE7IH0pO1xuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3F1ZXN0aW9uX2Ryb3Bkb3duLnRzXG4gKiovIiwiaW1wb3J0IHtRdWVzdGlvbn0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcclxuaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XHJcbmltcG9ydCB7UXVlc3Rpb25GYWN0b3J5fSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcclxuaW1wb3J0IHtTdXJ2ZXlFcnJvcn0gZnJvbSBcIi4vYmFzZVwiO1xyXG5pbXBvcnQge0N1c3RvbUVycm9yLCBFeGNlZWRTaXplRXJyb3J9IGZyb20gXCIuL2Vycm9yXCI7XHJcbmltcG9ydCB7c3VydmV5TG9jYWxpemF0aW9ufSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25GaWxlTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XHJcbiAgICBwcml2YXRlIHNob3dQcmV2aWV3VmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgaXNVcGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByZXZpZXdWYWx1ZUxvYWRlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xyXG4gICAgcHVibGljIGltYWdlSGVpZ2h0OiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaW1hZ2VXaWR0aDogc3RyaW5nO1xyXG4gICAgcHVibGljIHN0b3JlRGF0YUFzVGV4dDogYm9vbGVhbjtcclxuICAgIHB1YmxpYyBtYXhTaXplOiBudW1iZXI7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcImZpbGVcIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgc2hvd1ByZXZpZXcoKSB7IHJldHVybiB0aGlzLnNob3dQcmV2aWV3VmFsdWU7IH1cclxuICAgIHB1YmxpYyBzZXQgc2hvd1ByZXZpZXcodmFsdWU6IGJvb2xlYW4pIHsgdGhpcy5zaG93UHJldmlld1ZhbHVlID0gdmFsdWU7IH1cclxuICAgIHB1YmxpYyBsb2FkRmlsZShmaWxlOiBGaWxlKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmICh0aGlzLnN1cnZleSAmJiAhdGhpcy5zdXJ2ZXkudXBsb2FkRmlsZSh0aGlzLm5hbWUsIGZpbGUsIHRoaXMuc3RvcmVEYXRhQXNUZXh0LCBmdW5jdGlvbiAoc3RhdHVzOiBzdHJpbmcpIHsgc2VsZi5pc1VwbG9hZGluZyA9IHN0YXR1cyA9PSBcInVwbG9hZGluZ1wiOyAgfSkpIHJldHVybjtcclxuICAgICAgICB0aGlzLnNldEZpbGVWYWx1ZShmaWxlKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBwcmV2aWV3VmFsdWU6IGFueTtcclxuICAgIHByb3RlY3RlZCBzZXRGaWxlVmFsdWUoZmlsZTogRmlsZSkge1xyXG4gICAgICAgIGlmICghRmlsZVJlYWRlcikgcmV0dXJuO1xyXG4gICAgICAgIGlmICghdGhpcy5zaG93UHJldmlldyAmJiAhdGhpcy5zdG9yZURhdGFBc1RleHQpIHJldHVybjtcclxuICAgICAgICBpZiAodGhpcy5jaGVja0ZpbGVGb3JFcnJvcnMoZmlsZSkpIHJldHVybjtcclxuICAgICAgICB2YXIgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgaWYgKHNlbGYuc2hvd1ByZXZpZXcpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYucHJldmlld1ZhbHVlID0gc2VsZi5pc0ZpbGVJbWFnZShmaWxlKSA/IGZpbGVSZWFkZXIucmVzdWx0IDogbnVsbDtcclxuICAgICAgICAgICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKHNlbGYucHJldmlld1ZhbHVlTG9hZGVkQ2FsbGJhY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnN0b3JlRGF0YUFzVGV4dCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IGZpbGVSZWFkZXIucmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBvbkNoZWNrRm9yRXJyb3JzKGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+KSB7XHJcbiAgICAgICAgc3VwZXIub25DaGVja0ZvckVycm9ycyhlcnJvcnMpO1xyXG4gICAgICAgIGlmICh0aGlzLmlzVXBsb2FkaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3JzLnB1c2gobmV3IEN1c3RvbUVycm9yKHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ1cGxvYWRpbmdGaWxlXCIpKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBjaGVja0ZpbGVGb3JFcnJvcnMoZmlsZTogRmlsZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHZhciBlcnJvckxlbmd0aCA9IHRoaXMuZXJyb3JzID8gdGhpcy5lcnJvcnMubGVuZ3RoIDogMDtcclxuICAgICAgICB0aGlzLmVycm9ycyA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLm1heFNpemUgPiAwICYmIGZpbGUuc2l6ZSA+IHRoaXMubWF4U2l6ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9ycy5wdXNoKG5ldyBFeGNlZWRTaXplRXJyb3IodGhpcy5tYXhTaXplKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlcnJvckxlbmd0aCAhPSB0aGlzLmVycm9ycy5sZW5ndGggfHwgdGhpcy5lcnJvcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmVycm9yc0NoYW5nZWRDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmVycm9ycy5sZW5ndGggPiAwO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBpc0ZpbGVJbWFnZShmaWxlOiBGaWxlKSB7XHJcbiAgICAgICAgaWYgKCFmaWxlIHx8ICFmaWxlLnR5cGUpIHJldHVybjtcclxuICAgICAgICB2YXIgc3RyID0gZmlsZS50eXBlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIHN0ci5pbmRleE9mKFwiaW1hZ2VcIikgPT0gMDtcclxuICAgIH1cclxufVxyXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwiZmlsZVwiLCBbXCJzaG93UHJldmlldzpib29sZWFuXCIsIFwiaW1hZ2VIZWlnaHRcIiwgXCJpbWFnZVdpZHRoXCIsIFwic3RvcmVEYXRhQXNUZXh0OmJvb2xlYW5cIiwgXCJtYXhTaXplOm51bWJlclwiXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IFF1ZXN0aW9uRmlsZU1vZGVsKFwiXCIpOyB9LCBcInF1ZXN0aW9uXCIpO1xyXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImZpbGVcIiwgKG5hbWUpID0+IHsgcmV0dXJuIG5ldyBRdWVzdGlvbkZpbGVNb2RlbChuYW1lKTsgfSk7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcXVlc3Rpb25fZmlsZS50c1xuICoqLyIsImltcG9ydCB7UXVlc3Rpb25CYXNlfSBmcm9tIFwiLi9xdWVzdGlvbmJhc2VcIjtcclxuaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XHJcbmltcG9ydCB7UXVlc3Rpb25GYWN0b3J5fSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkh0bWxNb2RlbCBleHRlbmRzIFF1ZXN0aW9uQmFzZSB7XHJcbiAgICBwcml2YXRlIGh0bWxWYWx1ZTogc3RyaW5nO1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKG5hbWUpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gXCJodG1sXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGh0bWwoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuaHRtbFZhbHVlOyB9XHJcbiAgICBwdWJsaWMgc2V0IGh0bWwodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuaHRtbFZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHByb2Nlc3NlZEh0bWwoKSB7IHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnByb2Nlc3NIdG1sKHRoaXMuaHRtbCkgOiB0aGlzLmh0bWw7IH1cclxufVxyXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwiaHRtbFwiLCBbXCJodG1sOmh0bWxcIl0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBRdWVzdGlvbkh0bWxNb2RlbChcIlwiKTsgfSwgXCJxdWVzdGlvbmJhc2VcIik7XHJcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiaHRtbFwiLCAobmFtZSkgPT4geyByZXR1cm4gbmV3IFF1ZXN0aW9uSHRtbE1vZGVsKG5hbWUpOyB9KTtcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9xdWVzdGlvbl9odG1sLnRzXG4gKiovIiwiaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XHJcbmltcG9ydCB7UXVlc3Rpb25GYWN0b3J5fSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcclxuaW1wb3J0IHtRdWVzdGlvbkNoZWNrYm94QmFzZX0gZnJvbSBcIi4vcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIGV4dGVuZHMgUXVlc3Rpb25DaGVja2JveEJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKG5hbWUpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gXCJyYWRpb2dyb3VwXCI7XHJcbiAgICB9XHJcbiAgICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHsgcmV0dXJuIHRydWU7IH1cclxufVxyXG5cclxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcInJhZGlvZ3JvdXBcIiwgW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbChcIlwiKTsgfSwgXCJjaGVja2JveGJhc2VcIik7XHJcblxyXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInJhZGlvZ3JvdXBcIiwgKG5hbWUpID0+IHsgdmFyIHEgPSBuZXcgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwobmFtZSk7IHEuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlczsgcmV0dXJuIHE7fSk7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcXVlc3Rpb25fcmFkaW9ncm91cC50c1xuICoqLyIsImltcG9ydCB7SXRlbVZhbHVlfSBmcm9tIFwiLi9iYXNlXCI7XHJcbmltcG9ydCB7UXVlc3Rpb259IGZyb20gXCIuL3F1ZXN0aW9uXCI7XHJcbmltcG9ydCB7SnNvbk9iamVjdH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xyXG5pbXBvcnQge1F1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25SYXRpbmdNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcclxuICAgIHN0YXRpYyBkZWZhdWx0UmF0ZVZhbHVlczogSXRlbVZhbHVlW10gPSBbXTtcclxuICAgIHByaXZhdGUgcmF0ZXM6IEl0ZW1WYWx1ZVtdID0gW107XHJcbiAgICBwdWJsaWMgbWluaW51bVJhdGVEZXNjcmlwdGlvbjogc3RyaW5nID0gbnVsbDtcclxuICAgIHB1YmxpYyBtYXhpbXVtUmF0ZURlc2NyaXB0aW9uOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAgIHJhdGVWYWx1ZXNDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKG5hbWUpO1xyXG4gICAgfVxyXG4gICAgZ2V0IHJhdGVWYWx1ZXMoKTogQXJyYXk8YW55PiB7IHJldHVybiB0aGlzLnJhdGVzOyB9XHJcbiAgICBzZXQgcmF0ZVZhbHVlcyhuZXdWYWx1ZTogQXJyYXk8YW55Pikge1xyXG4gICAgICAgIEl0ZW1WYWx1ZS5zZXREYXRhKHRoaXMucmF0ZXMsIG5ld1ZhbHVlKTtcclxuICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnJhdGVWYWx1ZXNDaGFuZ2VkQ2FsbGJhY2spO1xyXG4gICAgfVxyXG4gICAgZ2V0IHZpc2libGVSYXRlVmFsdWVzKCk6IEl0ZW1WYWx1ZVtdIHtcclxuICAgICAgICBpZiAodGhpcy5yYXRlVmFsdWVzLmxlbmd0aCA+IDApIHJldHVybiB0aGlzLnJhdGVWYWx1ZXM7XHJcbiAgICAgICAgcmV0dXJuIFF1ZXN0aW9uUmF0aW5nTW9kZWwuZGVmYXVsdFJhdGVWYWx1ZXM7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBcInJhdGluZ1wiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHN1cHBvcnRDb21tZW50KCk6IGJvb2xlYW4geyByZXR1cm4gdHJ1ZTsgfVxyXG4gICAgcHVibGljIHN1cHBvcnRPdGhlcigpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cclxuICAgIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkgeyByZXR1cm4gdHJ1ZTsgfVxyXG59XHJcbkl0ZW1WYWx1ZS5zZXREYXRhKFF1ZXN0aW9uUmF0aW5nTW9kZWwuZGVmYXVsdFJhdGVWYWx1ZXMsIFsxLCAyLCAzLCA0LCA1XSk7XHJcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJyYXRpbmdcIiwgW1wiaGFzQ29tbWVudDpib29sZWFuXCIsIHsgbmFtZTogXCJyYXRlVmFsdWVzOml0ZW12YWx1ZXNcIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55KSB7IHJldHVybiBJdGVtVmFsdWUuZ2V0RGF0YShvYmoucmF0ZVZhbHVlcyk7IH0sIG9uU2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSwgdmFsdWU6IGFueSkgeyBvYmoucmF0ZVZhbHVlcyA9IHZhbHVlOyB9fSxcclxuICAgIFwibWluaW51bVJhdGVEZXNjcmlwdGlvblwiLCBcIm1heGltdW1SYXRlRGVzY3JpcHRpb25cIl0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBRdWVzdGlvblJhdGluZ01vZGVsKFwiXCIpOyB9LCBcInF1ZXN0aW9uXCIpO1xyXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInJhdGluZ1wiLCAobmFtZSkgPT4geyByZXR1cm4gbmV3IFF1ZXN0aW9uUmF0aW5nTW9kZWwobmFtZSk7IH0pO1xuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3F1ZXN0aW9uX3JhdGluZy50c1xuICoqLyIsImltcG9ydCB7UXVlc3Rpb25GYWN0b3J5fSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcclxuaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XHJcbmltcG9ydCB7UXVlc3Rpb259IGZyb20gXCIuL3F1ZXN0aW9uXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25UZXh0TW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XHJcbiAgICBwdWJsaWMgc2l6ZTogbnVtYmVyID0gMjU7XHJcbiAgICBwdWJsaWMgaW5wdXRUeXBlOiBzdHJpbmcgPSBcInRleHRcIjtcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihuYW1lKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIFwidGV4dFwiO1xyXG4gICAgfVxyXG4gICAgaXNFbXB0eSgpOiBib29sZWFuIHsgIHJldHVybiBzdXBlci5pc0VtcHR5KCkgfHwgdGhpcy52YWx1ZSA9PSBcIlwiOyB9XHJcbiAgICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHsgcmV0dXJuIHRydWU7IH1cclxuICAgIHByb3RlY3RlZCBzZXROZXdWYWx1ZShuZXdWYWx1ZTogYW55KSB7XHJcbiAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmNvcnJlY3RWYWx1ZVR5cGUobmV3VmFsdWUpO1xyXG4gICAgICAgIHN1cGVyLnNldE5ld1ZhbHVlKG5ld1ZhbHVlKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBjb3JyZWN0VmFsdWVUeXBlKG5ld1ZhbHVlOiBhbnkpOiBhbnkge1xyXG4gICAgICAgIGlmICghbmV3VmFsdWUpIHJldHVybiBuZXdWYWx1ZTtcclxuICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT0gXCJudW1iZXJcIiB8fCB0aGlzLmlucHV0VHlwZSA9PSBcInJhbmdlXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNOdW1iZXIobmV3VmFsdWUpID8gcGFyc2VGbG9hdChuZXdWYWx1ZSkgOiBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3VmFsdWU7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGlzTnVtYmVyKHZhbHVlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KHZhbHVlKSkgJiYgaXNGaW5pdGUodmFsdWUpO1xyXG4gICAgfVxyXG59XHJcblxyXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwidGV4dFwiLCBbeyBuYW1lOiBcImlucHV0VHlwZVwiLCBkZWZhdWx0OiBcInRleHRcIiwgY2hvaWNlczogW1wiY29sb3JcIiwgXCJkYXRlXCIsIFwiZGF0ZXRpbWVcIiwgXCJkYXRldGltZS1sb2NhbFwiLCBcImVtYWlsXCIsIFwibW9udGhcIiwgXCJudW1iZXJcIiwgXCJwYXNzd29yZFwiLCBcInJhbmdlXCIsIFwidGVsXCIsIFwidGV4dFwiLCBcInRpbWVcIiwgXCJ1cmxcIiwgXCJ3ZWVrXCJdIH0sXHJcbiAgICB7IG5hbWU6IFwic2l6ZTpudW1iZXJcIiwgZGVmYXVsdDogMjUgfV0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBRdWVzdGlvblRleHRNb2RlbChcIlwiKTsgfSwgXCJxdWVzdGlvblwiKTtcclxuXHJcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwidGV4dFwiLCAobmFtZSkgPT4geyByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dE1vZGVsKG5hbWUpOyB9KTtcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9xdWVzdGlvbl90ZXh0LnRzXG4gKiovIiwiaW1wb3J0IHtKc29uT2JqZWN0fSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XHJcbmltcG9ydCB7QmFzZSwgSVN1cnZleSwgSGFzaFRhYmxlLCBJUXVlc3Rpb24sIElDb25kaXRpb25SdW5uZXIsIElQYWdlLCBTdXJ2ZXlFcnJvciwgRXZlbnR9IGZyb20gXCIuL2Jhc2VcIjtcclxuaW1wb3J0IHtJU3VydmV5VHJpZ2dlck93bmVyLCBTdXJ2ZXlUcmlnZ2VyfSBmcm9tIFwiLi90cmlnZ2VyXCI7XHJcbmltcG9ydCB7UGFnZU1vZGVsfSBmcm9tIFwiLi9wYWdlXCI7XHJcbmltcG9ydCB7VGV4dFByZVByb2Nlc3Nvcn0gZnJvbSBcIi4vdGV4dFByZVByb2Nlc3NvclwiO1xyXG5pbXBvcnQge1Byb2Nlc3NWYWx1ZX0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XHJcbmltcG9ydCB7ZHhTdXJ2ZXlTZXJ2aWNlfSBmcm9tIFwiLi9keFN1cnZleVNlcnZpY2VcIjtcclxuaW1wb3J0IHtKc29uRXJyb3J9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcclxuaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcclxuaW1wb3J0IHtRdWVzdGlvbkJhc2V9IGZyb20gXCIuL3F1ZXN0aW9uYmFzZVwiO1xyXG5pbXBvcnQge0N1c3RvbUVycm9yfSBmcm9tIFwiLi9lcnJvclwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFN1cnZleU1vZGVsIGV4dGVuZHMgQmFzZSBpbXBsZW1lbnRzIElTdXJ2ZXksIElTdXJ2ZXlUcmlnZ2VyT3duZXIge1xyXG4gICAgcHVibGljIHN1cnZleUlkOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgcHVibGljIHN1cnZleVBvc3RJZDogc3RyaW5nID0gbnVsbDtcclxuICAgIHB1YmxpYyBjbGllbnRJZDogc3RyaW5nID0gbnVsbDtcclxuICAgIHB1YmxpYyBjb29raWVOYW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgcHVibGljIHNlbmRSZXN1bHRPblBhZ2VOZXh0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIGNvbW1lbnRQcmVmaXg6IHN0cmluZyA9IFwiLUNvbW1lbnRcIjtcclxuICAgIHB1YmxpYyB0aXRsZTogc3RyaW5nID0gXCJcIjtcclxuICAgIHB1YmxpYyBzaG93TmF2aWdhdGlvbkJ1dHRvbnM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHVibGljIHNob3dUaXRsZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwdWJsaWMgc2hvd1BhZ2VUaXRsZXM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHVibGljIGNvbXBsZXRlZEh0bWw6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgcmVxdWlyZWRUZXh0OiBzdHJpbmcgPSBcIipcIjtcclxuICAgIHB1YmxpYyBxdWVzdGlvblN0YXJ0SW5kZXg6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBwdWJsaWMgcXVlc3Rpb25UaXRsZVRlbXBsYXRlOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHVibGljIHNob3dQcm9ncmVzc0Jhcjogc3RyaW5nID0gXCJvZmZcIjtcclxuICAgIHB1YmxpYyBzdG9yZU90aGVyc0FzQ29tbWVudDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwdWJsaWMgZ29OZXh0UGFnZUF1dG9tYXRpYzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIHBhZ2VzOiBBcnJheTxQYWdlTW9kZWw+ID0gbmV3IEFycmF5PFBhZ2VNb2RlbD4oKTtcclxuICAgIHB1YmxpYyB0cmlnZ2VyczogQXJyYXk8U3VydmV5VHJpZ2dlcj4gPSBuZXcgQXJyYXk8U3VydmV5VHJpZ2dlcj4oKTtcclxuICAgIHB1YmxpYyBjbGVhckludmlzaWJsZVZhbHVlczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50UGFnZVZhbHVlOiBQYWdlTW9kZWwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSB2YWx1ZXNIYXNoOiBIYXNoVGFibGU8YW55PiA9IHt9O1xyXG4gICAgcHJpdmF0ZSB2YXJpYWJsZXNIYXNoOiBIYXNoVGFibGU8YW55PiA9IHt9O1xyXG4gICAgcHJpdmF0ZSBwYWdlUHJldlRleHRWYWx1ZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBwYWdlTmV4dFRleHRWYWx1ZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBjb21wbGV0ZVRleHRWYWx1ZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBzaG93UGFnZU51bWJlcnNWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBzaG93UXVlc3Rpb25OdW1iZXJzVmFsdWU6IHN0cmluZyA9IFwib25cIjtcclxuICAgIHByaXZhdGUgcXVlc3Rpb25UaXRsZUxvY2F0aW9uVmFsdWU6IHN0cmluZyA9IFwidG9wXCI7XHJcbiAgICBwcml2YXRlIGxvY2FsZVZhbHVlOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgcHJpdmF0ZSBpc0NvbXBsZXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgcHJvY2Vzc2VkVGV4dFZhbHVlczogSGFzaFRhYmxlPGFueT4gPSB7fTtcclxuICAgIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvcjogVGV4dFByZVByb2Nlc3NvcjtcclxuICAgIHByaXZhdGUgaXNWYWxpZGF0aW5nT25TZXJ2ZXJWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBtb2RlVmFsdWU6IHN0cmluZyA9IFwiZWRpdFwiO1xyXG4gICAgcHJpdmF0ZSBpc0Rlc2lnbk1vZGVWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBvbkNvbXBsZXRlOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsKSA9PiBhbnksIGFueT4oKTtcclxuICAgIHB1YmxpYyBvblBhcnRpYWxTZW5kOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsKSA9PiBhbnksIGFueT4oKTtcclxuICAgIHB1YmxpYyBvbkN1cnJlbnRQYWdlQ2hhbmdlZDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xyXG4gICAgcHVibGljIG9uVmFsdWVDaGFuZ2VkOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XHJcbiAgICBwdWJsaWMgb25WaXNpYmxlQ2hhbmdlZDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xyXG4gICAgcHVibGljIG9uUGFnZVZpc2libGVDaGFuZ2VkOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XHJcbiAgICBwdWJsaWMgb25RdWVzdGlvbkFkZGVkOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XHJcbiAgICBwdWJsaWMgb25RdWVzdGlvblJlbW92ZWQ6IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcclxuICAgIHB1YmxpYyBvblZhbGlkYXRlUXVlc3Rpb246IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcclxuICAgIHB1YmxpYyBvblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zOiAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnk7XHJcbiAgICBwdWJsaWMgb25Qcm9jZXNzSHRtbDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xyXG4gICAgcHVibGljIG9uU2VuZFJlc3VsdDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xyXG4gICAgcHVibGljIG9uR2V0UmVzdWx0OiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XHJcbiAgICBwdWJsaWMgb25VcGxvYWRGaWxlOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XHJcbiAgICBwdWJsaWMganNvbkVycm9yczogQXJyYXk8SnNvbkVycm9yPiA9IG51bGw7XHJcblxyXG4gICAgY29uc3RydWN0b3IoanNvbk9iajogYW55ID0gbnVsbCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMudGV4dFByZVByb2Nlc3NvciA9IG5ldyBUZXh0UHJlUHJvY2Vzc29yKCk7XHJcbiAgICAgICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yLm9uSGFzVmFsdWUgPSBmdW5jdGlvbiAobmFtZTogc3RyaW5nKSB7IHJldHVybiBzZWxmLmhhc1Byb2Nlc3NlZFRleHRWYWx1ZShuYW1lKTsgfTtcclxuICAgICAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3Iub25Qcm9jZXNzID0gZnVuY3Rpb24gKG5hbWU6IHN0cmluZykgeyByZXR1cm4gc2VsZi5nZXRQcm9jZXNzZWRUZXh0VmFsdWUobmFtZSk7IH07XHJcbiAgICAgICAgdGhpcy5wYWdlcy5wdXNoID0gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHZhbHVlLmRhdGEgPSBzZWxmO1xyXG4gICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCB2YWx1ZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnRyaWdnZXJzLnB1c2ggPSBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdmFsdWUuc2V0T3duZXIoc2VsZik7XHJcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIHZhbHVlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMudXBkYXRlUHJvY2Vzc2VkVGV4dFZhbHVlcygpO1xyXG4gICAgICAgIHRoaXMub25CZWZvcmVDcmVhdGluZygpO1xyXG4gICAgICAgIGlmIChqc29uT2JqKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0SnNvbk9iamVjdChqc29uT2JqKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc3VydmV5SWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZFN1cnZleUZyb21TZXJ2aWNlKHRoaXMuc3VydmV5SWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub25DcmVhdGluZygpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIFwic3VydmV5XCI7IH1cclxuICAgIHB1YmxpYyBnZXQgbG9jYWxlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmxvY2FsZVZhbHVlOyB9XHJcbiAgICBwdWJsaWMgc2V0IGxvY2FsZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5sb2NhbGVWYWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5jdXJyZW50TG9jYWxlID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0TG9jU3RyaW5nKHN0cjogc3RyaW5nKSB7IHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKHN0cik7IH1cclxuICAgIHB1YmxpYyBnZXQgZW1wdHlTdXJ2ZXlUZXh0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcImVtcHR5U3VydmV5XCIpOyB9XHJcbiAgICBwdWJsaWMgZ2V0IHBhZ2VQcmV2VGV4dCgpIHsgcmV0dXJuICh0aGlzLnBhZ2VQcmV2VGV4dFZhbHVlKSA/IHRoaXMucGFnZVByZXZUZXh0VmFsdWUgOiB0aGlzLmdldExvY1N0cmluZyhcInBhZ2VQcmV2VGV4dFwiKTsgfVxyXG4gICAgcHVibGljIHNldCBwYWdlUHJldlRleHQobmV3VmFsdWU6IHN0cmluZykgeyB0aGlzLnBhZ2VQcmV2VGV4dFZhbHVlID0gbmV3VmFsdWU7IH1cclxuICAgIHB1YmxpYyBnZXQgcGFnZU5leHRUZXh0KCkgeyByZXR1cm4gKHRoaXMucGFnZU5leHRUZXh0VmFsdWUpID8gdGhpcy5wYWdlTmV4dFRleHRWYWx1ZSA6IHRoaXMuZ2V0TG9jU3RyaW5nKFwicGFnZU5leHRUZXh0XCIpOyB9XHJcbiAgICBwdWJsaWMgc2V0IHBhZ2VOZXh0VGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7IHRoaXMucGFnZU5leHRUZXh0VmFsdWUgPSBuZXdWYWx1ZTsgfVxyXG4gICAgcHVibGljIGdldCBjb21wbGV0ZVRleHQoKSB7IHJldHVybiAodGhpcy5jb21wbGV0ZVRleHRWYWx1ZSkgPyB0aGlzLmNvbXBsZXRlVGV4dFZhbHVlIDogdGhpcy5nZXRMb2NTdHJpbmcoXCJjb21wbGV0ZVRleHRcIik7IH1cclxuICAgIHB1YmxpYyBzZXQgY29tcGxldGVUZXh0KG5ld1ZhbHVlOiBzdHJpbmcpIHsgdGhpcy5jb21wbGV0ZVRleHRWYWx1ZSA9IG5ld1ZhbHVlOyB9XHJcbiAgICBwdWJsaWMgZ2V0IHNob3dQYWdlTnVtYmVycygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuc2hvd1BhZ2VOdW1iZXJzVmFsdWU7IH1cclxuICAgIHB1YmxpYyBzZXQgc2hvd1BhZ2VOdW1iZXJzKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSB0aGlzLnNob3dQYWdlTnVtYmVycykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuc2hvd1BhZ2VOdW1iZXJzVmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHNob3dRdWVzdGlvbk51bWJlcnMoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVyc1ZhbHVlOyB9O1xyXG4gICAgcHVibGljIHNldCBzaG93UXVlc3Rpb25OdW1iZXJzKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVyc1ZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xyXG4gICAgfTtcclxuICAgIHB1YmxpYyBnZXQgcXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnF1ZXN0aW9uVGl0bGVMb2NhdGlvblZhbHVlOyB9O1xyXG4gICAgcHVibGljIHNldCBxdWVzdGlvblRpdGxlTG9jYXRpb24odmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5xdWVzdGlvblRpdGxlTG9jYXRpb25WYWx1ZSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucXVlc3Rpb25UaXRsZUxvY2F0aW9uVmFsdWUgPSB2YWx1ZTtcclxuICAgIH07XHJcbiAgICBwdWJsaWMgZ2V0IG1vZGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMubW9kZVZhbHVlOyB9XHJcbiAgICBwdWJsaWMgc2V0IG1vZGUodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PSB0aGlzLm1vZGUpIHJldHVybjtcclxuICAgICAgICBpZiAodmFsdWUgIT0gXCJlZGl0XCIgJiYgdmFsdWUgIT0gXCJkaXNwbGF5XCIpIHJldHVybjtcclxuICAgICAgICB0aGlzLm1vZGVWYWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBkYXRhKCk6IGFueSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnZhbHVlc0hhc2gpIHtcclxuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLnZhbHVlc0hhc2hba2V5XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgZGF0YShkYXRhOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnZhbHVlc0hhc2ggPSB7fTtcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXNIYXNoW2tleV0gPSBkYXRhW2tleV07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVHJpZ2dlcnMoa2V5LCBkYXRhW2tleV0sIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm5vdGlmeUFsbFF1ZXN0aW9uc09uVmFsdWVDaGFuZ2VkKCk7XHJcbiAgICAgICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGNvbW1lbnRzKCk6IGFueSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnZhbHVlc0hhc2gpIHtcclxuICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKHRoaXMuY29tbWVudFByZWZpeCkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHRoaXMudmFsdWVzSGFzaFtrZXldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbiAgICBnZXQgdmlzaWJsZVBhZ2VzKCk6IEFycmF5PFBhZ2VNb2RlbD4ge1xyXG4gICAgICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIHRoaXMucGFnZXM7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxQYWdlTW9kZWw+KCk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhZ2VzW2ldLmlzVmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5wYWdlc1tpXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucGFnZXMubGVuZ3RoID09IDA7IH1cclxuICAgIHB1YmxpYyBnZXQgUGFnZUNvdW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnZXMubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCB2aXNpYmxlUGFnZUNvdW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZVBhZ2VzLmxlbmd0aDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgY3VycmVudFBhZ2UoKTogUGFnZU1vZGVsIHtcclxuICAgICAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFBhZ2VWYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmICh2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlVmFsdWUpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFBhZ2VWYWx1ZSA9PSBudWxsICYmIHZQYWdlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB2UGFnZXNbMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYWdlVmFsdWU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGN1cnJlbnRQYWdlKHZhbHVlOiBQYWdlTW9kZWwpIHtcclxuICAgICAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XHJcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdlBhZ2VzLmluZGV4T2YodmFsdWUpIDwgMCkgcmV0dXJuO1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PSB0aGlzLmN1cnJlbnRQYWdlVmFsdWUpIHJldHVybjtcclxuICAgICAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmN1cnJlbnRQYWdlVmFsdWU7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZVZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZUNoYW5nZWQodmFsdWUsIG9sZFZhbHVlKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgY3VycmVudFBhZ2VObygpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2libGVQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBjdXJyZW50UGFnZU5vKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XHJcbiAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+PSB0aGlzLnZpc2libGVQYWdlcy5sZW5ndGgpIHJldHVybjtcclxuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy52aXNpYmxlUGFnZXNbdmFsdWVdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGZvY3VzRmlyc3RRdWVzdGlvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50UGFnZVZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2VWYWx1ZS5zY3JvbGxUb1RvcCgpO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlVmFsdWUuZm9jdXNGaXJzdFF1ZXN0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBzdGF0ZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTG9hZGluZykgcmV0dXJuIFwibG9hZGluZ1wiO1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcGxldGVkKSByZXR1cm4gXCJjb21wbGV0ZWRcIjtcclxuICAgICAgICByZXR1cm4gKHRoaXMuY3VycmVudFBhZ2UpID8gXCJydW5uaW5nXCIgOiBcImVtcHR5XCJcclxuICAgIH1cclxuICAgIHB1YmxpYyBjbGVhcihjbGVhckRhdGE6IGJvb2xlYW4gPSB0cnVlLCBnb3RvRmlyc3RQYWdlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIGlmIChjbGVhckRhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy52YXJpYWJsZXNIYXNoID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNDb21wbGV0ZWQgPSBmYWxzZTtcclxuICAgICAgICBpZiAoZ290b0ZpcnN0UGFnZSAmJiB0aGlzLnZpc2libGVQYWdlQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnZpc2libGVQYWdlc1swXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgbWVyZ2VWYWx1ZXMoc3JjOiBhbnksIGRlc3Q6IGFueSkge1xyXG4gICAgICAgIGlmICghZGVzdCB8fCAhc3JjKSByZXR1cm47XHJcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNyYykge1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBzcmNba2V5XTtcclxuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgIGlmICghZGVzdFtrZXldKSBkZXN0W2tleV0gPSB7fTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VWYWx1ZXModmFsdWUsIGRlc3Rba2V5XSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkZXN0W2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBjdXJyZW50UGFnZUNoYW5nZWQobmV3VmFsdWU6IFBhZ2VNb2RlbCwgb2xkVmFsdWU6IFBhZ2VNb2RlbCkge1xyXG4gICAgICAgIHRoaXMub25DdXJyZW50UGFnZUNoYW5nZWQuZmlyZSh0aGlzLCB7ICdvbGRDdXJyZW50UGFnZSc6IG9sZFZhbHVlLCAnbmV3Q3VycmVudFBhZ2UnOiBuZXdWYWx1ZSB9KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXRQcm9ncmVzcygpOiBudW1iZXIge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID09IG51bGwpIHJldHVybiAwO1xyXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMudmlzaWJsZVBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZSkgKyAxO1xyXG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwoKGluZGV4ICogMTAwIC8gdGhpcy52aXNpYmxlUGFnZUNvdW50KSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGlzRWRpdE1vZGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm1vZGUgPT0gXCJlZGl0XCI7IH1cclxuICAgIHB1YmxpYyBnZXQgaXNEaXNwbGF5TW9kZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMubW9kZSA9PSBcImRpc3BsYXlcIjsgfVxyXG4gICAgcHVibGljIGdldCBpc0Rlc2lnbk1vZGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmlzRGVzaWduTW9kZVZhbHVlOyB9XHJcbiAgICBwdWJsaWMgc2V0RGVzaWduTW9kZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuaXNEZXNpZ25Nb2RlVmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgaGFzQ29va2llKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdGhpcy5jb29raWVOYW1lKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgdmFyIGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWU7XHJcbiAgICAgICAgcmV0dXJuIGNvb2tpZXMgJiYgY29va2llcy5pbmRleE9mKHRoaXMuY29va2llTmFtZSArIFwiPXRydWVcIikgPiAtMTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXRDb29raWUoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvb2tpZU5hbWUpIHJldHVybjtcclxuICAgICAgICBkb2N1bWVudC5jb29raWUgPSB0aGlzLmNvb2tpZU5hbWUgKyBcIj10cnVlOyBleHBpcmVzPUZyaSwgMzEgRGVjIDk5OTkgMDowOjAgR01UXCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZGVsZXRlQ29va2llKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5jb29raWVOYW1lKSByZXR1cm47XHJcbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gdGhpcy5jb29raWVOYW1lICsgXCI9O1wiO1xyXG4gICAgfVxyXG4gICAgcHVibGljIG5leHRQYWdlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTGFzdFBhZ2UpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5pc0VkaXRNb2RlICYmIHRoaXMuaXNDdXJyZW50UGFnZUhhc0Vycm9ycykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmRvU2VydmVyVmFsaWRhdGlvbigpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5kb05leHRQYWdlKCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBnZXQgaXNDdXJyZW50UGFnZUhhc0Vycm9ycygpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50UGFnZS5oYXNFcnJvcnModHJ1ZSwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgcHJldlBhZ2UoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNGaXJzdFBhZ2UpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XHJcbiAgICAgICAgdmFyIGluZGV4ID0gdlBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZSk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHZQYWdlc1tpbmRleCAtIDFdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGNvbXBsZXRlTGFzdFBhZ2UoKSA6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLmlzRWRpdE1vZGUgJiYgdGhpcy5pc0N1cnJlbnRQYWdlSGFzRXJyb3JzKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuZG9TZXJ2ZXJWYWxpZGF0aW9uKCkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB0aGlzLmRvQ29tcGxldGUoKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgaXNGaXJzdFBhZ2UoKTogYm9vbGVhbiB7IFxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID09IG51bGwpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnZpc2libGVQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpID09IDA7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGlzTGFzdFBhZ2UoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT0gbnVsbCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xyXG4gICAgICAgIHJldHVybiB2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSA9PSB2UGFnZXMubGVuZ3RoIC0gMTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBkb0NvbXBsZXRlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmNsZWFySW52aXNpYmxlVmFsdWVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJJbnZpc2libGVRdWVzdGlvblZhbHVlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldENvb2tpZSgpO1xyXG4gICAgICAgIHRoaXMuc2V0Q29tcGxldGVkKCk7XHJcbiAgICAgICAgdGhpcy5vbkNvbXBsZXRlLmZpcmUodGhpcywgbnVsbCk7XHJcbiAgICAgICAgaWYgKHRoaXMuc3VydmV5UG9zdElkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VuZFJlc3VsdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgaXNWYWxpZGF0aW5nT25TZXJ2ZXIoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmlzVmFsaWRhdGluZ09uU2VydmVyVmFsdWU7IH1cclxuICAgIHByaXZhdGUgc2V0SXNWYWxpZGF0aW5nT25TZXJ2ZXIodmFsOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHZhbCA9PSB0aGlzLmlzVmFsaWRhdGluZ09uU2VydmVyKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5pc1ZhbGlkYXRpbmdPblNlcnZlclZhbHVlID0gdmFsO1xyXG4gICAgICAgIHRoaXMub25Jc1ZhbGlkYXRpbmdPblNlcnZlckNoYW5nZWQoKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBvbklzVmFsaWRhdGluZ09uU2VydmVyQ2hhbmdlZCgpIHsgfVxyXG4gICAgcHJvdGVjdGVkIGRvU2VydmVyVmFsaWRhdGlvbigpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXRoaXMub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICB2YXIgb3B0aW9ucyA9IHsgZGF0YToge30sIGVycm9yczoge30sIHN1cnZleTogdGhpcywgY29tcGxldGUgOiBmdW5jdGlvbiAoKSB7IHNlbGYuY29tcGxldGVTZXJ2ZXJWYWxpZGF0aW9uKG9wdGlvbnMpOyB9IH07XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmN1cnJlbnRQYWdlLnF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmN1cnJlbnRQYWdlLnF1ZXN0aW9uc1tpXTtcclxuICAgICAgICAgICAgaWYgKCFxdWVzdGlvbi52aXNpYmxlKSBjb250aW51ZTtcclxuICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZShxdWVzdGlvbi5uYW1lKTtcclxuICAgICAgICAgICAgaWYgKHZhbHVlKSBvcHRpb25zLmRhdGFbcXVlc3Rpb24ubmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRJc1ZhbGlkYXRpbmdPblNlcnZlcih0cnVlKTtcclxuICAgICAgICB0aGlzLm9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnModGhpcywgb3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGNvbXBsZXRlU2VydmVyVmFsaWRhdGlvbihvcHRpb25zOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnNldElzVmFsaWRhdGluZ09uU2VydmVyKGZhbHNlKTtcclxuICAgICAgICBpZiAoIW9wdGlvbnMgJiYgIW9wdGlvbnMuc3VydmV5KSByZXR1cm47XHJcbiAgICAgICAgdmFyIHNlbGYgPSBvcHRpb25zLnN1cnZleTtcclxuICAgICAgICB2YXIgaGFzRXJyb3JzID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMuZXJyb3JzKSB7XHJcbiAgICAgICAgICAgIGZvciAodmFyIG5hbWUgaW4gb3B0aW9ucy5lcnJvcnMpIHtcclxuICAgICAgICAgICAgICAgIHZhciBxdWVzdGlvbiA9IHNlbGYuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAocXVlc3Rpb24gJiYgcXVlc3Rpb25bXCJlcnJvcnNcIl0pIHtcclxuICAgICAgICAgICAgICAgICAgICBoYXNFcnJvcnMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uW1wiYWRkRXJyb3JcIl0obmV3IEN1c3RvbUVycm9yKG9wdGlvbnMuZXJyb3JzW25hbWVdKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFoYXNFcnJvcnMpIHtcclxuICAgICAgICAgICAgaWYgKHNlbGYuaXNMYXN0UGFnZSkgc2VsZi5kb0NvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgIGVsc2Ugc2VsZi5kb05leHRQYWdlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGRvTmV4dFBhZ2UoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja09uUGFnZVRyaWdnZXJzKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VuZFJlc3VsdE9uUGFnZU5leHQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZW5kUmVzdWx0KHRoaXMuc3VydmV5UG9zdElkLCB0aGlzLmNsaWVudElkLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xyXG4gICAgICAgIHZhciBpbmRleCA9IHZQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB2UGFnZXNbaW5kZXggKyAxXTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBzZXRDb21wbGV0ZWQoKSB7XHJcbiAgICAgICAgdGhpcy5pc0NvbXBsZXRlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHByb2Nlc3NlZENvbXBsZXRlZEh0bWwoKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAodGhpcy5jb21wbGV0ZWRIdG1sKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NIdG1sKHRoaXMuY29tcGxldGVkSHRtbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBcIjxoMz5cIiArIHRoaXMuZ2V0TG9jU3RyaW5nKFwiY29tcGxldGluZ1N1cnZleVwiKSArIFwiPC9oMz5cIjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgcHJvY2Vzc2VkTG9hZGluZ0h0bWwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gXCI8aDM+XCIgKyB0aGlzLmdldExvY1N0cmluZyhcImxvYWRpbmdTdXJ2ZXlcIikgKyBcIjwvaDM+XCI7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IHByb2dyZXNzVGV4dCgpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID09IG51bGwpIHJldHVybiBcIlwiO1xyXG4gICAgICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcclxuICAgICAgICB2YXIgaW5kZXggPSB2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSArIDE7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwicHJvZ3Jlc3NUZXh0XCIpW1wiZm9ybWF0XCJdKGluZGV4LCB2UGFnZXMubGVuZ3RoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyB1cGxvYWRGaWxlKG5hbWU6IHN0cmluZywgZmlsZTogRmlsZSwgc3RvcmVEYXRhQXNUZXh0OiBib29sZWFuLCB1cGxvYWRpbmdDYWxsYmFjazogKHN0YXR1czogc3RyaW5nKT0+YW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgdmFyIGFjY2VwdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5vblVwbG9hZEZpbGUuZmlyZSh0aGlzLCB7IG5hbWU6IG5hbWUsIGZpbGU6IGZpbGUsIGFjY2VwdDogYWNjZXB0IH0pO1xyXG4gICAgICAgIGlmICghYWNjZXB0KSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKCFzdG9yZURhdGFBc1RleHQgJiYgdGhpcy5zdXJ2ZXlQb3N0SWQpIHtcclxuICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlQ29yZShuYW1lLCBmaWxlLCB1cGxvYWRpbmdDYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHVwbG9hZEZpbGVDb3JlKG5hbWU6IHN0cmluZywgZmlsZTogRmlsZSwgdXBsb2FkaW5nQ2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZykgPT4gYW55KSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmICh1cGxvYWRpbmdDYWxsYmFjaykgdXBsb2FkaW5nQ2FsbGJhY2soXCJ1cGxvYWRpbmdcIik7XHJcbiAgICAgICAgbmV3IGR4U3VydmV5U2VydmljZSgpLnNlbmRGaWxlKHRoaXMuc3VydmV5UG9zdElkLCBmaWxlLCBmdW5jdGlvbiAoc3VjY2VzczogYm9vbGVhbiwgcmVzcG9uc2U6IGFueSkge1xyXG4gICAgICAgICAgICBpZiAodXBsb2FkaW5nQ2FsbGJhY2spIHVwbG9hZGluZ0NhbGxiYWNrKHN1Y2Nlc3MgPyBcInN1Y2Nlc3NcIiA6IFwiZXJyb3JcIik7XHJcbiAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNldFZhbHVlKG5hbWUsIHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZ2V0UGFnZShpbmRleDogbnVtYmVyKTogUGFnZU1vZGVsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wYWdlc1tpbmRleF07XHJcbiAgICB9XHJcbiAgICBhZGRQYWdlKHBhZ2U6IFBhZ2VNb2RlbCkge1xyXG4gICAgICAgIGlmIChwYWdlID09IG51bGwpIHJldHVybjtcclxuICAgICAgICB0aGlzLnBhZ2VzLnB1c2gocGFnZSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xyXG4gICAgfVxyXG4gICAgYWRkTmV3UGFnZShuYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgcGFnZSA9IHRoaXMuY3JlYXRlTmV3UGFnZShuYW1lKTtcclxuICAgICAgICB0aGlzLmFkZFBhZ2UocGFnZSk7XHJcbiAgICAgICAgcmV0dXJuIHBhZ2U7XHJcbiAgICB9XHJcbiAgICByZW1vdmVQYWdlKHBhZ2U6IFBhZ2VNb2RlbCkge1xyXG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMucGFnZXMuaW5kZXhPZihwYWdlKTtcclxuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5wYWdlcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlVmFsdWUgPT0gcGFnZSkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5wYWdlcy5sZW5ndGggPiAwID8gdGhpcy5wYWdlc1swXSA6IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXRRdWVzdGlvbkJ5TmFtZShuYW1lOiBzdHJpbmcsIGNhc2VJbnNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlKTogSVF1ZXN0aW9uIHtcclxuICAgICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcclxuICAgICAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHF1ZXN0aW9uTmFtZSA9IHF1ZXN0aW9uc1tpXS5uYW1lO1xyXG4gICAgICAgICAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSBxdWVzdGlvbk5hbWUgPSBxdWVzdGlvbk5hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgaWYocXVlc3Rpb25OYW1lID09IG5hbWUpIHJldHVybiBxdWVzdGlvbnNbaV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFF1ZXN0aW9uc0J5TmFtZXMobmFtZXM6IHN0cmluZ1tdLCBjYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZSk6IElRdWVzdGlvbltdIHtcclxuICAgICAgICB2YXIgcmVzdWx0ID0gW107XHJcbiAgICAgICAgaWYgKCFuYW1lcykgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKCFuYW1lc1tpXSkgY29udGludWU7XHJcbiAgICAgICAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZXNbaV0sIGNhc2VJbnNlbnNpdGl2ZSk7XHJcbiAgICAgICAgICAgIGlmIChxdWVzdGlvbikgcmVzdWx0LnB1c2gocXVlc3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFBhZ2VCeVF1ZXN0aW9uKHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBQYWdlTW9kZWwge1xyXG4gICAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBwYWdlID0gdGhpcy5wYWdlc1tpXTtcclxuICAgICAgICAgICAgaWYgKHBhZ2UucXVlc3Rpb25zLmluZGV4T2YoPFF1ZXN0aW9uQmFzZT5xdWVzdGlvbikgPiAtMSkgcmV0dXJuIHBhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFBhZ2VCeU5hbWUobmFtZTogc3RyaW5nKTogUGFnZU1vZGVsIHtcclxuICAgICAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wYWdlc1tpXS5uYW1lID09IG5hbWUpIHJldHVybiB0aGlzLnBhZ2VzW2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXRQYWdlc0J5TmFtZXMobmFtZXM6IHN0cmluZ1tdKTogUGFnZU1vZGVsW117XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xyXG4gICAgICAgIGlmICghbmFtZXMpIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICghbmFtZXNbaV0pIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB2YXIgcGFnZSA9IHRoaXMuZ2V0UGFnZUJ5TmFtZShuYW1lc1tpXSk7XHJcbiAgICAgICAgICAgIGlmIChwYWdlKSByZXN1bHQucHVzaChwYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXRBbGxRdWVzdGlvbnModmlzaWJsZU9ubHk6IGJvb2xlYW4gPSBmYWxzZSk6IEFycmF5PElRdWVzdGlvbj4ge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8SVF1ZXN0aW9uPigpO1xyXG4gICAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFnZXNbaV0uYWRkUXVlc3Rpb25zVG9MaXN0KHJlc3VsdCwgdmlzaWJsZU9ubHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZU5ld1BhZ2UobmFtZTogc3RyaW5nKSB7IHJldHVybiBuZXcgUGFnZU1vZGVsKG5hbWUpOyB9XHJcbiAgICBwcml2YXRlIG5vdGlmeVF1ZXN0aW9uT25WYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XHJcbiAgICAgICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0QWxsUXVlc3Rpb25zKCk7XHJcbiAgICAgICAgdmFyIHF1ZXN0aW9uID0gbnVsbDtcclxuICAgICAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChxdWVzdGlvbnNbaV0ubmFtZSAhPSBuYW1lKSBjb250aW51ZTtcclxuICAgICAgICAgICAgcXVlc3Rpb24gPSBxdWVzdGlvbnNbaV07XHJcbiAgICAgICAgICAgIHRoaXMuZG9TdXJ2ZXlWYWx1ZUNoYW5nZWQocXVlc3Rpb24sIG5ld1ZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlZC5maXJlKHRoaXMsIHsgJ25hbWUnOiBuYW1lLCAncXVlc3Rpb24nOiBxdWVzdGlvbiwgJ3ZhbHVlJzogbmV3VmFsdWUgfSk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIG5vdGlmeUFsbFF1ZXN0aW9uc09uVmFsdWVDaGFuZ2VkKCkge1xyXG4gICAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xyXG4gICAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5kb1N1cnZleVZhbHVlQ2hhbmdlZChxdWVzdGlvbnNbaV0sIHRoaXMuZ2V0VmFsdWUocXVlc3Rpb25zW2ldLm5hbWUpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgZG9TdXJ2ZXlWYWx1ZUNoYW5nZWQocXVlc3Rpb246IElRdWVzdGlvbiwgbmV3VmFsdWU6IGFueSkge1xyXG4gICAgICAgIHF1ZXN0aW9uLm9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgY2hlY2tPblBhZ2VUcmlnZ2VycygpIHtcclxuICAgICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRDdXJyZW50UGFnZVF1ZXN0aW9ucygpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBxdWVzdGlvbiA9IHF1ZXN0aW9uc1tpXTtcclxuICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZShxdWVzdGlvbi5uYW1lKTtcclxuICAgICAgICAgICAgdGhpcy5jaGVja1RyaWdnZXJzKHF1ZXN0aW9uLm5hbWUsIHZhbHVlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGdldEN1cnJlbnRQYWdlUXVlc3Rpb25zKCk6IEFycmF5PFF1ZXN0aW9uQmFzZT4ge1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcclxuICAgICAgICB2YXIgcGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XHJcbiAgICAgICAgaWYgKCFwYWdlKSByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFnZS5xdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIHF1ZXN0aW9uID0gcGFnZS5xdWVzdGlvbnNbaV07XHJcbiAgICAgICAgICAgIGlmICghcXVlc3Rpb24udmlzaWJsZSB8fCAhcXVlc3Rpb24ubmFtZSkgY29udGludWU7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHF1ZXN0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHByaXZhdGUgY2hlY2tUcmlnZ2VycyhuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnksIGlzT25OZXh0UGFnZTogYm9vbGVhbikge1xyXG4gICAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnRyaWdnZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciB0cmlnZ2VyID0gdGhpcy50cmlnZ2Vyc1tpXTtcclxuICAgICAgICAgICAgaWYgKHRyaWdnZXIubmFtZSA9PSBuYW1lICYmIHRyaWdnZXIuaXNPbk5leHRQYWdlID09IGlzT25OZXh0UGFnZSkge1xyXG4gICAgICAgICAgICAgICAgdHJpZ2dlci5jaGVjayhuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGRvUXVlc3Rpb25zT25Mb2FkKCkge1xyXG4gICAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucyhmYWxzZSk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcXVlc3Rpb25zW2ldLm9uU3VydmV5TG9hZCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgcnVuQ29uZGl0aW9ucygpIHtcclxuICAgICAgICB0aGlzLnJ1bkNvbmRpdGlvbnNGb3JMaXN0KHRoaXMuZ2V0QWxsUXVlc3Rpb25zKGZhbHNlKSk7XHJcbiAgICAgICAgdGhpcy5ydW5Db25kaXRpb25zRm9yTGlzdCh0aGlzLnBhZ2VzKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgcnVuQ29uZGl0aW9uc0Zvckxpc3QobGlzdDogQXJyYXk8SUNvbmRpdGlvblJ1bm5lcj4pIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGlzdFtpXS5ydW5Db25kaXRpb24odGhpcy52YWx1ZXNIYXNoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2VuZFJlc3VsdChwb3N0SWQ6IHN0cmluZyA9IG51bGwsIGNsaWVudElkOiBzdHJpbmcgPSBudWxsLCBpc1BhcnRpYWxDb21wbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGlzUGFydGlhbENvbXBsZXRlZCAmJiB0aGlzLm9uUGFydGlhbFNlbmQpIHtcclxuICAgICAgICAgICAgdGhpcy5vblBhcnRpYWxTZW5kLmZpcmUodGhpcywgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5zdXJ2ZXlQb3N0SWQgJiYgcG9zdElkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3VydmV5UG9zdElkID0gcG9zdElkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuc3VydmV5UG9zdElkKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGNsaWVudElkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzUGFydGlhbENvbXBsZXRlZCAmJiAhdGhpcy5jbGllbnRJZCkgcmV0dXJuO1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICBuZXcgZHhTdXJ2ZXlTZXJ2aWNlKCkuc2VuZFJlc3VsdCh0aGlzLnN1cnZleVBvc3RJZCwgdGhpcy5kYXRhLCBmdW5jdGlvbiAoc3VjY2VzczogYm9vbGVhbiwgcmVzcG9uc2U6IGFueSkge1xyXG4gICAgICAgICAgICBzZWxmLm9uU2VuZFJlc3VsdC5maXJlKHNlbGYsIHsgc3VjY2Vzczogc3VjY2VzcywgcmVzcG9uc2U6IHJlc3BvbnNlfSk7XHJcbiAgICAgICAgfSwgdGhpcy5jbGllbnRJZCwgaXNQYXJ0aWFsQ29tcGxldGVkKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXRSZXN1bHQocmVzdWx0SWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIG5ldyBkeFN1cnZleVNlcnZpY2UoKS5nZXRSZXN1bHQocmVzdWx0SWQsIG5hbWUsIGZ1bmN0aW9uIChzdWNjZXNzOiBib29sZWFuLCBkYXRhOiBhbnksIGRhdGFMaXN0OiBhbnlbXSwgcmVzcG9uc2U6IGFueSkge1xyXG4gICAgICAgICAgICBzZWxmLm9uR2V0UmVzdWx0LmZpcmUoc2VsZiwgeyBzdWNjZXNzOiBzdWNjZXNzLCBkYXRhOiBkYXRhLCBkYXRhTGlzdDogZGF0YUxpc3QsIHJlc3BvbnNlOiByZXNwb25zZSB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBsb2FkU3VydmV5RnJvbVNlcnZpY2Uoc3VydmV5SWQ6IHN0cmluZyA9IG51bGwpIHtcclxuICAgICAgICBpZiAoc3VydmV5SWQpIHtcclxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXlJZCA9IHN1cnZleUlkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMub25Mb2FkaW5nU3VydmV5RnJvbVNlcnZpY2UoKTtcclxuICAgICAgICBuZXcgZHhTdXJ2ZXlTZXJ2aWNlKCkubG9hZFN1cnZleSh0aGlzLnN1cnZleUlkLCBmdW5jdGlvbiAoc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIHJlc3BvbnNlOiBhbnkpIHtcclxuICAgICAgICAgICAgc2VsZi5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHN1Y2Nlc3MgJiYgcmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNldEpzb25PYmplY3QocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIHNlbGYubm90aWZ5QWxsUXVlc3Rpb25zT25WYWx1ZUNoYW5nZWQoKTtcclxuICAgICAgICAgICAgICAgIHNlbGYub25Mb2FkU3VydmV5RnJvbVNlcnZpY2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIG9uTG9hZGluZ1N1cnZleUZyb21TZXJ2aWNlKCkge1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIG9uTG9hZFN1cnZleUZyb21TZXJ2aWNlKCkge1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBjaGVja1BhZ2VWaXNpYmlsaXR5KHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9sZFF1ZXN0aW9uVmlzaWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBwYWdlID0gdGhpcy5nZXRQYWdlQnlRdWVzdGlvbihxdWVzdGlvbik7XHJcbiAgICAgICAgaWYgKCFwYWdlKSByZXR1cm47XHJcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gcGFnZS5pc1Zpc2libGU7XHJcbiAgICAgICAgaWYgKG5ld1ZhbHVlICE9IHBhZ2UuZ2V0SXNQYWdlVmlzaWJsZShxdWVzdGlvbikgfHwgb2xkUXVlc3Rpb25WaXNpYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGFnZVZpc2liaWxpdHlDaGFuZ2VkKHBhZ2UsIG5ld1ZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHVwZGF0ZVZpc2libGVJbmRleGVzKCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlUGFnZVZpc2libGVJbmRleGVzKHRoaXMuc2hvd1BhZ2VOdW1iZXJzKTtcclxuICAgICAgICBpZiAodGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzID09IFwib25QYWdlXCIpIHtcclxuICAgICAgICAgICAgdmFyIHZpc1BhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlzUGFnZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUXVlc3Rpb25WaXNpYmxlSW5kZXhlcyh2aXNQYWdlc1tpXS5xdWVzdGlvbnMsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVRdWVzdGlvblZpc2libGVJbmRleGVzKHRoaXMuZ2V0QWxsUXVlc3Rpb25zKGZhbHNlKSwgdGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzID09IFwib25cIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSB1cGRhdGVQYWdlVmlzaWJsZUluZGV4ZXMoc2hvd0luZGV4OiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIGluZGV4ID0gMDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5wYWdlc1tpXS52aXNpYmxlSW5kZXggPSB0aGlzLnBhZ2VzW2ldLnZpc2libGUgPyAoaW5kZXgrKykgOiAtMTtcclxuICAgICAgICAgICAgdGhpcy5wYWdlc1tpXS5udW0gPSBzaG93SW5kZXggJiYgdGhpcy5wYWdlc1tpXS52aXNpYmxlID8gdGhpcy5wYWdlc1tpXS52aXNpYmxlSW5kZXggKyAxIDogLTE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSB1cGRhdGVRdWVzdGlvblZpc2libGVJbmRleGVzKHF1ZXN0aW9uczogSVF1ZXN0aW9uW10sIHNob3dJbmRleDogYm9vbGVhbikge1xyXG4gICAgICAgIHZhciBpbmRleCA9IDA7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcXVlc3Rpb25zW2ldLnNldFZpc2libGVJbmRleChzaG93SW5kZXggJiYgcXVlc3Rpb25zW2ldLnZpc2libGUgJiYgcXVlc3Rpb25zW2ldLmhhc1RpdGxlID8gKGluZGV4KyspIDogLTEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgc2V0SnNvbk9iamVjdChqc29uT2JqOiBhbnkpIHtcclxuICAgICAgICBpZiAoIWpzb25PYmopIHJldHVybjtcclxuICAgICAgICB0aGlzLmpzb25FcnJvcnMgPSBudWxsO1xyXG4gICAgICAgIHZhciBqc29uQ29udmVydGVyID0gbmV3IEpzb25PYmplY3QoKTtcclxuICAgICAgICBqc29uQ29udmVydGVyLnRvT2JqZWN0KGpzb25PYmosIHRoaXMpO1xyXG4gICAgICAgIGlmIChqc29uQ29udmVydGVyLmVycm9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuanNvbkVycm9ycyA9IGpzb25Db252ZXJ0ZXIuZXJyb3JzO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnVwZGF0ZVByb2Nlc3NlZFRleHRWYWx1ZXMoKTtcclxuICAgICAgICBpZiAodGhpcy5oYXNDb29raWUpIHtcclxuICAgICAgICAgICAgdGhpcy5kb0NvbXBsZXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZG9RdWVzdGlvbnNPbkxvYWQoKTtcclxuICAgICAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgb25CZWZvcmVDcmVhdGluZygpIHsgfVxyXG4gICAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7IH1cclxuICAgIHByaXZhdGUgdXBkYXRlUHJvY2Vzc2VkVGV4dFZhbHVlcygpIHtcclxuICAgICAgICB0aGlzLnByb2Nlc3NlZFRleHRWYWx1ZXMgPSB7fTtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzZWRUZXh0VmFsdWVzW1wicGFnZW5vXCJdID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIHNlbGYuY3VycmVudFBhZ2UgIT0gbnVsbCA/IHNlbGYudmlzaWJsZVBhZ2VzLmluZGV4T2Yoc2VsZi5jdXJyZW50UGFnZSkgKyAxIDogMDsgfVxyXG4gICAgICAgIHRoaXMucHJvY2Vzc2VkVGV4dFZhbHVlc1tcInBhZ2Vjb3VudFwiXSA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBzZWxmLnZpc2libGVQYWdlQ291bnQ7IH1cclxuICAgICAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFF1ZXN0aW9uVG9Qcm9jZXNzZWRUZXh0VmFsdWVzKHF1ZXN0aW9uc1tpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBhZGRRdWVzdGlvblRvUHJvY2Vzc2VkVGV4dFZhbHVlcyhxdWVzdGlvbjogSVF1ZXN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzZWRUZXh0VmFsdWVzW3F1ZXN0aW9uLm5hbWUudG9Mb3dlckNhc2UoKV0gPSBcInF1ZXN0aW9uXCI7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGhhc1Byb2Nlc3NlZFRleHRWYWx1ZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICB2YXIgZmlyc3ROYW1lID0gbmV3IFByb2Nlc3NWYWx1ZSgpLmdldEZpcnN0TmFtZShuYW1lKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzZWRUZXh0VmFsdWVzW2ZpcnN0TmFtZS50b0xvd2VyQ2FzZSgpXTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XHJcbiAgICAgICAgdmFyIGZpcnN0TmFtZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRGaXJzdE5hbWUobmFtZSk7XHJcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMucHJvY2Vzc2VkVGV4dFZhbHVlc1tmaXJzdE5hbWUudG9Mb3dlckNhc2UoKV07XHJcbiAgICAgICAgaWYgKCF2YWwpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGlmICh2YWwgPT0gXCJ2YXJpYWJsZVwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFZhcmlhYmxlKG5hbWUudG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWwgPT0gXCJxdWVzdGlvblwiKSB7XHJcbiAgICAgICAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeU5hbWUoZmlyc3ROYW1lLCB0cnVlKTtcclxuICAgICAgICAgICAgaWYgKCFxdWVzdGlvbikgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIG5hbWUgPSBxdWVzdGlvbi5uYW1lICsgbmFtZS5zdWJzdHIoZmlyc3ROYW1lLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvY2Vzc1ZhbHVlKCkuZ2V0VmFsdWUobmFtZSwgdGhpcy52YWx1ZXNIYXNoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbCA9PSBcInZhbHVlXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRWYWx1ZShuYW1lLCB0aGlzLnZhbHVlc0hhc2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsKG5hbWUpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBjbGVhckludmlzaWJsZVF1ZXN0aW9uVmFsdWVzKCkge1xyXG4gICAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xyXG4gICAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHF1ZXN0aW9uc1tpXS52aXNpYmxlKSBjb250aW51ZTtcclxuICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShxdWVzdGlvbnNbaV0ubmFtZSwgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFZhcmlhYmxlKG5hbWU6IHN0cmluZyk6IGFueSB7XHJcbiAgICAgICAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gdGhpcy52YXJpYWJsZXNIYXNoW25hbWVdO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldFZhcmlhYmxlKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICghbmFtZSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMudmFyaWFibGVzSGFzaFtuYW1lXSA9IG5ld1ZhbHVlO1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc2VkVGV4dFZhbHVlc1tuYW1lLnRvTG93ZXJDYXNlKCldID0gXCJ2YXJpYWJsZVwiO1xyXG4gICAgfVxyXG4gICAgLy9JU3VydmV5IGRhdGFcclxuICAgIHByaXZhdGUgZ2V0VW5iaW5kVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XHJcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KSB7XHJcbiAgICAgICAgICAgIC8vZG8gbm90IHJldHVybiB0aGUgc2FtZSBvYmplY3QgaW5zdGFuY2UhISFcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG4gICAgZ2V0VmFsdWUobmFtZTogc3RyaW5nKTogYW55IHtcclxuICAgICAgICBpZiAoIW5hbWUgfHwgbmFtZS5sZW5ndGggPT0gMCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZXNIYXNoW25hbWVdO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFVuYmluZFZhbHVlKHZhbHVlKTtcclxuICAgIH1cclxuICAgIHNldFZhbHVlKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzVmFsdWVFcXVhbChuYW1lLCBuZXdWYWx1ZSkpIHJldHVybjtcclxuICAgICAgICBpZiAobmV3VmFsdWUgPT0gXCJcIiB8fCBuZXdWYWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlc0hhc2hbbmFtZV07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbmV3VmFsdWUgPSB0aGlzLmdldFVuYmluZFZhbHVlKG5ld1ZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZXNIYXNoW25hbWVdID0gbmV3VmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc2VkVGV4dFZhbHVlc1tuYW1lLnRvTG93ZXJDYXNlKCldID0gXCJ2YWx1ZVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm5vdGlmeVF1ZXN0aW9uT25WYWx1ZUNoYW5nZWQobmFtZSwgbmV3VmFsdWUpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tUcmlnZ2VycyhuYW1lLCBuZXdWYWx1ZSwgZmFsc2UpO1xyXG4gICAgICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xyXG4gICAgICAgIHRoaXMudHJ5R29OZXh0UGFnZUF1dG9tYXRpYyhuYW1lKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgaXNWYWx1ZUVxdWFsKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmIChuZXdWYWx1ZSA9PSBcIlwiKSBuZXdWYWx1ZSA9IG51bGw7XHJcbiAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy5nZXRWYWx1ZShuYW1lKTtcclxuICAgICAgICBpZiAobmV3VmFsdWUgPT09IG51bGwgfHwgb2xkVmFsdWUgPT09IG51bGwpIHJldHVybiBuZXdWYWx1ZSA9PT0gb2xkVmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNUd29WYWx1ZUVxdWFscyhuZXdWYWx1ZSwgb2xkVmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBpc1R3b1ZhbHVlRXF1YWxzKHg6IGFueSwgeTogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHggPT09IHkpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICghKHggaW5zdGFuY2VvZiBPYmplY3QpIHx8ICEoeSBpbnN0YW5jZW9mIE9iamVjdCkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIHgpIHtcclxuICAgICAgICAgICAgaWYgKCF4Lmhhc093blByb3BlcnR5KHApKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKCF5Lmhhc093blByb3BlcnR5KHApKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICh4W3BdID09PSB5W3BdKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoeFtwXSkgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVHdvVmFsdWVFcXVhbHMoeFtwXSwgeVtwXSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChwIGluIHkpIHtcclxuICAgICAgICAgICAgaWYgKHkuaGFzT3duUHJvcGVydHkocCkgJiYgIXguaGFzT3duUHJvcGVydHkocCkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHRyeUdvTmV4dFBhZ2VBdXRvbWF0aWMobmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmdvTmV4dFBhZ2VBdXRvbWF0aWMgfHwgIXRoaXMuY3VycmVudFBhZ2UpIHJldHVybjtcclxuICAgICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWUpO1xyXG4gICAgICAgIGlmIChxdWVzdGlvbiAmJiAhcXVlc3Rpb24uc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSkgcmV0dXJuO1xyXG4gICAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEN1cnJlbnRQYWdlUXVlc3Rpb25zKCk7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmdldFZhbHVlKHF1ZXN0aW9uc1tpXS5uYW1lKSkgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuY3VycmVudFBhZ2UuaGFzRXJyb3JzKHRydWUsIGZhbHNlKSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNMYXN0UGFnZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0UGFnZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kb0NvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXRDb21tZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuZGF0YVtuYW1lICsgdGhpcy5jb21tZW50UHJlZml4XTtcclxuICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IFwiXCI7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgbmFtZSA9IG5hbWUgKyB0aGlzLmNvbW1lbnRQcmVmaXg7XHJcbiAgICAgICAgaWYgKG5ld1ZhbHVlID09IFwiXCIgfHwgbmV3VmFsdWUgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZXNIYXNoW25hbWVdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVzSGFzaFtuYW1lXSA9IG5ld1ZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLnRyeUdvTmV4dFBhZ2VBdXRvbWF0aWMobmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcXVlc3Rpb25WaXNpYmlsaXR5Q2hhbmdlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCBuZXdWYWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcclxuICAgICAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZWQuZmlyZSh0aGlzLCB7ICdxdWVzdGlvbic6IHF1ZXN0aW9uLCAnbmFtZSc6IHF1ZXN0aW9uLm5hbWUsICd2aXNpYmxlJzogbmV3VmFsdWUgfSk7XHJcbiAgICAgICAgdGhpcy5jaGVja1BhZ2VWaXNpYmlsaXR5KHF1ZXN0aW9uLCAhbmV3VmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcGFnZVZpc2liaWxpdHlDaGFuZ2VkKHBhZ2U6IElQYWdlLCBuZXdWYWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcclxuICAgICAgICB0aGlzLm9uUGFnZVZpc2libGVDaGFuZ2VkLmZpcmUodGhpcywgeyAncGFnZSc6IHBhZ2UsICd2aXNpYmxlJzogbmV3VmFsdWUgfSk7XHJcbiAgICB9XHJcbiAgICBxdWVzdGlvbkFkZGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XHJcbiAgICAgICAgdGhpcy5hZGRRdWVzdGlvblRvUHJvY2Vzc2VkVGV4dFZhbHVlcyhxdWVzdGlvbik7XHJcbiAgICAgICAgdGhpcy5vblF1ZXN0aW9uQWRkZWQuZmlyZSh0aGlzLCB7ICdxdWVzdGlvbic6IHF1ZXN0aW9uLCAnbmFtZSc6IHF1ZXN0aW9uLm5hbWUsICdpbmRleCc6IGluZGV4IH0pO1xyXG4gICAgfVxyXG4gICAgcXVlc3Rpb25SZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XHJcbiAgICAgICAgdGhpcy5vblF1ZXN0aW9uUmVtb3ZlZC5maXJlKHRoaXMsIHsgJ3F1ZXN0aW9uJzogcXVlc3Rpb24sICduYW1lJzogcXVlc3Rpb24ubmFtZSB9KTtcclxuICAgIH1cclxuICAgIHZhbGlkYXRlUXVlc3Rpb24obmFtZTogc3RyaW5nKTogU3VydmV5RXJyb3Ige1xyXG4gICAgICAgIGlmICh0aGlzLm9uVmFsaWRhdGVRdWVzdGlvbi5pc0VtcHR5KSByZXR1cm4gbnVsbDtcclxuICAgICAgICB2YXIgb3B0aW9ucyA9IHsgbmFtZTogbmFtZSwgdmFsdWU6IHRoaXMuZ2V0VmFsdWUobmFtZSksIGVycm9yOiBudWxsIH07XHJcbiAgICAgICAgdGhpcy5vblZhbGlkYXRlUXVlc3Rpb24uZmlyZSh0aGlzLCBvcHRpb25zKTtcclxuICAgICAgICByZXR1cm4gb3B0aW9ucy5lcnJvciA/IG5ldyBDdXN0b21FcnJvcihvcHRpb25zLmVycm9yKSA6IG51bGw7XHJcbiAgICB9XHJcbiAgICBwcm9jZXNzSHRtbChodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciBvcHRpb25zID0geyBodG1sOiBodG1sIH07XHJcbiAgICAgICAgdGhpcy5vblByb2Nlc3NIdG1sLmZpcmUodGhpcywgb3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1RleHQob3B0aW9ucy5odG1sKTtcclxuICAgIH1cclxuICAgIHByb2Nlc3NUZXh0KHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dFByZVByb2Nlc3Nvci5wcm9jZXNzKHRleHQpO1xyXG4gICAgfVxyXG4gICAgLy9JU3VydmV5VHJpZ2dlck93bmVyXHJcbiAgICBnZXRPYmplY3RzKHBhZ2VzOiBzdHJpbmdbXSwgcXVlc3Rpb25zOiBzdHJpbmdbXSk6IGFueVtde1xyXG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcclxuICAgICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShyZXN1bHQsIHRoaXMuZ2V0UGFnZXNCeU5hbWVzKHBhZ2VzKSk7XHJcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkocmVzdWx0LCB0aGlzLmdldFF1ZXN0aW9uc0J5TmFtZXMocXVlc3Rpb25zKSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuICAgIHNldFRyaWdnZXJWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGlzVmFyaWFibGU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoIW5hbWUpIHJldHVybjtcclxuICAgICAgICBpZiAoaXNWYXJpYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldFZhcmlhYmxlKG5hbWUsIHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKG5hbWUsIHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJzdXJ2ZXlcIiwgW3sgbmFtZTogXCJsb2NhbGVcIiwgY2hvaWNlczogKCkgPT4geyByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldExvY2FsZXMoKSB9IH0sXHJcbiAgICBcInRpdGxlXCIsIFwiY29tcGxldGVkSHRtbDpodG1sXCIsIHsgbmFtZTogXCJwYWdlc1wiLCBjbGFzc05hbWU6IFwicGFnZVwiIH0sXHJcbiAgICB7IG5hbWU6IFwicXVlc3Rpb25zXCIsIGJhc2VDbGFzc05hbWU6IFwicXVlc3Rpb25cIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gbnVsbDsgfSwgb25TZXRWYWx1ZTogZnVuY3Rpb24gKG9iaiwgdmFsdWUsIGpzb25Db252ZXJ0ZXIpIHsgdmFyIHBhZ2UgPSBvYmouYWRkTmV3UGFnZShcIlwiKTsganNvbkNvbnZlcnRlci50b09iamVjdCh7IHF1ZXN0aW9uczogdmFsdWUgfSwgcGFnZSk7IH0gfSxcclxuICAgIHsgbmFtZTogXCJ0cmlnZ2Vyczp0cmlnZ2Vyc1wiLCBiYXNlQ2xhc3NOYW1lOiBcInN1cnZleXRyaWdnZXJcIiwgY2xhc3NOYW1lUGFydDogXCJ0cmlnZ2VyXCIgfSxcclxuICAgIFwic3VydmV5SWRcIiwgXCJzdXJ2ZXlQb3N0SWRcIiwgXCJjb29raWVOYW1lXCIsIFwic2VuZFJlc3VsdE9uUGFnZU5leHQ6Ym9vbGVhblwiLFxyXG4gICAgeyBuYW1lOiBcInNob3dOYXZpZ2F0aW9uQnV0dG9uczpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSwgeyBuYW1lOiBcInNob3dUaXRsZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSwgeyBuYW1lOiBcInNob3dQYWdlVGl0bGVzOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxyXG4gICAgXCJzaG93UGFnZU51bWJlcnM6Ym9vbGVhblwiLCB7IG5hbWU6IFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLCBkZWZhdWx0OiBcIm9uXCIsIGNob2ljZXM6IFtcIm9uXCIsIFwib25QYWdlXCIsIFwib2ZmXCJdIH0sXHJcbiAgICB7IG5hbWU6IFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsIGRlZmF1bHQ6IFwidG9wXCIsIGNob2ljZXM6IFtcInRvcFwiLCBcImJvdHRvbVwiXSB9LFxyXG4gICAgeyBuYW1lOiBcInNob3dQcm9ncmVzc0JhclwiLCBkZWZhdWx0OiBcIm9mZlwiLCBjaG9pY2VzOiBbXCJvZmZcIiwgXCJ0b3BcIiwgXCJib3R0b21cIl0gfSxcclxuICAgIHsgbmFtZTogXCJtb2RlXCIsIGRlZmF1bHQ6IFwiZWRpdFwiLCBjaG9pY2VzOiBbXCJlZGl0XCIsIFwiZGlzcGxheVwiXSB9LFxyXG4gICAgeyBuYW1lOiBcInN0b3JlT3RoZXJzQXNDb21tZW50OmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LCBcImdvTmV4dFBhZ2VBdXRvbWF0aWM6Ym9vbGVhblwiLCBcImNsZWFySW52aXNpYmxlVmFsdWVzOmJvb2xlYW5cIixcclxuICAgIHsgbmFtZTogXCJwYWdlUHJldlRleHRcIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55KSB7IHJldHVybiBvYmoucGFnZVByZXZUZXh0VmFsdWU7IH0gfSxcclxuICAgIHsgbmFtZTogXCJwYWdlTmV4dFRleHRcIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55KSB7IHJldHVybiBvYmoucGFnZU5leHRUZXh0VmFsdWU7IH0gfSxcclxuICAgIHsgbmFtZTogXCJjb21wbGV0ZVRleHRcIiwgb25HZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55KSB7IHJldHVybiBvYmouY29tcGxldGVUZXh0VmFsdWU7IH0gfSxcclxuICAgIHsgbmFtZTogXCJyZXF1aXJlZFRleHRcIiwgZGVmYXVsdDogXCIqXCIgfSwgXCJxdWVzdGlvblN0YXJ0SW5kZXhcIiwgXCJxdWVzdGlvblRpdGxlVGVtcGxhdGVcIl0pO1xuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3N1cnZleS50c1xuICoqLyIsImV4cG9ydCBjbGFzcyBkeFN1cnZleVNlcnZpY2Uge1xyXG4gICAgcHVibGljIHN0YXRpYyBzZXJ2aWNlVXJsOiBzdHJpbmcgPSBcImh0dHBzOi8vZHhzdXJ2ZXlhcGkuYXp1cmV3ZWJzaXRlcy5uZXQvYXBpL1N1cnZleVwiO1xyXG4gICAgLy9wdWJsaWMgc3RhdGljIHNlcnZpY2VVcmw6IHN0cmluZyA9IFwiaHR0cDovL2xvY2FsaG9zdDo1MDQ4OC9hcGkvU3VydmV5XCI7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIH1cclxuICAgIHB1YmxpYyBsb2FkU3VydmV5KHN1cnZleUlkOiBzdHJpbmcsIG9uTG9hZDogKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3VsdDogc3RyaW5nLCByZXNwb25zZTogYW55KSA9PiB2b2lkKSB7XHJcbiAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgIHhoci5vcGVuKCdHRVQnLCBkeFN1cnZleVNlcnZpY2Uuc2VydmljZVVybCArICcvZ2V0U3VydmV5P3N1cnZleUlkPScgKyBzdXJ2ZXlJZCk7XHJcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcclxuICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xyXG4gICAgICAgICAgICBvbkxvYWQoeGhyLnN0YXR1cyA9PSAyMDAsIHJlc3VsdCwgeGhyLnJlc3BvbnNlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHhoci5zZW5kKCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2VuZFJlc3VsdChwb3N0SWQ6IHN0cmluZywgcmVzdWx0OiBKU09OLCBvblNlbmRSZXN1bHQ6IChzdWNjZXNzOiBib29sZWFuLCByZXNwb25zZTogYW55KT0+IHZvaWQsIGNsaWVudElkOiBzdHJpbmcgPSBudWxsLCBpc1BhcnRpYWxDb21wbGV0ZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICB4aHIub3BlbignUE9TVCcsIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgJy9wb3N0LycpO1xyXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCcpO1xyXG4gICAgICAgIHZhciBkYXRhID0geyBwb3N0SWQ6IHBvc3RJZCwgc3VydmV5UmVzdWx0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQpIH07XHJcbiAgICAgICAgaWYgKGNsaWVudElkKSBkYXRhWydjbGllbnRJZCddID0gY2xpZW50SWQ7XHJcbiAgICAgICAgaWYgKGlzUGFydGlhbENvbXBsZXRlZCkgZGF0YVsnaXNQYXJ0aWFsQ29tcGxldGVkJ10gPSB0cnVlO1xyXG4gICAgICAgIHZhciBkYXRhU3RyaW5naWZ5OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgeGhyLm9ubG9hZCA9IHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoIW9uU2VuZFJlc3VsdCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBvblNlbmRSZXN1bHQoeGhyLnN0YXR1cyA9PSAyMDAsIHhoci5yZXNwb25zZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB4aHIuc2VuZChkYXRhU3RyaW5naWZ5KTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZW5kRmlsZShwb3N0SWQ6IHN0cmluZywgZmlsZTogRmlsZSwgb25TZW5kRmlsZTogKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3BvbnNlOiBhbnkpID0+IHZvaWQpIHtcclxuICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgeGhyLm9ubG9hZCA9IHhoci5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoIW9uU2VuZEZpbGUpIHJldHVybjtcclxuICAgICAgICAgICAgb25TZW5kRmlsZSh4aHIuc3RhdHVzID09IDIwMCwgSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHhoci5vcGVuKFwiUE9TVFwiLCBkeFN1cnZleVNlcnZpY2Uuc2VydmljZVVybCArICcvdXBsb2FkLycsIHRydWUpO1xyXG4gICAgICAgIHZhciBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChcImZpbGVcIiwgZmlsZSk7XHJcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKFwicG9zdElkXCIsIHBvc3RJZCk7XHJcbiAgICAgICAgeGhyLnNlbmQoZm9ybURhdGEpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFJlc3VsdChyZXN1bHRJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIG9uR2V0UmVzdWx0OiAoc3VjY2VzczogYm9vbGVhbiwgZGF0YTogYW55LCBkYXRhTGlzdDogQXJyYXk8YW55PiwgcmVzcG9uc2U6IGFueSkgPT4gdm9pZCkge1xyXG4gICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICB2YXIgZGF0YSA9ICdyZXN1bHRJZD0nICsgcmVzdWx0SWQgKyAnJm5hbWU9JyArIG5hbWU7XHJcbiAgICAgICAgeGhyLm9wZW4oJ0dFVCcsIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgJy9nZXRSZXN1bHQ/JyArIGRhdGEpO1xyXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBudWxsO1xyXG4gICAgICAgICAgICB2YXIgbGlzdCA9IG51bGw7XHJcbiAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgbGlzdCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdC5RdWVzdGlvblJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbCA9IHsgbmFtZToga2V5LCB2YWx1ZTogcmVzdWx0LlF1ZXN0aW9uUmVzdWx0W2tleV0gfTtcclxuICAgICAgICAgICAgICAgICAgICBsaXN0LnB1c2goZWwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9uR2V0UmVzdWx0KHhoci5zdGF0dXMgPT0gMjAwLCByZXN1bHQsIGxpc3QsIHhoci5yZXNwb25zZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB4aHIuc2VuZCgpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGlzQ29tcGxldGVkKHJlc3VsdElkOiBzdHJpbmcsIGNsaWVudElkOiBzdHJpbmcsIG9uSXNDb21wbGV0ZWQ6IChzdWNjZXNzOiBib29sZWFuLCByZXN1bHQ6IHN0cmluZywgcmVzcG9uc2U6IGFueSkgPT4gdm9pZCkge1xyXG4gICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICB2YXIgZGF0YSA9ICdyZXN1bHRJZD0nICsgcmVzdWx0SWQgKyAnJmNsaWVudElkPScgKyBjbGllbnRJZDtcclxuICAgICAgICB4aHIub3BlbignR0VUJywgZHhTdXJ2ZXlTZXJ2aWNlLnNlcnZpY2VVcmwgKyAnL2lzQ29tcGxldGVkPycgKyBkYXRhKTtcclxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb25Jc0NvbXBsZXRlZCh4aHIuc3RhdHVzID09IDIwMCwgcmVzdWx0LCB4aHIucmVzcG9uc2UpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgeGhyLnNlbmQoKTtcclxuICAgIH1cclxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2R4U3VydmV5U2VydmljZS50c1xuICoqLyIsImltcG9ydCB7QmFzZSwgSGFzaFRhYmxlfSBmcm9tIFwiLi9iYXNlXCI7XHJcbmltcG9ydCB7SnNvbk9iamVjdH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRyaWdnZXIgZXh0ZW5kcyBCYXNlIHtcclxuICAgIHN0YXRpYyBvcGVyYXRvcnNWYWx1ZTogSGFzaFRhYmxlPEZ1bmN0aW9uPiA9IG51bGw7XHJcbiAgICBzdGF0aWMgZ2V0IG9wZXJhdG9ycygpIHtcclxuICAgICAgICBpZiAoVHJpZ2dlci5vcGVyYXRvcnNWYWx1ZSAhPSBudWxsKSByZXR1cm4gVHJpZ2dlci5vcGVyYXRvcnNWYWx1ZTtcclxuICAgICAgICBUcmlnZ2VyLm9wZXJhdG9yc1ZhbHVlID0ge1xyXG4gICAgICAgICAgICBlbXB0eTogZnVuY3Rpb24gKHZhbHVlLCBleHBlY3RlZFZhbHVlKSB7IHJldHVybiAhdmFsdWU7IH0sXHJcbiAgICAgICAgICAgIG5vdGVtcHR5OiBmdW5jdGlvbiAodmFsdWUsIGV4cGVjdGVkVmFsdWUpIHsgcmV0dXJuICEoIXZhbHVlKTsgfSxcclxuICAgICAgICAgICAgZXF1YWw6IGZ1bmN0aW9uICh2YWx1ZSwgZXhwZWN0ZWRWYWx1ZSkgeyByZXR1cm4gdmFsdWUgPT0gZXhwZWN0ZWRWYWx1ZTsgfSxcclxuICAgICAgICAgICAgbm90ZXF1YWw6IGZ1bmN0aW9uICh2YWx1ZSwgZXhwZWN0ZWRWYWx1ZSkgeyByZXR1cm4gdmFsdWUgIT0gZXhwZWN0ZWRWYWx1ZTsgfSxcclxuICAgICAgICAgICAgY29udGFpbnM6IGZ1bmN0aW9uICh2YWx1ZSwgZXhwZWN0ZWRWYWx1ZSkgeyByZXR1cm4gdmFsdWUgJiYgdmFsdWVbXCJpbmRleE9mXCJdICYmIHZhbHVlLmluZGV4T2YoZXhwZWN0ZWRWYWx1ZSkgPiAtMTsgfSxcclxuICAgICAgICAgICAgbm90Y29udGFpbnM6IGZ1bmN0aW9uICh2YWx1ZSwgZXhwZWN0ZWRWYWx1ZSkgeyByZXR1cm4gIXZhbHVlIHx8ICF2YWx1ZVtcImluZGV4T2ZcIl0gfHwgdmFsdWUuaW5kZXhPZihleHBlY3RlZFZhbHVlKSA9PSAtMTsgfSxcclxuICAgICAgICAgICAgZ3JlYXRlcjogZnVuY3Rpb24gKHZhbHVlLCBleHBlY3RlZFZhbHVlKSB7IHJldHVybiB2YWx1ZSA+IGV4cGVjdGVkVmFsdWU7IH0sXHJcbiAgICAgICAgICAgIGxlc3M6IGZ1bmN0aW9uICh2YWx1ZSwgZXhwZWN0ZWRWYWx1ZSkgeyByZXR1cm4gdmFsdWUgPCBleHBlY3RlZFZhbHVlOyB9LFxyXG4gICAgICAgICAgICBncmVhdGVyb3JlcXVhbDogZnVuY3Rpb24gKHZhbHVlLCBleHBlY3RlZFZhbHVlKSB7IHJldHVybiB2YWx1ZSA+PSBleHBlY3RlZFZhbHVlOyB9LFxyXG4gICAgICAgICAgICBsZXNzb3JlcXVhbDogZnVuY3Rpb24gKHZhbHVlLCBleHBlY3RlZFZhbHVlKSB7IHJldHVybiB2YWx1ZSA8PSBleHBlY3RlZFZhbHVlOyB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gVHJpZ2dlci5vcGVyYXRvcnNWYWx1ZTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgb3BWYWx1ZTogc3RyaW5nID0gXCJlcXVhbFwiO1xyXG4gICAgcHVibGljIHZhbHVlOiBhbnk7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBvcGVyYXRvcigpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5vcFZhbHVlOyB9XHJcbiAgICBwdWJsaWMgc2V0IG9wZXJhdG9yKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm47XHJcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmICghVHJpZ2dlci5vcGVyYXRvcnNbdmFsdWVdKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5vcFZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgY2hlY2sodmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmIChUcmlnZ2VyLm9wZXJhdG9yc1t0aGlzLm9wZXJhdG9yXSh2YWx1ZSwgdGhpcy52YWx1ZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5vblN1Y2Nlc3MoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm9uRmFpbHVyZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBvblN1Y2Nlc3MoKSB7IH1cclxuICAgIHByb3RlY3RlZCBvbkZhaWx1cmUoKSB7IH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5VHJpZ2dlck93bmVyIHtcclxuICAgIGdldE9iamVjdHMocGFnZXM6IHN0cmluZ1tdLCBxdWVzdGlvbnM6IHN0cmluZ1tdKTogYW55W107XHJcbiAgICBkb0NvbXBsZXRlKCk7XHJcbiAgICBzZXRUcmlnZ2VyVmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBpc1ZhcmlhYmxlOiBib29sZWFuKTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFN1cnZleVRyaWdnZXIgZXh0ZW5kcyBUcmlnZ2VyIHtcclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcbiAgICBwcm90ZWN0ZWQgb3duZXI6IElTdXJ2ZXlUcmlnZ2VyT3duZXIgPSBudWxsO1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXRPd25lcihvd25lcjogSVN1cnZleVRyaWdnZXJPd25lcikge1xyXG4gICAgICAgIHRoaXMub3duZXIgPSBvd25lcjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXQgaXNPbk5leHRQYWdlKCkgeyByZXR1cm4gZmFsc2U7IH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFN1cnZleVRyaWdnZXJWaXNpYmxlIGV4dGVuZHMgU3VydmV5VHJpZ2dlciB7XHJcbiAgICBwdWJsaWMgcGFnZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBwdWJsaWMgcXVlc3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7IHJldHVybiBcInZpc2libGV0cmlnZ2VyXCI7IH1cclxuICAgIHByb3RlY3RlZCBvblN1Y2Nlc3MoKSB7IHRoaXMub25UcmlnZ2VyKHRoaXMub25JdGVtU3VjY2Vzcyk7IH1cclxuICAgIHByb3RlY3RlZCBvbkZhaWx1cmUoKSB7IHRoaXMub25UcmlnZ2VyKHRoaXMub25JdGVtRmFpbHVyZSk7IH1cclxuICAgIHByaXZhdGUgb25UcmlnZ2VyKGZ1bmM6IEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm93bmVyKSByZXR1cm47XHJcbiAgICAgICAgdmFyIG9iamVjdHMgPSB0aGlzLm93bmVyLmdldE9iamVjdHModGhpcy5wYWdlcywgdGhpcy5xdWVzdGlvbnMpO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBmdW5jKG9iamVjdHNbaV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBvbkl0ZW1TdWNjZXNzKGl0ZW06IGFueSkgeyBpdGVtLnZpc2libGUgPSB0cnVlOyB9XHJcbiAgICBwcm90ZWN0ZWQgb25JdGVtRmFpbHVyZShpdGVtOiBhbnkpIHsgaXRlbS52aXNpYmxlID0gZmFsc2U7IH1cclxufVxyXG5leHBvcnQgY2xhc3MgU3VydmV5VHJpZ2dlckNvbXBsZXRlIGV4dGVuZHMgU3VydmV5VHJpZ2dlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIFwiY29tcGxldGV0cmlnZ2VyXCI7IH1cclxuICAgIHB1YmxpYyBnZXQgaXNPbk5leHRQYWdlKCkgeyByZXR1cm4gdHJ1ZTsgfVxyXG4gICAgcHJvdGVjdGVkIG9uU3VjY2VzcygpIHsgaWYgKHRoaXMub3duZXIpIHRoaXMub3duZXIuZG9Db21wbGV0ZSgpOyB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFN1cnZleVRyaWdnZXJTZXRWYWx1ZSBleHRlbmRzIFN1cnZleVRyaWdnZXIge1xyXG4gICAgcHVibGljIHNldFRvTmFtZTogc3RyaW5nO1xyXG4gICAgcHVibGljIHNldFZhbHVlOiBhbnk7XHJcbiAgICBwdWJsaWMgaXNWYXJpYWJsZTogYm9vbGVhbjtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcgeyByZXR1cm4gXCJzZXR2YWx1ZXRyaWdnZXJcIjsgfVxyXG4gICAgcHJvdGVjdGVkIG9uU3VjY2VzcygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2V0VG9OYW1lIHx8ICF0aGlzLm93bmVyKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5vd25lci5zZXRUcmlnZ2VyVmFsdWUodGhpcy5zZXRUb05hbWUsIHRoaXMuc2V0VmFsdWUsIHRoaXMuaXNWYXJpYWJsZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJ0cmlnZ2VyXCIsIFtcIm9wZXJhdG9yXCIsIFwiIXZhbHVlXCJdKTtcclxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcInN1cnZleXRyaWdnZXJcIiwgW1wiIW5hbWVcIl0sIG51bGwsIFwidHJpZ2dlclwiKTtcclxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcInZpc2libGV0cmlnZ2VyXCIsIFtcInBhZ2VzXCIsIFwicXVlc3Rpb25zXCJdLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgU3VydmV5VHJpZ2dlclZpc2libGUoKTsgfSwgXCJzdXJ2ZXl0cmlnZ2VyXCIpO1xyXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwiY29tcGxldGV0cmlnZ2VyXCIsIFtdLCBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgU3VydmV5VHJpZ2dlckNvbXBsZXRlKCk7IH0sIFwic3VydmV5dHJpZ2dlclwiKTtcclxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcInNldHZhbHVldHJpZ2dlclwiLCBbXCIhc2V0VG9OYW1lXCIsIFwic2V0VmFsdWVcIiwgXCJpc1ZhcmlhYmxlOmJvb2xlYW5cIl0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBTdXJ2ZXlUcmlnZ2VyU2V0VmFsdWUoKTsgfSwgXCJzdXJ2ZXl0cmlnZ2VyXCIpO1xuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3RyaWdnZXIudHNcbiAqKi8iLCJpbXBvcnQge0Jhc2V9IGZyb20gXCIuL2Jhc2VcIjtcclxuaW1wb3J0IHtTdXJ2ZXlNb2RlbH0gZnJvbSBcIi4vc3VydmV5XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU3VydmV5V2luZG93TW9kZWwgZXh0ZW5kcyBCYXNlICB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHN1cnZleUVsZW1lbnROYW1lID0gXCJ3aW5kb3dTdXJ2ZXlKU1wiO1xyXG4gICAgc3VydmV5VmFsdWU6IFN1cnZleU1vZGVsO1xyXG4gICAgd2luZG93RWxlbWVudDogSFRNTERpdkVsZW1lbnQ7XHJcbiAgICBpc1Nob3dpbmdWYWx1ZTogYm9vbGVhbjtcclxuICAgIGlzRXhwYW5kZWRWYWx1ZTogYm9vbGVhbjtcclxuICAgIHRpdGxlVmFsdWU6IHN0cmluZztcclxuICAgIHRlbXBsYXRlVmFsdWU6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihqc29uT2JqOiBhbnkpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuc3VydmV5VmFsdWUgPSB0aGlzLmNyZWF0ZVN1cnZleShqc29uT2JqKTtcclxuICAgICAgICB0aGlzLnN1cnZleVZhbHVlLnNob3dUaXRsZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMud2luZG93RWxlbWVudCA9IDxIVE1MRGl2RWxlbWVudD5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldFR5cGUoKSA6IHN0cmluZyB7IHJldHVybiBcIndpbmRvd1wiIH1cclxuICAgIHB1YmxpYyBnZXQgc3VydmV5KCk6IFN1cnZleU1vZGVsIHsgcmV0dXJuIHRoaXMuc3VydmV5VmFsdWU7IH1cclxuICAgIHB1YmxpYyBnZXQgaXNTaG93aW5nKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5pc1Nob3dpbmdWYWx1ZTsgfVxyXG4gICAgcHVibGljIGdldCBpc0V4cGFuZGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5pc0V4cGFuZGVkVmFsdWU7IH1cclxuICAgIHB1YmxpYyBnZXQgdGl0bGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMudGl0bGVWYWx1ZSA/IHRoaXMudGl0bGVWYWx1ZSA6IHRoaXMuc3VydmV5LnRpdGxlOyB9XHJcbiAgICBwdWJsaWMgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcpIHsgdGhpcy50aXRsZVZhbHVlID0gdmFsdWU7IH1cclxuICAgIHB1YmxpYyBleHBhbmQoKSB7XHJcbiAgICAgICAgdGhpcy5leHBhbmRjb2xsYXBzZSh0cnVlKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBjb2xsYXBzZSgpIHtcclxuICAgICAgICB0aGlzLmV4cGFuZGNvbGxhcHNlKGZhbHNlKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBjcmVhdGVTdXJ2ZXkoanNvbk9iajogYW55KTogU3VydmV5TW9kZWwge1xyXG4gICAgICAgIHJldHVybiBuZXcgU3VydmV5TW9kZWwoanNvbk9iailcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBleHBhbmRjb2xsYXBzZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuaXNFeHBhbmRlZFZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcbn1cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9zdXJ2ZXlXaW5kb3cudHNcbiAqKi8iLCJleHBvcnQgdmFyIHN1cnZleUNzcyA9IHtcclxuICAgIGN1cnJlbnRUeXBlOiBcIlwiLFxyXG4gICAgZ2V0Q3NzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudFR5cGUgPyB0aGlzW3RoaXMuY3VycmVudFR5cGVdIDogZGVmYXVsdFN0YW5kYXJkQ3NzO1xyXG4gICAgICAgIGlmICghbG9jKSBsb2MgPSBkZWZhdWx0U3RhbmRhcmRDc3M7XHJcbiAgICAgICAgcmV0dXJuIGxvYztcclxuICAgIH0sXHJcbn07XHJcblxyXG5leHBvcnQgdmFyIGRlZmF1bHRTdGFuZGFyZENzcyA9IHtcclxuICAgIHJvb3Q6IFwic3ZfbWFpblwiLFxyXG4gICAgaGVhZGVyOiBcIlwiLFxyXG4gICAgYm9keTogXCJzdl9ib2R5XCIsXHJcbiAgICBmb290ZXI6IFwic3ZfbmF2XCIsXHJcbiAgICBuYXZpZ2F0aW9uQnV0dG9uOiBcIlwiLCBuYXZpZ2F0aW9uOiB7IGNvbXBsZXRlOiBcIlwiLCBwcmV2OlwiXCIsIG5leHQ6IFwiXCJ9LFxyXG4gICAgcHJvZ3Jlc3M6IFwic3ZfcHJvZ3Jlc3NcIiwgcHJvZ3Jlc3NCYXI6IFwiXCIsXHJcbiAgICBwYWdlVGl0bGU6IFwic3ZfcF90aXRsZVwiLFxyXG4gICAgcm93OiBcInN2X3Jvd1wiLFxyXG4gICAgcXVlc3Rpb246IHsgcm9vdDogXCJzdl9xXCIsIHRpdGxlOiBcInN2X3FfdGl0bGVcIiwgY29tbWVudDogXCJcIiwgaW5kZW50OiAyMCB9LFxyXG4gICAgZXJyb3I6IHsgcm9vdDogXCJzdl9xX2VyYm94XCIsIGljb246IFwiXCIsIGl0ZW06IFwiXCIgfSxcclxuXHJcbiAgICBjaGVja2JveDogeyByb290OiBcInN2X3FjYmNcIiwgaXRlbTogXCJzdl9xX2NoZWNrYm94XCIsIG90aGVyOiBcInN2X3Ffb3RoZXJcIiB9LFxyXG4gICAgY29tbWVudDogXCJcIixcclxuICAgIGRyb3Bkb3duOiBcIlwiLFxyXG4gICAgbWF0cml4OiB7IHJvb3Q6IFwic3ZfcV9tYXRyaXhcIiB9LFxyXG4gICAgbWF0cml4ZHJvcGRvd246IHsgcm9vdDogXCJzdl9xX21hdHJpeFwiIH0sXHJcbiAgICBtYXRyaXhkeW5hbWljOiB7IHJvb3Q6IFwidGFibGVcIiwgYnV0dG9uOiBcIlwiIH0sXHJcbiAgICBtdWx0aXBsZXRleHQ6IHsgcm9vdDogXCJcIiwgaXRlbVRpdGxlOiBcIlwiLCBpdGVtVmFsdWU6IFwiXCIgfSxcclxuICAgIHJhZGlvZ3JvdXA6IHsgcm9vdDogXCJzdl9xY2JjXCIsIGl0ZW06IFwic3ZfcV9yYWRpb2dyb3VwXCIsIG90aGVyOiBcInN2X3Ffb3RoZXJcIiB9LFxyXG4gICAgcmF0aW5nOiB7IHJvb3Q6IFwic3ZfcV9yYXRpbmdcIiwgaXRlbTogXCJzdl9xX3JhdGluZ19pdGVtXCIgfSxcclxuICAgIHRleHQ6IFwiXCIsXHJcbiAgICB3aW5kb3c6IHtcclxuICAgICAgICByb290OiBcInN2X3dpbmRvd1wiLCBib2R5OiBcInN2X3dpbmRvd19jb250ZW50XCIsXHJcbiAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgICAgIHJvb3Q6IFwic3Zfd2luZG93X3RpdGxlXCIsIHRpdGxlOiBcIlwiLCBidXR0b246IFwiXCIsIGJ1dHRvbkV4cGFuZGVkOiBcIlwiLCBidXR0b25Db2xsYXBzZWQ6IFwiXCJcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG5zdXJ2ZXlDc3NbXCJzdGFuZGFyZFwiXSA9IGRlZmF1bHRTdGFuZGFyZENzcztcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkLnRzXG4gKiovIiwiaW1wb3J0IHtzdXJ2ZXlDc3N9IGZyb20gXCIuL2Nzc3N0YW5kYXJkXCI7XHJcblxyXG5leHBvcnQgdmFyIGRlZmF1bHRCb290c3RyYXBDc3MgPSB7XHJcbiAgICByb290OiBcIlwiLFxyXG4gICAgaGVhZGVyOiBcInBhbmVsLWhlYWRpbmdcIixcclxuICAgIGJvZHk6IFwicGFuZWwtYm9keVwiLFxyXG4gICAgZm9vdGVyOiBcInBhbmVsLWZvb3RlclwiLFxyXG4gICAgbmF2aWdhdGlvbkJ1dHRvbjogXCJcIiwgbmF2aWdhdGlvbjogeyBjb21wbGV0ZTogXCJcIiwgcHJldjogXCJcIiwgbmV4dDogXCJcIiB9LFxyXG4gICAgcHJvZ3Jlc3M6IFwicHJvZ3Jlc3MgY2VudGVyLWJsb2NrXCIsIHByb2dyZXNzQmFyOiBcInByb2dyZXNzLWJhclwiLFxyXG4gICAgcGFnZVRpdGxlOiBcIlwiLFxyXG4gICAgcm93OiBcIlwiLFxyXG4gICAgcXVlc3Rpb246IHsgcm9vdDogXCJcIiwgdGl0bGU6IFwiXCIsIGNvbW1lbnQ6IFwiZm9ybS1jb250cm9sXCIsIGluZGVudDogMjAgfSxcclxuICAgIGVycm9yOiB7IHJvb3Q6IFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIsIGljb246IFwiZ2x5cGhpY29uIGdseXBoaWNvbi1leGNsYW1hdGlvbi1zaWduXCIsIGl0ZW06IFwiXCIgfSxcclxuXHJcbiAgICBjaGVja2JveDogeyByb290OiBcImZvcm0taW5saW5lXCIsIGl0ZW06IFwiY2hlY2tib3hcIiwgb3RoZXI6IFwiXCIgfSxcclxuICAgIGNvbW1lbnQ6IFwiZm9ybS1jb250cm9sXCIsXHJcbiAgICBkcm9wZG93bjogXCJmb3JtLWNvbnRyb2xcIixcclxuICAgIG1hdHJpeDogeyByb290OiBcInRhYmxlXCIgfSxcclxuICAgIG1hdHJpeGRyb3Bkb3duOiB7IHJvb3Q6IFwidGFibGVcIiB9LFxyXG4gICAgbWF0cml4ZHluYW1pYzogeyByb290OiBcInRhYmxlXCIsIGJ1dHRvbjogXCJidXR0b25cIiB9LFxyXG4gICAgbXVsdGlwbGV0ZXh0OiB7IHJvb3Q6IFwidGFibGVcIiwgaXRlbVRpdGxlOiBcIlwiLCBpdGVtVmFsdWU6IFwiZm9ybS1jb250cm9sXCIgfSxcclxuICAgIHJhZGlvZ3JvdXA6IHsgcm9vdDogXCJmb3JtLWlubGluZVwiLCBpdGVtOiBcInJhZGlvXCIsIG90aGVyOiBcIlwiIH0sXHJcbiAgICByYXRpbmc6IHsgcm9vdDogXCJidG4tZ3JvdXBcIiwgaXRlbTogXCJidG4gYnRuLWRlZmF1bHRcIiB9LFxyXG4gICAgdGV4dDogXCJmb3JtLWNvbnRyb2xcIixcclxuICAgIHdpbmRvdzoge1xyXG4gICAgICAgIHJvb3Q6IFwibW9kYWwtY29udGVudFwiLCBib2R5OiBcIm1vZGFsLWJvZHlcIixcclxuICAgICAgICBoZWFkZXI6IHtcclxuICAgICAgICAgICAgcm9vdDogXCJtb2RhbC1oZWFkZXIgcGFuZWwtdGl0bGVcIiwgdGl0bGU6IFwicHVsbC1sZWZ0XCIsIGJ1dHRvbjogXCJnbHlwaGljb24gcHVsbC1yaWdodFwiLFxyXG4gICAgICAgICAgICBidXR0b25FeHBhbmRlZDogXCJnbHlwaGljb24gcHVsbC1yaWdodCBnbHlwaGljb24tY2hldnJvbi11cFwiLCBidXR0b25Db2xsYXBzZWQ6IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHQgZ2x5cGhpY29uLWNoZXZyb24tZG93blwiXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5zdXJ2ZXlDc3NbXCJib290c3RyYXBcIl0gPSBkZWZhdWx0Qm9vdHN0cmFwQ3NzO1xuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2RlZmF1bHRDc3MvY3NzYm9vdHN0cmFwLnRzXG4gKiovIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XHJcbmltcG9ydCB7UmVhY3RTdXJ2ZXlNb2RlbH0gZnJvbSBcIi4vcmVhY3RzdXJ2ZXltb2RlbFwiO1xyXG5pbXBvcnQge1N1cnZleVBhZ2V9IGZyb20gXCIuL3JlYWN0cGFnZVwiO1xyXG5pbXBvcnQge1N1cnZleU5hdmlnYXRpb259IGZyb20gXCIuL3JlYWN0U3VydmV5TmF2aWdhdGlvblwiO1xyXG5pbXBvcnQge1F1ZXN0aW9uQmFzZX0gZnJvbSBcIi4uL3F1ZXN0aW9uYmFzZVwiO1xyXG5pbXBvcnQge0lTdXJ2ZXlDcmVhdG9yfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uXCI7XHJcbmltcG9ydCB7UmVhY3RRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XHJcbmltcG9ydCB7c3VydmV5Q3NzfSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3NzdGFuZGFyZFwiO1xyXG5pbXBvcnQge1N1cnZleVByb2dyZXNzfSBmcm9tIFwiLi9yZWFjdFN1cnZleVByb2dyZXNzXCI7XHJcbmltcG9ydCB7U3VydmV5UGFnZUlkfSBmcm9tIFwiLi4vYmFzZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFN1cnZleSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxhbnksIGFueT4gaW1wbGVtZW50cyBJU3VydmV5Q3JlYXRvciB7XHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBjc3NUeXBlKCk6IHN0cmluZyB7IHJldHVybiBzdXJ2ZXlDc3MuY3VycmVudFR5cGU7IH1cclxuICAgIHB1YmxpYyBzdGF0aWMgc2V0IGNzc1R5cGUodmFsdWU6IHN0cmluZykgeyBzdXJ2ZXlDc3MuY3VycmVudFR5cGUgPSB2YWx1ZTsgfVxyXG4gICAgcHJvdGVjdGVkIHN1cnZleTogUmVhY3RTdXJ2ZXlNb2RlbDtcclxuICAgIHByaXZhdGUgaXNDdXJyZW50UGFnZUNoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlU3VydmV5KHByb3BzKTtcclxuICAgIH1cclxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVN1cnZleShuZXh0UHJvcHMpO1xyXG4gICAgfVxyXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ3VycmVudFBhZ2VDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDdXJyZW50UGFnZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXkuZm9jdXNGaXJzdFF1ZXN0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICBpZiAodGhpcy5zdXJ2ZXkuc3RhdGUgPT0gXCJjb21wbGV0ZWRcIikgcmV0dXJuIHRoaXMucmVuZGVyQ29tcGxldGVkKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuc3VydmV5LnN0YXRlID09IFwibG9hZGluZ1wiKSByZXR1cm4gdGhpcy5yZW5kZXJMb2FkaW5nKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyU3VydmV5KCk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0IGNzcygpOiBhbnkgeyByZXR1cm4gc3VydmV5Q3NzLmdldENzcygpOyB9XHJcbiAgICBwdWJsaWMgc2V0IGNzcyh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5zdXJ2ZXkubWVyZ2VDc3ModmFsdWUsIHRoaXMuY3NzKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCByZW5kZXJDb21wbGV0ZWQoKTogSlNYLkVsZW1lbnQge1xyXG4gICAgICAgIHZhciBodG1sVmFsdWUgPSB7IF9faHRtbDogdGhpcy5zdXJ2ZXkucHJvY2Vzc2VkQ29tcGxldGVkSHRtbCB9O1xyXG4gICAgICAgIHJldHVybiAoPGRpdiBkYW5nZXJvdXNseVNldElubmVySFRNTD17aHRtbFZhbHVlfSAvPik7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyTG9hZGluZygpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgdmFyIGh0bWxWYWx1ZSA9IHsgX19odG1sOiB0aGlzLnN1cnZleS5wcm9jZXNzZWRMb2FkaW5nSHRtbCB9O1xyXG4gICAgICAgIHJldHVybiAoPGRpdiBkYW5nZXJvdXNseVNldElubmVySFRNTD17aHRtbFZhbHVlfSAvPik7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyU3VydmV5KCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICB2YXIgdGl0bGUgPSB0aGlzLnN1cnZleS50aXRsZSAmJiB0aGlzLnN1cnZleS5zaG93VGl0bGUgPyB0aGlzLnJlbmRlclRpdGxlKCkgOiBudWxsO1xyXG4gICAgICAgIHZhciBjdXJyZW50UGFnZSA9IHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlID8gdGhpcy5yZW5kZXJQYWdlKCkgOiBudWxsO1xyXG4gICAgICAgIHZhciB0b3BQcm9ncmVzcyA9IHRoaXMuc3VydmV5LnNob3dQcm9ncmVzc0JhciA9PSBcInRvcFwiID8gdGhpcy5yZW5kZXJQcm9ncmVzcyh0cnVlKSA6IG51bGw7XHJcbiAgICAgICAgdmFyIGJvdHRvbVByb2dyZXNzID0gdGhpcy5zdXJ2ZXkuc2hvd1Byb2dyZXNzQmFyID09IFwiYm90dG9tXCIgPyB0aGlzLnJlbmRlclByb2dyZXNzKGZhbHNlKSA6IG51bGw7XHJcbiAgICAgICAgdmFyIGJ1dHRvbnMgPSAoY3VycmVudFBhZ2UgJiYgdGhpcy5zdXJ2ZXkuc2hvd05hdmlnYXRpb25CdXR0b25zKSA/IHRoaXMucmVuZGVyTmF2aWdhdGlvbigpIDogbnVsbDtcclxuICAgICAgICBpZiAoIWN1cnJlbnRQYWdlKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRQYWdlID0gdGhpcy5yZW5kZXJFbXB0eVN1cnZleSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5jc3Mucm9vdH0+XHJcbiAgICAgICAgICAgICAgICB7dGl0bGV9XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPXtTdXJ2ZXlQYWdlSWR9IGNsYXNzTmFtZT17dGhpcy5jc3MuYm9keX0+XHJcbiAgICAgICAgICAgICAgICAgICAge3RvcFByb2dyZXNzfVxyXG4gICAgICAgICAgICAgICAgICAgIHtjdXJyZW50UGFnZX1cclxuICAgICAgICAgICAgICAgICAgICB7Ym90dG9tUHJvZ3Jlc3N9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIHtidXR0b25zfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHJlbmRlclRpdGxlKCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RoaXMuY3NzLmhlYWRlcn0+PGgzPnt0aGlzLnN1cnZleS50aXRsZX08L2gzPjwvZGl2PjtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCByZW5kZXJQYWdlKCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICByZXR1cm4gPFN1cnZleVBhZ2Ugc3VydmV5PXt0aGlzLnN1cnZleX0gcGFnZT17dGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2V9IGNzcz17dGhpcy5jc3N9IGNyZWF0b3I9e3RoaXN9IC8+O1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHJlbmRlclByb2dyZXNzKGlzVG9wOiBib29sZWFuKTogSlNYLkVsZW1lbnQge1xyXG4gICAgICAgIHJldHVybiA8U3VydmV5UHJvZ3Jlc3Mgc3VydmV5PXt0aGlzLnN1cnZleX0gY3NzPXt0aGlzLmNzc30gaXNUb3A9e2lzVG9wfSAgLz47XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyTmF2aWdhdGlvbigpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgcmV0dXJuIDxTdXJ2ZXlOYXZpZ2F0aW9uIHN1cnZleSA9IHt0aGlzLnN1cnZleX0gY3NzPXt0aGlzLmNzc30vPjtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCByZW5kZXJFbXB0eVN1cnZleSgpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgcmV0dXJuICg8c3Bhbj57dGhpcy5zdXJ2ZXkuZW1wdHlTdXJ2ZXlUZXh0fTwvc3Bhbj4pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCB1cGRhdGVTdXJ2ZXkobmV3UHJvcHM6IGFueSkge1xyXG4gICAgICAgIGlmIChuZXdQcm9wcykge1xyXG4gICAgICAgICAgICBpZiAobmV3UHJvcHMubW9kZWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5ID0gbmV3UHJvcHMubW9kZWw7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV3UHJvcHMuanNvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5ID0gbmV3IFJlYWN0U3VydmV5TW9kZWwobmV3UHJvcHMuanNvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnN1cnZleSA9IG5ldyBSZWFjdFN1cnZleU1vZGVsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChuZXdQcm9wcykge1xyXG4gICAgICAgICAgICBpZiAobmV3UHJvcHMuY2xpZW50SWQpIHRoaXMuc3VydmV5LmNsaWVudElkID0gbmV3UHJvcHMuY2xpZW50SWQ7XHJcbiAgICAgICAgICAgIGlmIChuZXdQcm9wcy5kYXRhKSB0aGlzLnN1cnZleS5kYXRhID0gbmV3UHJvcHMuZGF0YTtcclxuICAgICAgICAgICAgaWYgKG5ld1Byb3BzLmNzcykgdGhpcy5zdXJ2ZXkubWVyZ2VDc3MobmV3UHJvcHMuY3NzLCB0aGlzLmNzcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL3NldCB0aGUgZmlyc3QgcGFnZVxyXG4gICAgICAgIHZhciBkdW1teSA9IHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlO1xyXG5cclxuICAgICAgICB0aGlzLnN0YXRlID0geyBwYWdlSW5kZXhDaGFuZ2U6IDAsIGlzQ29tcGxldGVkOiBmYWxzZSwgbW9kZWxDaGFuZ2VkOiAwIH07XHJcbiAgICAgICAgdGhpcy5zZXRTdXJ2ZXlFdmVudHMobmV3UHJvcHMpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHNldFN1cnZleUV2ZW50cyhuZXdQcm9wczogYW55KSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuc3VydmV5LnJlbmRlckNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBzZWxmLnN0YXRlLm1vZGVsQ2hhbmdlZCA9IHNlbGYuc3RhdGUubW9kZWxDaGFuZ2VkICsgMTtcclxuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZShzZWxmLnN0YXRlKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuc3VydmV5Lm9uQ29tcGxldGUuYWRkKChzZW5kZXIpID0+IHsgc2VsZi5zdGF0ZS5pc0NvbXBsZXRlZCA9IHRydWU7IHNlbGYuc2V0U3RhdGUoc2VsZi5zdGF0ZSk7IH0pO1xyXG4gICAgICAgIHRoaXMuc3VydmV5Lm9uUGFydGlhbFNlbmQuYWRkKChzZW5kZXIpID0+IHsgc2VsZi5zZXRTdGF0ZShzZWxmLnN0YXRlKTsgfSk7XHJcbiAgICAgICAgdGhpcy5zdXJ2ZXkub25DdXJyZW50UGFnZUNoYW5nZWQuYWRkKChzZW5kZXIsIG9wdGlvbnMpID0+IHtcclxuICAgICAgICAgICAgc2VsZi5pc0N1cnJlbnRQYWdlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUucGFnZUluZGV4Q2hhbmdlID0gc2VsZi5zdGF0ZS5wYWdlSW5kZXhDaGFuZ2UgKyAxO1xyXG4gICAgICAgICAgICBzZWxmLnNldFN0YXRlKHNlbGYuc3RhdGUpO1xyXG4gICAgICAgICAgICBpZiAobmV3UHJvcHMgJiYgbmV3UHJvcHMub25DdXJyZW50UGFnZUNoYW5nZWQpIG5ld1Byb3BzLm9uQ3VycmVudFBhZ2VDaGFuZ2VkKHNlbmRlciwgb3B0aW9ucyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5zdXJ2ZXkub25WaXNpYmxlQ2hhbmdlZC5hZGQoKHNlbmRlciwgb3B0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5xdWVzdGlvbiAmJiBvcHRpb25zLnF1ZXN0aW9uLnJlYWN0KSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgc3RhdGUgPSBvcHRpb25zLnF1ZXN0aW9uLnJlYWN0LnN0YXRlO1xyXG4gICAgICAgICAgICAgICAgc3RhdGUudmlzaWJsZSA9IG9wdGlvbnMucXVlc3Rpb24udmlzaWJsZTtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMucXVlc3Rpb24ucmVhY3Quc2V0U3RhdGUoc3RhdGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5zdXJ2ZXkub25WYWx1ZUNoYW5nZWQuYWRkKChzZW5kZXIsIG9wdGlvbnMpID0+IHtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucXVlc3Rpb24gJiYgb3B0aW9ucy5xdWVzdGlvbi5yZWFjdCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHN0YXRlID0gb3B0aW9ucy5xdWVzdGlvbi5yZWFjdC5zdGF0ZTtcclxuICAgICAgICAgICAgICAgIHN0YXRlLnZhbHVlID0gb3B0aW9ucy52YWx1ZTtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMucXVlc3Rpb24ucmVhY3Quc2V0U3RhdGUoc3RhdGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKCFuZXdQcm9wcykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuc3VydmV5Lm9uVmFsdWVDaGFuZ2VkLmFkZCgoc2VuZGVyLCBvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChuZXdQcm9wcy5kYXRhKSBuZXdQcm9wcy5kYXRhW29wdGlvbnMubmFtZV0gPSBvcHRpb25zLnZhbHVlO1xyXG4gICAgICAgICAgICBpZiAobmV3UHJvcHMub25WYWx1ZUNoYW5nZWQpIG5ld1Byb3BzLm9uVmFsdWVDaGFuZ2VkKHNlbmRlciwgb3B0aW9ucyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKG5ld1Byb3BzLm9uQ29tcGxldGUpIHtcclxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXkub25Db21wbGV0ZS5hZGQoKHNlbmRlcikgPT4geyBuZXdQcm9wcy5vbkNvbXBsZXRlKHNlbmRlcik7IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV3UHJvcHMub25QYXJ0aWFsU2VuZCkge1xyXG4gICAgICAgICAgICB0aGlzLnN1cnZleS5vblBhcnRpYWxTZW5kLmFkZCgoc2VuZGVyKSA9PiB7IG5ld1Byb3BzLm9uUGFydGlhbFNlbmQoc2VuZGVyKTsgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc3VydmV5Lm9uUGFnZVZpc2libGVDaGFuZ2VkLmFkZCgoc2VuZGVyLCBvcHRpb25zKSA9PiB7IGlmIChuZXdQcm9wcy5vblBhZ2VWaXNpYmxlQ2hhbmdlZCkgbmV3UHJvcHMub25QYWdlVmlzaWJsZUNoYW5nZWQoc2VuZGVyLCBvcHRpb25zKTsgfSk7XHJcbiAgICAgICAgaWYgKG5ld1Byb3BzLm9uUXVlc3Rpb25BZGRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnN1cnZleS5vblF1ZXN0aW9uQWRkZWQuYWRkKChzZW5kZXIsIG9wdGlvbnMpID0+IHsgbmV3UHJvcHMub25RdWVzdGlvbkFkZGVkKHNlbmRlciwgb3B0aW9ucyk7IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV3UHJvcHMub25RdWVzdGlvblJlbW92ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXkub25RdWVzdGlvblJlbW92ZWQuYWRkKChzZW5kZXIsIG9wdGlvbnMpID0+IHsgbmV3UHJvcHMub25RdWVzdGlvblJlbW92ZWQoc2VuZGVyLCBvcHRpb25zKTsgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChuZXdQcm9wcy5vblZhbGlkYXRlUXVlc3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXkub25WYWxpZGF0ZVF1ZXN0aW9uLmFkZCgoc2VuZGVyLCBvcHRpb25zKSA9PiB7IG5ld1Byb3BzLm9uVmFsaWRhdGVRdWVzdGlvbihzZW5kZXIsIG9wdGlvbnMpOyB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5ld1Byb3BzLm9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnMpIHtcclxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXkub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucyA9IG5ld1Byb3BzLm9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChuZXdQcm9wcy5vblNlbmRSZXN1bHQpIHtcclxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXkub25TZW5kUmVzdWx0LmFkZCgoc2VuZGVyLCBvcHRpb25zKSA9PiB7IG5ld1Byb3BzLm9uU2VuZFJlc3VsdChzZW5kZXIsIG9wdGlvbnMpOyB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5ld1Byb3BzLm9uR2V0UmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3VydmV5Lm9uR2V0UmVzdWx0LmFkZCgoc2VuZGVyLCBvcHRpb25zKSA9PiB7IG5ld1Byb3BzLm9uR2V0UmVzdWx0KHNlbmRlciwgb3B0aW9ucyk7IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmV3UHJvcHMub25Qcm9jZXNzSHRtbCkge1xyXG4gICAgICAgICAgICB0aGlzLnN1cnZleS5vblByb2Nlc3NIdG1sLmFkZCgoc2VuZGVyLCBvcHRpb25zKSA9PiB7IG5ld1Byb3BzLm9uUHJvY2Vzc0h0bWwoc2VuZGVyLCBvcHRpb25zKTsgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vSVN1cnZleUNyZWF0b3JcclxuICAgIHB1YmxpYyBjcmVhdGVRdWVzdGlvbkVsZW1lbnQocXVlc3Rpb246IFF1ZXN0aW9uQmFzZSk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICB2YXIgcXVlc3Rpb25Dc3MgPSB0aGlzLmNzc1txdWVzdGlvbi5nZXRUeXBlKCldO1xyXG4gICAgICAgIHJldHVybiBSZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5jcmVhdGVRdWVzdGlvbihxdWVzdGlvbi5nZXRUeXBlKCksIHtcclxuICAgICAgICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLCBjc3M6IHF1ZXN0aW9uQ3NzLCByb290Q3NzOiB0aGlzLmNzcywgaXNEaXNwbGF5TW9kZTogdGhpcy5zdXJ2ZXkuaXNEaXNwbGF5TW9kZSwgY3JlYXRvcjogdGhpc1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHJlbmRlckVycm9yKGtleTogc3RyaW5nLCBlcnJvclRleHQ6IHN0cmluZyk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICByZXR1cm4gPGRpdiBrZXk9e2tleX0gY2xhc3NOYW1lPXt0aGlzLmNzcy5lcnJvci5pdGVtfT57ZXJyb3JUZXh0fTwvZGl2PjtcclxuICAgIH1cclxuICAgIHB1YmxpYyBxdWVzdGlvblRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuc3VydmV5LnF1ZXN0aW9uVGl0bGVMb2NhdGlvbjsgfVxyXG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcmVhY3QvcmVhY3RTdXJ2ZXkudHN4XG4gKiovIiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wdHlwZXMnO1xuaW1wb3J0IHsgcmVuZGVyIGFzIHByZWFjdFJlbmRlciwgY2xvbmVFbGVtZW50IGFzIHByZWFjdENsb25lRWxlbWVudCwgaCwgQ29tcG9uZW50IGFzIFByZWFjdENvbXBvbmVudCwgb3B0aW9ucyB9IGZyb20gJ3ByZWFjdCc7XG5cbmNvbnN0IHZlcnNpb24gPSAnMTUuMS4wJzsgLy8gdHJpY2sgbGlicmFyaWVzIHRvIHRoaW5rIHdlIGFyZSByZWFjdFxuXG5jb25zdCBFTEVNRU5UUyA9ICdhIGFiYnIgYWRkcmVzcyBhcmVhIGFydGljbGUgYXNpZGUgYXVkaW8gYiBiYXNlIGJkaSBiZG8gYmlnIGJsb2NrcXVvdGUgYm9keSBiciBidXR0b24gY2FudmFzIGNhcHRpb24gY2l0ZSBjb2RlIGNvbCBjb2xncm91cCBkYXRhIGRhdGFsaXN0IGRkIGRlbCBkZXRhaWxzIGRmbiBkaWFsb2cgZGl2IGRsIGR0IGVtIGVtYmVkIGZpZWxkc2V0IGZpZ2NhcHRpb24gZmlndXJlIGZvb3RlciBmb3JtIGgxIGgyIGgzIGg0IGg1IGg2IGhlYWQgaGVhZGVyIGhncm91cCBociBodG1sIGkgaWZyYW1lIGltZyBpbnB1dCBpbnMga2JkIGtleWdlbiBsYWJlbCBsZWdlbmQgbGkgbGluayBtYWluIG1hcCBtYXJrIG1lbnUgbWVudWl0ZW0gbWV0YSBtZXRlciBuYXYgbm9zY3JpcHQgb2JqZWN0IG9sIG9wdGdyb3VwIG9wdGlvbiBvdXRwdXQgcCBwYXJhbSBwaWN0dXJlIHByZSBwcm9ncmVzcyBxIHJwIHJ0IHJ1YnkgcyBzYW1wIHNjcmlwdCBzZWN0aW9uIHNlbGVjdCBzbWFsbCBzb3VyY2Ugc3BhbiBzdHJvbmcgc3R5bGUgc3ViIHN1bW1hcnkgc3VwIHRhYmxlIHRib2R5IHRkIHRleHRhcmVhIHRmb290IHRoIHRoZWFkIHRpbWUgdGl0bGUgdHIgdHJhY2sgdSB1bCB2YXIgdmlkZW8gd2JyIGNpcmNsZSBjbGlwUGF0aCBkZWZzIGVsbGlwc2UgZyBpbWFnZSBsaW5lIGxpbmVhckdyYWRpZW50IG1hc2sgcGF0aCBwYXR0ZXJuIHBvbHlnb24gcG9seWxpbmUgcmFkaWFsR3JhZGllbnQgcmVjdCBzdG9wIHN2ZyB0ZXh0IHRzcGFuJy5zcGxpdCgnICcpO1xuXG5jb25zdCBSRUFDVF9FTEVNRU5UX1RZUEUgPSAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yICYmIFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSkgfHwgMHhlYWM3O1xuXG4vLyBkb24ndCBhdXRvYmluZCB0aGVzZSBtZXRob2RzIHNpbmNlIHRoZXkgYWxyZWFkeSBoYXZlIGd1YXJhbnRlZWQgY29udGV4dC5cbmNvbnN0IEFVVE9CSU5EX0JMQUNLTElTVCA9IHtcblx0Y29uc3RydWN0b3I6IDEsXG5cdHJlbmRlcjogMSxcblx0c2hvdWxkQ29tcG9uZW50VXBkYXRlOiAxLFxuXHRjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiAxLFxuXHRjb21wb25lbnRXaWxsVXBkYXRlOiAxLFxuXHRjb21wb25lbnREaWRVcGRhdGU6IDEsXG5cdGNvbXBvbmVudFdpbGxNb3VudDogMSxcblx0Y29tcG9uZW50RGlkTW91bnQ6IDEsXG5cdGNvbXBvbmVudFdpbGxVbm1vdW50OiAxLFxuXHRjb21wb25lbnREaWRVbm1vdW50OiAxXG59O1xuXG5cbmNvbnN0IENBTUVMX1BST1BTID0gL14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcHxjb2xvcnxmaWxsfGZsb29kfGZvbnR8Z2x5cGh8aG9yaXp8bWFya2VyfG92ZXJsaW5lfHBhaW50fHN0b3B8c3RyaWtldGhyb3VnaHxzdHJva2V8dGV4dHx1bmRlcmxpbmV8dW5pY29kZXx1bml0c3x2fHZlcnR8d29yZHx3cml0aW5nfHgpW0EtWl0vO1xuXG5cbmNvbnN0IEJZUEFTU19IT09LID0ge307XG5cbi8qZ2xvYmFsIHByb2Nlc3MqL1xuY29uc3QgREVWID0gdHlwZW9mIHByb2Nlc3M9PT0ndW5kZWZpbmVkJyB8fCAhcHJvY2Vzcy5lbnYgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYhPT0ncHJvZHVjdGlvbic7XG5cbi8vIGEgY29tcG9uZW50IHRoYXQgcmVuZGVycyBub3RoaW5nLiBVc2VkIHRvIHJlcGxhY2UgY29tcG9uZW50cyBmb3IgdW5tb3VudENvbXBvbmVudEF0Tm9kZS5cbmNvbnN0IEVtcHR5Q29tcG9uZW50ID0gKCkgPT4gbnVsbDtcblxuXG5cbi8vIG1ha2UgcmVhY3QgdGhpbmsgd2UncmUgcmVhY3QuXG5sZXQgVk5vZGUgPSBoKCcnKS5jb25zdHJ1Y3RvcjtcblZOb2RlLnByb3RvdHlwZS4kJHR5cGVvZiA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcblZOb2RlLnByb3RvdHlwZS5wcmVhY3RDb21wYXRVcGdyYWRlZCA9IGZhbHNlO1xuVk5vZGUucHJvdG90eXBlLnByZWFjdENvbXBhdE5vcm1hbGl6ZWQgPSBmYWxzZTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZOb2RlLnByb3RvdHlwZSwgJ3R5cGUnLCB7XG5cdGdldCgpIHsgcmV0dXJuIHRoaXMubm9kZU5hbWU7IH0sXG5cdHNldCh2KSB7IHRoaXMubm9kZU5hbWUgPSB2OyB9LFxuXHRjb25maWd1cmFibGU6dHJ1ZVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWTm9kZS5wcm90b3R5cGUsICdwcm9wcycsIHtcblx0Z2V0KCkgeyByZXR1cm4gdGhpcy5hdHRyaWJ1dGVzOyB9LFxuXHRzZXQodikgeyB0aGlzLmF0dHJpYnV0ZXMgPSB2OyB9LFxuXHRjb25maWd1cmFibGU6dHJ1ZVxufSk7XG5cblxuXG5sZXQgb2xkRXZlbnRIb29rID0gb3B0aW9ucy5ldmVudDtcbm9wdGlvbnMuZXZlbnQgPSBlID0+IHtcblx0ZS5wZXJzaXN0ID0gT2JqZWN0O1xuXHRpZiAob2xkRXZlbnRIb29rKSBlID0gb2xkRXZlbnRIb29rKGUpO1xuXHRyZXR1cm4gZTtcbn07XG5cblxubGV0IG9sZFZub2RlSG9vayA9IG9wdGlvbnMudm5vZGU7XG5vcHRpb25zLnZub2RlID0gdm5vZGUgPT4ge1xuXHRpZiAoIXZub2RlLnByZWFjdENvbXBhdFVwZ3JhZGVkKSB7XG5cdFx0dm5vZGUucHJlYWN0Q29tcGF0VXBncmFkZWQgPSB0cnVlO1xuXG5cdFx0bGV0IHRhZyA9IHZub2RlLm5vZGVOYW1lLFxuXHRcdFx0YXR0cnMgPSB2bm9kZS5hdHRyaWJ1dGVzO1xuXG5cdFx0aWYgKCFhdHRycykgYXR0cnMgPSB2bm9kZS5hdHRyaWJ1dGVzID0ge307XG5cblx0XHRpZiAodHlwZW9mIHRhZz09PSdmdW5jdGlvbicpIHtcblx0XHRcdGlmICh0YWdbQ09NUE9ORU5UX1dSQVBQRVJfS0VZXT09PXRydWUgfHwgKHRhZy5wcm90b3R5cGUgJiYgJ2lzUmVhY3RDb21wb25lbnQnIGluIHRhZy5wcm90b3R5cGUpKSB7XG5cdFx0XHRcdGlmICghdm5vZGUucHJlYWN0Q29tcGF0Tm9ybWFsaXplZCkge1xuXHRcdFx0XHRcdG5vcm1hbGl6ZVZOb2RlKHZub2RlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRoYW5kbGVDb21wb25lbnRWTm9kZSh2bm9kZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGF0dHJzKSB7XG5cdFx0XHRoYW5kbGVFbGVtZW50Vk5vZGUodm5vZGUsIGF0dHJzKTtcblx0XHR9XG5cdH1cblx0aWYgKG9sZFZub2RlSG9vaykgb2xkVm5vZGVIb29rKHZub2RlKTtcbn07XG5cblxuXG5cbmZ1bmN0aW9uIGhhbmRsZUNvbXBvbmVudFZOb2RlKHZub2RlKSB7XG5cdGxldCB0YWcgPSB2bm9kZS5ub2RlTmFtZSxcblx0XHRhID0gdm5vZGUuYXR0cmlidXRlcztcblxuXHR2bm9kZS5hdHRyaWJ1dGVzID0ge307XG5cdGlmICh0YWcuZGVmYXVsdFByb3BzKSBleHRlbmQodm5vZGUuYXR0cmlidXRlcywgdGFnLmRlZmF1bHRQcm9wcyk7XG5cdGlmIChhKSBleHRlbmQodm5vZGUuYXR0cmlidXRlcywgYSk7XG5cdGEgPSB2bm9kZS5hdHRyaWJ1dGVzO1xuXG5cdGlmICh2bm9kZS5jaGlsZHJlbiAmJiAhdm5vZGUuY2hpbGRyZW4ubGVuZ3RoKSB2bm9kZS5jaGlsZHJlbiA9IHVuZGVmaW5lZDtcblxuXHRpZiAodm5vZGUuY2hpbGRyZW4pIGEuY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gaGFuZGxlRWxlbWVudFZOb2RlKHZub2RlLCBhKSB7XG5cdGxldCBzaG91bGRTYW5pdGl6ZSwgYXR0cnMsIGk7XG5cdGlmIChhKSB7XG5cdFx0Zm9yIChpIGluIGEpIGlmICgoc2hvdWxkU2FuaXRpemUgPSBDQU1FTF9QUk9QUy50ZXN0KGkpKSkgYnJlYWs7XG5cdFx0aWYgKHNob3VsZFNhbml0aXplKSB7XG5cdFx0XHRhdHRycyA9IHZub2RlLmF0dHJpYnV0ZXMgPSB7fTtcblx0XHRcdGZvciAoaSBpbiBhKSB7XG5cdFx0XHRcdGlmIChhLmhhc093blByb3BlcnR5KGkpKSB7XG5cdFx0XHRcdFx0YXR0cnNbIENBTUVMX1BST1BTLnRlc3QoaSkgPyBpLnJlcGxhY2UoLyhbQS1aMC05XSkvLCAnLSQxJykudG9Mb3dlckNhc2UoKSA6IGkgXSA9IGFbaV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuXG5cbi8vIHByb3h5IHJlbmRlcigpIHNpbmNlIFJlYWN0IHJldHVybnMgYSBDb21wb25lbnQgcmVmZXJlbmNlLlxuZnVuY3Rpb24gcmVuZGVyKHZub2RlLCBwYXJlbnQsIGNhbGxiYWNrKSB7XG5cdGxldCBwcmV2ID0gcGFyZW50ICYmIHBhcmVudC5fcHJlYWN0Q29tcGF0UmVuZGVyZWQ7XG5cblx0Ly8gaWdub3JlIGltcG9zc2libGUgcHJldmlvdXMgcmVuZGVyc1xuXHRpZiAocHJldiAmJiBwcmV2LnBhcmVudE5vZGUhPT1wYXJlbnQpIHByZXYgPSBudWxsO1xuXG5cdC8vIGRlZmF1bHQgdG8gZmlyc3QgRWxlbWVudCBjaGlsZFxuXHRpZiAoIXByZXYpIHByZXYgPSBwYXJlbnQuY2hpbGRyZW5bMF07XG5cblx0Ly8gcmVtb3ZlIHVuYWZmZWN0ZWQgc2libGluZ3Ncblx0Zm9yIChsZXQgaT1wYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGktLTsgKSB7XG5cdFx0aWYgKHBhcmVudC5jaGlsZE5vZGVzW2ldIT09cHJldikge1xuXHRcdFx0cGFyZW50LnJlbW92ZUNoaWxkKHBhcmVudC5jaGlsZE5vZGVzW2ldKTtcblx0XHR9XG5cdH1cblxuXHRsZXQgb3V0ID0gcHJlYWN0UmVuZGVyKHZub2RlLCBwYXJlbnQsIHByZXYpO1xuXHRpZiAocGFyZW50KSBwYXJlbnQuX3ByZWFjdENvbXBhdFJlbmRlcmVkID0gb3V0O1xuXHRpZiAodHlwZW9mIGNhbGxiYWNrPT09J2Z1bmN0aW9uJykgY2FsbGJhY2soKTtcblx0cmV0dXJuIG91dCAmJiBvdXQuX2NvbXBvbmVudCB8fCBvdXQuYmFzZTtcbn1cblxuXG5jbGFzcyBDb250ZXh0UHJvdmlkZXIge1xuXHRnZXRDaGlsZENvbnRleHQoKSB7XG5cdFx0cmV0dXJuIHRoaXMucHJvcHMuY29udGV4dDtcblx0fVxuXHRyZW5kZXIocHJvcHMpIHtcblx0XHRyZXR1cm4gcHJvcHMuY2hpbGRyZW5bMF07XG5cdH1cbn1cblxuZnVuY3Rpb24gcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCB2bm9kZSwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuXHRsZXQgd3JhcCA9IGgoQ29udGV4dFByb3ZpZGVyLCB7IGNvbnRleHQ6IHBhcmVudENvbXBvbmVudC5jb250ZXh0IH0sIHZub2RlKTtcblx0bGV0IGMgPSByZW5kZXIod3JhcCwgY29udGFpbmVyKTtcblx0aWYgKGNhbGxiYWNrKSBjYWxsYmFjayhjKTtcblx0cmV0dXJuIGM7XG59XG5cblxuZnVuY3Rpb24gdW5tb3VudENvbXBvbmVudEF0Tm9kZShjb250YWluZXIpIHtcblx0bGV0IGV4aXN0aW5nID0gY29udGFpbmVyLl9wcmVhY3RDb21wYXRSZW5kZXJlZDtcblx0aWYgKGV4aXN0aW5nICYmIGV4aXN0aW5nLnBhcmVudE5vZGU9PT1jb250YWluZXIpIHtcblx0XHRwcmVhY3RSZW5kZXIoaChFbXB0eUNvbXBvbmVudCksIGNvbnRhaW5lciwgZXhpc3RpbmcpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcbn1cblxuXG5cbmNvbnN0IEFSUiA9IFtdO1xuXG4vLyBUaGlzIEFQSSBpcyBjb21wbGV0ZWx5IHVubmVjZXNzYXJ5IGZvciBQcmVhY3QsIHNvIGl0J3MgYmFzaWNhbGx5IHBhc3N0aHJvdWdoLlxubGV0IENoaWxkcmVuID0ge1xuXHRtYXAoY2hpbGRyZW4sIGZuLCBjdHgpIHtcblx0XHRjaGlsZHJlbiA9IENoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pO1xuXHRcdGlmIChjdHggJiYgY3R4IT09Y2hpbGRyZW4pIGZuID0gZm4uYmluZChjdHgpO1xuXHRcdHJldHVybiBjaGlsZHJlbi5tYXAoZm4pO1xuXHR9LFxuXHRmb3JFYWNoKGNoaWxkcmVuLCBmbiwgY3R4KSB7XG5cdFx0Y2hpbGRyZW4gPSBDaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKTtcblx0XHRpZiAoY3R4ICYmIGN0eCE9PWNoaWxkcmVuKSBmbiA9IGZuLmJpbmQoY3R4KTtcblx0XHRjaGlsZHJlbi5mb3JFYWNoKGZuKTtcblx0fSxcblx0Y291bnQoY2hpbGRyZW4pIHtcblx0XHRjaGlsZHJlbiA9IENoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pO1xuXHRcdHJldHVybiBjaGlsZHJlbi5sZW5ndGg7XG5cdH0sXG5cdG9ubHkoY2hpbGRyZW4pIHtcblx0XHRjaGlsZHJlbiA9IENoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pO1xuXHRcdGlmIChjaGlsZHJlbi5sZW5ndGghPT0xKSB0aHJvdyBuZXcgRXJyb3IoJ0NoaWxkcmVuLm9ubHkoKSBleHBlY3RzIG9ubHkgb25lIGNoaWxkLicpO1xuXHRcdHJldHVybiBjaGlsZHJlblswXTtcblx0fSxcblx0dG9BcnJheShjaGlsZHJlbikge1xuXHRcdHJldHVybiBBcnJheS5pc0FycmF5ICYmIEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pID8gY2hpbGRyZW4gOiBBUlIuY29uY2F0KGNoaWxkcmVuKTtcblx0fVxufTtcblxuXG4vKiogVHJhY2sgY3VycmVudCByZW5kZXIoKSBjb21wb25lbnQgZm9yIHJlZiBhc3NpZ25tZW50ICovXG5sZXQgY3VycmVudENvbXBvbmVudDtcblxuXG5mdW5jdGlvbiBjcmVhdGVGYWN0b3J5KHR5cGUpIHtcblx0cmV0dXJuIGNyZWF0ZUVsZW1lbnQuYmluZChudWxsLCB0eXBlKTtcbn1cblxuXG5sZXQgRE9NID0ge307XG5mb3IgKGxldCBpPUVMRU1FTlRTLmxlbmd0aDsgaS0tOyApIHtcblx0RE9NW0VMRU1FTlRTW2ldXSA9IGNyZWF0ZUZhY3RvcnkoRUxFTUVOVFNbaV0pO1xufVxuXG5mdW5jdGlvbiB1cGdyYWRlVG9WTm9kZXMoYXJyLCBvZmZzZXQpIHtcblx0Zm9yIChsZXQgaT1vZmZzZXQgfHwgMDsgaTxhcnIubGVuZ3RoOyBpKyspIHtcblx0XHRsZXQgb2JqID0gYXJyW2ldO1xuXHRcdGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcblx0XHRcdHVwZ3JhZGVUb1ZOb2RlcyhvYmopO1xuXHRcdH1cblx0XHRlbHNlIGlmIChvYmogJiYgdHlwZW9mIG9iaj09PSdvYmplY3QnICYmICFpc1ZhbGlkRWxlbWVudChvYmopICYmICgob2JqLnByb3BzICYmIG9iai50eXBlKSB8fCAob2JqLmF0dHJpYnV0ZXMgJiYgb2JqLm5vZGVOYW1lKSB8fCBvYmouY2hpbGRyZW4pKSB7XG5cdFx0XHRhcnJbaV0gPSBjcmVhdGVFbGVtZW50KG9iai50eXBlIHx8IG9iai5ub2RlTmFtZSwgb2JqLnByb3BzIHx8IG9iai5hdHRyaWJ1dGVzLCBvYmouY2hpbGRyZW4pO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBpc1N0YXRlbGVzc0NvbXBvbmVudChjKSB7XG5cdHJldHVybiB0eXBlb2YgYz09PSdmdW5jdGlvbicgJiYgIShjLnByb3RvdHlwZSAmJiBjLnByb3RvdHlwZS5yZW5kZXIpO1xufVxuXG5cbmNvbnN0IENPTVBPTkVOVF9XUkFQUEVSX0tFWSA9IHR5cGVvZiBTeW1ib2whPT0ndW5kZWZpbmVkJyA/IFN5bWJvbC5mb3IoJ19fcHJlYWN0Q29tcGF0V3JhcHBlcicpIDogJ19fcHJlYWN0Q29tcGF0V3JhcHBlcic7XG5cbi8vIHdyYXBzIHN0YXRlbGVzcyBmdW5jdGlvbmFsIGNvbXBvbmVudHMgaW4gYSBQcm9wVHlwZXMgdmFsaWRhdG9yXG5mdW5jdGlvbiB3cmFwU3RhdGVsZXNzQ29tcG9uZW50KFdyYXBwZWRDb21wb25lbnQpIHtcblx0cmV0dXJuIGNyZWF0ZUNsYXNzKHtcblx0XHRkaXNwbGF5TmFtZTogV3JhcHBlZENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBXcmFwcGVkQ29tcG9uZW50Lm5hbWUsXG5cdFx0cmVuZGVyKHByb3BzLCBzdGF0ZSwgY29udGV4dCkge1xuXHRcdFx0cmV0dXJuIFdyYXBwZWRDb21wb25lbnQocHJvcHMsIGNvbnRleHQpO1xuXHRcdH1cblx0fSk7XG59XG5cblxuZnVuY3Rpb24gc3RhdGVsZXNzQ29tcG9uZW50SG9vayhDdG9yKSB7XG5cdGxldCBXcmFwcGVkID0gQ3RvcltDT01QT05FTlRfV1JBUFBFUl9LRVldO1xuXHRpZiAoV3JhcHBlZCkgcmV0dXJuIFdyYXBwZWQ9PT10cnVlID8gQ3RvciA6IFdyYXBwZWQ7XG5cblx0V3JhcHBlZCA9IHdyYXBTdGF0ZWxlc3NDb21wb25lbnQoQ3Rvcik7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KFdyYXBwZWQsIENPTVBPTkVOVF9XUkFQUEVSX0tFWSwgeyBjb25maWd1cmFibGU6dHJ1ZSwgdmFsdWU6dHJ1ZSB9KTtcblx0V3JhcHBlZC5kaXNwbGF5TmFtZSA9IEN0b3IuZGlzcGxheU5hbWU7XG5cdFdyYXBwZWQucHJvcFR5cGVzID0gQ3Rvci5wcm9wVHlwZXM7XG5cdFdyYXBwZWQuZGVmYXVsdFByb3BzID0gQ3Rvci5kZWZhdWx0UHJvcHM7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KEN0b3IsIENPTVBPTkVOVF9XUkFQUEVSX0tFWSwgeyBjb25maWd1cmFibGU6dHJ1ZSwgdmFsdWU6V3JhcHBlZCB9KTtcblxuXHRyZXR1cm4gV3JhcHBlZDtcbn1cblxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KC4uLmFyZ3MpIHtcblx0dXBncmFkZVRvVk5vZGVzKGFyZ3MsIDIpO1xuXHRyZXR1cm4gbm9ybWFsaXplVk5vZGUoaCguLi5hcmdzKSk7XG59XG5cblxuZnVuY3Rpb24gbm9ybWFsaXplVk5vZGUodm5vZGUpIHtcblx0dm5vZGUucHJlYWN0Q29tcGF0Tm9ybWFsaXplZCA9IHRydWU7XG5cblx0YXBwbHlDbGFzc05hbWUodm5vZGUpO1xuXG5cdGlmIChpc1N0YXRlbGVzc0NvbXBvbmVudCh2bm9kZS5ub2RlTmFtZSkpIHtcblx0XHR2bm9kZS5ub2RlTmFtZSA9IHN0YXRlbGVzc0NvbXBvbmVudEhvb2sodm5vZGUubm9kZU5hbWUpO1xuXHR9XG5cblx0bGV0IHJlZiA9IHZub2RlLmF0dHJpYnV0ZXMucmVmLFxuXHRcdHR5cGUgPSByZWYgJiYgdHlwZW9mIHJlZjtcblx0aWYgKGN1cnJlbnRDb21wb25lbnQgJiYgKHR5cGU9PT0nc3RyaW5nJyB8fCB0eXBlPT09J251bWJlcicpKSB7XG5cdFx0dm5vZGUuYXR0cmlidXRlcy5yZWYgPSBjcmVhdGVTdHJpbmdSZWZQcm94eShyZWYsIGN1cnJlbnRDb21wb25lbnQpO1xuXHR9XG5cblx0YXBwbHlFdmVudE5vcm1hbGl6YXRpb24odm5vZGUpO1xuXG5cdHJldHVybiB2bm9kZTtcbn1cblxuXG5mdW5jdGlvbiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgcHJvcHMsIC4uLmNoaWxkcmVuKSB7XG5cdGlmICghaXNWYWxpZEVsZW1lbnQoZWxlbWVudCkpIHJldHVybiBlbGVtZW50O1xuXHRsZXQgZWxlbWVudFByb3BzID0gZWxlbWVudC5hdHRyaWJ1dGVzIHx8IGVsZW1lbnQucHJvcHM7XG5cdGxldCBub2RlID0gaChcblx0XHRlbGVtZW50Lm5vZGVOYW1lIHx8IGVsZW1lbnQudHlwZSxcblx0XHRlbGVtZW50UHJvcHMsXG5cdFx0ZWxlbWVudC5jaGlsZHJlbiB8fCBlbGVtZW50UHJvcHMgJiYgZWxlbWVudFByb3BzLmNoaWxkcmVuXG5cdCk7XG5cdHJldHVybiBub3JtYWxpemVWTm9kZShwcmVhY3RDbG9uZUVsZW1lbnQobm9kZSwgcHJvcHMsIC4uLmNoaWxkcmVuKSk7XG59XG5cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnQoZWxlbWVudCkge1xuXHRyZXR1cm4gZWxlbWVudCAmJiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBWTm9kZSkgfHwgZWxlbWVudC4kJHR5cGVvZj09PVJFQUNUX0VMRU1FTlRfVFlQRSk7XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlU3RyaW5nUmVmUHJveHkobmFtZSwgY29tcG9uZW50KSB7XG5cdHJldHVybiBjb21wb25lbnQuX3JlZlByb3hpZXNbbmFtZV0gfHwgKGNvbXBvbmVudC5fcmVmUHJveGllc1tuYW1lXSA9IHJlc29sdmVkID0+IHtcblx0XHRpZiAoY29tcG9uZW50ICYmIGNvbXBvbmVudC5yZWZzKSB7XG5cdFx0XHRjb21wb25lbnQucmVmc1tuYW1lXSA9IHJlc29sdmVkO1xuXHRcdFx0aWYgKHJlc29sdmVkPT09bnVsbCkge1xuXHRcdFx0XHRkZWxldGUgY29tcG9uZW50Ll9yZWZQcm94aWVzW25hbWVdO1xuXHRcdFx0XHRjb21wb25lbnQgPSBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cblxuZnVuY3Rpb24gYXBwbHlFdmVudE5vcm1hbGl6YXRpb24oeyBub2RlTmFtZSwgYXR0cmlidXRlcyB9KSB7XG5cdGlmICghYXR0cmlidXRlcyB8fCB0eXBlb2Ygbm9kZU5hbWUhPT0nc3RyaW5nJykgcmV0dXJuO1xuXHRsZXQgcHJvcHMgPSB7fTtcblx0Zm9yIChsZXQgaSBpbiBhdHRyaWJ1dGVzKSB7XG5cdFx0cHJvcHNbaS50b0xvd2VyQ2FzZSgpXSA9IGk7XG5cdH1cblx0aWYgKHByb3BzLm9uY2hhbmdlKSB7XG5cdFx0bm9kZU5hbWUgPSBub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdGxldCBhdHRyID0gbm9kZU5hbWU9PT0naW5wdXQnICYmIFN0cmluZyhhdHRyaWJ1dGVzLnR5cGUpLnRvTG93ZXJDYXNlKCk9PT0nY2hlY2tib3gnID8gJ29uY2xpY2snIDogJ29uaW5wdXQnLFxuXHRcdFx0bm9ybWFsaXplZCA9IHByb3BzW2F0dHJdIHx8IGF0dHI7XG5cdFx0aWYgKCFhdHRyaWJ1dGVzW25vcm1hbGl6ZWRdKSB7XG5cdFx0XHRhdHRyaWJ1dGVzW25vcm1hbGl6ZWRdID0gbXVsdGlob29rKFthdHRyaWJ1dGVzW3Byb3BzW2F0dHJdXSwgYXR0cmlidXRlc1twcm9wcy5vbmNoYW5nZV1dKTtcblx0XHR9XG5cdH1cbn1cblxuXG5mdW5jdGlvbiBhcHBseUNsYXNzTmFtZSh7IGF0dHJpYnV0ZXMgfSkge1xuXHRpZiAoIWF0dHJpYnV0ZXMpIHJldHVybjtcblx0bGV0IGNsID0gYXR0cmlidXRlcy5jbGFzc05hbWUgfHwgYXR0cmlidXRlcy5jbGFzcztcblx0aWYgKGNsKSBhdHRyaWJ1dGVzLmNsYXNzTmFtZSA9IGNsO1xufVxuXG5cbmZ1bmN0aW9uIGV4dGVuZChiYXNlLCBwcm9wcykge1xuXHRmb3IgKGxldCBrZXkgaW4gcHJvcHMpIHtcblx0XHRpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0YmFzZVtrZXldID0gcHJvcHNba2V5XTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGJhc2U7XG59XG5cblxuZnVuY3Rpb24gc2hhbGxvd0RpZmZlcnMoYSwgYikge1xuXHRmb3IgKGxldCBpIGluIGEpIGlmICghKGkgaW4gYikpIHJldHVybiB0cnVlO1xuXHRmb3IgKGxldCBpIGluIGIpIGlmIChhW2ldIT09YltpXSkgcmV0dXJuIHRydWU7XG5cdHJldHVybiBmYWxzZTtcbn1cblxuXG5sZXQgZmluZERPTU5vZGUgPSBjb21wb25lbnQgPT4gY29tcG9uZW50ICYmIGNvbXBvbmVudC5iYXNlIHx8IGNvbXBvbmVudDtcblxuXG5mdW5jdGlvbiBGKCl7fVxuXG5mdW5jdGlvbiBjcmVhdGVDbGFzcyhvYmopIHtcblx0bGV0IG1peGlucyA9IG9iai5taXhpbnMgJiYgY29sbGF0ZU1peGlucyhvYmoubWl4aW5zKTtcblxuXHRmdW5jdGlvbiBjbChwcm9wcywgY29udGV4dCkge1xuXHRcdGV4dGVuZCh0aGlzLCBvYmopO1xuXHRcdGlmIChtaXhpbnMpIGFwcGx5TWl4aW5zKHRoaXMsIG1peGlucyk7XG5cdFx0YmluZEFsbCh0aGlzKTtcblx0XHRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCwgQllQQVNTX0hPT0spO1xuXHRcdG5ld0NvbXBvbmVudEhvb2suY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCk7XG5cdH1cblxuXHRpZiAob2JqLnN0YXRpY3MpIHtcblx0XHRleHRlbmQoY2wsIG9iai5zdGF0aWNzKTtcblx0fVxuXHRpZiAob2JqLnByb3BUeXBlcykge1xuXHRcdGNsLnByb3BUeXBlcyA9IG9iai5wcm9wVHlwZXM7XG5cdH1cblx0aWYgKG9iai5kZWZhdWx0UHJvcHMpIHtcblx0XHRjbC5kZWZhdWx0UHJvcHMgPSBvYmouZGVmYXVsdFByb3BzO1xuXHR9XG5cdGlmIChvYmouZ2V0RGVmYXVsdFByb3BzKSB7XG5cdFx0Y2wuZGVmYXVsdFByb3BzID0gb2JqLmdldERlZmF1bHRQcm9wcygpO1xuXHR9XG5cblx0Ri5wcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuXHRjbC5wcm90b3R5cGUgPSBuZXcgRigpO1xuXHRjbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjbDtcblxuXHRjbC5kaXNwbGF5TmFtZSA9IG9iai5kaXNwbGF5TmFtZSB8fCAnQ29tcG9uZW50JztcblxuXHRyZXR1cm4gY2w7XG59XG5cblxuLy8gRmxhdHRlbiBhbiBBcnJheSBvZiBtaXhpbnMgdG8gYSBtYXAgb2YgbWV0aG9kIG5hbWUgdG8gbWl4aW4gaW1wbGVtZW50YXRpb25zXG5mdW5jdGlvbiBjb2xsYXRlTWl4aW5zKG1peGlucykge1xuXHRsZXQga2V5ZWQgPSB7fTtcblx0Zm9yIChsZXQgaT0wOyBpPG1peGlucy5sZW5ndGg7IGkrKykge1xuXHRcdGxldCBtaXhpbiA9IG1peGluc1tpXTtcblx0XHRmb3IgKGxldCBrZXkgaW4gbWl4aW4pIHtcblx0XHRcdGlmIChtaXhpbi5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHR5cGVvZiBtaXhpbltrZXldPT09J2Z1bmN0aW9uJykge1xuXHRcdFx0XHQoa2V5ZWRba2V5XSB8fCAoa2V5ZWRba2V5XT1bXSkpLnB1c2gobWl4aW5ba2V5XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBrZXllZDtcbn1cblxuXG4vLyBhcHBseSBhIG1hcHBpbmcgb2YgQXJyYXlzIG9mIG1peGluIG1ldGhvZHMgdG8gYSBjb21wb25lbnQgaW5zdGFuY2VcbmZ1bmN0aW9uIGFwcGx5TWl4aW5zKGluc3QsIG1peGlucykge1xuXHRmb3IgKGxldCBrZXkgaW4gbWl4aW5zKSBpZiAobWl4aW5zLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRpbnN0W2tleV0gPSBtdWx0aWhvb2sobWl4aW5zW2tleV0uY29uY2F0KGluc3Rba2V5XSB8fCBrZXkpKTtcblx0fVxufVxuXG5cbmZ1bmN0aW9uIGJpbmRBbGwoY3R4KSB7XG5cdGZvciAobGV0IGkgaW4gY3R4KSB7XG5cdFx0bGV0IHYgPSBjdHhbaV07XG5cdFx0aWYgKHR5cGVvZiB2PT09J2Z1bmN0aW9uJyAmJiAhdi5fX2JvdW5kICYmICFBVVRPQklORF9CTEFDS0xJU1QuaGFzT3duUHJvcGVydHkoaSkpIHtcblx0XHRcdChjdHhbaV0gPSB2LmJpbmQoY3R4KSkuX19ib3VuZCA9IHRydWU7XG5cdFx0fVxuXHR9XG59XG5cblxuZnVuY3Rpb24gY2FsbE1ldGhvZChjdHgsIG0sIGFyZ3MpIHtcblx0aWYgKHR5cGVvZiBtPT09J3N0cmluZycpIHtcblx0XHRtID0gY3R4LmNvbnN0cnVjdG9yLnByb3RvdHlwZVttXTtcblx0fVxuXHRpZiAodHlwZW9mIG09PT0nZnVuY3Rpb24nKSB7XG5cdFx0cmV0dXJuIG0uYXBwbHkoY3R4LCBhcmdzKTtcblx0fVxufVxuXG5mdW5jdGlvbiBtdWx0aWhvb2soaG9va3MpIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdGxldCByZXQ7XG5cdFx0Zm9yIChsZXQgaT0wOyBpPGhvb2tzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRsZXQgciA9IGNhbGxNZXRob2QodGhpcywgaG9va3NbaV0sIGFyZ3VtZW50cyk7XG5cdFx0XHRpZiAodHlwZW9mIHIhPT0ndW5kZWZpbmVkJykgcmV0ID0gcjtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn1cblxuXG5mdW5jdGlvbiBuZXdDb21wb25lbnRIb29rKHByb3BzLCBjb250ZXh0KSB7XG5cdHByb3BzSG9vay5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KTtcblx0dGhpcy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gbXVsdGlob29rKFtwcm9wc0hvb2ssIHRoaXMuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB8fCAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyddKTtcblx0dGhpcy5yZW5kZXIgPSBtdWx0aWhvb2soW3Byb3BzSG9vaywgYmVmb3JlUmVuZGVyLCB0aGlzLnJlbmRlciB8fCAncmVuZGVyJywgYWZ0ZXJSZW5kZXJdKTtcbn1cblxuXG5mdW5jdGlvbiBwcm9wc0hvb2socHJvcHMsIGNvbnRleHQpIHtcblx0aWYgKCFwcm9wcykgcmV0dXJuO1xuXG5cdC8vIFJlYWN0IGFubm95aW5nbHkgc3BlY2lhbC1jYXNlcyBzaW5nbGUgY2hpbGRyZW4sIGFuZCBzb21lIHJlYWN0IGNvbXBvbmVudHMgYXJlIHJpZGljdWxvdXNseSBzdHJpY3QgYWJvdXQgdGhpcy5cblx0bGV0IGMgPSBwcm9wcy5jaGlsZHJlbjtcblx0aWYgKGMgJiYgQXJyYXkuaXNBcnJheShjKSAmJiBjLmxlbmd0aD09PTEpIHtcblx0XHRwcm9wcy5jaGlsZHJlbiA9IGNbMF07XG5cblx0XHQvLyBidXQgaXRzIHRvdGFsbHkgc3RpbGwgZ29pbmcgdG8gYmUgYW4gQXJyYXkuXG5cdFx0aWYgKHByb3BzLmNoaWxkcmVuICYmIHR5cGVvZiBwcm9wcy5jaGlsZHJlbj09PSdvYmplY3QnKSB7XG5cdFx0XHRwcm9wcy5jaGlsZHJlbi5sZW5ndGggPSAxO1xuXHRcdFx0cHJvcHMuY2hpbGRyZW5bMF0gPSBwcm9wcy5jaGlsZHJlbjtcblx0XHR9XG5cdH1cblxuXHQvLyBhZGQgcHJvcHR5cGUgY2hlY2tpbmdcblx0aWYgKERFVikge1xuXHRcdGxldCBjdG9yID0gdHlwZW9mIHRoaXM9PT0nZnVuY3Rpb24nID8gdGhpcyA6IHRoaXMuY29uc3RydWN0b3IsXG5cdFx0XHRwcm9wVHlwZXMgPSB0aGlzLnByb3BUeXBlcyB8fCBjdG9yLnByb3BUeXBlcztcblx0XHRpZiAocHJvcFR5cGVzKSB7XG5cdFx0XHRmb3IgKGxldCBwcm9wIGluIHByb3BUeXBlcykge1xuXHRcdFx0XHRpZiAocHJvcFR5cGVzLmhhc093blByb3BlcnR5KHByb3ApICYmIHR5cGVvZiBwcm9wVHlwZXNbcHJvcF09PT0nZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0Y29uc3QgZGlzcGxheU5hbWUgPSB0aGlzLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZTtcblx0XHRcdFx0XHRsZXQgZXJyID0gcHJvcFR5cGVzW3Byb3BdKHByb3BzLCBwcm9wLCBkaXNwbGF5TmFtZSwgJ3Byb3AnKTtcblx0XHRcdFx0XHRpZiAoZXJyKSBjb25zb2xlLmVycm9yKG5ldyBFcnJvcihlcnIubWVzc2FnZSB8fCBlcnIpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5cbmZ1bmN0aW9uIGJlZm9yZVJlbmRlcihwcm9wcykge1xuXHRjdXJyZW50Q29tcG9uZW50ID0gdGhpcztcbn1cblxuZnVuY3Rpb24gYWZ0ZXJSZW5kZXIoKSB7XG5cdGlmIChjdXJyZW50Q29tcG9uZW50PT09dGhpcykge1xuXHRcdGN1cnJlbnRDb21wb25lbnQgPSBudWxsO1xuXHR9XG59XG5cblxuXG5mdW5jdGlvbiBDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIG9wdHMpIHtcblx0UHJlYWN0Q29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpO1xuXHRpZiAodGhpcy5nZXRJbml0aWFsU3RhdGUpIHRoaXMuc3RhdGUgPSB0aGlzLmdldEluaXRpYWxTdGF0ZSgpO1xuXHR0aGlzLnJlZnMgPSB7fTtcblx0dGhpcy5fcmVmUHJveGllcyA9IHt9O1xuXHRpZiAob3B0cyE9PUJZUEFTU19IT09LKSB7XG5cdFx0bmV3Q29tcG9uZW50SG9vay5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KTtcblx0fVxufVxuQ29tcG9uZW50LnByb3RvdHlwZSA9IG5ldyBQcmVhY3RDb21wb25lbnQoKTtcbmV4dGVuZChDb21wb25lbnQucHJvdG90eXBlLCB7XG5cdGNvbnN0cnVjdG9yOiBDb21wb25lbnQsXG5cblx0aXNSZWFjdENvbXBvbmVudDoge30sXG5cblx0cmVwbGFjZVN0YXRlKHN0YXRlLCBjYWxsYmFjaykge1xuXHRcdHRoaXMuc2V0U3RhdGUoc3RhdGUsIGNhbGxiYWNrKTtcblx0XHRmb3IgKGxldCBpIGluIHRoaXMuc3RhdGUpIHtcblx0XHRcdGlmICghKGkgaW4gc3RhdGUpKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLnN0YXRlW2ldO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRnZXRET01Ob2RlKCkge1xuXHRcdHJldHVybiB0aGlzLmJhc2U7XG5cdH0sXG5cblx0aXNNb3VudGVkKCkge1xuXHRcdHJldHVybiAhIXRoaXMuYmFzZTtcblx0fVxufSk7XG5cblxuXG5mdW5jdGlvbiBQdXJlQ29tcG9uZW50KHByb3BzLCBjb250ZXh0KSB7XG5cdENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KTtcbn1cblB1cmVDb21wb25lbnQucHJvdG90eXBlID0gbmV3IENvbXBvbmVudCh7fSwge30sIEJZUEFTU19IT09LKTtcblB1cmVDb21wb25lbnQucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IGZ1bmN0aW9uKHByb3BzLCBzdGF0ZSkge1xuXHRyZXR1cm4gc2hhbGxvd0RpZmZlcnModGhpcy5wcm9wcywgcHJvcHMpIHx8IHNoYWxsb3dEaWZmZXJzKHRoaXMuc3RhdGUsIHN0YXRlKTtcbn07XG5cblxuXG5leHBvcnQge1xuXHR2ZXJzaW9uLFxuXHRET00sXG5cdFByb3BUeXBlcyxcblx0Q2hpbGRyZW4sXG5cdHJlbmRlcixcblx0Y3JlYXRlQ2xhc3MsXG5cdGNyZWF0ZUZhY3RvcnksXG5cdGNyZWF0ZUVsZW1lbnQsXG5cdGNsb25lRWxlbWVudCxcblx0aXNWYWxpZEVsZW1lbnQsXG5cdGZpbmRET01Ob2RlLFxuXHR1bm1vdW50Q29tcG9uZW50QXROb2RlLFxuXHRDb21wb25lbnQsXG5cdFB1cmVDb21wb25lbnQsXG5cdHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyIGFzIHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyXG59O1xuXG5leHBvcnQgZGVmYXVsdCB7XG5cdHZlcnNpb24sXG5cdERPTSxcblx0UHJvcFR5cGVzLFxuXHRDaGlsZHJlbixcblx0cmVuZGVyLFxuXHRjcmVhdGVDbGFzcyxcblx0Y3JlYXRlRmFjdG9yeSxcblx0Y3JlYXRlRWxlbWVudCxcblx0Y2xvbmVFbGVtZW50LFxuXHRpc1ZhbGlkRWxlbWVudCxcblx0ZmluZERPTU5vZGUsXG5cdHVubW91bnRDb21wb25lbnRBdE5vZGUsXG5cdENvbXBvbmVudCxcblx0UHVyZUNvbXBvbmVudCxcblx0dW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXI6IHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyXG59O1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi4vc3JjL2luZGV4LmpzXG4gKiovIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogKHdlYnBhY2spL34vbm9kZS1saWJzLWJyb3dzZXIvfi9wcm9jZXNzL2Jyb3dzZXIuanNcbiAqKiBtb2R1bGUgaWQgPSA0MFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIFJlYWN0UHJvcFR5cGVzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudCB0eXBlLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID1cbiAgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvciAmJiBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykpIHx8XG4gIDB4ZWFjNztcblxudmFyIFJlYWN0RWxlbWVudCA9IHt9O1xuXG4vKipcbiAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgdmFsaWQgY29tcG9uZW50LlxuICogQGZpbmFsXG4gKi9cblJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudCA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG4gICAgb2JqZWN0ICE9PSBudWxsICYmXG4gICAgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEVcbiAgKTtcbn07XG5cbnZhciBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcyA9IHtcbiAgcHJvcDogJ3Byb3AnLFxuICBjb250ZXh0OiAnY29udGV4dCcsXG4gIGNoaWxkQ29udGV4dDogJ2NoaWxkIGNvbnRleHQnLFxufTtcblxuXG5cblxudmFyIGVtcHR5RnVuY3Rpb24gPSB7XG4gIHRoYXRSZXR1cm5zOiBmdW5jdGlvbih3aGF0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCl7IHJldHVybiB3aGF0OyB9O1xuICB9XG59O1xuXG5cblxudmFyIElURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InOyAvLyBCZWZvcmUgU3ltYm9sIHNwZWMuXG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgdmFyIGl0ZXJhdG9yRm4gPSBtYXliZUl0ZXJhYmxlICYmIChcbiAgICAoSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbSVRFUkFUT1JfU1lNQk9MXSkgfHxcbiAgICBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXVxuICApO1xuICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gaXRlcmF0b3JGbjtcbiAgfVxufVxuXG5cblxuLyoqXG4gKiBDb2xsZWN0aW9uIG9mIG1ldGhvZHMgdGhhdCBhbGxvdyBkZWNsYXJhdGlvbiBhbmQgdmFsaWRhdGlvbiBvZiBwcm9wcyB0aGF0IGFyZVxuICogc3VwcGxpZWQgdG8gUmVhY3QgY29tcG9uZW50cy4gRXhhbXBsZSB1c2FnZTpcbiAqXG4gKiAgIHZhciBQcm9wcyA9IHJlcXVpcmUoJ1JlYWN0UHJvcFR5cGVzJyk7XG4gKiAgIHZhciBNeUFydGljbGUgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gKiAgICAgcHJvcFR5cGVzOiB7XG4gKiAgICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgcHJvcCBuYW1lZCBcImRlc2NyaXB0aW9uXCIuXG4gKiAgICAgICBkZXNjcmlwdGlvbjogUHJvcHMuc3RyaW5nLFxuICpcbiAqICAgICAgIC8vIEEgcmVxdWlyZWQgZW51bSBwcm9wIG5hbWVkIFwiY2F0ZWdvcnlcIi5cbiAqICAgICAgIGNhdGVnb3J5OiBQcm9wcy5vbmVPZihbJ05ld3MnLCdQaG90b3MnXSkuaXNSZXF1aXJlZCxcbiAqXG4gKiAgICAgICAvLyBBIHByb3AgbmFtZWQgXCJkaWFsb2dcIiB0aGF0IHJlcXVpcmVzIGFuIGluc3RhbmNlIG9mIERpYWxvZy5cbiAqICAgICAgIGRpYWxvZzogUHJvcHMuaW5zdGFuY2VPZihEaWFsb2cpLmlzUmVxdWlyZWRcbiAqICAgICB9LFxuICogICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7IC4uLiB9XG4gKiAgIH0pO1xuICpcbiAqIEEgbW9yZSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBob3cgdGhlc2UgbWV0aG9kcyBhcmUgdXNlZDpcbiAqXG4gKiAgIHR5cGUgOj0gYXJyYXl8Ym9vbHxmdW5jfG9iamVjdHxudW1iZXJ8c3RyaW5nfG9uZU9mKFsuLi5dKXxpbnN0YW5jZU9mKC4uLilcbiAqICAgZGVjbCA6PSBSZWFjdFByb3BUeXBlcy57dHlwZX0oLmlzUmVxdWlyZWQpP1xuICpcbiAqIEVhY2ggYW5kIGV2ZXJ5IGRlY2xhcmF0aW9uIHByb2R1Y2VzIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUuIFRoaXNcbiAqIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25zLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgdmFyIE15TGluayA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAqICAgIHByb3BUeXBlczoge1xuICogICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgb3IgVVJJIHByb3AgbmFtZWQgXCJocmVmXCIuXG4gKiAgICAgIGhyZWY6IGZ1bmN0aW9uKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICogICAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gKiAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSBudWxsICYmIHR5cGVvZiBwcm9wVmFsdWUgIT09ICdzdHJpbmcnICYmXG4gKiAgICAgICAgICAgICEocHJvcFZhbHVlIGluc3RhbmNlb2YgVVJJKSkge1xuICogICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcbiAqICAgICAgICAgICAgJ0V4cGVjdGVkIGEgc3RyaW5nIG9yIGFuIFVSSSBmb3IgJyArIHByb3BOYW1lICsgJyBpbiAnICtcbiAqICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICogICAgICAgICAgKTtcbiAqICAgICAgICB9XG4gKiAgICAgIH1cbiAqICAgIH0sXG4gKiAgICByZW5kZXI6IGZ1bmN0aW9uKCkgey4uLn1cbiAqICB9KTtcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgQU5PTllNT1VTID0gJzw8YW5vbnltb3VzPj4nO1xuXG52YXIgUmVhY3RQcm9wVHlwZXMgPSB7XG4gIGFycmF5OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYXJyYXknKSxcbiAgYm9vbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Jvb2xlYW4nKSxcbiAgZnVuYzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Z1bmN0aW9uJyksXG4gIG51bWJlcjogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ251bWJlcicpLFxuICBvYmplY3Q6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdvYmplY3QnKSxcbiAgc3RyaW5nOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignc3RyaW5nJyksXG5cbiAgYW55OiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpLFxuICBhcnJheU9mOiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIsXG4gIGVsZW1lbnQ6IGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpLFxuICBpbnN0YW5jZU9mOiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyLFxuICBub2RlOiBjcmVhdGVOb2RlQ2hlY2tlcigpLFxuICBvYmplY3RPZjogY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcixcbiAgb25lT2Y6IGNyZWF0ZUVudW1UeXBlQ2hlY2tlcixcbiAgb25lT2ZUeXBlOiBjcmVhdGVVbmlvblR5cGVDaGVja2VyLFxuICBzaGFwZTogY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcixcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKSB7XG4gIGZ1bmN0aW9uIGNoZWNrVHlwZShcbiAgICBpc1JlcXVpcmVkLFxuICAgIHByb3BzLFxuICAgIHByb3BOYW1lLFxuICAgIGNvbXBvbmVudE5hbWUsXG4gICAgbG9jYXRpb24sXG4gICAgcHJvcEZ1bGxOYW1lXG4gICkge1xuICAgIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lIHx8IEFOT05ZTU9VUztcbiAgICBwcm9wRnVsbE5hbWUgPSBwcm9wRnVsbE5hbWUgfHwgcHJvcE5hbWU7XG4gICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgICAgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICAgICAgICBgUmVxdWlyZWQgJHtsb2NhdGlvbk5hbWV9IFxcYCR7cHJvcEZ1bGxOYW1lfVxcYCB3YXMgbm90IHNwZWNpZmllZCBpbiBgICtcbiAgICAgICAgICBgXFxgJHtjb21wb25lbnROYW1lfVxcYC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoYWluZWRDaGVja1R5cGUgPSBjaGVja1R5cGUuYmluZChudWxsLCBmYWxzZSk7XG4gIGNoYWluZWRDaGVja1R5cGUuaXNSZXF1aXJlZCA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIHRydWUpO1xuXG4gIHJldHVybiBjaGFpbmVkQ2hlY2tUeXBlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcihleHBlY3RlZFR5cGUpIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgIGlmIChwcm9wVHlwZSAhPT0gZXhwZWN0ZWRUeXBlKSB7XG4gICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgICAgLy8gYHByb3BWYWx1ZWAgYmVpbmcgaW5zdGFuY2Ugb2YsIHNheSwgZGF0ZS9yZWdleHAsIHBhc3MgdGhlICdvYmplY3QnXG4gICAgICAvLyBjaGVjaywgYnV0IHdlIGNhbiBvZmZlciBhIG1vcmUgcHJlY2lzZSBlcnJvciBtZXNzYWdlIGhlcmUgcmF0aGVyIHRoYW5cbiAgICAgIC8vICdvZiB0eXBlIGBvYmplY3RgJy5cbiAgICAgIHZhciBwcmVjaXNlVHlwZSA9IGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSk7XG5cbiAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkICR7bG9jYXRpb25OYW1lfSBcXGAke3Byb3BGdWxsTmFtZX1cXGAgb2YgdHlwZSBgICtcbiAgICAgICAgYFxcYCR7cHJlY2lzZVR5cGV9XFxgIHN1cHBsaWVkIHRvIFxcYCR7Y29tcG9uZW50TmFtZX1cXGAsIGV4cGVjdGVkIGAgK1xuICAgICAgICBgXFxgJHtleHBlY3RlZFR5cGV9XFxgLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFueVR5cGVDaGVja2VyKCkge1xuICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIoZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJucyhudWxsKSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkICR7bG9jYXRpb25OYW1lfSBcXGAke3Byb3BGdWxsTmFtZX1cXGAgb2YgdHlwZSBgICtcbiAgICAgICAgYFxcYCR7cHJvcFR5cGV9XFxgIHN1cHBsaWVkIHRvIFxcYCR7Y29tcG9uZW50TmFtZX1cXGAsIGV4cGVjdGVkIGFuIGFycmF5LmBcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcFZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihcbiAgICAgICAgcHJvcFZhbHVlLFxuICAgICAgICBpLFxuICAgICAgICBjb21wb25lbnROYW1lLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgYCR7cHJvcEZ1bGxOYW1lfVske2l9XWBcbiAgICAgICk7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpIHtcbiAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgaWYgKCFSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQocHJvcHNbcHJvcE5hbWVdKSkge1xuICAgICAgdmFyIGxvY2F0aW9uTmFtZSA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXTtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkICR7bG9jYXRpb25OYW1lfSBcXGAke3Byb3BGdWxsTmFtZX1cXGAgc3VwcGxpZWQgdG8gYCArXG4gICAgICAgIGBcXGAke2NvbXBvbmVudE5hbWV9XFxgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcihleHBlY3RlZENsYXNzKSB7XG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIGlmICghKHByb3BzW3Byb3BOYW1lXSBpbnN0YW5jZW9mIGV4cGVjdGVkQ2xhc3MpKSB7XG4gICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgICAgdmFyIGV4cGVjdGVkQ2xhc3NOYW1lID0gZXhwZWN0ZWRDbGFzcy5uYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgIHZhciBhY3R1YWxDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUocHJvcHNbcHJvcE5hbWVdKTtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkICR7bG9jYXRpb25OYW1lfSBcXGAke3Byb3BGdWxsTmFtZX1cXGAgb2YgdHlwZSBgICtcbiAgICAgICAgYFxcYCR7YWN0dWFsQ2xhc3NOYW1lfVxcYCBzdXBwbGllZCB0byBcXGAke2NvbXBvbmVudE5hbWV9XFxgLCBleHBlY3RlZCBgICtcbiAgICAgICAgYGluc3RhbmNlIG9mIFxcYCR7ZXhwZWN0ZWRDbGFzc05hbWV9XFxgLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVudW1UeXBlQ2hlY2tlcihleHBlY3RlZFZhbHVlcykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwZWN0ZWRWYWx1ZXMpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LmBcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwZWN0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwcm9wVmFsdWUgPT09IGV4cGVjdGVkVmFsdWVzW2ldKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07XG4gICAgdmFyIHZhbHVlc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KGV4cGVjdGVkVmFsdWVzKTtcbiAgICByZXR1cm4gbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgJHtsb2NhdGlvbk5hbWV9IFxcYCR7cHJvcEZ1bGxOYW1lfVxcYCBvZiB2YWx1ZSBcXGAke3Byb3BWYWx1ZX1cXGAgYCArXG4gICAgICBgc3VwcGxpZWQgdG8gXFxgJHtjb21wb25lbnROYW1lfVxcYCwgZXhwZWN0ZWQgb25lIG9mICR7dmFsdWVzU3RyaW5nfS5gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgJHtsb2NhdGlvbk5hbWV9IFxcYCR7cHJvcEZ1bGxOYW1lfVxcYCBvZiB0eXBlIGAgK1xuICAgICAgICBgXFxgJHtwcm9wVHlwZX1cXGAgc3VwcGxpZWQgdG8gXFxgJHtjb21wb25lbnROYW1lfVxcYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LmBcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAodmFyIGtleSBpbiBwcm9wVmFsdWUpIHtcbiAgICAgIGlmIChwcm9wVmFsdWUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihcbiAgICAgICAgICBwcm9wVmFsdWUsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGNvbXBvbmVudE5hbWUsXG4gICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgYCR7cHJvcEZ1bGxOYW1lfS4ke2tleX1gXG4gICAgICAgICk7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIoYXJyYXlPZlR5cGVDaGVja2Vycykge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXlPZlR5cGVDaGVja2VycykpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LmBcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGVja2VyID0gYXJyYXlPZlR5cGVDaGVja2Vyc1tpXTtcbiAgICAgIGlmIChcbiAgICAgICAgY2hlY2tlcihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpID09IG51bGxcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCAke2xvY2F0aW9uTmFtZX0gXFxgJHtwcm9wRnVsbE5hbWV9XFxgIHN1cHBsaWVkIHRvIGAgK1xuICAgICAgYFxcYCR7Y29tcG9uZW50TmFtZX1cXGAuYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTm9kZUNoZWNrZXIoKSB7XG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIGlmICghaXNOb2RlKHByb3BzW3Byb3BOYW1lXSkpIHtcbiAgICAgIHZhciBsb2NhdGlvbk5hbWUgPSBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl07XG4gICAgICByZXR1cm4gbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCAke2xvY2F0aW9uTmFtZX0gXFxgJHtwcm9wRnVsbE5hbWV9XFxgIHN1cHBsaWVkIHRvIGAgK1xuICAgICAgICBgXFxgJHtjb21wb25lbnROYW1lfVxcYCwgZXhwZWN0ZWQgYSBSZWFjdE5vZGUuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgbG9jYXRpb25OYW1lID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dO1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgJHtsb2NhdGlvbk5hbWV9IFxcYCR7cHJvcEZ1bGxOYW1lfVxcYCBvZiB0eXBlIFxcYCR7cHJvcFR5cGV9XFxgIGAgK1xuICAgICAgICBgc3VwcGxpZWQgdG8gXFxgJHtjb21wb25lbnROYW1lfVxcYCwgZXhwZWN0ZWQgXFxgb2JqZWN0XFxgLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGZvciAodmFyIGtleSBpbiBzaGFwZVR5cGVzKSB7XG4gICAgICB2YXIgY2hlY2tlciA9IHNoYXBlVHlwZXNba2V5XTtcbiAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIoXG4gICAgICAgIHByb3BWYWx1ZSxcbiAgICAgICAga2V5LFxuICAgICAgICBjb21wb25lbnROYW1lLFxuICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgYCR7cHJvcEZ1bGxOYW1lfS4ke2tleX1gXG4gICAgICApO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbn1cblxuZnVuY3Rpb24gaXNOb2RlKHByb3BWYWx1ZSkge1xuICBzd2l0Y2ggKHR5cGVvZiBwcm9wVmFsdWUpIHtcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuICFwcm9wVmFsdWU7XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHByb3BWYWx1ZS5ldmVyeShpc05vZGUpO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCBSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKHByb3BWYWx1ZSk7XG4gICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwocHJvcFZhbHVlKTtcbiAgICAgICAgdmFyIHN0ZXA7XG4gICAgICAgIGlmIChpdGVyYXRvckZuICE9PSBwcm9wVmFsdWUuZW50cmllcykge1xuICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgIGlmICghaXNOb2RlKHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSXRlcmF0b3Igd2lsbCBwcm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1ZXMuXG4gICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICBpZiAoIWlzTm9kZShlbnRyeVsxXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vLyBFcXVpdmFsZW50IG9mIGB0eXBlb2ZgIGJ1dCB3aXRoIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFycmF5IGFuZCByZWdleHAuXG5mdW5jdGlvbiBnZXRQcm9wVHlwZShwcm9wVmFsdWUpIHtcbiAgdmFyIHByb3BUeXBlID0gdHlwZW9mIHByb3BWYWx1ZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgIHJldHVybiAnYXJyYXknO1xuICB9XG4gIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAvLyBPbGQgd2Via2l0cyAoYXQgbGVhc3QgdW50aWwgQW5kcm9pZCA0LjApIHJldHVybiAnZnVuY3Rpb24nIHJhdGhlciB0aGFuXG4gICAgLy8gJ29iamVjdCcgZm9yIHR5cGVvZiBhIFJlZ0V4cC4gV2UnbGwgbm9ybWFsaXplIHRoaXMgaGVyZSBzbyB0aGF0IC9ibGEvXG4gICAgLy8gcGFzc2VzIFByb3BUeXBlcy5vYmplY3QuXG4gICAgcmV0dXJuICdvYmplY3QnO1xuICB9XG4gIHJldHVybiBwcm9wVHlwZTtcbn1cblxuLy8gVGhpcyBoYW5kbGVzIG1vcmUgdHlwZXMgdGhhbiBgZ2V0UHJvcFR5cGVgLiBPbmx5IHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuLy8gU2VlIGBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcmAuXG5mdW5jdGlvbiBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpIHtcbiAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgaWYgKHByb3BUeXBlID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gJ2RhdGUnO1xuICAgIH0gZWxzZSBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcm9wVHlwZTtcbn1cblxuLy8gUmV0dXJucyBjbGFzcyBuYW1lIG9mIHRoZSBvYmplY3QsIGlmIGFueS5cbmZ1bmN0aW9uIGdldENsYXNzTmFtZShwcm9wVmFsdWUpIHtcbiAgaWYgKCFwcm9wVmFsdWUuY29uc3RydWN0b3IgfHwgIXByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lKSB7XG4gICAgcmV0dXJuIEFOT05ZTU9VUztcbiAgfVxuICByZXR1cm4gcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlYWN0UHJvcFR5cGVzO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogaW5kZXguanNcbiAqKi8iLCJpbXBvcnQgeyBWTm9kZSB9IGZyb20gJy4vdm5vZGUnO1xuaW1wb3J0IG9wdGlvbnMgZnJvbSAnLi9vcHRpb25zJztcblxuXG5jb25zdCBzdGFjayA9IFtdO1xuXG5cbi8qKiBKU1gvaHlwZXJzY3JpcHQgcmV2aXZlclxuKlx0QmVuY2htYXJrczogaHR0cHM6Ly9lc2JlbmNoLmNvbS9iZW5jaC81N2VlOGY4ZTMzMGFiMDk5MDBhMWExYTBcbiAqXHRAc2VlIGh0dHA6Ly9qYXNvbmZvcm1hdC5jb20vd3RmLWlzLWpzeFxuICpcdEBwdWJsaWNcbiAqICBAZXhhbXBsZVxuICogIC8qKiBAanN4IGggKlxcL1xuICogIGltcG9ydCB7IHJlbmRlciwgaCB9IGZyb20gJ3ByZWFjdCc7XG4gKiAgcmVuZGVyKDxzcGFuPmZvbzwvc3Bhbj4sIGRvY3VtZW50LmJvZHkpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gaChub2RlTmFtZSwgYXR0cmlidXRlcykge1xuXHRsZXQgY2hpbGRyZW4gPSBbXSxcblx0XHRsYXN0U2ltcGxlLCBjaGlsZCwgc2ltcGxlLCBpO1xuXHRmb3IgKGk9YXJndW1lbnRzLmxlbmd0aDsgaS0tID4gMjsgKSB7XG5cdFx0c3RhY2sucHVzaChhcmd1bWVudHNbaV0pO1xuXHR9XG5cdGlmIChhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMuY2hpbGRyZW4pIHtcblx0XHRpZiAoIXN0YWNrLmxlbmd0aCkgc3RhY2sucHVzaChhdHRyaWJ1dGVzLmNoaWxkcmVuKTtcblx0XHRkZWxldGUgYXR0cmlidXRlcy5jaGlsZHJlbjtcblx0fVxuXHR3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG5cdFx0aWYgKChjaGlsZCA9IHN0YWNrLnBvcCgpKSBpbnN0YW5jZW9mIEFycmF5KSB7XG5cdFx0XHRmb3IgKGk9Y2hpbGQubGVuZ3RoOyBpLS07ICkgc3RhY2sucHVzaChjaGlsZFtpXSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGNoaWxkIT1udWxsICYmIGNoaWxkIT09ZmFsc2UpIHtcblx0XHRcdGlmICh0eXBlb2YgY2hpbGQ9PSdudW1iZXInIHx8IGNoaWxkPT09dHJ1ZSkgY2hpbGQgPSBTdHJpbmcoY2hpbGQpO1xuXHRcdFx0c2ltcGxlID0gdHlwZW9mIGNoaWxkPT0nc3RyaW5nJztcblx0XHRcdGlmIChzaW1wbGUgJiYgbGFzdFNpbXBsZSkge1xuXHRcdFx0XHRjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGgtMV0gKz0gY2hpbGQ7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Y2hpbGRyZW4ucHVzaChjaGlsZCk7XG5cdFx0XHRcdGxhc3RTaW1wbGUgPSBzaW1wbGU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0bGV0IHAgPSBuZXcgVk5vZGUobm9kZU5hbWUsIGF0dHJpYnV0ZXMgfHwgdW5kZWZpbmVkLCBjaGlsZHJlbik7XG5cblx0Ly8gaWYgYSBcInZub2RlIGhvb2tcIiBpcyBkZWZpbmVkLCBwYXNzIGV2ZXJ5IGNyZWF0ZWQgVk5vZGUgdG8gaXRcblx0aWYgKG9wdGlvbnMudm5vZGUpIG9wdGlvbnMudm5vZGUocCk7XG5cblx0cmV0dXJuIHA7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL34vcHJlYWN0L3NyYy9oLmpzXG4gKiovIiwiLyoqIENvcHkgb3duLXByb3BlcnRpZXMgZnJvbSBgcHJvcHNgIG9udG8gYG9iamAuXG4gKlx0QHJldHVybnMgb2JqXG4gKlx0QHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZChvYmosIHByb3BzKSB7XG5cdGlmIChwcm9wcykge1xuXHRcdGZvciAobGV0IGkgaW4gcHJvcHMpIG9ialtpXSA9IHByb3BzW2ldO1xuXHR9XG5cdHJldHVybiBvYmo7XG59XG5cblxuLyoqIEZhc3QgY2xvbmUuIE5vdGU6IGRvZXMgbm90IGZpbHRlciBvdXQgbm9uLW93biBwcm9wZXJ0aWVzLlxuICpcdEBzZWUgaHR0cHM6Ly9lc2JlbmNoLmNvbS9iZW5jaC81NmJhYTM0ZjQ1ZGY2ODk1MDAyZTAzYjZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lKG9iaikge1xuXHRyZXR1cm4gZXh0ZW5kKHt9LCBvYmopO1xufVxuXG5cbi8qKiBHZXQgYSBkZWVwIHByb3BlcnR5IHZhbHVlIGZyb20gdGhlIGdpdmVuIG9iamVjdCwgZXhwcmVzc2VkIGluIGRvdC1ub3RhdGlvbi5cbiAqXHRAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsdmUob2JqLCBrZXkpIHtcblx0Zm9yIChsZXQgcD1rZXkuc3BsaXQoJy4nKSwgaT0wOyBpPHAubGVuZ3RoICYmIG9iajsgaSsrKSB7XG5cdFx0b2JqID0gb2JqW3BbaV1dO1xuXHR9XG5cdHJldHVybiBvYmo7XG59XG5cblxuLyoqIEBwcml2YXRlIGlzIHRoZSBnaXZlbiBvYmplY3QgYSBGdW5jdGlvbj8gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKG9iaikge1xuXHRyZXR1cm4gJ2Z1bmN0aW9uJz09PXR5cGVvZiBvYmo7XG59XG5cblxuLyoqIEBwcml2YXRlIGlzIHRoZSBnaXZlbiBvYmplY3QgYSBTdHJpbmc/ICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcob2JqKSB7XG5cdHJldHVybiAnc3RyaW5nJz09PXR5cGVvZiBvYmo7XG59XG5cblxuLyoqIENvbnZlcnQgYSBoYXNobWFwIG9mIENTUyBjbGFzc2VzIHRvIGEgc3BhY2UtZGVsaW1pdGVkIGNsYXNzTmFtZSBzdHJpbmdcbiAqXHRAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaFRvQ2xhc3NOYW1lKGMpIHtcblx0bGV0IHN0ciA9ICcnO1xuXHRmb3IgKGxldCBwcm9wIGluIGMpIHtcblx0XHRpZiAoY1twcm9wXSkge1xuXHRcdFx0aWYgKHN0cikgc3RyICs9ICcgJztcblx0XHRcdHN0ciArPSBwcm9wO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gc3RyO1xufVxuXG5cbi8qKiBKdXN0IGEgbWVtb2l6ZWQgU3RyaW5nI3RvTG93ZXJDYXNlICovXG5sZXQgbGNDYWNoZSA9IHt9O1xuZXhwb3J0IGNvbnN0IHRvTG93ZXJDYXNlID0gcyA9PiBsY0NhY2hlW3NdIHx8IChsY0NhY2hlW3NdID0gcy50b0xvd2VyQ2FzZSgpKTtcblxuXG4vKiogQ2FsbCBhIGZ1bmN0aW9uIGFzeW5jaHJvbm91c2x5LCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICpcdEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKi9cbmxldCByZXNvbHZlZCA9IHR5cGVvZiBQcm9taXNlIT09J3VuZGVmaW5lZCcgJiYgUHJvbWlzZS5yZXNvbHZlKCk7XG5leHBvcnQgY29uc3QgZGVmZXIgPSByZXNvbHZlZCA/IChmID0+IHsgcmVzb2x2ZWQudGhlbihmKTsgfSkgOiBzZXRUaW1lb3V0O1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9+L3ByZWFjdC9zcmMvdXRpbC5qc1xuICoqLyIsImltcG9ydCB7IGNsb25lLCBleHRlbmQgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgaCB9IGZyb20gJy4vaCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZUVsZW1lbnQodm5vZGUsIHByb3BzKSB7XG5cdHJldHVybiBoKFxuXHRcdHZub2RlLm5vZGVOYW1lLFxuXHRcdGV4dGVuZChjbG9uZSh2bm9kZS5hdHRyaWJ1dGVzKSwgcHJvcHMpLFxuXHRcdGFyZ3VtZW50cy5sZW5ndGg+MiA/IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSA6IHZub2RlLmNoaWxkcmVuXG5cdCk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL34vcHJlYWN0L3NyYy9jbG9uZS1lbGVtZW50LmpzXG4gKiovIiwiaW1wb3J0IHsgaXNTdHJpbmcsIGRlbHZlIH0gZnJvbSAnLi91dGlsJztcblxuLyoqIENyZWF0ZSBhbiBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgc2V0cyBhIGdpdmVuIHN0YXRlIHByb3BlcnR5LlxuICpcdEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnRcdFRoZSBjb21wb25lbnQgd2hvc2Ugc3RhdGUgc2hvdWxkIGJlIHVwZGF0ZWRcbiAqXHRAcGFyYW0ge3N0cmluZ30ga2V5XHRcdFx0XHRBIGRvdC1ub3RhdGVkIGtleSBwYXRoIHRvIHVwZGF0ZSBpbiB0aGUgY29tcG9uZW50J3Mgc3RhdGVcbiAqXHRAcGFyYW0ge3N0cmluZ30gZXZlbnRQYXRoXHRcdEEgZG90LW5vdGF0ZWQga2V5IHBhdGggdG8gdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBFdmVudCBvciBjb21wb25lbnRcbiAqXHRAcmV0dXJucyB7ZnVuY3Rpb259IGxpbmtlZFN0YXRlSGFuZGxlclxuICpcdEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMaW5rZWRTdGF0ZShjb21wb25lbnQsIGtleSwgZXZlbnRQYXRoKSB7XG5cdGxldCBwYXRoID0ga2V5LnNwbGl0KCcuJyk7XG5cdHJldHVybiBmdW5jdGlvbihlKSB7XG5cdFx0bGV0IHQgPSBlICYmIGUudGFyZ2V0IHx8IHRoaXMsXG5cdFx0XHRzdGF0ZSA9IHt9LFxuXHRcdFx0b2JqID0gc3RhdGUsXG5cdFx0XHR2ID0gaXNTdHJpbmcoZXZlbnRQYXRoKSA/IGRlbHZlKGUsIGV2ZW50UGF0aCkgOiB0Lm5vZGVOYW1lID8gKHQudHlwZS5tYXRjaCgvXmNoZXxyYWQvKSA/IHQuY2hlY2tlZCA6IHQudmFsdWUpIDogZSxcblx0XHRcdGkgPSAwO1xuXHRcdGZvciAoIDsgaTxwYXRoLmxlbmd0aC0xOyBpKyspIHtcblx0XHRcdG9iaiA9IG9ialtwYXRoW2ldXSB8fCAob2JqW3BhdGhbaV1dID0gIWkgJiYgY29tcG9uZW50LnN0YXRlW3BhdGhbaV1dIHx8IHt9KTtcblx0XHR9XG5cdFx0b2JqW3BhdGhbaV1dID0gdjtcblx0XHRjb21wb25lbnQuc2V0U3RhdGUoc3RhdGUpO1xuXHR9O1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9+L3ByZWFjdC9zcmMvbGlua2VkLXN0YXRlLmpzXG4gKiovIiwiaW1wb3J0IG9wdGlvbnMgZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7IGRlZmVyIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IHJlbmRlckNvbXBvbmVudCB9IGZyb20gJy4vdmRvbS9jb21wb25lbnQnO1xuXG4vKiogTWFuYWdlZCBxdWV1ZSBvZiBkaXJ0eSBjb21wb25lbnRzIHRvIGJlIHJlLXJlbmRlcmVkICovXG5cbi8vIGl0ZW1zL2l0ZW1zT2ZmbGluZSBzd2FwIG9uIGVhY2ggcmVyZW5kZXIoKSBjYWxsIChqdXN0IGEgc2ltcGxlIHBvb2wgdGVjaG5pcXVlKVxubGV0IGl0ZW1zID0gW107XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnF1ZXVlUmVuZGVyKGNvbXBvbmVudCkge1xuXHRpZiAoIWNvbXBvbmVudC5fZGlydHkgJiYgKGNvbXBvbmVudC5fZGlydHkgPSB0cnVlKSAmJiBpdGVtcy5wdXNoKGNvbXBvbmVudCk9PTEpIHtcblx0XHQob3B0aW9ucy5kZWJvdW5jZVJlbmRlcmluZyB8fCBkZWZlcikocmVyZW5kZXIpO1xuXHR9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcmVuZGVyKCkge1xuXHRsZXQgcCwgbGlzdCA9IGl0ZW1zO1xuXHRpdGVtcyA9IFtdO1xuXHR3aGlsZSAoIChwID0gbGlzdC5wb3AoKSkgKSB7XG5cdFx0aWYgKHAuX2RpcnR5KSByZW5kZXJDb21wb25lbnQocCk7XG5cdH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vfi9wcmVhY3Qvc3JjL3JlbmRlci1xdWV1ZS5qc1xuICoqLyIsImltcG9ydCB7IGNsb25lLCBpc1N0cmluZywgaXNGdW5jdGlvbiwgdG9Mb3dlckNhc2UgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGlzRnVuY3Rpb25hbENvbXBvbmVudCB9IGZyb20gJy4vZnVuY3Rpb25hbC1jb21wb25lbnQnO1xuXG5cbi8qKiBDaGVjayBpZiB0d28gbm9kZXMgYXJlIGVxdWl2YWxlbnQuXG4gKlx0QHBhcmFtIHtFbGVtZW50fSBub2RlXG4gKlx0QHBhcmFtIHtWTm9kZX0gdm5vZGVcbiAqXHRAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTYW1lTm9kZVR5cGUobm9kZSwgdm5vZGUpIHtcblx0aWYgKGlzU3RyaW5nKHZub2RlKSkge1xuXHRcdHJldHVybiBub2RlIGluc3RhbmNlb2YgVGV4dDtcblx0fVxuXHRpZiAoaXNTdHJpbmcodm5vZGUubm9kZU5hbWUpKSB7XG5cdFx0cmV0dXJuICFub2RlLl9jb21wb25lbnRDb25zdHJ1Y3RvciAmJiBpc05hbWVkTm9kZShub2RlLCB2bm9kZS5ub2RlTmFtZSk7XG5cdH1cblx0aWYgKGlzRnVuY3Rpb24odm5vZGUubm9kZU5hbWUpKSB7XG5cdFx0cmV0dXJuIChub2RlLl9jb21wb25lbnRDb25zdHJ1Y3RvciA/IG5vZGUuX2NvbXBvbmVudENvbnN0cnVjdG9yPT09dm5vZGUubm9kZU5hbWUgOiB0cnVlKSB8fCBpc0Z1bmN0aW9uYWxDb21wb25lbnQodm5vZGUpO1xuXHR9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTmFtZWROb2RlKG5vZGUsIG5vZGVOYW1lKSB7XG5cdHJldHVybiBub2RlLm5vcm1hbGl6ZWROb2RlTmFtZT09PW5vZGVOYW1lIHx8IHRvTG93ZXJDYXNlKG5vZGUubm9kZU5hbWUpPT09dG9Mb3dlckNhc2Uobm9kZU5hbWUpO1xufVxuXG5cbi8qKlxuICogUmVjb25zdHJ1Y3QgQ29tcG9uZW50LXN0eWxlIGBwcm9wc2AgZnJvbSBhIFZOb2RlLlxuICogRW5zdXJlcyBkZWZhdWx0L2ZhbGxiYWNrIHZhbHVlcyBmcm9tIGBkZWZhdWx0UHJvcHNgOlxuICogT3duLXByb3BlcnRpZXMgb2YgYGRlZmF1bHRQcm9wc2Agbm90IHByZXNlbnQgaW4gYHZub2RlLmF0dHJpYnV0ZXNgIGFyZSBhZGRlZC5cbiAqIEBwYXJhbSB7Vk5vZGV9IHZub2RlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBwcm9wc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZVByb3BzKHZub2RlKSB7XG5cdGxldCBwcm9wcyA9IGNsb25lKHZub2RlLmF0dHJpYnV0ZXMpO1xuXHRwcm9wcy5jaGlsZHJlbiA9IHZub2RlLmNoaWxkcmVuO1xuXG5cdGxldCBkZWZhdWx0UHJvcHMgPSB2bm9kZS5ub2RlTmFtZS5kZWZhdWx0UHJvcHM7XG5cdGlmIChkZWZhdWx0UHJvcHMpIHtcblx0XHRmb3IgKGxldCBpIGluIGRlZmF1bHRQcm9wcykge1xuXHRcdFx0aWYgKHByb3BzW2ldPT09dW5kZWZpbmVkKSB7XG5cdFx0XHRcdHByb3BzW2ldID0gZGVmYXVsdFByb3BzW2ldO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBwcm9wcztcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vfi9wcmVhY3Qvc3JjL3Zkb20vaW5kZXguanNcbiAqKi8iLCJpbXBvcnQgeyBOT05fRElNRU5TSU9OX1BST1BTLCBOT05fQlVCQkxJTkdfRVZFTlRTIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCBvcHRpb25zIGZyb20gJy4uL29wdGlvbnMnO1xuaW1wb3J0IHsgdG9Mb3dlckNhc2UsIGlzU3RyaW5nLCBpc0Z1bmN0aW9uLCBoYXNoVG9DbGFzc05hbWUgfSBmcm9tICcuLi91dGlsJztcblxuXG5cblxuLyoqIFJlbW92ZXMgYSBnaXZlbiBET00gTm9kZSBmcm9tIGl0cyBwYXJlbnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTm9kZShub2RlKSB7XG5cdGxldCBwID0gbm9kZS5wYXJlbnROb2RlO1xuXHRpZiAocCkgcC5yZW1vdmVDaGlsZChub2RlKTtcbn1cblxuXG4vKiogU2V0IGEgbmFtZWQgYXR0cmlidXRlIG9uIHRoZSBnaXZlbiBOb2RlLCB3aXRoIHNwZWNpYWwgYmVoYXZpb3IgZm9yIHNvbWUgbmFtZXMgYW5kIGV2ZW50IGhhbmRsZXJzLlxuICpcdElmIGB2YWx1ZWAgaXMgYG51bGxgLCB0aGUgYXR0cmlidXRlL2hhbmRsZXIgd2lsbCBiZSByZW1vdmVkLlxuICpcdEBwYXJhbSB7RWxlbWVudH0gbm9kZVx0QW4gZWxlbWVudCB0byBtdXRhdGVcbiAqXHRAcGFyYW0ge3N0cmluZ30gbmFtZVx0VGhlIG5hbWUva2V5IHRvIHNldCwgc3VjaCBhcyBhbiBldmVudCBvciBhdHRyaWJ1dGUgbmFtZVxuICpcdEBwYXJhbSB7YW55fSB2YWx1ZVx0XHRBbiBhdHRyaWJ1dGUgdmFsdWUsIHN1Y2ggYXMgYSBmdW5jdGlvbiB0byBiZSB1c2VkIGFzIGFuIGV2ZW50IGhhbmRsZXJcbiAqXHRAcGFyYW0ge2FueX0gcHJldmlvdXNWYWx1ZVx0VGhlIGxhc3QgdmFsdWUgdGhhdCB3YXMgc2V0IGZvciB0aGlzIG5hbWUvbm9kZSBwYWlyXG4gKlx0QHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEFjY2Vzc29yKG5vZGUsIG5hbWUsIG9sZCwgdmFsdWUsIGlzU3ZnKSB7XG5cblx0aWYgKG5hbWU9PT0nY2xhc3NOYW1lJykgbmFtZSA9ICdjbGFzcyc7XG5cblx0aWYgKG5hbWU9PT0nY2xhc3MnICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZT09PSdvYmplY3QnKSB7XG5cdFx0dmFsdWUgPSBoYXNoVG9DbGFzc05hbWUodmFsdWUpO1xuXHR9XG5cblx0aWYgKG5hbWU9PT0na2V5Jykge1xuXHRcdC8vIGlnbm9yZVxuXHR9XG5cdGVsc2UgaWYgKG5hbWU9PT0nY2xhc3MnICYmICFpc1N2Zykge1xuXHRcdG5vZGUuY2xhc3NOYW1lID0gdmFsdWUgfHwgJyc7XG5cdH1cblx0ZWxzZSBpZiAobmFtZT09PSdzdHlsZScpIHtcblx0XHRpZiAoIXZhbHVlIHx8IGlzU3RyaW5nKHZhbHVlKSB8fCBpc1N0cmluZyhvbGQpKSB7XG5cdFx0XHRub2RlLnN0eWxlLmNzc1RleHQgPSB2YWx1ZSB8fCAnJztcblx0XHR9XG5cdFx0aWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZT09PSdvYmplY3QnKSB7XG5cdFx0XHRpZiAoIWlzU3RyaW5nKG9sZCkpIHtcblx0XHRcdFx0Zm9yIChsZXQgaSBpbiBvbGQpIGlmICghKGkgaW4gdmFsdWUpKSBub2RlLnN0eWxlW2ldID0gJyc7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGxldCBpIGluIHZhbHVlKSB7XG5cdFx0XHRcdG5vZGUuc3R5bGVbaV0gPSB0eXBlb2YgdmFsdWVbaV09PT0nbnVtYmVyJyAmJiAhTk9OX0RJTUVOU0lPTl9QUk9QU1tpXSA/ICh2YWx1ZVtpXSsncHgnKSA6IHZhbHVlW2ldO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRlbHNlIGlmIChuYW1lPT09J2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJykge1xuXHRcdG5vZGUuaW5uZXJIVE1MID0gdmFsdWUgJiYgdmFsdWUuX19odG1sIHx8ICcnO1xuXHR9XG5cdGVsc2UgaWYgKG5hbWVbMF09PSdvJyAmJiBuYW1lWzFdPT0nbicpIHtcblx0XHRsZXQgbCA9IG5vZGUuX2xpc3RlbmVycyB8fCAobm9kZS5fbGlzdGVuZXJzID0ge30pO1xuXHRcdG5hbWUgPSB0b0xvd2VyQ2FzZShuYW1lLnN1YnN0cmluZygyKSk7XG5cdFx0Ly8gQFRPRE86IHRoaXMgbWlnaHQgYmUgd29ydGggaXQgbGF0ZXIsIHVuLWJyZWFrcyBmb2N1cy9ibHVyIGJ1YmJsaW5nIGluIElFOTpcblx0XHQvLyBpZiAobm9kZS5hdHRhY2hFdmVudCkgbmFtZSA9IG5hbWU9PSdmb2N1cyc/J2ZvY3VzaW4nOm5hbWU9PSdibHVyJz8nZm9jdXNvdXQnOm5hbWU7XG5cdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHRpZiAoIWxbbmFtZV0pIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBldmVudFByb3h5LCAhIU5PTl9CVUJCTElOR19FVkVOVFNbbmFtZV0pO1xuXHRcdH1cblx0XHRlbHNlIGlmIChsW25hbWVdKSB7XG5cdFx0XHRub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgZXZlbnRQcm94eSwgISFOT05fQlVCQkxJTkdfRVZFTlRTW25hbWVdKTtcblx0XHR9XG5cdFx0bFtuYW1lXSA9IHZhbHVlO1xuXHR9XG5cdGVsc2UgaWYgKG5hbWUhPT0nbGlzdCcgJiYgbmFtZSE9PSd0eXBlJyAmJiAhaXNTdmcgJiYgbmFtZSBpbiBub2RlKSB7XG5cdFx0c2V0UHJvcGVydHkobm9kZSwgbmFtZSwgdmFsdWU9PW51bGwgPyAnJyA6IHZhbHVlKTtcblx0XHRpZiAodmFsdWU9PW51bGwgfHwgdmFsdWU9PT1mYWxzZSkgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0bGV0IG5zID0gaXNTdmcgJiYgbmFtZS5tYXRjaCgvXnhsaW5rXFw6PyguKykvKTtcblx0XHRpZiAodmFsdWU9PW51bGwgfHwgdmFsdWU9PT1mYWxzZSkge1xuXHRcdFx0aWYgKG5zKSBub2RlLnJlbW92ZUF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgdG9Mb3dlckNhc2UobnNbMV0pKTtcblx0XHRcdGVsc2Ugbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSE9PSdvYmplY3QnICYmICFpc0Z1bmN0aW9uKHZhbHVlKSkge1xuXHRcdFx0aWYgKG5zKSBub2RlLnNldEF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgdG9Mb3dlckNhc2UobnNbMV0pLCB2YWx1ZSk7XG5cdFx0XHRlbHNlIG5vZGUuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcblx0XHR9XG5cdH1cbn1cblxuXG4vKiogQXR0ZW1wdCB0byBzZXQgYSBET00gcHJvcGVydHkgdG8gdGhlIGdpdmVuIHZhbHVlLlxuICpcdElFICYgRkYgdGhyb3cgZm9yIGNlcnRhaW4gcHJvcGVydHktdmFsdWUgY29tYmluYXRpb25zLlxuICovXG5mdW5jdGlvbiBzZXRQcm9wZXJ0eShub2RlLCBuYW1lLCB2YWx1ZSkge1xuXHR0cnkge1xuXHRcdG5vZGVbbmFtZV0gPSB2YWx1ZTtcblx0fSBjYXRjaCAoZSkgeyB9XG59XG5cblxuLyoqIFByb3h5IGFuIGV2ZW50IHRvIGhvb2tlZCBldmVudCBoYW5kbGVyc1xuICpcdEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGV2ZW50UHJveHkoZSkge1xuXHRyZXR1cm4gdGhpcy5fbGlzdGVuZXJzW2UudHlwZV0ob3B0aW9ucy5ldmVudCAmJiBvcHRpb25zLmV2ZW50KGUpIHx8IGUpO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9+L3ByZWFjdC9zcmMvZG9tL2luZGV4LmpzXG4gKiovIiwiaW1wb3J0IHsgdG9Mb3dlckNhc2UgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IHJlbW92ZU5vZGUgfSBmcm9tICcuL2luZGV4JztcblxuLyoqIERPTSBub2RlIHBvb2wsIGtleWVkIG9uIG5vZGVOYW1lLiAqL1xuXG5jb25zdCBub2RlcyA9IHt9O1xuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdE5vZGUobm9kZSkge1xuXHRyZW1vdmVOb2RlKG5vZGUpO1xuXG5cdGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkge1xuXHRcdG5vZGUuX2NvbXBvbmVudCA9IG5vZGUuX2NvbXBvbmVudENvbnN0cnVjdG9yID0gbnVsbDtcblxuXHRcdGxldCBuYW1lID0gbm9kZS5ub3JtYWxpemVkTm9kZU5hbWUgfHwgdG9Mb3dlckNhc2Uobm9kZS5ub2RlTmFtZSk7XG5cdFx0KG5vZGVzW25hbWVdIHx8IChub2Rlc1tuYW1lXSA9IFtdKSkucHVzaChub2RlKTtcblx0fVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOb2RlKG5vZGVOYW1lLCBpc1N2Zykge1xuXHRsZXQgbmFtZSA9IHRvTG93ZXJDYXNlKG5vZGVOYW1lKSxcblx0XHRub2RlID0gbm9kZXNbbmFtZV0gJiYgbm9kZXNbbmFtZV0ucG9wKCkgfHwgKGlzU3ZnID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsIG5vZGVOYW1lKSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpKTtcblx0bm9kZS5ub3JtYWxpemVkTm9kZU5hbWUgPSBuYW1lO1xuXHRyZXR1cm4gbm9kZTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vfi9wcmVhY3Qvc3JjL2RvbS9yZWN5Y2xlci5qc1xuICoqLyIsImltcG9ydCB7IEFUVFJfS0VZIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IGlzU3RyaW5nLCBpc0Z1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgeyBpc1NhbWVOb2RlVHlwZSwgaXNOYW1lZE5vZGUgfSBmcm9tICcuL2luZGV4JztcbmltcG9ydCB7IGlzRnVuY3Rpb25hbENvbXBvbmVudCwgYnVpbGRGdW5jdGlvbmFsQ29tcG9uZW50IH0gZnJvbSAnLi9mdW5jdGlvbmFsLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBidWlsZENvbXBvbmVudEZyb21WTm9kZSB9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCB7IHNldEFjY2Vzc29yLCByZW1vdmVOb2RlIH0gZnJvbSAnLi4vZG9tL2luZGV4JztcbmltcG9ydCB7IGNyZWF0ZU5vZGUsIGNvbGxlY3ROb2RlIH0gZnJvbSAnLi4vZG9tL3JlY3ljbGVyJztcbmltcG9ydCB7IHVubW91bnRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQgb3B0aW9ucyBmcm9tICcuLi9vcHRpb25zJztcblxuXG4vKiogUXVldWUgb2YgY29tcG9uZW50cyB0aGF0IGhhdmUgYmVlbiBtb3VudGVkIGFuZCBhcmUgYXdhaXRpbmcgY29tcG9uZW50RGlkTW91bnQgKi9cbmV4cG9ydCBjb25zdCBtb3VudHMgPSBbXTtcblxuLyoqIERpZmYgcmVjdXJzaW9uIGNvdW50LCB1c2VkIHRvIHRyYWNrIHRoZSBlbmQgb2YgdGhlIGRpZmYgY3ljbGUuICovXG5leHBvcnQgbGV0IGRpZmZMZXZlbCA9IDA7XG5cbi8qKiBHbG9iYWwgZmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBkaWZmIGlzIGN1cnJlbnRseSB3aXRoaW4gYW4gU1ZHICovXG5sZXQgaXNTdmdNb2RlID0gZmFsc2U7XG5cbi8qKiBHbG9iYWwgZmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBkaWZmIGlzIHBlcmZvcm1pbmcgaHlkcmF0aW9uICovXG5sZXQgaHlkcmF0aW5nID0gZmFsc2U7XG5cblxuLyoqIEludm9rZSBxdWV1ZWQgY29tcG9uZW50RGlkTW91bnQgbGlmZWN5Y2xlIG1ldGhvZHMgKi9cbmV4cG9ydCBmdW5jdGlvbiBmbHVzaE1vdW50cygpIHtcblx0bGV0IGM7XG5cdHdoaWxlICgoYz1tb3VudHMucG9wKCkpKSB7XG5cdFx0aWYgKG9wdGlvbnMuYWZ0ZXJNb3VudCkgb3B0aW9ucy5hZnRlck1vdW50KGMpO1xuXHRcdGlmIChjLmNvbXBvbmVudERpZE1vdW50KSBjLmNvbXBvbmVudERpZE1vdW50KCk7XG5cdH1cbn1cblxuXG4vKiogQXBwbHkgZGlmZmVyZW5jZXMgaW4gYSBnaXZlbiB2bm9kZSAoYW5kIGl0J3MgZGVlcCBjaGlsZHJlbikgdG8gYSByZWFsIERPTSBOb2RlLlxuICpcdEBwYXJhbSB7RWxlbWVudH0gW2RvbT1udWxsXVx0XHRBIERPTSBub2RlIHRvIG11dGF0ZSBpbnRvIHRoZSBzaGFwZSBvZiB0aGUgYHZub2RlYFxuICpcdEBwYXJhbSB7Vk5vZGV9IHZub2RlXHRcdFx0QSBWTm9kZSAod2l0aCBkZXNjZW5kYW50cyBmb3JtaW5nIGEgdHJlZSkgcmVwcmVzZW50aW5nIHRoZSBkZXNpcmVkIERPTSBzdHJ1Y3R1cmVcbiAqXHRAcmV0dXJucyB7RWxlbWVudH0gZG9tXHRcdFx0VGhlIGNyZWF0ZWQvbXV0YXRlZCBlbGVtZW50XG4gKlx0QHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmYoZG9tLCB2bm9kZSwgY29udGV4dCwgbW91bnRBbGwsIHBhcmVudCwgY29tcG9uZW50Um9vdCkge1xuXHQvLyBkaWZmTGV2ZWwgaGF2aW5nIGJlZW4gMCBoZXJlIGluZGljYXRlcyBpbml0aWFsIGVudHJ5IGludG8gdGhlIGRpZmYgKG5vdCBhIHN1YmRpZmYpXG5cdGlmICghZGlmZkxldmVsKyspIHtcblx0XHQvLyB3aGVuIGZpcnN0IHN0YXJ0aW5nIHRoZSBkaWZmLCBjaGVjayBpZiB3ZSdyZSBkaWZmaW5nIGFuIFNWRyBvciB3aXRoaW4gYW4gU1ZHXG5cdFx0aXNTdmdNb2RlID0gcGFyZW50IGluc3RhbmNlb2YgU1ZHRWxlbWVudDtcblxuXHRcdC8vIGh5ZHJhdGlvbiBpcyBpbmlkaWNhdGVkIGJ5IHRoZSBleGlzdGluZyBlbGVtZW50IHRvIGJlIGRpZmZlZCBub3QgaGF2aW5nIGEgcHJvcCBjYWNoZVxuXHRcdGh5ZHJhdGluZyA9IGRvbSAmJiAhKEFUVFJfS0VZIGluIGRvbSk7XG5cdH1cblxuXHRsZXQgcmV0ID0gaWRpZmYoZG9tLCB2bm9kZSwgY29udGV4dCwgbW91bnRBbGwpO1xuXG5cdC8vIGFwcGVuZCB0aGUgZWxlbWVudCBpZiBpdHMgYSBuZXcgcGFyZW50XG5cdGlmIChwYXJlbnQgJiYgcmV0LnBhcmVudE5vZGUhPT1wYXJlbnQpIHBhcmVudC5hcHBlbmRDaGlsZChyZXQpO1xuXG5cdC8vIGRpZmZMZXZlbCBiZWluZyByZWR1Y2VkIHRvIDAgbWVhbnMgd2UncmUgZXhpdGluZyB0aGUgZGlmZlxuXHRpZiAoIS0tZGlmZkxldmVsKSB7XG5cdFx0aHlkcmF0aW5nID0gZmFsc2U7XG5cdFx0Ly8gaW52b2tlIHF1ZXVlZCBjb21wb25lbnREaWRNb3VudCBsaWZlY3ljbGUgbWV0aG9kc1xuXHRcdGlmICghY29tcG9uZW50Um9vdCkgZmx1c2hNb3VudHMoKTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59XG5cblxuZnVuY3Rpb24gaWRpZmYoZG9tLCB2bm9kZSwgY29udGV4dCwgbW91bnRBbGwpIHtcblx0bGV0IG9yaWdpbmFsQXR0cmlidXRlcyA9IHZub2RlICYmIHZub2RlLmF0dHJpYnV0ZXM7XG5cblxuXHQvLyBSZXNvbHZlIGVwaGVtZXJhbCBQdXJlIEZ1bmN0aW9uYWwgQ29tcG9uZW50c1xuXHR3aGlsZSAoaXNGdW5jdGlvbmFsQ29tcG9uZW50KHZub2RlKSkge1xuXHRcdHZub2RlID0gYnVpbGRGdW5jdGlvbmFsQ29tcG9uZW50KHZub2RlLCBjb250ZXh0KTtcblx0fVxuXG5cblx0Ly8gZW1wdHkgdmFsdWVzIChudWxsICYgdW5kZWZpbmVkKSByZW5kZXIgYXMgZW1wdHkgVGV4dCBub2Rlc1xuXHRpZiAodm5vZGU9PW51bGwpIHZub2RlID0gJyc7XG5cblxuXHQvLyBGYXN0IGNhc2U6IFN0cmluZ3MgY3JlYXRlL3VwZGF0ZSBUZXh0IG5vZGVzLlxuXHRpZiAoaXNTdHJpbmcodm5vZGUpKSB7XG5cdFx0Ly8gdXBkYXRlIGlmIGl0J3MgYWxyZWFkeSBhIFRleHQgbm9kZVxuXHRcdGlmIChkb20gJiYgZG9tIGluc3RhbmNlb2YgVGV4dCkge1xuXHRcdFx0aWYgKGRvbS5ub2RlVmFsdWUhPXZub2RlKSB7XG5cdFx0XHRcdGRvbS5ub2RlVmFsdWUgPSB2bm9kZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQvLyBpdCB3YXNuJ3QgYSBUZXh0IG5vZGU6IHJlcGxhY2UgaXQgd2l0aCBvbmUgYW5kIHJlY3ljbGUgdGhlIG9sZCBFbGVtZW50XG5cdFx0XHRpZiAoZG9tKSByZWNvbGxlY3ROb2RlVHJlZShkb20pO1xuXHRcdFx0ZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodm5vZGUpO1xuXHRcdH1cblxuXHRcdC8vIE1hcmsgZm9yIG5vbi1oeWRyYXRpb24gdXBkYXRlc1xuXHRcdGRvbVtBVFRSX0tFWV0gPSB0cnVlO1xuXHRcdHJldHVybiBkb207XG5cdH1cblxuXG5cdC8vIElmIHRoZSBWTm9kZSByZXByZXNlbnRzIGEgQ29tcG9uZW50LCBwZXJmb3JtIGEgY29tcG9uZW50IGRpZmYuXG5cdGlmIChpc0Z1bmN0aW9uKHZub2RlLm5vZGVOYW1lKSkge1xuXHRcdHJldHVybiBidWlsZENvbXBvbmVudEZyb21WTm9kZShkb20sIHZub2RlLCBjb250ZXh0LCBtb3VudEFsbCk7XG5cdH1cblxuXG5cdGxldCBvdXQgPSBkb20sXG5cdFx0bm9kZU5hbWUgPSBTdHJpbmcodm5vZGUubm9kZU5hbWUpLFx0Ly8gQFRPRE8gdGhpcyBtYXNrcyB1bmRlZmluZWQgY29tcG9uZW50IGVycm9ycyBhcyBgPHVuZGVmaW5lZD5gXG5cdFx0cHJldlN2Z01vZGUgPSBpc1N2Z01vZGUsXG5cdFx0dmNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47XG5cblxuXHQvLyBTVkdzIGhhdmUgc3BlY2lhbCBuYW1lc3BhY2Ugc3R1ZmYuXG5cdC8vIFRoaXMgdHJhY2tzIGVudGVyaW5nIGFuZCBleGl0aW5nIHRoYXQgbmFtZXNwYWNlIHdoZW4gZGVzY2VuZGluZyB0aHJvdWdoIHRoZSB0cmVlLlxuXHRpc1N2Z01vZGUgPSBub2RlTmFtZT09PSdzdmcnID8gdHJ1ZSA6IG5vZGVOYW1lPT09J2ZvcmVpZ25PYmplY3QnID8gZmFsc2UgOiBpc1N2Z01vZGU7XG5cblxuXHRpZiAoIWRvbSkge1xuXHRcdC8vIGNhc2U6IHdlIGhhZCBubyBlbGVtZW50IHRvIGJlZ2luIHdpdGhcblx0XHQvLyAtIGNyZWF0ZSBhbiBlbGVtZW50IHRvIHdpdGggdGhlIG5vZGVOYW1lIGZyb20gVk5vZGVcblx0XHRvdXQgPSBjcmVhdGVOb2RlKG5vZGVOYW1lLCBpc1N2Z01vZGUpO1xuXHR9XG5cdGVsc2UgaWYgKCFpc05hbWVkTm9kZShkb20sIG5vZGVOYW1lKSkge1xuXHRcdC8vIGNhc2U6IEVsZW1lbnQgYW5kIFZOb2RlIGhhZCBkaWZmZXJlbnQgbm9kZU5hbWVzXG5cdFx0Ly8gLSBuZWVkIHRvIGNyZWF0ZSB0aGUgY29ycmVjdCBFbGVtZW50IHRvIG1hdGNoIFZOb2RlXG5cdFx0Ly8gLSB0aGVuIG1pZ3JhdGUgY2hpbGRyZW4gZnJvbSBvbGQgdG8gbmV3XG5cblx0XHRvdXQgPSBjcmVhdGVOb2RlKG5vZGVOYW1lLCBpc1N2Z01vZGUpO1xuXG5cdFx0Ly8gbW92ZSBjaGlsZHJlbiBpbnRvIHRoZSByZXBsYWNlbWVudCBub2RlXG5cdFx0d2hpbGUgKGRvbS5maXJzdENoaWxkKSBvdXQuYXBwZW5kQ2hpbGQoZG9tLmZpcnN0Q2hpbGQpO1xuXG5cdFx0Ly8gaWYgdGhlIHByZXZpb3VzIEVsZW1lbnQgd2FzIG1vdW50ZWQgaW50byB0aGUgRE9NLCByZXBsYWNlIGl0IGlubGluZVxuXHRcdGlmIChkb20ucGFyZW50Tm9kZSkgZG9tLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG91dCwgZG9tKTtcblxuXHRcdC8vIHJlY3ljbGUgdGhlIG9sZCBlbGVtZW50IChza2lwcyBub24tRWxlbWVudCBub2RlIHR5cGVzKVxuXHRcdHJlY29sbGVjdE5vZGVUcmVlKGRvbSk7XG5cdH1cblxuXG5cdGxldCBmYyA9IG91dC5maXJzdENoaWxkLFxuXHRcdHByb3BzID0gb3V0W0FUVFJfS0VZXTtcblxuXHQvLyBBdHRyaWJ1dGUgSHlkcmF0aW9uOiBpZiB0aGVyZSBpcyBubyBwcm9wIGNhY2hlIG9uIHRoZSBlbGVtZW50LFxuXHQvLyAuLi5jcmVhdGUgaXQgYW5kIHBvcHVsYXRlIGl0IHdpdGggdGhlIGVsZW1lbnQncyBhdHRyaWJ1dGVzLlxuXHRpZiAoIXByb3BzKSB7XG5cdFx0b3V0W0FUVFJfS0VZXSA9IHByb3BzID0ge307XG5cdFx0Zm9yIChsZXQgYT1vdXQuYXR0cmlidXRlcywgaT1hLmxlbmd0aDsgaS0tOyApIHByb3BzW2FbaV0ubmFtZV0gPSBhW2ldLnZhbHVlO1xuXHR9XG5cblx0Ly8gQXBwbHkgYXR0cmlidXRlcy9wcm9wcyBmcm9tIFZOb2RlIHRvIHRoZSBET00gRWxlbWVudDpcblx0ZGlmZkF0dHJpYnV0ZXMob3V0LCB2bm9kZS5hdHRyaWJ1dGVzLCBwcm9wcyk7XG5cblxuXHQvLyBPcHRpbWl6YXRpb246IGZhc3QtcGF0aCBmb3IgZWxlbWVudHMgY29udGFpbmluZyBhIHNpbmdsZSBUZXh0Tm9kZTpcblx0aWYgKCFoeWRyYXRpbmcgJiYgdmNoaWxkcmVuICYmIHZjaGlsZHJlbi5sZW5ndGg9PT0xICYmIHR5cGVvZiB2Y2hpbGRyZW5bMF09PT0nc3RyaW5nJyAmJiBmYyAmJiBmYyBpbnN0YW5jZW9mIFRleHQgJiYgIWZjLm5leHRTaWJsaW5nKSB7XG5cdFx0aWYgKGZjLm5vZGVWYWx1ZSE9dmNoaWxkcmVuWzBdKSB7XG5cdFx0XHRmYy5ub2RlVmFsdWUgPSB2Y2hpbGRyZW5bMF07XG5cdFx0fVxuXHR9XG5cdC8vIG90aGVyd2lzZSwgaWYgdGhlcmUgYXJlIGV4aXN0aW5nIG9yIG5ldyBjaGlsZHJlbiwgZGlmZiB0aGVtOlxuXHRlbHNlIGlmICh2Y2hpbGRyZW4gJiYgdmNoaWxkcmVuLmxlbmd0aCB8fCBmYykge1xuXHRcdGlubmVyRGlmZk5vZGUob3V0LCB2Y2hpbGRyZW4sIGNvbnRleHQsIG1vdW50QWxsKTtcblx0fVxuXG5cblx0Ly8gaW52b2tlIG9yaWdpbmFsIHJlZiAoZnJvbSBiZWZvcmUgcmVzb2x2aW5nIFB1cmUgRnVuY3Rpb25hbCBDb21wb25lbnRzKTpcblx0aWYgKG9yaWdpbmFsQXR0cmlidXRlcyAmJiB0eXBlb2Ygb3JpZ2luYWxBdHRyaWJ1dGVzLnJlZj09PSdmdW5jdGlvbicpIHtcblx0XHQocHJvcHMucmVmID0gb3JpZ2luYWxBdHRyaWJ1dGVzLnJlZikob3V0KTtcblx0fVxuXG5cdGlzU3ZnTW9kZSA9IHByZXZTdmdNb2RlO1xuXG5cdHJldHVybiBvdXQ7XG59XG5cblxuLyoqIEFwcGx5IGNoaWxkIGFuZCBhdHRyaWJ1dGUgY2hhbmdlcyBiZXR3ZWVuIGEgVk5vZGUgYW5kIGEgRE9NIE5vZGUgdG8gdGhlIERPTS5cbiAqXHRAcGFyYW0ge0VsZW1lbnR9IGRvbVx0XHRFbGVtZW50IHdob3NlIGNoaWxkcmVuIHNob3VsZCBiZSBjb21wYXJlZCAmIG11dGF0ZWRcbiAqXHRAcGFyYW0ge0FycmF5fSB2Y2hpbGRyZW5cdEFycmF5IG9mIFZOb2RlcyB0byBjb21wYXJlIHRvIGBkb20uY2hpbGROb2Rlc2BcbiAqXHRAcGFyYW0ge09iamVjdH0gY29udGV4dFx0XHRJbXBsaWNpdGx5IGRlc2NlbmRhbnQgY29udGV4dCBvYmplY3QgKGZyb20gbW9zdCByZWNlbnQgYGdldENoaWxkQ29udGV4dCgpYClcbiAqXHRAcGFyYW0ge0Jvb2xlYW59IG1vdXRBbGxcbiAqL1xuZnVuY3Rpb24gaW5uZXJEaWZmTm9kZShkb20sIHZjaGlsZHJlbiwgY29udGV4dCwgbW91bnRBbGwpIHtcblx0bGV0IG9yaWdpbmFsQ2hpbGRyZW4gPSBkb20uY2hpbGROb2Rlcyxcblx0XHRjaGlsZHJlbiA9IFtdLFxuXHRcdGtleWVkID0ge30sXG5cdFx0a2V5ZWRMZW4gPSAwLFxuXHRcdG1pbiA9IDAsXG5cdFx0bGVuID0gb3JpZ2luYWxDaGlsZHJlbi5sZW5ndGgsXG5cdFx0Y2hpbGRyZW5MZW4gPSAwLFxuXHRcdHZsZW4gPSB2Y2hpbGRyZW4gJiYgdmNoaWxkcmVuLmxlbmd0aCxcblx0XHRqLCBjLCB2Y2hpbGQsIGNoaWxkO1xuXG5cdGlmIChsZW4pIHtcblx0XHRmb3IgKGxldCBpPTA7IGk8bGVuOyBpKyspIHtcblx0XHRcdGxldCBjaGlsZCA9IG9yaWdpbmFsQ2hpbGRyZW5baV0sXG5cdFx0XHRcdHByb3BzID0gY2hpbGRbQVRUUl9LRVldLFxuXHRcdFx0XHRrZXkgPSB2bGVuID8gKChjID0gY2hpbGQuX2NvbXBvbmVudCkgPyBjLl9fa2V5IDogcHJvcHMgPyBwcm9wcy5rZXkgOiBudWxsKSA6IG51bGw7XG5cdFx0XHRpZiAoa2V5IT1udWxsKSB7XG5cdFx0XHRcdGtleWVkTGVuKys7XG5cdFx0XHRcdGtleWVkW2tleV0gPSBjaGlsZDtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGh5ZHJhdGluZyB8fCBwcm9wcykge1xuXHRcdFx0XHRjaGlsZHJlbltjaGlsZHJlbkxlbisrXSA9IGNoaWxkO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICh2bGVuKSB7XG5cdFx0Zm9yIChsZXQgaT0wOyBpPHZsZW47IGkrKykge1xuXHRcdFx0dmNoaWxkID0gdmNoaWxkcmVuW2ldO1xuXHRcdFx0Y2hpbGQgPSBudWxsO1xuXG5cdFx0XHQvLyBpZiAoaXNGdW5jdGlvbmFsQ29tcG9uZW50KHZjaGlsZCkpIHtcblx0XHRcdC8vIFx0dmNoaWxkID0gYnVpbGRGdW5jdGlvbmFsQ29tcG9uZW50KHZjaGlsZCk7XG5cdFx0XHQvLyB9XG5cblx0XHRcdC8vIGF0dGVtcHQgdG8gZmluZCBhIG5vZGUgYmFzZWQgb24ga2V5IG1hdGNoaW5nXG5cdFx0XHRsZXQga2V5ID0gdmNoaWxkLmtleTtcblx0XHRcdGlmIChrZXkhPW51bGwpIHtcblx0XHRcdFx0aWYgKGtleWVkTGVuICYmIGtleSBpbiBrZXllZCkge1xuXHRcdFx0XHRcdGNoaWxkID0ga2V5ZWRba2V5XTtcblx0XHRcdFx0XHRrZXllZFtrZXldID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGtleWVkTGVuLS07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdC8vIGF0dGVtcHQgdG8gcGx1Y2sgYSBub2RlIG9mIHRoZSBzYW1lIHR5cGUgZnJvbSB0aGUgZXhpc3RpbmcgY2hpbGRyZW5cblx0XHRcdGVsc2UgaWYgKCFjaGlsZCAmJiBtaW48Y2hpbGRyZW5MZW4pIHtcblx0XHRcdFx0Zm9yIChqPW1pbjsgajxjaGlsZHJlbkxlbjsgaisrKSB7XG5cdFx0XHRcdFx0YyA9IGNoaWxkcmVuW2pdO1xuXHRcdFx0XHRcdGlmIChjICYmIGlzU2FtZU5vZGVUeXBlKGMsIHZjaGlsZCkpIHtcblx0XHRcdFx0XHRcdGNoaWxkID0gYztcblx0XHRcdFx0XHRcdGNoaWxkcmVuW2pdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0aWYgKGo9PT1jaGlsZHJlbkxlbi0xKSBjaGlsZHJlbkxlbi0tO1xuXHRcdFx0XHRcdFx0aWYgKGo9PT1taW4pIG1pbisrO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIG1vcnBoIHRoZSBtYXRjaGVkL2ZvdW5kL2NyZWF0ZWQgRE9NIGNoaWxkIHRvIG1hdGNoIHZjaGlsZCAoZGVlcClcblx0XHRcdGNoaWxkID0gaWRpZmYoY2hpbGQsIHZjaGlsZCwgY29udGV4dCwgbW91bnRBbGwpO1xuXG5cdFx0XHRpZiAoY2hpbGQgJiYgY2hpbGQhPT1kb20pIHtcblx0XHRcdFx0aWYgKGk+PWxlbikge1xuXHRcdFx0XHRcdGRvbS5hcHBlbmRDaGlsZChjaGlsZCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZiAoY2hpbGQhPT1vcmlnaW5hbENoaWxkcmVuW2ldKSB7XG5cdFx0XHRcdFx0aWYgKGNoaWxkPT09b3JpZ2luYWxDaGlsZHJlbltpKzFdKSB7XG5cdFx0XHRcdFx0XHRyZW1vdmVOb2RlKG9yaWdpbmFsQ2hpbGRyZW5baV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb20uaW5zZXJ0QmVmb3JlKGNoaWxkLCBvcmlnaW5hbENoaWxkcmVuW2ldIHx8IG51bGwpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblxuXHRpZiAoa2V5ZWRMZW4pIHtcblx0XHRmb3IgKGxldCBpIGluIGtleWVkKSBpZiAoa2V5ZWRbaV0pIHJlY29sbGVjdE5vZGVUcmVlKGtleWVkW2ldKTtcblx0fVxuXG5cdC8vIHJlbW92ZSBvcnBoYW5lZCBjaGlsZHJlblxuXHR3aGlsZSAobWluPD1jaGlsZHJlbkxlbikge1xuXHRcdGNoaWxkID0gY2hpbGRyZW5bY2hpbGRyZW5MZW4tLV07XG5cdFx0aWYgKGNoaWxkKSByZWNvbGxlY3ROb2RlVHJlZShjaGlsZCk7XG5cdH1cbn1cblxuXG5cbi8qKiBSZWN1cnNpdmVseSByZWN5Y2xlIChvciBqdXN0IHVubW91bnQpIGEgbm9kZSBhbiBpdHMgZGVzY2VuZGFudHMuXG4gKlx0QHBhcmFtIHtOb2RlfSBub2RlXHRcdFx0XHRcdFx0RE9NIG5vZGUgdG8gc3RhcnQgdW5tb3VudC9yZW1vdmFsIGZyb21cbiAqXHRAcGFyYW0ge0Jvb2xlYW59IFt1bm1vdW50T25seT1mYWxzZV1cdElmIGB0cnVlYCwgb25seSB0cmlnZ2VycyB1bm1vdW50IGxpZmVjeWNsZSwgc2tpcHMgcmVtb3ZhbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb2xsZWN0Tm9kZVRyZWUobm9kZSwgdW5tb3VudE9ubHkpIHtcblx0bGV0IGNvbXBvbmVudCA9IG5vZGUuX2NvbXBvbmVudDtcblx0aWYgKGNvbXBvbmVudCkge1xuXHRcdC8vIGlmIG5vZGUgaXMgb3duZWQgYnkgYSBDb21wb25lbnQsIHVubW91bnQgdGhhdCBjb21wb25lbnQgKGVuZHMgdXAgcmVjdXJzaW5nIGJhY2sgaGVyZSlcblx0XHR1bm1vdW50Q29tcG9uZW50KGNvbXBvbmVudCwgIXVubW91bnRPbmx5KTtcblx0fVxuXHRlbHNlIHtcblx0XHQvLyBJZiB0aGUgbm9kZSdzIFZOb2RlIGhhZCBhIHJlZiBmdW5jdGlvbiwgaW52b2tlIGl0IHdpdGggbnVsbCBoZXJlLlxuXHRcdC8vICh0aGlzIGlzIHBhcnQgb2YgdGhlIFJlYWN0IHNwZWMsIGFuZCBzbWFydCBmb3IgdW5zZXR0aW5nIHJlZmVyZW5jZXMpXG5cdFx0aWYgKG5vZGVbQVRUUl9LRVldICYmIG5vZGVbQVRUUl9LRVldLnJlZikgbm9kZVtBVFRSX0tFWV0ucmVmKG51bGwpO1xuXG5cdFx0aWYgKCF1bm1vdW50T25seSkge1xuXHRcdFx0Y29sbGVjdE5vZGUobm9kZSk7XG5cdFx0fVxuXG5cdFx0Ly8gUmVjb2xsZWN0L3VubW91bnQgYWxsIGNoaWxkcmVuLlxuXHRcdC8vIC0gd2UgdXNlIC5sYXN0Q2hpbGQgaGVyZSBiZWNhdXNlIGl0IGNhdXNlcyBsZXNzIHJlZmxvdyB0aGFuIC5maXJzdENoaWxkXG5cdFx0Ly8gLSBpdCdzIGFsc28gY2hlYXBlciB0aGFuIGFjY2Vzc2luZyB0aGUgLmNoaWxkTm9kZXMgTGl2ZSBOb2RlTGlzdFxuXHRcdGxldCBjO1xuXHRcdHdoaWxlICgoYz1ub2RlLmxhc3RDaGlsZCkpIHJlY29sbGVjdE5vZGVUcmVlKGMsIHVubW91bnRPbmx5KTtcblx0fVxufVxuXG5cblxuLyoqIEFwcGx5IGRpZmZlcmVuY2VzIGluIGF0dHJpYnV0ZXMgZnJvbSBhIFZOb2RlIHRvIHRoZSBnaXZlbiBET00gRWxlbWVudC5cbiAqXHRAcGFyYW0ge0VsZW1lbnR9IGRvbVx0XHRFbGVtZW50IHdpdGggYXR0cmlidXRlcyB0byBkaWZmIGBhdHRyc2AgYWdhaW5zdFxuICpcdEBwYXJhbSB7T2JqZWN0fSBhdHRyc1x0XHRUaGUgZGVzaXJlZCBlbmQtc3RhdGUga2V5LXZhbHVlIGF0dHJpYnV0ZSBwYWlyc1xuICpcdEBwYXJhbSB7T2JqZWN0fSBvbGRcdFx0XHRDdXJyZW50L3ByZXZpb3VzIGF0dHJpYnV0ZXMgKGZyb20gcHJldmlvdXMgVk5vZGUgb3IgZWxlbWVudCdzIHByb3AgY2FjaGUpXG4gKi9cbmZ1bmN0aW9uIGRpZmZBdHRyaWJ1dGVzKGRvbSwgYXR0cnMsIG9sZCkge1xuXHQvLyByZW1vdmUgYXR0cmlidXRlcyBubyBsb25nZXIgcHJlc2VudCBvbiB0aGUgdm5vZGUgYnkgc2V0dGluZyB0aGVtIHRvIHVuZGVmaW5lZFxuXHRmb3IgKGxldCBuYW1lIGluIG9sZCkge1xuXHRcdGlmICghKGF0dHJzICYmIG5hbWUgaW4gYXR0cnMpICYmIG9sZFtuYW1lXSE9bnVsbCkge1xuXHRcdFx0c2V0QWNjZXNzb3IoZG9tLCBuYW1lLCBvbGRbbmFtZV0sIG9sZFtuYW1lXSA9IHVuZGVmaW5lZCwgaXNTdmdNb2RlKTtcblx0XHR9XG5cdH1cblxuXHQvLyBhZGQgbmV3ICYgdXBkYXRlIGNoYW5nZWQgYXR0cmlidXRlc1xuXHRpZiAoYXR0cnMpIHtcblx0XHRmb3IgKGxldCBuYW1lIGluIGF0dHJzKSB7XG5cdFx0XHRpZiAobmFtZSE9PSdjaGlsZHJlbicgJiYgbmFtZSE9PSdpbm5lckhUTUwnICYmICghKG5hbWUgaW4gb2xkKSB8fCBhdHRyc1tuYW1lXSE9PShuYW1lPT09J3ZhbHVlJyB8fCBuYW1lPT09J2NoZWNrZWQnID8gZG9tW25hbWVdIDogb2xkW25hbWVdKSkpIHtcblx0XHRcdFx0c2V0QWNjZXNzb3IoZG9tLCBuYW1lLCBvbGRbbmFtZV0sIG9sZFtuYW1lXSA9IGF0dHJzW25hbWVdLCBpc1N2Z01vZGUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9+L3ByZWFjdC9zcmMvdmRvbS9kaWZmLmpzXG4gKiovIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50JztcblxuLyoqIFJldGFpbnMgYSBwb29sIG9mIENvbXBvbmVudHMgZm9yIHJlLXVzZSwga2V5ZWQgb24gY29tcG9uZW50IG5hbWUuXG4gKlx0Tm90ZTogc2luY2UgY29tcG9uZW50IG5hbWVzIGFyZSBub3QgdW5pcXVlIG9yIGV2ZW4gbmVjZXNzYXJpbHkgYXZhaWxhYmxlLCB0aGVzZSBhcmUgcHJpbWFyaWx5IGEgZm9ybSBvZiBzaGFyZGluZy5cbiAqXHRAcHJpdmF0ZVxuICovXG5jb25zdCBjb21wb25lbnRzID0ge307XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RDb21wb25lbnQoY29tcG9uZW50KSB7XG5cdGxldCBuYW1lID0gY29tcG9uZW50LmNvbnN0cnVjdG9yLm5hbWUsXG5cdFx0bGlzdCA9IGNvbXBvbmVudHNbbmFtZV07XG5cdGlmIChsaXN0KSBsaXN0LnB1c2goY29tcG9uZW50KTtcblx0ZWxzZSBjb21wb25lbnRzW25hbWVdID0gW2NvbXBvbmVudF07XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudChDdG9yLCBwcm9wcywgY29udGV4dCkge1xuXHRsZXQgaW5zdCA9IG5ldyBDdG9yKHByb3BzLCBjb250ZXh0KSxcblx0XHRsaXN0ID0gY29tcG9uZW50c1tDdG9yLm5hbWVdO1xuXHRDb21wb25lbnQuY2FsbChpbnN0LCBwcm9wcywgY29udGV4dCk7XG5cdGlmIChsaXN0KSB7XG5cdFx0Zm9yIChsZXQgaT1saXN0Lmxlbmd0aDsgaS0tOyApIHtcblx0XHRcdGlmIChsaXN0W2ldLmNvbnN0cnVjdG9yPT09Q3Rvcikge1xuXHRcdFx0XHRpbnN0Lm5leHRCYXNlID0gbGlzdFtpXS5uZXh0QmFzZTtcblx0XHRcdFx0bGlzdC5zcGxpY2UoaSwgMSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gaW5zdDtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vfi9wcmVhY3Qvc3JjL3Zkb20vY29tcG9uZW50LXJlY3ljbGVyLmpzXG4gKiovIiwiaW1wb3J0IHsgU1lOQ19SRU5ERVIsIE5PX1JFTkRFUiwgRk9SQ0VfUkVOREVSLCBBU1lOQ19SRU5ERVIsIEFUVFJfS0VZIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCBvcHRpb25zIGZyb20gJy4uL29wdGlvbnMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiwgY2xvbmUsIGV4dGVuZCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgZW5xdWV1ZVJlbmRlciB9IGZyb20gJy4uL3JlbmRlci1xdWV1ZSc7XG5pbXBvcnQgeyBnZXROb2RlUHJvcHMgfSBmcm9tICcuL2luZGV4JztcbmltcG9ydCB7IGRpZmYsIG1vdW50cywgZGlmZkxldmVsLCBmbHVzaE1vdW50cywgcmVjb2xsZWN0Tm9kZVRyZWUgfSBmcm9tICcuL2RpZmYnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbmFsQ29tcG9uZW50LCBidWlsZEZ1bmN0aW9uYWxDb21wb25lbnQgfSBmcm9tICcuL2Z1bmN0aW9uYWwtY29tcG9uZW50JztcbmltcG9ydCB7IGNyZWF0ZUNvbXBvbmVudCwgY29sbGVjdENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50LXJlY3ljbGVyJztcbmltcG9ydCB7IHJlbW92ZU5vZGUgfSBmcm9tICcuLi9kb20vaW5kZXgnO1xuXG5cblxuLyoqIFNldCBhIGNvbXBvbmVudCdzIGBwcm9wc2AgKGdlbmVyYWxseSBkZXJpdmVkIGZyb20gSlNYIGF0dHJpYnV0ZXMpLlxuICpcdEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICpcdEBwYXJhbSB7T2JqZWN0fSBbb3B0c11cbiAqXHRAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnJlbmRlclN5bmM9ZmFsc2VdXHRJZiBgdHJ1ZWAgYW5kIHtAbGluayBvcHRpb25zLnN5bmNDb21wb25lbnRVcGRhdGVzfSBpcyBgdHJ1ZWAsIHRyaWdnZXJzIHN5bmNocm9ub3VzIHJlbmRlcmluZy5cbiAqXHRAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnJlbmRlcj10cnVlXVx0XHRcdElmIGBmYWxzZWAsIG5vIHJlbmRlciB3aWxsIGJlIHRyaWdnZXJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldENvbXBvbmVudFByb3BzKGNvbXBvbmVudCwgcHJvcHMsIG9wdHMsIGNvbnRleHQsIG1vdW50QWxsKSB7XG5cdGlmIChjb21wb25lbnQuX2Rpc2FibGUpIHJldHVybjtcblx0Y29tcG9uZW50Ll9kaXNhYmxlID0gdHJ1ZTtcblxuXHRpZiAoKGNvbXBvbmVudC5fX3JlZiA9IHByb3BzLnJlZikpIGRlbGV0ZSBwcm9wcy5yZWY7XG5cdGlmICgoY29tcG9uZW50Ll9fa2V5ID0gcHJvcHMua2V5KSkgZGVsZXRlIHByb3BzLmtleTtcblxuXHRpZiAoIWNvbXBvbmVudC5iYXNlIHx8IG1vdW50QWxsKSB7XG5cdFx0aWYgKGNvbXBvbmVudC5jb21wb25lbnRXaWxsTW91bnQpIGNvbXBvbmVudC5jb21wb25lbnRXaWxsTW91bnQoKTtcblx0fVxuXHRlbHNlIGlmIChjb21wb25lbnQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcykge1xuXHRcdGNvbXBvbmVudC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHByb3BzLCBjb250ZXh0KTtcblx0fVxuXG5cdGlmIChjb250ZXh0ICYmIGNvbnRleHQhPT1jb21wb25lbnQuY29udGV4dCkge1xuXHRcdGlmICghY29tcG9uZW50LnByZXZDb250ZXh0KSBjb21wb25lbnQucHJldkNvbnRleHQgPSBjb21wb25lbnQuY29udGV4dDtcblx0XHRjb21wb25lbnQuY29udGV4dCA9IGNvbnRleHQ7XG5cdH1cblxuXHRpZiAoIWNvbXBvbmVudC5wcmV2UHJvcHMpIGNvbXBvbmVudC5wcmV2UHJvcHMgPSBjb21wb25lbnQucHJvcHM7XG5cdGNvbXBvbmVudC5wcm9wcyA9IHByb3BzO1xuXG5cdGNvbXBvbmVudC5fZGlzYWJsZSA9IGZhbHNlO1xuXG5cdGlmIChvcHRzIT09Tk9fUkVOREVSKSB7XG5cdFx0aWYgKG9wdHM9PT1TWU5DX1JFTkRFUiB8fCBvcHRpb25zLnN5bmNDb21wb25lbnRVcGRhdGVzIT09ZmFsc2UgfHwgIWNvbXBvbmVudC5iYXNlKSB7XG5cdFx0XHRyZW5kZXJDb21wb25lbnQoY29tcG9uZW50LCBTWU5DX1JFTkRFUiwgbW91bnRBbGwpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGVucXVldWVSZW5kZXIoY29tcG9uZW50KTtcblx0XHR9XG5cdH1cblxuXHRpZiAoY29tcG9uZW50Ll9fcmVmKSBjb21wb25lbnQuX19yZWYoY29tcG9uZW50KTtcbn1cblxuXG5cbi8qKiBSZW5kZXIgYSBDb21wb25lbnQsIHRyaWdnZXJpbmcgbmVjZXNzYXJ5IGxpZmVjeWNsZSBldmVudHMgYW5kIHRha2luZyBIaWdoLU9yZGVyIENvbXBvbmVudHMgaW50byBhY2NvdW50LlxuICpcdEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnRcbiAqXHRAcGFyYW0ge09iamVjdH0gW29wdHNdXG4gKlx0QHBhcmFtIHtib29sZWFufSBbb3B0cy5idWlsZD1mYWxzZV1cdFx0SWYgYHRydWVgLCBjb21wb25lbnQgd2lsbCBidWlsZCBhbmQgc3RvcmUgYSBET00gbm9kZSBpZiBub3QgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggb25lLlxuICpcdEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJDb21wb25lbnQoY29tcG9uZW50LCBvcHRzLCBtb3VudEFsbCwgaXNDaGlsZCkge1xuXHRpZiAoY29tcG9uZW50Ll9kaXNhYmxlKSByZXR1cm47XG5cblx0bGV0IHNraXAsIHJlbmRlcmVkLFxuXHRcdHByb3BzID0gY29tcG9uZW50LnByb3BzLFxuXHRcdHN0YXRlID0gY29tcG9uZW50LnN0YXRlLFxuXHRcdGNvbnRleHQgPSBjb21wb25lbnQuY29udGV4dCxcblx0XHRwcmV2aW91c1Byb3BzID0gY29tcG9uZW50LnByZXZQcm9wcyB8fCBwcm9wcyxcblx0XHRwcmV2aW91c1N0YXRlID0gY29tcG9uZW50LnByZXZTdGF0ZSB8fCBzdGF0ZSxcblx0XHRwcmV2aW91c0NvbnRleHQgPSBjb21wb25lbnQucHJldkNvbnRleHQgfHwgY29udGV4dCxcblx0XHRpc1VwZGF0ZSA9IGNvbXBvbmVudC5iYXNlLFxuXHRcdG5leHRCYXNlID0gY29tcG9uZW50Lm5leHRCYXNlLFxuXHRcdGluaXRpYWxCYXNlID0gaXNVcGRhdGUgfHwgbmV4dEJhc2UsXG5cdFx0aW5pdGlhbENoaWxkQ29tcG9uZW50ID0gY29tcG9uZW50Ll9jb21wb25lbnQsXG5cdFx0aW5zdCwgY2Jhc2U7XG5cblx0Ly8gaWYgdXBkYXRpbmdcblx0aWYgKGlzVXBkYXRlKSB7XG5cdFx0Y29tcG9uZW50LnByb3BzID0gcHJldmlvdXNQcm9wcztcblx0XHRjb21wb25lbnQuc3RhdGUgPSBwcmV2aW91c1N0YXRlO1xuXHRcdGNvbXBvbmVudC5jb250ZXh0ID0gcHJldmlvdXNDb250ZXh0O1xuXHRcdGlmIChvcHRzIT09Rk9SQ0VfUkVOREVSXG5cdFx0XHQmJiBjb21wb25lbnQuc2hvdWxkQ29tcG9uZW50VXBkYXRlXG5cdFx0XHQmJiBjb21wb25lbnQuc2hvdWxkQ29tcG9uZW50VXBkYXRlKHByb3BzLCBzdGF0ZSwgY29udGV4dCkgPT09IGZhbHNlKSB7XG5cdFx0XHRza2lwID0gdHJ1ZTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoY29tcG9uZW50LmNvbXBvbmVudFdpbGxVcGRhdGUpIHtcblx0XHRcdGNvbXBvbmVudC5jb21wb25lbnRXaWxsVXBkYXRlKHByb3BzLCBzdGF0ZSwgY29udGV4dCk7XG5cdFx0fVxuXHRcdGNvbXBvbmVudC5wcm9wcyA9IHByb3BzO1xuXHRcdGNvbXBvbmVudC5zdGF0ZSA9IHN0YXRlO1xuXHRcdGNvbXBvbmVudC5jb250ZXh0ID0gY29udGV4dDtcblx0fVxuXG5cdGNvbXBvbmVudC5wcmV2UHJvcHMgPSBjb21wb25lbnQucHJldlN0YXRlID0gY29tcG9uZW50LnByZXZDb250ZXh0ID0gY29tcG9uZW50Lm5leHRCYXNlID0gbnVsbDtcblx0Y29tcG9uZW50Ll9kaXJ0eSA9IGZhbHNlO1xuXG5cdGlmICghc2tpcCkge1xuXHRcdGlmIChjb21wb25lbnQucmVuZGVyKSByZW5kZXJlZCA9IGNvbXBvbmVudC5yZW5kZXIocHJvcHMsIHN0YXRlLCBjb250ZXh0KTtcblxuXHRcdC8vIGNvbnRleHQgdG8gcGFzcyB0byB0aGUgY2hpbGQsIGNhbiBiZSB1cGRhdGVkIHZpYSAoZ3JhbmQtKXBhcmVudCBjb21wb25lbnRcblx0XHRpZiAoY29tcG9uZW50LmdldENoaWxkQ29udGV4dCkge1xuXHRcdFx0Y29udGV4dCA9IGV4dGVuZChjbG9uZShjb250ZXh0KSwgY29tcG9uZW50LmdldENoaWxkQ29udGV4dCgpKTtcblx0XHR9XG5cblx0XHR3aGlsZSAoaXNGdW5jdGlvbmFsQ29tcG9uZW50KHJlbmRlcmVkKSkge1xuXHRcdFx0cmVuZGVyZWQgPSBidWlsZEZ1bmN0aW9uYWxDb21wb25lbnQocmVuZGVyZWQsIGNvbnRleHQpO1xuXHRcdH1cblxuXHRcdGxldCBjaGlsZENvbXBvbmVudCA9IHJlbmRlcmVkICYmIHJlbmRlcmVkLm5vZGVOYW1lLFxuXHRcdFx0dG9Vbm1vdW50LCBiYXNlO1xuXG5cdFx0aWYgKGlzRnVuY3Rpb24oY2hpbGRDb21wb25lbnQpKSB7XG5cdFx0XHQvLyBzZXQgdXAgaGlnaCBvcmRlciBjb21wb25lbnQgbGlua1xuXG5cdFx0XHRsZXQgY2hpbGRQcm9wcyA9IGdldE5vZGVQcm9wcyhyZW5kZXJlZCk7XG5cdFx0XHRpbnN0ID0gaW5pdGlhbENoaWxkQ29tcG9uZW50O1xuXG5cdFx0XHRpZiAoaW5zdCAmJiBpbnN0LmNvbnN0cnVjdG9yPT09Y2hpbGRDb21wb25lbnQgJiYgY2hpbGRQcm9wcy5rZXk9PWluc3QuX19rZXkpIHtcblx0XHRcdFx0c2V0Q29tcG9uZW50UHJvcHMoaW5zdCwgY2hpbGRQcm9wcywgU1lOQ19SRU5ERVIsIGNvbnRleHQpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHRvVW5tb3VudCA9IGluc3Q7XG5cblx0XHRcdFx0aW5zdCA9IGNyZWF0ZUNvbXBvbmVudChjaGlsZENvbXBvbmVudCwgY2hpbGRQcm9wcywgY29udGV4dCk7XG5cdFx0XHRcdGluc3QubmV4dEJhc2UgPSBpbnN0Lm5leHRCYXNlIHx8IG5leHRCYXNlO1xuXHRcdFx0XHRpbnN0Ll9wYXJlbnRDb21wb25lbnQgPSBjb21wb25lbnQ7XG5cdFx0XHRcdGNvbXBvbmVudC5fY29tcG9uZW50ID0gaW5zdDtcblx0XHRcdFx0c2V0Q29tcG9uZW50UHJvcHMoaW5zdCwgY2hpbGRQcm9wcywgTk9fUkVOREVSLCBjb250ZXh0KTtcblx0XHRcdFx0cmVuZGVyQ29tcG9uZW50KGluc3QsIFNZTkNfUkVOREVSLCBtb3VudEFsbCwgdHJ1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGJhc2UgPSBpbnN0LmJhc2U7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Y2Jhc2UgPSBpbml0aWFsQmFzZTtcblxuXHRcdFx0Ly8gZGVzdHJveSBoaWdoIG9yZGVyIGNvbXBvbmVudCBsaW5rXG5cdFx0XHR0b1VubW91bnQgPSBpbml0aWFsQ2hpbGRDb21wb25lbnQ7XG5cdFx0XHRpZiAodG9Vbm1vdW50KSB7XG5cdFx0XHRcdGNiYXNlID0gY29tcG9uZW50Ll9jb21wb25lbnQgPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaW5pdGlhbEJhc2UgfHwgb3B0cz09PVNZTkNfUkVOREVSKSB7XG5cdFx0XHRcdGlmIChjYmFzZSkgY2Jhc2UuX2NvbXBvbmVudCA9IG51bGw7XG5cdFx0XHRcdGJhc2UgPSBkaWZmKGNiYXNlLCByZW5kZXJlZCwgY29udGV4dCwgbW91bnRBbGwgfHwgIWlzVXBkYXRlLCBpbml0aWFsQmFzZSAmJiBpbml0aWFsQmFzZS5wYXJlbnROb2RlLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaW5pdGlhbEJhc2UgJiYgYmFzZSE9PWluaXRpYWxCYXNlICYmIGluc3QhPT1pbml0aWFsQ2hpbGRDb21wb25lbnQpIHtcblx0XHRcdGxldCBiYXNlUGFyZW50ID0gaW5pdGlhbEJhc2UucGFyZW50Tm9kZTtcblx0XHRcdGlmIChiYXNlUGFyZW50ICYmIGJhc2UhPT1iYXNlUGFyZW50KSB7XG5cdFx0XHRcdGJhc2VQYXJlbnQucmVwbGFjZUNoaWxkKGJhc2UsIGluaXRpYWxCYXNlKTtcblxuXHRcdFx0XHRpZiAoIXRvVW5tb3VudCkge1xuXHRcdFx0XHRcdGluaXRpYWxCYXNlLl9jb21wb25lbnQgPSBudWxsO1xuXHRcdFx0XHRcdHJlY29sbGVjdE5vZGVUcmVlKGluaXRpYWxCYXNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0b1VubW91bnQpIHtcblx0XHRcdHVubW91bnRDb21wb25lbnQodG9Vbm1vdW50LCBiYXNlIT09aW5pdGlhbEJhc2UpO1xuXHRcdH1cblxuXHRcdGNvbXBvbmVudC5iYXNlID0gYmFzZTtcblx0XHRpZiAoYmFzZSAmJiAhaXNDaGlsZCkge1xuXHRcdFx0bGV0IGNvbXBvbmVudFJlZiA9IGNvbXBvbmVudCxcblx0XHRcdFx0dCA9IGNvbXBvbmVudDtcblx0XHRcdHdoaWxlICgodD10Ll9wYXJlbnRDb21wb25lbnQpKSB7XG5cdFx0XHRcdChjb21wb25lbnRSZWYgPSB0KS5iYXNlID0gYmFzZTtcblx0XHRcdH1cblx0XHRcdGJhc2UuX2NvbXBvbmVudCA9IGNvbXBvbmVudFJlZjtcblx0XHRcdGJhc2UuX2NvbXBvbmVudENvbnN0cnVjdG9yID0gY29tcG9uZW50UmVmLmNvbnN0cnVjdG9yO1xuXHRcdH1cblx0fVxuXG5cdGlmICghaXNVcGRhdGUgfHwgbW91bnRBbGwpIHtcblx0XHRtb3VudHMudW5zaGlmdChjb21wb25lbnQpO1xuXHR9XG5cdGVsc2UgaWYgKCFza2lwKSB7XG5cdFx0aWYgKGNvbXBvbmVudC5jb21wb25lbnREaWRVcGRhdGUpIHtcblx0XHRcdGNvbXBvbmVudC5jb21wb25lbnREaWRVcGRhdGUocHJldmlvdXNQcm9wcywgcHJldmlvdXNTdGF0ZSwgcHJldmlvdXNDb250ZXh0KTtcblx0XHR9XG5cdFx0aWYgKG9wdGlvbnMuYWZ0ZXJVcGRhdGUpIG9wdGlvbnMuYWZ0ZXJVcGRhdGUoY29tcG9uZW50KTtcblx0fVxuXG5cdGxldCBjYiA9IGNvbXBvbmVudC5fcmVuZGVyQ2FsbGJhY2tzLCBmbjtcblx0aWYgKGNiKSB3aGlsZSAoIChmbiA9IGNiLnBvcCgpKSApIGZuLmNhbGwoY29tcG9uZW50KTtcblxuXHRpZiAoIWRpZmZMZXZlbCAmJiAhaXNDaGlsZCkgZmx1c2hNb3VudHMoKTtcbn1cblxuXG5cbi8qKiBBcHBseSB0aGUgQ29tcG9uZW50IHJlZmVyZW5jZWQgYnkgYSBWTm9kZSB0byB0aGUgRE9NLlxuICpcdEBwYXJhbSB7RWxlbWVudH0gZG9tXHRUaGUgRE9NIG5vZGUgdG8gbXV0YXRlXG4gKlx0QHBhcmFtIHtWTm9kZX0gdm5vZGVcdEEgQ29tcG9uZW50LXJlZmVyZW5jaW5nIFZOb2RlXG4gKlx0QHJldHVybnMge0VsZW1lbnR9IGRvbVx0VGhlIGNyZWF0ZWQvbXV0YXRlZCBlbGVtZW50XG4gKlx0QHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29tcG9uZW50RnJvbVZOb2RlKGRvbSwgdm5vZGUsIGNvbnRleHQsIG1vdW50QWxsKSB7XG5cdGxldCBjID0gZG9tICYmIGRvbS5fY29tcG9uZW50LFxuXHRcdG9sZERvbSA9IGRvbSxcblx0XHRpc0RpcmVjdE93bmVyID0gYyAmJiBkb20uX2NvbXBvbmVudENvbnN0cnVjdG9yPT09dm5vZGUubm9kZU5hbWUsXG5cdFx0aXNPd25lciA9IGlzRGlyZWN0T3duZXIsXG5cdFx0cHJvcHMgPSBnZXROb2RlUHJvcHModm5vZGUpO1xuXHR3aGlsZSAoYyAmJiAhaXNPd25lciAmJiAoYz1jLl9wYXJlbnRDb21wb25lbnQpKSB7XG5cdFx0aXNPd25lciA9IGMuY29uc3RydWN0b3I9PT12bm9kZS5ub2RlTmFtZTtcblx0fVxuXG5cdGlmIChjICYmIGlzT3duZXIgJiYgKCFtb3VudEFsbCB8fCBjLl9jb21wb25lbnQpKSB7XG5cdFx0c2V0Q29tcG9uZW50UHJvcHMoYywgcHJvcHMsIEFTWU5DX1JFTkRFUiwgY29udGV4dCwgbW91bnRBbGwpO1xuXHRcdGRvbSA9IGMuYmFzZTtcblx0fVxuXHRlbHNlIHtcblx0XHRpZiAoYyAmJiAhaXNEaXJlY3RPd25lcikge1xuXHRcdFx0dW5tb3VudENvbXBvbmVudChjLCB0cnVlKTtcblx0XHRcdGRvbSA9IG9sZERvbSA9IG51bGw7XG5cdFx0fVxuXG5cdFx0YyA9IGNyZWF0ZUNvbXBvbmVudCh2bm9kZS5ub2RlTmFtZSwgcHJvcHMsIGNvbnRleHQpO1xuXHRcdGlmIChkb20gJiYgIWMubmV4dEJhc2UpIHtcblx0XHRcdGMubmV4dEJhc2UgPSBkb207XG5cdFx0XHQvLyBwYXNzaW5nIGRvbS9vbGREb20gYXMgbmV4dEJhc2Ugd2lsbCByZWN5Y2xlIGl0IGlmIHVudXNlZCwgc28gYnlwYXNzIHJlY3ljbGluZyBvbiBMMjQxOlxuXHRcdFx0b2xkRG9tID0gbnVsbDtcblx0XHR9XG5cdFx0c2V0Q29tcG9uZW50UHJvcHMoYywgcHJvcHMsIFNZTkNfUkVOREVSLCBjb250ZXh0LCBtb3VudEFsbCk7XG5cdFx0ZG9tID0gYy5iYXNlO1xuXG5cdFx0aWYgKG9sZERvbSAmJiBkb20hPT1vbGREb20pIHtcblx0XHRcdG9sZERvbS5fY29tcG9uZW50ID0gbnVsbDtcblx0XHRcdHJlY29sbGVjdE5vZGVUcmVlKG9sZERvbSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGRvbTtcbn1cblxuXG5cbi8qKiBSZW1vdmUgYSBjb21wb25lbnQgZnJvbSB0aGUgRE9NIGFuZCByZWN5Y2xlIGl0LlxuICpcdEBwYXJhbSB7RWxlbWVudH0gZG9tXHRcdFx0QSBET00gbm9kZSBmcm9tIHdoaWNoIHRvIHVubW91bnQgdGhlIGdpdmVuIENvbXBvbmVudFxuICpcdEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnRcdFRoZSBDb21wb25lbnQgaW5zdGFuY2UgdG8gdW5tb3VudFxuICpcdEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50KGNvbXBvbmVudCwgcmVtb3ZlKSB7XG5cdGlmIChvcHRpb25zLmJlZm9yZVVubW91bnQpIG9wdGlvbnMuYmVmb3JlVW5tb3VudChjb21wb25lbnQpO1xuXG5cdC8vIGNvbnNvbGUubG9nKGAke3JlbW92ZT8nUmVtb3ZpbmcnOidVbm1vdW50aW5nJ30gY29tcG9uZW50OiAke2NvbXBvbmVudC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuXHRsZXQgYmFzZSA9IGNvbXBvbmVudC5iYXNlO1xuXG5cdGNvbXBvbmVudC5fZGlzYWJsZSA9IHRydWU7XG5cblx0aWYgKGNvbXBvbmVudC5jb21wb25lbnRXaWxsVW5tb3VudCkgY29tcG9uZW50LmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG5cblx0Y29tcG9uZW50LmJhc2UgPSBudWxsO1xuXG5cdC8vIHJlY3Vyc2l2ZWx5IHRlYXIgZG93biAmIHJlY29sbGVjdCBoaWdoLW9yZGVyIGNvbXBvbmVudCBjaGlsZHJlbjpcblx0bGV0IGlubmVyID0gY29tcG9uZW50Ll9jb21wb25lbnQ7XG5cdGlmIChpbm5lcikge1xuXHRcdHVubW91bnRDb21wb25lbnQoaW5uZXIsIHJlbW92ZSk7XG5cdH1cblx0ZWxzZSBpZiAoYmFzZSkge1xuXHRcdGlmIChiYXNlW0FUVFJfS0VZXSAmJiBiYXNlW0FUVFJfS0VZXS5yZWYpIGJhc2VbQVRUUl9LRVldLnJlZihudWxsKTtcblxuXHRcdGNvbXBvbmVudC5uZXh0QmFzZSA9IGJhc2U7XG5cblx0XHRpZiAocmVtb3ZlKSB7XG5cdFx0XHRyZW1vdmVOb2RlKGJhc2UpO1xuXHRcdFx0Y29sbGVjdENvbXBvbmVudChjb21wb25lbnQpO1xuXHRcdH1cblx0XHRsZXQgYztcblx0XHR3aGlsZSAoKGM9YmFzZS5sYXN0Q2hpbGQpKSByZWNvbGxlY3ROb2RlVHJlZShjLCAhcmVtb3ZlKTtcblx0XHQvLyByZW1vdmVPcnBoYW5lZENoaWxkcmVuKGJhc2UuY2hpbGROb2RlcywgdHJ1ZSk7XG5cdH1cblxuXHRpZiAoY29tcG9uZW50Ll9fcmVmKSBjb21wb25lbnQuX19yZWYobnVsbCk7XG5cdGlmIChjb21wb25lbnQuY29tcG9uZW50RGlkVW5tb3VudCkgY29tcG9uZW50LmNvbXBvbmVudERpZFVubW91bnQoKTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vfi9wcmVhY3Qvc3JjL3Zkb20vY29tcG9uZW50LmpzXG4gKiovIiwiaW1wb3J0IHsgRk9SQ0VfUkVOREVSIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZXh0ZW5kLCBjbG9uZSwgaXNGdW5jdGlvbiB9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgeyBjcmVhdGVMaW5rZWRTdGF0ZSB9IGZyb20gJy4vbGlua2VkLXN0YXRlJztcbmltcG9ydCB7IHJlbmRlckNvbXBvbmVudCB9IGZyb20gJy4vdmRvbS9jb21wb25lbnQnO1xuaW1wb3J0IHsgZW5xdWV1ZVJlbmRlciB9IGZyb20gJy4vcmVuZGVyLXF1ZXVlJztcblxuLyoqIEJhc2UgQ29tcG9uZW50IGNsYXNzLCBmb3IgaGUgRVM2IENsYXNzIG1ldGhvZCBvZiBjcmVhdGluZyBDb21wb25lbnRzXG4gKlx0QHB1YmxpY1xuICpcbiAqXHRAZXhhbXBsZVxuICpcdGNsYXNzIE15Rm9vIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAqXHRcdHJlbmRlcihwcm9wcywgc3RhdGUpIHtcbiAqXHRcdFx0cmV0dXJuIDxkaXYgLz47XG4gKlx0XHR9XG4gKlx0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29tcG9uZW50KHByb3BzLCBjb250ZXh0KSB7XG5cdC8qKiBAcHJpdmF0ZSAqL1xuXHR0aGlzLl9kaXJ0eSA9IHRydWU7XG5cdC8vIC8qKiBAcHVibGljICovXG5cdC8vIHRoaXMuX2Rpc2FibGVSZW5kZXJpbmcgPSBmYWxzZTtcblx0Ly8gLyoqIEBwdWJsaWMgKi9cblx0Ly8gdGhpcy5wcmV2U3RhdGUgPSB0aGlzLnByZXZQcm9wcyA9IHRoaXMucHJldkNvbnRleHQgPSB0aGlzLmJhc2UgPSB0aGlzLm5leHRCYXNlID0gdGhpcy5fcGFyZW50Q29tcG9uZW50ID0gdGhpcy5fY29tcG9uZW50ID0gdGhpcy5fX3JlZiA9IHRoaXMuX19rZXkgPSB0aGlzLl9saW5rZWRTdGF0ZXMgPSB0aGlzLl9yZW5kZXJDYWxsYmFja3MgPSBudWxsO1xuXHQvKiogQHB1YmxpYyAqL1xuXHR0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuXHQvKiogQHR5cGUge29iamVjdH0gKi9cblx0dGhpcy5wcm9wcyA9IHByb3BzO1xuXHQvKiogQHR5cGUge29iamVjdH0gKi9cblx0aWYgKCF0aGlzLnN0YXRlKSB0aGlzLnN0YXRlID0ge307XG59XG5cblxuZXh0ZW5kKENvbXBvbmVudC5wcm90b3R5cGUsIHtcblxuXHQvKiogUmV0dXJucyBhIGBib29sZWFuYCB2YWx1ZSBpbmRpY2F0aW5nIGlmIHRoZSBjb21wb25lbnQgc2hvdWxkIHJlLXJlbmRlciB3aGVuIHJlY2VpdmluZyB0aGUgZ2l2ZW4gYHByb3BzYCBhbmQgYHN0YXRlYC5cblx0ICpcdEBwYXJhbSB7b2JqZWN0fSBuZXh0UHJvcHNcblx0ICpcdEBwYXJhbSB7b2JqZWN0fSBuZXh0U3RhdGVcblx0ICpcdEBwYXJhbSB7b2JqZWN0fSBuZXh0Q29udGV4dFxuXHQgKlx0QHJldHVybnMge0Jvb2xlYW59IHNob3VsZCB0aGUgY29tcG9uZW50IHJlLXJlbmRlclxuXHQgKlx0QG5hbWUgc2hvdWxkQ29tcG9uZW50VXBkYXRlXG5cdCAqXHRAZnVuY3Rpb25cblx0ICovXG5cdC8vIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpIHtcblx0Ly8gXHRyZXR1cm4gdHJ1ZTtcblx0Ly8gfSxcblxuXG5cdC8qKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBzZXRzIGEgc3RhdGUgcHJvcGVydHkgd2hlbiBjYWxsZWQuXG5cdCAqXHRDYWxsaW5nIGxpbmtTdGF0ZSgpIHJlcGVhdGVkbHkgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMgcmV0dXJucyBhIGNhY2hlZCBsaW5rIGZ1bmN0aW9uLlxuXHQgKlxuXHQgKlx0UHJvdmlkZXMgc29tZSBidWlsdC1pbiBzcGVjaWFsIGNhc2VzOlxuXHQgKlx0XHQtIENoZWNrYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMgbGluayB0aGVpciBib29sZWFuIGBjaGVja2VkYCB2YWx1ZVxuXHQgKlx0XHQtIElucHV0cyBhdXRvbWF0aWNhbGx5IGxpbmsgdGhlaXIgYHZhbHVlYCBwcm9wZXJ0eVxuXHQgKlx0XHQtIEV2ZW50IHBhdGhzIGZhbGwgYmFjayB0byBhbnkgYXNzb2NpYXRlZCBDb21wb25lbnQgaWYgbm90IGZvdW5kIG9uIGFuIGVsZW1lbnRcblx0ICpcdFx0LSBJZiBsaW5rZWQgdmFsdWUgaXMgYSBmdW5jdGlvbiwgd2lsbCBpbnZva2UgaXQgYW5kIHVzZSB0aGUgcmVzdWx0XG5cdCAqXG5cdCAqXHRAcGFyYW0ge3N0cmluZ30ga2V5XHRcdFx0XHRUaGUgcGF0aCB0byBzZXQgLSBjYW4gYmUgYSBkb3Qtbm90YXRlZCBkZWVwIGtleVxuXHQgKlx0QHBhcmFtIHtzdHJpbmd9IFtldmVudFBhdGhdXHRcdElmIHNldCwgYXR0ZW1wdHMgdG8gZmluZCB0aGUgbmV3IHN0YXRlIHZhbHVlIGF0IGEgZ2l2ZW4gZG90LW5vdGF0ZWQgcGF0aCB3aXRoaW4gdGhlIG9iamVjdCBwYXNzZWQgdG8gdGhlIGxpbmtlZFN0YXRlIHNldHRlci5cblx0ICpcdEByZXR1cm5zIHtmdW5jdGlvbn0gbGlua1N0YXRlU2V0dGVyKGUpXG5cdCAqXG5cdCAqXHRAZXhhbXBsZSBVcGRhdGUgYSBcInRleHRcIiBzdGF0ZSB2YWx1ZSB3aGVuIGFuIGlucHV0IGNoYW5nZXM6XG5cdCAqXHRcdDxpbnB1dCBvbkNoYW5nZT17IHRoaXMubGlua1N0YXRlKCd0ZXh0JykgfSAvPlxuXHQgKlxuXHQgKlx0QGV4YW1wbGUgU2V0IGEgZGVlcCBzdGF0ZSB2YWx1ZSBvbiBjbGlja1xuXHQgKlx0XHQ8YnV0dG9uIG9uQ2xpY2s9eyB0aGlzLmxpbmtTdGF0ZSgndG91Y2guY29vcmRzJywgJ3RvdWNoZXMuMCcpIH0+VGFwPC9idXR0b25cblx0ICovXG5cdGxpbmtTdGF0ZShrZXksIGV2ZW50UGF0aCkge1xuXHRcdGxldCBjID0gdGhpcy5fbGlua2VkU3RhdGVzIHx8ICh0aGlzLl9saW5rZWRTdGF0ZXMgPSB7fSk7XG5cdFx0cmV0dXJuIGNba2V5K2V2ZW50UGF0aF0gfHwgKGNba2V5K2V2ZW50UGF0aF0gPSBjcmVhdGVMaW5rZWRTdGF0ZSh0aGlzLCBrZXksIGV2ZW50UGF0aCkpO1xuXHR9LFxuXG5cblx0LyoqIFVwZGF0ZSBjb21wb25lbnQgc3RhdGUgYnkgY29weWluZyBwcm9wZXJ0aWVzIGZyb20gYHN0YXRlYCB0byBgdGhpcy5zdGF0ZWAuXG5cdCAqXHRAcGFyYW0ge29iamVjdH0gc3RhdGVcdFx0QSBoYXNoIG9mIHN0YXRlIHByb3BlcnRpZXMgdG8gdXBkYXRlIHdpdGggbmV3IHZhbHVlc1xuXHQgKi9cblx0c2V0U3RhdGUoc3RhdGUsIGNhbGxiYWNrKSB7XG5cdFx0bGV0IHMgPSB0aGlzLnN0YXRlO1xuXHRcdGlmICghdGhpcy5wcmV2U3RhdGUpIHRoaXMucHJldlN0YXRlID0gY2xvbmUocyk7XG5cdFx0ZXh0ZW5kKHMsIGlzRnVuY3Rpb24oc3RhdGUpID8gc3RhdGUocywgdGhpcy5wcm9wcykgOiBzdGF0ZSk7XG5cdFx0aWYgKGNhbGxiYWNrKSAodGhpcy5fcmVuZGVyQ2FsbGJhY2tzID0gKHRoaXMuX3JlbmRlckNhbGxiYWNrcyB8fCBbXSkpLnB1c2goY2FsbGJhY2spO1xuXHRcdGVucXVldWVSZW5kZXIodGhpcyk7XG5cdH0sXG5cblxuXHQvKiogSW1tZWRpYXRlbHkgcGVyZm9ybSBhIHN5bmNocm9ub3VzIHJlLXJlbmRlciBvZiB0aGUgY29tcG9uZW50LlxuXHQgKlx0QHByaXZhdGVcblx0ICovXG5cdGZvcmNlVXBkYXRlKCkge1xuXHRcdHJlbmRlckNvbXBvbmVudCh0aGlzLCBGT1JDRV9SRU5ERVIpO1xuXHR9LFxuXG5cblx0LyoqIEFjY2VwdHMgYHByb3BzYCBhbmQgYHN0YXRlYCwgYW5kIHJldHVybnMgYSBuZXcgVmlydHVhbCBET00gdHJlZSB0byBidWlsZC5cblx0ICpcdFZpcnR1YWwgRE9NIGlzIGdlbmVyYWxseSBjb25zdHJ1Y3RlZCB2aWEgW0pTWF0oaHR0cDovL2phc29uZm9ybWF0LmNvbS93dGYtaXMtanN4KS5cblx0ICpcdEBwYXJhbSB7b2JqZWN0fSBwcm9wc1x0XHRQcm9wcyAoZWc6IEpTWCBhdHRyaWJ1dGVzKSByZWNlaXZlZCBmcm9tIHBhcmVudCBlbGVtZW50L2NvbXBvbmVudFxuXHQgKlx0QHBhcmFtIHtvYmplY3R9IHN0YXRlXHRcdFRoZSBjb21wb25lbnQncyBjdXJyZW50IHN0YXRlXG5cdCAqXHRAcGFyYW0ge29iamVjdH0gY29udGV4dFx0XHRDb250ZXh0IG9iamVjdCAoaWYgYSBwYXJlbnQgY29tcG9uZW50IGhhcyBwcm92aWRlZCBjb250ZXh0KVxuXHQgKlx0QHJldHVybnMgVk5vZGVcblx0ICovXG5cdHJlbmRlcigpIHt9XG5cbn0pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9+L3ByZWFjdC9zcmMvY29tcG9uZW50LmpzXG4gKiovIiwiLy8gcmVuZGVyIG1vZGVzXG5cbmV4cG9ydCBjb25zdCBOT19SRU5ERVIgPSAwO1xuZXhwb3J0IGNvbnN0IFNZTkNfUkVOREVSID0gMTtcbmV4cG9ydCBjb25zdCBGT1JDRV9SRU5ERVIgPSAyO1xuZXhwb3J0IGNvbnN0IEFTWU5DX1JFTkRFUiA9IDM7XG5cbmV4cG9ydCBjb25zdCBFTVBUWSA9IHt9O1xuXG5leHBvcnQgY29uc3QgQVRUUl9LRVkgPSB0eXBlb2YgU3ltYm9sIT09J3VuZGVmaW5lZCcgPyBTeW1ib2wuZm9yKCdwcmVhY3RhdHRyJykgOiAnX19wcmVhY3RhdHRyXyc7XG5cbi8vIERPTSBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIE5PVCBoYXZlIFwicHhcIiBhZGRlZCB3aGVuIG51bWVyaWNcbmV4cG9ydCBjb25zdCBOT05fRElNRU5TSU9OX1BST1BTID0ge1xuXHRib3hGbGV4OjEsIGJveEZsZXhHcm91cDoxLCBjb2x1bW5Db3VudDoxLCBmaWxsT3BhY2l0eToxLCBmbGV4OjEsIGZsZXhHcm93OjEsXG5cdGZsZXhQb3NpdGl2ZToxLCBmbGV4U2hyaW5rOjEsIGZsZXhOZWdhdGl2ZToxLCBmb250V2VpZ2h0OjEsIGxpbmVDbGFtcDoxLCBsaW5lSGVpZ2h0OjEsXG5cdG9wYWNpdHk6MSwgb3JkZXI6MSwgb3JwaGFuczoxLCBzdHJva2VPcGFjaXR5OjEsIHdpZG93czoxLCB6SW5kZXg6MSwgem9vbToxXG59O1xuXG4vLyBET00gZXZlbnQgdHlwZXMgdGhhdCBkbyBub3QgYnViYmxlIGFuZCBzaG91bGQgYmUgYXR0YWNoZWQgdmlhIHVzZUNhcHR1cmVcbmV4cG9ydCBjb25zdCBOT05fQlVCQkxJTkdfRVZFTlRTID0geyBibHVyOjEsIGVycm9yOjEsIGZvY3VzOjEsIGxvYWQ6MSwgcmVzaXplOjEsIHNjcm9sbDoxIH07XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL34vcHJlYWN0L3NyYy9jb25zdGFudHMuanNcbiAqKi8iLCJpbXBvcnQgeyBkaWZmIH0gZnJvbSAnLi92ZG9tL2RpZmYnO1xuXG4vKiogUmVuZGVyIEpTWCBpbnRvIGEgYHBhcmVudGAgRWxlbWVudC5cbiAqXHRAcGFyYW0ge1ZOb2RlfSB2bm9kZVx0XHRBIChKU1gpIFZOb2RlIHRvIHJlbmRlclxuICpcdEBwYXJhbSB7RWxlbWVudH0gcGFyZW50XHRcdERPTSBlbGVtZW50IHRvIHJlbmRlciBpbnRvXG4gKlx0QHBhcmFtIHtFbGVtZW50fSBbbWVyZ2VdXHRBdHRlbXB0IHRvIHJlLXVzZSBhbiBleGlzdGluZyBET00gdHJlZSByb290ZWQgYXQgYG1lcmdlYFxuICpcdEBwdWJsaWNcbiAqXG4gKlx0QGV4YW1wbGVcbiAqXHQvLyByZW5kZXIgYSBkaXYgaW50byA8Ym9keT46XG4gKlx0cmVuZGVyKDxkaXYgaWQ9XCJoZWxsb1wiPmhlbGxvITwvZGl2PiwgZG9jdW1lbnQuYm9keSk7XG4gKlxuICpcdEBleGFtcGxlXG4gKlx0Ly8gcmVuZGVyIGEgXCJUaGluZ1wiIGNvbXBvbmVudCBpbnRvICNmb286XG4gKlx0Y29uc3QgVGhpbmcgPSAoeyBuYW1lIH0pID0+IDxzcGFuPnsgbmFtZSB9PC9zcGFuPjtcbiAqXHRyZW5kZXIoPFRoaW5nIG5hbWU9XCJvbmVcIiAvPiwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZvbycpKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlcih2bm9kZSwgcGFyZW50LCBtZXJnZSkge1xuXHRyZXR1cm4gZGlmZihtZXJnZSwgdm5vZGUsIHt9LCBmYWxzZSwgcGFyZW50KTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vfi9wcmVhY3Qvc3JjL3JlbmRlci5qc1xuICoqLyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtTdXJ2ZXlNb2RlbH0gZnJvbSBcIi4uL3N1cnZleVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJlYWN0U3VydmV5TW9kZWwgZXh0ZW5kcyBTdXJ2ZXlNb2RlbCB7XHJcbiAgICByZW5kZXJDYWxsYmFjazogKCkgPT4gdm9pZDtcclxuICAgIGNvbnN0cnVjdG9yKGpzb25PYmo6IGFueSA9IG51bGwpIHtcclxuICAgICAgICBzdXBlcihqc29uT2JqKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyByZW5kZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJDYWxsYmFjaygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHB1YmxpYyBtZXJnZUNzcyhzcmM6IGFueSwgZGVzdDogYW55KSB7XHJcbiAgICAgICAgdGhpcy5tZXJnZVZhbHVlcyhzcmMsIGRlc3QpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIG9uTG9hZFN1cnZleUZyb21TZXJ2aWNlKCkge1xyXG4gICAgICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgb25Mb2FkaW5nU3VydmV5RnJvbVNlcnZpY2UoKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcclxuICAgIH1cclxufVxyXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9yZWFjdC9yZWFjdHN1cnZleW1vZGVsLnRzeFxuICoqLyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtTdXJ2ZXlRdWVzdGlvbn0gZnJvbSAnLi9yZWFjdHF1ZXN0aW9uJ1xyXG5pbXBvcnQge1BhZ2VNb2RlbH0gZnJvbSBcIi4uL3BhZ2VcIjtcclxuaW1wb3J0IHtTdXJ2ZXlNb2RlbH0gZnJvbSBcIi4uL3N1cnZleVwiO1xyXG5pbXBvcnQge0lTdXJ2ZXlDcmVhdG9yfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uXCI7XHJcbmltcG9ydCB7UXVlc3Rpb25Sb3dNb2RlbH0gZnJvbSBcIi4uL3BhZ2VcIjtcclxuaW1wb3J0IHtRdWVzdGlvbkJhc2V9IGZyb20gXCIuLi9xdWVzdGlvbmJhc2VcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTdXJ2ZXlQYWdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PGFueSwgYW55PiB7XHJcbiAgICBwcml2YXRlIHBhZ2U6IFBhZ2VNb2RlbDtcclxuICAgIHByaXZhdGUgc3VydmV5OiBTdXJ2ZXlNb2RlbDtcclxuICAgIHByaXZhdGUgY3JlYXRvcjogSVN1cnZleUNyZWF0b3I7XHJcbiAgICBwcm90ZWN0ZWQgY3NzOiBhbnk7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMucGFnZSA9IHByb3BzLnBhZ2U7XHJcbiAgICAgICAgdGhpcy5zdXJ2ZXkgPSBwcm9wcy5zdXJ2ZXk7XHJcbiAgICAgICAgdGhpcy5jcmVhdG9yID0gcHJvcHMuY3JlYXRvcjtcclxuICAgICAgICB0aGlzLmNzcyA9IHByb3BzLmNzcztcclxuICAgIH1cclxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnBhZ2UgPSBuZXh0UHJvcHMucGFnZTtcclxuICAgICAgICB0aGlzLnN1cnZleSA9IG5leHRQcm9wcy5zdXJ2ZXk7XHJcbiAgICAgICAgdGhpcy5jcmVhdG9yID0gbmV4dFByb3BzLmNyZWF0b3I7XHJcbiAgICAgICAgdGhpcy5jc3MgPSBuZXh0UHJvcHMuY3NzO1xyXG4gICAgfVxyXG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICBpZiAodGhpcy5wYWdlID09IG51bGwgfHwgdGhpcy5zdXJ2ZXkgPT0gbnVsbCB8fCB0aGlzLmNyZWF0b3IgPT0gbnVsbCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgdmFyIHRpdGxlID0gdGhpcy5yZW5kZXJUaXRsZSgpO1xyXG4gICAgICAgIHZhciByb3dzID0gW107XHJcbiAgICAgICAgdmFyIHF1ZXN0aW9uUm93cyA9IHRoaXMucGFnZS5yb3dzO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25Sb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJvd3MucHVzaCh0aGlzLmNyZWF0ZVJvdyhxdWVzdGlvblJvd3NbaV0sIGkpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIHt0aXRsZX1cclxuICAgICAgICAgICAgICAgIHtyb3dzfVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBjcmVhdGVSb3cocm93OiBRdWVzdGlvblJvd01vZGVsLCBpbmRleDogbnVtYmVyKTogSlNYLkVsZW1lbnQge1xyXG4gICAgICAgIHZhciByb3dOYW1lID0gXCJyb3dcIiArIChpbmRleCArIDEpO1xyXG4gICAgICAgIHJldHVybiA8U3VydmV5Um93IGtleT17cm93TmFtZX0gcm93PXtyb3d9IHN1cnZleT17dGhpcy5zdXJ2ZXl9IGNyZWF0b3I9e3RoaXMuY3JlYXRvcn0gY3NzPXt0aGlzLmNzc30gLz47XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyVGl0bGUoKTogSlNYLkVsZW1lbnQge1xyXG4gICAgICAgIGlmICghdGhpcy5wYWdlLnRpdGxlIHx8ICF0aGlzLnN1cnZleS5zaG93UGFnZVRpdGxlcykgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgdmFyIHRleHQgPSB0aGlzLnBhZ2UucHJvY2Vzc2VkVGl0bGU7XHJcbiAgICAgICAgaWYgKHRoaXMucGFnZS5udW0gPiAwKSB7XHJcbiAgICAgICAgICAgIHRleHQgPSB0aGlzLnBhZ2UubnVtICsgXCIuIFwiICsgdGV4dDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICg8aDQgY2xhc3NOYW1lPXt0aGlzLmNzcy5wYWdlVGl0bGV9Pnt0ZXh0fTwvaDQ+KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFN1cnZleVJvdyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxhbnksIGFueT4ge1xyXG4gICAgcHJpdmF0ZSByb3c6IFF1ZXN0aW9uUm93TW9kZWw7XHJcbiAgICBwcml2YXRlIHN1cnZleTogU3VydmV5TW9kZWw7XHJcbiAgICBwcml2YXRlIGNyZWF0b3I6IElTdXJ2ZXlDcmVhdG9yO1xyXG4gICAgcHJvdGVjdGVkIGNzczogYW55O1xyXG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnNldFByb3BlcnRpZXMocHJvcHMpO1xyXG4gICAgfVxyXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xyXG4gICAgICAgIHRoaXMuc2V0UHJvcGVydGllcyhuZXh0UHJvcHMpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzZXRQcm9wZXJ0aWVzKHByb3BzOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnJvdyA9IHByb3BzLnJvdztcclxuICAgICAgICBpZiAodGhpcy5yb3cpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICB0aGlzLnJvdy52aXNpYmlsaXR5Q2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkgeyBzZWxmLnNldFN0YXRlKHsgdmlzaWJsZTogc2VsZi5yb3cudmlzaWJsZSB9KTsgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnN1cnZleSA9IHByb3BzLnN1cnZleTtcclxuICAgICAgICB0aGlzLmNyZWF0b3IgPSBwcm9wcy5jcmVhdG9yO1xyXG4gICAgICAgIHRoaXMuY3NzID0gcHJvcHMuY3NzO1xyXG4gICAgfVxyXG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICBpZiAodGhpcy5yb3cgPT0gbnVsbCB8fCB0aGlzLnN1cnZleSA9PSBudWxsIHx8IHRoaXMuY3JlYXRvciA9PSBudWxsKSByZXR1cm4gbnVsbDtcclxuICAgICAgICBpZiAoIXRoaXMucm93LnZpc2libGUpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHZhciBxdWVzdGlvbnMgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93LnF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLnJvdy5xdWVzdGlvbnNbaV07XHJcbiAgICAgICAgICAgIHF1ZXN0aW9ucy5wdXNoKHRoaXMuY3JlYXRlUXVlc3Rpb24ocXVlc3Rpb24pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMuY3NzLnJvd30+XHJcbiAgICAgICAgICAgICAgICB7cXVlc3Rpb25zfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVF1ZXN0aW9uKHF1ZXN0aW9uOiBRdWVzdGlvbkJhc2UpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgcmV0dXJuIDxTdXJ2ZXlRdWVzdGlvbiBrZXk9e3F1ZXN0aW9uLm5hbWV9IHF1ZXN0aW9uPXtxdWVzdGlvbn0gY3JlYXRvcj17dGhpcy5jcmVhdG9yfSBjc3M9e3RoaXMuY3NzfSAvPjtcclxuICAgIH1cclxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3JlYWN0L3JlYWN0cGFnZS50c3hcbiAqKi8iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7UXVlc3Rpb25CYXNlfSBmcm9tICcuLi9xdWVzdGlvbmJhc2UnO1xyXG5pbXBvcnQge1F1ZXN0aW9ufSBmcm9tICcuLi9xdWVzdGlvbic7XHJcbmltcG9ydCB7U3VydmV5UXVlc3Rpb25Db21tZW50SXRlbX0gZnJvbSAnLi9yZWFjdHF1ZXN0aW9uY29tbWVudCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElTdXJ2ZXlDcmVhdG9yIHtcclxuICAgIGNyZWF0ZVF1ZXN0aW9uRWxlbWVudChxdWVzdGlvbjogUXVlc3Rpb25CYXNlKTogSlNYLkVsZW1lbnQ7XHJcbiAgICByZW5kZXJFcnJvcihrZXk6IHN0cmluZywgZXJyb3JUZXh0OiBzdHJpbmcpOiBKU1guRWxlbWVudDtcclxuICAgIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxhbnksIGFueT4ge1xyXG4gICAgcHJpdmF0ZSBxdWVzdGlvbkJhc2U6IFF1ZXN0aW9uQmFzZTtcclxuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb247XHJcbiAgICBwcml2YXRlIGNyZWF0b3I6IElTdXJ2ZXlDcmVhdG9yO1xyXG4gICAgcHJvdGVjdGVkIGNzczogYW55O1xyXG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnNldFF1ZXN0aW9uKHByb3BzLnF1ZXN0aW9uKTtcclxuICAgICAgICB0aGlzLmNyZWF0b3IgPSBwcm9wcy5jcmVhdG9yO1xyXG4gICAgICAgIHRoaXMuY3NzID0gcHJvcHMuY3NzO1xyXG4gICAgfVxyXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRvciA9IG5leHRQcm9wcy5jcmVhdG9yO1xyXG4gICAgICAgIHRoaXMuY3NzID0gbmV4dFByb3BzLmNzcztcclxuICAgICAgICB0aGlzLnNldFF1ZXN0aW9uKG5leHRQcm9wcy5xdWVzdGlvbik7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHNldFF1ZXN0aW9uKHF1ZXN0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbkJhc2UgPSBxdWVzdGlvbjtcclxuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gcXVlc3Rpb24gaW5zdGFuY2VvZiBRdWVzdGlvbiA/IHF1ZXN0aW9uIDogbnVsbDtcclxuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnF1ZXN0aW9uID8gdGhpcy5xdWVzdGlvbi52YWx1ZSA6IG51bGw7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHsgXHJcbiAgICAgICAgICAgIHZpc2libGU6IHRoaXMucXVlc3Rpb25CYXNlLnZpc2libGUsIHZhbHVlOiB2YWx1ZSwgZXJyb3I6IDAsIHJlbmRlcldpZHRoOiAwLFxyXG4gICAgICAgICAgICB2aXNpYmxlSW5kZXhWYWx1ZTogLTFcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25CYXNlKSB7XHJcbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbkJhc2VbXCJyZWFjdFwiXSA9IHNlbGY7XHJcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25CYXNlLnJlbmRlcldpZHRoQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zdGF0ZS5yZW5kZXJXaWR0aCA9IHNlbGYuc3RhdGUucmVuZGVyV2lkdGggKyAxO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZShzZWxmLnN0YXRlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uQmFzZS52aXNpYmxlSW5kZXhDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUudmlzaWJsZUluZGV4VmFsdWUgPSBzZWxmLnF1ZXN0aW9uQmFzZS52aXNpYmxlSW5kZXg7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNldFN0YXRlKHNlbGYuc3RhdGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25CYXNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25CYXNlW1wicmVhY3RcIl0gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uQmFzZS5yZW5kZXJXaWR0aENoYW5nZWRDYWxsYmFjayA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25CYXNlLnZpc2libGVJbmRleENoYW5nZWRDYWxsYmFjayA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICBpZiAoIXRoaXMucXVlc3Rpb25CYXNlIHx8ICF0aGlzLmNyZWF0b3IpIHJldHVybiBudWxsO1xyXG4gICAgICAgIGlmICghdGhpcy5xdWVzdGlvbkJhc2UudmlzaWJsZSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgdmFyIHF1ZXN0aW9uUmVuZGVyID0gdGhpcy5jcmVhdG9yLmNyZWF0ZVF1ZXN0aW9uRWxlbWVudCh0aGlzLnF1ZXN0aW9uQmFzZSk7XHJcbiAgICAgICAgdmFyIHRpdGxlID0gdGhpcy5xdWVzdGlvbkJhc2UuaGFzVGl0bGUgPyB0aGlzLnJlbmRlclRpdGxlKCkgOiBudWxsO1xyXG4gICAgICAgIHZhciB0aXRsZVRvcCA9IHRoaXMuY3JlYXRvci5xdWVzdGlvblRpdGxlTG9jYXRpb24oKSA9PSBcInRvcFwiID8gdGl0bGUgOiBudWxsO1xyXG4gICAgICAgIHZhciB0aXRsZUJvdHRvbSA9IHRoaXMuY3JlYXRvci5xdWVzdGlvblRpdGxlTG9jYXRpb24oKSA9PSBcImJvdHRvbVwiID8gdGl0bGUgOiBudWxsO1xyXG4gICAgICAgIHZhciBjb21tZW50ID0gKHRoaXMucXVlc3Rpb24gJiYgdGhpcy5xdWVzdGlvbi5oYXNDb21tZW50KSA/IHRoaXMucmVuZGVyQ29tbWVudCgpIDogbnVsbDtcclxuICAgICAgICB2YXIgZXJyb3JzID0gdGhpcy5yZW5kZXJFcnJvcnMoKTtcclxuICAgICAgICB2YXIgbWFyZ2luTGVmdCA9ICh0aGlzLnF1ZXN0aW9uQmFzZS5pbmRlbnQgPiAwKSA/IHRoaXMucXVlc3Rpb25CYXNlLmluZGVudCAqIHRoaXMuY3NzLnF1ZXN0aW9uLmluZGVudCArIFwicHhcIiA6IG51bGw7XHJcbiAgICAgICAgdmFyIHBhZGRpbmdSaWdodCA9ICh0aGlzLnF1ZXN0aW9uQmFzZS5yaWdodEluZGVudCA+IDApID8gdGhpcy5xdWVzdGlvbkJhc2UucmlnaHRJbmRlbnQgKiB0aGlzLmNzcy5xdWVzdGlvbi5pbmRlbnQgKyBcInB4XCIgOiBudWxsO1xyXG4gICAgICAgIHZhciByb290U3R5bGUgPSB7IGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLCB2ZXJ0aWNhbEFsaWduOiAndG9wJyB9O1xyXG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uQmFzZS5yZW5kZXJXaWR0aCkgcm9vdFN0eWxlW1wid2lkdGhcIl0gPSB0aGlzLnF1ZXN0aW9uQmFzZS5yZW5kZXJXaWR0aDtcclxuICAgICAgICBpZiAobWFyZ2luTGVmdCkgcm9vdFN0eWxlW1wibWFyZ2luTGVmdFwiXSA9IG1hcmdpbkxlZnQ7XHJcbiAgICAgICAgaWYgKHBhZGRpbmdSaWdodCkgcm9vdFN0eWxlW1wicGFkZGluZ1JpZ2h0XCJdID0gcGFkZGluZ1JpZ2h0O1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxkaXYgaWQ9e3RoaXMucXVlc3Rpb25CYXNlLmlkfSBjbGFzc05hbWU9e3RoaXMuY3NzLnF1ZXN0aW9uLnJvb3R9IHN0eWxlPXtyb290U3R5bGV9PlxyXG4gICAgICAgICAgICAgICAge3RpdGxlVG9wfVxyXG4gICAgICAgICAgICAgICAge2Vycm9yc31cclxuICAgICAgICAgICAgICAgIHtxdWVzdGlvblJlbmRlcn1cclxuICAgICAgICAgICAgICAgIHtjb21tZW50fVxyXG4gICAgICAgICAgICAgICAge3RpdGxlQm90dG9tfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHJlbmRlclRpdGxlKCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICB2YXIgdGl0bGVUZXh0ID0gdGhpcy5xdWVzdGlvbi5mdWxsVGl0bGU7XHJcbiAgICAgICAgcmV0dXJuICg8aDUgY2xhc3NOYW1lPXt0aGlzLmNzcy5xdWVzdGlvbi50aXRsZX0+e3RpdGxlVGV4dH08L2g1Pik7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyQ29tbWVudCgpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgcmV0dXJuICg8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdj57dGhpcy5xdWVzdGlvbi5jb21tZW50VGV4dH08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy5xdWVzdGlvbi5jb21tZW50fT5cclxuICAgICAgICAgICAgICAgIDxTdXJ2ZXlRdWVzdGlvbkNvbW1lbnRJdGVtICBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn0vPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2Pik7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyRXJyb3JzKCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICByZXR1cm4gPFN1cnZleVF1ZXN0aW9uRXJyb3JzIHF1ZXN0aW9uPXt0aGlzLnF1ZXN0aW9ufSBjc3M9e3RoaXMuY3NzfSBjcmVhdG9yPXt0aGlzLmNyZWF0b3J9IC8+XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkVycm9ycyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxhbnksIGFueT4ge1xyXG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbjtcclxuICAgIHByaXZhdGUgY3JlYXRvcjogSVN1cnZleUNyZWF0b3I7XHJcbiAgICBwcm90ZWN0ZWQgY3NzOiBhbnk7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc2V0UXVlc3Rpb24ocHJvcHMucXVlc3Rpb24pO1xyXG4gICAgICAgIHRoaXMuY3JlYXRvciA9IHByb3BzLmNyZWF0b3I7XHJcbiAgICAgICAgdGhpcy5jc3MgPSBwcm9wcy5jc3M7XHJcbiAgICB9XHJcbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wczogYW55KSB7XHJcbiAgICAgICAgdGhpcy5zZXRRdWVzdGlvbihuZXh0UHJvcHMucXVlc3Rpb24pO1xyXG4gICAgICAgIHRoaXMuY3JlYXRvciA9IG5leHRQcm9wcy5jcmVhdG9yO1xyXG4gICAgICAgIHRoaXMuY3NzID0gbmV4dFByb3BzLmNzcztcclxuICAgIH1cclxuICAgIHByaXZhdGUgc2V0UXVlc3Rpb24ocXVlc3Rpb24pIHtcclxuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gcXVlc3Rpb24gaW5zdGFuY2VvZiBRdWVzdGlvbiA/IHF1ZXN0aW9uIDogbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbikge1xyXG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uZXJyb3JzQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zdGF0ZS5lcnJvciA9IHNlbGYuc3RhdGUuZXJyb3IgKyAxO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZShzZWxmLnN0YXRlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnN0YXRlID0geyBlcnJvcjogMCB9O1xyXG4gICAgfVxyXG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICBpZiAoIXRoaXMucXVlc3Rpb24gfHwgdGhpcy5xdWVzdGlvbi5lcnJvcnMubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xyXG4gICAgICAgIHZhciBlcnJvcnMgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucXVlc3Rpb24uZXJyb3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBlcnJvclRleHQgPSB0aGlzLnF1ZXN0aW9uLmVycm9yc1tpXS5nZXRUZXh0KCk7XHJcbiAgICAgICAgICAgIHZhciBrZXkgPSBcImVycm9yXCIgKyBpO1xyXG4gICAgICAgICAgICBlcnJvcnMucHVzaCh0aGlzLmNyZWF0b3IucmVuZGVyRXJyb3Ioa2V5LCBlcnJvclRleHQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17dGhpcy5jc3MuZXJyb3Iucm9vdH0+e2Vycm9yc308L2Rpdj4pO1xyXG4gICAgfVxyXG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbi50c3hcbiAqKi8iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7U3VydmV5RWxlbWVudEJhc2UsIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2V9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XHJcbmltcG9ydCB7UXVlc3Rpb25Db21tZW50TW9kZWx9IGZyb20gXCIuLi9xdWVzdGlvbl9jb21tZW50XCI7XHJcbmltcG9ydCB7UXVlc3Rpb259IGZyb20gXCIuLi9xdWVzdGlvblwiO1xyXG5pbXBvcnQge1JlYWN0UXVlc3Rpb25GYWN0b3J5fSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uQ29tbWVudCBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0geyB2YWx1ZTogdGhpcy5xdWVzdGlvbi52YWx1ZSB8fCAnJyB9O1xyXG4gICAgICAgIHRoaXMuaGFuZGxlT25DaGFuZ2UgPSB0aGlzLmhhbmRsZU9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVPbkJsdXIgPSB0aGlzLmhhbmRsZU9uQmx1ci5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbkNvbW1lbnRNb2RlbCB7IHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvbkNvbW1lbnRNb2RlbDsgfVxyXG4gICAgaGFuZGxlT25DaGFuZ2UoZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmFsdWU6IGV2ZW50LnRhcmdldC52YWx1ZSB9KTtcclxuICAgIH1cclxuICAgIGhhbmRsZU9uQmx1cihldmVudCkge1xyXG4gICAgICAgIHRoaXMucXVlc3Rpb24udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlOiB0aGlzLnF1ZXN0aW9uLnZhbHVlIHx8ICcnIH0pO1xyXG4gICAgfVxyXG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICBpZiAoIXRoaXMucXVlc3Rpb24pIHJldHVybiBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLmlzRGlzcGxheU1vZGUpXHJcbiAgICAgICAgICAgIHJldHVybiAoPGRpdiBpZD17dGhpcy5xdWVzdGlvbi5pbnB1dElkfSBjbGFzc05hbWU9e3RoaXMuY3NzfT57dGhpcy5xdWVzdGlvbi52YWx1ZX08L2Rpdj4pXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPXt0aGlzLnF1ZXN0aW9uLmlucHV0SWR9IGNsYXNzTmFtZT17dGhpcy5jc3N9IHR5cGU9XCJ0ZXh0XCIgdmFsdWU9e3RoaXMuc3RhdGUudmFsdWV9ICBvbkJsdXI9e3RoaXMuaGFuZGxlT25CbHVyfSBvbkNoYW5nZT17dGhpcy5oYW5kbGVPbkNoYW5nZX0gY29scz17dGhpcy5xdWVzdGlvbi5jb2xzfSByb3dzPXt0aGlzLnF1ZXN0aW9uLnJvd3N9IC8+XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uQ29tbWVudEl0ZW0gZXh0ZW5kcyBTdXJ2ZXlFbGVtZW50QmFzZSB7XHJcbiAgICBwcml2YXRlIHF1ZXN0aW9uOiBRdWVzdGlvbjtcclxuICAgIHByaXZhdGUgY29tbWVudDogc3RyaW5nO1xyXG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gcHJvcHMucXVlc3Rpb247XHJcbiAgICAgICAgdGhpcy5jb21tZW50ID0gdGhpcy5xdWVzdGlvbi5jb21tZW50O1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7IHZhbHVlOiB0aGlzLmNvbW1lbnQgfTtcclxuICAgICAgICB0aGlzLmhhbmRsZU9uQ2hhbmdlID0gdGhpcy5oYW5kbGVPbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlT25CbHVyID0gdGhpcy5oYW5kbGVPbkJsdXIuYmluZCh0aGlzKTtcclxuICAgIH1cclxuICAgIGhhbmRsZU9uQ2hhbmdlKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5jb21tZW50ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdGhpcy5jb21tZW50IH0pO1xyXG4gICAgfVxyXG4gICAgaGFuZGxlT25CbHVyKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbi5jb21tZW50ID0gdGhpcy5jb21tZW50O1xyXG4gICAgfVxyXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xyXG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBuZXh0UHJvcHMucXVlc3Rpb247XHJcbiAgICB9XHJcbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xyXG4gICAgICAgIGlmICghdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5TW9kZSlcclxuICAgICAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17dGhpcy5jc3MucXVlc3Rpb24uY29tbWVudH0+e3RoaXMuY29tbWVudH08L2Rpdj4pO1xyXG4gICAgICAgIHJldHVybiAoPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3NOYW1lPXt0aGlzLmNzcy5xdWVzdGlvbi5jb21tZW50fSB2YWx1ZT17dGhpcy5zdGF0ZS52YWx1ZX0gb25DaGFuZ2U9e3RoaXMuaGFuZGxlT25DaGFuZ2V9IG9uQmx1cj17dGhpcy5oYW5kbGVPbkJsdXJ9IC8+KTtcclxuICAgIH1cclxufVxyXG5cclxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImNvbW1lbnRcIiwgKHByb3BzKSA9PiB7XHJcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbkNvbW1lbnQsIHByb3BzKTtcclxufSk7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmNvbW1lbnQudHN4XG4gKiovIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQge0l0ZW1WYWx1ZX0gZnJvbSBcIi4uL2Jhc2VcIjtcclxuaW1wb3J0IHtRdWVzdGlvbkJhc2V9IGZyb20gJy4uL3F1ZXN0aW9uYmFzZSc7XHJcbmltcG9ydCB7SVN1cnZleUNyZWF0b3J9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25cIjtcclxuaW1wb3J0IHtTdXJ2ZXlRdWVzdGlvbkNvbW1lbnRJdGVtfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uY29tbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFN1cnZleUVsZW1lbnRCYXNlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PGFueSwgYW55PiB7XHJcbiAgICBwcm90ZWN0ZWQgY3NzOiBhbnk7XHJcbiAgICBwcm90ZWN0ZWQgcm9vdENzczogYW55O1xyXG4gICAgcHJvdGVjdGVkIGlzRGlzcGxheU1vZGU6IGJvb2xlYW47XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuY3NzID0gcHJvcHMuY3NzO1xyXG4gICAgICAgIHRoaXMucm9vdENzcyA9IHByb3BzLnJvb3RDc3M7XHJcbiAgICAgICAgdGhpcy5pc0Rpc3BsYXlNb2RlID0gcHJvcHMuaXNEaXNwbGF5TW9kZSB8fCBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmNzcyA9IG5leHRQcm9wcy5jc3M7XHJcbiAgICAgICAgdGhpcy5yb290Q3NzID0gbmV4dFByb3BzLnJvb3RDc3M7XHJcbiAgICAgICAgdGhpcy5pc0Rpc3BsYXlNb2RlID0gbmV4dFByb3BzLmlzRGlzcGxheU1vZGUgfHwgZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIGV4dGVuZHMgU3VydmV5RWxlbWVudEJhc2Uge1xyXG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uQmFzZTogUXVlc3Rpb25CYXNlO1xyXG4gICAgcHJvdGVjdGVkIGNyZWF0b3I6IElTdXJ2ZXlDcmVhdG9yO1xyXG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnF1ZXN0aW9uQmFzZSA9IHByb3BzLnF1ZXN0aW9uO1xyXG4gICAgICAgIHRoaXMuY3JlYXRvciA9IHByb3BzLmNyZWF0b3I7XHJcbiAgICB9XHJcbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wczogYW55KSB7XHJcbiAgICAgICAgc3VwZXIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpO1xyXG4gICAgICAgIHRoaXMucXVlc3Rpb25CYXNlID0gbmV4dFByb3BzLnF1ZXN0aW9uO1xyXG4gICAgICAgIHRoaXMuY3JlYXRvciA9IG5leHRQcm9wcy5jcmVhdG9yO1xyXG4gICAgfVxyXG59XHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25lbGVtZW50LnRzeFxuICoqLyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtIYXNoVGFibGV9IGZyb20gXCIuLi9iYXNlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUmVhY3RRdWVzdGlvbkZhY3Rvcnkge1xyXG4gICAgcHVibGljIHN0YXRpYyBJbnN0YW5jZTogUmVhY3RRdWVzdGlvbkZhY3RvcnkgPSBuZXcgUmVhY3RRdWVzdGlvbkZhY3RvcnkoKTtcclxuICAgIHB1YmxpYyBzdGF0aWMgRGVmYXVsdENob2ljZXMgPSBbXCJvbmVcIiwgXCJ0d298c2Vjb25kIHZhbHVlXCIsIFwidGhyZWV8dGhpcmQgdmFsdWVcIl07XHJcbiAgICBwcml2YXRlIGNyZWF0b3JIYXNoOiBIYXNoVGFibGU8KG5hbWU6IHN0cmluZykgPT4gSlNYLkVsZW1lbnQ+ID0ge307XHJcblxyXG4gICAgcHVibGljIHJlZ2lzdGVyUXVlc3Rpb24ocXVlc3Rpb25UeXBlOiBzdHJpbmcsIHF1ZXN0aW9uQ3JlYXRvcjogKG5hbWU6IHN0cmluZykgPT4gSlNYLkVsZW1lbnQpIHtcclxuICAgICAgICB0aGlzLmNyZWF0b3JIYXNoW3F1ZXN0aW9uVHlwZV0gPSBxdWVzdGlvbkNyZWF0b3I7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgZ2V0QWxsVHlwZXMoKTogQXJyYXk8c3RyaW5nPiB7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcbiAgICAgICAgZm9yKHZhciBrZXkgaW4gdGhpcy5jcmVhdG9ySGFzaCkge1xyXG4gICAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0LnNvcnQoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBjcmVhdGVRdWVzdGlvbihxdWVzdGlvblR5cGU6IHN0cmluZywgcGFyYW1zOiBhbnkpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgdmFyIGNyZWF0b3IgPSB0aGlzLmNyZWF0b3JIYXNoW3F1ZXN0aW9uVHlwZV07XHJcbiAgICAgICAgaWYgKGNyZWF0b3IgPT0gbnVsbCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIGNyZWF0b3IocGFyYW1zKTtcclxuICAgIH1cclxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25mYWN0b3J5LnRzeFxuICoqLyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtTdXJ2ZXlNb2RlbH0gZnJvbSBcIi4uL3N1cnZleVwiO1xyXG5pbXBvcnQge1N1cnZleU5hdmlnYXRpb25CYXNlfSBmcm9tIFwiLi9yZWFjdFN1cnZleU5hdmlnYXRpb25CYXNlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU3VydmV5TmF2aWdhdGlvbiBleHRlbmRzIFN1cnZleU5hdmlnYXRpb25CYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVQcmV2Q2xpY2sgPSB0aGlzLmhhbmRsZVByZXZDbGljay5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlTmV4dENsaWNrID0gdGhpcy5oYW5kbGVOZXh0Q2xpY2suYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmhhbmRsZUNvbXBsZXRlQ2xpY2sgPSB0aGlzLmhhbmRsZUNvbXBsZXRlQ2xpY2suYmluZCh0aGlzKTtcclxuICAgIH1cclxuICAgIGhhbmRsZVByZXZDbGljayhldmVudCkge1xyXG4gICAgICAgIHRoaXMuc3VydmV5LnByZXZQYWdlKCk7XHJcbiAgICB9XHJcbiAgICBoYW5kbGVOZXh0Q2xpY2soZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnN1cnZleS5uZXh0UGFnZSgpO1xyXG4gICAgfVxyXG4gICAgaGFuZGxlQ29tcGxldGVDbGljayhldmVudCkge1xyXG4gICAgICAgIHRoaXMuc3VydmV5LmNvbXBsZXRlTGFzdFBhZ2UoKTtcclxuICAgIH1cclxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgdmFyIHByZXZCdXR0b24gPSAhdGhpcy5zdXJ2ZXkuaXNGaXJzdFBhZ2UgPyB0aGlzLnJlbmRlckJ1dHRvbih0aGlzLmhhbmRsZVByZXZDbGljaywgdGhpcy5zdXJ2ZXkucGFnZVByZXZUZXh0LCB0aGlzLmNzcy5uYXZpZ2F0aW9uLnByZXYpIDogbnVsbDtcclxuICAgICAgICB2YXIgbmV4dEJ1dHRvbiA9ICF0aGlzLnN1cnZleS5pc0xhc3RQYWdlID8gdGhpcy5yZW5kZXJCdXR0b24odGhpcy5oYW5kbGVOZXh0Q2xpY2ssIHRoaXMuc3VydmV5LnBhZ2VOZXh0VGV4dCwgdGhpcy5jc3MubmF2aWdhdGlvbi5uZXh0KSA6IG51bGw7XHJcbiAgICAgICAgdmFyIGNvbXBsZXRlQnV0dG9uID0gdGhpcy5zdXJ2ZXkuaXNMYXN0UGFnZSA/IHRoaXMucmVuZGVyQnV0dG9uKHRoaXMuaGFuZGxlQ29tcGxldGVDbGljaywgdGhpcy5zdXJ2ZXkuY29tcGxldGVUZXh0LCB0aGlzLmNzcy5uYXZpZ2F0aW9uLmNvbXBsZXRlKSA6IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMuY3NzLmZvb3Rlcn0+XHJcbiAgICAgICAgICAgICAgICB7cHJldkJ1dHRvbn1cclxuICAgICAgICAgICAgICAgIHtuZXh0QnV0dG9ufVxyXG4gICAgICAgICAgICAgICAge2NvbXBsZXRlQnV0dG9ufVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCByZW5kZXJCdXR0b24oY2xpY2s6IGFueSwgdGV4dDogc3RyaW5nLCBidG5DbGFzc05hbWU6IHN0cmluZyk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICB2YXIgc3R5bGUgPSB7IG1hcmdpblJpZ2h0OiBcIjVweFwiIH07XHJcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IHRoaXMuY3NzLm5hdmlnYXRpb25CdXR0b24gKyAoYnRuQ2xhc3NOYW1lID8gJyAnICsgYnRuQ2xhc3NOYW1lIDogXCJcIik7XHJcbiAgICAgICAgcmV0dXJuIDxpbnB1dCBjbGFzc05hbWU9e2NsYXNzTmFtZX0gc3R5bGU9e3N0eWxlfSB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17Y2xpY2t9IHZhbHVlPXt0ZXh0fSAvPjtcclxuICAgIH1cclxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3JlYWN0L3JlYWN0U3VydmV5TmF2aWdhdGlvbi50c3hcbiAqKi8iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7U3VydmV5TW9kZWx9IGZyb20gXCIuLi9zdXJ2ZXlcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTdXJ2ZXlOYXZpZ2F0aW9uQmFzZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxhbnksIGFueT4ge1xyXG4gICAgcHJvdGVjdGVkIHN1cnZleTogU3VydmV5TW9kZWw7XHJcbiAgICBwcm90ZWN0ZWQgY3NzOiBhbnk7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3VydmV5ID0gcHJvcHMuc3VydmV5O1xyXG4gICAgICAgIHRoaXMuY3NzID0gcHJvcHMuY3NzO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7IHVwZGF0ZTogMCB9O1xyXG4gICAgfVxyXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xyXG4gICAgICAgIHRoaXMuc3VydmV5ID0gbmV4dFByb3BzLnN1cnZleTtcclxuICAgICAgICB0aGlzLmNzcyA9IG5leHRQcm9wcy5jc3M7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHVwZGF0ZVN0YXRlRnVuY3Rpb246IGFueSA9IG51bGw7XHJcbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcclxuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlRnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnN0YXRlLnVwZGF0ZSA9IHNlbGYuc3RhdGUudXBkYXRlICsgMTtcclxuICAgICAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoc2VsZi5zdGF0ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXkub25QYWdlVmlzaWJsZUNoYW5nZWQuYWRkKHRoaXMudXBkYXRlU3RhdGVGdW5jdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMudXBkYXRlU3RhdGVGdW5jdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnN1cnZleS5vblBhZ2VWaXNpYmxlQ2hhbmdlZC5yZW1vdmUodGhpcy51cGRhdGVTdGF0ZUZ1bmN0aW9uKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGF0ZUZ1bmN0aW9uID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9yZWFjdC9yZWFjdFN1cnZleU5hdmlnYXRpb25CYXNlLnRzeFxuICoqLyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtTdXJ2ZXlNb2RlbH0gZnJvbSBcIi4uL3N1cnZleVwiO1xyXG5pbXBvcnQge1N1cnZleU5hdmlnYXRpb25CYXNlfSBmcm9tIFwiLi9yZWFjdFN1cnZleU5hdmlnYXRpb25CYXNlXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU3VydmV5UHJvZ3Jlc3MgZXh0ZW5kcyBTdXJ2ZXlOYXZpZ2F0aW9uQmFzZSB7XHJcbiAgICBwcm90ZWN0ZWQgaXNUb3A6IGJvb2xlYW47XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuaXNUb3AgPSBwcm9wcy5pc1RvcDtcclxuICAgIH1cclxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzOiBhbnkpIHtcclxuICAgICAgICBzdXBlci5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyk7XHJcbiAgICAgICAgdGhpcy5pc1RvcCA9IG5leHRQcm9wcy5pc1RvcDtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBnZXQgcHJvZ3Jlc3MoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuc3VydmV5LmdldFByb2dyZXNzKCk7IH1cclxuICAgIHByb3RlY3RlZCBnZXQgcHJvZ3Jlc3NUZXh0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnN1cnZleS5wcm9ncmVzc1RleHQ7IH1cclxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5pc1RvcCA/IHsgd2lkdGg6IFwiNjAlXCIgfSA6IHsgd2lkdGg6IFwiNjAlXCIsIG1hcmdpblRvcDogXCIxMHB4XCIgfTtcclxuICAgICAgICB2YXIgcHJvZ3Jlc3NTdHlsZSA9IHsgd2lkdGg6IHRoaXMucHJvZ3Jlc3MgKyBcIiVcIiB9O1xyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3RoaXMuY3NzLnByb2dyZXNzfSBzdHlsZT17c3R5bGV9PlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXtwcm9ncmVzc1N0eWxlfSBjbGFzc05hbWU9e3RoaXMuY3NzLnByb2dyZXNzQmFyfSByb2xlPVwicHJvZ3Jlc3NiYXJcIiBhcmlhLXZhbHVlbWluPVwiMFwiIGFyaWEtdmFsdWVtYXg9XCIxMDBcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt0aGlzLnByb2dyZXNzVGV4dH08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+KTtcclxuICAgIH1cclxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3JlYWN0L3JlYWN0U3VydmV5UHJvZ3Jlc3MudHN4XG4gKiovIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQge1N1cnZleUVsZW1lbnRCYXNlLCBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xyXG5pbXBvcnQge1N1cnZleVF1ZXN0aW9uQ29tbWVudEl0ZW19IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25jb21tZW50XCI7XHJcbmltcG9ydCB7UXVlc3Rpb25DaGVja2JveE1vZGVsfSBmcm9tIFwiLi4vcXVlc3Rpb25fY2hlY2tib3hcIjtcclxuaW1wb3J0IHtJdGVtVmFsdWV9IGZyb20gXCIuLi9iYXNlXCI7XHJcbmltcG9ydCB7UmVhY3RRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25DaGVja2JveCBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0geyBjaG9pY2VzQ2hhbmdlZDogMCB9O1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICB0aGlzLnF1ZXN0aW9uLmNob2ljZXNDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUuY2hvaWNlc0NoYW5nZWQgPSBzZWxmLnN0YXRlLmNob2ljZXNDaGFuZ2VkICsgMTtcclxuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZShzZWxmLnN0YXRlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCB7IHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvbkNoZWNrYm94TW9kZWw7IH1cclxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8Zm9ybSBjbGFzc05hbWU9e3RoaXMuY3NzLnJvb3R9PlxyXG4gICAgICAgICAgICB7dGhpcy5nZXRJdGVtcygpIH1cclxuICAgICAgICAgICAgICAgIDwvZm9ybT4pO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldEl0ZW1zKCk6IEFycmF5PGFueT4ge1xyXG4gICAgICAgIHZhciBpdGVtcyA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXNbaV07XHJcbiAgICAgICAgICAgIHZhciBrZXkgPSBcIml0ZW1cIiArIGk7XHJcbiAgICAgICAgICAgIGl0ZW1zLnB1c2godGhpcy5yZW5kZXJJdGVtKGtleSwgaXRlbSwgaSA9PSAwKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpdGVtcztcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBnZXQgdGV4dFN0eWxlKCk6IGFueSB7IHJldHVybiBudWxsOyB9XHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVySXRlbShrZXk6IHN0cmluZywgaXRlbTogYW55LCBpc0ZpcnN0OiBib29sZWFuKTogSlNYLkVsZW1lbnQge1xyXG4gICAgICAgIHJldHVybiA8U3VydmV5UXVlc3Rpb25DaGVja2JveEl0ZW0ga2V5PXtrZXl9IHF1ZXN0aW9uPXt0aGlzLnF1ZXN0aW9ufSBjc3M9e3RoaXMuY3NzfSByb290Q3NzPXt0aGlzLnJvb3RDc3N9IGlzRGlzcGxheU1vZGU9e3RoaXMuaXNEaXNwbGF5TW9kZX0gaXRlbT17aXRlbX0gdGV4dFN0eWxlPXt0aGlzLnRleHRTdHlsZX0gaXNGaXJzdD17aXNGaXJzdH0gLz47XHJcbiAgICB9XHJcbn1cclxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uQ2hlY2tib3hJdGVtIGV4dGVuZHMgU3VydmV5RWxlbWVudEJhc2Uge1xyXG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkNoZWNrYm94TW9kZWw7XHJcbiAgICBwcm90ZWN0ZWQgaXRlbTogSXRlbVZhbHVlO1xyXG4gICAgcHJvdGVjdGVkIHRleHRTdHlsZTogYW55O1xyXG4gICAgcHJvdGVjdGVkIGlzRmlyc3Q6IGFueTtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5pdGVtID0gcHJvcHMuaXRlbTtcclxuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gcHJvcHMucXVlc3Rpb247XHJcbiAgICAgICAgdGhpcy50ZXh0U3R5bGUgPSBwcm9wcy50ZXh0U3R5bGU7XHJcbiAgICAgICAgdGhpcy5pc0ZpcnN0ID0gcHJvcHMuaXNGaXJzdDtcclxuICAgICAgICB0aGlzLmhhbmRsZU9uQ2hhbmdlID0gdGhpcy5oYW5kbGVPbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xyXG4gICAgICAgIHN1cGVyLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKTtcclxuICAgICAgICB0aGlzLml0ZW0gPSBuZXh0UHJvcHMuaXRlbTtcclxuICAgICAgICB0aGlzLnRleHRTdHlsZSA9IG5leHRQcm9wcy50ZXh0U3R5bGU7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IG5leHRQcm9wcy5xdWVzdGlvbjtcclxuICAgICAgICB0aGlzLmlzRmlyc3QgPSBuZXh0UHJvcHMuaXNGaXJzdDtcclxuICAgIH1cclxuICAgIGhhbmRsZU9uQ2hhbmdlKGV2ZW50KSB7XHJcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy5xdWVzdGlvbi52YWx1ZTtcclxuICAgICAgICBpZiAoIW5ld1ZhbHVlKSB7XHJcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBpbmRleCA9IG5ld1ZhbHVlLmluZGV4T2YodGhpcy5pdGVtLnZhbHVlKTtcclxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQpIHtcclxuICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkge1xyXG4gICAgICAgICAgICAgICAgbmV3VmFsdWUucHVzaCh0aGlzLml0ZW0udmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbi52YWx1ZSA9IG5ld1ZhbHVlO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdGhpcy5xdWVzdGlvbi52YWx1ZSB9KTtcclxuICAgIH1cclxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLml0ZW0gfHwgIXRoaXMucXVlc3Rpb24pIHJldHVybiBudWxsO1xyXG4gICAgICAgIHZhciBpdGVtV2lkdGggPSB0aGlzLnF1ZXN0aW9uLmNvbENvdW50ID4gMCA/ICgxMDAgLyB0aGlzLnF1ZXN0aW9uLmNvbENvdW50KSArIFwiJVwiIDogXCJcIjtcclxuICAgICAgICB2YXIgbWFyZ2luUmlnaHQgPSB0aGlzLnF1ZXN0aW9uLmNvbENvdW50ID09IDAgPyBcIjVweFwiIDogXCIwcHhcIjtcclxuICAgICAgICB2YXIgZGl2U3R5bGUgPSB7IG1hcmdpblJpZ2h0OiBtYXJnaW5SaWdodCB9O1xyXG4gICAgICAgIGlmIChpdGVtV2lkdGgpIHtcclxuICAgICAgICAgICAgZGl2U3R5bGVbXCJ3aWR0aFwiXSA9IGl0ZW1XaWR0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGlzQ2hlY2tlZCA9ICh0aGlzLnF1ZXN0aW9uLnZhbHVlICYmIHRoaXMucXVlc3Rpb24udmFsdWUuaW5kZXhPZih0aGlzLml0ZW0udmFsdWUpID4gLTEpIHx8IGZhbHNlO1xyXG4gICAgICAgIHZhciBvdGhlckl0ZW0gPSAodGhpcy5pdGVtLnZhbHVlID09PSB0aGlzLnF1ZXN0aW9uLm90aGVySXRlbS52YWx1ZSAmJiBpc0NoZWNrZWQpID8gdGhpcy5yZW5kZXJPdGhlcigpIDogbnVsbDtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJDaGVja2JveChpc0NoZWNrZWQsIGRpdlN0eWxlLCBvdGhlckl0ZW0pO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldCBpbnB1dFN0eWxlKCk6IGFueSB7IHJldHVybiB7IG1hcmdpblJpZ2h0OiBcIjNweFwiIH07IH1cclxuICAgIHByb3RlY3RlZCByZW5kZXJDaGVja2JveChpc0NoZWNrZWQ6IGJvb2xlYW4sIGRpdlN0eWxlOiBhbnksIG90aGVySXRlbTogSlNYLkVsZW1lbnQpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgdmFyIGlkID0gdGhpcy5pc0ZpcnN0ID8gdGhpcy5xdWVzdGlvbi5pbnB1dElkIDogbnVsbDtcclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy5pdGVtfSBzdHlsZT17ZGl2U3R5bGV9PlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPXt0aGlzLmNzcy5pdGVtfT5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD17aWR9IHN0eWxlPXt0aGlzLmlucHV0U3R5bGV9IGRpc2FibGVkPXt0aGlzLmlzRGlzcGxheU1vZGV9IGNoZWNrZWQ9e2lzQ2hlY2tlZH0gb25DaGFuZ2U9e3RoaXMuaGFuZGxlT25DaGFuZ2V9IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3RoaXMuaXRlbS50ZXh0fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAge290aGVySXRlbX1cclxuICAgICAgICAgICAgPC9kaXY+KTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCByZW5kZXJPdGhlcigpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17dGhpcy5jc3Mub3RoZXJ9PjxTdXJ2ZXlRdWVzdGlvbkNvbW1lbnRJdGVtICBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn0gY3NzPXt0aGlzLnJvb3RDc3N9ICBpc0Rpc3BsYXlNb2RlPXt0aGlzLmlzRGlzcGxheU1vZGV9Lz48L2Rpdj4pO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiY2hlY2tib3hcIiwgKHByb3BzKSA9PiB7XHJcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbkNoZWNrYm94LCBwcm9wcyk7XHJcbn0pO1xuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25jaGVja2JveC50c3hcbiAqKi8iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7U3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcclxuaW1wb3J0IHtRdWVzdGlvbkRyb3Bkb3duTW9kZWx9IGZyb20gXCIuLi9xdWVzdGlvbl9kcm9wZG93blwiO1xyXG5pbXBvcnQge1N1cnZleVF1ZXN0aW9uQ29tbWVudEl0ZW19IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25jb21tZW50XCI7XHJcbmltcG9ydCB7UmVhY3RRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25Ecm9wZG93biBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0geyB2YWx1ZTogdGhpcy5xdWVzdGlvbi52YWx1ZSwgY2hvaWNlc0NoYW5nZWQ6IDAgfTtcclxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbi5jaG9pY2VzQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBzZWxmLnN0YXRlLmNob2ljZXNDaGFuZ2VkID0gc2VsZi5zdGF0ZS5jaG9pY2VzQ2hhbmdlZCArIDE7XHJcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoc2VsZi5zdGF0ZSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmhhbmRsZU9uQ2hhbmdlID0gdGhpcy5oYW5kbGVPbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbkRyb3Bkb3duTW9kZWwgeyByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25Ecm9wZG93bk1vZGVsOyB9XHJcbiAgICBoYW5kbGVPbkNoYW5nZShldmVudCkge1xyXG4gICAgICAgIHRoaXMucXVlc3Rpb24udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlOiB0aGlzLnF1ZXN0aW9uLnZhbHVlIH0pO1xyXG4gICAgfVxyXG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICBpZiAoIXRoaXMucXVlc3Rpb24pIHJldHVybiBudWxsO1xyXG4gICAgICAgIHZhciBjb21tZW50ID0gdGhpcy5xdWVzdGlvbi52YWx1ZSA9PT0gdGhpcy5xdWVzdGlvbi5vdGhlckl0ZW0udmFsdWUgPyB0aGlzLnJlbmRlck90aGVyKCkgOiBudWxsO1xyXG4gICAgICAgIHZhciBzZWxlY3QgPSB0aGlzLnJlbmRlclNlbGVjdCgpO1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIHtzZWxlY3R9XHJcbiAgICAgICAgICAgIHtjb21tZW50fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHJlbmRlclNlbGVjdCgpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5TW9kZSkgIHJldHVybiAoPGRpdiBpZD17dGhpcy5xdWVzdGlvbi5pbnB1dElkfSBjbGFzc05hbWU9e3RoaXMuY3NzfT57dGhpcy5xdWVzdGlvbi52YWx1ZX08L2Rpdj4pO1xyXG4gICAgICAgIHZhciBvcHRpb25zID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlc1tpXTtcclxuICAgICAgICAgICAgdmFyIGtleSA9IFwiaXRlbVwiICsgaTtcclxuICAgICAgICAgICAgdmFyIG9wdGlvbiA9IDxvcHRpb24ga2V5PXtrZXl9IHZhbHVlPXtpdGVtLnZhbHVlfT57aXRlbS50ZXh0fTwvb3B0aW9uPjtcclxuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKG9wdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxzZWxlY3QgaWQ9e3RoaXMucXVlc3Rpb24uaW5wdXRJZH0gY2xhc3NOYW1lPXt0aGlzLmNzc30gdmFsdWU9e3RoaXMuc3RhdGUudmFsdWV9IG9uQ2hhbmdlPXt0aGlzLmhhbmRsZU9uQ2hhbmdlfT5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPnt0aGlzLnF1ZXN0aW9uLm9wdGlvbnNDYXB0aW9ufTwvb3B0aW9uPlxyXG4gICAgICAgICAgICB7b3B0aW9uc31cclxuICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCByZW5kZXJPdGhlcigpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgdmFyIHN0eWxlID0geyBtYXJnaW5Ub3A6IFwiM3B4XCIgfTtcclxuICAgICAgICByZXR1cm4gPGRpdiBzdHlsZT17c3R5bGV9PjxTdXJ2ZXlRdWVzdGlvbkNvbW1lbnRJdGVtIHF1ZXN0aW9uPXt0aGlzLnF1ZXN0aW9ufSBjc3M9e3RoaXMucm9vdENzc30gaXNEaXNwbGF5TW9kZT17dGhpcy5pc0Rpc3BsYXlNb2RlfS8+PC9kaXY+O1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiZHJvcGRvd25cIiwgKHByb3BzKSA9PiB7XHJcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbkRyb3Bkb3duLCBwcm9wcyk7XHJcbn0pO1xuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25kcm9wZG93bi50c3hcbiAqKi8iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7U3VydmV5RWxlbWVudEJhc2UsIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2V9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XHJcbmltcG9ydCB7UXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsfSBmcm9tIFwiLi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25cIjtcclxuaW1wb3J0IHtJU3VydmV5Q3JlYXRvciwgU3VydmV5UXVlc3Rpb25FcnJvcnN9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25cIjtcclxuaW1wb3J0IHtNYXRyaXhEcm9wZG93blJvd01vZGVsfSBmcm9tIFwiLi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25cIjtcclxuaW1wb3J0IHtNYXRyaXhEcm9wZG93bkNlbGx9IGZyb20gXCIuLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2VcIjtcclxuaW1wb3J0IHtSZWFjdFF1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbk1hdHJpeERyb3Bkb3duIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwgeyByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsOyB9XHJcbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xyXG4gICAgICAgIGlmICghdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgdmFyIGhlYWRlcnMgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucXVlc3Rpb24uY29sdW1ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5xdWVzdGlvbi5jb2x1bW5zW2ldO1xyXG4gICAgICAgICAgICB2YXIga2V5ID0gXCJjb2x1bW5cIiArIGk7XHJcbiAgICAgICAgICAgIHZhciBtaW5XaWR0aCA9IHRoaXMucXVlc3Rpb24uZ2V0Q29sdW1uV2lkdGgoY29sdW1uKTtcclxuICAgICAgICAgICAgdmFyIGNvbHVtblN0eWxlID0gbWluV2lkdGggPyB7IG1pbldpZHRoOiBtaW5XaWR0aCB9IDoge307XHJcbiAgICAgICAgICAgIGhlYWRlcnMucHVzaCg8dGgga2V5PXtrZXl9IHN0eWxlPXtjb2x1bW5TdHlsZX0+e3RoaXMucXVlc3Rpb24uZ2V0Q29sdW1uVGl0bGUoY29sdW1uKSB9PC90aD4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcm93cyA9IFtdO1xyXG4gICAgICAgIHZhciB2aXNpYmxlUm93cyA9IHRoaXMucXVlc3Rpb24udmlzaWJsZVJvd3M7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgcm93ID0gdmlzaWJsZVJvd3NbaV07XHJcbiAgICAgICAgICAgIHJvd3MucHVzaCg8U3VydmV5UXVlc3Rpb25NYXRyaXhEcm9wZG93blJvdyBrZXk9e3Jvdy5pZH0gcm93PXtyb3d9IGNzcz17dGhpcy5jc3N9IHJvb3RDc3M9e3RoaXMucm9vdENzc30gaXNEaXNwbGF5TW9kZT17dGhpcy5pc0Rpc3BsYXlNb2RlfSBjcmVhdG9yPXt0aGlzLmNyZWF0b3J9IC8+KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGRpdlN0eWxlID0gdGhpcy5xdWVzdGlvbi5ob3Jpem9udGFsU2Nyb2xsID8geyBvdmVyZmxvd1g6ICdzY3JvbGwnfSA6IHt9O1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxkaXYgIHN0eWxlPXtkaXZTdHlsZX0+XHJcbiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3NOYW1lPXt0aGlzLmNzcy5yb290fT5cclxuICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2hlYWRlcnN9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtyb3dzfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25NYXRyaXhEcm9wZG93blJvdyBleHRlbmRzIFN1cnZleUVsZW1lbnRCYXNlIHtcclxuICAgIHByaXZhdGUgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsO1xyXG4gICAgcHJvdGVjdGVkIGNyZWF0b3I6IElTdXJ2ZXlDcmVhdG9yO1xyXG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnNldFByb3BlcnRpZXMocHJvcHMpO1xyXG4gICAgfVxyXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHM6IGFueSkge1xyXG4gICAgICAgIHN1cGVyLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKTtcclxuICAgICAgICB0aGlzLnNldFByb3BlcnRpZXMobmV4dFByb3BzKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgc2V0UHJvcGVydGllcyhuZXh0UHJvcHM6IGFueSkge1xyXG4gICAgICAgIHRoaXMucm93ID0gbmV4dFByb3BzLnJvdztcclxuICAgICAgICB0aGlzLmNyZWF0b3IgPSBuZXh0UHJvcHMuY3JlYXRvcjtcclxuICAgIH1cclxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJvdykgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgdmFyIHRkcyA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3cuY2VsbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGNlbGwgPSB0aGlzLnJvdy5jZWxsc1tpXTtcclxuICAgICAgICAgICAgdmFyIGVycm9ycyA9IDxTdXJ2ZXlRdWVzdGlvbkVycm9ycyBxdWVzdGlvbj17Y2VsbC5xdWVzdGlvbn0gY3NzPXt0aGlzLnJvb3RDc3N9IGNyZWF0b3I9e3RoaXMuY3JlYXRvcn0gLz5cclxuICAgICAgICAgICAgdmFyIHNlbGVjdCA9IHRoaXMucmVuZGVyU2VsZWN0KGNlbGwpO1xyXG4gICAgICAgICAgICB0ZHMucHVzaCg8dGQga2V5PXtcInJvd1wiICsgaX0+e2Vycm9yc317c2VsZWN0fTwvdGQ+KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICg8dHI+PHRkPnt0aGlzLnJvdy50ZXh0fTwvdGQ+e3Rkc308L3RyPik7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyU2VsZWN0KGNlbGw6IE1hdHJpeERyb3Bkb3duQ2VsbCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdG9yLmNyZWF0ZVF1ZXN0aW9uRWxlbWVudChjZWxsLnF1ZXN0aW9uKTtcclxuICAgIH1cclxufVxyXG5cclxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeGRyb3Bkb3duXCIsIChwcm9wcykgPT4ge1xyXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25NYXRyaXhEcm9wZG93biwgcHJvcHMpO1xyXG59KTtcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ubWF0cml4ZHJvcGRvd24udHN4XG4gKiovIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQge1N1cnZleUVsZW1lbnRCYXNlLCBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xyXG5pbXBvcnQge1F1ZXN0aW9uTWF0cml4TW9kZWx9IGZyb20gXCIuLi9xdWVzdGlvbl9tYXRyaXhcIjtcclxuaW1wb3J0IHtNYXRyaXhSb3dNb2RlbH0gZnJvbSBcIi4uL3F1ZXN0aW9uX21hdHJpeFwiO1xyXG5pbXBvcnQge1JlYWN0UXVlc3Rpb25GYWN0b3J5fSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uTWF0cml4IGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbk1hdHJpeE1vZGVsIHsgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uTWF0cml4TW9kZWw7IH1cclxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcclxuICAgICAgICB2YXIgZmlyc3RUSCA9IHRoaXMucXVlc3Rpb24uaGFzUm93cyA/IDx0aD48L3RoPiA6IG51bGw7XHJcbiAgICAgICAgdmFyIGhlYWRlcnMgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucXVlc3Rpb24uY29sdW1ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5xdWVzdGlvbi5jb2x1bW5zW2ldO1xyXG4gICAgICAgICAgICB2YXIga2V5ID0gXCJjb2x1bW5cIiArIGk7XHJcbiAgICAgICAgICAgIGhlYWRlcnMucHVzaCg8dGgga2V5PXtrZXl9Pntjb2x1bW4udGV4dH08L3RoPik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciByb3dzID0gW107XHJcbiAgICAgICAgdmFyIHZpc2libGVSb3dzID0gdGhpcy5xdWVzdGlvbi52aXNpYmxlUm93cztcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciByb3cgPSB2aXNpYmxlUm93c1tpXTtcclxuICAgICAgICAgICAgdmFyIGtleSA9IFwicm93XCIgKyBpO1xyXG4gICAgICAgICAgICByb3dzLnB1c2goPFN1cnZleVF1ZXN0aW9uTWF0cml4Um93IGtleT17a2V5fSBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn0gY3NzPXt0aGlzLmNzc30gcm9vdENzcz17dGhpcy5yb290Q3NzfSBpc0Rpc3BsYXlNb2RlPXt0aGlzLmlzRGlzcGxheU1vZGV9IHJvdz17cm93fSBpc0ZpcnN0PXtpID09IDB9IC8+KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPHRhYmxlIGNsYXNzTmFtZT17dGhpcy5jc3Mucm9vdH0+XHJcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Zmlyc3RUSH1cclxuICAgICAgICAgICAgICAgICAgICAgICAge2hlYWRlcnN9XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAge3Jvd3N9XHJcbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uTWF0cml4Um93IGV4dGVuZHMgU3VydmV5RWxlbWVudEJhc2Uge1xyXG4gICAgcHJpdmF0ZSBxdWVzdGlvbjogUXVlc3Rpb25NYXRyaXhNb2RlbDtcclxuICAgIHByaXZhdGUgcm93OiBNYXRyaXhSb3dNb2RlbDtcclxuICAgIHByaXZhdGUgaXNGaXJzdDogYm9vbGVhbjtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IHByb3BzLnF1ZXN0aW9uO1xyXG4gICAgICAgIHRoaXMucm93ID0gcHJvcHMucm93O1xyXG4gICAgICAgIHRoaXMuaXNGaXJzdCA9IHByb3BzLmlzRmlyc3Q7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVPbkNoYW5nZSA9IHRoaXMuaGFuZGxlT25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgIH1cclxuICAgIGhhbmRsZU9uQ2hhbmdlKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5yb3cudmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlOiB0aGlzLnJvdy52YWx1ZSB9KTtcclxuICAgIH1cclxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzOiBhbnkpIHtcclxuICAgICAgICBzdXBlci5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyk7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IG5leHRQcm9wcy5xdWVzdGlvbjtcclxuICAgICAgICB0aGlzLnJvdyA9IG5leHRQcm9wcy5yb3c7XHJcbiAgICAgICAgdGhpcy5pc0ZpcnN0ID0gbmV4dFByb3BzLmlzRmlyc3Q7XHJcbiAgICB9XHJcbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xyXG4gICAgICAgIGlmICghdGhpcy5yb3cpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHZhciBmaXJzdFREID0gdGhpcy5xdWVzdGlvbi5oYXNSb3dzID8gPHRkPnt0aGlzLnJvdy50ZXh0fTwvdGQ+IDogbnVsbDtcclxuICAgICAgICB2YXIgdGRzID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMucXVlc3Rpb24uY29sdW1uc1tpXTtcclxuICAgICAgICAgICAgdmFyIGtleSA9IFwidmFsdWVcIiArIGk7XHJcbiAgICAgICAgICAgIHZhciBpc0NoZWNrZWQgPSB0aGlzLnJvdy52YWx1ZSA9PSBjb2x1bW4udmFsdWU7XHJcbiAgICAgICAgICAgIHZhciBpbnB1dElkID0gdGhpcy5pc0ZpcnN0ICYmIGkgPT0gMCA/IHRoaXMucXVlc3Rpb24uaW5wdXRJZCA6IG51bGw7XHJcbiAgICAgICAgICAgIHZhciB0ZCA9IDx0ZCBrZXk9e2tleX0+PGlucHV0IGlkPXtpbnB1dElkfSB0eXBlPVwicmFkaW9cIiBuYW1lPXt0aGlzLnJvdy5mdWxsTmFtZX0gdmFsdWU9e2NvbHVtbi52YWx1ZX0gZGlzYWJsZWQ9e3RoaXMuaXNEaXNwbGF5TW9kZX0gY2hlY2tlZD17aXNDaGVja2VkfSBvbkNoYW5nZT17dGhpcy5oYW5kbGVPbkNoYW5nZX0vPjwvdGQ+O1xyXG4gICAgICAgICAgICB0ZHMucHVzaCh0ZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoPHRyPntmaXJzdFREfXt0ZHN9PC90cj4pO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4XCIsIChwcm9wcykgPT4ge1xyXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25NYXRyaXgsIHByb3BzKTtcclxufSk7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbm1hdHJpeC50c3hcbiAqKi8iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7U3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcclxuaW1wb3J0IHtRdWVzdGlvbkh0bWxNb2RlbH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2h0bWxcIjtcclxuaW1wb3J0IHtSZWFjdFF1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkh0bWwgZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uSHRtbE1vZGVsIHsgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uSHRtbE1vZGVsOyB9XHJcbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xyXG4gICAgICAgIGlmICghdGhpcy5xdWVzdGlvbiB8fCAhdGhpcy5xdWVzdGlvbi5odG1sKSByZXR1cm4gbnVsbDtcclxuICAgICAgICB2YXIgaHRtbFZhbHVlID0geyBfX2h0bWw6IHRoaXMucXVlc3Rpb24ucHJvY2Vzc2VkSHRtbCB9O1xyXG4gICAgICAgIHJldHVybiAoPGRpdiBkYW5nZXJvdXNseVNldElubmVySFRNTD17aHRtbFZhbHVlfSAvPiApO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiaHRtbFwiLCAocHJvcHMpID0+IHtcclxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uSHRtbCwgcHJvcHMpO1xyXG59KTtcclxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmh0bWwudHN4XG4gKiovIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQge1N1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2V9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XHJcbmltcG9ydCB7UXVlc3Rpb25GaWxlTW9kZWx9IGZyb20gXCIuLi9xdWVzdGlvbl9maWxlXCI7XHJcbmltcG9ydCB7UmVhY3RRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25GaWxlIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7IGZpbGVMb2FkZWQ6IDAgfTtcclxuICAgICAgICB0aGlzLmhhbmRsZU9uQ2hhbmdlID0gdGhpcy5oYW5kbGVPbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbkZpbGVNb2RlbCB7IHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvbkZpbGVNb2RlbDsgfVxyXG4gICAgaGFuZGxlT25DaGFuZ2UoZXZlbnQpIHtcclxuICAgICAgICB2YXIgc3JjID0gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQ7IFxyXG4gICAgICAgIGlmICghd2luZG93W1wiRmlsZVJlYWRlclwiXSkgcmV0dXJuO1xyXG4gICAgICAgIGlmICghc3JjIHx8ICFzcmMuZmlsZXMgfHwgc3JjLmZpbGVzLmxlbmd0aCA8IDEpIHJldHVybjtcclxuICAgICAgICB0aGlzLnF1ZXN0aW9uLmxvYWRGaWxlKHNyYy5maWxlc1swXSk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGZpbGVMb2FkZWQ6IHRoaXMuc3RhdGUuZmlsZUxvYWRlZCArIDEgfSk7XHJcbiAgICB9XHJcbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xyXG4gICAgICAgIGlmICghdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgdmFyIGltZyA9IHRoaXMucmVuZGVySW1hZ2UoKTtcclxuICAgICAgICB2YXIgZmlsZUlucHV0ID0gbnVsbDtcclxuICAgICAgICBpZiAoIXRoaXMuaXNEaXNwbGF5TW9kZSkge1xyXG4gICAgICAgICAgICBmaWxlSW5wdXQgPSA8aW5wdXQgaWQ9e3RoaXMucXVlc3Rpb24uaW5wdXRJZH0gdHlwZT1cImZpbGVcIiBvbkNoYW5nZT17dGhpcy5oYW5kbGVPbkNoYW5nZX0vPjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIHtmaWxlSW5wdXR9XHJcbiAgICAgICAgICAgICAgICB7aW1nfVxyXG4gICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgIFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVySW1hZ2UoKTogSlNYLkVsZW1lbnQge1xyXG4gICAgICAgIGlmICghdGhpcy5xdWVzdGlvbi5wcmV2aWV3VmFsdWUpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHJldHVybiAoPGRpdj4gIDxpbWcgc3JjPXt0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZX0gaGVpZ2h0PXt0aGlzLnF1ZXN0aW9uLmltYWdlSGVpZ2h0fSB3aWR0aD17dGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRofSAvPjwvZGl2Pik7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJmaWxlXCIsIChwcm9wcykgPT4ge1xyXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25GaWxlLCBwcm9wcyk7XHJcbn0pO1xyXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uZmlsZS50c3hcbiAqKi8iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7U3VydmV5RWxlbWVudEJhc2UsIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2V9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XHJcbmltcG9ydCB7UXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbH0gZnJvbSBcIi4uL3F1ZXN0aW9uX211bHRpcGxldGV4dFwiO1xyXG5pbXBvcnQge011bHRpcGxlVGV4dEl0ZW1Nb2RlbH0gZnJvbSBcIi4uL3F1ZXN0aW9uX211bHRpcGxldGV4dFwiO1xyXG5pbXBvcnQge1JlYWN0UXVlc3Rpb25GYWN0b3J5fSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uTXVsdGlwbGVUZXh0IGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsIHsgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWw7IH1cclxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcclxuICAgICAgICB2YXIgdGFibGVSb3dzID0gdGhpcy5xdWVzdGlvbi5nZXRSb3dzKCk7XHJcbiAgICAgICAgdmFyIHJvd3MgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhYmxlUm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICByb3dzLnB1c2godGhpcy5yZW5kZXJSb3coXCJpdGVtXCIgKyBpLCB0YWJsZVJvd3NbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPHRhYmxlIGNsYXNzTmFtZT17dGhpcy5jc3Mucm9vdH0+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICB7cm93c31cclxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCByZW5kZXJSb3coa2V5OiBzdHJpbmcsIGl0ZW1zOiBBcnJheTxNdWx0aXBsZVRleHRJdGVtTW9kZWw+KSB7XHJcbiAgICAgICAgdmFyIHRkcyA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFyIGl0ZW0gPSBpdGVtc1tpXTtcclxuICAgICAgICAgICAgdGRzLnB1c2goPHRkIGtleT17XCJsYWJlbFwiICsgaX0+PHNwYW4gY2xhc3NOYW1lPXt0aGlzLmNzcy5pdGVtVGl0bGV9PntpdGVtLnRpdGxlfTwvc3Bhbj48L3RkPik7XHJcbiAgICAgICAgICAgIHRkcy5wdXNoKDx0ZCBrZXk9e1widmFsdWVcIiArIGl9Pnt0aGlzLnJlbmRlckl0ZW0oaXRlbSwgaSA9PSAwKX08L3RkPik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiA8dHIga2V5PXtrZXl9Pnt0ZHN9PC90cj47XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVySXRlbShpdGVtOiBNdWx0aXBsZVRleHRJdGVtTW9kZWwsIGlzRmlyc3Q6IGJvb2xlYW4pOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgdmFyIGlucHV0SWQgPSBpc0ZpcnN0ID8gdGhpcy5xdWVzdGlvbi5pbnB1dElkIDogbnVsbDtcclxuICAgICAgICByZXR1cm4gPFN1cnZleVF1ZXN0aW9uTXVsdGlwbGVUZXh0SXRlbSBpdGVtPXtpdGVtfSBjc3M9e3RoaXMuY3NzfSBpc0Rpc3BsYXlNb2RlPXt0aGlzLmlzRGlzcGxheU1vZGV9IGlucHV0SWQ9e2lucHV0SWR9IC8+O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25NdWx0aXBsZVRleHRJdGVtIGV4dGVuZHMgU3VydmV5RWxlbWVudEJhc2Uge1xyXG4gICAgcHJpdmF0ZSBpdGVtOiBNdWx0aXBsZVRleHRJdGVtTW9kZWw7XHJcbiAgICBwcml2YXRlIGlucHV0SWQ6IHN0cmluZztcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5pdGVtID0gcHJvcHMuaXRlbTtcclxuICAgICAgICB0aGlzLmlucHV0SWQgPSBwcm9wcy5pbnB1dElkO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7IHZhbHVlOiB0aGlzLml0ZW0udmFsdWUgfHwgJycgfTtcclxuICAgICAgICB0aGlzLmhhbmRsZU9uQ2hhbmdlID0gdGhpcy5oYW5kbGVPbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlT25CbHVyID0gdGhpcy5oYW5kbGVPbkJsdXIuYmluZCh0aGlzKTtcclxuICAgIH1cclxuICAgIGhhbmRsZU9uQ2hhbmdlKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlOiBldmVudC50YXJnZXQudmFsdWUgfSk7XHJcbiAgICB9XHJcbiAgICBoYW5kbGVPbkJsdXIoZXZlbnQpIHtcclxuICAgICAgICB0aGlzLml0ZW0udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlOiB0aGlzLml0ZW0udmFsdWUgfSk7XHJcbiAgICB9XHJcbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wczogYW55KSB7XHJcbiAgICAgICAgdGhpcy5pdGVtID0gbmV4dFByb3BzLml0ZW07XHJcbiAgICAgICAgdGhpcy5jc3MgPSBuZXh0UHJvcHMuY3NzO1xyXG4gICAgfVxyXG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICBpZiAoIXRoaXMuaXRlbSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgdmFyIHN0eWxlID0geyBmbG9hdDogXCJsZWZ0XCIgfTtcclxuICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlNb2RlKSByZXR1cm4gKDxkaXYgaWQ9e3RoaXMuaW5wdXRJZH0gY2xhc3NOYW1lPXt0aGlzLmNzcy5pdGVtVmFsdWV9IHN0eWxlPXtzdHlsZX0+e3RoaXMuaXRlbS52YWx1ZX08L2Rpdj4pO1xyXG4gICAgICAgIHJldHVybiAoPGlucHV0IGlkPXt0aGlzLmlucHV0SWR9IGNsYXNzTmFtZT17dGhpcy5jc3MuaXRlbVZhbHVlfSBzdHlsZT17c3R5bGV9IHR5cGU9XCJ0ZXh0XCIgdmFsdWU9e3RoaXMuc3RhdGUudmFsdWV9IG9uQmx1cj17dGhpcy5oYW5kbGVPbkJsdXJ9IG9uQ2hhbmdlPXt0aGlzLmhhbmRsZU9uQ2hhbmdlfSAvPik7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgZ2V0IG1haW5DbGFzc05hbWUoKTogc3RyaW5nIHsgcmV0dXJuIFwiXCI7IH1cclxufVxyXG5cclxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm11bHRpcGxldGV4dFwiLCAocHJvcHMpID0+IHtcclxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uTXVsdGlwbGVUZXh0LCBwcm9wcyk7XHJcbn0pO1xuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25tdWx0aXBsZXRleHQudHN4XG4gKiovIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQge1N1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2V9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XHJcbmltcG9ydCB7UXVlc3Rpb25SYWRpb2dyb3VwTW9kZWx9IGZyb20gXCIuLi9xdWVzdGlvbl9yYWRpb2dyb3VwXCI7XHJcbmltcG9ydCB7SXRlbVZhbHVlfSBmcm9tIFwiLi4vYmFzZVwiO1xyXG5pbXBvcnQge1N1cnZleVF1ZXN0aW9uQ29tbWVudEl0ZW19IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25jb21tZW50XCI7XHJcbmltcG9ydCB7UmVhY3RRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25SYWRpb2dyb3VwIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7IGNob2ljZXNDaGFuZ2VkOiAwIH07XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMucXVlc3Rpb24uY2hvaWNlc0NoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgc2VsZi5zdGF0ZS5jaG9pY2VzQ2hhbmdlZCA9IHNlbGYuc3RhdGUuY2hvaWNlc0NoYW5nZWQgKyAxO1xyXG4gICAgICAgICAgICBzZWxmLnNldFN0YXRlKHNlbGYuc3RhdGUpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5oYW5kbGVPbkNoYW5nZSA9IHRoaXMuaGFuZGxlT25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwgeyByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWw7IH1cclxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzOiBhbnkpIHtcclxuICAgICAgICBzdXBlci5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyk7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVPbkNoYW5nZSA9IHRoaXMuaGFuZGxlT25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgIH1cclxuICAgIGhhbmRsZU9uQ2hhbmdlKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbi52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmFsdWU6IHRoaXMucXVlc3Rpb24udmFsdWUgfSk7XHJcbiAgICB9XHJcbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xyXG4gICAgICAgIGlmICghdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPGZvcm0gY2xhc3NOYW1lPXt0aGlzLmNzcy5yb290fT5cclxuICAgICAgICAgICAge3RoaXMuZ2V0SXRlbXMoKSB9XHJcbiAgICAgICAgICAgIDwvZm9ybT4pO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIGdldEl0ZW1zKCk6IEFycmF5PGFueT4ge1xyXG4gICAgICAgIHZhciBpdGVtcyA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXNbaV07XHJcbiAgICAgICAgICAgIHZhciBrZXkgPSBcIml0ZW1cIiArIGk7XHJcbiAgICAgICAgICAgIGl0ZW1zLnB1c2godGhpcy5yZW5kZXJJdGVtKGtleSwgaXRlbSwgaSA9PSAwKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpdGVtcztcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBnZXQgdGV4dFN0eWxlKCk6IGFueSB7IHJldHVybiB7IG1hcmdpbkxlZnQ6IFwiM3B4XCIgfTsgfVxyXG4gICAgcHJpdmF0ZSByZW5kZXJJdGVtKGtleTogc3RyaW5nLCBpdGVtOiBJdGVtVmFsdWUsIGlzRmlyc3Q6IGJvb2xlYW4pOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgdmFyIGl0ZW1XaWR0aCA9IHRoaXMucXVlc3Rpb24uY29sQ291bnQgPiAwID8gKDEwMCAvIHRoaXMucXVlc3Rpb24uY29sQ291bnQpICsgXCIlXCIgOiBcIlwiO1xyXG4gICAgICAgIHZhciBtYXJnaW5SaWdodCA9IHRoaXMucXVlc3Rpb24uY29sQ291bnQgPT0gMCA/IFwiNXB4XCIgOiBcIjBweFwiO1xyXG4gICAgICAgIHZhciBkaXZTdHlsZSA9IHsgbWFyZ2luUmlnaHQ6IG1hcmdpblJpZ2h0IH07XHJcbiAgICAgICAgaWYgKGl0ZW1XaWR0aCkge1xyXG4gICAgICAgICAgICBkaXZTdHlsZVtcIndpZHRoXCJdID0gaXRlbVdpZHRoO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgaXNDaGVja2VkID0gdGhpcy5xdWVzdGlvbi52YWx1ZSA9PSBpdGVtLnZhbHVlO1xyXG4gICAgICAgIHZhciBvdGhlckl0ZW0gPSAoaXNDaGVja2VkICYmIGl0ZW0udmFsdWUgPT09IHRoaXMucXVlc3Rpb24ub3RoZXJJdGVtLnZhbHVlKSA/IHRoaXMucmVuZGVyT3RoZXIoKSA6IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyUmFkaW8oa2V5LCBpdGVtLCBpc0NoZWNrZWQsIGRpdlN0eWxlLCBvdGhlckl0ZW0sIGlzRmlyc3QpO1xyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHJlbmRlclJhZGlvKGtleTogc3RyaW5nLCBpdGVtOiBJdGVtVmFsdWUsIGlzQ2hlY2tlZDogYm9vbGVhbiwgZGl2U3R5bGU6IGFueSwgb3RoZXJJdGVtOiBKU1guRWxlbWVudCwgaXNGaXJzdDogYm9vbGVhbik6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICB2YXIgaWQgPSBpc0ZpcnN0ID8gdGhpcy5xdWVzdGlvbi5pbnB1dElkIDogbnVsbDtcclxuICAgICAgICByZXR1cm4gKDxkaXYga2V5PXtrZXl9IGNsYXNzTmFtZT17dGhpcy5jc3MuaXRlbX0gc3R5bGU9e2RpdlN0eWxlfT5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9e3RoaXMuY3NzLml0ZW19PlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IGlkPXtpZH0gdHlwZT1cInJhZGlvXCIgIGNoZWNrZWQ9e2lzQ2hlY2tlZH0gdmFsdWU9e2l0ZW0udmFsdWV9IGRpc2FibGVkPXt0aGlzLmlzRGlzcGxheU1vZGV9IG9uQ2hhbmdlPXt0aGlzLmhhbmRsZU9uQ2hhbmdlfSAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPXt0aGlzLnRleHRTdHlsZX0+e2l0ZW0udGV4dH08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIHtvdGhlckl0ZW19XHJcbiAgICAgICAgICAgIDwvZGl2Pik7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyT3RoZXIoKTogSlNYLkVsZW1lbnQge1xyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3RoaXMuY3NzLm90aGVyfT48U3VydmV5UXVlc3Rpb25Db21tZW50SXRlbSAgcXVlc3Rpb249e3RoaXMucXVlc3Rpb259IGNzcz17dGhpcy5yb290Q3NzfSBpc0Rpc3BsYXlNb2RlPXt0aGlzLmlzRGlzcGxheU1vZGV9Lz48L2Rpdj4pO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicmFkaW9ncm91cFwiLCAocHJvcHMpID0+IHtcclxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uUmFkaW9ncm91cCwgcHJvcHMpO1xyXG59KTtcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ucmFkaW9ncm91cC50c3hcbiAqKi8iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7U3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcclxuaW1wb3J0IHtRdWVzdGlvblRleHRNb2RlbH0gZnJvbSBcIi4uL3F1ZXN0aW9uX3RleHRcIjtcclxuaW1wb3J0IHtSZWFjdFF1ZXN0aW9uRmFjdG9yeX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25UZXh0IGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7IHZhbHVlOiB0aGlzLnF1ZXN0aW9uLnZhbHVlIHx8ICcnIH07XHJcbiAgICAgICAgdGhpcy5oYW5kbGVPbkNoYW5nZSA9IHRoaXMuaGFuZGxlT25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmhhbmRsZU9uQmx1ciA9IHRoaXMuaGFuZGxlT25CbHVyLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uVGV4dE1vZGVsIHsgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uVGV4dE1vZGVsOyB9XHJcbiAgICBoYW5kbGVPbkNoYW5nZShldmVudCkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogZXZlbnQudGFyZ2V0LnZhbHVlIH0pO1xyXG4gICAgfVxyXG4gICAgaGFuZGxlT25CbHVyKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbi52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmFsdWU6IHRoaXMucXVlc3Rpb24udmFsdWUgfHwgJycgfSk7XHJcbiAgICB9XHJcbiAgICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xyXG4gICAgICAgIGlmICghdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNEaXNwbGF5TW9kZSlcclxuICAgICAgICAgICAgcmV0dXJuICg8ZGl2IGlkPXt0aGlzLnF1ZXN0aW9uLmlucHV0SWR9IGNsYXNzTmFtZT17dGhpcy5jc3N9Pnt0aGlzLnF1ZXN0aW9uLnZhbHVlfTwvZGl2PilcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8aW5wdXQgaWQ9e3RoaXMucXVlc3Rpb24uaW5wdXRJZH0gY2xhc3NOYW1lPXt0aGlzLmNzc30gdHlwZT17dGhpcy5xdWVzdGlvbi5pbnB1dFR5cGV9IHZhbHVlPXt0aGlzLnN0YXRlLnZhbHVlfSBzaXplPXt0aGlzLnF1ZXN0aW9uLnNpemV9IG9uQmx1cj17dGhpcy5oYW5kbGVPbkJsdXJ9IG9uQ2hhbmdlPXt0aGlzLmhhbmRsZU9uQ2hhbmdlfSAvPlxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJ0ZXh0XCIsIChwcm9wcykgPT4ge1xyXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25UZXh0LCBwcm9wcyk7XHJcbn0pO1xuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb250ZXh0LnRzeFxuICoqLyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtTdXJ2ZXlFbGVtZW50QmFzZSwgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcclxuaW1wb3J0IHtRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbH0gZnJvbSBcIi4uL3F1ZXN0aW9uX21hdHJpeGR5bmFtaWNcIjtcclxuaW1wb3J0IHtJU3VydmV5Q3JlYXRvciwgU3VydmV5UXVlc3Rpb25FcnJvcnN9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25cIjtcclxuaW1wb3J0IHtNYXRyaXhEeW5hbWljUm93TW9kZWx9IGZyb20gXCIuLi9xdWVzdGlvbl9tYXRyaXhkeW5hbWljXCI7XHJcbmltcG9ydCB7TWF0cml4RHJvcGRvd25DZWxsfSBmcm9tIFwiLi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlXCI7XHJcbmltcG9ydCB7UmVhY3RRdWVzdGlvbkZhY3Rvcnl9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25NYXRyaXhEeW5hbWljIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc2V0UHJvcGVydGllcyhwcm9wcyk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsIHsgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsOyB9XHJcbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wczogYW55KSB7XHJcbiAgICAgICAgc3VwZXIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc2V0UHJvcGVydGllcyhuZXh0UHJvcHMpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBzZXRQcm9wZXJ0aWVzKG5leHRQcm9wczogYW55KSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7IHJvd0NvdW50ZXI6IDAgfTtcclxuICAgICAgICB0aGlzLnF1ZXN0aW9uLnJvd0NvdW50Q2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBzZWxmLnN0YXRlLnJvd0NvdW50ZXIgPSBzZWxmLnN0YXRlLnJvd0NvdW50ZXIgKyAxO1xyXG4gICAgICAgICAgICBzZWxmLnNldFN0YXRlKHNlbGYuc3RhdGUpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5oYW5kbGVPblJvd0FkZENsaWNrID0gdGhpcy5oYW5kbGVPblJvd0FkZENsaWNrLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcbiAgICBoYW5kbGVPblJvd0FkZENsaWNrKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbi5hZGRSb3coKTtcclxuICAgIH1cclxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcclxuICAgICAgICB2YXIgaGVhZGVycyA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLnF1ZXN0aW9uLmNvbHVtbnNbaV07XHJcbiAgICAgICAgICAgIHZhciBrZXkgPSBcImNvbHVtblwiICsgaTtcclxuICAgICAgICAgICAgdmFyIG1pbldpZHRoID0gdGhpcy5xdWVzdGlvbi5nZXRDb2x1bW5XaWR0aChjb2x1bW4pO1xyXG4gICAgICAgICAgICB2YXIgY29sdW1uU3R5bGUgPSBtaW5XaWR0aCA/IHsgbWluV2lkdGg6IG1pbldpZHRoIH0gOiB7fTtcclxuICAgICAgICAgICAgaGVhZGVycy5wdXNoKDx0aCBrZXk9e2tleX0gc3R5bGU9e2NvbHVtblN0eWxlfT57dGhpcy5xdWVzdGlvbi5nZXRDb2x1bW5UaXRsZShjb2x1bW4pIH08L3RoPik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciByb3dzID0gW107XHJcbiAgICAgICAgdmFyIHZpc2libGVSb3dzID0gdGhpcy5xdWVzdGlvbi52aXNpYmxlUm93cztcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciByb3cgPSB2aXNpYmxlUm93c1tpXTtcclxuICAgICAgICAgICAgcm93cy5wdXNoKDxTdXJ2ZXlRdWVzdGlvbk1hdHJpeER5bmFtaWNSb3cga2V5PXtyb3cuaWR9IHJvdz17cm93fSBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn0gaW5kZXg9e2l9IGNzcz17dGhpcy5jc3N9IHJvb3RDc3M9e3RoaXMucm9vdENzc30gaXNEaXNwbGF5TW9kZT17dGhpcy5pc0Rpc3BsYXlNb2RlfSBjcmVhdG9yPXt0aGlzLmNyZWF0b3J9IC8+KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGRpdlN0eWxlID0gdGhpcy5xdWVzdGlvbi5ob3Jpem9udGFsU2Nyb2xsID8geyBvdmVyZmxvd1g6ICdzY3JvbGwnIH0gOiB7fTtcclxuICAgICAgICB2YXIgYnRuRGVsZXRlVEQgPSAhdGhpcy5pc0Rpc3BsYXlNb2RlID8gPHRoPjwvdGg+IDogbnVsbDtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAgc3R5bGU9e2RpdlN0eWxlfT5cclxuICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3NOYW1lPXt0aGlzLmNzcy5yb290fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtoZWFkZXJzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtidG5EZWxldGVURH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cm93c31cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJBZGRSb3dCdXR0b24oKSB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyQWRkUm93QnV0dG9uKCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICBpZiAodGhpcy5pc0Rpc3BsYXlNb2RlKSByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gPGlucHV0IGNsYXNzTmFtZT17dGhpcy5jc3MuYnV0dG9ufSB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17dGhpcy5oYW5kbGVPblJvd0FkZENsaWNrfSB2YWx1ZT17dGhpcy5xdWVzdGlvbi5hZGRSb3dUZXh0fSAvPjtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uTWF0cml4RHluYW1pY1JvdyBleHRlbmRzIFN1cnZleUVsZW1lbnRCYXNlIHtcclxuICAgIHByaXZhdGUgcm93OiBNYXRyaXhEeW5hbWljUm93TW9kZWw7XHJcbiAgICBwcml2YXRlIHF1ZXN0aW9uOiBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbDtcclxuICAgIHByaXZhdGUgaW5kZXg6IG51bWJlcjtcclxuICAgIHByb3RlY3RlZCBjcmVhdG9yOiBJU3VydmV5Q3JlYXRvcjtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0aWVzKHByb3BzKTtcclxuICAgIH1cclxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzOiBhbnkpIHtcclxuICAgICAgICBzdXBlci5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zZXRQcm9wZXJ0aWVzKG5leHRQcm9wcyk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHNldFByb3BlcnRpZXMobmV4dFByb3BzOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnJvdyA9IG5leHRQcm9wcy5yb3c7XHJcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IG5leHRQcm9wcy5xdWVzdGlvbjtcclxuICAgICAgICB0aGlzLmluZGV4ID0gbmV4dFByb3BzLmluZGV4O1xyXG4gICAgICAgIHRoaXMuY3JlYXRvciA9IG5leHRQcm9wcy5jcmVhdG9yO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlT25Sb3dSZW1vdmVDbGljayA9IHRoaXMuaGFuZGxlT25Sb3dSZW1vdmVDbGljay5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG4gICAgaGFuZGxlT25Sb3dSZW1vdmVDbGljayhldmVudCkge1xyXG4gICAgICAgIHRoaXMucXVlc3Rpb24ucmVtb3ZlUm93KHRoaXMuaW5kZXgpO1xyXG4gICAgfVxyXG4gICAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICBpZiAoIXRoaXMucm93KSByZXR1cm4gbnVsbDtcclxuICAgICAgICB2YXIgdGRzID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvdy5jZWxscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB2YXIgY2VsbCA9IHRoaXMucm93LmNlbGxzW2ldO1xyXG4gICAgICAgICAgICB2YXIgZXJyb3JzID0gPFN1cnZleVF1ZXN0aW9uRXJyb3JzIHF1ZXN0aW9uPXtjZWxsLnF1ZXN0aW9ufSBjc3M9e3RoaXMucm9vdENzc30gY3JlYXRvcj17dGhpcy5jcmVhdG9yfSAvPjtcclxuICAgICAgICAgICAgdmFyIHNlbGVjdCA9IHRoaXMucmVuZGVyUXVlc3Rpb24oY2VsbCk7XHJcbiAgICAgICAgICAgIHRkcy5wdXNoKDx0ZCBrZXk9e1wicm93XCIgKyBpfT57ZXJyb3JzfXtzZWxlY3R9PC90ZD4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuaXNEaXNwbGF5TW9kZSkge1xyXG4gICAgICAgICAgICB2YXIgcmVtb3ZlQnV0dG9uID0gdGhpcy5yZW5kZXJCdXR0b24oKTtcclxuICAgICAgICAgICAgdGRzLnB1c2goPHRkIGtleT17XCJyb3dcIiArIHRoaXMucm93LmNlbGxzLmxlbmd0aCArIDF9PntyZW1vdmVCdXR0b259PC90ZD4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKDx0cj57dGRzfTwvdHI+KTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCByZW5kZXJRdWVzdGlvbihjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGwpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRvci5jcmVhdGVRdWVzdGlvbkVsZW1lbnQoY2VsbC5xdWVzdGlvbik7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyQnV0dG9uKCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICByZXR1cm4gPGlucHV0IGNsYXNzTmFtZT17dGhpcy5jc3MuYnV0dG9ufSB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17dGhpcy5oYW5kbGVPblJvd1JlbW92ZUNsaWNrfSB2YWx1ZT17dGhpcy5xdWVzdGlvbi5yZW1vdmVSb3dUZXh0fSAvPjtcclxuICAgIH1cclxufVxyXG5cclxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeGR5bmFtaWNcIiwgKHByb3BzKSA9PiB7XHJcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbk1hdHJpeER5bmFtaWMsIHByb3BzKTtcclxufSk7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbm1hdHJpeGR5bmFtaWMudHN4XG4gKiovIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQge1N1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2V9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XHJcbmltcG9ydCB7U3VydmV5UXVlc3Rpb25Db21tZW50SXRlbX0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmNvbW1lbnRcIjtcclxuaW1wb3J0IHtRdWVzdGlvblJhdGluZ01vZGVsfSBmcm9tIFwiLi4vcXVlc3Rpb25fcmF0aW5nXCI7XHJcbmltcG9ydCB7SXRlbVZhbHVlfSBmcm9tIFwiLi4vYmFzZVwiO1xyXG5pbXBvcnQge1JlYWN0UXVlc3Rpb25GYWN0b3J5fSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uUmF0aW5nIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlT25DaGFuZ2UgPSB0aGlzLmhhbmRsZU9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uUmF0aW5nTW9kZWwgeyByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25SYXRpbmdNb2RlbDsgfVxyXG4gICAgaGFuZGxlT25DaGFuZ2UoZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnF1ZXN0aW9uLnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdGhpcy5xdWVzdGlvbi52YWx1ZSB9KTtcclxuICAgIH1cclxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcclxuICAgICAgICB2YXIgdmFsdWVzID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHZhciBtaW5UZXh0ID0gaSA9PSAwID8gdGhpcy5xdWVzdGlvbi5taW5pbnVtUmF0ZURlc2NyaXB0aW9uICsgXCIgXCIgOiBudWxsO1xyXG4gICAgICAgICAgICB2YXIgbWF4VGV4dCA9IGkgPT0gdGhpcy5xdWVzdGlvbi52aXNpYmxlUmF0ZVZhbHVlcy5sZW5ndGggLSAxID8gXCIgXCIgKyB0aGlzLnF1ZXN0aW9uLm1heGltdW1SYXRlRGVzY3JpcHRpb24gOiBudWxsO1xyXG4gICAgICAgICAgICB2YWx1ZXMucHVzaCh0aGlzLnJlbmRlckl0ZW0oXCJ2YWx1ZVwiICsgaSwgdGhpcy5xdWVzdGlvbi52aXNpYmxlUmF0ZVZhbHVlc1tpXSwgbWluVGV4dCwgbWF4VGV4dCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY29tbWVudCA9IHRoaXMucXVlc3Rpb24uaGFzT3RoZXIgPyB0aGlzLnJlbmRlck90aGVyKCkgOiBudWxsO1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy5yb290fT5cclxuICAgICAgICAgICAgICAgIHt2YWx1ZXN9XHJcbiAgICAgICAgICAgICAgICB7Y29tbWVudH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCByZW5kZXJJdGVtKGtleTogc3RyaW5nLCBpdGVtOiBJdGVtVmFsdWUsIG1pblRleHQ6IHN0cmluZywgbWF4VGV4dDogc3RyaW5nKTogSlNYLkVsZW1lbnQge1xyXG4gICAgICAgIHZhciBpc0NoZWNrZWQgPSB0aGlzLnF1ZXN0aW9uLnZhbHVlID09IGl0ZW0udmFsdWU7XHJcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IHRoaXMuY3NzLml0ZW07XHJcbiAgICAgICAgaWYgKGlzQ2hlY2tlZCkgY2xhc3NOYW1lICs9IFwiIGFjdGl2ZVwiO1xyXG4gICAgICAgIHZhciBtaW4gPSBtaW5UZXh0ID8gPHNwYW4+e21pblRleHR9PC9zcGFuPiA6IG51bGw7XHJcbiAgICAgICAgdmFyIG1heCA9IG1heFRleHQgPyA8c3Bhbj57bWF4VGV4dH08L3NwYW4+IDogbnVsbDtcclxuICAgICAgICByZXR1cm4gPGxhYmVsIGtleT17a2V5fSBjbGFzc05hbWU9e2NsYXNzTmFtZX0+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBzdHlsZT17eyBkaXNwbGF5OiBcIm5vbmVcIiB9fSBuYW1lPXt0aGlzLnF1ZXN0aW9uLm5hbWV9IHZhbHVlPXtpdGVtLnZhbHVlfSBkaXNhYmxlZD17dGhpcy5pc0Rpc3BsYXlNb2RlfSBjaGVja2VkPXt0aGlzLnF1ZXN0aW9uLnZhbHVlID09IGl0ZW0udmFsdWV9IG9uQ2hhbmdlPXt0aGlzLmhhbmRsZU9uQ2hhbmdlfSAvPlxyXG4gICAgICAgICAgICB7bWlufVxyXG4gICAgICAgICAgICA8c3Bhbj57aXRlbS50ZXh0fTwvc3Bhbj5cclxuICAgICAgICAgICAge21heH1cclxuICAgICAgICAgICAgPC9sYWJlbD47XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyT3RoZXIoKTogSlNYLkVsZW1lbnQge1xyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3RoaXMuY3NzLm90aGVyfT48U3VydmV5UXVlc3Rpb25Db21tZW50SXRlbSAgcXVlc3Rpb249e3RoaXMucXVlc3Rpb259IGNzcz17dGhpcy5yb290Q3NzfSBpc0Rpc3BsYXlNb2RlPXt0aGlzLmlzRGlzcGxheU1vZGV9Lz48L2Rpdj4pO1xyXG4gICAgfVxyXG59XHJcblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJyYXRpbmdcIiwgKHByb3BzKSA9PiB7XHJcbiAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvblJhdGluZywgcHJvcHMpO1xyXG59KTtcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ucmF0aW5nLnRzeFxuICoqLyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHtTdXJ2ZXl9IGZyb20gXCIuL3JlYWN0U3VydmV5XCI7XHJcbmltcG9ydCB7U3VydmV5TW9kZWx9IGZyb20gXCIuLi9zdXJ2ZXlcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBTdXJ2ZXlXaW5kb3cgZXh0ZW5kcyBTdXJ2ZXkge1xyXG4gICAgcHJpdmF0ZSB0aXRsZTogc3RyaW5nO1xyXG4gICAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLmhhbmRsZU9uRXhwYW5kZWQgPSB0aGlzLmhhbmRsZU9uRXhwYW5kZWQuYmluZCh0aGlzKTtcclxuICAgIH1cclxuICAgIGhhbmRsZU9uRXhwYW5kZWQoZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnN0YXRlLmV4cGFuZGVkID0gIXRoaXMuc3RhdGUuZXhwYW5kZWQ7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh0aGlzLnN0YXRlKTtcclxuICAgIH1cclxuICAgIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuaGlkZGVuKSByZXR1cm4gbnVsbDtcclxuICAgICAgICB2YXIgaGVhZGVyID0gdGhpcy5yZW5kZXJIZWFkZXIoKTtcclxuICAgICAgICB2YXIgYm9keSA9IHRoaXMuc3RhdGUuZXhwYW5kZWQgPyB0aGlzLnJlbmRlckJvZHkoKSA6IG51bGw7XHJcbiAgICAgICAgdmFyIHN0eWxlID0geyBwb3NpdGlvbjogXCJmaXhlZFwiLCBib3R0b206IFwiM3B4XCIsIHJpZ2h0OiBcIjEwcHhcIiB9O1xyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGhpcy5jc3Mud2luZG93LnJvb3R9IHN0eWxlPXtzdHlsZX0+XHJcbiAgICAgICAgICAgIHtoZWFkZXJ9XHJcbiAgICAgICAgICAgIHtib2R5fVxyXG4gICAgICAgICAgICA8L2Rpdj47XHJcbiAgICAgICAgXHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVySGVhZGVyKCk6IEpTWC5FbGVtZW50IHtcclxuICAgICAgICB2YXIgc3R5bGVBID0geyB3aWR0aDogXCIxMDAlXCIgfTtcclxuICAgICAgICB2YXIgc3R5bGVUaXRsZSA9IHsgcGFkZGluZ1JpZ2h0OiBcIjEwcHhcIiB9O1xyXG4gICAgICAgIHZhciBnbHlwaENsYXNzTmFtZSA9IHRoaXMuc3RhdGUuZXhwYW5kZWQgPyB0aGlzLmNzcy53aW5kb3cuaGVhZGVyLmJ1dHRvbkNvbGxhcHNlZCA6IHRoaXMuY3NzLndpbmRvdy5oZWFkZXIuYnV0dG9uRXhwYW5kZWQ7XHJcbiAgICAgICAgZ2x5cGhDbGFzc05hbWUgPSBcImdseXBoaWNvbiBwdWxsLXJpZ2h0IFwiICsgZ2x5cGhDbGFzc05hbWU7XHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy53aW5kb3cuaGVhZGVyLnJvb3R9PlxyXG4gICAgICAgICAgICA8YSBocmVmPVwiI1wiIG9uQ2xpY2s9e3RoaXMuaGFuZGxlT25FeHBhbmRlZH0gc3R5bGU9e3N0eWxlQX0+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3RoaXMuY3NzLndpbmRvdy5oZWFkZXIudGl0bGV9IHN0eWxlPXtzdHlsZVRpdGxlfT57dGhpcy50aXRsZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2dseXBoQ2xhc3NOYW1lfSBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICA8L2Rpdj47XHJcbiAgICB9XHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyQm9keSgpOiBKU1guRWxlbWVudCB7XHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3M9e3RoaXMuY3NzLndpbmRvdy5ib2R5fT5cclxuICAgICAgICB7dGhpcy5yZW5kZXJTdXJ2ZXkoKSB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZVN1cnZleShuZXdQcm9wczogYW55KSB7XHJcbiAgICAgICAgc3VwZXIudXBkYXRlU3VydmV5KG5ld1Byb3BzKTtcclxuICAgICAgICB0aGlzLnRpdGxlID0gbmV3UHJvcHMudGl0bGUgPyBuZXdQcm9wcy50aXRsZSA6IHRoaXMuc3VydmV5LnRpdGxlO1xyXG4gICAgICAgIHZhciBoYXNFeHBhbmRlZCA9IG5ld1Byb3BzW1wiZXhwYW5kZWRcIl0gPyBuZXdQcm9wcy5leHBhbmRlZCA6IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7IGV4cGFuZGVkOiBoYXNFeHBhbmRlZCwgaGlkZGVuOiBmYWxzZSB9O1xyXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgICAgICB0aGlzLnN1cnZleS5vbkNvbXBsZXRlLmFkZChmdW5jdGlvbiAoczogU3VydmV5TW9kZWwpIHtcclxuICAgICAgICAgICAgc2VsZi5zdGF0ZS5oaWRkZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICBzZWxmLnNldFN0YXRlKHNlbGYuc3RhdGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvcmVhY3QvcmVhY3RTdXJ2ZXlXaW5kb3cudHN4XG4gKiovIiwiaW1wb3J0ICcuLi8uLi9sb2NhbGl6YXRpb24vZGFuaXNoJztcclxuaW1wb3J0ICcuLi8uLi9sb2NhbGl6YXRpb24vZHV0Y2gnO1xyXG5pbXBvcnQgJy4uLy4uL2xvY2FsaXphdGlvbi9maW5uaXNoJztcclxuaW1wb3J0ICcuLi8uLi9sb2NhbGl6YXRpb24vZnJlbmNoJztcclxuaW1wb3J0ICcuLi8uLi9sb2NhbGl6YXRpb24vZ2VybWFuJztcclxuaW1wb3J0ICcuLi8uLi9sb2NhbGl6YXRpb24vZ3JlZWsnO1xyXG5pbXBvcnQgJy4uLy4uL2xvY2FsaXphdGlvbi9wb2xpc2gnO1xyXG5pbXBvcnQgJy4uLy4uL2xvY2FsaXphdGlvbi9ydXNzaWFuJztcclxuaW1wb3J0ICcuLi8uLi9sb2NhbGl6YXRpb24vdHVya2lzaCc7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvZW50cmllcy9jaHVua3MvbG9jYWxpemF0aW9uLnRzXG4gKiovIiwiaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XHJcblxyXG5leHBvcnQgdmFyIGRhbmlzaFN1cnZleVN0cmluZ3MgPSB7XHJcbiAgICBwYWdlUHJldlRleHQ6IFwiVGlsYmFnZVwiLFxyXG4gICAgcGFnZU5leHRUZXh0OiBcIlZpZGVyZVwiLFxyXG4gICAgY29tcGxldGVUZXh0OiBcIkbDpnJkaWdcIixcclxuICAgIHByb2dyZXNzVGV4dDogXCJTaWRlIHswfSBhZiB7MX1cIixcclxuICAgIGVtcHR5U3VydmV5OiBcIkRlciBlciBpbmdlbiBzeW5saWdlIHNww7hyZ3Ntw6VsLlwiLFxyXG4gICAgY29tcGxldGluZ1N1cnZleTogXCJNYW5nZSB0YWsgZm9yIGRpbiBiZXN2YXJlbHNlIVwiLFxyXG4gICAgbG9hZGluZ1N1cnZleTogXCJTcMO4cmdlc2tlbWFldCBoZW50ZXMgZnJhIHNlcnZlcmVuLi4uXCIsXHJcbiAgICBvdGhlckl0ZW1UZXh0OiBcIlZhbGdmcml0IHN2YXIuLi5cIixcclxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIlbDpmxnLi4uXCIsXHJcbiAgICByZXF1aXJlZEVycm9yOiBcIkJlc3ZhciB2ZW5saWdzdCBzcMO4cmdzbcOlbGV0LlwiLFxyXG4gICAgbnVtZXJpY0Vycm9yOiBcIkFuZ2l2IGV0IHRhbC5cIixcclxuICAgIHRleHRNaW5MZW5ndGg6IFwiQW5naXYgbWluZHN0IHswfSB0ZWduLlwiLFxyXG4gICAgbWluU2VsZWN0RXJyb3I6IFwiVsOmbGcgdmVubGlnc3QgbWluZHN0ICB7MH0gc3Zhcm11bGlnaGVkKGVyKS5cIixcclxuICAgIG1heFNlbGVjdEVycm9yOiBcIlbDpmxnIHZlbmxpZ3N0IGbDpnJyZSB7MH0gc3Zhcm11bGlnaGVkZXIoZXIpLlwiLFxyXG4gICAgbnVtZXJpY01pbk1heDogXCInezB9JyBza2FsIHbDpnJlIGxpZyBtZWQgZWxsZXIgc3TDuHJyZSBlbmQgezF9IG9nIGxpZyBtZWQgZWxsZXIgbWluZHJlIGVuZCB7Mn1cIixcclxuICAgIG51bWVyaWNNaW46IFwiJ3swfScgc2thbCB2w6ZyZSBsaWcgbWVkIGVsbGVyIHN0w7hycmUgZW5kIHsxfVwiLFxyXG4gICAgbnVtZXJpY01heDogXCInezB9JyBza2FsIHbDpnJlIGxpZyBtZWQgZWxsZXIgbWluZHJlIGVuZCB7MX1cIixcclxuICAgIGludmFsaWRFbWFpbDogXCJBbmdpdiB2ZW5saWdzdCBlbiBneWxkaWcgZS1tYWlsIGFkcmVzc2UuXCIsXHJcbiAgICBleGNlZWRNYXhTaXplOiBcIkZpbHN0w7hycmVsc2VuIG3DpSBpa2tlIG92ZXJzdGlnZSB7MH0uXCIsXHJcbiAgICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiQW5naXYgZW4gdsOmcmRpIGZvciBkaXQgdmFsZ2ZyaWUgc3Zhci5cIlxyXG59O1xyXG5cclxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJkYVwiXSA9IGRhbmlzaFN1cnZleVN0cmluZ3M7XHJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2xvY2FsaXphdGlvbi9kYW5pc2gudHNcbiAqKi8iLCIvL0NyZWF0ZWQgb24gYmVoYWxmIGh0dHBzOi8vZ2l0aHViLmNvbS9GcmFuazEzXHJcbmltcG9ydCB7c3VydmV5TG9jYWxpemF0aW9ufSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xyXG5cclxuZXhwb3J0IHZhciBkdXRjaFN1cnZleVN0cmluZ3MgPSB7XHJcbiAgICBwYWdlUHJldlRleHQ6IFwiVm9yaWdlXCIsXHJcbiAgICBwYWdlTmV4dFRleHQ6IFwiVm9sZ2VuZGVcIixcclxuICAgIGNvbXBsZXRlVGV4dDogXCJBZnNsdWl0ZW5cIixcclxuICAgIG90aGVySXRlbVRleHQ6IFwiQW5kZXJlXCIsXHJcbiAgICBwcm9ncmVzc1RleHQ6IFwiUGFnaW5hIHswfSB2YW4gezF9XCIsXHJcbiAgICBlbXB0eVN1cnZleTogXCJFciBpcyBnZWVuIHppY2h0YmFyZSBwYWdpbmEgb2YgdnJhYWcgaW4gZGV6ZSB2cmFnZW5saWpzdFwiLFxyXG4gICAgY29tcGxldGluZ1N1cnZleTogXCJCZWRhbmt0IG9tIGRlemUgdnJhZ2VubGlqc3QgaW4gdGUgdnVsbGVuXCIsXHJcbiAgICBsb2FkaW5nU3VydmV5OiBcIkRlIHZyYWdlbmxpanN0IGlzIGFhbiBoZXQgbGFkZW4uLi5cIixcclxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIktpZXMuLi5cIixcclxuICAgIHJlcXVpcmVkRXJyb3I6IFwiR2VsaWV2ZSBlZW4gYW50d29vcmQgaW4gdGUgdnVsbGVuXCIsXHJcbiAgICBudW1lcmljRXJyb3I6IFwiSGV0IGFudHdvb3JkIG1vZXQgZWVuIGdldGFsIHppam5cIixcclxuICAgIHRleHRNaW5MZW5ndGg6IFwiR2VsaWV2ZSBtaW5zdGVuIHswfSBrYXJha3RlcnMgaW4gdGUgdnVsbGVuLlwiLFxyXG4gICAgbWluU2VsZWN0RXJyb3I6IFwiR2VsaWV2ZSBtaW5pbXVtIHswfSBhbnR3b29yZGVuIHRlIHNlbGVjdGVyZW4uXCIsXHJcbiAgICBtYXhTZWxlY3RFcnJvcjogXCJHZWxpZXZlIG5pZXQgbWVlciBkYW4gezB9IGFudHdvb3JkZW4gdGUgc2VsZWN0ZXJlbi5cIixcclxuICAgIG51bWVyaWNNaW5NYXg6IFwiVXcgYW50d29vcmQgJ3swfScgbW9ldCBncm90ZXIgb2YgZ2VsaWprIHppam4gYWFuIHsxfSBlbiBrbGVpbmVyIG9mIGdlbGlqayBhYW4gezJ9XCIsXHJcbiAgICBudW1lcmljTWluOiBcIlV3IGFudHdvb3JkICd7MH0nIG1vZXQgZ3JvdGVyIG9mIGdlbGlqayB6aWpuIGFhbiB7MX1cIixcclxuICAgIG51bWVyaWNNYXg6IFwiVXcgYW50d29vcmQgJ3swfScgbW9ldCBncm90ZXIgb2YgZ2VsaWprIHppam4gYWFuIHsxfVwiLFxyXG4gICAgaW52YWxpZEVtYWlsOiBcIkdlbGlldmUgZWVuIGdlbGRpZyBlLW1haWxhZHJlcyBpbiB0ZSB2dWxsZW4uXCIsXHJcbiAgICBleGNlZWRNYXhTaXplOiBcIkRlIGdyb290dGUgdmFuIGhldCBiZXN0YW5kIG1hZyBuaWV0IGdyb3RlciB6aWpuIGRhbiB7MH0uXCIsXHJcbiAgICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiR2VsaWV2ZSBoZXQgdmVsZCAnQW5kZXJlJyBpbiB0ZSB2dWxsZW5cIlxyXG59O1xyXG5cclxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJubFwiXSA9IGR1dGNoU3VydmV5U3RyaW5ncztcclxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvbG9jYWxpemF0aW9uL2R1dGNoLnRzXG4gKiovIiwiaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XHJcblxyXG5leHBvcnQgdmFyIGZpbm5pc2hTdXJ2ZXlTdHJpbmdzID0ge1xyXG4gICAgcGFnZVByZXZUZXh0OiBcIkVkZWxsaW5lblwiLFxyXG4gICAgcGFnZU5leHRUZXh0OiBcIlNldXJhYXZhXCIsXHJcbiAgICBjb21wbGV0ZVRleHQ6IFwiVmFsbWlzXCIsXHJcbiAgICBvdGhlckl0ZW1UZXh0OiBcIk11dSAoa3V2YWlsZSlcIixcclxuICAgIHByb2dyZXNzVGV4dDogXCJTaXZ1IHswfS97MX1cIixcclxuICAgIGVtcHR5U3VydmV5OiBcIlTDpHNzw6Qga3lzZWx5c3PDpCBlaSBvbGUgeWh0w6Rrw6TDpG4gbsOka3l2aWxsw6Qgb2xldmFhIHNpdnVhIHRhaSBreXN5bXlzdMOkLlwiLFxyXG4gICAgY29tcGxldGluZ1N1cnZleTogXCJLaWl0b3Mga3lzZWx5eW4gdmFzdGFhbWlzZXN0YSFcIixcclxuICAgIGxvYWRpbmdTdXJ2ZXk6IFwiS3lzZWx5w6QgbGFkYXRhYW4gcGFsdmVsaW1lbHRhLi4uXCIsXHJcbiAgICBvcHRpb25zQ2FwdGlvbjogXCJWYWxpdHNlLi4uXCIsXHJcbiAgICByZXF1aXJlZEVycm9yOiBcIlZhc3RhYSBreXN5bXlrc2Vlbiwga2lpdG9zLlwiLFxyXG4gICAgbnVtZXJpY0Vycm9yOiBcIkFydm9uIHR1bGVlIG9sbGEgbnVtZWVyaW5lbi5cIixcclxuICAgIHRleHRNaW5MZW5ndGg6IFwiT2xlIGh5dsOkIGphIHN5w7Z0w6QgdsOkaGludMOkw6RuIHswfSBtZXJra2nDpC5cIixcclxuICAgIG1pblNlbGVjdEVycm9yOiBcIk9sZSBoeXbDpCBqYSB2YWxpdHNlIHbDpGhpbnTDpMOkbiB7MH0gdmFpaHRvZWh0b2EuXCIsXHJcbiAgICBtYXhTZWxlY3RFcnJvcjogXCJPbGUgaHl2w6QgamEgdmFsaXRzZSBlbmludMOkw6RuIHswfSB2YWlodG9laHRvYS5cIixcclxuICAgIG51bWVyaWNNaW5NYXg6IFwiJ3swfScgdMOkeXR5eSBvbGxhIGVuZW1tw6RuIHRhaSB5aHTDpCBzdXVyaSBrdWluIHsxfSBqYSB2w6RoZW1tw6RuIHRhaSB5aHTDpCBzdXVyaSBrdWluIHsyfVwiLFxyXG4gICAgbnVtZXJpY01pbjogXCInezB9JyB0w6R5dHl5IG9sbGEgZW5lbW3DpG4gdGFpIHlodMOkIHN1dXJpIGt1aW4gezF9XCIsXHJcbiAgICBudW1lcmljTWF4OiBcIid7MH0nIHTDpHl0eXkgb2xsYSB2w6RoZW1tw6RuIHRhaSB5aHTDpCBzdXVyaSBrdWluIHsxfVwiLFxyXG4gICAgaW52YWxpZEVtYWlsOiBcIlN5w7Z0w6QgdmFsaWRpIHPDpGhrw7Zwb3N0aW9zb2l0ZS5cIixcclxuICAgIG90aGVyUmVxdWlyZWRFcnJvcjogXCJPbGUgaHl2w6QgamEgc3nDtnTDpCBcXFwiTXV1IChrdXZhaWxlKVxcXCJcIlxyXG59O1xyXG5cclxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJmaVwiXSA9IGZpbm5pc2hTdXJ2ZXlTdHJpbmdzO1xyXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9sb2NhbGl6YXRpb24vZmlubmlzaC50c1xuICoqLyIsIi8vQ3JlYXRlZCBvbiBiZWhhbGYgaHR0cHM6Ly9naXRodWIuY29tL0ZyYW5rMTNcclxuaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XHJcblxyXG5leHBvcnQgdmFyIGZyZW5jaFN1cnZleVN0cmluZ3MgPSB7XHJcbiAgICBwYWdlUHJldlRleHQ6IFwiUHJcXHUwMGU5Y1xcdTAwZTlkZW50XCIsXHJcbiAgICBwYWdlTmV4dFRleHQ6IFwiU3VpdmFudFwiLFxyXG4gICAgY29tcGxldGVUZXh0OiBcIlRlcm1pbmVyXCIsXHJcbiAgICBvdGhlckl0ZW1UZXh0OiBcIkF1dHJlIChwclxcdTAwZTljaXNlcilcIixcclxuICAgIHByb2dyZXNzVGV4dDogXCJQYWdlIHswfSBzdXIgezF9XCIsXHJcbiAgICBlbXB0eVN1cnZleTogXCJJbCBuJ3kgYSBuaSBwYWdlIHZpc2libGUgbmkgcXVlc3Rpb24gdmlzaWJsZSBkYW5zIGNlIHF1ZXN0aW9ubmFpcmVcIixcclxuICAgIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiTWVyY2kgZCdhdm9pciByXFx1MDBlOXBvbmR1IGF1IHF1ZXN0aW9ubmFpcmUhXCIsXHJcbiAgICBsb2FkaW5nU3VydmV5OiBcIkxlIHF1ZXN0aW9ubmFpcmUgZXN0IGVuIGNvdXJzIGRlIGNoYXJnZW1lbnQuLi5cIixcclxuICAgIG9wdGlvbnNDYXB0aW9uOiBcIkNob2lzaXNzZXouLi5cIixcclxuICAgIHJlcXVpcmVkRXJyb3I6IFwiTGEgclxcdTAwZTlwb25zZSBcXHUwMGUwIGNldHRlIHF1ZXN0aW9uIGVzdCBvYmxpZ2F0b2lyZS5cIixcclxuICAgIG51bWVyaWNFcnJvcjogXCJMYSByXFx1MDBlOXBvbnNlIGRvaXQgXFx1MDBlYXRyZSB1biBub21icmUuXCIsXHJcbiAgICB0ZXh0TWluTGVuZ3RoOiBcIk1lcmNpIGQnZW50cmVyIGF1IG1vaW5zIHswfSBzeW1ib2xlcy5cIixcclxuICAgIG1pblNlbGVjdEVycm9yOiBcIk1lcmNpIGRlIHNcXHUwMGU5bGVjdGlvbm5lciBhdSBtb2lucyB7MH1yXFx1MDBlOXBvbnNlcy5cIixcclxuICAgIG1heFNlbGVjdEVycm9yOiBcIk1lcmNpIGRlIHNcXHUwMGU5bGVjdGlvbm5lciBhdSBwbHVzIHswfXJcXHUwMGU5cG9uc2VzLlwiLFxyXG4gICAgbnVtZXJpY01pbk1heDogXCJWb3RyZSByXFx1MDBlOXBvbnNlICd7MH0nIGRvaXQgXFx1MDBlYXRyZXN1cFxcdTAwZTlyaWV1cmUgb3UgXFx1MDBlOWdhbGUgXFx1MDBlMCB7MX0gZXQgaW5mXFx1MDBlOXJpZXVyZSBvdVxcdTAwZTlnYWxlIFxcdTAwZTAgezJ9XCIsXHJcbiAgICBudW1lcmljTWluOiBcIlZvdHJlIHJcXHUwMGU5cG9uc2UgJ3swfScgZG9pdCBcXHUwMGVhdHJlc3VwXFx1MDBlOXJpZXVyZSBvdSBcXHUwMGU5Z2FsZSBcXHUwMGUwIHsxfVwiLFxyXG4gICAgbnVtZXJpY01heDogXCJWb3RyZSByXFx1MDBlOXBvbnNlICd7MH0nIGRvaXQgXFx1MDBlYXRyZWluZlxcdTAwZTlyaWV1cmUgb3UgXFx1MDBlOWdhbGUgXFx1MDBlMCB7MX1cIixcclxuICAgIGludmFsaWRFbWFpbDogXCJNZXJjaSBkJ2VudHJlciB1bmUgYWRyZXNzZSBtYWlsIHZhbGlkZS5cIixcclxuICAgIGV4Y2VlZE1heFNpemU6IFwiTGEgdGFpbGxlIGR1IGZpY2hpZXIgbmUgZG9pdCBwYXMgZXhjXFx1MDBlOWRlciB7MH0uXCIsXHJcbiAgICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiTWVyY2kgZGUgcHJcXHUwMGU5Y2lzZXIgbGUgY2hhbXAgJ0F1dHJlJy5cIlxyXG59O1xyXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImZyXCJdID0gZnJlbmNoU3VydmV5U3RyaW5ncztcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9sb2NhbGl6YXRpb24vZnJlbmNoLnRzXG4gKiovIiwiaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XHJcblxyXG5leHBvcnQgdmFyIGdlcm1hblN1cnZleVN0cmluZ3MgPSB7XHJcbiAgICBwYWdlUHJldlRleHQ6IFwiWnVyw7xja1wiLFxyXG4gICAgcGFnZU5leHRUZXh0OiBcIldlaXRlclwiLFxyXG4gICAgY29tcGxldGVUZXh0OiBcIkZlcnRpZ1wiLFxyXG4gICAgcHJvZ3Jlc3NUZXh0OiBcIlNlaXRlIHswfSB2b24gezF9XCIsXHJcbiAgICBlbXB0eVN1cnZleTogXCJFcyBnaWJ0IGtlaW5lIHNpY2h0YmFyZSBGcmFnZS5cIixcclxuICAgIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiVmllbGVuIERhbmsgZsO8ciBkYXMgQXVzZsO8bGxlbiBkZXMgRnJhZ2Vib2dlbnMhXCIsXHJcbiAgICBsb2FkaW5nU3VydmV5OiBcIkRlciBGcmFnZWJvZ2VuIHdpcmQgdm9tIFNlcnZlciBnZWxhZGVuLi4uXCIsXHJcbiAgICBvdGhlckl0ZW1UZXh0OiBcIkJlbnV0emVyZGVmaW5pZXJ0ZSBBbnR3b3J0Li4uXCIsXHJcbiAgICBvcHRpb25zQ2FwdGlvbjogXCJXw6RobGVuLi4uXCIsXHJcbiAgICByZXF1aXJlZEVycm9yOiBcIkJpdHRlIGFudHdvcnRlbiBTaWUgYXVmIGRpZSBGcmFnZS5cIixcclxuICAgIG51bWVyaWNFcnJvcjogXCJEZXIgV2VydCBzb2xsdGUgZWluZSBaYWhsIHNlaW4uXCIsXHJcbiAgICB0ZXh0TWluTGVuZ3RoOiBcIkJpdHRlIGdlYmVuIFNpZSBtaW5kZXN0ZW5zIHswfSBTeW1ib2xlLlwiLFxyXG4gICAgbWluU2VsZWN0RXJyb3I6IFwiQml0dGUgd8OkaGxlbiBTaWUgbWluZGVzdGVucyB7MH0gVmFyaWFudGVuLlwiLFxyXG4gICAgbWF4U2VsZWN0RXJyb3I6IFwiQml0dGUgd8OkaGxlbiBTaWUgbmljaHQgbWVociBhbHMgezB9IFZhcmlhbnRlbi5cIixcclxuICAgIG51bWVyaWNNaW5NYXg6IFwiJ3swfScgc29sdGUgZ2xlaWNoIG9kZXIgZ3LDtsOfZXIgc2VpbiBhbHMgezF9IHVuZCBnbGVpY2ggb2RlciBrbGVpbmVyIGFscyB7Mn1cIixcclxuICAgIG51bWVyaWNNaW46IFwiJ3swfScgc29sdGUgZ2xlaWNoIG9kZXIgZ3LDtsOfZXIgc2VpbiBhbHMgezF9XCIsXHJcbiAgICBudW1lcmljTWF4OiBcIid7MH0nIHNvbHRlIGdsZWljaCBvZGVyIGtsZWluZXIgYWxzIHsxfVwiLFxyXG4gICAgaW52YWxpZEVtYWlsOiBcIkJpdHRlIGdlYmVuIFNpZSBlaW5lIGfDvGx0aWdlIEVtYWlsLUFkcmVzc2UgZWluLlwiLFxyXG4gICAgZXhjZWVkTWF4U2l6ZTogXCJEaWUgRGF0ZWlncsO2w59lIHNvbGwgbmljaHQgbWVociBhbHMgezB9LlwiLFxyXG4gICAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIkJpdHRlIGdlYmVuIFNpZSBlaW5lbiBXZXJ0IGbDvHIgSWhyZSBiZW51dHplcmRlZmluaWVydGUgQW50d29ydCBlaW4uXCJcclxufTtcclxuXHJcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZGVcIl0gPSBnZXJtYW5TdXJ2ZXlTdHJpbmdzO1xyXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL3NyYy9sb2NhbGl6YXRpb24vZ2VybWFuLnRzXG4gKiovIiwiLy9DcmVhdGVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9hZ2Vsb3NwYW5hZ2lvdGFraXNcclxuaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XHJcblxyXG5leHBvcnQgdmFyIGdyZWVrU3VydmV5U3RyaW5ncyA9IHtcclxuICAgIHBhZ2VQcmV2VGV4dDogXCLOoM+Bzr/Ot86zzr/Pjc68zrXOvc6/XCIsXHJcbiAgICBwYWdlTmV4dFRleHQ6IFwizpXPgM+MzrzOtc69zr9cIixcclxuICAgIGNvbXBsZXRlVGV4dDogXCLOn867zr/Ous67zq7Pgc+Jz4POt1wiLFxyXG4gICAgb3RoZXJJdGVtVGV4dDogXCLOhs67zrvOvyAoz4DOsc+BzrHOus6xzrvPjiDOtM65zrXPhc66z4HOuc69zq/Pg8+EzrUpXCIsXHJcbiAgICBwcm9ncmVzc1RleHQ6IFwizqPOtc67zq/OtM6xIHswfSDOsc+Az4wgezF9XCIsXHJcbiAgICBlbXB0eVN1cnZleTogXCLOlM61zr0gz4XPgM6sz4HPh861zrkgzrrOsc68zq/OsSDOv8+BzrHPhM6uIM+DzrXOu86vzrTOsSDOriDOv8+BzrHPhM6uIM61z4HPjs+EzrfPg863IM+DzrUgzrHPhc+Ez4wgz4TOvyDOtc+Bz4nPhM63zrzOsc+Ezr/Ou8+MzrPOuc6/LlwiLFxyXG4gICAgY29tcGxldGluZ1N1cnZleTogXCLOlc+Fz4fOsc+BzrnPg8+Ezr/Pjc68zrUgzrPOuc6xIM+EzrfOvSDPg8+FzrzPgM67zq7Pgc+Jz4POtyDOsc+Fz4TOv8+FIM+Ezr/PhSDOtc+Bz4nPhM63zrzOsc+Ezr/Ou86/zrPOr86/z4UhXCIsXHJcbiAgICBsb2FkaW5nU3VydmV5OiBcIs6kzr8gzrXPgc+Jz4TOt868zrHPhM6/zrvPjM6zzrnOvyDPhs6/z4HPhM+Ozr3Otc+EzrHOuSDOsc+Azr8gz4TOvyDOtM65zrHOus6/zrzOuc+Dz4TOri4uLlwiLFxyXG4gICAgb3B0aW9uc0NhcHRpb246IFwizpXPgM65zrvOrc6+z4TOtS4uLlwiLFxyXG4gICAgcmVxdWlyZWRFcnJvcjogXCLOoM6xz4HOsc66zrHOu8+OIM6xz4DOsc69z4TOrs+Dz4TOtSDPg8+EzrfOvSDOtc+Bz47PhM63z4POty5cIixcclxuICAgIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDOsc+AzrHOvc+Ezq7Pg8+EzrUgz4PPhM65z4IgzrXPgc+Jz4TOrs+DzrXOuc+CIM+DzrUgz4zOu861z4Igz4TOuc+CIM6zz4HOsc68zrzOrc+CLlwiLFxyXG4gICAgbnVtZXJpY0Vycm9yOiBcIs6XIM+EzrnOvM6uIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzrHPgc65zrjOvM65z4TOuc66zq4uXCIsXHJcbiAgICB0ZXh0TWluTGVuZ3RoOiBcIs6gzrHPgc6xzrrOsc67z44gz4PPhc68z4DOu863z4HPjs+Dz4TOtSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDPg8+NzrzOss6/zrvOsS5cIixcclxuICAgIG1pblJvd0NvdW50RXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDPg8+FzrzPgM67zrfPgc+Oz4PPhM61IM+Ezr/Phc67zqzPh865z4PPhM6/zr0gezB9IM6zz4HOsc68zrzOrc+CLlwiLFxyXG4gICAgbWluU2VsZWN0RXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDOtc+AzrnOu86tzr7PhM61IM+Ezr/Phc67zqzPh865z4PPhM6/zr0gezB9IM+AzrHPgc6xzrvOu86xzrPOrc+CLlwiLFxyXG4gICAgbWF4U2VsZWN0RXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDOtc+AzrnOu86tzr7PhM61IM+Mz4fOuSDPgM6xz4HOsc+AzqzOvc+JIM6xz4DOvyB7MH0gz4DOsc+BzrHOu867zrHOs86tz4IuXCIsXHJcbiAgICBudW1lcmljTWluTWF4OiBcIs6kzr8gJ3swfScgzrjOsSDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM6vz4POvyDOriDOvM61zrPOsc67z43PhM61z4HOvyDOsc+Azr8gz4TOvyB7MX0gzrrOsc65IM6vz4POvyDOriDOvM65zrrPgc+Mz4TOtc+Bzr8gzrHPgM6/IM+Ezr8gezJ9XCIsXHJcbiAgICBudW1lcmljTWluOiBcIs6kzr8gJ3swfScgz4DPgc6tz4DOtc65IM69zrEgzrXOr869zrHOuSDOvM61zrPOsc67z43PhM61z4HOvyDOriDOuc+Dzr8gzrzOtSDPhM6/IHsxfVwiLFxyXG4gICAgbnVtZXJpY01heDogXCLOpM6/ICd7MH0nIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzrzOuc66z4HPjM+EzrXPgc6/IM6uIM6vz4POvyDOsc+Azr8gz4TOvyB7MX1cIixcclxuICAgIGludmFsaWRFbWFpbDogXCLOoM6xz4HOsc66zrHOu8+OIM60z47Pg8+EzrUgzrzOuc6xIM6xz4DOv860zrXOus+Ezq4gzrTOuc61z43OuM+Fzr3Pg863IGUtbWFpbC5cIixcclxuICAgIHVybFJlcXVlc3RFcnJvcjogXCLOlyDOsc6vz4TOt8+DzrcgzrXPgM6tz4PPhM+BzrXPiM61IM+Dz4bOrM67zrzOsSAnezB9Jy4gezF9XCIsXHJcbiAgICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwizpcgzrHOr8+EzrfPg863IM61z4DOrc+Dz4TPgc61z4jOtSDOus61zr3OrCDOtM61zrTOv868zq3Ovc6xIM6uIM63IM65zrTPjM+EzrfPhM6xICfOvM6/zr3Ov8+AzqzPhM65L3BhdGgnIM61zq/Ovc6xzrkgzrXPg8+GzrHOu86tzrzOrc69zrdcIixcclxuICAgIGV4Y2VlZE1heFNpemU6IFwizqTOvyDOvM6tzrPOtc64zr/PgiDOtM61zr0gzrzPgM6/z4HOtc6vIM69zrEgz4XPgM61z4HOss6tzr3Otc65IM+EzrEgezB9LlwiLFxyXG4gICAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIs6gzrHPgc6xzrrOsc67z44gz4PPhc68z4DOu863z4HPjs+Dz4TOtSDPhM63zr0gz4TOuc68zq4gzrPOuc6xIM+Ezr8gz4DOtc60zq/OvyAnzqzOu867zr8nLlwiLFxyXG4gICAgdXBsb2FkaW5nRmlsZTogXCLOpM6/IM6xz4HPh861zq/OvyDPg86xz4IgzrHOvc61zrLOsc6vzr3Otc65LiDOoM6xz4HOsc66zrHOu8+OIM+AzrXPgc65zrzOrc69zrXPhM61IM66zrHPgM6/zrnOsSDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEgzrrOsc65IM60zr/Ous65zrzOrM+Dz4TOtSDOvs6xzr3OrC5cIixcclxuICAgIGFkZFJvdzogXCLOoM+Bzr/Pg864zq7Ous63IM6zz4HOsc68zrzOrs+CXCIsXHJcbiAgICByZW1vdmVSb3c6IFwizpHPhs6xzq/Pgc61z4POt1wiXHJcbn07XHJcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZ3JcIl0gPSBncmVla1N1cnZleVN0cmluZ3M7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvbG9jYWxpemF0aW9uL2dyZWVrLnRzXG4gKiovIiwiaW1wb3J0IHtzdXJ2ZXlMb2NhbGl6YXRpb259IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XHJcblxyXG5leHBvcnQgdmFyIHBvbGlzaFN1cnZleVN0cmluZ3MgPSB7XHJcbiAgICBwYWdlUHJldlRleHQ6IFwiV3N0ZWN6XCIsXHJcbiAgICBwYWdlTmV4dFRleHQ6IFwiRGFsZWpcIixcclxuICAgIGNvbXBsZXRlVGV4dDogXCJHb3Rvd2VcIixcclxuICAgIHByb2dyZXNzVGV4dDogXCJTdHJvbmEgezB9IHogezF9XCIsXHJcbiAgICBlbXB0eVN1cnZleTogXCJOaWUgbWEgd2lkb2N6bnljaCBweXRhxYQuXCIsXHJcbiAgICBjb21wbGV0aW5nU3VydmV5OiBcIkR6acSZa3VqZW15IHphIHd5cGXFgm5pZW5pZSBhbmtpZXR5IVwiLFxyXG4gICAgbG9hZGluZ1N1cnZleTogXCJUcndhIHdjenl0eXdhbmllIGFua2lldHkuLi5cIixcclxuICAgIG90aGVySXRlbVRleHQ6IFwiSW5uYSBvZHBvd2llZMW6Li4uXCIsXHJcbiAgICBvcHRpb25zQ2FwdGlvbjogXCJXeWJpZXJ6Li4uXCIsXHJcbiAgICByZXF1aXJlZEVycm9yOiBcIlByb3N6xJkgb2Rwb3dpZWR6aWXEhyBuYSB0byBweXRhbmllLlwiLFxyXG4gICAgbnVtZXJpY0Vycm9yOiBcIlcgdHltIHBvbHUgbW/FvG5hIHdwaXNhxIcgdHlsa28gbGljemJ5LlwiLFxyXG4gICAgdGV4dE1pbkxlbmd0aDogXCJQcm9zesSZIHdwaXNhxIcgY28gbmFqbW5pZWogezB9IHpuYWvDs3cuXCIsXHJcbiAgICBtaW5TZWxlY3RFcnJvcjogXCJQcm9zesSZIHd5YnJhxIcgY28gbmFqbW5pZWogezB9IHBvenljamkuXCIsXHJcbiAgICBtYXhTZWxlY3RFcnJvcjogXCJQcm9zesSZIHd5YnJhxIcgbmllIHdpxJljZWogbmnFvCB7MH0gcG96eWNqaS5cIixcclxuICAgIG51bWVyaWNNaW5NYXg6IFwiT2Rwb3dpZWTFuiAnezB9JyBwb3dpbm5hIGJ5xIcgd2nEmWtzemEgbHViIHLDs3duYSB7MX0gb3JheiBtbmllanN6YSBsdWIgcsOzd25hIHsyfVwiLFxyXG4gICAgbnVtZXJpY01pbjogXCJPZHBvd2llZMW6ICd7MH0nIHBvd2lubmEgYnnEhyB3acSZa3N6YSBsdWIgcsOzd25hIHsxfVwiLFxyXG4gICAgbnVtZXJpY01heDogXCJPZHBvd2llZMW6ICd7MH0nIHBvd2lubmEgYnnEhyBtbmllanN6YSBsdWIgcsOzd25hIHsxfVwiLFxyXG4gICAgaW52YWxpZEVtYWlsOiBcIlByb3N6xJkgcG9kYcSHIHByYXdpZMWCb3d5IGFkcmVzIGVtYWlsLlwiLFxyXG4gICAgZXhjZWVkTWF4U2l6ZTogXCJSb3ptaWFyIHByemVzxYJhbmVnbyBwbGlrdSBuaWUgbW/FvGUgcHJ6ZWtyYWN6YcSHIHswfS5cIixcclxuICAgIG90aGVyUmVxdWlyZWRFcnJvcjogXCJQcm9zesSZIHBvZGHEhyBpbm7EhSBvZHBvd2llZMW6LlwiXHJcbn07XHJcblxyXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInBsXCJdID0gcG9saXNoU3VydmV5U3RyaW5ncztcclxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvbG9jYWxpemF0aW9uL3BvbGlzaC50c1xuICoqLyIsImltcG9ydCB7c3VydmV5TG9jYWxpemF0aW9ufSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xyXG5cclxuZXhwb3J0IHZhciBydXNzaWFuU3VydmV5U3RyaW5ncyA9IHtcclxuICAgIHBhZ2VQcmV2VGV4dDogXCLQndCw0LfQsNC0XCIsXHJcbiAgICBwYWdlTmV4dFRleHQ6IFwi0JTQsNC70LXQtVwiLFxyXG4gICAgY29tcGxldGVUZXh0OiBcItCT0L7RgtC+0LLQvlwiLFxyXG4gICAgcHJvZ3Jlc3NUZXh0OiBcItCh0YLRgNCw0L3QuNGG0LAgezB9INC40LcgezF9XCIsXHJcbiAgICBlbXB0eVN1cnZleTogXCLQndC10YIg0L3QuCDQvtC00L3QvtCz0L4g0LLQvtC/0YDQvtGB0LAuXCIsXHJcbiAgICBjb21wbGV0aW5nU3VydmV5OiBcItCR0LvQsNCz0L7QtNCw0YDQuNC8INCS0LDRgSDQt9CwINC30LDQv9C+0LvQvdC10L3QuNC1INCw0L3QutC10YLRiyFcIixcclxuICAgIGxvYWRpbmdTdXJ2ZXk6IFwi0JfQsNCz0YDRg9C30LrQsCDRgSDRgdC10YDQstC10YDQsC4uLlwiLFxyXG4gICAgb3RoZXJJdGVtVGV4dDogXCLQlNGA0YPQs9C+0LUgKNC/0L7QttCw0LvRg9C50YHRgtCwLCDQvtC/0LjRiNC40YLQtSlcIixcclxuICAgIG9wdGlvbnNDYXB0aW9uOiBcItCS0YvQsdGA0LDRgtGMLi4uXCIsXHJcbiAgICByZXF1aXJlZEVycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQvtGC0LLQtdGC0YzRgtC1INC90LAg0LLQvtC/0YDQvtGBLlwiLFxyXG4gICAgbnVtZXJpY0Vycm9yOiBcItCe0YLQstC10YIg0LTQvtC70LbQtdC9INCx0YvRgtGMINGH0LjRgdC70L7QvC5cIixcclxuICAgIHRleHRNaW5MZW5ndGg6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1INGF0L7RgtGPINCx0YsgezB9INGB0LjQvNCy0L7Qu9C+0LIuXCIsXHJcbiAgICBtaW5TZWxlY3RFcnJvcjogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0LLRi9Cx0LXRgNC40YLQtSDRhdC+0YLRjyDQsdGLIHswfSDQstCw0YDQuNCw0L3RgtC+0LIuXCIsXHJcbiAgICBtYXhTZWxlY3RFcnJvcjogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0LLRi9Cx0LXRgNC40YLQtSDQvdC1INCx0L7Qu9C10LUgezB9INCy0LDRgNC40LDQvdGC0L7Qsi5cIixcclxuICAgIG51bWVyaWNNaW5NYXg6IFwiJ3swfScg0LTQvtC70LbQvdC+INCx0YvRgtGMINGA0LDQstC90YvQvCDQuNC70Lgg0LHQvtC70YzRiNC1LCDRh9C10LwgezF9LCDQuCDRgNCw0LLQvdGL0Lwg0LjQu9C4INC80LXQvdGM0YjQtSwg0YfQtdC8IHsyfVwiLFxyXG4gICAgbnVtZXJpY01pbjogXCInezB9JyDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0YDQsNCy0L3Ri9C8INC40LvQuCDQsdC+0LvRjNGI0LUsINGH0LXQvCB7MX1cIixcclxuICAgIG51bWVyaWNNYXg6IFwiJ3swfScg0LTQvtC70LbQvdC+INCx0YvRgtGMINGA0LDQstC90YvQvCDQuNC70Lgg0LzQtdC90YzRiNC1LCDRh9C10LwgezF9XCIsXHJcbiAgICBpbnZhbGlkRW1haWw6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1INC00LXQudGB0YLQstC40YLQtdC70YzQvdGL0Lkg0LDQtNGA0LXRgSDRjdC70LXQutGC0YDQvtC90L3QvtC5INC/0L7Rh9GC0YsuXCIsXHJcbiAgICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1INC00LDQvdC90YvQtSDQsiDQv9C+0LvQtSBcXFwi0JTRgNGD0LPQvtC1XFxcIlwiXHJcbn07XHJcblxyXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInJ1XCJdID0gcnVzc2lhblN1cnZleVN0cmluZ3M7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvbG9jYWxpemF0aW9uL3J1c3NpYW4udHNcbiAqKi8iLCJpbXBvcnQge3N1cnZleUxvY2FsaXphdGlvbn0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcclxuXHJcbmV4cG9ydCB2YXIgdHVya2lzaFN1cnZleVN0cmluZ3MgPSB7XHJcbiAgICAgICAgcGFnZVByZXZUZXh0OiBcIkdlcmlcIixcclxuICAgICAgICBwYWdlTmV4dFRleHQ6IFwixLBsZXJpXCIsXHJcbiAgICAgICAgY29tcGxldGVUZXh0OiBcIkFua2V0aSBUYW1hbWxhXCIsXHJcbiAgICAgICAgb3RoZXJJdGVtVGV4dDogXCJEacSfZXIgKGHDp8Sxa2xhecSxbsSxeilcIixcclxuICAgICAgICBwcm9ncmVzc1RleHQ6IFwiU2F5ZmEgezB9IC8gezF9XCIsXHJcbiAgICAgICAgZW1wdHlTdXJ2ZXk6IFwiQW5rZXR0ZSBnw7Zyw7xudMO8bGVuZWNlayBzYXlmYSB5YSBkYSBzb3J1IG1ldmN1dCBkZcSfaWwuXCIsXHJcbiAgICAgICAgY29tcGxldGluZ1N1cnZleTogXCJBbmtldGltaXppIHRhbWFtbGFkxLHEn8SxbsSxeiBpw6dpbiB0ZcWfZWtrw7xyIGVkZXJpei5cIixcclxuICAgICAgICBsb2FkaW5nU3VydmV5OiBcIkFua2V0IHN1bnVjdWRhbiB5w7xrbGVuaXlvciAuLi5cIixcclxuICAgICAgICBvcHRpb25zQ2FwdGlvbjogXCJTZcOnaW5peiAuLi5cIixcclxuICAgICAgICByZXF1aXJlZEVycm9yOiBcIkzDvHRmZW4gc29ydXlhIGNldmFwIHZlcmluaXpcIixcclxuICAgICAgICBudW1lcmljRXJyb3I6IFwiR2lyaWxlbiBkZcSfZXIgbnVtZXJpayBvbG1hbMSxZMSxclwiLFxyXG4gICAgICAgIHRleHRNaW5MZW5ndGg6IFwiRW4gYXogezB9IHNlbWJvbCBnaXJpbml6LlwiLFxyXG4gICAgICAgIG1pblJvd0NvdW50RXJyb3I6IFwiTMO8dGZlbiBlbiBheiB7MH0gc2F0xLFyxLEgZG9sZHVydW4uXCIsXHJcbiAgICAgICAgbWluU2VsZWN0RXJyb3I6IFwiTMO8dGZlbiBlbiBheiB7MH0gc2XDp2VuZcSfaSBzZcOnaW5pei5cIixcclxuICAgICAgICBtYXhTZWxlY3RFcnJvcjogXCJMw7x0ZmVuIHswfSBhZGV0dGVuIGZhemxhIHNlw6dtZXlpbml6LlwiLFxyXG4gICAgICAgIG51bWVyaWNNaW5NYXg6IFwiVGhlICd7MH0nIHNob3VsZCBiZSBlcXVhbCBvciBtb3JlIHRoYW4gezF9IGFuZCBlcXVhbCBvciBsZXNzIHRoYW4gezJ9XCIsXHJcbiAgICAgICAgbnVtZXJpY01pbjogXCInezB9JyBkZcSfZXJpIHsxfSBkZcSfZXJpbmUgZcWfaXQgdmV5YSBiw7x5w7xrIG9sbWFsxLFkxLFyXCIsXHJcbiAgICAgICAgbnVtZXJpY01heDogXCInezB9JyBkZcSfZXJpIHsxfSBkZcSfZXJpbmUgZcWfaXQgeWEgZGEga8O8w6fDvGsgb2xtYWzEsWTEsXIuXCIsXHJcbiAgICAgICAgaW52YWxpZEVtYWlsOiBcIkzDvHRmZW4gZ2XDp2VybGkgYmlyIGVwb3N0YSBhZHJlc2kgZ2lyaW5pei5cIixcclxuICAgICAgICB1cmxSZXF1ZXN0RXJyb3I6IFwiVGFsZWJpIMWfdSBoYXRhecSxIGTDtm5kw7wgJ3swfScuIHsxfVwiLFxyXG4gICAgICAgIHVybEdldENob2ljZXNFcnJvcjogXCJUYWxlcCBoZXJoYW5naSBiaXIgdmVyaSBkw7ZubWVkaSB5YSBkYSAncGF0aCcgw7Z6ZWxsacSfaSBoYXRhbMSxLlwiLFxyXG4gICAgICAgIGV4Y2VlZE1heFNpemU6IFwiRG9zeWEgYm95dXR1IHswfSBkZcSfZXJpbmkgZ2XDp2VtZXouXCIsXHJcbiAgICAgICAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIkzDvHRmZW4gZGnEn2VyIGRlxJ9lcmxlcmkgZ2lyaW5pei5cIixcclxuICAgICAgICB1cGxvYWRpbmdGaWxlOiBcIkRvc3lhbsSxeiB5w7xrbGVuaXlvci4gTMOcdGZlbiBiaXJrYcOnIHNhbml5ZSBiZWtsZXlpbiB2ZSB0ZWtyYXIgZGVuZXlpbi5cIixcclxuICAgICAgICBhZGRSb3c6IFwiU2F0xLFyIEVrbGVcIixcclxuICAgICAgICByZW1vdmVSb3c6IFwiS2FsZMSxclwiXHJcbn07XHJcblxyXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInRyXCJdID0gdHVya2lzaFN1cnZleVN0cmluZ3M7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9zcmMvbG9jYWxpemF0aW9uL3R1cmtpc2gudHNcbiAqKi8iLCJleHBvcnQgZnVuY3Rpb24gX19hc3NpZ24gKHQpIHtcclxuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBzKSB7XHJcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59O1xyXG5cclxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XHJcbiAgICBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBfX2Fzc2lnbjtcclxufVxyXG5cclxuZXhwb3J0cy5fX2Fzc2lnbiA9IF9fYXNzaWduO1xuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2Fzc2lnbi50c1xuICoqLyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0ICogYXMgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcclxuaW1wb3J0IHtTdXJ2ZXl9IGZyb20gXCIuLi9yZWFjdC9yZWFjdFN1cnZleVwiO1xyXG5pbXBvcnQge1N1cnZleVdpbmRvd30gZnJvbSBcIi4uL3JlYWN0L3JlYWN0U3VydmV5V2luZG93XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgU3VydmV5Tkcge1xyXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXIoZWxlbWVudElkLCBwcm9wcyl7XHJcbiAgICAgICAgUmVhY3RET00ucmVuZGVyKDxTdXJ2ZXkgey4uLnByb3BzfSAvPiwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTdXJ2ZXlXaW5kb3dORyB7XHJcbiAgICBwdWJsaWMgc3RhdGljIHJlbmRlcihlbGVtZW50SWQsIHByb3BzKXtcclxuICAgICAgICBSZWFjdERPTS5yZW5kZXIoPFN1cnZleVdpbmRvdyB7Li4ucHJvcHN9IC8+LCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpKTtcclxuICAgIH1cclxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL2FuZ3VsYXIvU3VydmV5TkcudHN4XG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==