react-planner-viewer
Version:
react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode
273 lines (221 loc) • 26.7 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _export = require('./properties/export');
var _constants = require('../constants');
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Catalog = function () {
function Catalog() {
var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _constants.UNIT_CENTIMETER;
_classCallCheck(this, Catalog);
this.elements = {};
this.categories = { root: { name: 'root', label: '/', elements: [], categories: [] } };
this.propertyTypes = {};
this.unit = unit;
this.registerMultiplePropertyType([['color', _export.PropertyColor, _export.PropertyColor], ['enum', _export.PropertyEnum, _export.PropertyEnum], ['string', _export.PropertyString, _export.PropertyString], ['number', _export.PropertyNumber, _export.PropertyNumber], ['length-measure', _export.PropertyLengthMeasure, _export.PropertyLengthMeasure], ['toggle', _export.PropertyToggle, _export.PropertyToggle], ['checkbox', _export.PropertyCheckbox, _export.PropertyCheckbox], ['hidden', _export.PropertyHidden, _export.PropertyHidden], ['read-only', _export.PropertyReadOnly, _export.PropertyReadOnly]]);
}
/** @description Get catalog's element
* @param {string} type Element's type
* @return {?object} Element
*/
_createClass(Catalog, [{
key: 'getElement',
value: function getElement(type) {
if (this.hasElement(type)) {
return this.elements[type];
}
throw new Error('Element ' + type + ' does not exist in catalog');
}
/** @description Get catalog category
* @param {string} categoryName Name of category
* @return {object} Category
*/
}, {
key: 'getCategory',
value: function getCategory(categoryName) {
if (this.hasCategory(categoryName)) {
return this.categories[categoryName];
}
throw new Error('Category ' + categoryName + ' does not exist in catalog');
}
/** @description Return type of a specfied property
* @param {string} type Property type
* @return {?object} Property
*/
}, {
key: 'getPropertyType',
value: function getPropertyType(type) {
if (this.propertyTypes.hasOwnProperty(type)) {
return this.propertyTypes[type];
}
throw new Error('Element ' + type + ' does not exist in catalog');
}
/** @description Register a new element
* @param {object} json Element structure
* @return {void}
*/
}, {
key: 'registerElement',
value: function registerElement(json) {
json.properties = json.properties || {};
if (this.validateElement(json)) {
this.elements[json.name] = json;
this.categories.root.elements.push(this.elements[json.name]);
}
}
/** @description Register multiple elements
* @param {array} [elementArray] Array of elements
* @return {void}
*/
}, {
key: 'registerMultipleElements',
value: function registerMultipleElements(elementArray) {
var _this = this;
elementArray.forEach(function (el) {
return _this.registerElement(el);
});
}
/** @description Register a new property
* @param {string} type Type of property
* @param {object} Viewer Property viewer component
* @param {object} Editor Property editor component
* @return {void}
*/
}, {
key: 'registerPropertyType',
value: function registerPropertyType(type, Viewer, Editor) {
this.propertyTypes[type] = { type: type, Viewer: Viewer, Editor: Editor };
}
/** @description Register multiple property
* @param {array} propertyTypeArray Array of properties
* @return {void}
*/
}, {
key: 'registerMultiplePropertyType',
value: function registerMultiplePropertyType(propertyTypeArray) {
var _this2 = this;
propertyTypeArray.forEach(function (el) {
return _this2.registerPropertyType.apply(_this2, _toConsumableArray(el));
});
}
/** @description Validate an element
* @param {object} json Element's structure
* @return {?boolean}
*/
}, {
key: 'validateElement',
value: function validateElement(json) {
if (!json.hasOwnProperty('name')) throw new Error('Element not valid');
var name = json.name;
if (!json.hasOwnProperty('prototype')) throw new Error('Element ' + name + ' doesn\'t have prototype');
if (!json.hasOwnProperty('info')) throw new Error('Element ' + name + ' doesn\'t have info');
if (!json.info.hasOwnProperty('tag')) throw new Error('Element ' + name + ' doesn\'t have tag');
if (!json.info.hasOwnProperty('group')) throw new Error('Element ' + name + ' doesn\'t have group');
if (!json.info.hasOwnProperty('description')) throw new Error('Element ' + name + ' doesn\'t have description');
if (!json.info.hasOwnProperty('image')) throw new Error('Element ' + name + ' doesn\'t have image');
if (!json.hasOwnProperty('render2D')) throw new Error('Element ' + name + ' doesn\'t have render2D handler');
if (!json.hasOwnProperty('properties')) throw new Error('Element ' + name + ' doesn\'t have properties');
for (var propertyName in json.properties) {
var propertyConfigs = json.properties[propertyName];
if (!propertyConfigs.hasOwnProperty('type')) throw new Error('Element ' + name + ', Property ' + propertyName + ' doesn\'t have type');
if (!propertyConfigs.hasOwnProperty('defaultValue')) throw new Error('Element ' + name + ', Property ' + propertyName + ' doesn\'t have defaultValue');
}
return true;
}
/** @description Check if catalog has element
* @param {string} type Element's type
* @return {boolean}
*/
}, {
key: 'hasElement',
value: function hasElement(type) {
return this.elements.hasOwnProperty(type);
}
/** @description Register a new category
* @param {string} name Name of category
* @param {string} label Label of category
* @param {array} [childs] Category's childs
* @return {?object} Registered category
*/
}, {
key: 'registerCategory',
value: function registerCategory(name, label, childs) {
var _this3 = this;
if (this.validateCategory(name, label)) {
this.categories[name] = { name: name, label: label, categories: [], elements: [] };
this.categories.root.categories.push(this.categories[name]);
if (childs && childs.length) {
childs.forEach(function (el) {
return _this3.addToCategory(name, el);
});
}
return this.categories[name];
}
return null;
}
/** @description Add an element to the specified category
* @param {string} name Name of category
* @param {object} child Element's structure
* @return {?void}
*/
}, {
key: 'addToCategory',
value: function addToCategory(name, child) {
if (this.hasElement(child.name)) {
this.categories[name].elements.push(child);
this.categories.root.elements.splice(this.categories.root.elements.indexOf(child), 1);
} else if (this.hasCategory(child.name)) {
this.categories[name].categories.push(child);
this.categories.root.categories.splice(this.categories.root.categories.indexOf(child), 1);
} else {
throw new Error('child ' + child + ' is either category nor element');
}
}
/** @description Check if category contain element
* @param {string} categoryName Name of category
* @param {string} elementName Name of element
* @return {boolean}
*/
}, {
key: 'categoryHasElement',
value: function categoryHasElement(categoryName, elementName) {
return this.hasCategory(categoryName) && this.categories[categoryName].elements.some(function (el) {
return el.name === elementName;
});
}
/** @description Validate a category
* @param {string} name Name of category
* @param {string} label Label of category
* @return {?boolean}
*/
}, {
key: 'validateCategory',
value: function validateCategory(name, label) {
if (!name) {
throw new Error('Category has undefined name');
}
if (name === '') {
throw new Error('Category has empty name');
}
if (this.hasCategory(name)) {
throw new Error('Category has already been registered');
}
return true;
}
/** @description Verify if catalog already contain a category with specified name
* @param {string} categoryName Name of category
* @return {boolean}
*/
}, {
key: 'hasCategory',
value: function hasCategory(categoryName) {
return this.categories.hasOwnProperty(categoryName);
}
}]);
return Catalog;
}();
exports.default = Catalog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYXRhbG9nL2NhdGFsb2cuanMiXSwibmFtZXMiOlsiQ2F0YWxvZyIsInVuaXQiLCJlbGVtZW50cyIsImNhdGVnb3JpZXMiLCJyb290IiwibmFtZSIsImxhYmVsIiwicHJvcGVydHlUeXBlcyIsInJlZ2lzdGVyTXVsdGlwbGVQcm9wZXJ0eVR5cGUiLCJ0eXBlIiwiaGFzRWxlbWVudCIsIkVycm9yIiwiY2F0ZWdvcnlOYW1lIiwiaGFzQ2F0ZWdvcnkiLCJoYXNPd25Qcm9wZXJ0eSIsImpzb24iLCJwcm9wZXJ0aWVzIiwidmFsaWRhdGVFbGVtZW50IiwicHVzaCIsImVsZW1lbnRBcnJheSIsImZvckVhY2giLCJyZWdpc3RlckVsZW1lbnQiLCJlbCIsIlZpZXdlciIsIkVkaXRvciIsInByb3BlcnR5VHlwZUFycmF5IiwicmVnaXN0ZXJQcm9wZXJ0eVR5cGUiLCJpbmZvIiwicHJvcGVydHlOYW1lIiwicHJvcGVydHlDb25maWdzIiwiY2hpbGRzIiwidmFsaWRhdGVDYXRlZ29yeSIsImxlbmd0aCIsImFkZFRvQ2F0ZWdvcnkiLCJjaGlsZCIsInNwbGljZSIsImluZGV4T2YiLCJlbGVtZW50TmFtZSIsInNvbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7O0FBWUE7Ozs7OztJQUVxQkEsTztBQUVuQixxQkFBb0M7QUFBQSxRQUF4QkMsSUFBd0I7O0FBQUE7O0FBQ2xDLFNBQUtDLFFBQUwsR0FBZ0IsRUFBaEI7QUFDQSxTQUFLQyxVQUFMLEdBQWtCLEVBQUNDLE1BQU0sRUFBQ0MsTUFBTSxNQUFQLEVBQWVDLE9BQU8sR0FBdEIsRUFBMkJKLFVBQVUsRUFBckMsRUFBeUNDLFlBQVksRUFBckQsRUFBUCxFQUFsQjtBQUNBLFNBQUtJLGFBQUwsR0FBcUIsRUFBckI7QUFDQSxTQUFLTixJQUFMLEdBQVlBLElBQVo7O0FBRUEsU0FBS08sNEJBQUwsQ0FBa0MsQ0FDaEMsQ0FBQyxPQUFELCtDQURnQyxFQUVoQyxDQUFDLE1BQUQsNkNBRmdDLEVBR2hDLENBQUMsUUFBRCxpREFIZ0MsRUFJaEMsQ0FBQyxRQUFELGlEQUpnQyxFQUtoQyxDQUFDLGdCQUFELCtEQUxnQyxFQU1oQyxDQUFDLFFBQUQsaURBTmdDLEVBT2hDLENBQUMsVUFBRCxxREFQZ0MsRUFRaEMsQ0FBQyxRQUFELGlEQVJnQyxFQVNoQyxDQUFDLFdBQUQscURBVGdDLENBQWxDO0FBV0Q7O0FBRUQ7Ozs7Ozs7OytCQUlXQyxJLEVBQU07QUFDZixVQUFJLEtBQUtDLFVBQUwsQ0FBZ0JELElBQWhCLENBQUosRUFBMkI7QUFDekIsZUFBTyxLQUFLUCxRQUFMLENBQWNPLElBQWQsQ0FBUDtBQUNEO0FBQ0QsWUFBTSxJQUFJRSxLQUFKLGNBQXFCRixJQUFyQixnQ0FBTjtBQUNEOztBQUVEOzs7Ozs7O2dDQUlZRyxZLEVBQWM7QUFDeEIsVUFBSSxLQUFLQyxXQUFMLENBQWlCRCxZQUFqQixDQUFKLEVBQW9DO0FBQ2xDLGVBQU8sS0FBS1QsVUFBTCxDQUFnQlMsWUFBaEIsQ0FBUDtBQUNEO0FBQ0QsWUFBTSxJQUFJRCxLQUFKLGVBQXNCQyxZQUF0QixnQ0FBTjtBQUNEOztBQUVEOzs7Ozs7O29DQUlnQkgsSSxFQUFNO0FBQ3BCLFVBQUksS0FBS0YsYUFBTCxDQUFtQk8sY0FBbkIsQ0FBa0NMLElBQWxDLENBQUosRUFBNkM7QUFDM0MsZUFBTyxLQUFLRixhQUFMLENBQW1CRSxJQUFuQixDQUFQO0FBQ0Q7QUFDRCxZQUFNLElBQUlFLEtBQUosY0FBcUJGLElBQXJCLGdDQUFOO0FBQ0Q7O0FBRUQ7Ozs7Ozs7b0NBSWdCTSxJLEVBQU07QUFDcEJBLFdBQUtDLFVBQUwsR0FBa0JELEtBQUtDLFVBQUwsSUFBbUIsRUFBckM7QUFDQSxVQUFJLEtBQUtDLGVBQUwsQ0FBcUJGLElBQXJCLENBQUosRUFBZ0M7QUFDOUIsYUFBS2IsUUFBTCxDQUFjYSxLQUFLVixJQUFuQixJQUEyQlUsSUFBM0I7QUFDQSxhQUFLWixVQUFMLENBQWdCQyxJQUFoQixDQUFxQkYsUUFBckIsQ0FBOEJnQixJQUE5QixDQUFtQyxLQUFLaEIsUUFBTCxDQUFjYSxLQUFLVixJQUFuQixDQUFuQztBQUNEO0FBQ0Y7O0FBRUQ7Ozs7Ozs7NkNBSXlCYyxZLEVBQWM7QUFBQTs7QUFDckNBLG1CQUFhQyxPQUFiLENBQXFCO0FBQUEsZUFBTSxNQUFLQyxlQUFMLENBQXFCQyxFQUFyQixDQUFOO0FBQUEsT0FBckI7QUFDRDs7QUFFRDs7Ozs7Ozs7O3lDQU1xQmIsSSxFQUFNYyxNLEVBQVFDLE0sRUFBUTtBQUN6QyxXQUFLakIsYUFBTCxDQUFtQkUsSUFBbkIsSUFBMkIsRUFBQ0EsVUFBRCxFQUFPYyxjQUFQLEVBQWVDLGNBQWYsRUFBM0I7QUFDRDs7QUFFRDs7Ozs7OztpREFJNkJDLGlCLEVBQW1CO0FBQUE7O0FBQzlDQSx3QkFBa0JMLE9BQWxCLENBQTBCO0FBQUEsZUFBTSxPQUFLTSxvQkFBTCxrQ0FBNkJKLEVBQTdCLEVBQU47QUFBQSxPQUExQjtBQUNEOztBQUVEOzs7Ozs7O29DQUlnQlAsSSxFQUFNO0FBQ3BCLFVBQUksQ0FBQ0EsS0FBS0QsY0FBTCxDQUFvQixNQUFwQixDQUFMLEVBQWtDLE1BQU0sSUFBSUgsS0FBSixDQUFVLG1CQUFWLENBQU47O0FBRWxDLFVBQUlOLE9BQU9VLEtBQUtWLElBQWhCO0FBQ0EsVUFBSSxDQUFDVSxLQUFLRCxjQUFMLENBQW9CLFdBQXBCLENBQUwsRUFBdUMsTUFBTSxJQUFJSCxLQUFKLGNBQXFCTixJQUFyQiw4QkFBTjs7QUFFdkMsVUFBSSxDQUFDVSxLQUFLRCxjQUFMLENBQW9CLE1BQXBCLENBQUwsRUFBa0MsTUFBTSxJQUFJSCxLQUFKLGNBQXFCTixJQUFyQix5QkFBTjtBQUNsQyxVQUFJLENBQUNVLEtBQUtZLElBQUwsQ0FBVWIsY0FBVixDQUF5QixLQUF6QixDQUFMLEVBQXNDLE1BQU0sSUFBSUgsS0FBSixjQUFxQk4sSUFBckIsd0JBQU47QUFDdEMsVUFBSSxDQUFDVSxLQUFLWSxJQUFMLENBQVViLGNBQVYsQ0FBeUIsT0FBekIsQ0FBTCxFQUF3QyxNQUFNLElBQUlILEtBQUosY0FBcUJOLElBQXJCLDBCQUFOO0FBQ3hDLFVBQUksQ0FBQ1UsS0FBS1ksSUFBTCxDQUFVYixjQUFWLENBQXlCLGFBQXpCLENBQUwsRUFBOEMsTUFBTSxJQUFJSCxLQUFKLGNBQXFCTixJQUFyQixnQ0FBTjtBQUM5QyxVQUFJLENBQUNVLEtBQUtZLElBQUwsQ0FBVWIsY0FBVixDQUF5QixPQUF6QixDQUFMLEVBQXdDLE1BQU0sSUFBSUgsS0FBSixjQUFxQk4sSUFBckIsMEJBQU47O0FBRXhDLFVBQUksQ0FBQ1UsS0FBS0QsY0FBTCxDQUFvQixVQUFwQixDQUFMLEVBQXNDLE1BQU0sSUFBSUgsS0FBSixjQUFxQk4sSUFBckIscUNBQU47QUFDdEMsVUFBSSxDQUFDVSxLQUFLRCxjQUFMLENBQW9CLFlBQXBCLENBQUwsRUFBd0MsTUFBTSxJQUFJSCxLQUFKLGNBQXFCTixJQUFyQiwrQkFBTjs7QUFFeEMsV0FBSyxJQUFJdUIsWUFBVCxJQUF5QmIsS0FBS0MsVUFBOUIsRUFBMEM7QUFDeEMsWUFBSWEsa0JBQWtCZCxLQUFLQyxVQUFMLENBQWdCWSxZQUFoQixDQUF0QjtBQUNBLFlBQUksQ0FBQ0MsZ0JBQWdCZixjQUFoQixDQUErQixNQUEvQixDQUFMLEVBQTZDLE1BQU0sSUFBSUgsS0FBSixjQUFxQk4sSUFBckIsbUJBQXVDdUIsWUFBdkMseUJBQU47QUFDN0MsWUFBSSxDQUFDQyxnQkFBZ0JmLGNBQWhCLENBQStCLGNBQS9CLENBQUwsRUFBcUQsTUFBTSxJQUFJSCxLQUFKLGNBQXFCTixJQUFyQixtQkFBdUN1QixZQUF2QyxpQ0FBTjtBQUN0RDs7QUFFRCxhQUFPLElBQVA7QUFDRDs7QUFFRDs7Ozs7OzsrQkFJV25CLEksRUFBTTtBQUNmLGFBQU8sS0FBS1AsUUFBTCxDQUFjWSxjQUFkLENBQTZCTCxJQUE3QixDQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7OztxQ0FNaUJKLEksRUFBTUMsSyxFQUFPd0IsTSxFQUFRO0FBQUE7O0FBQ3BDLFVBQUksS0FBS0MsZ0JBQUwsQ0FBc0IxQixJQUF0QixFQUE0QkMsS0FBNUIsQ0FBSixFQUF3QztBQUN0QyxhQUFLSCxVQUFMLENBQWdCRSxJQUFoQixJQUF3QixFQUFDQSxVQUFELEVBQU9DLFlBQVAsRUFBY0gsWUFBWSxFQUExQixFQUE4QkQsVUFBVSxFQUF4QyxFQUF4QjtBQUNBLGFBQUtDLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCRCxVQUFyQixDQUFnQ2UsSUFBaEMsQ0FBcUMsS0FBS2YsVUFBTCxDQUFnQkUsSUFBaEIsQ0FBckM7O0FBRUEsWUFBR3lCLFVBQVVBLE9BQU9FLE1BQXBCLEVBQTRCO0FBQzFCRixpQkFBT1YsT0FBUCxDQUFnQjtBQUFBLG1CQUFNLE9BQUthLGFBQUwsQ0FBb0I1QixJQUFwQixFQUEwQmlCLEVBQTFCLENBQU47QUFBQSxXQUFoQjtBQUNEOztBQUVELGVBQU8sS0FBS25CLFVBQUwsQ0FBZ0JFLElBQWhCLENBQVA7QUFDRDtBQUNELGFBQU8sSUFBUDtBQUNEOztBQUVEOzs7Ozs7OztrQ0FLY0EsSSxFQUFNNkIsSyxFQUFPO0FBQ3pCLFVBQUksS0FBS3hCLFVBQUwsQ0FBZ0J3QixNQUFNN0IsSUFBdEIsQ0FBSixFQUFpQztBQUMvQixhQUFLRixVQUFMLENBQWdCRSxJQUFoQixFQUFzQkgsUUFBdEIsQ0FBK0JnQixJQUEvQixDQUFvQ2dCLEtBQXBDO0FBQ0EsYUFBSy9CLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCRixRQUFyQixDQUE4QmlDLE1BQTlCLENBQXFDLEtBQUtoQyxVQUFMLENBQWdCQyxJQUFoQixDQUFxQkYsUUFBckIsQ0FBOEJrQyxPQUE5QixDQUFzQ0YsS0FBdEMsQ0FBckMsRUFBbUYsQ0FBbkY7QUFDRCxPQUhELE1BR08sSUFBSSxLQUFLckIsV0FBTCxDQUFpQnFCLE1BQU03QixJQUF2QixDQUFKLEVBQWtDO0FBQ3ZDLGFBQUtGLFVBQUwsQ0FBZ0JFLElBQWhCLEVBQXNCRixVQUF0QixDQUFpQ2UsSUFBakMsQ0FBc0NnQixLQUF0QztBQUNBLGFBQUsvQixVQUFMLENBQWdCQyxJQUFoQixDQUFxQkQsVUFBckIsQ0FBZ0NnQyxNQUFoQyxDQUF1QyxLQUFLaEMsVUFBTCxDQUFnQkMsSUFBaEIsQ0FBcUJELFVBQXJCLENBQWdDaUMsT0FBaEMsQ0FBd0NGLEtBQXhDLENBQXZDLEVBQXVGLENBQXZGO0FBQ0QsT0FITSxNQUdBO0FBQ0wsY0FBTSxJQUFJdkIsS0FBSixZQUFtQnVCLEtBQW5CLHFDQUFOO0FBQ0Q7QUFDRjs7QUFFRDs7Ozs7Ozs7dUNBS21CdEIsWSxFQUFjeUIsVyxFQUFhO0FBQzVDLGFBQU8sS0FBS3hCLFdBQUwsQ0FBaUJELFlBQWpCLEtBQWtDLEtBQUtULFVBQUwsQ0FBZ0JTLFlBQWhCLEVBQThCVixRQUE5QixDQUF1Q29DLElBQXZDLENBQTRDO0FBQUEsZUFBTWhCLEdBQUdqQixJQUFILEtBQVlnQyxXQUFsQjtBQUFBLE9BQTVDLENBQXpDO0FBQ0Q7O0FBRUQ7Ozs7Ozs7O3FDQUtpQmhDLEksRUFBTUMsSyxFQUFPO0FBQzVCLFVBQUksQ0FBQ0QsSUFBTCxFQUFXO0FBQ1QsY0FBTSxJQUFJTSxLQUFKLENBQVUsNkJBQVYsQ0FBTjtBQUNEO0FBQ0QsVUFBSU4sU0FBUyxFQUFiLEVBQWlCO0FBQ2YsY0FBTSxJQUFJTSxLQUFKLENBQVUseUJBQVYsQ0FBTjtBQUNEO0FBQ0QsVUFBSSxLQUFLRSxXQUFMLENBQWlCUixJQUFqQixDQUFKLEVBQTRCO0FBQzFCLGNBQU0sSUFBSU0sS0FBSixDQUFVLHNDQUFWLENBQU47QUFDRDs7QUFFRCxhQUFPLElBQVA7QUFDRDs7QUFFRDs7Ozs7OztnQ0FJWUMsWSxFQUFjO0FBQ3hCLGFBQU8sS0FBS1QsVUFBTCxDQUFnQlcsY0FBaEIsQ0FBK0JGLFlBQS9CLENBQVA7QUFDRDs7Ozs7O2tCQXZNa0JaLE8iLCJmaWxlIjoiY2F0YWxvZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFByb3BlcnR5Q29sb3IsXG4gIFByb3BlcnR5RW51bSxcbiAgUHJvcGVydHlTdHJpbmcsXG4gIFByb3BlcnR5TnVtYmVyLFxuICBQcm9wZXJ0eUxlbmd0aE1lYXN1cmUsXG4gIFByb3BlcnR5VG9nZ2xlLFxuICBQcm9wZXJ0eUNoZWNrYm94LFxuICBQcm9wZXJ0eUhpZGRlbixcbiAgUHJvcGVydHlSZWFkT25seVxufSBmcm9tICcuL3Byb3BlcnRpZXMvZXhwb3J0JztcblxuaW1wb3J0IHtVTklUX0NFTlRJTUVURVJ9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhdGFsb2cge1xuXG4gIGNvbnN0cnVjdG9yKHVuaXQgPSBVTklUX0NFTlRJTUVURVIpIHtcbiAgICB0aGlzLmVsZW1lbnRzID0ge307XG4gICAgdGhpcy5jYXRlZ29yaWVzID0ge3Jvb3Q6IHtuYW1lOiAncm9vdCcsIGxhYmVsOiAnLycsIGVsZW1lbnRzOiBbXSwgY2F0ZWdvcmllczogW119fTtcbiAgICB0aGlzLnByb3BlcnR5VHlwZXMgPSB7fTtcbiAgICB0aGlzLnVuaXQgPSB1bml0O1xuXG4gICAgdGhpcy5yZWdpc3Rlck11bHRpcGxlUHJvcGVydHlUeXBlKFtcbiAgICAgIFsnY29sb3InLCBQcm9wZXJ0eUNvbG9yLCBQcm9wZXJ0eUNvbG9yXSxcbiAgICAgIFsnZW51bScsIFByb3BlcnR5RW51bSwgUHJvcGVydHlFbnVtXSxcbiAgICAgIFsnc3RyaW5nJywgUHJvcGVydHlTdHJpbmcsIFByb3BlcnR5U3RyaW5nXSxcbiAgICAgIFsnbnVtYmVyJywgUHJvcGVydHlOdW1iZXIsIFByb3BlcnR5TnVtYmVyXSxcbiAgICAgIFsnbGVuZ3RoLW1lYXN1cmUnLCBQcm9wZXJ0eUxlbmd0aE1lYXN1cmUsIFByb3BlcnR5TGVuZ3RoTWVhc3VyZV0sXG4gICAgICBbJ3RvZ2dsZScsIFByb3BlcnR5VG9nZ2xlLCBQcm9wZXJ0eVRvZ2dsZV0sXG4gICAgICBbJ2NoZWNrYm94JywgUHJvcGVydHlDaGVja2JveCwgUHJvcGVydHlDaGVja2JveF0sXG4gICAgICBbJ2hpZGRlbicsIFByb3BlcnR5SGlkZGVuLCBQcm9wZXJ0eUhpZGRlbl0sXG4gICAgICBbJ3JlYWQtb25seScsIFByb3BlcnR5UmVhZE9ubHksIFByb3BlcnR5UmVhZE9ubHldXG4gICAgXSk7XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIEdldCBjYXRhbG9nJ3MgZWxlbWVudFxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IHR5cGUgRWxlbWVudCdzIHR5cGVcbiAgICogIEByZXR1cm4gez9vYmplY3R9IEVsZW1lbnRcbiAgKi9cbiAgZ2V0RWxlbWVudCh0eXBlKSB7XG4gICAgaWYgKHRoaXMuaGFzRWxlbWVudCh0eXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHNbdHlwZV07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke3R5cGV9IGRvZXMgbm90IGV4aXN0IGluIGNhdGFsb2dgKTtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gR2V0IGNhdGFsb2cgY2F0ZWdvcnlcbiAgICogIEBwYXJhbSB7c3RyaW5nfSBjYXRlZ29yeU5hbWUgTmFtZSBvZiBjYXRlZ29yeVxuICAgKiAgQHJldHVybiB7b2JqZWN0fSBDYXRlZ29yeVxuICAqL1xuICBnZXRDYXRlZ29yeShjYXRlZ29yeU5hbWUpIHtcbiAgICBpZiAodGhpcy5oYXNDYXRlZ29yeShjYXRlZ29yeU5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYXRlZ29yaWVzW2NhdGVnb3J5TmFtZV07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgQ2F0ZWdvcnkgJHtjYXRlZ29yeU5hbWV9IGRvZXMgbm90IGV4aXN0IGluIGNhdGFsb2dgKTtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gUmV0dXJuIHR5cGUgb2YgYSBzcGVjZmllZCBwcm9wZXJ0eVxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IHR5cGUgUHJvcGVydHkgdHlwZVxuICAgKiAgQHJldHVybiB7P29iamVjdH0gUHJvcGVydHlcbiAgKi9cbiAgZ2V0UHJvcGVydHlUeXBlKHR5cGUpIHtcbiAgICBpZiAodGhpcy5wcm9wZXJ0eVR5cGVzLmhhc093blByb3BlcnR5KHR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eVR5cGVzW3R5cGVdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHt0eXBlfSBkb2VzIG5vdCBleGlzdCBpbiBjYXRhbG9nYCk7XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIGEgbmV3IGVsZW1lbnRcbiAgICogIEBwYXJhbSB7b2JqZWN0fSBqc29uIEVsZW1lbnQgc3RydWN0dXJlXG4gICAqICBAcmV0dXJuIHt2b2lkfVxuICAqL1xuICByZWdpc3RlckVsZW1lbnQoanNvbikge1xuICAgIGpzb24ucHJvcGVydGllcyA9IGpzb24ucHJvcGVydGllcyB8fCB7fTtcbiAgICBpZiAodGhpcy52YWxpZGF0ZUVsZW1lbnQoanNvbikpIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbanNvbi5uYW1lXSA9IGpzb247XG4gICAgICB0aGlzLmNhdGVnb3JpZXMucm9vdC5lbGVtZW50cy5wdXNoKHRoaXMuZWxlbWVudHNbanNvbi5uYW1lXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBtdWx0aXBsZSBlbGVtZW50c1xuICAgKiAgQHBhcmFtIHthcnJheX0gW2VsZW1lbnRBcnJheV0gQXJyYXkgb2YgZWxlbWVudHNcbiAgICogIEByZXR1cm4ge3ZvaWR9XG4gICovXG4gIHJlZ2lzdGVyTXVsdGlwbGVFbGVtZW50cyhlbGVtZW50QXJyYXkpIHtcbiAgICBlbGVtZW50QXJyYXkuZm9yRWFjaChlbCA9PiB0aGlzLnJlZ2lzdGVyRWxlbWVudChlbCkpO1xuICB9XG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBwcm9wZXJ0eVxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IHR5cGUgVHlwZSBvZiBwcm9wZXJ0eVxuICAgKiAgQHBhcmFtIHtvYmplY3R9IFZpZXdlciBQcm9wZXJ0eSB2aWV3ZXIgY29tcG9uZW50XG4gICAqICBAcGFyYW0ge29iamVjdH0gRWRpdG9yIFByb3BlcnR5IGVkaXRvciBjb21wb25lbnRcbiAgICogIEByZXR1cm4ge3ZvaWR9XG4gICovXG4gIHJlZ2lzdGVyUHJvcGVydHlUeXBlKHR5cGUsIFZpZXdlciwgRWRpdG9yKSB7XG4gICAgdGhpcy5wcm9wZXJ0eVR5cGVzW3R5cGVdID0ge3R5cGUsIFZpZXdlciwgRWRpdG9yfTtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgbXVsdGlwbGUgcHJvcGVydHlcbiAgICogIEBwYXJhbSB7YXJyYXl9IHByb3BlcnR5VHlwZUFycmF5IEFycmF5IG9mIHByb3BlcnRpZXNcbiAgICogIEByZXR1cm4ge3ZvaWR9XG4gICovXG4gIHJlZ2lzdGVyTXVsdGlwbGVQcm9wZXJ0eVR5cGUocHJvcGVydHlUeXBlQXJyYXkpIHtcbiAgICBwcm9wZXJ0eVR5cGVBcnJheS5mb3JFYWNoKGVsID0+IHRoaXMucmVnaXN0ZXJQcm9wZXJ0eVR5cGUoLi4uZWwpKTtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gVmFsaWRhdGUgYW4gZWxlbWVudFxuICAgKiAgQHBhcmFtIHtvYmplY3R9IGpzb24gRWxlbWVudCdzIHN0cnVjdHVyZVxuICAgKiAgQHJldHVybiB7P2Jvb2xlYW59XG4gICovXG4gIHZhbGlkYXRlRWxlbWVudChqc29uKSB7XG4gICAgaWYgKCFqc29uLmhhc093blByb3BlcnR5KCduYW1lJykpIHRocm93IG5ldyBFcnJvcignRWxlbWVudCBub3QgdmFsaWQnKTtcblxuICAgIGxldCBuYW1lID0ganNvbi5uYW1lO1xuICAgIGlmICghanNvbi5oYXNPd25Qcm9wZXJ0eSgncHJvdG90eXBlJykpIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke25hbWV9IGRvZXNuJ3QgaGF2ZSBwcm90b3R5cGVgKTtcblxuICAgIGlmICghanNvbi5oYXNPd25Qcm9wZXJ0eSgnaW5mbycpKSB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHtuYW1lfSBkb2Vzbid0IGhhdmUgaW5mb2ApO1xuICAgIGlmICghanNvbi5pbmZvLmhhc093blByb3BlcnR5KCd0YWcnKSkgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7bmFtZX0gZG9lc24ndCBoYXZlIHRhZ2ApO1xuICAgIGlmICghanNvbi5pbmZvLmhhc093blByb3BlcnR5KCdncm91cCcpKSB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHtuYW1lfSBkb2Vzbid0IGhhdmUgZ3JvdXBgKTtcbiAgICBpZiAoIWpzb24uaW5mby5oYXNPd25Qcm9wZXJ0eSgnZGVzY3JpcHRpb24nKSkgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7bmFtZX0gZG9lc24ndCBoYXZlIGRlc2NyaXB0aW9uYCk7XG4gICAgaWYgKCFqc29uLmluZm8uaGFzT3duUHJvcGVydHkoJ2ltYWdlJykpIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke25hbWV9IGRvZXNuJ3QgaGF2ZSBpbWFnZWApO1xuXG4gICAgaWYgKCFqc29uLmhhc093blByb3BlcnR5KCdyZW5kZXIyRCcpKSB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHtuYW1lfSBkb2Vzbid0IGhhdmUgcmVuZGVyMkQgaGFuZGxlcmApO1xuICAgIGlmICghanNvbi5oYXNPd25Qcm9wZXJ0eSgncHJvcGVydGllcycpKSB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHtuYW1lfSBkb2Vzbid0IGhhdmUgcHJvcGVydGllc2ApO1xuXG4gICAgZm9yIChsZXQgcHJvcGVydHlOYW1lIGluIGpzb24ucHJvcGVydGllcykge1xuICAgICAgbGV0IHByb3BlcnR5Q29uZmlncyA9IGpzb24ucHJvcGVydGllc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgaWYgKCFwcm9wZXJ0eUNvbmZpZ3MuaGFzT3duUHJvcGVydHkoJ3R5cGUnKSkgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7bmFtZX0sIFByb3BlcnR5ICR7cHJvcGVydHlOYW1lfSBkb2Vzbid0IGhhdmUgdHlwZWApO1xuICAgICAgaWYgKCFwcm9wZXJ0eUNvbmZpZ3MuaGFzT3duUHJvcGVydHkoJ2RlZmF1bHRWYWx1ZScpKSB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHtuYW1lfSwgUHJvcGVydHkgJHtwcm9wZXJ0eU5hbWV9IGRvZXNuJ3QgaGF2ZSBkZWZhdWx0VmFsdWVgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gQ2hlY2sgaWYgY2F0YWxvZyBoYXMgZWxlbWVudFxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IHR5cGUgRWxlbWVudCdzIHR5cGVcbiAgICogIEByZXR1cm4ge2Jvb2xlYW59XG4gICovXG4gIGhhc0VsZW1lbnQodHlwZSkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRzLmhhc093blByb3BlcnR5KHR5cGUpO1xuICB9XG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBjYXRlZ29yeVxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBjYXRlZ29yeVxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IGxhYmVsIExhYmVsIG9mIGNhdGVnb3J5XG4gICAqICBAcGFyYW0ge2FycmF5fSBbY2hpbGRzXSBDYXRlZ29yeSdzIGNoaWxkc1xuICAgKiAgQHJldHVybiB7P29iamVjdH0gUmVnaXN0ZXJlZCBjYXRlZ29yeVxuICAqL1xuICByZWdpc3RlckNhdGVnb3J5KG5hbWUsIGxhYmVsLCBjaGlsZHMpIHtcbiAgICBpZiAodGhpcy52YWxpZGF0ZUNhdGVnb3J5KG5hbWUsIGxhYmVsKSkge1xuICAgICAgdGhpcy5jYXRlZ29yaWVzW25hbWVdID0ge25hbWUsIGxhYmVsLCBjYXRlZ29yaWVzOiBbXSwgZWxlbWVudHM6IFtdfTtcbiAgICAgIHRoaXMuY2F0ZWdvcmllcy5yb290LmNhdGVnb3JpZXMucHVzaCh0aGlzLmNhdGVnb3JpZXNbbmFtZV0pO1xuXG4gICAgICBpZihjaGlsZHMgJiYgY2hpbGRzLmxlbmd0aCkge1xuICAgICAgICBjaGlsZHMuZm9yRWFjaCggZWwgPT4gdGhpcy5hZGRUb0NhdGVnb3J5KCBuYW1lLCBlbCApICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNhdGVnb3JpZXNbbmFtZV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBBZGQgYW4gZWxlbWVudCB0byB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5XG4gICAqICBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIGNhdGVnb3J5XG4gICAqICBAcGFyYW0ge29iamVjdH0gY2hpbGQgRWxlbWVudCdzIHN0cnVjdHVyZVxuICAgKiAgQHJldHVybiB7P3ZvaWR9XG4gICovXG4gIGFkZFRvQ2F0ZWdvcnkobmFtZSwgY2hpbGQpIHtcbiAgICBpZiAodGhpcy5oYXNFbGVtZW50KGNoaWxkLm5hbWUpKSB7XG4gICAgICB0aGlzLmNhdGVnb3JpZXNbbmFtZV0uZWxlbWVudHMucHVzaChjaGlsZCk7XG4gICAgICB0aGlzLmNhdGVnb3JpZXMucm9vdC5lbGVtZW50cy5zcGxpY2UodGhpcy5jYXRlZ29yaWVzLnJvb3QuZWxlbWVudHMuaW5kZXhPZihjaGlsZCksIDEpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5oYXNDYXRlZ29yeShjaGlsZC5uYW1lKSkge1xuICAgICAgdGhpcy5jYXRlZ29yaWVzW25hbWVdLmNhdGVnb3JpZXMucHVzaChjaGlsZCk7XG4gICAgICB0aGlzLmNhdGVnb3JpZXMucm9vdC5jYXRlZ29yaWVzLnNwbGljZSh0aGlzLmNhdGVnb3JpZXMucm9vdC5jYXRlZ29yaWVzLmluZGV4T2YoY2hpbGQpLCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjaGlsZCAke2NoaWxkfSBpcyBlaXRoZXIgY2F0ZWdvcnkgbm9yIGVsZW1lbnRgKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIENoZWNrIGlmIGNhdGVnb3J5IGNvbnRhaW4gZWxlbWVudFxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IGNhdGVnb3J5TmFtZSBOYW1lIG9mIGNhdGVnb3J5XG4gICAqICBAcGFyYW0ge3N0cmluZ30gZWxlbWVudE5hbWUgTmFtZSBvZiBlbGVtZW50XG4gICAqICBAcmV0dXJuIHtib29sZWFufVxuICAqL1xuICBjYXRlZ29yeUhhc0VsZW1lbnQoY2F0ZWdvcnlOYW1lLCBlbGVtZW50TmFtZSkge1xuICAgIHJldHVybiB0aGlzLmhhc0NhdGVnb3J5KGNhdGVnb3J5TmFtZSkgJiYgdGhpcy5jYXRlZ29yaWVzW2NhdGVnb3J5TmFtZV0uZWxlbWVudHMuc29tZShlbCA9PiBlbC5uYW1lID09PSBlbGVtZW50TmFtZSk7XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIFZhbGlkYXRlIGEgY2F0ZWdvcnlcbiAgICogIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgY2F0ZWdvcnlcbiAgICogIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCBMYWJlbCBvZiBjYXRlZ29yeVxuICAgKiAgQHJldHVybiB7P2Jvb2xlYW59XG4gICovXG4gIHZhbGlkYXRlQ2F0ZWdvcnkobmFtZSwgbGFiZWwpIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2F0ZWdvcnkgaGFzIHVuZGVmaW5lZCBuYW1lJyk7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYXRlZ29yeSBoYXMgZW1wdHkgbmFtZScpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNDYXRlZ29yeShuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYXRlZ29yeSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gVmVyaWZ5IGlmIGNhdGFsb2cgYWxyZWFkeSBjb250YWluIGEgY2F0ZWdvcnkgd2l0aCBzcGVjaWZpZWQgbmFtZVxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IGNhdGVnb3J5TmFtZSBOYW1lIG9mIGNhdGVnb3J5XG4gICAqICBAcmV0dXJuIHtib29sZWFufVxuICAqL1xuICBoYXNDYXRlZ29yeShjYXRlZ29yeU5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5jYXRlZ29yaWVzLmhhc093blByb3BlcnR5KGNhdGVnb3J5TmFtZSk7XG4gIH1cblxufVxuIl19