@kepler.gl/reducers 3.0.0 → 3.1.0-alpha.1

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.
Files changed (49) hide show
  1. package/package.json +26 -20
  2. package/dist/combined-updaters.d.ts +0 -79
  3. package/dist/combined-updaters.js +0 -423
  4. package/dist/composer-helpers.d.ts +0 -24
  5. package/dist/composer-helpers.js +0 -122
  6. package/dist/composers.d.ts +0 -18
  7. package/dist/composers.js +0 -27
  8. package/dist/core.d.ts +0 -64
  9. package/dist/core.js +0 -139
  10. package/dist/data-utils.d.ts +0 -8
  11. package/dist/data-utils.js +0 -42
  12. package/dist/export-utils.d.ts +0 -21
  13. package/dist/export-utils.js +0 -104
  14. package/dist/index.d.ts +0 -35
  15. package/dist/index.js +0 -373
  16. package/dist/interaction-utils.d.ts +0 -31
  17. package/dist/interaction-utils.js +0 -129
  18. package/dist/layer-utils.d.ts +0 -95
  19. package/dist/layer-utils.js +0 -344
  20. package/dist/map-state-updaters.d.ts +0 -93
  21. package/dist/map-state-updaters.js +0 -489
  22. package/dist/map-state.d.ts +0 -75
  23. package/dist/map-state.js +0 -47
  24. package/dist/map-style-updaters.d.ts +0 -186
  25. package/dist/map-style-updaters.js +0 -737
  26. package/dist/map-style.d.ts +0 -4
  27. package/dist/map-style.js +0 -46
  28. package/dist/merger-handler.d.ts +0 -10
  29. package/dist/merger-handler.js +0 -123
  30. package/dist/middleware.d.ts +0 -8
  31. package/dist/middleware.js +0 -30
  32. package/dist/provider-state-updaters.d.ts +0 -35
  33. package/dist/provider-state-updaters.js +0 -422
  34. package/dist/provider-state.d.ts +0 -4
  35. package/dist/provider-state.js +0 -46
  36. package/dist/root.d.ts +0 -24
  37. package/dist/root.js +0 -229
  38. package/dist/ui-state-updaters.d.ts +0 -362
  39. package/dist/ui-state-updaters.js +0 -871
  40. package/dist/ui-state.d.ts +0 -3
  41. package/dist/ui-state.js +0 -48
  42. package/dist/vis-state-merger.d.ts +0 -140
  43. package/dist/vis-state-merger.js +0 -915
  44. package/dist/vis-state-selectors.d.ts +0 -2
  45. package/dist/vis-state-selectors.js +0 -37
  46. package/dist/vis-state-updaters.d.ts +0 -545
  47. package/dist/vis-state-updaters.js +0 -3154
  48. package/dist/vis-state.d.ts +0 -211
  49. package/dist/vis-state.js +0 -46
