UNPKG

kepler.gl.geoiq

Version:

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

226 lines (207 loc) 19.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); var _exportNames = { addDataToMap: true, resetMapConfig: true, receiveMapConfig: true, keplerGlInit: true }; exports.keplerGlInit = exports.receiveMapConfig = exports.resetMapConfig = exports.addDataToMap = void 0; var _actionTypes = _interopRequireDefault(require("../constants/action-types")); var _reduxActions = require("redux-actions"); var _visStateActions = require("./vis-state-actions"); Object.keys(_visStateActions).forEach(function (key) { if (key === "default" || key === "__esModule") return; if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; Object.defineProperty(exports, key, { enumerable: true, get: function get() { return _visStateActions[key]; } }); }); var _uiStateActions = require("./ui-state-actions"); Object.keys(_uiStateActions).forEach(function (key) { if (key === "default" || key === "__esModule") return; if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; Object.defineProperty(exports, key, { enumerable: true, get: function get() { return _uiStateActions[key]; } }); }); var _mapStateActions = require("./map-state-actions"); Object.keys(_mapStateActions).forEach(function (key) { if (key === "default" || key === "__esModule") return; if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; Object.defineProperty(exports, key, { enumerable: true, get: function get() { return _mapStateActions[key]; } }); }); var _mapStyleActions = require("./map-style-actions"); Object.keys(_mapStyleActions).forEach(function (key) { if (key === "default" || key === "__esModule") return; if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; Object.defineProperty(exports, key, { enumerable: true, get: function get() { return _mapStyleActions[key]; } }); }); var _identityActions = require("./identity-actions"); Object.keys(_identityActions).forEach(function (key) { if (key === "default" || key === "__esModule") return; if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; Object.defineProperty(exports, key, { enumerable: true, get: function get() { return _identityActions[key]; } }); }); // Copyright (c) 2019 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // kepler.gl actions accessible outside component /** * Add data to kepler.gl reducer, prepare map with preset configuration if config is passed. * Kepler.gl provides a handy set of utils to parse data from different format to the `data` object required in dataset. You rarely need to manually format the data obejct. * * Use `KeplerGlSchema.getConfigToSave` to generate a json blob of the currents instance config. * The config object value will always have higher precedence than the options properties. * * Kepler.gl uses `dataId` in the config to match with loaded dataset. If you pass a config object, you need * to match the `info.id` of your dataset to the `dataId` in eath `layer`, `filter` and `interactionConfig.tooltips.fieldsToShow` * * @param {Array<Object>|Object} datasets - ***required** datasets can be a dataset or an array of datasets * Each dataset object needs to have `info` and `data` property. * @param {Object} datasets.info -info of a dataset * @param {string} datasets.info.id - id of this dataset. If config is defined, `id` should matches the `dataId` in config. * @param {string} datasets.info.label - A display name of this dataset * @param {Object} datasets.data - ***required** The data object, in a tabular format with 2 properties `fields` and `rows` * @param {Array<Object>} datasets.data.fields - ***required** Array of fields, * @param {string} datasets.data.fields.name - ***required** Name of the field, * @param {Array<Array>} datasets.data.rows - ***required** Array of rows, in a tabular format with `fields` and `rows` * * @param {Object} options * @param {boolean} options.centerMap `default: true` if `centerMap` is set to `true` kepler.gl will * place the map view within the data points boundaries * @param {boolean} options.readOnly `default: false` if `readOnly` is set to `true` * the left setting panel will be hidden * @param {Object} config this object will contain the full kepler.gl instance configuration {mapState, mapStyle, visState} * @public * @example * import {addDataToMap} from 'kepler.gl/actions'; * * this.props.dispatch( * addDataToMap( * // datasets * { * info: { * label: 'Sample Taxi Trips in New York City', * id: 'test_trip_data' * }, * data: { * fields: [{ * name: 'begintrip_lat', * type: 'real', * format: '' * }, { * name: 'begintrip_lng', * type: 'real', * format: '' * }], * rows: [ * [37.1234, -121.20292], * [34.1223, -121.98234] * ] * } * }, * // option * { * centerMap: true, * readOnly: false * }, * // config * { * mapStyle: { * styleType: 'light' * } * } * ) * ); */ var addDataToMap = (0, _reduxActions.createAction)(_actionTypes["default"].ADD_DATA_TO_MAP, function (data) { return data; }); /** * Reset all sub-reducers to its initial state. This can be used to clear out all configuration in the reducer. * @public */ exports.addDataToMap = addDataToMap; var resetMapConfig = (0, _reduxActions.createAction)(_actionTypes["default"].RESET_MAP_CONFIG); /** * Pass config to kepler.gl instance, prepare the state with preset configs. * Calling `KeplerGlSchema.parseSavedConfig` to convert saved config before passing it in is required. * * You can call `receiveMapConfig` before passing in any data. The reducer will store layer and filter config, waiting for * data to come in. When data arrives, you can call `addDataToMap` without passing any config, and the reducer will try to match * preloaded configs. This behavior is designed to allow asynchronic data loading. * * It is also useful when you want to prepare the kepler.gl instance with some preset layer and filter settings. * **Note** Sequence is important, `receiveMapConfig` needs to be called __before__ data is loaded. Currently kepler.gl doesn't allow callling `receiveMapConfig` after data is loaded. * It will reset current configuration first then apply config to it. * * @param {Object} config - ***required** The Config Object * @public * @example * import {receiveMapConfig} from 'kepler.gl/actions'; * import KeplerGlSchema from 'kepler.gl/schemas'; * * const parsedConfig = KeplerGlSchema.parseSavedConfig(config); * this.props.dispatch(receiveMapConfig(parsedConfig)); */ exports.resetMapConfig = resetMapConfig; var receiveMapConfig = (0, _reduxActions.createAction)(_actionTypes["default"].RECEIVE_MAP_CONFIG, function (config) { return config; }); /** * Initialize kepler.gl reducer. It is used to pass in `mapboxApiAccessToken` to `mapStyle` reducer. * @param {Object} payload * @param {string} payload.mapboxApiAccessToken - mapboxApiAccessToken to be saved to mapStyle reducer * @public */ exports.receiveMapConfig = receiveMapConfig; var keplerGlInit = (0, _reduxActions.createAction)(_actionTypes["default"].INIT, function () { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, mapboxApiAccessToken = _ref.mapboxApiAccessToken; return { mapboxApiAccessToken: mapboxApiAccessToken }; }); exports.keplerGlInit = keplerGlInit; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY3Rpb25zL2FjdGlvbnMuanMiXSwibmFtZXMiOlsiYWRkRGF0YVRvTWFwIiwiQWN0aW9uVHlwZXMiLCJBRERfREFUQV9UT19NQVAiLCJkYXRhIiwicmVzZXRNYXBDb25maWciLCJSRVNFVF9NQVBfQ09ORklHIiwicmVjZWl2ZU1hcENvbmZpZyIsIlJFQ0VJVkVfTUFQX0NPTkZJRyIsImNvbmZpZyIsImtlcGxlckdsSW5pdCIsIklOSVQiLCJtYXBib3hBcGlBY2Nlc3NUb2tlbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUdBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUNBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7O0FBT0U7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0VLLElBQU1BLFlBQVksR0FBRyxnQ0FDMUJDLHdCQUFZQyxlQURjLEVBRTFCLFVBQUFDLElBQUk7QUFBQSxTQUFJQSxJQUFKO0FBQUEsQ0FGc0IsQ0FBckI7QUFLUDs7Ozs7O0FBSU8sSUFBTUMsY0FBYyxHQUFHLGdDQUM1Qkgsd0JBQVlJLGdCQURnQixDQUF2QjtBQUlQOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCTyxJQUFNQyxnQkFBZ0IsR0FBRyxnQ0FDOUJMLHdCQUFZTSxrQkFEa0IsRUFFOUIsVUFBQUMsTUFBTTtBQUFBLFNBQUlBLE1BQUo7QUFBQSxDQUZ3QixDQUF6QjtBQUtQOzs7Ozs7OztBQU1PLElBQU1DLFlBQVksR0FBSSxnQ0FDM0JSLHdCQUFZUyxJQURlLEVBRTNCO0FBQUEsaUZBQTBCLEVBQTFCO0FBQUEsTUFBRUMsb0JBQUYsUUFBRUEsb0JBQUY7O0FBQUEsU0FBa0M7QUFBQ0EsSUFBQUEsb0JBQW9CLEVBQXBCQTtBQUFELEdBQWxDO0FBQUEsQ0FGMkIsQ0FBdEIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTkgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgQWN0aW9uVHlwZXMgZnJvbSAnY29uc3RhbnRzL2FjdGlvbi10eXBlcyc7XG5pbXBvcnQge2NyZWF0ZUFjdGlvbn0gZnJvbSAncmVkdXgtYWN0aW9ucyc7XG5cbi8vIGtlcGxlci5nbCBhY3Rpb25zIGFjY2Vzc2libGUgb3V0c2lkZSBjb21wb25lbnRcbmV4cG9ydCAqIGZyb20gJy4vdmlzLXN0YXRlLWFjdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi91aS1zdGF0ZS1hY3Rpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vbWFwLXN0YXRlLWFjdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9tYXAtc3R5bGUtYWN0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2lkZW50aXR5LWFjdGlvbnMnO1xuXG4gIC8qKlxuICAgKiBBZGQgZGF0YSB0byBrZXBsZXIuZ2wgcmVkdWNlciwgcHJlcGFyZSBtYXAgd2l0aCBwcmVzZXQgY29uZmlndXJhdGlvbiBpZiBjb25maWcgaXMgcGFzc2VkLlxuICAgKiBLZXBsZXIuZ2wgcHJvdmlkZXMgYSBoYW5keSBzZXQgb2YgdXRpbHMgdG8gcGFyc2UgZGF0YSBmcm9tIGRpZmZlcmVudCBmb3JtYXQgdG8gdGhlIGBkYXRhYCBvYmplY3QgcmVxdWlyZWQgaW4gZGF0YXNldC4gWW91IHJhcmVseSBuZWVkIHRvIG1hbnVhbGx5IGZvcm1hdCB0aGUgZGF0YSBvYmVqY3QuXG4gICAqXG4gICAqIFVzZSBgS2VwbGVyR2xTY2hlbWEuZ2V0Q29uZmlnVG9TYXZlYCB0byBnZW5lcmF0ZSBhIGpzb24gYmxvYiBvZiB0aGUgY3VycmVudHMgaW5zdGFuY2UgY29uZmlnLlxuICAgKiBUaGUgY29uZmlnIG9iamVjdCB2YWx1ZSB3aWxsIGFsd2F5cyBoYXZlIGhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gdGhlIG9wdGlvbnMgcHJvcGVydGllcy5cbiAgICpcbiAgICogS2VwbGVyLmdsIHVzZXMgYGRhdGFJZGAgaW4gdGhlIGNvbmZpZyB0byBtYXRjaCB3aXRoIGxvYWRlZCBkYXRhc2V0LiBJZiB5b3UgcGFzcyBhIGNvbmZpZyBvYmplY3QsIHlvdSBuZWVkXG4gICAqIHRvIG1hdGNoIHRoZSBgaW5mby5pZGAgb2YgeW91ciBkYXRhc2V0IHRvIHRoZSBgZGF0YUlkYCBpbiBlYXRoIGBsYXllcmAsIGBmaWx0ZXJgIGFuZCBgaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcHMuZmllbGRzVG9TaG93YFxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PE9iamVjdD58T2JqZWN0fSBkYXRhc2V0cyAtICoqKnJlcXVpcmVkKiogZGF0YXNldHMgY2FuIGJlIGEgZGF0YXNldCBvciBhbiBhcnJheSBvZiBkYXRhc2V0c1xuICAgKiBFYWNoIGRhdGFzZXQgb2JqZWN0IG5lZWRzIHRvIGhhdmUgYGluZm9gIGFuZCBgZGF0YWAgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhc2V0cy5pbmZvIC1pbmZvIG9mIGEgZGF0YXNldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNldHMuaW5mby5pZCAtIGlkIG9mIHRoaXMgZGF0YXNldC4gSWYgY29uZmlnIGlzIGRlZmluZWQsIGBpZGAgc2hvdWxkIG1hdGNoZXMgdGhlIGBkYXRhSWRgIGluIGNvbmZpZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFzZXRzLmluZm8ubGFiZWwgLSBBIGRpc3BsYXkgbmFtZSBvZiB0aGlzIGRhdGFzZXRcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFzZXRzLmRhdGEgLSAqKipyZXF1aXJlZCoqIFRoZSBkYXRhIG9iamVjdCwgaW4gYSB0YWJ1bGFyIGZvcm1hdCB3aXRoIDIgcHJvcGVydGllcyBgZmllbGRzYCBhbmQgYHJvd3NgXG4gICAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gZGF0YXNldHMuZGF0YS5maWVsZHMgLSAqKipyZXF1aXJlZCoqIEFycmF5IG9mIGZpZWxkcyxcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFzZXRzLmRhdGEuZmllbGRzLm5hbWUgLSAqKipyZXF1aXJlZCoqIE5hbWUgb2YgdGhlIGZpZWxkLFxuICAgKiBAcGFyYW0ge0FycmF5PEFycmF5Pn0gZGF0YXNldHMuZGF0YS5yb3dzIC0gKioqcmVxdWlyZWQqKiBBcnJheSBvZiByb3dzLCBpbiBhIHRhYnVsYXIgZm9ybWF0IHdpdGggYGZpZWxkc2AgYW5kIGByb3dzYFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuY2VudGVyTWFwIGBkZWZhdWx0OiB0cnVlYCBpZiBgY2VudGVyTWFwYCBpcyBzZXQgdG8gYHRydWVgIGtlcGxlci5nbCB3aWxsXG4gICAqIHBsYWNlIHRoZSBtYXAgdmlldyB3aXRoaW4gdGhlIGRhdGEgcG9pbnRzIGJvdW5kYXJpZXNcbiAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLnJlYWRPbmx5IGBkZWZhdWx0OiBmYWxzZWAgaWYgYHJlYWRPbmx5YCBpcyBzZXQgdG8gYHRydWVgXG4gICAqIHRoZSBsZWZ0IHNldHRpbmcgcGFuZWwgd2lsbCBiZSBoaWRkZW5cbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyB0aGlzIG9iamVjdCB3aWxsIGNvbnRhaW4gdGhlIGZ1bGwga2VwbGVyLmdsIGluc3RhbmNlIGNvbmZpZ3VyYXRpb24ge21hcFN0YXRlLCBtYXBTdHlsZSwgdmlzU3RhdGV9XG4gICAqIEBwdWJsaWNcbiAgICogQGV4YW1wbGVcbiAgICogaW1wb3J0IHthZGREYXRhVG9NYXB9IGZyb20gJ2tlcGxlci5nbC9hY3Rpb25zJztcbiAgICpcbiAgICogdGhpcy5wcm9wcy5kaXNwYXRjaChcbiAgICogICBhZGREYXRhVG9NYXAoXG4gICAqICAgICAvLyBkYXRhc2V0c1xuICAgKiAgICAge1xuICAgKiAgICAgICBpbmZvOiB7XG4gICAqICAgICAgICAgbGFiZWw6ICdTYW1wbGUgVGF4aSBUcmlwcyBpbiBOZXcgWW9yayBDaXR5JyxcbiAgICogICAgICAgICBpZDogJ3Rlc3RfdHJpcF9kYXRhJ1xuICAgKiAgICAgICB9LFxuICAgKiAgICAgICBkYXRhOiB7XG4gICAqICAgICAgICAgZmllbGRzOiBbe1xuICAgKiAgICAgICAgICAgbmFtZTogJ2JlZ2ludHJpcF9sYXQnLFxuICAgKiAgICAgICAgICAgdHlwZTogJ3JlYWwnLFxuICAgKiAgICAgICAgICAgZm9ybWF0OiAnJ1xuICAgKiAgICAgICAgIH0sIHtcbiAgICogICAgICAgICAgIG5hbWU6ICdiZWdpbnRyaXBfbG5nJyxcbiAgICogICAgICAgICAgIHR5cGU6ICdyZWFsJyxcbiAgICogICAgICAgICAgIGZvcm1hdDogJydcbiAgICogICAgICAgICB9XSxcbiAgICogICAgICAgICByb3dzOiBbXG4gICAqICAgICAgICAgIFszNy4xMjM0LCAtMTIxLjIwMjkyXSxcbiAgICogICAgICAgICAgWzM0LjEyMjMsIC0xMjEuOTgyMzRdXG4gICAqICAgICAgICAgXVxuICAgKiAgICAgICB9XG4gICAqICAgICB9LFxuICAgKiAgICAgLy8gb3B0aW9uXG4gICAqICAgICB7XG4gICAqICAgICAgIGNlbnRlck1hcDogdHJ1ZSxcbiAgICogICAgICAgcmVhZE9ubHk6IGZhbHNlXG4gICAqICAgICB9LFxuICAgKiAgICAgLy8gY29uZmlnXG4gICAqICAgICB7XG4gICAqICAgICAgIG1hcFN0eWxlOiB7XG4gICAqICAgICAgICBzdHlsZVR5cGU6ICdsaWdodCdcbiAgICogICAgICAgfVxuICAgKiAgICAgfVxuICAgKiAgIClcbiAgICogKTtcbiAgICovXG5leHBvcnQgY29uc3QgYWRkRGF0YVRvTWFwID0gY3JlYXRlQWN0aW9uKFxuICBBY3Rpb25UeXBlcy5BRERfREFUQV9UT19NQVAsXG4gIGRhdGEgPT4gZGF0YVxuKTtcblxuLyoqXG4gKiBSZXNldCBhbGwgc3ViLXJlZHVjZXJzIHRvIGl0cyBpbml0aWFsIHN0YXRlLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNsZWFyIG91dCBhbGwgY29uZmlndXJhdGlvbiBpbiB0aGUgcmVkdWNlci5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0TWFwQ29uZmlnID0gY3JlYXRlQWN0aW9uKFxuICBBY3Rpb25UeXBlcy5SRVNFVF9NQVBfQ09ORklHXG4pO1xuXG4vKipcbiAqIFBhc3MgY29uZmlnIHRvIGtlcGxlci5nbCBpbnN0YW5jZSwgcHJlcGFyZSB0aGUgc3RhdGUgd2l0aCBwcmVzZXQgY29uZmlncy5cbiAqIENhbGxpbmcgYEtlcGxlckdsU2NoZW1hLnBhcnNlU2F2ZWRDb25maWdgIHRvIGNvbnZlcnQgc2F2ZWQgY29uZmlnIGJlZm9yZSBwYXNzaW5nIGl0IGluIGlzIHJlcXVpcmVkLlxuICpcbiAqIFlvdSBjYW4gY2FsbCBgcmVjZWl2ZU1hcENvbmZpZ2AgYmVmb3JlIHBhc3NpbmcgaW4gYW55IGRhdGEuIFRoZSByZWR1Y2VyIHdpbGwgc3RvcmUgbGF5ZXIgYW5kIGZpbHRlciBjb25maWcsIHdhaXRpbmcgZm9yXG4gKiBkYXRhIHRvIGNvbWUgaW4uIFdoZW4gZGF0YSBhcnJpdmVzLCB5b3UgY2FuIGNhbGwgYGFkZERhdGFUb01hcGAgd2l0aG91dCBwYXNzaW5nIGFueSBjb25maWcsIGFuZCB0aGUgcmVkdWNlciB3aWxsIHRyeSB0byBtYXRjaFxuICogcHJlbG9hZGVkIGNvbmZpZ3MuIFRoaXMgYmVoYXZpb3IgaXMgZGVzaWduZWQgdG8gYWxsb3cgYXN5bmNocm9uaWMgZGF0YSBsb2FkaW5nLlxuICpcbiAqIEl0IGlzIGFsc28gdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gcHJlcGFyZSB0aGUga2VwbGVyLmdsIGluc3RhbmNlIHdpdGggc29tZSBwcmVzZXQgbGF5ZXIgYW5kIGZpbHRlciBzZXR0aW5ncy5cbiAqICoqTm90ZSoqIFNlcXVlbmNlIGlzIGltcG9ydGFudCwgYHJlY2VpdmVNYXBDb25maWdgIG5lZWRzIHRvIGJlIGNhbGxlZCBfX2JlZm9yZV9fIGRhdGEgaXMgbG9hZGVkLiBDdXJyZW50bHkga2VwbGVyLmdsIGRvZXNuJ3QgYWxsb3cgY2FsbGxpbmcgYHJlY2VpdmVNYXBDb25maWdgIGFmdGVyIGRhdGEgaXMgbG9hZGVkLlxuICogSXQgd2lsbCByZXNldCBjdXJyZW50IGNvbmZpZ3VyYXRpb24gZmlyc3QgdGhlbiBhcHBseSBjb25maWcgdG8gaXQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyAtICoqKnJlcXVpcmVkKiogVGhlIENvbmZpZyBPYmplY3RcbiAqIEBwdWJsaWNcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQge3JlY2VpdmVNYXBDb25maWd9IGZyb20gJ2tlcGxlci5nbC9hY3Rpb25zJztcbiAqIGltcG9ydCBLZXBsZXJHbFNjaGVtYSBmcm9tICdrZXBsZXIuZ2wvc2NoZW1hcyc7XG4gKlxuICogY29uc3QgcGFyc2VkQ29uZmlnID0gS2VwbGVyR2xTY2hlbWEucGFyc2VTYXZlZENvbmZpZyhjb25maWcpO1xuICogdGhpcy5wcm9wcy5kaXNwYXRjaChyZWNlaXZlTWFwQ29uZmlnKHBhcnNlZENvbmZpZykpO1xuICovXG5leHBvcnQgY29uc3QgcmVjZWl2ZU1hcENvbmZpZyA9IGNyZWF0ZUFjdGlvbihcbiAgQWN0aW9uVHlwZXMuUkVDRUlWRV9NQVBfQ09ORklHLFxuICBjb25maWcgPT4gY29uZmlnXG4pO1xuXG4vKipcbiAqIEluaXRpYWxpemUga2VwbGVyLmdsIHJlZHVjZXIuIEl0IGlzIHVzZWQgdG8gcGFzcyBpbiBgbWFwYm94QXBpQWNjZXNzVG9rZW5gIHRvIGBtYXBTdHlsZWAgcmVkdWNlci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF5bG9hZC5tYXBib3hBcGlBY2Nlc3NUb2tlbiAtIG1hcGJveEFwaUFjY2Vzc1Rva2VuIHRvIGJlIHNhdmVkIHRvIG1hcFN0eWxlIHJlZHVjZXJcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGtlcGxlckdsSW5pdCA9ICBjcmVhdGVBY3Rpb24oXG4gIEFjdGlvblR5cGVzLklOSVQsXG4gICh7bWFwYm94QXBpQWNjZXNzVG9rZW59ID0ge30pID0+ICh7bWFwYm94QXBpQWNjZXNzVG9rZW59KVxuKTtcbiJdfQ==