UNPKG

tc-ui-toolkit

Version:

React components used to develop tools for the desktop app translationCore

345 lines (290 loc) 33.4 kB
"use strict"; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9Hcm91cGVkTWVudS9GaWx0ZXJlZE1lbnUvTWVudUZpbHRlci5qcyJdLCJuYW1lcyI6WyJzdHlsZXMiLCJyb290IiwiYmFja2dyb3VuZENvbG9yIiwiekluZGV4IiwiY29sb3IiLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSIsImZpbHRlckl0ZW1Sb290IiwibWluSGVpZ2h0IiwiZGl2aWRlciIsImJvcmRlckJvdHRvbSIsInRleHQiLCJmb250V2VpZ2h0IiwiZm9udFNpemUiLCJmaWx0ZXJUZXh0IiwiY2hlY2tib3giLCJjaGlwIiwibWFyZ2luIiwiY2hpcExhYmVsIiwiY2hpcERlbGV0ZUljb24iLCJob3ZlciIsImxpc3RJdGVtSWNvblJvb3QiLCJtaW5XaWR0aCIsIk1lbnVGaWx0ZXIiLCJvcGVuIiwic2V0U3RhdGUiLCJzdGF0ZSIsImZpbHRlciIsIm9uVG9nZ2xlIiwicHJvcHMiLCJzZWxlY3RlZCIsImkiLCJsZW4iLCJsZW5ndGgiLCJpZCIsImYiLCJkaXNhYmxlcyIsImluZGV4T2YiLCJvcmRlciIsImZpbHRlcnMiLCJsIiwiY2xhc3NlcyIsImxhYmVsIiwiZGVsZXRlSWNvbiIsImhhbmRsZVRvZ2dsZSIsInN0YXJ0IiwiY291bnQiLCJjaGlwcyIsInB1c2giLCJnZXRDaGlwIiwic29ydGVkU2VsZWN0ZWQiLCJzb3J0IiwiYSIsImIiLCJnZXRPcmRlciIsInJvd3MiLCJjb2x1bW5zIiwiZ2V0Um93IiwidGl0bGUiLCJmaWx0ZXJDb3VudCIsImhlYWRlciIsImhhbmRsZU9wZW4iLCJwcmltYXJ5IiwibWlkZGxlIiwiZ2V0Q2hpcHMiLCJtYXAiLCJpdGVtIiwiaW5kZXgiLCJpc0VuYWJsZWQiLCJpc0NoZWNrZWQiLCJpY29uIiwiUmVhY3QiLCJjbG9uZUVsZW1lbnQiLCJzdHlsZSIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsIm9iamVjdCIsImlzUmVxdWlyZWQiLCJhcnJheSIsImZ1bmMiLCJzdHJp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SEo7QUFJckJwQixFQUFBQSxLQUFLLEVBQUVrQixzQkFBVUssTUFKSTtBQUtyQm5ELEVBQUFBLFFBQVEsRUFBRThDLHNCQUFVTSxPQUFWLENBQWtCTixzQkFBVUMsTUFBNUI7QUFMVyxDQUF2QjtBQU9BdEQsVUFBVSxDQUFDNEQsWUFBWCxHQUEwQjtBQUFFckQsRUFBQUEsUUFBUSxFQUFFO0FBQVosQ0FBMUI7O2VBRWUsd0JBQVc5QixNQUFYLEVBQW1CdUIsVUFBbkIsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgd2l0aFN0eWxlcyB9IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL3N0eWxlcyc7XG5pbXBvcnQgTGlzdCBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9MaXN0JztcbmltcG9ydCBDb2xsYXBzZSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9Db2xsYXBzZSc7XG5pbXBvcnQgTGlzdEl0ZW0gZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvTGlzdEl0ZW0nO1xuaW1wb3J0IExpc3RTdWJoZWFkZXIgZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvTGlzdFN1YmhlYWRlcic7XG5pbXBvcnQgTGlzdEl0ZW1JY29uIGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL0xpc3RJdGVtSWNvbic7XG5pbXBvcnQgRGl2aWRlciBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9EaXZpZGVyJztcbmltcG9ydCBDaGVja0JveE91dGxpbmVJY29uIGZyb20gJ0BtYXRlcmlhbC11aS9pY29ucy9DaGVja0JveE91dGxpbmVCbGFuayc7XG5pbXBvcnQgQ2hlY2tCb3hJY29uIGZyb20gJ0BtYXRlcmlhbC11aS9pY29ucy9DaGVja0JveCc7XG5pbXBvcnQgTGlzdEl0ZW1UZXh0IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL0xpc3RJdGVtVGV4dCc7XG5pbXBvcnQgQ2hpcCBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9DaGlwJztcbmltcG9ydCBNZW51RmlsdGVySWNvbiBmcm9tICcuL01lbnVGaWx0ZXJJY29uJztcblxuY29uc3Qgc3R5bGVzID0gKCkgPT4gKHtcbiAgcm9vdDoge1xuICAgIGJhY2tncm91bmRDb2xvcjogJyMxOTU3OUUnLFxuICAgIHpJbmRleDogMTAsXG4gICAgY29sb3I6ICcjRkZGRkZGJyxcbiAgICBwYWRkaW5nVG9wOiA1LFxuICAgIHBhZGRpbmdCb3R0b206IDUsXG4gIH0sXG4gIGZpbHRlckl0ZW1Sb290OiB7XG4gICAgcGFkZGluZ1RvcDogNCxcbiAgICBwYWRkaW5nQm90dG9tOiA0LFxuICAgIG1pbkhlaWdodDogJ2F1dG8nLFxuICB9LFxuICBkaXZpZGVyOiB7IGJvcmRlckJvdHRvbTogJ3NvbGlkIDFweCAjRkZGRkZGOWUnIH0sXG4gIHRleHQ6IHtcbiAgICBjb2xvcjogJyNGRkZGRkYnLFxuICAgIGZvbnRXZWlnaHQ6ICdib2xkJyxcbiAgICBmb250U2l6ZTogMTYsXG4gIH0sXG4gIGZpbHRlclRleHQ6IHtcbiAgICBjb2xvcjogJyNGRkZGRkYnLFxuICAgIGZvbnRXZWlnaHQ6IDcwMCxcbiAgICBmb250U2l6ZTogMTQsXG4gIH0sXG4gIGNoZWNrYm94OiB7IGNvbG9yOiAnI0ZGRkZGRicsIGZvbnRTaXplOiAnMjJweCcgfSxcbiAgY2hpcDoge1xuICAgIGNvbG9yOiAnIzE5NTc5RScsXG4gICAgbWFyZ2luOiA1LFxuICB9LFxuICBjaGlwTGFiZWw6IHtcbiAgICBmb250U2l6ZTogMTIsXG4gICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICB9LFxuICBjaGlwRGVsZXRlSWNvbjoge1xuICAgICdjb2xvcic6ICcjMTk1NzlFOTknLFxuICAgICcmOmhvdmVyJzogeyBjb2xvcjogJyMxOTU3OUUnIH0sXG4gIH0sXG4gIGhvdmVyOiB7fSxcbiAgbGlzdEl0ZW1JY29uUm9vdDogeyBtaW5XaWR0aDogJzBweCcgfSxcbn0pO1xuXG4vKipcbiAqIEEgbGlzdCBvZiBmaWx0ZXIgY29udHJvbHNcbiAqIEBwYXJhbSB7b2JqZWN0W119IGZpbHRlcnMgLSBhbiBhcnJheSBvZiBmaWx0ZXJzXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBvblRvZ2dsZSAtIGNhbGxiYWNrIHRvIHJlY2VpdmUgZmlsdGVyIGV2ZW50c1xuICogQHBhcmFtIHtzdHJpbmd9IFt0aXRsZV0gLSB0aGUgbWVudSB0aXRsZVxuICogQHBhcmFtIHtvYmplY3RbXX0gW3NlbGVjdGVkXSAtIGFuIGFycmF5IG9mIHNlbGVjdGVkIGZpbHRlcnNcbiAqXG4gKi9cbmNsYXNzIE1lbnVGaWx0ZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0ZSA9IHsgb3BlbjogZmFsc2UgfTtcblxuICAvKipcbiAgICogSGFuZGxlcyBvcGVuaW5nIHRoZSBmaWx0ZXIgbWVudVxuICAgKi9cbiAgaGFuZGxlT3BlbiA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHN0YXRlID0+ICh7IG9wZW46ICFzdGF0ZS5vcGVuIH0pKTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlcyB0b2dnbGluZyBhIGZpbHRlclxuICAgKiBAcGFyYW0ge29iamVjdH0gZmlsdGVyIC0gdGhlIGZpbHRlciBiZWluZyB0b2dnbGVkXG4gICAqL1xuICBoYW5kbGVUb2dnbGUgPSBmaWx0ZXIgPT4gKCkgPT4ge1xuICAgIGNvbnN0IHsgb25Ub2dnbGUgfSA9IHRoaXMucHJvcHM7XG4gICAgb25Ub2dnbGUoZmlsdGVyKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBmaWx0ZXIgaXMgc2VsZWN0ZWRcbiAgICogQHBhcmFtIHtvYmplY3R9IGZpbHRlciAtIHRoZSBmaWx0ZXIgYmVpbmcgaW5zcGVjdGVkXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGZpbHRlciBpcyBzZWxlY3RlZFxuICAgKi9cbiAgaXNDaGVja2VkID0gZmlsdGVyID0+IHtcbiAgICBjb25zdCB7IHNlbGVjdGVkIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHNlbGVjdGVkLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBpZiAoc2VsZWN0ZWRbaV0uaWQgPT09IGZpbHRlci5pZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBmaWx0ZXIgaXMgZW5hYmxlZFxuICAgKiBAcGFyYW0ge29iamVjdH0gZmlsdGVyIC0gdGhlIGZpbHRlclxuICAgKi9cbiAgaXNFbmFibGVkID0gZmlsdGVyID0+IHtcbiAgICBjb25zdCB7IHNlbGVjdGVkIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgZm9yIChjb25zdCBmIG9mIHNlbGVjdGVkKSB7XG4gICAgICBpZiAoZi5kaXNhYmxlcy5pbmRleE9mKGZpbHRlci5pZCkgPj0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIGdldE9yZGVyID0gZmlsdGVyID0+IHtcbiAgICBpZiAoIShmaWx0ZXIub3JkZXIgPiAwKSkgeyAvLyBpZiBvcmRlciBub3QgZGVmaW5lZCBvciBpbnZhbGlkLCBzZXQgaXRcbiAgICAgIGNvbnN0IHsgZmlsdGVycyB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGZpbHRlci5vcmRlciA9IC0xO1xuXG4gICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGZpbHRlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGYgPSBmaWx0ZXJzW2ldO1xuXG4gICAgICAgIGlmIChmLmlkID09PSBmaWx0ZXIuaWQpIHtcbiAgICAgICAgICBmaWx0ZXIub3JkZXIgPSBpICsgMTsgLy8gY2FjaGUgb3JkZXIgb2YgZmlsdGVyXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlci5vcmRlcjtcbiAgfTtcblxuICAvKipcbiAgICogY3JlYXRlIGEgY2hpcCBpbiBhIHRhYmxlIGVsZW1lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IGZpbHRlciAtIHRvIGNyZWF0ZSBjaGlwIGZvclxuICAgKiBAcGFyYW0ge09iamVjdH0gY2xhc3NlcyAtIHRvIGFwcGx5IHRvIGZpbHRlclxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0Q2hpcCA9IChmaWx0ZXIsIGNsYXNzZXMpID0+IChcbiAgICA8dGQga2V5PXsnY2hpcF90ZF8nICsgZmlsdGVyLmlkfT5cbiAgICAgIDxDaGlwXG4gICAgICAgIGtleT17ZmlsdGVyLmlkfVxuICAgICAgICBsYWJlbD17ZmlsdGVyLmxhYmVsfVxuICAgICAgICBjbGFzc2VzPXt7XG4gICAgICAgICAgZGVsZXRlSWNvbjogY2xhc3Nlcy5jaGlwRGVsZXRlSWNvbixcbiAgICAgICAgICBsYWJlbDogY2xhc3Nlcy5jaGlwTGFiZWwsXG4gICAgICAgIH19XG4gICAgICAgIG9uRGVsZXRlPXt0aGlzLmhhbmRsZVRvZ2dsZShmaWx0ZXIpfVxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXMuY2hpcH1cbiAgICAgIC8+XG4gICAgPC90ZD4pO1xuXG4gIC8qKlxuICAgKiBnZXQgYSBzaW5nbGUgdGFibGUgcm93XG4gICAqIEBwYXJhbSB7QXJyYXl9IHNlbGVjdGVkIC0gYXJyYXkgb2YgZmlsdGVyc1xuICAgKiBAcGFyYW0ge051bWJlcn0gc3RhcnQgLSBmaWx0ZXIgbnVtYmVyIGZvciBzdGFydCBvZiByb3dcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IC0gbnVtYmVyIG9mIGl0ZW1zIGluIGEgcm93XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjbGFzc2VzIC0gdG8gYXBwbHkgdG8gZmlsdGVyXG4gICAqIEByZXR1cm4geyp9IHRhYmxlIHJvd1xuICAgKi9cbiAgZ2V0Um93ID0gKHNlbGVjdGVkLCBzdGFydCwgY291bnQsIGNsYXNzZXMpID0+IHtcbiAgICBjb25zdCBjaGlwcyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0LCBsID0gc2VsZWN0ZWQubGVuZ3RoOyAoaSA8IGwpICYmIChpIDwgc3RhcnQgKyBjb3VudCk7IGkrKykge1xuICAgICAgY2hpcHMucHVzaCh0aGlzLmdldENoaXAoc2VsZWN0ZWRbaV0sIGNsYXNzZXMpKTtcbiAgICB9XG4gICAgcmV0dXJuICggPHRyIGtleT17J2NoaXBfdHJfJyArIHN0YXJ0fT5cbiAgICAgIHtjaGlwc31cbiAgICA8L3RyPiApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBnZXQgYWxsIHRoZSBjaGlwcyBzb3J0IHRoZW0gYW5kIGZvcm1hdCBpbiBhIHRhYmxlXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNlbGVjdGVkIC0gYXJyYXkgb2YgZmlsdGVyc1xuICAgKiBAcGFyYW0ge09iamVjdH0gY2xhc3NlcyAtIHRvIGFwcGx5IHRvIGZpbHRlclxuICAgKiBAcmV0dXJuIHsqfSB0YWJsZVxuICAgKi9cbiAgZ2V0Q2hpcHMgPSAoc2VsZWN0ZWQsIGNsYXNzZXMpID0+IHtcbiAgICBpZiAoc2VsZWN0ZWQgJiYgc2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICBjb25zdCBzb3J0ZWRTZWxlY3RlZCA9IHNlbGVjdGVkLnNvcnQoKGEsIGIpID0+ICh0aGlzLmdldE9yZGVyKGEpIC0gdGhpcy5nZXRPcmRlcihiKSkpO1xuICAgICAgY29uc3Qgcm93cyA9IFtdO1xuICAgICAgY29uc3QgY29sdW1ucyA9IDI7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gc29ydGVkU2VsZWN0ZWQubGVuZ3RoOyBpIDwgbDsgaSs9Y29sdW1ucykge1xuICAgICAgICByb3dzLnB1c2godGhpcy5nZXRSb3coc2VsZWN0ZWQsIGksIGNvbHVtbnMsIGNsYXNzZXMpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoPHRhYmxlPlxuICAgICAgICA8dGJvZHk+e3Jvd3N9PC90Ym9keT5cbiAgICAgIDwvdGFibGU+KTtcbiAgICB9XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHNlbGVjdGVkLCBjbGFzc2VzLCBmaWx0ZXJzLCB0aXRsZSxcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IG9wZW4gfSA9IHRoaXMuc3RhdGU7XG5cbiAgICBjb25zdCBmaWx0ZXJDb3VudCA9IG9wZW4gPyAwIDogc2VsZWN0ZWQubGVuZ3RoO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxMaXN0U3ViaGVhZGVyIGRpc2FibGVHdXR0ZXJzIGNsYXNzTmFtZT17Y2xhc3Nlcy5yb290fT5cbiAgICAgICAgPExpc3RJdGVtIGJ1dHRvbiBjbGFzc05hbWU9e2NsYXNzZXMuaGVhZGVyfSBvbkNsaWNrPXt0aGlzLmhhbmRsZU9wZW59PlxuICAgICAgICAgIDxMaXN0SXRlbVRleHRcbiAgICAgICAgICAgIGNsYXNzZXM9e3sgcHJpbWFyeTogY2xhc3Nlcy50ZXh0IH19XG4gICAgICAgICAgICBwcmltYXJ5PXt0aXRsZX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxNZW51RmlsdGVySWNvbiBlbmFibGVkRmlsdGVyQ291bnQ9e2ZpbHRlckNvdW50fSBvcGVuPXtvcGVufS8+XG4gICAgICAgIDwvTGlzdEl0ZW0+XG4gICAgICAgIDxDb2xsYXBzZVxuICAgICAgICAgIGluPXshb3BlbiAmJiBzZWxlY3RlZC5sZW5ndGggPiAwfVxuICAgICAgICAgIHRpbWVvdXQ9XCJhdXRvXCJcbiAgICAgICAgICB1bm1vdW50T25FeGl0XG4gICAgICAgID5cbiAgICAgICAgICA8RGl2aWRlciB2YXJpYW50PVwibWlkZGxlXCIgY2xhc3Nlcz17eyBtaWRkbGU6IGNsYXNzZXMuZGl2aWRlciB9fS8+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIHt0aGlzLmdldENoaXBzKHNlbGVjdGVkLCBjbGFzc2VzKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9Db2xsYXBzZT5cbiAgICAgICAgPENvbGxhcHNlIGluPXtvcGVufSB0aW1lb3V0PVwiYXV0b1wiIHVubW91bnRPbkV4aXQ+XG4gICAgICAgICAgPERpdmlkZXIgdmFyaWFudD1cIm1pZGRsZVwiIGNsYXNzZXM9e3sgbWlkZGxlOiBjbGFzc2VzLmRpdmlkZXIgfX0vPlxuICAgICAgICAgIDxMaXN0IGNvbXBvbmVudD1cImRpdlwiIGRpc2FibGVQYWRkaW5nPlxuICAgICAgICAgICAge2ZpbHRlcnMubWFwKChpdGVtLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgICA8TGlzdEl0ZW1cbiAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgIGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzZXM9e3sgcm9vdDogY2xhc3Nlcy5maWx0ZXJJdGVtUm9vdCB9fVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXshdGhpcy5pc0VuYWJsZWQoaXRlbSl9XG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVUb2dnbGUoaXRlbSl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8TGlzdEl0ZW1JY29uIGNsYXNzZXM9e3sgcm9vdDogY2xhc3Nlcy5saXN0SXRlbUljb25Sb290IH19PlxuICAgICAgICAgICAgICAgICAge3RoaXMuaXNDaGVja2VkKGl0ZW0pID8gKFxuICAgICAgICAgICAgICAgICAgICA8Q2hlY2tCb3hJY29uIGNsYXNzTmFtZT17Y2xhc3Nlcy5jaGVja2JveH0vPlxuICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgPENoZWNrQm94T3V0bGluZUljb24gY2xhc3NOYW1lPXtjbGFzc2VzLmNoZWNrYm94fS8+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvTGlzdEl0ZW1JY29uPlxuICAgICAgICAgICAgICAgIHtpdGVtLmljb25cbiAgICAgICAgICAgICAgICAgID8gUmVhY3QuY2xvbmVFbGVtZW50KGl0ZW0uaWNvbiwgeyBzdHlsZTogeyBjb2xvcjogJyNmZmZmZmYnLCBmb250U2l6ZTogJzIycHgnIH0gfSlcbiAgICAgICAgICAgICAgICAgIDogbnVsbH1cbiAgICAgICAgICAgICAgICA8TGlzdEl0ZW1UZXh0XG4gICAgICAgICAgICAgICAgICBjbGFzc2VzPXt7IHByaW1hcnk6IGNsYXNzZXMuZmlsdGVyVGV4dCB9fVxuICAgICAgICAgICAgICAgICAgcHJpbWFyeT17aXRlbS5sYWJlbH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L0xpc3RJdGVtPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9MaXN0PlxuICAgICAgICA8L0NvbGxhcHNlPlxuICAgICAgPC9MaXN0U3ViaGVhZGVyPlxuICAgICk7XG4gIH1cbn1cblxuTWVudUZpbHRlci5wcm9wVHlwZXMgPSB7XG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgZmlsdGVyczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gIG9uVG9nZ2xlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICB0aXRsZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgc2VsZWN0ZWQ6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLFxufTtcbk1lbnVGaWx0ZXIuZGVmYXVsdFByb3BzID0geyBzZWxlY3RlZDogW10gfTtcblxuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMpKE1lbnVGaWx0ZXIpO1xuIl19