UNPKG

kepler.gl.geoiq

Version:

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

243 lines (207 loc) 28.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _baseWidget = _interopRequireDefault(require("../base-widget")); var _aggregateUtils = require("../../utils/aggregate-utils"); var _functionWidgetIcon = _interopRequireDefault(require("./function-widget-icon")); var _geoViewport = _interopRequireDefault(require("@mapbox/geo-viewport")); var _viewportMercatorProject = _interopRequireDefault(require("viewport-mercator-project")); var _fileHandler = require("../../processors/file-handler"); var _booleanDisjoint = _interopRequireDefault(require("@turf/boolean-disjoint")); var _helpers = require("@turf/helpers"); var _simplifyGeojson = _interopRequireDefault(require("simplify-geojson")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var FunctionWidget = /*#__PURE__*/ function (_Widget) { (0, _inherits2["default"])(FunctionWidget, _Widget); function FunctionWidget(props) { (0, _classCallCheck2["default"])(this, FunctionWidget); return (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(FunctionWidget).call(this, props)); } (0, _createClass2["default"])(FunctionWidget, [{ key: "calculateAggregationData", value: function calculateAggregationData(newWidget, state, mapState) { var latRange, lngRange; var _newWidget$config = newWidget.config, dataId = _newWidget$config.dataId, aggregationType = _newWidget$config.aggregationType, bounds = _newWidget$config.bounds; var boundingBox; var cUL, cUR, cLL, cLR; var _state$datasets$dataI = state.datasets[dataId], data = _state$datasets$dataI.data, label = _state$datasets$dataI.label; if (!newWidget.config.selectedLayer) { return newWidget; } var idx = state.layers.findIndex(function (l) { return l.id === newWidget.config.selectedLayer.id; }); var fields = state.datasets[dataId].fields; if (mapState && bounds) { var longitude = mapState.longitude, latitude = mapState.latitude, height = mapState.height, width = mapState.width, zoom = mapState.zoom, pitch = mapState.pitch, bearing = mapState.bearing; boundingBox = _geoViewport["default"].bounds([longitude, latitude], zoom, [width, height]); var viewport = new _viewportMercatorProject["default"]({ width: width, height: height, longitude: longitude, latitude: latitude, zoom: zoom, pitch: pitch, bearing: bearing }); cUL = viewport.unproject([0, 0]); cUR = viewport.unproject([width, 0]); cLR = viewport.unproject([width, height]); cLL = viewport.unproject([0, height]); latRange = (0, _toConsumableArray2["default"])(new Set([cLL[1], cUR[1], cLR[1], cUL[1]])).sort(function (a, b) { return a - b; }); lngRange = (0, _toConsumableArray2["default"])(new Set([cLL[0], cUR[0], cLR[0], cUL[0]])).sort(function (a, b) { return a - b; }); var boundingPolygon = { type: 'Polygon', coordinates: [[cUL, cUR, cLR, cLL]], crs: { type: 'name', properties: { name: 'EPSG:4326' } } }; if ((0, _fileHandler.getFileType)(label) !== 'json' && boundingBox) { var latIdx = state.layers[idx].config.columns.lat.fieldIdx; var lngIdx = state.layers[idx].config.columns.lng.fieldIdx; data = data.filter(function (d) { return pitch || bearing ? !(0, _booleanDisjoint["default"])((0, _helpers.point)([d[lngIdx], d[latIdx]]), boundingPolygon) : d[latIdx] > latRange[0] && d[latIdx] < latRange[1] && d[lngIdx] > lngRange[0] && d[lngIdx] < lngRange[1]; }); } else if (boundingBox) { if (!state.datasets[dataId].simplifiedGeoJSON || data.length !== state.datasets[dataId].simplifiedGeoJSON.length) { state = _objectSpread({}, state, { datasets: _objectSpread({}, state.datasets, (0, _defineProperty2["default"])({}, dataId, _objectSpread({}, state.datasets[dataId], { simplifiedGeoJSON: data.map(function (d) { return [].concat((0, _toConsumableArray2["default"])(d), [d[0] = (0, _simplifyGeojson["default"])(d[0], 0.01)]); }) }))) }); } //commented part is using viewport to tell which point is in the viewport and faster than turf.js // console.log('state inside geojson aggregation ', state); // data = state.d atasets[dataId].simplifiedGeoJSON.filter(d => // d.geometry.coordinates.reduce((accu, val) => { // var pointInsideBounds = false; // if (accu) return accu; // var i = 0; // const flatVal = flatValToPoint(val); // // if (val[i].length > 2) { // // flatVal = val.flat(); // // } // do { // const p = flatVal[i]; // // console.log('point inside do while loop', p); // if ( // viewport.project([p[0], p[1]])[0] > 0 && // viewport.project([p[0], p[1]])[0] < width && // viewport.project([p[0], p[1]])[1] > 0 && // viewport.project([p[0], p[1]])[1] < height // ) { // pointInsideBounds = true; // } // i++; // } while (!pointInsideBounds && i < val.length); // return pointInsideBounds; // }, false) // ); data = state.datasets[dataId].simplifiedGeoJSON.filter(function (d) { return !(0, _booleanDisjoint["default"])(d[0], boundingPolygon); }); // console.log( // viewport.project([0, 0])[0] > 0 && viewport.project([0, 0])[0] < width // ); // console.log(data.length); // data = state.datasets[dataId].simplifiedGeoJSON.filter( // d => !booleanDisjoint(d, boundingPolygon) // ); // console.log(data.length); // data = data.map(d => { // console.log(d[0]); // console.log(); // }); } } if (aggregationType === 'count') { newWidget.config.aggregatedData = data.length; } else { var fieldName = newWidget.config.fieldName; var fieldIdx = fields.findIndex(function (f) { return f.name === fieldName; }); if (fieldName) { var fieldData = data.map(function (d) { if (d.data) { return d.data[fieldIdx]; } else { return d[fieldIdx]; } }); var aggregatedData = (0, _aggregateUtils.aggregate)(fieldData, aggregationType); if (typeof aggregatedData === 'number') { newWidget.config.aggregatedData = +aggregatedData.toFixed(2); } else { newWidget.config.aggregatedData = aggregatedData; } newWidget.config.aggregatedData; } } // console.log( // 'newWidget and state inside calculateAggregationData', // newWidget, // state // ); newWidget.config.isCalculating = false; return { newWidget: newWidget, updatedState: state }; } }, { key: "type", get: function get() { return 'Function'; } }, { key: "isAggregated", get: function get() { return false; } }, { key: "widgetIcon", get: function get() { return _functionWidgetIcon["default"]; } }, { key: "widgetAggregatedData", get: function get() { return null; } }]); return FunctionWidget; }(_baseWidget["default"]); exports["default"] = FunctionWidget; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93aWRnZXRzL2Z1bmN0aW9uLXdpZGdldC9mdW5jdGlvbi13aWRnZXQuanMiXSwibmFtZXMiOlsiRnVuY3Rpb25XaWRnZXQiLCJwcm9wcyIsIm5ld1dpZGdldCIsInN0YXRlIiwibWFwU3RhdGUiLCJsYXRSYW5nZSIsImxuZ1JhbmdlIiwiY29uZmlnIiwiZGF0YUlkIiwiYWdncmVnYXRpb25UeXBlIiwiYm91bmRzIiwiYm91bmRpbmdCb3giLCJjVUwiLCJjVVIiLCJjTEwiLCJjTFIiLCJkYXRhc2V0cyIsImRhdGEiLCJsYWJlbCIsInNlbGVjdGVkTGF5ZXIiLCJpZHgiLCJsYXllcnMiLCJmaW5kSW5kZXgiLCJsIiwiaWQiLCJmaWVsZHMiLCJsb25naXR1ZGUiLCJsYXRpdHVkZSIsImhlaWdodCIsIndpZHRoIiwiem9vbSIsInBpdGNoIiwiYmVhcmluZyIsImdlb1ZpZXdwb3J0Iiwidmlld3BvcnQiLCJXZWJNZXJjYXRvclZpZXdwb3J0IiwidW5wcm9qZWN0IiwiU2V0Iiwic29ydCIsImEiLCJiIiwiYm91bmRpbmdQb2x5Z29uIiwidHlwZSIsImNvb3JkaW5hdGVzIiwiY3JzIiwicHJvcGVydGllcyIsIm5hbWUiLCJsYXRJZHgiLCJjb2x1bW5zIiwibGF0IiwiZmllbGRJZHgiLCJsbmdJZHgiLCJsbmciLCJmaWx0ZXIiLCJkIiwic2ltcGxpZmllZEdlb0pTT04iLCJsZW5ndGgiLCJtYXAiLCJhZ2dyZWdhdGVkRGF0YSIsImZpZWxkTmFtZSIsImYiLCJmaWVsZERhdGEiLCJ0b0ZpeGVkIiwiaXNDYWxjdWxhdGluZyIsInVwZGF0ZWRTdGF0ZSIsIkZ1bmN0aW9uV2lkZ2V0SWNvbiIsIldpZGdldCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7Ozs7OztJQUVxQkEsYzs7Ozs7QUFDbkIsMEJBQVlDLEtBQVosRUFBbUI7QUFB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LElBQU4sRUFBWTtBQUNWLHFCQUFPcUMsQ0FBQyxDQUFDckMsSUFBRixDQUFPaUMsUUFBUCxDQUFQO0FBQ0QsYUFGRCxNQUVPO0FBQ0wscUJBQU9JLENBQUMsQ0FBQ0osUUFBRCxDQUFSO0FBQ0Q7QUFDRixXQU5lLENBQWhCO0FBT0EsY0FBTVEsY0FBYyxHQUFHLCtCQUFVRyxTQUFWLEVBQXFCcEQsZUFBckIsQ0FBdkI7O0FBQ0EsY0FBSSxPQUFPaUQsY0FBUCxLQUEwQixRQUE5QixFQUF3QztBQUN0Q3hELFlBQUFBLFNBQVMsQ0FBQ0ssTUFBVixDQUFpQm1ELGNBQWpCLEdBQWtDLENBQUNBLGNBQWMsQ0FBQ0ksT0FBZixDQUF1QixDQUF2QixDQUFuQztBQUNELFdBRkQsTUFFTztBQUNMNUQsWUFBQUEsU0FBUyxDQUFDSyxNQUFWLENBQWlCbUQsY0FBakIsR0FBa0NBLGNBQWxDO0FBQ0Q7O0FBQ0R4RCxVQUFBQSxTQUFTLENBQUNLLE1BQVYsQ0FBaUJtRCxjQUFqQjtBQUNEO0FBQ0YsT0F0S2tELENBdUtuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQXhELE1BQUFBLFNBQVMsQ0FBQ0ssTUFBVixDQUFpQndELGFBQWpCLEdBQWlDLEtBQWpDO0FBQ0EsYUFBTztBQUFDN0QsUUFBQUEsU0FBUyxFQUFUQSxTQUFEO0FBQVk4RCxRQUFBQSxZQUFZLEVBQUU3RDtBQUExQixPQUFQO0FBQ0Q7Ozt3QkEzTFU7QUFDVCxhQUFPLFVBQVA7QUFDRDs7O3dCQUNrQjtBQUNqQixhQUFPLEtBQVA7QUFDRDs7O3dCQUNnQjtBQUNmLGFBQU84RCw4QkFBUDtBQUNEOzs7d0JBQzBCO0FBQ3pCLGFBQU8sSUFBUDtBQUNEOzs7RUFmeUNDLHNCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE5IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFdpZGdldCBmcm9tICcuLi9iYXNlLXdpZGdldCc7XG5pbXBvcnQge2FnZ3JlZ2F0ZX0gZnJvbSAnLi4vLi4vdXRpbHMvYWdncmVnYXRlLXV0aWxzJztcbmltcG9ydCBGdW5jdGlvbldpZGdldEljb24gZnJvbSAnLi9mdW5jdGlvbi13aWRnZXQtaWNvbic7XG5pbXBvcnQgZ2VvVmlld3BvcnQgZnJvbSAnQG1hcGJveC9nZW8tdmlld3BvcnQnO1xuaW1wb3J0IFdlYk1lcmNhdG9yVmlld3BvcnQgZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5pbXBvcnQge2dldEZpbGVUeXBlfSBmcm9tICdwcm9jZXNzb3JzL2ZpbGUtaGFuZGxlcic7XG5pbXBvcnQgYm9vbGVhbkRpc2pvaW50IGZyb20gJ0B0dXJmL2Jvb2xlYW4tZGlzam9pbnQnO1xuaW1wb3J0IHtwb2ludCwgcG9seWdvbn0gZnJvbSAnQHR1cmYvaGVscGVycyc7XG4vLyBpbXBvcnQgc2ltcGxpZnkgZnJvbSAnQHR1cmYvc2ltcGxpZnknO1xuaW1wb3J0IHNpbXBsaWZ5IGZyb20gJ3NpbXBsaWZ5LWdlb2pzb24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGdW5jdGlvbldpZGdldCBleHRlbmRzIFdpZGdldCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiAnRnVuY3Rpb24nO1xuICB9XG4gIGdldCBpc0FnZ3JlZ2F0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCB3aWRnZXRJY29uKCkge1xuICAgIHJldHVybiBGdW5jdGlvbldpZGdldEljb247XG4gIH1cbiAgZ2V0IHdpZGdldEFnZ3JlZ2F0ZWREYXRhKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY2FsY3VsYXRlQWdncmVnYXRpb25EYXRhKG5ld1dpZGdldCwgc3RhdGUsIG1hcFN0YXRlKSB7XG4gICAgbGV0IGxhdFJhbmdlLCBsbmdSYW5nZTtcblxuICAgIGNvbnN0IHtkYXRhSWQsIGFnZ3JlZ2F0aW9uVHlwZSwgYm91bmRzfSA9IG5ld1dpZGdldC5jb25maWc7XG4gICAgbGV0IGJvdW5kaW5nQm94O1xuICAgIGxldCBjVUwsIGNVUiwgY0xMLCBjTFI7XG4gICAgdmFyIHtkYXRhLCBsYWJlbH0gPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdO1xuXG4gICAgaWYgKCFuZXdXaWRnZXQuY29uZmlnLnNlbGVjdGVkTGF5ZXIpIHtcbiAgICAgIHJldHVybiBuZXdXaWRnZXQ7XG4gICAgfVxuXG4gICAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChcbiAgICAgIGwgPT4gbC5pZCA9PT0gbmV3V2lkZ2V0LmNvbmZpZy5zZWxlY3RlZExheWVyLmlkXG4gICAgKTtcblxuICAgIGNvbnN0IHtmaWVsZHN9ID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXTtcblxuICAgIGlmIChtYXBTdGF0ZSAmJiBib3VuZHMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbG9uZ2l0dWRlLFxuICAgICAgICBsYXRpdHVkZSxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgem9vbSxcbiAgICAgICAgcGl0Y2gsXG4gICAgICAgIGJlYXJpbmdcbiAgICAgIH0gPSBtYXBTdGF0ZTtcblxuICAgICAgYm91bmRpbmdCb3ggPSBnZW9WaWV3cG9ydC5ib3VuZHMoW2xvbmdpdHVkZSwgbGF0aXR1ZGVdLCB6b29tLCBbXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgIF0pO1xuXG4gICAgICBjb25zdCB2aWV3cG9ydCA9IG5ldyBXZWJNZXJjYXRvclZpZXdwb3J0KHtcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICAgIGxhdGl0dWRlOiBsYXRpdHVkZSxcbiAgICAgICAgem9vbTogem9vbSxcbiAgICAgICAgcGl0Y2g6IHBpdGNoLFxuICAgICAgICBiZWFyaW5nOiBiZWFyaW5nXG4gICAgICB9KTtcbiAgICAgIGNVTCA9IHZpZXdwb3J0LnVucHJvamVjdChbMCwgMF0pO1xuICAgICAgY1VSID0gdmlld3BvcnQudW5wcm9qZWN0KFt3aWR0aCwgMF0pO1xuICAgICAgY0xSID0gdmlld3BvcnQudW5wcm9qZWN0KFt3aWR0aCwgaGVpZ2h0XSk7XG4gICAgICBjTEwgPSB2aWV3cG9ydC51bnByb2plY3QoWzAsIGhlaWdodF0pO1xuXG4gICAgICBsYXRSYW5nZSA9IFsuLi5uZXcgU2V0KFtjTExbMV0sIGNVUlsxXSwgY0xSWzFdLCBjVUxbMV1dKV0uc29ydChcbiAgICAgICAgKGEsIGIpID0+IGEgLSBiXG4gICAgICApO1xuICAgICAgbG5nUmFuZ2UgPSBbLi4ubmV3IFNldChbY0xMWzBdLCBjVVJbMF0sIGNMUlswXSwgY1VMWzBdXSldLnNvcnQoXG4gICAgICAgIChhLCBiKSA9PiBhIC0gYlxuICAgICAgKTtcblxuICAgICAgY29uc3QgYm91bmRpbmdQb2x5Z29uID0ge1xuICAgICAgICB0eXBlOiAnUG9seWdvbicsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBbW2NVTCwgY1VSLCBjTFIsIGNMTF1dLFxuICAgICAgICBjcnM6IHtcbiAgICAgICAgICB0eXBlOiAnbmFtZScsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgbmFtZTogJ0VQU0c6NDMyNidcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChnZXRGaWxlVHlwZShsYWJlbCkgIT09ICdqc29uJyAmJiBib3VuZGluZ0JveCkge1xuICAgICAgICBjb25zdCBsYXRJZHggPSBzdGF0ZS5sYXllcnNbaWR4XS5jb25maWcuY29sdW1ucy5sYXQuZmllbGRJZHg7XG4gICAgICAgIGNvbnN0IGxuZ0lkeCA9IHN0YXRlLmxheWVyc1tpZHhdLmNvbmZpZy5jb2x1bW5zLmxuZy5maWVsZElkeDtcbiAgICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKGQgPT5cbiAgICAgICAgICBwaXRjaCB8fCBiZWFyaW5nXG4gICAgICAgICAgICA/ICFib29sZWFuRGlzam9pbnQocG9pbnQoW2RbbG5nSWR4XSwgZFtsYXRJZHhdXSksIGJvdW5kaW5nUG9seWdvbilcbiAgICAgICAgICAgIDogZFtsYXRJZHhdID4gbGF0UmFuZ2VbMF0gJiZcbiAgICAgICAgICAgICAgZFtsYXRJZHhdIDwgbGF0UmFuZ2VbMV0gJiZcbiAgICAgICAgICAgICAgZFtsbmdJZHhdID4gbG5nUmFuZ2VbMF0gJiZcbiAgICAgICAgICAgICAgZFtsbmdJZHhdIDwgbG5nUmFuZ2VbMV1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoYm91bmRpbmdCb3gpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLnNpbXBsaWZpZWRHZW9KU09OIHx8XG4gICAgICAgICAgZGF0YS5sZW5ndGggIT09IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF0uc2ltcGxpZmllZEdlb0pTT04ubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgIHN0YXRlID0ge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBkYXRhc2V0czoge1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5kYXRhc2V0cyxcbiAgICAgICAgICAgICAgW2RhdGFJZF06IHtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLFxuICAgICAgICAgICAgICAgIHNpbXBsaWZpZWRHZW9KU09OOiBkYXRhLm1hcChkID0+IFtcbiAgICAgICAgICAgICAgICAgIC4uLmQsXG4gICAgICAgICAgICAgICAgICAoZFswXSA9IHNpbXBsaWZ5KGRbMF0sIDAuMDEpKVxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21tZW50ZWQgcGFydCBpcyB1c2luZyB2aWV3cG9ydCB0byB0ZWxsIHdoaWNoIHBvaW50IGlzIGluIHRoZSB2aWV3cG9ydCBhbmQgZmFzdGVyIHRoYW4gdHVyZi5qc1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdzdGF0ZSBpbnNpZGUgZ2VvanNvbiBhZ2dyZWdhdGlvbiAnLCBzdGF0ZSk7XG4gICAgICAgIC8vIGRhdGEgPSBzdGF0ZS5kIGF0YXNldHNbZGF0YUlkXS5zaW1wbGlmaWVkR2VvSlNPTi5maWx0ZXIoZCA9PlxuICAgICAgICAvLyAgIGQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMucmVkdWNlKChhY2N1LCB2YWwpID0+IHtcbiAgICAgICAgLy8gICAgIHZhciBwb2ludEluc2lkZUJvdW5kcyA9IGZhbHNlO1xuICAgICAgICAvLyAgICAgaWYgKGFjY3UpIHJldHVybiBhY2N1O1xuICAgICAgICAvLyAgICAgdmFyIGkgPSAwO1xuICAgICAgICAvLyAgICAgY29uc3QgZmxhdFZhbCA9IGZsYXRWYWxUb1BvaW50KHZhbCk7XG4gICAgICAgIC8vICAgICAvLyBpZiAodmFsW2ldLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgLy8gICAgIC8vICAgZmxhdFZhbCA9IHZhbC5mbGF0KCk7XG4gICAgICAgIC8vICAgICAvLyB9XG4gICAgICAgIC8vICAgICBkbyB7XG4gICAgICAgIC8vICAgICAgIGNvbnN0IHAgPSBmbGF0VmFsW2ldO1xuICAgICAgICAvLyAgICAgICAvLyBjb25zb2xlLmxvZygncG9pbnQgaW5zaWRlIGRvIHdoaWxlIGxvb3AnLCBwKTtcbiAgICAgICAgLy8gICAgICAgaWYgKFxuICAgICAgICAvLyAgICAgICAgIHZpZXdwb3J0LnByb2plY3QoW3BbMF0sIHBbMV1dKVswXSA+IDAgJiZcbiAgICAgICAgLy8gICAgICAgICB2aWV3cG9ydC5wcm9qZWN0KFtwWzBdLCBwWzFdXSlbMF0gPCB3aWR0aCAmJlxuICAgICAgICAvLyAgICAgICAgIHZpZXdwb3J0LnByb2plY3QoW3BbMF0sIHBbMV1dKVsxXSA+IDAgJiZcbiAgICAgICAgLy8gICAgICAgICB2aWV3cG9ydC5wcm9qZWN0KFtwWzBdLCBwWzFdXSlbMV0gPCBoZWlnaHRcbiAgICAgICAgLy8gICAgICAgKSB7XG4gICAgICAgIC8vICAgICAgICAgcG9pbnRJbnNpZGVCb3VuZHMgPSB0cnVlO1xuICAgICAgICAvLyAgICAgICB9XG4gICAgICAgIC8vICAgICAgIGkrKztcbiAgICAgICAgLy8gICAgIH0gd2hpbGUgKCFwb2ludEluc2lkZUJvdW5kcyAmJiBpIDwgdmFsLmxlbmd0aCk7XG4gICAgICAgIC8vICAgICByZXR1cm4gcG9pbnRJbnNpZGVCb3VuZHM7XG4gICAgICAgIC8vICAgfSwgZmFsc2UpXG4gICAgICAgIC8vICk7XG4gICAgICAgIGRhdGEgPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLnNpbXBsaWZpZWRHZW9KU09OLmZpbHRlcihcbiAgICAgICAgICBkID0+ICFib29sZWFuRGlzam9pbnQoZFswXSwgYm91bmRpbmdQb2x5Z29uKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAvLyAgIHZpZXdwb3J0LnByb2plY3QoWzAsIDBdKVswXSA+IDAgJiYgdmlld3BvcnQucHJvamVjdChbMCwgMF0pWzBdIDwgd2lkdGhcbiAgICAgICAgLy8gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coZGF0YS5sZW5ndGgpO1xuICAgICAgICAvLyBkYXRhID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXS5zaW1wbGlmaWVkR2VvSlNPTi5maWx0ZXIoXG4gICAgICAgIC8vICAgZCA9PiAhYm9vbGVhbkRpc2pvaW50KGQsIGJvdW5kaW5nUG9seWdvbilcbiAgICAgICAgLy8gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coZGF0YS5sZW5ndGgpO1xuXG4gICAgICAgIC8vIGRhdGEgPSBkYXRhLm1hcChkID0+IHtcbiAgICAgICAgLy8gICBjb25zb2xlLmxvZyhkWzBdKTtcbiAgICAgICAgLy8gICBjb25zb2xlLmxvZygpO1xuICAgICAgICAvLyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWdncmVnYXRpb25UeXBlID09PSAnY291bnQnKSB7XG4gICAgICBuZXdXaWRnZXQuY29uZmlnLmFnZ3JlZ2F0ZWREYXRhID0gZGF0YS5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IG5ld1dpZGdldC5jb25maWcuZmllbGROYW1lO1xuICAgICAgY29uc3QgZmllbGRJZHggPSBmaWVsZHMuZmluZEluZGV4KGYgPT4gZi5uYW1lID09PSBmaWVsZE5hbWUpO1xuICAgICAgaWYgKGZpZWxkTmFtZSkge1xuICAgICAgICBsZXQgZmllbGREYXRhID0gZGF0YS5tYXAoZCA9PiB7XG4gICAgICAgICAgaWYgKGQuZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuIGQuZGF0YVtmaWVsZElkeF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkW2ZpZWxkSWR4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBhZ2dyZWdhdGVkRGF0YSA9IGFnZ3JlZ2F0ZShmaWVsZERhdGEsIGFnZ3JlZ2F0aW9uVHlwZSk7XG4gICAgICAgIGlmICh0eXBlb2YgYWdncmVnYXRlZERhdGEgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbmV3V2lkZ2V0LmNvbmZpZy5hZ2dyZWdhdGVkRGF0YSA9ICthZ2dyZWdhdGVkRGF0YS50b0ZpeGVkKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1dpZGdldC5jb25maWcuYWdncmVnYXRlZERhdGEgPSBhZ2dyZWdhdGVkRGF0YTtcbiAgICAgICAgfVxuICAgICAgICBuZXdXaWRnZXQuY29uZmlnLmFnZ3JlZ2F0ZWREYXRhO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgICduZXdXaWRnZXQgYW5kIHN0YXRlIGluc2lkZSBjYWxjdWxhdGVBZ2dyZWdhdGlvbkRhdGEnLFxuICAgIC8vICAgbmV3V2lkZ2V0LFxuICAgIC8vICAgc3RhdGVcbiAgICAvLyApO1xuICAgIG5ld1dpZGdldC5jb25maWcuaXNDYWxjdWxhdGluZyA9IGZhbHNlO1xuICAgIHJldHVybiB7bmV3V2lkZ2V0LCB1cGRhdGVkU3RhdGU6IHN0YXRlfTtcbiAgfVxufVxuIl19