tc-ui-toolkit
Version:
React components used to develop tools for the desktop app translationCore
345 lines (290 loc) • 33.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _styles = require("@material-ui/core/styles");
var _List = _interopRequireDefault(require("@material-ui/core/List"));
var _Collapse = _interopRequireDefault(require("@material-ui/core/Collapse"));
var _ListItem = _interopRequireDefault(require("@material-ui/core/ListItem"));
var _ListSubheader = _interopRequireDefault(require("@material-ui/core/ListSubheader"));
var _ListItemIcon = _interopRequireDefault(require("@material-ui/core/ListItemIcon"));
var _Divider = _interopRequireDefault(require("@material-ui/core/Divider"));
var _CheckBoxOutlineBlank = _interopRequireDefault(require("@material-ui/icons/CheckBoxOutlineBlank"));
var _CheckBox = _interopRequireDefault(require("@material-ui/icons/CheckBox"));
var _ListItemText = _interopRequireDefault(require("@material-ui/core/ListItemText"));
var _Chip = _interopRequireDefault(require("@material-ui/core/Chip"));
var _MenuFilterIcon = _interopRequireDefault(require("./MenuFilterIcon"));
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
var styles = function styles() {
return {
root: {
backgroundColor: '#19579E',
zIndex: 10,
color: '#FFFFFF',
paddingTop: 5,
paddingBottom: 5
},
filterItemRoot: {
paddingTop: 4,
paddingBottom: 4,
minHeight: 'auto'
},
divider: {
borderBottom: 'solid 1px #FFFFFF9e'
},
text: {
color: '#FFFFFF',
fontWeight: 'bold',
fontSize: 16
},
filterText: {
color: '#FFFFFF',
fontWeight: 700,
fontSize: 14
},
checkbox: {
color: '#FFFFFF',
fontSize: '22px'
},
chip: {
color: '#19579E',
margin: 5
},
chipLabel: {
fontSize: 12,
fontWeight: 'bold'
},
chipDeleteIcon: {
'color': '#19579E99',
'&:hover': {
color: '#19579E'
}
},
hover: {},
listItemIconRoot: {
minWidth: '0px'
}
};
};
/**
* A list of filter controls
* @param {object[]} filters - an array of filters
* @param {function} onToggle - callback to receive filter events
* @param {string} [title] - the menu title
* @param {object[]} [selected] - an array of selected filters
*
*/
var MenuFilter = /*#__PURE__*/function (_React$Component) {
(0, _inherits2["default"])(MenuFilter, _React$Component);
var _super = _createSuper(MenuFilter);
function MenuFilter() {
var _this;
(0, _classCallCheck2["default"])(this, MenuFilter);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", {
open: false
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleOpen", function () {
_this.setState(function (state) {
return {
open: !state.open
};
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleToggle", function (filter) {
return function () {
var onToggle = _this.props.onToggle;
onToggle(filter);
};
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "isChecked", function (filter) {
var selected = _this.props.selected;
for (var i = 0, len = selected.length; i < len; i++) {
if (selected[i].id === filter.id) {
return true;
}
}
return false;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "isEnabled", function (filter) {
var selected = _this.props.selected;
var _iterator = _createForOfIteratorHelper(selected),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var f = _step.value;
if (f.disables.indexOf(filter.id) >= 0) {
return false;
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return true;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getOrder", function (filter) {
if (!(filter.order > 0)) {
// if order not defined or invalid, set it
var filters = _this.props.filters;
filter.order = -1;
for (var i = 0, l = filters.length; i < l; i++) {
var f = filters[i];
if (f.id === filter.id) {
filter.order = i + 1; // cache order of filter
break;
}
}
}
return filter.order;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getChip", function (filter, classes) {
return /*#__PURE__*/_react["default"].createElement("td", {
key: 'chip_td_' + filter.id
}, /*#__PURE__*/_react["default"].createElement(_Chip["default"], {
key: filter.id,
label: filter.label,
classes: {
deleteIcon: classes.chipDeleteIcon,
label: classes.chipLabel
},
onDelete: _this.handleToggle(filter),
className: classes.chip
}));
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getRow", function (selected, start, count, classes) {
var chips = [];
for (var i = start, l = selected.length; i < l && i < start + count; i++) {
chips.push(_this.getChip(selected[i], classes));
}
return /*#__PURE__*/_react["default"].createElement("tr", {
key: 'chip_tr_' + start
}, chips);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "getChips", function (selected, classes) {
if (selected && selected.length) {
var sortedSelected = selected.sort(function (a, b) {
return _this.getOrder(a) - _this.getOrder(b);
});
var rows = [];
var columns = 2;
for (var i = 0, l = sortedSelected.length; i < l; i += columns) {
rows.push(_this.getRow(selected, i, columns, classes));
}
return /*#__PURE__*/_react["default"].createElement("table", null, /*#__PURE__*/_react["default"].createElement("tbody", null, rows));
}
});
return _this;
}
(0, _createClass2["default"])(MenuFilter, [{
key: "render",
value: function render() {
var _this2 = this;
var _this$props = this.props,
selected = _this$props.selected,
classes = _this$props.classes,
filters = _this$props.filters,
title = _this$props.title;
var open = this.state.open;
var filterCount = open ? 0 : selected.length;
return /*#__PURE__*/_react["default"].createElement(_ListSubheader["default"], {
disableGutters: true,
className: classes.root
}, /*#__PURE__*/_react["default"].createElement(_ListItem["default"], {
button: true,
className: classes.header,
onClick: this.handleOpen
}, /*#__PURE__*/_react["default"].createElement(_ListItemText["default"], {
classes: {
primary: classes.text
},
primary: title
}), /*#__PURE__*/_react["default"].createElement(_MenuFilterIcon["default"], {
enabledFilterCount: filterCount,
open: open
})), /*#__PURE__*/_react["default"].createElement(_Collapse["default"], {
"in": !open && selected.length > 0,
timeout: "auto",
unmountOnExit: true
}, /*#__PURE__*/_react["default"].createElement(_Divider["default"], {
variant: "middle",
classes: {
middle: classes.divider
}
}), /*#__PURE__*/_react["default"].createElement("div", null, this.getChips(selected, classes))), /*#__PURE__*/_react["default"].createElement(_Collapse["default"], {
"in": open,
timeout: "auto",
unmountOnExit: true
}, /*#__PURE__*/_react["default"].createElement(_Divider["default"], {
variant: "middle",
classes: {
middle: classes.divider
}
}), /*#__PURE__*/_react["default"].createElement(_List["default"], {
component: "div",
disablePadding: true
}, filters.map(function (item, index) {
return /*#__PURE__*/_react["default"].createElement(_ListItem["default"], {
key: index,
button: true,
classes: {
root: classes.filterItemRoot
},
disabled: !_this2.isEnabled(item),
onClick: _this2.handleToggle(item)
}, /*#__PURE__*/_react["default"].createElement(_ListItemIcon["default"], {
classes: {
root: classes.listItemIconRoot
}
}, _this2.isChecked(item) ? /*#__PURE__*/_react["default"].createElement(_CheckBox["default"], {
className: classes.checkbox
}) : /*#__PURE__*/_react["default"].createElement(_CheckBoxOutlineBlank["default"], {
className: classes.checkbox
})), item.icon ? /*#__PURE__*/_react["default"].cloneElement(item.icon, {
style: {
color: '#ffffff',
fontSize: '22px'
}
}) : null, /*#__PURE__*/_react["default"].createElement(_ListItemText["default"], {
classes: {
primary: classes.filterText
},
primary: item.label
}));
}))));
}
}]);
return MenuFilter;
}(_react["default"].Component);
MenuFilter.propTypes = {
classes: _propTypes["default"].object.isRequired,
filters: _propTypes["default"].array.isRequired,
onToggle: _propTypes["default"].func.isRequired,
title: _propTypes["default"].string,
selected: _propTypes["default"].arrayOf(_propTypes["default"].object)
};
MenuFilter.defaultProps = {
selected: []
};
var _default = (0, _styles.withStyles)(styles)(MenuFilter);
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9Hcm91cGVkTWVudS9GaWx0ZXJlZE1lbnUvTWVudUZpbHRlci5qcyJdLCJuYW1lcyI6WyJzdHlsZXMiLCJyb290IiwiYmFja2dyb3VuZENvbG9yIiwiekluZGV4IiwiY29sb3IiLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSIsImZpbHRlckl0ZW1Sb290IiwibWluSGVpZ2h0IiwiZGl2aWRlciIsImJvcmRlckJvdHRvbSIsInRleHQiLCJmb250V2VpZ2h0IiwiZm9udFNpemUiLCJmaWx0ZXJUZXh0IiwiY2hlY2tib3giLCJjaGlwIiwibWFyZ2luIiwiY2hpcExhYmVsIiwiY2hpcERlbGV0ZUljb24iLCJob3ZlciIsImxpc3RJdGVtSWNvblJvb3QiLCJtaW5XaWR0aCIsIk1lbnVGaWx0ZXIiLCJvcGVuIiwic2V0U3RhdGUiLCJzdGF0ZSIsImZpbHRlciIsIm9uVG9nZ2xlIiwicHJvcHMiLCJzZWxlY3RlZCIsImkiLCJsZW4iLCJsZW5ndGgiLCJpZCIsImYiLCJkaXNhYmxlcyIsImluZGV4T2YiLCJvcmRlciIsImZpbHRlcnMiLCJsIiwiY2xhc3NlcyIsImxhYmVsIiwiZGVsZXRlSWNvbiIsImhhbmRsZVRvZ2dsZSIsInN0YXJ0IiwiY291bnQiLCJjaGlwcyIsInB1c2giLCJnZXRDaGlwIiwic29ydGVkU2VsZWN0ZWQiLCJzb3J0IiwiYSIsImIiLCJnZXRPcmRlciIsInJvd3MiLCJjb2x1bW5zIiwiZ2V0Um93IiwidGl0bGUiLCJmaWx0ZXJDb3VudCIsImhlYWRlciIsImhhbmRsZU9wZW4iLCJwcmltYXJ5IiwibWlkZGxlIiwiZ2V0Q2hpcHMiLCJtYXAiLCJpdGVtIiwiaW5kZXgiLCJpc0VuYWJsZWQiLCJpc0NoZWNrZWQiLCJpY29uIiwiUmVhY3QiLCJjbG9uZUVsZW1lbnQiLCJzdHlsZSIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJhcnJheSIsImZ1bmMiLCJzdHJpbmciLCJhcnJheU9mIiwiZGVmYXVsdFByb3BzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxNQUFNLEdBQUcsU0FBVEEsTUFBUztBQUFBLFNBQU87QUFDcEJDLElBQUFBLElBQUksRUFBRTtBQUNKQyxNQUFBQSxlQUFlLEVBQUUsU0FEYjtBQUVKQyxNQUFBQSxNQUFNLEVBQUUsRUFGSjtBQUdKQyxNQUFBQSxLQUFLLEVBQUUsU0FISDtBQUlKQyxNQUFBQSxVQUFVLEVBQUUsQ0FKUjtBQUtKQyxNQUFBQSxhQUFhLEVBQUU7QUFMWCxLQURjO0FBUXBCQyxJQUFBQSxjQUFjLEVBQUU7QUFDZEYsTUFBQUEsVUFBVSxFQUFFLENBREU7QUFFZEMsTUFBQUEsYUFBYSxFQUFFLENBRkQ7QUFHZEUsTUFBQUEsU0FBUyxFQUFFO0FBSEcsS0FSSTtBQWFwQkMsSUFBQUEsT0FBTyxFQUFFO0FBQUVDLE1BQUFBLFlBQVksRUFBRTtBQUFoQixLQWJXO0FBY3BCQyxJQUFBQSxJQUFJLEVBQUU7QUFDSlAsTUFBQUEsS0FBSyxFQUFFLFNBREg7QUFFSlEsTUFBQUEsVUFBVSxFQUFFLE1BRlI7QUFHSkMsTUFBQUEsUUFBUSxFQUFFO0FBSE4sS0FkYztBQW1CcEJDLElBQUFBLFVBQVUsRUFBRTtBQUNWVixNQUFBQSxLQUFLLEVBQUUsU0FERztBQUVWUSxNQUFBQSxVQUFVLEVBQUUsR0FGRjtBQUdWQyxNQUFBQSxRQUFRLEVBQUU7QUFIQSxLQW5CUTtBQXdCcEJFLElBQUFBLFFBQVEsRUFBRTtBQUFFWCxNQUFBQSxLQUFLLEVBQUUsU0FBVDtBQUFvQlMsTUFBQUEsUUFBUSxFQUFFO0FBQTlCLEtBeEJVO0FBeUJwQkcsSUFBQUEsSUFBSSxFQUFFO0FBQ0paLE1BQUFBLEtBQUssRUFBRSxTQURIO0FBRUphLE1BQUFBLE1BQU0sRUFBRTtBQUZKLEtBekJjO0FBNkJwQkMsSUFBQUEsU0FBUyxFQUFFO0FBQ1RMLE1BQUFBLFFBQVEsRUFBRSxFQUREO0FBRVRELE1BQUFBLFVBQVUsRUFBRTtBQUZILEtBN0JTO0FBaUNwQk8sSUFBQUEsY0FBYyxFQUFFO0FBQ2QsZUFBUyxXQURLO0FBRWQsaUJBQVc7QUFBRWYsUUFBQUEsS0FBSyxFQUFFO0FBQVQ7QUFGRyxLQWpDSTtBQXFDcEJnQixJQUFBQSxLQUFLLEVBQUUsRUFyQ2E7QUFzQ3BCQyxJQUFBQSxnQkFBZ0IsRUFBRTtBQUFFQyxNQUFBQSxRQUFRLEVBQUU7QUFBWjtBQXRDRSxHQUFQO0FBQUEsQ0FBZjtBQXlDQTs7Ozs7Ozs7OztJQVFNQyxVOzs7Ozs7Ozs7Ozs7Ozs7OEZBQ0k7QUFBRUMsTUFBQUEsSUFBSSxFQUFFO0FBQVIsSzttR0FLSyxZQUFNO0FBQ2pCLFlBQUtDLFFBQUwsQ0FBYyxVQUFBQyxLQUFLO0FBQUEsZUFBSztBQUFFRixVQUFBQSxJQUFJLEVBQUUsQ0FBQ0UsS0FBSyxDQUFDRjtBQUFmLFNBQUw7QUFBQSxPQUFuQjtBQUNELEs7cUdBTWMsVUFBQUcsTUFBTTtBQUFBLGFBQUksWUFBTTtBQUFBLFlBQ3JCQyxRQURxQixHQUNSLE1BQUtDLEtBREcsQ0FDckJELFFBRHFCO0FBRTdCQSxRQUFBQSxRQUFRLENBQUNELE1BQUQsQ0FBUjtBQUNELE9BSG9CO0FBQUEsSztrR0FVVCxVQUFBQSxNQUFNLEVBQUk7QUFBQSxVQUNaRyxRQURZLEdBQ0MsTUFBS0QsS0FETixDQUNaQyxRQURZOztBQUdwQixXQUFLLElBQUlDLENBQUMsR0FBRyxDQUFSLEVBQVdDLEdBQUcsR0FBR0YsUUFBUSxDQUFDRyxNQUEvQixFQUF1Q0YsQ0FBQyxHQUFHQyxHQUEzQyxFQUFnREQsQ0FBQyxFQUFqRCxFQUFxRDtBQUNuRCxZQUFJRCxRQUFRLENBQUNDLENBQUQsQ0FBUixDQUFZRyxFQUFaLEtBQW1CUCxNQUFNLENBQUNPLEVBQTlCLEVBQWtDO0FBQ2hDLGlCQUFPLElBQVA7QUFDRDtBQUNGOztBQUNELGFBQU8sS0FBUDtBQUNELEs7a0dBTVcsVUFBQVAsTUFBTSxFQUFJO0FBQUEsVUFDWkcsUUFEWSxHQUNDLE1BQUtELEtBRE4sQ0FDWkMsUUFEWTs7QUFBQSxpREFHSkEsUUFISTtBQUFBOztBQUFBO0FBR3BCLDREQUEwQjtBQUFBLGNBQWZLLENBQWU7O0FBQ3hCLGNBQUlBLENBQUMsQ0FBQ0MsUUFBRixDQUFXQyxPQUFYLENBQW1CVixNQUFNLENBQUNPLEVBQTFCLEtBQWlDLENBQXJDLEVBQXdDO0FBQ3RDLG1CQUFPLEtBQVA7QUFDRDtBQUNGO0FBUG1CO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBUXBCLGFBQU8sSUFBUDtBQUNELEs7aUdBRVUsVUFBQVAsTUFBTSxFQUFJO0FBQ25CLFVBQUksRUFBRUEsTUFBTSxDQUFDVyxLQUFQLEdBQWUsQ0FBakIsQ0FBSixFQUF5QjtBQUFFO0FBQUYsWUFDZkMsT0FEZSxHQUNILE1BQUtWLEtBREYsQ0FDZlUsT0FEZTtBQUV2QlosUUFBQUEsTUFBTSxDQUFDVyxLQUFQLEdBQWUsQ0FBQyxDQUFoQjs7QUFFQSxhQUFLLElBQUlQLENBQUMsR0FBRyxDQUFSLEVBQVdTLENBQUMsR0FBR0QsT0FBTyxDQUFDTixNQUE1QixFQUFvQ0YsQ0FBQyxHQUFHUyxDQUF4QyxFQUEyQ1QsQ0FBQyxFQUE1QyxFQUFnRDtBQUM5QyxjQUFNSSxDQUFDLEdBQUdJLE9BQU8sQ0FBQ1IsQ0FBRCxDQUFqQjs7QUFFQSxjQUFJSSxDQUFDLENBQUNELEVBQUYsS0FBU1AsTUFBTSxDQUFDTyxFQUFwQixFQUF3QjtBQUN0QlAsWUFBQUEsTUFBTSxDQUFDVyxLQUFQLEdBQWVQLENBQUMsR0FBRyxDQUFuQixDQURzQixDQUNBOztBQUN0QjtBQUNEO0FBQ0Y7QUFDRjs7QUFDRCxhQUFPSixNQUFNLENBQUNXLEtBQWQ7QUFDRCxLO2dHQVFTLFVBQUNYLE1BQUQsRUFBU2MsT0FBVDtBQUFBLDBCQUNSO0FBQUksUUFBQSxHQUFHLEVBQUUsYUFBYWQsTUFBTSxDQUFDTztBQUE3QixzQkFDRSxnQ0FBQyxnQkFBRDtBQUNFLFFBQUEsR0FBRyxFQUFFUCxNQUFNLENBQUNPLEVBRGQ7QUFFRSxRQUFBLEtBQUssRUFBRVAsTUFBTSxDQUFDZSxLQUZoQjtBQUdFLFFBQUEsT0FBTyxFQUFFO0FBQ1BDLFVBQUFBLFVBQVUsRUFBRUYsT0FBTyxDQUFDdEIsY0FEYjtBQUVQdUIsVUFBQUEsS0FBSyxFQUFFRCxPQUFPLENBQUN2QjtBQUZSLFNBSFg7QUFPRSxRQUFBLFFBQVEsRUFBRSxNQUFLMEIsWUFBTCxDQUFrQmpCLE1BQWxCLENBUFo7QUFRRSxRQUFBLFNBQVMsRUFBRWMsT0FBTyxDQUFDekI7QUFSckIsUUFERixDQURRO0FBQUEsSzsrRkFzQkQsVUFBQ2MsUUFBRCxFQUFXZSxLQUFYLEVBQWtCQyxLQUFsQixFQUF5QkwsT0FBekIsRUFBcUM7QUFDNUMsVUFBTU0sS0FBSyxHQUFHLEVBQWQ7O0FBRUEsV0FBSyxJQUFJaEIsQ0FBQyxHQUFHYyxLQUFSLEVBQWVMLENBQUMsR0FBR1YsUUFBUSxDQUFDRyxNQUFqQyxFQUEwQ0YsQ0FBQyxHQUFHUyxDQUFMLElBQVlULENBQUMsR0FBR2MsS0FBSyxHQUFHQyxLQUFqRSxFQUF5RWYsQ0FBQyxFQUExRSxFQUE4RTtBQUM1RWdCLFFBQUFBLEtBQUssQ0FBQ0MsSUFBTixDQUFXLE1BQUtDLE9BQUwsQ0FBYW5CLFFBQVEsQ0FBQ0MsQ0FBRCxDQUFyQixFQUEwQlUsT0FBMUIsQ0FBWDtBQUNEOztBQUNELDBCQUFTO0FBQUksUUFBQSxHQUFHLEVBQUUsYUFBYUk7QUFBdEIsU0FDTkUsS0FETSxDQUFUO0FBR0QsSztpR0FRVSxVQUFDakIsUUFBRCxFQUFXVyxPQUFYLEVBQXVCO0FBQ2hDLFVBQUlYLFFBQVEsSUFBSUEsUUFBUSxDQUFDRyxNQUF6QixFQUFpQztBQUMvQixZQUFNaUIsY0FBYyxHQUFHcEIsUUFBUSxDQUFDcUIsSUFBVCxDQUFjLFVBQUNDLENBQUQsRUFBSUMsQ0FBSjtBQUFBLGlCQUFXLE1BQUtDLFFBQUwsQ0FBY0YsQ0FBZCxJQUFtQixNQUFLRSxRQUFMLENBQWNELENBQWQsQ0FBOUI7QUFBQSxTQUFkLENBQXZCO0FBQ0EsWUFBTUUsSUFBSSxHQUFHLEVBQWI7QUFDQSxZQUFNQyxPQUFPLEdBQUcsQ0FBaEI7O0FBRUEsYUFBSyxJQUFJekIsQ0FBQyxHQUFHLENBQVIsRUFBV1MsQ0FBQyxHQUFHVSxjQUFjLENBQUNqQixNQUFuQyxFQUEyQ0YsQ0FBQyxHQUFHUyxDQUEvQyxFQUFrRFQsQ0FBQyxJQUFFeUIsT0FBckQsRUFBOEQ7QUFDNURELFVBQUFBLElBQUksQ0FBQ1AsSUFBTCxDQUFVLE1BQUtTLE1BQUwsQ0FBWTNCLFFBQVosRUFBc0JDLENBQXRCLEVBQXlCeUIsT0FBekIsRUFBa0NmLE9BQWxDLENBQVY7QUFDRDs7QUFDRCw0QkFBUSw0REFDTiwrQ0FBUWMsSUFBUixDQURNLENBQVI7QUFHRDtBQUNGLEs7Ozs7Ozs2QkFFUTtBQUFBOztBQUFBLHdCQUdILEtBQUsxQixLQUhGO0FBQUEsVUFFTEMsUUFGSyxlQUVMQSxRQUZLO0FBQUEsVUFFS1csT0FGTCxlQUVLQSxPQUZMO0FBQUEsVUFFY0YsT0FGZCxlQUVjQSxPQUZkO0FBQUEsVUFFdUJtQixLQUZ2QixlQUV1QkEsS0FGdkI7QUFBQSxVQUlDbEMsSUFKRCxHQUlVLEtBQUtFLEtBSmYsQ0FJQ0YsSUFKRDtBQU1QLFVBQU1tQyxXQUFXLEdBQUduQyxJQUFJLEdBQUcsQ0FBSCxHQUFPTSxRQUFRLENBQUNHLE1BQXhDO0FBRUEsMEJBQ0UsZ0NBQUMseUJBQUQ7QUFBZSxRQUFBLGNBQWMsTUFBN0I7QUFBOEIsUUFBQSxTQUFTLEVBQUVRLE9BQU8sQ0FBQ3hDO0FBQWpELHNCQUNFLGdDQUFDLG9CQUFEO0FBQVUsUUFBQSxNQUFNLE1BQWhCO0FBQWlCLFFBQUEsU0FBUyxFQUFFd0MsT0FBTyxDQUFDbUIsTUFBcEM7QUFBNEMsUUFBQSxPQUFPLEVBQUUsS0FBS0M7QUFBMUQsc0JBQ0UsZ0NBQUMsd0JBQUQ7QUFDRSxRQUFBLE9BQU8sRUFBRTtBQUFFQyxVQUFBQSxPQUFPLEVBQUVyQixPQUFPLENBQUM5QjtBQUFuQixTQURYO0FBRUUsUUFBQSxPQUFPLEVBQUUrQztBQUZYLFFBREYsZUFLRSxnQ0FBQywwQkFBRDtBQUFnQixRQUFBLGtCQUFrQixFQUFFQyxXQUFwQztBQUFpRCxRQUFBLElBQUksRUFBRW5DO0FBQXZELFFBTEYsQ0FERixlQVFFLGdDQUFDLG9CQUFEO0FBQ0UsY0FBSSxDQUFDQSxJQUFELElBQVNNLFFBQVEsQ0FBQ0csTUFBVCxHQUFrQixDQURqQztBQUVFLFFBQUEsT0FBTyxFQUFDLE1BRlY7QUFHRSxRQUFBLGFBQWE7QUFIZixzQkFLRSxnQ0FBQyxtQkFBRDtBQUFTLFFBQUEsT0FBTyxFQUFDLFFBQWpCO0FBQTBCLFFBQUEsT0FBTyxFQUFFO0FBQUU4QixVQUFBQSxNQUFNLEVBQUV0QixPQUFPLENBQUNoQztBQUFsQjtBQUFuQyxRQUxGLGVBTUUsNkNBQ0csS0FBS3VELFFBQUwsQ0FBY2xDLFFBQWQsRUFBd0JXLE9BQXhCLENBREgsQ0FORixDQVJGLGVBa0JFLGdDQUFDLG9CQUFEO0FBQVUsY0FBSWpCLElBQWQ7QUFBb0IsUUFBQSxPQUFPLEVBQUMsTUFBNUI7QUFBbUMsUUFBQSxhQUFhO0FBQWhELHNCQUNFLGdDQUFDLG1CQUFEO0FBQVMsUUFBQSxPQUFPLEVBQUMsUUFBakI7QUFBMEIsUUFBQSxPQUFPLEVBQUU7QUFBRXVDLFVBQUFBLE1BQU0sRUFBRXRCLE9BQU8sQ0FBQ2hDO0FBQWxCO0FBQW5DLFFBREYsZUFFRSxnQ0FBQyxnQkFBRDtBQUFNLFFBQUEsU0FBUyxFQUFDLEtBQWhCO0FBQXNCLFFBQUEsY0FBYztBQUFwQyxTQUNHOEIsT0FBTyxDQUFDMEIsR0FBUixDQUFZLFVBQUNDLElBQUQsRUFBT0MsS0FBUDtBQUFBLDRCQUNYLGdDQUFDLG9CQUFEO0FBQ0UsVUFBQSxHQUFHLEVBQUVBLEtBRFA7QUFFRSxVQUFBLE1BQU0sTUFGUjtBQUdFLFVBQUEsT0FBTyxFQUFFO0FBQUVsRSxZQUFBQSxJQUFJLEVBQUV3QyxPQUFPLENBQUNsQztBQUFoQixXQUhYO0FBSUUsVUFBQSxRQUFRLEVBQUUsQ0FBQyxNQUFJLENBQUM2RCxTQUFMLENBQWVGLElBQWYsQ0FKYjtBQUtFLFVBQUEsT0FBTyxFQUFFLE1BQUksQ0FBQ3RCLFlBQUwsQ0FBa0JzQixJQUFsQjtBQUxYLHdCQU9FLGdDQUFDLHdCQUFEO0FBQWMsVUFBQSxPQUFPLEVBQUU7QUFBRWpFLFlBQUFBLElBQUksRUFBRXdDLE9BQU8sQ0FBQ3BCO0FBQWhCO0FBQXZCLFdBQ0csTUFBSSxDQUFDZ0QsU0FBTCxDQUFlSCxJQUFmLGlCQUNDLGdDQUFDLG9CQUFEO0FBQWMsVUFBQSxTQUFTLEVBQUV6QixPQUFPLENBQUMxQjtBQUFqQyxVQURELGdCQUdDLGdDQUFDLGdDQUFEO0FBQXFCLFVBQUEsU0FBUyxFQUFFMEIsT0FBTyxDQUFDMUI7QUFBeEMsVUFKSixDQVBGLEVBY0dtRCxJQUFJLENBQUNJLElBQUwsZ0JBQ0dDLGtCQUFNQyxZQUFOLENBQW1CTixJQUFJLENBQUNJLElBQXhCLEVBQThCO0FBQUVHLFVBQUFBLEtBQUssRUFBRTtBQUFFckUsWUFBQUEsS0FBSyxFQUFFLFNBQVQ7QUFBb0JTLFlBQUFBLFFBQVEsRUFBRTtBQUE5QjtBQUFULFNBQTlCLENBREgsR0FFRyxJQWhCTixlQWlCRSxnQ0FBQyx3QkFBRDtBQUNFLFVBQUEsT0FBTyxFQUFFO0FBQUVpRCxZQUFBQSxPQUFPLEVBQUVyQixPQUFPLENBQUMzQjtBQUFuQixXQURYO0FBRUUsVUFBQSxPQUFPLEVBQUVvRCxJQUFJLENBQUN4QjtBQUZoQixVQWpCRixDQURXO0FBQUEsT0FBWixDQURILENBRkYsQ0FsQkYsQ0FERjtBQWtERDs7O0VBekxzQjZCLGtCQUFNRyxTOztBQTRML0JuRCxVQUFVLENBQUNvRCxTQUFYLEdBQXVCO0FBQ3JCbEMsRUFBQUEsT0FBTyxFQUFFbUMsc0JBQVVDLE1BQVYsQ0FBaUJDLFVBREw7QUFFckJ2QyxFQUFBQSxPQUFPLEVBQUVxQyxzQkFBVUcsS0FBVixDQUFnQkQsVUFGSjtBQUdyQmxELEVBQUFBLFFBQVEsRUFBRWdELHNCQUFVSSxJQUFWLENBQWVGLFVBSEo7QUFJckJwQixFQUFBQSxLQUFLLEVBQUVrQixzQkFBVUssTUFKSTtBQUtyQm5ELEVBQUFBLFFBQVEsRUFBRThDLHNCQUFVTSxPQUFWLENBQWtCTixzQkFBVUMsTUFBNUI7QUFMVyxDQUF2QjtBQU9BdEQsVUFBVSxDQUFDNEQsWUFBWCxHQUEwQjtBQUFFckQsRUFBQUEsUUFBUSxFQUFFO0FBQVosQ0FBMUI7O2VBRWUsd0JBQVc5QixNQUFYLEVBQW1CdUIsVUFBbkIsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgd2l0aFN0eWxlcyB9IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL3N0eWxlcyc7XG5pbXBvcnQgTGlzdCBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9MaXN0JztcbmltcG9ydCBDb2xsYXBzZSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9Db2xsYXBzZSc7XG5pbXBvcnQgTGlzdEl0ZW0gZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvTGlzdEl0ZW0nO1xuaW1wb3J0IExpc3RTdWJoZWFkZXIgZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvTGlzdFN1YmhlYWRlcic7XG5pbXBvcnQgTGlzdEl0ZW1JY29uIGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL0xpc3RJdGVtSWNvbic7XG5pbXBvcnQgRGl2aWRlciBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9EaXZpZGVyJztcbmltcG9ydCBDaGVja0JveE91dGxpbmVJY29uIGZyb20gJ0BtYXRlcmlhbC11aS9pY29ucy9DaGVja0JveE91dGxpbmVCbGFuayc7XG5pbXBvcnQgQ2hlY2tCb3hJY29uIGZyb20gJ0BtYXRlcmlhbC11aS9pY29ucy9DaGVja0JveCc7XG5pbXBvcnQgTGlzdEl0ZW1UZXh0IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL0xpc3RJdGVtVGV4dCc7XG5pbXBvcnQgQ2hpcCBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9DaGlwJztcbmltcG9ydCBNZW51RmlsdGVySWNvbiBmcm9tICcuL01lbnVGaWx0ZXJJY29uJztcblxuY29uc3Qgc3R5bGVzID0gKCkgPT4gKHtcbiAgcm9vdDoge1xuICAgIGJhY2tncm91bmRDb2xvcjogJyMxOTU3OUUnLFxuICAgIHpJbmRleDogMTAsXG4gICAgY29sb3I6ICcjRkZGRkZGJyxcbiAgICBwYWRkaW5nVG9wOiA1LFxuICAgIHBhZGRpbmdCb3R0b206IDUsXG4gIH0sXG4gIGZpbHRlckl0ZW1Sb290OiB7XG4gICAgcGFkZGluZ1RvcDogNCxcbiAgICBwYWRkaW5nQm90dG9tOiA0LFxuICAgIG1pbkhlaWdodDogJ2F1dG8nLFxuICB9LFxuICBkaXZpZGVyOiB7IGJvcmRlckJvdHRvbTogJ3NvbGlkIDFweCAjRkZGRkZGOWUnIH0sXG4gIHRleHQ6IHtcbiAgICBjb2xvcjogJyNGRkZGRkYnLFxuICAgIGZvbnRXZWlnaHQ6ICdib2xkJyxcbiAgICBmb250U2l6ZTogMTYsXG4gIH0sXG4gIGZpbHRlclRleHQ6IHtcbiAgICBjb2xvcjogJyNGRkZGRkYnLFxuICAgIGZvbnRXZWlnaHQ6IDcwMCxcbiAgICBmb250U2l6ZTogMTQsXG4gIH0sXG4gIGNoZWNrYm94OiB7IGNvbG9yOiAnI0ZGRkZGRicsIGZvbnRTaXplOiAnMjJweCcgfSxcbiAgY2hpcDoge1xuICAgIGNvbG9yOiAnIzE5NTc5RScsXG4gICAgbWFyZ2luOiA1LFxuICB9LFxuICBjaGlwTGFiZWw6IHtcbiAgICBmb250U2l6ZTogMTIsXG4gICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICB9LFxuICBjaGlwRGVsZXRlSWNvbjoge1xuICAgICdjb2xvcic6ICcjMTk1NzlFOTknLFxuICAgICcmOmhvdmVyJzogeyBjb2xvcjogJyMxOTU3OUUnIH0sXG4gIH0sXG4gIGhvdmVyOiB7fSxcbiAgbGlzdEl0ZW1JY29uUm9vdDogeyBtaW5XaWR0aDogJzBweCcgfSxcbn0pO1xuXG4vKipcbiAqIEEgbGlzdCBvZiBmaWx0ZXIgY29udHJvbHNcbiAqIEBwYXJhbSB7b2JqZWN0W119IGZpbHRlcnMgLSBhbiBhcnJheSBvZiBmaWx0ZXJzXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBvblRvZ2dsZSAtIGNhbGxiYWNrIHRvIHJlY2VpdmUgZmlsdGVyIGV2ZW50c1xuICogQHBhcmFtIHtzdHJpbmd9IFt0aXRsZV0gLSB0aGUgbWVudSB0aXRsZVxuICogQHBhcmFtIHtvYmplY3RbXX0gW3NlbGVjdGVkXSAtIGFuIGFycmF5IG9mIHNlbGVjdGVkIGZpbHRlcnNcbiAqXG4gKi9cbmNsYXNzIE1lbnVGaWx0ZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0ZSA9IHsgb3BlbjogZmFsc2UgfTtcblxuICAvKipcbiAgICogSGFuZGxlcyBvcGVuaW5nIHRoZSBmaWx0ZXIgbWVudVxuICAgKi9cbiAgaGFuZGxlT3BlbiA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHN0YXRlID0+ICh7IG9wZW46ICFzdGF0ZS5vcGVuIH0pKTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlcyB0b2dnbGluZyBhIGZpbHRlclxuICAgKiBAcGFyYW0ge29iamVjdH0gZmlsdGVyIC0gdGhlIGZpbHRlciBiZWluZyB0b2dnbGVkXG4gICAqL1xuICBoYW5kbGVUb2dnbGUgPSBmaWx0ZXIgPT4gKCkgPT4ge1xuICAgIGNvbnN0IHsgb25Ub2dnbGUgfSA9IHRoaXMucHJvcHM7XG4gICAgb25Ub2dnbGUoZmlsdGVyKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBmaWx0ZXIgaXMgc2VsZWN0ZWRcbiAgICogQHBhcmFtIHtvYmplY3R9IGZpbHRlciAtIHRoZSBmaWx0ZXIgYmVpbmcgaW5zcGVjdGVkXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGZpbHRlciBpcyBzZWxlY3RlZFxuICAgKi9cbiAgaXNDaGVja2VkID0gZmlsdGVyID0+IHtcbiAgICBjb25zdCB7IHNlbGVjdGVkIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHNlbGVjdGVkLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBpZiAoc2VsZWN0ZWRbaV0uaWQgPT09IGZpbHRlci5pZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBmaWx0ZXIgaXMgZW5hYmxlZFxuICAgKiBAcGFyYW0ge29iamVjdH0gZmlsdGVyIC0gdGhlIGZpbHRlclxuICAgKi9cbiAgaXNFbmFibGVkID0gZmlsdGVyID0+IHtcbiAgICBjb25zdCB7IHNlbGVjdGVkIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgZm9yIChjb25zdCBmIG9mIHNlbGVjdGVkKSB7XG4gICAgICBpZiAoZi5kaXNhYmxlcy5pbmRleE9mKGZpbHRlci5pZCkgPj0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIGdldE9yZGVyID0gZmlsdGVyID0+IHtcbiAgICBpZiAoIShmaWx0ZXIub3JkZXIgPiAwKSkgeyAvLyBpZiBvcmRlciBub3QgZGVmaW5lZCBvciBpbnZhbGlkLCBzZXQgaXRcbiAgICAgIGNvbnN0IHsgZmlsdGVycyB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGZpbHRlci5vcmRlciA9IC0xO1xuXG4gICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGYgPSBmaWx0ZXJzW2ldO1xuXG4gICAgICAgIGlmIChmLmlkID09PSBmaWx0ZXIuaWQpIHtcbiAgICAgICAgICBmaWx0ZXIub3JkZXIgPSBpICsgMTsgLy8gY2FjaGUgb3JkZXIgb2YgZmlsdGVyXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlci5vcmRlcjtcbiAgfTtcblxuICAvKipcbiAgICogY3JlYXRlIGEgY2hpcCBpbiBhIHRhYmxlIGVsZW1lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IGZpbHRlciAtIHRvIGNyZWF0ZSBjaGlwIGZvclxuICAgKiBAcGFyYW0ge09iamVjdH0gY2xhc3NlcyAtIHRvIGFwcGx5IHRvIGZpbHRlclxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0Q2hpcCA9IChmaWx0ZXIsIGNsYXNzZXMpID0+IChcbiAgICA8dGQga2V5PXsnY2hpcF90ZF8nICsgZmlsdGVyLmlkfT5cbiAgICAgIDxDaGlwXG4gICAgICAgIGtleT17ZmlsdGVyLmlkfVxuICAgICAgICBsYWJlbD17ZmlsdGVyLmxhYmVsfVxuICAgICAgICBjbGFzc2VzPXt7XG4gICAgICAgICAgZGVsZXRlSWNvbjogY2xhc3Nlcy5jaGlwRGVsZXRlSWNvbixcbiAgICAgICAgICBsYWJlbDogY2xhc3Nlcy5jaGlwTGFiZWwsXG4gICAgICAgIH19XG4gICAgICAgIG9uRGVsZXRlPXt0aGlzLmhhbmRsZVRvZ2dsZShmaWx0ZXIpfVxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMuY2hpcH1cbiAgICAgIC8+XG4gICAgPC90ZD4pO1xuXG4gIC8qKlxuICAgKiBnZXQgYSBzaW5nbGUgdGFibGUgcm93XG4gICAqIEBwYXJhbSB7QXJyYXl9IHNlbGVjdGVkIC0gYXJyYXkgb2YgZmlsdGVyc1xuICAgKiBAcGFyYW0ge051bWJlcn0gc3RhcnQgLSBmaWx0ZXIgbnVtYmVyIGZvciBzdGFydCBvZiByb3dcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IC0gbnVtYmVyIG9mIGl0ZW1zIGluIGEgcm93XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjbGFzc2VzIC0gdG8gYXBwbHkgdG8gZmlsdGVyXG4gICAqIEByZXR1cm4geyp9IHRhYmxlIHJvd1xuICAgKi9cbiAgZ2V0Um93ID0gKHNlbGVjdGVkLCBzdGFydCwgY291bnQsIGNsYXNzZXMpID0+IHtcbiAgICBjb25zdCBjaGlwcyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0LCBsID0gc2VsZWN0ZWQubGVuZ3RoOyAoaSA8IGwpICYmIChpIDwgc3RhcnQgKyBjb3VudCk7IGkrKykge1xuICAgICAgY2hpcHMucHVzaCh0aGlzLmdldENoaXAoc2VsZWN0ZWRbaV0sIGNsYXNzZXMpKTtcbiAgICB9XG4gICAgcmV0dXJuICggPHRyIGtleT17J2NoaXBfdHJfJyArIHN0YXJ0fT5cbiAgICAgIHtjaGlwc31cbiAgICA8L3RyPiApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBnZXQgYWxsIHRoZSBjaGlwcyBzb3J0IHRoZW0gYW5kIGZvcm1hdCBpbiBhIHRhYmxlXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNlbGVjdGVkIC0gYXJyYXkgb2YgZmlsdGVyc1xuICAgKiBAcGFyYW0ge09iamVjdH0gY2xhc3NlcyAtIHRvIGFwcGx5IHRvIGZpbHRlclxuICAgKiBAcmV0dXJuIHsqfSB0YWJsZVxuICAgKi9cbiAgZ2V0Q2hpcHMgPSAoc2VsZWN0ZWQsIGNsYXNzZXMpID0+IHtcbiAgICBpZiAoc2VsZWN0ZWQgJiYgc2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICBjb25zdCBzb3J0ZWRTZWxlY3RlZCA9IHNlbGVjdGVkLnNvcnQoKGEsIGIpID0+ICh0aGlzLmdldE9yZGVyKGEpIC0gdGhpcy5nZXRPcmRlcihiKSkpO1xuICAgICAgY29uc3Qgcm93cyA9IFtdO1xuICAgICAgY29uc3QgY29sdW1ucyA9IDI7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gc29ydGVkU2VsZWN0ZWQubGVuZ3RoOyBpIDwgbDsgaSs9Y29sdW1ucykge1xuICAgICAgICByb3dzLnB1c2godGhpcy5nZXRSb3coc2VsZWN0ZWQsIGksIGNvbHVtbnMsIGNsYXNzZXMpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoPHRhYmxlPlxuICAgICAgICA8dGJvZHk+e3Jvd3N9PC90Ym9keT5cbiAgICAgIDwvdGFibGU+KTtcbiAgICB9XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHNlbGVjdGVkLCBjbGFzc2VzLCBmaWx0ZXJzLCB0aXRsZSxcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IG9wZW4gfSA9IHRoaXMuc3RhdGU7XG5cbiAgICBjb25zdCBmaWx0ZXJDb3VudCA9IG9wZW4gPyAwIDogc2VsZWN0ZWQubGVuZ3RoO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxMaXN0U3ViaGVhZGVyIGRpc2FibGVHdXR0ZXJzIGNsYXNzTmFtZT17Y2xhc3Nlcy5yb290fT5cbiAgICAgICAgPExpc3RJdGVtIGJ1dHRvbiBjbGFzc05hbWU9e2NsYXNzZXMuaGVhZGVyfSBvbkNsaWNrPXt0aGlzLmhhbmRsZU9wZW59PlxuICAgICAgICAgIDxMaXN0SXRlbVRleHRcbiAgICAgICAgICAgIGNsYXNzZXM9e3sgcHJpbWFyeTogY2xhc3Nlcy50ZXh0IH19XG4gICAgICAgICAgICBwcmltYXJ5PXt0aXRsZX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxNZW51RmlsdGVySWNvbiBlbmFibGVkRmlsdGVyQ291bnQ9e2ZpbHRlckNvdW50fSBvcGVuPXtvcGVufS8+XG4gICAgICAgIDwvTGlzdEl0ZW0+XG4gICAgICAgIDxDb2xsYXBzZVxuICAgICAgICAgIGluPXshb3BlbiAmJiBzZWxlY3RlZC5sZW5ndGggPiAwfVxuICAgICAgICAgIHRpbWVvdXQ9XCJhdXRvXCJcbiAgICAgICAgICB1bm1vdW50T25FeGl0XG4gICAgICAgID5cbiAgICAgICAgICA8RGl2aWRlciB2YXJpYW50PVwibWlkZGxlXCIgY2xhc3Nlcz17eyBtaWRkbGU6IGNsYXNzZXMuZGl2aWRlciB9fS8+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIHt0aGlzLmdldENoaXBzKHNlbGVjdGVkLCBjbGFzc2VzKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9Db2xsYXBzZT5cbiAgICAgICAgPENvbGxhcHNlIGluPXtvcGVufSB0aW1lb3V0PVwiYXV0b1wiIHVubW91bnRPbkV4aXQ+XG4gICAgICAgICAgPERpdmlkZXIgdmFyaWFudD1cIm1pZGRsZVwiIGNsYXNzZXM9e3sgbWlkZGxlOiBjbGFzc2VzLmRpdmlkZXIgfX0vPlxuICAgICAgICAgIDxMaXN0IGNvbXBvbmVudD1cImRpdlwiIGRpc2FibGVQYWRkaW5nPlxuICAgICAgICAgICAge2ZpbHRlcnMubWFwKChpdGVtLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICA8TGlzdEl0ZW1cbiAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgIGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzZXM9e3sgcm9vdDogY2xhc3Nlcy5maWx0ZXJJdGVtUm9vdCB9fVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXshdGhpcy5pc0VuYWJsZWQoaXRlbSl9XG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVUb2dnbGUoaXRlbSl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8TGlzdEl0ZW1JY29uIGNsYXNzZXM9e3sgcm9vdDogY2xhc3Nlcy5saXN0SXRlbUljb25Sb290IH19PlxuICAgICAgICAgICAgICAgICAge3RoaXMuaXNDaGVja2VkKGl0ZW0pID8gKFxuICAgICAgICAgICAgICAgICAgICA8Q2hlY2tCb3hJY29uIGNsYXNzTmFtZT17Y2xhc3Nlcy5jaGVja2JveH0vPlxuICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgPENoZWNrQm94T3V0bGluZUljb24gY2xhc3NOYW1lPXtjbGFzc2VzLmNoZWNrYm94fS8+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvTGlzdEl0ZW1JY29uPlxuICAgICAgICAgICAgICAgIHtpdGVtLmljb25cbiAgICAgICAgICAgICAgICAgID8gUmVhY3QuY2xvbmVFbGVtZW50KGl0ZW0uaWNvbiwgeyBzdHlsZTogeyBjb2xvcjogJyNmZmZmZmYnLCBmb250U2l6ZTogJzIycHgnIH0gfSlcbiAgICAgICAgICAgICAgICAgIDogbnVsbH1cbiAgICAgICAgICAgICAgICA8TGlzdEl0ZW1UZXh0XG4gICAgICAgICAgICAgICAgICBjbGFzc2VzPXt7IHByaW1hcnk6IGNsYXNzZXMuZmlsdGVyVGV4dCB9fVxuICAgICAgICAgICAgICAgICAgcHJpbWFyeT17aXRlbS5sYWJlbH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L0xpc3RJdGVtPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9MaXN0PlxuICAgICAgICA8L0NvbGxhcHNlPlxuICAgICAgPC9MaXN0U3ViaGVhZGVyPlxuICAgICk7XG4gIH1cbn1cblxuTWVudUZpbHRlci5wcm9wVHlwZXMgPSB7XG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgZmlsdGVyczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gIG9uVG9nZ2xlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICB0aXRsZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgc2VsZWN0ZWQ6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxufTtcbk1lbnVGaWx0ZXIuZGVmYXVsdFByb3BzID0geyBzZWxlY3RlZDogW10gfTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMpKE1lbnVGaWx0ZXIpO1xuIl19