UNPKG

kepler.gl.geoiq

Version:

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

214 lines (187 loc) 25.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.calculateAggregationData = calculateAggregationData; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _aggregateUtils = require("../aggregate-utils"); 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(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; } // export const WIDGET_TYPES = keyMirror({ // function: null // }); // function range(a, b) { // if (a > b) { // return [b, a]; // } // return [a, b]; // } // function flatValToPoint(arr) { // const flatInfinityArrLength = arr.flat(Infinity).length; // const arrLength = arr.length; // if (arr.flat().length === flatInfinityArrLength) { // return arr; // } else { // return flatValToPoint(arr.flat()); // } // } function calculateAggregationData(newWidget, state, mapState) { var latRange; var lngRange; var _newWidget$config = newWidget.config, dataId = _newWidget$config.dataId, aggregationType = _newWidget$config.aggregationType, bounds = _newWidget$config.bounds; var boundingBox; var cLL; var cLR; var cUL; var cUR; 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) { state = _objectSpread(_objectSpread({}, state), {}, { datasets: _objectSpread(_objectSpread({}, state.datasets), {}, (0, _defineProperty2["default"])({}, dataId, _objectSpread(_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]; } return d[fieldIdx]; }); var aggregatedData = (0, _aggregateUtils.aggregate)(fieldData, aggregationType); if (typeof aggregatedData === 'number') { newWidget.config.aggregatedData = Number(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 }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy93aWRnZXQtdXRpbHMvd2lkZ2V0LXV0aWxzLmpzIl0sIm5hbWVzIjpbImNhbGN1bGF0ZUFnZ3JlZ2F0aW9uRGF0YSIsIm5ld1dpZGdldCIsInN0YXRlIiwibWFwU3RhdGUiLCJsYXRSYW5nZSIsImxuZ1JhbmdlIiwiY29uZmlnIiwiZGF0YUlkIiwiYWdncmVnYXRpb25UeXBlIiwiYm91bmRzIiwiYm91bmRpbmdCb3giLCJjTEwiLCJjTFIiLCJjVUwiLCJjVVIiLCJkYXRhc2V0cyIsImRhdGEiLCJsYWJlbCIsInNlbGVjdGVkTGF5ZXIiLCJpZHgiLCJsYXllcnMiLCJmaW5kSW5kZXgiLCJsIiwiaWQiLCJmaWVsZHMiLCJsb25naXR1ZGUiLCJsYXRpdHVkZSIsImhlaWdodCIsIndpZHRoIiwiem9vbSIsInBpdGNoIiwiYmVhcmluZyIsImdlb1ZpZXdwb3J0Iiwidmlld3BvcnQiLCJXZWJNZXJjYXRvclZpZXdwb3J0IiwidW5wcm9qZWN0IiwiU2V0Iiwic29ydCIsImEiLCJiIiwiYm91bmRpbmdQb2x5Z29uIiwidHlwZSIsImNvb3JkaW5hdGVzIiwiY3JzIiwicHJvcGVydGllcyIsIm5hbWUiLCJsYXRJZHgiLCJjb2x1bW5zIiwibGF0IiwiZmllbGRJZHgiLCJsbmdJZHgiLCJsbmciLCJmaWx0ZXIiLCJkIiwic2ltcGxpZmllZEdlb0pTT04iLCJtYXAiLCJhZ2dyZWdhdGVkRGF0YSIsImxlbmd0aCIsImZpZWxkTmFtZSIsImYiLCJmaWVsZERhdGEiLCJOdW1iZXIiLCJ0b0ZpeGVkIiwiaXNDYWxjdWxhdGluZyIsInVwZGF0ZWRTdGF0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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aUIsQ0FBbEI7QUFPQSxVQUFNTyxjQUFjLEdBQUcsK0JBQVVJLFNBQVYsRUFBcUJwRCxlQUFyQixDQUF2Qjs7QUFDQSxVQUFJLE9BQU9nRCxjQUFQLEtBQTBCLFFBQTlCLEVBQXdDO0FBQ3RDdkQsUUFBQUEsU0FBUyxDQUFDSyxNQUFWLENBQWlCa0QsY0FBakIsR0FBa0NLLE1BQU0sQ0FBQ0wsY0FBYyxDQUFDTSxPQUFmLENBQXVCLENBQXZCLENBQUQsQ0FBeEM7QUFDRCxPQUZELE1BRU87QUFDTDdELFFBQUFBLFNBQVMsQ0FBQ0ssTUFBVixDQUFpQmtELGNBQWpCLEdBQWtDQSxjQUFsQztBQUNEOztBQUNEdkQsTUFBQUEsU0FBUyxDQUFDSyxNQUFWLENBQWlCa0QsY0FBakI7QUFDRDtBQUNGLEdBM0prRSxDQTRKbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0F2RCxFQUFBQSxTQUFTLENBQUNLLE1BQVYsQ0FBaUJ5RCxhQUFqQixHQUFpQyxLQUFqQztBQUNBLFNBQU87QUFBQzlELElBQUFBLFNBQVMsRUFBVEEsU0FBRDtBQUFZK0QsSUFBQUEsWUFBWSxFQUFFOUQ7QUFBMUIsR0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHthZ2dyZWdhdGV9IGZyb20gJ3V0aWxzL2FnZ3JlZ2F0ZS11dGlscyc7IC8vIGxpc3Qgb2YgZnVuY3Rpb25zXG5pbXBvcnQgZ2VvVmlld3BvcnQgZnJvbSAnQG1hcGJveC9nZW8tdmlld3BvcnQnO1xuaW1wb3J0IFdlYk1lcmNhdG9yVmlld3BvcnQgZnJvbSAndmlld3BvcnQtbWVyY2F0b3ItcHJvamVjdCc7XG5pbXBvcnQge2dldEZpbGVUeXBlfSBmcm9tICdwcm9jZXNzb3JzL2ZpbGUtaGFuZGxlcic7XG5pbXBvcnQgYm9vbGVhbkRpc2pvaW50IGZyb20gJ0B0dXJmL2Jvb2xlYW4tZGlzam9pbnQnO1xuaW1wb3J0IHtwb2ludCwgcG9seWdvbn0gZnJvbSAnQHR1cmYvaGVscGVycyc7XG4vLyBpbXBvcnQgc2ltcGxpZnkgZnJvbSAnQHR1cmYvc2ltcGxpZnknO1xuaW1wb3J0IHNpbXBsaWZ5IGZyb20gJ3NpbXBsaWZ5LWdlb2pzb24nO1xuLy8gZXhwb3J0IGNvbnN0IFdJREdFVF9UWVBFUyA9IGtleU1pcnJvcih7XG4vLyAgIGZ1bmN0aW9uOiBudWxsXG4vLyB9KTtcblxuLy8gZnVuY3Rpb24gcmFuZ2UoYSwgYikge1xuLy8gICBpZiAoYSA+IGIpIHtcbi8vICAgICByZXR1cm4gW2IsIGFdO1xuLy8gICB9XG4vLyAgIHJldHVybiBbYSwgYl07XG4vLyB9XG5cbi8vIGZ1bmN0aW9uIGZsYXRWYWxUb1BvaW50KGFycikge1xuLy8gICBjb25zdCBmbGF0SW5maW5pdHlBcnJMZW5ndGggPSBhcnIuZmxhdChJbmZpbml0eSkubGVuZ3RoO1xuLy8gICBjb25zdCBhcnJMZW5ndGggPSBhcnIubGVuZ3RoO1xuLy8gICBpZiAoYXJyLmZsYXQoKS5sZW5ndGggPT09IGZsYXRJbmZpbml0eUFyckxlbmd0aCkge1xuLy8gICAgIHJldHVybiBhcnI7XG4vLyAgIH0gZWxzZSB7XG4vLyAgICAgcmV0dXJuIGZsYXRWYWxUb1BvaW50KGFyci5mbGF0KCkpO1xuLy8gICB9XG4vLyB9XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVBZ2dyZWdhdGlvbkRhdGEobmV3V2lkZ2V0LCBzdGF0ZSwgbWFwU3RhdGUpIHtcbiAgbGV0IGxhdFJhbmdlOyBsZXQgbG5nUmFuZ2U7XG5cbiAgY29uc3Qge2RhdGFJZCwgYWdncmVnYXRpb25UeXBlLCBib3VuZHN9ID0gbmV3V2lkZ2V0LmNvbmZpZztcbiAgbGV0IGJvdW5kaW5nQm94O1xuICBsZXQgY0xMOyBsZXQgY0xSOyBsZXQgY1VMOyBsZXQgY1VSO1xuICB2YXIge2RhdGEsIGxhYmVsfSA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF07XG5cbiAgaWYgKCFuZXdXaWRnZXQuY29uZmlnLnNlbGVjdGVkTGF5ZXIpIHtcbiAgICByZXR1cm4gbmV3V2lkZ2V0O1xuICB9XG5cbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChcbiAgICBsID0+IGwuaWQgPT09IG5ld1dpZGdldC5jb25maWcuc2VsZWN0ZWRMYXllci5pZFxuICApO1xuXG4gIGNvbnN0IHtmaWVsZHN9ID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXTtcblxuICBpZiAobWFwU3RhdGUgJiYgYm91bmRzKSB7XG4gICAgY29uc3Qge2xvbmdpdHVkZSwgbGF0aXR1ZGUsIGhlaWdodCwgd2lkdGgsIHpvb20sIHBpdGNoLCBiZWFyaW5nfSA9IG1hcFN0YXRlO1xuXG4gICAgYm91bmRpbmdCb3ggPSBnZW9WaWV3cG9ydC5ib3VuZHMoW2xvbmdpdHVkZSwgbGF0aXR1ZGVdLCB6b29tLCBbXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodFxuICAgIF0pO1xuXG4gICAgY29uc3Qgdmlld3BvcnQgPSBuZXcgV2ViTWVyY2F0b3JWaWV3cG9ydCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIGxvbmdpdHVkZSxcbiAgICAgIGxhdGl0dWRlLFxuICAgICAgem9vbSxcbiAgICAgIHBpdGNoLFxuICAgICAgYmVhcmluZ1xuICAgIH0pO1xuICAgIGNVTCA9IHZpZXdwb3J0LnVucHJvamVjdChbMCwgMF0pO1xuICAgIGNVUiA9IHZpZXdwb3J0LnVucHJvamVjdChbd2lkdGgsIDBdKTtcbiAgICBjTFIgPSB2aWV3cG9ydC51bnByb2plY3QoW3dpZHRoLCBoZWlnaHRdKTtcbiAgICBjTEwgPSB2aWV3cG9ydC51bnByb2plY3QoWzAsIGhlaWdodF0pO1xuXG4gICAgbGF0UmFuZ2UgPSBbLi4ubmV3IFNldChbY0xMWzFdLCBjVVJbMV0sIGNMUlsxXSwgY1VMWzFdXSldLnNvcnQoXG4gICAgICAoYSwgYikgPT4gYSAtIGJcbiAgICApO1xuICAgIGxuZ1JhbmdlID0gWy4uLm5ldyBTZXQoW2NMTFswXSwgY1VSWzBdLCBjTFJbMF0sIGNVTFswXV0pXS5zb3J0KFxuICAgICAgKGEsIGIpID0+IGEgLSBiXG4gICAgKTtcblxuICAgIGNvbnN0IGJvdW5kaW5nUG9seWdvbiA9IHtcbiAgICAgIHR5cGU6ICdQb2x5Z29uJyxcbiAgICAgIGNvb3JkaW5hdGVzOiBbW2NVTCwgY1VSLCBjTFIsIGNMTF1dLFxuICAgICAgY3JzOiB7XG4gICAgICAgIHR5cGU6ICduYW1lJyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIG5hbWU6ICdFUFNHOjQzMjYnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGdldEZpbGVUeXBlKGxhYmVsKSAhPT0gJ2pzb24nICYmIGJvdW5kaW5nQm94KSB7XG4gICAgICBjb25zdCBsYXRJZHggPSBzdGF0ZS5sYXllcnNbaWR4XS5jb25maWcuY29sdW1ucy5sYXQuZmllbGRJZHg7XG4gICAgICBjb25zdCBsbmdJZHggPSBzdGF0ZS5sYXllcnNbaWR4XS5jb25maWcuY29sdW1ucy5sbmcuZmllbGRJZHg7XG4gICAgICBkYXRhID0gZGF0YS5maWx0ZXIoZCA9PlxuICAgICAgICBwaXRjaCB8fCBiZWFyaW5nXG4gICAgICAgICAgPyAhYm9vbGVhbkRpc2pvaW50KHBvaW50KFtkW2xuZ0lkeF0sIGRbbGF0SWR4XV0pLCBib3VuZGluZ1BvbHlnb24pXG4gICAgICAgICAgOiBkW2xhdElkeF0gPiBsYXRSYW5nZVswXSAmJlxuICAgICAgICAgICAgZFtsYXRJZHhdIDwgbGF0UmFuZ2VbMV0gJiZcbiAgICAgICAgICAgIGRbbG5nSWR4XSA+IGxuZ1JhbmdlWzBdICYmXG4gICAgICAgICAgICBkW2xuZ0lkeF0gPCBsbmdSYW5nZVsxXVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGJvdW5kaW5nQm94KSB7XG4gICAgICBpZiAoIXN0YXRlLmRhdGFzZXRzW2RhdGFJZF0uc2ltcGxpZmllZEdlb0pTT04pIHtcbiAgICAgICAgc3RhdGUgPSB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgZGF0YXNldHM6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmRhdGFzZXRzLFxuICAgICAgICAgICAgW2RhdGFJZF06IHtcbiAgICAgICAgICAgICAgLi4uc3RhdGUuZGF0YXNldHNbZGF0YUlkXSxcbiAgICAgICAgICAgICAgc2ltcGxpZmllZEdlb0pTT046IGRhdGEubWFwKGQgPT4gW1xuICAgICAgICAgICAgICAgIC4uLmQsXG4gICAgICAgICAgICAgICAgKGRbMF0gPSBzaW1wbGlmeShkWzBdLCAwLjAxKSlcbiAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbW1lbnRlZCBwYXJ0IGlzIHVzaW5nIHZpZXdwb3J0IHRvIHRlbGwgd2hpY2ggcG9pbnQgaXMgaW4gdGhlIHZpZXdwb3J0IGFuZCBmYXN0ZXIgdGhhbiB0dXJmLmpzXG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKCdzdGF0ZSBpbnNpZGUgZ2VvanNvbiBhZ2dyZWdhdGlvbiAnLCBzdGF0ZSk7XG4gICAgICAvLyBkYXRhID0gc3RhdGUuZCBhdGFzZXRzW2RhdGFJZF0uc2ltcGxpZmllZEdlb0pTT04uZmlsdGVyKGQgPT5cbiAgICAgIC8vICAgZC5nZW9tZXRyeS5jb29yZGluYXRlcy5yZWR1Y2UoKGFjY3UsIHZhbCkgPT4ge1xuICAgICAgLy8gICAgIHZhciBwb2ludEluc2lkZUJvdW5kcyA9IGZhbHNlO1xuICAgICAgLy8gICAgIGlmIChhY2N1KSByZXR1cm4gYWNjdTtcbiAgICAgIC8vICAgICB2YXIgaSA9IDA7XG4gICAgICAvLyAgICAgY29uc3QgZmxhdFZhbCA9IGZsYXRWYWxUb1BvaW50KHZhbCk7XG4gICAgICAvLyAgICAgLy8gaWYgKHZhbFtpXS5sZW5ndGggPiAyKSB7XG4gICAgICAvLyAgICAgLy8gICBmbGF0VmFsID0gdmFsLmZsYXQoKTtcbiAgICAgIC8vICAgICAvLyB9XG4gICAgICAvLyAgICAgZG8ge1xuICAgICAgLy8gICAgICAgY29uc3QgcCA9IGZsYXRWYWxbaV07XG4gICAgICAvLyAgICAgICAvLyBjb25zb2xlLmxvZygncG9pbnQgaW5zaWRlIGRvIHdoaWxlIGxvb3AnLCBwKTtcbiAgICAgIC8vICAgICAgIGlmIChcbiAgICAgIC8vICAgICAgICAgdmlld3BvcnQucHJvamVjdChbcFswXSwgcFsxXV0pWzBdID4gMCAmJlxuICAgICAgLy8gICAgICAgICB2aWV3cG9ydC5wcm9qZWN0KFtwWzBdLCBwWzFdXSlbMF0gPCB3aWR0aCAmJlxuICAgICAgLy8gICAgICAgICB2aWV3cG9ydC5wcm9qZWN0KFtwWzBdLCBwWzFdXSlbMV0gPiAwICYmXG4gICAgICAvLyAgICAgICAgIHZpZXdwb3J0LnByb2plY3QoW3BbMF0sIHBbMV1dKVsxXSA8IGhlaWdodFxuICAgICAgLy8gICAgICAgKSB7XG4gICAgICAvLyAgICAgICAgIHBvaW50SW5zaWRlQm91bmRzID0gdHJ1ZTtcbiAgICAgIC8vICAgICAgIH1cbiAgICAgIC8vICAgICAgIGkrKztcbiAgICAgIC8vICAgICB9IHdoaWxlICghcG9pbnRJbnNpZGVCb3VuZHMgJiYgaSA8IHZhbC5sZW5ndGgpO1xuICAgICAgLy8gICAgIHJldHVybiBwb2ludEluc2lkZUJvdW5kcztcbiAgICAgIC8vICAgfSwgZmFsc2UpXG4gICAgICAvLyApO1xuICAgICAgZGF0YSA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF0uc2ltcGxpZmllZEdlb0pTT04uZmlsdGVyKFxuICAgICAgICBkID0+ICFib29sZWFuRGlzam9pbnQoZFswXSwgYm91bmRpbmdQb2x5Z29uKVxuICAgICAgKTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIHZpZXdwb3J0LnByb2plY3QoWzAsIDBdKVswXSA+IDAgJiYgdmlld3BvcnQucHJvamVjdChbMCwgMF0pWzBdIDwgd2lkdGhcbiAgICAgIC8vICk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhkYXRhLmxlbmd0aCk7XG4gICAgICAvLyBkYXRhID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXS5zaW1wbGlmaWVkR2VvSlNPTi5maWx0ZXIoXG4gICAgICAvLyAgIGQgPT4gIWJvb2xlYW5EaXNqb2ludChkLCBib3VuZGluZ1BvbHlnb24pXG4gICAgICAvLyApO1xuICAgICAgLy8gY29uc29sZS5sb2coZGF0YS5sZW5ndGgpO1xuXG4gICAgICAvLyBkYXRhID0gZGF0YS5tYXAoZCA9PiB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGRbMF0pO1xuICAgICAgLy8gICBjb25zb2xlLmxvZygpO1xuICAgICAgLy8gfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGFnZ3JlZ2F0aW9uVHlwZSA9PT0gJ2NvdW50Jykge1xuICAgIG5ld1dpZGdldC5jb25maWcuYWdncmVnYXRlZERhdGEgPSBkYXRhLmxlbmd0aDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmaWVsZE5hbWUgPSBuZXdXaWRnZXQuY29uZmlnLmZpZWxkTmFtZTtcbiAgICBjb25zdCBmaWVsZElkeCA9IGZpZWxkcy5maW5kSW5kZXgoZiA9PiBmLm5hbWUgPT09IGZpZWxkTmFtZSk7XG4gICAgaWYgKGZpZWxkTmFtZSkge1xuICAgICAgY29uc3QgZmllbGREYXRhID0gZGF0YS5tYXAoZCA9PiB7XG4gICAgICAgIGlmIChkLmRhdGEpIHtcbiAgICAgICAgICByZXR1cm4gZC5kYXRhW2ZpZWxkSWR4XTtcbiAgICAgICAgfSBcbiAgICAgICAgICByZXR1cm4gZFtmaWVsZElkeF07XG4gICAgICAgIFxuICAgICAgfSk7XG4gICAgICBjb25zdCBhZ2dyZWdhdGVkRGF0YSA9IGFnZ3JlZ2F0ZShmaWVsZERhdGEsIGFnZ3JlZ2F0aW9uVHlwZSk7XG4gICAgICBpZiAodHlwZW9mIGFnZ3JlZ2F0ZWREYXRhID09PSAnbnVtYmVyJykge1xuICAgICAgICBuZXdXaWRnZXQuY29uZmlnLmFnZ3JlZ2F0ZWREYXRhID0gTnVtYmVyKGFnZ3JlZ2F0ZWREYXRhLnRvRml4ZWQoMikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3V2lkZ2V0LmNvbmZpZy5hZ2dyZWdhdGVkRGF0YSA9IGFnZ3JlZ2F0ZWREYXRhO1xuICAgICAgfVxuICAgICAgbmV3V2lkZ2V0LmNvbmZpZy5hZ2dyZWdhdGVkRGF0YTtcbiAgICB9XG4gIH1cbiAgLy8gY29uc29sZS5sb2coXG4gIC8vICAgJ25ld1dpZGdldCBhbmQgc3RhdGUgaW5zaWRlIGNhbGN1bGF0ZUFnZ3JlZ2F0aW9uRGF0YScsXG4gIC8vICAgbmV3V2lkZ2V0LFxuICAvLyAgIHN0YXRlXG4gIC8vICk7XG4gIG5ld1dpZGdldC5jb25maWcuaXNDYWxjdWxhdGluZyA9IGZhbHNlO1xuICByZXR1cm4ge25ld1dpZGdldCwgdXBkYXRlZFN0YXRlOiBzdGF0ZX07XG59XG4iXX0=