UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

438 lines (434 loc) 50.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.createNewDataEntry = createNewDataEntry; exports.getNewDatasetColor = getNewDatasetColor; exports.getWMSCapabilities = getWMSCapabilities; exports.wmsCapabilitiesToDatasetMetadata = wmsCapabilitiesToDatasetMetadata; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _uniq = _interopRequireDefault(require("lodash/uniq")); var _keplerTable = _interopRequireDefault(require("./kepler-table")); var _tasks = _interopRequireDefault(require("react-palm/tasks")); var _constants = require("@kepler.gl/constants"); var _utils = require("@kepler.gl/utils"); var _core = require("@loaders.gl/core"); var _pmtiles = require("@loaders.gl/pmtiles"); var _wms = require("@loaders.gl/wms"); var _tilesetUtils = require("./tileset/tileset-utils"); var _rasterTileUtils = require("./tileset/raster-tile-utils"); var _vectorTileUtils = require("./tileset/vector-tile-utils"); var _excluded = ["info", "data"]; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // apply a color for each dataset // to use as label colors var datasetColors = ['#8F2FBF', '#005CFF', '#C06C84', '#F8B195', '#547A82', '#3EACA8', '#A2D4AB'].map(_utils.hexToRgb); function getNewDatasetColor(datasets) { var presetColors = datasetColors.map(String); var usedColors = (0, _uniq["default"])(Object.values(datasets).map(function (d) { return String(d.color); })).filter(function (c) { return presetColors.includes(c); }); if (usedColors.length === presetColors.length) { // if we already depleted the pool of color return _utils.datasetColorMaker.next().value; } var color = _utils.datasetColorMaker.next().value; while (usedColors.includes(String(color))) { color = _utils.datasetColorMaker.next().value; } return color; } /** * Take datasets payload from addDataToMap, create datasets entry save to visState */ function createNewDataEntry(_ref) { var _getApplicationConfig; var info = _ref.info, data = _ref.data, opts = (0, _objectWithoutProperties2["default"])(_ref, _excluded); var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var TableClass = (_getApplicationConfig = (0, _utils.getApplicationConfig)().table) !== null && _getApplicationConfig !== void 0 ? _getApplicationConfig : _keplerTable["default"]; var dataValidator = _utils.validateInputData; if (typeof TableClass.getInputDataValidator === 'function') { dataValidator = TableClass.getInputDataValidator(); } var validatedData = dataValidator(data); if (!validatedData) { return null; } // check if dataset already exists, and update it when loading data by batches incrementally if (info && info.id && datasets[info.id]) { // get keplerTable from datasets var keplerTable = datasets[info.id]; // update the data in keplerTable return UPDATE_TABLE_TASK({ table: keplerTable, data: validatedData }); } info = info || {}; var color = info.color || getNewDatasetColor(datasets); return CREATE_TABLE_TASK({ info: info, color: color, opts: opts, data: data.arrowTable ? _objectSpread(_objectSpread({}, validatedData), {}, { arrowTable: data.arrowTable }) : validatedData }); } function updateTable(_x) { return _updateTable.apply(this, arguments); } function _updateTable() { _updateTable = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(_ref2) { var table, data, updated; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: table = _ref2.table, data = _ref2.data; _context.next = 3; return table.update(data); case 3: updated = _context.sent; return _context.abrupt("return", updated); case 5: case "end": return _context.stop(); } }, _callee); })); return _updateTable.apply(this, arguments); } function createTable(_x2) { return _createTable.apply(this, arguments); } function _createTable() { _createTable = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(datasetInfo) { var _getApplicationConfig2; var info, color, opts, data, refreshedMetadata, metadata, TableClass, table; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: info = datasetInfo.info, color = datasetInfo.color, opts = datasetInfo.opts, data = datasetInfo.data; // update metadata for remote tiled datasets _context2.next = 3; return refreshRemoteData(datasetInfo); case 3: refreshedMetadata = _context2.sent; metadata = opts.metadata; if (refreshedMetadata) { metadata = _objectSpread(_objectSpread({}, opts.metadata), refreshedMetadata); if (metadata.fields) { data.fields = metadata.fields; } } TableClass = (_getApplicationConfig2 = (0, _utils.getApplicationConfig)().table) !== null && _getApplicationConfig2 !== void 0 ? _getApplicationConfig2 : _keplerTable["default"]; table = new TableClass(_objectSpread(_objectSpread({ info: info, color: color }, opts), {}, { metadata: metadata })); _context2.prev = 8; _context2.next = 11; return table.importData({ data: data }); case 11: _context2.next = 17; break; case 13: _context2.prev = 13; _context2.t0 = _context2["catch"](8); console.error('Failed to create table', _context2.t0); throw _context2.t0; case 17: return _context2.abrupt("return", table); case 18: case "end": return _context2.stop(); } }, _callee2, null, [[8, 13]]); })); return _createTable.apply(this, arguments); } var UPDATE_TABLE_TASK = _tasks["default"].fromPromise(updateTable, 'UPDATE_TABLE_TASK'); var CREATE_TABLE_TASK = _tasks["default"].fromPromise(createTable, 'CREATE_TABLE_TASK'); /** * Fetch metadata for vector tile layers using tilesetMetadataUrl from metadata * @param datasetInfo * @returns */ function refreshRemoteData(_x3) { return _refreshRemoteData.apply(this, arguments); } function _refreshRemoteData() { _refreshRemoteData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(datasetInfo) { var type; return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: type = datasetInfo.info.type; _context3.t0 = type; _context3.next = _context3.t0 === _constants.DatasetType.VECTOR_TILE ? 4 : _context3.t0 === _constants.DatasetType.RASTER_TILE ? 7 : _context3.t0 === _constants.DatasetType.WMS_TILE ? 10 : _context3.t0 === _constants.DatasetType.TILE_3D ? 13 : 14; break; case 4: _context3.next = 6; return refreshVectorTileMetadata(datasetInfo); case 6: return _context3.abrupt("return", _context3.sent); case 7: _context3.next = 9; return refreshRasterTileMetadata(datasetInfo); case 9: return _context3.abrupt("return", _context3.sent); case 10: _context3.next = 12; return refreshWMSMetadata(datasetInfo); case 12: return _context3.abrupt("return", _context3.sent); case 13: return _context3.abrupt("return", null); case 14: return _context3.abrupt("return", null); case 15: case "end": return _context3.stop(); } }, _callee3); })); return _refreshRemoteData.apply(this, arguments); } function refreshVectorTileMetadata(_x4) { return _refreshVectorTileMetadata.apply(this, arguments); } function _refreshVectorTileMetadata() { _refreshVectorTileMetadata = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(datasetInfo) { var _ref3, remoteTileFormat, tilesetMetadataUrl, tilesetDataUrl, rawMetadata, tileSource, metadata; return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: _ref3 = datasetInfo.opts.metadata || {}, remoteTileFormat = _ref3.remoteTileFormat, tilesetMetadataUrl = _ref3.tilesetMetadataUrl, tilesetDataUrl = _ref3.tilesetDataUrl; if (!(!(remoteTileFormat === _constants.RemoteTileFormat.PMTILES || remoteTileFormat === _constants.RemoteTileFormat.MVT) || typeof tilesetMetadataUrl !== 'string' || typeof tilesetDataUrl !== 'string')) { _context4.next = 3; break; } return _context4.abrupt("return", null); case 3: _context4.prev = 3; rawMetadata = null; if (!(remoteTileFormat === _constants.RemoteTileFormat.MVT)) { _context4.next = 11; break; } _context4.next = 8; return (0, _tilesetUtils.getMVTMetadata)(tilesetMetadataUrl); case 8: rawMetadata = _context4.sent; _context4.next = 15; break; case 11: tileSource = _pmtiles.PMTilesSource.createDataSource(tilesetMetadataUrl, {}); _context4.next = 14; return tileSource.metadata; case 14: rawMetadata = _context4.sent; case 15: if (!rawMetadata) { _context4.next = 20; break; } metadata = (0, _vectorTileUtils.parseVectorMetadata)(rawMetadata); _context4.next = 19; return (0, _vectorTileUtils.getFieldsFromTile)({ remoteTileFormat: remoteTileFormat, tilesetUrl: tilesetDataUrl, metadataUrl: tilesetMetadataUrl, metadata: metadata }); case 19: return _context4.abrupt("return", metadata); case 20: _context4.next = 24; break; case 22: _context4.prev = 22; _context4.t0 = _context4["catch"](3); case 24: return _context4.abrupt("return", null); case 25: case "end": return _context4.stop(); } }, _callee4, null, [[3, 22]]); })); return _refreshVectorTileMetadata.apply(this, arguments); } function refreshRasterTileMetadata(_x5) { return _refreshRasterTileMetadata.apply(this, arguments); } function _refreshRasterTileMetadata() { _refreshRasterTileMetadata = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(datasetInfo) { var _ref4, metadataUrl, pmtilesType, tileSource, rawMetadata, response, _rawMetadata, metadata; return _regenerator["default"].wrap(function _callee5$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: _ref4 = datasetInfo.opts.metadata || {}, metadataUrl = _ref4.metadataUrl, pmtilesType = _ref4.pmtilesType; if (!(typeof metadataUrl !== 'string')) { _context5.next = 3; break; } return _context5.abrupt("return", null); case 3: _context5.prev = 3; if (!(pmtilesType === _constants.PMTilesType.RASTER)) { _context5.next = 13; break; } tileSource = _pmtiles.PMTilesSource.createDataSource(metadataUrl, {}); _context5.next = 8; return tileSource.metadata; case 8: rawMetadata = _context5.sent; if (!rawMetadata) { _context5.next = 11; break; } return _context5.abrupt("return", (0, _vectorTileUtils.parseVectorMetadata)(rawMetadata)); case 11: _context5.next = 25; break; case 13: _context5.next = 15; return fetch(metadataUrl); case 15: response = _context5.sent; if (response.ok) { _context5.next = 18; break; } throw new Error("Failed Fetch ".concat(metadataUrl)); case 18: _context5.next = 20; return response.json(); case 20: _rawMetadata = _context5.sent; metadata = (0, _rasterTileUtils.parseRasterMetadata)(_rawMetadata, { allowCollections: true }); if (!(metadata instanceof Error)) { _context5.next = 24; break; } throw new Error("Failed to parse metadata ".concat(metadata.message)); case 24: return _context5.abrupt("return", metadata); case 25: _context5.next = 29; break; case 27: _context5.prev = 27; _context5.t0 = _context5["catch"](3); case 29: return _context5.abrupt("return", null); case 30: case "end": return _context5.stop(); } }, _callee5, null, [[3, 27]]); })); return _refreshRasterTileMetadata.apply(this, arguments); } function refreshWMSMetadata(_x6) { return _refreshWMSMetadata.apply(this, arguments); } function _refreshWMSMetadata() { _refreshWMSMetadata = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(datasetInfo) { var _ref5, remoteTileFormat, tilesetDataUrl, data; return _regenerator["default"].wrap(function _callee6$(_context6) { while (1) switch (_context6.prev = _context6.next) { case 0: _ref5 = datasetInfo.opts.metadata || {}, remoteTileFormat = _ref5.remoteTileFormat, tilesetDataUrl = _ref5.tilesetDataUrl; if (!(remoteTileFormat !== _constants.RemoteTileFormat.WMS || typeof tilesetDataUrl !== 'string')) { _context6.next = 3; break; } return _context6.abrupt("return", null); case 3: _context6.prev = 3; _context6.next = 6; return getWMSCapabilities(tilesetDataUrl); case 6: data = _context6.sent; return _context6.abrupt("return", wmsCapabilitiesToDatasetMetadata(data)); case 10: _context6.prev = 10; _context6.t0 = _context6["catch"](3); case 12: return _context6.abrupt("return", null); case 13: case "end": return _context6.stop(); } }, _callee6, null, [[3, 10]]); })); return _refreshWMSMetadata.apply(this, arguments); } function getWMSCapabilities(_x7) { return _getWMSCapabilities.apply(this, arguments); } function _getWMSCapabilities() { _getWMSCapabilities = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(wsmUrl) { return _regenerator["default"].wrap(function _callee7$(_context7) { while (1) switch (_context7.prev = _context7.next) { case 0: _context7.next = 2; return (0, _core.load)("".concat(wsmUrl, "?service=WMS&request=GetCapabilities"), _wms.WMSCapabilitiesLoader); case 2: return _context7.abrupt("return", _context7.sent); case 3: case "end": return _context7.stop(); } }, _callee7); })); return _getWMSCapabilities.apply(this, arguments); } function wmsCapabilitiesToDatasetMetadata(capabilities) { // Flatten layers if they are nested var layers = capabilities.layers.flatMap(function (layer) { if (layer.layers && layer.layers.length > 0) { return layer.layers; } return layer; }); var availableLayers = []; if (Array.isArray(layers)) { availableLayers = layers.map(function (layer) { var bb = layer.geographicBoundingBox; var boundingBox = null; if (Array.isArray(bb) && Array.isArray(bb[0]) && Array.isArray(bb[1])) { boundingBox = [bb[0][0], bb[0][1], bb[1][0], bb[1][1]]; } return { name: layer.name, title: layer.title || layer.name, boundingBox: boundingBox, queryable: layer.queryable }; }); } return { layers: availableLayers, version: capabilities.version || '1.3.0' }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdW5pcSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2tlcGxlclRhYmxlIiwiX3Rhc2tzIiwiX2NvbnN0YW50cyIsIl91dGlscyIsIl9jb3JlIiwiX3BtdGlsZXMiLCJfd21zIiwiX3RpbGVzZXRVdGlscyIsIl9yYXN0ZXJUaWxlVXRpbHMiLCJfdmVjdG9yVGlsZVV0aWxzIiwiX2V4Y2x1ZGVkIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkYXRhc2V0Q29sb3JzIiwibWFwIiwiaGV4VG9SZ2IiLCJnZXROZXdEYXRhc2V0Q29sb3IiLCJkYXRhc2V0cyIsInByZXNldENvbG9ycyIsIlN0cmluZyIsInVzZWRDb2xvcnMiLCJ1bmlxIiwidmFsdWVzIiwiZCIsImNvbG9yIiwiYyIsImluY2x1ZGVzIiwiZGF0YXNldENvbG9yTWFrZXIiLCJuZXh0IiwidmFsdWUiLCJjcmVhdGVOZXdEYXRhRW50cnkiLCJfcmVmIiwiX2dldEFwcGxpY2F0aW9uQ29uZmlnIiwiaW5mbyIsImRhdGEiLCJvcHRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsInVuZGVmaW5lZCIsIlRhYmxlQ2xhc3MiLCJnZXRBcHBsaWNhdGlvbkNvbmZpZyIsInRhYmxlIiwiS2VwbGVyVGFibGUiLCJkYXRhVmFsaWRhdG9yIiwidmFsaWRhdGVJbnB1dERhdGEiLCJnZXRJbnB1dERhdGFWYWxpZGF0b3IiLCJ2YWxpZGF0ZWREYXRhIiwiaWQiLCJrZXBsZXJUYWJsZSIsIlVQREFURV9UQUJMRV9UQVNLIiwiQ1JFQVRFX1RBQkxFX1RBU0siLCJhcnJvd1RhYmxlIiwidXBkYXRlVGFibGUiLCJfeCIsIl91cGRhdGVUYWJsZSIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiX3JlZjIiLCJ1cGRhdGVkIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwidXBkYXRlIiwic2VudCIsImFicnVwdCIsInN0b3AiLCJjcmVhdGVUYWJsZSIsIl94MiIsIl9jcmVhdGVUYWJsZSIsIl9jYWxsZWUyIiwiZGF0YXNldEluZm8iLCJfZ2V0QXBwbGljYXRpb25Db25maWcyIiwicmVmcmVzaGVkTWV0YWRhdGEiLCJtZXRhZGF0YSIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsInJlZnJlc2hSZW1vdGVEYXRhIiwiZmllbGRzIiwiaW1wb3J0RGF0YSIsInQwIiwiY29uc29sZSIsImVycm9yIiwiVGFzayIsImZyb21Qcm9taXNlIiwiX3gzIiwiX3JlZnJlc2hSZW1vdGVEYXRhIiwiX2NhbGxlZTMiLCJ0eXBlIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiRGF0YXNldFR5cGUiLCJWRUNUT1JfVElMRSIsIlJBU1RFUl9USUxFIiwiV01TX1RJTEUiLCJUSUxFXzNEIiwicmVmcmVzaFZlY3RvclRpbGVNZXRhZGF0YSIsInJlZnJlc2hSYXN0ZXJUaWxlTWV0YWRhdGEiLCJyZWZyZXNoV01TTWV0YWRhdGEiLCJfeDQiLCJfcmVmcmVzaFZlY3RvclRpbGVNZXRhZGF0YSIsIl9jYWxsZWU0IiwiX3JlZjMiLCJyZW1vdGVUaWxlRm9ybWF0IiwidGlsZXNldE1ldGFkYXRhVXJsIiwidGlsZXNldERhdGFVcmwiLCJyYXdNZXRhZGF0YSIsInRpbGVTb3VyY2UiLCJfY2FsbGVlNCQiLCJfY29udGV4dDQiLCJSZW1vdGVUaWxlRm9ybWF0IiwiUE1USUxFUyIsIk1WVCIsImdldE1WVE1ldGFkYXRhIiwiUE1UaWxlc1NvdXJjZSIsImNyZWF0ZURhdGFTb3VyY2UiLCJwYXJzZVZlY3Rvck1ldGFkYXRhIiwiZ2V0RmllbGRzRnJvbVRpbGUiLCJ0aWxlc2V0VXJsIiwibWV0YWRhdGFVcmwiLCJfeDUiLCJfcmVmcmVzaFJhc3RlclRpbGVNZXRhZGF0YSIsIl9jYWxsZWU1IiwiX3JlZjQiLCJwbXRpbGVzVHlwZSIsInJlc3BvbnNlIiwiX3Jhd01ldGFkYXRhIiwiX2NhbGxlZTUkIiwiX2NvbnRleHQ1IiwiUE1UaWxlc1R5cGUiLCJSQVNURVIiLCJmZXRjaCIsIm9rIiwiRXJyb3IiLCJjb25jYXQiLCJqc29uIiwicGFyc2VSYXN0ZXJNZXRhZGF0YSIsImFsbG93Q29sbGVjdGlvbnMiLCJtZXNzYWdlIiwiX3g2IiwiX3JlZnJlc2hXTVNNZXRhZGF0YSIsIl9jYWxsZWU2IiwiX3JlZjUiLCJfY2FsbGVlNiQiLCJfY29udGV4dDYiLCJXTVMiLCJnZXRXTVNDYXBhYmlsaXRpZXMiLCJ3bXNDYXBhYmlsaXRpZXNUb0RhdGFzZXRNZXRhZGF0YSIsIl94NyIsIl9nZXRXTVNDYXBhYmlsaXRpZXMiLCJfY2FsbGVlNyIsIndzbVVybCIsIl9jYWxsZWU3JCIsIl9jb250ZXh0NyIsImxvYWQiLCJXTVNDYXBhYmlsaXRpZXNMb2FkZXIiLCJjYXBhYmlsaXRpZXMiLCJsYXllcnMiLCJmbGF0TWFwIiwibGF5ZXIiLCJhdmFpbGFibGVMYXllcnMiLCJBcnJheSIsImlzQXJyYXkiLCJiYiIsImdlb2dyYXBoaWNCb3VuZGluZ0JveCIsImJvdW5kaW5nQm94IiwibmFtZSIsInRpdGxlIiwicXVlcnlhYmxlIiwidmVyc2lvbiJdLCJzb3VyY2VzIjpbIi4uL3NyYy9kYXRhc2V0LXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC91bmlxJztcbmltcG9ydCBLZXBsZXJUYWJsZSwge0RhdGFzZXRzfSBmcm9tICcuL2tlcGxlci10YWJsZSc7XG5pbXBvcnQge1Byb3RvRGF0YXNldCwgUkdCQ29sb3J9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IFRhc2sgZnJvbSAncmVhY3QtcGFsbS90YXNrcyc7XG5cbmltcG9ydCB7XG4gIERhdGFzZXRUeXBlLFxuICBSYXN0ZXJUaWxlRGF0YXNldE1ldGFkYXRhLFxuICBQTVRpbGVzVHlwZSxcbiAgUmVtb3RlVGlsZUZvcm1hdCxcbiAgVmVjdG9yVGlsZURhdGFzZXRNZXRhZGF0YSxcbiAgV01TRGF0YXNldE1ldGFkYXRhXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIGhleFRvUmdiLFxuICB2YWxpZGF0ZUlucHV0RGF0YSxcbiAgZGF0YXNldENvbG9yTWFrZXIsXG4gIGdldEFwcGxpY2F0aW9uQ29uZmlnXG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5pbXBvcnQge2xvYWR9IGZyb20gJ0Bsb2FkZXJzLmdsL2NvcmUnO1xuaW1wb3J0IHsvKiBNVlRTb3VyY2UsKi8gVGlsZUpTT059IGZyb20gJ0Bsb2FkZXJzLmdsL212dCc7XG5pbXBvcnQge1BNVGlsZXNTb3VyY2UsIFBNVGlsZXNNZXRhZGF0YX0gZnJvbSAnQGxvYWRlcnMuZ2wvcG10aWxlcyc7XG5pbXBvcnQge1dNU0NhcGFiaWxpdGllcywgV01TQ2FwYWJpbGl0aWVzTG9hZGVyfSBmcm9tICdAbG9hZGVycy5nbC93bXMnO1xuXG5pbXBvcnQge2dldE1WVE1ldGFkYXRhfSBmcm9tICcuL3RpbGVzZXQvdGlsZXNldC11dGlscyc7XG5pbXBvcnQge3BhcnNlUmFzdGVyTWV0YWRhdGF9IGZyb20gJy4vdGlsZXNldC9yYXN0ZXItdGlsZS11dGlscyc7XG5pbXBvcnQge1xuICBwYXJzZVZlY3Rvck1ldGFkYXRhLFxuICBnZXRGaWVsZHNGcm9tVGlsZSxcbiAgVmVjdG9yVGlsZU1ldGFkYXRhXG59IGZyb20gJy4vdGlsZXNldC92ZWN0b3ItdGlsZS11dGlscyc7XG5cbi8vIGFwcGx5IGEgY29sb3IgZm9yIGVhY2ggZGF0YXNldFxuLy8gdG8gdXNlIGFzIGxhYmVsIGNvbG9yc1xuY29uc3QgZGF0YXNldENvbG9ycyA9IFtcbiAgJyM4RjJGQkYnLFxuICAnIzAwNUNGRicsXG4gICcjQzA2Qzg0JyxcbiAgJyNGOEIxOTUnLFxuICAnIzU0N0E4MicsXG4gICcjM0VBQ0E4JyxcbiAgJyNBMkQ0QUInXG5dLm1hcChoZXhUb1JnYik7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXdEYXRhc2V0Q29sb3IoZGF0YXNldHM6IERhdGFzZXRzKTogUkdCQ29sb3Ige1xuICBjb25zdCBwcmVzZXRDb2xvcnMgPSBkYXRhc2V0Q29sb3JzLm1hcChTdHJpbmcpO1xuICBjb25zdCB1c2VkQ29sb3JzID0gdW5pcShPYmplY3QudmFsdWVzKGRhdGFzZXRzKS5tYXAoZCA9PiBTdHJpbmcoZC5jb2xvcikpKS5maWx0ZXIoYyA9PlxuICAgIHByZXNldENvbG9ycy5pbmNsdWRlcyhjKVxuICApO1xuXG4gIGlmICh1c2VkQ29sb3JzLmxlbmd0aCA9PT0gcHJlc2V0Q29sb3JzLmxlbmd0aCkge1xuICAgIC8vIGlmIHdlIGFscmVhZHkgZGVwbGV0ZWQgdGhlIHBvb2wgb2YgY29sb3JcbiAgICByZXR1cm4gZGF0YXNldENvbG9yTWFrZXIubmV4dCgpLnZhbHVlO1xuICB9XG5cbiAgbGV0IGNvbG9yID0gZGF0YXNldENvbG9yTWFrZXIubmV4dCgpLnZhbHVlO1xuICB3aGlsZSAodXNlZENvbG9ycy5pbmNsdWRlcyhTdHJpbmcoY29sb3IpKSkge1xuICAgIGNvbG9yID0gZGF0YXNldENvbG9yTWFrZXIubmV4dCgpLnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIGNvbG9yO1xufVxuXG4vKipcbiAqIFRha2UgZGF0YXNldHMgcGF5bG9hZCBmcm9tIGFkZERhdGFUb01hcCwgY3JlYXRlIGRhdGFzZXRzIGVudHJ5IHNhdmUgdG8gdmlzU3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5ld0RhdGFFbnRyeShcbiAge2luZm8sIGRhdGEsIC4uLm9wdHN9OiBQcm90b0RhdGFzZXQsXG4gIGRhdGFzZXRzOiBEYXRhc2V0cyA9IHt9XG4pOiBEYXRhc2V0cyB8IG51bGwge1xuICBjb25zdCBUYWJsZUNsYXNzID0gZ2V0QXBwbGljYXRpb25Db25maWcoKS50YWJsZSA/PyBLZXBsZXJUYWJsZTtcbiAgbGV0IGRhdGFWYWxpZGF0b3IgPSB2YWxpZGF0ZUlucHV0RGF0YTtcbiAgaWYgKHR5cGVvZiBUYWJsZUNsYXNzLmdldElucHV0RGF0YVZhbGlkYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRhdGFWYWxpZGF0b3IgPSBUYWJsZUNsYXNzLmdldElucHV0RGF0YVZhbGlkYXRvcigpO1xuICB9XG5cbiAgY29uc3QgdmFsaWRhdGVkRGF0YSA9IGRhdGFWYWxpZGF0b3IoZGF0YSk7XG4gIGlmICghdmFsaWRhdGVkRGF0YSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gY2hlY2sgaWYgZGF0YXNldCBhbHJlYWR5IGV4aXN0cywgYW5kIHVwZGF0ZSBpdCB3aGVuIGxvYWRpbmcgZGF0YSBieSBiYXRjaGVzIGluY3JlbWVudGFsbHlcbiAgaWYgKGluZm8gJiYgaW5mby5pZCAmJiBkYXRhc2V0c1tpbmZvLmlkXSkge1xuICAgIC8vIGdldCBrZXBsZXJUYWJsZSBmcm9tIGRhdGFzZXRzXG4gICAgY29uc3Qga2VwbGVyVGFibGUgPSBkYXRhc2V0c1tpbmZvLmlkXTtcbiAgICAvLyB1cGRhdGUgdGhlIGRhdGEgaW4ga2VwbGVyVGFibGVcbiAgICByZXR1cm4gVVBEQVRFX1RBQkxFX1RBU0soe3RhYmxlOiBrZXBsZXJUYWJsZSwgZGF0YTogdmFsaWRhdGVkRGF0YX0pO1xuICB9XG5cbiAgaW5mbyA9IGluZm8gfHwge307XG4gIGNvbnN0IGNvbG9yID0gaW5mby5jb2xvciB8fCBnZXROZXdEYXRhc2V0Q29sb3IoZGF0YXNldHMpO1xuXG4gIHJldHVybiBDUkVBVEVfVEFCTEVfVEFTSyh7XG4gICAgaW5mbyxcbiAgICBjb2xvcixcbiAgICBvcHRzLFxuICAgIGRhdGE6IGRhdGEuYXJyb3dUYWJsZSA/IHsuLi52YWxpZGF0ZWREYXRhLCBhcnJvd1RhYmxlOiBkYXRhLmFycm93VGFibGV9IDogdmFsaWRhdGVkRGF0YVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlVGFibGUoe3RhYmxlLCBkYXRhfSkge1xuICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGFibGUudXBkYXRlKGRhdGEpOyAvLyBBc3N1bWluZyBgdGFibGVgIGhhcyBhbiBgdXBkYXRlYCBtZXRob2RcbiAgcmV0dXJuIHVwZGF0ZWQ7XG59XG5cbnR5cGUgQ3JlYXRlVGFibGVQcm9wcyA9IHtcbiAgaW5mbzogYW55O1xuICBjb2xvcjogUkdCQ29sb3I7XG4gIG9wdHM6IHtcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9O1xuICBkYXRhOiBhbnk7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVUYWJsZShkYXRhc2V0SW5mbzogQ3JlYXRlVGFibGVQcm9wcykge1xuICBjb25zdCB7aW5mbywgY29sb3IsIG9wdHMsIGRhdGF9ID0gZGF0YXNldEluZm87XG5cbiAgLy8gdXBkYXRlIG1ldGFkYXRhIGZvciByZW1vdGUgdGlsZWQgZGF0YXNldHNcbiAgY29uc3QgcmVmcmVzaGVkTWV0YWRhdGEgPSBhd2FpdCByZWZyZXNoUmVtb3RlRGF0YShkYXRhc2V0SW5mbyk7XG4gIGxldCBtZXRhZGF0YSA9IG9wdHMubWV0YWRhdGE7XG4gIGlmIChyZWZyZXNoZWRNZXRhZGF0YSkge1xuICAgIG1ldGFkYXRhID0gey4uLm9wdHMubWV0YWRhdGEsIC4uLnJlZnJlc2hlZE1ldGFkYXRhfTtcbiAgICBpZiAobWV0YWRhdGEuZmllbGRzKSB7XG4gICAgICBkYXRhLmZpZWxkcyA9IG1ldGFkYXRhLmZpZWxkcztcbiAgICB9XG4gIH1cblxuICBjb25zdCBUYWJsZUNsYXNzID0gZ2V0QXBwbGljYXRpb25Db25maWcoKS50YWJsZSA/PyBLZXBsZXJUYWJsZTtcbiAgY29uc3QgdGFibGUgPSBuZXcgVGFibGVDbGFzcyh7XG4gICAgaW5mbyxcbiAgICBjb2xvcixcbiAgICAuLi5vcHRzLFxuICAgIG1ldGFkYXRhXG4gIH0pO1xuICB0cnkge1xuICAgIGF3YWl0IHRhYmxlLmltcG9ydERhdGEoe2RhdGF9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIHRhYmxlJywgZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuY29uc3QgVVBEQVRFX1RBQkxFX1RBU0sgPSBUYXNrLmZyb21Qcm9taXNlKHVwZGF0ZVRhYmxlLCAnVVBEQVRFX1RBQkxFX1RBU0snKTtcbmNvbnN0IENSRUFURV9UQUJMRV9UQVNLID0gVGFzay5mcm9tUHJvbWlzZShjcmVhdGVUYWJsZSwgJ0NSRUFURV9UQUJMRV9UQVNLJyk7XG5cbi8qKlxuICogRmV0Y2ggbWV0YWRhdGEgZm9yIHZlY3RvciB0aWxlIGxheWVycyB1c2luZyB0aWxlc2V0TWV0YWRhdGFVcmwgZnJvbSBtZXRhZGF0YVxuICogQHBhcmFtIGRhdGFzZXRJbmZvXG4gKiBAcmV0dXJuc1xuICovXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoUmVtb3RlRGF0YShkYXRhc2V0SW5mbzogQ3JlYXRlVGFibGVQcm9wcyk6IFByb21pc2U8b2JqZWN0IHwgbnVsbD4ge1xuICBjb25zdCB7dHlwZX0gPSBkYXRhc2V0SW5mby5pbmZvO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIERhdGFzZXRUeXBlLlZFQ1RPUl9USUxFOlxuICAgICAgcmV0dXJuIGF3YWl0IHJlZnJlc2hWZWN0b3JUaWxlTWV0YWRhdGEoZGF0YXNldEluZm8pO1xuICAgIGNhc2UgRGF0YXNldFR5cGUuUkFTVEVSX1RJTEU6XG4gICAgICByZXR1cm4gYXdhaXQgcmVmcmVzaFJhc3RlclRpbGVNZXRhZGF0YShkYXRhc2V0SW5mbyk7XG4gICAgY2FzZSBEYXRhc2V0VHlwZS5XTVNfVElMRTpcbiAgICAgIHJldHVybiBhd2FpdCByZWZyZXNoV01TTWV0YWRhdGEoZGF0YXNldEluZm8pO1xuICAgIGNhc2UgRGF0YXNldFR5cGUuVElMRV8zRDpcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoVmVjdG9yVGlsZU1ldGFkYXRhKFxuICBkYXRhc2V0SW5mbzogQ3JlYXRlVGFibGVQcm9wc1xuKTogUHJvbWlzZTxWZWN0b3JUaWxlTWV0YWRhdGEgfCBudWxsPiB7XG4gIGNvbnN0IHtyZW1vdGVUaWxlRm9ybWF0LCB0aWxlc2V0TWV0YWRhdGFVcmwsIHRpbGVzZXREYXRhVXJsfSA9XG4gICAgKGRhdGFzZXRJbmZvLm9wdHMubWV0YWRhdGEgYXMgVmVjdG9yVGlsZURhdGFzZXRNZXRhZGF0YSkgfHwge307XG5cbiAgaWYgKFxuICAgICEocmVtb3RlVGlsZUZvcm1hdCA9PT0gUmVtb3RlVGlsZUZvcm1hdC5QTVRJTEVTIHx8IHJlbW90ZVRpbGVGb3JtYXQgPT09IFJlbW90ZVRpbGVGb3JtYXQuTVZUKSB8fFxuICAgIHR5cGVvZiB0aWxlc2V0TWV0YWRhdGFVcmwgIT09ICdzdHJpbmcnIHx8XG4gICAgdHlwZW9mIHRpbGVzZXREYXRhVXJsICE9PSAnc3RyaW5nJ1xuICApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgbGV0IHJhd01ldGFkYXRhOiBQTVRpbGVzTWV0YWRhdGEgfCBUaWxlSlNPTiB8IG51bGwgPSBudWxsO1xuICAgIGlmIChyZW1vdGVUaWxlRm9ybWF0ID09PSBSZW1vdGVUaWxlRm9ybWF0Lk1WVCkge1xuICAgICAgcmF3TWV0YWRhdGEgPSBhd2FpdCBnZXRNVlRNZXRhZGF0YSh0aWxlc2V0TWV0YWRhdGFVcmwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0aWxlU291cmNlID0gUE1UaWxlc1NvdXJjZS5jcmVhdGVEYXRhU291cmNlKHRpbGVzZXRNZXRhZGF0YVVybCwge30pO1xuICAgICAgcmF3TWV0YWRhdGEgPSBhd2FpdCB0aWxlU291cmNlLm1ldGFkYXRhO1xuICAgIH1cblxuICAgIGlmIChyYXdNZXRhZGF0YSkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZVZlY3Rvck1ldGFkYXRhKHJhd01ldGFkYXRhKTtcblxuICAgICAgYXdhaXQgZ2V0RmllbGRzRnJvbVRpbGUoe1xuICAgICAgICByZW1vdGVUaWxlRm9ybWF0LFxuICAgICAgICB0aWxlc2V0VXJsOiB0aWxlc2V0RGF0YVVybCxcbiAgICAgICAgbWV0YWRhdGFVcmw6IHRpbGVzZXRNZXRhZGF0YVVybCxcbiAgICAgICAgbWV0YWRhdGFcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbWV0YWRhdGE7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpZ25vcmUgZm9yIG5vdywgYW5kIHVzZSBvbGQgbWV0YWRhdGFcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaFJhc3RlclRpbGVNZXRhZGF0YShkYXRhc2V0SW5mbzogQ3JlYXRlVGFibGVQcm9wcyk6IFByb21pc2U8YW55IHwgbnVsbD4ge1xuICBjb25zdCB7bWV0YWRhdGFVcmwsIHBtdGlsZXNUeXBlfSA9IChkYXRhc2V0SW5mby5vcHRzLm1ldGFkYXRhIGFzIFJhc3RlclRpbGVEYXRhc2V0TWV0YWRhdGEpIHx8IHt9O1xuXG4gIGlmICh0eXBlb2YgbWV0YWRhdGFVcmwgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChwbXRpbGVzVHlwZSA9PT0gUE1UaWxlc1R5cGUuUkFTVEVSKSB7XG4gICAgICBjb25zdCB0aWxlU291cmNlID0gUE1UaWxlc1NvdXJjZS5jcmVhdGVEYXRhU291cmNlKG1ldGFkYXRhVXJsLCB7fSk7XG4gICAgICBjb25zdCByYXdNZXRhZGF0YTogUE1UaWxlc01ldGFkYXRhID0gYXdhaXQgdGlsZVNvdXJjZS5tZXRhZGF0YTtcblxuICAgICAgaWYgKHJhd01ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVZlY3Rvck1ldGFkYXRhKHJhd01ldGFkYXRhKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaXQncyBzdGFjIHJhc3RlciB0aWxlc1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChtZXRhZGF0YVVybCk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIEZldGNoICR7bWV0YWRhdGFVcmx9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByYXdNZXRhZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZVJhc3Rlck1ldGFkYXRhKHJhd01ldGFkYXRhLCB7YWxsb3dDb2xsZWN0aW9uczogdHJ1ZX0pO1xuICAgICAgaWYgKG1ldGFkYXRhIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgbWV0YWRhdGEgJHttZXRhZGF0YS5tZXNzYWdlfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWV0YWRhdGE7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpZ25vcmUgZm9yIG5vdywgYW5kIHVzZSBvbGQgbWV0YWRhdGFcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaFdNU01ldGFkYXRhKGRhdGFzZXRJbmZvOiBDcmVhdGVUYWJsZVByb3BzKTogUHJvbWlzZTxhbnkgfCBudWxsPiB7XG4gIGNvbnN0IHtyZW1vdGVUaWxlRm9ybWF0LCB0aWxlc2V0RGF0YVVybH0gPVxuICAgIChkYXRhc2V0SW5mby5vcHRzLm1ldGFkYXRhIGFzIFdNU0RhdGFzZXRNZXRhZGF0YSkgfHwge307XG5cbiAgaWYgKHJlbW90ZVRpbGVGb3JtYXQgIT09IFJlbW90ZVRpbGVGb3JtYXQuV01TIHx8IHR5cGVvZiB0aWxlc2V0RGF0YVVybCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldFdNU0NhcGFiaWxpdGllcyh0aWxlc2V0RGF0YVVybCk7XG4gICAgcmV0dXJuIHdtc0NhcGFiaWxpdGllc1RvRGF0YXNldE1ldGFkYXRhKGRhdGEpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpZ25vcmUgZm9yIG5vdywgYW5kIHVzZSBvbGQgbWV0YWRhdGFcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdNU0NhcGFiaWxpdGllcyh3c21Vcmw6IHN0cmluZyk6IFByb21pc2U8V01TQ2FwYWJpbGl0aWVzPiB7XG4gIHJldHVybiAoYXdhaXQgbG9hZChcbiAgICBgJHt3c21Vcmx9P3NlcnZpY2U9V01TJnJlcXVlc3Q9R2V0Q2FwYWJpbGl0aWVzYCxcbiAgICBXTVNDYXBhYmlsaXRpZXNMb2FkZXJcbiAgKSkgYXMgV01TQ2FwYWJpbGl0aWVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd21zQ2FwYWJpbGl0aWVzVG9EYXRhc2V0TWV0YWRhdGEoY2FwYWJpbGl0aWVzOiBXTVNDYXBhYmlsaXRpZXMpOiBhbnkgfCBudWxsIHtcbiAgLy8gRmxhdHRlbiBsYXllcnMgaWYgdGhleSBhcmUgbmVzdGVkXG4gIGNvbnN0IGxheWVycyA9IGNhcGFiaWxpdGllcy5sYXllcnMuZmxhdE1hcChsYXllciA9PiB7XG4gICAgaWYgKGxheWVyLmxheWVycyAmJiBsYXllci5sYXllcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGxheWVyLmxheWVycztcbiAgICB9XG4gICAgcmV0dXJuIGxheWVyO1xuICB9KTtcblxuICBsZXQgYXZhaWxhYmxlTGF5ZXJzOiBXTVNEYXRhc2V0TWV0YWRhdGFbJ2xheWVycyddID0gW107XG4gIGlmIChBcnJheS5pc0FycmF5KGxheWVycykpIHtcbiAgICBhdmFpbGFibGVMYXllcnMgPSBsYXllcnMubWFwKChsYXllcjogYW55KSA9PiB7XG4gICAgICBjb25zdCBiYiA9IGxheWVyLmdlb2dyYXBoaWNCb3VuZGluZ0JveDtcblxuICAgICAgbGV0IGJvdW5kaW5nQm94OiBudW1iZXJbXSB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYmIpICYmIEFycmF5LmlzQXJyYXkoYmJbMF0pICYmIEFycmF5LmlzQXJyYXkoYmJbMV0pKSB7XG4gICAgICAgIGJvdW5kaW5nQm94ID0gW2JiWzBdWzBdLCBiYlswXVsxXSwgYmJbMV1bMF0sIGJiWzFdWzFdXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogbGF5ZXIubmFtZSxcbiAgICAgICAgdGl0bGU6IGxheWVyLnRpdGxlIHx8IGxheWVyLm5hbWUsXG4gICAgICAgIGJvdW5kaW5nQm94LFxuICAgICAgICBxdWVyeWFibGU6IGxheWVyLnF1ZXJ5YWJsZVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbGF5ZXJzOiBhdmFpbGFibGVMYXllcnMsXG4gICAgdmVyc2lvbjogY2FwYWJpbGl0aWVzLnZlcnNpb24gfHwgJzEuMy4wJ1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLEtBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFlBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFFLE1BQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFHLFVBQUEsR0FBQUgsT0FBQTtBQVFBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQU9BLElBQUFLLEtBQUEsR0FBQUwsT0FBQTtBQUVBLElBQUFNLFFBQUEsR0FBQU4sT0FBQTtB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