@kepler.gl/components 3.3.0-alpha.0 → 3.3.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/dist/annotations/annotation-node.d.ts +11 -0
  2. package/dist/annotations/annotation-node.js +145 -0
  3. package/dist/annotations/annotation-overlay.d.ts +16 -0
  4. package/dist/annotations/annotation-overlay.js +166 -0
  5. package/dist/annotations/annotation-panel.d.ts +24 -0
  6. package/dist/annotations/annotation-panel.js +362 -0
  7. package/dist/annotations/annotation-text.d.ts +16 -0
  8. package/dist/annotations/annotation-text.js +150 -0
  9. package/dist/annotations/annotation-utils.d.ts +39 -0
  10. package/dist/annotations/annotation-utils.js +156 -0
  11. package/dist/annotations/index.d.ts +7 -0
  12. package/dist/annotations/index.js +53 -0
  13. package/dist/annotations/lexical-editor/clickable-link-plugin.d.ts +3 -0
  14. package/dist/annotations/lexical-editor/clickable-link-plugin.js +71 -0
  15. package/dist/annotations/lexical-editor/floating-link-editor.d.ts +1 -0
  16. package/dist/annotations/lexical-editor/floating-link-editor.js +194 -0
  17. package/dist/annotations/lexical-editor/index.d.ts +7 -0
  18. package/dist/annotations/lexical-editor/index.js +78 -0
  19. package/dist/annotations/lexical-editor/lexical-constants.d.ts +12 -0
  20. package/dist/annotations/lexical-editor/lexical-constants.js +22 -0
  21. package/dist/annotations/lexical-editor/lexical-nodes.d.ts +3 -0
  22. package/dist/annotations/lexical-editor/lexical-nodes.js +13 -0
  23. package/dist/annotations/lexical-editor/lexical-rich-text-editor.d.ts +15 -0
  24. package/dist/annotations/lexical-editor/lexical-rich-text-editor.js +122 -0
  25. package/dist/annotations/lexical-editor/lexical-theme.d.ts +15 -0
  26. package/dist/annotations/lexical-editor/lexical-theme.js +25 -0
  27. package/dist/annotations/lexical-editor/lexical-toolbar.d.ts +7 -0
  28. package/dist/annotations/lexical-editor/lexical-toolbar.js +293 -0
  29. package/dist/annotations/lexical-editor/lexical-utils.d.ts +4 -0
  30. package/dist/annotations/lexical-editor/lexical-utils.js +45 -0
  31. package/dist/annotations/lexical-editor/use-lexical-toolbar.d.ts +36 -0
  32. package/dist/annotations/lexical-editor/use-lexical-toolbar.js +253 -0
  33. package/dist/bottom-widget.d.ts +1 -1
  34. package/dist/bottom-widget.js +12 -6
  35. package/dist/common/action-panel.js +1 -1
  36. package/dist/common/animation-control/animation-control.d.ts +1 -0
  37. package/dist/common/animation-control/animation-control.js +3 -1
  38. package/dist/common/animation-control/animation-controller.js +8 -6
  39. package/dist/common/animation-control/export-video-control.d.ts +9 -0
  40. package/dist/common/animation-control/export-video-control.js +43 -0
  41. package/dist/common/animation-control/playback-controls.d.ts +4 -2
  42. package/dist/common/animation-control/playback-controls.js +7 -4
  43. package/dist/common/checkbox.d.ts +5 -21
  44. package/dist/common/checkbox.js +58 -70
  45. package/dist/common/color-legend.d.ts +1 -1
  46. package/dist/common/color-legend.js +3 -3
  47. package/dist/common/data-table/canvas.d.ts +1 -1
  48. package/dist/common/data-table/index.d.ts +2 -2
  49. package/dist/common/data-table/index.js +3 -3
  50. package/dist/common/dnd-layer-items.d.ts +4 -0
  51. package/dist/common/dnd-layer-items.js +6 -2
  52. package/dist/common/error-boundary.d.ts +1 -1
  53. package/dist/common/file-uploader/file-upload.d.ts +1 -1
  54. package/dist/common/file-uploader/file-upload.js +4 -4
  55. package/dist/common/flex-container.d.ts +15 -7
  56. package/dist/common/histogram-plot.js +102 -53
  57. package/dist/common/icon-button.d.ts +53 -6
  58. package/dist/common/icons/3d-models/airplane.d.ts +14 -0
  59. package/dist/common/icons/3d-models/airplane.js +104 -0
  60. package/dist/common/icons/3d-models/bicycle.d.ts +14 -0
  61. package/dist/common/icons/3d-models/bicycle.js +426 -0
  62. package/dist/common/icons/3d-models/boeing.d.ts +14 -0
  63. package/dist/common/icons/3d-models/boeing.js +119 -0
  64. package/dist/common/icons/3d-models/car.d.ts +14 -0
  65. package/dist/common/icons/3d-models/car.js +110 -0
  66. package/dist/common/icons/3d-models/cargoship.d.ts +14 -0
  67. package/dist/common/icons/3d-models/cargoship.js +246 -0
  68. package/dist/common/icons/3d-models/evtol.d.ts +14 -0
  69. package/dist/common/icons/3d-models/evtol.js +134 -0
  70. package/dist/common/icons/3d-models/glider.d.ts +14 -0
  71. package/dist/common/icons/3d-models/glider.js +62 -0
  72. package/dist/common/icons/3d-models/helicopter.d.ts +14 -0
  73. package/dist/common/icons/3d-models/helicopter.js +110 -0
  74. package/dist/common/icons/3d-models/scooter.d.ts +14 -0
  75. package/dist/common/icons/3d-models/scooter.js +159 -0
  76. package/dist/common/icons/3d-models/semitruck.d.ts +14 -0
  77. package/dist/common/icons/3d-models/semitruck.js +177 -0
  78. package/dist/common/icons/3d-models/truck.d.ts +14 -0
  79. package/dist/common/icons/3d-models/truck.js +122 -0
  80. package/dist/common/icons/anchor_window.d.ts +1 -8
  81. package/dist/common/icons/anchor_window.js +17 -10
  82. package/dist/common/icons/annotation-text.d.ts +9 -0
  83. package/dist/common/icons/annotation-text.js +56 -0
  84. package/dist/common/icons/arrow-down-full.d.ts +2 -1
  85. package/dist/common/icons/arrow-down-full.js +1 -1
  86. package/dist/common/icons/folder.d.ts +10 -0
  87. package/dist/common/icons/folder.js +51 -0
  88. package/dist/common/icons/index.d.ts +2 -0
  89. package/dist/common/icons/index.js +15 -1
  90. package/dist/common/icons/timeline-marker.d.ts +2 -1
  91. package/dist/common/icons/timeline-marker.js +1 -1
  92. package/dist/common/item-selector/chickleted-input.d.ts +1 -1
  93. package/dist/common/item-selector/chickleted-input.js +5 -5
  94. package/dist/common/item-selector/dropdown-list.d.ts +1 -1
  95. package/dist/common/item-selector/dropdown-list.js +1 -1
  96. package/dist/common/item-selector/dropdown-select.d.ts +13 -7
  97. package/dist/common/item-selector/item-selector.d.ts +1 -1
  98. package/dist/common/item-selector/item-selector.js +1 -1
  99. package/dist/common/item-selector/typeahead.d.ts +4 -4
  100. package/dist/common/item-selector/typeahead.js +1 -3
  101. package/dist/common/layout-splitter.d.ts +45 -0
  102. package/dist/common/layout-splitter.js +231 -0
  103. package/dist/common/line-chart.d.ts +10 -3
  104. package/dist/common/line-chart.js +219 -52
  105. package/dist/common/modal.d.ts +11 -5
  106. package/dist/common/modal.js +1 -1
  107. package/dist/common/portaled.d.ts +17 -17
  108. package/dist/common/range-plot.js +4 -2
  109. package/dist/common/range-slider.d.ts +2 -0
  110. package/dist/common/range-slider.js +108 -45
  111. package/dist/common/slider/mouse-event.d.ts +1 -1
  112. package/dist/common/slider/mouse-event.js +1 -2
  113. package/dist/common/slider/slider-bar-handle.d.ts +1 -1
  114. package/dist/common/slider/slider-bar-handle.js +1 -1
  115. package/dist/common/slider/slider-handle.d.ts +3 -3
  116. package/dist/common/slider/slider-handle.js +1 -1
  117. package/dist/common/slider/slider.d.ts +8 -4
  118. package/dist/common/slider/slider.js +78 -35
  119. package/dist/common/styled-components.d.ts +628 -178
  120. package/dist/common/styled-components.js +2 -2
  121. package/dist/common/time-range-slider-time-title.d.ts +1 -1
  122. package/dist/common/time-range-slider-time-title.js +5 -5
  123. package/dist/common/time-range-slider.d.ts +2 -1
  124. package/dist/common/time-range-slider.js +19 -7
  125. package/dist/common/timeline-helpers.d.ts +3 -0
  126. package/dist/common/timeline-helpers.js +57 -0
  127. package/dist/common/timeline-slider.js +21 -12
  128. package/dist/common/toolbar-item.js +5 -5
  129. package/dist/common/toolbar.d.ts +1 -1
  130. package/dist/common/toolbar.js +4 -4
  131. package/dist/common/vertical-toolbar.d.ts +13 -3
  132. package/dist/container.d.ts +3 -2
  133. package/dist/container.js +2 -2
  134. package/dist/context.d.ts +1 -1
  135. package/dist/context.js +1 -1
  136. package/dist/dnd-context.d.ts +4 -3
  137. package/dist/dnd-context.js +64 -9
  138. package/dist/effects/compact-color-picker.d.ts +1 -1
  139. package/dist/effects/effect-configurator.d.ts +5 -6
  140. package/dist/effects/effect-configurator.js +213 -52
  141. package/dist/effects/effect-manager.js +3 -3
  142. package/dist/effects/effect-panel-header.js +34 -17
  143. package/dist/effects/effect-panel.d.ts +4 -4
  144. package/dist/effects/effect-panel.js +61 -86
  145. package/dist/effects/effect-time-configurator.js +10 -10
  146. package/dist/effects/effect-type-dropdown-list.d.ts +1 -0
  147. package/dist/effects/effect-type-dropdown-list.js +1 -1
  148. package/dist/effects/effect-type-list-item.d.ts +2 -1
  149. package/dist/effects/effect-type-list-item.js +23 -7
  150. package/dist/effects/effect-type-selector.d.ts +1 -0
  151. package/dist/effects/effect-type-selector.js +2 -2
  152. package/dist/effects/surface-fog-section.d.ts +14 -0
  153. package/dist/effects/surface-fog-section.js +263 -0
  154. package/dist/filters/components.d.ts +7 -5
  155. package/dist/filters/filter-panels/filter-synced-dataset-panel.d.ts +6 -2
  156. package/dist/filters/index.d.ts +1 -0
  157. package/dist/filters/index.js +8 -1
  158. package/dist/filters/polygon-filter.js +2 -2
  159. package/dist/filters/time-range-filter.js +3 -1
  160. package/dist/filters/time-widget-settings.d.ts +14 -0
  161. package/dist/filters/time-widget-settings.js +312 -0
  162. package/dist/filters/time-widget-top.d.ts +2 -3
  163. package/dist/filters/time-widget-top.js +32 -39
  164. package/dist/filters/time-widget.d.ts +3 -2
  165. package/dist/filters/time-widget.js +285 -9
  166. package/dist/filters/types.d.ts +3 -3
  167. package/dist/filters/types.js +1 -1
  168. package/dist/geocoder/geocoder.d.ts +4 -1
  169. package/dist/geocoder/geocoder.js +61 -14
  170. package/dist/geocoder-panel.d.ts +3 -2
  171. package/dist/geocoder-panel.js +11 -8
  172. package/dist/hooks/use-dnd-layers.d.ts +4 -3
  173. package/dist/hooks/use-dnd-layers.js +103 -42
  174. package/dist/index.d.ts +17 -2
  175. package/dist/index.js +161 -9
  176. package/dist/injector.d.ts +1 -1
  177. package/dist/kepler-gl.d.ts +179 -27
  178. package/dist/kepler-gl.js +91 -12
  179. package/dist/loading-indicator.d.ts +3 -1
  180. package/dist/loading-indicator.js +6 -3
  181. package/dist/map/annotations/annotation-control.d.ts +16 -0
  182. package/dist/map/annotations/annotation-control.js +56 -0
  183. package/dist/map/layer-hover-info.d.ts +7 -3
  184. package/dist/map/layer-hover-info.js +124 -55
  185. package/dist/map/locale-panel.d.ts +1 -1
  186. package/dist/map/locale-panel.js +2 -2
  187. package/dist/map/map-control-panel.js +3 -2
  188. package/dist/map/map-control-toolbar.d.ts +33 -8
  189. package/dist/map/map-control.d.ts +14 -4
  190. package/dist/map/map-control.js +18 -8
  191. package/dist/map/map-draw-panel.d.ts +1 -1
  192. package/dist/map/map-draw-panel.js +7 -4
  193. package/dist/map/map-legend-panel.d.ts +11 -2
  194. package/dist/map/map-legend-panel.js +25 -8
  195. package/dist/map/map-legend.d.ts +20 -3
  196. package/dist/map/map-legend.js +145 -31
  197. package/dist/map/map-navigation-control.d.ts +13 -0
  198. package/dist/map/map-navigation-control.js +143 -0
  199. package/dist/map/map-popover.js +2 -2
  200. package/dist/map/split-map-button.d.ts +6 -1
  201. package/dist/map/split-map-button.js +113 -19
  202. package/dist/map-container.d.ts +13 -3
  203. package/dist/map-container.js +269 -59
  204. package/dist/map-view-state-context.d.ts +1 -0
  205. package/dist/map-view-state-context.js +1 -1
  206. package/dist/maps-layout.d.ts +3 -0
  207. package/dist/maps-layout.js +86 -26
  208. package/dist/modal-container.d.ts +3 -2
  209. package/dist/modal-container.js +28 -6
  210. package/dist/modals/add-map-style-modal.js +173 -200
  211. package/dist/modals/cloud-tile.d.ts +1 -2
  212. package/dist/modals/data-table-modal.d.ts +1 -1
  213. package/dist/modals/data-table-modal.js +146 -194
  214. package/dist/modals/export-data-modal.js +117 -139
  215. package/dist/modals/export-map-modal/components.d.ts +9 -5
  216. package/dist/modals/export-video-modal.d.ts +28 -0
  217. package/dist/modals/export-video-modal.js +371 -0
  218. package/dist/modals/export-video-modal.spec.d.ts +1 -0
  219. package/dist/modals/export-video-modal.spec.js +686 -0
  220. package/dist/modals/fog-height-animation.d.ts +8 -0
  221. package/dist/modals/fog-height-animation.js +97 -0
  222. package/dist/modals/hubble-utils.d.ts +41 -0
  223. package/dist/modals/hubble-utils.js +294 -0
  224. package/dist/modals/hubble-utils.spec.d.ts +1 -0
  225. package/dist/modals/hubble-utils.spec.js +397 -0
  226. package/dist/modals/modal-dialog.d.ts +1 -1
  227. package/dist/modals/share-map-modal.d.ts +2 -4
  228. package/dist/modals/swipe-composite-utils.d.ts +10 -0
  229. package/dist/modals/swipe-composite-utils.js +108 -0
  230. package/dist/modals/swipe-export-settings.d.ts +24 -0
  231. package/dist/modals/swipe-export-settings.js +370 -0
  232. package/dist/modals/swipe-export-video-container.d.ts +122 -0
  233. package/dist/modals/swipe-export-video-container.js +630 -0
  234. package/dist/modals/swipe-export-video-preview.d.ts +68 -0
  235. package/dist/modals/swipe-export-video-preview.js +339 -0
  236. package/dist/modals/tilesets-modals/load-data-footer.js +2 -2
  237. package/dist/modals/tilesets-modals/load-tileset.js +21 -10
  238. package/dist/modals/tilesets-modals/tileset-bitmap-form.d.ts +14 -0
  239. package/dist/modals/tilesets-modals/tileset-bitmap-form.js +284 -0
  240. package/dist/modals/tilesets-modals/tileset-raster-form.js +90 -11
  241. package/dist/modals/tilesets-modals/tileset-tile3d-form.js +3 -2
  242. package/dist/modals/tilesets-modals/tileset-vector-form.js +58 -4
  243. package/dist/modals/tilesets-modals/tileset-wms-form.js +4 -3
  244. package/dist/notification-panel/notification-item.d.ts +1 -53
  245. package/dist/notification-panel/notification-item.js +47 -75
  246. package/dist/notification-panel.d.ts +1 -1
  247. package/dist/notification-panel.js +20 -42
  248. package/dist/plot-container.js +7 -6
  249. package/dist/side-panel/add-by-dataset-button.js +3 -3
  250. package/dist/side-panel/common/dataset-info.js +2 -2
  251. package/dist/side-panel/filter-panel/filter-panel-header.d.ts +7 -3
  252. package/dist/side-panel/interaction-panel/geocoder-config.d.ts +11 -0
  253. package/dist/side-panel/interaction-panel/geocoder-config.js +45 -0
  254. package/dist/side-panel/interaction-panel/interaction-panel.d.ts +3 -2
  255. package/dist/side-panel/interaction-panel/interaction-panel.js +10 -3
  256. package/dist/side-panel/layer-manager.d.ts +5 -4
  257. package/dist/side-panel/layer-manager.js +26 -6
  258. package/dist/side-panel/layer-panel/color-scale-selector.d.ts +1 -1
  259. package/dist/side-panel/layer-panel/color-scale-selector.js +1 -1
  260. package/dist/side-panel/layer-panel/color-selector.d.ts +6 -4
  261. package/dist/side-panel/layer-panel/custom-palette.d.ts +3 -5
  262. package/dist/side-panel/layer-panel/custom-palette.js +5 -5
  263. package/dist/side-panel/layer-panel/dataset-layer-group.d.ts +2 -1
  264. package/dist/side-panel/layer-panel/dataset-layer-group.js +1 -1
  265. package/dist/side-panel/layer-panel/dataset-layer-section.d.ts +2 -1
  266. package/dist/side-panel/layer-panel/dataset-layer-section.js +19 -3
  267. package/dist/side-panel/layer-panel/layer-config-group.d.ts +5 -11
  268. package/dist/side-panel/layer-panel/layer-configurator.d.ts +4 -2
  269. package/dist/side-panel/layer-panel/layer-configurator.js +450 -76
  270. package/dist/side-panel/layer-panel/layer-group-header.d.ts +15 -0
  271. package/dist/side-panel/layer-panel/layer-group-header.js +179 -0
  272. package/dist/side-panel/layer-panel/layer-list.d.ts +9 -4
  273. package/dist/side-panel/layer-panel/layer-list.js +197 -40
  274. package/dist/side-panel/layer-panel/layer-panel-header.js +2 -2
  275. package/dist/side-panel/layer-panel/raster-tile-layer-configurator.d.ts +1 -1
  276. package/dist/side-panel/layer-panel/raster-tile-layer-configurator.js +127 -27
  277. package/dist/side-panel/layer-panel/scenegraph-model-selector.d.ts +24 -0
  278. package/dist/side-panel/layer-panel/scenegraph-model-selector.js +123 -0
  279. package/dist/side-panel/layer-panel/text-label-panel.d.ts +1 -1
  280. package/dist/side-panel/layer-panel/text-label-panel.js +11 -2
  281. package/dist/side-panel/layer-panel/vector-tile-layer-configurator.d.ts +1 -1
  282. package/dist/side-panel/layer-panel/vector-tile-layer-configurator.js +2 -10
  283. package/dist/side-panel/layer-panel/vis-config-slider.d.ts +2 -0
  284. package/dist/side-panel/layer-panel/vis-config-slider.js +7 -3
  285. package/dist/side-panel/panel-header.d.ts +1 -0
  286. package/dist/side-panel/panel-header.js +9 -2
  287. package/dist/side-panel/panel-tab.d.ts +2 -4
  288. package/dist/side-panel/panel-tab.js +4 -4
  289. package/dist/side-panel/panel-view-list-toggle.d.ts +4 -4
  290. package/dist/side-panel/side-bar.d.ts +1 -6
  291. package/dist/side-panel.d.ts +1 -1
  292. package/dist/side-panel.js +5 -1
  293. package/dist/types.d.ts +2 -2
  294. package/dist/types.js +1 -1
  295. package/package.json +53 -48
  296. package/dist/map/layer-selector-panel.d.ts +0 -21
  297. package/dist/map/layer-selector-panel.js +0 -85
  298. package/dist/side-panel/layer-panel/radius-by-zoom-input.d.ts +0 -11
  299. package/dist/side-panel/layer-panel/radius-by-zoom-input.js +0 -220
