From ef270597a81e1db2e315c674877e8c5f2982eabb Mon Sep 17 00:00:00 2001 From: aaronlisman Date: Tue, 29 Nov 2016 12:35:11 -0500 Subject: [PATCH] fix broken build --- dist/reactapp/js/3.chunk.js | 1868 +---------------- src/appShell/App/Container.jsx | 1 + src/globalStyles/global.scss | 89 +- src/pages/datasetView/Connector.ts | 2 +- .../{DataSetPage.tsx => DatasetPage.tsx} | 3 - src/pages/datasetView/duck.js | 74 - src/pages/datasetView/duck.spec.js | 34 - 7 files changed, 17 insertions(+), 2054 deletions(-) rename src/pages/datasetView/{DataSetPage.tsx => DatasetPage.tsx} (93%) delete mode 100644 src/pages/datasetView/duck.js delete mode 100644 src/pages/datasetView/duck.spec.js diff --git a/dist/reactapp/js/3.chunk.js b/dist/reactapp/js/3.chunk.js index 0b9089ff18f..0b2d3fd2ba9 100644 --- a/dist/reactapp/js/3.chunk.js +++ b/dist/reactapp/js/3.chunk.js @@ -1,1866 +1,2 @@ -webpackJsonp([3],{ - -/***/ 928: -/***/ function(module, exports, __webpack_require__) { - - /* WEBPACK VAR INJECTION */(function(module) {'use strict'; - - var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.DataSetPageUnconnected = undefined; - - var _index = __webpack_require__(179); - - var _index2 = _interopRequireDefault(_index); - - var _index3 = __webpack_require__(184); - - var _index4 = _interopRequireDefault(_index3); - - var _react2 = __webpack_require__(15); - - var React = _interopRequireWildcard(_react2); - - var _index5 = __webpack_require__(185); - - var _index6 = _interopRequireDefault(_index5); - - var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) { - return typeof obj === 'undefined' ? 'undefined' : _typeof2(obj); - } : function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === 'undefined' ? 'undefined' : _typeof2(obj); - }; - - 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 _duck = __webpack_require__(661); - - var _reactRedux = __webpack_require__(395); - - var _reactable = __webpack_require__(929); - - var _underscore = __webpack_require__(332); - - var _ = _interopRequireWildcard(_underscore); - - function _interopRequireWildcard(obj) { - if (obj && obj.__esModule) { - return obj; - } else { - var newObj = {};if (obj != null) { - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; - } - }newObj.default = obj;return newObj; - } - } - - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; - } - - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - - function _possibleConstructorReturn(self, call) { - if (!self) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - }return call && ((typeof call === 'undefined' ? 'undefined' : _typeof2(call)) === "object" || typeof call === "function") ? call : self; - } - - function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === 'undefined' ? 'undefined' : _typeof2(superClass))); - }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; - } - - var _components = { - DataSetPageUnconnected: { - displayName: 'DataSetPageUnconnected' - } - }; - - var _UsersJiaojiaoReposCbioportalFrontendNode_modulesReactTransformHmrLibIndexJs2 = (0, _index6.default)({ - filename: '/Users/jiaojiao/repos/cbioportal-frontend/src/pages/datasetView/DatasetPage.jsx', - components: _components, - locals: [module], - imports: [React.default] - }); - - var _UsersJiaojiaoReposCbioportalFrontendNode_modulesReactTransformCatchErrorsLibIndexJs2 = (0, _index4.default)({ - filename: '/Users/jiaojiao/repos/cbioportal-frontend/src/pages/datasetView/DatasetPage.jsx', - components: _components, - locals: [], - imports: [React.default, _index2.default] - }); - - function _wrapComponent(id) { - return function (Component) { - return _UsersJiaojiaoReposCbioportalFrontendNode_modulesReactTransformHmrLibIndexJs2(_UsersJiaojiaoReposCbioportalFrontendNode_modulesReactTransformCatchErrorsLibIndexJs2(Component, id), id); - }; - } - - var DataSetPageUnconnected = exports.DataSetPageUnconnected = _wrapComponent('DataSetPageUnconnected')(function (_React$Component) { - _inherits(DataSetPageUnconnected, _React$Component); - - function DataSetPageUnconnected() { - _classCallCheck(this, DataSetPageUnconnected); - - return _possibleConstructorReturn(this, (DataSetPageUnconnected.__proto__ || Object.getPrototypeOf(DataSetPageUnconnected)).apply(this, arguments)); - } - - _createClass(DataSetPageUnconnected, [{ - key: 'componentDidMount', - value: function componentDidMount() { - - this.props.loadDatasetsInfo(); - } - }, { - key: 'render', - value: function render() { - var _this2 = this; - - if (this.props.datasets) { - var tempObj; - - var _ret = function () { - var rows = []; - var studies = []; - tempObj = {}; - - _this2.props.datasets.forEach(function (item) { - if (studies.indexOf(item.cancer_study_identifier) === -1) { - studies.push(item.cancer_study_identifier); - tempObj = { CancerStudy: (0, _reactable.unsafe)("" + item.name + " ") }; - if (!_.isNull(item.citation)) { - tempObj.Reference = (0, _reactable.unsafe)("" + item.citation + ""); - } - rows.push(tempObj); - } - tempObj = rows[studies.indexOf(item.cancer_study_identifier)]; - if (item.stable_id.endsWith("_all")) { - tempObj.All = item.count; - } else if (item.stable_id.endsWith("_sequenced")) { - tempObj.Sequenced = item.count; - } else if (item.stable_id.endsWith("_cna")) { - tempObj.CNA = item.count; - } else if (item.stable_id.endsWith("rna_seq_v2_mrna")) { - tempObj["Tumor mRNA (RNA-Seq V2)"] = item.count; - } else if (item.stable_id.endsWith("_microrna")) { - tempObj["Tumor mRNA (microarray)"] = item.count; - } else if (item.stable_id.endsWith("mrna")) { - tempObj["Tumor miRNA"] = item.count; - } else if (item.stable_id.endsWith("methylation_hm27")) { - tempObj["Methylation (HM27)"] = item.count; - } else if (item.stable_id.endsWith("_rppa")) { - tempObj.RPPA = item.count; - } else if (item.stable_id.endsWith("_complete")) { - tempObj.Complete = item.count; - } - }); - - // return ; - return { - v: React.createElement(_reactable.Table, { className: 'table', data: rows, sortable: true, filterable: ['CancerStudy', 'Reference', 'All', 'Sequenced', 'CNA', 'Tumor mRNA (RNA-Seq V2)', 'Tumor mRNA (microarray)', 'Tumor miRNA', 'Methylation (HM27)', 'RPPA', 'Complete'] }) - }; - }(); - - if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; - } else { - return React.createElement('div', null, 'loading'); - } - } - }]); - - return DataSetPageUnconnected; - }(React.Component)); - - ; - - exports.default = (0, _reactRedux.connect)(_duck.mapStateToProps, _duck.actionCreators)(DataSetPageUnconnected); - /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(178)(module))) - -/***/ }, - -/***/ 929: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true - }); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - var _react = __webpack_require__(15); - - var _react2 = _interopRequireDefault(_react); - - var _reactableTable = __webpack_require__(930); - - var _reactableTr = __webpack_require__(938); - - var _reactableTd = __webpack_require__(939); - - var _reactableTh = __webpack_require__(936); - - var _reactableTfoot = __webpack_require__(942); - - var _reactableThead = __webpack_require__(935); - - var _reactableSort = __webpack_require__(944); - - var _reactableUnsafe = __webpack_require__(934); - - _react2['default'].Children.children = function (children) { - return _react2['default'].Children.map(children, function (x) { - return x; - }) || []; - }; - - // Array.prototype.find polyfill - see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find - if (!Array.prototype.find) { - Object.defineProperty(Array.prototype, 'find', { - enumerable: false, - configurable: true, - writable: true, - value: function value(predicate) { - if (this === null) { - throw new TypeError('Array.prototype.find called on null or undefined'); - } - if (typeof predicate !== 'function') { - throw new TypeError('predicate must be a function'); - } - var list = Object(this); - var length = list.length >>> 0; - var thisArg = arguments[1]; - var value; - for (var i = 0; i < length; i++) { - if (i in list) { - value = list[i]; - if (predicate.call(thisArg, value, i, list)) { - return value; - } - } - } - return undefined; - } - }); - } - - var Reactable = { Table: _reactableTable.Table, Tr: _reactableTr.Tr, Td: _reactableTd.Td, Th: _reactableTh.Th, Tfoot: _reactableTfoot.Tfoot, Thead: _reactableThead.Thead, Sort: _reactableSort.Sort, unsafe: _reactableUnsafe.unsafe }; - - exports['default'] = Reactable; - - if (typeof window !== 'undefined') { - window.Reactable = Reactable; - } - module.exports = exports['default']; - - -/***/ }, - -/***/ 930: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true - }); - - var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - - 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 _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var _react = __webpack_require__(15); - - var _react2 = _interopRequireDefault(_react); - - var _libFilter_props_from = __webpack_require__(931); - - var _libExtract_data_from = __webpack_require__(932); - - var _unsafe = __webpack_require__(934); - - var _thead = __webpack_require__(935); - - var _th = __webpack_require__(936); - - var _tr = __webpack_require__(938); - - var _tfoot = __webpack_require__(942); - - var _paginator = __webpack_require__(943); - - var Table = (function (_React$Component) { - _inherits(Table, _React$Component); - - function Table(props) { - _classCallCheck(this, Table); - - _get(Object.getPrototypeOf(Table.prototype), 'constructor', this).call(this, props); - - this.state = { - currentPage: this.props.currentPage ? this.props.currentPage : 0, - currentSort: { - column: null, - direction: this.props.defaultSortDescending ? -1 : 1 - }, - filter: '' - }; - - // Set the state of the current sort to the default sort - if (props.sortBy !== false || props.defaultSort !== false) { - var sortingColumn = props.sortBy || props.defaultSort; - this.state.currentSort = this.getCurrentSort(sortingColumn); - } - } - - _createClass(Table, [{ - key: 'filterBy', - value: function filterBy(filter) { - this.setState({ filter: filter }); - } - - // Translate a user defined column array to hold column objects if strings are specified - // (e.g. ['column1'] => [{key: 'column1', label: 'column1'}]) - }, { - key: 'translateColumnsArray', - value: function translateColumnsArray(columns) { - return columns.map((function (column, i) { - if (typeof column === 'string') { - return { - key: column, - label: column - }; - } else { - if (typeof column.sortable !== 'undefined') { - var sortFunction = column.sortable === true ? 'default' : column.sortable; - this._sortable[column.key] = sortFunction; - } - - return column; - } - }).bind(this)); - } - }, { - key: 'parseChildData', - value: function parseChildData(props) { - var data = [], - tfoot = undefined; - - // Transform any children back to a data array - if (typeof props.children !== 'undefined') { - _react2['default'].Children.forEach(props.children, (function (child) { - if (typeof child === 'undefined' || child === null) { - return; - } - - switch (child.type) { - case _thead.Thead: - break; - case _tfoot.Tfoot: - if (typeof tfoot !== 'undefined') { - console.warn('You can only have one , but more than one was specified.' + 'Ignoring all but the last one'); - } - tfoot = child; - break; - case _tr.Tr: - var childData = child.props.data || {}; - - _react2['default'].Children.forEach(child.props.children, function (descendant) { - // TODO - /* if (descendant.type.ConvenienceConstructor === Td) { */ - if (typeof descendant !== 'object' || descendant == null) { - return; - } else if (typeof descendant.props.column !== 'undefined') { - var value = undefined; - - if (typeof descendant.props.data !== 'undefined') { - value = descendant.props.data; - } else if (typeof descendant.props.children !== 'undefined') { - value = descendant.props.children; - } else { - console.warn('exports.Td specified without ' + 'a `data` property or children, ' + 'ignoring'); - return; - } - - childData[descendant.props.column] = { - value: value, - props: (0, _libFilter_props_from.filterPropsFrom)(descendant.props), - __reactableMeta: true - }; - } else { - console.warn('exports.Td specified without a ' + '`column` property, ignoring'); - } - }); - - data.push({ - data: childData, - props: (0, _libFilter_props_from.filterPropsFrom)(child.props), - __reactableMeta: true - }); - break; - - default: - console.warn('The only possible children of
are , , ' + 'or one .'); - } - }).bind(this)); - } - - return { data: data, tfoot: tfoot }; - } - }, { - key: 'initialize', - value: function initialize(props) { - this.data = props.data || []; - - var _parseChildData = this.parseChildData(props); - - var data = _parseChildData.data; - var tfoot = _parseChildData.tfoot; - - this.data = this.data.concat(data); - this.tfoot = tfoot; - - this.initializeSorts(props); - this.initializeFilters(props); - } - }, { - key: 'initializeFilters', - value: function initializeFilters(props) { - this._filterable = {}; - // Transform filterable properties into a more friendly list - for (var i in props.filterable) { - var column = props.filterable[i]; - var columnName = undefined, - filterFunction = undefined; - - if (column instanceof Object) { - if (typeof column.column !== 'undefined') { - columnName = column.column; - } else { - console.warn('Filterable column specified without column name'); - continue; - } - - if (typeof column.filterFunction === 'function') { - filterFunction = column.filterFunction; - } else { - filterFunction = 'default'; - } - } else { - columnName = column; - filterFunction = 'default'; - } - - this._filterable[columnName] = filterFunction; - } - } - }, { - key: 'initializeSorts', - value: function initializeSorts(props) { - this._sortable = {}; - // Transform sortable properties into a more friendly list - for (var i in props.sortable) { - var column = props.sortable[i]; - var columnName = undefined, - sortFunction = undefined; - - if (column instanceof Object) { - if (typeof column.column !== 'undefined') { - columnName = column.column; - } else { - console.warn('Sortable column specified without column name'); - return; - } - - if (typeof column.sortFunction === 'function') { - sortFunction = column.sortFunction; - } else { - sortFunction = 'default'; - } - } else { - columnName = column; - sortFunction = 'default'; - } - - this._sortable[columnName] = sortFunction; - } - } - }, { - key: 'getCurrentSort', - value: function getCurrentSort(column) { - var columnName = undefined, - sortDirection = undefined; - - if (column instanceof Object) { - if (typeof column.column !== 'undefined') { - columnName = column.column; - } else { - console.warn('Default column specified without column name'); - return; - } - - if (typeof column.direction !== 'undefined') { - if (column.direction === 1 || column.direction === 'asc') { - sortDirection = 1; - } else if (column.direction === -1 || column.direction === 'desc') { - sortDirection = -1; - } else { - var defaultDirection = this.props.defaultSortDescending ? 'descending' : 'ascending'; - - console.warn('Invalid default sort specified. Defaulting to ' + defaultDirection); - sortDirection = this.props.defaultSortDescending ? -1 : 1; - } - } else { - sortDirection = this.props.defaultSortDescending ? -1 : 1; - } - } else { - columnName = column; - sortDirection = this.props.defaultSortDescending ? -1 : 1; - } - - return { - column: columnName, - direction: sortDirection - }; - } - }, { - key: 'updateCurrentSort', - value: function updateCurrentSort(sortBy) { - if (sortBy !== false && sortBy.column !== this.state.currentSort.column && sortBy.direction !== this.state.currentSort.direction) { - - this.setState({ currentSort: this.getCurrentSort(sortBy) }); - } - } - }, { - key: 'updateCurrentPage', - value: function updateCurrentPage(nextPage) { - if (typeof nextPage !== 'undefined' && nextPage !== this.state.currentPage) { - this.setState({ currentPage: nextPage }); - } - } - }, { - key: 'componentWillMount', - value: function componentWillMount() { - this.initialize(this.props); - this.sortByCurrentSort(); - this.filterBy(this.props.filterBy); - } - }, { - key: 'componentWillReceiveProps', - value: function componentWillReceiveProps(nextProps) { - this.initialize(nextProps); - this.updateCurrentPage(nextProps.currentPage); - this.updateCurrentSort(nextProps.sortBy); - this.sortByCurrentSort(); - this.filterBy(nextProps.filterBy); - } - }, { - key: 'applyFilter', - value: function applyFilter(filter, children) { - // Helper function to apply filter text to a list of table rows - filter = filter.toLowerCase(); - var matchedChildren = []; - - for (var i = 0; i < children.length; i++) { - var data = children[i].props.data; - - for (var filterColumn in this._filterable) { - if (typeof data[filterColumn] !== 'undefined') { - // Default filter - if (typeof this._filterable[filterColumn] === 'undefined' || this._filterable[filterColumn] === 'default') { - if ((0, _libExtract_data_from.extractDataFrom)(data, filterColumn).toString().toLowerCase().indexOf(filter) > -1) { - matchedChildren.push(children[i]); - break; - } - } else { - // Apply custom filter - if (this._filterable[filterColumn]((0, _libExtract_data_from.extractDataFrom)(data, filterColumn).toString(), filter)) { - matchedChildren.push(children[i]); - break; - } - } - } - } - } - - return matchedChildren; - } - }, { - key: 'sortByCurrentSort', - value: function sortByCurrentSort() { - // Apply a sort function according to the current sort in the state. - // This allows us to perform a default sort even on a non sortable column. - var currentSort = this.state.currentSort; - - if (currentSort.column === null) { - return; - } - - this.data.sort((function (a, b) { - var keyA = (0, _libExtract_data_from.extractDataFrom)(a, currentSort.column); - keyA = (0, _unsafe.isUnsafe)(keyA) ? keyA.toString() : keyA || ''; - var keyB = (0, _libExtract_data_from.extractDataFrom)(b, currentSort.column); - keyB = (0, _unsafe.isUnsafe)(keyB) ? keyB.toString() : keyB || ''; - - // Default sort - if (typeof this._sortable[currentSort.column] === 'undefined' || this._sortable[currentSort.column] === 'default') { - - // Reverse direction if we're doing a reverse sort - if (keyA < keyB) { - return -1 * currentSort.direction; - } - - if (keyA > keyB) { - return 1 * currentSort.direction; - } - - return 0; - } else { - // Reverse columns if we're doing a reverse sort - if (currentSort.direction === 1) { - return this._sortable[currentSort.column](keyA, keyB); - } else { - return this._sortable[currentSort.column](keyB, keyA); - } - } - }).bind(this)); - } - }, { - key: 'onSort', - value: function onSort(column) { - // Don't perform sort on unsortable columns - if (typeof this._sortable[column] === 'undefined') { - return; - } - - var currentSort = this.state.currentSort; - - if (currentSort.column === column) { - currentSort.direction *= -1; - } else { - currentSort.column = column; - currentSort.direction = this.props.defaultSortDescending ? -1 : 1; - } - - // Set the current sort and pass it to the sort function - this.setState({ currentSort: currentSort }); - this.sortByCurrentSort(); - - if (typeof this.props.onSort === 'function') { - this.props.onSort(currentSort); - } - } - }, { - key: 'render', - value: function render() { - var _this = this; - - var children = []; - var columns = undefined; - var userColumnsSpecified = false; - var showHeaders = typeof this.props.hideTableHeader === 'undefined'; - - var firstChild = null; - - if (this.props.children) { - if (this.props.children.length > 0 && this.props.children[0] && this.props.children[0].type === _thead.Thead) { - firstChild = this.props.children[0]; - } else if (this.props.children.type === _thead.Thead) { - firstChild = this.props.children; - } - } - - if (firstChild !== null) { - columns = _thead.Thead.getColumns(firstChild); - } else { - columns = this.props.columns || []; - } - - if (columns.length > 0) { - userColumnsSpecified = true; - columns = this.translateColumnsArray(columns); - } - - // Build up table rows - if (this.data && typeof this.data.map === 'function') { - // Build up the columns array - children = children.concat(this.data.map((function (rawData, i) { - var data = rawData; - var props = {}; - if (rawData.__reactableMeta === true) { - data = rawData.data; - props = rawData.props; - } - - // Loop through the keys in each data row and build a td for it - for (var k in data) { - if (data.hasOwnProperty(k)) { - // Update the columns array with the data's keys if columns were not - // already specified - if (userColumnsSpecified === false) { - (function () { - var column = { - key: k, - label: k - }; - - // Only add a new column if it doesn't already exist in the columns array - if (columns.find(function (element) { - return element.key === column.key; - }) === undefined) { - columns.push(column); - } - })(); - } - } - } - - return _react2['default'].createElement(_tr.Tr, _extends({ columns: columns, key: i, data: data }, props)); - }).bind(this))); - } - - if (this.props.sortable === true) { - for (var i = 0; i < columns.length; i++) { - this._sortable[columns[i].key] = 'default'; - } - } - - // Determine if we render the filter box - var filtering = false; - if (this.props.filterable && Array.isArray(this.props.filterable) && this.props.filterable.length > 0 && !this.props.hideFilterInput) { - filtering = true; - } - - // Apply filters - var filteredChildren = children; - if (this.state.filter !== '') { - filteredChildren = this.applyFilter(this.state.filter, filteredChildren); - } - - // Determine pagination properties and which columns to display - var itemsPerPage = 0; - var pagination = false; - var numPages = undefined; - var currentPage = this.state.currentPage; - var pageButtonLimit = this.props.pageButtonLimit || 10; - - var currentChildren = filteredChildren; - if (this.props.itemsPerPage > 0) { - itemsPerPage = this.props.itemsPerPage; - numPages = Math.ceil(filteredChildren.length / itemsPerPage); - - if (currentPage > numPages - 1) { - currentPage = numPages - 1; - } - - pagination = true; - currentChildren = filteredChildren.slice(currentPage * itemsPerPage, (currentPage + 1) * itemsPerPage); - } - - // Manually transfer props - var props = (0, _libFilter_props_from.filterPropsFrom)(this.props); - - var noDataText = this.props.noDataText ? _react2['default'].createElement( - 'tr', - { className: 'reactable-no-data' }, - _react2['default'].createElement( - 'td', - { colSpan: columns.length }, - this.props.noDataText - ) - ) : null; - - var tableHeader = null; - if (columns && columns.length > 0 && showHeaders) { - tableHeader = _react2['default'].createElement(_thead.Thead, { columns: columns, - filtering: filtering, - onFilter: function (filter) { - _this.setState({ filter: filter }); - if (_this.props.onFilter) { - _this.props.onFilter(filter); - } - }, - filterPlaceholder: this.props.filterPlaceholder, - filterClassName: this.props.filterClassName, - currentFilter: this.state.filter, - sort: this.state.currentSort, - sortableColumns: this._sortable, - onSort: this.onSort.bind(this), - key: 'thead' }); - } - return _react2['default'].createElement( - 'table', - props, - tableHeader, - _react2['default'].createElement( - 'tbody', - { className: 'reactable-data', key: 'tbody' }, - currentChildren.length > 0 ? currentChildren : noDataText - ), - pagination === true ? _react2['default'].createElement(_paginator.Paginator, { colSpan: columns.length, - pageButtonLimit: pageButtonLimit, - numPages: numPages, - currentPage: currentPage, - onPageChange: function (page) { - _this.setState({ currentPage: page }); - if (_this.props.onPageChange) { - _this.props.onPageChange(page); - } - }, - previousPageLabel: this.props.previousPageLabel, - nextPageLabel: this.props.nextPageLabel, - key: 'paginator' }) : null, - this.tfoot - ); - } - }]); - - return Table; - })(_react2['default'].Component); - - exports.Table = Table; - - Table.defaultProps = { - sortBy: false, - defaultSort: false, - defaultSortDescending: false, - itemsPerPage: 0, - filterBy: '', - hideFilterInput: false - }; - - -/***/ }, - -/***/ 931: -/***/ function(module, exports) { - - "use strict"; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.filterPropsFrom = filterPropsFrom; - var internalProps = { - column: true, - columns: true, - sortable: true, - filterable: true, - filtering: true, - onFilter: true, - filterPlaceholder: true, - filterClassName: true, - currentFilter: true, - sort: true, - sortBy: true, - sortableColumns: true, - onSort: true, - defaultSort: true, - defaultSortDescending: true, - itemsPerPage: true, - filterBy: true, - hideFilterInput: true, - noDataText: true, - currentPage: true, - pageButtonLimit: true, - childNode: true, - data: true, - children: true - }; - - function filterPropsFrom(baseProps) { - baseProps = baseProps || {}; - var props = {}; - for (var key in baseProps) { - if (!(key in internalProps)) { - props[key] = baseProps[key]; - } - } - - return props; - } - - -/***/ }, - -/***/ 932: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true - }); - exports.extractDataFrom = extractDataFrom; - - var _stringable = __webpack_require__(933); - - function extractDataFrom(key, column) { - var value; - if (typeof key !== 'undefined' && key !== null && key.__reactableMeta === true) { - value = key.data[column]; - } else { - value = key[column]; - } - - if (typeof value !== 'undefined' && value !== null && value.__reactableMeta === true) { - value = typeof value.props.value !== 'undefined' && value.props.value !== null ? value.props.value : value.value; - } - - return (0, _stringable.stringable)(value) ? value : ''; - } - - -/***/ }, - -/***/ 933: -/***/ function(module, exports) { - - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true - }); - exports.stringable = stringable; - - function stringable(thing) { - return thing !== null && typeof thing !== 'undefined' && typeof (thing.toString === 'function'); - } - - -/***/ }, - -/***/ 934: -/***/ function(module, exports) { - - "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; }; })(); - - exports.unsafe = unsafe; - exports.isUnsafe = isUnsafe; - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var Unsafe = (function () { - function Unsafe(content) { - _classCallCheck(this, Unsafe); - - this.content = content; - } - - _createClass(Unsafe, [{ - key: "toString", - value: function toString() { - return this.content; - } - }]); - - return Unsafe; - })(); - - function unsafe(str) { - return new Unsafe(str); - } - - ; - - function isUnsafe(obj) { - return obj instanceof Unsafe; - } - - ; - - -/***/ }, - -/***/ 935: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true - }); - - var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - - 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 _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var _react = __webpack_require__(15); - - var _react2 = _interopRequireDefault(_react); - - var _th = __webpack_require__(936); - - var _filterer = __webpack_require__(937); - - var _libFilter_props_from = __webpack_require__(931); - - var Thead = (function (_React$Component) { - _inherits(Thead, _React$Component); - - function Thead() { - _classCallCheck(this, Thead); - - _get(Object.getPrototypeOf(Thead.prototype), 'constructor', this).apply(this, arguments); - } - - _createClass(Thead, [{ - key: 'handleClickTh', - value: function handleClickTh(column) { - this.props.onSort(column.key); - } - }, { - key: 'handleKeyDownTh', - value: function handleKeyDownTh(column, event) { - if (event.keyCode === 13) { - this.props.onSort(column.key); - } - } - }, { - key: 'render', - value: function render() { - // Declare the list of Ths - var Ths = []; - for (var index = 0; index < this.props.columns.length; index++) { - var column = this.props.columns[index]; - var thClass = 'reactable-th-' + column.key.replace(/\s+/g, '-').toLowerCase(); - var sortClass = ''; - var thRole = null; - - if (this.props.sortableColumns[column.key]) { - sortClass += 'reactable-header-sortable '; - thRole = 'button'; - } - - if (this.props.sort.column === column.key) { - sortClass += 'reactable-header-sort'; - if (this.props.sort.direction === 1) { - sortClass += '-asc'; - } else { - sortClass += '-desc'; - } - } - - if (sortClass.length > 0) { - thClass += ' ' + sortClass; - } - - if (typeof column.props === 'object' && typeof column.props.className === 'string') { - thClass += ' ' + column.props.className; - } - - Ths.push(_react2['default'].createElement( - _th.Th, - _extends({}, column.props, { - className: thClass, - key: index, - onClick: this.handleClickTh.bind(this, column), - onKeyDown: this.handleKeyDownTh.bind(this, column), - role: thRole, - tabIndex: '0' }), - column.label - )); - } - - // Manually transfer props - var props = (0, _libFilter_props_from.filterPropsFrom)(this.props); - - return _react2['default'].createElement( - 'thead', - props, - this.props.filtering === true ? _react2['default'].createElement(_filterer.Filterer, { - colSpan: this.props.columns.length, - onFilter: this.props.onFilter, - placeholder: this.props.filterPlaceholder, - value: this.props.currentFilter, - className: this.props.filterClassName - }) : null, - _react2['default'].createElement( - 'tr', - { className: 'reactable-column-header' }, - Ths - ) - ); - } - }], [{ - key: 'getColumns', - value: function getColumns(component) { - // Can't use React.Children.map since that doesn't return a proper array - var columns = []; - _react2['default'].Children.forEach(component.props.children, function (th) { - var column = {}; - if (typeof th.props !== 'undefined') { - column.props = (0, _libFilter_props_from.filterPropsFrom)(th.props); - - // use the content as the label & key - if (typeof th.props.children !== 'undefined') { - column.label = th.props.children; - column.key = column.label; - } - - // the key in the column attribute supersedes the one defined previously - if (typeof th.props.column === 'string') { - column.key = th.props.column; - - // in case we don't have a label yet - if (typeof column.label === 'undefined') { - column.label = column.key; - } - } - } - - if (typeof column.key === 'undefined') { - throw new TypeError('
must have either a "column" property or a string ' + 'child'); - } else { - columns.push(column); - } - }); - - return columns; - } - }]); - - return Thead; - })(_react2['default'].Component); - - exports.Thead = Thead; - ; - - -/***/ }, - -/***/ 936: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true - }); - - var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - - 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 _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var _react = __webpack_require__(15); - - var _react2 = _interopRequireDefault(_react); - - var _unsafe = __webpack_require__(934); - - var _libFilter_props_from = __webpack_require__(931); - - var Th = (function (_React$Component) { - _inherits(Th, _React$Component); - - function Th() { - _classCallCheck(this, Th); - - _get(Object.getPrototypeOf(Th.prototype), 'constructor', this).apply(this, arguments); - } - - _createClass(Th, [{ - key: 'render', - value: function render() { - var childProps = undefined; - - if ((0, _unsafe.isUnsafe)(this.props.children)) { - return _react2['default'].createElement('th', _extends({}, (0, _libFilter_props_from.filterPropsFrom)(this.props), { - dangerouslySetInnerHTML: { __html: this.props.children.toString() } })); - } else { - return _react2['default'].createElement( - 'th', - (0, _libFilter_props_from.filterPropsFrom)(this.props), - this.props.children - ); - } - } - }]); - - return Th; - })(_react2['default'].Component); - - exports.Th = Th; - ; - - -/***/ }, - -/***/ 937: -/***/ function(module, exports, __webpack_require__) { - - '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 _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var _react = __webpack_require__(15); - - var _react2 = _interopRequireDefault(_react); - - var _reactDom = __webpack_require__(44); - - var _reactDom2 = _interopRequireDefault(_reactDom); - - var FiltererInput = (function (_React$Component) { - _inherits(FiltererInput, _React$Component); - - function FiltererInput() { - _classCallCheck(this, FiltererInput); - - _get(Object.getPrototypeOf(FiltererInput.prototype), 'constructor', this).apply(this, arguments); - } - - _createClass(FiltererInput, [{ - key: 'onChange', - value: function onChange() { - this.props.onFilter(_reactDom2['default'].findDOMNode(this).value); - } - }, { - key: 'render', - value: function render() { - return _react2['default'].createElement('input', { type: 'text', - className: this.props.className, - placeholder: this.props.placeholder, - value: this.props.value, - onKeyUp: this.onChange.bind(this), - onChange: this.onChange.bind(this) }); - } - }]); - - return FiltererInput; - })(_react2['default'].Component); - - exports.FiltererInput = FiltererInput; - ; - - var Filterer = (function (_React$Component2) { - _inherits(Filterer, _React$Component2); - - function Filterer() { - _classCallCheck(this, Filterer); - - _get(Object.getPrototypeOf(Filterer.prototype), 'constructor', this).apply(this, arguments); - } - - _createClass(Filterer, [{ - key: 'render', - value: function render() { - if (typeof this.props.colSpan === 'undefined') { - throw new TypeError('Must pass a colSpan argument to Filterer'); - } - - return _react2['default'].createElement( - 'tr', - { className: 'reactable-filterer' }, - _react2['default'].createElement( - 'td', - { colSpan: this.props.colSpan }, - _react2['default'].createElement(FiltererInput, { onFilter: this.props.onFilter, - value: this.props.value, - placeholder: this.props.placeholder, - className: this.props.className ? 'reactable-filter-input ' + this.props.className : 'reactable-filter-input' }) - ) - ); - } - }]); - - return Filterer; - })(_react2['default'].Component); - - exports.Filterer = Filterer; - ; - - -/***/ }, - -/***/ 938: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true - }); - - var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - - 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 _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var _react = __webpack_require__(15); - - var _react2 = _interopRequireDefault(_react); - - var _td = __webpack_require__(939); - - var _libTo_array = __webpack_require__(941); - - var _libFilter_props_from = __webpack_require__(931); - - var Tr = (function (_React$Component) { - _inherits(Tr, _React$Component); - - function Tr() { - _classCallCheck(this, Tr); - - _get(Object.getPrototypeOf(Tr.prototype), 'constructor', this).apply(this, arguments); - } - - _createClass(Tr, [{ - key: 'render', - value: function render() { - var children = (0, _libTo_array.toArray)(_react2['default'].Children.children(this.props.children)); - - if (this.props.data && this.props.columns && typeof this.props.columns.map === 'function') { - if (typeof children.concat === 'undefined') { - console.log(children); - } - - children = children.concat(this.props.columns.map((function (column, i) { - if (this.props.data.hasOwnProperty(column.key)) { - var value = this.props.data[column.key]; - var props = {}; - - if (typeof value !== 'undefined' && value !== null && value.__reactableMeta === true) { - props = value.props; - value = value.value; - } - - return _react2['default'].createElement( - _td.Td, - _extends({ column: column, key: column.key }, props), - value - ); - } else { - return _react2['default'].createElement(_td.Td, { column: column, key: column.key }); - } - }).bind(this))); - } - - // Manually transfer props - var props = (0, _libFilter_props_from.filterPropsFrom)(this.props); - - return _react2['default'].DOM.tr(props, children); - } - }]); - - return Tr; - })(_react2['default'].Component); - - exports.Tr = Tr; - ; - - Tr.childNode = _td.Td; - Tr.dataType = 'object'; - - -/***/ }, - -/***/ 939: -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true - }); - - var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - - 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 _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var _react = __webpack_require__(15); - - var _react2 = _interopRequireDefault(_react); - - var _libIs_react_component = __webpack_require__(940); - - var _libStringable = __webpack_require__(933); - - var _unsafe = __webpack_require__(934); - - var _libFilter_props_from = __webpack_require__(931); - - var Td = (function (_React$Component) { - _inherits(Td, _React$Component); - - function Td() { - _classCallCheck(this, Td); - - _get(Object.getPrototypeOf(Td.prototype), 'constructor', this).apply(this, arguments); - } - - _createClass(Td, [{ - key: 'stringifyIfNotReactComponent', - value: function stringifyIfNotReactComponent(object) { - if (!(0, _libIs_react_component.isReactComponent)(object) && (0, _libStringable.stringable)(object) && typeof object !== 'undefined') { - return object.toString(); - } - return null; - } - }, { - key: 'render', - value: function render() { - // Attach any properties on the column to this Td object to allow things like custom event handlers - var mergedProps = (0, _libFilter_props_from.filterPropsFrom)(this.props); - if (typeof this.props.column === 'object') { - for (var key in this.props.column) { - if (key !== 'key' && key !== 'name') { - mergedProps[key] = this.props.column[key]; - } - } - } - // handleClick aliases onClick event - mergedProps.onClick = this.props.handleClick; - - var stringifiedChildProps; - - if (typeof this.props.data === 'undefined') { - stringifiedChildProps = this.stringifyIfNotReactComponent(this.props.children); - } - - if ((0, _unsafe.isUnsafe)(this.props.children)) { - return _react2['default'].createElement('td', _extends({}, mergedProps, { - dangerouslySetInnerHTML: { __html: this.props.children.toString() } })); - } else { - return _react2['default'].createElement( - 'td', - mergedProps, - stringifiedChildProps || this.props.children - ); - } - } - }]); - - return Td; - })(_react2['default'].Component); - - exports.Td = Td; - ; - - -/***/ }, - -/***/ 940: -/***/ function(module, exports) { - - // this is a bit hacky - it'd be nice if React exposed an API for this - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true - }); - exports.isReactComponent = isReactComponent; - - function isReactComponent(thing) { - return thing !== null && typeof thing === 'object' && typeof thing.props !== 'undefined'; - } - - -/***/ }, - -/***/ 941: -/***/ function(module, exports) { - - "use strict"; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.toArray = toArray; - - function toArray(obj) { - var ret = []; - for (var attr in obj) { - ret[attr] = obj; - } - - return ret; - } - - -/***/ }, - -/***/ 942: -/***/ function(module, exports, __webpack_require__) { - - '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 _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var _react = __webpack_require__(15); - - var _react2 = _interopRequireDefault(_react); - - var Tfoot = (function (_React$Component) { - _inherits(Tfoot, _React$Component); - - function Tfoot() { - _classCallCheck(this, Tfoot); - - _get(Object.getPrototypeOf(Tfoot.prototype), 'constructor', this).apply(this, arguments); - } - - _createClass(Tfoot, [{ - key: 'render', - value: function render() { - return _react2['default'].createElement('tfoot', this.props); - } - }]); - - return Tfoot; - })(_react2['default'].Component); - - exports.Tfoot = Tfoot; - - -/***/ }, - -/***/ 943: -/***/ function(module, exports, __webpack_require__) { - - '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 _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - - function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var _react = __webpack_require__(15); - - var _react2 = _interopRequireDefault(_react); - - function pageHref(num) { - return '#page-' + (num + 1); - } - - var Paginator = (function (_React$Component) { - _inherits(Paginator, _React$Component); - - function Paginator() { - _classCallCheck(this, Paginator); - - _get(Object.getPrototypeOf(Paginator.prototype), 'constructor', this).apply(this, arguments); - } - - _createClass(Paginator, [{ - key: 'handlePrevious', - value: function handlePrevious(e) { - e.preventDefault(); - this.props.onPageChange(this.props.currentPage - 1); - } - }, { - key: 'handleNext', - value: function handleNext(e) { - e.preventDefault(); - this.props.onPageChange(this.props.currentPage + 1); - } - }, { - key: 'handlePageButton', - value: function handlePageButton(page, e) { - e.preventDefault(); - this.props.onPageChange(page); - } - }, { - key: 'renderPrevious', - value: function renderPrevious() { - if (this.props.currentPage > 0) { - return _react2['default'].createElement( - 'a', - { className: 'reactable-previous-page', - href: pageHref(this.props.currentPage - 1), - onClick: this.handlePrevious.bind(this) }, - this.props.previousPageLabel || 'Previous' - ); - } - } - }, { - key: 'renderNext', - value: function renderNext() { - if (this.props.currentPage < this.props.numPages - 1) { - return _react2['default'].createElement( - 'a', - { className: 'reactable-next-page', - href: pageHref(this.props.currentPage + 1), - onClick: this.handleNext.bind(this) }, - this.props.nextPageLabel || 'Next' - ); - } - } - }, { - key: 'renderPageButton', - value: function renderPageButton(className, pageNum) { - - return _react2['default'].createElement( - 'a', - { className: className, - key: pageNum, - href: pageHref(pageNum), - onClick: this.handlePageButton.bind(this, pageNum) }, - pageNum + 1 - ); - } - }, { - key: 'render', - value: function render() { - if (typeof this.props.colSpan === 'undefined') { - throw new TypeError('Must pass a colSpan argument to Paginator'); - } - - if (typeof this.props.numPages === 'undefined') { - throw new TypeError('Must pass a non-zero numPages argument to Paginator'); - } - - if (typeof this.props.currentPage === 'undefined') { - throw new TypeError('Must pass a currentPage argument to Paginator'); - } - - var pageButtons = []; - var pageButtonLimit = this.props.pageButtonLimit; - var currentPage = this.props.currentPage; - var numPages = this.props.numPages; - var lowerHalf = Math.round(pageButtonLimit / 2); - var upperHalf = pageButtonLimit - lowerHalf; - - for (var i = 0; i < this.props.numPages; i++) { - var showPageButton = false; - var pageNum = i; - var className = "reactable-page-button"; - if (currentPage === i) { - className += " reactable-current-page"; - } - pageButtons.push(this.renderPageButton(className, pageNum)); - } - - if (currentPage - pageButtonLimit + lowerHalf > 0) { - if (currentPage > numPages - lowerHalf) { - pageButtons.splice(0, numPages - pageButtonLimit); - } else { - pageButtons.splice(0, currentPage - pageButtonLimit + lowerHalf); - } - } - - if (numPages - currentPage > upperHalf) { - pageButtons.splice(pageButtonLimit, pageButtons.length - pageButtonLimit); - } - - return _react2['default'].createElement( - 'tbody', - { className: 'reactable-pagination' }, - _react2['default'].createElement( - 'tr', - null, - _react2['default'].createElement( - 'td', - { colSpan: this.props.colSpan }, - this.renderPrevious(), - pageButtons, - this.renderNext() - ) - ) - ); - } - }]); - - return Paginator; - })(_react2['default'].Component); - - exports.Paginator = Paginator; - ; - - -/***/ }, - -/***/ 944: -/***/ function(module, exports) { - - 'use strict'; - - Object.defineProperty(exports, '__esModule', { - value: true - }); - var Sort = { - Numeric: function Numeric(a, b) { - var valA = parseFloat(a.toString().replace(/,/g, '')); - var valB = parseFloat(b.toString().replace(/,/g, '')); - - // Sort non-numeric values alphabetically at the bottom of the list - if (isNaN(valA) && isNaN(valB)) { - valA = a; - valB = b; - } else { - if (isNaN(valA)) { - return 1; - } - if (isNaN(valB)) { - return -1; - } - } - - if (valA < valB) { - return -1; - } - if (valA > valB) { - return 1; - } - - return 0; - }, - - NumericInteger: function NumericInteger(a, b) { - if (isNaN(a) || isNaN(b)) { - return a > b ? 1 : -1; - } - - return a - b; - }, - - Currency: function Currency(a, b) { - // Parse out dollar signs, then do a regular numeric sort - a = a.replace(/[^0-9\.\-\,]+/g, ''); - b = b.replace(/[^0-9\.\-\,]+/g, ''); - - return exports.Sort.Numeric(a, b); - }, - - Date: (function (_Date) { - function Date(_x, _x2) { - return _Date.apply(this, arguments); - } - - Date.toString = function () { - return _Date.toString(); - }; - - return Date; - })(function (a, b) { - // Note: this function tries to do a standard javascript string -> date conversion - // If you need more control over the date string format, consider using a different - // date library and writing your own function - var valA = Date.parse(a); - var valB = Date.parse(b); - - // Handle non-date values with numeric sort - // Sort non-numeric values alphabetically at the bottom of the list - if (isNaN(valA) || isNaN(valB)) { - return exports.Sort.Numeric(a, b); - } - - if (valA > valB) { - return 1; - } - if (valB > valA) { - return -1; - } - - return 0; - }), - - CaseInsensitive: function CaseInsensitive(a, b) { - return a.toLowerCase().localeCompare(b.toLowerCase()); - } - }; - exports.Sort = Sort; - - -/***/ } - -}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvcGFnZXMvZGF0YXNldFZpZXcvRGF0YXNldFBhZ2UuanN4Iiwid2VicGFjazovLy8uL34vcmVhY3RhYmxlL2xpYi9yZWFjdGFibGUuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdGFibGUvbGliL3JlYWN0YWJsZS90YWJsZS5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0YWJsZS9saWIvcmVhY3RhYmxlL2xpYi9maWx0ZXJfcHJvcHNfZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0YWJsZS9saWIvcmVhY3RhYmxlL2xpYi9leHRyYWN0X2RhdGFfZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0YWJsZS9saWIvcmVhY3RhYmxlL2xpYi9zdHJpbmdhYmxlLmpzIiwid2VicGFjazovLy8uL34vcmVhY3RhYmxlL2xpYi9yZWFjdGFibGUvdW5zYWZlLmpzIiwid2VicGFjazovLy8uL34vcmVhY3RhYmxlL2xpYi9yZWFjdGFibGUvdGhlYWQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdGFibGUvbGliL3JlYWN0YWJsZS90aC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0YWJsZS9saWIvcmVhY3RhYmxlL2ZpbHRlcmVyLmpzIiwid2VicGFjazovLy8uL34vcmVhY3RhYmxlL2xpYi9yZWFjdGFibGUvdHIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdGFibGUvbGliL3JlYWN0YWJsZS90ZC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0YWJsZS9saWIvcmVhY3RhYmxlL2xpYi9pc19yZWFjdF9jb21wb25lbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdGFibGUvbGliL3JlYWN0YWJsZS9saWIvdG9fYXJyYXkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9yZWFjdGFibGUvbGliL3JlYWN0YWJsZS90Zm9vdC5qcyIsIndlYnBhY2s6Ly8vLi9+L3JlYWN0YWJsZS9saWIvcmVhY3RhYmxlL3BhZ2luYXRvci5qcyIsIndlYnBhY2s6Ly8vLi9+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QUFDQSxrQkFBaUI7QUFDakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0JBQWlCLG9DQUFvQztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQXlCLDhCQUE4QjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUs7O0FBRUw7QUFDQSxFQUFDOztBQUVEO0FBQ0E7Ozs7Ozs7O0FDNUpBOztBQUVBO0FBQ0E7QUFDQSxFQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6InJlYWN0YXBwL2pzLzMuY2h1bmsuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGFjdGlvbkNyZWF0b3JzLCBtYXBTdGF0ZVRvUHJvcHMgfSBmcm9tICcuL2R1Y2snO1xuaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4JztcbmltcG9ydCB7IFRhYmxlLCB1bnNhZmUgfSAgZnJvbSAncmVhY3RhYmxlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAndW5kZXJzY29yZSc7XG5leHBvcnQgY2xhc3MgRGF0YVNldFBhZ2VVbmNvbm5lY3RlZCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpe1xuXG4gICAgICAgIHRoaXMucHJvcHMubG9hZERhdGFzZXRzSW5mbygpO1xuXG4gICAgfVxuXG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmRhdGFzZXRzKSB7XG4gICAgICAgICAgICBjb25zdCByb3dzID0gW107XG4gICAgICAgICAgICBjb25zdCBzdHVkaWVzID0gW107XG4gICAgICAgICAgICB2YXIgdGVtcE9iaiA9IHt9O1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5kYXRhc2V0cy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYoc3R1ZGllcy5pbmRleE9mKGl0ZW0uY2FuY2VyX3N0dWR5X2lkZW50aWZpZXIpID09PSAtMSl7XG4gICAgICAgICAgICAgICAgICAgIHN0dWRpZXMucHVzaChpdGVtLmNhbmNlcl9zdHVkeV9pZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICAgICAgdGVtcE9iaiA9IHtDYW5jZXJTdHVkeTogdW5zYWZlKFwiPGEgaHJlZj0naHR0cDovL3d3dy5jYmlvcG9ydGFsLm9yZy9zdHVkeT9pZD1cIiArIGl0ZW0uY2FuY2VyX3N0dWR5X2lkZW50aWZpZXIgKyBcIiNzdW1tYXJ5JyB0YXJnZXQ9J19ibGFuayc+XCIgKyBpdGVtLm5hbWUgKyBcIjwvYT4gIDxhIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9jQmlvUG9ydGFsL2RhdGFodWIvYmxvYi9tYXN0ZXIvcHVibGljL1wiICsgaXRlbS5jYW5jZXJfc3R1ZHlfaWRlbnRpZmllciArIFwiLnRhci5neicgZG93bmxvYWQ+PGkgY2xhc3M9J2ZhIGZhLWRvd25sb2FkJz48L2k+PC9hPlwiKX07XG4gICAgICAgICAgICAgICAgICAgIGlmKCFfLmlzTnVsbChpdGVtLmNpdGF0aW9uKSl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wT2JqLlJlZmVyZW5jZSA9IHVuc2FmZShcIjxhIHRhcmdldD0nX2JsYW5rJyBocmVmPSdodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3B1Ym1lZC9cIiArIGl0ZW0ucG1pZCArIFwiJz5cIiArIGl0ZW0uY2l0YXRpb24gKyBcIjwvYT5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcm93cy5wdXNoKHRlbXBPYmopO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0ZW1wT2JqID0gcm93c1tzdHVkaWVzLmluZGV4T2YoaXRlbS5jYW5jZXJfc3R1ZHlfaWRlbnRpZmllcildO1xuICAgICAgICAgICAgICAgIGlmKGl0ZW0uc3RhYmxlX2lkLmVuZHNXaXRoKFwiX2FsbFwiKSl7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBPYmouQWxsID0gaXRlbS5jb3VudDtcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihpdGVtLnN0YWJsZV9pZC5lbmRzV2l0aChcIl9zZXF1ZW5jZWRcIikpe1xuICAgICAgICAgICAgICAgICAgICB0ZW1wT2JqLlNlcXVlbmNlZCA9IGl0ZW0uY291bnQ7XG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoaXRlbS5zdGFibGVfaWQuZW5kc1dpdGgoXCJfY25hXCIpKXtcbiAgICAgICAgICAgICAgICAgICAgdGVtcE9iai5DTkEgPSBpdGVtLmNvdW50O1xuICAgICAgICAgICAgICAgIH1lbHNlIGlmKGl0ZW0uc3RhYmxlX2lkLmVuZHNXaXRoKFwicm5hX3NlcV92Ml9tcm5hXCIpKXtcbiAgICAgICAgICAgICAgICAgICAgdGVtcE9ialtcIlR1bW9yIG1STkEgKFJOQS1TZXEgVjIpXCJdID0gaXRlbS5jb3VudDtcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihpdGVtLnN0YWJsZV9pZC5lbmRzV2l0aChcIl9taWNyb3JuYVwiKSl7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBPYmpbXCJUdW1vciBtUk5BIChtaWNyb2FycmF5KVwiXSA9IGl0ZW0uY291bnQ7XG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoaXRlbS5zdGFibGVfaWQuZW5kc1dpdGgoXCJtcm5hXCIpKXtcbiAgICAgICAgICAgICAgICAgICAgdGVtcE9ialtcIlR1bW9yIG1pUk5BXCJdID0gaXRlbS5jb3VudDtcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihpdGVtLnN0YWJsZV9pZC5lbmRzV2l0aChcIm1ldGh5bGF0aW9uX2htMjdcIikpe1xuICAgICAgICAgICAgICAgICAgICB0ZW1wT2JqW1wiTWV0aHlsYXRpb24gKEhNMjcpXCJdID0gaXRlbS5jb3VudDtcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihpdGVtLnN0YWJsZV9pZC5lbmRzV2l0aChcIl9ycHBhXCIpKXtcbiAgICAgICAgICAgICAgICAgICAgdGVtcE9iai5SUFBBID0gaXRlbS5jb3VudDtcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihpdGVtLnN0YWJsZV9pZC5lbmRzV2l0aChcIl9jb21wbGV0ZVwiKSl7XG4gICAgICAgICAgICAgICAgICAgIHRlbXBPYmouQ29tcGxldGUgPSBpdGVtLmNvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vICAgIHJldHVybiA8VGFibGUgY2xhc3NOYW1lPVwidGFibGVcIiBkYXRhPXtyb3dzfSBzb3J0YWJsZT17dHJ1ZX0gZmlsdGVyYWJsZT17WydOYW1lJywgJ1JlZmVyZW5jZScsICdBbGwnLCAnU2VxdWVuY2VkJywgJ0NOQScsICdUdW1vcl9STkFfc2VxJywgJ1R1bW9yX1JOQV9taWNyb2FycmF5JywgJ1R1bW9yX21pUk5BJywgJ01ldGh5bGF0aW9uJywgJ1JQUEEnLCAnQ29tcGxldGUnXX0vPjtcbiAgICAgICAgICAgIHJldHVybiA8VGFibGUgY2xhc3NOYW1lPVwidGFibGVcIiBkYXRhPXtyb3dzfSBzb3J0YWJsZT17dHJ1ZX0gZmlsdGVyYWJsZT17WydDYW5jZXJTdHVkeScsJ1JlZmVyZW5jZScsJ0FsbCcsJ1NlcXVlbmNlZCcsJ0NOQScsJ1R1bW9yIG1STkEgKFJOQS1TZXEgVjIpJywnVHVtb3IgbVJOQSAobWljcm9hcnJheSknLCdUdW1vciBtaVJOQScsJ01ldGh5bGF0aW9uIChITTI3KScsJ1JQUEEnLCdDb21wbGV0ZSddfS8+O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDxkaXY+bG9hZGluZzwvZGl2PlxuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsYWN0aW9uQ3JlYXRvcnMpKERhdGFTZXRQYWdlVW5jb25uZWN0ZWQpO1xuXG5cblxuXG5cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vc3JjL3BhZ2VzL2RhdGFzZXRWaWV3L0RhdGFzZXRQYWdlLmpzeFxuICoqLyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcmVhY3RhYmxlVGFibGUgPSByZXF1aXJlKCcuL3JlYWN0YWJsZS90YWJsZScpO1xuXG52YXIgX3JlYWN0YWJsZVRyID0gcmVxdWlyZSgnLi9yZWFjdGFibGUvdHInKTtcblxudmFyIF9yZWFjdGFibGVUZCA9IHJlcXVpcmUoJy4vcmVhY3RhYmxlL3RkJyk7XG5cbnZhciBfcmVhY3RhYmxlVGggPSByZXF1aXJlKCcuL3JlYWN0YWJsZS90aCcpO1xuXG52YXIgX3JlYWN0YWJsZVRmb290ID0gcmVxdWlyZSgnLi9yZWFjdGFibGUvdGZvb3QnKTtcblxudmFyIF9yZWFjdGFibGVUaGVhZCA9IHJlcXVpcmUoJy4vcmVhY3RhYmxlL3RoZWFkJyk7XG5cbnZhciBfcmVhY3RhYmxlU29ydCA9IHJlcXVpcmUoJy4vcmVhY3RhYmxlL3NvcnQnKTtcblxudmFyIF9yZWFjdGFibGVVbnNhZmUgPSByZXF1aXJlKCcuL3JlYWN0YWJsZS91bnNhZmUnKTtcblxuX3JlYWN0MlsnZGVmYXVsdCddLkNoaWxkcmVuLmNoaWxkcmVuID0gZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5DaGlsZHJlbi5tYXAoY2hpbGRyZW4sIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH0pIHx8IFtdO1xufTtcblxuLy8gQXJyYXkucHJvdG90eXBlLmZpbmQgcG9seWZpbGwgLSBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZmluZFxuaWYgKCFBcnJheS5wcm90b3R5cGUuZmluZCkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsICdmaW5kJywge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHByZWRpY2F0ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5wcm90b3R5cGUuZmluZCBjYWxsZWQgb24gbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZGljYXRlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGxpc3QgPSBPYmplY3QodGhpcyk7XG4gICAgICAgICAgICB2YXIgbGVuZ3RoID0gbGlzdC5sZW5ndGggPj4+IDA7XG4gICAgICAgICAgICB2YXIgdGhpc0FyZyA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgICAgIHZhciB2YWx1ZTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSBpbiBsaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbGlzdFtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKHRoaXNBcmcsIHZhbHVlLCBpLCBsaXN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG52YXIgUmVhY3RhYmxlID0geyBUYWJsZTogX3JlYWN0YWJsZVRhYmxlLlRhYmxlLCBUcjogX3JlYWN0YWJsZVRyLlRyLCBUZDogX3JlYWN0YWJsZVRkLlRkLCBUaDogX3JlYWN0YWJsZVRoLlRoLCBUZm9vdDogX3JlYWN0YWJsZVRmb290LlRmb290LCBUaGVhZDogX3JlYWN0YWJsZVRoZWFkLlRoZWFkLCBTb3J0OiBfcmVhY3RhYmxlU29ydC5Tb3J0LCB1bnNhZmU6IF9yZWFjdGFibGVVbnNhZmUudW5zYWZlIH07XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IFJlYWN0YWJsZTtcblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgd2luZG93LlJlYWN0YWJsZSA9IFJlYWN0YWJsZTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcmVhY3RhYmxlL2xpYi9yZWFjdGFibGUuanNcbiAqKiBtb2R1bGUgaWQgPSA5MjlcbiAqKiBtb2R1bGUgY2h1bmtzID0gM1xuICoqLyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gsIF94MiwgX3gzKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94LCBwcm9wZXJ0eSA9IF94MiwgcmVjZWl2ZXIgPSBfeDM7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3ggPSBwYXJlbnQ7IF94MiA9IHByb3BlcnR5OyBfeDMgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoJ3ZhbHVlJyBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfbGliRmlsdGVyX3Byb3BzX2Zyb20gPSByZXF1aXJlKCcuL2xpYi9maWx0ZXJfcHJvcHNfZnJvbScpO1xuXG52YXIgX2xpYkV4dHJhY3RfZGF0YV9mcm9tID0gcmVxdWlyZSgnLi9saWIvZXh0cmFjdF9kYXRhX2Zyb20nKTtcblxudmFyIF91bnNhZmUgPSByZXF1aXJlKCcuL3Vuc2FmZScpO1xuXG52YXIgX3RoZWFkID0gcmVxdWlyZSgnLi90aGVhZCcpO1xuXG52YXIgX3RoID0gcmVxdWlyZSgnLi90aCcpO1xuXG52YXIgX3RyID0gcmVxdWlyZSgnLi90cicpO1xuXG52YXIgX3Rmb290ID0gcmVxdWlyZSgnLi90Zm9vdCcpO1xuXG52YXIgX3BhZ2luYXRvciA9IHJlcXVpcmUoJy4vcGFnaW5hdG9yJyk7XG5cbnZhciBUYWJsZSA9IChmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgIF9pbmhlcml0cyhUYWJsZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBUYWJsZShwcm9wcykge1xuICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGFibGUpO1xuXG4gICAgICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFRhYmxlLnByb3RvdHlwZSksICdjb25zdHJ1Y3RvcicsIHRoaXMpLmNhbGwodGhpcywgcHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBjdXJyZW50UGFnZTogdGhpcy5wcm9wcy5jdXJyZW50UGFnZSA/IHRoaXMucHJvcHMuY3VycmVudFBhZ2UgOiAwLFxuICAgICAgICAgICAgY3VycmVudFNvcnQ6IHtcbiAgICAgICAgICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiB0aGlzLnByb3BzLmRlZmF1bHRTb3J0RGVzY2VuZGluZyA/IC0xIDogMVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZpbHRlcjogJydcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTZXQgdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IHNvcnQgdG8gdGhlIGRlZmF1bHQgc29ydFxuICAgICAgICBpZiAocHJvcHMuc29ydEJ5ICE9PSBmYWxzZSB8fCBwcm9wcy5kZWZhdWx0U29ydCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHZhciBzb3J0aW5nQ29sdW1uID0gcHJvcHMuc29ydEJ5IHx8IHByb3BzLmRlZmF1bHRTb3J0O1xuICAgICAgICAgICAgdGhpcy5zdGF0ZS5jdXJyZW50U29ydCA9IHRoaXMuZ2V0Q3VycmVudFNvcnQoc29ydGluZ0NvbHVtbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfY3JlYXRlQ2xhc3MoVGFibGUsIFt7XG4gICAgICAgIGtleTogJ2ZpbHRlckJ5JyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGZpbHRlckJ5KGZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGZpbHRlcjogZmlsdGVyIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhbnNsYXRlIGEgdXNlciBkZWZpbmVkIGNvbHVtbiBhcnJheSB0byBob2xkIGNvbHVtbiBvYmplY3RzIGlmIHN0cmluZ3MgYXJlIHNwZWNpZmllZFxuICAgICAgICAvLyAoZS5nLiBbJ2NvbHVtbjEnXSA9PiBbe2tleTogJ2NvbHVtbjEnLCBsYWJlbDogJ2NvbHVtbjEnfV0pXG4gICAgfSwge1xuICAgICAgICBrZXk6ICd0cmFuc2xhdGVDb2x1bW5zQXJyYXknLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gdHJhbnNsYXRlQ29sdW1uc0FycmF5KGNvbHVtbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBjb2x1bW5zLm1hcCgoZnVuY3Rpb24gKGNvbHVtbiwgaSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29sdW1uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBjb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogY29sdW1uXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb2x1bW4uc29ydGFibGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc29ydEZ1bmN0aW9uID0gY29sdW1uLnNvcnRhYmxlID09PSB0cnVlID8gJ2RlZmF1bHQnIDogY29sdW1uLnNvcnRhYmxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc29ydGFibGVbY29sdW1uLmtleV0gPSBzb3J0RnVuY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdwYXJzZUNoaWxkRGF0YScsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBwYXJzZUNoaWxkRGF0YShwcm9wcykge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSBbXSxcbiAgICAgICAgICAgICAgICB0Zm9vdCA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgLy8gVHJhbnNmb3JtIGFueSBjaGlsZHJlbiBiYWNrIHRvIGEgZGF0YSBhcnJheVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uQ2hpbGRyZW4uZm9yRWFjaChwcm9wcy5jaGlsZHJlbiwgKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkID09PSAndW5kZWZpbmVkJyB8fCBjaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjaGlsZC50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIF90aGVhZC5UaGVhZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgX3Rmb290LlRmb290OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGZvb3QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignWW91IGNhbiBvbmx5IGhhdmUgb25lIDxUZm9vdD4sIGJ1dCBtb3JlIHRoYW4gb25lIHdhcyBzcGVjaWZpZWQuJyArICdJZ25vcmluZyBhbGwgYnV0IHRoZSBsYXN0IG9uZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zm9vdCA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBfdHIuVHI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkRGF0YSA9IGNoaWxkLnByb3BzLmRhdGEgfHwge307XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uQ2hpbGRyZW4uZm9yRWFjaChjaGlsZC5wcm9wcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ET1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAoZGVzY2VuZGFudC50eXBlLkNvbnZlbmllbmNlQ29uc3RydWN0b3IgPT09IFRkKSB7ICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVzY2VuZGFudCAhPT0gJ29iamVjdCcgfHwgZGVzY2VuZGFudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlc2NlbmRhbnQucHJvcHMuY29sdW1uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRlc2NlbmRhbnQucHJvcHMuZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRlc2NlbmRhbnQucHJvcHMuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlc2NlbmRhbnQucHJvcHMuY2hpbGRyZW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkZXNjZW5kYW50LnByb3BzLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ2V4cG9ydHMuVGQgc3BlY2lmaWVkIHdpdGhvdXQgJyArICdhIGBkYXRhYCBwcm9wZXJ0eSBvciBjaGlsZHJlbiwgJyArICdpZ25vcmluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREYXRhW2Rlc2NlbmRhbnQucHJvcHMuY29sdW1uXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6ICgwLCBfbGliRmlsdGVyX3Byb3BzX2Zyb20uZmlsdGVyUHJvcHNGcm9tKShkZXNjZW5kYW50LnByb3BzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3JlYWN0YWJsZU1ldGE6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ2V4cG9ydHMuVGQgc3BlY2lmaWVkIHdpdGhvdXQgYSAnICsgJ2Bjb2x1bW5gIHByb3BlcnR5LCBpZ25vcmluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBjaGlsZERhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiAoMCwgX2xpYkZpbHRlcl9wcm9wc19mcm9tLmZpbHRlclByb3BzRnJvbSkoY2hpbGQucHJvcHMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3JlYWN0YWJsZU1ldGE6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1RoZSBvbmx5IHBvc3NpYmxlIGNoaWxkcmVuIG9mIDxUYWJsZT4gYXJlIDxUaGVhZD4sIDxUcj4sICcgKyAnb3Igb25lIDxUZm9vdD4uJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogZGF0YSwgdGZvb3Q6IHRmb290IH07XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ2luaXRpYWxpemUnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZShwcm9wcykge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gcHJvcHMuZGF0YSB8fCBbXTtcblxuICAgICAgICAgICAgdmFyIF9wYXJzZUNoaWxkRGF0YSA9IHRoaXMucGFyc2VDaGlsZERhdGEocHJvcHMpO1xuXG4gICAgICAgICAgICB2YXIgZGF0YSA9IF9wYXJzZUNoaWxkRGF0YS5kYXRhO1xuICAgICAgICAgICAgdmFyIHRmb290ID0gX3BhcnNlQ2hpbGREYXRhLnRmb290O1xuXG4gICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEuY29uY2F0KGRhdGEpO1xuICAgICAgICAgICAgdGhpcy50Zm9vdCA9IHRmb290O1xuXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVTb3J0cyhwcm9wcyk7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVGaWx0ZXJzKHByb3BzKTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnaW5pdGlhbGl6ZUZpbHRlcnMnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZUZpbHRlcnMocHJvcHMpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmFibGUgPSB7fTtcbiAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBmaWx0ZXJhYmxlIHByb3BlcnRpZXMgaW50byBhIG1vcmUgZnJpZW5kbHkgbGlzdFxuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBwcm9wcy5maWx0ZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbHVtbiA9IHByb3BzLmZpbHRlcmFibGVbaV07XG4gICAgICAgICAgICAgICAgdmFyIGNvbHVtbk5hbWUgPSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlckZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbiBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbHVtbi5jb2x1bW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lID0gY29sdW1uLmNvbHVtbjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignRmlsdGVyYWJsZSBjb2x1bW4gc3BlY2lmaWVkIHdpdGhvdXQgY29sdW1uIG5hbWUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb2x1bW4uZmlsdGVyRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckZ1bmN0aW9uID0gY29sdW1uLmZpbHRlckZ1bmN0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyRnVuY3Rpb24gPSAnZGVmYXVsdCc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lID0gY29sdW1uO1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJGdW5jdGlvbiA9ICdkZWZhdWx0JztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJhYmxlW2NvbHVtbk5hbWVdID0gZmlsdGVyRnVuY3Rpb247XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ2luaXRpYWxpemVTb3J0cycsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplU29ydHMocHJvcHMpIHtcbiAgICAgICAgICAgIHRoaXMuX3NvcnRhYmxlID0ge307XG4gICAgICAgICAgICAvLyBUcmFuc2Zvcm0gc29ydGFibGUgcHJvcGVydGllcyBpbnRvIGEgbW9yZSBmcmllbmRseSBsaXN0XG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIHByb3BzLnNvcnRhYmxlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbHVtbiA9IHByb3BzLnNvcnRhYmxlW2ldO1xuICAgICAgICAgICAgICAgIHZhciBjb2x1bW5OYW1lID0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBzb3J0RnVuY3Rpb24gPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29sdW1uLmNvbHVtbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWUgPSBjb2x1bW4uY29sdW1uO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdTb3J0YWJsZSBjb2x1bW4gc3BlY2lmaWVkIHdpdGhvdXQgY29sdW1uIG5hbWUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29sdW1uLnNvcnRGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc29ydEZ1bmN0aW9uID0gY29sdW1uLnNvcnRGdW5jdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRGdW5jdGlvbiA9ICdkZWZhdWx0JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWUgPSBjb2x1bW47XG4gICAgICAgICAgICAgICAgICAgIHNvcnRGdW5jdGlvbiA9ICdkZWZhdWx0JztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9zb3J0YWJsZVtjb2x1bW5OYW1lXSA9IHNvcnRGdW5jdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnZ2V0Q3VycmVudFNvcnQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3VycmVudFNvcnQoY29sdW1uKSB7XG4gICAgICAgICAgICB2YXIgY29sdW1uTmFtZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzb3J0RGlyZWN0aW9uID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBpZiAoY29sdW1uIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb2x1bW4uY29sdW1uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lID0gY29sdW1uLmNvbHVtbjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0RlZmF1bHQgY29sdW1uIHNwZWNpZmllZCB3aXRob3V0IGNvbHVtbiBuYW1lJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbHVtbi5kaXJlY3Rpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uZGlyZWN0aW9uID09PSAxIHx8IGNvbHVtbi5kaXJlY3Rpb24gPT09ICdhc2MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0RGlyZWN0aW9uID0gMTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4uZGlyZWN0aW9uID09PSAtMSB8fCBjb2x1bW4uZGlyZWN0aW9uID09PSAnZGVzYycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnREaXJlY3Rpb24gPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0RGlyZWN0aW9uID0gdGhpcy5wcm9wcy5kZWZhdWx0U29ydERlc2NlbmRpbmcgPyAnZGVzY2VuZGluZycgOiAnYXNjZW5kaW5nJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIGRlZmF1bHQgc29ydCBzcGVjaWZpZWQuIERlZmF1bHRpbmcgdG8gJyArIGRlZmF1bHREaXJlY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc29ydERpcmVjdGlvbiA9IHRoaXMucHJvcHMuZGVmYXVsdFNvcnREZXNjZW5kaW5nID8gLTEgOiAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc29ydERpcmVjdGlvbiA9IHRoaXMucHJvcHMuZGVmYXVsdFNvcnREZXNjZW5kaW5nID8gLTEgOiAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29sdW1uTmFtZSA9IGNvbHVtbjtcbiAgICAgICAgICAgICAgICBzb3J0RGlyZWN0aW9uID0gdGhpcy5wcm9wcy5kZWZhdWx0U29ydERlc2NlbmRpbmcgPyAtMSA6IDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogc29ydERpcmVjdGlvblxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAndXBkYXRlQ3VycmVudFNvcnQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlQ3VycmVudFNvcnQoc29ydEJ5KSB7XG4gICAgICAgICAgICBpZiAoc29ydEJ5ICE9PSBmYWxzZSAmJiBzb3J0QnkuY29sdW1uICE9PSB0aGlzLnN0YXRlLmN1cnJlbnRTb3J0LmNvbHVtbiAmJiBzb3J0QnkuZGlyZWN0aW9uICE9PSB0aGlzLnN0YXRlLmN1cnJlbnRTb3J0LmRpcmVjdGlvbikge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGN1cnJlbnRTb3J0OiB0aGlzLmdldEN1cnJlbnRTb3J0KHNvcnRCeSkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ3VwZGF0ZUN1cnJlbnRQYWdlJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZUN1cnJlbnRQYWdlKG5leHRQYWdlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5leHRQYWdlICE9PSAndW5kZWZpbmVkJyAmJiBuZXh0UGFnZSAhPT0gdGhpcy5zdGF0ZS5jdXJyZW50UGFnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBjdXJyZW50UGFnZTogbmV4dFBhZ2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ2NvbXBvbmVudFdpbGxNb3VudCcsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsTW91bnQoKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemUodGhpcy5wcm9wcyk7XG4gICAgICAgICAgICB0aGlzLnNvcnRCeUN1cnJlbnRTb3J0KCk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckJ5KHRoaXMucHJvcHMuZmlsdGVyQnkpO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemUobmV4dFByb3BzKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ3VycmVudFBhZ2UobmV4dFByb3BzLmN1cnJlbnRQYWdlKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ3VycmVudFNvcnQobmV4dFByb3BzLnNvcnRCeSk7XG4gICAgICAgICAgICB0aGlzLnNvcnRCeUN1cnJlbnRTb3J0KCk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckJ5KG5leHRQcm9wcy5maWx0ZXJCeSk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ2FwcGx5RmlsdGVyJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5RmlsdGVyKGZpbHRlciwgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBhcHBseSBmaWx0ZXIgdGV4dCB0byBhIGxpc3Qgb2YgdGFibGUgcm93c1xuICAgICAgICAgICAgZmlsdGVyID0gZmlsdGVyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB2YXIgbWF0Y2hlZENoaWxkcmVuID0gW107XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGNoaWxkcmVuW2ldLnByb3BzLmRhdGE7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBmaWx0ZXJDb2x1bW4gaW4gdGhpcy5fZmlsdGVyYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGFbZmlsdGVyQ29sdW1uXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgZmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2ZpbHRlcmFibGVbZmlsdGVyQ29sdW1uXSA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5fZmlsdGVyYWJsZVtmaWx0ZXJDb2x1bW5dID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIF9saWJFeHRyYWN0X2RhdGFfZnJvbS5leHRyYWN0RGF0YUZyb20pKGRhdGEsIGZpbHRlckNvbHVtbikudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZmlsdGVyKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRDaGlsZHJlbi5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBseSBjdXN0b20gZmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ZpbHRlcmFibGVbZmlsdGVyQ29sdW1uXSgoMCwgX2xpYkV4dHJhY3RfZGF0YV9mcm9tLmV4dHJhY3REYXRhRnJvbSkoZGF0YSwgZmlsdGVyQ29sdW1uKS50b1N0cmluZygpLCBmaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRDaGlsZHJlbi5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlZENoaWxkcmVuO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdzb3J0QnlDdXJyZW50U29ydCcsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBzb3J0QnlDdXJyZW50U29ydCgpIHtcbiAgICAgICAgICAgIC8vIEFwcGx5IGEgc29ydCBmdW5jdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc29ydCBpbiB0aGUgc3RhdGUuXG4gICAgICAgICAgICAvLyBUaGlzIGFsbG93cyB1cyB0byBwZXJmb3JtIGEgZGVmYXVsdCBzb3J0IGV2ZW4gb24gYSBub24gc29ydGFibGUgY29sdW1uLlxuICAgICAgICAgICAgdmFyIGN1cnJlbnRTb3J0ID0gdGhpcy5zdGF0ZS5jdXJyZW50U29ydDtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRTb3J0LmNvbHVtbiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5kYXRhLnNvcnQoKGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleUEgPSAoMCwgX2xpYkV4dHJhY3RfZGF0YV9mcm9tLmV4dHJhY3REYXRhRnJvbSkoYSwgY3VycmVudFNvcnQuY29sdW1uKTtcbiAgICAgICAgICAgICAgICBrZXlBID0gKDAsIF91bnNhZmUuaXNVbnNhZmUpKGtleUEpID8ga2V5QS50b1N0cmluZygpIDoga2V5QSB8fCAnJztcbiAgICAgICAgICAgICAgICB2YXIga2V5QiA9ICgwLCBfbGliRXh0cmFjdF9kYXRhX2Zyb20uZXh0cmFjdERhdGFGcm9tKShiLCBjdXJyZW50U29ydC5jb2x1bW4pO1xuICAgICAgICAgICAgICAgIGtleUIgPSAoMCwgX3Vuc2FmZS5pc1Vuc2FmZSkoa2V5QikgPyBrZXlCLnRvU3RyaW5nKCkgOiBrZXlCIHx8ICcnO1xuXG4gICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBzb3J0XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zb3J0YWJsZVtjdXJyZW50U29ydC5jb2x1bW5dID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLl9zb3J0YWJsZVtjdXJyZW50U29ydC5jb2x1bW5dID09PSAnZGVmYXVsdCcpIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZXZlcnNlIGRpcmVjdGlvbiBpZiB3ZSdyZSBkb2luZyBhIHJldmVyc2Ugc29ydFxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5QSA8IGtleUIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSAqIGN1cnJlbnRTb3J0LmRpcmVjdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXlBID4ga2V5Qikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgKiBjdXJyZW50U29ydC5kaXJlY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZXZlcnNlIGNvbHVtbnMgaWYgd2UncmUgZG9pbmcgYSByZXZlcnNlIHNvcnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTb3J0LmRpcmVjdGlvbiA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRhYmxlW2N1cnJlbnRTb3J0LmNvbHVtbl0oa2V5QSwga2V5Qik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc29ydGFibGVbY3VycmVudFNvcnQuY29sdW1uXShrZXlCLCBrZXlBKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdvblNvcnQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gb25Tb3J0KGNvbHVtbikge1xuICAgICAgICAgICAgLy8gRG9uJ3QgcGVyZm9ybSBzb3J0IG9uIHVuc29ydGFibGUgY29sdW1uc1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zb3J0YWJsZVtjb2x1bW5dID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGN1cnJlbnRTb3J0ID0gdGhpcy5zdGF0ZS5jdXJyZW50U29ydDtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRTb3J0LmNvbHVtbiA9PT0gY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFNvcnQuZGlyZWN0aW9uICo9IC0xO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50U29ydC5jb2x1bW4gPSBjb2x1bW47XG4gICAgICAgICAgICAgICAgY3VycmVudFNvcnQuZGlyZWN0aW9uID0gdGhpcy5wcm9wcy5kZWZhdWx0U29ydERlc2NlbmRpbmcgPyAtMSA6IDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCB0aGUgY3VycmVudCBzb3J0IGFuZCBwYXNzIGl0IHRvIHRoZSBzb3J0IGZ1bmN0aW9uXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgY3VycmVudFNvcnQ6IGN1cnJlbnRTb3J0IH0pO1xuICAgICAgICAgICAgdGhpcy5zb3J0QnlDdXJyZW50U29ydCgpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMub25Tb3J0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vblNvcnQoY3VycmVudFNvcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdyZW5kZXInLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gW107XG4gICAgICAgICAgICB2YXIgY29sdW1ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHZhciB1c2VyQ29sdW1uc1NwZWNpZmllZCA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIHNob3dIZWFkZXJzID0gdHlwZW9mIHRoaXMucHJvcHMuaGlkZVRhYmxlSGVhZGVyID09PSAndW5kZWZpbmVkJztcblxuICAgICAgICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgdGhpcy5wcm9wcy5jaGlsZHJlblswXSAmJiB0aGlzLnByb3BzLmNoaWxkcmVuWzBdLnR5cGUgPT09IF90aGVhZC5UaGVhZCkge1xuICAgICAgICAgICAgICAgICAgICBmaXJzdENoaWxkID0gdGhpcy5wcm9wcy5jaGlsZHJlblswXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuY2hpbGRyZW4udHlwZSA9PT0gX3RoZWFkLlRoZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q2hpbGQgPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zID0gX3RoZWFkLlRoZWFkLmdldENvbHVtbnMoZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbHVtbnMgPSB0aGlzLnByb3BzLmNvbHVtbnMgfHwgW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB1c2VyQ29sdW1uc1NwZWNpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29sdW1ucyA9IHRoaXMudHJhbnNsYXRlQ29sdW1uc0FycmF5KGNvbHVtbnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBCdWlsZCB1cCB0YWJsZSByb3dzXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhICYmIHR5cGVvZiB0aGlzLmRhdGEubWFwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgLy8gQnVpbGQgdXAgdGhlIGNvbHVtbnMgYXJyYXlcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLmNvbmNhdCh0aGlzLmRhdGEubWFwKChmdW5jdGlvbiAocmF3RGF0YSwgaSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHJhd0RhdGE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBpZiAocmF3RGF0YS5fX3JlYWN0YWJsZU1ldGEgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByYXdEYXRhLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyA9IHJhd0RhdGEucHJvcHM7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIGtleXMgaW4gZWFjaCBkYXRhIHJvdyBhbmQgYnVpbGQgYSB0ZCBmb3IgaXRcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgY29sdW1ucyBhcnJheSB3aXRoIHRoZSBkYXRhJ3Mga2V5cyBpZiBjb2x1bW5zIHdlcmUgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBzcGVjaWZpZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlckNvbHVtbnNTcGVjaWZpZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDoga1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhZGQgYSBuZXcgY29sdW1uIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgY29sdW1ucyBhcnJheVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbnMuZmluZChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmtleSA9PT0gY29sdW1uLmtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX3RyLlRyLCBfZXh0ZW5kcyh7IGNvbHVtbnM6IGNvbHVtbnMsIGtleTogaSwgZGF0YTogZGF0YSB9LCBwcm9wcykpO1xuICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcykpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuc29ydGFibGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc29ydGFibGVbY29sdW1uc1tpXS5rZXldID0gJ2RlZmF1bHQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHdlIHJlbmRlciB0aGUgZmlsdGVyIGJveFxuICAgICAgICAgICAgdmFyIGZpbHRlcmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuZmlsdGVyYWJsZSAmJiBBcnJheS5pc0FycmF5KHRoaXMucHJvcHMuZmlsdGVyYWJsZSkgJiYgdGhpcy5wcm9wcy5maWx0ZXJhYmxlLmxlbmd0aCA+IDAgJiYgIXRoaXMucHJvcHMuaGlkZUZpbHRlcklucHV0KSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQXBwbHkgZmlsdGVyc1xuICAgICAgICAgICAgdmFyIGZpbHRlcmVkQ2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmZpbHRlciAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZENoaWxkcmVuID0gdGhpcy5hcHBseUZpbHRlcih0aGlzLnN0YXRlLmZpbHRlciwgZmlsdGVyZWRDaGlsZHJlbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERldGVybWluZSBwYWdpbmF0aW9uIHByb3BlcnRpZXMgYW5kIHdoaWNoIGNvbHVtbnMgdG8gZGlzcGxheVxuICAgICAgICAgICAgdmFyIGl0ZW1zUGVyUGFnZSA9IDA7XG4gICAgICAgICAgICB2YXIgcGFnaW5hdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIG51bVBhZ2VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRQYWdlID0gdGhpcy5zdGF0ZS5jdXJyZW50UGFnZTtcbiAgICAgICAgICAgIHZhciBwYWdlQnV0dG9uTGltaXQgPSB0aGlzLnByb3BzLnBhZ2VCdXR0b25MaW1pdCB8fCAxMDtcblxuICAgICAgICAgICAgdmFyIGN1cnJlbnRDaGlsZHJlbiA9IGZpbHRlcmVkQ2hpbGRyZW47XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5pdGVtc1BlclBhZ2UgPiAwKSB7XG4gICAgICAgICAgICAgICAgaXRlbXNQZXJQYWdlID0gdGhpcy5wcm9wcy5pdGVtc1BlclBhZ2U7XG4gICAgICAgICAgICAgICAgbnVtUGFnZXMgPSBNYXRoLmNlaWwoZmlsdGVyZWRDaGlsZHJlbi5sZW5ndGggLyBpdGVtc1BlclBhZ2UpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlID4gbnVtUGFnZXMgLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWdlID0gbnVtUGFnZXMgLSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBhZ2luYXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRDaGlsZHJlbiA9IGZpbHRlcmVkQ2hpbGRyZW4uc2xpY2UoY3VycmVudFBhZ2UgKiBpdGVtc1BlclBhZ2UsIChjdXJyZW50UGFnZSArIDEpICogaXRlbXNQZXJQYWdlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTWFudWFsbHkgdHJhbnNmZXIgcHJvcHNcbiAgICAgICAgICAgIHZhciBwcm9wcyA9ICgwLCBfbGliRmlsdGVyX3Byb3BzX2Zyb20uZmlsdGVyUHJvcHNGcm9tKSh0aGlzLnByb3BzKTtcblxuICAgICAgICAgICAgdmFyIG5vRGF0YVRleHQgPSB0aGlzLnByb3BzLm5vRGF0YVRleHQgPyBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAndHInLFxuICAgICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAncmVhY3RhYmxlLW5vLWRhdGEnIH0sXG4gICAgICAgICAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICd0ZCcsXG4gICAgICAgICAgICAgICAgICAgIHsgY29sU3BhbjogY29sdW1ucy5sZW5ndGggfSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5ub0RhdGFUZXh0XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSA6IG51bGw7XG5cbiAgICAgICAgICAgIHZhciB0YWJsZUhlYWRlciA9IG51bGw7XG4gICAgICAgICAgICBpZiAoY29sdW1ucyAmJiBjb2x1bW5zLmxlbmd0aCA+IDAgJiYgc2hvd0hlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICB0YWJsZUhlYWRlciA9IF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF90aGVhZC5UaGVhZCwgeyBjb2x1bW5zOiBjb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJpbmc6IGZpbHRlcmluZyxcbiAgICAgICAgICAgICAgICAgICAgb25GaWx0ZXI6IGZ1bmN0aW9uIChmaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnNldFN0YXRlKHsgZmlsdGVyOiBmaWx0ZXIgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMucHJvcHMub25GaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5wcm9wcy5vbkZpbHRlcihmaWx0ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJQbGFjZWhvbGRlcjogdGhpcy5wcm9wcy5maWx0ZXJQbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyQ2xhc3NOYW1lOiB0aGlzLnByb3BzLmZpbHRlckNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpbHRlcjogdGhpcy5zdGF0ZS5maWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgIHNvcnQ6IHRoaXMuc3RhdGUuY3VycmVudFNvcnQsXG4gICAgICAgICAgICAgICAgICAgIHNvcnRhYmxlQ29sdW1uczogdGhpcy5fc29ydGFibGUsXG4gICAgICAgICAgICAgICAgICAgIG9uU29ydDogdGhpcy5vblNvcnQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAga2V5OiAndGhlYWQnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICd0YWJsZScsXG4gICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgdGFibGVIZWFkZXIsXG4gICAgICAgICAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICd0Ym9keScsXG4gICAgICAgICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAncmVhY3RhYmxlLWRhdGEnLCBrZXk6ICd0Ym9keScgfSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudENoaWxkcmVuLmxlbmd0aCA+IDAgPyBjdXJyZW50Q2hpbGRyZW4gOiBub0RhdGFUZXh0XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBwYWdpbmF0aW9uID09PSB0cnVlID8gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX3BhZ2luYXRvci5QYWdpbmF0b3IsIHsgY29sU3BhbjogY29sdW1ucy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VCdXR0b25MaW1pdDogcGFnZUJ1dHRvbkxpbWl0LFxuICAgICAgICAgICAgICAgICAgICBudW1QYWdlczogbnVtUGFnZXMsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWdlOiBjdXJyZW50UGFnZSxcbiAgICAgICAgICAgICAgICAgICAgb25QYWdlQ2hhbmdlOiBmdW5jdGlvbiAocGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuc2V0U3RhdGUoeyBjdXJyZW50UGFnZTogcGFnZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5wcm9wcy5vblBhZ2VDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5wcm9wcy5vblBhZ2VDaGFuZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzUGFnZUxhYmVsOiB0aGlzLnByb3BzLnByZXZpb3VzUGFnZUxhYmVsLFxuICAgICAgICAgICAgICAgICAgICBuZXh0UGFnZUxhYmVsOiB0aGlzLnByb3BzLm5leHRQYWdlTGFiZWwsXG4gICAgICAgICAgICAgICAgICAgIGtleTogJ3BhZ2luYXRvcicgfSkgOiBudWxsLFxuICAgICAgICAgICAgICAgIHRoaXMudGZvb3RcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gVGFibGU7XG59KShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuZXhwb3J0cy5UYWJsZSA9IFRhYmxlO1xuXG5UYWJsZS5kZWZhdWx0UHJvcHMgPSB7XG4gICAgc29ydEJ5OiBmYWxzZSxcbiAgICBkZWZhdWx0U29ydDogZmFsc2UsXG4gICAgZGVmYXVsdFNvcnREZXNjZW5kaW5nOiBmYWxzZSxcbiAgICBpdGVtc1BlclBhZ2U6IDAsXG4gICAgZmlsdGVyQnk6ICcnLFxuICAgIGhpZGVGaWx0ZXJJbnB1dDogZmFsc2Vcbn07XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdGFibGUvbGliL3JlYWN0YWJsZS90YWJsZS5qc1xuICoqIG1vZHVsZSBpZCA9IDkzMFxuICoqIG1vZHVsZSBjaHVua3MgPSAzXG4gKiovIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZmlsdGVyUHJvcHNGcm9tID0gZmlsdGVyUHJvcHNGcm9tO1xudmFyIGludGVybmFsUHJvcHMgPSB7XG4gICAgY29sdW1uOiB0cnVlLFxuICAgIGNvbHVtbnM6IHRydWUsXG4gICAgc29ydGFibGU6IHRydWUsXG4gICAgZmlsdGVyYWJsZTogdHJ1ZSxcbiAgICBmaWx0ZXJpbmc6IHRydWUsXG4gICAgb25GaWx0ZXI6IHRydWUsXG4gICAgZmlsdGVyUGxhY2Vob2xkZXI6IHRydWUsXG4gICAgZmlsdGVyQ2xhc3NOYW1lOiB0cnVlLFxuICAgIGN1cnJlbnRGaWx0ZXI6IHRydWUsXG4gICAgc29ydDogdHJ1ZSxcbiAgICBzb3J0Qnk6IHRydWUsXG4gICAgc29ydGFibGVDb2x1bW5zOiB0cnVlLFxuICAgIG9uU29ydDogdHJ1ZSxcbiAgICBkZWZhdWx0U29ydDogdHJ1ZSxcbiAgICBkZWZhdWx0U29ydERlc2NlbmRpbmc6IHRydWUsXG4gICAgaXRlbXNQZXJQYWdlOiB0cnVlLFxuICAgIGZpbHRlckJ5OiB0cnVlLFxuICAgIGhpZGVGaWx0ZXJJbnB1dDogdHJ1ZSxcbiAgICBub0RhdGFUZXh0OiB0cnVlLFxuICAgIGN1cnJlbnRQYWdlOiB0cnVlLFxuICAgIHBhZ2VCdXR0b25MaW1pdDogdHJ1ZSxcbiAgICBjaGlsZE5vZGU6IHRydWUsXG4gICAgZGF0YTogdHJ1ZSxcbiAgICBjaGlsZHJlbjogdHJ1ZVxufTtcblxuZnVuY3Rpb24gZmlsdGVyUHJvcHNGcm9tKGJhc2VQcm9wcykge1xuICAgIGJhc2VQcm9wcyA9IGJhc2VQcm9wcyB8fCB7fTtcbiAgICB2YXIgcHJvcHMgPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gYmFzZVByb3BzKSB7XG4gICAgICAgIGlmICghKGtleSBpbiBpbnRlcm5hbFByb3BzKSkge1xuICAgICAgICAgICAgcHJvcHNba2V5XSA9IGJhc2VQcm9wc1trZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BzO1xufVxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcmVhY3RhYmxlL2xpYi9yZWFjdGFibGUvbGliL2ZpbHRlcl9wcm9wc19mcm9tLmpzXG4gKiogbW9kdWxlIGlkID0gOTMxXG4gKiogbW9kdWxlIGNodW5rcyA9IDNcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmV4dHJhY3REYXRhRnJvbSA9IGV4dHJhY3REYXRhRnJvbTtcblxudmFyIF9zdHJpbmdhYmxlID0gcmVxdWlyZSgnLi9zdHJpbmdhYmxlJyk7XG5cbmZ1bmN0aW9uIGV4dHJhY3REYXRhRnJvbShrZXksIGNvbHVtbikge1xuICAgIHZhciB2YWx1ZTtcbiAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3VuZGVmaW5lZCcgJiYga2V5ICE9PSBudWxsICYmIGtleS5fX3JlYWN0YWJsZU1ldGEgPT09IHRydWUpIHtcbiAgICAgICAgdmFsdWUgPSBrZXkuZGF0YVtjb2x1bW5dO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0ga2V5W2NvbHVtbl07XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUuX19yZWFjdGFibGVNZXRhID09PSB0cnVlKSB7XG4gICAgICAgIHZhbHVlID0gdHlwZW9mIHZhbHVlLnByb3BzLnZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZS5wcm9wcy52YWx1ZSAhPT0gbnVsbCA/IHZhbHVlLnByb3BzLnZhbHVlIDogdmFsdWUudmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfc3RyaW5nYWJsZS5zdHJpbmdhYmxlKSh2YWx1ZSkgPyB2YWx1ZSA6ICcnO1xufVxuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcmVhY3RhYmxlL2xpYi9yZWFjdGFibGUvbGliL2V4dHJhY3RfZGF0YV9mcm9tLmpzXG4gKiogbW9kdWxlIGlkID0gOTMyXG4gKiogbW9kdWxlIGNodW5rcyA9IDNcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnN0cmluZ2FibGUgPSBzdHJpbmdhYmxlO1xuXG5mdW5jdGlvbiBzdHJpbmdhYmxlKHRoaW5nKSB7XG4gICAgcmV0dXJuIHRoaW5nICE9PSBudWxsICYmIHR5cGVvZiB0aGluZyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mICh0aGluZy50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdGFibGUvbGliL3JlYWN0YWJsZS9saWIvc3RyaW5nYWJsZS5qc1xuICoqIG1vZHVsZSBpZCA9IDkzM1xuICoqIG1vZHVsZSBjaHVua3MgPSAzXG4gKiovIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG5leHBvcnRzLnVuc2FmZSA9IHVuc2FmZTtcbmV4cG9ydHMuaXNVbnNhZmUgPSBpc1Vuc2FmZTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIFVuc2FmZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVW5zYWZlKGNvbnRlbnQpIHtcbiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFVuc2FmZSk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50ID0gY29udGVudDtcbiAgICB9XG5cbiAgICBfY3JlYXRlQ2xhc3MoVW5zYWZlLCBbe1xuICAgICAgICBrZXk6IFwidG9TdHJpbmdcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudDtcbiAgICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBVbnNhZmU7XG59KSgpO1xuXG5mdW5jdGlvbiB1bnNhZmUoc3RyKSB7XG4gICAgcmV0dXJuIG5ldyBVbnNhZmUoc3RyKTtcbn1cblxuO1xuXG5mdW5jdGlvbiBpc1Vuc2FmZShvYmopIHtcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgVW5zYWZlO1xufVxuXG47XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdGFibGUvbGliL3JlYWN0YWJsZS91bnNhZmUuanNcbiAqKiBtb2R1bGUgaWQgPSA5MzRcbiAqKiBtb2R1bGUgY2h1bmtzID0gM1xuICoqLyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gsIF94MiwgX3gzKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94LCBwcm9wZXJ0eSA9IF94MiwgcmVjZWl2ZXIgPSBfeDM7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3ggPSBwYXJlbnQ7IF94MiA9IHByb3BlcnR5OyBfeDMgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoJ3ZhbHVlJyBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfdGggPSByZXF1aXJlKCcuL3RoJyk7XG5cbnZhciBfZmlsdGVyZXIgPSByZXF1aXJlKCcuL2ZpbHRlcmVyJyk7XG5cbnZhciBfbGliRmlsdGVyX3Byb3BzX2Zyb20gPSByZXF1aXJlKCcuL2xpYi9maWx0ZXJfcHJvcHNfZnJvbScpO1xuXG52YXIgVGhlYWQgPSAoZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgICBfaW5oZXJpdHMoVGhlYWQsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gICAgZnVuY3Rpb24gVGhlYWQoKSB7XG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUaGVhZCk7XG5cbiAgICAgICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoVGhlYWQucHJvdG90eXBlKSwgJ2NvbnN0cnVjdG9yJywgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQ2xhc3MoVGhlYWQsIFt7XG4gICAgICAgIGtleTogJ2hhbmRsZUNsaWNrVGgnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlQ2xpY2tUaChjb2x1bW4pIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25Tb3J0KGNvbHVtbi5rZXkpO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdoYW5kbGVLZXlEb3duVGgnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gaGFuZGxlS2V5RG93blRoKGNvbHVtbiwgZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSAxMykge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25Tb3J0KGNvbHVtbi5rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdyZW5kZXInLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICAgICAgLy8gRGVjbGFyZSB0aGUgbGlzdCBvZiBUaHNcbiAgICAgICAgICAgIHZhciBUaHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnByb3BzLmNvbHVtbnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMucHJvcHMuY29sdW1uc1tpbmRleF07XG4gICAgICAgICAgICAgICAgdmFyIHRoQ2xhc3MgPSAncmVhY3RhYmxlLXRoLScgKyBjb2x1bW4ua2V5LnJlcGxhY2UoL1xccysvZywgJy0nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHZhciBzb3J0Q2xhc3MgPSAnJztcbiAgICAgICAgICAgICAgICB2YXIgdGhSb2xlID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLnNvcnRhYmxlQ29sdW1uc1tjb2x1bW4ua2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBzb3J0Q2xhc3MgKz0gJ3JlYWN0YWJsZS1oZWFkZXItc29ydGFibGUgJztcbiAgICAgICAgICAgICAgICAgICAgdGhSb2xlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuc29ydC5jb2x1bW4gPT09IGNvbHVtbi5rZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgc29ydENsYXNzICs9ICdyZWFjdGFibGUtaGVhZGVyLXNvcnQnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5zb3J0LmRpcmVjdGlvbiA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc29ydENsYXNzICs9ICctYXNjJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRDbGFzcyArPSAnLWRlc2MnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHNvcnRDbGFzcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoQ2xhc3MgKz0gJyAnICsgc29ydENsYXNzO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29sdW1uLnByb3BzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgY29sdW1uLnByb3BzLmNsYXNzTmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhDbGFzcyArPSAnICcgKyBjb2x1bW4ucHJvcHMuY2xhc3NOYW1lO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIFRocy5wdXNoKF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICBfdGguVGgsXG4gICAgICAgICAgICAgICAgICAgIF9leHRlbmRzKHt9LCBjb2x1bW4ucHJvcHMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogdGhDbGFzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrVGguYmluZCh0aGlzLCBjb2x1bW4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25LZXlEb3duOiB0aGlzLmhhbmRsZUtleURvd25UaC5iaW5kKHRoaXMsIGNvbHVtbiksXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlOiB0aFJvbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJJbmRleDogJzAnIH0pLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW4ubGFiZWxcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTWFudWFsbHkgdHJhbnNmZXIgcHJvcHNcbiAgICAgICAgICAgIHZhciBwcm9wcyA9ICgwLCBfbGliRmlsdGVyX3Byb3BzX2Zyb20uZmlsdGVyUHJvcHNGcm9tKSh0aGlzLnByb3BzKTtcblxuICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICd0aGVhZCcsXG4gICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5maWx0ZXJpbmcgPT09IHRydWUgPyBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfZmlsdGVyZXIuRmlsdGVyZXIsIHtcbiAgICAgICAgICAgICAgICAgICAgY29sU3BhbjogdGhpcy5wcm9wcy5jb2x1bW5zLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgb25GaWx0ZXI6IHRoaXMucHJvcHMub25GaWx0ZXIsXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnByb3BzLmZpbHRlclBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5wcm9wcy5jdXJyZW50RmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IHRoaXMucHJvcHMuZmlsdGVyQ2xhc3NOYW1lXG4gICAgICAgICAgICAgICAgfSkgOiBudWxsLFxuICAgICAgICAgICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAndHInLFxuICAgICAgICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogJ3JlYWN0YWJsZS1jb2x1bW4taGVhZGVyJyB9LFxuICAgICAgICAgICAgICAgICAgICBUaHNcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfV0sIFt7XG4gICAgICAgIGtleTogJ2dldENvbHVtbnMnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q29sdW1ucyhjb21wb25lbnQpIHtcbiAgICAgICAgICAgIC8vIENhbid0IHVzZSBSZWFjdC5DaGlsZHJlbi5tYXAgc2luY2UgdGhhdCBkb2Vzbid0IHJldHVybiBhIHByb3BlciBhcnJheVxuICAgICAgICAgICAgdmFyIGNvbHVtbnMgPSBbXTtcbiAgICAgICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5DaGlsZHJlbi5mb3JFYWNoKGNvbXBvbmVudC5wcm9wcy5jaGlsZHJlbiwgZnVuY3Rpb24gKHRoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvbHVtbiA9IHt9O1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGgucHJvcHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5wcm9wcyA9ICgwLCBfbGliRmlsdGVyX3Byb3BzX2Zyb20uZmlsdGVyUHJvcHNGcm9tKSh0aC5wcm9wcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBjb250ZW50IGFzIHRoZSBsYWJlbCAmIGtleVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoLnByb3BzLmNoaWxkcmVuICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmxhYmVsID0gdGgucHJvcHMuY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4ua2V5ID0gY29sdW1uLmxhYmVsO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGtleSBpbiB0aGUgY29sdW1uIGF0dHJpYnV0ZSBzdXBlcnNlZGVzIHRoZSBvbmUgZGVmaW5lZCBwcmV2aW91c2x5XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGgucHJvcHMuY29sdW1uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmtleSA9IHRoLnByb3BzLmNvbHVtbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSB3ZSBkb24ndCBoYXZlIGEgbGFiZWwgeWV0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbHVtbi5sYWJlbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4ubGFiZWwgPSBjb2x1bW4ua2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb2x1bW4ua2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCc8dGg+IG11c3QgaGF2ZSBlaXRoZXIgYSBcImNvbHVtblwiIHByb3BlcnR5IG9yIGEgc3RyaW5nICcgKyAnY2hpbGQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gVGhlYWQ7XG59KShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuZXhwb3J0cy5UaGVhZCA9IFRoZWFkO1xuO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vcmVhY3RhYmxlL2xpYi9yZWFjdGFibGUvdGhlYWQuanNcbiAqKiBtb2R1bGUgaWQgPSA5MzVcbiAqKiBtb2R1bGUgY2h1bmtzID0gM1xuICoqLyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gsIF94MiwgX3gzKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94LCBwcm9wZXJ0eSA9IF94MiwgcmVjZWl2ZXIgPSBfeDM7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3ggPSBwYXJlbnQ7IF94MiA9IHByb3BlcnR5OyBfeDMgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoJ3ZhbHVlJyBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfdW5zYWZlID0gcmVxdWlyZSgnLi91bnNhZmUnKTtcblxudmFyIF9saWJGaWx0ZXJfcHJvcHNfZnJvbSA9IHJlcXVpcmUoJy4vbGliL2ZpbHRlcl9wcm9wc19mcm9tJyk7XG5cbnZhciBUaCA9IChmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgIF9pbmhlcml0cyhUaCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBUaCgpIHtcbiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRoKTtcblxuICAgICAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihUaC5wcm90b3R5cGUpLCAnY29uc3RydWN0b3InLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhUaCwgW3tcbiAgICAgICAga2V5OiAncmVuZGVyJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgICAgIHZhciBjaGlsZFByb3BzID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBpZiAoKDAsIF91bnNhZmUuaXNVbnNhZmUpKHRoaXMucHJvcHMuY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCd0aCcsIF9leHRlbmRzKHt9LCAoMCwgX2xpYkZpbHRlcl9wcm9wc19mcm9tLmZpbHRlclByb3BzRnJvbSkodGhpcy5wcm9wcyksIHtcbiAgICAgICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHsgX19odG1sOiB0aGlzLnByb3BzLmNoaWxkcmVuLnRvU3RyaW5nKCkgfSB9KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgJ3RoJyxcbiAgICAgICAgICAgICAgICAgICAgKDAsIF9saWJGaWx0ZXJfcHJvcHNfZnJvbS5maWx0ZXJQcm9wc0Zyb20pKHRoaXMucHJvcHMpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBUaDtcbn0pKF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5leHBvcnRzLlRoID0gVGg7XG47XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdGFibGUvbGliL3JlYWN0YWJsZS90aC5qc1xuICoqIG1vZHVsZSBpZCA9IDkzNlxuICoqIG1vZHVsZSBjaHVua3MgPSAzXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmICgndmFsdWUnIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICdmdW5jdGlvbicgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICcgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9yZWFjdERvbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuXG52YXIgX3JlYWN0RG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0RG9tKTtcblxudmFyIEZpbHRlcmVySW5wdXQgPSAoZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgICBfaW5oZXJpdHMoRmlsdGVyZXJJbnB1dCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBGaWx0ZXJlcklucHV0KCkge1xuICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRmlsdGVyZXJJbnB1dCk7XG5cbiAgICAgICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoRmlsdGVyZXJJbnB1dC5wcm90b3R5cGUpLCAnY29uc3RydWN0b3InLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhGaWx0ZXJlcklucHV0LCBbe1xuICAgICAgICBrZXk6ICdvbkNoYW5nZScsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBvbkNoYW5nZSgpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25GaWx0ZXIoX3JlYWN0RG9tMlsnZGVmYXVsdCddLmZpbmRET01Ob2RlKHRoaXMpLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAncmVuZGVyJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnaW5wdXQnLCB7IHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IHRoaXMucHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnByb3BzLnBsYWNlaG9sZGVyLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnByb3BzLnZhbHVlLFxuICAgICAgICAgICAgICAgIG9uS2V5VXA6IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpIH0pO1xuICAgICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIEZpbHRlcmVySW5wdXQ7XG59KShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuZXhwb3J0cy5GaWx0ZXJlcklucHV0ID0gRmlsdGVyZXJJbnB1dDtcbjtcblxudmFyIEZpbHRlcmVyID0gKGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50Mikge1xuICAgIF9pbmhlcml0cyhGaWx0ZXJlciwgX1JlYWN0JENvbXBvbmVudDIpO1xuXG4gICAgZnVuY3Rpb24gRmlsdGVyZXIoKSB7XG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGaWx0ZXJlcik7XG5cbiAgICAgICAgX2dldChPYmplY3QuZ2V0UHJvdG90eXBlT2YoRmlsdGVyZXIucHJvdG90eXBlKSwgJ2NvbnN0cnVjdG9yJywgdGhpcykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBfY3JlYXRlQ2xhc3MoRmlsdGVyZXIsIFt7XG4gICAgICAgIGtleTogJ3JlbmRlcicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuY29sU3BhbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNdXN0IHBhc3MgYSBjb2xTcGFuIGFyZ3VtZW50IHRvIEZpbHRlcmVyJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAndHInLFxuICAgICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAncmVhY3RhYmxlLWZpbHRlcmVyJyB9LFxuICAgICAgICAgICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAndGQnLFxuICAgICAgICAgICAgICAgICAgICB7IGNvbFNwYW46IHRoaXMucHJvcHMuY29sU3BhbiB9LFxuICAgICAgICAgICAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChGaWx0ZXJlcklucHV0LCB7IG9uRmlsdGVyOiB0aGlzLnByb3BzLm9uRmlsdGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucHJvcHMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogdGhpcy5wcm9wcy5wbGFjZWhvbGRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogdGhpcy5wcm9wcy5jbGFzc05hbWUgPyAncmVhY3RhYmxlLWZpbHRlci1pbnB1dCAnICsgdGhpcy5wcm9wcy5jbGFzc05hbWUgOiAncmVhY3RhYmxlLWZpbHRlci1pbnB1dCcgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIEZpbHRlcmVyO1xufSkoX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbmV4cG9ydHMuRmlsdGVyZXIgPSBGaWx0ZXJlcjtcbjtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3JlYWN0YWJsZS9saWIvcmVhY3RhYmxlL2ZpbHRlcmVyLmpzXG4gKiogbW9kdWxlIGlkID0gOTM3XG4gKiogbW9kdWxlIGNodW5rcyA9IDNcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeCwgcHJvcGVydHkgPSBfeDIsIHJlY2VpdmVyID0gX3gzOyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94ID0gcGFyZW50OyBfeDIgPSBwcm9wZXJ0eTsgX3gzID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKCd2YWx1ZScgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ1N1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJyArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3RkID0gcmVxdWlyZSgnLi90ZCcpO1xuXG52YXIgX2xpYlRvX2FycmF5ID0gcmVxdWlyZSgnLi9saWIvdG9fYXJyYXknKTtcblxudmFyIF9saWJGaWx0ZXJfcHJvcHNfZnJvbSA9IHJlcXVpcmUoJy4vbGliL2ZpbHRlcl9wcm9wc19mcm9tJyk7XG5cbnZhciBUciA9IChmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgIF9pbmhlcml0cyhUciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBUcigpIHtcbiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRyKTtcblxuICAgICAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihUci5wcm90b3R5cGUpLCAnY29uc3RydWN0b3InLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhUciwgW3tcbiAgICAgICAga2V5OiAncmVuZGVyJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9ICgwLCBfbGliVG9fYXJyYXkudG9BcnJheSkoX3JlYWN0MlsnZGVmYXVsdCddLkNoaWxkcmVuLmNoaWxkcmVuKHRoaXMucHJvcHMuY2hpbGRyZW4pKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuZGF0YSAmJiB0aGlzLnByb3BzLmNvbHVtbnMgJiYgdHlwZW9mIHRoaXMucHJvcHMuY29sdW1ucy5tYXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkcmVuLmNvbmNhdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uY29uY2F0KHRoaXMucHJvcHMuY29sdW1ucy5tYXAoKGZ1bmN0aW9uIChjb2x1bW4sIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuZGF0YS5oYXNPd25Qcm9wZXJ0eShjb2x1bW4ua2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5wcm9wcy5kYXRhW2NvbHVtbi5rZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BzID0ge307XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlLl9fcmVhY3RhYmxlTWV0YSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzID0gdmFsdWUucHJvcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90ZC5UZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXh0ZW5kcyh7IGNvbHVtbjogY29sdW1uLCBrZXk6IGNvbHVtbi5rZXkgfSwgcHJvcHMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF90ZC5UZCwgeyBjb2x1bW46IGNvbHVtbiwga2V5OiBjb2x1bW4ua2V5IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSkuYmluZCh0aGlzKSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBNYW51YWxseSB0cmFuc2ZlciBwcm9wc1xuICAgICAgICAgICAgdmFyIHByb3BzID0gKDAsIF9saWJGaWx0ZXJfcHJvcHNfZnJvbS5maWx0ZXJQcm9wc0Zyb20pKHRoaXMucHJvcHMpO1xuXG4gICAgICAgICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLkRPTS50cihwcm9wcywgY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIFRyO1xufSkoX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbmV4cG9ydHMuVHIgPSBUcjtcbjtcblxuVHIuY2hpbGROb2RlID0gX3RkLlRkO1xuVHIuZGF0YVR5cGUgPSAnb2JqZWN0JztcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3JlYWN0YWJsZS9saWIvcmVhY3RhYmxlL3RyLmpzXG4gKiogbW9kdWxlIGlkID0gOTM4XG4gKiogbW9kdWxlIGNodW5rcyA9IDNcbiAqKi8iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0pKCk7XG5cbnZhciBfZ2V0ID0gZnVuY3Rpb24gZ2V0KF94LCBfeDIsIF94MykgeyB2YXIgX2FnYWluID0gdHJ1ZTsgX2Z1bmN0aW9uOiB3aGlsZSAoX2FnYWluKSB7IHZhciBvYmplY3QgPSBfeCwgcHJvcGVydHkgPSBfeDIsIHJlY2VpdmVyID0gX3gzOyBfYWdhaW4gPSBmYWxzZTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgb2JqZWN0ID0gRnVuY3Rpb24ucHJvdG90eXBlOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSk7IGlmIChkZXNjID09PSB1bmRlZmluZWQpIHsgdmFyIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmplY3QpOyBpZiAocGFyZW50ID09PSBudWxsKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSB7IF94ID0gcGFyZW50OyBfeDIgPSBwcm9wZXJ0eTsgX3gzID0gcmVjZWl2ZXI7IF9hZ2FpbiA9IHRydWU7IGRlc2MgPSBwYXJlbnQgPSB1bmRlZmluZWQ7IGNvbnRpbnVlIF9mdW5jdGlvbjsgfSB9IGVsc2UgaWYgKCd2YWx1ZScgaW4gZGVzYykgeyByZXR1cm4gZGVzYy52YWx1ZTsgfSBlbHNlIHsgdmFyIGdldHRlciA9IGRlc2MuZ2V0OyBpZiAoZ2V0dGVyID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSByZXR1cm4gZ2V0dGVyLmNhbGwocmVjZWl2ZXIpOyB9IH0gfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ1N1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJyArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2xpYklzX3JlYWN0X2NvbXBvbmVudCA9IHJlcXVpcmUoJy4vbGliL2lzX3JlYWN0X2NvbXBvbmVudCcpO1xuXG52YXIgX2xpYlN0cmluZ2FibGUgPSByZXF1aXJlKCcuL2xpYi9zdHJpbmdhYmxlJyk7XG5cbnZhciBfdW5zYWZlID0gcmVxdWlyZSgnLi91bnNhZmUnKTtcblxudmFyIF9saWJGaWx0ZXJfcHJvcHNfZnJvbSA9IHJlcXVpcmUoJy4vbGliL2ZpbHRlcl9wcm9wc19mcm9tJyk7XG5cbnZhciBUZCA9IChmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgIF9pbmhlcml0cyhUZCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBUZCgpIHtcbiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRkKTtcblxuICAgICAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihUZC5wcm90b3R5cGUpLCAnY29uc3RydWN0b3InLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhUZCwgW3tcbiAgICAgICAga2V5OiAnc3RyaW5naWZ5SWZOb3RSZWFjdENvbXBvbmVudCcsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBzdHJpbmdpZnlJZk5vdFJlYWN0Q29tcG9uZW50KG9iamVjdCkge1xuICAgICAgICAgICAgaWYgKCEoMCwgX2xpYklzX3JlYWN0X2NvbXBvbmVudC5pc1JlYWN0Q29tcG9uZW50KShvYmplY3QpICYmICgwLCBfbGliU3RyaW5nYWJsZS5zdHJpbmdhYmxlKShvYmplY3QpICYmIHR5cGVvZiBvYmplY3QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC50b1N0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ3JlbmRlcicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgICAgICAvLyBBdHRhY2ggYW55IHByb3BlcnRpZXMgb24gdGhlIGNvbHVtbiB0byB0aGlzIFRkIG9iamVjdCB0byBhbGxvdyB0aGluZ3MgbGlrZSBjdXN0b20gZXZlbnQgaGFuZGxlcnNcbiAgICAgICAgICAgIHZhciBtZXJnZWRQcm9wcyA9ICgwLCBfbGliRmlsdGVyX3Byb3BzX2Zyb20uZmlsdGVyUHJvcHNGcm9tKSh0aGlzLnByb3BzKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5jb2x1bW4gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMucHJvcHMuY29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT09ICdrZXknICYmIGtleSAhPT0gJ25hbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWRQcm9wc1trZXldID0gdGhpcy5wcm9wcy5jb2x1bW5ba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGhhbmRsZUNsaWNrIGFsaWFzZXMgb25DbGljayBldmVudFxuICAgICAgICAgICAgbWVyZ2VkUHJvcHMub25DbGljayA9IHRoaXMucHJvcHMuaGFuZGxlQ2xpY2s7XG5cbiAgICAgICAgICAgIHZhciBzdHJpbmdpZmllZENoaWxkUHJvcHM7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5kYXRhID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHN0cmluZ2lmaWVkQ2hpbGRQcm9wcyA9IHRoaXMuc3RyaW5naWZ5SWZOb3RSZWFjdENvbXBvbmVudCh0aGlzLnByb3BzLmNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCgwLCBfdW5zYWZlLmlzVW5zYWZlKSh0aGlzLnByb3BzLmNoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgndGQnLCBfZXh0ZW5kcyh7fSwgbWVyZ2VkUHJvcHMsIHtcbiAgICAgICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHsgX19odG1sOiB0aGlzLnByb3BzLmNoaWxkcmVuLnRvU3RyaW5nKCkgfSB9KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgJ3RkJyxcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VkUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ2lmaWVkQ2hpbGRQcm9wcyB8fCB0aGlzLnByb3BzLmNoaWxkcmVuXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBUZDtcbn0pKF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5leHBvcnRzLlRkID0gVGQ7XG47XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdGFibGUvbGliL3JlYWN0YWJsZS90ZC5qc1xuICoqIG1vZHVsZSBpZCA9IDkzOVxuICoqIG1vZHVsZSBjaHVua3MgPSAzXG4gKiovIiwiLy8gdGhpcyBpcyBhIGJpdCBoYWNreSAtIGl0J2QgYmUgbmljZSBpZiBSZWFjdCBleHBvc2VkIGFuIEFQSSBmb3IgdGhpc1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5pc1JlYWN0Q29tcG9uZW50ID0gaXNSZWFjdENvbXBvbmVudDtcblxuZnVuY3Rpb24gaXNSZWFjdENvbXBvbmVudCh0aGluZykge1xuICAgIHJldHVybiB0aGluZyAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpbmcgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0aGluZy5wcm9wcyAhPT0gJ3VuZGVmaW5lZCc7XG59XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdGFibGUvbGliL3JlYWN0YWJsZS9saWIvaXNfcmVhY3RfY29tcG9uZW50LmpzXG4gKiogbW9kdWxlIGlkID0gOTQwXG4gKiogbW9kdWxlIGNodW5rcyA9IDNcbiAqKi8iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy50b0FycmF5ID0gdG9BcnJheTtcblxuZnVuY3Rpb24gdG9BcnJheShvYmopIHtcbiAgICB2YXIgcmV0ID0gW107XG4gICAgZm9yICh2YXIgYXR0ciBpbiBvYmopIHtcbiAgICAgICAgcmV0W2F0dHJdID0gb2JqO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG59XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdGFibGUvbGliL3JlYWN0YWJsZS9saWIvdG9fYXJyYXkuanNcbiAqKiBtb2R1bGUgaWQgPSA5NDFcbiAqKiBtb2R1bGUgY2h1bmtzID0gM1xuICoqLyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IChmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSkoKTtcblxudmFyIF9nZXQgPSBmdW5jdGlvbiBnZXQoX3gsIF94MiwgX3gzKSB7IHZhciBfYWdhaW4gPSB0cnVlOyBfZnVuY3Rpb246IHdoaWxlIChfYWdhaW4pIHsgdmFyIG9iamVjdCA9IF94LCBwcm9wZXJ0eSA9IF94MiwgcmVjZWl2ZXIgPSBfeDM7IF9hZ2FpbiA9IGZhbHNlOyBpZiAob2JqZWN0ID09PSBudWxsKSBvYmplY3QgPSBGdW5jdGlvbi5wcm90b3R5cGU7IHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHByb3BlcnR5KTsgaWYgKGRlc2MgPT09IHVuZGVmaW5lZCkgeyB2YXIgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChwYXJlbnQgPT09IG51bGwpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSBlbHNlIHsgX3ggPSBwYXJlbnQ7IF94MiA9IHByb3BlcnR5OyBfeDMgPSByZWNlaXZlcjsgX2FnYWluID0gdHJ1ZTsgZGVzYyA9IHBhcmVudCA9IHVuZGVmaW5lZDsgY29udGludWUgX2Z1bmN0aW9uOyB9IH0gZWxzZSBpZiAoJ3ZhbHVlJyBpbiBkZXNjKSB7IHJldHVybiBkZXNjLnZhbHVlOyB9IGVsc2UgeyB2YXIgZ2V0dGVyID0gZGVzYy5nZXQ7IGlmIChnZXR0ZXIgPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IHJldHVybiBnZXR0ZXIuY2FsbChyZWNlaXZlcik7IH0gfSB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBUZm9vdCA9IChmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgIF9pbmhlcml0cyhUZm9vdCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBUZm9vdCgpIHtcbiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRmb290KTtcblxuICAgICAgICBfZ2V0KE9iamVjdC5nZXRQcm90b3R5cGVPZihUZm9vdC5wcm90b3R5cGUpLCAnY29uc3RydWN0b3InLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhUZm9vdCwgW3tcbiAgICAgICAga2V5OiAncmVuZGVyJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgndGZvb3QnLCB0aGlzLnByb3BzKTtcbiAgICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBUZm9vdDtcbn0pKF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5leHBvcnRzLlRmb290ID0gVGZvb3Q7XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdGFibGUvbGliL3JlYWN0YWJsZS90Zm9vdC5qc1xuICoqIG1vZHVsZSBpZCA9IDk0MlxuICoqIG1vZHVsZSBjaHVua3MgPSAzXG4gKiovIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gKGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KSgpO1xuXG52YXIgX2dldCA9IGZ1bmN0aW9uIGdldChfeCwgX3gyLCBfeDMpIHsgdmFyIF9hZ2FpbiA9IHRydWU7IF9mdW5jdGlvbjogd2hpbGUgKF9hZ2FpbikgeyB2YXIgb2JqZWN0ID0gX3gsIHByb3BlcnR5ID0gX3gyLCByZWNlaXZlciA9IF94MzsgX2FnYWluID0gZmFsc2U7IGlmIChvYmplY3QgPT09IG51bGwpIG9iamVjdCA9IEZ1bmN0aW9uLnByb3RvdHlwZTsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpOyBpZiAoZGVzYyA9PT0gdW5kZWZpbmVkKSB7IHZhciBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKHBhcmVudCA9PT0gbnVsbCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9IGVsc2UgeyBfeCA9IHBhcmVudDsgX3gyID0gcHJvcGVydHk7IF94MyA9IHJlY2VpdmVyOyBfYWdhaW4gPSB0cnVlOyBkZXNjID0gcGFyZW50ID0gdW5kZWZpbmVkOyBjb250aW51ZSBfZnVuY3Rpb247IH0gfSBlbHNlIGlmICgndmFsdWUnIGluIGRlc2MpIHsgcmV0dXJuIGRlc2MudmFsdWU7IH0gZWxzZSB7IHZhciBnZXR0ZXIgPSBkZXNjLmdldDsgaWYgKGdldHRlciA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gcmV0dXJuIGdldHRlci5jYWxsKHJlY2VpdmVyKTsgfSB9IH07XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICdmdW5jdGlvbicgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICcgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxuZnVuY3Rpb24gcGFnZUhyZWYobnVtKSB7XG4gICAgcmV0dXJuICcjcGFnZS0nICsgKG51bSArIDEpO1xufVxuXG52YXIgUGFnaW5hdG9yID0gKGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzKFBhZ2luYXRvciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBQYWdpbmF0b3IoKSB7XG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQYWdpbmF0b3IpO1xuXG4gICAgICAgIF9nZXQoT2JqZWN0LmdldFByb3RvdHlwZU9mKFBhZ2luYXRvci5wcm90b3R5cGUpLCAnY29uc3RydWN0b3InLCB0aGlzKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhQYWdpbmF0b3IsIFt7XG4gICAgICAgIGtleTogJ2hhbmRsZVByZXZpb3VzJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGhhbmRsZVByZXZpb3VzKGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25QYWdlQ2hhbmdlKHRoaXMucHJvcHMuY3VycmVudFBhZ2UgLSAxKTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnaGFuZGxlTmV4dCcsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVOZXh0KGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25QYWdlQ2hhbmdlKHRoaXMucHJvcHMuY3VycmVudFBhZ2UgKyAxKTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnaGFuZGxlUGFnZUJ1dHRvbicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBoYW5kbGVQYWdlQnV0dG9uKHBhZ2UsIGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25QYWdlQ2hhbmdlKHBhZ2UpO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdyZW5kZXJQcmV2aW91cycsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJQcmV2aW91cygpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLmN1cnJlbnRQYWdlID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgJ2EnLFxuICAgICAgICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogJ3JlYWN0YWJsZS1wcmV2aW91cy1wYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6IHBhZ2VIcmVmKHRoaXMucHJvcHMuY3VycmVudFBhZ2UgLSAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlUHJldmlvdXMuYmluZCh0aGlzKSB9LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnByZXZpb3VzUGFnZUxhYmVsIHx8ICdQcmV2aW91cydcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdyZW5kZXJOZXh0JyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlck5leHQoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5jdXJyZW50UGFnZSA8IHRoaXMucHJvcHMubnVtUGFnZXMgLSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAnYScsXG4gICAgICAgICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiAncmVhY3RhYmxlLW5leHQtcGFnZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmOiBwYWdlSHJlZih0aGlzLnByb3BzLmN1cnJlbnRQYWdlICsgMSksXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZU5leHQuYmluZCh0aGlzKSB9LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm5leHRQYWdlTGFiZWwgfHwgJ05leHQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAncmVuZGVyUGFnZUJ1dHRvbicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJQYWdlQnV0dG9uKGNsYXNzTmFtZSwgcGFnZU51bSkge1xuXG4gICAgICAgICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgJ2EnLFxuICAgICAgICAgICAgICAgIHsgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgIGtleTogcGFnZU51bSxcbiAgICAgICAgICAgICAgICAgICAgaHJlZjogcGFnZUhyZWYocGFnZU51bSksXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlUGFnZUJ1dHRvbi5iaW5kKHRoaXMsIHBhZ2VOdW0pIH0sXG4gICAgICAgICAgICAgICAgcGFnZU51bSArIDFcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ3JlbmRlcicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuY29sU3BhbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNdXN0IHBhc3MgYSBjb2xTcGFuIGFyZ3VtZW50IHRvIFBhZ2luYXRvcicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMubnVtUGFnZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTXVzdCBwYXNzIGEgbm9uLXplcm8gbnVtUGFnZXMgYXJndW1lbnQgdG8gUGFnaW5hdG9yJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5jdXJyZW50UGFnZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNdXN0IHBhc3MgYSBjdXJyZW50UGFnZSBhcmd1bWVudCB0byBQYWdpbmF0b3InKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHBhZ2VCdXR0b25zID0gW107XG4gICAgICAgICAgICB2YXIgcGFnZUJ1dHRvbkxpbWl0ID0gdGhpcy5wcm9wcy5wYWdlQnV0dG9uTGltaXQ7XG4gICAgICAgICAgICB2YXIgY3VycmVudFBhZ2UgPSB0aGlzLnByb3BzLmN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgdmFyIG51bVBhZ2VzID0gdGhpcy5wcm9wcy5udW1QYWdlcztcbiAgICAgICAgICAgIHZhciBsb3dlckhhbGYgPSBNYXRoLnJvdW5kKHBhZ2VCdXR0b25MaW1pdCAvIDIpO1xuICAgICAgICAgICAgdmFyIHVwcGVySGFsZiA9IHBhZ2VCdXR0b25MaW1pdCAtIGxvd2VySGFsZjtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnByb3BzLm51bVBhZ2VzOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgc2hvd1BhZ2VCdXR0b24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB2YXIgcGFnZU51bSA9IGk7XG4gICAgICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IFwicmVhY3RhYmxlLXBhZ2UtYnV0dG9uXCI7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlID09PSBpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSArPSBcIiByZWFjdGFibGUtY3VycmVudC1wYWdlXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhZ2VCdXR0b25zLnB1c2godGhpcy5yZW5kZXJQYWdlQnV0dG9uKGNsYXNzTmFtZSwgcGFnZU51bSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudFBhZ2UgLSBwYWdlQnV0dG9uTGltaXQgKyBsb3dlckhhbGYgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlID4gbnVtUGFnZXMgLSBsb3dlckhhbGYpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZUJ1dHRvbnMuc3BsaWNlKDAsIG51bVBhZ2VzIC0gcGFnZUJ1dHRvbkxpbWl0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYWdlQnV0dG9ucy5zcGxpY2UoMCwgY3VycmVudFBhZ2UgLSBwYWdlQnV0dG9uTGltaXQgKyBsb3dlckhhbGYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bVBhZ2VzIC0gY3VycmVudFBhZ2UgPiB1cHBlckhhbGYpIHtcbiAgICAgICAgICAgICAgICBwYWdlQnV0dG9ucy5zcGxpY2UocGFnZUJ1dHRvbkxpbWl0LCBwYWdlQnV0dG9ucy5sZW5ndGggLSBwYWdlQnV0dG9uTGltaXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgJ3Rib2R5JyxcbiAgICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogJ3JlYWN0YWJsZS1wYWdpbmF0aW9uJyB9LFxuICAgICAgICAgICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICAndHInLFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICd0ZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGNvbFNwYW46IHRoaXMucHJvcHMuY29sU3BhbiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJQcmV2aW91cygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUJ1dHRvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlck5leHQoKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBQYWdpbmF0b3I7XG59KShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuZXhwb3J0cy5QYWdpbmF0b3IgPSBQYWdpbmF0b3I7XG47XG5cblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9yZWFjdGFibGUvbGliL3JlYWN0YWJsZS9wYWdpbmF0b3IuanNcbiAqKiBtb2R1bGUgaWQgPSA5NDNcbiAqKiBtb2R1bGUgY2h1bmtzID0gM1xuICoqLyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcbnZhciBTb3J0ID0ge1xuICAgIE51bWVyaWM6IGZ1bmN0aW9uIE51bWVyaWMoYSwgYikge1xuICAgICAgICB2YXIgdmFsQSA9IHBhcnNlRmxvYXQoYS50b1N0cmluZygpLnJlcGxhY2UoLywvZywgJycpKTtcbiAgICAgICAgdmFyIHZhbEIgPSBwYXJzZUZsb2F0KGIudG9TdHJpbmcoKS5yZXBsYWNlKC8sL2csICcnKSk7XG5cbiAgICAgICAgLy8gU29ydCBub24tbnVtZXJpYyB2YWx1ZXMgYWxwaGFiZXRpY2FsbHkgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdFxuICAgICAgICBpZiAoaXNOYU4odmFsQSkgJiYgaXNOYU4odmFsQikpIHtcbiAgICAgICAgICAgIHZhbEEgPSBhO1xuICAgICAgICAgICAgdmFsQiA9IGI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNOYU4odmFsQSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc05hTih2YWxCKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWxBIDwgdmFsQikge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxBID4gdmFsQikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMDtcbiAgICB9LFxuXG4gICAgTnVtZXJpY0ludGVnZXI6IGZ1bmN0aW9uIE51bWVyaWNJbnRlZ2VyKGEsIGIpIHtcbiAgICAgICAgaWYgKGlzTmFOKGEpIHx8IGlzTmFOKGIpKSB7XG4gICAgICAgICAgICByZXR1cm4gYSA+IGIgPyAxIDogLTE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYSAtIGI7XG4gICAgfSxcblxuICAgIEN1cnJlbmN5OiBmdW5jdGlvbiBDdXJyZW5jeShhLCBiKSB7XG4gICAgICAgIC8vIFBhcnNlIG91dCBkb2xsYXIgc2lnbnMsIHRoZW4gZG8gYSByZWd1bGFyIG51bWVyaWMgc29ydFxuICAgICAgICBhID0gYS5yZXBsYWNlKC9bXjAtOVxcLlxcLVxcLF0rL2csICcnKTtcbiAgICAgICAgYiA9IGIucmVwbGFjZSgvW14wLTlcXC5cXC1cXCxdKy9nLCAnJyk7XG5cbiAgICAgICAgcmV0dXJuIGV4cG9ydHMuU29ydC5OdW1lcmljKGEsIGIpO1xuICAgIH0sXG5cbiAgICBEYXRlOiAoZnVuY3Rpb24gKF9EYXRlKSB7XG4gICAgICAgIGZ1bmN0aW9uIERhdGUoX3gsIF94Mikge1xuICAgICAgICAgICAgcmV0dXJuIF9EYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cblxuICAgICAgICBEYXRlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9EYXRlLnRvU3RyaW5nKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIERhdGU7XG4gICAgfSkoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgLy8gTm90ZTogdGhpcyBmdW5jdGlvbiB0cmllcyB0byBkbyBhIHN0YW5kYXJkIGphdmFzY3JpcHQgc3RyaW5nIC0+IGRhdGUgY29udmVyc2lvblxuICAgICAgICAvLyBJZiB5b3UgbmVlZCBtb3JlIGNvbnRyb2wgb3ZlciB0aGUgZGF0ZSBzdHJpbmcgZm9ybWF0LCBjb25zaWRlciB1c2luZyBhIGRpZmZlcmVudFxuICAgICAgICAvLyBkYXRlIGxpYnJhcnkgYW5kIHdyaXRpbmcgeW91ciBvd24gZnVuY3Rpb25cbiAgICAgICAgdmFyIHZhbEEgPSBEYXRlLnBhcnNlKGEpO1xuICAgICAgICB2YXIgdmFsQiA9IERhdGUucGFyc2UoYik7XG5cbiAgICAgICAgLy8gSGFuZGxlIG5vbi1kYXRlIHZhbHVlcyB3aXRoIG51bWVyaWMgc29ydFxuICAgICAgICAvLyBTb3J0IG5vbi1udW1lcmljIHZhbHVlcyBhbHBoYWJldGljYWxseSBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0XG4gICAgICAgIGlmIChpc05hTih2YWxBKSB8fCBpc05hTih2YWxCKSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4cG9ydHMuU29ydC5OdW1lcmljKGEsIGIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbEEgPiB2YWxCKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsQiA+IHZhbEEpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH0pLFxuXG4gICAgQ2FzZUluc2Vuc2l0aXZlOiBmdW5jdGlvbiBDYXNlSW5zZW5zaXRpdmUoYSwgYikge1xuICAgICAgICByZXR1cm4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG59O1xuZXhwb3J0cy5Tb3J0ID0gU29ydDtcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L3JlYWN0YWJsZS9saWIvcmVhY3RhYmxlL3NvcnQuanNcbiAqKiBtb2R1bGUgaWQgPSA5NDRcbiAqKiBtb2R1bGUgY2h1bmtzID0gM1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +webpackJsonp([3],{128:function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var o=r(15),i=n(o),a=r(129),u=r(137),l=r(138),s=r(135),c=r(141),p=r(134),f=r(143),d=r(133);i["default"].Children.children=function(e){return i["default"].Children.map(e,function(e){return e})||[]},Array.prototype.find||Object.defineProperty(Array.prototype,"find",{enumerable:!1,configurable:!0,writable:!0,value:function y(e){if(null===this)throw new TypeError("Array.prototype.find called on null or undefined");if("function"!=typeof e)throw new TypeError("predicate must be a function");for(var y,t=Object(this),r=t.length>>>0,n=arguments[1],o=0;o, but more than one was specified.Ignoring all but the last one"),r=e;break;case y.Tr:var n=e.props.data||{};c["default"].Children.forEach(e.props.children,function(e){if("object"==typeof e&&null!=e)if("undefined"!=typeof e.props.column){var t=void 0;if("undefined"!=typeof e.props.data)t=e.props.data;else{if("undefined"==typeof e.props.children)return void console.warn("exports.Td specified without a `data` property or children, ignoring");t=e.props.children}n[e.props.column]={value:t,props:(0,p.filterPropsFrom)(e.props),__reactableMeta:!0}}else console.warn("exports.Td specified without a `column` property, ignoring")}),t.push({data:n,props:(0,p.filterPropsFrom)(e.props),__reactableMeta:!0});break;default:console.warn("The only possible children of are , , or one .")}}.bind(this)),{data:t,tfoot:r}}},{key:"initialize",value:function(e){this.data=e.data||[];var t=this.parseChildData(e),r=t.data,n=t.tfoot;this.data=this.data.concat(r),this.tfoot=n,this.initializeSorts(e),this.initializeFilters(e)}},{key:"initializeFilters",value:function(e){this._filterable={};for(var t in e.filterable){var r=e.filterable[t],n=void 0,o=void 0;if(r instanceof Object){if("undefined"==typeof r.column){console.warn("Filterable column specified without column name");continue}n=r.column,o="function"==typeof r.filterFunction?r.filterFunction:"default"}else n=r,o="default";this._filterable[n]=o}}},{key:"initializeSorts",value:function(e){this._sortable={};for(var t in e.sortable){var r=e.sortable[t],n=void 0,o=void 0;if(r instanceof Object){if("undefined"==typeof r.column)return void console.warn("Sortable column specified without column name");n=r.column,o="function"==typeof r.sortFunction?r.sortFunction:"default"}else n=r,o="default";this._sortable[n]=o}}},{key:"getCurrentSort",value:function(e){var t=void 0,r=void 0;if(e instanceof Object){if("undefined"==typeof e.column)return void console.warn("Default column specified without column name");if(t=e.column,"undefined"!=typeof e.direction)if(1===e.direction||"asc"===e.direction)r=1;else if(e.direction===-1||"desc"===e.direction)r=-1;else{var n=this.props.defaultSortDescending?"descending":"ascending";console.warn("Invalid default sort specified. Defaulting to "+n),r=this.props.defaultSortDescending?-1:1}else r=this.props.defaultSortDescending?-1:1}else t=e,r=this.props.defaultSortDescending?-1:1;return{column:t,direction:r}}},{key:"updateCurrentSort",value:function(e){e!==!1&&e.column!==this.state.currentSort.column&&e.direction!==this.state.currentSort.direction&&this.setState({currentSort:this.getCurrentSort(e)})}},{key:"updateCurrentPage",value:function(e){"undefined"!=typeof e&&e!==this.state.currentPage&&this.setState({currentPage:e})}},{key:"componentWillMount",value:function(){this.initialize(this.props),this.sortByCurrentSort(),this.filterBy(this.props.filterBy)}},{key:"componentWillReceiveProps",value:function(e){this.initialize(e),this.updateCurrentPage(e.currentPage),this.updateCurrentSort(e.sortBy),this.sortByCurrentSort(),this.filterBy(e.filterBy)}},{key:"applyFilter",value:function(e,t){e=e.toLowerCase();for(var r=[],n=0;n-1){r.push(t[n]);break}}else if(this._filterable[i]((0,f.extractDataFrom)(o,i).toString(),e)){r.push(t[n]);break}}return r}},{key:"sortByCurrentSort",value:function(){var e=this.state.currentSort;null!==e.column&&this.data.sort(function(t,r){var n=(0,f.extractDataFrom)(t,e.column);n=(0,d.isUnsafe)(n)?n.toString():n||"";var o=(0,f.extractDataFrom)(r,e.column);return o=(0,d.isUnsafe)(o)?o.toString():o||"","undefined"==typeof this._sortable[e.column]||"default"===this._sortable[e.column]?no?1*e.direction:0:1===e.direction?this._sortable[e.column](n,o):this._sortable[e.column](o,n)}.bind(this))}},{key:"onSort",value:function(e){if("undefined"!=typeof this._sortable[e]){var t=this.state.currentSort;t.column===e?t.direction*=-1:(t.column=e,t.direction=this.props.defaultSortDescending?-1:1),this.setState({currentSort:t}),this.sortByCurrentSort(),"function"==typeof this.props.onSort&&this.props.onSort(t)}}},{key:"render",value:function(){var e=this,t=[],r=void 0,n=!1,o="undefined"==typeof this.props.hideTableHeader,i=null;if(this.props.children&&(this.props.children.length>0&&this.props.children[0]&&this.props.children[0].type===h.Thead?i=this.props.children[0]:this.props.children.type===h.Thead&&(i=this.props.children)),r=null!==i?h.Thead.getColumns(i):this.props.columns||[],r.length>0&&(n=!0,r=this.translateColumnsArray(r)),this.data&&"function"==typeof this.data.map&&(t=t.concat(this.data.map(function(e,t){var o=e,i={};e.__reactableMeta===!0&&(o=e.data,i=e.props);for(var u in o)o.hasOwnProperty(u)&&n===!1&&!function(){var e={key:u,label:u};void 0===r.find(function(t){return t.key===e.key})&&r.push(e)}();return c["default"].createElement(y.Tr,a({columns:r,key:t,data:o},i))}.bind(this)))),this.props.sortable===!0)for(var u=0;u0&&!this.props.hideFilterInput&&(l=!0);var s=t;""!==this.state.filter&&(s=this.applyFilter(this.state.filter,s));var f=0,d=!1,b=void 0,m=this.state.currentPage,g=this.props.pageButtonLimit||10,P=s;this.props.itemsPerPage>0&&(f=this.props.itemsPerPage,b=Math.ceil(s.length/f),m>b-1&&(m=b-1),d=!0,P=s.slice(m*f,(m+1)*f));var O=(0,p.filterPropsFrom)(this.props),_=this.props.noDataText?c["default"].createElement("tr",{className:"reactable-no-data"},c["default"].createElement("td",{colSpan:r.length},this.props.noDataText)):null,w=null;return r&&r.length>0&&o&&(w=c["default"].createElement(h.Thead,{columns:r,filtering:l,onFilter:function(t){e.setState({filter:t}),e.props.onFilter&&e.props.onFilter(t)},filterPlaceholder:this.props.filterPlaceholder,filterClassName:this.props.filterClassName,currentFilter:this.state.filter,sort:this.state.currentSort,sortableColumns:this._sortable,onSort:this.onSort.bind(this),key:"thead"})),c["default"].createElement("table",O,w,c["default"].createElement("tbody",{className:"reactable-data",key:"tbody"},P.length>0?P:_),d===!0?c["default"].createElement(v.Paginator,{colSpan:r.length,pageButtonLimit:g,numPages:b,currentPage:m,onPageChange:function(t){e.setState({currentPage:t}),e.props.onPageChange&&e.props.onPageChange(t)},previousPageLabel:this.props.previousPageLabel,nextPageLabel:this.props.nextPageLabel,key:"paginator"}):null,this.tfoot)}}]),t}(c["default"].Component);t.Table=m,m.defaultProps={sortBy:!1,defaultSort:!1,defaultSortDescending:!1,itemsPerPage:0,filterBy:"",hideFilterInput:!1}},130:function(e,t){"use strict";function r(e){e=e||{};var t={};for(var r in e)r in n||(t[r]=e[r]);return t}Object.defineProperty(t,"__esModule",{value:!0}),t.filterPropsFrom=r;var n={hideTableHeader:!0,column:!0,columns:!0,sortable:!0,filterable:!0,filtering:!0,onFilter:!0,filterPlaceholder:!0,filterClassName:!0,currentFilter:!0,sort:!0,sortBy:!0,sortableColumns:!0,onSort:!0,defaultSort:!0,defaultSortDescending:!0,itemsPerPage:!0,filterBy:!0,hideFilterInput:!0,noDataText:!0,currentPage:!0,onPageChange:!0,previousPageLabel:!0,nextPageLabel:!0,pageButtonLimit:!0,childNode:!0,data:!0,children:!0}},131:function(e,t,r){"use strict";function n(e,t){var r;return r="undefined"!=typeof e&&null!==e&&e.__reactableMeta===!0?e.data[t]:e[t],"undefined"!=typeof r&&null!==r&&r.__reactableMeta===!0&&(r="undefined"!=typeof r.props.value&&null!==r.props.value?r.props.value:r.value),(0,o.stringable)(r)?r:""}Object.defineProperty(t,"__esModule",{value:!0}),t.extractDataFrom=n;var o=r(132)},132:function(e,t){"use strict";function r(e){return null!==e&&"undefined"!=typeof e&&typeof("function"===e.toString)}Object.defineProperty(t,"__esModule",{value:!0}),t.stringable=r},133:function(e,t){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e){return new a(e)}function o(e){return e instanceof a}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r0&&(n+=" "+o),"object"==typeof r.props&&"string"==typeof r.props.className&&(n+=" "+r.props.className),e.push(c["default"].createElement(p.Th,a({},r.props,{className:n,key:t,onClick:this.handleClickTh.bind(this,r),onKeyDown:this.handleKeyDownTh.bind(this,r),role:i,tabIndex:"0"}),r.label))}var u=(0,d.filterPropsFrom)(this.props);return c["default"].createElement("thead",u,this.props.filtering===!0?c["default"].createElement(f.Filterer,{colSpan:this.props.columns.length,onFilter:this.props.onFilter,placeholder:this.props.filterPlaceholder,value:this.props.currentFilter,className:this.props.filterClassName}):null,c["default"].createElement("tr",{className:"reactable-column-header"},e))}}],[{key:"getColumns",value:function(e){var t=[];return c["default"].Children.forEach(e.props.children,function(e){var r={};if("undefined"!=typeof e.props&&(r.props=(0,d.filterPropsFrom)(e.props),"undefined"!=typeof e.props.children&&(r.label=e.props.children,r.key=r.label),"string"==typeof e.props.column&&(r.key=e.props.column,"undefined"==typeof r.label&&(r.label=r.key))),"undefined"==typeof r.key)throw new TypeError('
must have either a "column" property or a string child');t.push(r)}),t}}]),t}(c["default"].Component);t.Thead=h},135:function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=Object.assign||function(e){for(var t=1;t0)return c["default"].createElement("a",{className:"reactable-previous-page",href:a(this.props.currentPage-1),onClick:this.handlePrevious.bind(this)},this.props.previousPageLabel||"Previous")}},{key:"renderNext",value:function(){if(this.props.currentPage0&&(r>n-o?e.splice(0,n-t):e.splice(0,r-t+o)),n-r>i&&e.splice(t,e.length-t),c["default"].createElement("tbody",{className:"reactable-pagination"},c["default"].createElement("tr",null,c["default"].createElement("td",{colSpan:this.props.colSpan},this.renderPrevious(),e,this.renderNext())))}}]),t}(c["default"].Component);t.Paginator=p},143:function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r={Numeric:function(e,t){var r=parseFloat(e.toString().replace(/,/g,"")),n=parseFloat(t.toString().replace(/,/g,""));if(isNaN(r)&&isNaN(n))r=e,n=t;else{if(isNaN(r))return 1;if(isNaN(n))return-1}return rn?1:0},NumericInteger:function(e,t){return isNaN(e)||isNaN(t)?e>t?1:-1:e-t},Currency:function(e,r){return e=e.replace(/[^0-9\.\-\,]+/g,""),r=r.replace(/[^0-9\.\-\,]+/g,""),t.Sort.Numeric(e,r)},Date:function(e){function t(t,r){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(e,r){var n=Date.parse(e),o=Date.parse(r);return isNaN(n)||isNaN(o)?t.Sort.Numeric(e,r):n>o?1:o>n?-1:0}),CaseInsensitive:function(e,t){return e.toLowerCase().localeCompare(t.toLowerCase())}};t.Sort=r},183:function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t["default"]=e,t}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!==("undefined"==typeof t?"undefined":l(t))&&"function"!=typeof t?e:t}function u(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+("undefined"==typeof t?"undefined":l(t)));e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};Object.defineProperty(t,"__esModule",{value:!0});var s=function(){function e(e,t){for(var r=0;r=0;u--)(o=e[u])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a},v=function(e){function t(){return i(this,t),a(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return u(t,e),s(t,[{key:"componentDidMount",value:function(){this.props.loadDatasetsInfo()}},{key:"render",value:function(){var e=this;if(!this.props.datasets)return f.createElement("div",null,"loading");var t=function(){var t=[];return e.props.datasets.forEach(function(e){var r={CancerStudy:(0,d.unsafe)(" "+e.name+" "), +Reference:(0,d.unsafe)(""+e.citation+""),All:e.all,Sequenced:e.sequenced,CNA:e.cna,"Tumor mRNA (RNA-Seq V2)":e.rna_seq_v2_mrna,"Tumor mRNA (microarray)":e.microrna,"Tumor miRNA":e.mrna,"Methylation (HM27)":e.methylation_hm27,RPPA:e.rppa,Complete:e.complete};t.push(r)}),{v:f.createElement(d.Table,{className:"table",data:t,sortable:!0,filterable:["CancerStudy","Reference","All","Sequenced","CNA","Tumor mRNA (RNA-Seq V2)","Tumor mRNA (microarray)","Tumor miRNA","Methylation (HM27)","RPPA","Complete"]})}}();return"object"===("undefined"==typeof t?"undefined":c(t))?t.v:void 0}}]),t}(f.Component);v=b([y["default"].decorator],v),t["default"]=v}}); \ No newline at end of file diff --git a/src/appShell/App/Container.jsx b/src/appShell/App/Container.jsx index 8c71aaa234c..7a4fb02a609 100755 --- a/src/appShell/App/Container.jsx +++ b/src/appShell/App/Container.jsx @@ -3,6 +3,7 @@ import React, {PropTypes as T} from 'react'; import ReactDOM from 'react-dom'; import PageHeader from '../../pages/pageHeader/PageHeader.jsx'; +import '../../globalStyles/global.scss'; export class Container extends React.Component { diff --git a/src/globalStyles/global.scss b/src/globalStyles/global.scss index 9852c0b2b82..3dc957718ec 100755 --- a/src/globalStyles/global.scss +++ b/src/globalStyles/global.scss @@ -1,81 +1,18 @@ -// fretboard -//body { -// margin-top:0 !important; -//} -// -//#page_wrapper { -// padding:0px !important; -//} -// -//#header table:first-child { -// margin:0 10px 10px 10px; -// width:97%; -//} +th.reactable-header-sortable { + &:focus {outline:0;} -//.ui-widget { -// font-size:inherit !important; -//} -// -//.ui-widget-header { -// border:none !important; -// border-bottom:1px solid #ddd !important; -// border-radius:0; -// background:none !important; -// background-image:none !important; -// -// .ui-state-active { -// border-color:#ddd !important; -// } -// -//} +} -//#patient-table_wrapper { -// display:none !important; -//} -// -//#patient-tabs { -// border:none !important; -// padding:0px; -// -// .ui-tabs .ui-tabs-panel { -// padding:0px !important; -// -// -// -// } -// -//} +th.reactable-header-sort-desc:after { + content: '\25B2'; + padding-left: 10px; + padding-bottom: 5px; +} -//#content { -// padding:20px; -//} - -//.ui-tabs .ui-tabs-panel { -// padding:0px !important; -//} - -//#content ul { -// margin-bottom:0px; -// margin-top:0px; -//} -// -//#clinical_div { -// padding:15px; -// background:#eee; -// border-radius:5px; -// margin-bottom:15px; -// position:relative; -// padding-left:60px; -// -// i.fa { -// color:#fff; -// position:absolute; -// font-size:50px; -// top:10px; -// left:15px; -// } -// -// -//} +th.reactable-header-sort-asc:after { + content: '\25BC'; + padding-left: 10px; + padding-bottom: 5px; +} \ No newline at end of file diff --git a/src/pages/datasetView/Connector.ts b/src/pages/datasetView/Connector.ts index 4d9c79ef12a..78fcfa26097 100644 --- a/src/pages/datasetView/Connector.ts +++ b/src/pages/datasetView/Connector.ts @@ -1,6 +1,6 @@ import {RootState} from "../../redux/rootReducer"; import {IDispatch, Connector} from "../../shared/lib/ConnectorAPI"; -import { IDatasetPageUnconnectedProps } from './DataSetPage'; +import { IDatasetPageUnconnectedProps } from './DatasetPage'; import getDatasetsInfo from './getDatasetsInfo'; export type DatasetDownloads = { diff --git a/src/pages/datasetView/DataSetPage.tsx b/src/pages/datasetView/DatasetPage.tsx similarity index 93% rename from src/pages/datasetView/DataSetPage.tsx rename to src/pages/datasetView/DatasetPage.tsx index b72658558da..639652c0c4c 100644 --- a/src/pages/datasetView/DataSetPage.tsx +++ b/src/pages/datasetView/DatasetPage.tsx @@ -1,5 +1,4 @@ import * as React from "react"; -import { actionCreators, mapStateToProps } from './duck'; import { connect } from 'react-redux'; import { Table, unsafe } from 'reactableMSK'; import * as _ from 'underscore'; @@ -49,8 +48,6 @@ export default class DataSetPageUnconnected extends React.Component { - state.set('status', 'complete'); - state.set('datasets', Immutable.List(action.payload)); - }); - } - - case 'error': - - return state.set('status', 'error'); - - default: - - return state; - - } - -}; - -export function loadDatasetsInfo() { - return (dispatch) => { - getDatasetsInfo().then( - (data) => { - dispatch({ - type: actionTypes.FETCH, - meta: { status: 'success' }, - payload: data, - }); - } - ); - }; -}; - - -export const actionCreators = { - loadDatasetsInfo -}; - -export const mapStateToProps = function mapStateToProps(state) { - - return { - datasets: state.get('cancerStudyDatasets').get('datasets') - }; -}; diff --git a/src/pages/datasetView/duck.spec.js b/src/pages/datasetView/duck.spec.js deleted file mode 100644 index 1bbbc3dac91..00000000000 --- a/src/pages/datasetView/duck.spec.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Created by jiaojiao on 10/19/16. - */ -import React from 'react'; -import { assert } from 'chai'; -import { shallow, mount } from 'enzyme'; -import Immutable from 'immutable'; -import sinon from 'sinon'; -import { default as reducer, actionTypes, actionCreators} from './duck'; -import { DataSetPageUnconnected } from './DataSetPage'; - -describe('DataSetPageUnconnected', () => { - let comp, props; - - before(() => { - - props = { - - loadDatasetsInfo: sinon.stub() - - }; - - comp = mount(); - }); - - it('it load datasets info from API on mounting', () => { - assert.isTrue(props.loadDatasetsInfo.calledOnce); - }); - - after(() => { - - - }); -}); \ No newline at end of file