UNPKG

kepler.gl.geoiq

Version:

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

182 lines (154 loc) 20.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.generateMapboxLayers = generateMapboxLayers; exports.updateMapboxLayers = updateMapboxLayers; exports.geojsonFromPoints = geojsonFromPoints; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _baseLayer = require("./base-layer"); 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; } /** * This function will convert layers to mapbox layers * @param layers the layers to be converted * @param layerData extra layer information * @param layerOrder the order by which we should convert layers * @returns {*} */ function generateMapboxLayers() { var layers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var layerData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var layerOrder = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; if (layerData.length > 0) { return layerOrder.slice().reverse().reduce(function (overlays, idx) { var layer = layers[idx]; return layer.overlayType !== _baseLayer.OVERLAY_TYPE.mapboxgl ? overlays : [].concat((0, _toConsumableArray2["default"])(overlays), [{ id: layer.id, data: layerData[idx].data, config: layerData[idx].config, datasetId: layer.config.dataId }]); }, []); } return []; } ; /** * Update mapbox layers on the given map * @param map * @param newLayers Array of new mapbox layers to be displayed * @param oldLayers Map of the old layers to be compare with the current ones to detect deleted layers * {layerId: datasetId} * @param mapLayers carries information about split map view */ function updateMapboxLayers(map) { var newLayers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var oldLayers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; var mapLayers = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; var opt = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : { force: true }; // delete non existing layers if (oldLayers) { var oldLayersKeys = Object.keys(oldLayers); if (newLayers.length === 0 && oldLayersKeys.length > 0) { oldLayersKeys.forEach(function (layerId) { return map.removeLayer(layerId); }); } else { // remove layers var currentLayersIds = newLayers.reduce(function (_final, layer) { return _objectSpread({}, _final, (0, _defineProperty2["default"])({}, layer.id, true)); }, {}); var layersToDelete = oldLayersKeys.reduce(function (_final2, layerId) { // if layer doesn't exists anymore if (!currentLayersIds[layerId]) { return _objectSpread({}, _final2, (0, _defineProperty2["default"])({}, layerId, oldLayers[layerId])); } return _final2; }, []); Object.keys(layersToDelete).forEach(function (layerId) { return map.removeLayer(layerId); }); } } // insert or update new layer // TODO: fix complexity /* eslint-disable complexity */ newLayers.forEach(function (overlay) { var layerId = overlay.id, config = overlay.config, data = overlay.data, datasetId = overlay.datasetId; if (!data && !config) { return; } var isAvailableAndVisible = !(mapLayers && mapLayers[layerId]) || mapLayers[layerId].isVisible; // checking if source already exists if (data && isAvailableAndVisible) { var source = map.getSource(datasetId); if (!source) { map.addSource(datasetId, { type: 'geojson', data: data }); } else { source.setData(data); } } var oldConfig = oldLayers[layerId]; var mapboxLayer = map.getLayer(layerId); // compare with previous configs if (!oldConfig || oldConfig !== config || !mapboxLayer || opt.force) { // check if layer already is set // remove it if exists if (mapboxLayer) { map.removeLayer(layerId); } // add if visible and available if (isAvailableAndVisible) { map.addLayer(config); } } }); /* eslint-enable complexity */ // TODO: think about removing sources } ; /** * * @param points * @param columns { * lat: {fieldIdx}, * lng: {fieldIdx}, * alt: {fieldIdx} * } * @param properties [{label: {fieldIdx}] * @returns {{type: string, properties: {}, features: {type: string, properties: {}, geometry: {type: string, coordinates: *[]}}[]}} */ function geojsonFromPoints() { var allData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var filteredIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var columns = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var properties = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; return { type: 'FeatureCollection', features: filteredIndex.map(function (index) { return allData[index]; }).map(function (point) { return { type: 'Feature', properties: properties.reduce(function (_final3, property) { return _objectSpread({}, _final3, (0, _defineProperty2["default"])({}, property.name, point[property.tableFieldIndex - 1])); }, {}), geometry: { type: 'Point', coordinates: [columns.lng ? point[columns.lng.fieldIdx] : null, // lng columns.lat ? point[columns.lat.fieldIdx] : null, // lat columns.altitude ? point[columns.altitude.fieldIdx] : 0 // altitude ] } }; }) }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXllcnMvbWFwYm94LXV0aWxzLmpzIl0sIm5hbWVzIjpbImdlbmVyYXRlTWFwYm94TGF5ZXJzIiwibGF5ZXJzIiwibGF5ZXJEYXRhIiwibGF5ZXJPcmRlciIsImxlbmd0aCIsInNsaWNlIiwicmV2ZXJzZSIsInJlZHVjZSIsIm92ZXJsYXlzIiwiaWR4IiwibGF5ZXIiLCJvdmVybGF5VHlwZSIsIk9WRVJMQVlfVFlQRSIsIm1hcGJveGdsIiwiaWQiLCJkYXRhIiwiY29uZmlnIiwiZGF0YXNldElkIiwiZGF0YUlkIiwidXBkYXRlTWFwYm94TGF5ZXJzIiwibWFwIiwibmV3TGF5ZXJzIiwib2xkTGF5ZXJzIiwibWFwTGF5ZXJzIiwib3B0IiwiZm9yY2UiLCJvbGRMYXllcnNLZXlzIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJsYXllcklkIiwicmVtb3ZlTGF5ZXIiLCJjdXJyZW50TGF5ZXJzSWRzIiwiZmluYWwiLCJsYXllcnNUb0RlbGV0ZSIsIm92ZXJsYXkiLCJpc0F2YWlsYWJsZUFuZFZpc2libGUiLCJpc1Zpc2libGUiLCJzb3VyY2UiLCJnZXRTb3VyY2UiLCJhZGRTb3VyY2UiLCJ0eXBlIiwic2V0RGF0YSIsIm9sZENvbmZpZyIsIm1hcGJveExheWVyIiwiZ2V0TGF5ZXIiLCJhZGRMYXllciIsImdlb2pzb25Gcm9tUG9pbnRzIiwiYWxsRGF0YSIsImZpbHRlcmVkSW5kZXgiLCJjb2x1bW5zIiwicHJvcGVydGllcyIsImZlYXR1cmVzIiwiaW5kZXgiLCJwb2ludCIsInByb3BlcnR5IiwibmFtZSIsInRhYmxlRmllbGRJbmRleCIsImdlb21ldHJ5IiwiY29vcmRpbmF0ZXMiLCJsbmciLCJmaWVsZElkeCIsImxhdCIsImFsdGl0dWRlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7Ozs7OztBQUVBOzs7Ozs7O0FBT08sU0FBU0Esb0JBQVQsR0FBNEU7QUFBQSxNQUE5Q0MsTUFBOEMsdUVBQXJDLEVBQXFDO0FBQUEsTUFBakNDLFNBQWlDLHVFQUFyQixFQUFxQjtBQUFBLE1BQWpCQyxVQUFpQix1RUFBSixFQUFJOztBQUNqRixNQUFJRCxTQUFTLENBQUNFLE1BQVYsR0FBbUIsQ0FBdkIsRUFBMEI7QUFDeEIsV0FBT0QsVUFBVSxDQUFDRSxLQUFYLEdBQ0pDLE9BREksR0FFSkMsTUFGSSxDQUVHLFVBQUNDLFFBQUQsRUFBV0MsR0FBWCxFQUFtQjtBQUN6QixVQUFNQyxLQUFLLEdBQUdULE1BQU0sQ0FBQ1EsR0FBRCxDQUFwQjtBQUVBLGFBQU9DLEtBQUssQ0FBQ0MsV0FBTixLQUFzQkMsd0JBQWFDLFFBQW5DLEdBQ0xMLFFBREssaURBR0FBLFFBSEEsSUFJSDtBQUNFTSxRQUFBQSxFQUFFLEVBQUVKLEtBQUssQ0FBQ0ksRUFEWjtBQUVFQyxRQUFBQSxJQUFJLEVBQUViLFNBQVMsQ0FBQ08sR0FBRCxDQUFULENBQWVNLElBRnZCO0FBR0VDLFFBQUFBLE1BQU0sRUFBRWQsU0FBUyxDQUFDTyxHQUFELENBQVQsQ0FBZU8sTUFIekI7QUFJRUMsUUFBQUEsU0FBUyxFQUFFUCxLQUFLLENBQUNNLE1BQU4sQ0FBYUU7QUFKMUIsT0FKRyxFQUFQO0FBV0QsS0FoQkksRUFnQkYsRUFoQkUsQ0FBUDtBQWlCRDs7QUFFRCxTQUFPLEVBQVA7QUFDRDs7QUFBQTtBQUVEOzs7Ozs7Ozs7QUFRTyxTQUFTQyxrQkFBVCxDQUE0QkMsR0FBNUIsRUFBMEc7QUFBQSxNQUF6RUMsU0FBeUUsdUVBQTdELEVBQTZEO0FBQUEsTUFBekRDLFNBQXlELHVFQUE3QyxJQUE2QztBQUFBLE1BQXZDQyxTQUF1Qyx1RUFBM0IsSUFBMkI7QUFBQSxNQUFyQkMsR0FBcUIsdUVBQWY7QUFBQ0MsSUFBQUEsS0FBSyxFQUFFO0FBQVIsR0FBZTs7QUFDL0c7QUFFQSxNQUFJSCxTQUFKLEVBQWU7QUFDYixRQUFNSSxhQUFhLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZTixTQUFaLENBQXRCOztBQUNBLFFBQUlELFNBQVMsQ0FBQ2pCLE1BQVYsS0FBcUIsQ0FBckIsSUFBMEJzQixhQUFhLENBQUN0QixNQUFkLEdBQXVCLENBQXJELEVBQXdEO0FBQ3REc0IsTUFBQUEsYUFBYSxDQUFDRyxPQUFkLENBQXNCLFVBQUFDLE9BQU87QUFBQSxlQUFJVixHQUFHLENBQUNXLFdBQUosQ0FBZ0JELE9BQWhCLENBQUo7QUFBQSxPQUE3QjtBQUNELEtBRkQsTUFFTztBQUNMO0FBQ0EsVUFBTUUsZ0JBQWdCLEdBQUdYLFNBQVMsQ0FBQ2QsTUFBVixDQUFpQixVQUFDMEIsTUFBRCxFQUFRdkIsS0FBUjtBQUFBLGlDQUNyQ3VCLE1BRHFDLHVDQUV2Q3ZCLEtBQUssQ0FBQ0ksRUFGaUMsRUFFNUIsSUFGNEI7QUFBQSxPQUFqQixFQUdyQixFQUhxQixDQUF6QjtBQUtBLFVBQU1vQixjQUFjLEdBQUdSLGFBQWEsQ0FBQ25CLE1BQWQsQ0FBcUIsVUFBQzBCLE9BQUQsRUFBUUgsT0FBUixFQUFvQjtBQUM5RDtBQUNBLFlBQUksQ0FBQ0UsZ0JBQWdCLENBQUNGLE9BQUQsQ0FBckIsRUFBZ0M7QUFDOUIsbUNBQ0tHLE9BREwsdUNBRUdILE9BRkgsRUFFYVIsU0FBUyxDQUFDUSxPQUFELENBRnRCO0FBSUQ7O0FBQ0QsZUFBT0csT0FBUDtBQUNELE9BVHNCLEVBU3BCLEVBVG9CLENBQXZCO0FBVUFOLE1BQUFBLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZTSxjQUFaLEVBQTRCTCxPQUE1QixDQUFvQyxVQUFBQyxPQUFPO0FBQUEsZUFBSVYsR0FBRyxDQUFDVyxXQUFKLENBQWdCRCxPQUFoQixDQUFKO0FBQUEsT0FBM0M7QUFDRDtBQUNGLEdBMUI4RyxDQTRCL0c7QUFDQTs7QUFDQTs7O0FBQ0FULEVBQUFBLFNBQVMsQ0FBQ1EsT0FBVixDQUFrQixVQUFBTSxPQUFPLEVBQUk7QUFBQSxRQUNoQkwsT0FEZ0IsR0FDb0JLLE9BRHBCLENBQ3BCckIsRUFEb0I7QUFBQSxRQUNQRSxNQURPLEdBQ29CbUIsT0FEcEIsQ0FDUG5CLE1BRE87QUFBQSxRQUNDRCxJQURELEdBQ29Cb0IsT0FEcEIsQ0FDQ3BCLElBREQ7QUFBQSxRQUNPRSxTQURQLEdBQ29Ca0IsT0FEcEIsQ0FDT2xCLFNBRFA7O0FBRTNCLFFBQUksQ0FBQ0YsSUFBRCxJQUFTLENBQUNDLE1BQWQsRUFBc0I7QUFDcEI7QUFDRDs7QUFDRCxRQUFNb0IscUJBQXFCLEdBQ3pCLEVBQUViLFNBQVMsSUFBSUEsU0FBUyxDQUFDTyxPQUFELENBQXhCLEtBQXNDUCxTQUFTLENBQUNPLE9BQUQsQ0FBVCxDQUFtQk8sU0FEM0QsQ0FMMkIsQ0FPM0I7O0FBRUEsUUFBSXRCLElBQUksSUFBSXFCLHFCQUFaLEVBQW1DO0FBQ2pDLFVBQU1FLE1BQU0sR0FBR2xCLEdBQUcsQ0FBQ21CLFNBQUosQ0FBY3RCLFNBQWQsQ0FBZjs7QUFDQSxVQUFJLENBQUNxQixNQUFMLEVBQWE7QUFDWGxCLFFBQUFBLEdBQUcsQ0FBQ29CLFNBQUosQ0FBY3ZCLFNBQWQsRUFBeUI7QUFDdkJ3QixVQUFBQSxJQUFJLEVBQUUsU0FEaUI7QUFFdkIxQixVQUFBQSxJQUFJLEVBQUpBO0FBRnVCLFNBQXpCO0FBSUQsT0FMRCxNQU1LO0FBQ0h1QixRQUFBQSxNQUFNLENBQUNJLE9BQVAsQ0FBZTNCLElBQWY7QUFDRDtBQUNGOztBQUVELFFBQU00QixTQUFTLEdBQUdyQixTQUFTLENBQUNRLE9BQUQsQ0FBM0I7QUFDQSxRQUFNYyxXQUFXLEdBQUd4QixHQUFHLENBQUN5QixRQUFKLENBQWFmLE9BQWIsQ0FBcEIsQ0F2QjJCLENBd0IzQjs7QUFFQSxRQUFJLENBQUNhLFNBQUQsSUFBY0EsU0FBUyxLQUFLM0IsTUFBNUIsSUFBc0MsQ0FBQzRCLFdBQXZDLElBQXNEcEIsR0FBRyxDQUFDQyxLQUE5RCxFQUFxRTtBQUNuRTtBQUNBO0FBQ0EsVUFBSW1CLFdBQUosRUFBaUI7QUFDZnhCLFFBQUFBLEdBQUcsQ0FBQ1csV0FBSixDQUFnQkQsT0FBaEI7QUFDRCxPQUxrRSxDQU1uRTs7O0FBQ0EsVUFBSU0scUJBQUosRUFBMkI7QUFDekJoQixRQUFBQSxHQUFHLENBQUMwQixRQUFKLENBQWE5QixNQUFiO0FBQ0Q7QUFDRjtBQUNGLEdBckNEO0FBc0NBO0FBQ0E7QUFDRDs7QUFBQTtBQUVEOzs7Ozs7Ozs7Ozs7QUFXTyxTQUFTK0IsaUJBQVQsR0FBNEY7QUFBQSxNQUFqRUMsT0FBaUUsdUVBQXZELEVBQXVEO0FBQUEsTUFBbkRDLGFBQW1ELHVFQUFuQyxFQUFtQztBQUFBLE1BQS9CQyxPQUErQix1RUFBckIsRUFBcUI7QUFBQSxNQUFqQkMsVUFBaUIsdUVBQUosRUFBSTtBQUNqRyxTQUFPO0FBQ0xWLElBQUFBLElBQUksRUFBRSxtQkFERDtBQUVMVyxJQUFBQSxRQUFRLEVBQUVILGFBQWEsQ0FBQzdCLEdBQWQsQ0FBa0IsVUFBQWlDLEtBQUs7QUFBQSxhQUFJTCxPQUFPLENBQUNLLEtBQUQsQ0FBWDtBQUFBLEtBQXZCLEVBQTJDakMsR0FBM0MsQ0FBK0MsVUFBQWtDLEtBQUs7QUFBQSxhQUFLO0FBQ2pFYixRQUFBQSxJQUFJLEVBQUUsU0FEMkQ7QUFFakVVLFFBQUFBLFVBQVUsRUFBRUEsVUFBVSxDQUFDNUMsTUFBWCxDQUFrQixVQUFDMEIsT0FBRCxFQUFRc0IsUUFBUjtBQUFBLG1DQUN6QnRCLE9BRHlCLHVDQUUzQnNCLFFBQVEsQ0FBQ0MsSUFGa0IsRUFFWEYsS0FBSyxDQUFDQyxRQUFRLENBQUNFLGVBQVQsR0FBMkIsQ0FBNUIsQ0FGTTtBQUFBLFNBQWxCLEVBR1IsRUFIUSxDQUZxRDtBQU1qRUMsUUFBQUEsUUFBUSxFQUFFO0FBQ1JqQixVQUFBQSxJQUFJLEVBQUUsT0FERTtBQUVSa0IsVUFBQUEsV0FBVyxFQUFFLENBQ1hULE9BQU8sQ0FBQ1UsR0FBUixHQUFjTixLQUFLLENBQUNKLE9BQU8sQ0FBQ1UsR0FBUixDQUFZQyxRQUFiLENBQW5CLEdBQTRDLElBRGpDLEVBQ3VDO0FBQ2xEWCxVQUFBQSxPQUFPLENBQUNZLEdBQVIsR0FBY1IsS0FBSyxDQUFDSixPQUFPLENBQUNZLEdBQVIsQ0FBWUQsUUFBYixDQUFuQixHQUE0QyxJQUZqQyxFQUV1QztBQUNsRFgsVUFBQUEsT0FBTyxDQUFDYSxRQUFSLEdBQW1CVCxLQUFLLENBQUNKLE9BQU8sQ0FBQ2EsUUFBUixDQUFpQkYsUUFBbEIsQ0FBeEIsR0FBc0QsQ0FIM0MsQ0FHNkM7QUFIN0M7QUFGTDtBQU51RCxPQUFMO0FBQUEsS0FBcEQ7QUFGTCxHQUFQO0FBa0JEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE5IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtPVkVSTEFZX1RZUEV9IGZyb20gJy4vYmFzZS1sYXllcic7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgbGF5ZXJzIHRvIG1hcGJveCBsYXllcnNcbiAqIEBwYXJhbSBsYXllcnMgdGhlIGxheWVycyB0byBiZSBjb252ZXJ0ZWRcbiAqIEBwYXJhbSBsYXllckRhdGEgZXh0cmEgbGF5ZXIgaW5mb3JtYXRpb25cbiAqIEBwYXJhbSBsYXllck9yZGVyIHRoZSBvcmRlciBieSB3aGljaCB3ZSBzaG91bGQgY29udmVydCBsYXllcnNcbiAqIEByZXR1cm5zIHsqfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNYXBib3hMYXllcnMobGF5ZXJzID0gW10sIGxheWVyRGF0YSA9IFtdLCBsYXllck9yZGVyID0gW10pIHtcbiAgaWYgKGxheWVyRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGxheWVyT3JkZXIuc2xpY2UoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLnJlZHVjZSgob3ZlcmxheXMsIGlkeCkgPT4ge1xuICAgICAgICBjb25zdCBsYXllciA9IGxheWVyc1tpZHhdO1xuXG4gICAgICAgIHJldHVybiBsYXllci5vdmVybGF5VHlwZSAhPT0gT1ZFUkxBWV9UWVBFLm1hcGJveGdsID9cbiAgICAgICAgICBvdmVybGF5c1xuICAgICAgICAgIDogW1xuICAgICAgICAgICAgLi4ub3ZlcmxheXMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiBsYXllci5pZCxcbiAgICAgICAgICAgICAgZGF0YTogbGF5ZXJEYXRhW2lkeF0uZGF0YSxcbiAgICAgICAgICAgICAgY29uZmlnOiBsYXllckRhdGFbaWR4XS5jb25maWcsXG4gICAgICAgICAgICAgIGRhdGFzZXRJZDogbGF5ZXIuY29uZmlnLmRhdGFJZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgIH0sIFtdKTtcbiAgfVxuXG4gIHJldHVybiBbXTtcbn07XG5cbi8qKlxuICogVXBkYXRlIG1hcGJveCBsYXllcnMgb24gdGhlIGdpdmVuIG1hcFxuICogQHBhcmFtIG1hcFxuICogQHBhcmFtIG5ld0xheWVycyBBcnJheSBvZiBuZXcgbWFwYm94IGxheWVycyB0byBiZSBkaXNwbGF5ZWRcbiAqIEBwYXJhbSBvbGRMYXllcnMgTWFwIG9mIHRoZSBvbGQgbGF5ZXJzIHRvIGJlIGNvbXBhcmUgd2l0aCB0aGUgY3VycmVudCBvbmVzIHRvIGRldGVjdCBkZWxldGVkIGxheWVyc1xuICogICAgICAgICAgICAgICAgICB7bGF5ZXJJZDogZGF0YXNldElkfVxuICogQHBhcmFtIG1hcExheWVycyBjYXJyaWVzIGluZm9ybWF0aW9uIGFib3V0IHNwbGl0IG1hcCB2aWV3XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVNYXBib3hMYXllcnMobWFwLCBuZXdMYXllcnMgPSBbXSwgb2xkTGF5ZXJzID0gbnVsbCwgbWFwTGF5ZXJzID0gbnVsbCwgb3B0ID0ge2ZvcmNlOiB0cnVlfSkge1xuICAvLyBkZWxldGUgbm9uIGV4aXN0aW5nIGxheWVyc1xuXG4gIGlmIChvbGRMYXllcnMpIHtcbiAgICBjb25zdCBvbGRMYXllcnNLZXlzID0gT2JqZWN0LmtleXMob2xkTGF5ZXJzKTtcbiAgICBpZiAobmV3TGF5ZXJzLmxlbmd0aCA9PT0gMCAmJiBvbGRMYXllcnNLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIG9sZExheWVyc0tleXMuZm9yRWFjaChsYXllcklkID0+IG1hcC5yZW1vdmVMYXllcihsYXllcklkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJlbW92ZSBsYXllcnNcbiAgICAgIGNvbnN0IGN1cnJlbnRMYXllcnNJZHMgPSBuZXdMYXllcnMucmVkdWNlKChmaW5hbCwgbGF5ZXIpID0+ICh7XG4gICAgICAgIC4uLmZpbmFsLFxuICAgICAgICBbbGF5ZXIuaWRdOiB0cnVlXG4gICAgICB9KSwge30pO1xuXG4gICAgICBjb25zdCBsYXllcnNUb0RlbGV0ZSA9IG9sZExheWVyc0tleXMucmVkdWNlKChmaW5hbCwgbGF5ZXJJZCkgPT4ge1xuICAgICAgICAvLyBpZiBsYXllciBkb2Vzbid0IGV4aXN0cyBhbnltb3JlXG4gICAgICAgIGlmICghY3VycmVudExheWVyc0lkc1tsYXllcklkXSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5maW5hbCxcbiAgICAgICAgICAgIFtsYXllcklkXTogb2xkTGF5ZXJzW2xheWVySWRdXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmluYWw7XG4gICAgICB9LCBbXSk7XG4gICAgICBPYmplY3Qua2V5cyhsYXllcnNUb0RlbGV0ZSkuZm9yRWFjaChsYXllcklkID0+IG1hcC5yZW1vdmVMYXllcihsYXllcklkKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gaW5zZXJ0IG9yIHVwZGF0ZSBuZXcgbGF5ZXJcbiAgLy8gVE9ETzogZml4IGNvbXBsZXhpdHlcbiAgLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuICBuZXdMYXllcnMuZm9yRWFjaChvdmVybGF5ID0+IHtcbiAgICBjb25zdCB7aWQ6IGxheWVySWQsIGNvbmZpZywgZGF0YSwgZGF0YXNldElkfSA9IG92ZXJsYXk7XG4gICAgaWYgKCFkYXRhICYmICFjb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXNBdmFpbGFibGVBbmRWaXNpYmxlID1cbiAgICAgICEobWFwTGF5ZXJzICYmIG1hcExheWVyc1tsYXllcklkXSkgfHwgbWFwTGF5ZXJzW2xheWVySWRdLmlzVmlzaWJsZTtcbiAgICAvLyBjaGVja2luZyBpZiBzb3VyY2UgYWxyZWFkeSBleGlzdHNcblxuICAgIGlmIChkYXRhICYmIGlzQXZhaWxhYmxlQW5kVmlzaWJsZSkge1xuICAgICAgY29uc3Qgc291cmNlID0gbWFwLmdldFNvdXJjZShkYXRhc2V0SWQpO1xuICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgbWFwLmFkZFNvdXJjZShkYXRhc2V0SWQsIHtcbiAgICAgICAgICB0eXBlOiAnZ2VvanNvbicsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzb3VyY2Uuc2V0RGF0YShkYXRhKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvbGRDb25maWcgPSBvbGRMYXllcnNbbGF5ZXJJZF07XG4gICAgY29uc3QgbWFwYm94TGF5ZXIgPSBtYXAuZ2V0TGF5ZXIobGF5ZXJJZCk7XG4gICAgLy8gY29tcGFyZSB3aXRoIHByZXZpb3VzIGNvbmZpZ3NcblxuICAgIGlmICghb2xkQ29uZmlnIHx8IG9sZENvbmZpZyAhPT0gY29uZmlnIHx8ICFtYXBib3hMYXllciB8fCBvcHQuZm9yY2UpIHtcbiAgICAgIC8vIGNoZWNrIGlmIGxheWVyIGFscmVhZHkgaXMgc2V0XG4gICAgICAvLyByZW1vdmUgaXQgaWYgZXhpc3RzXG4gICAgICBpZiAobWFwYm94TGF5ZXIpIHtcbiAgICAgICAgbWFwLnJlbW92ZUxheWVyKGxheWVySWQpO1xuICAgICAgfVxuICAgICAgLy8gYWRkIGlmIHZpc2libGUgYW5kIGF2YWlsYWJsZVxuICAgICAgaWYgKGlzQXZhaWxhYmxlQW5kVmlzaWJsZSkge1xuICAgICAgICBtYXAuYWRkTGF5ZXIoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICAvKiBlc2xpbnQtZW5hYmxlIGNvbXBsZXhpdHkgKi9cbiAgLy8gVE9ETzogdGhpbmsgYWJvdXQgcmVtb3Zpbmcgc291cmNlc1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHBvaW50c1xuICogQHBhcmFtIGNvbHVtbnMge1xuICogbGF0OiB7ZmllbGRJZHh9LFxuICogbG5nOiB7ZmllbGRJZHh9LFxuICogYWx0OiB7ZmllbGRJZHh9XG4gKiB9XG4gKiBAcGFyYW0gcHJvcGVydGllcyBbe2xhYmVsOiB7ZmllbGRJZHh9XVxuICogQHJldHVybnMge3t0eXBlOiBzdHJpbmcsIHByb3BlcnRpZXM6IHt9LCBmZWF0dXJlczoge3R5cGU6IHN0cmluZywgcHJvcGVydGllczoge30sIGdlb21ldHJ5OiB7dHlwZTogc3RyaW5nLCBjb29yZGluYXRlczogKltdfX1bXX19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW9qc29uRnJvbVBvaW50cyhhbGxEYXRhID0gW10sIGZpbHRlcmVkSW5kZXggPSBbXSwgY29sdW1ucyA9IHt9LCBwcm9wZXJ0aWVzID0gW10pIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgIGZlYXR1cmVzOiBmaWx0ZXJlZEluZGV4Lm1hcChpbmRleCA9PiBhbGxEYXRhW2luZGV4XSkubWFwKHBvaW50ID0+ICh7XG4gICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLnJlZHVjZSgoZmluYWwsIHByb3BlcnR5KSA9PiAoe1xuICAgICAgICAuLi5maW5hbCxcbiAgICAgICAgW3Byb3BlcnR5Lm5hbWVdOiBwb2ludFtwcm9wZXJ0eS50YWJsZUZpZWxkSW5kZXggLSAxXVxuICAgICAgfSksIHt9KSxcbiAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBbXG4gICAgICAgICAgY29sdW1ucy5sbmcgPyBwb2ludFtjb2x1bW5zLmxuZy5maWVsZElkeF0gOiBudWxsLCAvLyBsbmdcbiAgICAgICAgICBjb2x1bW5zLmxhdCA/IHBvaW50W2NvbHVtbnMubGF0LmZpZWxkSWR4XSA6IG51bGwsIC8vIGxhdFxuICAgICAgICAgIGNvbHVtbnMuYWx0aXR1ZGUgPyBwb2ludFtjb2x1bW5zLmFsdGl0dWRlLmZpZWxkSWR4XSA6IDAgLy8gYWx0aXR1ZGVcbiAgICAgICAgXVxuICAgICAgfVxuICAgIH0pKVxuICB9O1xufVxuIl19