@kepler.gl/reducers 3.1.0-alpha.1 → 3.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/combined-updaters.d.ts +79 -0
- package/dist/combined-updaters.js +358 -0
- package/dist/composer-helpers.d.ts +24 -0
- package/dist/composer-helpers.js +101 -0
- package/dist/composers.d.ts +18 -0
- package/dist/composers.js +23 -0
- package/dist/core.d.ts +64 -0
- package/dist/core.js +105 -0
- package/dist/data-utils.d.ts +12 -0
- package/dist/data-utils.js +57 -0
- package/dist/export-utils.d.ts +21 -0
- package/dist/export-utils.js +91 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +342 -0
- package/dist/interaction-utils.d.ts +29 -0
- package/dist/interaction-utils.js +105 -0
- package/dist/layer-utils.d.ts +96 -0
- package/dist/layer-utils.js +310 -0
- package/dist/map-state-updaters.d.ts +93 -0
- package/dist/map-state-updaters.js +432 -0
- package/dist/map-state.d.ts +75 -0
- package/dist/map-state.js +35 -0
- package/dist/map-style-updaters.d.ts +179 -0
- package/dist/map-style-updaters.js +656 -0
- package/dist/map-style.d.ts +4 -0
- package/dist/map-style.js +34 -0
- package/dist/merger-handler.d.ts +10 -0
- package/dist/merger-handler.js +105 -0
- package/dist/middleware.d.ts +8 -0
- package/dist/middleware.js +27 -0
- package/dist/provider-state-updaters.d.ts +35 -0
- package/dist/provider-state-updaters.js +348 -0
- package/dist/provider-state.d.ts +4 -0
- package/dist/provider-state.js +35 -0
- package/dist/root.d.ts +24 -0
- package/dist/root.js +206 -0
- package/dist/ui-state-updaters.d.ts +362 -0
- package/dist/ui-state-updaters.js +762 -0
- package/dist/ui-state.d.ts +3 -0
- package/dist/ui-state.js +37 -0
- package/dist/vis-state-merger.d.ts +143 -0
- package/dist/vis-state-merger.js +812 -0
- package/dist/vis-state-selectors.d.ts +10 -0
- package/dist/vis-state-selectors.js +30 -0
- package/dist/vis-state-updaters.d.ts +546 -0
- package/dist/vis-state-updaters.js +3338 -0
- package/dist/vis-state.d.ts +155 -0
- package/dist/vis-state.js +36 -0
- package/package.json +17 -17
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.addLayerToLayerOrder = addLayerToLayerOrder;
|
|
8
|
+
exports.bindLayerCallbacks = bindLayerCallbacks;
|
|
9
|
+
exports.calculateLayerData = calculateLayerData;
|
|
10
|
+
exports.computeDeckLayers = computeDeckLayers;
|
|
11
|
+
exports.findDefaultLayer = findDefaultLayer;
|
|
12
|
+
exports.getCustomDeckLayers = getCustomDeckLayers;
|
|
13
|
+
exports.getLayerHoverProp = getLayerHoverProp;
|
|
14
|
+
exports.getLayerOrderFromLayers = getLayerOrderFromLayers;
|
|
15
|
+
exports.isLayerRenderable = isLayerRenderable;
|
|
16
|
+
exports.isLayerVisible = isLayerVisible;
|
|
17
|
+
exports.prepareLayersForDeck = prepareLayersForDeck;
|
|
18
|
+
exports.prepareLayersToRender = prepareLayersToRender;
|
|
19
|
+
exports.renderDeckGlLayer = renderDeckGlLayer;
|
|
20
|
+
exports.reorderLayerOrder = reorderLayerOrder;
|
|
21
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
22
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
23
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
24
|
+
var _console = _interopRequireDefault(require("global/console"));
|
|
25
|
+
var _sortable = require("@dnd-kit/sortable");
|
|
26
|
+
var _constants = require("@kepler.gl/constants");
|
|
27
|
+
var _layers = require("@kepler.gl/layers");
|
|
28
|
+
var _utils = require("@kepler.gl/utils");
|
|
29
|
+
var _deckglLayers = require("@kepler.gl/deckgl-layers");
|
|
30
|
+
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; }
|
|
31
|
+
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; } // SPDX-License-Identifier: MIT
|
|
32
|
+
// Copyright contributors to the kepler.gl project
|
|
33
|
+
/**
|
|
34
|
+
* Find default layers from fields
|
|
35
|
+
*/
|
|
36
|
+
function findDefaultLayer(dataset, layerClasses) {
|
|
37
|
+
if (!dataset) {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
var layerProps = Object.keys(layerClasses).reduce(function (previous, lc) {
|
|
41
|
+
var result = typeof layerClasses[lc].findDefaultLayerProps === 'function' ? layerClasses[lc].findDefaultLayerProps(dataset, previous) : {
|
|
42
|
+
props: []
|
|
43
|
+
};
|
|
44
|
+
var props = Array.isArray(result) ? result : result.props || [];
|
|
45
|
+
var foundLayers = result.foundLayers || previous;
|
|
46
|
+
return foundLayers.concat(props.map(function (p) {
|
|
47
|
+
return _objectSpread(_objectSpread({}, p), {}, {
|
|
48
|
+
type: lc,
|
|
49
|
+
dataId: dataset.id
|
|
50
|
+
}, lc === 'arc' || lc === 'line' ? {
|
|
51
|
+
isVisible: false
|
|
52
|
+
} : {});
|
|
53
|
+
}));
|
|
54
|
+
}, []);
|
|
55
|
+
|
|
56
|
+
// go through all layerProps to create layer
|
|
57
|
+
return layerProps.map(function (props) {
|
|
58
|
+
var layer = new layerClasses[props.type](props);
|
|
59
|
+
return typeof layer.setInitialLayerConfig === 'function' && dataset.dataContainer ? layer.setInitialLayerConfig(dataset) : layer;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Calculate layer data based on layer type, col Config,
|
|
64
|
+
* return updated layer if colorDomain, dataMap has changed.
|
|
65
|
+
* Also, returns updated layer in case the input layer was in invalid state.
|
|
66
|
+
* Adds an error message to the layer in case of an exception.
|
|
67
|
+
*/
|
|
68
|
+
function calculateLayerData(layer, state, oldLayerData) {
|
|
69
|
+
var layerData;
|
|
70
|
+
try {
|
|
71
|
+
// Make sure the layer updates data after an error
|
|
72
|
+
if (!layer.isValid) {
|
|
73
|
+
layer._oldDataUpdateTriggers = undefined;
|
|
74
|
+
}
|
|
75
|
+
if (!layer.type || !layer.hasAllColumns() || !layer.config.dataId) {
|
|
76
|
+
return {
|
|
77
|
+
layer: layer,
|
|
78
|
+
layerData: {}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
layerData = layer.formatLayerData(state.datasets, oldLayerData);
|
|
82
|
+
|
|
83
|
+
// At this point the data for the layer is updated without errors
|
|
84
|
+
if (!layer.isValid) {
|
|
85
|
+
// Switch to visible after an error
|
|
86
|
+
layer = layer.updateLayerConfig({
|
|
87
|
+
isVisible: true
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
layer.isValid = true;
|
|
91
|
+
layer.errorMessage = null;
|
|
92
|
+
} catch (err) {
|
|
93
|
+
_console["default"].error(err);
|
|
94
|
+
layer = layer.updateLayerConfig({
|
|
95
|
+
isVisible: false
|
|
96
|
+
});
|
|
97
|
+
layer.isValid = false;
|
|
98
|
+
layer.errorMessage = err instanceof Error && err.message ? err.message.substring(0, 100) : 'Unknown error';
|
|
99
|
+
layerData = {};
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
layer: layer,
|
|
103
|
+
layerData: layerData
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Calculate props passed to LayerHoverInfo
|
|
109
|
+
*/
|
|
110
|
+
function getLayerHoverProp(_ref) {
|
|
111
|
+
var animationConfig = _ref.animationConfig,
|
|
112
|
+
interactionConfig = _ref.interactionConfig,
|
|
113
|
+
hoverInfo = _ref.hoverInfo,
|
|
114
|
+
layers = _ref.layers,
|
|
115
|
+
layersToRender = _ref.layersToRender,
|
|
116
|
+
datasets = _ref.datasets;
|
|
117
|
+
if (interactionConfig.tooltip.enabled && hoverInfo && hoverInfo.picked) {
|
|
118
|
+
// if anything hovered
|
|
119
|
+
var object = hoverInfo.object,
|
|
120
|
+
overlay = hoverInfo.layer;
|
|
121
|
+
|
|
122
|
+
// deckgl layer to kepler-gl layer
|
|
123
|
+
var layer = layers[overlay.props.idx];
|
|
124
|
+
|
|
125
|
+
// NOTE: for binary format GeojsonLayer, deck will return object=null but hoverInfo.index >= 0
|
|
126
|
+
if ((object || hoverInfo.index >= 0) && layer && layer.getHoverData && layersToRender[layer.id]) {
|
|
127
|
+
// if layer is visible and have hovered data
|
|
128
|
+
var dataId = layer.config.dataId;
|
|
129
|
+
if (!dataId) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
var _datasets$dataId = datasets[dataId],
|
|
133
|
+
dataContainer = _datasets$dataId.dataContainer,
|
|
134
|
+
fields = _datasets$dataId.fields;
|
|
135
|
+
var data = layer.getHoverData(object || hoverInfo.index, dataContainer, fields, animationConfig, hoverInfo);
|
|
136
|
+
if (!data) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
var fieldsToShow = interactionConfig.tooltip.config.fieldsToShow[dataId];
|
|
140
|
+
return {
|
|
141
|
+
data: data,
|
|
142
|
+
fields: fields,
|
|
143
|
+
fieldsToShow: fieldsToShow,
|
|
144
|
+
layer: layer,
|
|
145
|
+
currentTime: animationConfig.currentTime
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
function renderDeckGlLayer(props, layerCallbacks) {
|
|
152
|
+
var datasets = props.datasets,
|
|
153
|
+
layer = props.layer,
|
|
154
|
+
layerIndex = props.layerIndex,
|
|
155
|
+
data = props.data,
|
|
156
|
+
hoverInfo = props.hoverInfo,
|
|
157
|
+
clicked = props.clicked,
|
|
158
|
+
mapState = props.mapState,
|
|
159
|
+
interactionConfig = props.interactionConfig,
|
|
160
|
+
animationConfig = props.animationConfig,
|
|
161
|
+
mapLayers = props.mapLayers;
|
|
162
|
+
var dataset = datasets[layer.config.dataId];
|
|
163
|
+
var _ref2 = dataset || {},
|
|
164
|
+
gpuFilter = _ref2.gpuFilter;
|
|
165
|
+
var objectHovered = clicked || hoverInfo;
|
|
166
|
+
var visible = !mapLayers || mapLayers && mapLayers[layer.id];
|
|
167
|
+
// Layer is Layer class
|
|
168
|
+
return layer.renderLayer({
|
|
169
|
+
data: data,
|
|
170
|
+
gpuFilter: gpuFilter,
|
|
171
|
+
idx: layerIndex,
|
|
172
|
+
interactionConfig: interactionConfig,
|
|
173
|
+
layerCallbacks: layerCallbacks,
|
|
174
|
+
mapState: mapState,
|
|
175
|
+
animationConfig: animationConfig,
|
|
176
|
+
objectHovered: objectHovered,
|
|
177
|
+
visible: visible,
|
|
178
|
+
dataset: dataset
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
function isLayerRenderable(layer, layerData) {
|
|
182
|
+
return layer.id !== _constants.GEOCODER_LAYER_ID && layer.shouldRenderLayer(layerData);
|
|
183
|
+
}
|
|
184
|
+
function isLayerVisible(layer, mapLayers) {
|
|
185
|
+
return layer.config.isVisible && (
|
|
186
|
+
// if layer.id is not in mapLayers, don't render it
|
|
187
|
+
!mapLayers || mapLayers && mapLayers[layer.id]);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Prepare a dict of layers rendered by the deck.gl
|
|
191
|
+
// Note, isVisible: false layer is passed to deck.gl here
|
|
192
|
+
// return {[id]: true \ false}
|
|
193
|
+
function prepareLayersForDeck(layers, layerData) {
|
|
194
|
+
return layers.reduce(function (accu, layer, idx) {
|
|
195
|
+
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, layer.id, isLayerRenderable(layer, layerData[idx]) && layer.overlayType === _layers.OVERLAY_TYPE_CONST.deckgl));
|
|
196
|
+
}, {});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Prepare a dict of rendered layers rendered in the map
|
|
200
|
+
// This includes only the visibile layers for single map view and split map view
|
|
201
|
+
// return {[id]: true \ false}
|
|
202
|
+
function prepareLayersToRender(layers, layerData, mapLayers) {
|
|
203
|
+
return layers.reduce(function (accu, layer, idx) {
|
|
204
|
+
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, layer.id, isLayerRenderable(layer, layerData[idx]) && isLayerVisible(layer, mapLayers)));
|
|
205
|
+
}, {});
|
|
206
|
+
}
|
|
207
|
+
function getCustomDeckLayers(deckGlProps) {
|
|
208
|
+
var bottomDeckLayers = Array.isArray(deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.layers) ? deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.layers : (0, _utils.isFunction)(deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.layers) ? deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.layers() : [];
|
|
209
|
+
var topDeckLayers = Array.isArray(deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.topLayers) ? deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.topLayers : (0, _utils.isFunction)(deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.topLayers) ? deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.topLayers() : [];
|
|
210
|
+
return [bottomDeckLayers, topDeckLayers];
|
|
211
|
+
}
|
|
212
|
+
function bindLayerCallbacks() {
|
|
213
|
+
var layerCallbacks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
214
|
+
var idx = arguments.length > 1 ? arguments[1] : undefined;
|
|
215
|
+
return Object.keys(layerCallbacks).reduce(function (accu, key) {
|
|
216
|
+
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, function (val) {
|
|
217
|
+
return layerCallbacks[key](idx, val);
|
|
218
|
+
}));
|
|
219
|
+
}, {});
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// eslint-disable-next-line complexity
|
|
223
|
+
function computeDeckLayers(_ref3, options, layerCallbacks, deckGlProps) {
|
|
224
|
+
var visState = _ref3.visState,
|
|
225
|
+
mapState = _ref3.mapState,
|
|
226
|
+
mapStyle = _ref3.mapStyle;
|
|
227
|
+
var datasets = visState.datasets,
|
|
228
|
+
layers = visState.layers,
|
|
229
|
+
layerOrder = visState.layerOrder,
|
|
230
|
+
layerData = visState.layerData,
|
|
231
|
+
hoverInfo = visState.hoverInfo,
|
|
232
|
+
clicked = visState.clicked,
|
|
233
|
+
interactionConfig = visState.interactionConfig,
|
|
234
|
+
animationConfig = visState.animationConfig,
|
|
235
|
+
splitMaps = visState.splitMaps;
|
|
236
|
+
var _ref4 = options || {},
|
|
237
|
+
mapIndex = _ref4.mapIndex,
|
|
238
|
+
mapboxApiAccessToken = _ref4.mapboxApiAccessToken,
|
|
239
|
+
mapboxApiUrl = _ref4.mapboxApiUrl,
|
|
240
|
+
primaryMap = _ref4.primaryMap,
|
|
241
|
+
layersForDeck = _ref4.layersForDeck,
|
|
242
|
+
editorInfo = _ref4.editorInfo;
|
|
243
|
+
var dataLayers = [];
|
|
244
|
+
if (layerData && layerData.length) {
|
|
245
|
+
var mapLayers = (0, _utils.getMapLayersFromSplitMaps)(splitMaps, mapIndex || 0);
|
|
246
|
+
var currentLayersForDeck = layersForDeck || prepareLayersForDeck(layers, layerData);
|
|
247
|
+
dataLayers = layerOrder.slice().reverse().filter(function (id) {
|
|
248
|
+
return currentLayersForDeck[id];
|
|
249
|
+
}).reduce(function (overlays, layerId) {
|
|
250
|
+
var layerIndex = layers.findIndex(function (_ref5) {
|
|
251
|
+
var id = _ref5.id;
|
|
252
|
+
return id === layerId;
|
|
253
|
+
});
|
|
254
|
+
var bindedLayerCallbacks = layerCallbacks ? bindLayerCallbacks(layerCallbacks, layerIndex) : {};
|
|
255
|
+
var layer = layers[layerIndex];
|
|
256
|
+
var data = layerData[layerIndex];
|
|
257
|
+
var layerOverlay = renderDeckGlLayer({
|
|
258
|
+
datasets: datasets,
|
|
259
|
+
layer: layer,
|
|
260
|
+
layerIndex: layerIndex,
|
|
261
|
+
data: data,
|
|
262
|
+
hoverInfo: hoverInfo,
|
|
263
|
+
clicked: clicked,
|
|
264
|
+
mapState: mapState,
|
|
265
|
+
interactionConfig: interactionConfig,
|
|
266
|
+
animationConfig: animationConfig,
|
|
267
|
+
mapLayers: mapLayers
|
|
268
|
+
}, bindedLayerCallbacks);
|
|
269
|
+
return overlays.concat(layerOverlay || []);
|
|
270
|
+
}, []);
|
|
271
|
+
}
|
|
272
|
+
if (!primaryMap) {
|
|
273
|
+
return dataLayers;
|
|
274
|
+
}
|
|
275
|
+
if (mapStyle !== null && mapStyle !== void 0 && mapStyle.visibleLayerGroups['3d building'] && primaryMap && mapboxApiAccessToken && mapboxApiUrl) {
|
|
276
|
+
dataLayers.push(new _deckglLayers.ThreeDBuildingLayer({
|
|
277
|
+
id: '_keplergl_3d-building',
|
|
278
|
+
mapboxApiAccessToken: mapboxApiAccessToken,
|
|
279
|
+
mapboxApiUrl: mapboxApiUrl,
|
|
280
|
+
threeDBuildingColor: mapStyle.threeDBuildingColor,
|
|
281
|
+
updateTriggers: {
|
|
282
|
+
getFillColor: mapStyle.threeDBuildingColor
|
|
283
|
+
}
|
|
284
|
+
}));
|
|
285
|
+
}
|
|
286
|
+
var _getCustomDeckLayers = getCustomDeckLayers(deckGlProps),
|
|
287
|
+
_getCustomDeckLayers2 = (0, _slicedToArray2["default"])(_getCustomDeckLayers, 2),
|
|
288
|
+
customBottomDeckLayers = _getCustomDeckLayers2[0],
|
|
289
|
+
customTopDeckLayers = _getCustomDeckLayers2[1];
|
|
290
|
+
var editorLayer = [];
|
|
291
|
+
if (editorInfo) {
|
|
292
|
+
editorLayer.push((0, _layers.getEditorLayer)(_objectSpread({}, editorInfo)));
|
|
293
|
+
}
|
|
294
|
+
return [].concat((0, _toConsumableArray2["default"])(customBottomDeckLayers), (0, _toConsumableArray2["default"])(dataLayers), (0, _toConsumableArray2["default"])(customTopDeckLayers), editorLayer);
|
|
295
|
+
}
|
|
296
|
+
function getLayerOrderFromLayers(layers) {
|
|
297
|
+
return layers.map(function (_ref6) {
|
|
298
|
+
var id = _ref6.id;
|
|
299
|
+
return id;
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
function reorderLayerOrder(layerOrder, originLayerId, destinationLayerId) {
|
|
303
|
+
var activeIndex = layerOrder.indexOf(originLayerId);
|
|
304
|
+
var overIndex = layerOrder.indexOf(destinationLayerId);
|
|
305
|
+
return (0, _sortable.arrayMove)(layerOrder, activeIndex, overIndex);
|
|
306
|
+
}
|
|
307
|
+
function addLayerToLayerOrder(layerOrder, layerId) {
|
|
308
|
+
return [layerId].concat((0, _toConsumableArray2["default"])(layerOrder));
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc29sZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3NvcnRhYmxlIiwiX2NvbnN0YW50cyIsIl9sYXllcnMiLCJfdXRpbHMiLCJfZGVja2dsTGF5ZXJzIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJmaW5kRGVmYXVsdExheWVyIiwiZGF0YXNldCIsImxheWVyQ2xhc3NlcyIsImxheWVyUHJvcHMiLCJyZWR1Y2UiLCJwcmV2aW91cyIsImxjIiwicmVzdWx0IiwiZmluZERlZmF1bHRMYXllclByb3BzIiwicHJvcHMiLCJBcnJheSIsImlzQXJyYXkiLCJmb3VuZExheWVycyIsImNvbmNhdCIsIm1hcCIsInAiLCJ0eXBlIiwiZGF0YUlkIiwiaWQiLCJpc1Zpc2libGUiLCJsYXllciIsInNldEluaXRpYWxMYXllckNvbmZpZyIsImRhdGFDb250YWluZXIiLCJjYWxjdWxhdGVMYXllckRhdGEiLCJzdGF0ZSIsIm9sZExheWVyRGF0YSIsImxheWVyRGF0YSIsImlzVmFsaWQiLCJfb2xkRGF0YVVwZGF0ZVRyaWdnZXJzIiwidW5kZWZpbmVkIiwiaGFzQWxsQ29sdW1ucyIsImNvbmZpZyIsImZvcm1hdExheWVyRGF0YSIsImRhdGFzZXRzIiwidXBkYXRlTGF5ZXJDb25maWciLCJlcnJvck1lc3NhZ2UiLCJlcnIiLCJDb25zb2xlIiwiZXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJzdWJzdHJpbmciLCJnZXRMYXllckhvdmVyUHJvcCIsIl9yZWYiLCJhbmltYXRpb25Db25maWciLCJpbnRlcmFjdGlvbkNvbmZpZyIsImhvdmVySW5mbyIsImxheWVycyIsImxheWVyc1RvUmVuZGVyIiwidG9vbHRpcCIsImVuYWJsZWQiLCJwaWNrZWQiLCJvYmplY3QiLCJvdmVybGF5IiwiaWR4IiwiaW5kZXgiLCJnZXRIb3ZlckRhdGEiLCJfZGF0YXNldHMkZGF0YUlkIiwiZmllbGRzIiwiZGF0YSIsImZpZWxkc1RvU2hvdyIsImN1cnJlbnRUaW1lIiwicmVuZGVyRGVja0dsTGF5ZXIiLCJsYXllckNhbGxiYWNrcyIsImxheWVySW5kZXgiLCJjbGlja2VkIiwibWFwU3RhdGUiLCJtYXBMYXllcnMiLCJfcmVmMiIsImdwdUZpbHRlciIsIm9iamVjdEhvdmVyZWQiLCJ2aXNpYmxlIiwicmVuZGVyTGF5ZXIiLCJpc0xheWVyUmVuZGVyYWJsZSIsIkdFT0NPREVSX0xBWUVSX0lEIiwic2hvdWxkUmVuZGVyTGF5ZXIiLCJpc0xheWVyVmlzaWJsZSIsInByZXBhcmVMYXllcnNGb3JEZWNrIiwiYWNjdSIsIm92ZXJsYXlUeXBlIiwiT1ZFUkxBWV9UWVBFX0NPTlNUIiwiZGVja2dsIiwicHJlcGFyZUxheWVyc1RvUmVuZGVyIiwiZ2V0Q3VzdG9tRGVja0xheWVycyIsImRlY2tHbFByb3BzIiwiYm90dG9tRGVja0xheWVycyIsImlzRnVuY3Rpb24iLCJ0b3BEZWNrTGF5ZXJzIiwidG9wTGF5ZXJzIiwiYmluZExheWVyQ2FsbGJhY2tzIiwia2V5IiwidmFsIiwiY29tcHV0ZURlY2tMYXllcnMiLCJfcmVmMyIsIm9wdGlvbnMiLCJ2aXNTdGF0ZSIsIm1hcFN0eWxlIiwibGF5ZXJPcmRlciIsInNwbGl0TWFwcyIsIl9yZWY0IiwibWFwSW5kZXgiLCJtYXBib3hBcGlBY2Nlc3NUb2tlbiIsIm1hcGJveEFwaVVybCIsInByaW1hcnlNYXAiLCJsYXllcnNGb3JEZWNrIiwiZWRpdG9ySW5mbyIsImRhdGFMYXllcnMiLCJnZXRNYXBMYXllcnNGcm9tU3BsaXRNYXBzIiwiY3VycmVudExheWVyc0ZvckRlY2siLCJzbGljZSIsInJldmVyc2UiLCJvdmVybGF5cyIsImxheWVySWQiLCJmaW5kSW5kZXgiLCJfcmVmNSIsImJpbmRlZExheWVyQ2FsbGJhY2tzIiwibGF5ZXJPdmVybGF5IiwidmlzaWJsZUxheWVyR3JvdXBzIiwiVGhyZWVEQnVpbGRpbmdMYXllciIsInRocmVlREJ1aWxkaW5nQ29sb3IiLCJ1cGRhdGVUcmlnZ2VycyIsImdldEZpbGxDb2xvciIsIl9nZXRDdXN0b21EZWNrTGF5ZXJzIiwiX2dldEN1c3RvbURlY2tMYXllcnMyIiwiX3NsaWNlZFRvQXJyYXkyIiwiY3VzdG9tQm90dG9tRGVja0xheWVycyIsImN1c3RvbVRvcERlY2tMYXllcnMiLCJlZGl0b3JMYXllciIsImdldEVkaXRvckxheWVyIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsImdldExheWVyT3JkZXJGcm9tTGF5ZXJzIiwiX3JlZjYiLCJyZW9yZGVyTGF5ZXJPcmRlciIsIm9yaWdpbkxheWVySWQiLCJkZXN0aW5hdGlvbkxheWVySWQiLCJhY3RpdmVJbmRleCIsImluZGV4T2YiLCJvdmVySW5kZXgiLCJhcnJheU1vdmUiLCJhZGRMYXllclRvTGF5ZXJPcmRlciJdLCJzb3VyY2VzIjpbIi4uL3NyYy9sYXllci11dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgQ29uc29sZSBmcm9tICdnbG9iYWwvY29uc29sZSc7XG5cbmltcG9ydCB7YXJyYXlNb3ZlfSBmcm9tICdAZG5kLWtpdC9zb3J0YWJsZSc7XG5pbXBvcnQge0dFT0NPREVSX0xBWUVSX0lEfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge0xheWVyIGFzIERlY2tMYXllciwgTGF5ZXJQcm9wcyBhcyBEZWNrTGF5ZXJQcm9wc30gZnJvbSAnQGRlY2suZ2wvY29yZS90eXBlZCc7XG5pbXBvcnQge1xuICBGaWVsZCxcbiAgVG9vbHRpcEZpZWxkLFxuICBDb21wYXJlVHlwZSxcbiAgU3BsaXRNYXBMYXllcnMsXG4gIEVkaXRvcixcbiAgRmVhdHVyZSxcbiAgRmVhdHVyZVNlbGVjdGlvbkNvbnRleHQsXG4gIEJpbmRlZExheWVyQ2FsbGJhY2tzLFxuICBMYXllckNhbGxiYWNrcyxcbiAgVmlld3BvcnRcbn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge1xuICBGaW5kRGVmYXVsdExheWVyUHJvcHNSZXR1cm5WYWx1ZSxcbiAgTGF5ZXIsXG4gIExheWVyQ2xhc3Nlc1R5cGUsXG4gIE9WRVJMQVlfVFlQRV9DT05TVCxcbiAgZ2V0RWRpdG9yTGF5ZXJcbn0gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuXG5pbXBvcnQgS2VwbGVyVGFibGUgZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQge1Zpc1N0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuaW1wb3J0IHtpc0Z1bmN0aW9uLCBnZXRNYXBMYXllcnNGcm9tU3BsaXRNYXBzLCBEYXRhUm93fSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7VGhyZWVEQnVpbGRpbmdMYXllcn0gZnJvbSAnQGtlcGxlci5nbC9kZWNrZ2wtbGF5ZXJzJztcblxuZXhwb3J0IHR5cGUgTGF5ZXJzVG9SZW5kZXIgPSB7XG4gIFtsYXllcklkOiBzdHJpbmddOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25MYXllckhvdmVyRGF0YSA9IHtcbiAgcG9pbnRzOiBhbnlbXTtcbiAgY29sb3JWYWx1ZT86IGFueTtcbiAgZWxldmF0aW9uVmFsdWU/OiBhbnk7XG4gIGFnZ3JlZ2F0ZWREYXRhPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7XG4gICAgICBtZWFzdXJlOiBzdHJpbmc7XG4gICAgICB2YWx1ZT86IGFueTtcbiAgICB9XG4gID47XG59O1xuXG5leHBvcnQgdHlwZSBMYXllckhvdmVyUHJvcCA9IHtcbiAgZGF0YTogRGF0YVJvdyB8IEFnZ3JlZ2F0aW9uTGF5ZXJIb3ZlckRhdGEgfCBudWxsO1xuICBmaWVsZHM6IEZpZWxkW107XG4gIGZpZWxkc1RvU2hvdzogVG9vbHRpcEZpZWxkW107XG4gIGxheWVyOiBMYXllcjtcbiAgcHJpbWFyeURhdGE/OiBEYXRhUm93IHwgQWdncmVnYXRpb25MYXllckhvdmVyRGF0YSB8IG51bGw7XG4gIGNvbXBhcmVUeXBlPzogQ29tcGFyZVR5cGU7XG4gIGN1cnJlbnRUaW1lPzogVmlzU3RhdGVbJ2FuaW1hdGlvbkNvbmZpZyddWydjdXJyZW50VGltZSddO1xufTtcblxuLyoqXG4gKiBGaW5kIGRlZmF1bHQgbGF5ZXJzIGZyb20gZmllbGRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRGVmYXVsdExheWVyKGRhdGFzZXQ6IEtlcGxlclRhYmxlLCBsYXllckNsYXNzZXM6IExheWVyQ2xhc3Nlc1R5cGUpOiBMYXllcltdIHtcbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgbGF5ZXJQcm9wcyA9IChPYmplY3Qua2V5cyhsYXllckNsYXNzZXMpIGFzIEFycmF5PGtleW9mIExheWVyQ2xhc3Nlc1R5cGU+KS5yZWR1Y2UoXG4gICAgKHByZXZpb3VzLCBsYykgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0OiBGaW5kRGVmYXVsdExheWVyUHJvcHNSZXR1cm5WYWx1ZSA9XG4gICAgICAgIHR5cGVvZiBsYXllckNsYXNzZXNbbGNdLmZpbmREZWZhdWx0TGF5ZXJQcm9wcyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gbGF5ZXJDbGFzc2VzW2xjXS5maW5kRGVmYXVsdExheWVyUHJvcHMoZGF0YXNldCwgcHJldmlvdXMpXG4gICAgICAgICAgOiB7cHJvcHM6IFtdfTtcblxuICAgICAgY29uc3QgcHJvcHMgPSBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiByZXN1bHQucHJvcHMgfHwgW107XG4gICAgICBjb25zdCBmb3VuZExheWVycyA9IHJlc3VsdC5mb3VuZExheWVycyB8fCBwcmV2aW91cztcblxuICAgICAgcmV0dXJuIGZvdW5kTGF5ZXJzLmNvbmNhdChcbiAgICAgICAgcHJvcHMubWFwKHAgPT4gKHtcbiAgICAgICAgICAuLi5wLFxuICAgICAgICAgIHR5cGU6IGxjLFxuICAgICAgICAgIGRhdGFJZDogZGF0YXNldC5pZCxcbiAgICAgICAgICAvLyBzZXQgYXJjIGxheWVyIGluaXRpYWwgdmlzaWJsaXR5IHRvIGZhbHNlLCBiZWNhdXNlIGFyY3MgdGVuZCB0byBiZSB0b28gbXVzeVxuICAgICAgICAgIC4uLihsYyA9PT0gJ2FyYycgfHwgbGMgPT09ICdsaW5lJyA/IHtpc1Zpc2libGU6IGZhbHNlfSA6IHt9KVxuICAgICAgICB9KSlcbiAgICAgICk7XG4gICAgfSxcbiAgICBbXSBhcyAoTGF5ZXJDbGFzc2VzVHlwZVtrZXlvZiBMYXllckNsYXNzZXNUeXBlXSAmIHt0eXBlOiBzdHJpbmd9KVtdXG4gICk7XG5cbiAgLy8gZ28gdGhyb3VnaCBhbGwgbGF5ZXJQcm9wcyB0byBjcmVhdGUgbGF5ZXJcbiAgcmV0dXJuIGxheWVyUHJvcHMubWFwKHByb3BzID0+IHtcbiAgICBjb25zdCBsYXllciA9IG5ldyBsYXllckNsYXNzZXNbcHJvcHMudHlwZV0ocHJvcHMpO1xuICAgIHJldHVybiB0eXBlb2YgbGF5ZXIuc2V0SW5pdGlhbExheWVyQ29uZmlnID09PSAnZnVuY3Rpb24nICYmIGRhdGFzZXQuZGF0YUNvbnRhaW5lclxuICAgICAgPyBsYXllci5zZXRJbml0aWFsTGF5ZXJDb25maWcoZGF0YXNldClcbiAgICAgIDogbGF5ZXI7XG4gIH0pO1xufVxuXG50eXBlIE1pblZpc1N0YXRlRm9yTGF5ZXJEYXRhID0ge1xuICBkYXRhc2V0czogVmlzU3RhdGVbJ2RhdGFzZXRzJ107XG4gIGFuaW1hdGlvbkNvbmZpZzogVmlzU3RhdGVbJ2FuaW1hdGlvbkNvbmZpZyddO1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgbGF5ZXIgZGF0YSBiYXNlZCBvbiBsYXllciB0eXBlLCBjb2wgQ29uZmlnLFxuICogcmV0dXJuIHVwZGF0ZWQgbGF5ZXIgaWYgY29sb3JEb21haW4sIGRhdGFNYXAgaGFzIGNoYW5nZWQuXG4gKiBBbHNvLCByZXR1cm5zIHVwZGF0ZWQgbGF5ZXIgaW4gY2FzZSB0aGUgaW5wdXQgbGF5ZXIgd2FzIGluIGludmFsaWQgc3RhdGUuXG4gKiBBZGRzIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGxheWVyIGluIGNhc2Ugb2YgYW4gZXhjZXB0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlTGF5ZXJEYXRhPFMgZXh0ZW5kcyBNaW5WaXNTdGF0ZUZvckxheWVyRGF0YT4oXG4gIGxheWVyOiBMYXllcixcbiAgc3RhdGU6IFMsXG4gIG9sZExheWVyRGF0YT86IGFueVxuKToge1xuICBsYXllckRhdGE6IGFueTtcbiAgbGF5ZXI6IExheWVyO1xufSB7XG4gIGxldCBsYXllckRhdGE7XG4gIHRyeSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBsYXllciB1cGRhdGVzIGRhdGEgYWZ0ZXIgYW4gZXJyb3JcbiAgICBpZiAoIWxheWVyLmlzVmFsaWQpIHtcbiAgICAgIGxheWVyLl9vbGREYXRhVXBkYXRlVHJpZ2dlcnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFsYXllci50eXBlIHx8ICFsYXllci5oYXNBbGxDb2x1bW5zKCkgfHwgIWxheWVyLmNvbmZpZy5kYXRhSWQpIHtcbiAgICAgIHJldHVybiB7bGF5ZXIsIGxheWVyRGF0YToge319O1xuICAgIH1cblxuICAgIGxheWVyRGF0YSA9IGxheWVyLmZvcm1hdExheWVyRGF0YShzdGF0ZS5kYXRhc2V0cywgb2xkTGF5ZXJEYXRhKTtcblxuICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIGRhdGEgZm9yIHRoZSBsYXllciBpcyB1cGRhdGVkIHdpdGhvdXQgZXJyb3JzXG4gICAgaWYgKCFsYXllci5pc1ZhbGlkKSB7XG4gICAgICAvLyBTd2l0Y2ggdG8gdmlzaWJsZSBhZnRlciBhbiBlcnJvclxuICAgICAgbGF5ZXIgPSBsYXllci51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICAgIGlzVmlzaWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGxheWVyLmlzVmFsaWQgPSB0cnVlO1xuICAgIGxheWVyLmVycm9yTWVzc2FnZSA9IG51bGw7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIENvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICBsYXllciA9IGxheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgIGlzVmlzaWJsZTogZmFsc2VcbiAgICB9KTtcbiAgICBsYXllci5pc1ZhbGlkID0gZmFsc2U7XG5cbiAgICBsYXllci5lcnJvck1lc3NhZ2UgPVxuICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyLm1lc3NhZ2UgPyBlcnIubWVzc2FnZS5zdWJzdHJpbmcoMCwgMTAwKSA6ICdVbmtub3duIGVycm9yJztcblxuICAgIGxheWVyRGF0YSA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBsYXllcixcbiAgICBsYXllckRhdGFcbiAgfTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgcHJvcHMgcGFzc2VkIHRvIExheWVySG92ZXJJbmZvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXllckhvdmVyUHJvcCh7XG4gIGFuaW1hdGlvbkNvbmZpZyxcbiAgaW50ZXJhY3Rpb25Db25maWcsXG4gIGhvdmVySW5mbyxcbiAgbGF5ZXJzLFxuICBsYXllcnNUb1JlbmRlcixcbiAgZGF0YXNldHNcbn06IHtcbiAgaW50ZXJhY3Rpb25Db25maWc6IFZpc1N0YXRlWydpbnRlcmFjdGlvbkNvbmZpZyddO1xuICBhbmltYXRpb25Db25maWc6IFZpc1N0YXRlWydhbmltYXRpb25Db25maWcnXTtcbiAgaG92ZXJJbmZvOiBWaXNTdGF0ZVsnaG92ZXJJbmZvJ107XG4gIGxheWVyczogVmlzU3RhdGVbJ2xheWVycyddO1xuICBsYXllcnNUb1JlbmRlcjogTGF5ZXJzVG9SZW5kZXI7XG4gIGRhdGFzZXRzOiBWaXNTdGF0ZVsnZGF0YXNldHMnXTtcbn0pOiBMYXllckhvdmVyUHJvcCB8IG51bGwge1xuICBpZiAoaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcC5lbmFibGVkICYmIGhvdmVySW5mbyAmJiBob3ZlckluZm8ucGlja2VkKSB7XG4gICAgLy8gaWYgYW55dGhpbmcgaG92ZXJlZFxuICAgIGNvbnN0IHtvYmplY3QsIGxheWVyOiBvdmVybGF5fSA9IGhvdmVySW5mbztcblxuICAgIC8vIGRlY2tnbCBsYXllciB0byBrZXBsZXItZ2wgbGF5ZXJcbiAgICBjb25zdCBsYXllciA9IGxheWVyc1tvdmVybGF5LnByb3BzLmlkeF07XG5cbiAgICAvLyBOT1RFOiBmb3IgYmluYXJ5IGZvcm1hdCBHZW9qc29uTGF5ZXIsIGRlY2sgd2lsbCByZXR1cm4gb2JqZWN0PW51bGwgYnV0IGhvdmVySW5mby5pbmRleCA+PSAwXG4gICAgaWYgKFxuICAgICAgKG9iamVjdCB8fCBob3ZlckluZm8uaW5kZXggPj0gMCkgJiZcbiAgICAgIGxheWVyICYmXG4gICAgICBsYXllci5nZXRIb3ZlckRhdGEgJiZcbiAgICAgIGxheWVyc1RvUmVuZGVyW2xheWVyLmlkXVxuICAgICkge1xuICAgICAgLy8gaWYgbGF5ZXIgaXMgdmlzaWJsZSBhbmQgaGF2ZSBob3ZlcmVkIGRhdGFcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY29uZmlnOiB7ZGF0YUlkfVxuICAgICAgfSA9IGxheWVyO1xuICAgICAgaWYgKCFkYXRhSWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB7ZGF0YUNvbnRhaW5lciwgZmllbGRzfSA9IGRhdGFzZXRzW2RhdGFJZF07XG4gICAgICBjb25zdCBkYXRhOiBEYXRhUm93IHwgbnVsbCA9IGxheWVyLmdldEhvdmVyRGF0YShcbiAgICAgICAgb2JqZWN0IHx8IGhvdmVySW5mby5pbmRleCxcbiAgICAgICAgZGF0YUNvbnRhaW5lcixcbiAgICAgICAgZmllbGRzLFxuICAgICAgICBhbmltYXRpb25Db25maWcsXG4gICAgICAgIGhvdmVySW5mb1xuICAgICAgKTtcbiAgICAgIGlmICghZGF0YSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpZWxkc1RvU2hvdyA9IGludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAuY29uZmlnLmZpZWxkc1RvU2hvd1tkYXRhSWRdO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhLFxuICAgICAgICBmaWVsZHMsXG4gICAgICAgIGZpZWxkc1RvU2hvdyxcbiAgICAgICAgbGF5ZXIsXG4gICAgICAgIGN1cnJlbnRUaW1lOiBhbmltYXRpb25Db25maWcuY3VycmVudFRpbWVcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJEZWNrR2xMYXllcihwcm9wczogYW55LCBsYXllckNhbGxiYWNrczoge1trZXk6IHN0cmluZ106IGFueX0pIHtcbiAgY29uc3Qge1xuICAgIGRhdGFzZXRzLFxuICAgIGxheWVyLFxuICAgIGxheWVySW5kZXgsXG4gICAgZGF0YSxcbiAgICBob3ZlckluZm8sXG4gICAgY2xpY2tlZCxcbiAgICBtYXBTdGF0ZSxcbiAgICBpbnRlcmFjdGlvbkNvbmZpZyxcbiAgICBhbmltYXRpb25Db25maWcsXG4gICAgbWFwTGF5ZXJzXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgZGF0YXNldCA9IGRhdGFzZXRzW2xheWVyLmNvbmZpZy5kYXRhSWRdO1xuICBjb25zdCB7Z3B1RmlsdGVyfSA9IGRhdGFzZXQgfHwge307XG4gIGNvbnN0IG9iamVjdEhvdmVyZWQgPSBjbGlja2VkIHx8IGhvdmVySW5mbztcbiAgY29uc3QgdmlzaWJsZSA9ICFtYXBMYXllcnMgfHwgKG1hcExheWVycyAmJiBtYXBMYXllcnNbbGF5ZXIuaWRdKTtcbiAgLy8gTGF5ZXIgaXMgTGF5ZXIgY2xhc3NcbiAgcmV0dXJuIGxheWVyLnJlbmRlckxheWVyKHtcbiAgICBkYXRhLFxuICAgIGdwdUZpbHRlcixcbiAgICBpZHg6IGxheWVySW5kZXgsXG4gICAgaW50ZXJhY3Rpb25Db25maWcsXG4gICAgbGF5ZXJDYWxsYmFja3MsXG4gICAgbWFwU3RhdGUsXG4gICAgYW5pbWF0aW9uQ29uZmlnLFxuICAgIG9iamVjdEhvdmVyZWQsXG4gICAgdmlzaWJsZSxcbiAgICBkYXRhc2V0XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMYXllclJlbmRlcmFibGUobGF5ZXI6IExheWVyLCBsYXllckRhdGEpIHtcbiAgcmV0dXJuIGxheWVyLmlkICE9PSBHRU9DT0RFUl9MQVlFUl9JRCAmJiBsYXllci5zaG91bGRSZW5kZXJMYXllcihsYXllckRhdGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMYXllclZpc2libGUobGF5ZXIsIG1hcExheWVycykge1xuICByZXR1cm4gKFxuICAgIGxheWVyLmNvbmZpZy5pc1Zpc2libGUgJiZcbiAgICAvLyBpZiBsYXllci5pZCBpcyBub3QgaW4gbWFwTGF5ZXJzLCBkb24ndCByZW5kZXIgaXRcbiAgICAoIW1hcExheWVycyB8fCAobWFwTGF5ZXJzICYmIG1hcExheWVyc1tsYXllci5pZF0pKVxuICApO1xufVxuXG4vLyBQcmVwYXJlIGEgZGljdCBvZiBsYXllcnMgcmVuZGVyZWQgYnkgdGhlIGRlY2suZ2xcbi8vIE5vdGUsIGlzVmlzaWJsZTogZmFsc2UgbGF5ZXIgaXMgcGFzc2VkIHRvIGRlY2suZ2wgaGVyZVxuLy8gcmV0dXJuIHtbaWRdOiB0cnVlIFxcIGZhbHNlfVxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVMYXllcnNGb3JEZWNrKFxuICBsYXllcnM6IExheWVyW10sXG4gIGxheWVyRGF0YTogVmlzU3RhdGVbJ2xheWVyRGF0YSddXG4pOiB7XG4gIFtrZXk6IHN0cmluZ106IGJvb2xlYW47XG59IHtcbiAgcmV0dXJuIGxheWVycy5yZWR1Y2UoXG4gICAgKGFjY3UsIGxheWVyLCBpZHgpID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgW2xheWVyLmlkXTpcbiAgICAgICAgaXNMYXllclJlbmRlcmFibGUobGF5ZXIsIGxheWVyRGF0YVtpZHhdKSAmJiBsYXllci5vdmVybGF5VHlwZSA9PT0gT1ZFUkxBWV9UWVBFX0NPTlNULmRlY2tnbFxuICAgIH0pLFxuICAgIHt9XG4gICk7XG59XG5cbi8vIFByZXBhcmUgYSBkaWN0IG9mIHJlbmRlcmVkIGxheWVycyByZW5kZXJlZCBpbiB0aGUgbWFwXG4vLyBUaGlzIGluY2x1ZGVzIG9ubHkgdGhlIHZpc2liaWxlIGxheWVycyBmb3Igc2luZ2xlIG1hcCB2aWV3IGFuZCBzcGxpdCBtYXAgdmlld1xuLy8gcmV0dXJuIHtbaWRdOiB0cnVlIFxcIGZhbHNlfVxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVMYXllcnNUb1JlbmRlcihcbiAgbGF5ZXJzOiBMYXllcltdLFxuICBsYXllckRhdGE6IFZpc1N0YXRlWydsYXllckRhdGEnXSxcbiAgbWFwTGF5ZXJzPzogU3BsaXRNYXBMYXllcnMgfCB1bmRlZmluZWQgfCBudWxsXG4pOiBMYXllcnNUb1JlbmRlciB7XG4gIHJldHVybiBsYXllcnMucmVkdWNlKFxuICAgIChhY2N1LCBsYXllciwgaWR4KSA9PiAoe1xuICAgICAgLi4uYWNjdSxcbiAgICAgIFtsYXllci5pZF06IGlzTGF5ZXJSZW5kZXJhYmxlKGxheWVyLCBsYXllckRhdGFbaWR4XSkgJiYgaXNMYXllclZpc2libGUobGF5ZXIsIG1hcExheWVycylcbiAgICB9KSxcbiAgICB7fVxuICApO1xufVxuXG50eXBlIEN1c3RvbURlY2tMYXllciA9IERlY2tMYXllcjxEZWNrTGF5ZXJQcm9wcz47XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXN0b21EZWNrTGF5ZXJzKGRlY2tHbFByb3BzPzogYW55KTogW0N1c3RvbURlY2tMYXllcltdLCBDdXN0b21EZWNrTGF5ZXJbXV0ge1xuICBjb25zdCBib3R0b21EZWNrTGF5ZXJzID0gQXJyYXkuaXNBcnJheShkZWNrR2xQcm9wcz8ubGF5ZXJzKVxuICAgID8gZGVja0dsUHJvcHM/LmxheWVyc1xuICAgIDogaXNGdW5jdGlvbihkZWNrR2xQcm9wcz8ubGF5ZXJzKVxuICAgID8gZGVja0dsUHJvcHM/LmxheWVycygpXG4gICAgOiBbXTtcbiAgY29uc3QgdG9wRGVja0xheWVycyA9IEFycmF5LmlzQXJyYXkoZGVja0dsUHJvcHM/LnRvcExheWVycylcbiAgICA/IGRlY2tHbFByb3BzPy50b3BMYXllcnNcbiAgICA6IGlzRnVuY3Rpb24oZGVja0dsUHJvcHM/LnRvcExheWVycylcbiAgICA/IGRlY2tHbFByb3BzPy50b3BMYXllcnMoKVxuICAgIDogW107XG5cbiAgcmV0dXJuIFtib3R0b21EZWNrTGF5ZXJzLCB0b3BEZWNrTGF5ZXJzXTtcbn1cblxuZXhwb3J0IHR5cGUgQ29tcHV0ZURlY2tMYXllcnNQcm9wcyA9IHtcbiAgbWFwSW5kZXg/OiBudW1iZXI7XG4gIG1hcGJveEFwaUFjY2Vzc1Rva2VuPzogc3RyaW5nO1xuICBtYXBib3hBcGlVcmw/OiBzdHJpbmc7XG4gIHByaW1hcnlNYXA/OiBib29sZWFuO1xuICBsYXllcnNGb3JEZWNrPzoge1trZXk6IHN0cmluZ106IGJvb2xlYW59O1xuICBlZGl0b3JJbmZvPzoge1xuICAgIGVkaXRvcjogRWRpdG9yO1xuICAgIGVkaXRvck1lbnVBY3RpdmU6IGJvb2xlYW47XG4gICAgb25TZXRGZWF0dXJlczogKGZlYXR1cmVzOiBGZWF0dXJlW10pID0+IGFueTtcbiAgICBzZXRTZWxlY3RlZEZlYXR1cmU6IChcbiAgICAgIGZlYXR1cmU6IEZlYXR1cmUgfCBudWxsLFxuICAgICAgc2VsZWN0aW9uQ29udGV4dD86IEZlYXR1cmVTZWxlY3Rpb25Db250ZXh0XG4gICAgKSA9PiBhbnk7XG4gICAgZmVhdHVyZUNvbGxlY3Rpb246IHtcbiAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgIGZlYXR1cmVzOiBGZWF0dXJlW107XG4gICAgfTtcbiAgICBzZWxlY3RlZEZlYXR1cmVJbmRleGVzOiBudW1iZXJbXTtcbiAgICB2aWV3cG9ydDogVmlld3BvcnQ7XG4gIH07XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gYmluZExheWVyQ2FsbGJhY2tzKFxuICBsYXllckNhbGxiYWNrczogTGF5ZXJDYWxsYmFja3MgPSB7fSxcbiAgaWR4OiBudW1iZXJcbik6IEJpbmRlZExheWVyQ2FsbGJhY2tzIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGxheWVyQ2FsbGJhY2tzKS5yZWR1Y2UoXG4gICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICBba2V5XTogdmFsID0+IGxheWVyQ2FsbGJhY2tzW2tleV0oaWR4LCB2YWwpXG4gICAgfSksXG4gICAge30gYXMgUmVjb3JkPHN0cmluZywgKHZhbDogdW5rbm93bikgPT4gdm9pZD5cbiAgKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlRGVja0xheWVycyhcbiAge3Zpc1N0YXRlLCBtYXBTdGF0ZSwgbWFwU3R5bGV9OiBhbnksXG4gIG9wdGlvbnM/OiBDb21wdXRlRGVja0xheWVyc1Byb3BzLFxuICBsYXllckNhbGxiYWNrcz86IExheWVyQ2FsbGJhY2tzLFxuICBkZWNrR2xQcm9wcz86IGFueVxuKTogTGF5ZXJbXSB7XG4gIGNvbnN0IHtcbiAgICBkYXRhc2V0cyxcbiAgICBsYXllcnMsXG4gICAgbGF5ZXJPcmRlcixcbiAgICBsYXllckRhdGEsXG4gICAgaG92ZXJJbmZvLFxuICAgIGNsaWNrZWQsXG4gICAgaW50ZXJhY3Rpb25Db25maWcsXG4gICAgYW5pbWF0aW9uQ29uZmlnLFxuICAgIHNwbGl0TWFwc1xuICB9ID0gdmlzU3RhdGU7XG5cbiAgY29uc3Qge21hcEluZGV4LCBtYXBib3hBcGlBY2Nlc3NUb2tlbiwgbWFwYm94QXBpVXJsLCBwcmltYXJ5TWFwLCBsYXllcnNGb3JEZWNrLCBlZGl0b3JJbmZvfSA9XG4gICAgb3B0aW9ucyB8fCB7fTtcblxuICBsZXQgZGF0YUxheWVyczogYW55W10gPSBbXTtcblxuICBpZiAobGF5ZXJEYXRhICYmIGxheWVyRGF0YS5sZW5ndGgpIHtcbiAgICBjb25zdCBtYXBMYXllcnMgPSBnZXRNYXBMYXllcnNGcm9tU3BsaXRNYXBzKHNwbGl0TWFwcywgbWFwSW5kZXggfHwgMCk7XG5cbiAgICBjb25zdCBjdXJyZW50TGF5ZXJzRm9yRGVjayA9IGxheWVyc0ZvckRlY2sgfHwgcHJlcGFyZUxheWVyc0ZvckRlY2sobGF5ZXJzLCBsYXllckRhdGEpO1xuXG4gICAgZGF0YUxheWVycyA9IGxheWVyT3JkZXJcbiAgICAgIC5zbGljZSgpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZmlsdGVyKGlkID0+IGN1cnJlbnRMYXllcnNGb3JEZWNrW2lkXSlcbiAgICAgIC5yZWR1Y2UoKG92ZXJsYXlzLCBsYXllcklkKSA9PiB7XG4gICAgICAgIGNvbnN0IGxheWVySW5kZXggPSBsYXllcnMuZmluZEluZGV4KCh7aWR9KSA9PiBpZCA9PT0gbGF5ZXJJZCk7XG4gICAgICAgIGNvbnN0IGJpbmRlZExheWVyQ2FsbGJhY2tzID0gbGF5ZXJDYWxsYmFja3NcbiAgICAgICAgICA/IGJpbmRMYXllckNhbGxiYWNrcyhsYXllckNhbGxiYWNrcywgbGF5ZXJJbmRleClcbiAgICAgICAgICA6IHt9O1xuICAgICAgICBjb25zdCBsYXllciA9IGxheWVyc1tsYXllckluZGV4XTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGxheWVyRGF0YVtsYXllckluZGV4XTtcbiAgICAgICAgY29uc3QgbGF5ZXJPdmVybGF5ID0gcmVuZGVyRGVja0dsTGF5ZXIoXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGF0YXNldHMsXG4gICAgICAgICAgICBsYXllcixcbiAgICAgICAgICAgIGxheWVySW5kZXgsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgaG92ZXJJbmZvLFxuICAgICAgICAgICAgY2xpY2tlZCxcbiAgICAgICAgICAgIG1hcFN0YXRlLFxuICAgICAgICAgICAgaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICAgICAgICBhbmltYXRpb25Db25maWcsXG4gICAgICAgICAgICBtYXBMYXllcnNcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJpbmRlZExheWVyQ2FsbGJhY2tzXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBvdmVybGF5cy5jb25jYXQobGF5ZXJPdmVybGF5IHx8IFtdKTtcbiAgICAgIH0sIFtdKTtcbiAgfVxuXG4gIGlmICghcHJpbWFyeU1hcCkge1xuICAgIHJldHVybiBkYXRhTGF5ZXJzO1xuICB9XG5cbiAgaWYgKFxuICAgIG1hcFN0eWxlPy52aXNpYmxlTGF5ZXJHcm91cHNbJzNkIGJ1aWxkaW5nJ10gJiZcbiAgICBwcmltYXJ5TWFwICYmXG4gICAgbWFwYm94QXBpQWNjZXNzVG9rZW4gJiZcbiAgICBtYXBib3hBcGlVcmxcbiAgKSB7XG4gICAgZGF0YUxheWVycy5wdXNoKFxuICAgICAgbmV3IFRocmVlREJ1aWxkaW5nTGF5ZXIoe1xuICAgICAgICBpZDogJ19rZXBsZXJnbF8zZC1idWlsZGluZycsXG4gICAgICAgIG1hcGJveEFwaUFjY2Vzc1Rva2VuLFxuICAgICAgICBtYXBib3hBcGlVcmwsXG4gICAgICAgIHRocmVlREJ1aWxkaW5nQ29sb3I6IG1hcFN0eWxlLnRocmVlREJ1aWxkaW5nQ29sb3IsXG4gICAgICAgIHVwZGF0ZVRyaWdnZXJzOiB7XG4gICAgICAgICAgZ2V0RmlsbENvbG9yOiBtYXBTdHlsZS50aHJlZURCdWlsZGluZ0NvbG9yXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IFtjdXN0b21Cb3R0b21EZWNrTGF5ZXJzLCBjdXN0b21Ub3BEZWNrTGF5ZXJzXSA9IGdldEN1c3RvbURlY2tMYXllcnMoZGVja0dsUHJvcHMpO1xuXG4gIGNvbnN0IGVkaXRvckxheWVyOiBhbnlbXSA9IFtdO1xuICBpZiAoZWRpdG9ySW5mbykge1xuICAgIGVkaXRvckxheWVyLnB1c2goXG4gICAgICBnZXRFZGl0b3JMYXllcih7XG4gICAgICAgIC4uLmVkaXRvckluZm9cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBbLi4uY3VzdG9tQm90dG9tRGVja0xheWVycywgLi4uZGF0YUxheWVycywgLi4uY3VzdG9tVG9wRGVja0xheWVycywgLi4uZWRpdG9yTGF5ZXJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF5ZXJPcmRlckZyb21MYXllcnM8VCBleHRlbmRzIHtpZDogc3RyaW5nfT4obGF5ZXJzOiBUW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBsYXllcnMubWFwKCh7aWR9KSA9PiBpZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW9yZGVyTGF5ZXJPcmRlcihcbiAgbGF5ZXJPcmRlcjogVmlzU3RhdGVbJ2xheWVyT3JkZXInXSxcbiAgb3JpZ2luTGF5ZXJJZDogc3RyaW5nLFxuICBkZXN0aW5hdGlvbkxheWVySWQ6IHN0cmluZ1xuKTogVmlzU3RhdGVbJ2xheWVyT3JkZXInXSB7XG4gIGNvbnN0IGFjdGl2ZUluZGV4ID0gbGF5ZXJPcmRlci5pbmRleE9mKG9yaWdpbkxheWVySWQpO1xuICBjb25zdCBvdmVySW5kZXggPSBsYXllck9yZGVyLmluZGV4T2YoZGVzdGluYXRpb25MYXllcklkKTtcblxuICByZXR1cm4gYXJyYXlNb3ZlKGxheWVyT3JkZXIsIGFjdGl2ZUluZGV4LCBvdmVySW5kZXgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkTGF5ZXJUb0xheWVyT3JkZXIoXG4gIGxheWVyT3JkZXI6IFZpc1N0YXRlWydsYXllck9yZGVyJ10sXG4gIGxheWVySWQ6IHN0cmluZ1xuKTogc3RyaW5nW10ge1xuICByZXR1cm4gW2xheWVySWQsIC4uLmxheWVyT3JkZXJdO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLFFBQUEsR0FBQUMsc0JBQUEs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
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { MapStateActions, ReceiveMapConfigPayload, ActionTypes } from '@kepler.gl/actions';
|
|
2
|
+
import { MapState, Bounds, Viewport } from '@kepler.gl/types';
|
|
3
|
+
/**
|
|
4
|
+
* Default initial `mapState`
|
|
5
|
+
* @memberof mapStateUpdaters
|
|
6
|
+
* @constant
|
|
7
|
+
* @property pitch Default: `0`
|
|
8
|
+
* @property bearing Default: `0`
|
|
9
|
+
* @property latitude Default: `37.75043`
|
|
10
|
+
* @property longitude Default: `-122.34679`
|
|
11
|
+
* @property zoom Default: `9`
|
|
12
|
+
* @property dragRotate Default: `false`
|
|
13
|
+
* @property width Default: `800`
|
|
14
|
+
* @property height Default: `800`
|
|
15
|
+
* @property minZoom: `undefined`,
|
|
16
|
+
* @property maxZoom: `undefined`,
|
|
17
|
+
* @property maxBounds: `undefined`,
|
|
18
|
+
* @property isSplit: `false`,
|
|
19
|
+
* @property isViewportSynced: `true`,
|
|
20
|
+
* @property isZoomLocked: `false`,
|
|
21
|
+
* @property splitMapViewports: `[]`
|
|
22
|
+
* @public
|
|
23
|
+
*/
|
|
24
|
+
export declare const INITIAL_MAP_STATE: MapState;
|
|
25
|
+
/**
|
|
26
|
+
* Update map viewport
|
|
27
|
+
* @memberof mapStateUpdaters
|
|
28
|
+
* @public
|
|
29
|
+
*/
|
|
30
|
+
export declare const updateMapUpdater: (state: MapState, action: MapStateActions.UpdateMapUpdaterAction) => MapState;
|
|
31
|
+
/**
|
|
32
|
+
* Fit map viewport to bounds
|
|
33
|
+
* @memberof mapStateUpdaters
|
|
34
|
+
* @public
|
|
35
|
+
*/
|
|
36
|
+
export declare const fitBoundsUpdater: (state: MapState, action: MapStateActions.FitBoundsUpdaterAction) => MapState;
|
|
37
|
+
/**
|
|
38
|
+
* Toggle between 3d and 2d map.
|
|
39
|
+
* @memberof mapStateUpdaters
|
|
40
|
+
* @public
|
|
41
|
+
*/
|
|
42
|
+
export declare const togglePerspectiveUpdater: (state: MapState) => MapState;
|
|
43
|
+
/**
|
|
44
|
+
* reset mapState to initial State
|
|
45
|
+
* @memberof mapStateUpdaters
|
|
46
|
+
* @public
|
|
47
|
+
*/
|
|
48
|
+
export declare const resetMapConfigUpdater: (state: MapState) => MapState;
|
|
49
|
+
/**
|
|
50
|
+
* Update `mapState` to propagate a new config
|
|
51
|
+
* @memberof mapStateUpdaters
|
|
52
|
+
* @public
|
|
53
|
+
*/
|
|
54
|
+
export declare const receiveMapConfigUpdater: (state: MapState, { payload: { config, options, bounds } }: {
|
|
55
|
+
type?: typeof ActionTypes.RECEIVE_MAP_CONFIG;
|
|
56
|
+
payload: ReceiveMapConfigPayload;
|
|
57
|
+
}) => MapState;
|
|
58
|
+
/**
|
|
59
|
+
* Toggle between one or split maps
|
|
60
|
+
* @memberof mapStateUpdaters
|
|
61
|
+
* @public
|
|
62
|
+
*/
|
|
63
|
+
export declare const toggleSplitMapUpdater: (state: MapState) => MapState;
|
|
64
|
+
/**
|
|
65
|
+
* Toggle between locked and unlocked split viewports
|
|
66
|
+
* @memberof mapStateUpdaters
|
|
67
|
+
* @public
|
|
68
|
+
*/
|
|
69
|
+
export declare const toggleSplitMapViewportUpdater: (state: MapState, action: MapStateActions.ToggleSplitMapViewportUpdaterAction) => {
|
|
70
|
+
isViewportSynced: boolean;
|
|
71
|
+
isZoomLocked: boolean;
|
|
72
|
+
pitch: number;
|
|
73
|
+
bearing: number;
|
|
74
|
+
latitude: number;
|
|
75
|
+
longitude: number;
|
|
76
|
+
zoom: number;
|
|
77
|
+
dragRotate: boolean;
|
|
78
|
+
width: number;
|
|
79
|
+
height: number;
|
|
80
|
+
minZoom?: number | undefined;
|
|
81
|
+
maxZoom?: number | undefined;
|
|
82
|
+
maxBounds?: Bounds | undefined;
|
|
83
|
+
initialState?: any;
|
|
84
|
+
scale?: number | undefined;
|
|
85
|
+
isSplit: boolean;
|
|
86
|
+
splitMapViewports: Viewport[];
|
|
87
|
+
};
|
|
88
|
+
export declare function getMapDimForSplitMap(isSplit: any, state: any): {
|
|
89
|
+
width?: undefined;
|
|
90
|
+
} | {
|
|
91
|
+
width: number;
|
|
92
|
+
};
|
|
93
|
+
export declare function pickViewportPropsFromMapState(state: MapState): Viewport;
|