@@ -1,871 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.togglePanelListViewUpdater = exports.setLocaleUpdater = exports.showDatasetTableUpdater = exports.toggleSplitMapUpdater = exports.loadFilesErrUpdater = exports.loadFilesSuccessUpdater = exports.loadFilesUpdater = exports.removeNotificationUpdater = exports.addNotificationUpdater = exports.setExportMapHTMLModeUpdater = exports.setExportMapFormatUpdater = exports.setUserMapboxAccessTokenUpdater = exports.setExportDataUpdater = exports.setExportFilteredUpdater = exports.setExportDataTypeUpdater = exports.setExportSelectedDatasetUpdater = exports.startExportingImageUpdater = exports.cleanupExportImageUpdater = exports.setExportImageErrorUpdater = exports.setExportImageDataUriUpdater = exports.setExportImageSettingUpdater = exports.openDeleteModalUpdater = exports.setMapControlVisibilityUpdater = exports.toggleMapControlUpdater = exports.toggleSidePanelCloseButtonUpdater = exports.hideExportDropdownUpdater = exports.showExportDropdownUpdater = exports.toggleModalUpdater = exports.toggleSidePanelUpdater = exports.initUiStateUpdater = exports.INITIAL_UI_STATE = exports.DEFAULT_EXPORT_MAP = exports.DEFAULT_EXPORT_JSON = exports.DEFAULT_EXPORT_HTML = exports.DEFAULT_NOTIFICATIONS = exports.DEFAULT_EXPORT_DATA = exports.DEFAULT_LOAD_FILES = exports.DEFAULT_EXPORT_IMAGE = exports.DEFAULT_MAP_CONTROLS = exports.DEFAULT_MODAL = exports.DEFAULT_ACTIVE_SIDE_PANEL = void 0;
9
-
10
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
-
12
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
-
14
- var _constants = require("@kepler.gl/constants");
15
-
16
- var _localization = require("@kepler.gl/localization");
17
-
18
- var _utils = require("@kepler.gl/utils");
19
-
20
- var _composerHelpers = require("./composer-helpers");
21
-
22
- var _DEFAULT_EXPORT_MAP;
23
-
24
- 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; }
25
-
26
- 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; }
27
-
28
- var DEFAULT_ACTIVE_SIDE_PANEL = 'layer';
29
- exports.DEFAULT_ACTIVE_SIDE_PANEL = DEFAULT_ACTIVE_SIDE_PANEL;
30
- var DEFAULT_MODAL = _constants.ADD_DATA_ID;
31
- /**
32
- * Updaters for `uiState` reducer. Can be used in your root reducer to directly modify kepler.gl's state.
33
- * Read more about [Using updaters](../advanced-usage/using-updaters.md)
34
- *
35
- * @public
36
- * @example
37
- *
38
- * import keplerGlReducer, {uiStateUpdaters} from 'kepler.gl/reducers';
39
- * // Root Reducer
40
- * const reducers = combineReducers({
41
- * keplerGl: keplerGlReducer,
42
- * app: appReducer
43
- * });
44
- *
45
- * const composedReducer = (state, action) => {
46
- * switch (action.type) {
47
- * // click button to close side panel
48
- * case 'CLICK_BUTTON':
49
- * return {
50
- * ...state,
51
- * keplerGl: {
52
- * ...state.keplerGl,
53
- * foo: {
54
- * ...state.keplerGl.foo,
55
- * uiState: uiStateUpdaters.toggleSidePanelUpdater(
56
- * uiState, {payload: null}
57
- * )
58
- * }
59
- * }
60
- * };
61
- * }
62
- * return reducers(state, action);
63
- * };
64
- *
65
- * export default composedReducer;
66
- */
67
-
68
- /* eslint-disable no-unused-vars */
69
- // @ts-ignore
70
-
71
- exports.DEFAULT_MODAL = DEFAULT_MODAL;
72
- var uiStateUpdaters = null;
73
- /* eslint-enable no-unused-vars */
74
-
75
- var DEFAULT_MAP_CONTROLS_FEATURES = {
76
- show: true,
77
- active: false,
78
- disableClose: false,
79
- // defines which map index users are interacting with (through map controls)
80
- activeMapIndex: 0
81
- };
82
- /**
83
- * A list of map control visibility and whether is it active.
84
- * @memberof uiStateUpdaters
85
- * @constant
86
- * @property visibleLayers Default: `{show: true, active: false}`
87
- * @property mapLegend Default: `{show: true, active: false}`
88
- * @property toggle3d Default: `{show: true}`
89
- * @property splitMap Default: `{show: true}`
90
- * @property mapDraw Default: `{show: true, active: false}`
91
- * @property mapLocale Default: `{show: false, active: false}`
92
- * @public
93
- */
94
-
95
- var DEFAULT_MAP_CONTROLS = Object.keys(_constants.MAP_CONTROLS).reduce(function (_final, current) {
96
- return _objectSpread(_objectSpread({}, _final), {}, (0, _defineProperty2["default"])({}, current, DEFAULT_MAP_CONTROLS_FEATURES));
97
- }, {});
98
- /**
99
- * Default image export config
100
- * @memberof uiStateUpdaters
101
- * @constant
102
- * @property ratio Default: `'SCREEN'`,
103
- * @property resolution Default: `'ONE_X'`,
104
- * @property legend Default: `false`,
105
- * @property mapH Default: 0,
106
- * @property mapW Default: 0,
107
- * @property imageSize Default: {zoomOffset: 0, scale: 1, imageW: 0, imageH: 0},
108
- * @property imageDataUri Default: `''`,
109
- * @property exporting Default: `false`
110
- * @property error Default: `false`
111
- * @property escapeXhtmlForWebpack Default: `true`
112
- * @public
113
- */
114
-
115
- exports.DEFAULT_MAP_CONTROLS = DEFAULT_MAP_CONTROLS;
116
- var DEFAULT_EXPORT_IMAGE = {
117
- // user options
118
- ratio: _constants.EXPORT_IMG_RATIOS.SCREEN,
119
- resolution: _constants.RESOLUTIONS.ONE_X,
120
- legend: false,
121
- mapH: 0,
122
- mapW: 0,
123
- imageSize: {
124
- zoomOffset: 0,
125
- scale: 1,
126
- imageW: 0,
127
- imageH: 0
128
- },
129
- // when this is set to true, the mock map viewport will move to the center of data
130
- center: false,
131
- // exporting state
132
- imageDataUri: '',
133
- // exporting: used to attach plot-container to dom
134
- exporting: false,
135
- // processing: used as loading indicator when export image is being produced
136
- processing: false,
137
- error: false,
138
- // whether to apply fix for uglify error in dom-to-image (should be true for webpack builds)
139
- escapeXhtmlForWebpack: true
140
- };
141
- exports.DEFAULT_EXPORT_IMAGE = DEFAULT_EXPORT_IMAGE;
142
- var DEFAULT_LOAD_FILES = {
143
- fileLoading: false
144
- };
145
- /**
146
- * Default initial `exportData` settings
147
- * @memberof uiStateUpdaters
148
- * @constant
149
- * @property selectedDataset Default: `''`,
150
- * @property dataType Default: `'csv'`,
151
- * @property filtered Default: `true`,
152
- * @public
153
- */
154
-
155
- exports.DEFAULT_LOAD_FILES = DEFAULT_LOAD_FILES;
156
- var DEFAULT_EXPORT_DATA = {
157
- selectedDataset: '',
158
- dataType: _constants.EXPORT_DATA_TYPE.CSV,
159
- filtered: true
160
- };
161
- /**
162
- * @constant
163
- */
164
-
165
- exports.DEFAULT_EXPORT_DATA = DEFAULT_EXPORT_DATA;
166
- var DEFAULT_NOTIFICATIONS = [];
167
- /**
168
- * @constant
169
- * @property exportMapboxAccessToken - Default: null, this is used when we provide a default mapbox token for users to take advantage of
170
- * @property userMapboxToken - Default: '', mapbox token provided by user through input field
171
- * @property mode - Default: 'READ', read only or editable
172
- * @public
173
- */
174
-
175
- exports.DEFAULT_NOTIFICATIONS = DEFAULT_NOTIFICATIONS;
176
- var DEFAULT_EXPORT_HTML = {
177
- exportMapboxAccessToken: null,
178
- userMapboxToken: '',
179
- mode: _constants.EXPORT_HTML_MAP_MODES.READ
180
- };
181
- /**
182
- * @constant
183
- * @property hasData - Default: 'true',
184
- * @public
185
- */
186
-
187
- exports.DEFAULT_EXPORT_HTML = DEFAULT_EXPORT_HTML;
188
- var DEFAULT_EXPORT_JSON = {
189
- hasData: true
190
- };
191
- /**
192
- * Export Map Config
193
- * @constant
194
- * @property HTML - Default: 'DEFAULT_EXPORT_HTML',
195
- * @property JSON - Default: 'DEFAULT_EXPORT_JSON',
196
- * @property format - Default: 'HTML',
197
- * @public
198
- */
199
-
200
- exports.DEFAULT_EXPORT_JSON = DEFAULT_EXPORT_JSON;
201
- var DEFAULT_EXPORT_MAP = (_DEFAULT_EXPORT_MAP = {}, (0, _defineProperty2["default"])(_DEFAULT_EXPORT_MAP, _constants.EXPORT_MAP_FORMATS.HTML, DEFAULT_EXPORT_HTML), (0, _defineProperty2["default"])(_DEFAULT_EXPORT_MAP, _constants.EXPORT_MAP_FORMATS.JSON, DEFAULT_EXPORT_JSON), (0, _defineProperty2["default"])(_DEFAULT_EXPORT_MAP, "format", _constants.EXPORT_MAP_FORMATS.HTML), _DEFAULT_EXPORT_MAP);
202
- /**
203
- * Default initial `uiState`
204
- * @memberof uiStateUpdaters
205
- * @constant
206
- * @property readOnly Default: `false`
207
- * @property activeSidePanel Default: `'layer'`
208
- * @property currentModal Default: `'addData'`
209
- * @property datasetKeyToRemove Default: `null`
210
- * @property visibleDropdown Default: `null`
211
- * @property exportImage Default: [`DEFAULT_EXPORT_IMAGE`](#default_export_image)
212
- * @property exportData Default: [`DEFAULT_EXPORT_DATA`](#default_export_data)
213
- * @property exportMap Default: [`DEFAULT_EXPORT_MAP`](#default_export_map)
214
- * @property mapControls Default: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
215
- * @property notifications Default: `[]`
216
- * @property notifications Default: `[]`
217
- * @property loadFiles
218
- * @property isSidePanelCloseButtonVisible Default: `true`
219
- * @public
220
- */
221
-
222
- exports.DEFAULT_EXPORT_MAP = DEFAULT_EXPORT_MAP;
223
- var INITIAL_UI_STATE = {
224
- readOnly: false,
225
- activeSidePanel: DEFAULT_ACTIVE_SIDE_PANEL,
226
- currentModal: DEFAULT_MODAL,
227
- datasetKeyToRemove: null,
228
- visibleDropdown: null,
229
- // export image modal ui
230
- exportImage: DEFAULT_EXPORT_IMAGE,
231
- // export data modal ui
232
- exportData: DEFAULT_EXPORT_DATA,
233
- // html export
234
- exportMap: DEFAULT_EXPORT_MAP,
235
- // map control panels
236
- mapControls: DEFAULT_MAP_CONTROLS,
237
- // ui notifications
238
- notifications: DEFAULT_NOTIFICATIONS,
239
- // load files
240
- loadFiles: DEFAULT_LOAD_FILES,
241
- // Locale of the UI
242
- locale: _localization.LOCALE_CODES.en,
243
- layerPanelListView: 'list',
244
- filterPanelListView: 'list',
245
- isSidePanelCloseButtonVisible: true
246
- };
247
- /* Updaters */
248
-
249
- /**
250
- * @memberof uiStateUpdaters
251
- */
252
-
253
- exports.INITIAL_UI_STATE = INITIAL_UI_STATE;
254
-
255
- var initUiStateUpdater = function initUiStateUpdater(state, action) {
256
- return _objectSpread(_objectSpread({}, state), (action.payload || {}).initialUiState);
257
- };
258
- /**
259
- * Toggle active side panel
260
- * @memberof uiStateUpdaters
261
- * @param state `uiState`
262
- * @param action
263
- * @param action.payload id of side panel to be shown, one of `layer`, `filter`, `interaction`, `map`. close side panel if `null`
264
- * @returns nextState
265
- * @public
266
- */
267
-
268
-
269
- exports.initUiStateUpdater = initUiStateUpdater;
270
-
271
- var toggleSidePanelUpdater = function toggleSidePanelUpdater(state, _ref) {
272
- var id = _ref.payload;
273
- return id === state.activeSidePanel ? state : _objectSpread(_objectSpread({}, state), {}, {
274
- activeSidePanel: id
275
- });
276
- };
277
- /**
278
- * Show and hide modal dialog
279
- * @memberof uiStateUpdaters
280
- * @param state `uiState`
281
- * @param action
282
- * @paramaction.payload id of modal to be shown, null to hide modals. One of:
283
- * - [`DATA_TABLE_ID`](../constants/default-settings.md#data_table_id)
284
- * - [`DELETE_DATA_ID`](../constants/default-settings.md#delete_data_id)
285
- * - [`ADD_DATA_ID`](../constants/default-settings.md#add_data_id)
286
- * - [`EXPORT_IMAGE_ID`](../constants/default-settings.md#export_image_id)
287
- * - [`EXPORT_DATA_ID`](../constants/default-settings.md#export_data_id)
288
- * - [`ADD_MAP_STYLE_ID`](../constants/default-settings.md#add_map_style_id)
289
- * @returns nextState
290
- * @public
291
- */
292
-
293
-
294
- exports.toggleSidePanelUpdater = toggleSidePanelUpdater;
295
-
296
- var toggleModalUpdater = function toggleModalUpdater(state, _ref2) {
297
- var id = _ref2.payload;
298
- return _objectSpread(_objectSpread({}, state), {}, {
299
- currentModal: id
300
- });
301
- };
302
- /**
303
- * Hide and show side panel header dropdown, activated by clicking the share link on top of the side panel
304
- * @memberof uiStateUpdaters
305
- * @public
306
- */
307
-
308
-
309
- exports.toggleModalUpdater = toggleModalUpdater;
310
-
311
- var showExportDropdownUpdater = function showExportDropdownUpdater(state, _ref3) {
312
- var id = _ref3.payload;
313
- return _objectSpread(_objectSpread({}, state), {}, {
314
- visibleDropdown: id
315
- });
316
- };
317
- /**
318
- * Hide side panel header dropdown, activated by clicking the share link on top of the side panel
319
- * @memberof uiStateUpdaters
320
- * @public
321
- */
322
-
323
-
324
- exports.showExportDropdownUpdater = showExportDropdownUpdater;
325
-
326
- var hideExportDropdownUpdater = function hideExportDropdownUpdater(state) {
327
- return _objectSpread(_objectSpread({}, state), {}, {
328
- visibleDropdown: null
329
- });
330
- };
331
- /**
332
- * Toggle side panel close button on top left of the side panel
333
- * @memberof uiStateUpdaters
334
- * @public
335
- */
336
-
337
-
338
- exports.hideExportDropdownUpdater = hideExportDropdownUpdater;
339
-
340
- var toggleSidePanelCloseButtonUpdater = function toggleSidePanelCloseButtonUpdater(state, _ref4) {
341
- var show = _ref4.payload.show;
342
- return _objectSpread(_objectSpread({}, state), {}, {
343
- isSidePanelCloseButtonVisible: show
344
- });
345
- };
346
- /**
347
- * Toggle active map control panel
348
- * @memberof uiStateUpdaters
349
- * @param state `uiState`
350
- * @param action action
351
- * @param action.payload map control panel id, one of the keys of: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
352
- * @returns nextState
353
- * @public
354
- */
355
-
356
-
357
- exports.toggleSidePanelCloseButtonUpdater = toggleSidePanelCloseButtonUpdater;
358
-
359
- var toggleMapControlUpdater = function toggleMapControlUpdater(state, _ref5) {
360
- var _ref5$payload = _ref5.payload,
361
- panelId = _ref5$payload.panelId,
362
- _ref5$payload$index = _ref5$payload.index,
363
- index = _ref5$payload$index === void 0 ? 0 : _ref5$payload$index;
364
- return _objectSpread(_objectSpread({}, state), {}, {
365
- mapControls: _objectSpread(_objectSpread({}, state.mapControls), {}, (0, _defineProperty2["default"])({}, panelId, _objectSpread(_objectSpread({}, state.mapControls[panelId]), {}, {
366
- active: !state.mapControls[panelId].active,
367
- activeMapIndex: index
368
- })))
369
- });
370
- };
371
- /**
372
- * Toggle map control visibility
373
- * @memberof uiStateUpdaters
374
- * @param state `uiState`
375
- * @param action action
376
- * @param action.payload map control panel id, one of the keys of: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
377
- * @returns nextState
378
- * @public
379
- */
380
-
381
-
382
- exports.toggleMapControlUpdater = toggleMapControlUpdater;
383
-
384
- var setMapControlVisibilityUpdater = function setMapControlVisibilityUpdater(state, _ref6) {
385
- var _state$mapControls;
386
-
387
- var _ref6$payload = _ref6.payload,
388
- panelId = _ref6$payload.panelId,
389
- show = _ref6$payload.show;
390
-
391
- if (!((_state$mapControls = state.mapControls) !== null && _state$mapControls !== void 0 && _state$mapControls[panelId])) {
392
- return state;
393
- }
394
-
395
- return _objectSpread(_objectSpread({}, state), {}, {
396
- mapControls: _objectSpread(_objectSpread({}, state.mapControls), {}, (0, _defineProperty2["default"])({}, panelId, _objectSpread(_objectSpread({}, state.mapControls[panelId]), {}, {
397
- show: Boolean(show)
398
- })))
399
- });
400
- };
401
- /**
402
- * Toggle active map control panel
403
- * @memberof uiStateUpdaters
404
- * @param state `uiState`
405
- * @param action
406
- * @param action.payload dataset id
407
- * @returns nextState
408
- * @public
409
- */
410
-
411
-
412
- exports.setMapControlVisibilityUpdater = setMapControlVisibilityUpdater;
413
-
414
- var openDeleteModalUpdater = function openDeleteModalUpdater(state, _ref7) {
415
- var datasetKeyToRemove = _ref7.payload;
416
- return _objectSpread(_objectSpread({}, state), {}, {
417
- currentModal: _constants.DELETE_DATA_ID,
418
- datasetKeyToRemove: datasetKeyToRemove
419
- });
420
- };
421
- /**
422
- * Set `exportImage.legend` to `true` or `false`
423
- * @memberof uiStateUpdaters
424
- * @param state `uiState`
425
- * @returns nextState
426
- * @public
427
- */
428
-
429
-
430
- exports.openDeleteModalUpdater = openDeleteModalUpdater;
431
-
432
- var setExportImageSettingUpdater = function setExportImageSettingUpdater(state, _ref8) {
433
- var newSetting = _ref8.payload;
434
-
435
- var updated = _objectSpread(_objectSpread({}, state.exportImage), newSetting);
436
-
437
- var imageSize = (0, _utils.calculateExportImageSize)(updated) || state.exportImage.imageSize;
438
- return _objectSpread(_objectSpread({}, state), {}, {
439
- exportImage: _objectSpread(_objectSpread({}, updated), {}, {
440
- // @ts-expect-error
441
- // TODO: calculateExportImageSize does not return imageSize.zoomOffset,
442
- // do we need take this value from current state, or return defaul value = 0
443
- imageSize: imageSize
444
- })
445
- });
446
- };
447
- /**
448
- * Set `exportImage.setExportImageDataUri` to a image dataUri
449
- * @memberof uiStateUpdaters
450
- * @param state `uiState`
451
- * @param action
452
- * @param action.payload export image data uri
453
- * @returns nextState
454
- * @public
455
- */
456
-
457
-
458
- exports.setExportImageSettingUpdater = setExportImageSettingUpdater;
459
-
460
- var setExportImageDataUriUpdater = function setExportImageDataUriUpdater(state, _ref9) {
461
- var dataUri = _ref9.payload;
462
- return _objectSpread(_objectSpread({}, state), {}, {
463
- exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
464
- processing: false,
465
- imageDataUri: dataUri
466
- })
467
- });
468
- };
469
- /**
470
- * @memberof uiStateUpdaters
471
- * @public
472
- */
473
-
474
-
475
- exports.setExportImageDataUriUpdater = setExportImageDataUriUpdater;
476
-
477
- var setExportImageErrorUpdater = function setExportImageErrorUpdater(state, _ref10) {
478
- var error = _ref10.payload;
479
- return _objectSpread(_objectSpread({}, state), {}, {
480
- exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
481
- processing: false,
482
- error: error
483
- })
484
- });
485
- };
486
- /**
487
- * Delete cached export image
488
- * @memberof uiStateUpdaters
489
- * @public
490
- */
491
-
492
-
493
- exports.setExportImageErrorUpdater = setExportImageErrorUpdater;
494
-
495
- var cleanupExportImageUpdater = function cleanupExportImageUpdater(state) {
496
- return _objectSpread(_objectSpread({}, state), {}, {
497
- exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
498
- exporting: false,
499
- imageDataUri: '',
500
- error: false,
501
- processing: false,
502
- center: false
503
- })
504
- });
505
- };
506
- /**
507
- * Start image exporting flow
508
- * @memberof uiStateUpdaters
509
- * @param state
510
- * @param options
511
- * @returns {UiState}
512
- * @public
513
- */
514
-
515
-
516
- exports.cleanupExportImageUpdater = cleanupExportImageUpdater;
517
-
518
- var startExportingImageUpdater = function startExportingImageUpdater(state, _ref11) {
519
- var _ref11$payload = _ref11.payload,
520
- options = _ref11$payload === void 0 ? {} : _ref11$payload;
521
-
522
- var imageSettings = _objectSpread(_objectSpread({}, options), {}, {
523
- exporting: true
524
- });
525
-
526
- return (0, _composerHelpers.compose_)([cleanupExportImageUpdater, (0, _composerHelpers.apply_)(setExportImageSettingUpdater, (0, _composerHelpers.payload_)(imageSettings))])(state);
527
- };
528
- /**
529
- * Set selected dataset for export
530
- * @memberof uiStateUpdaters
531
- * @param state `uiState`
532
- * @param action
533
- * @param action.payload dataset id
534
- * @returns nextState
535
- * @public
536
- */
537
-
538
-
539
- exports.startExportingImageUpdater = startExportingImageUpdater;
540
-
541
- var setExportSelectedDatasetUpdater = function setExportSelectedDatasetUpdater(state, _ref12) {
542
- var dataset = _ref12.payload;
543
- return _objectSpread(_objectSpread({}, state), {}, {
544
- exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
545
- selectedDataset: dataset
546
- })
547
- });
548
- };
549
- /**
550
- * Set data format for exporting data
551
- * @memberof uiStateUpdaters
552
- * @param state `uiState`
553
- * @param action
554
- * @param action.payload one of `'text/csv'`
555
- * @returns nextState
556
- * @public
557
- */
558
-
559
-
560
- exports.setExportSelectedDatasetUpdater = setExportSelectedDatasetUpdater;
561
-
562
- var setExportDataTypeUpdater = function setExportDataTypeUpdater(state, _ref13) {
563
- var dataType = _ref13.payload;
564
- return _objectSpread(_objectSpread({}, state), {}, {
565
- exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
566
- dataType: dataType
567
- })
568
- });
569
- };
570
- /**
571
- * Whether to export filtered data, `true` or `false`
572
- * @memberof uiStateUpdaters
573
- * @param state `uiState`
574
- * @param action
575
- * @param action.payload
576
- * @returns nextState
577
- * @public
578
- */
579
-
580
-
581
- exports.setExportDataTypeUpdater = setExportDataTypeUpdater;
582
-
583
- var setExportFilteredUpdater = function setExportFilteredUpdater(state, _ref14) {
584
- var filtered = _ref14.payload;
585
- return _objectSpread(_objectSpread({}, state), {}, {
586
- exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
587
- filtered: filtered
588
- })
589
- });
590
- };
591
- /**
592
- * Whether to including data in map config, toggle between `true` or `false`
593
- * @memberof uiStateUpdaters
594
- * @param state `uiState`
595
- * @returns nextState
596
- * @public
597
- */
598
-
599
-
600
- exports.setExportFilteredUpdater = setExportFilteredUpdater;
601
-
602
- var setExportDataUpdater = function setExportDataUpdater(state) {
603
- return _objectSpread(_objectSpread({}, state), {}, {
604
- exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.JSON, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.JSON]), {}, {
605
- hasData: !state.exportMap[_constants.EXPORT_MAP_FORMATS.JSON].hasData
606
- })))
607
- });
608
- };
609
- /**
610
- * whether to export a mapbox access to HTML single page
611
- * @param state - `uiState`
612
- * @param action
613
- * @param action.payload
614
- * @returns nextState
615
- * @public
616
- */
617
-
618
-
619
- exports.setExportDataUpdater = setExportDataUpdater;
620
-
621
- var setUserMapboxAccessTokenUpdater = function setUserMapboxAccessTokenUpdater(state, _ref15) {
622
- var userMapboxToken = _ref15.payload;
623
- return _objectSpread(_objectSpread({}, state), {}, {
624
- exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.HTML, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.HTML]), {}, {
625
- userMapboxToken: userMapboxToken
626
- })))
627
- });
628
- };
629
- /**
630
- * Sets the export map format
631
- * @param state - `uiState`
632
- * @param action
633
- * @param action.payload format to use to export the map into
634
- * @return nextState
635
- */
636
-
637
-
638
- exports.setUserMapboxAccessTokenUpdater = setUserMapboxAccessTokenUpdater;
639
-
640
- var setExportMapFormatUpdater = function setExportMapFormatUpdater(state, _ref16) {
641
- var format = _ref16.payload;
642
- return _objectSpread(_objectSpread({}, state), {}, {
643
- exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, {
644
- // @ts-expect-error
645
- format: format
646
- })
647
- });
648
- };
649
- /**
650
- * Set the export html map mode
651
- * @param state - `uiState`
652
- * @param action
653
- * @param action.payload to be set (available modes: EXPORT_HTML_MAP_MODES)
654
- * @return nextState
655
- */
656
-
657
-
658
- exports.setExportMapFormatUpdater = setExportMapFormatUpdater;
659
-
660
- var setExportMapHTMLModeUpdater = function setExportMapHTMLModeUpdater(state, _ref17) {
661
- var mode = _ref17.payload;
662
- return _objectSpread(_objectSpread({}, state), {}, {
663
- exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.HTML, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.HTML]), {}, {
664
- mode: mode
665
- })))
666
- });
667
- };
668
- /**
669
- * Adds a new notification.
670
- * Updates a notification in case of matching ids.
671
- * @memberof uiStateUpdaters
672
- * @param state `uiState`
673
- * @param action
674
- * @param action.payload Params of a notification
675
- * @returns nextState
676
- * @public
677
- */
678
-
679
-
680
- exports.setExportMapHTMLModeUpdater = setExportMapHTMLModeUpdater;
681
-
682
- var addNotificationUpdater = function addNotificationUpdater(state, _ref18) {
683
- var payload = _ref18.payload;
684
- var oldNotifications = state.notifications || []; // @ts-expect-error
685
-
686
- var payloadId = payload === null || payload === void 0 ? void 0 : payload.id;
687
- var notificationToUpdate = payloadId ? oldNotifications.find(function (n) {
688
- return n.id === payloadId;
689
- }) : null;
690
- var notifications;
691
-
692
- if (notificationToUpdate) {
693
- notifications = oldNotifications.map(function (n) {
694
- return n.id === payloadId ? (0, _utils.createNotification)(_objectSpread(_objectSpread({}, payload), {}, {
695
- count: n.count + 1
696
- })) : n;
697
- });
698
- } else {
699
- notifications = [].concat((0, _toConsumableArray2["default"])(oldNotifications), [(0, _utils.createNotification)(payload)]);
700
- }
701
-
702
- return _objectSpread(_objectSpread({}, state), {}, {
703
- notifications: notifications
704
- });
705
- };
706
- /**
707
- * Remove a notification
708
- * @memberof uiStateUpdaters
709
- * @param state `uiState`
710
- * @param action
711
- * @param action.payload id of the notification to be removed
712
- * @returns nextState
713
- * @public
714
- */
715
-
716
-
717
- exports.addNotificationUpdater = addNotificationUpdater;
718
-
719
- var removeNotificationUpdater = function removeNotificationUpdater(state, _ref19) {
720
- var id = _ref19.payload;
721
- return _objectSpread(_objectSpread({}, state), {}, {
722
- notifications: state.notifications.filter(function (n) {
723
- return n.id !== id;
724
- })
725
- });
726
- };
727
- /**
728
- * Fired when file loading begin
729
- * @memberof uiStateUpdaters
730
- * @param state `uiState`
731
- * @returns nextState
732
- * @public
733
- */
734
-
735
-
736
- exports.removeNotificationUpdater = removeNotificationUpdater;
737
-
738
- var loadFilesUpdater = function loadFilesUpdater(state) {
739
- return _objectSpread(_objectSpread({}, state), {}, {
740
- loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
741
- fileLoading: true
742
- })
743
- });
744
- };
745
- /**
746
- * Handles loading file success and set fileLoading property to false
747
- * @memberof uiStateUpdaters
748
- * @param state `uiState`
749
- * @returns nextState
750
- */
751
-
752
-
753
- exports.loadFilesUpdater = loadFilesUpdater;
754
-
755
- var loadFilesSuccessUpdater = function loadFilesSuccessUpdater(state) {
756
- return _objectSpread(_objectSpread({}, state), {}, {
757
- loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
758
- fileLoading: false
759
- })
760
- });
761
- };
762
- /**
763
- * Handles load file error and set fileLoading property to false
764
- * @memberof uiStateUpdaters
765
- * @param state
766
- * @param action
767
- * @param action.error
768
- * @returns nextState
769
- * @public
770
- */
771
-
772
-
773
- exports.loadFilesSuccessUpdater = loadFilesSuccessUpdater;
774
-
775
- var loadFilesErrUpdater = function loadFilesErrUpdater(state, _ref20) {
776
- var error = _ref20.error;
777
- return addNotificationUpdater(_objectSpread(_objectSpread({}, state), {}, {
778
- loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
779
- fileLoading: false
780
- })
781
- }), {
782
- payload: (0, _utils.errorNotification)({
783
- message: (error || {}).message || 'Failed to upload files',
784
- topic: _constants.DEFAULT_NOTIFICATION_TOPICS.global
785
- })
786
- });
787
- };
788
- /**
789
- * Handles toggle map split and reset all map control index to 0
790
- * @memberof uiStateUpdaters
791
- * @param state
792
- * @returns nextState
793
- * @public
794
- */
795
-
796
-
797
- exports.loadFilesErrUpdater = loadFilesErrUpdater;
798
-
799
- var toggleSplitMapUpdater = function toggleSplitMapUpdater(state) {
800
- return _objectSpread(_objectSpread({}, state), {}, {
801
- mapControls: Object.entries(state.mapControls).reduce(function (acc, entry) {
802
- return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, entry[0], _objectSpread(_objectSpread({}, entry[1]), {}, {
803
- activeMapIndex: 0
804
- })));
805
- }, {})
806
- });
807
- };
808
- /**
809
- * Toggle modal data
810
- * @memberof uiStateUpdaters
811
- * @param state
812
- * @returns nextState
813
- * @public
814
- */
815
-
816
-
817
- exports.toggleSplitMapUpdater = toggleSplitMapUpdater;
818
-
819
- var showDatasetTableUpdater = function showDatasetTableUpdater(state) {
820
- return toggleModalUpdater(state, {
821
- payload: _constants.DATA_TABLE_ID
822
- });
823
- };
824
- /**
825
- * Set the locale of the UI
826
- * @memberof uiStateUpdaters
827
- * @param state `uiState`
828
- * @param action
829
- * @param action.payload
830
- * @param action.payload.locale locale
831
- * @returns nextState
832
- * @public
833
- */
834
-
835
-
836
- exports.showDatasetTableUpdater = showDatasetTableUpdater;
837
-
838
- var setLocaleUpdater = function setLocaleUpdater(state, _ref21) {
839
- var locale = _ref21.payload.locale;
840
- return _objectSpread(_objectSpread({}, state), {}, {
841
- locale: locale
842
- });
843
- };
844
- /**
845
- * Toggle layer panel list view
846
- * @memberof uiStateUpdaters
847
- * @param state `uiState`
848
- * @param action
849
- * @param action.payload layer panel listView value. Can be 'list' or 'sortByDataset'
850
- * @returns nextState
851
- * @public
852
- */
853
-
854
-
855
- exports.setLocaleUpdater = setLocaleUpdater;
856
-
857
- var togglePanelListViewUpdater = function togglePanelListViewUpdater(state, _ref22) {
858
- var _ref22$payload = _ref22.payload,
859
- panelId = _ref22$payload.panelId,
860
- listView = _ref22$payload.listView;
861
- var stateProp = panelId === 'layer' ? 'layerPanelListView' : panelId === 'filter' ? 'filterPanelListView' : null;
862
-
863
- if (!stateProp || state[stateProp] === listView) {
864
- return state;
865
- }
866
-
867
- return _objectSpread(_objectSpread({}, state), {}, (0, _defineProperty2["default"])({}, stateProp, listView));
868
- };
869
-
870
- exports.togglePanelListViewUpdater = togglePanelListViewUpdater;
871
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91aS1zdGF0ZS11cGRhdGVycy50cyJdLCJuYW1lcyI6WyJERUZBVUxUX0FDVElWRV9TSURFX1BBTkVMIiwiREVGQVVMVF9NT0RBTCIsIkFERF9EQVRBX0lEIiwidWlTdGF0ZVVwZGF0ZXJzIiwiREVGQVVMVF9NQVBfQ09OVFJPTFNfRkVBVFVSRVMiLCJzaG93IiwiYWN0aXZlIiwiZGlzYWJsZUNsb3NlIiwiYWN0aXZlTWFwSW5kZXgiLCJERUZBVUxUX01BUF9DT05UUk9MUyIsIk9iamVjdCIsImtleXMiLCJNQVBfQ09OVFJPTFMiLCJyZWR1Y2UiLCJmaW5hbCIsImN1cnJlbnQiLCJERUZBVUxUX0VYUE9SVF9JTUFHRSIsInJhdGlvIiwiRVhQT1JUX0lNR19SQVRJT1MiLCJTQ1JFRU4iLCJyZXNvbHV0aW9uIiwiUkVTT0xVVElPTlMiLCJPTkVfWCIsImxlZ2VuZCIsIm1hcEgiLCJtYXBXIiwiaW1hZ2VTaXplIiwiem9vbU9mZnNldCIsInNjYWxlIiwiaW1hZ2VXIiwiaW1hZ2VIIiwiY2VudGVyIiwiaW1hZ2VEYXRhVXJpIiwiZXhwb3J0aW5nIiwicHJvY2Vzc2luZyIsImVycm9yIiwiZXNjYXBlWGh0bWxGb3JXZWJwYWNrIiwiREVGQVVMVF9MT0FEX0ZJTEVTIiwiZmlsZUxvYWRpbmciLCJERUZBVUxUX0VYUE9SVF9EQVRBIiwic2VsZWN0ZWREYXRhc2V0IiwiZGF0YVR5cGUiLCJFWFBPUlRfREFUQV9UWVBFIiwiQ1NWIiwiZmlsdGVyZWQiLCJERUZBVUxUX05PVElGSUNBVElPTlMiLCJERUZBVUxUX0VYUE9SVF9IVE1MIiwiZXhwb3J0TWFwYm94QWNjZXNzVG9rZW4iLCJ1c2VyTWFwYm94VG9rZW4iLCJtb2RlIiwiRVhQT1JUX0hUTUxfTUFQX01PREVTIiwiUkVBRCIsIkRFRkFVTFRfRVhQT1JUX0pTT04iLCJoYXNEYXRhIiwiREVGQVVMVF9FWFBPUlRfTUFQIiwiRVhQT1JUX01BUF9GT1JNQVRTIiwiSFRNTCIsIkpTT04iLCJJTklUSUFMX1VJX1NUQVRFIiwicmVhZE9ubHkiLCJhY3RpdmVTaWRlUGFuZWwiLCJjdXJyZW50TW9kYWwiLCJkYXRhc2V0S2V5VG9SZW1vdmUiLCJ2aXNpYmxlRHJvcGRvd24iLCJleHBvcnRJbWFnZSIsImV4cG9ydERhdGEiLCJleHBvcnRNYXAiLCJtYXBDb250cm9scyIsIm5vdGlmaWNhdGlvbnMiLCJsb2FkRmlsZXMiLCJsb2NhbGUiLCJMT0NBTEVfQ09ERVMiLCJlbiIsImxheWVyUGFuZWxMaXN0VmlldyIsImZpbHRlclBhbmVsTGlzdFZpZXciLCJpc1NpZGVQYW5lbENsb3NlQnV0dG9uVmlzaWJsZSIsImluaXRVaVN0YXRlVXBkYXRlciIsInN0YXRlIiwiYWN0aW9uIiwicGF5bG9hZCIsImluaXRpYWxVaVN0YXRlIiwidG9nZ2xlU2lkZVBhbmVsVXBkYXRlciIsImlkIiwidG9nZ2xlTW9kYWxVcGRhdGVyIiwic2hvd0V4cG9ydERyb3Bkb3duVXBkYXRlciIsImhpZGVFeHBvcnREcm9wZG93blVwZGF0ZXIiLCJ0b2dnbGVTaWRlUGFuZWxDbG9zZUJ1dHRvblVwZGF0ZXIiLCJ0b2dnbGVNYXBDb250cm9sVXBkYXRlciIsInBhbmVsSWQiLCJpbmRleCIsInNldE1hcENvbnRyb2xWaXNpYmlsaXR5VXBkYXRlciIsIkJvb2xlYW4iLCJvcGVuRGVsZXRlTW9kYWxVcGRhdGVyIiwiREVMRVRFX0RBVEFfSUQiLCJzZXRFeHBvcnRJbWFnZVNldHRpbmdVcGRhdGVyIiwibmV3U2V0dGluZyIsInVwZGF0ZWQiLCJzZXRFeHBvcnRJbWFnZURhdGFVcmlVcGRhdGVyIiwiZGF0YVVyaSIsInNldEV4cG9ydEltYWdlRXJyb3JVcGRhdGVyIiwiY2xlYW51cEV4cG9ydEltYWdlVXBkYXRlciIsInN0YXJ0RXhwb3J0aW5nSW1hZ2VVcGRhdGVyIiwib3B0aW9ucyIsImltYWdlU2V0dGluZ3MiLCJzZXRFeHBvcnRTZWxlY3RlZERhdGFzZXRVcGRhdGVyIiwiZGF0YXNldCIsInNldEV4cG9ydERhdGFUeXBlVXBkYXRlciIsInNldEV4cG9ydEZpbHRlcmVkVXBkYXRlciIsInNldEV4cG9ydERhdGFVcGRhdGVyIiwic2V0VXNlck1hcGJveEFjY2Vzc1Rva2VuVXBkYXRlciIsInNldEV4cG9ydE1hcEZvcm1hdFVwZGF0ZXIiLCJmb3JtYXQiLCJzZXRFeHBvcnRNYXBIVE1MTW9kZVVwZGF0ZXIiLCJhZGROb3RpZmljYXRpb25VcGRhdGVyIiwib2xkTm90aWZpY2F0aW9ucyIsInBheWxvYWRJZCIsIm5vdGlmaWNhdGlvblRvVXBkYXRlIiwiZmluZCIsIm4iLCJtYXAiLCJjb3VudCIsInJlbW92ZU5vdGlmaWNhdGlvblVwZGF0ZXIiLCJmaWx0ZXIiLCJsb2FkRmlsZXNVcGRhdGVyIiwibG9hZEZpbGVzU3VjY2Vzc1VwZGF0ZXIiLCJsb2FkRmlsZXNFcnJVcGRhdGVyIiwibWVzc2FnZSIsInRvcGljIiwiREVGQVVMVF9OT1RJRklDQVRJT05fVE9QSUNTIiwiZ2xvYmFsIiwidG9nZ2xlU3BsaXRNYXBVcGRhdGVyIiwiZW50cmllcyIsImFjYyIsImVudHJ5Iiwic2hvd0RhdGFzZXRUYWJsZVVwZGF0ZXIiLCJEQVRBX1RBQkxFX0lEIiwic2V0TG9jYWxlVXBkYXRlciIsInRvZ2dsZVBhbmVsTGlzdFZpZXdVcGRhdGVyIiwibGlzdFZpZXciLCJzdGF0ZVByb3AiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFHQTs7QUFhQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7QUFrQk8sSUFBTUEseUJBQXlCLEdBQUcsT0FBbEM7O0FBQ0EsSUFBTUMsYUFBYSxHQUFHQyxzQkFBdEI7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7O0FBQ0EsSUFBTUMsZUFBZSxHQUFHLElB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LEtBQUssT0FBWixHQUNJLG9CQURKLEdBRUlBLE9BQU8sS0FBSyxRQUFaLEdBQ0EscUJBREEsR0FFQSxJQUxOOztBQU1BLE1BQUksQ0FBQ21ELFNBQUQsSUFBYzlELEtBQUssQ0FBQzhELFNBQUQsQ0FBTCxLQUFxQkQsUUFBdkMsRUFBaUQ7QUFDL0MsV0FBTzdELEtBQVA7QUFDRDs7QUFDRCx5Q0FDS0EsS0FETCw0Q0FFRzhELFNBRkgsRUFFZUQsUUFGZjtBQUlELENBakJNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtcbiAgQUREX0RBVEFfSUQsXG4gIERBVEFfVEFCTEVfSUQsXG4gIERFRkFVTFRfTk9USUZJQ0FUSU9OX1RPUElDUyxcbiAgREVMRVRFX0RBVEFfSUQsXG4gIEVYUE9SVF9EQVRBX1RZUEUsXG4gIEVYUE9SVF9IVE1MX01BUF9NT0RFUyxcbiAgRVhQT1JUX0lNR19SQVRJT1MsXG4gIEVYUE9SVF9NQVBfRk9STUFUUyxcbiAgUkVTT0xVVElPTlMsXG4gIE1BUF9DT05UUk9MUyxcbiAgRXhwb3J0SW1hZ2Vcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtMT0NBTEVfQ09ERVN9IGZyb20gJ0BrZXBsZXIuZ2wvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7Y3JlYXRlTm90aWZpY2F0aW9uLCBlcnJvck5vdGlmaWNhdGlvbiwgY2FsY3VsYXRlRXhwb3J0SW1hZ2VTaXplfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7cGF5bG9hZF8sIGFwcGx5XywgY29tcG9zZV99IGZyb20gJy4vY29tcG9zZXItaGVscGVycyc7XG5cbmltcG9ydCB7XG4gIEFjdGlvblR5cGVzLFxuICBLZXBsZXJHbEluaXRQYXlsb2FkLFxuICBMb2FkRmlsZXNFcnJVcGRhdGVyQWN0aW9uLFxuICBVSVN0YXRlQWN0aW9uc1xufSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtcbiAgRXhwb3J0RGF0YSxcbiAgRXhwb3J0SHRtbCxcbiAgRXhwb3J0SnNvbixcbiAgRXhwb3J0TWFwLFxuICBNYXBDb250cm9sSXRlbSxcbiAgTWFwQ29udHJvbHMsXG4gIFVpU3RhdGVcbn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FDVElWRV9TSURFX1BBTkVMID0gJ2xheWVyJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX01PREFMID0gQUREX0RBVEFfSUQ7XG5cbi8qKlxuICogVXBkYXRlcnMgZm9yIGB1aVN0YXRlYCByZWR1Y2VyLiBDYW4gYmUgdXNlZCBpbiB5b3VyIHJvb3QgcmVkdWNlciB0byBkaXJlY3RseSBtb2RpZnkga2VwbGVyLmdsJ3Mgc3RhdGUuXG4gKiBSZWFkIG1vcmUgYWJvdXQgW1VzaW5nIHVwZGF0ZXJzXSguLi9hZHZhbmNlZC11c2FnZS91c2luZy11cGRhdGVycy5tZClcbiAqXG4gKiBAcHVibGljXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCBrZXBsZXJHbFJlZHVjZXIsIHt1aVN0YXRlVXBkYXRlcnN9IGZyb20gJ2tlcGxlci5nbC9yZWR1Y2Vycyc7XG4gKiAvLyBSb290IFJlZHVjZXJcbiAqIGNvbnN0IHJlZHVjZXJzID0gY29tYmluZVJlZHVjZXJzKHtcbiAqICBrZXBsZXJHbDoga2VwbGVyR2xSZWR1Y2VyLFxuICogIGFwcDogYXBwUmVkdWNlclxuICogfSk7XG4gKlxuICogY29uc3QgY29tcG9zZWRSZWR1Y2VyID0gKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAqICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gKiAgICAvLyBjbGljayBidXR0b24gdG8gY2xvc2Ugc2lkZSBwYW5lbFxuICogICAgY2FzZSAnQ0xJQ0tfQlVUVE9OJzpcbiAqICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAuLi5zdGF0ZSxcbiAqICAgICAgICBrZXBsZXJHbDoge1xuICogICAgICAgICAgLi4uc3RhdGUua2VwbGVyR2wsXG4gKiAgICAgICAgICBmb286IHtcbiAqICAgICAgICAgICAgIC4uLnN0YXRlLmtlcGxlckdsLmZvbyxcbiAqICAgICAgICAgICAgIHVpU3RhdGU6IHVpU3RhdGVVcGRhdGVycy50b2dnbGVTaWRlUGFuZWxVcGRhdGVyKFxuICogICAgICAgICAgICAgICB1aVN0YXRlLCB7cGF5bG9hZDogbnVsbH1cbiAqICAgICAgICAgICAgIClcbiAqICAgICAgICAgIH1cbiAqICAgICAgICB9XG4gKiAgICAgIH07XG4gKiAgfVxuICogIHJldHVybiByZWR1Y2VycyhzdGF0ZSwgYWN0aW9uKTtcbiAqIH07XG4gKlxuICogZXhwb3J0IGRlZmF1bHQgY29tcG9zZWRSZWR1Y2VyO1xuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuLy8gQHRzLWlnbm9yZVxuY29uc3QgdWlTdGF0ZVVwZGF0ZXJzID0gbnVsbDtcbi8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cblxuY29uc3QgREVGQVVMVF9NQVBfQ09OVFJPTFNfRkVBVFVSRVM6IE1hcENvbnRyb2xJdGVtID0ge1xuICBzaG93OiB0cnVlLFxuICBhY3RpdmU6IGZhbHNlLFxuICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxuICAvLyBkZWZpbmVzIHdoaWNoIG1hcCBpbmRleCB1c2VycyBhcmUgaW50ZXJhY3Rpbmcgd2l0aCAodGhyb3VnaCBtYXAgY29udHJvbHMpXG4gIGFjdGl2ZU1hcEluZGV4OiAwXG59O1xuXG4vKipcbiAqIEEgbGlzdCBvZiBtYXAgY29udHJvbCB2aXNpYmlsaXR5IGFuZCB3aGV0aGVyIGlzIGl0IGFjdGl2ZS5cbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IHZpc2libGVMYXllcnMgRGVmYXVsdDogYHtzaG93OiB0cnVlLCBhY3RpdmU6IGZhbHNlfWBcbiAqIEBwcm9wZXJ0eSBtYXBMZWdlbmQgRGVmYXVsdDogYHtzaG93OiB0cnVlLCBhY3RpdmU6IGZhbHNlfWBcbiAqIEBwcm9wZXJ0eSB0b2dnbGUzZCBEZWZhdWx0OiBge3Nob3c6IHRydWV9YFxuICogQHByb3BlcnR5IHNwbGl0TWFwIERlZmF1bHQ6IGB7c2hvdzogdHJ1ZX1gXG4gKiBAcHJvcGVydHkgbWFwRHJhdyBEZWZhdWx0OiBge3Nob3c6IHRydWUsIGFjdGl2ZTogZmFsc2V9YFxuICogQHByb3BlcnR5IG1hcExvY2FsZSBEZWZhdWx0OiBge3Nob3c6IGZhbHNlLCBhY3RpdmU6IGZhbHNlfWBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFQX0NPTlRST0xTOiBNYXBDb250cm9scyA9IChPYmplY3Qua2V5cyhNQVBfQ09OVFJPTFMpIGFzIEFycmF5PFxuICBrZXlvZiB0eXBlb2YgTUFQX0NPTlRST0xTXG4+KS5yZWR1Y2UoXG4gIChmaW5hbCwgY3VycmVudCkgPT4gKHtcbiAgICAuLi5maW5hbCxcbiAgICBbY3VycmVudF06IERFRkFVTFRfTUFQX0NPTlRST0xTX0ZFQVRVUkVTXG4gIH0pLFxuICB7fSBhcyBNYXBDb250cm9sc1xuKTtcblxuLyoqXG4gKiBEZWZhdWx0IGltYWdlIGV4cG9ydCBjb25maWdcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IHJhdGlvIERlZmF1bHQ6IGAnU0NSRUVOJ2AsXG4gKiBAcHJvcGVydHkgcmVzb2x1dGlvbiBEZWZhdWx0OiBgJ09ORV9YJ2AsXG4gKiBAcHJvcGVydHkgbGVnZW5kIERlZmF1bHQ6IGBmYWxzZWAsXG4gKiBAcHJvcGVydHkgbWFwSCBEZWZhdWx0OiAwLFxuICogQHByb3BlcnR5IG1hcFcgRGVmYXVsdDogMCxcbiAqIEBwcm9wZXJ0eSBpbWFnZVNpemUgRGVmYXVsdDoge3pvb21PZmZzZXQ6IDAsIHNjYWxlOiAxLCBpbWFnZVc6IDAsIGltYWdlSDogMH0sXG4gKiBAcHJvcGVydHkgaW1hZ2VEYXRhVXJpIERlZmF1bHQ6IGAnJ2AsXG4gKiBAcHJvcGVydHkgZXhwb3J0aW5nIERlZmF1bHQ6IGBmYWxzZWBcbiAqIEBwcm9wZXJ0eSBlcnJvciBEZWZhdWx0OiBgZmFsc2VgXG4gKiBAcHJvcGVydHkgZXNjYXBlWGh0bWxGb3JXZWJwYWNrIERlZmF1bHQ6IGB0cnVlYFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FWFBPUlRfSU1BR0U6IEV4cG9ydEltYWdlID0ge1xuICAvLyB1c2VyIG9wdGlvbnNcbiAgcmF0aW86IEVYUE9SVF9JTUdfUkFUSU9TLlNDUkVFTixcbiAgcmVzb2x1dGlvbjogUkVTT0xVVElPTlMuT05FX1gsXG4gIGxlZ2VuZDogZmFsc2UsXG4gIG1hcEg6IDAsXG4gIG1hcFc6IDAsXG4gIGltYWdlU2l6ZToge1xuICAgIHpvb21PZmZzZXQ6IDAsXG4gICAgc2NhbGU6IDEsXG4gICAgaW1hZ2VXOiAwLFxuICAgIGltYWdlSDogMFxuICB9LFxuICAvLyB3aGVuIHRoaXMgaXMgc2V0IHRvIHRydWUsIHRoZSBtb2NrIG1hcCB2aWV3cG9ydCB3aWxsIG1vdmUgdG8gdGhlIGNlbnRlciBvZiBkYXRhXG4gIGNlbnRlcjogZmFsc2UsXG4gIC8vIGV4cG9ydGluZyBzdGF0ZVxuICBpbWFnZURhdGFVcmk6ICcnLFxuICAvLyBleHBvcnRpbmc6IHVzZWQgdG8gYXR0YWNoIHBsb3QtY29udGFpbmVyIHRvIGRvbVxuICBleHBvcnRpbmc6IGZhbHNlLFxuICAvLyBwcm9jZXNzaW5nOiB1c2VkIGFzIGxvYWRpbmcgaW5kaWNhdG9yIHdoZW4gZXhwb3J0IGltYWdlIGlzIGJlaW5nIHByb2R1Y2VkXG4gIHByb2Nlc3Npbmc6IGZhbHNlLFxuICBlcnJvcjogZmFsc2UsXG4gIC8vIHdoZXRoZXIgdG8gYXBwbHkgZml4IGZvciB1Z2xpZnkgZXJyb3IgaW4gZG9tLXRvLWltYWdlIChzaG91bGQgYmUgdHJ1ZSBmb3Igd2VicGFjayBidWlsZHMpXG4gIGVzY2FwZVhodG1sRm9yV2VicGFjazogdHJ1ZVxufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTE9BRF9GSUxFUyA9IHtcbiAgZmlsZUxvYWRpbmc6IGZhbHNlXG59O1xuXG4vKipcbiAqIERlZmF1bHQgaW5pdGlhbCBgZXhwb3J0RGF0YWAgc2V0dGluZ3NcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IHNlbGVjdGVkRGF0YXNldCBEZWZhdWx0OiBgJydgLFxuICogQHByb3BlcnR5IGRhdGFUeXBlIERlZmF1bHQ6IGAnY3N2J2AsXG4gKiBAcHJvcGVydHkgZmlsdGVyZWQgRGVmYXVsdDogYHRydWVgLFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FWFBPUlRfREFUQTogRXhwb3J0RGF0YSA9IHtcbiAgc2VsZWN0ZWREYXRhc2V0OiAnJyxcbiAgZGF0YVR5cGU6IEVYUE9SVF9EQVRBX1RZUEUuQ1NWLFxuICBmaWx0ZXJlZDogdHJ1ZVxufTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTk9USUZJQ0FUSU9OUyA9IFtdO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IGV4cG9ydE1hcGJveEFjY2Vzc1Rva2VuIC0gRGVmYXVsdDogbnVsbCwgdGhpcyBpcyB1c2VkIHdoZW4gd2UgcHJvdmlkZSBhIGRlZmF1bHQgbWFwYm94IHRva2VuIGZvciB1c2VycyB0byB0YWtlIGFkdmFudGFnZSBvZlxuICogQHByb3BlcnR5IHVzZXJNYXBib3hUb2tlbiAtIERlZmF1bHQ6ICcnLCBtYXBib3ggdG9rZW4gcHJvdmlkZWQgYnkgdXNlciB0aHJvdWdoIGlucHV0IGZpZWxkXG4gKiBAcHJvcGVydHkgbW9kZSAtIERlZmF1bHQ6ICdSRUFEJywgcmVhZCBvbmx5IG9yIGVkaXRhYmxlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYUE9SVF9IVE1MOiBFeHBvcnRIdG1sID0ge1xuICBleHBvcnRNYXBib3hBY2Nlc3NUb2tlbjogbnVsbCxcbiAgdXNlck1hcGJveFRva2VuOiAnJyxcbiAgbW9kZTogRVhQT1JUX0hUTUxfTUFQX01PREVTLlJFQURcbn07XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAcHJvcGVydHkgaGFzRGF0YSAtIERlZmF1bHQ6ICd0cnVlJyxcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVhQT1JUX0pTT046IEV4cG9ydEpzb24gPSB7XG4gIGhhc0RhdGE6IHRydWVcbn07XG5cbi8qKlxuICogRXhwb3J0IE1hcCBDb25maWdcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IEhUTUwgLSBEZWZhdWx0OiAnREVGQVVMVF9FWFBPUlRfSFRNTCcsXG4gKiBAcHJvcGVydHkgSlNPTiAtIERlZmF1bHQ6ICdERUZBVUxUX0VYUE9SVF9KU09OJyxcbiAqIEBwcm9wZXJ0eSBmb3JtYXQgLSBEZWZhdWx0OiAnSFRNTCcsXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYUE9SVF9NQVA6IEV4cG9ydE1hcCA9IHtcbiAgW0VYUE9SVF9NQVBfRk9STUFUUy5IVE1MXTogREVGQVVMVF9FWFBPUlRfSFRNTCxcbiAgW0VYUE9SVF9NQVBfRk9STUFUUy5KU09OXTogREVGQVVMVF9FWFBPUlRfSlNPTixcbiAgZm9ybWF0OiBFWFBPUlRfTUFQX0ZPUk1BVFMuSFRNTFxufTtcblxuLyoqXG4gKiBEZWZhdWx0IGluaXRpYWwgYHVpU3RhdGVgXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSByZWFkT25seSBEZWZhdWx0OiBgZmFsc2VgXG4gKiBAcHJvcGVydHkgYWN0aXZlU2lkZVBhbmVsIERlZmF1bHQ6IGAnbGF5ZXInYFxuICogQHByb3BlcnR5IGN1cnJlbnRNb2RhbCBEZWZhdWx0OiBgJ2FkZERhdGEnYFxuICogQHByb3BlcnR5IGRhdGFzZXRLZXlUb1JlbW92ZSBEZWZhdWx0OiBgbnVsbGBcbiAqIEBwcm9wZXJ0eSB2aXNpYmxlRHJvcGRvd24gRGVmYXVsdDogYG51bGxgXG4gKiBAcHJvcGVydHkgZXhwb3J0SW1hZ2UgRGVmYXVsdDogW2BERUZBVUxUX0VYUE9SVF9JTUFHRWBdKCNkZWZhdWx0X2V4cG9ydF9pbWFnZSlcbiAqIEBwcm9wZXJ0eSBleHBvcnREYXRhIERlZmF1bHQ6IFtgREVGQVVMVF9FWFBPUlRfREFUQWBdKCNkZWZhdWx0X2V4cG9ydF9kYXRhKVxuICogQHByb3BlcnR5IGV4cG9ydE1hcCBEZWZhdWx0OiBbYERFRkFVTFRfRVhQT1JUX01BUGBdKCNkZWZhdWx0X2V4cG9ydF9tYXApXG4gKiBAcHJvcGVydHkgbWFwQ29udHJvbHMgRGVmYXVsdDogW2BERUZBVUxUX01BUF9DT05UUk9MU2BdKCNkZWZhdWx0X21hcF9jb250cm9scylcbiAqIEBwcm9wZXJ0eSBub3RpZmljYXRpb25zIERlZmF1bHQ6IGBbXWBcbiAqIEBwcm9wZXJ0eSBub3RpZmljYXRpb25zIERlZmF1bHQ6IGBbXWBcbiAqIEBwcm9wZXJ0eSBsb2FkRmlsZXNcbiAqIEBwcm9wZXJ0eSBpc1NpZGVQYW5lbENsb3NlQnV0dG9uVmlzaWJsZSBEZWZhdWx0OiBgdHJ1ZWBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IElOSVRJQUxfVUlfU1RBVEU6IFVpU3RhdGUgPSB7XG4gIHJlYWRPbmx5OiBmYWxzZSxcbiAgYWN0aXZlU2lkZVBhbmVsOiBERUZBVUxUX0FDVElWRV9TSURFX1BBTkVMLFxuICBjdXJyZW50TW9kYWw6IERFRkFVTFRfTU9EQUwsXG4gIGRhdGFzZXRLZXlUb1JlbW92ZTogbnVsbCxcbiAgdmlzaWJsZURyb3Bkb3duOiBudWxsLFxuICAvLyBleHBvcnQgaW1hZ2UgbW9kYWwgdWlcbiAgZXhwb3J0SW1hZ2U6IERFRkFVTFRfRVhQT1JUX0lNQUdFLFxuICAvLyBleHBvcnQgZGF0YSBtb2RhbCB1aVxuICBleHBvcnREYXRhOiBERUZBVUxUX0VYUE9SVF9EQVRBLFxuICAvLyBodG1sIGV4cG9ydFxuICBleHBvcnRNYXA6IERFRkFVTFRfRVhQT1JUX01BUCxcbiAgLy8gbWFwIGNvbnRyb2wgcGFuZWxzXG4gIG1hcENvbnRyb2xzOiBERUZBVUxUX01BUF9DT05UUk9MUyxcbiAgLy8gdWkgbm90aWZpY2F0aW9uc1xuICBub3RpZmljYXRpb25zOiBERUZBVUxUX05PVElGSUNBVElPTlMsXG4gIC8vIGxvYWQgZmlsZXNcbiAgbG9hZEZpbGVzOiBERUZBVUxUX0xPQURfRklMRVMsXG4gIC8vIExvY2FsZSBvZiB0aGUgVUlcbiAgbG9jYWxlOiBMT0NBTEVfQ09ERVMuZW4sXG4gIGxheWVyUGFuZWxMaXN0VmlldzogJ2xpc3QnLFxuICBmaWx0ZXJQYW5lbExpc3RWaWV3OiAnbGlzdCcsXG4gIGlzU2lkZVBhbmVsQ2xvc2VCdXR0b25WaXNpYmxlOiB0cnVlXG59O1xuXG4vKiBVcGRhdGVycyAqL1xuLyoqXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBpbml0VWlTdGF0ZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICBhY3Rpb246IHtcbiAgICB0eXBlPzogdHlwZW9mIEFjdGlvblR5cGVzWydJTklUJ107XG4gICAgcGF5bG9hZDogS2VwbGVyR2xJbml0UGF5bG9hZDtcbiAgfVxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgLi4uKGFjdGlvbi5wYXlsb2FkIHx8IHt9KS5pbml0aWFsVWlTdGF0ZVxufSk7XG5cbi8qKlxuICogVG9nZ2xlIGFjdGl2ZSBzaWRlIHBhbmVsXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgaWQgb2Ygc2lkZSBwYW5lbCB0byBiZSBzaG93biwgb25lIG9mIGBsYXllcmAsIGBmaWx0ZXJgLCBgaW50ZXJhY3Rpb25gLCBgbWFwYC4gY2xvc2Ugc2lkZSBwYW5lbCBpZiBgbnVsbGBcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlU2lkZVBhbmVsVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBpZH06IFVJU3RhdGVBY3Rpb25zLlRvZ2dsZVNpZGVQYW5lbFVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4ge1xuICByZXR1cm4gaWQgPT09IHN0YXRlLmFjdGl2ZVNpZGVQYW5lbFxuICAgID8gc3RhdGVcbiAgICA6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGFjdGl2ZVNpZGVQYW5lbDogaWRcbiAgICAgIH07XG59O1xuXG4vKipcbiAqIFNob3cgYW5kIGhpZGUgbW9kYWwgZGlhbG9nXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW1hY3Rpb24ucGF5bG9hZCBpZCBvZiBtb2RhbCB0byBiZSBzaG93biwgbnVsbCB0byBoaWRlIG1vZGFscy4gT25lIG9mOlxuICogIC0gW2BEQVRBX1RBQkxFX0lEYF0oLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MubWQjZGF0YV90YWJsZV9pZClcbiAqICAtIFtgREVMRVRFX0RBVEFfSURgXSguLi9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncy5tZCNkZWxldGVfZGF0YV9pZClcbiAqICAtIFtgQUREX0RBVEFfSURgXSguLi9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncy5tZCNhZGRfZGF0YV9pZClcbiAqICAtIFtgRVhQT1JUX0lNQUdFX0lEYF0oLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MubWQjZXhwb3J0X2ltYWdlX2lkKVxuICogIC0gW2BFWFBPUlRfREFUQV9JRGBdKC4uL2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzLm1kI2V4cG9ydF9kYXRhX2lkKVxuICogIC0gW2BBRERfTUFQX1NUWUxFX0lEYF0oLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MubWQjYWRkX21hcF9zdHlsZV9pZClcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlTW9kYWxVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGlkfTogVUlTdGF0ZUFjdGlvbnMuVG9nZ2xlTW9kYWxVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBjdXJyZW50TW9kYWw6IGlkXG59KTtcblxuLyoqXG4gKiBIaWRlIGFuZCBzaG93IHNpZGUgcGFuZWwgaGVhZGVyIGRyb3Bkb3duLCBhY3RpdmF0ZWQgYnkgY2xpY2tpbmcgdGhlIHNoYXJlIGxpbmsgb24gdG9wIG9mIHRoZSBzaWRlIHBhbmVsXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzaG93RXhwb3J0RHJvcGRvd25VcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGlkfTogVUlTdGF0ZUFjdGlvbnMuU2hvd0V4cG9ydERyb3Bkb3duVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgdmlzaWJsZURyb3Bkb3duOiBpZFxufSk7XG5cbi8qKlxuICogSGlkZSBzaWRlIHBhbmVsIGhlYWRlciBkcm9wZG93biwgYWN0aXZhdGVkIGJ5IGNsaWNraW5nIHRoZSBzaGFyZSBsaW5rIG9uIHRvcCBvZiB0aGUgc2lkZSBwYW5lbFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgaGlkZUV4cG9ydERyb3Bkb3duVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSk6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIHZpc2libGVEcm9wZG93bjogbnVsbFxufSk7XG5cbi8qKlxuICogVG9nZ2xlIHNpZGUgcGFuZWwgY2xvc2UgYnV0dG9uIG9uIHRvcCBsZWZ0IG9mIHRoZSBzaWRlIHBhbmVsXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVTaWRlUGFuZWxDbG9zZUJ1dHRvblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDoge3Nob3d9fTogVUlTdGF0ZUFjdGlvbnMuVG9nZ2xlU2lkZVBhbmVsQ2xvc2VCdXR0b25VcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBpc1NpZGVQYW5lbENsb3NlQnV0dG9uVmlzaWJsZTogc2hvd1xufSk7XG5cbi8qKlxuICogVG9nZ2xlIGFjdGl2ZSBtYXAgY29udHJvbCBwYW5lbFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvbiBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBtYXAgY29udHJvbCBwYW5lbCBpZCwgb25lIG9mIHRoZSBrZXlzIG9mOiBbYERFRkFVTFRfTUFQX0NPTlRST0xTYF0oI2RlZmF1bHRfbWFwX2NvbnRyb2xzKVxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVNYXBDb250cm9sVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiB7cGFuZWxJZCwgaW5kZXggPSAwfX06IFVJU3RhdGVBY3Rpb25zLlRvZ2dsZU1hcENvbnRyb2xVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBtYXBDb250cm9sczoge1xuICAgIC4uLnN0YXRlLm1hcENvbnRyb2xzLFxuICAgIFtwYW5lbElkXToge1xuICAgICAgLi4uc3RhdGUubWFwQ29udHJvbHNbcGFuZWxJZF0sXG4gICAgICBhY3RpdmU6ICFzdGF0ZS5tYXBDb250cm9sc1twYW5lbElkXS5hY3RpdmUsXG4gICAgICBhY3RpdmVNYXBJbmRleDogaW5kZXhcbiAgICB9XG4gIH1cbn0pO1xuXG4vKipcbiAqIFRvZ2dsZSBtYXAgY29udHJvbCB2aXNpYmlsaXR5XG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIG1hcCBjb250cm9sIHBhbmVsIGlkLCBvbmUgb2YgdGhlIGtleXMgb2Y6IFtgREVGQVVMVF9NQVBfQ09OVFJPTFNgXSgjZGVmYXVsdF9tYXBfY29udHJvbHMpXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldE1hcENvbnRyb2xWaXNpYmlsaXR5VXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiB7cGFuZWxJZCwgc2hvd319OiBVSVN0YXRlQWN0aW9ucy5zZXRNYXBDb250cm9sVmlzaWJpbGl0eVVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4ge1xuICBpZiAoIXN0YXRlLm1hcENvbnRyb2xzPy5bcGFuZWxJZF0pIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIG1hcENvbnRyb2xzOiB7XG4gICAgICAuLi5zdGF0ZS5tYXBDb250cm9scyxcbiAgICAgIFtwYW5lbElkXToge1xuICAgICAgICAuLi5zdGF0ZS5tYXBDb250cm9sc1twYW5lbElkXSxcbiAgICAgICAgc2hvdzogQm9vbGVhbihzaG93KVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogVG9nZ2xlIGFjdGl2ZSBtYXAgY29udHJvbCBwYW5lbFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIGRhdGFzZXQgaWRcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgb3BlbkRlbGV0ZU1vZGFsVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBkYXRhc2V0S2V5VG9SZW1vdmV9OiBVSVN0YXRlQWN0aW9ucy5PcGVuRGVsZXRlTW9kYWxVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBjdXJyZW50TW9kYWw6IERFTEVURV9EQVRBX0lELFxuICBkYXRhc2V0S2V5VG9SZW1vdmVcbn0pO1xuXG4vKipcbiAqIFNldCBgZXhwb3J0SW1hZ2UubGVnZW5kYCB0byBgdHJ1ZWAgb3IgYGZhbHNlYFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnRJbWFnZVNldHRpbmdVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IG5ld1NldHRpbmd9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnRJbWFnZVNldHRpbmdVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+IHtcbiAgY29uc3QgdXBkYXRlZCA9IHsuLi5zdGF0ZS5leHBvcnRJbWFnZSwgLi4ubmV3U2V0dGluZ307XG4gIGNvbnN0IGltYWdlU2l6ZSA9IGNhbGN1bGF0ZUV4cG9ydEltYWdlU2l6ZSh1cGRhdGVkKSB8fCBzdGF0ZS5leHBvcnRJbWFnZS5pbWFnZVNpemU7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBleHBvcnRJbWFnZToge1xuICAgICAgLi4udXBkYXRlZCxcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgIC8vIFRPRE86IGNhbGN1bGF0ZUV4cG9ydEltYWdlU2l6ZSBkb2VzIG5vdCByZXR1cm4gaW1hZ2VTaXplLnpvb21PZmZzZXQsXG4gICAgICAvLyBkbyB3ZSBuZWVkIHRha2UgdGhpcyB2YWx1ZSBmcm9tIGN1cnJlbnQgc3RhdGUsIG9yIHJldHVybiBkZWZhdWwgdmFsdWUgPSAwXG4gICAgICBpbWFnZVNpemVcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIFNldCBgZXhwb3J0SW1hZ2Uuc2V0RXhwb3J0SW1hZ2VEYXRhVXJpYCB0byBhIGltYWdlIGRhdGFVcmlcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBleHBvcnQgaW1hZ2UgZGF0YSB1cmlcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0SW1hZ2VEYXRhVXJpVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBkYXRhVXJpfTogVUlTdGF0ZUFjdGlvbnMuU2V0RXhwb3J0SW1hZ2VEYXRhVXJpVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0SW1hZ2U6IHtcbiAgICAuLi5zdGF0ZS5leHBvcnRJbWFnZSxcbiAgICBwcm9jZXNzaW5nOiBmYWxzZSxcbiAgICBpbWFnZURhdGFVcmk6IGRhdGFVcmlcbiAgfVxufSk7XG5cbi8qKlxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0SW1hZ2VFcnJvclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogZXJyb3J9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnRJbWFnZUVycm9yVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0SW1hZ2U6IHtcbiAgICAuLi5zdGF0ZS5leHBvcnRJbWFnZSxcbiAgICBwcm9jZXNzaW5nOiBmYWxzZSxcbiAgICBlcnJvclxuICB9XG59KTtcblxuLyoqXG4gKiBEZWxldGUgY2FjaGVkIGV4cG9ydCBpbWFnZVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgY2xlYW51cEV4cG9ydEltYWdlVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSk6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydEltYWdlOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0SW1hZ2UsXG4gICAgZXhwb3J0aW5nOiBmYWxzZSxcbiAgICBpbWFnZURhdGFVcmk6ICcnLFxuICAgIGVycm9yOiBmYWxzZSxcbiAgICBwcm9jZXNzaW5nOiBmYWxzZSxcbiAgICBjZW50ZXI6IGZhbHNlXG4gIH1cbn0pO1xuXG4vKipcbiAqIFN0YXJ0IGltYWdlIGV4cG9ydGluZyBmbG93XG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGVcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJucyB7VWlTdGF0ZX1cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHN0YXJ0RXhwb3J0aW5nSW1hZ2VVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IG9wdGlvbnMgPSB7fX06IHtwYXlsb2FkOiBQYXJ0aWFsPEV4cG9ydEltYWdlPn1cbik6IFVpU3RhdGUgPT4ge1xuICBjb25zdCBpbWFnZVNldHRpbmdzID0ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgZXhwb3J0aW5nOiB0cnVlXG4gIH07XG5cbiAgcmV0dXJuIGNvbXBvc2VfKFtcbiAgICBjbGVhbnVwRXhwb3J0SW1hZ2VVcGRhdGVyLFxuICAgIGFwcGx5XyhzZXRFeHBvcnRJbWFnZVNldHRpbmdVcGRhdGVyLCBwYXlsb2FkXyhpbWFnZVNldHRpbmdzKSlcbiAgXSkoc3RhdGUpO1xufTtcblxuLyoqXG4gKiBTZXQgc2VsZWN0ZWQgZGF0YXNldCBmb3IgZXhwb3J0XG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgZGF0YXNldCBpZFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnRTZWxlY3RlZERhdGFzZXRVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGRhdGFzZXR9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnRTZWxlY3RlZERhdGFzZXRVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnREYXRhOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0RGF0YSxcbiAgICBzZWxlY3RlZERhdGFzZXQ6IGRhdGFzZXRcbiAgfVxufSk7XG5cbi8qKlxuICogU2V0IGRhdGEgZm9ybWF0IGZvciBleHBvcnRpbmcgZGF0YVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIG9uZSBvZiBgJ3RleHQvY3N2J2BcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0RGF0YVR5cGVVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGRhdGFUeXBlfTogVUlTdGF0ZUFjdGlvbnMuU2V0RXhwb3J0RGF0YVR5cGVVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnREYXRhOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0RGF0YSxcbiAgICBkYXRhVHlwZVxuICB9XG59KTtcblxuLyoqXG4gKiBXaGV0aGVyIHRvIGV4cG9ydCBmaWx0ZXJlZCBkYXRhLCBgdHJ1ZWAgb3IgYGZhbHNlYFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV4cG9ydEZpbHRlcmVkVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBmaWx0ZXJlZH06IFVJU3RhdGVBY3Rpb25zLlNldEV4cG9ydEZpbHRlcmVkVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0RGF0YToge1xuICAgIC4uLnN0YXRlLmV4cG9ydERhdGEsXG4gICAgZmlsdGVyZWRcbiAgfVxufSk7XG5cbi8qKlxuICogV2hldGhlciB0byBpbmNsdWRpbmcgZGF0YSBpbiBtYXAgY29uZmlnLCB0b2dnbGUgYmV0d2VlbiBgdHJ1ZWAgb3IgYGZhbHNlYFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnREYXRhVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSk6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydE1hcDoge1xuICAgIC4uLnN0YXRlLmV4cG9ydE1hcCxcbiAgICBbRVhQT1JUX01BUF9GT1JNQVRTLkpTT05dOiB7XG4gICAgICAuLi5zdGF0ZS5leHBvcnRNYXBbRVhQT1JUX01BUF9GT1JNQVRTLkpTT05dLFxuICAgICAgaGFzRGF0YTogIXN0YXRlLmV4cG9ydE1hcFtFWFBPUlRfTUFQX0ZPUk1BVFMuSlNPTl0uaGFzRGF0YVxuICAgIH1cbiAgfVxufSk7XG5cbi8qKlxuICogd2hldGhlciB0byBleHBvcnQgYSBtYXBib3ggYWNjZXNzIHRvIEhUTUwgc2luZ2xlIHBhZ2VcbiAqIEBwYXJhbSBzdGF0ZSAtIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFVzZXJNYXBib3hBY2Nlc3NUb2tlblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogdXNlck1hcGJveFRva2VufTogVUlTdGF0ZUFjdGlvbnMuU2V0VXNlck1hcGJveEFjY2Vzc1Rva2VuVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0TWFwOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0TWFwLFxuICAgIFtFWFBPUlRfTUFQX0ZPUk1BVFMuSFRNTF06IHtcbiAgICAgIC4uLnN0YXRlLmV4cG9ydE1hcFtFWFBPUlRfTUFQX0ZPUk1BVFMuSFRNTF0sXG4gICAgICB1c2VyTWFwYm94VG9rZW5cbiAgICB9XG4gIH1cbn0pO1xuXG4vKipcbiAqIFNldHMgdGhlIGV4cG9ydCBtYXAgZm9ybWF0XG4gKiBAcGFyYW0gc3RhdGUgLSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBmb3JtYXQgdG8gdXNlIHRvIGV4cG9ydCB0aGUgbWFwIGludG9cbiAqIEByZXR1cm4gbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnRNYXBGb3JtYXRVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGZvcm1hdH06IFVJU3RhdGVBY3Rpb25zLlNldEV4cG9ydE1hcEZvcm1hdFVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydE1hcDoge1xuICAgIC4uLnN0YXRlLmV4cG9ydE1hcCxcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgZm9ybWF0XG4gIH1cbn0pO1xuXG4vKipcbiAqIFNldCB0aGUgZXhwb3J0IGh0bWwgbWFwIG1vZGVcbiAqIEBwYXJhbSBzdGF0ZSAtIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIHRvIGJlIHNldCAoYXZhaWxhYmxlIG1vZGVzOiBFWFBPUlRfSFRNTF9NQVBfTU9ERVMpXG4gKiBAcmV0dXJuIG5leHRTdGF0ZVxuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0TWFwSFRNTE1vZGVVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IG1vZGV9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnRIVE1MTWFwTW9kZVVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydE1hcDoge1xuICAgIC4uLnN0YXRlLmV4cG9ydE1hcCxcbiAgICBbRVhQT1JUX01BUF9GT1JNQVRTLkhUTUxdOiB7XG4gICAgICAuLi5zdGF0ZS5leHBvcnRNYXBbRVhQT1JUX01BUF9GT1JNQVRTLkhUTUxdLFxuICAgICAgbW9kZVxuICAgIH1cbiAgfVxufSk7XG5cbi8qKlxuICogQWRkcyBhIG5ldyBub3RpZmljYXRpb24uXG4gKiBVcGRhdGVzIGEgbm90aWZpY2F0aW9uIGluIGNhc2Ugb2YgbWF0Y2hpbmcgaWRzLlxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIFBhcmFtcyBvZiBhIG5vdGlmaWNhdGlvblxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBhZGROb3RpZmljYXRpb25VcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWR9OiBVSVN0YXRlQWN0aW9ucy5BZGROb3RpZmljYXRpb25VcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+IHtcbiAgY29uc3Qgb2xkTm90aWZpY2F0aW9ucyA9IHN0YXRlLm5vdGlmaWNhdGlvbnMgfHwgW107XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgY29uc3QgcGF5bG9hZElkID0gcGF5bG9hZD8uaWQ7XG4gIGNvbnN0IG5vdGlmaWNhdGlvblRvVXBkYXRlID0gcGF5bG9hZElkID8gb2xkTm90aWZpY2F0aW9ucy5maW5kKG4gPT4gbi5pZCA9PT0gcGF5bG9hZElkKSA6IG51bGw7XG5cbiAgbGV0IG5vdGlmaWNhdGlvbnM7XG4gIGlmIChub3RpZmljYXRpb25Ub1VwZGF0ZSkge1xuICAgIG5vdGlmaWNhdGlvbnMgPSBvbGROb3RpZmljYXRpb25zLm1hcChuID0+XG4gICAgICBuLmlkID09PSBwYXlsb2FkSWQgPyBjcmVhdGVOb3RpZmljYXRpb24oey4uLnBheWxvYWQsIGNvdW50OiBuLmNvdW50ICsgMX0pIDogblxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgbm90aWZpY2F0aW9ucyA9IFsuLi5vbGROb3RpZmljYXRpb25zLCBjcmVhdGVOb3RpZmljYXRpb24ocGF5bG9hZCldO1xuICB9XG5cbiAgcmV0dXJuIHsuLi5zdGF0ZSwgbm90aWZpY2F0aW9uc307XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhIG5vdGlmaWNhdGlvblxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIGlkIG9mIHRoZSBub3RpZmljYXRpb24gdG8gYmUgcmVtb3ZlZFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVOb3RpZmljYXRpb25VcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGlkfTogVUlTdGF0ZUFjdGlvbnMuUmVtb3ZlTm90aWZpY2F0aW9uVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbm90aWZpY2F0aW9uczogc3RhdGUubm90aWZpY2F0aW9ucy5maWx0ZXIobiA9PiBuLmlkICE9PSBpZClcbn0pO1xuXG4vKipcbiAqIEZpcmVkIHdoZW4gZmlsZSBsb2FkaW5nIGJlZ2luXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRGaWxlc1VwZGF0ZXIgPSAoc3RhdGU6IFVpU3RhdGUpOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBsb2FkRmlsZXM6IHtcbiAgICAuLi5zdGF0ZS5sb2FkRmlsZXMsXG4gICAgZmlsZUxvYWRpbmc6IHRydWVcbiAgfVxufSk7XG5cbi8qKlxuICogSGFuZGxlcyBsb2FkaW5nIGZpbGUgc3VjY2VzcyBhbmQgc2V0IGZpbGVMb2FkaW5nIHByb3BlcnR5IHRvIGZhbHNlXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyID0gKHN0YXRlOiBVaVN0YXRlKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbG9hZEZpbGVzOiB7XG4gICAgLi4uc3RhdGUubG9hZEZpbGVzLFxuICAgIGZpbGVMb2FkaW5nOiBmYWxzZVxuICB9XG59KTtcblxuLyoqXG4gKiBIYW5kbGVzIGxvYWQgZmlsZSBlcnJvciBhbmQgc2V0IGZpbGVMb2FkaW5nIHByb3BlcnR5IHRvIGZhbHNlXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGVcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24uZXJyb3JcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbG9hZEZpbGVzRXJyVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSwge2Vycm9yfTogTG9hZEZpbGVzRXJyVXBkYXRlckFjdGlvbik6IFVpU3RhdGUgPT5cbiAgYWRkTm90aWZpY2F0aW9uVXBkYXRlcihcbiAgICB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGxvYWRGaWxlczoge1xuICAgICAgICAuLi5zdGF0ZS5sb2FkRmlsZXMsXG4gICAgICAgIGZpbGVMb2FkaW5nOiBmYWxzZVxuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgcGF5bG9hZDogZXJyb3JOb3RpZmljYXRpb24oe1xuICAgICAgICBtZXNzYWdlOiAoZXJyb3IgfHwge30pLm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byB1cGxvYWQgZmlsZXMnLFxuICAgICAgICB0b3BpYzogREVGQVVMVF9OT1RJRklDQVRJT05fVE9QSUNTLmdsb2JhbFxuICAgICAgfSlcbiAgICB9XG4gICk7XG5cbi8qKlxuICogSGFuZGxlcyB0b2dnbGUgbWFwIHNwbGl0IGFuZCByZXNldCBhbGwgbWFwIGNvbnRyb2wgaW5kZXggdG8gMFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVNwbGl0TWFwVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSk6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIG1hcENvbnRyb2xzOiBPYmplY3QuZW50cmllcyhzdGF0ZS5tYXBDb250cm9scykucmVkdWNlKFxuICAgIChhY2MsIGVudHJ5KSA9PiAoe1xuICAgICAgLi4uYWNjLFxuICAgICAgW2VudHJ5WzBdXToge1xuICAgICAgICAuLi5lbnRyeVsxXSxcbiAgICAgICAgYWN0aXZlTWFwSW5kZXg6IDBcbiAgICAgIH1cbiAgICB9KSxcbiAgICB7fSBhcyBNYXBDb250cm9sc1xuICApXG59KTtcblxuLyoqXG4gKiBUb2dnbGUgbW9kYWwgZGF0YVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNob3dEYXRhc2V0VGFibGVVcGRhdGVyID0gKHN0YXRlOiBVaVN0YXRlKTogVWlTdGF0ZSA9PlxuICB0b2dnbGVNb2RhbFVwZGF0ZXIoc3RhdGUsIHtwYXlsb2FkOiBEQVRBX1RBQkxFX0lEfSk7XG5cbi8qKlxuICogU2V0IHRoZSBsb2NhbGUgb2YgdGhlIFVJXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWRcbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZC5sb2NhbGUgbG9jYWxlXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldExvY2FsZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDoge2xvY2FsZX19OiBVSVN0YXRlQWN0aW9ucy5TZXRMb2NhbGVVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBsb2NhbGVcbn0pO1xuXG4vKipcbiAqIFRvZ2dsZSBsYXllciBwYW5lbCBsaXN0IHZpZXdcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBsYXllciBwYW5lbCBsaXN0VmlldyB2YWx1ZS4gQ2FuIGJlICdsaXN0JyBvciAnc29ydEJ5RGF0YXNldCdcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlUGFuZWxMaXN0Vmlld1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDoge3BhbmVsSWQsIGxpc3RWaWV3fX06IFVJU3RhdGVBY3Rpb25zLlRvZ2dsZVBhbmVsTGlzdFZpZXdBY3Rpb25cbik6IFVpU3RhdGUgPT4ge1xuICBjb25zdCBzdGF0ZVByb3AgPVxuICAgIHBhbmVsSWQgPT09ICdsYXllcidcbiAgICAgID8gJ2xheWVyUGFuZWxMaXN0VmlldydcbiAgICAgIDogcGFuZWxJZCA9PT0gJ2ZpbHRlcidcbiAgICAgID8gJ2ZpbHRlclBhbmVsTGlzdFZpZXcnXG4gICAgICA6IG51bGw7XG4gIGlmICghc3RhdGVQcm9wIHx8IHN0YXRlW3N0YXRlUHJvcF0gPT09IGxpc3RWaWV3KSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgW3N0YXRlUHJvcF06IGxpc3RWaWV3XG4gIH07XG59O1xuIl19