@kepler.gl/reducers 3.3.0-alpha.1 → 3.3.0-alpha.10

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