@clickview/reports 0.0.27-rc.0 → 0.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/scripts/16-fa3a2eb88b-reports.chunk.js +1 -0
- package/dist/scripts/17-70012b5bca-reports.chunk.js +1 -0
- package/dist/scripts/8-ac576c26ef-reports.chunk.js +1 -0
- package/dist/scripts/{bundle-0fc3abb0ed.min.js → bundle-af8a1ff25a.min.js} +1 -1
- package/package.json +3 -3
- package/dist/css/11-reports.chunk.css +0 -365
- package/dist/css/13-reports.chunk.css +0 -1846
- package/dist/css/16-reports.chunk.css +0 -39
- package/dist/css/17-reports.chunk.css +0 -42
- package/dist/css/18-reports.chunk.css +0 -37
- package/dist/css/19-reports.chunk.css +0 -21
- package/dist/css/2-reports.chunk.css +0 -49
- package/dist/css/20-reports.chunk.css +0 -34
- package/dist/css/22-reports.chunk.css +0 -12
- package/dist/css/24-reports.chunk.css +0 -163
- package/dist/css/25-reports.chunk.css +0 -72
- package/dist/css/26-reports.chunk.css +0 -80
- package/dist/css/27-reports.chunk.css +0 -30
- package/dist/css/28-reports.chunk.css +0 -143
- package/dist/css/29-reports.chunk.css +0 -24
- package/dist/css/30-reports.chunk.css +0 -21
- package/dist/css/31-reports.chunk.css +0 -9
- package/dist/css/32-reports.chunk.css +0 -60
- package/dist/css/33-reports.chunk.css +0 -3
- package/dist/css/34-reports.chunk.css +0 -12
- package/dist/css/35-reports.chunk.css +0 -12
- package/dist/css/36-reports.chunk.css +0 -22
- package/dist/css/4-reports.chunk.css +0 -22
- package/dist/css/5-reports.chunk.css +0 -44
- package/dist/css/6-reports.chunk.css +0 -63
- package/dist/css/7-reports.chunk.css +0 -83
- package/dist/css/reports-app.css +0 -11498
- package/dist/scripts/0-reports.chunk.js +0 -43
- package/dist/scripts/1-reports.chunk.js +0 -11
- package/dist/scripts/10-reports.chunk.js +0 -11
- package/dist/scripts/11-reports.chunk.js +0 -397
- package/dist/scripts/12-reports.chunk.js +0 -43
- package/dist/scripts/13-reports.chunk.js +0 -1088
- package/dist/scripts/14-reports.chunk.js +0 -1255
- package/dist/scripts/15-reports.chunk.js +0 -43
- package/dist/scripts/16-2c857db15c-reports.chunk.js +0 -1
- package/dist/scripts/16-reports.chunk.js +0 -167
- package/dist/scripts/17-f19243cfde-reports.chunk.js +0 -1
- package/dist/scripts/17-reports.chunk.js +0 -151
- package/dist/scripts/18-reports.chunk.js +0 -104
- package/dist/scripts/19-reports.chunk.js +0 -97
- package/dist/scripts/2-reports.chunk.js +0 -42
- package/dist/scripts/20-reports.chunk.js +0 -72
- package/dist/scripts/21-reports.chunk.js +0 -67
- package/dist/scripts/22-reports.chunk.js +0 -34
- package/dist/scripts/23-reports.chunk.js +0 -2469
- package/dist/scripts/24-reports.chunk.js +0 -704
- package/dist/scripts/25-reports.chunk.js +0 -227
- package/dist/scripts/26-reports.chunk.js +0 -214
- package/dist/scripts/27-reports.chunk.js +0 -150
- package/dist/scripts/28-reports.chunk.js +0 -119
- package/dist/scripts/29-reports.chunk.js +0 -105
- package/dist/scripts/3-reports.chunk.js +0 -17
- package/dist/scripts/30-reports.chunk.js +0 -97
- package/dist/scripts/31-reports.chunk.js +0 -81
- package/dist/scripts/32-reports.chunk.js +0 -81
- package/dist/scripts/33-reports.chunk.js +0 -50
- package/dist/scripts/34-reports.chunk.js +0 -34
- package/dist/scripts/35-reports.chunk.js +0 -34
- package/dist/scripts/36-reports.chunk.js +0 -18
- package/dist/scripts/37-reports.chunk.js +0 -11
- package/dist/scripts/38-reports.chunk.js +0 -11
- package/dist/scripts/39-reports.chunk.js +0 -11
- package/dist/scripts/4-reports.chunk.js +0 -89
- package/dist/scripts/40-reports.chunk.js +0 -11
- package/dist/scripts/5-reports.chunk.js +0 -73
- package/dist/scripts/6-reports.chunk.js +0 -113
- package/dist/scripts/7-reports.chunk.js +0 -56
- package/dist/scripts/8-3b004dbc7d-reports.chunk.js +0 -1
- package/dist/scripts/8-reports.chunk.js +0 -17
- package/dist/scripts/9-reports.chunk.js +0 -35
- package/dist/scripts/bundle.js +0 -7281
- package/dist/scripts/polyfills.js +0 -2750
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
(window["webpackJsonp_clickview_reports"] = window["webpackJsonp_clickview_reports"] || []).push([[8],{
|
|
2
|
-
|
|
3
|
-
/***/ "../../../node_modules/react-table/dist/react-table.development.js":
|
|
4
|
-
/***/ (function(module, exports, __webpack_require__) {
|
|
5
|
-
|
|
6
|
-
eval("(function (global, factory) {\n true ? factory(exports, __webpack_require__(\"react\")) :\n undefined;\n}(this, (function (exports, React) { 'use strict';\n\n React = React && Object.prototype.hasOwnProperty.call(React, 'default') ? React['default'] : React;\n\n function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n }\n\n function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n }\n\n function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n }\n\n function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n }\n\n function _toPrimitive(input, hint) {\n if (typeof input !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (typeof res !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n\n return (hint === \"string\" ? String : Number)(input);\n }\n\n function _toPropertyKey(arg) {\n var key = _toPrimitive(arg, \"string\");\n\n return typeof key === \"symbol\" ? key : String(key);\n }\n\n var renderErr = 'Renderer Error ☝️';\n var actions = {\n init: 'init'\n };\n var defaultRenderer = function defaultRenderer(_ref) {\n var _ref$value = _ref.value,\n value = _ref$value === void 0 ? '' : _ref$value;\n return value;\n };\n var emptyRenderer = function emptyRenderer() {\n return React.createElement(React.Fragment, null, \"\\xA0\");\n };\n var defaultColumn = {\n Cell: defaultRenderer,\n width: 150,\n minWidth: 0,\n maxWidth: Number.MAX_SAFE_INTEGER\n };\n\n function mergeProps() {\n for (var _len = arguments.length, propList = new Array(_len), _key = 0; _key < _len; _key++) {\n propList[_key] = arguments[_key];\n }\n\n return propList.reduce(function (props, next) {\n var style = next.style,\n className = next.className,\n rest = _objectWithoutPropertiesLoose(next, [\"style\", \"className\"]);\n\n props = _extends({}, props, {}, rest);\n\n if (style) {\n props.style = props.style ? _extends({}, props.style || {}, {}, style || {}) : style;\n }\n\n if (className) {\n props.className = props.className ? props.className + ' ' + className : className;\n }\n\n if (props.className === '') {\n delete props.className;\n }\n\n return props;\n }, {});\n }\n\n function handlePropGetter(prevProps, userProps, meta) {\n // Handle a lambda, pass it the previous props\n if (typeof userProps === 'function') {\n return handlePropGetter({}, userProps(prevProps, meta));\n } // Handle an array, merge each item as separate props\n\n\n if (Array.isArray(userProps)) {\n return mergeProps.apply(void 0, [prevProps].concat(userProps));\n } // Handle an object by default, merge the two objects\n\n\n return mergeProps(prevProps, userProps);\n }\n\n var makePropGetter = function makePropGetter(hooks, meta) {\n if (meta === void 0) {\n meta = {};\n }\n\n return function (userProps) {\n if (userProps === void 0) {\n userProps = {};\n }\n\n return [].concat(hooks, [userProps]).reduce(function (prev, next) {\n return handlePropGetter(prev, next, _extends({}, meta, {\n userProps: userProps\n }));\n }, {});\n };\n };\n var reduceHooks = function reduceHooks(hooks, initial, meta, allowUndefined) {\n if (meta === void 0) {\n meta = {};\n }\n\n return hooks.reduce(function (prev, next) {\n var nextValue = next(prev, meta);\n\n {\n if (!allowUndefined && typeof nextValue === 'undefined') {\n console.info(next);\n throw new Error('React Table: A reducer hook ☝️ just returned undefined! This is not allowed.');\n }\n }\n\n return nextValue;\n }, initial);\n };\n var loopHooks = function loopHooks(hooks, context, meta) {\n if (meta === void 0) {\n meta = {};\n }\n\n return hooks.forEach(function (hook) {\n var nextValue = hook(context, meta);\n\n {\n if (typeof nextValue !== 'undefined') {\n console.info(hook, nextValue);\n throw new Error('React Table: A loop-type hook ☝️ just returned a value! This is not allowed.');\n }\n }\n });\n };\n function ensurePluginOrder(plugins, befores, pluginName, afters) {\n if ( afters) {\n throw new Error(\"Defining plugins in the \\\"after\\\" section of ensurePluginOrder is no longer supported (see plugin \" + pluginName + \")\");\n }\n\n var pluginIndex = plugins.findIndex(function (plugin) {\n return plugin.pluginName === pluginName;\n });\n\n if (pluginIndex === -1) {\n {\n throw new Error(\"The plugin \\\"\" + pluginName + \"\\\" was not found in the plugin list!\\nThis usually means you need to need to name your plugin hook by setting the 'pluginName' property of the hook function, eg:\\n\\n \" + pluginName + \".pluginName = '\" + pluginName + \"'\\n\");\n }\n }\n\n befores.forEach(function (before) {\n var beforeIndex = plugins.findIndex(function (plugin) {\n return plugin.pluginName === before;\n });\n\n if (beforeIndex > -1 && beforeIndex > pluginIndex) {\n {\n throw new Error(\"React Table: The \" + pluginName + \" plugin hook must be placed after the \" + before + \" plugin hook!\");\n }\n }\n });\n }\n function functionalUpdate(updater, old) {\n return typeof updater === 'function' ? updater(old) : updater;\n }\n function useGetLatest(obj) {\n var ref = React.useRef();\n ref.current = obj;\n return React.useCallback(function () {\n return ref.current;\n }, []);\n } // SSR has issues with useLayoutEffect still, so use useEffect during SSR\n\n var safeUseLayoutEffect = typeof document !== 'undefined' ? React.useLayoutEffect : React.useEffect;\n function useMountedLayoutEffect(fn, deps) {\n var mountedRef = React.useRef(false);\n safeUseLayoutEffect(function () {\n if (mountedRef.current) {\n fn();\n }\n\n mountedRef.current = true; // eslint-disable-next-line\n }, deps);\n }\n function useAsyncDebounce(defaultFn, defaultWait) {\n if (defaultWait === void 0) {\n defaultWait = 0;\n }\n\n var debounceRef = React.useRef({});\n var getDefaultFn = useGetLatest(defaultFn);\n var getDefaultWait = useGetLatest(defaultWait);\n return React.useCallback(\n /*#__PURE__*/\n function () {\n var _ref2 = _asyncToGenerator(\n /*#__PURE__*/\n regeneratorRuntime.mark(function _callee2() {\n var _len2,\n args,\n _key2,\n _args2 = arguments;\n\n return regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n for (_len2 = _args2.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = _args2[_key2];\n }\n\n if (!debounceRef.current.promise) {\n debounceRef.current.promise = new Promise(function (resolve, reject) {\n debounceRef.current.resolve = resolve;\n debounceRef.current.reject = reject;\n });\n }\n\n if (debounceRef.current.timeout) {\n clearTimeout(debounceRef.current.timeout);\n }\n\n debounceRef.current.timeout = setTimeout(\n /*#__PURE__*/\n _asyncToGenerator(\n /*#__PURE__*/\n regeneratorRuntime.mark(function _callee() {\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n delete debounceRef.current.timeout;\n _context.prev = 1;\n _context.t0 = debounceRef.current;\n _context.next = 5;\n return getDefaultFn().apply(void 0, args);\n\n case 5:\n _context.t1 = _context.sent;\n\n _context.t0.resolve.call(_context.t0, _context.t1);\n\n _context.next = 12;\n break;\n\n case 9:\n _context.prev = 9;\n _context.t2 = _context[\"catch\"](1);\n debounceRef.current.reject(_context.t2);\n\n case 12:\n _context.prev = 12;\n delete debounceRef.current.promise;\n return _context.finish(12);\n\n case 15:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee, null, [[1, 9, 12, 15]]);\n })), getDefaultWait());\n return _context2.abrupt(\"return\", debounceRef.current.promise);\n\n case 5:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }));\n\n return function () {\n return _ref2.apply(this, arguments);\n };\n }(), [getDefaultFn, getDefaultWait]);\n }\n function makeRenderer(instance, column, meta) {\n if (meta === void 0) {\n meta = {};\n }\n\n return function (type, userProps) {\n if (userProps === void 0) {\n userProps = {};\n }\n\n var Comp = typeof type === 'string' ? column[type] : type;\n\n if (typeof Comp === 'undefined') {\n console.info(column);\n throw new Error(renderErr);\n }\n\n return flexRender(Comp, _extends({}, instance, {\n column: column\n }, meta, {}, userProps));\n };\n }\n function flexRender(Comp, props) {\n return isReactComponent(Comp) ? React.createElement(Comp, props) : Comp;\n }\n\n function isReactComponent(component) {\n return isClassComponent(component) || typeof component === 'function' || isExoticComponent(component);\n }\n\n function isClassComponent(component) {\n return typeof component === 'function' && function () {\n var proto = Object.getPrototypeOf(component);\n return proto.prototype && proto.prototype.isReactComponent;\n }();\n }\n\n function isExoticComponent(component) {\n return typeof component === 'object' && typeof component.$$typeof === 'symbol' && ['react.memo', 'react.forward_ref'].includes(component.$$typeof.description);\n }\n\n function linkColumnStructure(columns, parent, depth) {\n if (depth === void 0) {\n depth = 0;\n }\n\n return columns.map(function (column) {\n column = _extends({}, column, {\n parent: parent,\n depth: depth\n });\n assignColumnAccessor(column);\n\n if (column.columns) {\n column.columns = linkColumnStructure(column.columns, column, depth + 1);\n }\n\n return column;\n });\n }\n function flattenColumns(columns) {\n return flattenBy(columns, 'columns');\n }\n function assignColumnAccessor(column) {\n // First check for string accessor\n var id = column.id,\n accessor = column.accessor,\n Header = column.Header;\n\n if (typeof accessor === 'string') {\n id = id || accessor;\n var accessorPath = accessor.split('.');\n\n accessor = function accessor(row) {\n return getBy(row, accessorPath);\n };\n }\n\n if (!id && typeof Header === 'string' && Header) {\n id = Header;\n }\n\n if (!id && column.columns) {\n console.error(column);\n throw new Error('A column ID (or unique \"Header\" value) is required!');\n }\n\n if (!id) {\n console.error(column);\n throw new Error('A column ID (or string accessor) is required!');\n }\n\n Object.assign(column, {\n id: id,\n accessor: accessor\n });\n return column;\n }\n function decorateColumn(column, userDefaultColumn) {\n if (!userDefaultColumn) {\n throw new Error();\n }\n\n Object.assign(column, _extends({\n // Make sure there is a fallback header, just in case\n Header: emptyRenderer,\n Footer: emptyRenderer\n }, defaultColumn, {}, userDefaultColumn, {}, column));\n Object.assign(column, {\n originalWidth: column.width\n });\n return column;\n } // Build the header groups from the bottom up\n\n function makeHeaderGroups(allColumns, defaultColumn, additionalHeaderProperties) {\n if (additionalHeaderProperties === void 0) {\n additionalHeaderProperties = function additionalHeaderProperties() {\n return {};\n };\n }\n\n var headerGroups = [];\n var scanColumns = allColumns;\n var uid = 0;\n\n var getUID = function getUID() {\n return uid++;\n };\n\n var _loop = function _loop() {\n // The header group we are creating\n var headerGroup = {\n headers: []\n }; // The parent columns we're going to scan next\n\n var parentColumns = [];\n var hasParents = scanColumns.some(function (d) {\n return d.parent;\n }); // Scan each column for parents\n\n scanColumns.forEach(function (column) {\n // What is the latest (last) parent column?\n var latestParentColumn = [].concat(parentColumns).reverse()[0];\n var newParent;\n\n if (hasParents) {\n // If the column has a parent, add it if necessary\n if (column.parent) {\n newParent = _extends({}, column.parent, {\n originalId: column.parent.id,\n id: column.parent.id + \"_\" + getUID(),\n headers: [column]\n }, additionalHeaderProperties(column));\n } else {\n // If other columns have parents, we'll need to add a place holder if necessary\n var originalId = column.id + \"_placeholder\";\n newParent = decorateColumn(_extends({\n originalId: originalId,\n id: column.id + \"_placeholder_\" + getUID(),\n placeholderOf: column,\n headers: [column]\n }, additionalHeaderProperties(column)), defaultColumn);\n } // If the resulting parent columns are the same, just add\n // the column and increment the header span\n\n\n if (latestParentColumn && latestParentColumn.originalId === newParent.originalId) {\n latestParentColumn.headers.push(column);\n } else {\n parentColumns.push(newParent);\n }\n }\n\n headerGroup.headers.push(column);\n });\n headerGroups.push(headerGroup); // Start scanning the parent columns\n\n scanColumns = parentColumns;\n };\n\n while (scanColumns.length) {\n _loop();\n }\n\n return headerGroups.reverse();\n }\n var pathObjCache = new Map();\n function getBy(obj, path, def) {\n if (!path) {\n return obj;\n }\n\n var cacheKey = typeof path === 'function' ? path : JSON.stringify(path);\n\n var pathObj = pathObjCache.get(cacheKey) || function () {\n var pathObj = makePathArray(path);\n pathObjCache.set(cacheKey, pathObj);\n return pathObj;\n }();\n\n var val;\n\n try {\n val = pathObj.reduce(function (cursor, pathPart) {\n return cursor[pathPart];\n }, obj);\n } catch (e) {// continue regardless of error\n }\n\n return typeof val !== 'undefined' ? val : def;\n }\n function getFirstDefined() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n for (var i = 0; i < args.length; i += 1) {\n if (typeof args[i] !== 'undefined') {\n return args[i];\n }\n }\n }\n function isFunction(a) {\n if (typeof a === 'function') {\n return a;\n }\n }\n function flattenBy(arr, key) {\n var flat = [];\n\n var recurse = function recurse(arr) {\n arr.forEach(function (d) {\n if (!d[key]) {\n flat.push(d);\n } else {\n recurse(d[key]);\n }\n });\n };\n\n recurse(arr);\n return flat;\n }\n function expandRows(rows, _ref) {\n var manualExpandedKey = _ref.manualExpandedKey,\n expanded = _ref.expanded,\n _ref$expandSubRows = _ref.expandSubRows,\n expandSubRows = _ref$expandSubRows === void 0 ? true : _ref$expandSubRows;\n var expandedRows = [];\n\n var handleRow = function handleRow(row, addToExpandedRows) {\n if (addToExpandedRows === void 0) {\n addToExpandedRows = true;\n }\n\n row.isExpanded = row.original && row.original[manualExpandedKey] || expanded[row.id];\n row.canExpand = row.subRows && !!row.subRows.length;\n\n if (addToExpandedRows) {\n expandedRows.push(row);\n }\n\n if (row.subRows && row.subRows.length && row.isExpanded) {\n row.subRows.forEach(function (row) {\n return handleRow(row, expandSubRows);\n });\n }\n };\n\n rows.forEach(function (row) {\n return handleRow(row);\n });\n return expandedRows;\n }\n function getFilterMethod(filter, userFilterTypes, filterTypes) {\n return isFunction(filter) || userFilterTypes[filter] || filterTypes[filter] || filterTypes.text;\n }\n function shouldAutoRemoveFilter(autoRemove, value, column) {\n return autoRemove ? autoRemove(value, column) : typeof value === 'undefined';\n }\n function unpreparedAccessWarning() {\n throw new Error('React-Table: You have not called prepareRow(row) one or more rows you are attempting to render.');\n }\n var passiveSupported = null;\n function passiveEventSupported() {\n // memoize support to avoid adding multiple test events\n if (typeof passiveSupported === 'boolean') return passiveSupported;\n var supported = false;\n\n try {\n var options = {\n get passive() {\n supported = true;\n return false;\n }\n\n };\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (err) {\n supported = false;\n }\n\n passiveSupported = supported;\n return passiveSupported;\n } //\n\n var reOpenBracket = /\\[/g;\n var reCloseBracket = /\\]/g;\n\n function makePathArray(obj) {\n return flattenDeep(obj) // remove all periods in parts\n .map(function (d) {\n return String(d).replace('.', '_');\n }) // join parts using period\n .join('.') // replace brackets with periods\n .replace(reOpenBracket, '.').replace(reCloseBracket, '') // split it back out on periods\n .split('.');\n }\n\n function flattenDeep(arr, newArr) {\n if (newArr === void 0) {\n newArr = [];\n }\n\n if (!Array.isArray(arr)) {\n newArr.push(arr);\n } else {\n for (var i = 0; i < arr.length; i += 1) {\n flattenDeep(arr[i], newArr);\n }\n }\n\n return newArr;\n }\n\n var defaultGetTableProps = function defaultGetTableProps(props) {\n return _extends({\n role: 'table'\n }, props);\n };\n\n var defaultGetTableBodyProps = function defaultGetTableBodyProps(props) {\n return _extends({\n role: 'rowgroup'\n }, props);\n };\n\n var defaultGetHeaderProps = function defaultGetHeaderProps(props, _ref) {\n var column = _ref.column;\n return _extends({\n key: \"header_\" + column.id,\n colSpan: column.totalVisibleHeaderCount,\n role: 'columnheader'\n }, props);\n };\n\n var defaultGetFooterProps = function defaultGetFooterProps(props, _ref2) {\n var column = _ref2.column;\n return _extends({\n key: \"footer_\" + column.id,\n colSpan: column.totalVisibleHeaderCount\n }, props);\n };\n\n var defaultGetHeaderGroupProps = function defaultGetHeaderGroupProps(props, _ref3) {\n var index = _ref3.index;\n return _extends({\n key: \"headerGroup_\" + index,\n role: 'row'\n }, props);\n };\n\n var defaultGetFooterGroupProps = function defaultGetFooterGroupProps(props, _ref4) {\n var index = _ref4.index;\n return _extends({\n key: \"footerGroup_\" + index\n }, props);\n };\n\n var defaultGetRowProps = function defaultGetRowProps(props, _ref5) {\n var row = _ref5.row;\n return _extends({\n key: \"row_\" + row.id,\n role: 'row'\n }, props);\n };\n\n var defaultGetCellProps = function defaultGetCellProps(props, _ref6) {\n var cell = _ref6.cell;\n return _extends({\n key: \"cell_\" + cell.row.id + \"_\" + cell.column.id,\n role: 'cell'\n }, props);\n };\n\n function makeDefaultPluginHooks() {\n return {\n useOptions: [],\n stateReducers: [],\n useControlledState: [],\n columns: [],\n columnsDeps: [],\n allColumns: [],\n allColumnsDeps: [],\n accessValue: [],\n materializedColumns: [],\n materializedColumnsDeps: [],\n useInstanceAfterData: [],\n visibleColumns: [],\n visibleColumnsDeps: [],\n headerGroups: [],\n headerGroupsDeps: [],\n useInstanceBeforeDimensions: [],\n useInstance: [],\n prepareRow: [],\n getTableProps: [defaultGetTableProps],\n getTableBodyProps: [defaultGetTableBodyProps],\n getHeaderGroupProps: [defaultGetHeaderGroupProps],\n getFooterGroupProps: [defaultGetFooterGroupProps],\n getHeaderProps: [defaultGetHeaderProps],\n getFooterProps: [defaultGetFooterProps],\n getRowProps: [defaultGetRowProps],\n getCellProps: [defaultGetCellProps],\n useFinalInstance: []\n };\n }\n\n actions.resetHiddenColumns = 'resetHiddenColumns';\n actions.toggleHideColumn = 'toggleHideColumn';\n actions.setHiddenColumns = 'setHiddenColumns';\n actions.toggleHideAllColumns = 'toggleHideAllColumns';\n var useColumnVisibility = function useColumnVisibility(hooks) {\n hooks.getToggleHiddenProps = [defaultGetToggleHiddenProps];\n hooks.getToggleHideAllColumnsProps = [defaultGetToggleHideAllColumnsProps];\n hooks.stateReducers.push(reducer);\n hooks.useInstanceBeforeDimensions.push(useInstanceBeforeDimensions);\n hooks.headerGroupsDeps.push(function (deps, _ref) {\n var instance = _ref.instance;\n return [].concat(deps, [instance.state.hiddenColumns]);\n });\n hooks.useInstance.push(useInstance);\n };\n useColumnVisibility.pluginName = 'useColumnVisibility';\n\n var defaultGetToggleHiddenProps = function defaultGetToggleHiddenProps(props, _ref2) {\n var column = _ref2.column;\n return [props, {\n onChange: function onChange(e) {\n column.toggleHidden(!e.target.checked);\n },\n style: {\n cursor: 'pointer'\n },\n checked: column.isVisible,\n title: 'Toggle Column Visible'\n }];\n };\n\n var defaultGetToggleHideAllColumnsProps = function defaultGetToggleHideAllColumnsProps(props, _ref3) {\n var instance = _ref3.instance;\n return [props, {\n onChange: function onChange(e) {\n instance.toggleHideAllColumns(!e.target.checked);\n },\n style: {\n cursor: 'pointer'\n },\n checked: !instance.allColumnsHidden && !instance.state.hiddenColumns.length,\n title: 'Toggle All Columns Hidden',\n indeterminate: !instance.allColumnsHidden && instance.state.hiddenColumns.length\n }];\n };\n\n function reducer(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n hiddenColumns: []\n }, state);\n }\n\n if (action.type === actions.resetHiddenColumns) {\n return _extends({}, state, {\n hiddenColumns: instance.initialState.hiddenColumns || []\n });\n }\n\n if (action.type === actions.toggleHideColumn) {\n var should = typeof action.value !== 'undefined' ? action.value : !state.hiddenColumns.includes(action.columnId);\n var hiddenColumns = should ? [].concat(state.hiddenColumns, [action.columnId]) : state.hiddenColumns.filter(function (d) {\n return d !== action.columnId;\n });\n return _extends({}, state, {\n hiddenColumns: hiddenColumns\n });\n }\n\n if (action.type === actions.setHiddenColumns) {\n return _extends({}, state, {\n hiddenColumns: functionalUpdate(action.value, state.hiddenColumns)\n });\n }\n\n if (action.type === actions.toggleHideAllColumns) {\n var shouldAll = typeof action.value !== 'undefined' ? action.value : !state.hiddenColumns.length;\n return _extends({}, state, {\n hiddenColumns: shouldAll ? instance.allColumns.map(function (d) {\n return d.id;\n }) : []\n });\n }\n }\n\n function useInstanceBeforeDimensions(instance) {\n var headers = instance.headers,\n hiddenColumns = instance.state.hiddenColumns;\n var isMountedRef = React.useRef(false);\n\n if (!isMountedRef.current) ;\n\n var handleColumn = function handleColumn(column, parentVisible) {\n column.isVisible = parentVisible && !hiddenColumns.includes(column.id);\n var totalVisibleHeaderCount = 0;\n\n if (column.headers && column.headers.length) {\n column.headers.forEach(function (subColumn) {\n return totalVisibleHeaderCount += handleColumn(subColumn, column.isVisible);\n });\n } else {\n totalVisibleHeaderCount = column.isVisible ? 1 : 0;\n }\n\n column.totalVisibleHeaderCount = totalVisibleHeaderCount;\n return totalVisibleHeaderCount;\n };\n\n var totalVisibleHeaderCount = 0;\n headers.forEach(function (subHeader) {\n return totalVisibleHeaderCount += handleColumn(subHeader, true);\n });\n }\n\n function useInstance(instance) {\n var columns = instance.columns,\n flatHeaders = instance.flatHeaders,\n dispatch = instance.dispatch,\n allColumns = instance.allColumns,\n getHooks = instance.getHooks,\n hiddenColumns = instance.state.hiddenColumns,\n _instance$autoResetHi = instance.autoResetHiddenColumns,\n autoResetHiddenColumns = _instance$autoResetHi === void 0 ? true : _instance$autoResetHi;\n var getInstance = useGetLatest(instance);\n var allColumnsHidden = allColumns.length === hiddenColumns.length;\n var toggleHideColumn = React.useCallback(function (columnId, value) {\n return dispatch({\n type: actions.toggleHideColumn,\n columnId: columnId,\n value: value\n });\n }, [dispatch]);\n var setHiddenColumns = React.useCallback(function (value) {\n return dispatch({\n type: actions.setHiddenColumns,\n value: value\n });\n }, [dispatch]);\n var toggleHideAllColumns = React.useCallback(function (value) {\n return dispatch({\n type: actions.toggleHideAllColumns,\n value: value\n });\n }, [dispatch]);\n var getToggleHideAllColumnsProps = makePropGetter(getHooks().getToggleHideAllColumnsProps, {\n instance: getInstance()\n });\n flatHeaders.forEach(function (column) {\n column.toggleHidden = function (value) {\n dispatch({\n type: actions.toggleHideColumn,\n columnId: column.id,\n value: value\n });\n };\n\n column.getToggleHiddenProps = makePropGetter(getHooks().getToggleHiddenProps, {\n instance: getInstance(),\n column: column\n });\n });\n var getAutoResetHiddenColumns = useGetLatest(autoResetHiddenColumns);\n useMountedLayoutEffect(function () {\n if (getAutoResetHiddenColumns()) {\n dispatch({\n type: actions.resetHiddenColumns\n });\n }\n }, [dispatch, columns]);\n Object.assign(instance, {\n allColumnsHidden: allColumnsHidden,\n toggleHideColumn: toggleHideColumn,\n setHiddenColumns: setHiddenColumns,\n toggleHideAllColumns: toggleHideAllColumns,\n getToggleHideAllColumnsProps: getToggleHideAllColumnsProps\n });\n }\n\n var defaultInitialState = {};\n var defaultColumnInstance = {};\n\n var defaultReducer = function defaultReducer(state, action, prevState) {\n return state;\n };\n\n var defaultGetSubRows = function defaultGetSubRows(row, index) {\n return row.subRows || [];\n };\n\n var defaultGetRowId = function defaultGetRowId(row, index, parent) {\n return \"\" + (parent ? [parent.id, index].join('.') : index);\n };\n\n var defaultUseControlledState = function defaultUseControlledState(d) {\n return d;\n };\n\n function applyDefaults(props) {\n var _props$initialState = props.initialState,\n initialState = _props$initialState === void 0 ? defaultInitialState : _props$initialState,\n _props$defaultColumn = props.defaultColumn,\n defaultColumn = _props$defaultColumn === void 0 ? defaultColumnInstance : _props$defaultColumn,\n _props$getSubRows = props.getSubRows,\n getSubRows = _props$getSubRows === void 0 ? defaultGetSubRows : _props$getSubRows,\n _props$getRowId = props.getRowId,\n getRowId = _props$getRowId === void 0 ? defaultGetRowId : _props$getRowId,\n _props$stateReducer = props.stateReducer,\n stateReducer = _props$stateReducer === void 0 ? defaultReducer : _props$stateReducer,\n _props$useControlledS = props.useControlledState,\n useControlledState = _props$useControlledS === void 0 ? defaultUseControlledState : _props$useControlledS,\n rest = _objectWithoutPropertiesLoose(props, [\"initialState\", \"defaultColumn\", \"getSubRows\", \"getRowId\", \"stateReducer\", \"useControlledState\"]);\n\n return _extends({}, rest, {\n initialState: initialState,\n defaultColumn: defaultColumn,\n getSubRows: getSubRows,\n getRowId: getRowId,\n stateReducer: stateReducer,\n useControlledState: useControlledState\n });\n }\n\n var useTable = function useTable(props) {\n for (var _len = arguments.length, plugins = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n plugins[_key - 1] = arguments[_key];\n }\n\n // Apply default props\n props = applyDefaults(props); // Add core plugins\n\n plugins = [useColumnVisibility].concat(plugins); // Create the table instance\n\n var instanceRef = React.useRef({}); // Create a getter for the instance (helps avoid a lot of potential memory leaks)\n\n var getInstance = useGetLatest(instanceRef.current); // Assign the props, plugins and hooks to the instance\n\n Object.assign(getInstance(), _extends({}, props, {\n plugins: plugins,\n hooks: makeDefaultPluginHooks()\n })); // Allow plugins to register hooks as early as possible\n\n plugins.filter(Boolean).forEach(function (plugin) {\n plugin(getInstance().hooks);\n }); // Consume all hooks and make a getter for them\n\n var getHooks = useGetLatest(getInstance().hooks);\n getInstance().getHooks = getHooks;\n delete getInstance().hooks; // Allow useOptions hooks to modify the options coming into the table\n\n Object.assign(getInstance(), reduceHooks(getHooks().useOptions, applyDefaults(props)));\n\n var _getInstance = getInstance(),\n data = _getInstance.data,\n userColumns = _getInstance.columns,\n initialState = _getInstance.initialState,\n defaultColumn = _getInstance.defaultColumn,\n getSubRows = _getInstance.getSubRows,\n getRowId = _getInstance.getRowId,\n stateReducer = _getInstance.stateReducer,\n useControlledState = _getInstance.useControlledState; // Setup user reducer ref\n\n\n var getStateReducer = useGetLatest(stateReducer); // Build the reducer\n\n var reducer = React.useCallback(function (state, action) {\n // Detect invalid actions\n if (!action.type) {\n console.info({\n action: action\n });\n throw new Error('Unknown Action 👆');\n } // Reduce the state from all plugin reducers\n\n\n return [].concat(getHooks().stateReducers, Array.isArray(getStateReducer()) ? getStateReducer() : [getStateReducer()]).reduce(function (s, handler) {\n return handler(s, action, state, getInstance()) || s;\n }, state);\n }, [getHooks, getStateReducer, getInstance]); // Start the reducer\n\n var _React$useReducer = React.useReducer(reducer, undefined, function () {\n return reducer(initialState, {\n type: actions.init\n });\n }),\n reducerState = _React$useReducer[0],\n dispatch = _React$useReducer[1]; // Allow the user to control the final state with hooks\n\n\n var state = reduceHooks([].concat(getHooks().useControlledState, [useControlledState]), reducerState, {\n instance: getInstance()\n });\n Object.assign(getInstance(), {\n state: state,\n dispatch: dispatch\n }); // Decorate All the columns\n\n var columns = React.useMemo(function () {\n return linkColumnStructure(reduceHooks(getHooks().columns, userColumns, {\n instance: getInstance()\n }));\n }, [getHooks, getInstance, userColumns].concat(reduceHooks(getHooks().columnsDeps, [], {\n instance: getInstance()\n })));\n getInstance().columns = columns; // Get the flat list of all columns and allow hooks to decorate\n // those columns (and trigger this memoization via deps)\n\n var allColumns = React.useMemo(function () {\n return reduceHooks(getHooks().allColumns, flattenColumns(columns), {\n instance: getInstance()\n }).map(assignColumnAccessor);\n }, [columns, getHooks, getInstance].concat(reduceHooks(getHooks().allColumnsDeps, [], {\n instance: getInstance()\n })));\n getInstance().allColumns = allColumns; // Access the row model using initial columns\n\n var _React$useMemo = React.useMemo(function () {\n var rows = [];\n var flatRows = [];\n var rowsById = {};\n var allColumnsQueue = [].concat(allColumns);\n\n while (allColumnsQueue.length) {\n var column = allColumnsQueue.shift();\n accessRowsForColumn({\n data: data,\n rows: rows,\n flatRows: flatRows,\n rowsById: rowsById,\n column: column,\n getRowId: getRowId,\n getSubRows: getSubRows,\n accessValueHooks: getHooks().accessValue,\n getInstance: getInstance\n });\n }\n\n return [rows, flatRows, rowsById];\n }, [allColumns, data, getRowId, getSubRows, getHooks, getInstance]),\n rows = _React$useMemo[0],\n flatRows = _React$useMemo[1],\n rowsById = _React$useMemo[2];\n\n Object.assign(getInstance(), {\n rows: rows,\n initialRows: [].concat(rows),\n flatRows: flatRows,\n rowsById: rowsById // materializedColumns,\n\n });\n loopHooks(getHooks().useInstanceAfterData, getInstance()); // Get the flat list of all columns AFTER the rows\n // have been access, and allow hooks to decorate\n // those columns (and trigger this memoization via deps)\n\n var visibleColumns = React.useMemo(function () {\n return reduceHooks(getHooks().visibleColumns, allColumns, {\n instance: getInstance()\n }).map(function (d) {\n return decorateColumn(d, defaultColumn);\n });\n }, [getHooks, allColumns, getInstance, defaultColumn].concat(reduceHooks(getHooks().visibleColumnsDeps, [], {\n instance: getInstance()\n }))); // Combine new visible columns with all columns\n\n allColumns = React.useMemo(function () {\n var columns = [].concat(visibleColumns);\n allColumns.forEach(function (column) {\n if (!columns.find(function (d) {\n return d.id === column.id;\n })) {\n columns.push(column);\n }\n });\n return columns;\n }, [allColumns, visibleColumns]);\n getInstance().allColumns = allColumns;\n\n {\n var duplicateColumns = allColumns.filter(function (column, i) {\n return allColumns.findIndex(function (d) {\n return d.id === column.id;\n }) !== i;\n });\n\n if (duplicateColumns.length) {\n console.info(allColumns);\n throw new Error(\"Duplicate columns were found with ids: \\\"\" + duplicateColumns.map(function (d) {\n return d.id;\n }).join(', ') + \"\\\" in the columns array above\");\n }\n } // Make the headerGroups\n\n\n var headerGroups = React.useMemo(function () {\n return reduceHooks(getHooks().headerGroups, makeHeaderGroups(visibleColumns, defaultColumn), getInstance());\n }, [getHooks, visibleColumns, defaultColumn, getInstance].concat(reduceHooks(getHooks().headerGroupsDeps, [], {\n instance: getInstance()\n })));\n getInstance().headerGroups = headerGroups; // Get the first level of headers\n\n var headers = React.useMemo(function () {\n return headerGroups.length ? headerGroups[0].headers : [];\n }, [headerGroups]);\n getInstance().headers = headers; // Provide a flat header list for utilities\n\n getInstance().flatHeaders = headerGroups.reduce(function (all, headerGroup) {\n return [].concat(all, headerGroup.headers);\n }, []);\n loopHooks(getHooks().useInstanceBeforeDimensions, getInstance()); // Filter columns down to visible ones\n\n var visibleColumnsDep = visibleColumns.filter(function (d) {\n return d.isVisible;\n }).map(function (d) {\n return d.id;\n }).sort().join('_');\n visibleColumns = React.useMemo(function () {\n return visibleColumns.filter(function (d) {\n return d.isVisible;\n });\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [visibleColumns, visibleColumnsDep]);\n getInstance().visibleColumns = visibleColumns; // Header Visibility is needed by this point\n\n var _calculateHeaderWidth = calculateHeaderWidths(headers),\n totalColumnsMinWidth = _calculateHeaderWidth[0],\n totalColumnsWidth = _calculateHeaderWidth[1],\n totalColumnsMaxWidth = _calculateHeaderWidth[2];\n\n getInstance().totalColumnsMinWidth = totalColumnsMinWidth;\n getInstance().totalColumnsWidth = totalColumnsWidth;\n getInstance().totalColumnsMaxWidth = totalColumnsMaxWidth;\n loopHooks(getHooks().useInstance, getInstance()) // Each materialized header needs to be assigned a render function and other\n // prop getter properties here.\n ;\n [].concat(getInstance().flatHeaders, getInstance().allColumns).forEach(function (column) {\n // Give columns/headers rendering power\n column.render = makeRenderer(getInstance(), column); // Give columns/headers a default getHeaderProps\n\n column.getHeaderProps = makePropGetter(getHooks().getHeaderProps, {\n instance: getInstance(),\n column: column\n }); // Give columns/headers a default getFooterProps\n\n column.getFooterProps = makePropGetter(getHooks().getFooterProps, {\n instance: getInstance(),\n column: column\n });\n });\n getInstance().headerGroups = React.useMemo(function () {\n return headerGroups.filter(function (headerGroup, i) {\n // Filter out any headers and headerGroups that don't have visible columns\n headerGroup.headers = headerGroup.headers.filter(function (column) {\n var recurse = function recurse(headers) {\n return headers.filter(function (column) {\n if (column.headers) {\n return recurse(column.headers);\n }\n\n return column.isVisible;\n }).length;\n };\n\n if (column.headers) {\n return recurse(column.headers);\n }\n\n return column.isVisible;\n }); // Give headerGroups getRowProps\n\n if (headerGroup.headers.length) {\n headerGroup.getHeaderGroupProps = makePropGetter(getHooks().getHeaderGroupProps, {\n instance: getInstance(),\n headerGroup: headerGroup,\n index: i\n });\n headerGroup.getFooterGroupProps = makePropGetter(getHooks().getFooterGroupProps, {\n instance: getInstance(),\n headerGroup: headerGroup,\n index: i\n });\n return true;\n }\n\n return false;\n });\n }, [headerGroups, getInstance, getHooks]);\n getInstance().footerGroups = [].concat(getInstance().headerGroups).reverse(); // The prepareRow function is absolutely necessary and MUST be called on\n // any rows the user wishes to be displayed.\n\n getInstance().prepareRow = React.useCallback(function (row) {\n row.getRowProps = makePropGetter(getHooks().getRowProps, {\n instance: getInstance(),\n row: row\n }); // Build the visible cells for each row\n\n row.allCells = allColumns.map(function (column) {\n var value = row.values[column.id];\n var cell = {\n column: column,\n row: row,\n value: value\n }; // Give each cell a getCellProps base\n\n cell.getCellProps = makePropGetter(getHooks().getCellProps, {\n instance: getInstance(),\n cell: cell\n }); // Give each cell a renderer function (supports multiple renderers)\n\n cell.render = makeRenderer(getInstance(), column, {\n row: row,\n cell: cell,\n value: value\n });\n return cell;\n });\n row.cells = visibleColumns.map(function (column) {\n return row.allCells.find(function (cell) {\n return cell.column.id === column.id;\n });\n }); // need to apply any row specific hooks (useExpanded requires this)\n\n loopHooks(getHooks().prepareRow, row, {\n instance: getInstance()\n });\n }, [getHooks, getInstance, allColumns, visibleColumns]);\n getInstance().getTableProps = makePropGetter(getHooks().getTableProps, {\n instance: getInstance()\n });\n getInstance().getTableBodyProps = makePropGetter(getHooks().getTableBodyProps, {\n instance: getInstance()\n });\n loopHooks(getHooks().useFinalInstance, getInstance());\n return getInstance();\n };\n\n function calculateHeaderWidths(headers, left) {\n if (left === void 0) {\n left = 0;\n }\n\n var sumTotalMinWidth = 0;\n var sumTotalWidth = 0;\n var sumTotalMaxWidth = 0;\n var sumTotalFlexWidth = 0;\n headers.forEach(function (header) {\n var subHeaders = header.headers;\n header.totalLeft = left;\n\n if (subHeaders && subHeaders.length) {\n var _calculateHeaderWidth2 = calculateHeaderWidths(subHeaders, left),\n totalMinWidth = _calculateHeaderWidth2[0],\n totalWidth = _calculateHeaderWidth2[1],\n totalMaxWidth = _calculateHeaderWidth2[2],\n totalFlexWidth = _calculateHeaderWidth2[3];\n\n header.totalMinWidth = totalMinWidth;\n header.totalWidth = totalWidth;\n header.totalMaxWidth = totalMaxWidth;\n header.totalFlexWidth = totalFlexWidth;\n } else {\n header.totalMinWidth = header.minWidth;\n header.totalWidth = Math.min(Math.max(header.minWidth, header.width), header.maxWidth);\n header.totalMaxWidth = header.maxWidth;\n header.totalFlexWidth = header.canResize ? header.totalWidth : 0;\n }\n\n if (header.isVisible) {\n left += header.totalWidth;\n sumTotalMinWidth += header.totalMinWidth;\n sumTotalWidth += header.totalWidth;\n sumTotalMaxWidth += header.totalMaxWidth;\n sumTotalFlexWidth += header.totalFlexWidth;\n }\n });\n return [sumTotalMinWidth, sumTotalWidth, sumTotalMaxWidth, sumTotalFlexWidth];\n }\n\n function accessRowsForColumn(_ref) {\n var data = _ref.data,\n rows = _ref.rows,\n flatRows = _ref.flatRows,\n rowsById = _ref.rowsById,\n column = _ref.column,\n getRowId = _ref.getRowId,\n getSubRows = _ref.getSubRows,\n accessValueHooks = _ref.accessValueHooks,\n getInstance = _ref.getInstance;\n\n // Access the row's data column-by-column\n // We do it this way so we can incrementally add materialized\n // columns after the first pass and avoid excessive looping\n var accessRow = function accessRow(originalRow, rowIndex, depth, parent, parentRows) {\n if (depth === void 0) {\n depth = 0;\n }\n\n // Keep the original reference around\n var original = originalRow;\n var id = getRowId(originalRow, rowIndex, parent);\n var row = rowsById[id]; // If the row hasn't been created, let's make it\n\n if (!row) {\n row = {\n id: id,\n original: original,\n index: rowIndex,\n depth: depth,\n cells: [{}] // This is a dummy cell\n\n }; // Override common array functions (and the dummy cell's getCellProps function)\n // to show an error if it is accessed without calling prepareRow\n\n row.cells.map = unpreparedAccessWarning;\n row.cells.filter = unpreparedAccessWarning;\n row.cells.forEach = unpreparedAccessWarning;\n row.cells[0].getCellProps = unpreparedAccessWarning; // Create the cells and values\n\n row.values = {}; // Push this row into the parentRows array\n\n parentRows.push(row); // Keep track of every row in a flat array\n\n flatRows.push(row); // Also keep track of every row by its ID\n\n rowsById[id] = row; // Get the original subrows\n\n row.originalSubRows = getSubRows(originalRow, rowIndex); // Then recursively access them\n\n if (row.originalSubRows) {\n var subRows = [];\n row.originalSubRows.forEach(function (d, i) {\n return accessRow(d, i, depth + 1, row, subRows);\n }); // Keep the new subRows array on the row\n\n row.subRows = subRows;\n }\n } else if (row.subRows) {\n // If the row exists, then it's already been accessed\n // Keep recursing, but don't worry about passing the\n // accumlator array (those rows already exist)\n row.originalSubRows.forEach(function (d, i) {\n return accessRow(d, i, depth + 1, row);\n });\n } // If the column has an accessor, use it to get a value\n\n\n if (column.accessor) {\n row.values[column.id] = column.accessor(originalRow, rowIndex, row, parentRows, data);\n } // Allow plugins to manipulate the column value\n\n\n row.values[column.id] = reduceHooks(accessValueHooks, row.values[column.id], {\n row: row,\n column: column,\n instance: getInstance()\n }, true);\n };\n\n data.forEach(function (originalRow, rowIndex) {\n return accessRow(originalRow, rowIndex, 0, undefined, rows);\n });\n }\n\n actions.resetExpanded = 'resetExpanded';\n actions.toggleRowExpanded = 'toggleRowExpanded';\n actions.toggleAllRowsExpanded = 'toggleAllRowsExpanded';\n var useExpanded = function useExpanded(hooks) {\n hooks.getToggleAllRowsExpandedProps = [defaultGetToggleAllRowsExpandedProps];\n hooks.getToggleRowExpandedProps = [defaultGetToggleRowExpandedProps];\n hooks.stateReducers.push(reducer$1);\n hooks.useInstance.push(useInstance$1);\n hooks.prepareRow.push(prepareRow);\n };\n useExpanded.pluginName = 'useExpanded';\n\n var defaultGetToggleAllRowsExpandedProps = function defaultGetToggleAllRowsExpandedProps(props, _ref) {\n var instance = _ref.instance;\n return [props, {\n onClick: function onClick(e) {\n instance.toggleAllRowsExpanded();\n },\n style: {\n cursor: 'pointer'\n },\n title: 'Toggle All Rows Expanded'\n }];\n };\n\n var defaultGetToggleRowExpandedProps = function defaultGetToggleRowExpandedProps(props, _ref2) {\n var row = _ref2.row;\n return [props, {\n onClick: function onClick() {\n row.toggleRowExpanded();\n },\n style: {\n cursor: 'pointer'\n },\n title: 'Toggle Row Expanded'\n }];\n }; // Reducer\n\n\n function reducer$1(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n expanded: {}\n }, state);\n }\n\n if (action.type === actions.resetExpanded) {\n return _extends({}, state, {\n expanded: instance.initialState.expanded || {}\n });\n }\n\n if (action.type === actions.toggleAllRowsExpanded) {\n var value = action.value;\n var isAllRowsExpanded = instance.isAllRowsExpanded,\n rowsById = instance.rowsById;\n var expandAll = typeof value !== 'undefined' ? value : !isAllRowsExpanded;\n\n if (expandAll) {\n var expanded = {};\n Object.keys(rowsById).forEach(function (rowId) {\n expanded[rowId] = true;\n });\n return _extends({}, state, {\n expanded: expanded\n });\n }\n\n return _extends({}, state, {\n expanded: {}\n });\n }\n\n if (action.type === actions.toggleRowExpanded) {\n var id = action.id,\n setExpanded = action.value;\n var exists = state.expanded[id];\n var shouldExist = typeof setExpanded !== 'undefined' ? setExpanded : !exists;\n\n if (!exists && shouldExist) {\n var _extends2;\n\n return _extends({}, state, {\n expanded: _extends({}, state.expanded, (_extends2 = {}, _extends2[id] = true, _extends2))\n });\n } else if (exists && !shouldExist) {\n var _state$expanded = state.expanded,\n _ = _state$expanded[id],\n rest = _objectWithoutPropertiesLoose(_state$expanded, [id].map(_toPropertyKey));\n\n return _extends({}, state, {\n expanded: rest\n });\n } else {\n return state;\n }\n }\n }\n\n function useInstance$1(instance) {\n var data = instance.data,\n rows = instance.rows,\n rowsById = instance.rowsById,\n _instance$manualExpan = instance.manualExpandedKey,\n manualExpandedKey = _instance$manualExpan === void 0 ? 'expanded' : _instance$manualExpan,\n _instance$paginateExp = instance.paginateExpandedRows,\n paginateExpandedRows = _instance$paginateExp === void 0 ? true : _instance$paginateExp,\n _instance$expandSubRo = instance.expandSubRows,\n expandSubRows = _instance$expandSubRo === void 0 ? true : _instance$expandSubRo,\n _instance$autoResetEx = instance.autoResetExpanded,\n autoResetExpanded = _instance$autoResetEx === void 0 ? true : _instance$autoResetEx,\n getHooks = instance.getHooks,\n plugins = instance.plugins,\n expanded = instance.state.expanded,\n dispatch = instance.dispatch;\n ensurePluginOrder(plugins, ['useSortBy', 'useGroupBy', 'usePivotColumns', 'useGlobalFilter'], 'useExpanded');\n var getAutoResetExpanded = useGetLatest(autoResetExpanded);\n var isAllRowsExpanded = Boolean(Object.keys(rowsById).length && Object.keys(expanded).length);\n\n if (isAllRowsExpanded) {\n if (Object.keys(rowsById).some(function (id) {\n return !expanded[id];\n })) {\n isAllRowsExpanded = false;\n }\n } // Bypass any effects from firing when this changes\n\n\n useMountedLayoutEffect(function () {\n if (getAutoResetExpanded()) {\n dispatch({\n type: actions.resetExpanded\n });\n }\n }, [dispatch, data]);\n var toggleRowExpanded = React.useCallback(function (id, value) {\n dispatch({\n type: actions.toggleRowExpanded,\n id: id,\n value: value\n });\n }, [dispatch]);\n var toggleAllRowsExpanded = React.useCallback(function (value) {\n return dispatch({\n type: actions.toggleAllRowsExpanded,\n value: value\n });\n }, [dispatch]);\n var expandedRows = React.useMemo(function () {\n if (paginateExpandedRows) {\n return expandRows(rows, {\n manualExpandedKey: manualExpandedKey,\n expanded: expanded,\n expandSubRows: expandSubRows\n });\n }\n\n return rows;\n }, [paginateExpandedRows, rows, manualExpandedKey, expanded, expandSubRows]);\n var expandedDepth = React.useMemo(function () {\n return findExpandedDepth(expanded);\n }, [expanded]);\n var getInstance = useGetLatest(instance);\n var getToggleAllRowsExpandedProps = makePropGetter(getHooks().getToggleAllRowsExpandedProps, {\n instance: getInstance()\n });\n Object.assign(instance, {\n preExpandedRows: rows,\n expandedRows: expandedRows,\n rows: expandedRows,\n expandedDepth: expandedDepth,\n isAllRowsExpanded: isAllRowsExpanded,\n toggleRowExpanded: toggleRowExpanded,\n toggleAllRowsExpanded: toggleAllRowsExpanded,\n getToggleAllRowsExpandedProps: getToggleAllRowsExpandedProps\n });\n }\n\n function prepareRow(row, _ref3) {\n var getHooks = _ref3.instance.getHooks,\n instance = _ref3.instance;\n\n row.toggleRowExpanded = function (set) {\n return instance.toggleRowExpanded(row.id, set);\n };\n\n row.getToggleRowExpandedProps = makePropGetter(getHooks().getToggleRowExpandedProps, {\n instance: instance,\n row: row\n });\n }\n\n function findExpandedDepth(expanded) {\n var maxDepth = 0;\n Object.keys(expanded).forEach(function (id) {\n var splitId = id.split('.');\n maxDepth = Math.max(maxDepth, splitId.length);\n });\n return maxDepth;\n }\n\n var text = function text(rows, ids, filterValue) {\n rows = rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return String(rowValue).toLowerCase().includes(String(filterValue).toLowerCase());\n });\n });\n return rows;\n };\n\n text.autoRemove = function (val) {\n return !val;\n };\n\n var exactText = function exactText(rows, ids, filterValue) {\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return rowValue !== undefined ? String(rowValue).toLowerCase() === String(filterValue).toLowerCase() : true;\n });\n });\n };\n\n exactText.autoRemove = function (val) {\n return !val;\n };\n\n var exactTextCase = function exactTextCase(rows, ids, filterValue) {\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return rowValue !== undefined ? String(rowValue) === String(filterValue) : true;\n });\n });\n };\n\n exactTextCase.autoRemove = function (val) {\n return !val;\n };\n\n var includes = function includes(rows, ids, filterValue) {\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return rowValue.includes(filterValue);\n });\n });\n };\n\n includes.autoRemove = function (val) {\n return !val || !val.length;\n };\n\n var includesAll = function includesAll(rows, ids, filterValue) {\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return rowValue && rowValue.length && filterValue.every(function (val) {\n return rowValue.includes(val);\n });\n });\n });\n };\n\n includesAll.autoRemove = function (val) {\n return !val || !val.length;\n };\n\n var includesSome = function includesSome(rows, ids, filterValue) {\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return rowValue && rowValue.length && filterValue.some(function (val) {\n return rowValue.includes(val);\n });\n });\n });\n };\n\n includesSome.autoRemove = function (val) {\n return !val || !val.length;\n };\n\n var includesValue = function includesValue(rows, ids, filterValue) {\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return filterValue.includes(rowValue);\n });\n });\n };\n\n includesValue.autoRemove = function (val) {\n return !val || !val.length;\n };\n\n var exact = function exact(rows, ids, filterValue) {\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return rowValue === filterValue;\n });\n });\n };\n\n exact.autoRemove = function (val) {\n return typeof val === 'undefined';\n };\n\n var equals = function equals(rows, ids, filterValue) {\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id]; // eslint-disable-next-line eqeqeq\n\n return rowValue == filterValue;\n });\n });\n };\n\n equals.autoRemove = function (val) {\n return val == null;\n };\n\n var between = function between(rows, ids, filterValue) {\n var _ref = filterValue || [],\n min = _ref[0],\n max = _ref[1];\n\n min = typeof min === 'number' ? min : -Infinity;\n max = typeof max === 'number' ? max : Infinity;\n\n if (min > max) {\n var temp = min;\n min = max;\n max = temp;\n }\n\n return rows.filter(function (row) {\n return ids.some(function (id) {\n var rowValue = row.values[id];\n return rowValue >= min && rowValue <= max;\n });\n });\n };\n\n between.autoRemove = function (val) {\n return !val || typeof val[0] !== 'number' && typeof val[1] !== 'number';\n };\n\n var filterTypes = /*#__PURE__*/Object.freeze({\n __proto__: null,\n text: text,\n exactText: exactText,\n exactTextCase: exactTextCase,\n includes: includes,\n includesAll: includesAll,\n includesSome: includesSome,\n includesValue: includesValue,\n exact: exact,\n equals: equals,\n between: between\n });\n\n actions.resetFilters = 'resetFilters';\n actions.setFilter = 'setFilter';\n actions.setAllFilters = 'setAllFilters';\n var useFilters = function useFilters(hooks) {\n hooks.stateReducers.push(reducer$2);\n hooks.useInstance.push(useInstance$2);\n };\n useFilters.pluginName = 'useFilters';\n\n function reducer$2(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n filters: []\n }, state);\n }\n\n if (action.type === actions.resetFilters) {\n return _extends({}, state, {\n filters: instance.initialState.filters || []\n });\n }\n\n if (action.type === actions.setFilter) {\n var columnId = action.columnId,\n filterValue = action.filterValue;\n var allColumns = instance.allColumns,\n userFilterTypes = instance.filterTypes;\n var column = allColumns.find(function (d) {\n return d.id === columnId;\n });\n\n if (!column) {\n throw new Error(\"React-Table: Could not find a column with id: \" + columnId);\n }\n\n var filterMethod = getFilterMethod(column.filter, userFilterTypes || {}, filterTypes);\n var previousfilter = state.filters.find(function (d) {\n return d.id === columnId;\n });\n var newFilter = functionalUpdate(filterValue, previousfilter && previousfilter.value); //\n\n if (shouldAutoRemoveFilter(filterMethod.autoRemove, newFilter, column)) {\n return _extends({}, state, {\n filters: state.filters.filter(function (d) {\n return d.id !== columnId;\n })\n });\n }\n\n if (previousfilter) {\n return _extends({}, state, {\n filters: state.filters.map(function (d) {\n if (d.id === columnId) {\n return {\n id: columnId,\n value: newFilter\n };\n }\n\n return d;\n })\n });\n }\n\n return _extends({}, state, {\n filters: [].concat(state.filters, [{\n id: columnId,\n value: newFilter\n }])\n });\n }\n\n if (action.type === actions.setAllFilters) {\n var filters = action.filters;\n var _allColumns = instance.allColumns,\n _userFilterTypes = instance.filterTypes;\n return _extends({}, state, {\n // Filter out undefined values\n filters: functionalUpdate(filters, state.filters).filter(function (filter) {\n var column = _allColumns.find(function (d) {\n return d.id === filter.id;\n });\n\n var filterMethod = getFilterMethod(column.filter, _userFilterTypes || {}, filterTypes);\n\n if (shouldAutoRemoveFilter(filterMethod.autoRemove, filter.value, column)) {\n return false;\n }\n\n return true;\n })\n });\n }\n }\n\n function useInstance$2(instance) {\n var data = instance.data,\n rows = instance.rows,\n flatRows = instance.flatRows,\n rowsById = instance.rowsById,\n allColumns = instance.allColumns,\n userFilterTypes = instance.filterTypes,\n manualFilters = instance.manualFilters,\n _instance$defaultCanF = instance.defaultCanFilter,\n defaultCanFilter = _instance$defaultCanF === void 0 ? false : _instance$defaultCanF,\n disableFilters = instance.disableFilters,\n filters = instance.state.filters,\n dispatch = instance.dispatch,\n _instance$autoResetFi = instance.autoResetFilters,\n autoResetFilters = _instance$autoResetFi === void 0 ? true : _instance$autoResetFi;\n var setFilter = React.useCallback(function (columnId, filterValue) {\n dispatch({\n type: actions.setFilter,\n columnId: columnId,\n filterValue: filterValue\n });\n }, [dispatch]);\n var setAllFilters = React.useCallback(function (filters) {\n dispatch({\n type: actions.setAllFilters,\n filters: filters\n });\n }, [dispatch]);\n allColumns.forEach(function (column) {\n var id = column.id,\n accessor = column.accessor,\n columnDefaultCanFilter = column.defaultCanFilter,\n columnDisableFilters = column.disableFilters; // Determine if a column is filterable\n\n column.canFilter = accessor ? getFirstDefined(columnDisableFilters === true ? false : undefined, disableFilters === true ? false : undefined, true) : getFirstDefined(columnDefaultCanFilter, defaultCanFilter, false); // Provide the column a way of updating the filter value\n\n column.setFilter = function (val) {\n return setFilter(column.id, val);\n }; // Provide the current filter value to the column for\n // convenience\n\n\n var found = filters.find(function (d) {\n return d.id === id;\n });\n column.filterValue = found && found.value;\n });\n\n var _React$useMemo = React.useMemo(function () {\n if (manualFilters || !filters.length) {\n return [rows, flatRows, rowsById];\n }\n\n var filteredFlatRows = [];\n var filteredRowsById = {}; // Filters top level and nested rows\n\n var filterRows = function filterRows(rows, depth) {\n if (depth === void 0) {\n depth = 0;\n }\n\n var filteredRows = rows;\n filteredRows = filters.reduce(function (filteredSoFar, _ref) {\n var columnId = _ref.id,\n filterValue = _ref.value;\n // Find the filters column\n var column = allColumns.find(function (d) {\n return d.id === columnId;\n });\n\n if (!column) {\n return filteredSoFar;\n }\n\n if (depth === 0) {\n column.preFilteredRows = filteredSoFar;\n }\n\n var filterMethod = getFilterMethod(column.filter, userFilterTypes || {}, filterTypes);\n\n if (!filterMethod) {\n console.warn(\"Could not find a valid 'column.filter' for column with the ID: \" + column.id + \".\");\n return filteredSoFar;\n } // Pass the rows, id, filterValue and column to the filterMethod\n // to get the filtered rows back\n\n\n column.filteredRows = filterMethod(filteredSoFar, [columnId], filterValue);\n return column.filteredRows;\n }, rows); // Apply the filter to any subRows\n // We technically could do this recursively in the above loop,\n // but that would severely hinder the API for the user, since they\n // would be required to do that recursion in some scenarios\n\n filteredRows.forEach(function (row) {\n filteredFlatRows.push(row);\n filteredRowsById[row.id] = row;\n\n if (!row.subRows) {\n return;\n }\n\n row.subRows = row.subRows && row.subRows.length > 0 ? filterRows(row.subRows, depth + 1) : row.subRows;\n });\n return filteredRows;\n };\n\n return [filterRows(rows), filteredFlatRows, filteredRowsById];\n }, [manualFilters, filters, rows, flatRows, rowsById, allColumns, userFilterTypes]),\n filteredRows = _React$useMemo[0],\n filteredFlatRows = _React$useMemo[1],\n filteredRowsById = _React$useMemo[2];\n\n React.useMemo(function () {\n // Now that each filtered column has it's partially filtered rows,\n // lets assign the final filtered rows to all of the other columns\n var nonFilteredColumns = allColumns.filter(function (column) {\n return !filters.find(function (d) {\n return d.id === column.id;\n });\n }); // This essentially enables faceted filter options to be built easily\n // using every column's preFilteredRows value\n\n nonFilteredColumns.forEach(function (column) {\n column.preFilteredRows = filteredRows;\n column.filteredRows = filteredRows;\n });\n }, [filteredRows, filters, allColumns]);\n var getAutoResetFilters = useGetLatest(autoResetFilters);\n useMountedLayoutEffect(function () {\n if (getAutoResetFilters()) {\n dispatch({\n type: actions.resetFilters\n });\n }\n }, [dispatch, manualFilters ? null : data]);\n Object.assign(instance, {\n preFilteredRows: rows,\n preFilteredFlatRows: flatRows,\n preFilteredRowsById: rowsById,\n filteredRows: filteredRows,\n filteredFlatRows: filteredFlatRows,\n filteredRowsById: filteredRowsById,\n rows: filteredRows,\n flatRows: filteredFlatRows,\n rowsById: filteredRowsById,\n setFilter: setFilter,\n setAllFilters: setAllFilters\n });\n }\n\n actions.resetGlobalFilter = 'resetGlobalFilter';\n actions.setGlobalFilter = 'setGlobalFilter';\n var useGlobalFilter = function useGlobalFilter(hooks) {\n hooks.stateReducers.push(reducer$3);\n hooks.useInstance.push(useInstance$3);\n };\n useGlobalFilter.pluginName = 'useGlobalFilter';\n\n function reducer$3(state, action, previousState, instance) {\n if (action.type === actions.resetGlobalFilter) {\n return _extends({}, state, {\n globalFilter: instance.initialState.globalFilter || undefined\n });\n }\n\n if (action.type === actions.setGlobalFilter) {\n var filterValue = action.filterValue;\n var userFilterTypes = instance.userFilterTypes;\n var filterMethod = getFilterMethod(instance.globalFilter, userFilterTypes || {}, filterTypes);\n var newFilter = functionalUpdate(filterValue, state.globalFilter); //\n\n if (shouldAutoRemoveFilter(filterMethod.autoRemove, newFilter)) {\n var globalFilter = state.globalFilter,\n stateWithoutGlobalFilter = _objectWithoutPropertiesLoose(state, [\"globalFilter\"]);\n\n return stateWithoutGlobalFilter;\n }\n\n return _extends({}, state, {\n globalFilter: newFilter\n });\n }\n }\n\n function useInstance$3(instance) {\n var data = instance.data,\n rows = instance.rows,\n flatRows = instance.flatRows,\n rowsById = instance.rowsById,\n allColumns = instance.allColumns,\n userFilterTypes = instance.filterTypes,\n globalFilter = instance.globalFilter,\n manualGlobalFilter = instance.manualGlobalFilter,\n globalFilterValue = instance.state.globalFilter,\n dispatch = instance.dispatch,\n _instance$autoResetGl = instance.autoResetGlobalFilter,\n autoResetGlobalFilter = _instance$autoResetGl === void 0 ? true : _instance$autoResetGl,\n disableGlobalFilter = instance.disableGlobalFilter;\n var setGlobalFilter = React.useCallback(function (filterValue) {\n dispatch({\n type: actions.setGlobalFilter,\n filterValue: filterValue\n });\n }, [dispatch]); // TODO: Create a filter cache for incremental high speed multi-filtering\n // This gets pretty complicated pretty fast, since you have to maintain a\n // cache for each row group (top-level rows, and each row's recursive subrows)\n // This would make multi-filtering a lot faster though. Too far?\n\n var _React$useMemo = React.useMemo(function () {\n if (manualGlobalFilter || typeof globalFilterValue === 'undefined') {\n return [rows, flatRows, rowsById];\n }\n\n var filteredFlatRows = [];\n var filteredRowsById = {};\n var filterMethod = getFilterMethod(globalFilter, userFilterTypes || {}, filterTypes);\n\n if (!filterMethod) {\n console.warn(\"Could not find a valid 'globalFilter' option.\");\n return rows;\n }\n\n allColumns.forEach(function (column) {\n var columnDisableGlobalFilter = column.disableGlobalFilter;\n column.canFilter = getFirstDefined(columnDisableGlobalFilter === true ? false : undefined, disableGlobalFilter === true ? false : undefined, true);\n });\n var filterableColumns = allColumns.filter(function (c) {\n return c.canFilter === true;\n }); // Filters top level and nested rows\n\n var filterRows = function filterRows(filteredRows) {\n filteredRows = filterMethod(filteredRows, filterableColumns.map(function (d) {\n return d.id;\n }), globalFilterValue);\n filteredRows.forEach(function (row) {\n filteredFlatRows.push(row);\n filteredRowsById[row.id] = row;\n row.subRows = row.subRows && row.subRows.length ? filterRows(row.subRows) : row.subRows;\n });\n return filteredRows;\n };\n\n return [filterRows(rows), filteredFlatRows, filteredRowsById];\n }, [manualGlobalFilter, globalFilterValue, globalFilter, userFilterTypes, allColumns, rows, flatRows, rowsById, disableGlobalFilter]),\n globalFilteredRows = _React$useMemo[0],\n globalFilteredFlatRows = _React$useMemo[1],\n globalFilteredRowsById = _React$useMemo[2];\n\n var getAutoResetGlobalFilter = useGetLatest(autoResetGlobalFilter);\n useMountedLayoutEffect(function () {\n if (getAutoResetGlobalFilter()) {\n dispatch({\n type: actions.resetGlobalFilter\n });\n }\n }, [dispatch, manualGlobalFilter ? null : data]);\n Object.assign(instance, {\n preGlobalFilteredRows: rows,\n preGlobalFilteredFlatRows: flatRows,\n preGlobalFilteredRowsById: rowsById,\n globalFilteredRows: globalFilteredRows,\n globalFilteredFlatRows: globalFilteredFlatRows,\n globalFilteredRowsById: globalFilteredRowsById,\n rows: globalFilteredRows,\n flatRows: globalFilteredFlatRows,\n rowsById: globalFilteredRowsById,\n setGlobalFilter: setGlobalFilter,\n disableGlobalFilter: disableGlobalFilter\n });\n }\n\n function sum(values, aggregatedValues) {\n // It's faster to just add the aggregations together instead of\n // process leaf nodes individually\n return aggregatedValues.reduce(function (sum, next) {\n return sum + (typeof next === 'number' ? next : 0);\n }, 0);\n }\n function min(values) {\n var min = values[0] || 0;\n values.forEach(function (value) {\n if (typeof value === 'number') {\n min = Math.min(min, value);\n }\n });\n return min;\n }\n function max(values) {\n var max = values[0] || 0;\n values.forEach(function (value) {\n if (typeof value === 'number') {\n max = Math.max(max, value);\n }\n });\n return max;\n }\n function minMax(values) {\n var min = values[0] || 0;\n var max = values[0] || 0;\n values.forEach(function (value) {\n if (typeof value === 'number') {\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n });\n return min + \"..\" + max;\n }\n function average(values) {\n return sum(null, values) / values.length;\n }\n function median(values) {\n if (!values.length) {\n return null;\n }\n\n var mid = Math.floor(values.length / 2);\n var nums = [].concat(values).sort(function (a, b) {\n return a - b;\n });\n return values.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2;\n }\n function unique(values) {\n return Array.from(new Set(values).values());\n }\n function uniqueCount(values) {\n return new Set(values).size;\n }\n function count(values) {\n return values.length;\n }\n\n var aggregations = /*#__PURE__*/Object.freeze({\n __proto__: null,\n sum: sum,\n min: min,\n max: max,\n minMax: minMax,\n average: average,\n median: median,\n unique: unique,\n uniqueCount: uniqueCount,\n count: count\n });\n\n var emptyArray = [];\n var emptyObject = {}; // Actions\n\n actions.resetGroupBy = 'resetGroupBy';\n actions.setGroupBy = 'setGroupBy';\n actions.toggleGroupBy = 'toggleGroupBy';\n var useGroupBy = function useGroupBy(hooks) {\n hooks.getGroupByToggleProps = [defaultGetGroupByToggleProps];\n hooks.stateReducers.push(reducer$4);\n hooks.visibleColumnsDeps.push(function (deps, _ref) {\n var instance = _ref.instance;\n return [].concat(deps, [instance.state.groupBy]);\n });\n hooks.visibleColumns.push(visibleColumns);\n hooks.useInstance.push(useInstance$4);\n hooks.prepareRow.push(prepareRow$1);\n };\n useGroupBy.pluginName = 'useGroupBy';\n\n var defaultGetGroupByToggleProps = function defaultGetGroupByToggleProps(props, _ref2) {\n var header = _ref2.header;\n return [props, {\n onClick: header.canGroupBy ? function (e) {\n e.persist();\n header.toggleGroupBy();\n } : undefined,\n style: {\n cursor: header.canGroupBy ? 'pointer' : undefined\n },\n title: 'Toggle GroupBy'\n }];\n }; // Reducer\n\n\n function reducer$4(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n groupBy: []\n }, state);\n }\n\n if (action.type === actions.resetGroupBy) {\n return _extends({}, state, {\n groupBy: instance.initialState.groupBy || []\n });\n }\n\n if (action.type === actions.setGroupBy) {\n var value = action.value;\n return _extends({}, state, {\n groupBy: value\n });\n }\n\n if (action.type === actions.toggleGroupBy) {\n var columnId = action.columnId,\n setGroupBy = action.value;\n var resolvedGroupBy = typeof setGroupBy !== 'undefined' ? setGroupBy : !state.groupBy.includes(columnId);\n\n if (resolvedGroupBy) {\n return _extends({}, state, {\n groupBy: [].concat(state.groupBy, [columnId])\n });\n }\n\n return _extends({}, state, {\n groupBy: state.groupBy.filter(function (d) {\n return d !== columnId;\n })\n });\n }\n }\n\n function visibleColumns(columns, _ref3) {\n var groupBy = _ref3.instance.state.groupBy;\n // Sort grouped columns to the start of the column list\n // before the headers are built\n var groupByColumns = groupBy.map(function (g) {\n return columns.find(function (col) {\n return col.id === g;\n });\n }).filter(Boolean);\n var nonGroupByColumns = columns.filter(function (col) {\n return !groupBy.includes(col.id);\n });\n columns = [].concat(groupByColumns, nonGroupByColumns);\n columns.forEach(function (column) {\n column.isGrouped = groupBy.includes(column.id);\n column.groupedIndex = groupBy.indexOf(column.id);\n });\n return columns;\n }\n\n var defaultUserAggregations = {};\n\n function useInstance$4(instance) {\n var data = instance.data,\n rows = instance.rows,\n flatRows = instance.flatRows,\n rowsById = instance.rowsById,\n allColumns = instance.allColumns,\n flatHeaders = instance.flatHeaders,\n _instance$groupByFn = instance.groupByFn,\n groupByFn = _instance$groupByFn === void 0 ? defaultGroupByFn : _instance$groupByFn,\n manualGroupBy = instance.manualGroupBy,\n _instance$aggregation = instance.aggregations,\n userAggregations = _instance$aggregation === void 0 ? defaultUserAggregations : _instance$aggregation,\n plugins = instance.plugins,\n groupBy = instance.state.groupBy,\n dispatch = instance.dispatch,\n _instance$autoResetGr = instance.autoResetGroupBy,\n autoResetGroupBy = _instance$autoResetGr === void 0 ? true : _instance$autoResetGr,\n disableGroupBy = instance.disableGroupBy,\n defaultCanGroupBy = instance.defaultCanGroupBy,\n getHooks = instance.getHooks;\n ensurePluginOrder(plugins, ['useColumnOrder', 'useFilters'], 'useGroupBy');\n var getInstance = useGetLatest(instance);\n allColumns.forEach(function (column) {\n var accessor = column.accessor,\n defaultColumnGroupBy = column.defaultGroupBy,\n columnDisableGroupBy = column.disableGroupBy;\n column.canGroupBy = accessor ? getFirstDefined(column.canGroupBy, columnDisableGroupBy === true ? false : undefined, disableGroupBy === true ? false : undefined, true) : getFirstDefined(column.canGroupBy, defaultColumnGroupBy, defaultCanGroupBy, false);\n\n if (column.canGroupBy) {\n column.toggleGroupBy = function () {\n return instance.toggleGroupBy(column.id);\n };\n }\n\n column.Aggregated = column.Aggregated || column.Cell;\n });\n var toggleGroupBy = React.useCallback(function (columnId, value) {\n dispatch({\n type: actions.toggleGroupBy,\n columnId: columnId,\n value: value\n });\n }, [dispatch]);\n var setGroupBy = React.useCallback(function (value) {\n dispatch({\n type: actions.setGroupBy,\n value: value\n });\n }, [dispatch]);\n flatHeaders.forEach(function (header) {\n header.getGroupByToggleProps = makePropGetter(getHooks().getGroupByToggleProps, {\n instance: getInstance(),\n header: header\n });\n });\n\n var _React$useMemo = React.useMemo(function () {\n if (manualGroupBy || !groupBy.length) {\n return [rows, flatRows, rowsById, emptyArray, emptyObject, flatRows, rowsById];\n } // Ensure that the list of filtered columns exist\n\n\n var existingGroupBy = groupBy.filter(function (g) {\n return allColumns.find(function (col) {\n return col.id === g;\n });\n }); // Find the columns that can or are aggregating\n // Uses each column to aggregate rows into a single value\n\n var aggregateRowsToValues = function aggregateRowsToValues(leafRows, groupedRows, depth) {\n var values = {};\n allColumns.forEach(function (column) {\n // Don't aggregate columns that are in the groupBy\n if (existingGroupBy.includes(column.id)) {\n values[column.id] = groupedRows[0] ? groupedRows[0].values[column.id] : null;\n return;\n } // Aggregate the values\n\n\n var aggregateFn = typeof column.aggregate === 'function' ? column.aggregate : userAggregations[column.aggregate] || aggregations[column.aggregate];\n\n if (aggregateFn) {\n // Get the columnValues to aggregate\n var groupedValues = groupedRows.map(function (row) {\n return row.values[column.id];\n }); // Get the columnValues to aggregate\n\n var leafValues = leafRows.map(function (row) {\n var columnValue = row.values[column.id];\n\n if (!depth && column.aggregateValue) {\n var aggregateValueFn = typeof column.aggregateValue === 'function' ? column.aggregateValue : userAggregations[column.aggregateValue] || aggregations[column.aggregateValue];\n\n if (!aggregateValueFn) {\n console.info({\n column: column\n });\n throw new Error(\"React Table: Invalid column.aggregateValue option for column listed above\");\n }\n\n columnValue = aggregateValueFn(columnValue, row, column);\n }\n\n return columnValue;\n });\n values[column.id] = aggregateFn(leafValues, groupedValues);\n } else if (column.aggregate) {\n console.info({\n column: column\n });\n throw new Error(\"React Table: Invalid column.aggregate option for column listed above\");\n } else {\n values[column.id] = null;\n }\n });\n return values;\n };\n\n var groupedFlatRows = [];\n var groupedRowsById = {};\n var onlyGroupedFlatRows = [];\n var onlyGroupedRowsById = {};\n var nonGroupedFlatRows = [];\n var nonGroupedRowsById = {}; // Recursively group the data\n\n var groupUpRecursively = function groupUpRecursively(rows, depth, parentId) {\n if (depth === void 0) {\n depth = 0;\n }\n\n // This is the last level, just return the rows\n if (depth === existingGroupBy.length) {\n return rows;\n }\n\n var columnId = existingGroupBy[depth]; // Group the rows together for this level\n\n var rowGroupsMap = groupByFn(rows, columnId); // Peform aggregations for each group\n\n var aggregatedGroupedRows = Object.entries(rowGroupsMap).map(function (_ref4, index) {\n var groupByVal = _ref4[0],\n groupedRows = _ref4[1];\n var id = columnId + \":\" + groupByVal;\n id = parentId ? parentId + \">\" + id : id; // First, Recurse to group sub rows before aggregation\n\n var subRows = groupUpRecursively(groupedRows, depth + 1, id); // Flatten the leaf rows of the rows in this group\n\n var leafRows = depth ? flattenBy(groupedRows, 'leafRows') : groupedRows;\n var values = aggregateRowsToValues(leafRows, groupedRows, depth);\n var row = {\n id: id,\n isGrouped: true,\n groupByID: columnId,\n groupByVal: groupByVal,\n values: values,\n subRows: subRows,\n leafRows: leafRows,\n depth: depth,\n index: index\n };\n subRows.forEach(function (subRow) {\n groupedFlatRows.push(subRow);\n groupedRowsById[subRow.id] = subRow;\n\n if (subRow.isGrouped) {\n onlyGroupedFlatRows.push(subRow);\n onlyGroupedRowsById[subRow.id] = subRow;\n } else {\n nonGroupedFlatRows.push(subRow);\n nonGroupedRowsById[subRow.id] = subRow;\n }\n });\n return row;\n });\n return aggregatedGroupedRows;\n };\n\n var groupedRows = groupUpRecursively(rows);\n groupedRows.forEach(function (subRow) {\n groupedFlatRows.push(subRow);\n groupedRowsById[subRow.id] = subRow;\n\n if (subRow.isGrouped) {\n onlyGroupedFlatRows.push(subRow);\n onlyGroupedRowsById[subRow.id] = subRow;\n } else {\n nonGroupedFlatRows.push(subRow);\n nonGroupedRowsById[subRow.id] = subRow;\n }\n }); // Assign the new data\n\n return [groupedRows, groupedFlatRows, groupedRowsById, onlyGroupedFlatRows, onlyGroupedRowsById, nonGroupedFlatRows, nonGroupedRowsById];\n }, [manualGroupBy, groupBy, rows, flatRows, rowsById, allColumns, userAggregations, groupByFn]),\n groupedRows = _React$useMemo[0],\n groupedFlatRows = _React$useMemo[1],\n groupedRowsById = _React$useMemo[2],\n onlyGroupedFlatRows = _React$useMemo[3],\n onlyGroupedRowsById = _React$useMemo[4],\n nonGroupedFlatRows = _React$useMemo[5],\n nonGroupedRowsById = _React$useMemo[6];\n\n var getAutoResetGroupBy = useGetLatest(autoResetGroupBy);\n useMountedLayoutEffect(function () {\n if (getAutoResetGroupBy()) {\n dispatch({\n type: actions.resetGroupBy\n });\n }\n }, [dispatch, manualGroupBy ? null : data]);\n Object.assign(instance, {\n preGroupedRows: rows,\n preGroupedFlatRow: flatRows,\n preGroupedRowsById: rowsById,\n groupedRows: groupedRows,\n groupedFlatRows: groupedFlatRows,\n groupedRowsById: groupedRowsById,\n onlyGroupedFlatRows: onlyGroupedFlatRows,\n onlyGroupedRowsById: onlyGroupedRowsById,\n nonGroupedFlatRows: nonGroupedFlatRows,\n nonGroupedRowsById: nonGroupedRowsById,\n rows: groupedRows,\n flatRows: groupedFlatRows,\n rowsById: groupedRowsById,\n toggleGroupBy: toggleGroupBy,\n setGroupBy: setGroupBy\n });\n }\n\n function prepareRow$1(row) {\n row.allCells.forEach(function (cell) {\n var _row$subRows;\n\n // Grouped cells are in the groupBy and the pivot cell for the row\n cell.isGrouped = cell.column.isGrouped && cell.column.id === row.groupByID; // Placeholder cells are any columns in the groupBy that are not grouped\n\n cell.isPlaceholder = !cell.isGrouped && cell.column.isGrouped; // Aggregated cells are not grouped, not repeated, but still have subRows\n\n cell.isAggregated = !cell.isGrouped && !cell.isPlaceholder && ((_row$subRows = row.subRows) == null ? void 0 : _row$subRows.length);\n });\n }\n\n function defaultGroupByFn(rows, columnId) {\n return rows.reduce(function (prev, row, i) {\n // TODO: Might want to implement a key serializer here so\n // irregular column values can still be grouped if needed?\n var resKey = \"\" + row.values[columnId];\n prev[resKey] = Array.isArray(prev[resKey]) ? prev[resKey] : [];\n prev[resKey].push(row);\n return prev;\n }, {});\n }\n\n var reSplitAlphaNumeric = /([0-9]+)/gm; // Mixed sorting is slow, but very inclusive of many edge cases.\n // It handles numbers, mixed alphanumeric combinations, and even\n // null, undefined, and Infinity\n\n var alphanumeric = function alphanumeric(rowA, rowB, columnId) {\n var a = getRowValueByColumnID(rowA, columnId);\n var b = getRowValueByColumnID(rowB, columnId); // Force to strings (or \"\" for unsupported types)\n\n a = toString(a);\n b = toString(b); // Split on number groups, but keep the delimiter\n // Then remove falsey split values\n\n a = a.split(reSplitAlphaNumeric).filter(Boolean);\n b = b.split(reSplitAlphaNumeric).filter(Boolean); // While\n\n while (a.length && b.length) {\n var aa = a.shift();\n var bb = b.shift();\n var an = parseInt(aa, 10);\n var bn = parseInt(bb, 10);\n var combo = [an, bn].sort(); // Both are string\n\n if (isNaN(combo[0])) {\n if (aa > bb) {\n return 1;\n }\n\n if (bb > aa) {\n return -1;\n }\n\n continue;\n } // One is a string, one is a number\n\n\n if (isNaN(combo[1])) {\n return isNaN(an) ? -1 : 1;\n } // Both are numbers\n\n\n if (an > bn) {\n return 1;\n }\n\n if (bn > an) {\n return -1;\n }\n }\n\n return a.length - b.length;\n };\n function datetime(rowA, rowB, columnId) {\n var a = getRowValueByColumnID(rowA, columnId);\n var b = getRowValueByColumnID(rowB, columnId);\n a = a.getTime();\n b = b.getTime();\n return compareBasic(a, b);\n }\n function basic(rowA, rowB, columnId) {\n var a = getRowValueByColumnID(rowA, columnId);\n var b = getRowValueByColumnID(rowB, columnId);\n return compareBasic(a, b);\n } // Utils\n\n function compareBasic(a, b) {\n return a === b ? 0 : a > b ? 1 : -1;\n }\n\n function getRowValueByColumnID(row, columnId) {\n return row.values[columnId];\n }\n\n function toString(a) {\n if (typeof a === 'number') {\n if (isNaN(a) || a === Infinity || a === -Infinity) {\n return '';\n }\n\n return String(a);\n }\n\n if (typeof a === 'string') {\n return a;\n }\n\n return '';\n }\n\n var sortTypes = /*#__PURE__*/Object.freeze({\n __proto__: null,\n alphanumeric: alphanumeric,\n datetime: datetime,\n basic: basic\n });\n\n actions.resetSortBy = 'resetSortBy';\n actions.setSortBy = 'setSortBy';\n actions.toggleSortBy = 'toggleSortBy';\n actions.clearSortBy = 'clearSortBy';\n defaultColumn.sortType = 'alphanumeric';\n defaultColumn.sortDescFirst = false;\n var useSortBy = function useSortBy(hooks) {\n hooks.getSortByToggleProps = [defaultGetSortByToggleProps];\n hooks.stateReducers.push(reducer$5);\n hooks.useInstance.push(useInstance$5);\n };\n useSortBy.pluginName = 'useSortBy';\n\n var defaultGetSortByToggleProps = function defaultGetSortByToggleProps(props, _ref) {\n var instance = _ref.instance,\n column = _ref.column;\n var _instance$isMultiSort = instance.isMultiSortEvent,\n isMultiSortEvent = _instance$isMultiSort === void 0 ? function (e) {\n return e.shiftKey;\n } : _instance$isMultiSort;\n return [props, {\n onClick: column.canSort ? function (e) {\n e.persist();\n column.toggleSortBy(undefined, !instance.disableMultiSort && isMultiSortEvent(e));\n } : undefined,\n style: {\n cursor: column.canSort ? 'pointer' : undefined\n },\n title: column.canSort ? 'Toggle SortBy' : undefined\n }];\n }; // Reducer\n\n\n function reducer$5(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n sortBy: []\n }, state);\n }\n\n if (action.type === actions.resetSortBy) {\n return _extends({}, state, {\n sortBy: instance.initialState.sortBy || []\n });\n }\n\n if (action.type === actions.clearSortBy) {\n var sortBy = state.sortBy;\n var newSortBy = sortBy.filter(function (d) {\n return d.id !== action.columnId;\n });\n return _extends({}, state, {\n sortBy: newSortBy\n });\n }\n\n if (action.type === actions.setSortBy) {\n var _sortBy = action.sortBy;\n return _extends({}, state, {\n sortBy: _sortBy\n });\n }\n\n if (action.type === actions.toggleSortBy) {\n var columnId = action.columnId,\n desc = action.desc,\n multi = action.multi;\n var allColumns = instance.allColumns,\n disableMultiSort = instance.disableMultiSort,\n disableSortRemove = instance.disableSortRemove,\n disableMultiRemove = instance.disableMultiRemove,\n _instance$maxMultiSor = instance.maxMultiSortColCount,\n maxMultiSortColCount = _instance$maxMultiSor === void 0 ? Number.MAX_SAFE_INTEGER : _instance$maxMultiSor;\n var _sortBy2 = state.sortBy; // Find the column for this columnId\n\n var column = allColumns.find(function (d) {\n return d.id === columnId;\n });\n var sortDescFirst = column.sortDescFirst; // Find any existing sortBy for this column\n\n var existingSortBy = _sortBy2.find(function (d) {\n return d.id === columnId;\n });\n\n var existingIndex = _sortBy2.findIndex(function (d) {\n return d.id === columnId;\n });\n\n var hasDescDefined = typeof desc !== 'undefined' && desc !== null;\n var _newSortBy = []; // What should we do with this sort action?\n\n var sortAction;\n\n if (!disableMultiSort && multi) {\n if (existingSortBy) {\n sortAction = 'toggle';\n } else {\n sortAction = 'add';\n }\n } else {\n // Normal mode\n if (existingIndex !== _sortBy2.length - 1 || _sortBy2.length !== 1) {\n sortAction = 'replace';\n } else if (existingSortBy) {\n sortAction = 'toggle';\n } else {\n sortAction = 'replace';\n }\n } // Handle toggle states that will remove the sortBy\n\n\n if (sortAction === 'toggle' && // Must be toggling\n !disableSortRemove && // If disableSortRemove, disable in general\n !hasDescDefined && ( // Must not be setting desc\n multi ? !disableMultiRemove : true) && ( // If multi, don't allow if disableMultiRemove\n existingSortBy && // Finally, detect if it should indeed be removed\n existingSortBy.desc && !sortDescFirst || !existingSortBy.desc && sortDescFirst)) {\n sortAction = 'remove';\n }\n\n if (sortAction === 'replace') {\n _newSortBy = [{\n id: columnId,\n desc: hasDescDefined ? desc : sortDescFirst\n }];\n } else if (sortAction === 'add') {\n _newSortBy = [].concat(_sortBy2, [{\n id: columnId,\n desc: hasDescDefined ? desc : sortDescFirst\n }]); // Take latest n columns\n\n _newSortBy.splice(0, _newSortBy.length - maxMultiSortColCount);\n } else if (sortAction === 'toggle') {\n // This flips (or sets) the\n _newSortBy = _sortBy2.map(function (d) {\n if (d.id === columnId) {\n return _extends({}, d, {\n desc: hasDescDefined ? desc : !existingSortBy.desc\n });\n }\n\n return d;\n });\n } else if (sortAction === 'remove') {\n _newSortBy = _sortBy2.filter(function (d) {\n return d.id !== columnId;\n });\n }\n\n return _extends({}, state, {\n sortBy: _newSortBy\n });\n }\n }\n\n function useInstance$5(instance) {\n var data = instance.data,\n rows = instance.rows,\n flatRows = instance.flatRows,\n allColumns = instance.allColumns,\n _instance$orderByFn = instance.orderByFn,\n orderByFn = _instance$orderByFn === void 0 ? defaultOrderByFn : _instance$orderByFn,\n userSortTypes = instance.sortTypes,\n manualSortBy = instance.manualSortBy,\n defaultCanSort = instance.defaultCanSort,\n disableSortBy = instance.disableSortBy,\n flatHeaders = instance.flatHeaders,\n sortBy = instance.state.sortBy,\n dispatch = instance.dispatch,\n plugins = instance.plugins,\n getHooks = instance.getHooks,\n _instance$autoResetSo = instance.autoResetSortBy,\n autoResetSortBy = _instance$autoResetSo === void 0 ? true : _instance$autoResetSo;\n ensurePluginOrder(plugins, ['useFilters', 'useGlobalFilter', 'useGroupBy', 'usePivotColumns'], 'useSortBy');\n var setSortBy = React.useCallback(function (sortBy) {\n dispatch({\n type: actions.setSortBy,\n sortBy: sortBy\n });\n }, [dispatch]); // Updates sorting based on a columnId, desc flag and multi flag\n\n var toggleSortBy = React.useCallback(function (columnId, desc, multi) {\n dispatch({\n type: actions.toggleSortBy,\n columnId: columnId,\n desc: desc,\n multi: multi\n });\n }, [dispatch]); // use reference to avoid memory leak in #1608\n\n var getInstance = useGetLatest(instance); // Add the getSortByToggleProps method to columns and headers\n\n flatHeaders.forEach(function (column) {\n var accessor = column.accessor,\n defaultColumnCanSort = column.canSort,\n columnDisableSortBy = column.disableSortBy,\n id = column.id;\n var canSort = accessor ? getFirstDefined(columnDisableSortBy === true ? false : undefined, disableSortBy === true ? false : undefined, true) : getFirstDefined(defaultCanSort, defaultColumnCanSort, false);\n column.canSort = canSort;\n\n if (column.canSort) {\n column.toggleSortBy = function (desc, multi) {\n return toggleSortBy(column.id, desc, multi);\n };\n\n column.clearSortBy = function () {\n dispatch({\n type: actions.clearSortBy,\n columnId: column.id\n });\n };\n }\n\n column.getSortByToggleProps = makePropGetter(getHooks().getSortByToggleProps, {\n instance: getInstance(),\n column: column\n });\n var columnSort = sortBy.find(function (d) {\n return d.id === id;\n });\n column.isSorted = !!columnSort;\n column.sortedIndex = sortBy.findIndex(function (d) {\n return d.id === id;\n });\n column.isSortedDesc = column.isSorted ? columnSort.desc : undefined;\n });\n\n var _React$useMemo = React.useMemo(function () {\n if (manualSortBy || !sortBy.length) {\n return [rows, flatRows];\n }\n\n var sortedFlatRows = []; // Filter out sortBys that correspond to non existing columns\n\n var availableSortBy = sortBy.filter(function (sort) {\n return allColumns.find(function (col) {\n return col.id === sort.id;\n });\n });\n\n var sortData = function sortData(rows) {\n // Use the orderByFn to compose multiple sortBy's together.\n // This will also perform a stable sorting using the row index\n // if needed.\n var sortedData = orderByFn(rows, availableSortBy.map(function (sort) {\n // Support custom sorting methods for each column\n var column = allColumns.find(function (d) {\n return d.id === sort.id;\n });\n\n if (!column) {\n throw new Error(\"React-Table: Could not find a column with id: \" + sort.id + \" while sorting\");\n }\n\n var sortType = column.sortType; // Look up sortBy functions in this order:\n // column function\n // column string lookup on user sortType\n // column string lookup on built-in sortType\n // default function\n // default string lookup on user sortType\n // default string lookup on built-in sortType\n\n var sortMethod = isFunction(sortType) || (userSortTypes || {})[sortType] || sortTypes[sortType];\n\n if (!sortMethod) {\n throw new Error(\"React-Table: Could not find a valid sortType of '\" + sortType + \"' for column '\" + sort.id + \"'.\");\n } // Return the correct sortFn.\n // This function should always return in ascending order\n\n\n return function (a, b) {\n return sortMethod(a, b, sort.id, sort.desc);\n };\n }), // Map the directions\n availableSortBy.map(function (sort) {\n // Detect and use the sortInverted option\n var column = allColumns.find(function (d) {\n return d.id === sort.id;\n });\n\n if (column && column.sortInverted) {\n return sort.desc;\n }\n\n return !sort.desc;\n })); // If there are sub-rows, sort them\n\n sortedData.forEach(function (row) {\n sortedFlatRows.push(row);\n\n if (!row.subRows || row.subRows.length === 0) {\n return;\n }\n\n row.subRows = sortData(row.subRows);\n });\n return sortedData;\n };\n\n return [sortData(rows), sortedFlatRows];\n }, [manualSortBy, sortBy, rows, flatRows, allColumns, orderByFn, userSortTypes]),\n sortedRows = _React$useMemo[0],\n sortedFlatRows = _React$useMemo[1];\n\n var getAutoResetSortBy = useGetLatest(autoResetSortBy);\n useMountedLayoutEffect(function () {\n if (getAutoResetSortBy()) {\n dispatch({\n type: actions.resetSortBy\n });\n }\n }, [manualSortBy ? null : data]);\n Object.assign(instance, {\n preSortedRows: rows,\n preSortedFlatRows: flatRows,\n sortedRows: sortedRows,\n sortedFlatRows: sortedFlatRows,\n rows: sortedRows,\n flatRows: sortedFlatRows,\n setSortBy: setSortBy,\n toggleSortBy: toggleSortBy\n });\n }\n\n function defaultOrderByFn(arr, funcs, dirs) {\n return [].concat(arr).sort(function (rowA, rowB) {\n for (var i = 0; i < funcs.length; i += 1) {\n var sortFn = funcs[i];\n var desc = dirs[i] === false || dirs[i] === 'desc';\n var sortInt = sortFn(rowA, rowB);\n\n if (sortInt !== 0) {\n return desc ? -sortInt : sortInt;\n }\n }\n\n return dirs[0] ? rowA.index - rowB.index : rowB.index - rowA.index;\n });\n }\n\n var pluginName = 'usePagination'; // Actions\n\n actions.resetPage = 'resetPage';\n actions.gotoPage = 'gotoPage';\n actions.setPageSize = 'setPageSize';\n var usePagination = function usePagination(hooks) {\n hooks.stateReducers.push(reducer$6);\n hooks.useInstance.push(useInstance$6);\n };\n usePagination.pluginName = pluginName;\n\n function reducer$6(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n pageSize: 10,\n pageIndex: 0\n }, state);\n }\n\n if (action.type === actions.resetPage) {\n return _extends({}, state, {\n pageIndex: instance.initialState.pageIndex || 0\n });\n }\n\n if (action.type === actions.gotoPage) {\n var pageCount = instance.pageCount,\n page = instance.page;\n var newPageIndex = functionalUpdate(action.pageIndex, state.pageIndex);\n var canNavigate = false;\n\n if (newPageIndex > state.pageIndex) {\n // next page\n canNavigate = pageCount === -1 ? page.length >= state.pageSize : newPageIndex < pageCount;\n } else if (newPageIndex < state.pageIndex) {\n // prev page\n canNavigate = newPageIndex > -1;\n }\n\n if (!canNavigate) {\n return state;\n }\n\n return _extends({}, state, {\n pageIndex: newPageIndex\n });\n }\n\n if (action.type === actions.setPageSize) {\n var pageSize = action.pageSize;\n var topRowIndex = state.pageSize * state.pageIndex;\n var pageIndex = Math.floor(topRowIndex / pageSize);\n return _extends({}, state, {\n pageIndex: pageIndex,\n pageSize: pageSize\n });\n }\n }\n\n function useInstance$6(instance) {\n var rows = instance.rows,\n _instance$autoResetPa = instance.autoResetPage,\n autoResetPage = _instance$autoResetPa === void 0 ? true : _instance$autoResetPa,\n _instance$manualExpan = instance.manualExpandedKey,\n manualExpandedKey = _instance$manualExpan === void 0 ? 'expanded' : _instance$manualExpan,\n plugins = instance.plugins,\n userPageCount = instance.pageCount,\n _instance$paginateExp = instance.paginateExpandedRows,\n paginateExpandedRows = _instance$paginateExp === void 0 ? true : _instance$paginateExp,\n _instance$expandSubRo = instance.expandSubRows,\n expandSubRows = _instance$expandSubRo === void 0 ? true : _instance$expandSubRo,\n _instance$state = instance.state,\n pageSize = _instance$state.pageSize,\n pageIndex = _instance$state.pageIndex,\n expanded = _instance$state.expanded,\n globalFilter = _instance$state.globalFilter,\n filters = _instance$state.filters,\n groupBy = _instance$state.groupBy,\n sortBy = _instance$state.sortBy,\n dispatch = instance.dispatch,\n data = instance.data,\n manualPagination = instance.manualPagination;\n ensurePluginOrder(plugins, ['useGlobalFilter', 'useFilters', 'useGroupBy', 'useSortBy', 'useExpanded'], 'usePagination');\n var getAutoResetPage = useGetLatest(autoResetPage);\n useMountedLayoutEffect(function () {\n if (getAutoResetPage()) {\n dispatch({\n type: actions.resetPage\n });\n }\n }, [dispatch, manualPagination ? null : data, globalFilter, filters, groupBy, sortBy]);\n var pageCount = manualPagination ? userPageCount : Math.ceil(rows.length / pageSize);\n var pageOptions = React.useMemo(function () {\n return pageCount > 0 ? [].concat(new Array(pageCount)).fill(null).map(function (d, i) {\n return i;\n }) : [];\n }, [pageCount]);\n var page = React.useMemo(function () {\n var page;\n\n if (manualPagination) {\n page = rows;\n } else {\n var pageStart = pageSize * pageIndex;\n var pageEnd = pageStart + pageSize;\n page = rows.slice(pageStart, pageEnd);\n }\n\n if (paginateExpandedRows) {\n return page;\n }\n\n return expandRows(page, {\n manualExpandedKey: manualExpandedKey,\n expanded: expanded,\n expandSubRows: expandSubRows\n });\n }, [expandSubRows, expanded, manualExpandedKey, manualPagination, pageIndex, pageSize, paginateExpandedRows, rows]);\n var canPreviousPage = pageIndex > 0;\n var canNextPage = pageCount === -1 ? page.length >= pageSize : pageIndex < pageCount - 1;\n var gotoPage = React.useCallback(function (pageIndex) {\n dispatch({\n type: actions.gotoPage,\n pageIndex: pageIndex\n });\n }, [dispatch]);\n var previousPage = React.useCallback(function () {\n return gotoPage(function (old) {\n return old - 1;\n });\n }, [gotoPage]);\n var nextPage = React.useCallback(function () {\n return gotoPage(function (old) {\n return old + 1;\n });\n }, [gotoPage]);\n var setPageSize = React.useCallback(function (pageSize) {\n dispatch({\n type: actions.setPageSize,\n pageSize: pageSize\n });\n }, [dispatch]);\n Object.assign(instance, {\n pageOptions: pageOptions,\n pageCount: pageCount,\n page: page,\n canPreviousPage: canPreviousPage,\n canNextPage: canNextPage,\n gotoPage: gotoPage,\n previousPage: previousPage,\n nextPage: nextPage,\n setPageSize: setPageSize\n });\n }\n\n actions.resetPivot = 'resetPivot';\n actions.togglePivot = 'togglePivot';\n var _UNSTABLE_usePivotColumns = function _UNSTABLE_usePivotColumns(hooks) {\n hooks.getPivotToggleProps = [defaultGetPivotToggleProps];\n hooks.stateReducers.push(reducer$7);\n hooks.useInstanceAfterData.push(useInstanceAfterData);\n hooks.allColumns.push(allColumns);\n hooks.accessValue.push(accessValue);\n hooks.materializedColumns.push(materializedColumns);\n hooks.materializedColumnsDeps.push(materializedColumnsDeps);\n hooks.visibleColumns.push(visibleColumns$1);\n hooks.visibleColumnsDeps.push(visibleColumnsDeps);\n hooks.useInstance.push(useInstance$7);\n hooks.prepareRow.push(prepareRow$2);\n };\n _UNSTABLE_usePivotColumns.pluginName = 'usePivotColumns';\n var defaultPivotColumns = [];\n\n var defaultGetPivotToggleProps = function defaultGetPivotToggleProps(props, _ref) {\n var header = _ref.header;\n return [props, {\n onClick: header.canPivot ? function (e) {\n e.persist();\n header.togglePivot();\n } : undefined,\n style: {\n cursor: header.canPivot ? 'pointer' : undefined\n },\n title: 'Toggle Pivot'\n }];\n }; // Reducer\n\n\n function reducer$7(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n pivotColumns: defaultPivotColumns\n }, state);\n }\n\n if (action.type === actions.resetPivot) {\n return _extends({}, state, {\n pivotColumns: instance.initialState.pivotColumns || defaultPivotColumns\n });\n }\n\n if (action.type === actions.togglePivot) {\n var columnId = action.columnId,\n setPivot = action.value;\n var resolvedPivot = typeof setPivot !== 'undefined' ? setPivot : !state.pivotColumns.includes(columnId);\n\n if (resolvedPivot) {\n return _extends({}, state, {\n pivotColumns: [].concat(state.pivotColumns, [columnId])\n });\n }\n\n return _extends({}, state, {\n pivotColumns: state.pivotColumns.filter(function (d) {\n return d !== columnId;\n })\n });\n }\n }\n\n function useInstanceAfterData(instance) {\n instance.allColumns.forEach(function (column) {\n column.isPivotSource = instance.state.pivotColumns.includes(column.id);\n });\n }\n\n function allColumns(columns, _ref2) {\n var instance = _ref2.instance;\n columns.forEach(function (column) {\n column.isPivotSource = instance.state.pivotColumns.includes(column.id);\n column.uniqueValues = new Set();\n });\n return columns;\n }\n\n function accessValue(value, _ref3) {\n var column = _ref3.column;\n\n if (column.uniqueValues && typeof value !== 'undefined') {\n column.uniqueValues.add(value);\n }\n\n return value;\n }\n\n function materializedColumns(materialized, _ref4) {\n var instance = _ref4.instance;\n var allColumns = instance.allColumns,\n state = instance.state;\n\n if (!state.pivotColumns.length || !state.groupBy || !state.groupBy.length) {\n return materialized;\n }\n\n var pivotColumns = state.pivotColumns.map(function (id) {\n return allColumns.find(function (d) {\n return d.id === id;\n });\n }).filter(Boolean);\n var sourceColumns = allColumns.filter(function (d) {\n return !d.isPivotSource && !state.groupBy.includes(d.id) && !state.pivotColumns.includes(d.id);\n });\n\n var buildPivotColumns = function buildPivotColumns(depth, parent, pivotFilters) {\n if (depth === void 0) {\n depth = 0;\n }\n\n if (pivotFilters === void 0) {\n pivotFilters = [];\n }\n\n var pivotColumn = pivotColumns[depth];\n\n if (!pivotColumn) {\n return sourceColumns.map(function (sourceColumn) {\n // TODO: We could offer support here for renesting pivoted\n // columns inside copies of their header groups. For now,\n // that seems like it would be (1) overkill on nesting, considering\n // you already get nesting for every pivot level and (2)\n // really hard. :)\n return _extends({}, sourceColumn, {\n canPivot: false,\n isPivoted: true,\n parent: parent,\n depth: depth,\n id: \"\" + (parent ? parent.id + \".\" + sourceColumn.id : sourceColumn.id),\n accessor: function accessor(originalRow, i, row) {\n if (pivotFilters.every(function (filter) {\n return filter(row);\n })) {\n return row.values[sourceColumn.id];\n }\n }\n });\n });\n }\n\n var uniqueValues = Array.from(pivotColumn.uniqueValues).sort();\n return uniqueValues.map(function (uniqueValue) {\n var columnGroup = _extends({}, pivotColumn, {\n Header: pivotColumn.PivotHeader || typeof pivotColumn.header === 'string' ? pivotColumn.Header + \": \" + uniqueValue : uniqueValue,\n isPivotGroup: true,\n parent: parent,\n depth: depth,\n id: parent ? parent.id + \".\" + pivotColumn.id + \".\" + uniqueValue : pivotColumn.id + \".\" + uniqueValue,\n pivotValue: uniqueValue\n });\n\n columnGroup.columns = buildPivotColumns(depth + 1, columnGroup, [].concat(pivotFilters, [function (row) {\n return row.values[pivotColumn.id] === uniqueValue;\n }]));\n return columnGroup;\n });\n };\n\n var newMaterialized = flattenColumns(buildPivotColumns());\n return [].concat(materialized, newMaterialized);\n }\n\n function materializedColumnsDeps(deps, _ref5) {\n var _ref5$instance$state = _ref5.instance.state,\n pivotColumns = _ref5$instance$state.pivotColumns,\n groupBy = _ref5$instance$state.groupBy;\n return [].concat(deps, [pivotColumns, groupBy]);\n }\n\n function visibleColumns$1(visibleColumns, _ref6) {\n var state = _ref6.instance.state;\n visibleColumns = visibleColumns.filter(function (d) {\n return !d.isPivotSource;\n });\n\n if (state.pivotColumns.length && state.groupBy && state.groupBy.length) {\n visibleColumns = visibleColumns.filter(function (column) {\n return column.isGrouped || column.isPivoted;\n });\n }\n\n return visibleColumns;\n }\n\n function visibleColumnsDeps(deps, _ref7) {\n var instance = _ref7.instance;\n return [].concat(deps, [instance.state.pivotColumns, instance.state.groupBy]);\n }\n\n function useInstance$7(instance) {\n var columns = instance.columns,\n allColumns = instance.allColumns,\n flatHeaders = instance.flatHeaders,\n getHooks = instance.getHooks,\n plugins = instance.plugins,\n dispatch = instance.dispatch,\n _instance$autoResetPi = instance.autoResetPivot,\n autoResetPivot = _instance$autoResetPi === void 0 ? true : _instance$autoResetPi,\n manaulPivot = instance.manaulPivot,\n disablePivot = instance.disablePivot,\n defaultCanPivot = instance.defaultCanPivot;\n ensurePluginOrder(plugins, ['useGroupBy'], 'usePivotColumns');\n var getInstance = useGetLatest(instance);\n allColumns.forEach(function (column) {\n var accessor = column.accessor,\n defaultColumnPivot = column.defaultPivot,\n columnDisablePivot = column.disablePivot;\n column.canPivot = accessor ? getFirstDefined(column.canPivot, columnDisablePivot === true ? false : undefined, disablePivot === true ? false : undefined, true) : getFirstDefined(column.canPivot, defaultColumnPivot, defaultCanPivot, false);\n\n if (column.canPivot) {\n column.togglePivot = function () {\n return instance.togglePivot(column.id);\n };\n }\n\n column.Aggregated = column.Aggregated || column.Cell;\n });\n\n var togglePivot = function togglePivot(columnId, value) {\n dispatch({\n type: actions.togglePivot,\n columnId: columnId,\n value: value\n });\n };\n\n flatHeaders.forEach(function (header) {\n header.getPivotToggleProps = makePropGetter(getHooks().getPivotToggleProps, {\n instance: getInstance(),\n header: header\n });\n });\n var getAutoResetPivot = useGetLatest(autoResetPivot);\n useMountedLayoutEffect(function () {\n if (getAutoResetPivot()) {\n dispatch({\n type: actions.resetPivot\n });\n }\n }, [dispatch, manaulPivot ? null : columns]);\n Object.assign(instance, {\n togglePivot: togglePivot\n });\n }\n\n function prepareRow$2(row) {\n row.allCells.forEach(function (cell) {\n // Grouped cells are in the pivotColumns and the pivot cell for the row\n cell.isPivoted = cell.column.isPivoted;\n });\n }\n\n var pluginName$1 = 'useRowSelect'; // Actions\n\n actions.resetSelectedRows = 'resetSelectedRows';\n actions.toggleAllRowsSelected = 'toggleAllRowsSelected';\n actions.toggleRowSelected = 'toggleRowSelected';\n actions.toggleAllPageRowsSelected = 'toggleAllPageRowsSelected';\n var useRowSelect = function useRowSelect(hooks) {\n hooks.getToggleRowSelectedProps = [defaultGetToggleRowSelectedProps];\n hooks.getToggleAllRowsSelectedProps = [defaultGetToggleAllRowsSelectedProps];\n hooks.getToggleAllPageRowsSelectedProps = [defaultGetToggleAllPageRowsSelectedProps];\n hooks.stateReducers.push(reducer$8);\n hooks.useInstance.push(useInstance$8);\n hooks.prepareRow.push(prepareRow$3);\n };\n useRowSelect.pluginName = pluginName$1;\n\n var defaultGetToggleRowSelectedProps = function defaultGetToggleRowSelectedProps(props, _ref) {\n var instance = _ref.instance,\n row = _ref.row;\n var _instance$manualRowSe = instance.manualRowSelectedKey,\n manualRowSelectedKey = _instance$manualRowSe === void 0 ? 'isSelected' : _instance$manualRowSe;\n var checked = false;\n\n if (row.original && row.original[manualRowSelectedKey]) {\n checked = true;\n } else {\n checked = row.isSelected;\n }\n\n return [props, {\n onChange: function onChange(e) {\n row.toggleRowSelected(e.target.checked);\n },\n style: {\n cursor: 'pointer'\n },\n checked: checked,\n title: 'Toggle Row Selected',\n indeterminate: row.isSomeSelected\n }];\n };\n\n var defaultGetToggleAllRowsSelectedProps = function defaultGetToggleAllRowsSelectedProps(props, _ref2) {\n var instance = _ref2.instance;\n return [props, {\n onChange: function onChange(e) {\n instance.toggleAllRowsSelected(e.target.checked);\n },\n style: {\n cursor: 'pointer'\n },\n checked: instance.isAllRowsSelected,\n title: 'Toggle All Rows Selected',\n indeterminate: Boolean(!instance.isAllRowsSelected && Object.keys(instance.state.selectedRowIds).length)\n }];\n };\n\n var defaultGetToggleAllPageRowsSelectedProps = function defaultGetToggleAllPageRowsSelectedProps(props, _ref3) {\n var instance = _ref3.instance;\n return [props, {\n onChange: function onChange(e) {\n instance.toggleAllPageRowsSelected(e.target.checked);\n },\n style: {\n cursor: 'pointer'\n },\n checked: instance.isAllPageRowsSelected,\n title: 'Toggle All Current Page Rows Selected',\n indeterminate: Boolean(!instance.isAllPageRowsSelected && instance.page.some(function (_ref4) {\n var id = _ref4.id;\n return instance.state.selectedRowIds[id];\n }))\n }];\n }; // eslint-disable-next-line max-params\n\n\n function reducer$8(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n selectedRowIds: {}\n }, state);\n }\n\n if (action.type === actions.resetSelectedRows) {\n return _extends({}, state, {\n selectedRowIds: instance.initialState.selectedRowIds || {}\n });\n }\n\n if (action.type === actions.toggleAllRowsSelected) {\n var setSelected = action.value;\n var isAllRowsSelected = instance.isAllRowsSelected,\n rowsById = instance.rowsById,\n _instance$nonGroupedR = instance.nonGroupedRowsById,\n nonGroupedRowsById = _instance$nonGroupedR === void 0 ? rowsById : _instance$nonGroupedR;\n var selectAll = typeof setSelected !== 'undefined' ? setSelected : !isAllRowsSelected; // Only remove/add the rows that are visible on the screen\n // Leave all the other rows that are selected alone.\n\n var selectedRowIds = Object.assign({}, state.selectedRowIds);\n\n if (selectAll) {\n Object.keys(nonGroupedRowsById).forEach(function (rowId) {\n selectedRowIds[rowId] = true;\n });\n } else {\n Object.keys(nonGroupedRowsById).forEach(function (rowId) {\n delete selectedRowIds[rowId];\n });\n }\n\n return _extends({}, state, {\n selectedRowIds: selectedRowIds\n });\n }\n\n if (action.type === actions.toggleRowSelected) {\n var id = action.id,\n _setSelected = action.value;\n var _rowsById = instance.rowsById,\n _instance$selectSubRo = instance.selectSubRows,\n selectSubRows = _instance$selectSubRo === void 0 ? true : _instance$selectSubRo,\n getSubRows = instance.getSubRows;\n var isSelected = state.selectedRowIds[id];\n var shouldExist = typeof _setSelected !== 'undefined' ? _setSelected : !isSelected;\n\n if (isSelected === shouldExist) {\n return state;\n }\n\n var newSelectedRowIds = _extends({}, state.selectedRowIds);\n\n var handleRowById = function handleRowById(id) {\n var row = _rowsById[id];\n\n if (!row.isGrouped) {\n if (shouldExist) {\n newSelectedRowIds[id] = true;\n } else {\n delete newSelectedRowIds[id];\n }\n }\n\n if (selectSubRows && getSubRows(row)) {\n return getSubRows(row).forEach(function (row) {\n return handleRowById(row.id);\n });\n }\n };\n\n handleRowById(id);\n return _extends({}, state, {\n selectedRowIds: newSelectedRowIds\n });\n }\n\n if (action.type === actions.toggleAllPageRowsSelected) {\n var _setSelected2 = action.value;\n\n var page = instance.page,\n _rowsById2 = instance.rowsById,\n _instance$selectSubRo2 = instance.selectSubRows,\n _selectSubRows = _instance$selectSubRo2 === void 0 ? true : _instance$selectSubRo2,\n isAllPageRowsSelected = instance.isAllPageRowsSelected,\n _getSubRows = instance.getSubRows;\n\n var _selectAll = typeof _setSelected2 !== 'undefined' ? _setSelected2 : !isAllPageRowsSelected;\n\n var _newSelectedRowIds = _extends({}, state.selectedRowIds);\n\n var _handleRowById = function _handleRowById(id) {\n var row = _rowsById2[id];\n\n if (!row.isGrouped) {\n if (_selectAll) {\n _newSelectedRowIds[id] = true;\n } else {\n delete _newSelectedRowIds[id];\n }\n }\n\n if (_selectSubRows && _getSubRows(row)) {\n return _getSubRows(row).forEach(function (row) {\n return _handleRowById(row.id);\n });\n }\n };\n\n page.forEach(function (row) {\n return _handleRowById(row.id);\n });\n return _extends({}, state, {\n selectedRowIds: _newSelectedRowIds\n });\n }\n\n return state;\n }\n\n function useInstance$8(instance) {\n var data = instance.data,\n rows = instance.rows,\n getHooks = instance.getHooks,\n plugins = instance.plugins,\n rowsById = instance.rowsById,\n _instance$nonGroupedR2 = instance.nonGroupedRowsById,\n nonGroupedRowsById = _instance$nonGroupedR2 === void 0 ? rowsById : _instance$nonGroupedR2,\n _instance$autoResetSe = instance.autoResetSelectedRows,\n autoResetSelectedRows = _instance$autoResetSe === void 0 ? true : _instance$autoResetSe,\n selectedRowIds = instance.state.selectedRowIds,\n _instance$selectSubRo3 = instance.selectSubRows,\n selectSubRows = _instance$selectSubRo3 === void 0 ? true : _instance$selectSubRo3,\n dispatch = instance.dispatch,\n page = instance.page,\n getSubRows = instance.getSubRows;\n ensurePluginOrder(plugins, ['useFilters', 'useGroupBy', 'useSortBy', 'useExpanded', 'usePagination'], 'useRowSelect');\n var selectedFlatRows = React.useMemo(function () {\n var selectedFlatRows = [];\n rows.forEach(function (row) {\n var isSelected = selectSubRows ? getRowIsSelected(row, selectedRowIds, getSubRows) : !!selectedRowIds[row.id];\n row.isSelected = !!isSelected;\n row.isSomeSelected = isSelected === null;\n\n if (isSelected) {\n selectedFlatRows.push(row);\n }\n });\n return selectedFlatRows;\n }, [rows, selectSubRows, selectedRowIds, getSubRows]);\n var isAllRowsSelected = Boolean(Object.keys(nonGroupedRowsById).length && Object.keys(selectedRowIds).length);\n var isAllPageRowsSelected = isAllRowsSelected;\n\n if (isAllRowsSelected) {\n if (Object.keys(nonGroupedRowsById).some(function (id) {\n return !selectedRowIds[id];\n })) {\n isAllRowsSelected = false;\n }\n }\n\n if (!isAllRowsSelected) {\n if (page && page.length && page.some(function (_ref5) {\n var id = _ref5.id;\n return !selectedRowIds[id];\n })) {\n isAllPageRowsSelected = false;\n }\n }\n\n var getAutoResetSelectedRows = useGetLatest(autoResetSelectedRows);\n useMountedLayoutEffect(function () {\n if (getAutoResetSelectedRows()) {\n dispatch({\n type: actions.resetSelectedRows\n });\n }\n }, [dispatch, data]);\n var toggleAllRowsSelected = React.useCallback(function (value) {\n return dispatch({\n type: actions.toggleAllRowsSelected,\n value: value\n });\n }, [dispatch]);\n var toggleAllPageRowsSelected = React.useCallback(function (value) {\n return dispatch({\n type: actions.toggleAllPageRowsSelected,\n value: value\n });\n }, [dispatch]);\n var toggleRowSelected = React.useCallback(function (id, value) {\n return dispatch({\n type: actions.toggleRowSelected,\n id: id,\n value: value\n });\n }, [dispatch]);\n var getInstance = useGetLatest(instance);\n var getToggleAllRowsSelectedProps = makePropGetter(getHooks().getToggleAllRowsSelectedProps, {\n instance: getInstance()\n });\n var getToggleAllPageRowsSelectedProps = makePropGetter(getHooks().getToggleAllPageRowsSelectedProps, {\n instance: getInstance()\n });\n Object.assign(instance, {\n selectedFlatRows: selectedFlatRows,\n isAllRowsSelected: isAllRowsSelected,\n isAllPageRowsSelected: isAllPageRowsSelected,\n toggleRowSelected: toggleRowSelected,\n toggleAllRowsSelected: toggleAllRowsSelected,\n getToggleAllRowsSelectedProps: getToggleAllRowsSelectedProps,\n getToggleAllPageRowsSelectedProps: getToggleAllPageRowsSelectedProps,\n toggleAllPageRowsSelected: toggleAllPageRowsSelected\n });\n }\n\n function prepareRow$3(row, _ref6) {\n var instance = _ref6.instance;\n\n row.toggleRowSelected = function (set) {\n return instance.toggleRowSelected(row.id, set);\n };\n\n row.getToggleRowSelectedProps = makePropGetter(instance.getHooks().getToggleRowSelectedProps, {\n instance: instance,\n row: row\n });\n }\n\n function getRowIsSelected(row, selectedRowIds, getSubRows) {\n if (selectedRowIds[row.id]) {\n return true;\n }\n\n var subRows = getSubRows(row);\n\n if (subRows && subRows.length) {\n var allChildrenSelected = true;\n var someSelected = false;\n subRows.forEach(function (subRow) {\n // Bail out early if we know both of these\n if (someSelected && !allChildrenSelected) {\n return;\n }\n\n if (getRowIsSelected(subRow, selectedRowIds, getSubRows)) {\n someSelected = true;\n } else {\n allChildrenSelected = false;\n }\n });\n return allChildrenSelected ? true : someSelected ? null : false;\n }\n\n return false;\n }\n\n var defaultInitialRowStateAccessor = function defaultInitialRowStateAccessor(row) {\n return {};\n };\n\n var defaultInitialCellStateAccessor = function defaultInitialCellStateAccessor(cell) {\n return {};\n }; // Actions\n\n\n actions.setRowState = 'setRowState';\n actions.setCellState = 'setCellState';\n actions.resetRowState = 'resetRowState';\n var useRowState = function useRowState(hooks) {\n hooks.stateReducers.push(reducer$9);\n hooks.useInstance.push(useInstance$9);\n hooks.prepareRow.push(prepareRow$4);\n };\n useRowState.pluginName = 'useRowState';\n\n function reducer$9(state, action, previousState, instance) {\n var _instance$initialRowS = instance.initialRowStateAccessor,\n initialRowStateAccessor = _instance$initialRowS === void 0 ? defaultInitialRowStateAccessor : _instance$initialRowS,\n _instance$initialCell = instance.initialCellStateAccessor,\n initialCellStateAccessor = _instance$initialCell === void 0 ? defaultInitialCellStateAccessor : _instance$initialCell,\n rowsById = instance.rowsById;\n\n if (action.type === actions.init) {\n return _extends({\n rowState: {}\n }, state);\n }\n\n if (action.type === actions.resetRowState) {\n return _extends({}, state, {\n rowState: instance.initialState.rowState || {}\n });\n }\n\n if (action.type === actions.setRowState) {\n var _extends2;\n\n var rowId = action.rowId,\n value = action.value;\n var oldRowState = typeof state.rowState[rowId] !== 'undefined' ? state.rowState[rowId] : initialRowStateAccessor(rowsById[rowId]);\n return _extends({}, state, {\n rowState: _extends({}, state.rowState, (_extends2 = {}, _extends2[rowId] = functionalUpdate(value, oldRowState), _extends2))\n });\n }\n\n if (action.type === actions.setCellState) {\n var _oldRowState$cellStat, _rowsById$_rowId, _rowsById$_rowId$cell, _extends3, _extends4;\n\n var _rowId = action.rowId,\n columnId = action.columnId,\n _value = action.value;\n\n var _oldRowState = typeof state.rowState[_rowId] !== 'undefined' ? state.rowState[_rowId] : initialRowStateAccessor(rowsById[_rowId]);\n\n var oldCellState = typeof (_oldRowState == null ? void 0 : (_oldRowState$cellStat = _oldRowState.cellState) == null ? void 0 : _oldRowState$cellStat[columnId]) !== 'undefined' ? _oldRowState.cellState[columnId] : initialCellStateAccessor((_rowsById$_rowId = rowsById[_rowId]) == null ? void 0 : (_rowsById$_rowId$cell = _rowsById$_rowId.cells) == null ? void 0 : _rowsById$_rowId$cell.find(function (cell) {\n return cell.column.id === columnId;\n }));\n return _extends({}, state, {\n rowState: _extends({}, state.rowState, (_extends4 = {}, _extends4[_rowId] = _extends({}, _oldRowState, {\n cellState: _extends({}, _oldRowState.cellState || {}, (_extends3 = {}, _extends3[columnId] = functionalUpdate(_value, oldCellState), _extends3))\n }), _extends4))\n });\n }\n }\n\n function useInstance$9(instance) {\n var _instance$autoResetRo = instance.autoResetRowState,\n autoResetRowState = _instance$autoResetRo === void 0 ? true : _instance$autoResetRo,\n data = instance.data,\n dispatch = instance.dispatch;\n var setRowState = React.useCallback(function (rowId, value) {\n return dispatch({\n type: actions.setRowState,\n rowId: rowId,\n value: value\n });\n }, [dispatch]);\n var setCellState = React.useCallback(function (rowId, columnId, value) {\n return dispatch({\n type: actions.setCellState,\n rowId: rowId,\n columnId: columnId,\n value: value\n });\n }, [dispatch]);\n var getAutoResetRowState = useGetLatest(autoResetRowState);\n useMountedLayoutEffect(function () {\n if (getAutoResetRowState()) {\n dispatch({\n type: actions.resetRowState\n });\n }\n }, [data]);\n Object.assign(instance, {\n setRowState: setRowState,\n setCellState: setCellState\n });\n }\n\n function prepareRow$4(row, _ref) {\n var instance = _ref.instance;\n var _instance$initialRowS2 = instance.initialRowStateAccessor,\n initialRowStateAccessor = _instance$initialRowS2 === void 0 ? defaultInitialRowStateAccessor : _instance$initialRowS2,\n _instance$initialCell2 = instance.initialCellStateAccessor,\n initialCellStateAccessor = _instance$initialCell2 === void 0 ? defaultInitialCellStateAccessor : _instance$initialCell2,\n rowState = instance.state.rowState;\n\n if (row) {\n row.state = typeof rowState[row.id] !== 'undefined' ? rowState[row.id] : initialRowStateAccessor(row);\n\n row.setState = function (updater) {\n return instance.setRowState(row.id, updater);\n };\n\n row.cells.forEach(function (cell) {\n if (!row.state.cellState) {\n row.state.cellState = {};\n }\n\n cell.state = typeof row.state.cellState[cell.column.id] !== 'undefined' ? row.state.cellState[cell.column.id] : initialCellStateAccessor(cell);\n\n cell.setState = function (updater) {\n return instance.setCellState(row.id, cell.column.id, updater);\n };\n });\n }\n }\n\n actions.resetColumnOrder = 'resetColumnOrder';\n actions.setColumnOrder = 'setColumnOrder';\n var useColumnOrder = function useColumnOrder(hooks) {\n hooks.stateReducers.push(reducer$a);\n hooks.visibleColumnsDeps.push(function (deps, _ref) {\n var instance = _ref.instance;\n return [].concat(deps, [instance.state.columnOrder]);\n });\n hooks.visibleColumns.push(visibleColumns$2);\n hooks.useInstance.push(useInstance$a);\n };\n useColumnOrder.pluginName = 'useColumnOrder';\n\n function reducer$a(state, action, previousState, instance) {\n if (action.type === actions.init) {\n return _extends({\n columnOrder: []\n }, state);\n }\n\n if (action.type === actions.resetColumnOrder) {\n return _extends({}, state, {\n columnOrder: instance.initialState.columnOrder || []\n });\n }\n\n if (action.type === actions.setColumnOrder) {\n return _extends({}, state, {\n columnOrder: functionalUpdate(action.columnOrder, state.columnOrder)\n });\n }\n }\n\n function visibleColumns$2(columns, _ref2) {\n var columnOrder = _ref2.instance.state.columnOrder;\n\n // If there is no order, return the normal columns\n if (!columnOrder || !columnOrder.length) {\n return columns;\n }\n\n var columnOrderCopy = [].concat(columnOrder); // If there is an order, make a copy of the columns\n\n var columnsCopy = [].concat(columns); // And make a new ordered array of the columns\n\n var columnsInOrder = []; // Loop over the columns and place them in order into the new array\n\n var _loop = function _loop() {\n var targetColumnId = columnOrderCopy.shift();\n var foundIndex = columnsCopy.findIndex(function (d) {\n return d.id === targetColumnId;\n });\n\n if (foundIndex > -1) {\n columnsInOrder.push(columnsCopy.splice(foundIndex, 1)[0]);\n }\n };\n\n while (columnsCopy.length && columnOrderCopy.length) {\n _loop();\n } // If there are any columns left, add them to the end\n\n\n return [].concat(columnsInOrder, columnsCopy);\n }\n\n function useInstance$a(instance) {\n var dispatch = instance.dispatch;\n instance.setColumnOrder = React.useCallback(function (columnOrder) {\n return dispatch({\n type: actions.setColumnOrder,\n columnOrder: columnOrder\n });\n }, [dispatch]);\n }\n\n defaultColumn.canResize = true; // Actions\n\n actions.columnStartResizing = 'columnStartResizing';\n actions.columnResizing = 'columnResizing';\n actions.columnDoneResizing = 'columnDoneResizing';\n actions.resetResize = 'resetResize';\n var useResizeColumns = function useResizeColumns(hooks) {\n hooks.getResizerProps = [defaultGetResizerProps];\n hooks.getHeaderProps.push({\n style: {\n position: 'relative'\n }\n });\n hooks.stateReducers.push(reducer$b);\n hooks.useInstance.push(useInstance$b);\n hooks.useInstanceBeforeDimensions.push(useInstanceBeforeDimensions$1);\n };\n\n var defaultGetResizerProps = function defaultGetResizerProps(props, _ref) {\n var instance = _ref.instance,\n header = _ref.header;\n var dispatch = instance.dispatch;\n\n var onResizeStart = function onResizeStart(e, header) {\n var isTouchEvent = false;\n\n if (e.type === 'touchstart') {\n // lets not respond to multiple touches (e.g. 2 or 3 fingers)\n if (e.touches && e.touches.length > 1) {\n return;\n }\n\n isTouchEvent = true;\n }\n\n var headersToResize = getLeafHeaders(header);\n var headerIdWidths = headersToResize.map(function (d) {\n return [d.id, d.totalWidth];\n });\n var clientX = isTouchEvent ? Math.round(e.touches[0].clientX) : e.clientX;\n\n var dispatchMove = function dispatchMove(clientXPos) {\n dispatch({\n type: actions.columnResizing,\n clientX: clientXPos\n });\n };\n\n var dispatchEnd = function dispatchEnd() {\n return dispatch({\n type: actions.columnDoneResizing\n });\n };\n\n var handlersAndEvents = {\n mouse: {\n moveEvent: 'mousemove',\n moveHandler: function moveHandler(e) {\n return dispatchMove(e.clientX);\n },\n upEvent: 'mouseup',\n upHandler: function upHandler(e) {\n document.removeEventListener('mousemove', handlersAndEvents.mouse.moveHandler);\n document.removeEventListener('mouseup', handlersAndEvents.mouse.upHandler);\n dispatchEnd();\n }\n },\n touch: {\n moveEvent: 'touchmove',\n moveHandler: function moveHandler(e) {\n if (e.cancelable) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n dispatchMove(e.touches[0].clientX);\n return false;\n },\n upEvent: 'touchend',\n upHandler: function upHandler(e) {\n document.removeEventListener(handlersAndEvents.touch.moveEvent, handlersAndEvents.touch.moveHandler);\n document.removeEventListener(handlersAndEvents.touch.upEvent, handlersAndEvents.touch.moveHandler);\n dispatchEnd();\n }\n }\n };\n var events = isTouchEvent ? handlersAndEvents.touch : handlersAndEvents.mouse;\n var passiveIfSupported = passiveEventSupported() ? {\n passive: false\n } : false;\n document.addEventListener(events.moveEvent, events.moveHandler, passiveIfSupported);\n document.addEventListener(events.upEvent, events.upHandler, passiveIfSupported);\n dispatch({\n type: actions.columnStartResizing,\n columnId: header.id,\n columnWidth: header.totalWidth,\n headerIdWidths: headerIdWidths,\n clientX: clientX\n });\n };\n\n return [props, {\n onMouseDown: function onMouseDown(e) {\n return e.persist() || onResizeStart(e, header);\n },\n onTouchStart: function onTouchStart(e) {\n return e.persist() || onResizeStart(e, header);\n },\n style: {\n cursor: 'col-resize'\n },\n draggable: false,\n role: 'separator'\n }];\n };\n\n useResizeColumns.pluginName = 'useResizeColumns';\n\n function reducer$b(state, action) {\n if (action.type === actions.init) {\n return _extends({\n columnResizing: {\n columnWidths: {}\n }\n }, state);\n }\n\n if (action.type === actions.resetResize) {\n return _extends({}, state, {\n columnResizing: {\n columnWidths: {}\n }\n });\n }\n\n if (action.type === actions.columnStartResizing) {\n var clientX = action.clientX,\n columnId = action.columnId,\n columnWidth = action.columnWidth,\n headerIdWidths = action.headerIdWidths;\n return _extends({}, state, {\n columnResizing: _extends({}, state.columnResizing, {\n startX: clientX,\n headerIdWidths: headerIdWidths,\n columnWidth: columnWidth,\n isResizingColumn: columnId\n })\n });\n }\n\n if (action.type === actions.columnResizing) {\n var _clientX = action.clientX;\n\n var _state$columnResizing = state.columnResizing,\n startX = _state$columnResizing.startX,\n _columnWidth = _state$columnResizing.columnWidth,\n _state$columnResizing2 = _state$columnResizing.headerIdWidths,\n _headerIdWidths = _state$columnResizing2 === void 0 ? [] : _state$columnResizing2;\n\n var deltaX = _clientX - startX;\n var percentageDeltaX = deltaX / _columnWidth;\n var newColumnWidths = {};\n\n _headerIdWidths.forEach(function (_ref2) {\n var headerId = _ref2[0],\n headerWidth = _ref2[1];\n newColumnWidths[headerId] = Math.max(headerWidth + headerWidth * percentageDeltaX, 0);\n });\n\n return _extends({}, state, {\n columnResizing: _extends({}, state.columnResizing, {\n columnWidths: _extends({}, state.columnResizing.columnWidths, {}, newColumnWidths)\n })\n });\n }\n\n if (action.type === actions.columnDoneResizing) {\n return _extends({}, state, {\n columnResizing: _extends({}, state.columnResizing, {\n startX: null,\n isResizingColumn: null\n })\n });\n }\n }\n\n var useInstanceBeforeDimensions$1 = function useInstanceBeforeDimensions(instance) {\n var flatHeaders = instance.flatHeaders,\n disableResizing = instance.disableResizing,\n getHooks = instance.getHooks,\n columnResizing = instance.state.columnResizing;\n var getInstance = useGetLatest(instance);\n flatHeaders.forEach(function (header) {\n var canResize = getFirstDefined(header.disableResizing === true ? false : undefined, disableResizing === true ? false : undefined, true);\n header.canResize = canResize;\n header.width = columnResizing.columnWidths[header.id] || header.originalWidth || header.width;\n header.isResizing = columnResizing.isResizingColumn === header.id;\n\n if (canResize) {\n header.getResizerProps = makePropGetter(getHooks().getResizerProps, {\n instance: getInstance(),\n header: header\n });\n }\n });\n };\n\n function useInstance$b(instance) {\n var plugins = instance.plugins,\n dispatch = instance.dispatch,\n _instance$autoResetRe = instance.autoResetResize,\n autoResetResize = _instance$autoResetRe === void 0 ? true : _instance$autoResetRe,\n columns = instance.columns;\n ensurePluginOrder(plugins, ['useAbsoluteLayout'], 'useResizeColumns');\n var getAutoResetResize = useGetLatest(autoResetResize);\n useMountedLayoutEffect(function () {\n if (getAutoResetResize()) {\n dispatch({\n type: actions.resetResize\n });\n }\n }, [columns]);\n var resetResizing = React.useCallback(function () {\n return dispatch({\n type: actions.resetResize\n });\n }, [dispatch]);\n Object.assign(instance, {\n resetResizing: resetResizing\n });\n }\n\n function getLeafHeaders(header) {\n var leafHeaders = [];\n\n var recurseHeader = function recurseHeader(header) {\n if (header.columns && header.columns.length) {\n header.columns.map(recurseHeader);\n }\n\n leafHeaders.push(header);\n };\n\n recurseHeader(header);\n return leafHeaders;\n }\n\n var cellStyles = {\n position: 'absolute',\n top: 0\n };\n var useAbsoluteLayout = function useAbsoluteLayout(hooks) {\n hooks.getTableBodyProps.push(getRowStyles);\n hooks.getRowProps.push(getRowStyles);\n hooks.getHeaderGroupProps.push(getRowStyles);\n hooks.getFooterGroupProps.push(getRowStyles);\n hooks.getHeaderProps.push(function (props, _ref) {\n var column = _ref.column;\n return [props, {\n style: _extends({}, cellStyles, {\n left: column.totalLeft + \"px\",\n width: column.totalWidth + \"px\"\n })\n }];\n });\n hooks.getCellProps.push(function (props, _ref2) {\n var cell = _ref2.cell;\n return [props, {\n style: _extends({}, cellStyles, {\n left: cell.column.totalLeft + \"px\",\n width: cell.column.totalWidth + \"px\"\n })\n }];\n });\n hooks.getFooterProps.push(function (props, _ref3) {\n var column = _ref3.column;\n return [props, {\n style: _extends({}, cellStyles, {\n left: column.totalLeft + \"px\",\n width: column.totalWidth + \"px\"\n })\n }];\n });\n };\n useAbsoluteLayout.pluginName = 'useAbsoluteLayout';\n\n var getRowStyles = function getRowStyles(props, _ref4) {\n var instance = _ref4.instance;\n return [props, {\n style: {\n position: 'relative',\n width: instance.totalColumnsWidth + \"px\"\n }\n }];\n };\n\n var cellStyles$1 = {\n display: 'inline-block',\n boxSizing: 'border-box'\n };\n\n var getRowStyles$1 = function getRowStyles(props, _ref) {\n var instance = _ref.instance;\n return [props, {\n style: {\n display: 'flex',\n width: instance.totalColumnsWidth + \"px\"\n }\n }];\n };\n\n var useBlockLayout = function useBlockLayout(hooks) {\n hooks.getRowProps.push(getRowStyles$1);\n hooks.getHeaderGroupProps.push(getRowStyles$1);\n hooks.getFooterGroupProps.push(getRowStyles$1);\n hooks.getHeaderProps.push(function (props, _ref2) {\n var column = _ref2.column;\n return [props, {\n style: _extends({}, cellStyles$1, {\n width: column.totalWidth + \"px\"\n })\n }];\n });\n hooks.getCellProps.push(function (props, _ref3) {\n var cell = _ref3.cell;\n return [props, {\n style: _extends({}, cellStyles$1, {\n width: cell.column.totalWidth + \"px\"\n })\n }];\n });\n hooks.getFooterProps.push(function (props, _ref4) {\n var column = _ref4.column;\n return [props, {\n style: _extends({}, cellStyles$1, {\n width: column.totalWidth + \"px\"\n })\n }];\n });\n };\n useBlockLayout.pluginName = 'useBlockLayout';\n\n function useFlexLayout(hooks) {\n hooks.getTableProps.push(getTableProps);\n hooks.getRowProps.push(getRowStyles$2);\n hooks.getHeaderGroupProps.push(getRowStyles$2);\n hooks.getFooterGroupProps.push(getRowStyles$2);\n hooks.getHeaderProps.push(getHeaderProps);\n hooks.getCellProps.push(getCellProps);\n hooks.getFooterProps.push(getFooterProps);\n }\n useFlexLayout.pluginName = 'useFlexLayout';\n\n var getTableProps = function getTableProps(props, _ref) {\n var instance = _ref.instance;\n return [props, {\n style: {\n minWidth: instance.totalColumnsMinWidth + \"px\"\n }\n }];\n };\n\n var getRowStyles$2 = function getRowStyles(props, _ref2) {\n var instance = _ref2.instance;\n return [props, {\n style: {\n display: 'flex',\n flex: '1 0 auto',\n minWidth: instance.totalColumnsMinWidth + \"px\"\n }\n }];\n };\n\n var getHeaderProps = function getHeaderProps(props, _ref3) {\n var column = _ref3.column;\n return [props, {\n style: {\n boxSizing: 'border-box',\n flex: column.totalFlexWidth ? column.totalFlexWidth + \" 0 auto\" : undefined,\n minWidth: column.totalMinWidth + \"px\",\n width: column.totalWidth + \"px\"\n }\n }];\n };\n\n var getCellProps = function getCellProps(props, _ref4) {\n var cell = _ref4.cell;\n return [props, {\n style: {\n boxSizing: 'border-box',\n flex: cell.column.totalFlexWidth + \" 0 auto\",\n minWidth: cell.column.totalMinWidth + \"px\",\n width: cell.column.totalWidth + \"px\"\n }\n }];\n };\n\n var getFooterProps = function getFooterProps(props, _ref5) {\n var column = _ref5.column;\n return [props, {\n style: {\n boxSizing: 'border-box',\n flex: column.totalFlexWidth ? column.totalFlexWidth + \" 0 auto\" : undefined,\n minWidth: column.totalMinWidth + \"px\",\n width: column.totalWidth + \"px\"\n }\n }];\n };\n\n function useGridLayout(hooks) {\n hooks.stateReducers.push(reducer$c);\n hooks.getTableProps.push(getTableProps$1);\n hooks.getHeaderProps.push(getHeaderProps$1);\n }\n useGridLayout.pluginName = 'useGridLayout';\n\n var getTableProps$1 = function getTableProps(props, _ref) {\n var instance = _ref.instance;\n return [props, {\n style: {\n display: \"grid\",\n gridTemplateColumns: instance.state.gridLayout.columnWidths.map(function (w) {\n return w;\n }).join(\" \")\n }\n }];\n };\n\n var getHeaderProps$1 = function getHeaderProps(props, _ref2) {\n var column = _ref2.column;\n return [props, {\n id: \"header-cell-\" + column.id,\n style: {\n position: \"sticky\" //enables a scroll wrapper to be placed around the table and have sticky headers\n\n }\n }];\n };\n\n function reducer$c(state, action, previousState, instance) {\n if (action.type === \"init\") {\n return _extends({\n gridLayout: {\n columnWidths: instance.columns.map(function () {\n return \"auto\";\n })\n }\n }, state);\n }\n\n if (action.type === \"columnStartResizing\") {\n var columnId = action.columnId;\n var columnIndex = instance.visibleColumns.findIndex(function (col) {\n return col.id === columnId;\n });\n var elWidth = getElementWidth(columnId);\n\n if (elWidth !== undefined) {\n return _extends({}, state, {\n gridLayout: _extends({}, state.gridLayout, {\n columnId: columnId,\n columnIndex: columnIndex,\n startingWidth: elWidth\n })\n });\n } else {\n return state;\n }\n }\n\n if (action.type === \"columnResizing\") {\n var _state$gridLayout = state.gridLayout,\n _columnIndex = _state$gridLayout.columnIndex,\n startingWidth = _state$gridLayout.startingWidth,\n columnWidths = _state$gridLayout.columnWidths;\n var change = state.columnResizing.startX - action.clientX;\n var newWidth = startingWidth - change;\n var columnWidthsCopy = [].concat(columnWidths);\n columnWidthsCopy[_columnIndex] = newWidth + \"px\";\n return _extends({}, state, {\n gridLayout: _extends({}, state.gridLayout, {\n columnWidths: columnWidthsCopy\n })\n });\n }\n }\n\n function getElementWidth(columnId) {\n var _document$getElementB;\n\n var width = (_document$getElementB = document.getElementById(\"header-cell-\" + columnId)) == null ? void 0 : _document$getElementB.offsetWidth;\n\n if (width !== undefined) {\n return width;\n }\n }\n\n exports._UNSTABLE_usePivotColumns = _UNSTABLE_usePivotColumns;\n exports.actions = actions;\n exports.defaultColumn = defaultColumn;\n exports.defaultGroupByFn = defaultGroupByFn;\n exports.defaultOrderByFn = defaultOrderByFn;\n exports.defaultRenderer = defaultRenderer;\n exports.emptyRenderer = emptyRenderer;\n exports.ensurePluginOrder = ensurePluginOrder;\n exports.flexRender = flexRender;\n exports.functionalUpdate = functionalUpdate;\n exports.loopHooks = loopHooks;\n exports.makePropGetter = makePropGetter;\n exports.makeRenderer = makeRenderer;\n exports.reduceHooks = reduceHooks;\n exports.safeUseLayoutEffect = safeUseLayoutEffect;\n exports.useAbsoluteLayout = useAbsoluteLayout;\n exports.useAsyncDebounce = useAsyncDebounce;\n exports.useBlockLayout = useBlockLayout;\n exports.useColumnOrder = useColumnOrder;\n exports.useExpanded = useExpanded;\n exports.useFilters = useFilters;\n exports.useFlexLayout = useFlexLayout;\n exports.useGetLatest = useGetLatest;\n exports.useGlobalFilter = useGlobalFilter;\n exports.useGridLayout = useGridLayout;\n exports.useGroupBy = useGroupBy;\n exports.useMountedLayoutEffect = useMountedLayoutEffect;\n exports.usePagination = usePagination;\n exports.useResizeColumns = useResizeColumns;\n exports.useRowSelect = useRowSelect;\n exports.useRowState = useRowState;\n exports.useSortBy = useSortBy;\n exports.useTable = useTable;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n//# sourceMappingURL=react-table.development.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LXRhYmxlL2Rpc3QvcmVhY3QtdGFibGUuZGV2ZWxvcG1lbnQuanMuanMiLCJzb3VyY2VzIjpbImZpbGU6Ly9DOi9DbGlja1ZpZXcgUHJvamVjdHMvY2xpY2t2aWV3L25vZGVfbW9kdWxlcy9yZWFjdC10YWJsZS9kaXN0L3JlYWN0LXRhYmxlLmRldmVsb3BtZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cywgcmVxdWlyZSgncmVhY3QnKSkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJywgJ3JlYWN0J10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IGdsb2JhbCB8fCBzZWxmLCBmYWN0b3J5KGdsb2JhbC5SZWFjdFRhYmxlID0ge30sIGdsb2JhbC5SZWFjdCkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMsIFJlYWN0KSB7ICd1c2Ugc3RyaWN0JztcblxuICBSZWFjdCA9IFJlYWN0ICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChSZWFjdCwgJ2RlZmF1bHQnKSA/IFJlYWN0WydkZWZhdWx0J10gOiBSZWFjdDtcblxuICBmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblxuICAgICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gICAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH07XG5cbiAgICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgICB2YXIgdGFyZ2V0ID0ge307XG4gICAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgIHZhciBrZXksIGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICBmdW5jdGlvbiBfdG9QcmltaXRpdmUoaW5wdXQsIGhpbnQpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ICE9PSBcIm9iamVjdFwiIHx8IGlucHV0ID09PSBudWxsKSByZXR1cm4gaW5wdXQ7XG4gICAgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdO1xuXG4gICAgaWYgKHByaW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7XG4gICAgICBpZiAodHlwZW9mIHJlcyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlcztcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGhpbnQgPT09IFwic3RyaW5nXCIgPyBTdHJpbmcgOiBOdW1iZXIpKGlucHV0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGFyZykge1xuICAgIHZhciBrZXkgPSBfdG9QcmltaXRpdmUoYXJnLCBcInN0cmluZ1wiKTtcblxuICAgIHJldHVybiB0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiID8ga2V5IDogU3RyaW5nKGtleSk7XG4gIH1cblxuICB2YXIgcmVuZGVyRXJyID0gJ1JlbmRlcmVyIEVycm9yIOKYne+4jyc7XG4gIHZhciBhY3Rpb25zID0ge1xuICAgIGluaXQ6ICdpbml0J1xuICB9O1xuICB2YXIgZGVmYXVsdFJlbmRlcmVyID0gZnVuY3Rpb24gZGVmYXVsdFJlbmRlcmVyKF9yZWYpIHtcbiAgICB2YXIgX3JlZiR2YWx1ZSA9IF9yZWYudmFsdWUsXG4gICAgICAgIHZhbHVlID0gX3JlZiR2YWx1ZSA9PT0gdm9pZCAwID8gJycgOiBfcmVmJHZhbHVlO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcbiAgdmFyIGVtcHR5UmVuZGVyZXIgPSBmdW5jdGlvbiBlbXB0eVJlbmRlcmVyKCkge1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBcIlxceEEwXCIpO1xuICB9O1xuICB2YXIgZGVmYXVsdENvbHVtbiA9IHtcbiAgICBDZWxsOiBkZWZhdWx0UmVuZGVyZXIsXG4gICAgd2lkdGg6IDE1MCxcbiAgICBtaW5XaWR0aDogMCxcbiAgICBtYXhXaWR0aDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcbiAgfTtcblxuICBmdW5jdGlvbiBtZXJnZVByb3BzKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBwcm9wTGlzdCA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIHByb3BMaXN0W19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9wTGlzdC5yZWR1Y2UoZnVuY3Rpb24gKHByb3BzLCBuZXh0KSB7XG4gICAgICB2YXIgc3R5bGUgPSBuZXh0LnN0eWxlLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IG5leHQuY2xhc3NOYW1lLFxuICAgICAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShuZXh0LCBbXCJzdHlsZVwiLCBcImNsYXNzTmFtZVwiXSk7XG5cbiAgICAgIHByb3BzID0gX2V4dGVuZHMoe30sIHByb3BzLCB7fSwgcmVzdCk7XG5cbiAgICAgIGlmIChzdHlsZSkge1xuICAgICAgICBwcm9wcy5zdHlsZSA9IHByb3BzLnN0eWxlID8gX2V4dGVuZHMoe30sIHByb3BzLnN0eWxlIHx8IHt9LCB7fSwgc3R5bGUgfHwge30pIDogc3R5bGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgICAgcHJvcHMuY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lID8gcHJvcHMuY2xhc3NOYW1lICsgJyAnICsgY2xhc3NOYW1lIDogY2xhc3NOYW1lO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcHMuY2xhc3NOYW1lID09PSAnJykge1xuICAgICAgICBkZWxldGUgcHJvcHMuY2xhc3NOYW1lO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJvcHM7XG4gICAgfSwge30pO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlUHJvcEdldHRlcihwcmV2UHJvcHMsIHVzZXJQcm9wcywgbWV0YSkge1xuICAgIC8vIEhhbmRsZSBhIGxhbWJkYSwgcGFzcyBpdCB0aGUgcHJldmlvdXMgcHJvcHNcbiAgICBpZiAodHlwZW9mIHVzZXJQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGhhbmRsZVByb3BHZXR0ZXIoe30sIHVzZXJQcm9wcyhwcmV2UHJvcHMsIG1ldGEpKTtcbiAgICB9IC8vIEhhbmRsZSBhbiBhcnJheSwgbWVyZ2UgZWFjaCBpdGVtIGFzIHNlcGFyYXRlIHByb3BzXG5cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHVzZXJQcm9wcykpIHtcbiAgICAgIHJldHVybiBtZXJnZVByb3BzLmFwcGx5KHZvaWQgMCwgW3ByZXZQcm9wc10uY29uY2F0KHVzZXJQcm9wcykpO1xuICAgIH0gLy8gSGFuZGxlIGFuIG9iamVjdCBieSBkZWZhdWx0LCBtZXJnZSB0aGUgdHdvIG9iamVjdHNcblxuXG4gICAgcmV0dXJuIG1lcmdlUHJvcHMocHJldlByb3BzLCB1c2VyUHJvcHMpO1xuICB9XG5cbiAgdmFyIG1ha2VQcm9wR2V0dGVyID0gZnVuY3Rpb24gbWFrZVByb3BHZXR0ZXIoaG9va3MsIG1ldGEpIHtcbiAgICBpZiAobWV0YSA9PT0gdm9pZCAwKSB7XG4gICAgICBtZXRhID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh1c2VyUHJvcHMpIHtcbiAgICAgIGlmICh1c2VyUHJvcHMgPT09IHZvaWQgMCkge1xuICAgICAgICB1c2VyUHJvcHMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtdLmNvbmNhdChob29rcywgW3VzZXJQcm9wc10pLnJlZHVjZShmdW5jdGlvbiAocHJldiwgbmV4dCkge1xuICAgICAgICByZXR1cm4gaGFuZGxlUHJvcEdldHRlcihwcmV2LCBuZXh0LCBfZXh0ZW5kcyh7fSwgbWV0YSwge1xuICAgICAgICAgIHVzZXJQcm9wczogdXNlclByb3BzXG4gICAgICAgIH0pKTtcbiAgICAgIH0sIHt9KTtcbiAgICB9O1xuICB9O1xuICB2YXIgcmVkdWNlSG9va3MgPSBmdW5jdGlvbiByZWR1Y2VIb29rcyhob29rcywgaW5pdGlhbCwgbWV0YSwgYWxsb3dVbmRlZmluZWQpIHtcbiAgICBpZiAobWV0YSA9PT0gdm9pZCAwKSB7XG4gICAgICBtZXRhID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGhvb2tzLnJlZHVjZShmdW5jdGlvbiAocHJldiwgbmV4dCkge1xuICAgICAgdmFyIG5leHRWYWx1ZSA9IG5leHQocHJldiwgbWV0YSk7XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKCFhbGxvd1VuZGVmaW5lZCAmJiB0eXBlb2YgbmV4dFZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhuZXh0KTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0IFRhYmxlOiBBIHJlZHVjZXIgaG9vayDimJ3vuI8ganVzdCByZXR1cm5lZCB1bmRlZmluZWQhIFRoaXMgaXMgbm90IGFsbG93ZWQuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHRWYWx1ZTtcbiAgICB9LCBpbml0aWFsKTtcbiAgfTtcbiAgdmFyIGxvb3BIb29rcyA9IGZ1bmN0aW9uIGxvb3BIb29rcyhob29rcywgY29udGV4dCwgbWV0YSkge1xuICAgIGlmIChtZXRhID09PSB2b2lkIDApIHtcbiAgICAgIG1ldGEgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gaG9va3MuZm9yRWFjaChmdW5jdGlvbiAoaG9vaykge1xuICAgICAgdmFyIG5leHRWYWx1ZSA9IGhvb2soY29udGV4dCwgbWV0YSk7XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuZXh0VmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGhvb2ssIG5leHRWYWx1ZSk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWFjdCBUYWJsZTogQSBsb29wLXR5cGUgaG9vayDimJ3vuI8ganVzdCByZXR1cm5lZCBhIHZhbHVlISBUaGlzIGlzIG5vdCBhbGxvd2VkLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGZ1bmN0aW9uIGVuc3VyZVBsdWdpbk9yZGVyKHBsdWdpbnMsIGJlZm9yZXMsIHBsdWdpbk5hbWUsIGFmdGVycykge1xuICAgIGlmICggYWZ0ZXJzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWZpbmluZyBwbHVnaW5zIGluIHRoZSBcXFwiYWZ0ZXJcXFwiIHNlY3Rpb24gb2YgZW5zdXJlUGx1Z2luT3JkZXIgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCAoc2VlIHBsdWdpbiBcIiArIHBsdWdpbk5hbWUgKyBcIilcIik7XG4gICAgfVxuXG4gICAgdmFyIHBsdWdpbkluZGV4ID0gcGx1Z2lucy5maW5kSW5kZXgoZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgcmV0dXJuIHBsdWdpbi5wbHVnaW5OYW1lID09PSBwbHVnaW5OYW1lO1xuICAgIH0pO1xuXG4gICAgaWYgKHBsdWdpbkluZGV4ID09PSAtMSkge1xuICAgICAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGx1Z2luIFxcXCJcIiArIHBsdWdpbk5hbWUgKyBcIlxcXCIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgcGx1Z2luIGxpc3QhXFxuVGhpcyB1c3VhbGx5IG1lYW5zIHlvdSBuZWVkIHRvIG5lZWQgdG8gbmFtZSB5b3VyIHBsdWdpbiBob29rIGJ5IHNldHRpbmcgdGhlICdwbHVnaW5OYW1lJyBwcm9wZXJ0eSBvZiB0aGUgaG9vayBmdW5jdGlvbiwgZWc6XFxuXFxuICBcIiArIHBsdWdpbk5hbWUgKyBcIi5wbHVnaW5OYW1lID0gJ1wiICsgcGx1Z2luTmFtZSArIFwiJ1xcblwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBiZWZvcmVzLmZvckVhY2goZnVuY3Rpb24gKGJlZm9yZSkge1xuICAgICAgdmFyIGJlZm9yZUluZGV4ID0gcGx1Z2lucy5maW5kSW5kZXgoZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gcGx1Z2luLnBsdWdpbk5hbWUgPT09IGJlZm9yZTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoYmVmb3JlSW5kZXggPiAtMSAmJiBiZWZvcmVJbmRleCA+IHBsdWdpbkluZGV4KSB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFjdCBUYWJsZTogVGhlIFwiICsgcGx1Z2luTmFtZSArIFwiIHBsdWdpbiBob29rIG11c3QgYmUgcGxhY2VkIGFmdGVyIHRoZSBcIiArIGJlZm9yZSArIFwiIHBsdWdpbiBob29rIVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGZ1bmN0aW9uYWxVcGRhdGUodXBkYXRlciwgb2xkKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB1cGRhdGVyID09PSAnZnVuY3Rpb24nID8gdXBkYXRlcihvbGQpIDogdXBkYXRlcjtcbiAgfVxuICBmdW5jdGlvbiB1c2VHZXRMYXRlc3Qob2JqKSB7XG4gICAgdmFyIHJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICAgIHJlZi5jdXJyZW50ID0gb2JqO1xuICAgIHJldHVybiBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVmLmN1cnJlbnQ7XG4gICAgfSwgW10pO1xuICB9IC8vIFNTUiBoYXMgaXNzdWVzIHdpdGggdXNlTGF5b3V0RWZmZWN0IHN0aWxsLCBzbyB1c2UgdXNlRWZmZWN0IGR1cmluZyBTU1JcblxuICB2YXIgc2FmZVVzZUxheW91dEVmZmVjdCA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBSZWFjdC51c2VMYXlvdXRFZmZlY3QgOiBSZWFjdC51c2VFZmZlY3Q7XG4gIGZ1bmN0aW9uIHVzZU1vdW50ZWRMYXlvdXRFZmZlY3QoZm4sIGRlcHMpIHtcbiAgICB2YXIgbW91bnRlZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gICAgc2FmZVVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobW91bnRlZFJlZi5jdXJyZW50KSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9XG5cbiAgICAgIG1vdW50ZWRSZWYuY3VycmVudCA9IHRydWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgIH0sIGRlcHMpO1xuICB9XG4gIGZ1bmN0aW9uIHVzZUFzeW5jRGVib3VuY2UoZGVmYXVsdEZuLCBkZWZhdWx0V2FpdCkge1xuICAgIGlmIChkZWZhdWx0V2FpdCA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWZhdWx0V2FpdCA9IDA7XG4gICAgfVxuXG4gICAgdmFyIGRlYm91bmNlUmVmID0gUmVhY3QudXNlUmVmKHt9KTtcbiAgICB2YXIgZ2V0RGVmYXVsdEZuID0gdXNlR2V0TGF0ZXN0KGRlZmF1bHRGbik7XG4gICAgdmFyIGdldERlZmF1bHRXYWl0ID0gdXNlR2V0TGF0ZXN0KGRlZmF1bHRXYWl0KTtcbiAgICByZXR1cm4gUmVhY3QudXNlQ2FsbGJhY2soXG4gICAgLyojX19QVVJFX18qL1xuICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfcmVmMiA9IF9hc3luY1RvR2VuZXJhdG9yKFxuICAgICAgLyojX19QVVJFX18qL1xuICAgICAgcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoKSB7XG4gICAgICAgIHZhciBfbGVuMixcbiAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICBfa2V5MixcbiAgICAgICAgICAgIF9hcmdzMiA9IGFyZ3VtZW50cztcblxuICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGZvciAoX2xlbjIgPSBfYXJnczIubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgICAgICAgICAgICBhcmdzW19rZXkyXSA9IF9hcmdzMltfa2V5Ml07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFkZWJvdW5jZVJlZi5jdXJyZW50LnByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgIGRlYm91bmNlUmVmLmN1cnJlbnQucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVib3VuY2VSZWYuY3VycmVudC5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgICAgICAgICAgZGVib3VuY2VSZWYuY3VycmVudC5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVib3VuY2VSZWYuY3VycmVudC50aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVib3VuY2VSZWYuY3VycmVudC50aW1lb3V0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkZWJvdW5jZVJlZi5jdXJyZW50LnRpbWVvdXQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgICAgICAgICAgICBfYXN5bmNUb0dlbmVyYXRvcihcbiAgICAgICAgICAgICAgICAvKiNfX1BVUkVfXyovXG4gICAgICAgICAgICAgICAgcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGRlYm91bmNlUmVmLmN1cnJlbnQudGltZW91dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnQwID0gZGVib3VuY2VSZWYuY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0Rm4oKS5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnQxID0gX2NvbnRleHQuc2VudDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC50MC5yZXNvbHZlLmNhbGwoX2NvbnRleHQudDAsIF9jb250ZXh0LnQxKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSA5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC50MiA9IF9jb250ZXh0W1wiY2F0Y2hcIl0oMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlYm91bmNlUmVmLmN1cnJlbnQucmVqZWN0KF9jb250ZXh0LnQyKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDEyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGVib3VuY2VSZWYuY3VycmVudC5wcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuZmluaXNoKDEyKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0sIF9jYWxsZWUsIG51bGwsIFtbMSwgOSwgMTIsIDE1XV0pO1xuICAgICAgICAgICAgICAgIH0pKSwgZ2V0RGVmYXVsdFdhaXQoKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoXCJyZXR1cm5cIiwgZGVib3VuY2VSZWYuY3VycmVudC5wcm9taXNlKTtcblxuICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUyKTtcbiAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9yZWYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH0oKSwgW2dldERlZmF1bHRGbiwgZ2V0RGVmYXVsdFdhaXRdKTtcbiAgfVxuICBmdW5jdGlvbiBtYWtlUmVuZGVyZXIoaW5zdGFuY2UsIGNvbHVtbiwgbWV0YSkge1xuICAgIGlmIChtZXRhID09PSB2b2lkIDApIHtcbiAgICAgIG1ldGEgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHR5cGUsIHVzZXJQcm9wcykge1xuICAgICAgaWYgKHVzZXJQcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHVzZXJQcm9wcyA9IHt9O1xuICAgICAgfVxuXG4gICAgICB2YXIgQ29tcCA9IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyA/IGNvbHVtblt0eXBlXSA6IHR5cGU7XG5cbiAgICAgIGlmICh0eXBlb2YgQ29tcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGNvbHVtbik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZW5kZXJFcnIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmxleFJlbmRlcihDb21wLCBfZXh0ZW5kcyh7fSwgaW5zdGFuY2UsIHtcbiAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgIH0sIG1ldGEsIHt9LCB1c2VyUHJvcHMpKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGZsZXhSZW5kZXIoQ29tcCwgcHJvcHMpIHtcbiAgICByZXR1cm4gaXNSZWFjdENvbXBvbmVudChDb21wKSA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcCwgcHJvcHMpIDogQ29tcDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUmVhY3RDb21wb25lbnQoY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGlzQ2xhc3NDb21wb25lbnQoY29tcG9uZW50KSB8fCB0eXBlb2YgY29tcG9uZW50ID09PSAnZnVuY3Rpb24nIHx8IGlzRXhvdGljQ29tcG9uZW50KGNvbXBvbmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0NsYXNzQ29tcG9uZW50KGNvbXBvbmVudCkge1xuICAgIHJldHVybiB0eXBlb2YgY29tcG9uZW50ID09PSAnZnVuY3Rpb24nICYmIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb21wb25lbnQpO1xuICAgICAgcmV0dXJuIHByb3RvLnByb3RvdHlwZSAmJiBwcm90by5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudDtcbiAgICB9KCk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0V4b3RpY0NvbXBvbmVudChjb21wb25lbnQpIHtcbiAgICByZXR1cm4gdHlwZW9mIGNvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGNvbXBvbmVudC4kJHR5cGVvZiA9PT0gJ3N5bWJvbCcgJiYgWydyZWFjdC5tZW1vJywgJ3JlYWN0LmZvcndhcmRfcmVmJ10uaW5jbHVkZXMoY29tcG9uZW50LiQkdHlwZW9mLmRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpbmtDb2x1bW5TdHJ1Y3R1cmUoY29sdW1ucywgcGFyZW50LCBkZXB0aCkge1xuICAgIGlmIChkZXB0aCA9PT0gdm9pZCAwKSB7XG4gICAgICBkZXB0aCA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbnMubWFwKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIGNvbHVtbiA9IF9leHRlbmRzKHt9LCBjb2x1bW4sIHtcbiAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgIGRlcHRoOiBkZXB0aFxuICAgICAgfSk7XG4gICAgICBhc3NpZ25Db2x1bW5BY2Nlc3Nvcihjb2x1bW4pO1xuXG4gICAgICBpZiAoY29sdW1uLmNvbHVtbnMpIHtcbiAgICAgICAgY29sdW1uLmNvbHVtbnMgPSBsaW5rQ29sdW1uU3RydWN0dXJlKGNvbHVtbi5jb2x1bW5zLCBjb2x1bW4sIGRlcHRoICsgMSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb2x1bW47XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gZmxhdHRlbkNvbHVtbnMoY29sdW1ucykge1xuICAgIHJldHVybiBmbGF0dGVuQnkoY29sdW1ucywgJ2NvbHVtbnMnKTtcbiAgfVxuICBmdW5jdGlvbiBhc3NpZ25Db2x1bW5BY2Nlc3Nvcihjb2x1bW4pIHtcbiAgICAvLyBGaXJzdCBjaGVjayBmb3Igc3RyaW5nIGFjY2Vzc29yXG4gICAgdmFyIGlkID0gY29sdW1uLmlkLFxuICAgICAgICBhY2Nlc3NvciA9IGNvbHVtbi5hY2Nlc3NvcixcbiAgICAgICAgSGVhZGVyID0gY29sdW1uLkhlYWRlcjtcblxuICAgIGlmICh0eXBlb2YgYWNjZXNzb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZCA9IGlkIHx8IGFjY2Vzc29yO1xuICAgICAgdmFyIGFjY2Vzc29yUGF0aCA9IGFjY2Vzc29yLnNwbGl0KCcuJyk7XG5cbiAgICAgIGFjY2Vzc29yID0gZnVuY3Rpb24gYWNjZXNzb3Iocm93KSB7XG4gICAgICAgIHJldHVybiBnZXRCeShyb3csIGFjY2Vzc29yUGF0aCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghaWQgJiYgdHlwZW9mIEhlYWRlciA9PT0gJ3N0cmluZycgJiYgSGVhZGVyKSB7XG4gICAgICBpZCA9IEhlYWRlcjtcbiAgICB9XG5cbiAgICBpZiAoIWlkICYmIGNvbHVtbi5jb2x1bW5zKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNvbHVtbik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgY29sdW1uIElEIChvciB1bmlxdWUgXCJIZWFkZXJcIiB2YWx1ZSkgaXMgcmVxdWlyZWQhJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpZCkge1xuICAgICAgY29uc29sZS5lcnJvcihjb2x1bW4pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIGNvbHVtbiBJRCAob3Igc3RyaW5nIGFjY2Vzc29yKSBpcyByZXF1aXJlZCEnKTtcbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKGNvbHVtbiwge1xuICAgICAgaWQ6IGlkLFxuICAgICAgYWNjZXNzb3I6IGFjY2Vzc29yXG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbHVtbjtcbiAgfVxuICBmdW5jdGlvbiBkZWNvcmF0ZUNvbHVtbihjb2x1bW4sIHVzZXJEZWZhdWx0Q29sdW1uKSB7XG4gICAgaWYgKCF1c2VyRGVmYXVsdENvbHVtbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihjb2x1bW4sIF9leHRlbmRzKHtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIGZhbGxiYWNrIGhlYWRlciwganVzdCBpbiBjYXNlXG4gICAgICBIZWFkZXI6IGVtcHR5UmVuZGVyZXIsXG4gICAgICBGb290ZXI6IGVtcHR5UmVuZGVyZXJcbiAgICB9LCBkZWZhdWx0Q29sdW1uLCB7fSwgdXNlckRlZmF1bHRDb2x1bW4sIHt9LCBjb2x1bW4pKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbHVtbiwge1xuICAgICAgb3JpZ2luYWxXaWR0aDogY29sdW1uLndpZHRoXG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbHVtbjtcbiAgfSAvLyBCdWlsZCB0aGUgaGVhZGVyIGdyb3VwcyBmcm9tIHRoZSBib3R0b20gdXBcblxuICBmdW5jdGlvbiBtYWtlSGVhZGVyR3JvdXBzKGFsbENvbHVtbnMsIGRlZmF1bHRDb2x1bW4sIGFkZGl0aW9uYWxIZWFkZXJQcm9wZXJ0aWVzKSB7XG4gICAgaWYgKGFkZGl0aW9uYWxIZWFkZXJQcm9wZXJ0aWVzID09PSB2b2lkIDApIHtcbiAgICAgIGFkZGl0aW9uYWxIZWFkZXJQcm9wZXJ0aWVzID0gZnVuY3Rpb24gYWRkaXRpb25hbEhlYWRlclByb3BlcnRpZXMoKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGhlYWRlckdyb3VwcyA9IFtdO1xuICAgIHZhciBzY2FuQ29sdW1ucyA9IGFsbENvbHVtbnM7XG4gICAgdmFyIHVpZCA9IDA7XG5cbiAgICB2YXIgZ2V0VUlEID0gZnVuY3Rpb24gZ2V0VUlEKCkge1xuICAgICAgcmV0dXJuIHVpZCsrO1xuICAgIH07XG5cbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcCgpIHtcbiAgICAgIC8vIFRoZSBoZWFkZXIgZ3JvdXAgd2UgYXJlIGNyZWF0aW5nXG4gICAgICB2YXIgaGVhZGVyR3JvdXAgPSB7XG4gICAgICAgIGhlYWRlcnM6IFtdXG4gICAgICB9OyAvLyBUaGUgcGFyZW50IGNvbHVtbnMgd2UncmUgZ29pbmcgdG8gc2NhbiBuZXh0XG5cbiAgICAgIHZhciBwYXJlbnRDb2x1bW5zID0gW107XG4gICAgICB2YXIgaGFzUGFyZW50cyA9IHNjYW5Db2x1bW5zLnNvbWUoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQucGFyZW50O1xuICAgICAgfSk7IC8vIFNjYW4gZWFjaCBjb2x1bW4gZm9yIHBhcmVudHNcblxuICAgICAgc2NhbkNvbHVtbnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgIC8vIFdoYXQgaXMgdGhlIGxhdGVzdCAobGFzdCkgcGFyZW50IGNvbHVtbj9cbiAgICAgICAgdmFyIGxhdGVzdFBhcmVudENvbHVtbiA9IFtdLmNvbmNhdChwYXJlbnRDb2x1bW5zKS5yZXZlcnNlKClbMF07XG4gICAgICAgIHZhciBuZXdQYXJlbnQ7XG5cbiAgICAgICAgaWYgKGhhc1BhcmVudHMpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgY29sdW1uIGhhcyBhIHBhcmVudCwgYWRkIGl0IGlmIG5lY2Vzc2FyeVxuICAgICAgICAgIGlmIChjb2x1bW4ucGFyZW50KSB7XG4gICAgICAgICAgICBuZXdQYXJlbnQgPSBfZXh0ZW5kcyh7fSwgY29sdW1uLnBhcmVudCwge1xuICAgICAgICAgICAgICBvcmlnaW5hbElkOiBjb2x1bW4ucGFyZW50LmlkLFxuICAgICAgICAgICAgICBpZDogY29sdW1uLnBhcmVudC5pZCArIFwiX1wiICsgZ2V0VUlEKCksXG4gICAgICAgICAgICAgIGhlYWRlcnM6IFtjb2x1bW5dXG4gICAgICAgICAgICB9LCBhZGRpdGlvbmFsSGVhZGVyUHJvcGVydGllcyhjb2x1bW4pKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgb3RoZXIgY29sdW1ucyBoYXZlIHBhcmVudHMsIHdlJ2xsIG5lZWQgdG8gYWRkIGEgcGxhY2UgaG9sZGVyIGlmIG5lY2Vzc2FyeVxuICAgICAgICAgICAgdmFyIG9yaWdpbmFsSWQgPSBjb2x1bW4uaWQgKyBcIl9wbGFjZWhvbGRlclwiO1xuICAgICAgICAgICAgbmV3UGFyZW50ID0gZGVjb3JhdGVDb2x1bW4oX2V4dGVuZHMoe1xuICAgICAgICAgICAgICBvcmlnaW5hbElkOiBvcmlnaW5hbElkLFxuICAgICAgICAgICAgICBpZDogY29sdW1uLmlkICsgXCJfcGxhY2Vob2xkZXJfXCIgKyBnZXRVSUQoKSxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJPZjogY29sdW1uLFxuICAgICAgICAgICAgICBoZWFkZXJzOiBbY29sdW1uXVxuICAgICAgICAgICAgfSwgYWRkaXRpb25hbEhlYWRlclByb3BlcnRpZXMoY29sdW1uKSksIGRlZmF1bHRDb2x1bW4pO1xuICAgICAgICAgIH0gLy8gSWYgdGhlIHJlc3VsdGluZyBwYXJlbnQgY29sdW1ucyBhcmUgdGhlIHNhbWUsIGp1c3QgYWRkXG4gICAgICAgICAgLy8gdGhlIGNvbHVtbiBhbmQgaW5jcmVtZW50IHRoZSBoZWFkZXIgc3BhblxuXG5cbiAgICAgICAgICBpZiAobGF0ZXN0UGFyZW50Q29sdW1uICYmIGxhdGVzdFBhcmVudENvbHVtbi5vcmlnaW5hbElkID09PSBuZXdQYXJlbnQub3JpZ2luYWxJZCkge1xuICAgICAgICAgICAgbGF0ZXN0UGFyZW50Q29sdW1uLmhlYWRlcnMucHVzaChjb2x1bW4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJlbnRDb2x1bW5zLnB1c2gobmV3UGFyZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBoZWFkZXJHcm91cC5oZWFkZXJzLnB1c2goY29sdW1uKTtcbiAgICAgIH0pO1xuICAgICAgaGVhZGVyR3JvdXBzLnB1c2goaGVhZGVyR3JvdXApOyAvLyBTdGFydCBzY2FubmluZyB0aGUgcGFyZW50IGNvbHVtbnNcblxuICAgICAgc2NhbkNvbHVtbnMgPSBwYXJlbnRDb2x1bW5zO1xuICAgIH07XG5cbiAgICB3aGlsZSAoc2NhbkNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICBfbG9vcCgpO1xuICAgIH1cblxuICAgIHJldHVybiBoZWFkZXJHcm91cHMucmV2ZXJzZSgpO1xuICB9XG4gIHZhciBwYXRoT2JqQ2FjaGUgPSBuZXcgTWFwKCk7XG4gIGZ1bmN0aW9uIGdldEJ5KG9iaiwgcGF0aCwgZGVmKSB7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIHZhciBjYWNoZUtleSA9IHR5cGVvZiBwYXRoID09PSAnZnVuY3Rpb24nID8gcGF0aCA6IEpTT04uc3RyaW5naWZ5KHBhdGgpO1xuXG4gICAgdmFyIHBhdGhPYmogPSBwYXRoT2JqQ2FjaGUuZ2V0KGNhY2hlS2V5KSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcGF0aE9iaiA9IG1ha2VQYXRoQXJyYXkocGF0aCk7XG4gICAgICBwYXRoT2JqQ2FjaGUuc2V0KGNhY2hlS2V5LCBwYXRoT2JqKTtcbiAgICAgIHJldHVybiBwYXRoT2JqO1xuICAgIH0oKTtcblxuICAgIHZhciB2YWw7XG5cbiAgICB0cnkge1xuICAgICAgdmFsID0gcGF0aE9iai5yZWR1Y2UoZnVuY3Rpb24gKGN1cnNvciwgcGF0aFBhcnQpIHtcbiAgICAgICAgcmV0dXJuIGN1cnNvcltwYXRoUGFydF07XG4gICAgICB9LCBvYmopO1xuICAgIH0gY2F0Y2ggKGUpIHsvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVvZiB2YWwgIT09ICd1bmRlZmluZWQnID8gdmFsIDogZGVmO1xuICB9XG4gIGZ1bmN0aW9uIGdldEZpcnN0RGVmaW5lZCgpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAodHlwZW9mIGFyZ3NbaV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBhcmdzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBpc0Z1bmN0aW9uKGEpIHtcbiAgICBpZiAodHlwZW9mIGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBmbGF0dGVuQnkoYXJyLCBrZXkpIHtcbiAgICB2YXIgZmxhdCA9IFtdO1xuXG4gICAgdmFyIHJlY3Vyc2UgPSBmdW5jdGlvbiByZWN1cnNlKGFycikge1xuICAgICAgYXJyLmZvckVhY2goZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgaWYgKCFkW2tleV0pIHtcbiAgICAgICAgICBmbGF0LnB1c2goZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVjdXJzZShkW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmVjdXJzZShhcnIpO1xuICAgIHJldHVybiBmbGF0O1xuICB9XG4gIGZ1bmN0aW9uIGV4cGFuZFJvd3Mocm93cywgX3JlZikge1xuICAgIHZhciBtYW51YWxFeHBhbmRlZEtleSA9IF9yZWYubWFudWFsRXhwYW5kZWRLZXksXG4gICAgICAgIGV4cGFuZGVkID0gX3JlZi5leHBhbmRlZCxcbiAgICAgICAgX3JlZiRleHBhbmRTdWJSb3dzID0gX3JlZi5leHBhbmRTdWJSb3dzLFxuICAgICAgICBleHBhbmRTdWJSb3dzID0gX3JlZiRleHBhbmRTdWJSb3dzID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZiRleHBhbmRTdWJSb3dzO1xuICAgIHZhciBleHBhbmRlZFJvd3MgPSBbXTtcblxuICAgIHZhciBoYW5kbGVSb3cgPSBmdW5jdGlvbiBoYW5kbGVSb3cocm93LCBhZGRUb0V4cGFuZGVkUm93cykge1xuICAgICAgaWYgKGFkZFRvRXhwYW5kZWRSb3dzID09PSB2b2lkIDApIHtcbiAgICAgICAgYWRkVG9FeHBhbmRlZFJvd3MgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICByb3cuaXNFeHBhbmRlZCA9IHJvdy5vcmlnaW5hbCAmJiByb3cub3JpZ2luYWxbbWFudWFsRXhwYW5kZWRLZXldIHx8IGV4cGFuZGVkW3Jvdy5pZF07XG4gICAgICByb3cuY2FuRXhwYW5kID0gcm93LnN1YlJvd3MgJiYgISFyb3cuc3ViUm93cy5sZW5ndGg7XG5cbiAgICAgIGlmIChhZGRUb0V4cGFuZGVkUm93cykge1xuICAgICAgICBleHBhbmRlZFJvd3MucHVzaChyb3cpO1xuICAgICAgfVxuXG4gICAgICBpZiAocm93LnN1YlJvd3MgJiYgcm93LnN1YlJvd3MubGVuZ3RoICYmIHJvdy5pc0V4cGFuZGVkKSB7XG4gICAgICAgIHJvdy5zdWJSb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVSb3cocm93LCBleHBhbmRTdWJSb3dzKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICByZXR1cm4gaGFuZGxlUm93KHJvdyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGV4cGFuZGVkUm93cztcbiAgfVxuICBmdW5jdGlvbiBnZXRGaWx0ZXJNZXRob2QoZmlsdGVyLCB1c2VyRmlsdGVyVHlwZXMsIGZpbHRlclR5cGVzKSB7XG4gICAgcmV0dXJuIGlzRnVuY3Rpb24oZmlsdGVyKSB8fCB1c2VyRmlsdGVyVHlwZXNbZmlsdGVyXSB8fCBmaWx0ZXJUeXBlc1tmaWx0ZXJdIHx8IGZpbHRlclR5cGVzLnRleHQ7XG4gIH1cbiAgZnVuY3Rpb24gc2hvdWxkQXV0b1JlbW92ZUZpbHRlcihhdXRvUmVtb3ZlLCB2YWx1ZSwgY29sdW1uKSB7XG4gICAgcmV0dXJuIGF1dG9SZW1vdmUgPyBhdXRvUmVtb3ZlKHZhbHVlLCBjb2x1bW4pIDogdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcbiAgfVxuICBmdW5jdGlvbiB1bnByZXBhcmVkQWNjZXNzV2FybmluZygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0LVRhYmxlOiBZb3UgaGF2ZSBub3QgY2FsbGVkIHByZXBhcmVSb3cocm93KSBvbmUgb3IgbW9yZSByb3dzIHlvdSBhcmUgYXR0ZW1wdGluZyB0byByZW5kZXIuJyk7XG4gIH1cbiAgdmFyIHBhc3NpdmVTdXBwb3J0ZWQgPSBudWxsO1xuICBmdW5jdGlvbiBwYXNzaXZlRXZlbnRTdXBwb3J0ZWQoKSB7XG4gICAgLy8gbWVtb2l6ZSBzdXBwb3J0IHRvIGF2b2lkIGFkZGluZyBtdWx0aXBsZSB0ZXN0IGV2ZW50c1xuICAgIGlmICh0eXBlb2YgcGFzc2l2ZVN1cHBvcnRlZCA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gcGFzc2l2ZVN1cHBvcnRlZDtcbiAgICB2YXIgc3VwcG9ydGVkID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgIGdldCBwYXNzaXZlKCkge1xuICAgICAgICAgIHN1cHBvcnRlZCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgIH07XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG51bGwsIG9wdGlvbnMpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCBvcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHN1cHBvcnRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHBhc3NpdmVTdXBwb3J0ZWQgPSBzdXBwb3J0ZWQ7XG4gICAgcmV0dXJuIHBhc3NpdmVTdXBwb3J0ZWQ7XG4gIH0gLy9cblxuICB2YXIgcmVPcGVuQnJhY2tldCA9IC9cXFsvZztcbiAgdmFyIHJlQ2xvc2VCcmFja2V0ID0gL1xcXS9nO1xuXG4gIGZ1bmN0aW9uIG1ha2VQYXRoQXJyYXkob2JqKSB7XG4gICAgcmV0dXJuIGZsYXR0ZW5EZWVwKG9iaikgLy8gcmVtb3ZlIGFsbCBwZXJpb2RzIGluIHBhcnRzXG4gICAgLm1hcChmdW5jdGlvbiAoZCkge1xuICAgICAgcmV0dXJuIFN0cmluZyhkKS5yZXBsYWNlKCcuJywgJ18nKTtcbiAgICB9KSAvLyBqb2luIHBhcnRzIHVzaW5nIHBlcmlvZFxuICAgIC5qb2luKCcuJykgLy8gcmVwbGFjZSBicmFja2V0cyB3aXRoIHBlcmlvZHNcbiAgICAucmVwbGFjZShyZU9wZW5CcmFja2V0LCAnLicpLnJlcGxhY2UocmVDbG9zZUJyYWNrZXQsICcnKSAvLyBzcGxpdCBpdCBiYWNrIG91dCBvbiBwZXJpb2RzXG4gICAgLnNwbGl0KCcuJyk7XG4gIH1cblxuICBmdW5jdGlvbiBmbGF0dGVuRGVlcChhcnIsIG5ld0Fycikge1xuICAgIGlmIChuZXdBcnIgPT09IHZvaWQgMCkge1xuICAgICAgbmV3QXJyID0gW107XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICAgIG5ld0Fyci5wdXNoKGFycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGZsYXR0ZW5EZWVwKGFycltpXSwgbmV3QXJyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3QXJyO1xuICB9XG5cbiAgdmFyIGRlZmF1bHRHZXRUYWJsZVByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldFRhYmxlUHJvcHMocHJvcHMpIHtcbiAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgcm9sZTogJ3RhYmxlJ1xuICAgIH0sIHByb3BzKTtcbiAgfTtcblxuICB2YXIgZGVmYXVsdEdldFRhYmxlQm9keVByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldFRhYmxlQm9keVByb3BzKHByb3BzKSB7XG4gICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgIHJvbGU6ICdyb3dncm91cCdcbiAgICB9LCBwcm9wcyk7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRIZWFkZXJQcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRIZWFkZXJQcm9wcyhwcm9wcywgX3JlZikge1xuICAgIHZhciBjb2x1bW4gPSBfcmVmLmNvbHVtbjtcbiAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAga2V5OiBcImhlYWRlcl9cIiArIGNvbHVtbi5pZCxcbiAgICAgIGNvbFNwYW46IGNvbHVtbi50b3RhbFZpc2libGVIZWFkZXJDb3VudCxcbiAgICAgIHJvbGU6ICdjb2x1bW5oZWFkZXInXG4gICAgfSwgcHJvcHMpO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0R2V0Rm9vdGVyUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0Rm9vdGVyUHJvcHMocHJvcHMsIF9yZWYyKSB7XG4gICAgdmFyIGNvbHVtbiA9IF9yZWYyLmNvbHVtbjtcbiAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAga2V5OiBcImZvb3Rlcl9cIiArIGNvbHVtbi5pZCxcbiAgICAgIGNvbFNwYW46IGNvbHVtbi50b3RhbFZpc2libGVIZWFkZXJDb3VudFxuICAgIH0sIHByb3BzKTtcbiAgfTtcblxuICB2YXIgZGVmYXVsdEdldEhlYWRlckdyb3VwUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0SGVhZGVyR3JvdXBQcm9wcyhwcm9wcywgX3JlZjMpIHtcbiAgICB2YXIgaW5kZXggPSBfcmVmMy5pbmRleDtcbiAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAga2V5OiBcImhlYWRlckdyb3VwX1wiICsgaW5kZXgsXG4gICAgICByb2xlOiAncm93J1xuICAgIH0sIHByb3BzKTtcbiAgfTtcblxuICB2YXIgZGVmYXVsdEdldEZvb3Rlckdyb3VwUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0Rm9vdGVyR3JvdXBQcm9wcyhwcm9wcywgX3JlZjQpIHtcbiAgICB2YXIgaW5kZXggPSBfcmVmNC5pbmRleDtcbiAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAga2V5OiBcImZvb3Rlckdyb3VwX1wiICsgaW5kZXhcbiAgICB9LCBwcm9wcyk7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRSb3dQcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRSb3dQcm9wcyhwcm9wcywgX3JlZjUpIHtcbiAgICB2YXIgcm93ID0gX3JlZjUucm93O1xuICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICBrZXk6IFwicm93X1wiICsgcm93LmlkLFxuICAgICAgcm9sZTogJ3JvdydcbiAgICB9LCBwcm9wcyk7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRDZWxsUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0Q2VsbFByb3BzKHByb3BzLCBfcmVmNikge1xuICAgIHZhciBjZWxsID0gX3JlZjYuY2VsbDtcbiAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAga2V5OiBcImNlbGxfXCIgKyBjZWxsLnJvdy5pZCArIFwiX1wiICsgY2VsbC5jb2x1bW4uaWQsXG4gICAgICByb2xlOiAnY2VsbCdcbiAgICB9LCBwcm9wcyk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZURlZmF1bHRQbHVnaW5Ib29rcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdXNlT3B0aW9uczogW10sXG4gICAgICBzdGF0ZVJlZHVjZXJzOiBbXSxcbiAgICAgIHVzZUNvbnRyb2xsZWRTdGF0ZTogW10sXG4gICAgICBjb2x1bW5zOiBbXSxcbiAgICAgIGNvbHVtbnNEZXBzOiBbXSxcbiAgICAgIGFsbENvbHVtbnM6IFtdLFxuICAgICAgYWxsQ29sdW1uc0RlcHM6IFtdLFxuICAgICAgYWNjZXNzVmFsdWU6IFtdLFxuICAgICAgbWF0ZXJpYWxpemVkQ29sdW1uczogW10sXG4gICAgICBtYXRlcmlhbGl6ZWRDb2x1bW5zRGVwczogW10sXG4gICAgICB1c2VJbnN0YW5jZUFmdGVyRGF0YTogW10sXG4gICAgICB2aXNpYmxlQ29sdW1uczogW10sXG4gICAgICB2aXNpYmxlQ29sdW1uc0RlcHM6IFtdLFxuICAgICAgaGVhZGVyR3JvdXBzOiBbXSxcbiAgICAgIGhlYWRlckdyb3Vwc0RlcHM6IFtdLFxuICAgICAgdXNlSW5zdGFuY2VCZWZvcmVEaW1lbnNpb25zOiBbXSxcbiAgICAgIHVzZUluc3RhbmNlOiBbXSxcbiAgICAgIHByZXBhcmVSb3c6IFtdLFxuICAgICAgZ2V0VGFibGVQcm9wczogW2RlZmF1bHRHZXRUYWJsZVByb3BzXSxcbiAgICAgIGdldFRhYmxlQm9keVByb3BzOiBbZGVmYXVsdEdldFRhYmxlQm9keVByb3BzXSxcbiAgICAgIGdldEhlYWRlckdyb3VwUHJvcHM6IFtkZWZhdWx0R2V0SGVhZGVyR3JvdXBQcm9wc10sXG4gICAgICBnZXRGb290ZXJHcm91cFByb3BzOiBbZGVmYXVsdEdldEZvb3Rlckdyb3VwUHJvcHNdLFxuICAgICAgZ2V0SGVhZGVyUHJvcHM6IFtkZWZhdWx0R2V0SGVhZGVyUHJvcHNdLFxuICAgICAgZ2V0Rm9vdGVyUHJvcHM6IFtkZWZhdWx0R2V0Rm9vdGVyUHJvcHNdLFxuICAgICAgZ2V0Um93UHJvcHM6IFtkZWZhdWx0R2V0Um93UHJvcHNdLFxuICAgICAgZ2V0Q2VsbFByb3BzOiBbZGVmYXVsdEdldENlbGxQcm9wc10sXG4gICAgICB1c2VGaW5hbEluc3RhbmNlOiBbXVxuICAgIH07XG4gIH1cblxuICBhY3Rpb25zLnJlc2V0SGlkZGVuQ29sdW1ucyA9ICdyZXNldEhpZGRlbkNvbHVtbnMnO1xuICBhY3Rpb25zLnRvZ2dsZUhpZGVDb2x1bW4gPSAndG9nZ2xlSGlkZUNvbHVtbic7XG4gIGFjdGlvbnMuc2V0SGlkZGVuQ29sdW1ucyA9ICdzZXRIaWRkZW5Db2x1bW5zJztcbiAgYWN0aW9ucy50b2dnbGVIaWRlQWxsQ29sdW1ucyA9ICd0b2dnbGVIaWRlQWxsQ29sdW1ucyc7XG4gIHZhciB1c2VDb2x1bW5WaXNpYmlsaXR5ID0gZnVuY3Rpb24gdXNlQ29sdW1uVmlzaWJpbGl0eShob29rcykge1xuICAgIGhvb2tzLmdldFRvZ2dsZUhpZGRlblByb3BzID0gW2RlZmF1bHRHZXRUb2dnbGVIaWRkZW5Qcm9wc107XG4gICAgaG9va3MuZ2V0VG9nZ2xlSGlkZUFsbENvbHVtbnNQcm9wcyA9IFtkZWZhdWx0R2V0VG9nZ2xlSGlkZUFsbENvbHVtbnNQcm9wc107XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIpO1xuICAgIGhvb2tzLnVzZUluc3RhbmNlQmVmb3JlRGltZW5zaW9ucy5wdXNoKHVzZUluc3RhbmNlQmVmb3JlRGltZW5zaW9ucyk7XG4gICAgaG9va3MuaGVhZGVyR3JvdXBzRGVwcy5wdXNoKGZ1bmN0aW9uIChkZXBzLCBfcmVmKSB7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBfcmVmLmluc3RhbmNlO1xuICAgICAgcmV0dXJuIFtdLmNvbmNhdChkZXBzLCBbaW5zdGFuY2Uuc3RhdGUuaGlkZGVuQ29sdW1uc10pO1xuICAgIH0pO1xuICAgIGhvb2tzLnVzZUluc3RhbmNlLnB1c2godXNlSW5zdGFuY2UpO1xuICB9O1xuICB1c2VDb2x1bW5WaXNpYmlsaXR5LnBsdWdpbk5hbWUgPSAndXNlQ29sdW1uVmlzaWJpbGl0eSc7XG5cbiAgdmFyIGRlZmF1bHRHZXRUb2dnbGVIaWRkZW5Qcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRUb2dnbGVIaWRkZW5Qcm9wcyhwcm9wcywgX3JlZjIpIHtcbiAgICB2YXIgY29sdW1uID0gX3JlZjIuY29sdW1uO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICAgIGNvbHVtbi50b2dnbGVIaWRkZW4oIWUudGFyZ2V0LmNoZWNrZWQpO1xuICAgICAgfSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICB9LFxuICAgICAgY2hlY2tlZDogY29sdW1uLmlzVmlzaWJsZSxcbiAgICAgIHRpdGxlOiAnVG9nZ2xlIENvbHVtbiBWaXNpYmxlJ1xuICAgIH1dO1xuICB9O1xuXG4gIHZhciBkZWZhdWx0R2V0VG9nZ2xlSGlkZUFsbENvbHVtbnNQcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRUb2dnbGVIaWRlQWxsQ29sdW1uc1Byb3BzKHByb3BzLCBfcmVmMykge1xuICAgIHZhciBpbnN0YW5jZSA9IF9yZWYzLmluc3RhbmNlO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICAgIGluc3RhbmNlLnRvZ2dsZUhpZGVBbGxDb2x1bW5zKCFlLnRhcmdldC5jaGVja2VkKTtcbiAgICAgIH0sXG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgfSxcbiAgICAgIGNoZWNrZWQ6ICFpbnN0YW5jZS5hbGxDb2x1bW5zSGlkZGVuICYmICFpbnN0YW5jZS5zdGF0ZS5oaWRkZW5Db2x1bW5zLmxlbmd0aCxcbiAgICAgIHRpdGxlOiAnVG9nZ2xlIEFsbCBDb2x1bW5zIEhpZGRlbicsXG4gICAgICBpbmRldGVybWluYXRlOiAhaW5zdGFuY2UuYWxsQ29sdW1uc0hpZGRlbiAmJiBpbnN0YW5jZS5zdGF0ZS5oaWRkZW5Db2x1bW5zLmxlbmd0aFxuICAgIH1dO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHJlZHVjZXIoc3RhdGUsIGFjdGlvbiwgcHJldmlvdXNTdGF0ZSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuaW5pdCkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgaGlkZGVuQ29sdW1uczogW11cbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMucmVzZXRIaWRkZW5Db2x1bW5zKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGhpZGRlbkNvbHVtbnM6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5oaWRkZW5Db2x1bW5zIHx8IFtdXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMudG9nZ2xlSGlkZUNvbHVtbikge1xuICAgICAgdmFyIHNob3VsZCA9IHR5cGVvZiBhY3Rpb24udmFsdWUgIT09ICd1bmRlZmluZWQnID8gYWN0aW9uLnZhbHVlIDogIXN0YXRlLmhpZGRlbkNvbHVtbnMuaW5jbHVkZXMoYWN0aW9uLmNvbHVtbklkKTtcbiAgICAgIHZhciBoaWRkZW5Db2x1bW5zID0gc2hvdWxkID8gW10uY29uY2F0KHN0YXRlLmhpZGRlbkNvbHVtbnMsIFthY3Rpb24uY29sdW1uSWRdKSA6IHN0YXRlLmhpZGRlbkNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkICE9PSBhY3Rpb24uY29sdW1uSWQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgaGlkZGVuQ29sdW1uczogaGlkZGVuQ29sdW1uc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldEhpZGRlbkNvbHVtbnMpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgaGlkZGVuQ29sdW1uczogZnVuY3Rpb25hbFVwZGF0ZShhY3Rpb24udmFsdWUsIHN0YXRlLmhpZGRlbkNvbHVtbnMpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMudG9nZ2xlSGlkZUFsbENvbHVtbnMpIHtcbiAgICAgIHZhciBzaG91bGRBbGwgPSB0eXBlb2YgYWN0aW9uLnZhbHVlICE9PSAndW5kZWZpbmVkJyA/IGFjdGlvbi52YWx1ZSA6ICFzdGF0ZS5oaWRkZW5Db2x1bW5zLmxlbmd0aDtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgaGlkZGVuQ29sdW1uczogc2hvdWxkQWxsID8gaW5zdGFuY2UuYWxsQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZC5pZDtcbiAgICAgICAgfSkgOiBbXVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2VCZWZvcmVEaW1lbnNpb25zKGluc3RhbmNlKSB7XG4gICAgdmFyIGhlYWRlcnMgPSBpbnN0YW5jZS5oZWFkZXJzLFxuICAgICAgICBoaWRkZW5Db2x1bW5zID0gaW5zdGFuY2Uuc3RhdGUuaGlkZGVuQ29sdW1ucztcbiAgICB2YXIgaXNNb3VudGVkUmVmID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcblxuICAgIGlmICghaXNNb3VudGVkUmVmLmN1cnJlbnQpIDtcblxuICAgIHZhciBoYW5kbGVDb2x1bW4gPSBmdW5jdGlvbiBoYW5kbGVDb2x1bW4oY29sdW1uLCBwYXJlbnRWaXNpYmxlKSB7XG4gICAgICBjb2x1bW4uaXNWaXNpYmxlID0gcGFyZW50VmlzaWJsZSAmJiAhaGlkZGVuQ29sdW1ucy5pbmNsdWRlcyhjb2x1bW4uaWQpO1xuICAgICAgdmFyIHRvdGFsVmlzaWJsZUhlYWRlckNvdW50ID0gMDtcblxuICAgICAgaWYgKGNvbHVtbi5oZWFkZXJzICYmIGNvbHVtbi5oZWFkZXJzLmxlbmd0aCkge1xuICAgICAgICBjb2x1bW4uaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJDb2x1bW4pIHtcbiAgICAgICAgICByZXR1cm4gdG90YWxWaXNpYmxlSGVhZGVyQ291bnQgKz0gaGFuZGxlQ29sdW1uKHN1YkNvbHVtbiwgY29sdW1uLmlzVmlzaWJsZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG90YWxWaXNpYmxlSGVhZGVyQ291bnQgPSBjb2x1bW4uaXNWaXNpYmxlID8gMSA6IDA7XG4gICAgICB9XG5cbiAgICAgIGNvbHVtbi50b3RhbFZpc2libGVIZWFkZXJDb3VudCA9IHRvdGFsVmlzaWJsZUhlYWRlckNvdW50O1xuICAgICAgcmV0dXJuIHRvdGFsVmlzaWJsZUhlYWRlckNvdW50O1xuICAgIH07XG5cbiAgICB2YXIgdG90YWxWaXNpYmxlSGVhZGVyQ291bnQgPSAwO1xuICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3ViSGVhZGVyKSB7XG4gICAgICByZXR1cm4gdG90YWxWaXNpYmxlSGVhZGVyQ291bnQgKz0gaGFuZGxlQ29sdW1uKHN1YkhlYWRlciwgdHJ1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB1c2VJbnN0YW5jZShpbnN0YW5jZSkge1xuICAgIHZhciBjb2x1bW5zID0gaW5zdGFuY2UuY29sdW1ucyxcbiAgICAgICAgZmxhdEhlYWRlcnMgPSBpbnN0YW5jZS5mbGF0SGVhZGVycyxcbiAgICAgICAgZGlzcGF0Y2ggPSBpbnN0YW5jZS5kaXNwYXRjaCxcbiAgICAgICAgYWxsQ29sdW1ucyA9IGluc3RhbmNlLmFsbENvbHVtbnMsXG4gICAgICAgIGdldEhvb2tzID0gaW5zdGFuY2UuZ2V0SG9va3MsXG4gICAgICAgIGhpZGRlbkNvbHVtbnMgPSBpbnN0YW5jZS5zdGF0ZS5oaWRkZW5Db2x1bW5zLFxuICAgICAgICBfaW5zdGFuY2UkYXV0b1Jlc2V0SGkgPSBpbnN0YW5jZS5hdXRvUmVzZXRIaWRkZW5Db2x1bW5zLFxuICAgICAgICBhdXRvUmVzZXRIaWRkZW5Db2x1bW5zID0gX2luc3RhbmNlJGF1dG9SZXNldEhpID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGF1dG9SZXNldEhpO1xuICAgIHZhciBnZXRJbnN0YW5jZSA9IHVzZUdldExhdGVzdChpbnN0YW5jZSk7XG4gICAgdmFyIGFsbENvbHVtbnNIaWRkZW4gPSBhbGxDb2x1bW5zLmxlbmd0aCA9PT0gaGlkZGVuQ29sdW1ucy5sZW5ndGg7XG4gICAgdmFyIHRvZ2dsZUhpZGVDb2x1bW4gPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoY29sdW1uSWQsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLnRvZ2dsZUhpZGVDb2x1bW4sXG4gICAgICAgIGNvbHVtbklkOiBjb2x1bW5JZCxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgc2V0SGlkZGVuQ29sdW1ucyA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5zZXRIaWRkZW5Db2x1bW5zLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIHZhciB0b2dnbGVIaWRlQWxsQ29sdW1ucyA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy50b2dnbGVIaWRlQWxsQ29sdW1ucyxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgZ2V0VG9nZ2xlSGlkZUFsbENvbHVtbnNQcm9wcyA9IG1ha2VQcm9wR2V0dGVyKGdldEhvb2tzKCkuZ2V0VG9nZ2xlSGlkZUFsbENvbHVtbnNQcm9wcywge1xuICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICB9KTtcbiAgICBmbGF0SGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIGNvbHVtbi50b2dnbGVIaWRkZW4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMudG9nZ2xlSGlkZUNvbHVtbixcbiAgICAgICAgICBjb2x1bW5JZDogY29sdW1uLmlkLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbHVtbi5nZXRUb2dnbGVIaWRkZW5Qcm9wcyA9IG1ha2VQcm9wR2V0dGVyKGdldEhvb2tzKCkuZ2V0VG9nZ2xlSGlkZGVuUHJvcHMsIHtcbiAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKCksXG4gICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB2YXIgZ2V0QXV0b1Jlc2V0SGlkZGVuQ29sdW1ucyA9IHVzZUdldExhdGVzdChhdXRvUmVzZXRIaWRkZW5Db2x1bW5zKTtcbiAgICB1c2VNb3VudGVkTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChnZXRBdXRvUmVzZXRIaWRkZW5Db2x1bW5zKCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRIaWRkZW5Db2x1bW5zXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIFtkaXNwYXRjaCwgY29sdW1uc10pO1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UsIHtcbiAgICAgIGFsbENvbHVtbnNIaWRkZW46IGFsbENvbHVtbnNIaWRkZW4sXG4gICAgICB0b2dnbGVIaWRlQ29sdW1uOiB0b2dnbGVIaWRlQ29sdW1uLFxuICAgICAgc2V0SGlkZGVuQ29sdW1uczogc2V0SGlkZGVuQ29sdW1ucyxcbiAgICAgIHRvZ2dsZUhpZGVBbGxDb2x1bW5zOiB0b2dnbGVIaWRlQWxsQ29sdW1ucyxcbiAgICAgIGdldFRvZ2dsZUhpZGVBbGxDb2x1bW5zUHJvcHM6IGdldFRvZ2dsZUhpZGVBbGxDb2x1bW5zUHJvcHNcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBkZWZhdWx0SW5pdGlhbFN0YXRlID0ge307XG4gIHZhciBkZWZhdWx0Q29sdW1uSW5zdGFuY2UgPSB7fTtcblxuICB2YXIgZGVmYXVsdFJlZHVjZXIgPSBmdW5jdGlvbiBkZWZhdWx0UmVkdWNlcihzdGF0ZSwgYWN0aW9uLCBwcmV2U3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRTdWJSb3dzID0gZnVuY3Rpb24gZGVmYXVsdEdldFN1YlJvd3Mocm93LCBpbmRleCkge1xuICAgIHJldHVybiByb3cuc3ViUm93cyB8fCBbXTtcbiAgfTtcblxuICB2YXIgZGVmYXVsdEdldFJvd0lkID0gZnVuY3Rpb24gZGVmYXVsdEdldFJvd0lkKHJvdywgaW5kZXgsIHBhcmVudCkge1xuICAgIHJldHVybiBcIlwiICsgKHBhcmVudCA/IFtwYXJlbnQuaWQsIGluZGV4XS5qb2luKCcuJykgOiBpbmRleCk7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRVc2VDb250cm9sbGVkU3RhdGUgPSBmdW5jdGlvbiBkZWZhdWx0VXNlQ29udHJvbGxlZFN0YXRlKGQpIHtcbiAgICByZXR1cm4gZDtcbiAgfTtcblxuICBmdW5jdGlvbiBhcHBseURlZmF1bHRzKHByb3BzKSB7XG4gICAgdmFyIF9wcm9wcyRpbml0aWFsU3RhdGUgPSBwcm9wcy5pbml0aWFsU3RhdGUsXG4gICAgICAgIGluaXRpYWxTdGF0ZSA9IF9wcm9wcyRpbml0aWFsU3RhdGUgPT09IHZvaWQgMCA/IGRlZmF1bHRJbml0aWFsU3RhdGUgOiBfcHJvcHMkaW5pdGlhbFN0YXRlLFxuICAgICAgICBfcHJvcHMkZGVmYXVsdENvbHVtbiA9IHByb3BzLmRlZmF1bHRDb2x1bW4sXG4gICAgICAgIGRlZmF1bHRDb2x1bW4gPSBfcHJvcHMkZGVmYXVsdENvbHVtbiA9PT0gdm9pZCAwID8gZGVmYXVsdENvbHVtbkluc3RhbmNlIDogX3Byb3BzJGRlZmF1bHRDb2x1bW4sXG4gICAgICAgIF9wcm9wcyRnZXRTdWJSb3dzID0gcHJvcHMuZ2V0U3ViUm93cyxcbiAgICAgICAgZ2V0U3ViUm93cyA9IF9wcm9wcyRnZXRTdWJSb3dzID09PSB2b2lkIDAgPyBkZWZhdWx0R2V0U3ViUm93cyA6IF9wcm9wcyRnZXRTdWJSb3dzLFxuICAgICAgICBfcHJvcHMkZ2V0Um93SWQgPSBwcm9wcy5nZXRSb3dJZCxcbiAgICAgICAgZ2V0Um93SWQgPSBfcHJvcHMkZ2V0Um93SWQgPT09IHZvaWQgMCA/IGRlZmF1bHRHZXRSb3dJZCA6IF9wcm9wcyRnZXRSb3dJZCxcbiAgICAgICAgX3Byb3BzJHN0YXRlUmVkdWNlciA9IHByb3BzLnN0YXRlUmVkdWNlcixcbiAgICAgICAgc3RhdGVSZWR1Y2VyID0gX3Byb3BzJHN0YXRlUmVkdWNlciA9PT0gdm9pZCAwID8gZGVmYXVsdFJlZHVjZXIgOiBfcHJvcHMkc3RhdGVSZWR1Y2VyLFxuICAgICAgICBfcHJvcHMkdXNlQ29udHJvbGxlZFMgPSBwcm9wcy51c2VDb250cm9sbGVkU3RhdGUsXG4gICAgICAgIHVzZUNvbnRyb2xsZWRTdGF0ZSA9IF9wcm9wcyR1c2VDb250cm9sbGVkUyA9PT0gdm9pZCAwID8gZGVmYXVsdFVzZUNvbnRyb2xsZWRTdGF0ZSA6IF9wcm9wcyR1c2VDb250cm9sbGVkUyxcbiAgICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHByb3BzLCBbXCJpbml0aWFsU3RhdGVcIiwgXCJkZWZhdWx0Q29sdW1uXCIsIFwiZ2V0U3ViUm93c1wiLCBcImdldFJvd0lkXCIsIFwic3RhdGVSZWR1Y2VyXCIsIFwidXNlQ29udHJvbGxlZFN0YXRlXCJdKTtcblxuICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgaW5pdGlhbFN0YXRlOiBpbml0aWFsU3RhdGUsXG4gICAgICBkZWZhdWx0Q29sdW1uOiBkZWZhdWx0Q29sdW1uLFxuICAgICAgZ2V0U3ViUm93czogZ2V0U3ViUm93cyxcbiAgICAgIGdldFJvd0lkOiBnZXRSb3dJZCxcbiAgICAgIHN0YXRlUmVkdWNlcjogc3RhdGVSZWR1Y2VyLFxuICAgICAgdXNlQ29udHJvbGxlZFN0YXRlOiB1c2VDb250cm9sbGVkU3RhdGVcbiAgICB9KTtcbiAgfVxuXG4gIHZhciB1c2VUYWJsZSA9IGZ1bmN0aW9uIHVzZVRhYmxlKHByb3BzKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHBsdWdpbnMgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgcGx1Z2luc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgZGVmYXVsdCBwcm9wc1xuICAgIHByb3BzID0gYXBwbHlEZWZhdWx0cyhwcm9wcyk7IC8vIEFkZCBjb3JlIHBsdWdpbnNcblxuICAgIHBsdWdpbnMgPSBbdXNlQ29sdW1uVmlzaWJpbGl0eV0uY29uY2F0KHBsdWdpbnMpOyAvLyBDcmVhdGUgdGhlIHRhYmxlIGluc3RhbmNlXG5cbiAgICB2YXIgaW5zdGFuY2VSZWYgPSBSZWFjdC51c2VSZWYoe30pOyAvLyBDcmVhdGUgYSBnZXR0ZXIgZm9yIHRoZSBpbnN0YW5jZSAoaGVscHMgYXZvaWQgYSBsb3Qgb2YgcG90ZW50aWFsIG1lbW9yeSBsZWFrcylcblxuICAgIHZhciBnZXRJbnN0YW5jZSA9IHVzZUdldExhdGVzdChpbnN0YW5jZVJlZi5jdXJyZW50KTsgLy8gQXNzaWduIHRoZSBwcm9wcywgcGx1Z2lucyBhbmQgaG9va3MgdG8gdGhlIGluc3RhbmNlXG5cbiAgICBPYmplY3QuYXNzaWduKGdldEluc3RhbmNlKCksIF9leHRlbmRzKHt9LCBwcm9wcywge1xuICAgICAgcGx1Z2luczogcGx1Z2lucyxcbiAgICAgIGhvb2tzOiBtYWtlRGVmYXVsdFBsdWdpbkhvb2tzKClcbiAgICB9KSk7IC8vIEFsbG93IHBsdWdpbnMgdG8gcmVnaXN0ZXIgaG9va3MgYXMgZWFybHkgYXMgcG9zc2libGVcblxuICAgIHBsdWdpbnMuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgcGx1Z2luKGdldEluc3RhbmNlKCkuaG9va3MpO1xuICAgIH0pOyAvLyBDb25zdW1lIGFsbCBob29rcyBhbmQgbWFrZSBhIGdldHRlciBmb3IgdGhlbVxuXG4gICAgdmFyIGdldEhvb2tzID0gdXNlR2V0TGF0ZXN0KGdldEluc3RhbmNlKCkuaG9va3MpO1xuICAgIGdldEluc3RhbmNlKCkuZ2V0SG9va3MgPSBnZXRIb29rcztcbiAgICBkZWxldGUgZ2V0SW5zdGFuY2UoKS5ob29rczsgLy8gQWxsb3cgdXNlT3B0aW9ucyBob29rcyB0byBtb2RpZnkgdGhlIG9wdGlvbnMgY29taW5nIGludG8gdGhlIHRhYmxlXG5cbiAgICBPYmplY3QuYXNzaWduKGdldEluc3RhbmNlKCksIHJlZHVjZUhvb2tzKGdldEhvb2tzKCkudXNlT3B0aW9ucywgYXBwbHlEZWZhdWx0cyhwcm9wcykpKTtcblxuICAgIHZhciBfZ2V0SW5zdGFuY2UgPSBnZXRJbnN0YW5jZSgpLFxuICAgICAgICBkYXRhID0gX2dldEluc3RhbmNlLmRhdGEsXG4gICAgICAgIHVzZXJDb2x1bW5zID0gX2dldEluc3RhbmNlLmNvbHVtbnMsXG4gICAgICAgIGluaXRpYWxTdGF0ZSA9IF9nZXRJbnN0YW5jZS5pbml0aWFsU3RhdGUsXG4gICAgICAgIGRlZmF1bHRDb2x1bW4gPSBfZ2V0SW5zdGFuY2UuZGVmYXVsdENvbHVtbixcbiAgICAgICAgZ2V0U3ViUm93cyA9IF9nZXRJbnN0YW5jZS5nZXRTdWJSb3dzLFxuICAgICAgICBnZXRSb3dJZCA9IF9nZXRJbnN0YW5jZS5nZXRSb3dJZCxcbiAgICAgICAgc3RhdGVSZWR1Y2VyID0gX2dldEluc3RhbmNlLnN0YXRlUmVkdWNlcixcbiAgICAgICAgdXNlQ29udHJvbGxlZFN0YXRlID0gX2dldEluc3RhbmNlLnVzZUNvbnRyb2xsZWRTdGF0ZTsgLy8gU2V0dXAgdXNlciByZWR1Y2VyIHJlZlxuXG5cbiAgICB2YXIgZ2V0U3RhdGVSZWR1Y2VyID0gdXNlR2V0TGF0ZXN0KHN0YXRlUmVkdWNlcik7IC8vIEJ1aWxkIHRoZSByZWR1Y2VyXG5cbiAgICB2YXIgcmVkdWNlciA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChzdGF0ZSwgYWN0aW9uKSB7XG4gICAgICAvLyBEZXRlY3QgaW52YWxpZCBhY3Rpb25zXG4gICAgICBpZiAoIWFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyh7XG4gICAgICAgICAgYWN0aW9uOiBhY3Rpb25cbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBBY3Rpb24g8J+RhicpO1xuICAgICAgfSAvLyBSZWR1Y2UgdGhlIHN0YXRlIGZyb20gYWxsIHBsdWdpbiByZWR1Y2Vyc1xuXG5cbiAgICAgIHJldHVybiBbXS5jb25jYXQoZ2V0SG9va3MoKS5zdGF0ZVJlZHVjZXJzLCBBcnJheS5pc0FycmF5KGdldFN0YXRlUmVkdWNlcigpKSA/IGdldFN0YXRlUmVkdWNlcigpIDogW2dldFN0YXRlUmVkdWNlcigpXSkucmVkdWNlKGZ1bmN0aW9uIChzLCBoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVyKHMsIGFjdGlvbiwgc3RhdGUsIGdldEluc3RhbmNlKCkpIHx8IHM7XG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfSwgW2dldEhvb2tzLCBnZXRTdGF0ZVJlZHVjZXIsIGdldEluc3RhbmNlXSk7IC8vIFN0YXJ0IHRoZSByZWR1Y2VyXG5cbiAgICB2YXIgX1JlYWN0JHVzZVJlZHVjZXIgPSBSZWFjdC51c2VSZWR1Y2VyKHJlZHVjZXIsIHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlZHVjZXIoaW5pdGlhbFN0YXRlLCB7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuaW5pdFxuICAgICAgfSk7XG4gICAgfSksXG4gICAgICAgIHJlZHVjZXJTdGF0ZSA9IF9SZWFjdCR1c2VSZWR1Y2VyWzBdLFxuICAgICAgICBkaXNwYXRjaCA9IF9SZWFjdCR1c2VSZWR1Y2VyWzFdOyAvLyBBbGxvdyB0aGUgdXNlciB0byBjb250cm9sIHRoZSBmaW5hbCBzdGF0ZSB3aXRoIGhvb2tzXG5cblxuICAgIHZhciBzdGF0ZSA9IHJlZHVjZUhvb2tzKFtdLmNvbmNhdChnZXRIb29rcygpLnVzZUNvbnRyb2xsZWRTdGF0ZSwgW3VzZUNvbnRyb2xsZWRTdGF0ZV0pLCByZWR1Y2VyU3RhdGUsIHtcbiAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihnZXRJbnN0YW5jZSgpLCB7XG4gICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICBkaXNwYXRjaDogZGlzcGF0Y2hcbiAgICB9KTsgLy8gRGVjb3JhdGUgQWxsIHRoZSBjb2x1bW5zXG5cbiAgICB2YXIgY29sdW1ucyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGxpbmtDb2x1bW5TdHJ1Y3R1cmUocmVkdWNlSG9va3MoZ2V0SG9va3MoKS5jb2x1bW5zLCB1c2VyQ29sdW1ucywge1xuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgICAgfSkpO1xuICAgIH0sIFtnZXRIb29rcywgZ2V0SW5zdGFuY2UsIHVzZXJDb2x1bW5zXS5jb25jYXQocmVkdWNlSG9va3MoZ2V0SG9va3MoKS5jb2x1bW5zRGVwcywgW10sIHtcbiAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgfSkpKTtcbiAgICBnZXRJbnN0YW5jZSgpLmNvbHVtbnMgPSBjb2x1bW5zOyAvLyBHZXQgdGhlIGZsYXQgbGlzdCBvZiBhbGwgY29sdW1ucyBhbmQgYWxsb3cgaG9va3MgdG8gZGVjb3JhdGVcbiAgICAvLyB0aG9zZSBjb2x1bW5zIChhbmQgdHJpZ2dlciB0aGlzIG1lbW9pemF0aW9uIHZpYSBkZXBzKVxuXG4gICAgdmFyIGFsbENvbHVtbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZWR1Y2VIb29rcyhnZXRIb29rcygpLmFsbENvbHVtbnMsIGZsYXR0ZW5Db2x1bW5zKGNvbHVtbnMpLCB7XG4gICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgICB9KS5tYXAoYXNzaWduQ29sdW1uQWNjZXNzb3IpO1xuICAgIH0sIFtjb2x1bW5zLCBnZXRIb29rcywgZ2V0SW5zdGFuY2VdLmNvbmNhdChyZWR1Y2VIb29rcyhnZXRIb29rcygpLmFsbENvbHVtbnNEZXBzLCBbXSwge1xuICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICB9KSkpO1xuICAgIGdldEluc3RhbmNlKCkuYWxsQ29sdW1ucyA9IGFsbENvbHVtbnM7IC8vIEFjY2VzcyB0aGUgcm93IG1vZGVsIHVzaW5nIGluaXRpYWwgY29sdW1uc1xuXG4gICAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcm93cyA9IFtdO1xuICAgICAgdmFyIGZsYXRSb3dzID0gW107XG4gICAgICB2YXIgcm93c0J5SWQgPSB7fTtcbiAgICAgIHZhciBhbGxDb2x1bW5zUXVldWUgPSBbXS5jb25jYXQoYWxsQ29sdW1ucyk7XG5cbiAgICAgIHdoaWxlIChhbGxDb2x1bW5zUXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHZhciBjb2x1bW4gPSBhbGxDb2x1bW5zUXVldWUuc2hpZnQoKTtcbiAgICAgICAgYWNjZXNzUm93c0ZvckNvbHVtbih7XG4gICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICByb3dzOiByb3dzLFxuICAgICAgICAgIGZsYXRSb3dzOiBmbGF0Um93cyxcbiAgICAgICAgICByb3dzQnlJZDogcm93c0J5SWQsXG4gICAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgZ2V0Um93SWQ6IGdldFJvd0lkLFxuICAgICAgICAgIGdldFN1YlJvd3M6IGdldFN1YlJvd3MsXG4gICAgICAgICAgYWNjZXNzVmFsdWVIb29rczogZ2V0SG9va3MoKS5hY2Nlc3NWYWx1ZSxcbiAgICAgICAgICBnZXRJbnN0YW5jZTogZ2V0SW5zdGFuY2VcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbcm93cywgZmxhdFJvd3MsIHJvd3NCeUlkXTtcbiAgICB9LCBbYWxsQ29sdW1ucywgZGF0YSwgZ2V0Um93SWQsIGdldFN1YlJvd3MsIGdldEhvb2tzLCBnZXRJbnN0YW5jZV0pLFxuICAgICAgICByb3dzID0gX1JlYWN0JHVzZU1lbW9bMF0sXG4gICAgICAgIGZsYXRSb3dzID0gX1JlYWN0JHVzZU1lbW9bMV0sXG4gICAgICAgIHJvd3NCeUlkID0gX1JlYWN0JHVzZU1lbW9bMl07XG5cbiAgICBPYmplY3QuYXNzaWduKGdldEluc3RhbmNlKCksIHtcbiAgICAgIHJvd3M6IHJvd3MsXG4gICAgICBpbml0aWFsUm93czogW10uY29uY2F0KHJvd3MpLFxuICAgICAgZmxhdFJvd3M6IGZsYXRSb3dzLFxuICAgICAgcm93c0J5SWQ6IHJvd3NCeUlkIC8vIG1hdGVyaWFsaXplZENvbHVtbnMsXG5cbiAgICB9KTtcbiAgICBsb29wSG9va3MoZ2V0SG9va3MoKS51c2VJbnN0YW5jZUFmdGVyRGF0YSwgZ2V0SW5zdGFuY2UoKSk7IC8vIEdldCB0aGUgZmxhdCBsaXN0IG9mIGFsbCBjb2x1bW5zIEFGVEVSIHRoZSByb3dzXG4gICAgLy8gaGF2ZSBiZWVuIGFjY2VzcywgYW5kIGFsbG93IGhvb2tzIHRvIGRlY29yYXRlXG4gICAgLy8gdGhvc2UgY29sdW1ucyAoYW5kIHRyaWdnZXIgdGhpcyBtZW1vaXphdGlvbiB2aWEgZGVwcylcblxuICAgIHZhciB2aXNpYmxlQ29sdW1ucyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlZHVjZUhvb2tzKGdldEhvb2tzKCkudmlzaWJsZUNvbHVtbnMsIGFsbENvbHVtbnMsIHtcbiAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICAgIH0pLm1hcChmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZGVjb3JhdGVDb2x1bW4oZCwgZGVmYXVsdENvbHVtbik7XG4gICAgICB9KTtcbiAgICB9LCBbZ2V0SG9va3MsIGFsbENvbHVtbnMsIGdldEluc3RhbmNlLCBkZWZhdWx0Q29sdW1uXS5jb25jYXQocmVkdWNlSG9va3MoZ2V0SG9va3MoKS52aXNpYmxlQ29sdW1uc0RlcHMsIFtdLCB7XG4gICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgIH0pKSk7IC8vIENvbWJpbmUgbmV3IHZpc2libGUgY29sdW1ucyB3aXRoIGFsbCBjb2x1bW5zXG5cbiAgICBhbGxDb2x1bW5zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY29sdW1ucyA9IFtdLmNvbmNhdCh2aXNpYmxlQ29sdW1ucyk7XG4gICAgICBhbGxDb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICBpZiAoIWNvbHVtbnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkLmlkID09PSBjb2x1bW4uaWQ7XG4gICAgICAgIH0pKSB7XG4gICAgICAgICAgY29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgfSwgW2FsbENvbHVtbnMsIHZpc2libGVDb2x1bW5zXSk7XG4gICAgZ2V0SW5zdGFuY2UoKS5hbGxDb2x1bW5zID0gYWxsQ29sdW1ucztcblxuICAgIHtcbiAgICAgIHZhciBkdXBsaWNhdGVDb2x1bW5zID0gYWxsQ29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbiwgaSkge1xuICAgICAgICByZXR1cm4gYWxsQ29sdW1ucy5maW5kSW5kZXgoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZC5pZCA9PT0gY29sdW1uLmlkO1xuICAgICAgICB9KSAhPT0gaTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZHVwbGljYXRlQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGFsbENvbHVtbnMpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEdXBsaWNhdGUgY29sdW1ucyB3ZXJlIGZvdW5kIHdpdGggaWRzOiBcXFwiXCIgKyBkdXBsaWNhdGVDb2x1bW5zLm1hcChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkLmlkO1xuICAgICAgICB9KS5qb2luKCcsICcpICsgXCJcXFwiIGluIHRoZSBjb2x1bW5zIGFycmF5IGFib3ZlXCIpO1xuICAgICAgfVxuICAgIH0gLy8gTWFrZSB0aGUgaGVhZGVyR3JvdXBzXG5cblxuICAgIHZhciBoZWFkZXJHcm91cHMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZWR1Y2VIb29rcyhnZXRIb29rcygpLmhlYWRlckdyb3VwcywgbWFrZUhlYWRlckdyb3Vwcyh2aXNpYmxlQ29sdW1ucywgZGVmYXVsdENvbHVtbiksIGdldEluc3RhbmNlKCkpO1xuICAgIH0sIFtnZXRIb29rcywgdmlzaWJsZUNvbHVtbnMsIGRlZmF1bHRDb2x1bW4sIGdldEluc3RhbmNlXS5jb25jYXQocmVkdWNlSG9va3MoZ2V0SG9va3MoKS5oZWFkZXJHcm91cHNEZXBzLCBbXSwge1xuICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICB9KSkpO1xuICAgIGdldEluc3RhbmNlKCkuaGVhZGVyR3JvdXBzID0gaGVhZGVyR3JvdXBzOyAvLyBHZXQgdGhlIGZpcnN0IGxldmVsIG9mIGhlYWRlcnNcblxuICAgIHZhciBoZWFkZXJzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaGVhZGVyR3JvdXBzLmxlbmd0aCA/IGhlYWRlckdyb3Vwc1swXS5oZWFkZXJzIDogW107XG4gICAgfSwgW2hlYWRlckdyb3Vwc10pO1xuICAgIGdldEluc3RhbmNlKCkuaGVhZGVycyA9IGhlYWRlcnM7IC8vIFByb3ZpZGUgYSBmbGF0IGhlYWRlciBsaXN0IGZvciB1dGlsaXRpZXNcblxuICAgIGdldEluc3RhbmNlKCkuZmxhdEhlYWRlcnMgPSBoZWFkZXJHcm91cHMucmVkdWNlKGZ1bmN0aW9uIChhbGwsIGhlYWRlckdyb3VwKSB7XG4gICAgICByZXR1cm4gW10uY29uY2F0KGFsbCwgaGVhZGVyR3JvdXAuaGVhZGVycyk7XG4gICAgfSwgW10pO1xuICAgIGxvb3BIb29rcyhnZXRIb29rcygpLnVzZUluc3RhbmNlQmVmb3JlRGltZW5zaW9ucywgZ2V0SW5zdGFuY2UoKSk7IC8vIEZpbHRlciBjb2x1bW5zIGRvd24gdG8gdmlzaWJsZSBvbmVzXG5cbiAgICB2YXIgdmlzaWJsZUNvbHVtbnNEZXAgPSB2aXNpYmxlQ29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcbiAgICAgIHJldHVybiBkLmlzVmlzaWJsZTtcbiAgICB9KS5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgIHJldHVybiBkLmlkO1xuICAgIH0pLnNvcnQoKS5qb2luKCdfJyk7XG4gICAgdmlzaWJsZUNvbHVtbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB2aXNpYmxlQ29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuaXNWaXNpYmxlO1xuICAgICAgfSk7XG4gICAgfSwgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICAgIFt2aXNpYmxlQ29sdW1ucywgdmlzaWJsZUNvbHVtbnNEZXBdKTtcbiAgICBnZXRJbnN0YW5jZSgpLnZpc2libGVDb2x1bW5zID0gdmlzaWJsZUNvbHVtbnM7IC8vIEhlYWRlciBWaXNpYmlsaXR5IGlzIG5lZWRlZCBieSB0aGlzIHBvaW50XG5cbiAgICB2YXIgX2NhbGN1bGF0ZUhlYWRlcldpZHRoID0gY2FsY3VsYXRlSGVhZGVyV2lkdGhzKGhlYWRlcnMpLFxuICAgICAgICB0b3RhbENvbHVtbnNNaW5XaWR0aCA9IF9jYWxjdWxhdGVIZWFkZXJXaWR0aFswXSxcbiAgICAgICAgdG90YWxDb2x1bW5zV2lkdGggPSBfY2FsY3VsYXRlSGVhZGVyV2lkdGhbMV0sXG4gICAgICAgIHRvdGFsQ29sdW1uc01heFdpZHRoID0gX2NhbGN1bGF0ZUhlYWRlcldpZHRoWzJdO1xuXG4gICAgZ2V0SW5zdGFuY2UoKS50b3RhbENvbHVtbnNNaW5XaWR0aCA9IHRvdGFsQ29sdW1uc01pbldpZHRoO1xuICAgIGdldEluc3RhbmNlKCkudG90YWxDb2x1bW5zV2lkdGggPSB0b3RhbENvbHVtbnNXaWR0aDtcbiAgICBnZXRJbnN0YW5jZSgpLnRvdGFsQ29sdW1uc01heFdpZHRoID0gdG90YWxDb2x1bW5zTWF4V2lkdGg7XG4gICAgbG9vcEhvb2tzKGdldEhvb2tzKCkudXNlSW5zdGFuY2UsIGdldEluc3RhbmNlKCkpIC8vIEVhY2ggbWF0ZXJpYWxpemVkIGhlYWRlciBuZWVkcyB0byBiZSBhc3NpZ25lZCBhIHJlbmRlciBmdW5jdGlvbiBhbmQgb3RoZXJcbiAgICAvLyBwcm9wIGdldHRlciBwcm9wZXJ0aWVzIGhlcmUuXG4gICAgO1xuICAgIFtdLmNvbmNhdChnZXRJbnN0YW5jZSgpLmZsYXRIZWFkZXJzLCBnZXRJbnN0YW5jZSgpLmFsbENvbHVtbnMpLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgLy8gR2l2ZSBjb2x1bW5zL2hlYWRlcnMgcmVuZGVyaW5nIHBvd2VyXG4gICAgICBjb2x1bW4ucmVuZGVyID0gbWFrZVJlbmRlcmVyKGdldEluc3RhbmNlKCksIGNvbHVtbik7IC8vIEdpdmUgY29sdW1ucy9oZWFkZXJzIGEgZGVmYXVsdCBnZXRIZWFkZXJQcm9wc1xuXG4gICAgICBjb2x1bW4uZ2V0SGVhZGVyUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldEhlYWRlclByb3BzLCB7XG4gICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpLFxuICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgfSk7IC8vIEdpdmUgY29sdW1ucy9oZWFkZXJzIGEgZGVmYXVsdCBnZXRGb290ZXJQcm9wc1xuXG4gICAgICBjb2x1bW4uZ2V0Rm9vdGVyUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldEZvb3RlclByb3BzLCB7XG4gICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpLFxuICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgZ2V0SW5zdGFuY2UoKS5oZWFkZXJHcm91cHMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBoZWFkZXJHcm91cHMuZmlsdGVyKGZ1bmN0aW9uIChoZWFkZXJHcm91cCwgaSkge1xuICAgICAgICAvLyBGaWx0ZXIgb3V0IGFueSBoZWFkZXJzIGFuZCBoZWFkZXJHcm91cHMgdGhhdCBkb24ndCBoYXZlIHZpc2libGUgY29sdW1uc1xuICAgICAgICBoZWFkZXJHcm91cC5oZWFkZXJzID0gaGVhZGVyR3JvdXAuaGVhZGVycy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgIHZhciByZWN1cnNlID0gZnVuY3Rpb24gcmVjdXJzZShoZWFkZXJzKSB7XG4gICAgICAgICAgICByZXR1cm4gaGVhZGVycy5maWx0ZXIoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgICAgICBpZiAoY29sdW1uLmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjdXJzZShjb2x1bW4uaGVhZGVycyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gY29sdW1uLmlzVmlzaWJsZTtcbiAgICAgICAgICAgIH0pLmxlbmd0aDtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKGNvbHVtbi5oZWFkZXJzKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVjdXJzZShjb2x1bW4uaGVhZGVycyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbHVtbi5pc1Zpc2libGU7XG4gICAgICAgIH0pOyAvLyBHaXZlIGhlYWRlckdyb3VwcyBnZXRSb3dQcm9wc1xuXG4gICAgICAgIGlmIChoZWFkZXJHcm91cC5oZWFkZXJzLmxlbmd0aCkge1xuICAgICAgICAgIGhlYWRlckdyb3VwLmdldEhlYWRlckdyb3VwUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldEhlYWRlckdyb3VwUHJvcHMsIHtcbiAgICAgICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpLFxuICAgICAgICAgICAgaGVhZGVyR3JvdXA6IGhlYWRlckdyb3VwLFxuICAgICAgICAgICAgaW5kZXg6IGlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBoZWFkZXJHcm91cC5nZXRGb290ZXJHcm91cFByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRGb290ZXJHcm91cFByb3BzLCB7XG4gICAgICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgICAgIGhlYWRlckdyb3VwOiBoZWFkZXJHcm91cCxcbiAgICAgICAgICAgIGluZGV4OiBpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9LCBbaGVhZGVyR3JvdXBzLCBnZXRJbnN0YW5jZSwgZ2V0SG9va3NdKTtcbiAgICBnZXRJbnN0YW5jZSgpLmZvb3Rlckdyb3VwcyA9IFtdLmNvbmNhdChnZXRJbnN0YW5jZSgpLmhlYWRlckdyb3VwcykucmV2ZXJzZSgpOyAvLyBUaGUgcHJlcGFyZVJvdyBmdW5jdGlvbiBpcyBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSBhbmQgTVVTVCBiZSBjYWxsZWQgb25cbiAgICAvLyBhbnkgcm93cyB0aGUgdXNlciB3aXNoZXMgdG8gYmUgZGlzcGxheWVkLlxuXG4gICAgZ2V0SW5zdGFuY2UoKS5wcmVwYXJlUm93ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHJvdykge1xuICAgICAgcm93LmdldFJvd1Byb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRSb3dQcm9wcywge1xuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKSxcbiAgICAgICAgcm93OiByb3dcbiAgICAgIH0pOyAvLyBCdWlsZCB0aGUgdmlzaWJsZSBjZWxscyBmb3IgZWFjaCByb3dcblxuICAgICAgcm93LmFsbENlbGxzID0gYWxsQ29sdW1ucy5tYXAoZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICB2YXIgdmFsdWUgPSByb3cudmFsdWVzW2NvbHVtbi5pZF07XG4gICAgICAgIHZhciBjZWxsID0ge1xuICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgIHJvdzogcm93LFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9OyAvLyBHaXZlIGVhY2ggY2VsbCBhIGdldENlbGxQcm9wcyBiYXNlXG5cbiAgICAgICAgY2VsbC5nZXRDZWxsUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldENlbGxQcm9wcywge1xuICAgICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpLFxuICAgICAgICAgIGNlbGw6IGNlbGxcbiAgICAgICAgfSk7IC8vIEdpdmUgZWFjaCBjZWxsIGEgcmVuZGVyZXIgZnVuY3Rpb24gKHN1cHBvcnRzIG11bHRpcGxlIHJlbmRlcmVycylcblxuICAgICAgICBjZWxsLnJlbmRlciA9IG1ha2VSZW5kZXJlcihnZXRJbnN0YW5jZSgpLCBjb2x1bW4sIHtcbiAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICBjZWxsOiBjZWxsLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNlbGw7XG4gICAgICB9KTtcbiAgICAgIHJvdy5jZWxscyA9IHZpc2libGVDb2x1bW5zLm1hcChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiByb3cuYWxsQ2VsbHMuZmluZChmdW5jdGlvbiAoY2VsbCkge1xuICAgICAgICAgIHJldHVybiBjZWxsLmNvbHVtbi5pZCA9PT0gY29sdW1uLmlkO1xuICAgICAgICB9KTtcbiAgICAgIH0pOyAvLyBuZWVkIHRvIGFwcGx5IGFueSByb3cgc3BlY2lmaWMgaG9va3MgKHVzZUV4cGFuZGVkIHJlcXVpcmVzIHRoaXMpXG5cbiAgICAgIGxvb3BIb29rcyhnZXRIb29rcygpLnByZXBhcmVSb3csIHJvdywge1xuICAgICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgICAgfSk7XG4gICAgfSwgW2dldEhvb2tzLCBnZXRJbnN0YW5jZSwgYWxsQ29sdW1ucywgdmlzaWJsZUNvbHVtbnNdKTtcbiAgICBnZXRJbnN0YW5jZSgpLmdldFRhYmxlUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFRhYmxlUHJvcHMsIHtcbiAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgfSk7XG4gICAgZ2V0SW5zdGFuY2UoKS5nZXRUYWJsZUJvZHlQcm9wcyA9IG1ha2VQcm9wR2V0dGVyKGdldEhvb2tzKCkuZ2V0VGFibGVCb2R5UHJvcHMsIHtcbiAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgfSk7XG4gICAgbG9vcEhvb2tzKGdldEhvb2tzKCkudXNlRmluYWxJbnN0YW5jZSwgZ2V0SW5zdGFuY2UoKSk7XG4gICAgcmV0dXJuIGdldEluc3RhbmNlKCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gY2FsY3VsYXRlSGVhZGVyV2lkdGhzKGhlYWRlcnMsIGxlZnQpIHtcbiAgICBpZiAobGVmdCA9PT0gdm9pZCAwKSB7XG4gICAgICBsZWZ0ID0gMDtcbiAgICB9XG5cbiAgICB2YXIgc3VtVG90YWxNaW5XaWR0aCA9IDA7XG4gICAgdmFyIHN1bVRvdGFsV2lkdGggPSAwO1xuICAgIHZhciBzdW1Ub3RhbE1heFdpZHRoID0gMDtcbiAgICB2YXIgc3VtVG90YWxGbGV4V2lkdGggPSAwO1xuICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAoaGVhZGVyKSB7XG4gICAgICB2YXIgc3ViSGVhZGVycyA9IGhlYWRlci5oZWFkZXJzO1xuICAgICAgaGVhZGVyLnRvdGFsTGVmdCA9IGxlZnQ7XG5cbiAgICAgIGlmIChzdWJIZWFkZXJzICYmIHN1YkhlYWRlcnMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBfY2FsY3VsYXRlSGVhZGVyV2lkdGgyID0gY2FsY3VsYXRlSGVhZGVyV2lkdGhzKHN1YkhlYWRlcnMsIGxlZnQpLFxuICAgICAgICAgICAgdG90YWxNaW5XaWR0aCA9IF9jYWxjdWxhdGVIZWFkZXJXaWR0aDJbMF0sXG4gICAgICAgICAgICB0b3RhbFdpZHRoID0gX2NhbGN1bGF0ZUhlYWRlcldpZHRoMlsxXSxcbiAgICAgICAgICAgIHRvdGFsTWF4V2lkdGggPSBfY2FsY3VsYXRlSGVhZGVyV2lkdGgyWzJdLFxuICAgICAgICAgICAgdG90YWxGbGV4V2lkdGggPSBfY2FsY3VsYXRlSGVhZGVyV2lkdGgyWzNdO1xuXG4gICAgICAgIGhlYWRlci50b3RhbE1pbldpZHRoID0gdG90YWxNaW5XaWR0aDtcbiAgICAgICAgaGVhZGVyLnRvdGFsV2lkdGggPSB0b3RhbFdpZHRoO1xuICAgICAgICBoZWFkZXIudG90YWxNYXhXaWR0aCA9IHRvdGFsTWF4V2lkdGg7XG4gICAgICAgIGhlYWRlci50b3RhbEZsZXhXaWR0aCA9IHRvdGFsRmxleFdpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVhZGVyLnRvdGFsTWluV2lkdGggPSBoZWFkZXIubWluV2lkdGg7XG4gICAgICAgIGhlYWRlci50b3RhbFdpZHRoID0gTWF0aC5taW4oTWF0aC5tYXgoaGVhZGVyLm1pbldpZHRoLCBoZWFkZXIud2lkdGgpLCBoZWFkZXIubWF4V2lkdGgpO1xuICAgICAgICBoZWFkZXIudG90YWxNYXhXaWR0aCA9IGhlYWRlci5tYXhXaWR0aDtcbiAgICAgICAgaGVhZGVyLnRvdGFsRmxleFdpZHRoID0gaGVhZGVyLmNhblJlc2l6ZSA/IGhlYWRlci50b3RhbFdpZHRoIDogMDtcbiAgICAgIH1cblxuICAgICAgaWYgKGhlYWRlci5pc1Zpc2libGUpIHtcbiAgICAgICAgbGVmdCArPSBoZWFkZXIudG90YWxXaWR0aDtcbiAgICAgICAgc3VtVG90YWxNaW5XaWR0aCArPSBoZWFkZXIudG90YWxNaW5XaWR0aDtcbiAgICAgICAgc3VtVG90YWxXaWR0aCArPSBoZWFkZXIudG90YWxXaWR0aDtcbiAgICAgICAgc3VtVG90YWxNYXhXaWR0aCArPSBoZWFkZXIudG90YWxNYXhXaWR0aDtcbiAgICAgICAgc3VtVG90YWxGbGV4V2lkdGggKz0gaGVhZGVyLnRvdGFsRmxleFdpZHRoO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBbc3VtVG90YWxNaW5XaWR0aCwgc3VtVG90YWxXaWR0aCwgc3VtVG90YWxNYXhXaWR0aCwgc3VtVG90YWxGbGV4V2lkdGhdO1xuICB9XG5cbiAgZnVuY3Rpb24gYWNjZXNzUm93c0ZvckNvbHVtbihfcmVmKSB7XG4gICAgdmFyIGRhdGEgPSBfcmVmLmRhdGEsXG4gICAgICAgIHJvd3MgPSBfcmVmLnJvd3MsXG4gICAgICAgIGZsYXRSb3dzID0gX3JlZi5mbGF0Um93cyxcbiAgICAgICAgcm93c0J5SWQgPSBfcmVmLnJvd3NCeUlkLFxuICAgICAgICBjb2x1bW4gPSBfcmVmLmNvbHVtbixcbiAgICAgICAgZ2V0Um93SWQgPSBfcmVmLmdldFJvd0lkLFxuICAgICAgICBnZXRTdWJSb3dzID0gX3JlZi5nZXRTdWJSb3dzLFxuICAgICAgICBhY2Nlc3NWYWx1ZUhvb2tzID0gX3JlZi5hY2Nlc3NWYWx1ZUhvb2tzLFxuICAgICAgICBnZXRJbnN0YW5jZSA9IF9yZWYuZ2V0SW5zdGFuY2U7XG5cbiAgICAvLyBBY2Nlc3MgdGhlIHJvdydzIGRhdGEgY29sdW1uLWJ5LWNvbHVtblxuICAgIC8vIFdlIGRvIGl0IHRoaXMgd2F5IHNvIHdlIGNhbiBpbmNyZW1lbnRhbGx5IGFkZCBtYXRlcmlhbGl6ZWRcbiAgICAvLyBjb2x1bW5zIGFmdGVyIHRoZSBmaXJzdCBwYXNzIGFuZCBhdm9pZCBleGNlc3NpdmUgbG9vcGluZ1xuICAgIHZhciBhY2Nlc3NSb3cgPSBmdW5jdGlvbiBhY2Nlc3NSb3cob3JpZ2luYWxSb3csIHJvd0luZGV4LCBkZXB0aCwgcGFyZW50LCBwYXJlbnRSb3dzKSB7XG4gICAgICBpZiAoZGVwdGggPT09IHZvaWQgMCkge1xuICAgICAgICBkZXB0aCA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIEtlZXAgdGhlIG9yaWdpbmFsIHJlZmVyZW5jZSBhcm91bmRcbiAgICAgIHZhciBvcmlnaW5hbCA9IG9yaWdpbmFsUm93O1xuICAgICAgdmFyIGlkID0gZ2V0Um93SWQob3JpZ2luYWxSb3csIHJvd0luZGV4LCBwYXJlbnQpO1xuICAgICAgdmFyIHJvdyA9IHJvd3NCeUlkW2lkXTsgLy8gSWYgdGhlIHJvdyBoYXNuJ3QgYmVlbiBjcmVhdGVkLCBsZXQncyBtYWtlIGl0XG5cbiAgICAgIGlmICghcm93KSB7XG4gICAgICAgIHJvdyA9IHtcbiAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgb3JpZ2luYWw6IG9yaWdpbmFsLFxuICAgICAgICAgIGluZGV4OiByb3dJbmRleCxcbiAgICAgICAgICBkZXB0aDogZGVwdGgsXG4gICAgICAgICAgY2VsbHM6IFt7fV0gLy8gVGhpcyBpcyBhIGR1bW15IGNlbGxcblxuICAgICAgICB9OyAvLyBPdmVycmlkZSBjb21tb24gYXJyYXkgZnVuY3Rpb25zIChhbmQgdGhlIGR1bW15IGNlbGwncyBnZXRDZWxsUHJvcHMgZnVuY3Rpb24pXG4gICAgICAgIC8vIHRvIHNob3cgYW4gZXJyb3IgaWYgaXQgaXMgYWNjZXNzZWQgd2l0aG91dCBjYWxsaW5nIHByZXBhcmVSb3dcblxuICAgICAgICByb3cuY2VsbHMubWFwID0gdW5wcmVwYXJlZEFjY2Vzc1dhcm5pbmc7XG4gICAgICAgIHJvdy5jZWxscy5maWx0ZXIgPSB1bnByZXBhcmVkQWNjZXNzV2FybmluZztcbiAgICAgICAgcm93LmNlbGxzLmZvckVhY2ggPSB1bnByZXBhcmVkQWNjZXNzV2FybmluZztcbiAgICAgICAgcm93LmNlbGxzWzBdLmdldENlbGxQcm9wcyA9IHVucHJlcGFyZWRBY2Nlc3NXYXJuaW5nOyAvLyBDcmVhdGUgdGhlIGNlbGxzIGFuZCB2YWx1ZXNcblxuICAgICAgICByb3cudmFsdWVzID0ge307IC8vIFB1c2ggdGhpcyByb3cgaW50byB0aGUgcGFyZW50Um93cyBhcnJheVxuXG4gICAgICAgIHBhcmVudFJvd3MucHVzaChyb3cpOyAvLyBLZWVwIHRyYWNrIG9mIGV2ZXJ5IHJvdyBpbiBhIGZsYXQgYXJyYXlcblxuICAgICAgICBmbGF0Um93cy5wdXNoKHJvdyk7IC8vIEFsc28ga2VlcCB0cmFjayBvZiBldmVyeSByb3cgYnkgaXRzIElEXG5cbiAgICAgICAgcm93c0J5SWRbaWRdID0gcm93OyAvLyBHZXQgdGhlIG9yaWdpbmFsIHN1YnJvd3NcblxuICAgICAgICByb3cub3JpZ2luYWxTdWJSb3dzID0gZ2V0U3ViUm93cyhvcmlnaW5hbFJvdywgcm93SW5kZXgpOyAvLyBUaGVuIHJlY3Vyc2l2ZWx5IGFjY2VzcyB0aGVtXG5cbiAgICAgICAgaWYgKHJvdy5vcmlnaW5hbFN1YlJvd3MpIHtcbiAgICAgICAgICB2YXIgc3ViUm93cyA9IFtdO1xuICAgICAgICAgIHJvdy5vcmlnaW5hbFN1YlJvd3MuZm9yRWFjaChmdW5jdGlvbiAoZCwgaSkge1xuICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc1JvdyhkLCBpLCBkZXB0aCArIDEsIHJvdywgc3ViUm93cyk7XG4gICAgICAgICAgfSk7IC8vIEtlZXAgdGhlIG5ldyBzdWJSb3dzIGFycmF5IG9uIHRoZSByb3dcblxuICAgICAgICAgIHJvdy5zdWJSb3dzID0gc3ViUm93cztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyb3cuc3ViUm93cykge1xuICAgICAgICAvLyBJZiB0aGUgcm93IGV4aXN0cywgdGhlbiBpdCdzIGFscmVhZHkgYmVlbiBhY2Nlc3NlZFxuICAgICAgICAvLyBLZWVwIHJlY3Vyc2luZywgYnV0IGRvbid0IHdvcnJ5IGFib3V0IHBhc3NpbmcgdGhlXG4gICAgICAgIC8vIGFjY3VtbGF0b3IgYXJyYXkgKHRob3NlIHJvd3MgYWxyZWFkeSBleGlzdClcbiAgICAgICAgcm93Lm9yaWdpbmFsU3ViUm93cy5mb3JFYWNoKGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgICAgICAgcmV0dXJuIGFjY2Vzc1JvdyhkLCBpLCBkZXB0aCArIDEsIHJvdyk7XG4gICAgICAgIH0pO1xuICAgICAgfSAvLyBJZiB0aGUgY29sdW1uIGhhcyBhbiBhY2Nlc3NvciwgdXNlIGl0IHRvIGdldCBhIHZhbHVlXG5cblxuICAgICAgaWYgKGNvbHVtbi5hY2Nlc3Nvcikge1xuICAgICAgICByb3cudmFsdWVzW2NvbHVtbi5pZF0gPSBjb2x1bW4uYWNjZXNzb3Iob3JpZ2luYWxSb3csIHJvd0luZGV4LCByb3csIHBhcmVudFJvd3MsIGRhdGEpO1xuICAgICAgfSAvLyBBbGxvdyBwbHVnaW5zIHRvIG1hbmlwdWxhdGUgdGhlIGNvbHVtbiB2YWx1ZVxuXG5cbiAgICAgIHJvdy52YWx1ZXNbY29sdW1uLmlkXSA9IHJlZHVjZUhvb2tzKGFjY2Vzc1ZhbHVlSG9va3MsIHJvdy52YWx1ZXNbY29sdW1uLmlkXSwge1xuICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpXG4gICAgICB9LCB0cnVlKTtcbiAgICB9O1xuXG4gICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChvcmlnaW5hbFJvdywgcm93SW5kZXgpIHtcbiAgICAgIHJldHVybiBhY2Nlc3NSb3cob3JpZ2luYWxSb3csIHJvd0luZGV4LCAwLCB1bmRlZmluZWQsIHJvd3MpO1xuICAgIH0pO1xuICB9XG5cbiAgYWN0aW9ucy5yZXNldEV4cGFuZGVkID0gJ3Jlc2V0RXhwYW5kZWQnO1xuICBhY3Rpb25zLnRvZ2dsZVJvd0V4cGFuZGVkID0gJ3RvZ2dsZVJvd0V4cGFuZGVkJztcbiAgYWN0aW9ucy50b2dnbGVBbGxSb3dzRXhwYW5kZWQgPSAndG9nZ2xlQWxsUm93c0V4cGFuZGVkJztcbiAgdmFyIHVzZUV4cGFuZGVkID0gZnVuY3Rpb24gdXNlRXhwYW5kZWQoaG9va3MpIHtcbiAgICBob29rcy5nZXRUb2dnbGVBbGxSb3dzRXhwYW5kZWRQcm9wcyA9IFtkZWZhdWx0R2V0VG9nZ2xlQWxsUm93c0V4cGFuZGVkUHJvcHNdO1xuICAgIGhvb2tzLmdldFRvZ2dsZVJvd0V4cGFuZGVkUHJvcHMgPSBbZGVmYXVsdEdldFRvZ2dsZVJvd0V4cGFuZGVkUHJvcHNdO1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyJDEpO1xuICAgIGhvb2tzLnVzZUluc3RhbmNlLnB1c2godXNlSW5zdGFuY2UkMSk7XG4gICAgaG9va3MucHJlcGFyZVJvdy5wdXNoKHByZXBhcmVSb3cpO1xuICB9O1xuICB1c2VFeHBhbmRlZC5wbHVnaW5OYW1lID0gJ3VzZUV4cGFuZGVkJztcblxuICB2YXIgZGVmYXVsdEdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZFByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZFByb3BzKHByb3BzLCBfcmVmKSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUpIHtcbiAgICAgICAgaW5zdGFuY2UudG9nZ2xlQWxsUm93c0V4cGFuZGVkKCk7XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgIH0sXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBBbGwgUm93cyBFeHBhbmRlZCdcbiAgICB9XTtcbiAgfTtcblxuICB2YXIgZGVmYXVsdEdldFRvZ2dsZVJvd0V4cGFuZGVkUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0VG9nZ2xlUm93RXhwYW5kZWRQcm9wcyhwcm9wcywgX3JlZjIpIHtcbiAgICB2YXIgcm93ID0gX3JlZjIucm93O1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soKSB7XG4gICAgICAgIHJvdy50b2dnbGVSb3dFeHBhbmRlZCgpO1xuICAgICAgfSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICB9LFxuICAgICAgdGl0bGU6ICdUb2dnbGUgUm93IEV4cGFuZGVkJ1xuICAgIH1dO1xuICB9OyAvLyBSZWR1Y2VyXG5cblxuICBmdW5jdGlvbiByZWR1Y2VyJDEoc3RhdGUsIGFjdGlvbiwgcHJldmlvdXNTdGF0ZSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuaW5pdCkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgZXhwYW5kZWQ6IHt9XG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0RXhwYW5kZWQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgZXhwYW5kZWQ6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5leHBhbmRlZCB8fCB7fVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnRvZ2dsZUFsbFJvd3NFeHBhbmRlZCkge1xuICAgICAgdmFyIHZhbHVlID0gYWN0aW9uLnZhbHVlO1xuICAgICAgdmFyIGlzQWxsUm93c0V4cGFuZGVkID0gaW5zdGFuY2UuaXNBbGxSb3dzRXhwYW5kZWQsXG4gICAgICAgICAgcm93c0J5SWQgPSBpbnN0YW5jZS5yb3dzQnlJZDtcbiAgICAgIHZhciBleHBhbmRBbGwgPSB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnID8gdmFsdWUgOiAhaXNBbGxSb3dzRXhwYW5kZWQ7XG5cbiAgICAgIGlmIChleHBhbmRBbGwpIHtcbiAgICAgICAgdmFyIGV4cGFuZGVkID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKHJvd3NCeUlkKS5mb3JFYWNoKGZ1bmN0aW9uIChyb3dJZCkge1xuICAgICAgICAgIGV4cGFuZGVkW3Jvd0lkXSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGV4cGFuZGVkOiB7fVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnRvZ2dsZVJvd0V4cGFuZGVkKSB7XG4gICAgICB2YXIgaWQgPSBhY3Rpb24uaWQsXG4gICAgICAgICAgc2V0RXhwYW5kZWQgPSBhY3Rpb24udmFsdWU7XG4gICAgICB2YXIgZXhpc3RzID0gc3RhdGUuZXhwYW5kZWRbaWRdO1xuICAgICAgdmFyIHNob3VsZEV4aXN0ID0gdHlwZW9mIHNldEV4cGFuZGVkICE9PSAndW5kZWZpbmVkJyA/IHNldEV4cGFuZGVkIDogIWV4aXN0cztcblxuICAgICAgaWYgKCFleGlzdHMgJiYgc2hvdWxkRXhpc3QpIHtcbiAgICAgICAgdmFyIF9leHRlbmRzMjtcblxuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgICAgZXhwYW5kZWQ6IF9leHRlbmRzKHt9LCBzdGF0ZS5leHBhbmRlZCwgKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJbaWRdID0gdHJ1ZSwgX2V4dGVuZHMyKSlcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGV4aXN0cyAmJiAhc2hvdWxkRXhpc3QpIHtcbiAgICAgICAgdmFyIF9zdGF0ZSRleHBhbmRlZCA9IHN0YXRlLmV4cGFuZGVkLFxuICAgICAgICAgICAgXyA9IF9zdGF0ZSRleHBhbmRlZFtpZF0sXG4gICAgICAgICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3N0YXRlJGV4cGFuZGVkLCBbaWRdLm1hcChfdG9Qcm9wZXJ0eUtleSkpO1xuXG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgICBleHBhbmRlZDogcmVzdFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1c2VJbnN0YW5jZSQxKGluc3RhbmNlKSB7XG4gICAgdmFyIGRhdGEgPSBpbnN0YW5jZS5kYXRhLFxuICAgICAgICByb3dzID0gaW5zdGFuY2Uucm93cyxcbiAgICAgICAgcm93c0J5SWQgPSBpbnN0YW5jZS5yb3dzQnlJZCxcbiAgICAgICAgX2luc3RhbmNlJG1hbnVhbEV4cGFuID0gaW5zdGFuY2UubWFudWFsRXhwYW5kZWRLZXksXG4gICAgICAgIG1hbnVhbEV4cGFuZGVkS2V5ID0gX2luc3RhbmNlJG1hbnVhbEV4cGFuID09PSB2b2lkIDAgPyAnZXhwYW5kZWQnIDogX2luc3RhbmNlJG1hbnVhbEV4cGFuLFxuICAgICAgICBfaW5zdGFuY2UkcGFnaW5hdGVFeHAgPSBpbnN0YW5jZS5wYWdpbmF0ZUV4cGFuZGVkUm93cyxcbiAgICAgICAgcGFnaW5hdGVFeHBhbmRlZFJvd3MgPSBfaW5zdGFuY2UkcGFnaW5hdGVFeHAgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkcGFnaW5hdGVFeHAsXG4gICAgICAgIF9pbnN0YW5jZSRleHBhbmRTdWJSbyA9IGluc3RhbmNlLmV4cGFuZFN1YlJvd3MsXG4gICAgICAgIGV4cGFuZFN1YlJvd3MgPSBfaW5zdGFuY2UkZXhwYW5kU3ViUm8gPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkZXhwYW5kU3ViUm8sXG4gICAgICAgIF9pbnN0YW5jZSRhdXRvUmVzZXRFeCA9IGluc3RhbmNlLmF1dG9SZXNldEV4cGFuZGVkLFxuICAgICAgICBhdXRvUmVzZXRFeHBhbmRlZCA9IF9pbnN0YW5jZSRhdXRvUmVzZXRFeCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9pbnN0YW5jZSRhdXRvUmVzZXRFeCxcbiAgICAgICAgZ2V0SG9va3MgPSBpbnN0YW5jZS5nZXRIb29rcyxcbiAgICAgICAgcGx1Z2lucyA9IGluc3RhbmNlLnBsdWdpbnMsXG4gICAgICAgIGV4cGFuZGVkID0gaW5zdGFuY2Uuc3RhdGUuZXhwYW5kZWQsXG4gICAgICAgIGRpc3BhdGNoID0gaW5zdGFuY2UuZGlzcGF0Y2g7XG4gICAgZW5zdXJlUGx1Z2luT3JkZXIocGx1Z2lucywgWyd1c2VTb3J0QnknLCAndXNlR3JvdXBCeScsICd1c2VQaXZvdENvbHVtbnMnLCAndXNlR2xvYmFsRmlsdGVyJ10sICd1c2VFeHBhbmRlZCcpO1xuICAgIHZhciBnZXRBdXRvUmVzZXRFeHBhbmRlZCA9IHVzZUdldExhdGVzdChhdXRvUmVzZXRFeHBhbmRlZCk7XG4gICAgdmFyIGlzQWxsUm93c0V4cGFuZGVkID0gQm9vbGVhbihPYmplY3Qua2V5cyhyb3dzQnlJZCkubGVuZ3RoICYmIE9iamVjdC5rZXlzKGV4cGFuZGVkKS5sZW5ndGgpO1xuXG4gICAgaWYgKGlzQWxsUm93c0V4cGFuZGVkKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMocm93c0J5SWQpLnNvbWUoZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHJldHVybiAhZXhwYW5kZWRbaWRdO1xuICAgICAgfSkpIHtcbiAgICAgICAgaXNBbGxSb3dzRXhwYW5kZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IC8vIEJ5cGFzcyBhbnkgZWZmZWN0cyBmcm9tIGZpcmluZyB3aGVuIHRoaXMgY2hhbmdlc1xuXG5cbiAgICB1c2VNb3VudGVkTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChnZXRBdXRvUmVzZXRFeHBhbmRlZCgpKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLnJlc2V0RXhwYW5kZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgW2Rpc3BhdGNoLCBkYXRhXSk7XG4gICAgdmFyIHRvZ2dsZVJvd0V4cGFuZGVkID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGlkLCB2YWx1ZSkge1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLnRvZ2dsZVJvd0V4cGFuZGVkLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIHRvZ2dsZUFsbFJvd3NFeHBhbmRlZCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy50b2dnbGVBbGxSb3dzRXhwYW5kZWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIGV4cGFuZGVkUm93cyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHBhZ2luYXRlRXhwYW5kZWRSb3dzKSB7XG4gICAgICAgIHJldHVybiBleHBhbmRSb3dzKHJvd3MsIHtcbiAgICAgICAgICBtYW51YWxFeHBhbmRlZEtleTogbWFudWFsRXhwYW5kZWRLZXksXG4gICAgICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgICAgICAgIGV4cGFuZFN1YlJvd3M6IGV4cGFuZFN1YlJvd3NcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByb3dzO1xuICAgIH0sIFtwYWdpbmF0ZUV4cGFuZGVkUm93cywgcm93cywgbWFudWFsRXhwYW5kZWRLZXksIGV4cGFuZGVkLCBleHBhbmRTdWJSb3dzXSk7XG4gICAgdmFyIGV4cGFuZGVkRGVwdGggPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmaW5kRXhwYW5kZWREZXB0aChleHBhbmRlZCk7XG4gICAgfSwgW2V4cGFuZGVkXSk7XG4gICAgdmFyIGdldEluc3RhbmNlID0gdXNlR2V0TGF0ZXN0KGluc3RhbmNlKTtcbiAgICB2YXIgZ2V0VG9nZ2xlQWxsUm93c0V4cGFuZGVkUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZFByb3BzLCB7XG4gICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UsIHtcbiAgICAgIHByZUV4cGFuZGVkUm93czogcm93cyxcbiAgICAgIGV4cGFuZGVkUm93czogZXhwYW5kZWRSb3dzLFxuICAgICAgcm93czogZXhwYW5kZWRSb3dzLFxuICAgICAgZXhwYW5kZWREZXB0aDogZXhwYW5kZWREZXB0aCxcbiAgICAgIGlzQWxsUm93c0V4cGFuZGVkOiBpc0FsbFJvd3NFeHBhbmRlZCxcbiAgICAgIHRvZ2dsZVJvd0V4cGFuZGVkOiB0b2dnbGVSb3dFeHBhbmRlZCxcbiAgICAgIHRvZ2dsZUFsbFJvd3NFeHBhbmRlZDogdG9nZ2xlQWxsUm93c0V4cGFuZGVkLFxuICAgICAgZ2V0VG9nZ2xlQWxsUm93c0V4cGFuZGVkUHJvcHM6IGdldFRvZ2dsZUFsbFJvd3NFeHBhbmRlZFByb3BzXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBwcmVwYXJlUm93KHJvdywgX3JlZjMpIHtcbiAgICB2YXIgZ2V0SG9va3MgPSBfcmVmMy5pbnN0YW5jZS5nZXRIb29rcyxcbiAgICAgICAgaW5zdGFuY2UgPSBfcmVmMy5pbnN0YW5jZTtcblxuICAgIHJvdy50b2dnbGVSb3dFeHBhbmRlZCA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS50b2dnbGVSb3dFeHBhbmRlZChyb3cuaWQsIHNldCk7XG4gICAgfTtcblxuICAgIHJvdy5nZXRUb2dnbGVSb3dFeHBhbmRlZFByb3BzID0gbWFrZVByb3BHZXR0ZXIoZ2V0SG9va3MoKS5nZXRUb2dnbGVSb3dFeHBhbmRlZFByb3BzLCB7XG4gICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICByb3c6IHJvd1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZmluZEV4cGFuZGVkRGVwdGgoZXhwYW5kZWQpIHtcbiAgICB2YXIgbWF4RGVwdGggPSAwO1xuICAgIE9iamVjdC5rZXlzKGV4cGFuZGVkKS5mb3JFYWNoKGZ1bmN0aW9uIChpZCkge1xuICAgICAgdmFyIHNwbGl0SWQgPSBpZC5zcGxpdCgnLicpO1xuICAgICAgbWF4RGVwdGggPSBNYXRoLm1heChtYXhEZXB0aCwgc3BsaXRJZC5sZW5ndGgpO1xuICAgIH0pO1xuICAgIHJldHVybiBtYXhEZXB0aDtcbiAgfVxuXG4gIHZhciB0ZXh0ID0gZnVuY3Rpb24gdGV4dChyb3dzLCBpZHMsIGZpbHRlclZhbHVlKSB7XG4gICAgcm93cyA9IHJvd3MuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHJldHVybiBpZHMuc29tZShmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHJvd1ZhbHVlID0gcm93LnZhbHVlc1tpZF07XG4gICAgICAgIHJldHVybiBTdHJpbmcocm93VmFsdWUpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoU3RyaW5nKGZpbHRlclZhbHVlKS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiByb3dzO1xuICB9O1xuXG4gIHRleHQuYXV0b1JlbW92ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gIXZhbDtcbiAgfTtcblxuICB2YXIgZXhhY3RUZXh0ID0gZnVuY3Rpb24gZXhhY3RUZXh0KHJvd3MsIGlkcywgZmlsdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gcm93cy5maWx0ZXIoZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgcm93VmFsdWUgPSByb3cudmFsdWVzW2lkXTtcbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcocm93VmFsdWUpLnRvTG93ZXJDYXNlKCkgPT09IFN0cmluZyhmaWx0ZXJWYWx1ZSkudG9Mb3dlckNhc2UoKSA6IHRydWU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBleGFjdFRleHQuYXV0b1JlbW92ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gIXZhbDtcbiAgfTtcblxuICB2YXIgZXhhY3RUZXh0Q2FzZSA9IGZ1bmN0aW9uIGV4YWN0VGV4dENhc2Uocm93cywgaWRzLCBmaWx0ZXJWYWx1ZSkge1xuICAgIHJldHVybiByb3dzLmZpbHRlcihmdW5jdGlvbiAocm93KSB7XG4gICAgICByZXR1cm4gaWRzLnNvbWUoZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciByb3dWYWx1ZSA9IHJvdy52YWx1ZXNbaWRdO1xuICAgICAgICByZXR1cm4gcm93VmFsdWUgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhyb3dWYWx1ZSkgPT09IFN0cmluZyhmaWx0ZXJWYWx1ZSkgOiB0cnVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgZXhhY3RUZXh0Q2FzZS5hdXRvUmVtb3ZlID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiAhdmFsO1xuICB9O1xuXG4gIHZhciBpbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzKHJvd3MsIGlkcywgZmlsdGVyVmFsdWUpIHtcbiAgICByZXR1cm4gcm93cy5maWx0ZXIoZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgcm93VmFsdWUgPSByb3cudmFsdWVzW2lkXTtcbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlLmluY2x1ZGVzKGZpbHRlclZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIGluY2x1ZGVzLmF1dG9SZW1vdmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuICF2YWwgfHwgIXZhbC5sZW5ndGg7XG4gIH07XG5cbiAgdmFyIGluY2x1ZGVzQWxsID0gZnVuY3Rpb24gaW5jbHVkZXNBbGwocm93cywgaWRzLCBmaWx0ZXJWYWx1ZSkge1xuICAgIHJldHVybiByb3dzLmZpbHRlcihmdW5jdGlvbiAocm93KSB7XG4gICAgICByZXR1cm4gaWRzLnNvbWUoZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciByb3dWYWx1ZSA9IHJvdy52YWx1ZXNbaWRdO1xuICAgICAgICByZXR1cm4gcm93VmFsdWUgJiYgcm93VmFsdWUubGVuZ3RoICYmIGZpbHRlclZhbHVlLmV2ZXJ5KGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICByZXR1cm4gcm93VmFsdWUuaW5jbHVkZXModmFsKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBpbmNsdWRlc0FsbC5hdXRvUmVtb3ZlID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiAhdmFsIHx8ICF2YWwubGVuZ3RoO1xuICB9O1xuXG4gIHZhciBpbmNsdWRlc1NvbWUgPSBmdW5jdGlvbiBpbmNsdWRlc1NvbWUocm93cywgaWRzLCBmaWx0ZXJWYWx1ZSkge1xuICAgIHJldHVybiByb3dzLmZpbHRlcihmdW5jdGlvbiAocm93KSB7XG4gICAgICByZXR1cm4gaWRzLnNvbWUoZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciByb3dWYWx1ZSA9IHJvdy52YWx1ZXNbaWRdO1xuICAgICAgICByZXR1cm4gcm93VmFsdWUgJiYgcm93VmFsdWUubGVuZ3RoICYmIGZpbHRlclZhbHVlLnNvbWUoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgIHJldHVybiByb3dWYWx1ZS5pbmNsdWRlcyh2YWwpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIGluY2x1ZGVzU29tZS5hdXRvUmVtb3ZlID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiAhdmFsIHx8ICF2YWwubGVuZ3RoO1xuICB9O1xuXG4gIHZhciBpbmNsdWRlc1ZhbHVlID0gZnVuY3Rpb24gaW5jbHVkZXNWYWx1ZShyb3dzLCBpZHMsIGZpbHRlclZhbHVlKSB7XG4gICAgcmV0dXJuIHJvd3MuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHJldHVybiBpZHMuc29tZShmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHJvd1ZhbHVlID0gcm93LnZhbHVlc1tpZF07XG4gICAgICAgIHJldHVybiBmaWx0ZXJWYWx1ZS5pbmNsdWRlcyhyb3dWYWx1ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBpbmNsdWRlc1ZhbHVlLmF1dG9SZW1vdmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuICF2YWwgfHwgIXZhbC5sZW5ndGg7XG4gIH07XG5cbiAgdmFyIGV4YWN0ID0gZnVuY3Rpb24gZXhhY3Qocm93cywgaWRzLCBmaWx0ZXJWYWx1ZSkge1xuICAgIHJldHVybiByb3dzLmZpbHRlcihmdW5jdGlvbiAocm93KSB7XG4gICAgICByZXR1cm4gaWRzLnNvbWUoZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciByb3dWYWx1ZSA9IHJvdy52YWx1ZXNbaWRdO1xuICAgICAgICByZXR1cm4gcm93VmFsdWUgPT09IGZpbHRlclZhbHVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgZXhhY3QuYXV0b1JlbW92ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCc7XG4gIH07XG5cbiAgdmFyIGVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhyb3dzLCBpZHMsIGZpbHRlclZhbHVlKSB7XG4gICAgcmV0dXJuIHJvd3MuZmlsdGVyKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgIHJldHVybiBpZHMuc29tZShmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgdmFyIHJvd1ZhbHVlID0gcm93LnZhbHVlc1tpZF07IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblxuICAgICAgICByZXR1cm4gcm93VmFsdWUgPT0gZmlsdGVyVmFsdWU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBlcXVhbHMuYXV0b1JlbW92ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gdmFsID09IG51bGw7XG4gIH07XG5cbiAgdmFyIGJldHdlZW4gPSBmdW5jdGlvbiBiZXR3ZWVuKHJvd3MsIGlkcywgZmlsdGVyVmFsdWUpIHtcbiAgICB2YXIgX3JlZiA9IGZpbHRlclZhbHVlIHx8IFtdLFxuICAgICAgICBtaW4gPSBfcmVmWzBdLFxuICAgICAgICBtYXggPSBfcmVmWzFdO1xuXG4gICAgbWluID0gdHlwZW9mIG1pbiA9PT0gJ251bWJlcicgPyBtaW4gOiAtSW5maW5pdHk7XG4gICAgbWF4ID0gdHlwZW9mIG1heCA9PT0gJ251bWJlcicgPyBtYXggOiBJbmZpbml0eTtcblxuICAgIGlmIChtaW4gPiBtYXgpIHtcbiAgICAgIHZhciB0ZW1wID0gbWluO1xuICAgICAgbWluID0gbWF4O1xuICAgICAgbWF4ID0gdGVtcDtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cy5maWx0ZXIoZnVuY3Rpb24gKHJvdykge1xuICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgcm93VmFsdWUgPSByb3cudmFsdWVzW2lkXTtcbiAgICAgICAgcmV0dXJuIHJvd1ZhbHVlID49IG1pbiAmJiByb3dWYWx1ZSA8PSBtYXg7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBiZXR3ZWVuLmF1dG9SZW1vdmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuICF2YWwgfHwgdHlwZW9mIHZhbFswXSAhPT0gJ251bWJlcicgJiYgdHlwZW9mIHZhbFsxXSAhPT0gJ251bWJlcic7XG4gIH07XG5cbiAgdmFyIGZpbHRlclR5cGVzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICB0ZXh0OiB0ZXh0LFxuICAgIGV4YWN0VGV4dDogZXhhY3RUZXh0LFxuICAgIGV4YWN0VGV4dENhc2U6IGV4YWN0VGV4dENhc2UsXG4gICAgaW5jbHVkZXM6IGluY2x1ZGVzLFxuICAgIGluY2x1ZGVzQWxsOiBpbmNsdWRlc0FsbCxcbiAgICBpbmNsdWRlc1NvbWU6IGluY2x1ZGVzU29tZSxcbiAgICBpbmNsdWRlc1ZhbHVlOiBpbmNsdWRlc1ZhbHVlLFxuICAgIGV4YWN0OiBleGFjdCxcbiAgICBlcXVhbHM6IGVxdWFscyxcbiAgICBiZXR3ZWVuOiBiZXR3ZWVuXG4gIH0pO1xuXG4gIGFjdGlvbnMucmVzZXRGaWx0ZXJzID0gJ3Jlc2V0RmlsdGVycyc7XG4gIGFjdGlvbnMuc2V0RmlsdGVyID0gJ3NldEZpbHRlcic7XG4gIGFjdGlvbnMuc2V0QWxsRmlsdGVycyA9ICdzZXRBbGxGaWx0ZXJzJztcbiAgdmFyIHVzZUZpbHRlcnMgPSBmdW5jdGlvbiB1c2VGaWx0ZXJzKGhvb2tzKSB7XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIkMik7XG4gICAgaG9va3MudXNlSW5zdGFuY2UucHVzaCh1c2VJbnN0YW5jZSQyKTtcbiAgfTtcbiAgdXNlRmlsdGVycy5wbHVnaW5OYW1lID0gJ3VzZUZpbHRlcnMnO1xuXG4gIGZ1bmN0aW9uIHJlZHVjZXIkMihzdGF0ZSwgYWN0aW9uLCBwcmV2aW91c1N0YXRlLCBpbnN0YW5jZSkge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5pbml0KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBmaWx0ZXJzOiBbXVxuICAgICAgfSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5yZXNldEZpbHRlcnMpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgZmlsdGVyczogaW5zdGFuY2UuaW5pdGlhbFN0YXRlLmZpbHRlcnMgfHwgW11cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5zZXRGaWx0ZXIpIHtcbiAgICAgIHZhciBjb2x1bW5JZCA9IGFjdGlvbi5jb2x1bW5JZCxcbiAgICAgICAgICBmaWx0ZXJWYWx1ZSA9IGFjdGlvbi5maWx0ZXJWYWx1ZTtcbiAgICAgIHZhciBhbGxDb2x1bW5zID0gaW5zdGFuY2UuYWxsQ29sdW1ucyxcbiAgICAgICAgICB1c2VyRmlsdGVyVHlwZXMgPSBpbnN0YW5jZS5maWx0ZXJUeXBlcztcbiAgICAgIHZhciBjb2x1bW4gPSBhbGxDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuaWQgPT09IGNvbHVtbklkO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghY29sdW1uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0LVRhYmxlOiBDb3VsZCBub3QgZmluZCBhIGNvbHVtbiB3aXRoIGlkOiBcIiArIGNvbHVtbklkKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpbHRlck1ldGhvZCA9IGdldEZpbHRlck1ldGhvZChjb2x1bW4uZmlsdGVyLCB1c2VyRmlsdGVyVHlwZXMgfHwge30sIGZpbHRlclR5cGVzKTtcbiAgICAgIHZhciBwcmV2aW91c2ZpbHRlciA9IHN0YXRlLmZpbHRlcnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5pZCA9PT0gY29sdW1uSWQ7XG4gICAgICB9KTtcbiAgICAgIHZhciBuZXdGaWx0ZXIgPSBmdW5jdGlvbmFsVXBkYXRlKGZpbHRlclZhbHVlLCBwcmV2aW91c2ZpbHRlciAmJiBwcmV2aW91c2ZpbHRlci52YWx1ZSk7IC8vXG5cbiAgICAgIGlmIChzaG91bGRBdXRvUmVtb3ZlRmlsdGVyKGZpbHRlck1ldGhvZC5hdXRvUmVtb3ZlLCBuZXdGaWx0ZXIsIGNvbHVtbikpIHtcbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICAgIGZpbHRlcnM6IHN0YXRlLmZpbHRlcnMuZmlsdGVyKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICByZXR1cm4gZC5pZCAhPT0gY29sdW1uSWQ7XG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2aW91c2ZpbHRlcikge1xuICAgICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgICAgZmlsdGVyczogc3RhdGUuZmlsdGVycy5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIGlmIChkLmlkID09PSBjb2x1bW5JZCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkOiBjb2x1bW5JZCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogbmV3RmlsdGVyXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGZpbHRlcnM6IFtdLmNvbmNhdChzdGF0ZS5maWx0ZXJzLCBbe1xuICAgICAgICAgIGlkOiBjb2x1bW5JZCxcbiAgICAgICAgICB2YWx1ZTogbmV3RmlsdGVyXG4gICAgICAgIH1dKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldEFsbEZpbHRlcnMpIHtcbiAgICAgIHZhciBmaWx0ZXJzID0gYWN0aW9uLmZpbHRlcnM7XG4gICAgICB2YXIgX2FsbENvbHVtbnMgPSBpbnN0YW5jZS5hbGxDb2x1bW5zLFxuICAgICAgICAgIF91c2VyRmlsdGVyVHlwZXMgPSBpbnN0YW5jZS5maWx0ZXJUeXBlcztcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgLy8gRmlsdGVyIG91dCB1bmRlZmluZWQgdmFsdWVzXG4gICAgICAgIGZpbHRlcnM6IGZ1bmN0aW9uYWxVcGRhdGUoZmlsdGVycywgc3RhdGUuZmlsdGVycykuZmlsdGVyKGZ1bmN0aW9uIChmaWx0ZXIpIHtcbiAgICAgICAgICB2YXIgY29sdW1uID0gX2FsbENvbHVtbnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuIGQuaWQgPT09IGZpbHRlci5pZDtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZhciBmaWx0ZXJNZXRob2QgPSBnZXRGaWx0ZXJNZXRob2QoY29sdW1uLmZpbHRlciwgX3VzZXJGaWx0ZXJUeXBlcyB8fCB7fSwgZmlsdGVyVHlwZXMpO1xuXG4gICAgICAgICAgaWYgKHNob3VsZEF1dG9SZW1vdmVGaWx0ZXIoZmlsdGVyTWV0aG9kLmF1dG9SZW1vdmUsIGZpbHRlci52YWx1ZSwgY29sdW1uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkMihpbnN0YW5jZSkge1xuICAgIHZhciBkYXRhID0gaW5zdGFuY2UuZGF0YSxcbiAgICAgICAgcm93cyA9IGluc3RhbmNlLnJvd3MsXG4gICAgICAgIGZsYXRSb3dzID0gaW5zdGFuY2UuZmxhdFJvd3MsXG4gICAgICAgIHJvd3NCeUlkID0gaW5zdGFuY2Uucm93c0J5SWQsXG4gICAgICAgIGFsbENvbHVtbnMgPSBpbnN0YW5jZS5hbGxDb2x1bW5zLFxuICAgICAgICB1c2VyRmlsdGVyVHlwZXMgPSBpbnN0YW5jZS5maWx0ZXJUeXBlcyxcbiAgICAgICAgbWFudWFsRmlsdGVycyA9IGluc3RhbmNlLm1hbnVhbEZpbHRlcnMsXG4gICAgICAgIF9pbnN0YW5jZSRkZWZhdWx0Q2FuRiA9IGluc3RhbmNlLmRlZmF1bHRDYW5GaWx0ZXIsXG4gICAgICAgIGRlZmF1bHRDYW5GaWx0ZXIgPSBfaW5zdGFuY2UkZGVmYXVsdENhbkYgPT09IHZvaWQgMCA/IGZhbHNlIDogX2luc3RhbmNlJGRlZmF1bHRDYW5GLFxuICAgICAgICBkaXNhYmxlRmlsdGVycyA9IGluc3RhbmNlLmRpc2FibGVGaWx0ZXJzLFxuICAgICAgICBmaWx0ZXJzID0gaW5zdGFuY2Uuc3RhdGUuZmlsdGVycyxcbiAgICAgICAgZGlzcGF0Y2ggPSBpbnN0YW5jZS5kaXNwYXRjaCxcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldEZpID0gaW5zdGFuY2UuYXV0b1Jlc2V0RmlsdGVycyxcbiAgICAgICAgYXV0b1Jlc2V0RmlsdGVycyA9IF9pbnN0YW5jZSRhdXRvUmVzZXRGaSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9pbnN0YW5jZSRhdXRvUmVzZXRGaTtcbiAgICB2YXIgc2V0RmlsdGVyID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGNvbHVtbklkLCBmaWx0ZXJWYWx1ZSkge1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLnNldEZpbHRlcixcbiAgICAgICAgY29sdW1uSWQ6IGNvbHVtbklkLFxuICAgICAgICBmaWx0ZXJWYWx1ZTogZmlsdGVyVmFsdWVcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIHZhciBzZXRBbGxGaWx0ZXJzID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGZpbHRlcnMpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5zZXRBbGxGaWx0ZXJzLFxuICAgICAgICBmaWx0ZXJzOiBmaWx0ZXJzXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICBhbGxDb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgdmFyIGlkID0gY29sdW1uLmlkLFxuICAgICAgICAgIGFjY2Vzc29yID0gY29sdW1uLmFjY2Vzc29yLFxuICAgICAgICAgIGNvbHVtbkRlZmF1bHRDYW5GaWx0ZXIgPSBjb2x1bW4uZGVmYXVsdENhbkZpbHRlcixcbiAgICAgICAgICBjb2x1bW5EaXNhYmxlRmlsdGVycyA9IGNvbHVtbi5kaXNhYmxlRmlsdGVyczsgLy8gRGV0ZXJtaW5lIGlmIGEgY29sdW1uIGlzIGZpbHRlcmFibGVcblxuICAgICAgY29sdW1uLmNhbkZpbHRlciA9IGFjY2Vzc29yID8gZ2V0Rmlyc3REZWZpbmVkKGNvbHVtbkRpc2FibGVGaWx0ZXJzID09PSB0cnVlID8gZmFsc2UgOiB1bmRlZmluZWQsIGRpc2FibGVGaWx0ZXJzID09PSB0cnVlID8gZmFsc2UgOiB1bmRlZmluZWQsIHRydWUpIDogZ2V0Rmlyc3REZWZpbmVkKGNvbHVtbkRlZmF1bHRDYW5GaWx0ZXIsIGRlZmF1bHRDYW5GaWx0ZXIsIGZhbHNlKTsgLy8gUHJvdmlkZSB0aGUgY29sdW1uIGEgd2F5IG9mIHVwZGF0aW5nIHRoZSBmaWx0ZXIgdmFsdWVcblxuICAgICAgY29sdW1uLnNldEZpbHRlciA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIHNldEZpbHRlcihjb2x1bW4uaWQsIHZhbCk7XG4gICAgICB9OyAvLyBQcm92aWRlIHRoZSBjdXJyZW50IGZpbHRlciB2YWx1ZSB0byB0aGUgY29sdW1uIGZvclxuICAgICAgLy8gY29udmVuaWVuY2VcblxuXG4gICAgICB2YXIgZm91bmQgPSBmaWx0ZXJzLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuaWQgPT09IGlkO1xuICAgICAgfSk7XG4gICAgICBjb2x1bW4uZmlsdGVyVmFsdWUgPSBmb3VuZCAmJiBmb3VuZC52YWx1ZTtcbiAgICB9KTtcblxuICAgIHZhciBfUmVhY3QkdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG1hbnVhbEZpbHRlcnMgfHwgIWZpbHRlcnMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbcm93cywgZmxhdFJvd3MsIHJvd3NCeUlkXTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpbHRlcmVkRmxhdFJvd3MgPSBbXTtcbiAgICAgIHZhciBmaWx0ZXJlZFJvd3NCeUlkID0ge307IC8vIEZpbHRlcnMgdG9wIGxldmVsIGFuZCBuZXN0ZWQgcm93c1xuXG4gICAgICB2YXIgZmlsdGVyUm93cyA9IGZ1bmN0aW9uIGZpbHRlclJvd3Mocm93cywgZGVwdGgpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSB2b2lkIDApIHtcbiAgICAgICAgICBkZXB0aCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmlsdGVyZWRSb3dzID0gcm93cztcbiAgICAgICAgZmlsdGVyZWRSb3dzID0gZmlsdGVycy5yZWR1Y2UoZnVuY3Rpb24gKGZpbHRlcmVkU29GYXIsIF9yZWYpIHtcbiAgICAgICAgICB2YXIgY29sdW1uSWQgPSBfcmVmLmlkLFxuICAgICAgICAgICAgICBmaWx0ZXJWYWx1ZSA9IF9yZWYudmFsdWU7XG4gICAgICAgICAgLy8gRmluZCB0aGUgZmlsdGVycyBjb2x1bW5cbiAgICAgICAgICB2YXIgY29sdW1uID0gYWxsQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICByZXR1cm4gZC5pZCA9PT0gY29sdW1uSWQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoIWNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkU29GYXI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgICBjb2x1bW4ucHJlRmlsdGVyZWRSb3dzID0gZmlsdGVyZWRTb0ZhcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgZmlsdGVyTWV0aG9kID0gZ2V0RmlsdGVyTWV0aG9kKGNvbHVtbi5maWx0ZXIsIHVzZXJGaWx0ZXJUeXBlcyB8fCB7fSwgZmlsdGVyVHlwZXMpO1xuXG4gICAgICAgICAgaWYgKCFmaWx0ZXJNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkNvdWxkIG5vdCBmaW5kIGEgdmFsaWQgJ2NvbHVtbi5maWx0ZXInIGZvciBjb2x1bW4gd2l0aCB0aGUgSUQ6IFwiICsgY29sdW1uLmlkICsgXCIuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkU29GYXI7XG4gICAgICAgICAgfSAvLyBQYXNzIHRoZSByb3dzLCBpZCwgZmlsdGVyVmFsdWUgYW5kIGNvbHVtbiB0byB0aGUgZmlsdGVyTWV0aG9kXG4gICAgICAgICAgLy8gdG8gZ2V0IHRoZSBmaWx0ZXJlZCByb3dzIGJhY2tcblxuXG4gICAgICAgICAgY29sdW1uLmZpbHRlcmVkUm93cyA9IGZpbHRlck1ldGhvZChmaWx0ZXJlZFNvRmFyLCBbY29sdW1uSWRdLCBmaWx0ZXJWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGNvbHVtbi5maWx0ZXJlZFJvd3M7XG4gICAgICAgIH0sIHJvd3MpOyAvLyBBcHBseSB0aGUgZmlsdGVyIHRvIGFueSBzdWJSb3dzXG4gICAgICAgIC8vIFdlIHRlY2huaWNhbGx5IGNvdWxkIGRvIHRoaXMgcmVjdXJzaXZlbHkgaW4gdGhlIGFib3ZlIGxvb3AsXG4gICAgICAgIC8vIGJ1dCB0aGF0IHdvdWxkIHNldmVyZWx5IGhpbmRlciB0aGUgQVBJIGZvciB0aGUgdXNlciwgc2luY2UgdGhleVxuICAgICAgICAvLyB3b3VsZCBiZSByZXF1aXJlZCB0byBkbyB0aGF0IHJlY3Vyc2lvbiBpbiBzb21lIHNjZW5hcmlvc1xuXG4gICAgICAgIGZpbHRlcmVkUm93cy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICBmaWx0ZXJlZEZsYXRSb3dzLnB1c2gocm93KTtcbiAgICAgICAgICBmaWx0ZXJlZFJvd3NCeUlkW3Jvdy5pZF0gPSByb3c7XG5cbiAgICAgICAgICBpZiAoIXJvdy5zdWJSb3dzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcm93LnN1YlJvd3MgPSByb3cuc3ViUm93cyAmJiByb3cuc3ViUm93cy5sZW5ndGggPiAwID8gZmlsdGVyUm93cyhyb3cuc3ViUm93cywgZGVwdGggKyAxKSA6IHJvdy5zdWJSb3dzO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkUm93cztcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBbZmlsdGVyUm93cyhyb3dzKSwgZmlsdGVyZWRGbGF0Um93cywgZmlsdGVyZWRSb3dzQnlJZF07XG4gICAgfSwgW21hbnVhbEZpbHRlcnMsIGZpbHRlcnMsIHJvd3MsIGZsYXRSb3dzLCByb3dzQnlJZCwgYWxsQ29sdW1ucywgdXNlckZpbHRlclR5cGVzXSksXG4gICAgICAgIGZpbHRlcmVkUm93cyA9IF9SZWFjdCR1c2VNZW1vWzBdLFxuICAgICAgICBmaWx0ZXJlZEZsYXRSb3dzID0gX1JlYWN0JHVzZU1lbW9bMV0sXG4gICAgICAgIGZpbHRlcmVkUm93c0J5SWQgPSBfUmVhY3QkdXNlTWVtb1syXTtcblxuICAgIFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgLy8gTm93IHRoYXQgZWFjaCBmaWx0ZXJlZCBjb2x1bW4gaGFzIGl0J3MgcGFydGlhbGx5IGZpbHRlcmVkIHJvd3MsXG4gICAgICAvLyBsZXRzIGFzc2lnbiB0aGUgZmluYWwgZmlsdGVyZWQgcm93cyB0byBhbGwgb2YgdGhlIG90aGVyIGNvbHVtbnNcbiAgICAgIHZhciBub25GaWx0ZXJlZENvbHVtbnMgPSBhbGxDb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiAhZmlsdGVycy5maW5kKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgcmV0dXJuIGQuaWQgPT09IGNvbHVtbi5pZDtcbiAgICAgICAgfSk7XG4gICAgICB9KTsgLy8gVGhpcyBlc3NlbnRpYWxseSBlbmFibGVzIGZhY2V0ZWQgZmlsdGVyIG9wdGlvbnMgdG8gYmUgYnVpbHQgZWFzaWx5XG4gICAgICAvLyB1c2luZyBldmVyeSBjb2x1bW4ncyBwcmVGaWx0ZXJlZFJvd3MgdmFsdWVcblxuICAgICAgbm9uRmlsdGVyZWRDb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICBjb2x1bW4ucHJlRmlsdGVyZWRSb3dzID0gZmlsdGVyZWRSb3dzO1xuICAgICAgICBjb2x1bW4uZmlsdGVyZWRSb3dzID0gZmlsdGVyZWRSb3dzO1xuICAgICAgfSk7XG4gICAgfSwgW2ZpbHRlcmVkUm93cywgZmlsdGVycywgYWxsQ29sdW1uc10pO1xuICAgIHZhciBnZXRBdXRvUmVzZXRGaWx0ZXJzID0gdXNlR2V0TGF0ZXN0KGF1dG9SZXNldEZpbHRlcnMpO1xuICAgIHVzZU1vdW50ZWRMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGdldEF1dG9SZXNldEZpbHRlcnMoKSkge1xuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogYWN0aW9ucy5yZXNldEZpbHRlcnNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgW2Rpc3BhdGNoLCBtYW51YWxGaWx0ZXJzID8gbnVsbCA6IGRhdGFdKTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICBwcmVGaWx0ZXJlZFJvd3M6IHJvd3MsXG4gICAgICBwcmVGaWx0ZXJlZEZsYXRSb3dzOiBmbGF0Um93cyxcbiAgICAgIHByZUZpbHRlcmVkUm93c0J5SWQ6IHJvd3NCeUlkLFxuICAgICAgZmlsdGVyZWRSb3dzOiBmaWx0ZXJlZFJvd3MsXG4gICAgICBmaWx0ZXJlZEZsYXRSb3dzOiBmaWx0ZXJlZEZsYXRSb3dzLFxuICAgICAgZmlsdGVyZWRSb3dzQnlJZDogZmlsdGVyZWRSb3dzQnlJZCxcbiAgICAgIHJvd3M6IGZpbHRlcmVkUm93cyxcbiAgICAgIGZsYXRSb3dzOiBmaWx0ZXJlZEZsYXRSb3dzLFxuICAgICAgcm93c0J5SWQ6IGZpbHRlcmVkUm93c0J5SWQsXG4gICAgICBzZXRGaWx0ZXI6IHNldEZpbHRlcixcbiAgICAgIHNldEFsbEZpbHRlcnM6IHNldEFsbEZpbHRlcnNcbiAgICB9KTtcbiAgfVxuXG4gIGFjdGlvbnMucmVzZXRHbG9iYWxGaWx0ZXIgPSAncmVzZXRHbG9iYWxGaWx0ZXInO1xuICBhY3Rpb25zLnNldEdsb2JhbEZpbHRlciA9ICdzZXRHbG9iYWxGaWx0ZXInO1xuICB2YXIgdXNlR2xvYmFsRmlsdGVyID0gZnVuY3Rpb24gdXNlR2xvYmFsRmlsdGVyKGhvb2tzKSB7XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIkMyk7XG4gICAgaG9va3MudXNlSW5zdGFuY2UucHVzaCh1c2VJbnN0YW5jZSQzKTtcbiAgfTtcbiAgdXNlR2xvYmFsRmlsdGVyLnBsdWdpbk5hbWUgPSAndXNlR2xvYmFsRmlsdGVyJztcblxuICBmdW5jdGlvbiByZWR1Y2VyJDMoc3RhdGUsIGFjdGlvbiwgcHJldmlvdXNTdGF0ZSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMucmVzZXRHbG9iYWxGaWx0ZXIpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgZ2xvYmFsRmlsdGVyOiBpbnN0YW5jZS5pbml0aWFsU3RhdGUuZ2xvYmFsRmlsdGVyIHx8IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldEdsb2JhbEZpbHRlcikge1xuICAgICAgdmFyIGZpbHRlclZhbHVlID0gYWN0aW9uLmZpbHRlclZhbHVlO1xuICAgICAgdmFyIHVzZXJGaWx0ZXJUeXBlcyA9IGluc3RhbmNlLnVzZXJGaWx0ZXJUeXBlcztcbiAgICAgIHZhciBmaWx0ZXJNZXRob2QgPSBnZXRGaWx0ZXJNZXRob2QoaW5zdGFuY2UuZ2xvYmFsRmlsdGVyLCB1c2VyRmlsdGVyVHlwZXMgfHwge30sIGZpbHRlclR5cGVzKTtcbiAgICAgIHZhciBuZXdGaWx0ZXIgPSBmdW5jdGlvbmFsVXBkYXRlKGZpbHRlclZhbHVlLCBzdGF0ZS5nbG9iYWxGaWx0ZXIpOyAvL1xuXG4gICAgICBpZiAoc2hvdWxkQXV0b1JlbW92ZUZpbHRlcihmaWx0ZXJNZXRob2QuYXV0b1JlbW92ZSwgbmV3RmlsdGVyKSkge1xuICAgICAgICB2YXIgZ2xvYmFsRmlsdGVyID0gc3RhdGUuZ2xvYmFsRmlsdGVyLFxuICAgICAgICAgICAgc3RhdGVXaXRob3V0R2xvYmFsRmlsdGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc3RhdGUsIFtcImdsb2JhbEZpbHRlclwiXSk7XG5cbiAgICAgICAgcmV0dXJuIHN0YXRlV2l0aG91dEdsb2JhbEZpbHRlcjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBnbG9iYWxGaWx0ZXI6IG5ld0ZpbHRlclxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkMyhpbnN0YW5jZSkge1xuICAgIHZhciBkYXRhID0gaW5zdGFuY2UuZGF0YSxcbiAgICAgICAgcm93cyA9IGluc3RhbmNlLnJvd3MsXG4gICAgICAgIGZsYXRSb3dzID0gaW5zdGFuY2UuZmxhdFJvd3MsXG4gICAgICAgIHJvd3NCeUlkID0gaW5zdGFuY2Uucm93c0J5SWQsXG4gICAgICAgIGFsbENvbHVtbnMgPSBpbnN0YW5jZS5hbGxDb2x1bW5zLFxuICAgICAgICB1c2VyRmlsdGVyVHlwZXMgPSBpbnN0YW5jZS5maWx0ZXJUeXBlcyxcbiAgICAgICAgZ2xvYmFsRmlsdGVyID0gaW5zdGFuY2UuZ2xvYmFsRmlsdGVyLFxuICAgICAgICBtYW51YWxHbG9iYWxGaWx0ZXIgPSBpbnN0YW5jZS5tYW51YWxHbG9iYWxGaWx0ZXIsXG4gICAgICAgIGdsb2JhbEZpbHRlclZhbHVlID0gaW5zdGFuY2Uuc3RhdGUuZ2xvYmFsRmlsdGVyLFxuICAgICAgICBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoLFxuICAgICAgICBfaW5zdGFuY2UkYXV0b1Jlc2V0R2wgPSBpbnN0YW5jZS5hdXRvUmVzZXRHbG9iYWxGaWx0ZXIsXG4gICAgICAgIGF1dG9SZXNldEdsb2JhbEZpbHRlciA9IF9pbnN0YW5jZSRhdXRvUmVzZXRHbCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9pbnN0YW5jZSRhdXRvUmVzZXRHbCxcbiAgICAgICAgZGlzYWJsZUdsb2JhbEZpbHRlciA9IGluc3RhbmNlLmRpc2FibGVHbG9iYWxGaWx0ZXI7XG4gICAgdmFyIHNldEdsb2JhbEZpbHRlciA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChmaWx0ZXJWYWx1ZSkge1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLnNldEdsb2JhbEZpbHRlcixcbiAgICAgICAgZmlsdGVyVmFsdWU6IGZpbHRlclZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTsgLy8gVE9ETzogQ3JlYXRlIGEgZmlsdGVyIGNhY2hlIGZvciBpbmNyZW1lbnRhbCBoaWdoIHNwZWVkIG11bHRpLWZpbHRlcmluZ1xuICAgIC8vIFRoaXMgZ2V0cyBwcmV0dHkgY29tcGxpY2F0ZWQgcHJldHR5IGZhc3QsIHNpbmNlIHlvdSBoYXZlIHRvIG1haW50YWluIGFcbiAgICAvLyBjYWNoZSBmb3IgZWFjaCByb3cgZ3JvdXAgKHRvcC1sZXZlbCByb3dzLCBhbmQgZWFjaCByb3cncyByZWN1cnNpdmUgc3Vicm93cylcbiAgICAvLyBUaGlzIHdvdWxkIG1ha2UgbXVsdGktZmlsdGVyaW5nIGEgbG90IGZhc3RlciB0aG91Z2guIFRvbyBmYXI/XG5cbiAgICB2YXIgX1JlYWN0JHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChtYW51YWxHbG9iYWxGaWx0ZXIgfHwgdHlwZW9mIGdsb2JhbEZpbHRlclZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gW3Jvd3MsIGZsYXRSb3dzLCByb3dzQnlJZF07XG4gICAgICB9XG5cbiAgICAgIHZhciBmaWx0ZXJlZEZsYXRSb3dzID0gW107XG4gICAgICB2YXIgZmlsdGVyZWRSb3dzQnlJZCA9IHt9O1xuICAgICAgdmFyIGZpbHRlck1ldGhvZCA9IGdldEZpbHRlck1ldGhvZChnbG9iYWxGaWx0ZXIsIHVzZXJGaWx0ZXJUeXBlcyB8fCB7fSwgZmlsdGVyVHlwZXMpO1xuXG4gICAgICBpZiAoIWZpbHRlck1ldGhvZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJDb3VsZCBub3QgZmluZCBhIHZhbGlkICdnbG9iYWxGaWx0ZXInIG9wdGlvbi5cIik7XG4gICAgICAgIHJldHVybiByb3dzO1xuICAgICAgfVxuXG4gICAgICBhbGxDb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICB2YXIgY29sdW1uRGlzYWJsZUdsb2JhbEZpbHRlciA9IGNvbHVtbi5kaXNhYmxlR2xvYmFsRmlsdGVyO1xuICAgICAgICBjb2x1bW4uY2FuRmlsdGVyID0gZ2V0Rmlyc3REZWZpbmVkKGNvbHVtbkRpc2FibGVHbG9iYWxGaWx0ZXIgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgZGlzYWJsZUdsb2JhbEZpbHRlciA9PT0gdHJ1ZSA/IGZhbHNlIDogdW5kZWZpbmVkLCB0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgdmFyIGZpbHRlcmFibGVDb2x1bW5zID0gYWxsQ29sdW1ucy5maWx0ZXIoZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIGMuY2FuRmlsdGVyID09PSB0cnVlO1xuICAgICAgfSk7IC8vIEZpbHRlcnMgdG9wIGxldmVsIGFuZCBuZXN0ZWQgcm93c1xuXG4gICAgICB2YXIgZmlsdGVyUm93cyA9IGZ1bmN0aW9uIGZpbHRlclJvd3MoZmlsdGVyZWRSb3dzKSB7XG4gICAgICAgIGZpbHRlcmVkUm93cyA9IGZpbHRlck1ldGhvZChmaWx0ZXJlZFJvd3MsIGZpbHRlcmFibGVDb2x1bW5zLm1hcChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkLmlkO1xuICAgICAgICB9KSwgZ2xvYmFsRmlsdGVyVmFsdWUpO1xuICAgICAgICBmaWx0ZXJlZFJvd3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgZmlsdGVyZWRGbGF0Um93cy5wdXNoKHJvdyk7XG4gICAgICAgICAgZmlsdGVyZWRSb3dzQnlJZFtyb3cuaWRdID0gcm93O1xuICAgICAgICAgIHJvdy5zdWJSb3dzID0gcm93LnN1YlJvd3MgJiYgcm93LnN1YlJvd3MubGVuZ3RoID8gZmlsdGVyUm93cyhyb3cuc3ViUm93cykgOiByb3cuc3ViUm93cztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZFJvd3M7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gW2ZpbHRlclJvd3Mocm93cyksIGZpbHRlcmVkRmxhdFJvd3MsIGZpbHRlcmVkUm93c0J5SWRdO1xuICAgIH0sIFttYW51YWxHbG9iYWxGaWx0ZXIsIGdsb2JhbEZpbHRlclZhbHVlLCBnbG9iYWxGaWx0ZXIsIHVzZXJGaWx0ZXJUeXBlcywgYWxsQ29sdW1ucywgcm93cywgZmxhdFJvd3MsIHJvd3NCeUlkLCBkaXNhYmxlR2xvYmFsRmlsdGVyXSksXG4gICAgICAgIGdsb2JhbEZpbHRlcmVkUm93cyA9IF9SZWFjdCR1c2VNZW1vWzBdLFxuICAgICAgICBnbG9iYWxGaWx0ZXJlZEZsYXRSb3dzID0gX1JlYWN0JHVzZU1lbW9bMV0sXG4gICAgICAgIGdsb2JhbEZpbHRlcmVkUm93c0J5SWQgPSBfUmVhY3QkdXNlTWVtb1syXTtcblxuICAgIHZhciBnZXRBdXRvUmVzZXRHbG9iYWxGaWx0ZXIgPSB1c2VHZXRMYXRlc3QoYXV0b1Jlc2V0R2xvYmFsRmlsdGVyKTtcbiAgICB1c2VNb3VudGVkTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChnZXRBdXRvUmVzZXRHbG9iYWxGaWx0ZXIoKSkge1xuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogYWN0aW9ucy5yZXNldEdsb2JhbEZpbHRlclxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBbZGlzcGF0Y2gsIG1hbnVhbEdsb2JhbEZpbHRlciA/IG51bGwgOiBkYXRhXSk7XG4gICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSwge1xuICAgICAgcHJlR2xvYmFsRmlsdGVyZWRSb3dzOiByb3dzLFxuICAgICAgcHJlR2xvYmFsRmlsdGVyZWRGbGF0Um93czogZmxhdFJvd3MsXG4gICAgICBwcmVHbG9iYWxGaWx0ZXJlZFJvd3NCeUlkOiByb3dzQnlJZCxcbiAgICAgIGdsb2JhbEZpbHRlcmVkUm93czogZ2xvYmFsRmlsdGVyZWRSb3dzLFxuICAgICAgZ2xvYmFsRmlsdGVyZWRGbGF0Um93czogZ2xvYmFsRmlsdGVyZWRGbGF0Um93cyxcbiAgICAgIGdsb2JhbEZpbHRlcmVkUm93c0J5SWQ6IGdsb2JhbEZpbHRlcmVkUm93c0J5SWQsXG4gICAgICByb3dzOiBnbG9iYWxGaWx0ZXJlZFJvd3MsXG4gICAgICBmbGF0Um93czogZ2xvYmFsRmlsdGVyZWRGbGF0Um93cyxcbiAgICAgIHJvd3NCeUlkOiBnbG9iYWxGaWx0ZXJlZFJvd3NCeUlkLFxuICAgICAgc2V0R2xvYmFsRmlsdGVyOiBzZXRHbG9iYWxGaWx0ZXIsXG4gICAgICBkaXNhYmxlR2xvYmFsRmlsdGVyOiBkaXNhYmxlR2xvYmFsRmlsdGVyXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdW0odmFsdWVzLCBhZ2dyZWdhdGVkVmFsdWVzKSB7XG4gICAgLy8gSXQncyBmYXN0ZXIgdG8ganVzdCBhZGQgdGhlIGFnZ3JlZ2F0aW9ucyB0b2dldGhlciBpbnN0ZWFkIG9mXG4gICAgLy8gcHJvY2VzcyBsZWFmIG5vZGVzIGluZGl2aWR1YWxseVxuICAgIHJldHVybiBhZ2dyZWdhdGVkVmFsdWVzLnJlZHVjZShmdW5jdGlvbiAoc3VtLCBuZXh0KSB7XG4gICAgICByZXR1cm4gc3VtICsgKHR5cGVvZiBuZXh0ID09PSAnbnVtYmVyJyA/IG5leHQgOiAwKTtcbiAgICB9LCAwKTtcbiAgfVxuICBmdW5jdGlvbiBtaW4odmFsdWVzKSB7XG4gICAgdmFyIG1pbiA9IHZhbHVlc1swXSB8fCAwO1xuICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgbWluID0gTWF0aC5taW4obWluLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1pbjtcbiAgfVxuICBmdW5jdGlvbiBtYXgodmFsdWVzKSB7XG4gICAgdmFyIG1heCA9IHZhbHVlc1swXSB8fCAwO1xuICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1heDtcbiAgfVxuICBmdW5jdGlvbiBtaW5NYXgodmFsdWVzKSB7XG4gICAgdmFyIG1pbiA9IHZhbHVlc1swXSB8fCAwO1xuICAgIHZhciBtYXggPSB2YWx1ZXNbMF0gfHwgMDtcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgdmFsdWUpO1xuICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbWluICsgXCIuLlwiICsgbWF4O1xuICB9XG4gIGZ1bmN0aW9uIGF2ZXJhZ2UodmFsdWVzKSB7XG4gICAgcmV0dXJuIHN1bShudWxsLCB2YWx1ZXMpIC8gdmFsdWVzLmxlbmd0aDtcbiAgfVxuICBmdW5jdGlvbiBtZWRpYW4odmFsdWVzKSB7XG4gICAgaWYgKCF2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbWlkID0gTWF0aC5mbG9vcih2YWx1ZXMubGVuZ3RoIC8gMik7XG4gICAgdmFyIG51bXMgPSBbXS5jb25jYXQodmFsdWVzKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggJSAyICE9PSAwID8gbnVtc1ttaWRdIDogKG51bXNbbWlkIC0gMV0gKyBudW1zW21pZF0pIC8gMjtcbiAgfVxuICBmdW5jdGlvbiB1bmlxdWUodmFsdWVzKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldCh2YWx1ZXMpLnZhbHVlcygpKTtcbiAgfVxuICBmdW5jdGlvbiB1bmlxdWVDb3VudCh2YWx1ZXMpIHtcbiAgICByZXR1cm4gbmV3IFNldCh2YWx1ZXMpLnNpemU7XG4gIH1cbiAgZnVuY3Rpb24gY291bnQodmFsdWVzKSB7XG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGg7XG4gIH1cblxuICB2YXIgYWdncmVnYXRpb25zID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBzdW06IHN1bSxcbiAgICBtaW46IG1pbixcbiAgICBtYXg6IG1heCxcbiAgICBtaW5NYXg6IG1pbk1heCxcbiAgICBhdmVyYWdlOiBhdmVyYWdlLFxuICAgIG1lZGlhbjogbWVkaWFuLFxuICAgIHVuaXF1ZTogdW5pcXVlLFxuICAgIHVuaXF1ZUNvdW50OiB1bmlxdWVDb3VudCxcbiAgICBjb3VudDogY291bnRcbiAgfSk7XG5cbiAgdmFyIGVtcHR5QXJyYXkgPSBbXTtcbiAgdmFyIGVtcHR5T2JqZWN0ID0ge307IC8vIEFjdGlvbnNcblxuICBhY3Rpb25zLnJlc2V0R3JvdXBCeSA9ICdyZXNldEdyb3VwQnknO1xuICBhY3Rpb25zLnNldEdyb3VwQnkgPSAnc2V0R3JvdXBCeSc7XG4gIGFjdGlvbnMudG9nZ2xlR3JvdXBCeSA9ICd0b2dnbGVHcm91cEJ5JztcbiAgdmFyIHVzZUdyb3VwQnkgPSBmdW5jdGlvbiB1c2VHcm91cEJ5KGhvb2tzKSB7XG4gICAgaG9va3MuZ2V0R3JvdXBCeVRvZ2dsZVByb3BzID0gW2RlZmF1bHRHZXRHcm91cEJ5VG9nZ2xlUHJvcHNdO1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyJDQpO1xuICAgIGhvb2tzLnZpc2libGVDb2x1bW5zRGVwcy5wdXNoKGZ1bmN0aW9uIChkZXBzLCBfcmVmKSB7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBfcmVmLmluc3RhbmNlO1xuICAgICAgcmV0dXJuIFtdLmNvbmNhdChkZXBzLCBbaW5zdGFuY2Uuc3RhdGUuZ3JvdXBCeV0pO1xuICAgIH0pO1xuICAgIGhvb2tzLnZpc2libGVDb2x1bW5zLnB1c2godmlzaWJsZUNvbHVtbnMpO1xuICAgIGhvb2tzLnVzZUluc3RhbmNlLnB1c2godXNlSW5zdGFuY2UkNCk7XG4gICAgaG9va3MucHJlcGFyZVJvdy5wdXNoKHByZXBhcmVSb3ckMSk7XG4gIH07XG4gIHVzZUdyb3VwQnkucGx1Z2luTmFtZSA9ICd1c2VHcm91cEJ5JztcblxuICB2YXIgZGVmYXVsdEdldEdyb3VwQnlUb2dnbGVQcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRHcm91cEJ5VG9nZ2xlUHJvcHMocHJvcHMsIF9yZWYyKSB7XG4gICAgdmFyIGhlYWRlciA9IF9yZWYyLmhlYWRlcjtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNsaWNrOiBoZWFkZXIuY2FuR3JvdXBCeSA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucGVyc2lzdCgpO1xuICAgICAgICBoZWFkZXIudG9nZ2xlR3JvdXBCeSgpO1xuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGN1cnNvcjogaGVhZGVyLmNhbkdyb3VwQnkgPyAncG9pbnRlcicgOiB1bmRlZmluZWRcbiAgICAgIH0sXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBHcm91cEJ5J1xuICAgIH1dO1xuICB9OyAvLyBSZWR1Y2VyXG5cblxuICBmdW5jdGlvbiByZWR1Y2VyJDQoc3RhdGUsIGFjdGlvbiwgcHJldmlvdXNTdGF0ZSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuaW5pdCkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgZ3JvdXBCeTogW11cbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMucmVzZXRHcm91cEJ5KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGdyb3VwQnk6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5ncm91cEJ5IHx8IFtdXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuc2V0R3JvdXBCeSkge1xuICAgICAgdmFyIHZhbHVlID0gYWN0aW9uLnZhbHVlO1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBncm91cEJ5OiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnRvZ2dsZUdyb3VwQnkpIHtcbiAgICAgIHZhciBjb2x1bW5JZCA9IGFjdGlvbi5jb2x1bW5JZCxcbiAgICAgICAgICBzZXRHcm91cEJ5ID0gYWN0aW9uLnZhbHVlO1xuICAgICAgdmFyIHJlc29sdmVkR3JvdXBCeSA9IHR5cGVvZiBzZXRHcm91cEJ5ICE9PSAndW5kZWZpbmVkJyA/IHNldEdyb3VwQnkgOiAhc3RhdGUuZ3JvdXBCeS5pbmNsdWRlcyhjb2x1bW5JZCk7XG5cbiAgICAgIGlmIChyZXNvbHZlZEdyb3VwQnkpIHtcbiAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICAgIGdyb3VwQnk6IFtdLmNvbmNhdChzdGF0ZS5ncm91cEJ5LCBbY29sdW1uSWRdKVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBncm91cEJ5OiBzdGF0ZS5ncm91cEJ5LmZpbHRlcihmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkICE9PSBjb2x1bW5JZDtcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHZpc2libGVDb2x1bW5zKGNvbHVtbnMsIF9yZWYzKSB7XG4gICAgdmFyIGdyb3VwQnkgPSBfcmVmMy5pbnN0YW5jZS5zdGF0ZS5ncm91cEJ5O1xuICAgIC8vIFNvcnQgZ3JvdXBlZCBjb2x1bW5zIHRvIHRoZSBzdGFydCBvZiB0aGUgY29sdW1uIGxpc3RcbiAgICAvLyBiZWZvcmUgdGhlIGhlYWRlcnMgYXJlIGJ1aWx0XG4gICAgdmFyIGdyb3VwQnlDb2x1bW5zID0gZ3JvdXBCeS5tYXAoZnVuY3Rpb24gKGcpIHtcbiAgICAgIHJldHVybiBjb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbCkge1xuICAgICAgICByZXR1cm4gY29sLmlkID09PSBnO1xuICAgICAgfSk7XG4gICAgfSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgIHZhciBub25Hcm91cEJ5Q29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKGZ1bmN0aW9uIChjb2wpIHtcbiAgICAgIHJldHVybiAhZ3JvdXBCeS5pbmNsdWRlcyhjb2wuaWQpO1xuICAgIH0pO1xuICAgIGNvbHVtbnMgPSBbXS5jb25jYXQoZ3JvdXBCeUNvbHVtbnMsIG5vbkdyb3VwQnlDb2x1bW5zKTtcbiAgICBjb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgY29sdW1uLmlzR3JvdXBlZCA9IGdyb3VwQnkuaW5jbHVkZXMoY29sdW1uLmlkKTtcbiAgICAgIGNvbHVtbi5ncm91cGVkSW5kZXggPSBncm91cEJ5LmluZGV4T2YoY29sdW1uLmlkKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIHZhciBkZWZhdWx0VXNlckFnZ3JlZ2F0aW9ucyA9IHt9O1xuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlJDQoaW5zdGFuY2UpIHtcbiAgICB2YXIgZGF0YSA9IGluc3RhbmNlLmRhdGEsXG4gICAgICAgIHJvd3MgPSBpbnN0YW5jZS5yb3dzLFxuICAgICAgICBmbGF0Um93cyA9IGluc3RhbmNlLmZsYXRSb3dzLFxuICAgICAgICByb3dzQnlJZCA9IGluc3RhbmNlLnJvd3NCeUlkLFxuICAgICAgICBhbGxDb2x1bW5zID0gaW5zdGFuY2UuYWxsQ29sdW1ucyxcbiAgICAgICAgZmxhdEhlYWRlcnMgPSBpbnN0YW5jZS5mbGF0SGVhZGVycyxcbiAgICAgICAgX2luc3RhbmNlJGdyb3VwQnlGbiA9IGluc3RhbmNlLmdyb3VwQnlGbixcbiAgICAgICAgZ3JvdXBCeUZuID0gX2luc3RhbmNlJGdyb3VwQnlGbiA9PT0gdm9pZCAwID8gZGVmYXVsdEdyb3VwQnlGbiA6IF9pbnN0YW5jZSRncm91cEJ5Rm4sXG4gICAgICAgIG1hbnVhbEdyb3VwQnkgPSBpbnN0YW5jZS5tYW51YWxHcm91cEJ5LFxuICAgICAgICBfaW5zdGFuY2UkYWdncmVnYXRpb24gPSBpbnN0YW5jZS5hZ2dyZWdhdGlvbnMsXG4gICAgICAgIHVzZXJBZ2dyZWdhdGlvbnMgPSBfaW5zdGFuY2UkYWdncmVnYXRpb24gPT09IHZvaWQgMCA/IGRlZmF1bHRVc2VyQWdncmVnYXRpb25zIDogX2luc3RhbmNlJGFnZ3JlZ2F0aW9uLFxuICAgICAgICBwbHVnaW5zID0gaW5zdGFuY2UucGx1Z2lucyxcbiAgICAgICAgZ3JvdXBCeSA9IGluc3RhbmNlLnN0YXRlLmdyb3VwQnksXG4gICAgICAgIGRpc3BhdGNoID0gaW5zdGFuY2UuZGlzcGF0Y2gsXG4gICAgICAgIF9pbnN0YW5jZSRhdXRvUmVzZXRHciA9IGluc3RhbmNlLmF1dG9SZXNldEdyb3VwQnksXG4gICAgICAgIGF1dG9SZXNldEdyb3VwQnkgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0R3IgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0R3IsXG4gICAgICAgIGRpc2FibGVHcm91cEJ5ID0gaW5zdGFuY2UuZGlzYWJsZUdyb3VwQnksXG4gICAgICAgIGRlZmF1bHRDYW5Hcm91cEJ5ID0gaW5zdGFuY2UuZGVmYXVsdENhbkdyb3VwQnksXG4gICAgICAgIGdldEhvb2tzID0gaW5zdGFuY2UuZ2V0SG9va3M7XG4gICAgZW5zdXJlUGx1Z2luT3JkZXIocGx1Z2lucywgWyd1c2VDb2x1bW5PcmRlcicsICd1c2VGaWx0ZXJzJ10sICd1c2VHcm91cEJ5Jyk7XG4gICAgdmFyIGdldEluc3RhbmNlID0gdXNlR2V0TGF0ZXN0KGluc3RhbmNlKTtcbiAgICBhbGxDb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgdmFyIGFjY2Vzc29yID0gY29sdW1uLmFjY2Vzc29yLFxuICAgICAgICAgIGRlZmF1bHRDb2x1bW5Hcm91cEJ5ID0gY29sdW1uLmRlZmF1bHRHcm91cEJ5LFxuICAgICAgICAgIGNvbHVtbkRpc2FibGVHcm91cEJ5ID0gY29sdW1uLmRpc2FibGVHcm91cEJ5O1xuICAgICAgY29sdW1uLmNhbkdyb3VwQnkgPSBhY2Nlc3NvciA/IGdldEZpcnN0RGVmaW5lZChjb2x1bW4uY2FuR3JvdXBCeSwgY29sdW1uRGlzYWJsZUdyb3VwQnkgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgZGlzYWJsZUdyb3VwQnkgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgdHJ1ZSkgOiBnZXRGaXJzdERlZmluZWQoY29sdW1uLmNhbkdyb3VwQnksIGRlZmF1bHRDb2x1bW5Hcm91cEJ5LCBkZWZhdWx0Q2FuR3JvdXBCeSwgZmFsc2UpO1xuXG4gICAgICBpZiAoY29sdW1uLmNhbkdyb3VwQnkpIHtcbiAgICAgICAgY29sdW1uLnRvZ2dsZUdyb3VwQnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGluc3RhbmNlLnRvZ2dsZUdyb3VwQnkoY29sdW1uLmlkKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29sdW1uLkFnZ3JlZ2F0ZWQgPSBjb2x1bW4uQWdncmVnYXRlZCB8fCBjb2x1bW4uQ2VsbDtcbiAgICB9KTtcbiAgICB2YXIgdG9nZ2xlR3JvdXBCeSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChjb2x1bW5JZCwgdmFsdWUpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy50b2dnbGVHcm91cEJ5LFxuICAgICAgICBjb2x1bW5JZDogY29sdW1uSWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIHNldEdyb3VwQnkgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5zZXRHcm91cEJ5LFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIGZsYXRIZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuICAgICAgaGVhZGVyLmdldEdyb3VwQnlUb2dnbGVQcm9wcyA9IG1ha2VQcm9wR2V0dGVyKGdldEhvb2tzKCkuZ2V0R3JvdXBCeVRvZ2dsZVByb3BzLCB7XG4gICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpLFxuICAgICAgICBoZWFkZXI6IGhlYWRlclxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB2YXIgX1JlYWN0JHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChtYW51YWxHcm91cEJ5IHx8ICFncm91cEJ5Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW3Jvd3MsIGZsYXRSb3dzLCByb3dzQnlJZCwgZW1wdHlBcnJheSwgZW1wdHlPYmplY3QsIGZsYXRSb3dzLCByb3dzQnlJZF07XG4gICAgICB9IC8vIEVuc3VyZSB0aGF0IHRoZSBsaXN0IG9mIGZpbHRlcmVkIGNvbHVtbnMgZXhpc3RcblxuXG4gICAgICB2YXIgZXhpc3RpbmdHcm91cEJ5ID0gZ3JvdXBCeS5maWx0ZXIoZnVuY3Rpb24gKGcpIHtcbiAgICAgICAgcmV0dXJuIGFsbENvbHVtbnMuZmluZChmdW5jdGlvbiAoY29sKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbC5pZCA9PT0gZztcbiAgICAgICAgfSk7XG4gICAgICB9KTsgLy8gRmluZCB0aGUgY29sdW1ucyB0aGF0IGNhbiBvciBhcmUgYWdncmVnYXRpbmdcbiAgICAgIC8vIFVzZXMgZWFjaCBjb2x1bW4gdG8gYWdncmVnYXRlIHJvd3MgaW50byBhIHNpbmdsZSB2YWx1ZVxuXG4gICAgICB2YXIgYWdncmVnYXRlUm93c1RvVmFsdWVzID0gZnVuY3Rpb24gYWdncmVnYXRlUm93c1RvVmFsdWVzKGxlYWZSb3dzLCBncm91cGVkUm93cywgZGVwdGgpIHtcbiAgICAgICAgdmFyIHZhbHVlcyA9IHt9O1xuICAgICAgICBhbGxDb2x1bW5zLmZvckVhY2goZnVuY3Rpb24gKGNvbHVtbikge1xuICAgICAgICAgIC8vIERvbid0IGFnZ3JlZ2F0ZSBjb2x1bW5zIHRoYXQgYXJlIGluIHRoZSBncm91cEJ5XG4gICAgICAgICAgaWYgKGV4aXN0aW5nR3JvdXBCeS5pbmNsdWRlcyhjb2x1bW4uaWQpKSB7XG4gICAgICAgICAgICB2YWx1ZXNbY29sdW1uLmlkXSA9IGdyb3VwZWRSb3dzWzBdID8gZ3JvdXBlZFJvd3NbMF0udmFsdWVzW2NvbHVtbi5pZF0gOiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gLy8gQWdncmVnYXRlIHRoZSB2YWx1ZXNcblxuXG4gICAgICAgICAgdmFyIGFnZ3JlZ2F0ZUZuID0gdHlwZW9mIGNvbHVtbi5hZ2dyZWdhdGUgPT09ICdmdW5jdGlvbicgPyBjb2x1bW4uYWdncmVnYXRlIDogdXNlckFnZ3JlZ2F0aW9uc1tjb2x1bW4uYWdncmVnYXRlXSB8fCBhZ2dyZWdhdGlvbnNbY29sdW1uLmFnZ3JlZ2F0ZV07XG5cbiAgICAgICAgICBpZiAoYWdncmVnYXRlRm4pIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgY29sdW1uVmFsdWVzIHRvIGFnZ3JlZ2F0ZVxuICAgICAgICAgICAgdmFyIGdyb3VwZWRWYWx1ZXMgPSBncm91cGVkUm93cy5tYXAoZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgICAgICByZXR1cm4gcm93LnZhbHVlc1tjb2x1bW4uaWRdO1xuICAgICAgICAgICAgfSk7IC8vIEdldCB0aGUgY29sdW1uVmFsdWVzIHRvIGFnZ3JlZ2F0ZVxuXG4gICAgICAgICAgICB2YXIgbGVhZlZhbHVlcyA9IGxlYWZSb3dzLm1hcChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgICAgIHZhciBjb2x1bW5WYWx1ZSA9IHJvdy52YWx1ZXNbY29sdW1uLmlkXTtcblxuICAgICAgICAgICAgICBpZiAoIWRlcHRoICYmIGNvbHVtbi5hZ2dyZWdhdGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBhZ2dyZWdhdGVWYWx1ZUZuID0gdHlwZW9mIGNvbHVtbi5hZ2dyZWdhdGVWYWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IGNvbHVtbi5hZ2dyZWdhdGVWYWx1ZSA6IHVzZXJBZ2dyZWdhdGlvbnNbY29sdW1uLmFnZ3JlZ2F0ZVZhbHVlXSB8fCBhZ2dyZWdhdGlvbnNbY29sdW1uLmFnZ3JlZ2F0ZVZhbHVlXTtcblxuICAgICAgICAgICAgICAgIGlmICghYWdncmVnYXRlVmFsdWVGbikge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhY3QgVGFibGU6IEludmFsaWQgY29sdW1uLmFnZ3JlZ2F0ZVZhbHVlIG9wdGlvbiBmb3IgY29sdW1uIGxpc3RlZCBhYm92ZVwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb2x1bW5WYWx1ZSA9IGFnZ3JlZ2F0ZVZhbHVlRm4oY29sdW1uVmFsdWUsIHJvdywgY29sdW1uKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBjb2x1bW5WYWx1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFsdWVzW2NvbHVtbi5pZF0gPSBhZ2dyZWdhdGVGbihsZWFmVmFsdWVzLCBncm91cGVkVmFsdWVzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi5hZ2dyZWdhdGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyh7XG4gICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0IFRhYmxlOiBJbnZhbGlkIGNvbHVtbi5hZ2dyZWdhdGUgb3B0aW9uIGZvciBjb2x1bW4gbGlzdGVkIGFib3ZlXCIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZXNbY29sdW1uLmlkXSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICAgIH07XG5cbiAgICAgIHZhciBncm91cGVkRmxhdFJvd3MgPSBbXTtcbiAgICAgIHZhciBncm91cGVkUm93c0J5SWQgPSB7fTtcbiAgICAgIHZhciBvbmx5R3JvdXBlZEZsYXRSb3dzID0gW107XG4gICAgICB2YXIgb25seUdyb3VwZWRSb3dzQnlJZCA9IHt9O1xuICAgICAgdmFyIG5vbkdyb3VwZWRGbGF0Um93cyA9IFtdO1xuICAgICAgdmFyIG5vbkdyb3VwZWRSb3dzQnlJZCA9IHt9OyAvLyBSZWN1cnNpdmVseSBncm91cCB0aGUgZGF0YVxuXG4gICAgICB2YXIgZ3JvdXBVcFJlY3Vyc2l2ZWx5ID0gZnVuY3Rpb24gZ3JvdXBVcFJlY3Vyc2l2ZWx5KHJvd3MsIGRlcHRoLCBwYXJlbnRJZCkge1xuICAgICAgICBpZiAoZGVwdGggPT09IHZvaWQgMCkge1xuICAgICAgICAgIGRlcHRoID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXMgaXMgdGhlIGxhc3QgbGV2ZWwsIGp1c3QgcmV0dXJuIHRoZSByb3dzXG4gICAgICAgIGlmIChkZXB0aCA9PT0gZXhpc3RpbmdHcm91cEJ5Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiByb3dzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvbHVtbklkID0gZXhpc3RpbmdHcm91cEJ5W2RlcHRoXTsgLy8gR3JvdXAgdGhlIHJvd3MgdG9nZXRoZXIgZm9yIHRoaXMgbGV2ZWxcblxuICAgICAgICB2YXIgcm93R3JvdXBzTWFwID0gZ3JvdXBCeUZuKHJvd3MsIGNvbHVtbklkKTsgLy8gUGVmb3JtIGFnZ3JlZ2F0aW9ucyBmb3IgZWFjaCBncm91cFxuXG4gICAgICAgIHZhciBhZ2dyZWdhdGVkR3JvdXBlZFJvd3MgPSBPYmplY3QuZW50cmllcyhyb3dHcm91cHNNYXApLm1hcChmdW5jdGlvbiAoX3JlZjQsIGluZGV4KSB7XG4gICAgICAgICAgdmFyIGdyb3VwQnlWYWwgPSBfcmVmNFswXSxcbiAgICAgICAgICAgICAgZ3JvdXBlZFJvd3MgPSBfcmVmNFsxXTtcbiAgICAgICAgICB2YXIgaWQgPSBjb2x1bW5JZCArIFwiOlwiICsgZ3JvdXBCeVZhbDtcbiAgICAgICAgICBpZCA9IHBhcmVudElkID8gcGFyZW50SWQgKyBcIj5cIiArIGlkIDogaWQ7IC8vIEZpcnN0LCBSZWN1cnNlIHRvIGdyb3VwIHN1YiByb3dzIGJlZm9yZSBhZ2dyZWdhdGlvblxuXG4gICAgICAgICAgdmFyIHN1YlJvd3MgPSBncm91cFVwUmVjdXJzaXZlbHkoZ3JvdXBlZFJvd3MsIGRlcHRoICsgMSwgaWQpOyAvLyBGbGF0dGVuIHRoZSBsZWFmIHJvd3Mgb2YgdGhlIHJvd3MgaW4gdGhpcyBncm91cFxuXG4gICAgICAgICAgdmFyIGxlYWZSb3dzID0gZGVwdGggPyBmbGF0dGVuQnkoZ3JvdXBlZFJvd3MsICdsZWFmUm93cycpIDogZ3JvdXBlZFJvd3M7XG4gICAgICAgICAgdmFyIHZhbHVlcyA9IGFnZ3JlZ2F0ZVJvd3NUb1ZhbHVlcyhsZWFmUm93cywgZ3JvdXBlZFJvd3MsIGRlcHRoKTtcbiAgICAgICAgICB2YXIgcm93ID0ge1xuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgaXNHcm91cGVkOiB0cnVlLFxuICAgICAgICAgICAgZ3JvdXBCeUlEOiBjb2x1bW5JZCxcbiAgICAgICAgICAgIGdyb3VwQnlWYWw6IGdyb3VwQnlWYWwsXG4gICAgICAgICAgICB2YWx1ZXM6IHZhbHVlcyxcbiAgICAgICAgICAgIHN1YlJvd3M6IHN1YlJvd3MsXG4gICAgICAgICAgICBsZWFmUm93czogbGVhZlJvd3MsXG4gICAgICAgICAgICBkZXB0aDogZGVwdGgsXG4gICAgICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgICAgICB9O1xuICAgICAgICAgIHN1YlJvd3MuZm9yRWFjaChmdW5jdGlvbiAoc3ViUm93KSB7XG4gICAgICAgICAgICBncm91cGVkRmxhdFJvd3MucHVzaChzdWJSb3cpO1xuICAgICAgICAgICAgZ3JvdXBlZFJvd3NCeUlkW3N1YlJvdy5pZF0gPSBzdWJSb3c7XG5cbiAgICAgICAgICAgIGlmIChzdWJSb3cuaXNHcm91cGVkKSB7XG4gICAgICAgICAgICAgIG9ubHlHcm91cGVkRmxhdFJvd3MucHVzaChzdWJSb3cpO1xuICAgICAgICAgICAgICBvbmx5R3JvdXBlZFJvd3NCeUlkW3N1YlJvdy5pZF0gPSBzdWJSb3c7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBub25Hcm91cGVkRmxhdFJvd3MucHVzaChzdWJSb3cpO1xuICAgICAgICAgICAgICBub25Hcm91cGVkUm93c0J5SWRbc3ViUm93LmlkXSA9IHN1YlJvdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcm93O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGFnZ3JlZ2F0ZWRHcm91cGVkUm93cztcbiAgICAgIH07XG5cbiAgICAgIHZhciBncm91cGVkUm93cyA9IGdyb3VwVXBSZWN1cnNpdmVseShyb3dzKTtcbiAgICAgIGdyb3VwZWRSb3dzLmZvckVhY2goZnVuY3Rpb24gKHN1YlJvdykge1xuICAgICAgICBncm91cGVkRmxhdFJvd3MucHVzaChzdWJSb3cpO1xuICAgICAgICBncm91cGVkUm93c0J5SWRbc3ViUm93LmlkXSA9IHN1YlJvdztcblxuICAgICAgICBpZiAoc3ViUm93LmlzR3JvdXBlZCkge1xuICAgICAgICAgIG9ubHlHcm91cGVkRmxhdFJvd3MucHVzaChzdWJSb3cpO1xuICAgICAgICAgIG9ubHlHcm91cGVkUm93c0J5SWRbc3ViUm93LmlkXSA9IHN1YlJvdztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub25Hcm91cGVkRmxhdFJvd3MucHVzaChzdWJSb3cpO1xuICAgICAgICAgIG5vbkdyb3VwZWRSb3dzQnlJZFtzdWJSb3cuaWRdID0gc3ViUm93O1xuICAgICAgICB9XG4gICAgICB9KTsgLy8gQXNzaWduIHRoZSBuZXcgZGF0YVxuXG4gICAgICByZXR1cm4gW2dyb3VwZWRSb3dzLCBncm91cGVkRmxhdFJvd3MsIGdyb3VwZWRSb3dzQnlJZCwgb25seUdyb3VwZWRGbGF0Um93cywgb25seUdyb3VwZWRSb3dzQnlJZCwgbm9uR3JvdXBlZEZsYXRSb3dzLCBub25Hcm91cGVkUm93c0J5SWRdO1xuICAgIH0sIFttYW51YWxHcm91cEJ5LCBncm91cEJ5LCByb3dzLCBmbGF0Um93cywgcm93c0J5SWQsIGFsbENvbHVtbnMsIHVzZXJBZ2dyZWdhdGlvbnMsIGdyb3VwQnlGbl0pLFxuICAgICAgICBncm91cGVkUm93cyA9IF9SZWFjdCR1c2VNZW1vWzBdLFxuICAgICAgICBncm91cGVkRmxhdFJvd3MgPSBfUmVhY3QkdXNlTWVtb1sxXSxcbiAgICAgICAgZ3JvdXBlZFJvd3NCeUlkID0gX1JlYWN0JHVzZU1lbW9bMl0sXG4gICAgICAgIG9ubHlHcm91cGVkRmxhdFJvd3MgPSBfUmVhY3QkdXNlTWVtb1szXSxcbiAgICAgICAgb25seUdyb3VwZWRSb3dzQnlJZCA9IF9SZWFjdCR1c2VNZW1vWzRdLFxuICAgICAgICBub25Hcm91cGVkRmxhdFJvd3MgPSBfUmVhY3QkdXNlTWVtb1s1XSxcbiAgICAgICAgbm9uR3JvdXBlZFJvd3NCeUlkID0gX1JlYWN0JHVzZU1lbW9bNl07XG5cbiAgICB2YXIgZ2V0QXV0b1Jlc2V0R3JvdXBCeSA9IHVzZUdldExhdGVzdChhdXRvUmVzZXRHcm91cEJ5KTtcbiAgICB1c2VNb3VudGVkTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChnZXRBdXRvUmVzZXRHcm91cEJ5KCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRHcm91cEJ5XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIFtkaXNwYXRjaCwgbWFudWFsR3JvdXBCeSA/IG51bGwgOiBkYXRhXSk7XG4gICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSwge1xuICAgICAgcHJlR3JvdXBlZFJvd3M6IHJvd3MsXG4gICAgICBwcmVHcm91cGVkRmxhdFJvdzogZmxhdFJvd3MsXG4gICAgICBwcmVHcm91cGVkUm93c0J5SWQ6IHJvd3NCeUlkLFxuICAgICAgZ3JvdXBlZFJvd3M6IGdyb3VwZWRSb3dzLFxuICAgICAgZ3JvdXBlZEZsYXRSb3dzOiBncm91cGVkRmxhdFJvd3MsXG4gICAgICBncm91cGVkUm93c0J5SWQ6IGdyb3VwZWRSb3dzQnlJZCxcbiAgICAgIG9ubHlHcm91cGVkRmxhdFJvd3M6IG9ubHlHcm91cGVkRmxhdFJvd3MsXG4gICAgICBvbmx5R3JvdXBlZFJvd3NCeUlkOiBvbmx5R3JvdXBlZFJvd3NCeUlkLFxuICAgICAgbm9uR3JvdXBlZEZsYXRSb3dzOiBub25Hcm91cGVkRmxhdFJvd3MsXG4gICAgICBub25Hcm91cGVkUm93c0J5SWQ6IG5vbkdyb3VwZWRSb3dzQnlJZCxcbiAgICAgIHJvd3M6IGdyb3VwZWRSb3dzLFxuICAgICAgZmxhdFJvd3M6IGdyb3VwZWRGbGF0Um93cyxcbiAgICAgIHJvd3NCeUlkOiBncm91cGVkUm93c0J5SWQsXG4gICAgICB0b2dnbGVHcm91cEJ5OiB0b2dnbGVHcm91cEJ5LFxuICAgICAgc2V0R3JvdXBCeTogc2V0R3JvdXBCeVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJlcGFyZVJvdyQxKHJvdykge1xuICAgIHJvdy5hbGxDZWxscy5mb3JFYWNoKGZ1bmN0aW9uIChjZWxsKSB7XG4gICAgICB2YXIgX3JvdyRzdWJSb3dzO1xuXG4gICAgICAvLyBHcm91cGVkIGNlbGxzIGFyZSBpbiB0aGUgZ3JvdXBCeSBhbmQgdGhlIHBpdm90IGNlbGwgZm9yIHRoZSByb3dcbiAgICAgIGNlbGwuaXNHcm91cGVkID0gY2VsbC5jb2x1bW4uaXNHcm91cGVkICYmIGNlbGwuY29sdW1uLmlkID09PSByb3cuZ3JvdXBCeUlEOyAvLyBQbGFjZWhvbGRlciBjZWxscyBhcmUgYW55IGNvbHVtbnMgaW4gdGhlIGdyb3VwQnkgdGhhdCBhcmUgbm90IGdyb3VwZWRcblxuICAgICAgY2VsbC5pc1BsYWNlaG9sZGVyID0gIWNlbGwuaXNHcm91cGVkICYmIGNlbGwuY29sdW1uLmlzR3JvdXBlZDsgLy8gQWdncmVnYXRlZCBjZWxscyBhcmUgbm90IGdyb3VwZWQsIG5vdCByZXBlYXRlZCwgYnV0IHN0aWxsIGhhdmUgc3ViUm93c1xuXG4gICAgICBjZWxsLmlzQWdncmVnYXRlZCA9ICFjZWxsLmlzR3JvdXBlZCAmJiAhY2VsbC5pc1BsYWNlaG9sZGVyICYmICgoX3JvdyRzdWJSb3dzID0gcm93LnN1YlJvd3MpID09IG51bGwgPyB2b2lkIDAgOiBfcm93JHN1YlJvd3MubGVuZ3RoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlZmF1bHRHcm91cEJ5Rm4ocm93cywgY29sdW1uSWQpIHtcbiAgICByZXR1cm4gcm93cy5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIHJvdywgaSkge1xuICAgICAgLy8gVE9ETzogTWlnaHQgd2FudCB0byBpbXBsZW1lbnQgYSBrZXkgc2VyaWFsaXplciBoZXJlIHNvXG4gICAgICAvLyBpcnJlZ3VsYXIgY29sdW1uIHZhbHVlcyBjYW4gc3RpbGwgYmUgZ3JvdXBlZCBpZiBuZWVkZWQ/XG4gICAgICB2YXIgcmVzS2V5ID0gXCJcIiArIHJvdy52YWx1ZXNbY29sdW1uSWRdO1xuICAgICAgcHJldltyZXNLZXldID0gQXJyYXkuaXNBcnJheShwcmV2W3Jlc0tleV0pID8gcHJldltyZXNLZXldIDogW107XG4gICAgICBwcmV2W3Jlc0tleV0ucHVzaChyb3cpO1xuICAgICAgcmV0dXJuIHByZXY7XG4gICAgfSwge30pO1xuICB9XG5cbiAgdmFyIHJlU3BsaXRBbHBoYU51bWVyaWMgPSAvKFswLTldKykvZ207IC8vIE1peGVkIHNvcnRpbmcgaXMgc2xvdywgYnV0IHZlcnkgaW5jbHVzaXZlIG9mIG1hbnkgZWRnZSBjYXNlcy5cbiAgLy8gSXQgaGFuZGxlcyBudW1iZXJzLCBtaXhlZCBhbHBoYW51bWVyaWMgY29tYmluYXRpb25zLCBhbmQgZXZlblxuICAvLyBudWxsLCB1bmRlZmluZWQsIGFuZCBJbmZpbml0eVxuXG4gIHZhciBhbHBoYW51bWVyaWMgPSBmdW5jdGlvbiBhbHBoYW51bWVyaWMocm93QSwgcm93QiwgY29sdW1uSWQpIHtcbiAgICB2YXIgYSA9IGdldFJvd1ZhbHVlQnlDb2x1bW5JRChyb3dBLCBjb2x1bW5JZCk7XG4gICAgdmFyIGIgPSBnZXRSb3dWYWx1ZUJ5Q29sdW1uSUQocm93QiwgY29sdW1uSWQpOyAvLyBGb3JjZSB0byBzdHJpbmdzIChvciBcIlwiIGZvciB1bnN1cHBvcnRlZCB0eXBlcylcblxuICAgIGEgPSB0b1N0cmluZyhhKTtcbiAgICBiID0gdG9TdHJpbmcoYik7IC8vIFNwbGl0IG9uIG51bWJlciBncm91cHMsIGJ1dCBrZWVwIHRoZSBkZWxpbWl0ZXJcbiAgICAvLyBUaGVuIHJlbW92ZSBmYWxzZXkgc3BsaXQgdmFsdWVzXG5cbiAgICBhID0gYS5zcGxpdChyZVNwbGl0QWxwaGFOdW1lcmljKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgYiA9IGIuc3BsaXQocmVTcGxpdEFscGhhTnVtZXJpYykuZmlsdGVyKEJvb2xlYW4pOyAvLyBXaGlsZVxuXG4gICAgd2hpbGUgKGEubGVuZ3RoICYmIGIubGVuZ3RoKSB7XG4gICAgICB2YXIgYWEgPSBhLnNoaWZ0KCk7XG4gICAgICB2YXIgYmIgPSBiLnNoaWZ0KCk7XG4gICAgICB2YXIgYW4gPSBwYXJzZUludChhYSwgMTApO1xuICAgICAgdmFyIGJuID0gcGFyc2VJbnQoYmIsIDEwKTtcbiAgICAgIHZhciBjb21ibyA9IFthbiwgYm5dLnNvcnQoKTsgLy8gQm90aCBhcmUgc3RyaW5nXG5cbiAgICAgIGlmIChpc05hTihjb21ib1swXSkpIHtcbiAgICAgICAgaWYgKGFhID4gYmIpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYiA+IGFhKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIE9uZSBpcyBhIHN0cmluZywgb25lIGlzIGEgbnVtYmVyXG5cblxuICAgICAgaWYgKGlzTmFOKGNvbWJvWzFdKSkge1xuICAgICAgICByZXR1cm4gaXNOYU4oYW4pID8gLTEgOiAxO1xuICAgICAgfSAvLyBCb3RoIGFyZSBudW1iZXJzXG5cblxuICAgICAgaWYgKGFuID4gYm4pIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIGlmIChibiA+IGFuKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYS5sZW5ndGggLSBiLmxlbmd0aDtcbiAgfTtcbiAgZnVuY3Rpb24gZGF0ZXRpbWUocm93QSwgcm93QiwgY29sdW1uSWQpIHtcbiAgICB2YXIgYSA9IGdldFJvd1ZhbHVlQnlDb2x1bW5JRChyb3dBLCBjb2x1bW5JZCk7XG4gICAgdmFyIGIgPSBnZXRSb3dWYWx1ZUJ5Q29sdW1uSUQocm93QiwgY29sdW1uSWQpO1xuICAgIGEgPSBhLmdldFRpbWUoKTtcbiAgICBiID0gYi5nZXRUaW1lKCk7XG4gICAgcmV0dXJuIGNvbXBhcmVCYXNpYyhhLCBiKTtcbiAgfVxuICBmdW5jdGlvbiBiYXNpYyhyb3dBLCByb3dCLCBjb2x1bW5JZCkge1xuICAgIHZhciBhID0gZ2V0Um93VmFsdWVCeUNvbHVtbklEKHJvd0EsIGNvbHVtbklkKTtcbiAgICB2YXIgYiA9IGdldFJvd1ZhbHVlQnlDb2x1bW5JRChyb3dCLCBjb2x1bW5JZCk7XG4gICAgcmV0dXJuIGNvbXBhcmVCYXNpYyhhLCBiKTtcbiAgfSAvLyBVdGlsc1xuXG4gIGZ1bmN0aW9uIGNvbXBhcmVCYXNpYyhhLCBiKSB7XG4gICAgcmV0dXJuIGEgPT09IGIgPyAwIDogYSA+IGIgPyAxIDogLTE7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRSb3dWYWx1ZUJ5Q29sdW1uSUQocm93LCBjb2x1bW5JZCkge1xuICAgIHJldHVybiByb3cudmFsdWVzW2NvbHVtbklkXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRvU3RyaW5nKGEpIHtcbiAgICBpZiAodHlwZW9mIGEgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoaXNOYU4oYSkgfHwgYSA9PT0gSW5maW5pdHkgfHwgYSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFN0cmluZyhhKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB2YXIgc29ydFR5cGVzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBhbHBoYW51bWVyaWM6IGFscGhhbnVtZXJpYyxcbiAgICBkYXRldGltZTogZGF0ZXRpbWUsXG4gICAgYmFzaWM6IGJhc2ljXG4gIH0pO1xuXG4gIGFjdGlvbnMucmVzZXRTb3J0QnkgPSAncmVzZXRTb3J0QnknO1xuICBhY3Rpb25zLnNldFNvcnRCeSA9ICdzZXRTb3J0QnknO1xuICBhY3Rpb25zLnRvZ2dsZVNvcnRCeSA9ICd0b2dnbGVTb3J0QnknO1xuICBhY3Rpb25zLmNsZWFyU29ydEJ5ID0gJ2NsZWFyU29ydEJ5JztcbiAgZGVmYXVsdENvbHVtbi5zb3J0VHlwZSA9ICdhbHBoYW51bWVyaWMnO1xuICBkZWZhdWx0Q29sdW1uLnNvcnREZXNjRmlyc3QgPSBmYWxzZTtcbiAgdmFyIHVzZVNvcnRCeSA9IGZ1bmN0aW9uIHVzZVNvcnRCeShob29rcykge1xuICAgIGhvb2tzLmdldFNvcnRCeVRvZ2dsZVByb3BzID0gW2RlZmF1bHRHZXRTb3J0QnlUb2dnbGVQcm9wc107XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIkNSk7XG4gICAgaG9va3MudXNlSW5zdGFuY2UucHVzaCh1c2VJbnN0YW5jZSQ1KTtcbiAgfTtcbiAgdXNlU29ydEJ5LnBsdWdpbk5hbWUgPSAndXNlU29ydEJ5JztcblxuICB2YXIgZGVmYXVsdEdldFNvcnRCeVRvZ2dsZVByb3BzID0gZnVuY3Rpb24gZGVmYXVsdEdldFNvcnRCeVRvZ2dsZVByb3BzKHByb3BzLCBfcmVmKSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZSxcbiAgICAgICAgY29sdW1uID0gX3JlZi5jb2x1bW47XG4gICAgdmFyIF9pbnN0YW5jZSRpc011bHRpU29ydCA9IGluc3RhbmNlLmlzTXVsdGlTb3J0RXZlbnQsXG4gICAgICAgIGlzTXVsdGlTb3J0RXZlbnQgPSBfaW5zdGFuY2UkaXNNdWx0aVNvcnQgPT09IHZvaWQgMCA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gZS5zaGlmdEtleTtcbiAgICB9IDogX2luc3RhbmNlJGlzTXVsdGlTb3J0O1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIG9uQ2xpY2s6IGNvbHVtbi5jYW5Tb3J0ID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wZXJzaXN0KCk7XG4gICAgICAgIGNvbHVtbi50b2dnbGVTb3J0QnkodW5kZWZpbmVkLCAhaW5zdGFuY2UuZGlzYWJsZU11bHRpU29ydCAmJiBpc011bHRpU29ydEV2ZW50KGUpKTtcbiAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6IGNvbHVtbi5jYW5Tb3J0ID8gJ3BvaW50ZXInIDogdW5kZWZpbmVkXG4gICAgICB9LFxuICAgICAgdGl0bGU6IGNvbHVtbi5jYW5Tb3J0ID8gJ1RvZ2dsZSBTb3J0QnknIDogdW5kZWZpbmVkXG4gICAgfV07XG4gIH07IC8vIFJlZHVjZXJcblxuXG4gIGZ1bmN0aW9uIHJlZHVjZXIkNShzdGF0ZSwgYWN0aW9uLCBwcmV2aW91c1N0YXRlLCBpbnN0YW5jZSkge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5pbml0KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBzb3J0Qnk6IFtdXG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0U29ydEJ5KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHNvcnRCeTogaW5zdGFuY2UuaW5pdGlhbFN0YXRlLnNvcnRCeSB8fCBbXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmNsZWFyU29ydEJ5KSB7XG4gICAgICB2YXIgc29ydEJ5ID0gc3RhdGUuc29ydEJ5O1xuICAgICAgdmFyIG5ld1NvcnRCeSA9IHNvcnRCeS5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuaWQgIT09IGFjdGlvbi5jb2x1bW5JZDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBzb3J0Qnk6IG5ld1NvcnRCeVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldFNvcnRCeSkge1xuICAgICAgdmFyIF9zb3J0QnkgPSBhY3Rpb24uc29ydEJ5O1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBzb3J0Qnk6IF9zb3J0QnlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy50b2dnbGVTb3J0QnkpIHtcbiAgICAgIHZhciBjb2x1bW5JZCA9IGFjdGlvbi5jb2x1bW5JZCxcbiAgICAgICAgICBkZXNjID0gYWN0aW9uLmRlc2MsXG4gICAgICAgICAgbXVsdGkgPSBhY3Rpb24ubXVsdGk7XG4gICAgICB2YXIgYWxsQ29sdW1ucyA9IGluc3RhbmNlLmFsbENvbHVtbnMsXG4gICAgICAgICAgZGlzYWJsZU11bHRpU29ydCA9IGluc3RhbmNlLmRpc2FibGVNdWx0aVNvcnQsXG4gICAgICAgICAgZGlzYWJsZVNvcnRSZW1vdmUgPSBpbnN0YW5jZS5kaXNhYmxlU29ydFJlbW92ZSxcbiAgICAgICAgICBkaXNhYmxlTXVsdGlSZW1vdmUgPSBpbnN0YW5jZS5kaXNhYmxlTXVsdGlSZW1vdmUsXG4gICAgICAgICAgX2luc3RhbmNlJG1heE11bHRpU29yID0gaW5zdGFuY2UubWF4TXVsdGlTb3J0Q29sQ291bnQsXG4gICAgICAgICAgbWF4TXVsdGlTb3J0Q29sQ291bnQgPSBfaW5zdGFuY2UkbWF4TXVsdGlTb3IgPT09IHZvaWQgMCA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogX2luc3RhbmNlJG1heE11bHRpU29yO1xuICAgICAgdmFyIF9zb3J0QnkyID0gc3RhdGUuc29ydEJ5OyAvLyBGaW5kIHRoZSBjb2x1bW4gZm9yIHRoaXMgY29sdW1uSWRcblxuICAgICAgdmFyIGNvbHVtbiA9IGFsbENvbHVtbnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5pZCA9PT0gY29sdW1uSWQ7XG4gICAgICB9KTtcbiAgICAgIHZhciBzb3J0RGVzY0ZpcnN0ID0gY29sdW1uLnNvcnREZXNjRmlyc3Q7IC8vIEZpbmQgYW55IGV4aXN0aW5nIHNvcnRCeSBmb3IgdGhpcyBjb2x1bW5cblxuICAgICAgdmFyIGV4aXN0aW5nU29ydEJ5ID0gX3NvcnRCeTIuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5pZCA9PT0gY29sdW1uSWQ7XG4gICAgICB9KTtcblxuICAgICAgdmFyIGV4aXN0aW5nSW5kZXggPSBfc29ydEJ5Mi5maW5kSW5kZXgoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuaWQgPT09IGNvbHVtbklkO1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBoYXNEZXNjRGVmaW5lZCA9IHR5cGVvZiBkZXNjICE9PSAndW5kZWZpbmVkJyAmJiBkZXNjICE9PSBudWxsO1xuICAgICAgdmFyIF9uZXdTb3J0QnkgPSBbXTsgLy8gV2hhdCBzaG91bGQgd2UgZG8gd2l0aCB0aGlzIHNvcnQgYWN0aW9uP1xuXG4gICAgICB2YXIgc29ydEFjdGlvbjtcblxuICAgICAgaWYgKCFkaXNhYmxlTXVsdGlTb3J0ICYmIG11bHRpKSB7XG4gICAgICAgIGlmIChleGlzdGluZ1NvcnRCeSkge1xuICAgICAgICAgIHNvcnRBY3Rpb24gPSAndG9nZ2xlJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb3J0QWN0aW9uID0gJ2FkZCc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vcm1hbCBtb2RlXG4gICAgICAgIGlmIChleGlzdGluZ0luZGV4ICE9PSBfc29ydEJ5Mi5sZW5ndGggLSAxIHx8IF9zb3J0QnkyLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgIHNvcnRBY3Rpb24gPSAncmVwbGFjZSc7XG4gICAgICAgIH0gZWxzZSBpZiAoZXhpc3RpbmdTb3J0QnkpIHtcbiAgICAgICAgICBzb3J0QWN0aW9uID0gJ3RvZ2dsZSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc29ydEFjdGlvbiA9ICdyZXBsYWNlJztcbiAgICAgICAgfVxuICAgICAgfSAvLyBIYW5kbGUgdG9nZ2xlIHN0YXRlcyB0aGF0IHdpbGwgcmVtb3ZlIHRoZSBzb3J0QnlcblxuXG4gICAgICBpZiAoc29ydEFjdGlvbiA9PT0gJ3RvZ2dsZScgJiYgLy8gTXVzdCBiZSB0b2dnbGluZ1xuICAgICAgIWRpc2FibGVTb3J0UmVtb3ZlICYmIC8vIElmIGRpc2FibGVTb3J0UmVtb3ZlLCBkaXNhYmxlIGluIGdlbmVyYWxcbiAgICAgICFoYXNEZXNjRGVmaW5lZCAmJiAoIC8vIE11c3Qgbm90IGJlIHNldHRpbmcgZGVzY1xuICAgICAgbXVsdGkgPyAhZGlzYWJsZU11bHRpUmVtb3ZlIDogdHJ1ZSkgJiYgKCAvLyBJZiBtdWx0aSwgZG9uJ3QgYWxsb3cgaWYgZGlzYWJsZU11bHRpUmVtb3ZlXG4gICAgICBleGlzdGluZ1NvcnRCeSAmJiAvLyBGaW5hbGx5LCBkZXRlY3QgaWYgaXQgc2hvdWxkIGluZGVlZCBiZSByZW1vdmVkXG4gICAgICBleGlzdGluZ1NvcnRCeS5kZXNjICYmICFzb3J0RGVzY0ZpcnN0IHx8ICFleGlzdGluZ1NvcnRCeS5kZXNjICYmIHNvcnREZXNjRmlyc3QpKSB7XG4gICAgICAgIHNvcnRBY3Rpb24gPSAncmVtb3ZlJztcbiAgICAgIH1cblxuICAgICAgaWYgKHNvcnRBY3Rpb24gPT09ICdyZXBsYWNlJykge1xuICAgICAgICBfbmV3U29ydEJ5ID0gW3tcbiAgICAgICAgICBpZDogY29sdW1uSWQsXG4gICAgICAgICAgZGVzYzogaGFzRGVzY0RlZmluZWQgPyBkZXNjIDogc29ydERlc2NGaXJzdFxuICAgICAgICB9XTtcbiAgICAgIH0gZWxzZSBpZiAoc29ydEFjdGlvbiA9PT0gJ2FkZCcpIHtcbiAgICAgICAgX25ld1NvcnRCeSA9IFtdLmNvbmNhdChfc29ydEJ5MiwgW3tcbiAgICAgICAgICBpZDogY29sdW1uSWQsXG4gICAgICAgICAgZGVzYzogaGFzRGVzY0RlZmluZWQgPyBkZXNjIDogc29ydERlc2NGaXJzdFxuICAgICAgICB9XSk7IC8vIFRha2UgbGF0ZXN0IG4gY29sdW1uc1xuXG4gICAgICAgIF9uZXdTb3J0Qnkuc3BsaWNlKDAsIF9uZXdTb3J0QnkubGVuZ3RoIC0gbWF4TXVsdGlTb3J0Q29sQ291bnQpO1xuICAgICAgfSBlbHNlIGlmIChzb3J0QWN0aW9uID09PSAndG9nZ2xlJykge1xuICAgICAgICAvLyBUaGlzIGZsaXBzIChvciBzZXRzKSB0aGVcbiAgICAgICAgX25ld1NvcnRCeSA9IF9zb3J0QnkyLm1hcChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIGlmIChkLmlkID09PSBjb2x1bW5JZCkge1xuICAgICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBkLCB7XG4gICAgICAgICAgICAgIGRlc2M6IGhhc0Rlc2NEZWZpbmVkID8gZGVzYyA6ICFleGlzdGluZ1NvcnRCeS5kZXNjXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHNvcnRBY3Rpb24gPT09ICdyZW1vdmUnKSB7XG4gICAgICAgIF9uZXdTb3J0QnkgPSBfc29ydEJ5Mi5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZC5pZCAhPT0gY29sdW1uSWQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHNvcnRCeTogX25ld1NvcnRCeVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkNShpbnN0YW5jZSkge1xuICAgIHZhciBkYXRhID0gaW5zdGFuY2UuZGF0YSxcbiAgICAgICAgcm93cyA9IGluc3RhbmNlLnJvd3MsXG4gICAgICAgIGZsYXRSb3dzID0gaW5zdGFuY2UuZmxhdFJvd3MsXG4gICAgICAgIGFsbENvbHVtbnMgPSBpbnN0YW5jZS5hbGxDb2x1bW5zLFxuICAgICAgICBfaW5zdGFuY2Ukb3JkZXJCeUZuID0gaW5zdGFuY2Uub3JkZXJCeUZuLFxuICAgICAgICBvcmRlckJ5Rm4gPSBfaW5zdGFuY2Ukb3JkZXJCeUZuID09PSB2b2lkIDAgPyBkZWZhdWx0T3JkZXJCeUZuIDogX2luc3RhbmNlJG9yZGVyQnlGbixcbiAgICAgICAgdXNlclNvcnRUeXBlcyA9IGluc3RhbmNlLnNvcnRUeXBlcyxcbiAgICAgICAgbWFudWFsU29ydEJ5ID0gaW5zdGFuY2UubWFudWFsU29ydEJ5LFxuICAgICAgICBkZWZhdWx0Q2FuU29ydCA9IGluc3RhbmNlLmRlZmF1bHRDYW5Tb3J0LFxuICAgICAgICBkaXNhYmxlU29ydEJ5ID0gaW5zdGFuY2UuZGlzYWJsZVNvcnRCeSxcbiAgICAgICAgZmxhdEhlYWRlcnMgPSBpbnN0YW5jZS5mbGF0SGVhZGVycyxcbiAgICAgICAgc29ydEJ5ID0gaW5zdGFuY2Uuc3RhdGUuc29ydEJ5LFxuICAgICAgICBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoLFxuICAgICAgICBwbHVnaW5zID0gaW5zdGFuY2UucGx1Z2lucyxcbiAgICAgICAgZ2V0SG9va3MgPSBpbnN0YW5jZS5nZXRIb29rcyxcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldFNvID0gaW5zdGFuY2UuYXV0b1Jlc2V0U29ydEJ5LFxuICAgICAgICBhdXRvUmVzZXRTb3J0QnkgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0U28gPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0U287XG4gICAgZW5zdXJlUGx1Z2luT3JkZXIocGx1Z2lucywgWyd1c2VGaWx0ZXJzJywgJ3VzZUdsb2JhbEZpbHRlcicsICd1c2VHcm91cEJ5JywgJ3VzZVBpdm90Q29sdW1ucyddLCAndXNlU29ydEJ5Jyk7XG4gICAgdmFyIHNldFNvcnRCeSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChzb3J0QnkpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5zZXRTb3J0QnksXG4gICAgICAgIHNvcnRCeTogc29ydEJ5XG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTsgLy8gVXBkYXRlcyBzb3J0aW5nIGJhc2VkIG9uIGEgY29sdW1uSWQsIGRlc2MgZmxhZyBhbmQgbXVsdGkgZmxhZ1xuXG4gICAgdmFyIHRvZ2dsZVNvcnRCeSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChjb2x1bW5JZCwgZGVzYywgbXVsdGkpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy50b2dnbGVTb3J0QnksXG4gICAgICAgIGNvbHVtbklkOiBjb2x1bW5JZCxcbiAgICAgICAgZGVzYzogZGVzYyxcbiAgICAgICAgbXVsdGk6IG11bHRpXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTsgLy8gdXNlIHJlZmVyZW5jZSB0byBhdm9pZCBtZW1vcnkgbGVhayBpbiAjMTYwOFxuXG4gICAgdmFyIGdldEluc3RhbmNlID0gdXNlR2V0TGF0ZXN0KGluc3RhbmNlKTsgLy8gQWRkIHRoZSBnZXRTb3J0QnlUb2dnbGVQcm9wcyBtZXRob2QgdG8gY29sdW1ucyBhbmQgaGVhZGVyc1xuXG4gICAgZmxhdEhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICB2YXIgYWNjZXNzb3IgPSBjb2x1bW4uYWNjZXNzb3IsXG4gICAgICAgICAgZGVmYXVsdENvbHVtbkNhblNvcnQgPSBjb2x1bW4uY2FuU29ydCxcbiAgICAgICAgICBjb2x1bW5EaXNhYmxlU29ydEJ5ID0gY29sdW1uLmRpc2FibGVTb3J0QnksXG4gICAgICAgICAgaWQgPSBjb2x1bW4uaWQ7XG4gICAgICB2YXIgY2FuU29ydCA9IGFjY2Vzc29yID8gZ2V0Rmlyc3REZWZpbmVkKGNvbHVtbkRpc2FibGVTb3J0QnkgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgZGlzYWJsZVNvcnRCeSA9PT0gdHJ1ZSA/IGZhbHNlIDogdW5kZWZpbmVkLCB0cnVlKSA6IGdldEZpcnN0RGVmaW5lZChkZWZhdWx0Q2FuU29ydCwgZGVmYXVsdENvbHVtbkNhblNvcnQsIGZhbHNlKTtcbiAgICAgIGNvbHVtbi5jYW5Tb3J0ID0gY2FuU29ydDtcblxuICAgICAgaWYgKGNvbHVtbi5jYW5Tb3J0KSB7XG4gICAgICAgIGNvbHVtbi50b2dnbGVTb3J0QnkgPSBmdW5jdGlvbiAoZGVzYywgbXVsdGkpIHtcbiAgICAgICAgICByZXR1cm4gdG9nZ2xlU29ydEJ5KGNvbHVtbi5pZCwgZGVzYywgbXVsdGkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbHVtbi5jbGVhclNvcnRCeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiBhY3Rpb25zLmNsZWFyU29ydEJ5LFxuICAgICAgICAgICAgY29sdW1uSWQ6IGNvbHVtbi5pZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb2x1bW4uZ2V0U29ydEJ5VG9nZ2xlUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFNvcnRCeVRvZ2dsZVByb3BzLCB7XG4gICAgICAgIGluc3RhbmNlOiBnZXRJbnN0YW5jZSgpLFxuICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgfSk7XG4gICAgICB2YXIgY29sdW1uU29ydCA9IHNvcnRCeS5maW5kKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmlkID09PSBpZDtcbiAgICAgIH0pO1xuICAgICAgY29sdW1uLmlzU29ydGVkID0gISFjb2x1bW5Tb3J0O1xuICAgICAgY29sdW1uLnNvcnRlZEluZGV4ID0gc29ydEJ5LmZpbmRJbmRleChmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5pZCA9PT0gaWQ7XG4gICAgICB9KTtcbiAgICAgIGNvbHVtbi5pc1NvcnRlZERlc2MgPSBjb2x1bW4uaXNTb3J0ZWQgPyBjb2x1bW5Tb3J0LmRlc2MgOiB1bmRlZmluZWQ7XG4gICAgfSk7XG5cbiAgICB2YXIgX1JlYWN0JHVzZU1lbW8gPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChtYW51YWxTb3J0QnkgfHwgIXNvcnRCeS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtyb3dzLCBmbGF0Um93c107XG4gICAgICB9XG5cbiAgICAgIHZhciBzb3J0ZWRGbGF0Um93cyA9IFtdOyAvLyBGaWx0ZXIgb3V0IHNvcnRCeXMgdGhhdCBjb3JyZXNwb25kIHRvIG5vbiBleGlzdGluZyBjb2x1bW5zXG5cbiAgICAgIHZhciBhdmFpbGFibGVTb3J0QnkgPSBzb3J0QnkuZmlsdGVyKGZ1bmN0aW9uIChzb3J0KSB7XG4gICAgICAgIHJldHVybiBhbGxDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGNvbCkge1xuICAgICAgICAgIHJldHVybiBjb2wuaWQgPT09IHNvcnQuaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBzb3J0RGF0YSA9IGZ1bmN0aW9uIHNvcnREYXRhKHJvd3MpIHtcbiAgICAgICAgLy8gVXNlIHRoZSBvcmRlckJ5Rm4gdG8gY29tcG9zZSBtdWx0aXBsZSBzb3J0QnkncyB0b2dldGhlci5cbiAgICAgICAgLy8gVGhpcyB3aWxsIGFsc28gcGVyZm9ybSBhIHN0YWJsZSBzb3J0aW5nIHVzaW5nIHRoZSByb3cgaW5kZXhcbiAgICAgICAgLy8gaWYgbmVlZGVkLlxuICAgICAgICB2YXIgc29ydGVkRGF0YSA9IG9yZGVyQnlGbihyb3dzLCBhdmFpbGFibGVTb3J0QnkubWFwKGZ1bmN0aW9uIChzb3J0KSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBjdXN0b20gc29ydGluZyBtZXRob2RzIGZvciBlYWNoIGNvbHVtblxuICAgICAgICAgIHZhciBjb2x1bW4gPSBhbGxDb2x1bW5zLmZpbmQoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICAgIHJldHVybiBkLmlkID09PSBzb3J0LmlkO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKCFjb2x1bW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlYWN0LVRhYmxlOiBDb3VsZCBub3QgZmluZCBhIGNvbHVtbiB3aXRoIGlkOiBcIiArIHNvcnQuaWQgKyBcIiB3aGlsZSBzb3J0aW5nXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBzb3J0VHlwZSA9IGNvbHVtbi5zb3J0VHlwZTsgLy8gTG9vayB1cCBzb3J0QnkgZnVuY3Rpb25zIGluIHRoaXMgb3JkZXI6XG4gICAgICAgICAgLy8gY29sdW1uIGZ1bmN0aW9uXG4gICAgICAgICAgLy8gY29sdW1uIHN0cmluZyBsb29rdXAgb24gdXNlciBzb3J0VHlwZVxuICAgICAgICAgIC8vIGNvbHVtbiBzdHJpbmcgbG9va3VwIG9uIGJ1aWx0LWluIHNvcnRUeXBlXG4gICAgICAgICAgLy8gZGVmYXVsdCBmdW5jdGlvblxuICAgICAgICAgIC8vIGRlZmF1bHQgc3RyaW5nIGxvb2t1cCBvbiB1c2VyIHNvcnRUeXBlXG4gICAgICAgICAgLy8gZGVmYXVsdCBzdHJpbmcgbG9va3VwIG9uIGJ1aWx0LWluIHNvcnRUeXBlXG5cbiAgICAgICAgICB2YXIgc29ydE1ldGhvZCA9IGlzRnVuY3Rpb24oc29ydFR5cGUpIHx8ICh1c2VyU29ydFR5cGVzIHx8IHt9KVtzb3J0VHlwZV0gfHwgc29ydFR5cGVzW3NvcnRUeXBlXTtcblxuICAgICAgICAgIGlmICghc29ydE1ldGhvZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhY3QtVGFibGU6IENvdWxkIG5vdCBmaW5kIGEgdmFsaWQgc29ydFR5cGUgb2YgJ1wiICsgc29ydFR5cGUgKyBcIicgZm9yIGNvbHVtbiAnXCIgKyBzb3J0LmlkICsgXCInLlwiKTtcbiAgICAgICAgICB9IC8vIFJldHVybiB0aGUgY29ycmVjdCBzb3J0Rm4uXG4gICAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYWx3YXlzIHJldHVybiBpbiBhc2NlbmRpbmcgb3JkZXJcblxuXG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gc29ydE1ldGhvZChhLCBiLCBzb3J0LmlkLCBzb3J0LmRlc2MpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pLCAvLyBNYXAgdGhlIGRpcmVjdGlvbnNcbiAgICAgICAgYXZhaWxhYmxlU29ydEJ5Lm1hcChmdW5jdGlvbiAoc29ydCkge1xuICAgICAgICAgIC8vIERldGVjdCBhbmQgdXNlIHRoZSBzb3J0SW52ZXJ0ZWQgb3B0aW9uXG4gICAgICAgICAgdmFyIGNvbHVtbiA9IGFsbENvbHVtbnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgICAgcmV0dXJuIGQuaWQgPT09IHNvcnQuaWQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5zb3J0SW52ZXJ0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3J0LmRlc2M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuICFzb3J0LmRlc2M7XG4gICAgICAgIH0pKTsgLy8gSWYgdGhlcmUgYXJlIHN1Yi1yb3dzLCBzb3J0IHRoZW1cblxuICAgICAgICBzb3J0ZWREYXRhLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIHNvcnRlZEZsYXRSb3dzLnB1c2gocm93KTtcblxuICAgICAgICAgIGlmICghcm93LnN1YlJvd3MgfHwgcm93LnN1YlJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcm93LnN1YlJvd3MgPSBzb3J0RGF0YShyb3cuc3ViUm93cyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc29ydGVkRGF0YTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBbc29ydERhdGEocm93cyksIHNvcnRlZEZsYXRSb3dzXTtcbiAgICB9LCBbbWFudWFsU29ydEJ5LCBzb3J0QnksIHJvd3MsIGZsYXRSb3dzLCBhbGxDb2x1bW5zLCBvcmRlckJ5Rm4sIHVzZXJTb3J0VHlwZXNdKSxcbiAgICAgICAgc29ydGVkUm93cyA9IF9SZWFjdCR1c2VNZW1vWzBdLFxuICAgICAgICBzb3J0ZWRGbGF0Um93cyA9IF9SZWFjdCR1c2VNZW1vWzFdO1xuXG4gICAgdmFyIGdldEF1dG9SZXNldFNvcnRCeSA9IHVzZUdldExhdGVzdChhdXRvUmVzZXRTb3J0QnkpO1xuICAgIHVzZU1vdW50ZWRMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGdldEF1dG9SZXNldFNvcnRCeSgpKSB7XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBhY3Rpb25zLnJlc2V0U29ydEJ5XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIFttYW51YWxTb3J0QnkgPyBudWxsIDogZGF0YV0pO1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UsIHtcbiAgICAgIHByZVNvcnRlZFJvd3M6IHJvd3MsXG4gICAgICBwcmVTb3J0ZWRGbGF0Um93czogZmxhdFJvd3MsXG4gICAgICBzb3J0ZWRSb3dzOiBzb3J0ZWRSb3dzLFxuICAgICAgc29ydGVkRmxhdFJvd3M6IHNvcnRlZEZsYXRSb3dzLFxuICAgICAgcm93czogc29ydGVkUm93cyxcbiAgICAgIGZsYXRSb3dzOiBzb3J0ZWRGbGF0Um93cyxcbiAgICAgIHNldFNvcnRCeTogc2V0U29ydEJ5LFxuICAgICAgdG9nZ2xlU29ydEJ5OiB0b2dnbGVTb3J0QnlcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlZmF1bHRPcmRlckJ5Rm4oYXJyLCBmdW5jcywgZGlycykge1xuICAgIHJldHVybiBbXS5jb25jYXQoYXJyKS5zb3J0KGZ1bmN0aW9uIChyb3dBLCByb3dCKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZ1bmNzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBzb3J0Rm4gPSBmdW5jc1tpXTtcbiAgICAgICAgdmFyIGRlc2MgPSBkaXJzW2ldID09PSBmYWxzZSB8fCBkaXJzW2ldID09PSAnZGVzYyc7XG4gICAgICAgIHZhciBzb3J0SW50ID0gc29ydEZuKHJvd0EsIHJvd0IpO1xuXG4gICAgICAgIGlmIChzb3J0SW50ICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGRlc2MgPyAtc29ydEludCA6IHNvcnRJbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRpcnNbMF0gPyByb3dBLmluZGV4IC0gcm93Qi5pbmRleCA6IHJvd0IuaW5kZXggLSByb3dBLmluZGV4O1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIHBsdWdpbk5hbWUgPSAndXNlUGFnaW5hdGlvbic7IC8vIEFjdGlvbnNcblxuICBhY3Rpb25zLnJlc2V0UGFnZSA9ICdyZXNldFBhZ2UnO1xuICBhY3Rpb25zLmdvdG9QYWdlID0gJ2dvdG9QYWdlJztcbiAgYWN0aW9ucy5zZXRQYWdlU2l6ZSA9ICdzZXRQYWdlU2l6ZSc7XG4gIHZhciB1c2VQYWdpbmF0aW9uID0gZnVuY3Rpb24gdXNlUGFnaW5hdGlvbihob29rcykge1xuICAgIGhvb2tzLnN0YXRlUmVkdWNlcnMucHVzaChyZWR1Y2VyJDYpO1xuICAgIGhvb2tzLnVzZUluc3RhbmNlLnB1c2godXNlSW5zdGFuY2UkNik7XG4gIH07XG4gIHVzZVBhZ2luYXRpb24ucGx1Z2luTmFtZSA9IHBsdWdpbk5hbWU7XG5cbiAgZnVuY3Rpb24gcmVkdWNlciQ2KHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmluaXQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIHBhZ2VTaXplOiAxMCxcbiAgICAgICAgcGFnZUluZGV4OiAwXG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0UGFnZSkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBwYWdlSW5kZXg6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5wYWdlSW5kZXggfHwgMFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmdvdG9QYWdlKSB7XG4gICAgICB2YXIgcGFnZUNvdW50ID0gaW5zdGFuY2UucGFnZUNvdW50LFxuICAgICAgICAgIHBhZ2UgPSBpbnN0YW5jZS5wYWdlO1xuICAgICAgdmFyIG5ld1BhZ2VJbmRleCA9IGZ1bmN0aW9uYWxVcGRhdGUoYWN0aW9uLnBhZ2VJbmRleCwgc3RhdGUucGFnZUluZGV4KTtcbiAgICAgIHZhciBjYW5OYXZpZ2F0ZSA9IGZhbHNlO1xuXG4gICAgICBpZiAobmV3UGFnZUluZGV4ID4gc3RhdGUucGFnZUluZGV4KSB7XG4gICAgICAgIC8vIG5leHQgcGFnZVxuICAgICAgICBjYW5OYXZpZ2F0ZSA9IHBhZ2VDb3VudCA9PT0gLTEgPyBwYWdlLmxlbmd0aCA+PSBzdGF0ZS5wYWdlU2l6ZSA6IG5ld1BhZ2VJbmRleCA8IHBhZ2VDb3VudDtcbiAgICAgIH0gZWxzZSBpZiAobmV3UGFnZUluZGV4IDwgc3RhdGUucGFnZUluZGV4KSB7XG4gICAgICAgIC8vIHByZXYgcGFnZVxuICAgICAgICBjYW5OYXZpZ2F0ZSA9IG5ld1BhZ2VJbmRleCA+IC0xO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWNhbk5hdmlnYXRlKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBwYWdlSW5kZXg6IG5ld1BhZ2VJbmRleFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldFBhZ2VTaXplKSB7XG4gICAgICB2YXIgcGFnZVNpemUgPSBhY3Rpb24ucGFnZVNpemU7XG4gICAgICB2YXIgdG9wUm93SW5kZXggPSBzdGF0ZS5wYWdlU2l6ZSAqIHN0YXRlLnBhZ2VJbmRleDtcbiAgICAgIHZhciBwYWdlSW5kZXggPSBNYXRoLmZsb29yKHRvcFJvd0luZGV4IC8gcGFnZVNpemUpO1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBwYWdlSW5kZXg6IHBhZ2VJbmRleCxcbiAgICAgICAgcGFnZVNpemU6IHBhZ2VTaXplXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1c2VJbnN0YW5jZSQ2KGluc3RhbmNlKSB7XG4gICAgdmFyIHJvd3MgPSBpbnN0YW5jZS5yb3dzLFxuICAgICAgICBfaW5zdGFuY2UkYXV0b1Jlc2V0UGEgPSBpbnN0YW5jZS5hdXRvUmVzZXRQYWdlLFxuICAgICAgICBhdXRvUmVzZXRQYWdlID0gX2luc3RhbmNlJGF1dG9SZXNldFBhID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGF1dG9SZXNldFBhLFxuICAgICAgICBfaW5zdGFuY2UkbWFudWFsRXhwYW4gPSBpbnN0YW5jZS5tYW51YWxFeHBhbmRlZEtleSxcbiAgICAgICAgbWFudWFsRXhwYW5kZWRLZXkgPSBfaW5zdGFuY2UkbWFudWFsRXhwYW4gPT09IHZvaWQgMCA/ICdleHBhbmRlZCcgOiBfaW5zdGFuY2UkbWFudWFsRXhwYW4sXG4gICAgICAgIHBsdWdpbnMgPSBpbnN0YW5jZS5wbHVnaW5zLFxuICAgICAgICB1c2VyUGFnZUNvdW50ID0gaW5zdGFuY2UucGFnZUNvdW50LFxuICAgICAgICBfaW5zdGFuY2UkcGFnaW5hdGVFeHAgPSBpbnN0YW5jZS5wYWdpbmF0ZUV4cGFuZGVkUm93cyxcbiAgICAgICAgcGFnaW5hdGVFeHBhbmRlZFJvd3MgPSBfaW5zdGFuY2UkcGFnaW5hdGVFeHAgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkcGFnaW5hdGVFeHAsXG4gICAgICAgIF9pbnN0YW5jZSRleHBhbmRTdWJSbyA9IGluc3RhbmNlLmV4cGFuZFN1YlJvd3MsXG4gICAgICAgIGV4cGFuZFN1YlJvd3MgPSBfaW5zdGFuY2UkZXhwYW5kU3ViUm8gPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkZXhwYW5kU3ViUm8sXG4gICAgICAgIF9pbnN0YW5jZSRzdGF0ZSA9IGluc3RhbmNlLnN0YXRlLFxuICAgICAgICBwYWdlU2l6ZSA9IF9pbnN0YW5jZSRzdGF0ZS5wYWdlU2l6ZSxcbiAgICAgICAgcGFnZUluZGV4ID0gX2luc3RhbmNlJHN0YXRlLnBhZ2VJbmRleCxcbiAgICAgICAgZXhwYW5kZWQgPSBfaW5zdGFuY2Ukc3RhdGUuZXhwYW5kZWQsXG4gICAgICAgIGdsb2JhbEZpbHRlciA9IF9pbnN0YW5jZSRzdGF0ZS5nbG9iYWxGaWx0ZXIsXG4gICAgICAgIGZpbHRlcnMgPSBfaW5zdGFuY2Ukc3RhdGUuZmlsdGVycyxcbiAgICAgICAgZ3JvdXBCeSA9IF9pbnN0YW5jZSRzdGF0ZS5ncm91cEJ5LFxuICAgICAgICBzb3J0QnkgPSBfaW5zdGFuY2Ukc3RhdGUuc29ydEJ5LFxuICAgICAgICBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoLFxuICAgICAgICBkYXRhID0gaW5zdGFuY2UuZGF0YSxcbiAgICAgICAgbWFudWFsUGFnaW5hdGlvbiA9IGluc3RhbmNlLm1hbnVhbFBhZ2luYXRpb247XG4gICAgZW5zdXJlUGx1Z2luT3JkZXIocGx1Z2lucywgWyd1c2VHbG9iYWxGaWx0ZXInLCAndXNlRmlsdGVycycsICd1c2VHcm91cEJ5JywgJ3VzZVNvcnRCeScsICd1c2VFeHBhbmRlZCddLCAndXNlUGFnaW5hdGlvbicpO1xuICAgIHZhciBnZXRBdXRvUmVzZXRQYWdlID0gdXNlR2V0TGF0ZXN0KGF1dG9SZXNldFBhZ2UpO1xuICAgIHVzZU1vdW50ZWRMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGdldEF1dG9SZXNldFBhZ2UoKSkge1xuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogYWN0aW9ucy5yZXNldFBhZ2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgW2Rpc3BhdGNoLCBtYW51YWxQYWdpbmF0aW9uID8gbnVsbCA6IGRhdGEsIGdsb2JhbEZpbHRlciwgZmlsdGVycywgZ3JvdXBCeSwgc29ydEJ5XSk7XG4gICAgdmFyIHBhZ2VDb3VudCA9IG1hbnVhbFBhZ2luYXRpb24gPyB1c2VyUGFnZUNvdW50IDogTWF0aC5jZWlsKHJvd3MubGVuZ3RoIC8gcGFnZVNpemUpO1xuICAgIHZhciBwYWdlT3B0aW9ucyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHBhZ2VDb3VudCA+IDAgPyBbXS5jb25jYXQobmV3IEFycmF5KHBhZ2VDb3VudCkpLmZpbGwobnVsbCkubWFwKGZ1bmN0aW9uIChkLCBpKSB7XG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfSkgOiBbXTtcbiAgICB9LCBbcGFnZUNvdW50XSk7XG4gICAgdmFyIHBhZ2UgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwYWdlO1xuXG4gICAgICBpZiAobWFudWFsUGFnaW5hdGlvbikge1xuICAgICAgICBwYWdlID0gcm93cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwYWdlU3RhcnQgPSBwYWdlU2l6ZSAqIHBhZ2VJbmRleDtcbiAgICAgICAgdmFyIHBhZ2VFbmQgPSBwYWdlU3RhcnQgKyBwYWdlU2l6ZTtcbiAgICAgICAgcGFnZSA9IHJvd3Muc2xpY2UocGFnZVN0YXJ0LCBwYWdlRW5kKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhZ2luYXRlRXhwYW5kZWRSb3dzKSB7XG4gICAgICAgIHJldHVybiBwYWdlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhwYW5kUm93cyhwYWdlLCB7XG4gICAgICAgIG1hbnVhbEV4cGFuZGVkS2V5OiBtYW51YWxFeHBhbmRlZEtleSxcbiAgICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgICAgICBleHBhbmRTdWJSb3dzOiBleHBhbmRTdWJSb3dzXG4gICAgICB9KTtcbiAgICB9LCBbZXhwYW5kU3ViUm93cywgZXhwYW5kZWQsIG1hbnVhbEV4cGFuZGVkS2V5LCBtYW51YWxQYWdpbmF0aW9uLCBwYWdlSW5kZXgsIHBhZ2VTaXplLCBwYWdpbmF0ZUV4cGFuZGVkUm93cywgcm93c10pO1xuICAgIHZhciBjYW5QcmV2aW91c1BhZ2UgPSBwYWdlSW5kZXggPiAwO1xuICAgIHZhciBjYW5OZXh0UGFnZSA9IHBhZ2VDb3VudCA9PT0gLTEgPyBwYWdlLmxlbmd0aCA+PSBwYWdlU2l6ZSA6IHBhZ2VJbmRleCA8IHBhZ2VDb3VudCAtIDE7XG4gICAgdmFyIGdvdG9QYWdlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHBhZ2VJbmRleCkge1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLmdvdG9QYWdlLFxuICAgICAgICBwYWdlSW5kZXg6IHBhZ2VJbmRleFxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIHByZXZpb3VzUGFnZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnb3RvUGFnZShmdW5jdGlvbiAob2xkKSB7XG4gICAgICAgIHJldHVybiBvbGQgLSAxO1xuICAgICAgfSk7XG4gICAgfSwgW2dvdG9QYWdlXSk7XG4gICAgdmFyIG5leHRQYWdlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdvdG9QYWdlKGZ1bmN0aW9uIChvbGQpIHtcbiAgICAgICAgcmV0dXJuIG9sZCArIDE7XG4gICAgICB9KTtcbiAgICB9LCBbZ290b1BhZ2VdKTtcbiAgICB2YXIgc2V0UGFnZVNpemUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAocGFnZVNpemUpIHtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy5zZXRQYWdlU2l6ZSxcbiAgICAgICAgcGFnZVNpemU6IHBhZ2VTaXplXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICBwYWdlT3B0aW9uczogcGFnZU9wdGlvbnMsXG4gICAgICBwYWdlQ291bnQ6IHBhZ2VDb3VudCxcbiAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgICBjYW5QcmV2aW91c1BhZ2U6IGNhblByZXZpb3VzUGFnZSxcbiAgICAgIGNhbk5leHRQYWdlOiBjYW5OZXh0UGFnZSxcbiAgICAgIGdvdG9QYWdlOiBnb3RvUGFnZSxcbiAgICAgIHByZXZpb3VzUGFnZTogcHJldmlvdXNQYWdlLFxuICAgICAgbmV4dFBhZ2U6IG5leHRQYWdlLFxuICAgICAgc2V0UGFnZVNpemU6IHNldFBhZ2VTaXplXG4gICAgfSk7XG4gIH1cblxuICBhY3Rpb25zLnJlc2V0UGl2b3QgPSAncmVzZXRQaXZvdCc7XG4gIGFjdGlvbnMudG9nZ2xlUGl2b3QgPSAndG9nZ2xlUGl2b3QnO1xuICB2YXIgX1VOU1RBQkxFX3VzZVBpdm90Q29sdW1ucyA9IGZ1bmN0aW9uIF9VTlNUQUJMRV91c2VQaXZvdENvbHVtbnMoaG9va3MpIHtcbiAgICBob29rcy5nZXRQaXZvdFRvZ2dsZVByb3BzID0gW2RlZmF1bHRHZXRQaXZvdFRvZ2dsZVByb3BzXTtcbiAgICBob29rcy5zdGF0ZVJlZHVjZXJzLnB1c2gocmVkdWNlciQ3KTtcbiAgICBob29rcy51c2VJbnN0YW5jZUFmdGVyRGF0YS5wdXNoKHVzZUluc3RhbmNlQWZ0ZXJEYXRhKTtcbiAgICBob29rcy5hbGxDb2x1bW5zLnB1c2goYWxsQ29sdW1ucyk7XG4gICAgaG9va3MuYWNjZXNzVmFsdWUucHVzaChhY2Nlc3NWYWx1ZSk7XG4gICAgaG9va3MubWF0ZXJpYWxpemVkQ29sdW1ucy5wdXNoKG1hdGVyaWFsaXplZENvbHVtbnMpO1xuICAgIGhvb2tzLm1hdGVyaWFsaXplZENvbHVtbnNEZXBzLnB1c2gobWF0ZXJpYWxpemVkQ29sdW1uc0RlcHMpO1xuICAgIGhvb2tzLnZpc2libGVDb2x1bW5zLnB1c2godmlzaWJsZUNvbHVtbnMkMSk7XG4gICAgaG9va3MudmlzaWJsZUNvbHVtbnNEZXBzLnB1c2godmlzaWJsZUNvbHVtbnNEZXBzKTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlJDcpO1xuICAgIGhvb2tzLnByZXBhcmVSb3cucHVzaChwcmVwYXJlUm93JDIpO1xuICB9O1xuICBfVU5TVEFCTEVfdXNlUGl2b3RDb2x1bW5zLnBsdWdpbk5hbWUgPSAndXNlUGl2b3RDb2x1bW5zJztcbiAgdmFyIGRlZmF1bHRQaXZvdENvbHVtbnMgPSBbXTtcblxuICB2YXIgZGVmYXVsdEdldFBpdm90VG9nZ2xlUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0UGl2b3RUb2dnbGVQcm9wcyhwcm9wcywgX3JlZikge1xuICAgIHZhciBoZWFkZXIgPSBfcmVmLmhlYWRlcjtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNsaWNrOiBoZWFkZXIuY2FuUGl2b3QgPyBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnBlcnNpc3QoKTtcbiAgICAgICAgaGVhZGVyLnRvZ2dsZVBpdm90KCk7XG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiBoZWFkZXIuY2FuUGl2b3QgPyAncG9pbnRlcicgOiB1bmRlZmluZWRcbiAgICAgIH0sXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBQaXZvdCdcbiAgICB9XTtcbiAgfTsgLy8gUmVkdWNlclxuXG5cbiAgZnVuY3Rpb24gcmVkdWNlciQ3KHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmluaXQpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICAgIHBpdm90Q29sdW1uczogZGVmYXVsdFBpdm90Q29sdW1uc1xuICAgICAgfSwgc3RhdGUpO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5yZXNldFBpdm90KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHBpdm90Q29sdW1uczogaW5zdGFuY2UuaW5pdGlhbFN0YXRlLnBpdm90Q29sdW1ucyB8fCBkZWZhdWx0UGl2b3RDb2x1bW5zXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMudG9nZ2xlUGl2b3QpIHtcbiAgICAgIHZhciBjb2x1bW5JZCA9IGFjdGlvbi5jb2x1bW5JZCxcbiAgICAgICAgICBzZXRQaXZvdCA9IGFjdGlvbi52YWx1ZTtcbiAgICAgIHZhciByZXNvbHZlZFBpdm90ID0gdHlwZW9mIHNldFBpdm90ICE9PSAndW5kZWZpbmVkJyA/IHNldFBpdm90IDogIXN0YXRlLnBpdm90Q29sdW1ucy5pbmNsdWRlcyhjb2x1bW5JZCk7XG5cbiAgICAgIGlmIChyZXNvbHZlZFBpdm90KSB7XG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgICBwaXZvdENvbHVtbnM6IFtdLmNvbmNhdChzdGF0ZS5waXZvdENvbHVtbnMsIFtjb2x1bW5JZF0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHBpdm90Q29sdW1uczogc3RhdGUucGl2b3RDb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHJldHVybiBkICE9PSBjb2x1bW5JZDtcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlQWZ0ZXJEYXRhKGluc3RhbmNlKSB7XG4gICAgaW5zdGFuY2UuYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIGNvbHVtbi5pc1Bpdm90U291cmNlID0gaW5zdGFuY2Uuc3RhdGUucGl2b3RDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5pZCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBhbGxDb2x1bW5zKGNvbHVtbnMsIF9yZWYyKSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZjIuaW5zdGFuY2U7XG4gICAgY29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIGNvbHVtbi5pc1Bpdm90U291cmNlID0gaW5zdGFuY2Uuc3RhdGUucGl2b3RDb2x1bW5zLmluY2x1ZGVzKGNvbHVtbi5pZCk7XG4gICAgICBjb2x1bW4udW5pcXVlVmFsdWVzID0gbmV3IFNldCgpO1xuICAgIH0pO1xuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG5cbiAgZnVuY3Rpb24gYWNjZXNzVmFsdWUodmFsdWUsIF9yZWYzKSB7XG4gICAgdmFyIGNvbHVtbiA9IF9yZWYzLmNvbHVtbjtcblxuICAgIGlmIChjb2x1bW4udW5pcXVlVmFsdWVzICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbHVtbi51bmlxdWVWYWx1ZXMuYWRkKHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBmdW5jdGlvbiBtYXRlcmlhbGl6ZWRDb2x1bW5zKG1hdGVyaWFsaXplZCwgX3JlZjQpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmNC5pbnN0YW5jZTtcbiAgICB2YXIgYWxsQ29sdW1ucyA9IGluc3RhbmNlLmFsbENvbHVtbnMsXG4gICAgICAgIHN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgICBpZiAoIXN0YXRlLnBpdm90Q29sdW1ucy5sZW5ndGggfHwgIXN0YXRlLmdyb3VwQnkgfHwgIXN0YXRlLmdyb3VwQnkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbWF0ZXJpYWxpemVkO1xuICAgIH1cblxuICAgIHZhciBwaXZvdENvbHVtbnMgPSBzdGF0ZS5waXZvdENvbHVtbnMubWFwKGZ1bmN0aW9uIChpZCkge1xuICAgICAgcmV0dXJuIGFsbENvbHVtbnMuZmluZChmdW5jdGlvbiAoZCkge1xuICAgICAgICByZXR1cm4gZC5pZCA9PT0gaWQ7XG4gICAgICB9KTtcbiAgICB9KS5maWx0ZXIoQm9vbGVhbik7XG4gICAgdmFyIHNvdXJjZUNvbHVtbnMgPSBhbGxDb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoZCkge1xuICAgICAgcmV0dXJuICFkLmlzUGl2b3RTb3VyY2UgJiYgIXN0YXRlLmdyb3VwQnkuaW5jbHVkZXMoZC5pZCkgJiYgIXN0YXRlLnBpdm90Q29sdW1ucy5pbmNsdWRlcyhkLmlkKTtcbiAgICB9KTtcblxuICAgIHZhciBidWlsZFBpdm90Q29sdW1ucyA9IGZ1bmN0aW9uIGJ1aWxkUGl2b3RDb2x1bW5zKGRlcHRoLCBwYXJlbnQsIHBpdm90RmlsdGVycykge1xuICAgICAgaWYgKGRlcHRoID09PSB2b2lkIDApIHtcbiAgICAgICAgZGVwdGggPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAocGl2b3RGaWx0ZXJzID09PSB2b2lkIDApIHtcbiAgICAgICAgcGl2b3RGaWx0ZXJzID0gW107XG4gICAgICB9XG5cbiAgICAgIHZhciBwaXZvdENvbHVtbiA9IHBpdm90Q29sdW1uc1tkZXB0aF07XG5cbiAgICAgIGlmICghcGl2b3RDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZUNvbHVtbnMubWFwKGZ1bmN0aW9uIChzb3VyY2VDb2x1bW4pIHtcbiAgICAgICAgICAvLyBUT0RPOiBXZSBjb3VsZCBvZmZlciBzdXBwb3J0IGhlcmUgZm9yIHJlbmVzdGluZyBwaXZvdGVkXG4gICAgICAgICAgLy8gY29sdW1ucyBpbnNpZGUgY29waWVzIG9mIHRoZWlyIGhlYWRlciBncm91cHMuIEZvciBub3csXG4gICAgICAgICAgLy8gdGhhdCBzZWVtcyBsaWtlIGl0IHdvdWxkIGJlICgxKSBvdmVya2lsbCBvbiBuZXN0aW5nLCBjb25zaWRlcmluZ1xuICAgICAgICAgIC8vIHlvdSBhbHJlYWR5IGdldCBuZXN0aW5nIGZvciBldmVyeSBwaXZvdCBsZXZlbCBhbmQgKDIpXG4gICAgICAgICAgLy8gcmVhbGx5IGhhcmQuIDopXG4gICAgICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzb3VyY2VDb2x1bW4sIHtcbiAgICAgICAgICAgIGNhblBpdm90OiBmYWxzZSxcbiAgICAgICAgICAgIGlzUGl2b3RlZDogdHJ1ZSxcbiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICAgICAgaWQ6IFwiXCIgKyAocGFyZW50ID8gcGFyZW50LmlkICsgXCIuXCIgKyBzb3VyY2VDb2x1bW4uaWQgOiBzb3VyY2VDb2x1bW4uaWQpLFxuICAgICAgICAgICAgYWNjZXNzb3I6IGZ1bmN0aW9uIGFjY2Vzc29yKG9yaWdpbmFsUm93LCBpLCByb3cpIHtcbiAgICAgICAgICAgICAgaWYgKHBpdm90RmlsdGVycy5ldmVyeShmdW5jdGlvbiAoZmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcihyb3cpO1xuICAgICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByb3cudmFsdWVzW3NvdXJjZUNvbHVtbi5pZF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHZhciB1bmlxdWVWYWx1ZXMgPSBBcnJheS5mcm9tKHBpdm90Q29sdW1uLnVuaXF1ZVZhbHVlcykuc29ydCgpO1xuICAgICAgcmV0dXJuIHVuaXF1ZVZhbHVlcy5tYXAoZnVuY3Rpb24gKHVuaXF1ZVZhbHVlKSB7XG4gICAgICAgIHZhciBjb2x1bW5Hcm91cCA9IF9leHRlbmRzKHt9LCBwaXZvdENvbHVtbiwge1xuICAgICAgICAgIEhlYWRlcjogcGl2b3RDb2x1bW4uUGl2b3RIZWFkZXIgfHwgdHlwZW9mIHBpdm90Q29sdW1uLmhlYWRlciA9PT0gJ3N0cmluZycgPyBwaXZvdENvbHVtbi5IZWFkZXIgKyBcIjogXCIgKyB1bmlxdWVWYWx1ZSA6IHVuaXF1ZVZhbHVlLFxuICAgICAgICAgIGlzUGl2b3RHcm91cDogdHJ1ZSxcbiAgICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgICBkZXB0aDogZGVwdGgsXG4gICAgICAgICAgaWQ6IHBhcmVudCA/IHBhcmVudC5pZCArIFwiLlwiICsgcGl2b3RDb2x1bW4uaWQgKyBcIi5cIiArIHVuaXF1ZVZhbHVlIDogcGl2b3RDb2x1bW4uaWQgKyBcIi5cIiArIHVuaXF1ZVZhbHVlLFxuICAgICAgICAgIHBpdm90VmFsdWU6IHVuaXF1ZVZhbHVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbHVtbkdyb3VwLmNvbHVtbnMgPSBidWlsZFBpdm90Q29sdW1ucyhkZXB0aCArIDEsIGNvbHVtbkdyb3VwLCBbXS5jb25jYXQocGl2b3RGaWx0ZXJzLCBbZnVuY3Rpb24gKHJvdykge1xuICAgICAgICAgIHJldHVybiByb3cudmFsdWVzW3Bpdm90Q29sdW1uLmlkXSA9PT0gdW5pcXVlVmFsdWU7XG4gICAgICAgIH1dKSk7XG4gICAgICAgIHJldHVybiBjb2x1bW5Hcm91cDtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB2YXIgbmV3TWF0ZXJpYWxpemVkID0gZmxhdHRlbkNvbHVtbnMoYnVpbGRQaXZvdENvbHVtbnMoKSk7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChtYXRlcmlhbGl6ZWQsIG5ld01hdGVyaWFsaXplZCk7XG4gIH1cblxuICBmdW5jdGlvbiBtYXRlcmlhbGl6ZWRDb2x1bW5zRGVwcyhkZXBzLCBfcmVmNSkge1xuICAgIHZhciBfcmVmNSRpbnN0YW5jZSRzdGF0ZSA9IF9yZWY1Lmluc3RhbmNlLnN0YXRlLFxuICAgICAgICBwaXZvdENvbHVtbnMgPSBfcmVmNSRpbnN0YW5jZSRzdGF0ZS5waXZvdENvbHVtbnMsXG4gICAgICAgIGdyb3VwQnkgPSBfcmVmNSRpbnN0YW5jZSRzdGF0ZS5ncm91cEJ5O1xuICAgIHJldHVybiBbXS5jb25jYXQoZGVwcywgW3Bpdm90Q29sdW1ucywgZ3JvdXBCeV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdmlzaWJsZUNvbHVtbnMkMSh2aXNpYmxlQ29sdW1ucywgX3JlZjYpIHtcbiAgICB2YXIgc3RhdGUgPSBfcmVmNi5pbnN0YW5jZS5zdGF0ZTtcbiAgICB2aXNpYmxlQ29sdW1ucyA9IHZpc2libGVDb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoZCkge1xuICAgICAgcmV0dXJuICFkLmlzUGl2b3RTb3VyY2U7XG4gICAgfSk7XG5cbiAgICBpZiAoc3RhdGUucGl2b3RDb2x1bW5zLmxlbmd0aCAmJiBzdGF0ZS5ncm91cEJ5ICYmIHN0YXRlLmdyb3VwQnkubGVuZ3RoKSB7XG4gICAgICB2aXNpYmxlQ29sdW1ucyA9IHZpc2libGVDb2x1bW5zLmZpbHRlcihmdW5jdGlvbiAoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBjb2x1bW4uaXNHcm91cGVkIHx8IGNvbHVtbi5pc1Bpdm90ZWQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmlzaWJsZUNvbHVtbnM7XG4gIH1cblxuICBmdW5jdGlvbiB2aXNpYmxlQ29sdW1uc0RlcHMoZGVwcywgX3JlZjcpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmNy5pbnN0YW5jZTtcbiAgICByZXR1cm4gW10uY29uY2F0KGRlcHMsIFtpbnN0YW5jZS5zdGF0ZS5waXZvdENvbHVtbnMsIGluc3RhbmNlLnN0YXRlLmdyb3VwQnldKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVzZUluc3RhbmNlJDcoaW5zdGFuY2UpIHtcbiAgICB2YXIgY29sdW1ucyA9IGluc3RhbmNlLmNvbHVtbnMsXG4gICAgICAgIGFsbENvbHVtbnMgPSBpbnN0YW5jZS5hbGxDb2x1bW5zLFxuICAgICAgICBmbGF0SGVhZGVycyA9IGluc3RhbmNlLmZsYXRIZWFkZXJzLFxuICAgICAgICBnZXRIb29rcyA9IGluc3RhbmNlLmdldEhvb2tzLFxuICAgICAgICBwbHVnaW5zID0gaW5zdGFuY2UucGx1Z2lucyxcbiAgICAgICAgZGlzcGF0Y2ggPSBpbnN0YW5jZS5kaXNwYXRjaCxcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldFBpID0gaW5zdGFuY2UuYXV0b1Jlc2V0UGl2b3QsXG4gICAgICAgIGF1dG9SZXNldFBpdm90ID0gX2luc3RhbmNlJGF1dG9SZXNldFBpID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJGF1dG9SZXNldFBpLFxuICAgICAgICBtYW5hdWxQaXZvdCA9IGluc3RhbmNlLm1hbmF1bFBpdm90LFxuICAgICAgICBkaXNhYmxlUGl2b3QgPSBpbnN0YW5jZS5kaXNhYmxlUGl2b3QsXG4gICAgICAgIGRlZmF1bHRDYW5QaXZvdCA9IGluc3RhbmNlLmRlZmF1bHRDYW5QaXZvdDtcbiAgICBlbnN1cmVQbHVnaW5PcmRlcihwbHVnaW5zLCBbJ3VzZUdyb3VwQnknXSwgJ3VzZVBpdm90Q29sdW1ucycpO1xuICAgIHZhciBnZXRJbnN0YW5jZSA9IHVzZUdldExhdGVzdChpbnN0YW5jZSk7XG4gICAgYWxsQ29sdW1ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb2x1bW4pIHtcbiAgICAgIHZhciBhY2Nlc3NvciA9IGNvbHVtbi5hY2Nlc3NvcixcbiAgICAgICAgICBkZWZhdWx0Q29sdW1uUGl2b3QgPSBjb2x1bW4uZGVmYXVsdFBpdm90LFxuICAgICAgICAgIGNvbHVtbkRpc2FibGVQaXZvdCA9IGNvbHVtbi5kaXNhYmxlUGl2b3Q7XG4gICAgICBjb2x1bW4uY2FuUGl2b3QgPSBhY2Nlc3NvciA/IGdldEZpcnN0RGVmaW5lZChjb2x1bW4uY2FuUGl2b3QsIGNvbHVtbkRpc2FibGVQaXZvdCA9PT0gdHJ1ZSA/IGZhbHNlIDogdW5kZWZpbmVkLCBkaXNhYmxlUGl2b3QgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgdHJ1ZSkgOiBnZXRGaXJzdERlZmluZWQoY29sdW1uLmNhblBpdm90LCBkZWZhdWx0Q29sdW1uUGl2b3QsIGRlZmF1bHRDYW5QaXZvdCwgZmFsc2UpO1xuXG4gICAgICBpZiAoY29sdW1uLmNhblBpdm90KSB7XG4gICAgICAgIGNvbHVtbi50b2dnbGVQaXZvdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2UudG9nZ2xlUGl2b3QoY29sdW1uLmlkKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29sdW1uLkFnZ3JlZ2F0ZWQgPSBjb2x1bW4uQWdncmVnYXRlZCB8fCBjb2x1bW4uQ2VsbDtcbiAgICB9KTtcblxuICAgIHZhciB0b2dnbGVQaXZvdCA9IGZ1bmN0aW9uIHRvZ2dsZVBpdm90KGNvbHVtbklkLCB2YWx1ZSkge1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLnRvZ2dsZVBpdm90LFxuICAgICAgICBjb2x1bW5JZDogY29sdW1uSWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZsYXRIZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuICAgICAgaGVhZGVyLmdldFBpdm90VG9nZ2xlUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFBpdm90VG9nZ2xlUHJvcHMsIHtcbiAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKCksXG4gICAgICAgIGhlYWRlcjogaGVhZGVyXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB2YXIgZ2V0QXV0b1Jlc2V0UGl2b3QgPSB1c2VHZXRMYXRlc3QoYXV0b1Jlc2V0UGl2b3QpO1xuICAgIHVzZU1vdW50ZWRMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGdldEF1dG9SZXNldFBpdm90KCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRQaXZvdFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBbZGlzcGF0Y2gsIG1hbmF1bFBpdm90ID8gbnVsbCA6IGNvbHVtbnNdKTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICB0b2dnbGVQaXZvdDogdG9nZ2xlUGl2b3RcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXBhcmVSb3ckMihyb3cpIHtcbiAgICByb3cuYWxsQ2VsbHMuZm9yRWFjaChmdW5jdGlvbiAoY2VsbCkge1xuICAgICAgLy8gR3JvdXBlZCBjZWxscyBhcmUgaW4gdGhlIHBpdm90Q29sdW1ucyBhbmQgdGhlIHBpdm90IGNlbGwgZm9yIHRoZSByb3dcbiAgICAgIGNlbGwuaXNQaXZvdGVkID0gY2VsbC5jb2x1bW4uaXNQaXZvdGVkO1xuICAgIH0pO1xuICB9XG5cbiAgdmFyIHBsdWdpbk5hbWUkMSA9ICd1c2VSb3dTZWxlY3QnOyAvLyBBY3Rpb25zXG5cbiAgYWN0aW9ucy5yZXNldFNlbGVjdGVkUm93cyA9ICdyZXNldFNlbGVjdGVkUm93cyc7XG4gIGFjdGlvbnMudG9nZ2xlQWxsUm93c1NlbGVjdGVkID0gJ3RvZ2dsZUFsbFJvd3NTZWxlY3RlZCc7XG4gIGFjdGlvbnMudG9nZ2xlUm93U2VsZWN0ZWQgPSAndG9nZ2xlUm93U2VsZWN0ZWQnO1xuICBhY3Rpb25zLnRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQgPSAndG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZCc7XG4gIHZhciB1c2VSb3dTZWxlY3QgPSBmdW5jdGlvbiB1c2VSb3dTZWxlY3QoaG9va3MpIHtcbiAgICBob29rcy5nZXRUb2dnbGVSb3dTZWxlY3RlZFByb3BzID0gW2RlZmF1bHRHZXRUb2dnbGVSb3dTZWxlY3RlZFByb3BzXTtcbiAgICBob29rcy5nZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRQcm9wcyA9IFtkZWZhdWx0R2V0VG9nZ2xlQWxsUm93c1NlbGVjdGVkUHJvcHNdO1xuICAgIGhvb2tzLmdldFRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWRQcm9wcyA9IFtkZWZhdWx0R2V0VG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZFByb3BzXTtcbiAgICBob29rcy5zdGF0ZVJlZHVjZXJzLnB1c2gocmVkdWNlciQ4KTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlJDgpO1xuICAgIGhvb2tzLnByZXBhcmVSb3cucHVzaChwcmVwYXJlUm93JDMpO1xuICB9O1xuICB1c2VSb3dTZWxlY3QucGx1Z2luTmFtZSA9IHBsdWdpbk5hbWUkMTtcblxuICB2YXIgZGVmYXVsdEdldFRvZ2dsZVJvd1NlbGVjdGVkUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0VG9nZ2xlUm93U2VsZWN0ZWRQcm9wcyhwcm9wcywgX3JlZikge1xuICAgIHZhciBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2UsXG4gICAgICAgIHJvdyA9IF9yZWYucm93O1xuICAgIHZhciBfaW5zdGFuY2UkbWFudWFsUm93U2UgPSBpbnN0YW5jZS5tYW51YWxSb3dTZWxlY3RlZEtleSxcbiAgICAgICAgbWFudWFsUm93U2VsZWN0ZWRLZXkgPSBfaW5zdGFuY2UkbWFudWFsUm93U2UgPT09IHZvaWQgMCA/ICdpc1NlbGVjdGVkJyA6IF9pbnN0YW5jZSRtYW51YWxSb3dTZTtcbiAgICB2YXIgY2hlY2tlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHJvdy5vcmlnaW5hbCAmJiByb3cub3JpZ2luYWxbbWFudWFsUm93U2VsZWN0ZWRLZXldKSB7XG4gICAgICBjaGVja2VkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hlY2tlZCA9IHJvdy5pc1NlbGVjdGVkO1xuICAgIH1cblxuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICAgIHJvdy50b2dnbGVSb3dTZWxlY3RlZChlLnRhcmdldC5jaGVja2VkKTtcbiAgICAgIH0sXG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgfSxcbiAgICAgIGNoZWNrZWQ6IGNoZWNrZWQsXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBSb3cgU2VsZWN0ZWQnLFxuICAgICAgaW5kZXRlcm1pbmF0ZTogcm93LmlzU29tZVNlbGVjdGVkXG4gICAgfV07XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRQcm9wcyA9IGZ1bmN0aW9uIGRlZmF1bHRHZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRQcm9wcyhwcm9wcywgX3JlZjIpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmMi5pbnN0YW5jZTtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSkge1xuICAgICAgICBpbnN0YW5jZS50b2dnbGVBbGxSb3dzU2VsZWN0ZWQoZS50YXJnZXQuY2hlY2tlZCk7XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgIH0sXG4gICAgICBjaGVja2VkOiBpbnN0YW5jZS5pc0FsbFJvd3NTZWxlY3RlZCxcbiAgICAgIHRpdGxlOiAnVG9nZ2xlIEFsbCBSb3dzIFNlbGVjdGVkJyxcbiAgICAgIGluZGV0ZXJtaW5hdGU6IEJvb2xlYW4oIWluc3RhbmNlLmlzQWxsUm93c1NlbGVjdGVkICYmIE9iamVjdC5rZXlzKGluc3RhbmNlLnN0YXRlLnNlbGVjdGVkUm93SWRzKS5sZW5ndGgpXG4gICAgfV07XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRUb2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0VG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZFByb3BzKHByb3BzLCBfcmVmMykge1xuICAgIHZhciBpbnN0YW5jZSA9IF9yZWYzLmluc3RhbmNlO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIG9uQ2hhbmdlOiBmdW5jdGlvbiBvbkNoYW5nZShlKSB7XG4gICAgICAgIGluc3RhbmNlLnRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQoZS50YXJnZXQuY2hlY2tlZCk7XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgIH0sXG4gICAgICBjaGVja2VkOiBpbnN0YW5jZS5pc0FsbFBhZ2VSb3dzU2VsZWN0ZWQsXG4gICAgICB0aXRsZTogJ1RvZ2dsZSBBbGwgQ3VycmVudCBQYWdlIFJvd3MgU2VsZWN0ZWQnLFxuICAgICAgaW5kZXRlcm1pbmF0ZTogQm9vbGVhbighaW5zdGFuY2UuaXNBbGxQYWdlUm93c1NlbGVjdGVkICYmIGluc3RhbmNlLnBhZ2Uuc29tZShmdW5jdGlvbiAoX3JlZjQpIHtcbiAgICAgICAgdmFyIGlkID0gX3JlZjQuaWQ7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5zdGF0ZS5zZWxlY3RlZFJvd0lkc1tpZF07XG4gICAgICB9KSlcbiAgICB9XTtcbiAgfTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1wYXJhbXNcblxuXG4gIGZ1bmN0aW9uIHJlZHVjZXIkOChzdGF0ZSwgYWN0aW9uLCBwcmV2aW91c1N0YXRlLCBpbnN0YW5jZSkge1xuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5pbml0KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICBzZWxlY3RlZFJvd0lkczoge31cbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMucmVzZXRTZWxlY3RlZFJvd3MpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgc2VsZWN0ZWRSb3dJZHM6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5zZWxlY3RlZFJvd0lkcyB8fCB7fVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnRvZ2dsZUFsbFJvd3NTZWxlY3RlZCkge1xuICAgICAgdmFyIHNldFNlbGVjdGVkID0gYWN0aW9uLnZhbHVlO1xuICAgICAgdmFyIGlzQWxsUm93c1NlbGVjdGVkID0gaW5zdGFuY2UuaXNBbGxSb3dzU2VsZWN0ZWQsXG4gICAgICAgICAgcm93c0J5SWQgPSBpbnN0YW5jZS5yb3dzQnlJZCxcbiAgICAgICAgICBfaW5zdGFuY2Ukbm9uR3JvdXBlZFIgPSBpbnN0YW5jZS5ub25Hcm91cGVkUm93c0J5SWQsXG4gICAgICAgICAgbm9uR3JvdXBlZFJvd3NCeUlkID0gX2luc3RhbmNlJG5vbkdyb3VwZWRSID09PSB2b2lkIDAgPyByb3dzQnlJZCA6IF9pbnN0YW5jZSRub25Hcm91cGVkUjtcbiAgICAgIHZhciBzZWxlY3RBbGwgPSB0eXBlb2Ygc2V0U2VsZWN0ZWQgIT09ICd1bmRlZmluZWQnID8gc2V0U2VsZWN0ZWQgOiAhaXNBbGxSb3dzU2VsZWN0ZWQ7IC8vIE9ubHkgcmVtb3ZlL2FkZCB0aGUgcm93cyB0aGF0IGFyZSB2aXNpYmxlIG9uIHRoZSBzY3JlZW5cbiAgICAgIC8vICBMZWF2ZSBhbGwgdGhlIG90aGVyIHJvd3MgdGhhdCBhcmUgc2VsZWN0ZWQgYWxvbmUuXG5cbiAgICAgIHZhciBzZWxlY3RlZFJvd0lkcyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNlbGVjdGVkUm93SWRzKTtcblxuICAgICAgaWYgKHNlbGVjdEFsbCkge1xuICAgICAgICBPYmplY3Qua2V5cyhub25Hcm91cGVkUm93c0J5SWQpLmZvckVhY2goZnVuY3Rpb24gKHJvd0lkKSB7XG4gICAgICAgICAgc2VsZWN0ZWRSb3dJZHNbcm93SWRdID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3Qua2V5cyhub25Hcm91cGVkUm93c0J5SWQpLmZvckVhY2goZnVuY3Rpb24gKHJvd0lkKSB7XG4gICAgICAgICAgZGVsZXRlIHNlbGVjdGVkUm93SWRzW3Jvd0lkXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgc2VsZWN0ZWRSb3dJZHM6IHNlbGVjdGVkUm93SWRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMudG9nZ2xlUm93U2VsZWN0ZWQpIHtcbiAgICAgIHZhciBpZCA9IGFjdGlvbi5pZCxcbiAgICAgICAgICBfc2V0U2VsZWN0ZWQgPSBhY3Rpb24udmFsdWU7XG4gICAgICB2YXIgX3Jvd3NCeUlkID0gaW5zdGFuY2Uucm93c0J5SWQsXG4gICAgICAgICAgX2luc3RhbmNlJHNlbGVjdFN1YlJvID0gaW5zdGFuY2Uuc2VsZWN0U3ViUm93cyxcbiAgICAgICAgICBzZWxlY3RTdWJSb3dzID0gX2luc3RhbmNlJHNlbGVjdFN1YlJvID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJHNlbGVjdFN1YlJvLFxuICAgICAgICAgIGdldFN1YlJvd3MgPSBpbnN0YW5jZS5nZXRTdWJSb3dzO1xuICAgICAgdmFyIGlzU2VsZWN0ZWQgPSBzdGF0ZS5zZWxlY3RlZFJvd0lkc1tpZF07XG4gICAgICB2YXIgc2hvdWxkRXhpc3QgPSB0eXBlb2YgX3NldFNlbGVjdGVkICE9PSAndW5kZWZpbmVkJyA/IF9zZXRTZWxlY3RlZCA6ICFpc1NlbGVjdGVkO1xuXG4gICAgICBpZiAoaXNTZWxlY3RlZCA9PT0gc2hvdWxkRXhpc3QpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3U2VsZWN0ZWRSb3dJZHMgPSBfZXh0ZW5kcyh7fSwgc3RhdGUuc2VsZWN0ZWRSb3dJZHMpO1xuXG4gICAgICB2YXIgaGFuZGxlUm93QnlJZCA9IGZ1bmN0aW9uIGhhbmRsZVJvd0J5SWQoaWQpIHtcbiAgICAgICAgdmFyIHJvdyA9IF9yb3dzQnlJZFtpZF07XG5cbiAgICAgICAgaWYgKCFyb3cuaXNHcm91cGVkKSB7XG4gICAgICAgICAgaWYgKHNob3VsZEV4aXN0KSB7XG4gICAgICAgICAgICBuZXdTZWxlY3RlZFJvd0lkc1tpZF0gPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgbmV3U2VsZWN0ZWRSb3dJZHNbaWRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxlY3RTdWJSb3dzICYmIGdldFN1YlJvd3Mocm93KSkge1xuICAgICAgICAgIHJldHVybiBnZXRTdWJSb3dzKHJvdykuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlUm93QnlJZChyb3cuaWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBoYW5kbGVSb3dCeUlkKGlkKTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgc2VsZWN0ZWRSb3dJZHM6IG5ld1NlbGVjdGVkUm93SWRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMudG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZCkge1xuICAgICAgdmFyIF9zZXRTZWxlY3RlZDIgPSBhY3Rpb24udmFsdWU7XG5cbiAgICAgIHZhciBwYWdlID0gaW5zdGFuY2UucGFnZSxcbiAgICAgICAgICBfcm93c0J5SWQyID0gaW5zdGFuY2Uucm93c0J5SWQsXG4gICAgICAgICAgX2luc3RhbmNlJHNlbGVjdFN1YlJvMiA9IGluc3RhbmNlLnNlbGVjdFN1YlJvd3MsXG4gICAgICAgICAgX3NlbGVjdFN1YlJvd3MgPSBfaW5zdGFuY2Ukc2VsZWN0U3ViUm8yID09PSB2b2lkIDAgPyB0cnVlIDogX2luc3RhbmNlJHNlbGVjdFN1YlJvMixcbiAgICAgICAgICBpc0FsbFBhZ2VSb3dzU2VsZWN0ZWQgPSBpbnN0YW5jZS5pc0FsbFBhZ2VSb3dzU2VsZWN0ZWQsXG4gICAgICAgICAgX2dldFN1YlJvd3MgPSBpbnN0YW5jZS5nZXRTdWJSb3dzO1xuXG4gICAgICB2YXIgX3NlbGVjdEFsbCA9IHR5cGVvZiBfc2V0U2VsZWN0ZWQyICE9PSAndW5kZWZpbmVkJyA/IF9zZXRTZWxlY3RlZDIgOiAhaXNBbGxQYWdlUm93c1NlbGVjdGVkO1xuXG4gICAgICB2YXIgX25ld1NlbGVjdGVkUm93SWRzID0gX2V4dGVuZHMoe30sIHN0YXRlLnNlbGVjdGVkUm93SWRzKTtcblxuICAgICAgdmFyIF9oYW5kbGVSb3dCeUlkID0gZnVuY3Rpb24gX2hhbmRsZVJvd0J5SWQoaWQpIHtcbiAgICAgICAgdmFyIHJvdyA9IF9yb3dzQnlJZDJbaWRdO1xuXG4gICAgICAgIGlmICghcm93LmlzR3JvdXBlZCkge1xuICAgICAgICAgIGlmIChfc2VsZWN0QWxsKSB7XG4gICAgICAgICAgICBfbmV3U2VsZWN0ZWRSb3dJZHNbaWRdID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIF9uZXdTZWxlY3RlZFJvd0lkc1tpZF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF9zZWxlY3RTdWJSb3dzICYmIF9nZXRTdWJSb3dzKHJvdykpIHtcbiAgICAgICAgICByZXR1cm4gX2dldFN1YlJvd3Mocm93KS5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHtcbiAgICAgICAgICAgIHJldHVybiBfaGFuZGxlUm93QnlJZChyb3cuaWQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBwYWdlLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICByZXR1cm4gX2hhbmRsZVJvd0J5SWQocm93LmlkKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBzZWxlY3RlZFJvd0lkczogX25ld1NlbGVjdGVkUm93SWRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBmdW5jdGlvbiB1c2VJbnN0YW5jZSQ4KGluc3RhbmNlKSB7XG4gICAgdmFyIGRhdGEgPSBpbnN0YW5jZS5kYXRhLFxuICAgICAgICByb3dzID0gaW5zdGFuY2Uucm93cyxcbiAgICAgICAgZ2V0SG9va3MgPSBpbnN0YW5jZS5nZXRIb29rcyxcbiAgICAgICAgcGx1Z2lucyA9IGluc3RhbmNlLnBsdWdpbnMsXG4gICAgICAgIHJvd3NCeUlkID0gaW5zdGFuY2Uucm93c0J5SWQsXG4gICAgICAgIF9pbnN0YW5jZSRub25Hcm91cGVkUjIgPSBpbnN0YW5jZS5ub25Hcm91cGVkUm93c0J5SWQsXG4gICAgICAgIG5vbkdyb3VwZWRSb3dzQnlJZCA9IF9pbnN0YW5jZSRub25Hcm91cGVkUjIgPT09IHZvaWQgMCA/IHJvd3NCeUlkIDogX2luc3RhbmNlJG5vbkdyb3VwZWRSMixcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldFNlID0gaW5zdGFuY2UuYXV0b1Jlc2V0U2VsZWN0ZWRSb3dzLFxuICAgICAgICBhdXRvUmVzZXRTZWxlY3RlZFJvd3MgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0U2UgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0U2UsXG4gICAgICAgIHNlbGVjdGVkUm93SWRzID0gaW5zdGFuY2Uuc3RhdGUuc2VsZWN0ZWRSb3dJZHMsXG4gICAgICAgIF9pbnN0YW5jZSRzZWxlY3RTdWJSbzMgPSBpbnN0YW5jZS5zZWxlY3RTdWJSb3dzLFxuICAgICAgICBzZWxlY3RTdWJSb3dzID0gX2luc3RhbmNlJHNlbGVjdFN1YlJvMyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9pbnN0YW5jZSRzZWxlY3RTdWJSbzMsXG4gICAgICAgIGRpc3BhdGNoID0gaW5zdGFuY2UuZGlzcGF0Y2gsXG4gICAgICAgIHBhZ2UgPSBpbnN0YW5jZS5wYWdlLFxuICAgICAgICBnZXRTdWJSb3dzID0gaW5zdGFuY2UuZ2V0U3ViUm93cztcbiAgICBlbnN1cmVQbHVnaW5PcmRlcihwbHVnaW5zLCBbJ3VzZUZpbHRlcnMnLCAndXNlR3JvdXBCeScsICd1c2VTb3J0QnknLCAndXNlRXhwYW5kZWQnLCAndXNlUGFnaW5hdGlvbiddLCAndXNlUm93U2VsZWN0Jyk7XG4gICAgdmFyIHNlbGVjdGVkRmxhdFJvd3MgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzZWxlY3RlZEZsYXRSb3dzID0gW107XG4gICAgICByb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdykge1xuICAgICAgICB2YXIgaXNTZWxlY3RlZCA9IHNlbGVjdFN1YlJvd3MgPyBnZXRSb3dJc1NlbGVjdGVkKHJvdywgc2VsZWN0ZWRSb3dJZHMsIGdldFN1YlJvd3MpIDogISFzZWxlY3RlZFJvd0lkc1tyb3cuaWRdO1xuICAgICAgICByb3cuaXNTZWxlY3RlZCA9ICEhaXNTZWxlY3RlZDtcbiAgICAgICAgcm93LmlzU29tZVNlbGVjdGVkID0gaXNTZWxlY3RlZCA9PT0gbnVsbDtcblxuICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgIHNlbGVjdGVkRmxhdFJvd3MucHVzaChyb3cpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzZWxlY3RlZEZsYXRSb3dzO1xuICAgIH0sIFtyb3dzLCBzZWxlY3RTdWJSb3dzLCBzZWxlY3RlZFJvd0lkcywgZ2V0U3ViUm93c10pO1xuICAgIHZhciBpc0FsbFJvd3NTZWxlY3RlZCA9IEJvb2xlYW4oT2JqZWN0LmtleXMobm9uR3JvdXBlZFJvd3NCeUlkKS5sZW5ndGggJiYgT2JqZWN0LmtleXMoc2VsZWN0ZWRSb3dJZHMpLmxlbmd0aCk7XG4gICAgdmFyIGlzQWxsUGFnZVJvd3NTZWxlY3RlZCA9IGlzQWxsUm93c1NlbGVjdGVkO1xuXG4gICAgaWYgKGlzQWxsUm93c1NlbGVjdGVkKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMobm9uR3JvdXBlZFJvd3NCeUlkKS5zb21lKGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gIXNlbGVjdGVkUm93SWRzW2lkXTtcbiAgICAgIH0pKSB7XG4gICAgICAgIGlzQWxsUm93c1NlbGVjdGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpc0FsbFJvd3NTZWxlY3RlZCkge1xuICAgICAgaWYgKHBhZ2UgJiYgcGFnZS5sZW5ndGggJiYgcGFnZS5zb21lKGZ1bmN0aW9uIChfcmVmNSkge1xuICAgICAgICB2YXIgaWQgPSBfcmVmNS5pZDtcbiAgICAgICAgcmV0dXJuICFzZWxlY3RlZFJvd0lkc1tpZF07XG4gICAgICB9KSkge1xuICAgICAgICBpc0FsbFBhZ2VSb3dzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZ2V0QXV0b1Jlc2V0U2VsZWN0ZWRSb3dzID0gdXNlR2V0TGF0ZXN0KGF1dG9SZXNldFNlbGVjdGVkUm93cyk7XG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0U2VsZWN0ZWRSb3dzKCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRTZWxlY3RlZFJvd3NcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgW2Rpc3BhdGNoLCBkYXRhXSk7XG4gICAgdmFyIHRvZ2dsZUFsbFJvd3NTZWxlY3RlZCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogYWN0aW9ucy50b2dnbGVBbGxSb3dzU2VsZWN0ZWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIHRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMudG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZCxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgdG9nZ2xlUm93U2VsZWN0ZWQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoaWQsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLnRvZ2dsZVJvd1NlbGVjdGVkLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSwgW2Rpc3BhdGNoXSk7XG4gICAgdmFyIGdldEluc3RhbmNlID0gdXNlR2V0TGF0ZXN0KGluc3RhbmNlKTtcbiAgICB2YXIgZ2V0VG9nZ2xlQWxsUm93c1NlbGVjdGVkUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFRvZ2dsZUFsbFJvd3NTZWxlY3RlZFByb3BzLCB7XG4gICAgICBpbnN0YW5jZTogZ2V0SW5zdGFuY2UoKVxuICAgIH0pO1xuICAgIHZhciBnZXRUb2dnbGVBbGxQYWdlUm93c1NlbGVjdGVkUHJvcHMgPSBtYWtlUHJvcEdldHRlcihnZXRIb29rcygpLmdldFRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWRQcm9wcywge1xuICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKClcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCB7XG4gICAgICBzZWxlY3RlZEZsYXRSb3dzOiBzZWxlY3RlZEZsYXRSb3dzLFxuICAgICAgaXNBbGxSb3dzU2VsZWN0ZWQ6IGlzQWxsUm93c1NlbGVjdGVkLFxuICAgICAgaXNBbGxQYWdlUm93c1NlbGVjdGVkOiBpc0FsbFBhZ2VSb3dzU2VsZWN0ZWQsXG4gICAgICB0b2dnbGVSb3dTZWxlY3RlZDogdG9nZ2xlUm93U2VsZWN0ZWQsXG4gICAgICB0b2dnbGVBbGxSb3dzU2VsZWN0ZWQ6IHRvZ2dsZUFsbFJvd3NTZWxlY3RlZCxcbiAgICAgIGdldFRvZ2dsZUFsbFJvd3NTZWxlY3RlZFByb3BzOiBnZXRUb2dnbGVBbGxSb3dzU2VsZWN0ZWRQcm9wcyxcbiAgICAgIGdldFRvZ2dsZUFsbFBhZ2VSb3dzU2VsZWN0ZWRQcm9wczogZ2V0VG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZFByb3BzLFxuICAgICAgdG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZDogdG9nZ2xlQWxsUGFnZVJvd3NTZWxlY3RlZFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJlcGFyZVJvdyQzKHJvdywgX3JlZjYpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmNi5pbnN0YW5jZTtcblxuICAgIHJvdy50b2dnbGVSb3dTZWxlY3RlZCA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS50b2dnbGVSb3dTZWxlY3RlZChyb3cuaWQsIHNldCk7XG4gICAgfTtcblxuICAgIHJvdy5nZXRUb2dnbGVSb3dTZWxlY3RlZFByb3BzID0gbWFrZVByb3BHZXR0ZXIoaW5zdGFuY2UuZ2V0SG9va3MoKS5nZXRUb2dnbGVSb3dTZWxlY3RlZFByb3BzLCB7XG4gICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICByb3c6IHJvd1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Um93SXNTZWxlY3RlZChyb3csIHNlbGVjdGVkUm93SWRzLCBnZXRTdWJSb3dzKSB7XG4gICAgaWYgKHNlbGVjdGVkUm93SWRzW3Jvdy5pZF0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBzdWJSb3dzID0gZ2V0U3ViUm93cyhyb3cpO1xuXG4gICAgaWYgKHN1YlJvd3MgJiYgc3ViUm93cy5sZW5ndGgpIHtcbiAgICAgIHZhciBhbGxDaGlsZHJlblNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIHZhciBzb21lU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHN1YlJvd3MuZm9yRWFjaChmdW5jdGlvbiAoc3ViUm93KSB7XG4gICAgICAgIC8vIEJhaWwgb3V0IGVhcmx5IGlmIHdlIGtub3cgYm90aCBvZiB0aGVzZVxuICAgICAgICBpZiAoc29tZVNlbGVjdGVkICYmICFhbGxDaGlsZHJlblNlbGVjdGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdldFJvd0lzU2VsZWN0ZWQoc3ViUm93LCBzZWxlY3RlZFJvd0lkcywgZ2V0U3ViUm93cykpIHtcbiAgICAgICAgICBzb21lU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFsbENoaWxkcmVuU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWxsQ2hpbGRyZW5TZWxlY3RlZCA/IHRydWUgOiBzb21lU2VsZWN0ZWQgPyBudWxsIDogZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGRlZmF1bHRJbml0aWFsUm93U3RhdGVBY2Nlc3NvciA9IGZ1bmN0aW9uIGRlZmF1bHRJbml0aWFsUm93U3RhdGVBY2Nlc3Nvcihyb3cpIHtcbiAgICByZXR1cm4ge307XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRJbml0aWFsQ2VsbFN0YXRlQWNjZXNzb3IgPSBmdW5jdGlvbiBkZWZhdWx0SW5pdGlhbENlbGxTdGF0ZUFjY2Vzc29yKGNlbGwpIHtcbiAgICByZXR1cm4ge307XG4gIH07IC8vIEFjdGlvbnNcblxuXG4gIGFjdGlvbnMuc2V0Um93U3RhdGUgPSAnc2V0Um93U3RhdGUnO1xuICBhY3Rpb25zLnNldENlbGxTdGF0ZSA9ICdzZXRDZWxsU3RhdGUnO1xuICBhY3Rpb25zLnJlc2V0Um93U3RhdGUgPSAncmVzZXRSb3dTdGF0ZSc7XG4gIHZhciB1c2VSb3dTdGF0ZSA9IGZ1bmN0aW9uIHVzZVJvd1N0YXRlKGhvb2tzKSB7XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIkOSk7XG4gICAgaG9va3MudXNlSW5zdGFuY2UucHVzaCh1c2VJbnN0YW5jZSQ5KTtcbiAgICBob29rcy5wcmVwYXJlUm93LnB1c2gocHJlcGFyZVJvdyQ0KTtcbiAgfTtcbiAgdXNlUm93U3RhdGUucGx1Z2luTmFtZSA9ICd1c2VSb3dTdGF0ZSc7XG5cbiAgZnVuY3Rpb24gcmVkdWNlciQ5KHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgdmFyIF9pbnN0YW5jZSRpbml0aWFsUm93UyA9IGluc3RhbmNlLmluaXRpYWxSb3dTdGF0ZUFjY2Vzc29yLFxuICAgICAgICBpbml0aWFsUm93U3RhdGVBY2Nlc3NvciA9IF9pbnN0YW5jZSRpbml0aWFsUm93UyA9PT0gdm9pZCAwID8gZGVmYXVsdEluaXRpYWxSb3dTdGF0ZUFjY2Vzc29yIDogX2luc3RhbmNlJGluaXRpYWxSb3dTLFxuICAgICAgICBfaW5zdGFuY2UkaW5pdGlhbENlbGwgPSBpbnN0YW5jZS5pbml0aWFsQ2VsbFN0YXRlQWNjZXNzb3IsXG4gICAgICAgIGluaXRpYWxDZWxsU3RhdGVBY2Nlc3NvciA9IF9pbnN0YW5jZSRpbml0aWFsQ2VsbCA9PT0gdm9pZCAwID8gZGVmYXVsdEluaXRpYWxDZWxsU3RhdGVBY2Nlc3NvciA6IF9pbnN0YW5jZSRpbml0aWFsQ2VsbCxcbiAgICAgICAgcm93c0J5SWQgPSBpbnN0YW5jZS5yb3dzQnlJZDtcblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5pbml0KSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe1xuICAgICAgICByb3dTdGF0ZToge31cbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMucmVzZXRSb3dTdGF0ZSkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICByb3dTdGF0ZTogaW5zdGFuY2UuaW5pdGlhbFN0YXRlLnJvd1N0YXRlIHx8IHt9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuc2V0Um93U3RhdGUpIHtcbiAgICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICAgIHZhciByb3dJZCA9IGFjdGlvbi5yb3dJZCxcbiAgICAgICAgICB2YWx1ZSA9IGFjdGlvbi52YWx1ZTtcbiAgICAgIHZhciBvbGRSb3dTdGF0ZSA9IHR5cGVvZiBzdGF0ZS5yb3dTdGF0ZVtyb3dJZF0gIT09ICd1bmRlZmluZWQnID8gc3RhdGUucm93U3RhdGVbcm93SWRdIDogaW5pdGlhbFJvd1N0YXRlQWNjZXNzb3Iocm93c0J5SWRbcm93SWRdKTtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgcm93U3RhdGU6IF9leHRlbmRzKHt9LCBzdGF0ZS5yb3dTdGF0ZSwgKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJbcm93SWRdID0gZnVuY3Rpb25hbFVwZGF0ZSh2YWx1ZSwgb2xkUm93U3RhdGUpLCBfZXh0ZW5kczIpKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldENlbGxTdGF0ZSkge1xuICAgICAgdmFyIF9vbGRSb3dTdGF0ZSRjZWxsU3RhdCwgX3Jvd3NCeUlkJF9yb3dJZCwgX3Jvd3NCeUlkJF9yb3dJZCRjZWxsLCBfZXh0ZW5kczMsIF9leHRlbmRzNDtcblxuICAgICAgdmFyIF9yb3dJZCA9IGFjdGlvbi5yb3dJZCxcbiAgICAgICAgICBjb2x1bW5JZCA9IGFjdGlvbi5jb2x1bW5JZCxcbiAgICAgICAgICBfdmFsdWUgPSBhY3Rpb24udmFsdWU7XG5cbiAgICAgIHZhciBfb2xkUm93U3RhdGUgPSB0eXBlb2Ygc3RhdGUucm93U3RhdGVbX3Jvd0lkXSAhPT0gJ3VuZGVmaW5lZCcgPyBzdGF0ZS5yb3dTdGF0ZVtfcm93SWRdIDogaW5pdGlhbFJvd1N0YXRlQWNjZXNzb3Iocm93c0J5SWRbX3Jvd0lkXSk7XG5cbiAgICAgIHZhciBvbGRDZWxsU3RhdGUgPSB0eXBlb2YgKF9vbGRSb3dTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogKF9vbGRSb3dTdGF0ZSRjZWxsU3RhdCA9IF9vbGRSb3dTdGF0ZS5jZWxsU3RhdGUpID09IG51bGwgPyB2b2lkIDAgOiBfb2xkUm93U3RhdGUkY2VsbFN0YXRbY29sdW1uSWRdKSAhPT0gJ3VuZGVmaW5lZCcgPyBfb2xkUm93U3RhdGUuY2VsbFN0YXRlW2NvbHVtbklkXSA6IGluaXRpYWxDZWxsU3RhdGVBY2Nlc3NvcigoX3Jvd3NCeUlkJF9yb3dJZCA9IHJvd3NCeUlkW19yb3dJZF0pID09IG51bGwgPyB2b2lkIDAgOiAoX3Jvd3NCeUlkJF9yb3dJZCRjZWxsID0gX3Jvd3NCeUlkJF9yb3dJZC5jZWxscykgPT0gbnVsbCA/IHZvaWQgMCA6IF9yb3dzQnlJZCRfcm93SWQkY2VsbC5maW5kKGZ1bmN0aW9uIChjZWxsKSB7XG4gICAgICAgIHJldHVybiBjZWxsLmNvbHVtbi5pZCA9PT0gY29sdW1uSWQ7XG4gICAgICB9KSk7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIHJvd1N0YXRlOiBfZXh0ZW5kcyh7fSwgc3RhdGUucm93U3RhdGUsIChfZXh0ZW5kczQgPSB7fSwgX2V4dGVuZHM0W19yb3dJZF0gPSBfZXh0ZW5kcyh7fSwgX29sZFJvd1N0YXRlLCB7XG4gICAgICAgICAgY2VsbFN0YXRlOiBfZXh0ZW5kcyh7fSwgX29sZFJvd1N0YXRlLmNlbGxTdGF0ZSB8fCB7fSwgKF9leHRlbmRzMyA9IHt9LCBfZXh0ZW5kczNbY29sdW1uSWRdID0gZnVuY3Rpb25hbFVwZGF0ZShfdmFsdWUsIG9sZENlbGxTdGF0ZSksIF9leHRlbmRzMykpXG4gICAgICAgIH0pLCBfZXh0ZW5kczQpKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkOShpbnN0YW5jZSkge1xuICAgIHZhciBfaW5zdGFuY2UkYXV0b1Jlc2V0Um8gPSBpbnN0YW5jZS5hdXRvUmVzZXRSb3dTdGF0ZSxcbiAgICAgICAgYXV0b1Jlc2V0Um93U3RhdGUgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0Um8gPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0Um8sXG4gICAgICAgIGRhdGEgPSBpbnN0YW5jZS5kYXRhLFxuICAgICAgICBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoO1xuICAgIHZhciBzZXRSb3dTdGF0ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChyb3dJZCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuc2V0Um93U3RhdGUsXG4gICAgICAgIHJvd0lkOiByb3dJZCxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgc2V0Q2VsbFN0YXRlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKHJvd0lkLCBjb2x1bW5JZCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMuc2V0Q2VsbFN0YXRlLFxuICAgICAgICByb3dJZDogcm93SWQsXG4gICAgICAgIGNvbHVtbklkOiBjb2x1bW5JZCxcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgZ2V0QXV0b1Jlc2V0Um93U3RhdGUgPSB1c2VHZXRMYXRlc3QoYXV0b1Jlc2V0Um93U3RhdGUpO1xuICAgIHVzZU1vdW50ZWRMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGdldEF1dG9SZXNldFJvd1N0YXRlKCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRSb3dTdGF0ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBbZGF0YV0pO1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UsIHtcbiAgICAgIHNldFJvd1N0YXRlOiBzZXRSb3dTdGF0ZSxcbiAgICAgIHNldENlbGxTdGF0ZTogc2V0Q2VsbFN0YXRlXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBwcmVwYXJlUm93JDQocm93LCBfcmVmKSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICB2YXIgX2luc3RhbmNlJGluaXRpYWxSb3dTMiA9IGluc3RhbmNlLmluaXRpYWxSb3dTdGF0ZUFjY2Vzc29yLFxuICAgICAgICBpbml0aWFsUm93U3RhdGVBY2Nlc3NvciA9IF9pbnN0YW5jZSRpbml0aWFsUm93UzIgPT09IHZvaWQgMCA/IGRlZmF1bHRJbml0aWFsUm93U3RhdGVBY2Nlc3NvciA6IF9pbnN0YW5jZSRpbml0aWFsUm93UzIsXG4gICAgICAgIF9pbnN0YW5jZSRpbml0aWFsQ2VsbDIgPSBpbnN0YW5jZS5pbml0aWFsQ2VsbFN0YXRlQWNjZXNzb3IsXG4gICAgICAgIGluaXRpYWxDZWxsU3RhdGVBY2Nlc3NvciA9IF9pbnN0YW5jZSRpbml0aWFsQ2VsbDIgPT09IHZvaWQgMCA/IGRlZmF1bHRJbml0aWFsQ2VsbFN0YXRlQWNjZXNzb3IgOiBfaW5zdGFuY2UkaW5pdGlhbENlbGwyLFxuICAgICAgICByb3dTdGF0ZSA9IGluc3RhbmNlLnN0YXRlLnJvd1N0YXRlO1xuXG4gICAgaWYgKHJvdykge1xuICAgICAgcm93LnN0YXRlID0gdHlwZW9mIHJvd1N0YXRlW3Jvdy5pZF0gIT09ICd1bmRlZmluZWQnID8gcm93U3RhdGVbcm93LmlkXSA6IGluaXRpYWxSb3dTdGF0ZUFjY2Vzc29yKHJvdyk7XG5cbiAgICAgIHJvdy5zZXRTdGF0ZSA9IGZ1bmN0aW9uICh1cGRhdGVyKSB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5zZXRSb3dTdGF0ZShyb3cuaWQsIHVwZGF0ZXIpO1xuICAgICAgfTtcblxuICAgICAgcm93LmNlbGxzLmZvckVhY2goZnVuY3Rpb24gKGNlbGwpIHtcbiAgICAgICAgaWYgKCFyb3cuc3RhdGUuY2VsbFN0YXRlKSB7XG4gICAgICAgICAgcm93LnN0YXRlLmNlbGxTdGF0ZSA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgY2VsbC5zdGF0ZSA9IHR5cGVvZiByb3cuc3RhdGUuY2VsbFN0YXRlW2NlbGwuY29sdW1uLmlkXSAhPT0gJ3VuZGVmaW5lZCcgPyByb3cuc3RhdGUuY2VsbFN0YXRlW2NlbGwuY29sdW1uLmlkXSA6IGluaXRpYWxDZWxsU3RhdGVBY2Nlc3NvcihjZWxsKTtcblxuICAgICAgICBjZWxsLnNldFN0YXRlID0gZnVuY3Rpb24gKHVwZGF0ZXIpIHtcbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2Uuc2V0Q2VsbFN0YXRlKHJvdy5pZCwgY2VsbC5jb2x1bW4uaWQsIHVwZGF0ZXIpO1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYWN0aW9ucy5yZXNldENvbHVtbk9yZGVyID0gJ3Jlc2V0Q29sdW1uT3JkZXInO1xuICBhY3Rpb25zLnNldENvbHVtbk9yZGVyID0gJ3NldENvbHVtbk9yZGVyJztcbiAgdmFyIHVzZUNvbHVtbk9yZGVyID0gZnVuY3Rpb24gdXNlQ29sdW1uT3JkZXIoaG9va3MpIHtcbiAgICBob29rcy5zdGF0ZVJlZHVjZXJzLnB1c2gocmVkdWNlciRhKTtcbiAgICBob29rcy52aXNpYmxlQ29sdW1uc0RlcHMucHVzaChmdW5jdGlvbiAoZGVwcywgX3JlZikge1xuICAgICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZTtcbiAgICAgIHJldHVybiBbXS5jb25jYXQoZGVwcywgW2luc3RhbmNlLnN0YXRlLmNvbHVtbk9yZGVyXSk7XG4gICAgfSk7XG4gICAgaG9va3MudmlzaWJsZUNvbHVtbnMucHVzaCh2aXNpYmxlQ29sdW1ucyQyKTtcbiAgICBob29rcy51c2VJbnN0YW5jZS5wdXNoKHVzZUluc3RhbmNlJGEpO1xuICB9O1xuICB1c2VDb2x1bW5PcmRlci5wbHVnaW5OYW1lID0gJ3VzZUNvbHVtbk9yZGVyJztcblxuICBmdW5jdGlvbiByZWR1Y2VyJGEoc3RhdGUsIGFjdGlvbiwgcHJldmlvdXNTdGF0ZSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuaW5pdCkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgY29sdW1uT3JkZXI6IFtdXG4gICAgICB9LCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnJlc2V0Q29sdW1uT3JkZXIpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgY29sdW1uT3JkZXI6IGluc3RhbmNlLmluaXRpYWxTdGF0ZS5jb2x1bW5PcmRlciB8fCBbXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLnNldENvbHVtbk9yZGVyKSB7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGNvbHVtbk9yZGVyOiBmdW5jdGlvbmFsVXBkYXRlKGFjdGlvbi5jb2x1bW5PcmRlciwgc3RhdGUuY29sdW1uT3JkZXIpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB2aXNpYmxlQ29sdW1ucyQyKGNvbHVtbnMsIF9yZWYyKSB7XG4gICAgdmFyIGNvbHVtbk9yZGVyID0gX3JlZjIuaW5zdGFuY2Uuc3RhdGUuY29sdW1uT3JkZXI7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyBvcmRlciwgcmV0dXJuIHRoZSBub3JtYWwgY29sdW1uc1xuICAgIGlmICghY29sdW1uT3JkZXIgfHwgIWNvbHVtbk9yZGVyLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgfVxuXG4gICAgdmFyIGNvbHVtbk9yZGVyQ29weSA9IFtdLmNvbmNhdChjb2x1bW5PcmRlcik7IC8vIElmIHRoZXJlIGlzIGFuIG9yZGVyLCBtYWtlIGEgY29weSBvZiB0aGUgY29sdW1uc1xuXG4gICAgdmFyIGNvbHVtbnNDb3B5ID0gW10uY29uY2F0KGNvbHVtbnMpOyAvLyBBbmQgbWFrZSBhIG5ldyBvcmRlcmVkIGFycmF5IG9mIHRoZSBjb2x1bW5zXG5cbiAgICB2YXIgY29sdW1uc0luT3JkZXIgPSBbXTsgLy8gTG9vcCBvdmVyIHRoZSBjb2x1bW5zIGFuZCBwbGFjZSB0aGVtIGluIG9yZGVyIGludG8gdGhlIG5ldyBhcnJheVxuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoKSB7XG4gICAgICB2YXIgdGFyZ2V0Q29sdW1uSWQgPSBjb2x1bW5PcmRlckNvcHkuc2hpZnQoKTtcbiAgICAgIHZhciBmb3VuZEluZGV4ID0gY29sdW1uc0NvcHkuZmluZEluZGV4KGZ1bmN0aW9uIChkKSB7XG4gICAgICAgIHJldHVybiBkLmlkID09PSB0YXJnZXRDb2x1bW5JZDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZm91bmRJbmRleCA+IC0xKSB7XG4gICAgICAgIGNvbHVtbnNJbk9yZGVyLnB1c2goY29sdW1uc0NvcHkuc3BsaWNlKGZvdW5kSW5kZXgsIDEpWzBdKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2hpbGUgKGNvbHVtbnNDb3B5Lmxlbmd0aCAmJiBjb2x1bW5PcmRlckNvcHkubGVuZ3RoKSB7XG4gICAgICBfbG9vcCgpO1xuICAgIH0gLy8gSWYgdGhlcmUgYXJlIGFueSBjb2x1bW5zIGxlZnQsIGFkZCB0aGVtIHRvIHRoZSBlbmRcblxuXG4gICAgcmV0dXJuIFtdLmNvbmNhdChjb2x1bW5zSW5PcmRlciwgY29sdW1uc0NvcHkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkYShpbnN0YW5jZSkge1xuICAgIHZhciBkaXNwYXRjaCA9IGluc3RhbmNlLmRpc3BhdGNoO1xuICAgIGluc3RhbmNlLnNldENvbHVtbk9yZGVyID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGNvbHVtbk9yZGVyKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLnNldENvbHVtbk9yZGVyLFxuICAgICAgICBjb2x1bW5PcmRlcjogY29sdW1uT3JkZXJcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICB9XG5cbiAgZGVmYXVsdENvbHVtbi5jYW5SZXNpemUgPSB0cnVlOyAvLyBBY3Rpb25zXG5cbiAgYWN0aW9ucy5jb2x1bW5TdGFydFJlc2l6aW5nID0gJ2NvbHVtblN0YXJ0UmVzaXppbmcnO1xuICBhY3Rpb25zLmNvbHVtblJlc2l6aW5nID0gJ2NvbHVtblJlc2l6aW5nJztcbiAgYWN0aW9ucy5jb2x1bW5Eb25lUmVzaXppbmcgPSAnY29sdW1uRG9uZVJlc2l6aW5nJztcbiAgYWN0aW9ucy5yZXNldFJlc2l6ZSA9ICdyZXNldFJlc2l6ZSc7XG4gIHZhciB1c2VSZXNpemVDb2x1bW5zID0gZnVuY3Rpb24gdXNlUmVzaXplQ29sdW1ucyhob29rcykge1xuICAgIGhvb2tzLmdldFJlc2l6ZXJQcm9wcyA9IFtkZWZhdWx0R2V0UmVzaXplclByb3BzXTtcbiAgICBob29rcy5nZXRIZWFkZXJQcm9wcy5wdXNoKHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgICB9XG4gICAgfSk7XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIkYik7XG4gICAgaG9va3MudXNlSW5zdGFuY2UucHVzaCh1c2VJbnN0YW5jZSRiKTtcbiAgICBob29rcy51c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMucHVzaCh1c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMkMSk7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRHZXRSZXNpemVyUHJvcHMgPSBmdW5jdGlvbiBkZWZhdWx0R2V0UmVzaXplclByb3BzKHByb3BzLCBfcmVmKSB7XG4gICAgdmFyIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZSxcbiAgICAgICAgaGVhZGVyID0gX3JlZi5oZWFkZXI7XG4gICAgdmFyIGRpc3BhdGNoID0gaW5zdGFuY2UuZGlzcGF0Y2g7XG5cbiAgICB2YXIgb25SZXNpemVTdGFydCA9IGZ1bmN0aW9uIG9uUmVzaXplU3RhcnQoZSwgaGVhZGVyKSB7XG4gICAgICB2YXIgaXNUb3VjaEV2ZW50ID0gZmFsc2U7XG5cbiAgICAgIGlmIChlLnR5cGUgPT09ICd0b3VjaHN0YXJ0Jykge1xuICAgICAgICAvLyBsZXRzIG5vdCByZXNwb25kIHRvIG11bHRpcGxlIHRvdWNoZXMgKGUuZy4gMiBvciAzIGZpbmdlcnMpXG4gICAgICAgIGlmIChlLnRvdWNoZXMgJiYgZS50b3VjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpc1RvdWNoRXZlbnQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGVhZGVyc1RvUmVzaXplID0gZ2V0TGVhZkhlYWRlcnMoaGVhZGVyKTtcbiAgICAgIHZhciBoZWFkZXJJZFdpZHRocyA9IGhlYWRlcnNUb1Jlc2l6ZS5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgcmV0dXJuIFtkLmlkLCBkLnRvdGFsV2lkdGhdO1xuICAgICAgfSk7XG4gICAgICB2YXIgY2xpZW50WCA9IGlzVG91Y2hFdmVudCA/IE1hdGgucm91bmQoZS50b3VjaGVzWzBdLmNsaWVudFgpIDogZS5jbGllbnRYO1xuXG4gICAgICB2YXIgZGlzcGF0Y2hNb3ZlID0gZnVuY3Rpb24gZGlzcGF0Y2hNb3ZlKGNsaWVudFhQb3MpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMuY29sdW1uUmVzaXppbmcsXG4gICAgICAgICAgY2xpZW50WDogY2xpZW50WFBvc1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBkaXNwYXRjaEVuZCA9IGZ1bmN0aW9uIGRpc3BhdGNoRW5kKCkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMuY29sdW1uRG9uZVJlc2l6aW5nXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgdmFyIGhhbmRsZXJzQW5kRXZlbnRzID0ge1xuICAgICAgICBtb3VzZToge1xuICAgICAgICAgIG1vdmVFdmVudDogJ21vdXNlbW92ZScsXG4gICAgICAgICAgbW92ZUhhbmRsZXI6IGZ1bmN0aW9uIG1vdmVIYW5kbGVyKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBkaXNwYXRjaE1vdmUoZS5jbGllbnRYKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVwRXZlbnQ6ICdtb3VzZXVwJyxcbiAgICAgICAgICB1cEhhbmRsZXI6IGZ1bmN0aW9uIHVwSGFuZGxlcihlKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVyc0FuZEV2ZW50cy5tb3VzZS5tb3ZlSGFuZGxlcik7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlcnNBbmRFdmVudHMubW91c2UudXBIYW5kbGVyKTtcbiAgICAgICAgICAgIGRpc3BhdGNoRW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB0b3VjaDoge1xuICAgICAgICAgIG1vdmVFdmVudDogJ3RvdWNobW92ZScsXG4gICAgICAgICAgbW92ZUhhbmRsZXI6IGZ1bmN0aW9uIG1vdmVIYW5kbGVyKGUpIHtcbiAgICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkaXNwYXRjaE1vdmUoZS50b3VjaGVzWzBdLmNsaWVudFgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdXBFdmVudDogJ3RvdWNoZW5kJyxcbiAgICAgICAgICB1cEhhbmRsZXI6IGZ1bmN0aW9uIHVwSGFuZGxlcihlKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXJzQW5kRXZlbnRzLnRvdWNoLm1vdmVFdmVudCwgaGFuZGxlcnNBbmRFdmVudHMudG91Y2gubW92ZUhhbmRsZXIpO1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihoYW5kbGVyc0FuZEV2ZW50cy50b3VjaC51cEV2ZW50LCBoYW5kbGVyc0FuZEV2ZW50cy50b3VjaC5tb3ZlSGFuZGxlcik7XG4gICAgICAgICAgICBkaXNwYXRjaEVuZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBldmVudHMgPSBpc1RvdWNoRXZlbnQgPyBoYW5kbGVyc0FuZEV2ZW50cy50b3VjaCA6IGhhbmRsZXJzQW5kRXZlbnRzLm1vdXNlO1xuICAgICAgdmFyIHBhc3NpdmVJZlN1cHBvcnRlZCA9IHBhc3NpdmVFdmVudFN1cHBvcnRlZCgpID8ge1xuICAgICAgICBwYXNzaXZlOiBmYWxzZVxuICAgICAgfSA6IGZhbHNlO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudHMubW92ZUV2ZW50LCBldmVudHMubW92ZUhhbmRsZXIsIHBhc3NpdmVJZlN1cHBvcnRlZCk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50cy51cEV2ZW50LCBldmVudHMudXBIYW5kbGVyLCBwYXNzaXZlSWZTdXBwb3J0ZWQpO1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBhY3Rpb25zLmNvbHVtblN0YXJ0UmVzaXppbmcsXG4gICAgICAgIGNvbHVtbklkOiBoZWFkZXIuaWQsXG4gICAgICAgIGNvbHVtbldpZHRoOiBoZWFkZXIudG90YWxXaWR0aCxcbiAgICAgICAgaGVhZGVySWRXaWR0aHM6IGhlYWRlcklkV2lkdGhzLFxuICAgICAgICBjbGllbnRYOiBjbGllbnRYXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgb25Nb3VzZURvd246IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgcmV0dXJuIGUucGVyc2lzdCgpIHx8IG9uUmVzaXplU3RhcnQoZSwgaGVhZGVyKTtcbiAgICAgIH0sXG4gICAgICBvblRvdWNoU3RhcnQ6IGZ1bmN0aW9uIG9uVG91Y2hTdGFydChlKSB7XG4gICAgICAgIHJldHVybiBlLnBlcnNpc3QoKSB8fCBvblJlc2l6ZVN0YXJ0KGUsIGhlYWRlcik7XG4gICAgICB9LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY3Vyc29yOiAnY29sLXJlc2l6ZSdcbiAgICAgIH0sXG4gICAgICBkcmFnZ2FibGU6IGZhbHNlLFxuICAgICAgcm9sZTogJ3NlcGFyYXRvcidcbiAgICB9XTtcbiAgfTtcblxuICB1c2VSZXNpemVDb2x1bW5zLnBsdWdpbk5hbWUgPSAndXNlUmVzaXplQ29sdW1ucyc7XG5cbiAgZnVuY3Rpb24gcmVkdWNlciRiKHN0YXRlLCBhY3Rpb24pIHtcbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMuaW5pdCkge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgY29sdW1uUmVzaXppbmc6IHtcbiAgICAgICAgICBjb2x1bW5XaWR0aHM6IHt9XG4gICAgICAgIH1cbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IGFjdGlvbnMucmVzZXRSZXNpemUpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgY29sdW1uUmVzaXppbmc6IHtcbiAgICAgICAgICBjb2x1bW5XaWR0aHM6IHt9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5jb2x1bW5TdGFydFJlc2l6aW5nKSB7XG4gICAgICB2YXIgY2xpZW50WCA9IGFjdGlvbi5jbGllbnRYLFxuICAgICAgICAgIGNvbHVtbklkID0gYWN0aW9uLmNvbHVtbklkLFxuICAgICAgICAgIGNvbHVtbldpZHRoID0gYWN0aW9uLmNvbHVtbldpZHRoLFxuICAgICAgICAgIGhlYWRlcklkV2lkdGhzID0gYWN0aW9uLmhlYWRlcklkV2lkdGhzO1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBjb2x1bW5SZXNpemluZzogX2V4dGVuZHMoe30sIHN0YXRlLmNvbHVtblJlc2l6aW5nLCB7XG4gICAgICAgICAgc3RhcnRYOiBjbGllbnRYLFxuICAgICAgICAgIGhlYWRlcklkV2lkdGhzOiBoZWFkZXJJZFdpZHRocyxcbiAgICAgICAgICBjb2x1bW5XaWR0aDogY29sdW1uV2lkdGgsXG4gICAgICAgICAgaXNSZXNpemluZ0NvbHVtbjogY29sdW1uSWRcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gYWN0aW9ucy5jb2x1bW5SZXNpemluZykge1xuICAgICAgdmFyIF9jbGllbnRYID0gYWN0aW9uLmNsaWVudFg7XG5cbiAgICAgIHZhciBfc3RhdGUkY29sdW1uUmVzaXppbmcgPSBzdGF0ZS5jb2x1bW5SZXNpemluZyxcbiAgICAgICAgICBzdGFydFggPSBfc3RhdGUkY29sdW1uUmVzaXppbmcuc3RhcnRYLFxuICAgICAgICAgIF9jb2x1bW5XaWR0aCA9IF9zdGF0ZSRjb2x1bW5SZXNpemluZy5jb2x1bW5XaWR0aCxcbiAgICAgICAgICBfc3RhdGUkY29sdW1uUmVzaXppbmcyID0gX3N0YXRlJGNvbHVtblJlc2l6aW5nLmhlYWRlcklkV2lkdGhzLFxuICAgICAgICAgIF9oZWFkZXJJZFdpZHRocyA9IF9zdGF0ZSRjb2x1bW5SZXNpemluZzIgPT09IHZvaWQgMCA/IFtdIDogX3N0YXRlJGNvbHVtblJlc2l6aW5nMjtcblxuICAgICAgdmFyIGRlbHRhWCA9IF9jbGllbnRYIC0gc3RhcnRYO1xuICAgICAgdmFyIHBlcmNlbnRhZ2VEZWx0YVggPSBkZWx0YVggLyBfY29sdW1uV2lkdGg7XG4gICAgICB2YXIgbmV3Q29sdW1uV2lkdGhzID0ge307XG5cbiAgICAgIF9oZWFkZXJJZFdpZHRocy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICB2YXIgaGVhZGVySWQgPSBfcmVmMlswXSxcbiAgICAgICAgICAgIGhlYWRlcldpZHRoID0gX3JlZjJbMV07XG4gICAgICAgIG5ld0NvbHVtbldpZHRoc1toZWFkZXJJZF0gPSBNYXRoLm1heChoZWFkZXJXaWR0aCArIGhlYWRlcldpZHRoICogcGVyY2VudGFnZURlbHRhWCwgMCk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBjb2x1bW5SZXNpemluZzogX2V4dGVuZHMoe30sIHN0YXRlLmNvbHVtblJlc2l6aW5nLCB7XG4gICAgICAgICAgY29sdW1uV2lkdGhzOiBfZXh0ZW5kcyh7fSwgc3RhdGUuY29sdW1uUmVzaXppbmcuY29sdW1uV2lkdGhzLCB7fSwgbmV3Q29sdW1uV2lkdGhzKVxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBhY3Rpb25zLmNvbHVtbkRvbmVSZXNpemluZykge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdGF0ZSwge1xuICAgICAgICBjb2x1bW5SZXNpemluZzogX2V4dGVuZHMoe30sIHN0YXRlLmNvbHVtblJlc2l6aW5nLCB7XG4gICAgICAgICAgc3RhcnRYOiBudWxsLFxuICAgICAgICAgIGlzUmVzaXppbmdDb2x1bW46IG51bGxcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhciB1c2VJbnN0YW5jZUJlZm9yZURpbWVuc2lvbnMkMSA9IGZ1bmN0aW9uIHVzZUluc3RhbmNlQmVmb3JlRGltZW5zaW9ucyhpbnN0YW5jZSkge1xuICAgIHZhciBmbGF0SGVhZGVycyA9IGluc3RhbmNlLmZsYXRIZWFkZXJzLFxuICAgICAgICBkaXNhYmxlUmVzaXppbmcgPSBpbnN0YW5jZS5kaXNhYmxlUmVzaXppbmcsXG4gICAgICAgIGdldEhvb2tzID0gaW5zdGFuY2UuZ2V0SG9va3MsXG4gICAgICAgIGNvbHVtblJlc2l6aW5nID0gaW5zdGFuY2Uuc3RhdGUuY29sdW1uUmVzaXppbmc7XG4gICAgdmFyIGdldEluc3RhbmNlID0gdXNlR2V0TGF0ZXN0KGluc3RhbmNlKTtcbiAgICBmbGF0SGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChoZWFkZXIpIHtcbiAgICAgIHZhciBjYW5SZXNpemUgPSBnZXRGaXJzdERlZmluZWQoaGVhZGVyLmRpc2FibGVSZXNpemluZyA9PT0gdHJ1ZSA/IGZhbHNlIDogdW5kZWZpbmVkLCBkaXNhYmxlUmVzaXppbmcgPT09IHRydWUgPyBmYWxzZSA6IHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICBoZWFkZXIuY2FuUmVzaXplID0gY2FuUmVzaXplO1xuICAgICAgaGVhZGVyLndpZHRoID0gY29sdW1uUmVzaXppbmcuY29sdW1uV2lkdGhzW2hlYWRlci5pZF0gfHwgaGVhZGVyLm9yaWdpbmFsV2lkdGggfHwgaGVhZGVyLndpZHRoO1xuICAgICAgaGVhZGVyLmlzUmVzaXppbmcgPSBjb2x1bW5SZXNpemluZy5pc1Jlc2l6aW5nQ29sdW1uID09PSBoZWFkZXIuaWQ7XG5cbiAgICAgIGlmIChjYW5SZXNpemUpIHtcbiAgICAgICAgaGVhZGVyLmdldFJlc2l6ZXJQcm9wcyA9IG1ha2VQcm9wR2V0dGVyKGdldEhvb2tzKCkuZ2V0UmVzaXplclByb3BzLCB7XG4gICAgICAgICAgaW5zdGFuY2U6IGdldEluc3RhbmNlKCksXG4gICAgICAgICAgaGVhZGVyOiBoZWFkZXJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gdXNlSW5zdGFuY2UkYihpbnN0YW5jZSkge1xuICAgIHZhciBwbHVnaW5zID0gaW5zdGFuY2UucGx1Z2lucyxcbiAgICAgICAgZGlzcGF0Y2ggPSBpbnN0YW5jZS5kaXNwYXRjaCxcbiAgICAgICAgX2luc3RhbmNlJGF1dG9SZXNldFJlID0gaW5zdGFuY2UuYXV0b1Jlc2V0UmVzaXplLFxuICAgICAgICBhdXRvUmVzZXRSZXNpemUgPSBfaW5zdGFuY2UkYXV0b1Jlc2V0UmUgPT09IHZvaWQgMCA/IHRydWUgOiBfaW5zdGFuY2UkYXV0b1Jlc2V0UmUsXG4gICAgICAgIGNvbHVtbnMgPSBpbnN0YW5jZS5jb2x1bW5zO1xuICAgIGVuc3VyZVBsdWdpbk9yZGVyKHBsdWdpbnMsIFsndXNlQWJzb2x1dGVMYXlvdXQnXSwgJ3VzZVJlc2l6ZUNvbHVtbnMnKTtcbiAgICB2YXIgZ2V0QXV0b1Jlc2V0UmVzaXplID0gdXNlR2V0TGF0ZXN0KGF1dG9SZXNldFJlc2l6ZSk7XG4gICAgdXNlTW91bnRlZExheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZ2V0QXV0b1Jlc2V0UmVzaXplKCkpIHtcbiAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRSZXNpemVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgW2NvbHVtbnNdKTtcbiAgICB2YXIgcmVzZXRSZXNpemluZyA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IGFjdGlvbnMucmVzZXRSZXNpemVcbiAgICAgIH0pO1xuICAgIH0sIFtkaXNwYXRjaF0pO1xuICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UsIHtcbiAgICAgIHJlc2V0UmVzaXppbmc6IHJlc2V0UmVzaXppbmdcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldExlYWZIZWFkZXJzKGhlYWRlcikge1xuICAgIHZhciBsZWFmSGVhZGVycyA9IFtdO1xuXG4gICAgdmFyIHJlY3Vyc2VIZWFkZXIgPSBmdW5jdGlvbiByZWN1cnNlSGVhZGVyKGhlYWRlcikge1xuICAgICAgaWYgKGhlYWRlci5jb2x1bW5zICYmIGhlYWRlci5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBoZWFkZXIuY29sdW1ucy5tYXAocmVjdXJzZUhlYWRlcik7XG4gICAgICB9XG5cbiAgICAgIGxlYWZIZWFkZXJzLnB1c2goaGVhZGVyKTtcbiAgICB9O1xuXG4gICAgcmVjdXJzZUhlYWRlcihoZWFkZXIpO1xuICAgIHJldHVybiBsZWFmSGVhZGVycztcbiAgfVxuXG4gIHZhciBjZWxsU3R5bGVzID0ge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHRvcDogMFxuICB9O1xuICB2YXIgdXNlQWJzb2x1dGVMYXlvdXQgPSBmdW5jdGlvbiB1c2VBYnNvbHV0ZUxheW91dChob29rcykge1xuICAgIGhvb2tzLmdldFRhYmxlQm9keVByb3BzLnB1c2goZ2V0Um93U3R5bGVzKTtcbiAgICBob29rcy5nZXRSb3dQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyk7XG4gICAgaG9va3MuZ2V0SGVhZGVyR3JvdXBQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyk7XG4gICAgaG9va3MuZ2V0Rm9vdGVyR3JvdXBQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyk7XG4gICAgaG9va3MuZ2V0SGVhZGVyUHJvcHMucHVzaChmdW5jdGlvbiAocHJvcHMsIF9yZWYpIHtcbiAgICAgIHZhciBjb2x1bW4gPSBfcmVmLmNvbHVtbjtcbiAgICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgICAgc3R5bGU6IF9leHRlbmRzKHt9LCBjZWxsU3R5bGVzLCB7XG4gICAgICAgICAgbGVmdDogY29sdW1uLnRvdGFsTGVmdCArIFwicHhcIixcbiAgICAgICAgICB3aWR0aDogY29sdW1uLnRvdGFsV2lkdGggKyBcInB4XCJcbiAgICAgICAgfSlcbiAgICAgIH1dO1xuICAgIH0pO1xuICAgIGhvb2tzLmdldENlbGxQcm9wcy5wdXNoKGZ1bmN0aW9uIChwcm9wcywgX3JlZjIpIHtcbiAgICAgIHZhciBjZWxsID0gX3JlZjIuY2VsbDtcbiAgICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgICAgc3R5bGU6IF9leHRlbmRzKHt9LCBjZWxsU3R5bGVzLCB7XG4gICAgICAgICAgbGVmdDogY2VsbC5jb2x1bW4udG90YWxMZWZ0ICsgXCJweFwiLFxuICAgICAgICAgIHdpZHRoOiBjZWxsLmNvbHVtbi50b3RhbFdpZHRoICsgXCJweFwiXG4gICAgICAgIH0pXG4gICAgICB9XTtcbiAgICB9KTtcbiAgICBob29rcy5nZXRGb290ZXJQcm9wcy5wdXNoKGZ1bmN0aW9uIChwcm9wcywgX3JlZjMpIHtcbiAgICAgIHZhciBjb2x1bW4gPSBfcmVmMy5jb2x1bW47XG4gICAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICAgIHN0eWxlOiBfZXh0ZW5kcyh7fSwgY2VsbFN0eWxlcywge1xuICAgICAgICAgIGxlZnQ6IGNvbHVtbi50b3RhbExlZnQgKyBcInB4XCIsXG4gICAgICAgICAgd2lkdGg6IGNvbHVtbi50b3RhbFdpZHRoICsgXCJweFwiXG4gICAgICAgIH0pXG4gICAgICB9XTtcbiAgICB9KTtcbiAgfTtcbiAgdXNlQWJzb2x1dGVMYXlvdXQucGx1Z2luTmFtZSA9ICd1c2VBYnNvbHV0ZUxheW91dCc7XG5cbiAgdmFyIGdldFJvd1N0eWxlcyA9IGZ1bmN0aW9uIGdldFJvd1N0eWxlcyhwcm9wcywgX3JlZjQpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmNC5pbnN0YW5jZTtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgd2lkdGg6IGluc3RhbmNlLnRvdGFsQ29sdW1uc1dpZHRoICsgXCJweFwiXG4gICAgICB9XG4gICAgfV07XG4gIH07XG5cbiAgdmFyIGNlbGxTdHlsZXMkMSA9IHtcbiAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICBib3hTaXppbmc6ICdib3JkZXItYm94J1xuICB9O1xuXG4gIHZhciBnZXRSb3dTdHlsZXMkMSA9IGZ1bmN0aW9uIGdldFJvd1N0eWxlcyhwcm9wcywgX3JlZikge1xuICAgIHZhciBpbnN0YW5jZSA9IF9yZWYuaW5zdGFuY2U7XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICB3aWR0aDogaW5zdGFuY2UudG90YWxDb2x1bW5zV2lkdGggKyBcInB4XCJcbiAgICAgIH1cbiAgICB9XTtcbiAgfTtcblxuICB2YXIgdXNlQmxvY2tMYXlvdXQgPSBmdW5jdGlvbiB1c2VCbG9ja0xheW91dChob29rcykge1xuICAgIGhvb2tzLmdldFJvd1Byb3BzLnB1c2goZ2V0Um93U3R5bGVzJDEpO1xuICAgIGhvb2tzLmdldEhlYWRlckdyb3VwUHJvcHMucHVzaChnZXRSb3dTdHlsZXMkMSk7XG4gICAgaG9va3MuZ2V0Rm9vdGVyR3JvdXBQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyQxKTtcbiAgICBob29rcy5nZXRIZWFkZXJQcm9wcy5wdXNoKGZ1bmN0aW9uIChwcm9wcywgX3JlZjIpIHtcbiAgICAgIHZhciBjb2x1bW4gPSBfcmVmMi5jb2x1bW47XG4gICAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICAgIHN0eWxlOiBfZXh0ZW5kcyh7fSwgY2VsbFN0eWxlcyQxLCB7XG4gICAgICAgICAgd2lkdGg6IGNvbHVtbi50b3RhbFdpZHRoICsgXCJweFwiXG4gICAgICAgIH0pXG4gICAgICB9XTtcbiAgICB9KTtcbiAgICBob29rcy5nZXRDZWxsUHJvcHMucHVzaChmdW5jdGlvbiAocHJvcHMsIF9yZWYzKSB7XG4gICAgICB2YXIgY2VsbCA9IF9yZWYzLmNlbGw7XG4gICAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICAgIHN0eWxlOiBfZXh0ZW5kcyh7fSwgY2VsbFN0eWxlcyQxLCB7XG4gICAgICAgICAgd2lkdGg6IGNlbGwuY29sdW1uLnRvdGFsV2lkdGggKyBcInB4XCJcbiAgICAgICAgfSlcbiAgICAgIH1dO1xuICAgIH0pO1xuICAgIGhvb2tzLmdldEZvb3RlclByb3BzLnB1c2goZnVuY3Rpb24gKHByb3BzLCBfcmVmNCkge1xuICAgICAgdmFyIGNvbHVtbiA9IF9yZWY0LmNvbHVtbjtcbiAgICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgICAgc3R5bGU6IF9leHRlbmRzKHt9LCBjZWxsU3R5bGVzJDEsIHtcbiAgICAgICAgICB3aWR0aDogY29sdW1uLnRvdGFsV2lkdGggKyBcInB4XCJcbiAgICAgICAgfSlcbiAgICAgIH1dO1xuICAgIH0pO1xuICB9O1xuICB1c2VCbG9ja0xheW91dC5wbHVnaW5OYW1lID0gJ3VzZUJsb2NrTGF5b3V0JztcblxuICBmdW5jdGlvbiB1c2VGbGV4TGF5b3V0KGhvb2tzKSB7XG4gICAgaG9va3MuZ2V0VGFibGVQcm9wcy5wdXNoKGdldFRhYmxlUHJvcHMpO1xuICAgIGhvb2tzLmdldFJvd1Byb3BzLnB1c2goZ2V0Um93U3R5bGVzJDIpO1xuICAgIGhvb2tzLmdldEhlYWRlckdyb3VwUHJvcHMucHVzaChnZXRSb3dTdHlsZXMkMik7XG4gICAgaG9va3MuZ2V0Rm9vdGVyR3JvdXBQcm9wcy5wdXNoKGdldFJvd1N0eWxlcyQyKTtcbiAgICBob29rcy5nZXRIZWFkZXJQcm9wcy5wdXNoKGdldEhlYWRlclByb3BzKTtcbiAgICBob29rcy5nZXRDZWxsUHJvcHMucHVzaChnZXRDZWxsUHJvcHMpO1xuICAgIGhvb2tzLmdldEZvb3RlclByb3BzLnB1c2goZ2V0Rm9vdGVyUHJvcHMpO1xuICB9XG4gIHVzZUZsZXhMYXlvdXQucGx1Z2luTmFtZSA9ICd1c2VGbGV4TGF5b3V0JztcblxuICB2YXIgZ2V0VGFibGVQcm9wcyA9IGZ1bmN0aW9uIGdldFRhYmxlUHJvcHMocHJvcHMsIF9yZWYpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmLmluc3RhbmNlO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIG1pbldpZHRoOiBpbnN0YW5jZS50b3RhbENvbHVtbnNNaW5XaWR0aCArIFwicHhcIlxuICAgICAgfVxuICAgIH1dO1xuICB9O1xuXG4gIHZhciBnZXRSb3dTdHlsZXMkMiA9IGZ1bmN0aW9uIGdldFJvd1N0eWxlcyhwcm9wcywgX3JlZjIpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmMi5pbnN0YW5jZTtcbiAgICByZXR1cm4gW3Byb3BzLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIGZsZXg6ICcxIDAgYXV0bycsXG4gICAgICAgIG1pbldpZHRoOiBpbnN0YW5jZS50b3RhbENvbHVtbnNNaW5XaWR0aCArIFwicHhcIlxuICAgICAgfVxuICAgIH1dO1xuICB9O1xuXG4gIHZhciBnZXRIZWFkZXJQcm9wcyA9IGZ1bmN0aW9uIGdldEhlYWRlclByb3BzKHByb3BzLCBfcmVmMykge1xuICAgIHZhciBjb2x1bW4gPSBfcmVmMy5jb2x1bW47XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICAgIGZsZXg6IGNvbHVtbi50b3RhbEZsZXhXaWR0aCA/IGNvbHVtbi50b3RhbEZsZXhXaWR0aCArIFwiIDAgYXV0b1wiIDogdW5kZWZpbmVkLFxuICAgICAgICBtaW5XaWR0aDogY29sdW1uLnRvdGFsTWluV2lkdGggKyBcInB4XCIsXG4gICAgICAgIHdpZHRoOiBjb2x1bW4udG90YWxXaWR0aCArIFwicHhcIlxuICAgICAgfVxuICAgIH1dO1xuICB9O1xuXG4gIHZhciBnZXRDZWxsUHJvcHMgPSBmdW5jdGlvbiBnZXRDZWxsUHJvcHMocHJvcHMsIF9yZWY0KSB7XG4gICAgdmFyIGNlbGwgPSBfcmVmNC5jZWxsO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgICBmbGV4OiBjZWxsLmNvbHVtbi50b3RhbEZsZXhXaWR0aCArIFwiIDAgYXV0b1wiLFxuICAgICAgICBtaW5XaWR0aDogY2VsbC5jb2x1bW4udG90YWxNaW5XaWR0aCArIFwicHhcIixcbiAgICAgICAgd2lkdGg6IGNlbGwuY29sdW1uLnRvdGFsV2lkdGggKyBcInB4XCJcbiAgICAgIH1cbiAgICB9XTtcbiAgfTtcblxuICB2YXIgZ2V0Rm9vdGVyUHJvcHMgPSBmdW5jdGlvbiBnZXRGb290ZXJQcm9wcyhwcm9wcywgX3JlZjUpIHtcbiAgICB2YXIgY29sdW1uID0gX3JlZjUuY29sdW1uO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgICBmbGV4OiBjb2x1bW4udG90YWxGbGV4V2lkdGggPyBjb2x1bW4udG90YWxGbGV4V2lkdGggKyBcIiAwIGF1dG9cIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgbWluV2lkdGg6IGNvbHVtbi50b3RhbE1pbldpZHRoICsgXCJweFwiLFxuICAgICAgICB3aWR0aDogY29sdW1uLnRvdGFsV2lkdGggKyBcInB4XCJcbiAgICAgIH1cbiAgICB9XTtcbiAgfTtcblxuICBmdW5jdGlvbiB1c2VHcmlkTGF5b3V0KGhvb2tzKSB7XG4gICAgaG9va3Muc3RhdGVSZWR1Y2Vycy5wdXNoKHJlZHVjZXIkYyk7XG4gICAgaG9va3MuZ2V0VGFibGVQcm9wcy5wdXNoKGdldFRhYmxlUHJvcHMkMSk7XG4gICAgaG9va3MuZ2V0SGVhZGVyUHJvcHMucHVzaChnZXRIZWFkZXJQcm9wcyQxKTtcbiAgfVxuICB1c2VHcmlkTGF5b3V0LnBsdWdpbk5hbWUgPSAndXNlR3JpZExheW91dCc7XG5cbiAgdmFyIGdldFRhYmxlUHJvcHMkMSA9IGZ1bmN0aW9uIGdldFRhYmxlUHJvcHMocHJvcHMsIF9yZWYpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfcmVmLmluc3RhbmNlO1xuICAgIHJldHVybiBbcHJvcHMsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGRpc3BsYXk6IFwiZ3JpZFwiLFxuICAgICAgICBncmlkVGVtcGxhdGVDb2x1bW5zOiBpbnN0YW5jZS5zdGF0ZS5ncmlkTGF5b3V0LmNvbHVtbldpZHRocy5tYXAoZnVuY3Rpb24gKHcpIHtcbiAgICAgICAgICByZXR1cm4gdztcbiAgICAgICAgfSkuam9pbihcIiBcIilcbiAgICAgIH1cbiAgICB9XTtcbiAgfTtcblxuICB2YXIgZ2V0SGVhZGVyUHJvcHMkMSA9IGZ1bmN0aW9uIGdldEhlYWRlclByb3BzKHByb3BzLCBfcmVmMikge1xuICAgIHZhciBjb2x1bW4gPSBfcmVmMi5jb2x1bW47XG4gICAgcmV0dXJuIFtwcm9wcywge1xuICAgICAgaWQ6IFwiaGVhZGVyLWNlbGwtXCIgKyBjb2x1bW4uaWQsXG4gICAgICBzdHlsZToge1xuICAgICAgICBwb3NpdGlvbjogXCJzdGlja3lcIiAvL2VuYWJsZXMgYSBzY3JvbGwgd3JhcHBlciB0byBiZSBwbGFjZWQgYXJvdW5kIHRoZSB0YWJsZSBhbmQgaGF2ZSBzdGlja3kgaGVhZGVyc1xuXG4gICAgICB9XG4gICAgfV07XG4gIH07XG5cbiAgZnVuY3Rpb24gcmVkdWNlciRjKHN0YXRlLCBhY3Rpb24sIHByZXZpb3VzU3RhdGUsIGluc3RhbmNlKSB7XG4gICAgaWYgKGFjdGlvbi50eXBlID09PSBcImluaXRcIikge1xuICAgICAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICAgICAgZ3JpZExheW91dDoge1xuICAgICAgICAgIGNvbHVtbldpZHRoczogaW5zdGFuY2UuY29sdW1ucy5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiYXV0b1wiO1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uLnR5cGUgPT09IFwiY29sdW1uU3RhcnRSZXNpemluZ1wiKSB7XG4gICAgICB2YXIgY29sdW1uSWQgPSBhY3Rpb24uY29sdW1uSWQ7XG4gICAgICB2YXIgY29sdW1uSW5kZXggPSBpbnN0YW5jZS52aXNpYmxlQ29sdW1ucy5maW5kSW5kZXgoZnVuY3Rpb24gKGNvbCkge1xuICAgICAgICByZXR1cm4gY29sLmlkID09PSBjb2x1bW5JZDtcbiAgICAgIH0pO1xuICAgICAgdmFyIGVsV2lkdGggPSBnZXRFbGVtZW50V2lkdGgoY29sdW1uSWQpO1xuXG4gICAgICBpZiAoZWxXaWR0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgc3RhdGUsIHtcbiAgICAgICAgICBncmlkTGF5b3V0OiBfZXh0ZW5kcyh7fSwgc3RhdGUuZ3JpZExheW91dCwge1xuICAgICAgICAgICAgY29sdW1uSWQ6IGNvbHVtbklkLFxuICAgICAgICAgICAgY29sdW1uSW5kZXg6IGNvbHVtbkluZGV4LFxuICAgICAgICAgICAgc3RhcnRpbmdXaWR0aDogZWxXaWR0aFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhY3Rpb24udHlwZSA9PT0gXCJjb2x1bW5SZXNpemluZ1wiKSB7XG4gICAgICB2YXIgX3N0YXRlJGdyaWRMYXlvdXQgPSBzdGF0ZS5ncmlkTGF5b3V0LFxuICAgICAgICAgIF9jb2x1bW5JbmRleCA9IF9zdGF0ZSRncmlkTGF5b3V0LmNvbHVtbkluZGV4LFxuICAgICAgICAgIHN0YXJ0aW5nV2lkdGggPSBfc3RhdGUkZ3JpZExheW91dC5zdGFydGluZ1dpZHRoLFxuICAgICAgICAgIGNvbHVtbldpZHRocyA9IF9zdGF0ZSRncmlkTGF5b3V0LmNvbHVtbldpZHRocztcbiAgICAgIHZhciBjaGFuZ2UgPSBzdGF0ZS5jb2x1bW5SZXNpemluZy5zdGFydFggLSBhY3Rpb24uY2xpZW50WDtcbiAgICAgIHZhciBuZXdXaWR0aCA9IHN0YXJ0aW5nV2lkdGggLSBjaGFuZ2U7XG4gICAgICB2YXIgY29sdW1uV2lkdGhzQ29weSA9IFtdLmNvbmNhdChjb2x1bW5XaWR0aHMpO1xuICAgICAgY29sdW1uV2lkdGhzQ29weVtfY29sdW1uSW5kZXhdID0gbmV3V2lkdGggKyBcInB4XCI7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0YXRlLCB7XG4gICAgICAgIGdyaWRMYXlvdXQ6IF9leHRlbmRzKHt9LCBzdGF0ZS5ncmlkTGF5b3V0LCB7XG4gICAgICAgICAgY29sdW1uV2lkdGhzOiBjb2x1bW5XaWR0aHNDb3B5XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRFbGVtZW50V2lkdGgoY29sdW1uSWQpIHtcbiAgICB2YXIgX2RvY3VtZW50JGdldEVsZW1lbnRCO1xuXG4gICAgdmFyIHdpZHRoID0gKF9kb2N1bWVudCRnZXRFbGVtZW50QiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaGVhZGVyLWNlbGwtXCIgKyBjb2x1bW5JZCkpID09IG51bGwgPyB2b2lkIDAgOiBfZG9jdW1lbnQkZ2V0RWxlbWVudEIub2Zmc2V0V2lkdGg7XG5cbiAgICBpZiAod2lkdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHdpZHRoO1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydHMuX1VOU1RBQkxFX3VzZVBpdm90Q29sdW1ucyA9IF9VTlNUQUJMRV91c2VQaXZvdENvbHVtbnM7XG4gIGV4cG9ydHMuYWN0aW9ucyA9IGFjdGlvbnM7XG4gIGV4cG9ydHMuZGVmYXVsdENvbHVtbiA9IGRlZmF1bHRDb2x1bW47XG4gIGV4cG9ydHMuZGVmYXVsdEdyb3VwQnlGbiA9IGRlZmF1bHRHcm91cEJ5Rm47XG4gIGV4cG9ydHMuZGVmYXVsdE9yZGVyQnlGbiA9IGRlZmF1bHRPcmRlckJ5Rm47XG4gIGV4cG9ydHMuZGVmYXVsdFJlbmRlcmVyID0gZGVmYXVsdFJlbmRlcmVyO1xuICBleHBvcnRzLmVtcHR5UmVuZGVyZXIgPSBlbXB0eVJlbmRlcmVyO1xuICBleHBvcnRzLmVuc3VyZVBsdWdpbk9yZGVyID0gZW5zdXJlUGx1Z2luT3JkZXI7XG4gIGV4cG9ydHMuZmxleFJlbmRlciA9IGZsZXhSZW5kZXI7XG4gIGV4cG9ydHMuZnVuY3Rpb25hbFVwZGF0ZSA9IGZ1bmN0aW9uYWxVcGRhdGU7XG4gIGV4cG9ydHMubG9vcEhvb2tzID0gbG9vcEhvb2tzO1xuICBleHBvcnRzLm1ha2VQcm9wR2V0dGVyID0gbWFrZVByb3BHZXR0ZXI7XG4gIGV4cG9ydHMubWFrZVJlbmRlcmVyID0gbWFrZVJlbmRlcmVyO1xuICBleHBvcnRzLnJlZHVjZUhvb2tzID0gcmVkdWNlSG9va3M7XG4gIGV4cG9ydHMuc2FmZVVzZUxheW91dEVmZmVjdCA9IHNhZmVVc2VMYXlvdXRFZmZlY3Q7XG4gIGV4cG9ydHMudXNlQWJzb2x1dGVMYXlvdXQgPSB1c2VBYnNvbHV0ZUxheW91dDtcbiAgZXhwb3J0cy51c2VBc3luY0RlYm91bmNlID0gdXNlQXN5bmNEZWJvdW5jZTtcbiAgZXhwb3J0cy51c2VCbG9ja0xheW91dCA9IHVzZUJsb2NrTGF5b3V0O1xuICBleHBvcnRzLnVzZUNvbHVtbk9yZGVyID0gdXNlQ29sdW1uT3JkZXI7XG4gIGV4cG9ydHMudXNlRXhwYW5kZWQgPSB1c2VFeHBhbmRlZDtcbiAgZXhwb3J0cy51c2VGaWx0ZXJzID0gdXNlRmlsdGVycztcbiAgZXhwb3J0cy51c2VGbGV4TGF5b3V0ID0gdXNlRmxleExheW91dDtcbiAgZXhwb3J0cy51c2VHZXRMYXRlc3QgPSB1c2VHZXRMYXRlc3Q7XG4gIGV4cG9ydHMudXNlR2xvYmFsRmlsdGVyID0gdXNlR2xvYmFsRmlsdGVyO1xuICBleHBvcnRzLnVzZUdyaWRMYXlvdXQgPSB1c2VHcmlkTGF5b3V0O1xuICBleHBvcnRzLnVzZUdyb3VwQnkgPSB1c2VHcm91cEJ5O1xuICBleHBvcnRzLnVzZU1vdW50ZWRMYXlvdXRFZmZlY3QgPSB1c2VNb3VudGVkTGF5b3V0RWZmZWN0O1xuICBleHBvcnRzLnVzZVBhZ2luYXRpb24gPSB1c2VQYWdpbmF0aW9uO1xuICBleHBvcnRzLnVzZVJlc2l6ZUNvbHVtbnMgPSB1c2VSZXNpemVDb2x1bW5zO1xuICBleHBvcnRzLnVzZVJvd1NlbGVjdCA9IHVzZVJvd1NlbGVjdDtcbiAgZXhwb3J0cy51c2VSb3dTdGF0ZSA9IHVzZVJvd1N0YXRlO1xuICBleHBvcnRzLnVzZVNvcnRCeSA9IHVzZVNvcnRCeTtcbiAgZXhwb3J0cy51c2VUYWJsZSA9IHVzZVRhYmxlO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWFjdC10YWJsZS5kZXZlbG9wbWVudC5qcy5tYXBcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBLFdBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/react-table/dist/react-table.development.js\n");
|
|
7
|
-
|
|
8
|
-
/***/ }),
|
|
9
|
-
|
|
10
|
-
/***/ "../../../node_modules/react-table/index.js":
|
|
11
|
-
/***/ (function(module, exports, __webpack_require__) {
|
|
12
|
-
|
|
13
|
-
eval("if (false) {} else {\n module.exports = __webpack_require__(\"../../../node_modules/react-table/dist/react-table.development.js\")\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0LXRhYmxlL2luZGV4LmpzLmpzIiwic291cmNlcyI6WyJmaWxlOi8vQzovQ2xpY2tWaWV3IFByb2plY3RzL2NsaWNrdmlldy9ub2RlX21vZHVsZXMvcmVhY3QtdGFibGUvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Rpc3QvcmVhY3QtdGFibGUucHJvZHVjdGlvbi5taW4uanMnKVxufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Rpc3QvcmVhY3QtdGFibGUuZGV2ZWxvcG1lbnQuanMnKVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxhQUVBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/react-table/index.js\n");
|
|
14
|
-
|
|
15
|
-
/***/ })
|
|
16
|
-
|
|
17
|
-
}]);
|