react-planner-viewer
Version:
react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode
267 lines (217 loc) • 27.4 kB
JavaScript
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; }; }();
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"); } }
import { PropertyColor, PropertyEnum, PropertyString, PropertyNumber, PropertyLengthMeasure, PropertyToggle, PropertyCheckbox, PropertyHidden, PropertyReadOnly } from './properties/export';
import { UNIT_CENTIMETER } from '../constants';
var Catalog = function () {
function Catalog() {
var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : UNIT_CENTIMETER;
_classCallCheck(this, Catalog);
this.elements = {};
this.categories = { root: { name: 'root', label: '/', elements: [], categories: [] } };
this.propertyTypes = {};
this.unit = unit;
this.registerMultiplePropertyType([['color', PropertyColor, PropertyColor], ['enum', PropertyEnum, PropertyEnum], ['string', PropertyString, PropertyString], ['number', PropertyNumber, PropertyNumber], ['length-measure', PropertyLengthMeasure, PropertyLengthMeasure], ['toggle', PropertyToggle, PropertyToggle], ['checkbox', PropertyCheckbox, PropertyCheckbox], ['hidden', PropertyHidden, PropertyHidden], ['read-only', PropertyReadOnly, 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;
}();
export default Catalog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYXRhbG9nL2NhdGFsb2cuanMiXSwibmFtZXMiOlsiUHJvcGVydHlDb2xvciIsIlByb3BlcnR5RW51bSIsIlByb3BlcnR5U3RyaW5nIiwiUHJvcGVydHlOdW1iZXIiLCJQcm9wZXJ0eUxlbmd0aE1lYXN1cmUiLCJQcm9wZXJ0eVRvZ2dsZSIsIlByb3BlcnR5Q2hlY2tib3giLCJQcm9wZXJ0eUhpZGRlbiIsIlByb3BlcnR5UmVhZE9ubHkiLCJVTklUX0NFTlRJTUVURVIiLCJDYXRhbG9nIiwidW5pdCIsImVsZW1lbnRzIiwiY2F0ZWdvcmllcyIsInJvb3QiLCJuYW1lIiwibGFiZWwiLCJwcm9wZXJ0eVR5cGVzIiwicmVnaXN0ZXJNdWx0aXBsZVByb3BlcnR5VHlwZSIsInR5cGUiLCJoYXNFbGVtZW50IiwiRXJyb3IiLCJjYXRlZ29yeU5hbWUiLCJoYXNDYXRlZ29yeSIsImhhc093blByb3BlcnR5IiwianNvbiIsInByb3BlcnRpZXMiLCJ2YWxpZGF0ZUVsZW1lbnQiLCJwdXNoIiwiZWxlbWVudEFycmF5IiwiZm9yRWFjaCIsInJlZ2lzdGVyRWxlbWVudCIsImVsIiwiVmlld2VyIiwiRWRpdG9yIiwicHJvcGVydHlUeXBlQXJyYXkiLCJyZWdpc3RlclByb3BlcnR5VHlwZSIsImluZm8iLCJwcm9wZXJ0eU5hbWUiLCJwcm9wZXJ0eUNvbmZpZ3MiLCJjaGlsZHMiLCJ2YWxpZGF0ZUNhdGVnb3J5IiwibGVuZ3RoIiwiYWRkVG9DYXRlZ29yeSIsImNoaWxkIiwic3BsaWNlIiwiaW5kZXhPZiIsImVsZW1lbnROYW1lIiwic29tZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsU0FDRUEsYUFERixFQUVFQyxZQUZGLEVBR0VDLGNBSEYsRUFJRUMsY0FKRixFQUtFQyxxQkFMRixFQU1FQyxjQU5GLEVBT0VDLGdCQVBGLEVBUUVDLGNBUkYsRUFTRUMsZ0JBVEYsUUFVTyxxQkFWUDs7QUFZQSxTQUFRQyxlQUFSLFFBQThCLGNBQTlCOztJQUVxQkMsTztBQUVuQixxQkFBb0M7QUFBQSxRQUF4QkMsSUFBd0IsdUVBQWpCRixlQUFpQjs7QUFBQTs7QUFDbEMsU0FBS0csUUFBTCxHQUFnQixFQUFoQjtBQUNBLFNBQUtDLFVBQUwsR0FBa0IsRUFBQ0MsTUFBTSxFQUFDQyxNQUFNLE1BQVAsRUFBZUMsT0FBTyxHQUF0QixFQUEyQkosVUFBVSxFQUFyQyxFQUF5Q0MsWUFBWSxFQUFyRCxFQUFQLEVBQWxCO0FBQ0EsU0FBS0ksYUFBTCxHQUFxQixFQUFyQjtBQUNBLFNBQUtOLElBQUwsR0FBWUEsSUFBWjs7QUFFQSxTQUFLTyw0QkFBTCxDQUFrQyxDQUNoQyxDQUFDLE9BQUQsRUFBVWxCLGFBQVYsRUFBeUJBLGFBQXpCLENBRGdDLEVBRWhDLENBQUMsTUFBRCxFQUFTQyxZQUFULEVBQXVCQSxZQUF2QixDQUZnQyxFQUdoQyxDQUFDLFFBQUQsRUFBV0MsY0FBWCxFQUEyQkEsY0FBM0IsQ0FIZ0MsRUFJaEMsQ0FBQyxRQUFELEVBQVdDLGNBQVgsRUFBMkJBLGNBQTNCLENBSmdDLEVBS2hDLENBQUMsZ0JBQUQsRUFBbUJDLHFCQUFuQixFQUEwQ0EscUJBQTFDLENBTGdDLEVBTWhDLENBQUMsUUFBRCxFQUFXQyxjQUFYLEVBQTJCQSxjQUEzQixDQU5nQyxFQU9oQyxDQUFDLFVBQUQsRUFBYUMsZ0JBQWIsRUFBK0JBLGdCQUEvQixDQVBnQyxFQVFoQyxDQUFDLFFBQUQsRUFBV0MsY0FBWCxFQUEyQkEsY0FBM0IsQ0FSZ0MsRUFTaEMsQ0FBQyxXQUFELEVBQWNDLGdCQUFkLEVBQWdDQSxnQkFBaEMsQ0FUZ0MsQ0FBbEM7QUFXRDs7QUFFRDs7Ozs7Ozs7K0JBSVdXLEksRUFBTTtBQUNmLFVBQUksS0FBS0MsVUFBTCxDQUFnQkQsSUFBaEIsQ0FBSixFQUEyQjtBQUN6QixlQUFPLEtBQUtQLFFBQUwsQ0FBY08sSUFBZCxDQUFQO0FBQ0Q7QUFDRCxZQUFNLElBQUlFLEtBQUosY0FBcUJGLElBQXJCLGdDQUFOO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Z0NBSVlHLFksRUFBYztBQUN4QixVQUFJLEtBQUtDLFdBQUwsQ0FBaUJELFlBQWpCLENBQUosRUFBb0M7QUFDbEMsZUFBTyxLQUFLVCxVQUFMLENBQWdCUyxZQUFoQixDQUFQO0FBQ0Q7QUFDRCxZQUFNLElBQUlELEtBQUosZUFBc0JDLFlBQXRCLGdDQUFOO0FBQ0Q7O0FBRUQ7Ozs7Ozs7b0NBSWdCSCxJLEVBQU07QUFDcEIsVUFBSSxLQUFLRixhQUFMLENBQW1CTyxjQUFuQixDQUFrQ0wsSUFBbEMsQ0FBSixFQUE2QztBQUMzQyxlQUFPLEtBQUtGLGFBQUwsQ0FBbUJFLElBQW5CLENBQVA7QUFDRDtBQUNELFlBQU0sSUFBSUUsS0FBSixjQUFxQkYsSUFBckIsZ0NBQU47QUFDRDs7QUFFRDs7Ozs7OztvQ0FJZ0JNLEksRUFBTTtBQUNwQkEsV0FBS0MsVUFBTCxHQUFrQkQsS0FBS0MsVUFBTCxJQUFtQixFQUFyQztBQUNBLFVBQUksS0FBS0MsZUFBTCxDQUFxQkYsSUFBckIsQ0FBSixFQUFnQztBQUM5QixhQUFLYixRQUFMLENBQWNhLEtBQUtWLElBQW5CLElBQTJCVSxJQUEzQjtBQUNBLGFBQUtaLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCRixRQUFyQixDQUE4QmdCLElBQTlCLENBQW1DLEtBQUtoQixRQUFMLENBQWNhLEtBQUtWLElBQW5CLENBQW5DO0FBQ0Q7QUFDRjs7QUFFRDs7Ozs7Ozs2Q0FJeUJjLFksRUFBYztBQUFBOztBQUNyQ0EsbUJBQWFDLE9BQWIsQ0FBcUI7QUFBQSxlQUFNLE1BQUtDLGVBQUwsQ0FBcUJDLEVBQXJCLENBQU47QUFBQSxPQUFyQjtBQUNEOztBQUVEOzs7Ozs7Ozs7eUNBTXFCYixJLEVBQU1jLE0sRUFBUUMsTSxFQUFRO0FBQ3pDLFdBQUtqQixhQUFMLENBQW1CRSxJQUFuQixJQUEyQixFQUFDQSxVQUFELEVBQU9jLGNBQVAsRUFBZUMsY0FBZixFQUEzQjtBQUNEOztBQUVEOzs7Ozs7O2lEQUk2QkMsaUIsRUFBbUI7QUFBQTs7QUFDOUNBLHdCQUFrQkwsT0FBbEIsQ0FBMEI7QUFBQSxlQUFNLE9BQUtNLG9CQUFMLGtDQUE2QkosRUFBN0IsRUFBTjtBQUFBLE9BQTFCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7b0NBSWdCUCxJLEVBQU07QUFDcEIsVUFBSSxDQUFDQSxLQUFLRCxjQUFMLENBQW9CLE1BQXBCLENBQUwsRUFBa0MsTUFBTSxJQUFJSCxLQUFKLENBQVUsbUJBQVYsQ0FBTjs7QUFFbEMsVUFBSU4sT0FBT1UsS0FBS1YsSUFBaEI7QUFDQSxVQUFJLENBQUNVLEtBQUtELGNBQUwsQ0FBb0IsV0FBcEIsQ0FBTCxFQUF1QyxNQUFNLElBQUlILEtBQUosY0FBcUJOLElBQXJCLDhCQUFOOztBQUV2QyxVQUFJLENBQUNVLEtBQUtELGNBQUwsQ0FBb0IsTUFBcEIsQ0FBTCxFQUFrQyxNQUFNLElBQUlILEtBQUosY0FBcUJOLElBQXJCLHlCQUFOO0FBQ2xDLFVBQUksQ0FBQ1UsS0FBS1ksSUFBTCxDQUFVYixjQUFWLENBQXlCLEtBQXpCLENBQUwsRUFBc0MsTUFBTSxJQUFJSCxLQUFKLGNBQXFCTixJQUFyQix3QkFBTjtBQUN0QyxVQUFJLENBQUNVLEtBQUtZLElBQUwsQ0FBVWIsY0FBVixDQUF5QixPQUF6QixDQUFMLEVBQXdDLE1BQU0sSUFBSUgsS0FBSixjQUFxQk4sSUFBckIsMEJBQU47QUFDeEMsVUFBSSxDQUFDVSxLQUFLWSxJQUFMLENBQVViLGNBQVYsQ0FBeUIsYUFBekIsQ0FBTCxFQUE4QyxNQUFNLElBQUlILEtBQUosY0FBcUJOLElBQXJCLGdDQUFOO0FBQzlDLFVBQUksQ0FBQ1UsS0FBS1ksSUFBTCxDQUFVYixjQUFWLENBQXlCLE9BQXpCLENBQUwsRUFBd0MsTUFBTSxJQUFJSCxLQUFKLGNBQXFCTixJQUFyQiwwQkFBTjs7QUFFeEMsVUFBSSxDQUFDVSxLQUFLRCxjQUFMLENBQW9CLFVBQXBCLENBQUwsRUFBc0MsTUFBTSxJQUFJSCxLQUFKLGNBQXFCTixJQUFyQixxQ0FBTjtBQUN0QyxVQUFJLENBQUNVLEtBQUtELGNBQUwsQ0FBb0IsWUFBcEIsQ0FBTCxFQUF3QyxNQUFNLElBQUlILEtBQUosY0FBcUJOLElBQXJCLCtCQUFOOztBQUV4QyxXQUFLLElBQUl1QixZQUFULElBQXlCYixLQUFLQyxVQUE5QixFQUEwQztBQUN4QyxZQUFJYSxrQkFBa0JkLEtBQUtDLFVBQUwsQ0FBZ0JZLFlBQWhCLENBQXRCO0FBQ0EsWUFBSSxDQUFDQyxnQkFBZ0JmLGNBQWhCLENBQStCLE1BQS9CLENBQUwsRUFBNkMsTUFBTSxJQUFJSCxLQUFKLGNBQXFCTixJQUFyQixtQkFBdUN1QixZQUF2Qyx5QkFBTjtBQUM3QyxZQUFJLENBQUNDLGdCQUFnQmYsY0FBaEIsQ0FBK0IsY0FBL0IsQ0FBTCxFQUFxRCxNQUFNLElBQUlILEtBQUosY0FBcUJOLElBQXJCLG1CQUF1Q3VCLFlBQXZDLGlDQUFOO0FBQ3REOztBQUVELGFBQU8sSUFBUDtBQUNEOztBQUVEOzs7Ozs7OytCQUlXbkIsSSxFQUFNO0FBQ2YsYUFBTyxLQUFLUCxRQUFMLENBQWNZLGNBQWQsQ0FBNkJMLElBQTdCLENBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7O3FDQU1pQkosSSxFQUFNQyxLLEVBQU93QixNLEVBQVE7QUFBQTs7QUFDcEMsVUFBSSxLQUFLQyxnQkFBTCxDQUFzQjFCLElBQXRCLEVBQTRCQyxLQUE1QixDQUFKLEVBQXdDO0FBQ3RDLGFBQUtILFVBQUwsQ0FBZ0JFLElBQWhCLElBQXdCLEVBQUNBLFVBQUQsRUFBT0MsWUFBUCxFQUFjSCxZQUFZLEVBQTFCLEVBQThCRCxVQUFVLEVBQXhDLEVBQXhCO0FBQ0EsYUFBS0MsVUFBTCxDQUFnQkMsSUFBaEIsQ0FBcUJELFVBQXJCLENBQWdDZSxJQUFoQyxDQUFxQyxLQUFLZixVQUFMLENBQWdCRSxJQUFoQixDQUFyQzs7QUFFQSxZQUFHeUIsVUFBVUEsT0FBT0UsTUFBcEIsRUFBNEI7QUFDMUJGLGlCQUFPVixPQUFQLENBQWdCO0FBQUEsbUJBQU0sT0FBS2EsYUFBTCxDQUFvQjVCLElBQXBCLEVBQTBCaUIsRUFBMUIsQ0FBTjtBQUFBLFdBQWhCO0FBQ0Q7O0FBRUQsZUFBTyxLQUFLbkIsVUFBTCxDQUFnQkUsSUFBaEIsQ0FBUDtBQUNEO0FBQ0QsYUFBTyxJQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7O2tDQUtjQSxJLEVBQU02QixLLEVBQU87QUFDekIsVUFBSSxLQUFLeEIsVUFBTCxDQUFnQndCLE1BQU03QixJQUF0QixDQUFKLEVBQWlDO0FBQy9CLGFBQUtGLFVBQUwsQ0FBZ0JFLElBQWhCLEVBQXNCSCxRQUF0QixDQUErQmdCLElBQS9CLENBQW9DZ0IsS0FBcEM7QUFDQSxhQUFLL0IsVUFBTCxDQUFnQkMsSUFBaEIsQ0FBcUJGLFFBQXJCLENBQThCaUMsTUFBOUIsQ0FBcUMsS0FBS2hDLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCRixRQUFyQixDQUE4QmtDLE9BQTlCLENBQXNDRixLQUF0QyxDQUFyQyxFQUFtRixDQUFuRjtBQUNELE9BSEQsTUFHTyxJQUFJLEtBQUtyQixXQUFMLENBQWlCcUIsTUFBTTdCLElBQXZCLENBQUosRUFBa0M7QUFDdkMsYUFBS0YsVUFBTCxDQUFnQkUsSUFBaEIsRUFBc0JGLFVBQXRCLENBQWlDZSxJQUFqQyxDQUFzQ2dCLEtBQXRDO0FBQ0EsYUFBSy9CLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCRCxVQUFyQixDQUFnQ2dDLE1BQWhDLENBQXVDLEtBQUtoQyxVQUFMLENBQWdCQyxJQUFoQixDQUFxQkQsVUFBckIsQ0FBZ0NpQyxPQUFoQyxDQUF3Q0YsS0FBeEMsQ0FBdkMsRUFBdUYsQ0FBdkY7QUFDRCxPQUhNLE1BR0E7QUFDTCxjQUFNLElBQUl2QixLQUFKLFlBQW1CdUIsS0FBbkIscUNBQU47QUFDRDtBQUNGOztBQUVEOzs7Ozs7Ozt1Q0FLbUJ0QixZLEVBQWN5QixXLEVBQWE7QUFDNUMsYUFBTyxLQUFLeEIsV0FBTCxDQUFpQkQsWUFBakIsS0FBa0MsS0FBS1QsVUFBTCxDQUFnQlMsWUFBaEIsRUFBOEJWLFFBQTlCLENBQXVDb0MsSUFBdkMsQ0FBNEM7QUFBQSxlQUFNaEIsR0FBR2pCLElBQUgsS0FBWWdDLFdBQWxCO0FBQUEsT0FBNUMsQ0FBekM7QUFDRDs7QUFFRDs7Ozs7Ozs7cUNBS2lCaEMsSSxFQUFNQyxLLEVBQU87QUFDNUIsVUFBSSxDQUFDRCxJQUFMLEVBQVc7QUFDVCxjQUFNLElBQUlNLEtBQUosQ0FBVSw2QkFBVixDQUFOO0FBQ0Q7QUFDRCxVQUFJTixTQUFTLEVBQWIsRUFBaUI7QUFDZixjQUFNLElBQUlNLEtBQUosQ0FBVSx5QkFBVixDQUFOO0FBQ0Q7QUFDRCxVQUFJLEtBQUtFLFdBQUwsQ0FBaUJSLElBQWpCLENBQUosRUFBNEI7QUFDMUIsY0FBTSxJQUFJTSxLQUFKLENBQVUsc0NBQVYsQ0FBTjtBQUNEOztBQUVELGFBQU8sSUFBUDtBQUNEOztBQUVEOzs7Ozs7O2dDQUlZQyxZLEVBQWM7QUFDeEIsYUFBTyxLQUFLVCxVQUFMLENBQWdCVyxjQUFoQixDQUErQkYsWUFBL0IsQ0FBUDtBQUNEOzs7Ozs7ZUF2TWtCWixPIiwiZmlsZSI6ImNhdGFsb2cuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBQcm9wZXJ0eUNvbG9yLFxuICBQcm9wZXJ0eUVudW0sXG4gIFByb3BlcnR5U3RyaW5nLFxuICBQcm9wZXJ0eU51bWJlcixcbiAgUHJvcGVydHlMZW5ndGhNZWFzdXJlLFxuICBQcm9wZXJ0eVRvZ2dsZSxcbiAgUHJvcGVydHlDaGVja2JveCxcbiAgUHJvcGVydHlIaWRkZW4sXG4gIFByb3BlcnR5UmVhZE9ubHlcbn0gZnJvbSAnLi9wcm9wZXJ0aWVzL2V4cG9ydCc7XG5cbmltcG9ydCB7VU5JVF9DRU5USU1FVEVSfSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRhbG9nIHtcblxuICBjb25zdHJ1Y3Rvcih1bml0ID0gVU5JVF9DRU5USU1FVEVSKSB7XG4gICAgdGhpcy5lbGVtZW50cyA9IHt9O1xuICAgIHRoaXMuY2F0ZWdvcmllcyA9IHtyb290OiB7bmFtZTogJ3Jvb3QnLCBsYWJlbDogJy8nLCBlbGVtZW50czogW10sIGNhdGVnb3JpZXM6IFtdfX07XG4gICAgdGhpcy5wcm9wZXJ0eVR5cGVzID0ge307XG4gICAgdGhpcy51bml0ID0gdW5pdDtcblxuICAgIHRoaXMucmVnaXN0ZXJNdWx0aXBsZVByb3BlcnR5VHlwZShbXG4gICAgICBbJ2NvbG9yJywgUHJvcGVydHlDb2xvciwgUHJvcGVydHlDb2xvcl0sXG4gICAgICBbJ2VudW0nLCBQcm9wZXJ0eUVudW0sIFByb3BlcnR5RW51bV0sXG4gICAgICBbJ3N0cmluZycsIFByb3BlcnR5U3RyaW5nLCBQcm9wZXJ0eVN0cmluZ10sXG4gICAgICBbJ251bWJlcicsIFByb3BlcnR5TnVtYmVyLCBQcm9wZXJ0eU51bWJlcl0sXG4gICAgICBbJ2xlbmd0aC1tZWFzdXJlJywgUHJvcGVydHlMZW5ndGhNZWFzdXJlLCBQcm9wZXJ0eUxlbmd0aE1lYXN1cmVdLFxuICAgICAgWyd0b2dnbGUnLCBQcm9wZXJ0eVRvZ2dsZSwgUHJvcGVydHlUb2dnbGVdLFxuICAgICAgWydjaGVja2JveCcsIFByb3BlcnR5Q2hlY2tib3gsIFByb3BlcnR5Q2hlY2tib3hdLFxuICAgICAgWydoaWRkZW4nLCBQcm9wZXJ0eUhpZGRlbiwgUHJvcGVydHlIaWRkZW5dLFxuICAgICAgWydyZWFkLW9ubHknLCBQcm9wZXJ0eVJlYWRPbmx5LCBQcm9wZXJ0eVJlYWRPbmx5XVxuICAgIF0pO1xuICB9XG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBHZXQgY2F0YWxvZydzIGVsZW1lbnRcbiAgICogIEBwYXJhbSB7c3RyaW5nfSB0eXBlIEVsZW1lbnQncyB0eXBlXG4gICAqICBAcmV0dXJuIHs/b2JqZWN0fSBFbGVtZW50XG4gICovXG4gIGdldEVsZW1lbnQodHlwZSkge1xuICAgIGlmICh0aGlzLmhhc0VsZW1lbnQodHlwZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzW3R5cGVdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHt0eXBlfSBkb2VzIG5vdCBleGlzdCBpbiBjYXRhbG9nYCk7XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIEdldCBjYXRhbG9nIGNhdGVnb3J5XG4gICAqICBAcGFyYW0ge3N0cmluZ30gY2F0ZWdvcnlOYW1lIE5hbWUgb2YgY2F0ZWdvcnlcbiAgICogIEByZXR1cm4ge29iamVjdH0gQ2F0ZWdvcnlcbiAgKi9cbiAgZ2V0Q2F0ZWdvcnkoY2F0ZWdvcnlOYW1lKSB7XG4gICAgaWYgKHRoaXMuaGFzQ2F0ZWdvcnkoY2F0ZWdvcnlOYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2F0ZWdvcmllc1tjYXRlZ29yeU5hbWVdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhdGVnb3J5ICR7Y2F0ZWdvcnlOYW1lfSBkb2VzIG5vdCBleGlzdCBpbiBjYXRhbG9nYCk7XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIFJldHVybiB0eXBlIG9mIGEgc3BlY2ZpZWQgcHJvcGVydHlcbiAgICogIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFByb3BlcnR5IHR5cGVcbiAgICogIEByZXR1cm4gez9vYmplY3R9IFByb3BlcnR5XG4gICovXG4gIGdldFByb3BlcnR5VHlwZSh0eXBlKSB7XG4gICAgaWYgKHRoaXMucHJvcGVydHlUeXBlcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHlUeXBlc1t0eXBlXTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7dHlwZX0gZG9lcyBub3QgZXhpc3QgaW4gY2F0YWxvZ2ApO1xuICB9XG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBlbGVtZW50XG4gICAqICBAcGFyYW0ge29iamVjdH0ganNvbiBFbGVtZW50IHN0cnVjdHVyZVxuICAgKiAgQHJldHVybiB7dm9pZH1cbiAgKi9cbiAgcmVnaXN0ZXJFbGVtZW50KGpzb24pIHtcbiAgICBqc29uLnByb3BlcnRpZXMgPSBqc29uLnByb3BlcnRpZXMgfHwge307XG4gICAgaWYgKHRoaXMudmFsaWRhdGVFbGVtZW50KGpzb24pKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2pzb24ubmFtZV0gPSBqc29uO1xuICAgICAgdGhpcy5jYXRlZ29yaWVzLnJvb3QuZWxlbWVudHMucHVzaCh0aGlzLmVsZW1lbnRzW2pzb24ubmFtZV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgbXVsdGlwbGUgZWxlbWVudHNcbiAgICogIEBwYXJhbSB7YXJyYXl9IFtlbGVtZW50QXJyYXldIEFycmF5IG9mIGVsZW1lbnRzXG4gICAqICBAcmV0dXJuIHt2b2lkfVxuICAqL1xuICByZWdpc3Rlck11bHRpcGxlRWxlbWVudHMoZWxlbWVudEFycmF5KSB7XG4gICAgZWxlbWVudEFycmF5LmZvckVhY2goZWwgPT4gdGhpcy5yZWdpc3RlckVsZW1lbnQoZWwpKTtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYSBuZXcgcHJvcGVydHlcbiAgICogIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFR5cGUgb2YgcHJvcGVydHlcbiAgICogIEBwYXJhbSB7b2JqZWN0fSBWaWV3ZXIgUHJvcGVydHkgdmlld2VyIGNvbXBvbmVudFxuICAgKiAgQHBhcmFtIHtvYmplY3R9IEVkaXRvciBQcm9wZXJ0eSBlZGl0b3IgY29tcG9uZW50XG4gICAqICBAcmV0dXJuIHt2b2lkfVxuICAqL1xuICByZWdpc3RlclByb3BlcnR5VHlwZSh0eXBlLCBWaWV3ZXIsIEVkaXRvcikge1xuICAgIHRoaXMucHJvcGVydHlUeXBlc1t0eXBlXSA9IHt0eXBlLCBWaWV3ZXIsIEVkaXRvcn07XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIG11bHRpcGxlIHByb3BlcnR5XG4gICAqICBAcGFyYW0ge2FycmF5fSBwcm9wZXJ0eVR5cGVBcnJheSBBcnJheSBvZiBwcm9wZXJ0aWVzXG4gICAqICBAcmV0dXJuIHt2b2lkfVxuICAqL1xuICByZWdpc3Rlck11bHRpcGxlUHJvcGVydHlUeXBlKHByb3BlcnR5VHlwZUFycmF5KSB7XG4gICAgcHJvcGVydHlUeXBlQXJyYXkuZm9yRWFjaChlbCA9PiB0aGlzLnJlZ2lzdGVyUHJvcGVydHlUeXBlKC4uLmVsKSk7XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIFZhbGlkYXRlIGFuIGVsZW1lbnRcbiAgICogIEBwYXJhbSB7b2JqZWN0fSBqc29uIEVsZW1lbnQncyBzdHJ1Y3R1cmVcbiAgICogIEByZXR1cm4gez9ib29sZWFufVxuICAqL1xuICB2YWxpZGF0ZUVsZW1lbnQoanNvbikge1xuICAgIGlmICghanNvbi5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpKSB0aHJvdyBuZXcgRXJyb3IoJ0VsZW1lbnQgbm90IHZhbGlkJyk7XG5cbiAgICBsZXQgbmFtZSA9IGpzb24ubmFtZTtcbiAgICBpZiAoIWpzb24uaGFzT3duUHJvcGVydHkoJ3Byb3RvdHlwZScpKSB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHtuYW1lfSBkb2Vzbid0IGhhdmUgcHJvdG90eXBlYCk7XG5cbiAgICBpZiAoIWpzb24uaGFzT3duUHJvcGVydHkoJ2luZm8nKSkgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7bmFtZX0gZG9lc24ndCBoYXZlIGluZm9gKTtcbiAgICBpZiAoIWpzb24uaW5mby5oYXNPd25Qcm9wZXJ0eSgndGFnJykpIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke25hbWV9IGRvZXNuJ3QgaGF2ZSB0YWdgKTtcbiAgICBpZiAoIWpzb24uaW5mby5oYXNPd25Qcm9wZXJ0eSgnZ3JvdXAnKSkgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7bmFtZX0gZG9lc24ndCBoYXZlIGdyb3VwYCk7XG4gICAgaWYgKCFqc29uLmluZm8uaGFzT3duUHJvcGVydHkoJ2Rlc2NyaXB0aW9uJykpIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke25hbWV9IGRvZXNuJ3QgaGF2ZSBkZXNjcmlwdGlvbmApO1xuICAgIGlmICghanNvbi5pbmZvLmhhc093blByb3BlcnR5KCdpbWFnZScpKSB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHtuYW1lfSBkb2Vzbid0IGhhdmUgaW1hZ2VgKTtcblxuICAgIGlmICghanNvbi5oYXNPd25Qcm9wZXJ0eSgncmVuZGVyMkQnKSkgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7bmFtZX0gZG9lc24ndCBoYXZlIHJlbmRlcjJEIGhhbmRsZXJgKTtcbiAgICBpZiAoIWpzb24uaGFzT3duUHJvcGVydHkoJ3Byb3BlcnRpZXMnKSkgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7bmFtZX0gZG9lc24ndCBoYXZlIHByb3BlcnRpZXNgKTtcblxuICAgIGZvciAobGV0IHByb3BlcnR5TmFtZSBpbiBqc29uLnByb3BlcnRpZXMpIHtcbiAgICAgIGxldCBwcm9wZXJ0eUNvbmZpZ3MgPSBqc29uLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgIGlmICghcHJvcGVydHlDb25maWdzLmhhc093blByb3BlcnR5KCd0eXBlJykpIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke25hbWV9LCBQcm9wZXJ0eSAke3Byb3BlcnR5TmFtZX0gZG9lc24ndCBoYXZlIHR5cGVgKTtcbiAgICAgIGlmICghcHJvcGVydHlDb25maWdzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7bmFtZX0sIFByb3BlcnR5ICR7cHJvcGVydHlOYW1lfSBkb2Vzbid0IGhhdmUgZGVmYXVsdFZhbHVlYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIENoZWNrIGlmIGNhdGFsb2cgaGFzIGVsZW1lbnRcbiAgICogIEBwYXJhbSB7c3RyaW5nfSB0eXBlIEVsZW1lbnQncyB0eXBlXG4gICAqICBAcmV0dXJuIHtib29sZWFufVxuICAqL1xuICBoYXNFbGVtZW50KHR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5oYXNPd25Qcm9wZXJ0eSh0eXBlKTtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYSBuZXcgY2F0ZWdvcnlcbiAgICogIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgY2F0ZWdvcnlcbiAgICogIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCBMYWJlbCBvZiBjYXRlZ29yeVxuICAgKiAgQHBhcmFtIHthcnJheX0gW2NoaWxkc10gQ2F0ZWdvcnkncyBjaGlsZHNcbiAgICogIEByZXR1cm4gez9vYmplY3R9IFJlZ2lzdGVyZWQgY2F0ZWdvcnlcbiAgKi9cbiAgcmVnaXN0ZXJDYXRlZ29yeShuYW1lLCBsYWJlbCwgY2hpbGRzKSB7XG4gICAgaWYgKHRoaXMudmFsaWRhdGVDYXRlZ29yeShuYW1lLCBsYWJlbCkpIHtcbiAgICAgIHRoaXMuY2F0ZWdvcmllc1tuYW1lXSA9IHtuYW1lLCBsYWJlbCwgY2F0ZWdvcmllczogW10sIGVsZW1lbnRzOiBbXX07XG4gICAgICB0aGlzLmNhdGVnb3JpZXMucm9vdC5jYXRlZ29yaWVzLnB1c2godGhpcy5jYXRlZ29yaWVzW25hbWVdKTtcblxuICAgICAgaWYoY2hpbGRzICYmIGNoaWxkcy5sZW5ndGgpIHtcbiAgICAgICAgY2hpbGRzLmZvckVhY2goIGVsID0+IHRoaXMuYWRkVG9DYXRlZ29yeSggbmFtZSwgZWwgKSApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jYXRlZ29yaWVzW25hbWVdO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gQWRkIGFuIGVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBjYXRlZ29yeVxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBjYXRlZ29yeVxuICAgKiAgQHBhcmFtIHtvYmplY3R9IGNoaWxkIEVsZW1lbnQncyBzdHJ1Y3R1cmVcbiAgICogIEByZXR1cm4gez92b2lkfVxuICAqL1xuICBhZGRUb0NhdGVnb3J5KG5hbWUsIGNoaWxkKSB7XG4gICAgaWYgKHRoaXMuaGFzRWxlbWVudChjaGlsZC5uYW1lKSkge1xuICAgICAgdGhpcy5jYXRlZ29yaWVzW25hbWVdLmVsZW1lbnRzLnB1c2goY2hpbGQpO1xuICAgICAgdGhpcy5jYXRlZ29yaWVzLnJvb3QuZWxlbWVudHMuc3BsaWNlKHRoaXMuY2F0ZWdvcmllcy5yb290LmVsZW1lbnRzLmluZGV4T2YoY2hpbGQpLCAxKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaGFzQ2F0ZWdvcnkoY2hpbGQubmFtZSkpIHtcbiAgICAgIHRoaXMuY2F0ZWdvcmllc1tuYW1lXS5jYXRlZ29yaWVzLnB1c2goY2hpbGQpO1xuICAgICAgdGhpcy5jYXRlZ29yaWVzLnJvb3QuY2F0ZWdvcmllcy5zcGxpY2UodGhpcy5jYXRlZ29yaWVzLnJvb3QuY2F0ZWdvcmllcy5pbmRleE9mKGNoaWxkKSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2hpbGQgJHtjaGlsZH0gaXMgZWl0aGVyIGNhdGVnb3J5IG5vciBlbGVtZW50YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBDaGVjayBpZiBjYXRlZ29yeSBjb250YWluIGVsZW1lbnRcbiAgICogIEBwYXJhbSB7c3RyaW5nfSBjYXRlZ29yeU5hbWUgTmFtZSBvZiBjYXRlZ29yeVxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IGVsZW1lbnROYW1lIE5hbWUgb2YgZWxlbWVudFxuICAgKiAgQHJldHVybiB7Ym9vbGVhbn1cbiAgKi9cbiAgY2F0ZWdvcnlIYXNFbGVtZW50KGNhdGVnb3J5TmFtZSwgZWxlbWVudE5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNDYXRlZ29yeShjYXRlZ29yeU5hbWUpICYmIHRoaXMuY2F0ZWdvcmllc1tjYXRlZ29yeU5hbWVdLmVsZW1lbnRzLnNvbWUoZWwgPT4gZWwubmFtZSA9PT0gZWxlbWVudE5hbWUpO1xuICB9XG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZSBhIGNhdGVnb3J5XG4gICAqICBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIGNhdGVnb3J5XG4gICAqICBAcGFyYW0ge3N0cmluZ30gbGFiZWwgTGFiZWwgb2YgY2F0ZWdvcnlcbiAgICogIEByZXR1cm4gez9ib29sZWFufVxuICAqL1xuICB2YWxpZGF0ZUNhdGVnb3J5KG5hbWUsIGxhYmVsKSB7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhdGVnb3J5IGhhcyB1bmRlZmluZWQgbmFtZScpO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2F0ZWdvcnkgaGFzIGVtcHR5IG5hbWUnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzQ2F0ZWdvcnkobmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2F0ZWdvcnkgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIFZlcmlmeSBpZiBjYXRhbG9nIGFscmVhZHkgY29udGFpbiBhIGNhdGVnb3J5IHdpdGggc3BlY2lmaWVkIG5hbWVcbiAgICogIEBwYXJhbSB7c3RyaW5nfSBjYXRlZ29yeU5hbWUgTmFtZSBvZiBjYXRlZ29yeVxuICAgKiAgQHJldHVybiB7Ym9vbGVhbn1cbiAgKi9cbiAgaGFzQ2F0ZWdvcnkoY2F0ZWdvcnlOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuY2F0ZWdvcmllcy5oYXNPd25Qcm9wZXJ0eShjYXRlZ29yeU5hbWUpO1xuICB9XG5cbn1cbiJdfQ==