@@ -0,0 +1,686 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
6
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
7
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _styledComponents = require("styled-components");
10
+ var _reactIntl = require("react-intl");
11
+ var _react2 = require("@testing-library/react");
12
+ var _styles = require("@kepler.gl/styles");
13
+ var _localization = require("@kepler.gl/localization");
14
+ var _exportVideoModal = _interopRequireDefault(require("./export-video-modal"));
15
+ var _effects = require("@kepler.gl/effects");
16
+ 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; }
17
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
18
+ // Copyright contributors to the kepler.gl project
19
+ // @ts-nocheck
20
+ var mockExportVideoPanelContainer = jest.fn(function () {
21
+ return /*#__PURE__*/_react["default"].createElement("div", {
22
+ "data-testid": "export-video-panel"
23
+ }, "Mock Panel");
24
+ });
25
+ var MockKeplerUIContext = /*#__PURE__*/_react["default"].createContext(null);
26
+ jest.mock('@hubble.gl/react', function () {
27
+ return {
28
+ ExportVideoPanelContainer: function ExportVideoPanelContainer(props) {
29
+ return mockExportVideoPanelContainer(props);
30
+ },
31
+ KeplerUIContext: MockKeplerUIContext
32
+ };
33
+ });
34
+ var mockComputeDeckEffects = jest.fn(function () {
35
+ return [];
36
+ });
37
+ jest.mock('@kepler.gl/utils', function () {
38
+ var actual = jest.requireActual('@kepler.gl/utils');
39
+ return _objectSpread(_objectSpread({}, actual), {}, {
40
+ computeDeckEffects: function computeDeckEffects() {
41
+ return mockComputeDeckEffects.apply(void 0, arguments);
42
+ },
43
+ patchDeckRendererForPostProcessing: jest.fn()
44
+ });
45
+ });
46
+ jest.mock('@kepler.gl/effects', function () {
47
+ return {
48
+ DeckShadowCompositingEffect: jest.fn().mockImplementation(function () {
49
+ return {
50
+ id: 'shadow-compositing-effect',
51
+ postRender: jest.fn(),
52
+ cleanup: jest.fn()
53
+ };
54
+ })
55
+ };
56
+ });
57
+ jest.mock('./hubble-utils', function () {
58
+ return {
59
+ getStaticMapProps: jest.fn(function (_state, _onChange, _token) {
60
+ return {
61
+ latitude: 37.7,
62
+ longitude: -122.4,
63
+ preserveDrawingBuffer: true,
64
+ mapboxApiAccessToken: 'style-token',
65
+ mapStyle: {
66
+ id: 'dark-style'
67
+ },
68
+ mapLib: Promise.resolve({})
69
+ };
70
+ }),
71
+ getBeforeLayerId: jest.fn(function () {
72
+ return null;
73
+ }),
74
+ getHubbleDeckGlProps: jest.fn(function () {
75
+ return {
76
+ parameters: {
77
+ blend: true
78
+ },
79
+ controller: true,
80
+ views: {}
81
+ };
82
+ }),
83
+ getTimeRangeFilterKeyframes: jest.fn(),
84
+ getAnimatableFilters: jest.fn(function () {
85
+ return [];
86
+ })
87
+ };
88
+ });
89
+ function renderWithThemeLocal(component) {
90
+ return (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_styledComponents.ThemeProvider, {
91
+ theme: _styles.theme
92
+ }, /*#__PURE__*/_react["default"].createElement(_reactIntl.IntlProvider, {
93
+ locale: "en",
94
+ messages: _localization.messages
95
+ }, component)));
96
+ }
97
+ var ExportVideoModal = (0, _exportVideoModal["default"])();
98
+ var DEFAULT_PROPS = {
99
+ mapboxApiAccessToken: 'test-token',
100
+ mapboxApiUrl: 'https://api.mapbox.com',
101
+ mapState: {
102
+ latitude: 37.7,
103
+ longitude: -122.4,
104
+ zoom: 10
105
+ },
106
+ mapStyle: {
107
+ styleType: 'dark',
108
+ mapStyles: {
109
+ dark: {
110
+ accessToken: 'style-token'
111
+ }
112
+ },
113
+ bottomMapStyle: {
114
+ id: 'dark-style'
115
+ },
116
+ topMapStyle: null
117
+ },
118
+ visState: {
119
+ filters: [],
120
+ layers: [],
121
+ layerBlending: 'normal',
122
+ layerOrder: []
123
+ },
124
+ exportVideo: {
125
+ mediaType: 'webm',
126
+ cameraPreset: 'None',
127
+ fileName: 'kepler.gl',
128
+ resolution: '1280x720',
129
+ durationMs: 1000
130
+ },
131
+ containerW: 800,
132
+ visStateActions: {
133
+ setFilterAnimationTime: jest.fn(),
134
+ setLayerAnimationTime: jest.fn()
135
+ },
136
+ uiStateActions: {
137
+ setExportVideoSetting: jest.fn()
138
+ },
139
+ onClose: jest.fn()
140
+ };
141
+ function renderAndWaitForPanel() {
142
+ return _renderAndWaitForPanel.apply(this, arguments);
143
+ }
144
+ function _renderAndWaitForPanel() {
145
+ _renderAndWaitForPanel = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20() {
146
+ var props,
147
+ result,
148
+ _args20 = arguments;
149
+ return _regenerator["default"].wrap(function _callee20$(_context20) {
150
+ while (1) switch (_context20.prev = _context20.next) {
151
+ case 0:
152
+ props = _args20.length > 0 && _args20[0] !== undefined ? _args20[0] : DEFAULT_PROPS;
153
+ result = renderWithThemeLocal( /*#__PURE__*/_react["default"].createElement(ExportVideoModal, props));
154
+ _context20.next = 4;
155
+ return (0, _react2.waitFor)(function () {
156
+ expect(mockExportVideoPanelContainer).toHaveBeenCalled();
157
+ });
158
+ case 4:
159
+ return _context20.abrupt("return", result);
160
+ case 5:
161
+ case "end":
162
+ return _context20.stop();
163
+ }
164
+ }, _callee20);
165
+ }));
166
+ return _renderAndWaitForPanel.apply(this, arguments);
167
+ }
168
+ describe('ExportVideoModal', function () {
169
+ beforeEach(function () {
170
+ jest.clearAllMocks();
171
+ mockComputeDeckEffects.mockReturnValue([]);
172
+ });
173
+ test('renders without crashing', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
174
+ var _yield$renderAndWaitF, container;
175
+ return _regenerator["default"].wrap(function _callee$(_context) {
176
+ while (1) switch (_context.prev = _context.next) {
177
+ case 0:
178
+ _context.next = 2;
179
+ return renderAndWaitForPanel();
180
+ case 2:
181
+ _yield$renderAndWaitF = _context.sent;
182
+ container = _yield$renderAndWaitF.container;
183
+ expect(container.querySelector('.export-video-modal')).toBeInTheDocument();
184
+ case 5:
185
+ case "end":
186
+ return _context.stop();
187
+ }
188
+ }, _callee);
189
+ })));
190
+ test('provides KeplerUI context with expected components', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
191
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
192
+ while (1) switch (_context2.prev = _context2.next) {
193
+ case 0:
194
+ _context2.next = 2;
195
+ return renderAndWaitForPanel();
196
+ case 2:
197
+ expect(mockExportVideoPanelContainer).toHaveBeenCalledTimes(1);
198
+ case 3:
199
+ case "end":
200
+ return _context2.stop();
201
+ }
202
+ }, _callee2);
203
+ })));
204
+ test('passes correct props to ExportVideoPanelContainer', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
205
+ var panelProps;
206
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
207
+ while (1) switch (_context3.prev = _context3.next) {
208
+ case 0:
209
+ _context3.next = 2;
210
+ return renderAndWaitForPanel();
211
+ case 2:
212
+ expect(mockExportVideoPanelContainer).toHaveBeenCalledTimes(1);
213
+ panelProps = mockExportVideoPanelContainer.mock.calls[0][0];
214
+ expect(panelProps.header).toBe(false);
215
+ expect(panelProps.disableBaseMap).toBe(false);
216
+ expect(panelProps.defaultFileName).toBe('kepler.gl');
217
+ expect(panelProps.exportVideoWidth).toBeLessThanOrEqual(540);
218
+ expect(panelProps.exportVideoWidth).toBeGreaterThanOrEqual(320);
219
+ expect(panelProps.handleClose).toBe(DEFAULT_PROPS.onClose);
220
+ expect(panelProps.initialState).toEqual(DEFAULT_PROPS.exportVideo);
221
+ expect(panelProps.mapData).toEqual({
222
+ visState: DEFAULT_PROPS.visState,
223
+ mapState: DEFAULT_PROPS.mapState,
224
+ mapStyle: DEFAULT_PROPS.mapStyle
225
+ });
226
+ case 12:
227
+ case "end":
228
+ return _context3.stop();
229
+ }
230
+ }, _callee3);
231
+ })));
232
+ test('passes deckProps from getHubbleDeckGlProps', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
233
+ var panelProps;
234
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
235
+ while (1) switch (_context4.prev = _context4.next) {
236
+ case 0:
237
+ _context4.next = 2;
238
+ return renderAndWaitForPanel();
239
+ case 2:
240
+ panelProps = mockExportVideoPanelContainer.mock.calls[0][0];
241
+ expect(panelProps.deckProps).toEqual({
242
+ parameters: {
243
+ blend: true
244
+ },
245
+ controller: true,
246
+ views: {},
247
+ _isExport: true,
248
+ effects: []
249
+ });
250
+ case 4:
251
+ case "end":
252
+ return _context4.stop();
253
+ }
254
+ }, _callee4);
255
+ })));
256
+ test('passes mapProps from getStaticMapProps', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
257
+ var panelProps;
258
+ return _regenerator["default"].wrap(function _callee5$(_context5) {
259
+ while (1) switch (_context5.prev = _context5.next) {
260
+ case 0:
261
+ _context5.next = 2;
262
+ return renderAndWaitForPanel();
263
+ case 2:
264
+ panelProps = mockExportVideoPanelContainer.mock.calls[0][0];
265
+ expect(panelProps.mapProps.latitude).toBe(37.7);
266
+ expect(panelProps.mapProps.longitude).toBe(-122.4);
267
+ expect(panelProps.mapProps.preserveDrawingBuffer).toBe(true);
268
+ expect(panelProps.mapProps.mapboxApiAccessToken).toBe('style-token');
269
+ expect(panelProps.mapProps.mapStyle).toEqual({
270
+ id: 'dark-style'
271
+ });
272
+ expect(panelProps.mapProps.mapLib).toBeDefined();
273
+ case 9:
274
+ case "end":
275
+ return _context5.stop();
276
+ }
277
+ }, _callee5);
278
+ })));
279
+ test('passes empty animatableFilters when no matching filters', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
280
+ var panelProps;
281
+ return _regenerator["default"].wrap(function _callee6$(_context6) {
282
+ while (1) switch (_context6.prev = _context6.next) {
283
+ case 0:
284
+ _context6.next = 2;
285
+ return renderAndWaitForPanel();
286
+ case 2:
287
+ panelProps = mockExportVideoPanelContainer.mock.calls[0][0];
288
+ expect(panelProps.animatableFilters).toEqual([]);
289
+ case 4:
290
+ case "end":
291
+ return _context6.stop();
292
+ }
293
+ }, _callee6);
294
+ })));
295
+ test('provides getTimeRangeFilterKeyframes callback', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
296
+ var panelProps;
297
+ return _regenerator["default"].wrap(function _callee7$(_context7) {
298
+ while (1) switch (_context7.prev = _context7.next) {
299
+ case 0:
300
+ _context7.next = 2;
301
+ return renderAndWaitForPanel();
302
+ case 2:
303
+ panelProps = mockExportVideoPanelContainer.mock.calls[0][0];
304
+ expect((0, _typeof2["default"])(panelProps.getTimeRangeFilterKeyframes)).toBe('function');
305
+ case 4:
306
+ case "end":
307
+ return _context7.stop();
308
+ }
309
+ }, _callee7);
310
+ })));
311
+ test('provides onFilterFrameUpdate that calls visStateActions', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8() {
312
+ var panelProps;
313
+ return _regenerator["default"].wrap(function _callee8$(_context8) {
314
+ while (1) switch (_context8.prev = _context8.next) {
315
+ case 0:
316
+ _context8.next = 2;
317
+ return renderAndWaitForPanel();
318
+ case 2:
319
+ panelProps = mockExportVideoPanelContainer.mock.calls[0][0];
320
+ panelProps.onFilterFrameUpdate(0, 'value', [100, 200]);
321
+ expect(DEFAULT_PROPS.visStateActions.setFilterAnimationTime).toHaveBeenCalledWith(0, 'value', [100, 200]);
322
+ case 5:
323
+ case "end":
324
+ return _context8.stop();
325
+ }
326
+ }, _callee8);
327
+ })));
328
+ test('provides onTripFrameUpdate that calls visStateActions', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
329
+ var panelProps;
330
+ return _regenerator["default"].wrap(function _callee9$(_context9) {
331
+ while (1) switch (_context9.prev = _context9.next) {
332
+ case 0:
333
+ _context9.next = 2;
334
+ return renderAndWaitForPanel();
335
+ case 2:
336
+ panelProps = mockExportVideoPanelContainer.mock.calls[0][0];
337
+ panelProps.onTripFrameUpdate(42);
338
+ expect(DEFAULT_PROPS.visStateActions.setLayerAnimationTime).toHaveBeenCalledWith(42);
339
+ case 5:
340
+ case "end":
341
+ return _context9.stop();
342
+ }
343
+ }, _callee9);
344
+ })));
345
+ describe('NO_MAP_ID handling', function () {
346
+ var NO_MAP_PROPS = _objectSpread(_objectSpread({}, DEFAULT_PROPS), {}, {
347
+ mapStyle: {
348
+ styleType: 'no_map',
349
+ mapStyles: {
350
+ no_map: {
351
+ id: 'no_map',
352
+ label: 'No Basemap',
353
+ // url is intentionally missing to exercise the data-URI patch
354
+ icon: '',
355
+ layerGroups: [],
356
+ colorMode: 'NONE',
357
+ style: {
358
+ version: 8,
359
+ sources: {},
360
+ layers: []
361
+ }
362
+ }
363
+ },
364
+ bottomMapStyle: null,
365
+ topMapStyle: null
366
+ }
367
+ });
368
+ test('renders without crashing when styleType is NO_MAP_ID', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
369
+ var _yield$renderAndWaitF2, container;
370
+ return _regenerator["default"].wrap(function _callee10$(_context10) {
371
+ while (1) switch (_context10.prev = _context10.next) {
372
+ case 0:
373
+ _context10.next = 2;
374
+ return renderAndWaitForPanel(NO_MAP_PROPS);
375
+ case 2:
376
+ _yield$renderAndWaitF2 = _context10.sent;
377
+ container = _yield$renderAndWaitF2.container;
378
+ expect(container.querySelector('.export-video-modal')).toBeInTheDocument();
379
+ case 5:
380
+ case "end":
381
+ return _context10.stop();
382
+ }
383
+ }, _callee10);
384
+ })));
385
+ test('injects data-URI empty style URL into mapData when NO_MAP_ID entry has no url', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11() {
386
+ var panelProps, noMapEntry, encoded, decoded;
387
+ return _regenerator["default"].wrap(function _callee11$(_context11) {
388
+ while (1) switch (_context11.prev = _context11.next) {
389
+ case 0:
390
+ _context11.next = 2;
391
+ return renderAndWaitForPanel(NO_MAP_PROPS);
392
+ case 2:
393
+ panelProps = mockExportVideoPanelContainer.mock.calls[0][0];
394
+ noMapEntry = panelProps.mapData.mapStyle.mapStyles.no_map;
395
+ expect(noMapEntry.url).toBeDefined();
396
+ expect(noMapEntry.url).toMatch(/^data:application\/json,/);
397
+ encoded = noMapEntry.url.replace('data:application/json,', '');
398
+ decoded = JSON.parse(decodeURIComponent(encoded));
399
+ expect(decoded).toEqual({
400
+ version: 8,
401
+ sources: {},
402
+ layers: []
403
+ });
404
+ case 9:
405
+ case "end":
406
+ return _context11.stop();
407
+ }
408
+ }, _callee11);
409
+ })));
410
+ test('preserves original mapStyle when NO_MAP_ID entry already has a url', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12() {
411
+ var propsWithUrl, panelProps;
412
+ return _regenerator["default"].wrap(function _callee12$(_context12) {
413
+ while (1) switch (_context12.prev = _context12.next) {
414
+ case 0:
415
+ propsWithUrl = _objectSpread(_objectSpread({}, DEFAULT_PROPS), {}, {
416
+ mapStyle: {
417
+ styleType: 'no_map',
418
+ mapStyles: {
419
+ no_map: {
420
+ id: 'no_map',
421
+ url: 'https://existing-style.json'
422
+ }
423
+ },
424
+ bottomMapStyle: null,
425
+ topMapStyle: null
426
+ }
427
+ });
428
+ _context12.next = 3;
429
+ return renderAndWaitForPanel(propsWithUrl);
430
+ case 3:
431
+ panelProps = mockExportVideoPanelContainer.mock.calls[0][0];
432
+ expect(panelProps.mapData.mapStyle).toBe(propsWithUrl.mapStyle);
433
+ case 5:
434
+ case "end":
435
+ return _context12.stop();
436
+ }
437
+ }, _callee12);
438
+ })));
439
+ });
440
+ describe('surface fog height animation', function () {
441
+ function makeFogDeckEffect() {
442
+ var effect = {
443
+ id: 'surface-fog-deck',
444
+ props: {
445
+ height: 50
446
+ },
447
+ postRender: jest.fn(),
448
+ setProps: jest.fn(function (newProps) {
449
+ Object.assign(effect.props, newProps);
450
+ })
451
+ };
452
+ return effect;
453
+ }
454
+ function makeSurfaceFogEffect(deckEffect) {
455
+ var overrides = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
456
+ var effect = {
457
+ id: 'fog-1',
458
+ type: 'surfaceFog',
459
+ isEnabled: true,
460
+ parameters: _objectSpread({
461
+ height: 50,
462
+ animateHeight: true,
463
+ heightEnd: 200,
464
+ linearEasing: false
465
+ }, overrides),
466
+ deckEffect: deckEffect,
467
+ clone: jest.fn()
468
+ };
469
+ // clone returns a fresh reference that still points to the same deckEffect
470
+ effect.clone.mockImplementation(function () {
471
+ return _objectSpread(_objectSpread({}, effect), {}, {
472
+ clone: effect.clone
473
+ });
474
+ });
475
+ return effect;
476
+ }
477
+ function propsWithFogEffect(fogEffect) {
478
+ return _objectSpread(_objectSpread({}, DEFAULT_PROPS), {}, {
479
+ visState: _objectSpread(_objectSpread({}, DEFAULT_PROPS.visState), {}, {
480
+ effects: [fogEffect],
481
+ effectOrder: [fogEffect.id]
482
+ })
483
+ });
484
+ }
485
+ test('patches deckEffect.postRender when animateHeight is enabled', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13() {
486
+ var deckEffect, originalPostRender, fogEffect;
487
+ return _regenerator["default"].wrap(function _callee13$(_context13) {
488
+ while (1) switch (_context13.prev = _context13.next) {
489
+ case 0:
490
+ deckEffect = makeFogDeckEffect();
491
+ originalPostRender = deckEffect.postRender;
492
+ fogEffect = makeSurfaceFogEffect(deckEffect);
493
+ mockComputeDeckEffects.mockReturnValue([deckEffect]);
494
+ _context13.next = 6;
495
+ return renderAndWaitForPanel(propsWithFogEffect(fogEffect));
496
+ case 6:
497
+ expect(deckEffect.postRender).not.toBe(originalPostRender);
498
+ case 7:
499
+ case "end":
500
+ return _context13.stop();
501
+ }
502
+ }, _callee13);
503
+ })));
504
+ test('restores original height when hubble is not playing', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14() {
505
+ var deckEffect, fogEffect;
506
+ return _regenerator["default"].wrap(function _callee14$(_context14) {
507
+ while (1) switch (_context14.prev = _context14.next) {
508
+ case 0:
509
+ deckEffect = makeFogDeckEffect();
510
+ deckEffect.props.height = 75;
511
+ fogEffect = makeSurfaceFogEffect(deckEffect, {
512
+ height: 75
513
+ });
514
+ mockComputeDeckEffects.mockReturnValue([deckEffect]);
515
+ _context14.next = 6;
516
+ return renderAndWaitForPanel(propsWithFogEffect(fogEffect));
517
+ case 6:
518
+ // Call the patched postRender without hubble playing
519
+ deckEffect.postRender.call(deckEffect, {});
520
+
521
+ // Not playing → height resets to originalHeight
522
+ expect(deckEffect.props.height).toBe(75);
523
+ case 8:
524
+ case "end":
525
+ return _context14.stop();
526
+ }
527
+ }, _callee14);
528
+ })));
529
+ test('does not mutate height when animateHeight is disabled', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15() {
530
+ var deckEffect, fogEffect;
531
+ return _regenerator["default"].wrap(function _callee15$(_context15) {
532
+ while (1) switch (_context15.prev = _context15.next) {
533
+ case 0:
534
+ deckEffect = makeFogDeckEffect();
535
+ fogEffect = makeSurfaceFogEffect(deckEffect, {
536
+ animateHeight: false
537
+ });
538
+ mockComputeDeckEffects.mockReturnValue([deckEffect]);
539
+ _context15.next = 5;
540
+ return renderAndWaitForPanel(propsWithFogEffect(fogEffect));
541
+ case 5:
542
+ deckEffect.props.height = 42;
543
+ deckEffect.postRender.call(deckEffect, {});
544
+
545
+ // ref.active is false so height should not be touched
546
+ expect(deckEffect.props.height).toBe(42);
547
+ case 8:
548
+ case "end":
549
+ return _context15.stop();
550
+ }
551
+ }, _callee15);
552
+ })));
553
+ test('restores original postRender on unmount', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16() {
554
+ var deckEffect, fogEffect, _yield$renderAndWaitF3, unmount, patchedPostRender;
555
+ return _regenerator["default"].wrap(function _callee16$(_context16) {
556
+ while (1) switch (_context16.prev = _context16.next) {
557
+ case 0:
558
+ deckEffect = makeFogDeckEffect();
559
+ fogEffect = makeSurfaceFogEffect(deckEffect);
560
+ mockComputeDeckEffects.mockReturnValue([deckEffect]);
561
+ _context16.next = 5;
562
+ return renderAndWaitForPanel(propsWithFogEffect(fogEffect));
563
+ case 5:
564
+ _yield$renderAndWaitF3 = _context16.sent;
565
+ unmount = _yield$renderAndWaitF3.unmount;
566
+ // postRender was patched (the wrapper function drives animation)
567
+ patchedPostRender = deckEffect.postRender; // Verify it's not the original mock (component binds and wraps it)
568
+ expect(patchedPostRender).not.toBe(deckEffect.postRender.bind(deckEffect));
569
+ unmount();
570
+
571
+ // After unmount, postRender no longer drives animation.
572
+ // The restored function is a bound copy of the original mock.
573
+ deckEffect.props.height = 99;
574
+ deckEffect.postRender.call(deckEffect, {});
575
+ // Height should NOT be mutated by animation logic anymore
576
+ expect(deckEffect.props.height).toBe(99);
577
+ case 13:
578
+ case "end":
579
+ return _context16.stop();
580
+ }
581
+ }, _callee16);
582
+ })));
583
+ });
584
+ describe('shadow compositing fallback', function () {
585
+ var mockEffect = {
586
+ id: 'light-shadow-1',
587
+ type: 'light-and-shadow',
588
+ isEnabled: true,
589
+ clone: jest.fn(function () {
590
+ return _objectSpread(_objectSpread({}, mockEffect), {}, {
591
+ clone: mockEffect.clone
592
+ });
593
+ })
594
+ };
595
+ function propsWithEffects(effects) {
596
+ return _objectSpread(_objectSpread({}, DEFAULT_PROPS), {}, {
597
+ visState: _objectSpread(_objectSpread({}, DEFAULT_PROPS.visState), {}, {
598
+ effects: effects,
599
+ effectOrder: effects.map(function (e) {
600
+ return e.id;
601
+ })
602
+ })
603
+ });
604
+ }
605
+ test('adds DeckShadowCompositingEffect when shadows exist but no postRender effect', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17() {
606
+ var shadowDeckEffect, panelProps, effects;
607
+ return _regenerator["default"].wrap(function _callee17$(_context17) {
608
+ while (1) switch (_context17.prev = _context17.next) {
609
+ case 0:
610
+ shadowDeckEffect = {
611
+ id: 'lighting',
612
+ shadow: true
613
+ };
614
+ mockComputeDeckEffects.mockReturnValue([shadowDeckEffect]);
615
+ _context17.next = 4;
616
+ return renderAndWaitForPanel(propsWithEffects([mockEffect]));
617
+ case 4:
618
+ panelProps = mockExportVideoPanelContainer.mock.calls[0][0];
619
+ effects = panelProps.deckProps.effects;
620
+ expect(effects.length).toBe(2);
621
+ expect(effects[0]).toBe(shadowDeckEffect);
622
+ expect(effects[1].id).toBe('shadow-compositing-effect');
623
+ expect(_effects.DeckShadowCompositingEffect).toHaveBeenCalled();
624
+ case 10:
625
+ case "end":
626
+ return _context17.stop();
627
+ }
628
+ }, _callee17);
629
+ })));
630
+ test('does not add DeckShadowCompositingEffect when a postRender effect already exists', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18() {
631
+ var shadowDeckEffect, postProcessEffect, panelProps, effects;
632
+ return _regenerator["default"].wrap(function _callee18$(_context18) {
633
+ while (1) switch (_context18.prev = _context18.next) {
634
+ case 0:
635
+ shadowDeckEffect = {
636
+ id: 'lighting',
637
+ shadow: true
638
+ };
639
+ postProcessEffect = {
640
+ id: 'fog',
641
+ postRender: jest.fn()
642
+ };
643
+ mockComputeDeckEffects.mockReturnValue([shadowDeckEffect, postProcessEffect]);
644
+ _context18.next = 5;
645
+ return renderAndWaitForPanel(propsWithEffects([mockEffect]));
646
+ case 5:
647
+ panelProps = mockExportVideoPanelContainer.mock.calls[0][0];
648
+ effects = panelProps.deckProps.effects;
649
+ expect(effects.length).toBe(2);
650
+ expect(effects[0]).toBe(shadowDeckEffect);
651
+ expect(effects[1]).toBe(postProcessEffect);
652
+ expect(effects.every(function (e) {
653
+ return e.id !== 'shadow-compositing-effect';
654
+ })).toBe(true);
655
+ case 11:
656
+ case "end":
657
+ return _context18.stop();
658
+ }
659
+ }, _callee18);
660
+ })));
661
+ test('does not add DeckShadowCompositingEffect when no shadow effect exists', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19() {
662
+ var nonShadowEffect, panelProps, effects;
663
+ return _regenerator["default"].wrap(function _callee19$(_context19) {
664
+ while (1) switch (_context19.prev = _context19.next) {
665
+ case 0:
666
+ nonShadowEffect = {
667
+ id: 'lighting',
668
+ shadow: false
669
+ };
670
+ mockComputeDeckEffects.mockReturnValue([nonShadowEffect]);
671
+ _context19.next = 4;
672
+ return renderAndWaitForPanel(propsWithEffects([mockEffect]));
673
+ case 4:
674
+ panelProps = mockExportVideoPanelContainer.mock.calls[0][0];
675
+ effects = panelProps.deckProps.effects;
676
+ expect(effects.length).toBe(1);
677
+ expect(effects[0]).toBe(nonShadowEffect);
678
+ case 8:
679
+ case "end":
680
+ return _context19.stop();
681
+ }
682
+ }, _callee19);
683
+ })));
684
+ });
685
+ });
686
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zdHlsZWRDb21wb25lbnRzIiwiX3JlYWN0SW50bCIsIl9yZWFjdDIiLCJfc3R5bGVzIiwiX2xvY2FsaXphdGlvbiIsIl9leHBvcnRWaWRlb01vZGFsIiwiX2VmZmVjdHMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIm1vY2tFeHBvcnRWaWRlb1BhbmVsQ29udGFpbmVyIiwiamVzdCIsImZuIiwiY3JlYXRlRWxlbWVudCIsIk1vY2tLZXBsZXJVSUNvbnRleHQiLCJSZWFjdCIsImNyZWF0ZUNvbnRleHQiLCJtb2NrIiwiRXhwb3J0VmlkZW9QYW5lbENvbnRhaW5lciIsInByb3BzIiwiS2VwbGVyVUlDb250ZXh0IiwibW9ja0NvbXB1dGVEZWNrRWZmZWN0cyIsImFjdHVhbCIsInJlcXVpcmVBY3R1YWwiLCJjb21wdXRlRGVja0VmZmVjdHMiLCJwYXRjaERlY2tSZW5kZXJlckZvclBvc3RQcm9jZXNzaW5nIiwiRGVja1NoYWRvd0NvbXBvc2l0aW5nRWZmZWN0IiwibW9ja0ltcGxlbWVudGF0aW9uIiwiaWQiLCJwb3N0UmVuZGVyIiwiY2xlYW51cCIsImdldFN0YXRpY01hcFByb3BzIiwiX3N0YXRlIiwiX29uQ2hhbmdlIiwiX3Rva2VuIiwibGF0aXR1ZGUiLCJsb25naXR1ZGUiLCJwcmVzZXJ2ZURyYXdpbmdCdWZmZXIiLCJtYXBib3hBcGlBY2Nlc3NUb2tlbiIsIm1hcFN0eWxlIiwibWFwTGliIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXRCZWZvcmVMYXllcklkIiwiZ2V0SHViYmxlRGVja0dsUHJvcHMiLCJwYXJhbWV0ZXJzIiwiYmxlbmQiLCJjb250cm9sbGVyIiwidmlld3MiLCJnZXRUaW1lUmFuZ2VGaWx0ZXJLZXlmcmFtZXMiLCJnZXRBbmltYXRhYmxlRmlsdGVycyIsInJlbmRlcldpdGhUaGVtZUxvY2FsIiwiY29tcG9uZW50IiwicmVuZGVyIiwiVGhlbWVQcm92aWRlciIsInRoZW1lIiwiSW50bFByb3ZpZGVyIiwibG9jYWxlIiwibWVzc2FnZXMiLCJFeHBvcnRWaWRlb01vZGFsIiwiRXhwb3J0VmlkZW9Nb2RhbEZhY3RvcnkiLCJERUZBVUxUX1BST1BTIiwibWFwYm94QXBpVXJsIiwibWFwU3RhdGUiLCJ6b29tIiwic3R5bGVUeXBlIiwibWFwU3R5bGVzIiwiZGFyayIsImFjY2Vzc1Rva2VuIiwiYm90dG9tTWFwU3R5bGUiLCJ0b3BNYXBTdHlsZSIsInZpc1N0YXRlIiwiZmlsdGVycyIsImxheWVycyIsImxheWVyQmxlbmRpbmciLCJsYXllck9yZGVyIiwiZXhwb3J0VmlkZW8iLCJtZWRpYVR5cGUiLCJjYW1lcmFQcmVzZXQiLCJmaWxlTmFtZSIsInJlc29sdXRpb24iLCJkdXJhdGlvbk1zIiwiY29udGFpbmVyVyIsInZpc1N0YXRlQWN0aW9ucyIsInNldEZpbHRlckFuaW1hdGlvblRpbWUiLCJzZXRMYXllckFuaW1hdGlvblRpbWUiLCJ1aVN0YXRlQWN0aW9ucyIsInNldEV4cG9ydFZpZGVvU2V0dGluZyIsIm9uQ2xvc2UiLCJyZW5kZXJBbmRXYWl0Rm9yUGFuZWwiLCJfcmVuZGVyQW5kV2FpdEZvclBhbmVsIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUyMCIsInJlc3VsdCIsIl9hcmdzMjAiLCJ3cmFwIiwiX2NhbGxlZTIwJCIsIl9jb250ZXh0MjAiLCJwcmV2IiwibmV4dCIsInVuZGVmaW5lZCIsIndhaXRGb3IiLCJleHBlY3QiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwiYWJydXB0Iiwic3RvcCIsImRlc2NyaWJlIiwiYmVmb3JlRWFjaCIsImNsZWFyQWxsTW9ja3MiLCJtb2NrUmV0dXJuVmFsdWUiLCJ0ZXN0IiwiX2NhbGxlZSIsIl95aWVsZCRyZW5kZXJBbmRXYWl0RiIsImNvbnRhaW5lciIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJzZW50IiwicXVlcnlTZWxlY3RvciIsInRvQmVJblRoZURvY3VtZW50IiwiX2NhbGxlZTIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJfY2FsbGVlMyIsInBhbmVsUHJvcHMiLCJfY2FsbGVlMyQiLCJfY29udGV4dDMiLCJjYWxscyIsImhlYWRlciIsInRvQmUiLCJkaXNhYmxlQmFzZU1hcCIsImRlZmF1bHRGaWxlTmFtZSIsImV4cG9ydFZpZGVvV2lkdGgiLCJ0b0JlTGVzc1RoYW5PckVxdWFsIiwidG9CZUdyZWF0ZXJUaGFuT3JFcXVhbCIsImhhbmRsZUNsb3NlIiwiaW5pdGlhbFN0YXRlIiwidG9FcXVhbCIsIm1hcERhdGEiLCJfY2FsbGVlNCIsIl9jYWxsZWU0JCIsIl9jb250ZXh0NCIsImRlY2tQcm9wcyIsIl9pc0V4cG9ydCIsImVmZmVjdHMiLCJfY2FsbGVlNSIsIl9jYWxsZWU1JCIsIl9jb250ZXh0NSIsIm1hcFByb3BzIiwidG9CZURlZmluZWQiLCJfY2FsbGVlNiIsIl9jYWxsZWU2JCIsIl9jb250ZXh0NiIsImFuaW1hdGFibGVGaWx0ZXJzIiwiX2NhbGxlZTciLCJfY2FsbGVlNyQiLCJfY29udGV4dDciLCJfdHlwZW9mMiIsIl9jYWxsZWU4IiwiX2NhbGxlZTgkIiwiX2NvbnRleHQ4Iiwib25GaWx0ZXJGcmFtZVVwZGF0ZSIsInRvSGF2ZUJlZW5DYWxsZWRXaXRoIiwiX2NhbGxlZTkiLCJfY2FsbGVlOSQiLCJfY29udGV4dDkiLCJvblRyaXBGcmFtZVVwZGF0ZSIsIk5PX01BUF9QUk9QUyIsIm5vX21hcCIsImxhYmVsIiwiaWNvbiIsImxheWVyR3JvdXBzIiwiY29sb3JNb2RlIiwic3R5bGUiLCJ2ZXJzaW9uIiwic291cmNlcyIsIl9jYWxsZWUxMCIsIl95aWVsZCRyZW5kZXJBbmRXYWl0RjIiLCJfY2FsbGVlMTAkIiwiX2NvbnRleHQxMCIsIl9jYWxsZWUxMSIsIm5vTWFwRW50cnkiLCJlbmNvZGVkIiwiZGVjb2RlZCIsIl9jYWxsZWUxMSQiLCJfY29udGV4dDExIiwidXJsIiwidG9NYXRjaCIsInJlcGxhY2UiLCJKU09OIiwicGFyc2UiLCJkZWNvZGVVUklDb21wb25lbnQiLCJfY2FsbGVlMTIiLCJwcm9wc1dpdGhVcmwiLCJfY2FsbGVlMTIkIiwiX2NvbnRleHQxMiIsIm1ha2VGb2dEZWNrRWZmZWN0IiwiZWZmZWN0IiwiaGVpZ2h0Iiwic2V0UHJvcHMiLCJuZXdQcm9wcyIsImFzc2lnbiIsIm1ha2VTdXJmYWNlRm9nRWZmZWN0IiwiZGVja0VmZmVjdCIsIm92ZXJyaWRlcyIsInR5cGUiLCJpc0VuYWJsZWQiLCJhbmltYXRlSGVpZ2h0IiwiaGVpZ2h0RW5kIiwibGluZWFyRWFzaW5nIiwiY2xvbmUiLCJwcm9wc1dpdGhGb2dFZmZlY3QiLCJmb2dFZmZlY3QiLCJlZmZlY3RPcmRlciIsIl9jYWxsZWUxMyIsIm9yaWdpbmFsUG9zdFJlbmRlciIsIl9jYWxsZWUxMyQiLCJfY29udGV4dDEzIiwibm90IiwiX2NhbGxlZTE0IiwiX2NhbGxlZTE0JCIsIl9jb250ZXh0MTQiLCJjYWxsIiwiX2NhbGxlZTE1IiwiX2NhbGxlZTE1JCIsIl9jb250ZXh0MTUiLCJfY2FsbGVlMTYiLCJfeWllbGQkcmVuZGVyQW5kV2FpdEYzIiwidW5tb3VudCIsInBhdGNoZWRQb3N0UmVuZGVyIiwiX2NhbGxlZTE2JCIsIl9jb250ZXh0MTYiLCJiaW5kIiwibW9ja0VmZmVjdCIsInByb3BzV2l0aEVmZmVjdHMiLCJtYXAiLCJfY2FsbGVlMTciLCJzaGFkb3dEZWNrRWZmZWN0IiwiX2NhbGxlZTE3JCIsIl9jb250ZXh0MTciLCJzaGFkb3ciLCJfY2FsbGVlMTgiLCJwb3N0UHJvY2Vzc0VmZmVjdCIsIl9jYWxsZWUxOCQiLCJfY29udGV4dDE4IiwiZXZlcnkiLCJfY2FsbGVlMTkiLCJub25TaGFkb3dFZmZlY3QiLCJfY2FsbGVlMTkkIiwiX2NvbnRleHQxOSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RhbHMvZXhwb3J0LXZpZGVvLW1vZGFsLnNwZWMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8vIEB0cy1ub2NoZWNrXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtUaGVtZVByb3ZpZGVyfSBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge0ludGxQcm92aWRlcn0gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQge3JlbmRlciwgd2FpdEZvcn0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQge3RoZW1lfSBmcm9tICdAa2VwbGVyLmdsL3N0eWxlcyc7XG5pbXBvcnQge21lc3NhZ2VzfSBmcm9tICdAa2VwbGVyLmdsL2xvY2FsaXphdGlvbic7XG5cbmNvbnN0IG1vY2tFeHBvcnRWaWRlb1BhbmVsQ29udGFpbmVyID0gamVzdC5mbigoKSA9PiAoXG4gIDxkaXYgZGF0YS10ZXN0aWQ9XCJleHBvcnQtdmlkZW8tcGFuZWxcIj5Nb2NrIFBhbmVsPC9kaXY+XG4pKTtcbmNvbnN0IE1vY2tLZXBsZXJVSUNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KG51bGwpO1xuXG5qZXN0Lm1vY2soJ0BodWJibGUuZ2wvcmVhY3QnLCAoKSA9PiAoe1xuICBFeHBvcnRWaWRlb1BhbmVsQ29udGFpbmVyOiBwcm9wcyA9PiBtb2NrRXhwb3J0VmlkZW9QYW5lbENvbnRhaW5lcihwcm9wcyksXG4gIEtlcGxlclVJQ29udGV4dDogTW9ja0tlcGxlclVJQ29udGV4dFxufSkpO1xuXG5jb25zdCBtb2NrQ29tcHV0ZURlY2tFZmZlY3RzID0gamVzdC5mbigoKSA9PiBbXSk7XG5cbmplc3QubW9jaygnQGtlcGxlci5nbC91dGlscycsICgpID0+IHtcbiAgY29uc3QgYWN0dWFsID0gamVzdC5yZXF1aXJlQWN0dWFsKCdAa2VwbGVyLmdsL3V0aWxzJyk7XG4gIHJldHVybiB7XG4gICAgLi4uYWN0dWFsLFxuICAgIGNvbXB1dGVEZWNrRWZmZWN0czogKC4uLmFyZ3MpID0+IG1vY2tDb21wdXRlRGVja0VmZmVjdHMoLi4uYXJncyksXG4gICAgcGF0Y2hEZWNrUmVuZGVyZXJGb3JQb3N0UHJvY2Vzc2luZzogamVzdC5mbigpXG4gIH07XG59KTtcblxuamVzdC5tb2NrKCdAa2VwbGVyLmdsL2VmZmVjdHMnLCAoKSA9PiAoe1xuICBEZWNrU2hhZG93Q29tcG9zaXRpbmdFZmZlY3Q6IGplc3QuZm4oKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gKHtcbiAgICBpZDogJ3NoYWRvdy1jb21wb3NpdGluZy1lZmZlY3QnLFxuICAgIHBvc3RSZW5kZXI6IGplc3QuZm4oKSxcbiAgICBjbGVhbnVwOiBqZXN0LmZuKClcbiAgfSkpXG59KSk7XG5cbmplc3QubW9jaygnLi9odWJibGUtdXRpbHMnLCAoKSA9PiAoe1xuICBnZXRTdGF0aWNNYXBQcm9wczogamVzdC5mbigoX3N0YXRlLCBfb25DaGFuZ2UsIF90b2tlbikgPT4gKHtcbiAgICBsYXRpdHVkZTogMzcuNyxcbiAgICBsb25naXR1ZGU6IC0xMjIuNCxcbiAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IHRydWUsXG4gICAgbWFwYm94QXBpQWNjZXNzVG9rZW46ICdzdHlsZS10b2tlbicsXG4gICAgbWFwU3R5bGU6IHtpZDogJ2Rhcmstc3R5bGUnfSxcbiAgICBtYXBMaWI6IFByb21pc2UucmVzb2x2ZSh7fSlcbiAgfSkpLFxuICBnZXRCZWZvcmVMYXllcklkOiBqZXN0LmZuKCgpID0+IG51bGwpLFxuICBnZXRIdWJibGVEZWNrR2xQcm9wczogamVzdC5mbigoKSA9PiAoe1xuICAgIHBhcmFtZXRlcnM6IHtibGVuZDogdHJ1ZX0sXG4gICAgY29udHJvbGxlcjogdHJ1ZSxcbiAgICB2aWV3czoge31cbiAgfSkpLFxuICBnZXRUaW1lUmFuZ2VGaWx0ZXJLZXlmcmFtZXM6IGplc3QuZm4oKSxcbiAgZ2V0QW5pbWF0YWJsZUZpbHRlcnM6IGplc3QuZm4oKCkgPT4gW10pXG59KSk7XG5cbmltcG9ydCBFeHBvcnRWaWRlb01vZGFsRmFjdG9yeSBmcm9tICcuL2V4cG9ydC12aWRlby1tb2RhbCc7XG5pbXBvcnQge0RlY2tTaGFkb3dDb21wb3NpdGluZ0VmZmVjdH0gZnJvbSAnQGtlcGxlci5nbC9lZmZlY3RzJztcblxuZnVuY3Rpb24gcmVuZGVyV2l0aFRoZW1lTG9jYWwoY29tcG9uZW50KSB7XG4gIHJldHVybiByZW5kZXIoXG4gICAgPFRoZW1lUHJvdmlkZXIgdGhlbWU9e3RoZW1lfT5cbiAgICAgIDxJbnRsUHJvdmlkZXIgbG9jYWxlPVwiZW5cIiBtZXNzYWdlcz17bWVzc2FnZXN9PlxuICAgICAgICB7Y29tcG9uZW50fVxuICAgICAgPC9JbnRsUHJvdmlkZXI+XG4gICAgPC9UaGVtZVByb3ZpZGVyPlxuICApO1xufVxuXG5jb25zdCBFeHBvcnRWaWRlb01vZGFsID0gRXhwb3J0VmlkZW9Nb2RhbEZhY3RvcnkoKTtcblxuY29uc3QgREVGQVVMVF9QUk9QUyA9IHtcbiAgbWFwYm94QXBpQWNjZXNzVG9rZW46ICd0ZXN0LXRva2VuJyxcbiAgbWFwYm94QXBpVXJsOiAnaHR0cHM6Ly9hcGkubWFwYm94LmNvbScsXG4gIG1hcFN0YXRlOiB7bGF0aXR1ZGU6IDM3LjcsIGxvbmdpdHVkZTogLTEyMi40LCB6b29tOiAxMH0sXG4gIG1hcFN0eWxlOiB7XG4gICAgc3R5bGVUeXBlOiAnZGFyaycsXG4gICAgbWFwU3R5bGVzOiB7ZGFyazoge2FjY2Vzc1Rva2VuOiAnc3R5bGUtdG9rZW4nfX0sXG4gICAgYm90dG9tTWFwU3R5bGU6IHtpZDogJ2Rhcmstc3R5bGUnfSxcbiAgICB0b3BNYXBTdHlsZTogbnVsbFxuICB9LFxuICB2aXNTdGF0ZToge1xuICAgIGZpbHRlcnM6IFtdLFxuICAgIGxheWVyczogW10sXG4gICAgbGF5ZXJCbGVuZGluZzogJ25vcm1hbCcsXG4gICAgbGF5ZXJPcmRlcjogW11cbiAgfSxcbiAgZXhwb3J0VmlkZW86IHtcbiAgICBtZWRpYVR5cGU6ICd3ZWJtJyxcbiAgICBjYW1lcmFQcmVzZXQ6ICdOb25lJyxcbiAgICBmaWxlTmFtZTogJ2tlcGxlci5nbCcsXG4gICAgcmVzb2x1dGlvbjogJzEyODB4NzIwJyxcbiAgICBkdXJhdGlvbk1zOiAxMDAwXG4gIH0sXG4gIGNvbnRhaW5lclc6IDgwMCxcbiAgdmlzU3RhdGVBY3Rpb25zOiB7XG4gICAgc2V0RmlsdGVyQW5pbWF0aW9uVGltZTogamVzdC5mbigpLFxuICAgIHNldExheWVyQW5pbWF0aW9uVGltZTogamVzdC5mbigpXG4gIH0sXG4gIHVpU3RhdGVBY3Rpb25zOiB7XG4gICAgc2V0RXhwb3J0VmlkZW9TZXR0aW5nOiBqZXN0LmZuKClcbiAgfSxcbiAgb25DbG9zZTogamVzdC5mbigpXG59O1xuXG5hc3luYyBmdW5jdGlvbiByZW5kZXJBbmRXYWl0Rm9yUGFuZWwocHJvcHMgPSBERUZBVUxUX1BST1BTKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHJlbmRlcldpdGhUaGVtZUxvY2FsKDxFeHBvcnRWaWRlb01vZGFsIHsuLi5wcm9wc30gLz4pO1xuICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICBleHBlY3QobW9ja0V4cG9ydFZpZGVvUGFuZWxDb250YWluZXIpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmRlc2NyaWJlKCdFeHBvcnRWaWRlb01vZGFsJywgKCkgPT4ge1xuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgICBtb2NrQ29tcHV0ZURlY2tFZmZlY3RzLm1vY2tSZXR1cm5WYWx1ZShbXSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3JlbmRlcnMgd2l0aG91dCBjcmFzaGluZycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7Y29udGFpbmVyfSA9IGF3YWl0IHJlbmRlckFuZFdhaXRGb3JQYW5lbCgpO1xuICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignLmV4cG9ydC12aWRlby1tb2RhbCcpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICB0ZXN0KCdwcm92aWRlcyBLZXBsZXJVSSBjb250ZXh0IHdpdGggZXhwZWN0ZWQgY29tcG9uZW50cycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZW5kZXJBbmRXYWl0Rm9yUGFuZWwoKTtcbiAgICBleHBlY3QobW9ja0V4cG9ydFZpZGVvUGFuZWxDb250YWluZXIpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgfSk7XG5cbiAgdGVzdCgncGFzc2VzIGNvcnJlY3QgcHJvcHMgdG8gRXhwb3J0VmlkZW9QYW5lbENvbnRhaW5lcicsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZW5kZXJBbmRXYWl0Rm9yUGFuZWwoKTtcblxuICAgIGV4cGVjdChtb2NrRXhwb3J0VmlkZW9QYW5lbENvbnRhaW5lcikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgIGNvbnN0IHBhbmVsUHJvcHMgPSBtb2NrRXhwb3J0VmlkZW9QYW5lbENvbnRhaW5lci5tb2NrLmNhbGxzWzBdWzBdO1xuXG4gICAgZXhwZWN0KHBhbmVsUHJvcHMuaGVhZGVyKS50b0JlKGZhbHNlKTtcbiAgICBleHBlY3QocGFuZWxQcm9wcy5kaXNhYmxlQmFzZU1hcCkudG9CZShmYWxzZSk7XG4gICAgZXhwZWN0KHBhbmVsUHJvcHMuZGVmYXVsdEZpbGVOYW1lKS50b0JlKCdrZXBsZXIuZ2wnKTtcbiAgICBleHBlY3QocGFuZWxQcm9wcy5leHBvcnRWaWRlb1dpZHRoKS50b0JlTGVzc1RoYW5PckVxdWFsKDU0MCk7XG4gICAgZXhwZWN0KHBhbmVsUHJvcHMuZXhwb3J0VmlkZW9XaWR0aCkudG9CZUdyZWF0ZXJUaGFuT3JFcXVhbCgzMjApO1xuICAgIGV4cGVjdChwYW5lbFByb3BzLmhhbmRsZUNsb3NlKS50b0JlKERFRkFVTFRfUFJPUFMub25DbG9zZSk7XG4gICAgZXhwZWN0KHBhbmVsUHJvcHMuaW5pdGlhbFN0YXRlKS50b0VxdWFsKERFRkFVTFRfUFJPUFMuZXhwb3J0VmlkZW8pO1xuICAgIGV4cGVjdChwYW5lbFByb3BzLm1hcERhdGEpLnRvRXF1YWwoe1xuICAgICAgdmlzU3RhdGU6IERFRkFVTFRfUFJPUFMudmlzU3RhdGUsXG4gICAgICBtYXBTdGF0ZTogREVGQVVMVF9QUk9QUy5tYXBTdGF0ZSxcbiAgICAgIG1hcFN0eWxlOiBERUZBVUxUX1BST1BTLm1hcFN0eWxlXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3Bhc3NlcyBkZWNrUHJvcHMgZnJvbSBnZXRIdWJibGVEZWNrR2xQcm9wcycsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZW5kZXJBbmRXYWl0Rm9yUGFuZWwoKTtcblxuICAgIGNvbnN0IHBhbmVsUHJvcHMgPSBtb2NrRXhwb3J0VmlkZW9QYW5lbENvbnRhaW5lci5tb2NrLmNhbGxzWzBdWzBdO1xuICAgIGV4cGVjdChwYW5lbFByb3BzLmRlY2tQcm9wcykudG9FcXVhbCh7XG4gICAgICBwYXJhbWV0ZXJzOiB7YmxlbmQ6IHRydWV9LFxuICAgICAgY29udHJvbGxlcjogdHJ1ZSxcbiAgICAgIHZpZXdzOiB7fSxcbiAgICAgIF9pc0V4cG9ydDogdHJ1ZSxcbiAgICAgIGVmZmVjdHM6IFtdXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3Bhc3NlcyBtYXBQcm9wcyBmcm9tIGdldFN0YXRpY01hcFByb3BzJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlbmRlckFuZFdhaXRGb3JQYW5lbCgpO1xuXG4gICAgY29uc3QgcGFuZWxQcm9wcyA9IG1vY2tFeHBvcnRWaWRlb1BhbmVsQ29udGFpbmVyLm1vY2suY2FsbHNbMF1bMF07XG4gICAgZXhwZWN0KHBhbmVsUHJvcHMubWFwUHJvcHMubGF0aXR1ZGUpLnRvQmUoMzcuNyk7XG4gICAgZXhwZWN0KHBhbmVsUHJvcHMubWFwUHJvcHMubG9uZ2l0dWRlKS50b0JlKC0xMjIuNCk7XG4gICAgZXhwZWN0KHBhbmVsUHJvcHMubWFwUHJvcHMucHJlc2VydmVEcmF3aW5nQnVmZmVyKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChwYW5lbFByb3BzLm1hcFByb3BzLm1hcGJveEFwaUFjY2Vzc1Rva2VuKS50b0JlKCdzdHlsZS10b2tlbicpO1xuICAgIGV4cGVjdChwYW5lbFByb3BzLm1hcFByb3BzLm1hcFN0eWxlKS50b0VxdWFsKHtpZDogJ2Rhcmstc3R5bGUnfSk7XG4gICAgZXhwZWN0KHBhbmVsUHJvcHMubWFwUHJvcHMubWFwTGliKS50b0JlRGVmaW5lZCgpO1xuICB9KTtcblxuICB0ZXN0KCdwYXNzZXMgZW1wdHkgYW5pbWF0YWJsZUZpbHRlcnMgd2hlbiBubyBtYXRjaGluZyBmaWx0ZXJzJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlbmRlckFuZFdhaXRGb3JQYW5lbCgpO1xuXG4gICAgY29uc3QgcGFuZWxQcm9wcyA9IG1vY2tFeHBvcnRWaWRlb1BhbmVsQ29udGFpbmVyLm1vY2suY2FsbHNbMF1bMF07XG4gICAgZXhwZWN0KHBhbmVsUHJvcHMuYW5pbWF0YWJsZUZpbHRlcnMpLnRvRXF1YWwoW10pO1xuICB9KTtcblxuICB0ZXN0KCdwcm92aWRlcyBnZXRUaW1lUmFuZ2VGaWx0ZXJLZXlmcmFtZXMgY2FsbGJhY2snLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcmVuZGVyQW5kV2FpdEZvclBhbmVsKCk7XG5cbiAgICBjb25zdCBwYW5lbFByb3BzID0gbW9ja0V4cG9ydFZpZGVvUGFuZWxDb250YWluZXIubW9jay5jYWxsc1swXVswXTtcbiAgICBleHBlY3QodHlwZW9mIHBhbmVsUHJvcHMuZ2V0VGltZVJhbmdlRmlsdGVyS2V5ZnJhbWVzKS50b0JlKCdmdW5jdGlvbicpO1xuICB9KTtcblxuICB0ZXN0KCdwcm92aWRlcyBvbkZpbHRlckZyYW1lVXBkYXRlIHRoYXQgY2FsbHMgdmlzU3RhdGVBY3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlbmRlckFuZFdhaXRGb3JQYW5lbCgpO1xuXG4gICAgY29uc3QgcGFuZWxQcm9wcyA9IG1vY2tFeHBvcnRWaWRlb1BhbmVsQ29udGFpbmVyLm1vY2suY2FsbHNbMF1bMF07XG4gICAgcGFuZWxQcm9wcy5vbkZpbHRlckZyYW1lVXBkYXRlKDAsICd2YWx1ZScsIFsxMDAsIDIwMF0pO1xuICAgIGV4cGVjdChERUZBVUxUX1BST1BTLnZpc1N0YXRlQWN0aW9ucy5zZXRGaWx0ZXJBbmltYXRpb25UaW1lKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIDAsXG4gICAgICAndmFsdWUnLFxuICAgICAgWzEwMCwgMjAwXVxuICAgICk7XG4gIH0pO1xuXG4gIHRlc3QoJ3Byb3ZpZGVzIG9uVHJpcEZyYW1lVXBkYXRlIHRoYXQgY2FsbHMgdmlzU3RhdGVBY3Rpb25zJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlbmRlckFuZFdhaXRGb3JQYW5lbCgpO1xuXG4gICAgY29uc3QgcGFuZWxQcm9wcyA9IG1vY2tFeHBvcnRWaWRlb1BhbmVsQ29udGFpbmVyLm1vY2suY2FsbHNbMF1bMF07XG4gICAgcGFuZWxQcm9wcy5vblRyaXBGcmFtZVVwZGF0ZSg0Mik7XG4gICAgZXhwZWN0KERFRkFVTFRfUFJPUFMudmlzU3RhdGVBY3Rpb25zLnNldExheWVyQW5pbWF0aW9uVGltZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoNDIpO1xuICB9KTtcblxuICBkZXNjcmliZSgnTk9fTUFQX0lEIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IE5PX01BUF9QUk9QUyA9IHtcbiAgICAgIC4uLkRFRkFVTFRfUFJPUFMsXG4gICAgICBtYXBTdHlsZToge1xuICAgICAgICBzdHlsZVR5cGU6ICdub19tYXAnLFxuICAgICAgICBtYXBTdHlsZXM6IHtcbiAgICAgICAgICBub19tYXA6IHtcbiAgICAgICAgICAgIGlkOiAnbm9fbWFwJyxcbiAgICAgICAgICAgIGxhYmVsOiAnTm8gQmFzZW1hcCcsXG4gICAgICAgICAgICAvLyB1cmwgaXMgaW50ZW50aW9uYWxseSBtaXNzaW5nIHRvIGV4ZXJjaXNlIHRoZSBkYXRhLVVSSSBwYXRjaFxuICAgICAgICAgICAgaWNvbjogJycsXG4gICAgICAgICAgICBsYXllckdyb3VwczogW10sXG4gICAgICAgICAgICBjb2xvck1vZGU6ICdOT05FJyxcbiAgICAgICAgICAgIHN0eWxlOiB7dmVyc2lvbjogOCwgc291cmNlczoge30sIGxheWVyczogW119XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBib3R0b21NYXBTdHlsZTogbnVsbCxcbiAgICAgICAgdG9wTWFwU3R5bGU6IG51bGxcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGVzdCgncmVuZGVycyB3aXRob3V0IGNyYXNoaW5nIHdoZW4gc3R5bGVUeXBlIGlzIE5PX01BUF9JRCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHtjb250YWluZXJ9ID0gYXdhaXQgcmVuZGVyQW5kV2FpdEZvclBhbmVsKE5PX01BUF9QUk9QUyk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5leHBvcnQtdmlkZW8tbW9kYWwnKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luamVjdHMgZGF0YS1VUkkgZW1wdHkgc3R5bGUgVVJMIGludG8gbWFwRGF0YSB3aGVuIE5PX01BUF9JRCBlbnRyeSBoYXMgbm8gdXJsJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgcmVuZGVyQW5kV2FpdEZvclBhbmVsKE5PX01BUF9QUk9QUyk7XG5cbiAgICAgIGNvbnN0IHBhbmVsUHJvcHMgPSBtb2NrRXhwb3J0VmlkZW9QYW5lbENvbnRhaW5lci5tb2NrLmNhbGxzWzBdWzBdO1xuICAgICAgY29uc3Qgbm9NYXBFbnRyeSA9IHBhbmVsUHJvcHMubWFwRGF0YS5tYXBTdHlsZS5tYXBTdHlsZXMubm9fbWFwO1xuXG4gICAgICBleHBlY3Qobm9NYXBFbnRyeS51cmwpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3Qobm9NYXBFbnRyeS51cmwpLnRvTWF0Y2goL15kYXRhOmFwcGxpY2F0aW9uXFwvanNvbiwvKTtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IG5vTWFwRW50cnkudXJsLnJlcGxhY2UoJ2RhdGE6YXBwbGljYXRpb24vanNvbiwnLCAnJyk7XG4gICAgICBjb25zdCBkZWNvZGVkID0gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQoZW5jb2RlZCkpO1xuICAgICAgZXhwZWN0KGRlY29kZWQpLnRvRXF1YWwoe3ZlcnNpb246IDgsIHNvdXJjZXM6IHt9LCBsYXllcnM6IFtdfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdwcmVzZXJ2ZXMgb3JpZ2luYWwgbWFwU3R5bGUgd2hlbiBOT19NQVBfSUQgZW50cnkgYWxyZWFkeSBoYXMgYSB1cmwnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wc1dpdGhVcmwgPSB7XG4gICAgICAgIC4uLkRFRkFVTFRfUFJPUFMsXG4gICAgICAgIG1hcFN0eWxlOiB7XG4gICAgICAgICAgc3R5bGVUeXBlOiAnbm9fbWFwJyxcbiAgICAgICAgICBtYXBTdHlsZXM6IHtcbiAgICAgICAgICAgIG5vX21hcDoge1xuICAgICAgICAgICAgICBpZDogJ25vX21hcCcsXG4gICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vZXhpc3Rpbmctc3R5bGUuanNvbidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvdHRvbU1hcFN0eWxlOiBudWxsLFxuICAgICAgICAgIHRvcE1hcFN0eWxlOiBudWxsXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHJlbmRlckFuZFdhaXRGb3JQYW5lbChwcm9wc1dpdGhVcmwpO1xuXG4gICAgICBjb25zdCBwYW5lbFByb3BzID0gbW9ja0V4cG9ydFZpZGVvUGFuZWxDb250YWluZXIubW9jay5jYWxsc1swXVswXTtcbiAgICAgIGV4cGVjdChwYW5lbFByb3BzLm1hcERhdGEubWFwU3R5bGUpLnRvQmUocHJvcHNXaXRoVXJsLm1hcFN0eWxlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N1cmZhY2UgZm9nIGhlaWdodCBhbmltYXRpb24nLCAoKSA9PiB7XG4gICAgZnVuY3Rpb24gbWFrZUZvZ0RlY2tFZmZlY3QoKSB7XG4gICAgICBjb25zdCBlZmZlY3QgPSB7XG4gICAgICAgIGlkOiAnc3VyZmFjZS1mb2ctZGVjaycsXG4gICAgICAgIHByb3BzOiB7aGVpZ2h0OiA1MH0sXG4gICAgICAgIHBvc3RSZW5kZXI6IGplc3QuZm4oKSxcbiAgICAgICAgc2V0UHJvcHM6IGplc3QuZm4oZnVuY3Rpb24gKG5ld1Byb3BzKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihlZmZlY3QucHJvcHMsIG5ld1Byb3BzKTtcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgICByZXR1cm4gZWZmZWN0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VTdXJmYWNlRm9nRWZmZWN0KGRlY2tFZmZlY3QsIG92ZXJyaWRlcyA9IHt9KSB7XG4gICAgICBjb25zdCBlZmZlY3QgPSB7XG4gICAgICAgIGlkOiAnZm9nLTEnLFxuICAgICAgICB0eXBlOiAnc3VyZmFjZUZvZycsXG4gICAgICAgIGlzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIGhlaWdodDogNTAsXG4gICAgICAgICAgYW5pbWF0ZUhlaWdodDogdHJ1ZSxcbiAgICAgICAgICBoZWlnaHRFbmQ6IDIwMCxcbiAgICAgICAgICBsaW5lYXJFYXNpbmc6IGZhbHNlLFxuICAgICAgICAgIC4uLm92ZXJyaWRlc1xuICAgICAgICB9LFxuICAgICAgICBkZWNrRWZmZWN0LFxuICAgICAgICBjbG9uZTogamVzdC5mbigpXG4gICAgICB9O1xuICAgICAgLy8gY2xvbmUgcmV0dXJucyBhIGZyZXNoIHJlZmVyZW5jZSB0aGF0IHN0aWxsIHBvaW50cyB0byB0aGUgc2FtZSBkZWNrRWZmZWN0XG4gICAgICBlZmZlY3QuY2xvbmUubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+ICh7Li4uZWZmZWN0LCBjbG9uZTogZWZmZWN0LmNsb25lfSkpO1xuICAgICAgcmV0dXJuIGVmZmVjdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcm9wc1dpdGhGb2dFZmZlY3QoZm9nRWZmZWN0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5ERUZBVUxUX1BST1BTLFxuICAgICAgICB2aXNTdGF0ZToge1xuICAgICAgICAgIC4uLkRFRkFVTFRfUFJPUFMudmlzU3RhdGUsXG4gICAgICAgICAgZWZmZWN0czogW2ZvZ0VmZmVjdF0sXG4gICAgICAgICAgZWZmZWN0T3JkZXI6IFtmb2dFZmZlY3QuaWRdXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGVzdCgncGF0Y2hlcyBkZWNrRWZmZWN0LnBvc3RSZW5kZXIgd2hlbiBhbmltYXRlSGVpZ2h0IGlzIGVuYWJsZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkZWNrRWZmZWN0ID0gbWFrZUZvZ0RlY2tFZmZlY3QoKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsUG9zdFJlbmRlciA9IGRlY2tFZmZlY3QucG9zdFJlbmRlcjtcbiAgICAgIGNvbnN0IGZvZ0VmZmVjdCA9IG1ha2VTdXJmYWNlRm9nRWZmZWN0KGRlY2tFZmZlY3QpO1xuICAgICAgbW9ja0NvbXB1dGVEZWNrRWZmZWN0cy5tb2NrUmV0dXJuVmFsdWUoW2RlY2tFZmZlY3RdKTtcblxuICAgICAgYXdhaXQgcmVuZGVyQW5kV2FpdEZvclBhbmVsKHByb3BzV2l0aEZvZ0VmZmVjdChmb2dFZmZlY3QpKTtcblxuICAgICAgZXhwZWN0KGRlY2tFZmZlY3QucG9zdFJlbmRlcikubm90LnRvQmUob3JpZ2luYWxQb3N0UmVuZGVyKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3Jlc3RvcmVzIG9yaWdpbmFsIGhlaWdodCB3aGVuIGh1YmJsZSBpcyBub3QgcGxheWluZycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRlY2tFZmZlY3QgPSBtYWtlRm9nRGVja0VmZmVjdCgpO1xuICAgICAgZGVja0VmZmVjdC5wcm9wcy5oZWlnaHQgPSA3NTtcbiAgICAgIGNvbnN0IGZvZ0VmZmVjdCA9IG1ha2VTdXJmYWNlRm9nRWZmZWN0KGRlY2tFZmZlY3QsIHtoZWlnaHQ6IDc1fSk7XG4gICAgICBtb2NrQ29tcHV0ZURlY2tFZmZlY3RzLm1vY2tSZXR1cm5WYWx1ZShbZGVja0VmZmVjdF0pO1xuXG4gICAgICBhd2FpdCByZW5kZXJBbmRXYWl0Rm9yUGFuZWwocHJvcHNXaXRoRm9nRWZmZWN0KGZvZ0VmZmVjdCkpO1xuXG4gICAgICAvLyBDYWxsIHRoZSBwYXRjaGVkIHBvc3RSZW5kZXIgd2l0aG91dCBodWJibGUgcGxheWluZ1xuICAgICAgZGVja0VmZmVjdC5wb3N0UmVuZGVyLmNhbGwoZGVja0VmZmVjdCwge30pO1xuXG4gICAgICAvLyBOb3QgcGxheWluZyDihpIgaGVpZ2h0IHJlc2V0cyB0byBvcmlnaW5hbEhlaWdodFxuICAgICAgZXhwZWN0KGRlY2tFZmZlY3QucHJvcHMuaGVpZ2h0KS50b0JlKDc1KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2RvZXMgbm90IG11dGF0ZSBoZWlnaHQgd2hlbiBhbmltYXRlSGVpZ2h0IGlzIGRpc2FibGVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGVja0VmZmVjdCA9IG1ha2VGb2dEZWNrRWZmZWN0KCk7XG4gICAgICBjb25zdCBmb2dFZmZlY3QgPSBtYWtlU3VyZmFjZUZvZ0VmZmVjdChkZWNrRWZmZWN0LCB7YW5pbWF0ZUhlaWdodDogZmFsc2V9KTtcbiAgICAgIG1vY2tDb21wdXRlRGVja0VmZmVjdHMubW9ja1JldHVyblZhbHVlKFtkZWNrRWZmZWN0XSk7XG5cbiAgICAgIGF3YWl0IHJlbmRlckFuZFdhaXRGb3JQYW5lbChwcm9wc1dpdGhGb2dFZmZlY3QoZm9nRWZmZWN0KSk7XG5cbiAgICAgIGRlY2tFZmZlY3QucHJvcHMuaGVpZ2h0ID0gNDI7XG4gICAgICBkZWNrRWZmZWN0LnBvc3RSZW5kZXIuY2FsbChkZWNrRWZmZWN0LCB7fSk7XG5cbiAgICAgIC8vIHJlZi5hY3RpdmUgaXMgZmFsc2Ugc28gaGVpZ2h0IHNob3VsZCBub3QgYmUgdG91Y2hlZFxuICAgICAgZXhwZWN0KGRlY2tFZmZlY3QucHJvcHMuaGVpZ2h0KS50b0JlKDQyKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3Jlc3RvcmVzIG9yaWdpbmFsIHBvc3RSZW5kZXIgb24gdW5tb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRlY2tFZmZlY3QgPSBtYWtlRm9nRGVja0VmZmVjdCgpO1xuICAgICAgY29uc3QgZm9nRWZmZWN0ID0gbWFrZVN1cmZhY2VGb2dFZmZlY3QoZGVja0VmZmVjdCk7XG4gICAgICBtb2NrQ29tcHV0ZURlY2tFZmZlY3RzLm1vY2tSZXR1cm5WYWx1ZShbZGVja0VmZmVjdF0pO1xuXG4gICAgICBjb25zdCB7dW5tb3VudH0gPSBhd2FpdCByZW5kZXJBbmRXYWl0Rm9yUGFuZWwocHJvcHNXaXRoRm9nRWZmZWN0KGZvZ0VmZmVjdCkpO1xuXG4gICAgICAvLyBwb3N0UmVuZGVyIHdhcyBwYXRjaGVkICh0aGUgd3JhcHBlciBmdW5jdGlvbiBkcml2ZXMgYW5pbWF0aW9uKVxuICAgICAgY29uc3QgcGF0Y2hlZFBvc3RSZW5kZXIgPSBkZWNrRWZmZWN0LnBvc3RSZW5kZXI7XG4gICAgICAvLyBWZXJpZnkgaXQncyBub3QgdGhlIG9yaWdpbmFsIG1vY2sgKGNvbXBvbmVudCBiaW5kcyBhbmQgd3JhcHMgaXQpXG4gICAgICBleHBlY3QocGF0Y2hlZFBvc3RSZW5kZXIpLm5vdC50b0JlKGRlY2tFZmZlY3QucG9zdFJlbmRlci5iaW5kKGRlY2tFZmZlY3QpKTtcblxuICAgICAgdW5tb3VudCgpO1xuXG4gICAgICAvLyBBZnRlciB1bm1vdW50LCBwb3N0UmVuZGVyIG5vIGxvbmdlciBkcml2ZXMgYW5pbWF0aW9uLlxuICAgICAgLy8gVGhlIHJlc3RvcmVkIGZ1bmN0aW9uIGlzIGEgYm91bmQgY29weSBvZiB0aGUgb3JpZ2luYWwgbW9jay5cbiAgICAgIGRlY2tFZmZlY3QucHJvcHMuaGVpZ2h0ID0gOTk7XG4gICAgICBkZWNrRWZmZWN0LnBvc3RSZW5kZXIuY2FsbChkZWNrRWZmZWN0LCB7fSk7XG4gICAgICAvLyBIZWlnaHQgc2hvdWxkIE5PVCBiZSBtdXRhdGVkIGJ5IGFuaW1hdGlvbiBsb2dpYyBhbnltb3JlXG4gICAgICBleHBlY3QoZGVja0VmZmVjdC5wcm9wcy5oZWlnaHQpLnRvQmUoOTkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2hhZG93IGNvbXBvc2l0aW5nIGZhbGxiYWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IG1vY2tFZmZlY3QgPSB7XG4gICAgICBpZDogJ2xpZ2h0LXNoYWRvdy0xJyxcbiAgICAgIHR5cGU6ICdsaWdodC1hbmQtc2hhZG93JyxcbiAgICAgIGlzRW5hYmxlZDogdHJ1ZSxcbiAgICAgIGNsb25lOiBqZXN0LmZuKCgpID0+ICh7Li4ubW9ja0VmZmVjdCwgY2xvbmU6IG1vY2tFZmZlY3QuY2xvbmV9KSlcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcHJvcHNXaXRoRWZmZWN0cyhlZmZlY3RzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5ERUZBVUxUX1BST1BTLFxuICAgICAgICB2aXNTdGF0ZToge1xuICAgICAgICAgIC4uLkRFRkFVTFRfUFJPUFMudmlzU3RhdGUsXG4gICAgICAgICAgZWZmZWN0cyxcbiAgICAgICAgICBlZmZlY3RPcmRlcjogZWZmZWN0cy5tYXAoZSA9PiBlLmlkKVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHRlc3QoJ2FkZHMgRGVja1NoYWRvd0NvbXBvc2l0aW5nRWZmZWN0IHdoZW4gc2hhZG93cyBleGlzdCBidXQgbm8gcG9zdFJlbmRlciBlZmZlY3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBzaGFkb3dEZWNrRWZmZWN0ID0ge2lkOiAnbGlnaHRpbmcnLCBzaGFkb3c6IHRydWV9O1xuICAgICAgbW9ja0NvbXB1dGVEZWNrRWZmZWN0cy5tb2NrUmV0dXJuVmFsdWUoW3NoYWRvd0RlY2tFZmZlY3RdKTtcblxuICAgICAgYXdhaXQgcmVuZGVyQW5kV2FpdEZvclBhbmVsKHByb3BzV2l0aEVmZmVjdHMoW21vY2tFZmZlY3RdKSk7XG5cbiAgICAgIGNvbnN0IHBhbmVsUHJvcHMgPSBtb2NrRXhwb3J0VmlkZW9QYW5lbENvbnRhaW5lci5tb2NrLmNhbGxzWzBdWzBdO1xuICAgICAgY29uc3QgZWZmZWN0cyA9IHBhbmVsUHJvcHMuZGVja1Byb3BzLmVmZmVjdHM7XG5cbiAgICAgIGV4cGVjdChlZmZlY3RzLmxlbmd0aCkudG9CZSgyKTtcbiAgICAgIGV4cGVjdChlZmZlY3RzWzBdKS50b0JlKHNoYWRvd0RlY2tFZmZlY3QpO1xuICAgICAgZXhwZWN0KGVmZmVjdHNbMV0uaWQpLnRvQmUoJ3NoYWRvdy1jb21wb3NpdGluZy1lZmZlY3QnKTtcbiAgICAgIGV4cGVjdChEZWNrU2hhZG93Q29tcG9zaXRpbmdFZmZlY3QpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2RvZXMgbm90IGFkZCBEZWNrU2hhZG93Q29tcG9zaXRpbmdFZmZlY3Qgd2hlbiBhIHBvc3RSZW5kZXIgZWZmZWN0IGFscmVhZHkgZXhpc3RzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2hhZG93RGVja0VmZmVjdCA9IHtpZDogJ2xpZ2h0aW5nJywgc2hhZG93OiB0cnVlfTtcbiAgICAgIGNvbnN0IHBvc3RQcm9jZXNzRWZmZWN0ID0ge2lkOiAnZm9nJywgcG9zdFJlbmRlcjogamVzdC5mbigpfTtcbiAgICAgIG1vY2tDb21wdXRlRGVja0VmZmVjdHMubW9ja1JldHVyblZhbHVlKFtzaGFkb3dEZWNrRWZmZWN0LCBwb3N0UHJvY2Vzc0VmZmVjdF0pO1xuXG4gICAgICBhd2FpdCByZW5kZXJBbmRXYWl0Rm9yUGFuZWwocHJvcHNXaXRoRWZmZWN0cyhbbW9ja0VmZmVjdF0pKTtcblxuICAgICAgY29uc3QgcGFuZWxQcm9wcyA9IG1vY2tFeHBvcnRWaWRlb1BhbmVsQ29udGFpbmVyLm1vY2suY2FsbHNbMF1bMF07XG4gICAgICBjb25zdCBlZmZlY3RzID0gcGFuZWxQcm9wcy5kZWNrUHJvcHMuZWZmZWN0cztcblxuICAgICAgZXhwZWN0KGVmZmVjdHMubGVuZ3RoKS50b0JlKDIpO1xuICAgICAgZXhwZWN0KGVmZmVjdHNbMF0pLnRvQmUoc2hhZG93RGVja0VmZmVjdCk7XG4gICAgICBleHBlY3QoZWZmZWN0c1sxXSkudG9CZShwb3N0UHJvY2Vzc0VmZmVjdCk7XG4gICAgICBleHBlY3QoZWZmZWN0cy5ldmVyeShlID0+IGUuaWQgIT09ICdzaGFkb3ctY29tcG9zaXRpbmctZWZmZWN0JykpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdkb2VzIG5vdCBhZGQgRGVja1NoYWRvd0NvbXBvc2l0aW5nRWZmZWN0IHdoZW4gbm8gc2hhZG93IGVmZmVjdCBleGlzdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub25TaGFkb3dFZmZlY3QgPSB7aWQ6ICdsaWdodGluZycsIHNoYWRvdzogZmFsc2V9O1xuICAgICAgbW9ja0NvbXB1dGVEZWNrRWZmZWN0cy5tb2NrUmV0dXJuVmFsdWUoW25vblNoYWRvd0VmZmVjdF0pO1xuXG4gICAgICBhd2FpdCByZW5kZXJBbmRXYWl0Rm9yUGFuZWwocHJvcHNXaXRoRWZmZWN0cyhbbW9ja0VmZmVjdF0pKTtcblxuICAgICAgY29uc3QgcGFuZWxQcm9wcyA9IG1vY2tFeHBvcnRWaWRlb1BhbmVsQ29udGFpbmVyLm1vY2suY2FsbHNbMF1bMF07XG4gICAgICBjb25zdCBlZmZlY3RzID0gcGFuZWxQcm9wcy5kZWNrUHJvcHMuZWZmZWN0cztcblxuICAgICAgZXhwZWN0KGVmZmVjdHMubGVuZ3RoKS50b0JlKDEpO1xuICAgICAgZXhwZWN0KGVmZmVjdHNbMF0pLnRvQmUobm9uU2hhZG93RWZmZWN0KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUlBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxVQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxPQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxPQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxhQUFBLEdBQUFMLE9BQUE7QUFrREEsSUFBQU0saUJBQUEsR0FBQVAsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFPLFFBQUEsR0FBQVAsT0FBQTtBQUErRCxTQUFBUSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsT0FBQWEsT0FBQSxX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