@carto/kepler.gl 0.0.85 → 0.0.86-alpha.deck9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/dist/actions/action-wrapper.js +36 -41
  2. package/dist/actions/actions.js +15 -21
  3. package/dist/actions/identity-actions.js +14 -20
  4. package/dist/actions/index.js +16 -16
  5. package/dist/actions/map-state-actions.js +12 -18
  6. package/dist/actions/map-style-actions.js +30 -46
  7. package/dist/actions/provider-actions.js +49 -73
  8. package/dist/actions/ui-state-actions.js +73 -113
  9. package/dist/actions/vis-state-actions.js +152 -148
  10. package/dist/cloud-providers/index.js +6 -7
  11. package/dist/cloud-providers/provider.js +189 -279
  12. package/dist/components/bottom-widget.js +105 -117
  13. package/dist/components/common/action-panel.js +122 -74
  14. package/dist/components/common/animation-control/animation-control.js +69 -54
  15. package/dist/components/common/animation-control/animation-controller.js +134 -160
  16. package/dist/components/common/animation-control/animation-speed-slider.js +47 -54
  17. package/dist/components/common/animation-control/floating-time-display.js +120 -100
  18. package/dist/components/common/animation-control/playback-controls.js +147 -144
  19. package/dist/components/common/animation-control/speed-control.js +31 -23
  20. package/dist/components/common/checkbox.js +56 -70
  21. package/dist/components/common/color-legend.js +83 -110
  22. package/dist/components/common/data-table/button.js +31 -23
  23. package/dist/components/common/data-table/canvas.js +11 -5
  24. package/dist/components/common/data-table/cell-size.js +51 -61
  25. package/dist/components/common/data-table/grid.js +40 -59
  26. package/dist/components/common/data-table/index.js +464 -348
  27. package/dist/components/common/data-table/option-dropdown.js +50 -33
  28. package/dist/components/common/dataset-label.js +17 -13
  29. package/dist/components/common/error-boundary.js +27 -45
  30. package/dist/components/common/field-selector.js +99 -139
  31. package/dist/components/common/field-token.js +24 -9
  32. package/dist/components/common/file-uploader/file-drop.js +96 -115
  33. package/dist/components/common/file-uploader/file-upload-progress.js +68 -45
  34. package/dist/components/common/file-uploader/file-upload.js +215 -187
  35. package/dist/components/common/file-uploader/upload-button.js +35 -22
  36. package/dist/components/common/histogram-plot.js +47 -58
  37. package/dist/components/common/icons/add.js +14 -27
  38. package/dist/components/common/icons/anchor_window.js +16 -18
  39. package/dist/components/common/icons/arrow-down-alt.js +14 -27
  40. package/dist/components/common/icons/arrow-down-solid.js +14 -27
  41. package/dist/components/common/icons/arrow-down.js +14 -27
  42. package/dist/components/common/icons/arrow-left.js +17 -30
  43. package/dist/components/common/icons/arrow-right.js +14 -27
  44. package/dist/components/common/icons/arrow-up-alt.js +15 -28
  45. package/dist/components/common/icons/arrow-up-solid.js +14 -27
  46. package/dist/components/common/icons/arrow-up.js +14 -27
  47. package/dist/components/common/icons/base.js +39 -57
  48. package/dist/components/common/icons/bug.js +16 -29
  49. package/dist/components/common/icons/cancel.js +14 -27
  50. package/dist/components/common/icons/checkmark.js +18 -31
  51. package/dist/components/common/icons/chevron-right.js +20 -33
  52. package/dist/components/common/icons/clipboard.js +15 -28
  53. package/dist/components/common/icons/clock.js +16 -29
  54. package/dist/components/common/icons/close.js +19 -32
  55. package/dist/components/common/icons/code-alt.js +16 -29
  56. package/dist/components/common/icons/copy.js +18 -31
  57. package/dist/components/common/icons/crosshairs.js +16 -29
  58. package/dist/components/common/icons/cube-3d.js +18 -31
  59. package/dist/components/common/icons/cursor-click.js +18 -31
  60. package/dist/components/common/icons/data-table.js +15 -28
  61. package/dist/components/common/icons/db.js +15 -28
  62. package/dist/components/common/icons/delete.js +16 -29
  63. package/dist/components/common/icons/docs.js +30 -43
  64. package/dist/components/common/icons/drag-n-drop.js +16 -29
  65. package/dist/components/common/icons/draw-polygon.js +33 -46
  66. package/dist/components/common/icons/email.js +18 -31
  67. package/dist/components/common/icons/expand.js +16 -29
  68. package/dist/components/common/icons/eye-seen.js +16 -29
  69. package/dist/components/common/icons/eye-unseen.js +16 -29
  70. package/dist/components/common/icons/file-type.js +35 -19
  71. package/dist/components/common/icons/file.js +14 -27
  72. package/dist/components/common/icons/files.js +14 -26
  73. package/dist/components/common/icons/filter-funnel.js +14 -27
  74. package/dist/components/common/icons/free-window.js +16 -18
  75. package/dist/components/common/icons/gear.js +16 -29
  76. package/dist/components/common/icons/hash.js +14 -27
  77. package/dist/components/common/icons/histogram.js +15 -27
  78. package/dist/components/common/icons/index.js +156 -156
  79. package/dist/components/common/icons/info.js +25 -38
  80. package/dist/components/common/icons/layers.js +14 -27
  81. package/dist/components/common/icons/left-arrow.js +16 -29
  82. package/dist/components/common/icons/legend.js +14 -27
  83. package/dist/components/common/icons/line-chart.js +14 -27
  84. package/dist/components/common/icons/login.js +17 -30
  85. package/dist/components/common/icons/logout.js +16 -29
  86. package/dist/components/common/icons/map-icon.js +18 -32
  87. package/dist/components/common/icons/map.js +18 -32
  88. package/dist/components/common/icons/messages.js +14 -27
  89. package/dist/components/common/icons/minus.js +14 -27
  90. package/dist/components/common/icons/order-by-dataset.js +15 -17
  91. package/dist/components/common/icons/order-by-list.js +7 -9
  92. package/dist/components/common/icons/pause.js +14 -27
  93. package/dist/components/common/icons/picture.js +14 -26
  94. package/dist/components/common/icons/pin.js +17 -30
  95. package/dist/components/common/icons/play.js +14 -27
  96. package/dist/components/common/icons/polygon.js +35 -48
  97. package/dist/components/common/icons/rectangle.js +36 -49
  98. package/dist/components/common/icons/reduce.js +17 -30
  99. package/dist/components/common/icons/reset.js +14 -27
  100. package/dist/components/common/icons/rocket.js +14 -27
  101. package/dist/components/common/icons/save.js +16 -29
  102. package/dist/components/common/icons/save2.js +20 -33
  103. package/dist/components/common/icons/search.js +16 -29
  104. package/dist/components/common/icons/settings.js +16 -29
  105. package/dist/components/common/icons/share.js +14 -27
  106. package/dist/components/common/icons/split.js +42 -55
  107. package/dist/components/common/icons/square-select.js +16 -29
  108. package/dist/components/common/icons/swap-horizontal.js +18 -31
  109. package/dist/components/common/icons/table.js +14 -27
  110. package/dist/components/common/icons/trash.js +16 -29
  111. package/dist/components/common/icons/upload.js +14 -27
  112. package/dist/components/common/icons/vert-dots.js +52 -65
  113. package/dist/components/common/icons/vert-three-dots.js +27 -40
  114. package/dist/components/common/icons/warning.js +26 -39
  115. package/dist/components/common/image-preview.js +71 -33
  116. package/dist/components/common/info-helper.js +36 -29
  117. package/dist/components/common/item-selector/accessor.js +7 -13
  118. package/dist/components/common/item-selector/chickleted-input.js +72 -56
  119. package/dist/components/common/item-selector/dropdown-list.js +182 -214
  120. package/dist/components/common/item-selector/item-selector-submenu.js +34 -55
  121. package/dist/components/common/item-selector/item-selector.js +183 -194
  122. package/dist/components/common/item-selector/typeahead.js +236 -248
  123. package/dist/components/common/line-chart.js +80 -58
  124. package/dist/components/common/loading-spinner.js +46 -31
  125. package/dist/components/common/logo.js +61 -48
  126. package/dist/components/common/map-layer-selector.js +31 -25
  127. package/dist/components/common/modal.js +167 -106
  128. package/dist/components/common/portaled.js +169 -189
  129. package/dist/components/common/progress-bar.js +27 -24
  130. package/dist/components/common/range-brush.js +176 -215
  131. package/dist/components/common/range-plot.js +52 -63
  132. package/dist/components/common/range-slider.js +206 -231
  133. package/dist/components/common/slider/mouse-event.js +59 -66
  134. package/dist/components/common/slider/slider-bar-handle.js +51 -61
  135. package/dist/components/common/slider/slider-handle.js +127 -102
  136. package/dist/components/common/slider/slider.js +143 -162
  137. package/dist/components/common/styled-components.js +518 -256
  138. package/dist/components/common/switch.js +11 -11
  139. package/dist/components/common/time-range-slider-time-title.js +49 -32
  140. package/dist/components/common/time-range-slider.js +56 -45
  141. package/dist/components/common/time-slider-marker.js +71 -52
  142. package/dist/components/common/tippy-tooltip.js +89 -59
  143. package/dist/components/common/toolbar-item.js +53 -45
  144. package/dist/components/common/toolbar.js +24 -18
  145. package/dist/components/common/vertical-toolbar.js +13 -6
  146. package/dist/components/container.js +87 -119
  147. package/dist/components/context.js +6 -8
  148. package/dist/components/editor/constants.js +4 -4
  149. package/dist/components/editor/editor.js +122 -157
  150. package/dist/components/editor/feature-action-panel.js +52 -59
  151. package/dist/components/editor/feature-styles.js +46 -29
  152. package/dist/components/editor/handle-style.js +38 -29
  153. package/dist/components/filters/components.js +8 -4
  154. package/dist/components/filters/filter-panels/filter-panel-with-field-select.js +33 -43
  155. package/dist/components/filters/filter-panels/multi-select-filter-panel.js +20 -21
  156. package/dist/components/filters/filter-panels/new-filter-panel.js +24 -31
  157. package/dist/components/filters/filter-panels/polygon-filter-panel.js +26 -31
  158. package/dist/components/filters/filter-panels/range-filter-panel.js +20 -21
  159. package/dist/components/filters/filter-panels/single-select-filter-panel.js +20 -21
  160. package/dist/components/filters/filter-panels/time-range-filter-panel.js +28 -31
  161. package/dist/components/filters/index.js +10 -10
  162. package/dist/components/filters/multi-select-filter.js +11 -9
  163. package/dist/components/filters/polygon-filter.js +26 -41
  164. package/dist/components/filters/range-filter.js +9 -7
  165. package/dist/components/filters/single-select-filter.js +11 -13
  166. package/dist/components/filters/time-range-filter.js +16 -14
  167. package/dist/components/filters/time-widget.js +125 -84
  168. package/dist/components/geocoder/geocoder.js +158 -177
  169. package/dist/components/geocoder-panel.js +66 -87
  170. package/dist/components/index.js +328 -329
  171. package/dist/components/injector.js +44 -63
  172. package/dist/components/kepler-gl.js +325 -361
  173. package/dist/components/map/coordinate-info.js +18 -16
  174. package/dist/components/map/layer-hover-info.js +108 -86
  175. package/dist/components/map/layer-selector-panel.js +50 -48
  176. package/dist/components/map/locale-panel.js +38 -44
  177. package/dist/components/map/map-control-panel.js +70 -47
  178. package/dist/components/map/map-control-toolbar.js +9 -6
  179. package/dist/components/map/map-control-tooltip.js +10 -8
  180. package/dist/components/map/map-control.js +35 -27
  181. package/dist/components/map/map-draw-panel.js +38 -48
  182. package/dist/components/map/map-legend-panel.js +47 -50
  183. package/dist/components/map/map-legend.js +133 -116
  184. package/dist/components/map/map-popover.js +155 -100
  185. package/dist/components/map/split-map-button.js +30 -34
  186. package/dist/components/map/toggle-3d-button.js +25 -27
  187. package/dist/components/map-container.js +313 -359
  188. package/dist/components/maps-layout.js +16 -26
  189. package/dist/components/modal-container.js +359 -355
  190. package/dist/components/modals/add-map-style-modal.js +233 -194
  191. package/dist/components/modals/cloud-tile.js +96 -67
  192. package/dist/components/modals/data-table-modal.js +155 -152
  193. package/dist/components/modals/delete-data-modal.js +20 -20
  194. package/dist/components/modals/error-display.js +9 -7
  195. package/dist/components/modals/export-data-modal.js +118 -140
  196. package/dist/components/modals/export-image-modal.js +82 -69
  197. package/dist/components/modals/export-map-modal/components.js +20 -18
  198. package/dist/components/modals/export-map-modal/export-html-map.js +82 -74
  199. package/dist/components/modals/export-map-modal/export-json-map.js +65 -45
  200. package/dist/components/modals/export-map-modal/export-map-modal.js +42 -47
  201. package/dist/components/modals/image-modal-container.js +20 -21
  202. package/dist/components/modals/load-data-modal.js +28 -30
  203. package/dist/components/modals/load-storage-map.js +277 -178
  204. package/dist/components/modals/loading-dialog.js +41 -19
  205. package/dist/components/modals/modal-dialog.js +4 -6
  206. package/dist/components/modals/modal-tabs.js +83 -48
  207. package/dist/components/modals/overwrite-map-modal.js +41 -30
  208. package/dist/components/modals/provider-modal-container.js +23 -42
  209. package/dist/components/modals/save-map-modal.js +107 -83
  210. package/dist/components/modals/share-map-modal.js +101 -95
  211. package/dist/components/modals/status-panel.js +63 -43
  212. package/dist/components/modals/storage-map-viewer.js +133 -70
  213. package/dist/components/notification-panel/notification-item.js +94 -97
  214. package/dist/components/notification-panel.js +35 -43
  215. package/dist/components/performance.js +49 -53
  216. package/dist/components/plot-container.js +151 -169
  217. package/dist/components/side-panel/cloud-storage-dropdown.js +13 -15
  218. package/dist/components/side-panel/common/dataset-info.js +16 -12
  219. package/dist/components/side-panel/common/dataset-tag.js +48 -27
  220. package/dist/components/side-panel/common/dataset-title.js +119 -116
  221. package/dist/components/side-panel/common/source-data-catalog.js +31 -32
  222. package/dist/components/side-panel/common/source-data-selector.js +52 -77
  223. package/dist/components/side-panel/custom-panel.js +6 -8
  224. package/dist/components/side-panel/filter-manager.js +48 -62
  225. package/dist/components/side-panel/filter-panel/filter-panel-header.js +35 -25
  226. package/dist/components/side-panel/filter-panel/filter-panel.js +46 -64
  227. package/dist/components/side-panel/interaction-manager.js +20 -18
  228. package/dist/components/side-panel/interaction-panel/brush-config.js +17 -17
  229. package/dist/components/side-panel/interaction-panel/interaction-panel.js +76 -95
  230. package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +118 -143
  231. package/dist/components/side-panel/interaction-panel/tooltip-config.js +95 -76
  232. package/dist/components/side-panel/layer-manager.js +105 -115
  233. package/dist/components/side-panel/layer-panel/add-layer-button.js +92 -54
  234. package/dist/components/side-panel/layer-panel/color-dimension-scale-selector.js +5 -5
  235. package/dist/components/side-panel/layer-panel/color-palette.js +50 -37
  236. package/dist/components/side-panel/layer-panel/color-range-selector.js +196 -207
  237. package/dist/components/side-panel/layer-panel/color-selector.js +104 -110
  238. package/dist/components/side-panel/layer-panel/column-selector.js +34 -22
  239. package/dist/components/side-panel/layer-panel/custom-markers-config-group.js +4 -4
  240. package/dist/components/side-panel/layer-panel/custom-palette.js +248 -205
  241. package/dist/components/side-panel/layer-panel/custom-picker.js +51 -69
  242. package/dist/components/side-panel/layer-panel/dataset-layer-group.js +37 -42
  243. package/dist/components/side-panel/layer-panel/dataset-layer-section.js +31 -27
  244. package/dist/components/side-panel/layer-panel/dataset-section.js +45 -35
  245. package/dist/components/side-panel/layer-panel/dimension-scale-selector.js +14 -13
  246. package/dist/components/side-panel/layer-panel/hex-column-config.js +32 -55
  247. package/dist/components/side-panel/layer-panel/layer-aggregation-resolution.js +5 -5
  248. package/dist/components/side-panel/layer-panel/layer-column-config.js +42 -46
  249. package/dist/components/side-panel/layer-panel/layer-config-group.js +178 -144
  250. package/dist/components/side-panel/layer-panel/layer-configurator.js +826 -830
  251. package/dist/components/side-panel/layer-panel/layer-list.js +101 -94
  252. package/dist/components/side-panel/layer-panel/layer-panel-header.js +124 -82
  253. package/dist/components/side-panel/layer-panel/layer-panel.js +111 -105
  254. package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.js +67 -58
  255. package/dist/components/side-panel/layer-panel/layer-type-list-item.js +47 -32
  256. package/dist/components/side-panel/layer-panel/layer-type-selector.js +30 -41
  257. package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.js +42 -43
  258. package/dist/components/side-panel/layer-panel/panel-view-list-toggle.js +55 -57
  259. package/dist/components/side-panel/layer-panel/single-color-palette.js +48 -33
  260. package/dist/components/side-panel/layer-panel/text-label-panel.js +81 -116
  261. package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.js +88 -102
  262. package/dist/components/side-panel/layer-panel/vis-config-slider.js +99 -85
  263. package/dist/components/side-panel/layer-panel/vis-config-switch.js +38 -29
  264. package/dist/components/side-panel/map-manager.js +70 -89
  265. package/dist/components/side-panel/map-style-panel/map-layer-selector.js +72 -60
  266. package/dist/components/side-panel/map-style-panel/map-style-selector.js +64 -42
  267. package/dist/components/side-panel/panel-dropdown.js +21 -37
  268. package/dist/components/side-panel/panel-header-action.js +60 -65
  269. package/dist/components/side-panel/panel-header.js +165 -184
  270. package/dist/components/side-panel/panel-tab.js +35 -29
  271. package/dist/components/side-panel/panel-title.js +15 -18
  272. package/dist/components/side-panel/panel-toggle.js +30 -31
  273. package/dist/components/side-panel/side-bar.js +100 -91
  274. package/dist/components/side-panel.js +108 -123
  275. package/dist/connect/keplergl-connect.js +17 -26
  276. package/dist/connect/with-local-selector.js +31 -63
  277. package/dist/constants/action-types.js +113 -115
  278. package/dist/constants/color-palette.js +14 -16
  279. package/dist/constants/color-ranges.js +23 -28
  280. package/dist/constants/custom-color-ranges.js +12 -12
  281. package/dist/constants/default-settings.js +323 -254
  282. package/dist/constants/index.js +63 -63
  283. package/dist/constants/keyevent.js +4 -4
  284. package/dist/constants/tooltip.js +5 -5
  285. package/dist/constants/user-feedbacks.js +9 -5
  286. package/dist/constants/user-guides.js +10 -10
  287. package/dist/deckgl-layers/3d-building-layer/3d-building-layer.js +37 -63
  288. package/dist/deckgl-layers/3d-building-layer/3d-building-utils.js +52 -56
  289. package/dist/deckgl-layers/cluster-layer/cluster-layer.js +165 -168
  290. package/dist/deckgl-layers/column-layer/enhanced-column-layer.js +24 -43
  291. package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.d.ts +2 -2
  292. package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +27 -40
  293. package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +27 -40
  294. package/dist/deckgl-layers/layer-utils/cluster-utils.js +60 -68
  295. package/dist/deckgl-layers/layer-utils/cpu-aggregator.d.ts +4 -4
  296. package/dist/deckgl-layers/layer-utils/cpu-aggregator.js +281 -282
  297. package/dist/deckgl-layers/layer-utils/shader-utils.js +2 -2
  298. package/dist/deckgl-layers/line-layer/line-layer.js +62 -70
  299. package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +37 -51
  300. package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.js +65 -85
  301. package/dist/index.js +15 -16
  302. package/dist/layers/aggregation-layer.js +299 -331
  303. package/dist/layers/arc-layer/arc-layer-icon.js +27 -41
  304. package/dist/layers/arc-layer/arc-layer.js +174 -201
  305. package/dist/layers/base-layer.d.ts +1 -1
  306. package/dist/layers/base-layer.js +1371 -1544
  307. package/dist/layers/cluster-layer/cluster-layer-icon.js +30 -44
  308. package/dist/layers/cluster-layer/cluster-layer.js +89 -103
  309. package/dist/layers/default-layer-icon.js +39 -53
  310. package/dist/layers/geojson-layer/geojson-layer-icon.js +42 -55
  311. package/dist/layers/geojson-layer/geojson-layer.js +292 -353
  312. package/dist/layers/geojson-layer/geojson-utils.js +31 -36
  313. package/dist/layers/grid-layer/grid-layer-icon.js +87 -100
  314. package/dist/layers/grid-layer/grid-layer.js +51 -61
  315. package/dist/layers/grid-layer/grid-utils.js +13 -9
  316. package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +21 -35
  317. package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.js +225 -260
  318. package/dist/layers/h3-hexagon-layer/h3-utils.js +16 -16
  319. package/dist/layers/heatmap-layer/heatmap-layer-icon.js +39 -52
  320. package/dist/layers/heatmap-layer/heatmap-layer.js +140 -171
  321. package/dist/layers/hexagon-layer/hexagon-layer-icon.js +51 -64
  322. package/dist/layers/hexagon-layer/hexagon-layer.js +49 -63
  323. package/dist/layers/hexagon-layer/hexagon-utils.js +15 -14
  324. package/dist/layers/icon-layer/icon-info-modal.js +82 -75
  325. package/dist/layers/icon-layer/icon-layer-icon.js +24 -37
  326. package/dist/layers/icon-layer/icon-layer.js +274 -303
  327. package/dist/layers/index.js +43 -29
  328. package/dist/layers/layer-factory.js +25 -41
  329. package/dist/layers/layer-text-label.js +21 -23
  330. package/dist/layers/layer-update.js +16 -18
  331. package/dist/layers/line-layer/line-layer-icon.js +30 -43
  332. package/dist/layers/line-layer/line-layer.js +123 -142
  333. package/dist/layers/mapbox-utils.js +61 -62
  334. package/dist/layers/mapboxgl-layer.js +124 -169
  335. package/dist/layers/point-layer/point-layer-icon.js +45 -59
  336. package/dist/layers/point-layer/point-layer.d.ts +2 -2
  337. package/dist/layers/point-layer/point-layer.js +355 -386
  338. package/dist/layers/s2-geometry-layer/s2-geometry-layer.js +208 -238
  339. package/dist/layers/s2-geometry-layer/s2-layer-icon.js +21 -35
  340. package/dist/layers/s2-geometry-layer/s2-utils.js +9 -8
  341. package/dist/layers/scenegraph-layer/scenegraph-info-modal.js +24 -25
  342. package/dist/layers/scenegraph-layer/scenegraph-layer-icon.js +102 -115
  343. package/dist/layers/scenegraph-layer/scenegraph-layer.js +148 -172
  344. package/dist/layers/trip-layer/trip-info-modal.js +50 -30
  345. package/dist/layers/trip-layer/trip-layer-icon.js +40 -53
  346. package/dist/layers/trip-layer/trip-layer.js +239 -307
  347. package/dist/layers/trip-layer/trip-utils.js +34 -50
  348. package/dist/layers/types.js +2 -2
  349. package/dist/localization/formatted-message.js +8 -10
  350. package/dist/localization/index.js +7 -7
  351. package/dist/localization/locales.js +6 -9
  352. package/dist/localization/messages.js +13 -10
  353. package/dist/localization/translations/ca.js +11 -13
  354. package/dist/localization/translations/cn.js +11 -13
  355. package/dist/localization/translations/en.js +11 -13
  356. package/dist/localization/translations/es.js +11 -13
  357. package/dist/localization/translations/fi.js +11 -13
  358. package/dist/localization/translations/ja.js +11 -13
  359. package/dist/localization/translations/pt.js +11 -13
  360. package/dist/localization/translations/ru.js +11 -13
  361. package/dist/middleware/index.js +3 -5
  362. package/dist/processors/data-processor.js +164 -201
  363. package/dist/processors/file-handler.js +111 -233
  364. package/dist/processors/index.js +4 -4
  365. package/dist/reducers/combined-updaters.js +41 -41
  366. package/dist/reducers/composer-helpers.js +20 -45
  367. package/dist/reducers/composers.js +9 -8
  368. package/dist/reducers/core.js +31 -35
  369. package/dist/reducers/index.js +21 -22
  370. package/dist/reducers/map-state-updaters.js +65 -47
  371. package/dist/reducers/map-state.js +23 -15
  372. package/dist/reducers/map-style-updaters.js +233 -159
  373. package/dist/reducers/map-style.js +30 -16
  374. package/dist/reducers/provider-state-updaters.js +217 -229
  375. package/dist/reducers/provider-state.js +29 -17
  376. package/dist/reducers/root.js +86 -58
  377. package/dist/reducers/ui-state-updaters.js +337 -218
  378. package/dist/reducers/ui-state.js +45 -16
  379. package/dist/reducers/vis-state-merger.js +205 -209
  380. package/dist/reducers/vis-state-selectors.js +5 -19
  381. package/dist/reducers/vis-state-updaters.js +1003 -876
  382. package/dist/reducers/vis-state.js +75 -16
  383. package/dist/schemas/dataset-schema.js +84 -108
  384. package/dist/schemas/index.js +28 -29
  385. package/dist/schemas/map-state-schema.js +21 -18
  386. package/dist/schemas/map-style-schema.js +47 -55
  387. package/dist/schemas/schema-manager.js +147 -161
  388. package/dist/schemas/schema-utils.js +8 -9
  389. package/dist/schemas/schema.js +72 -87
  390. package/dist/schemas/versions.js +3 -3
  391. package/dist/schemas/vis-state-schema.js +441 -583
  392. package/dist/styles/base.js +1217 -1021
  393. package/dist/styles/index.js +3 -3
  394. package/dist/styles/media-breakpoints.js +23 -18
  395. package/dist/tasks/tasks.js +36 -39
  396. package/dist/templates/export-map-html.js +233 -4
  397. package/dist/utils/aggregate-utils.js +13 -16
  398. package/dist/utils/color-utils.js +29 -37
  399. package/dist/utils/custom-scales.js +3 -3
  400. package/dist/utils/data-scale-utils.js +6 -13
  401. package/dist/utils/data-utils.js +60 -83
  402. package/dist/utils/dataset-utils.js +48 -77
  403. package/dist/utils/dom-to-image.js +108 -163
  404. package/dist/utils/dom-utils.js +88 -105
  405. package/dist/utils/export-utils.js +116 -103
  406. package/dist/utils/filter-utils.js +379 -374
  407. package/dist/utils/gl-utils.js +16 -15
  408. package/dist/utils/gpu-filter-utils.js +54 -73
  409. package/dist/utils/index.js +47 -48
  410. package/dist/utils/interaction-utils.js +53 -46
  411. package/dist/utils/layer-utils.js +89 -78
  412. package/dist/utils/locale-utils.js +24 -16
  413. package/dist/utils/map-style-utils/mapbox-gl-style-editor.js +67 -76
  414. package/dist/utils/map-style-utils/mapbox-utils.js +4 -3
  415. package/dist/utils/mapbox-utils.js +3 -4
  416. package/dist/utils/notifications-utils.js +33 -38
  417. package/dist/utils/observe-dimensions.js +42 -54
  418. package/dist/utils/projection-utils.js +14 -11
  419. package/dist/utils/split-map-utils.js +30 -33
  420. package/dist/utils/table-utils/data-container-utils.js +15 -14
  421. package/dist/utils/table-utils/data-row.js +58 -65
  422. package/dist/utils/table-utils/index.js +2 -2
  423. package/dist/utils/table-utils/indexed-data-container.js +105 -173
  424. package/dist/utils/table-utils/kepler-table.js +362 -386
  425. package/dist/utils/table-utils/row-data-container.js +99 -164
  426. package/dist/utils/utils.js +29 -30
  427. package/package.json +21 -21
  428. package/src/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.ts +2 -2
  429. package/src/deckgl-layers/layer-utils/cpu-aggregator.ts +21 -11
  430. package/src/layers/base-layer.ts +17 -10
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.defaultElevationDimension = exports.defaultDimensions = exports.defaultColorDimension = exports.defaultAggregation = exports["default"] = exports.DECK_AGGREGATION_MAP = void 0;
7
+ exports.defaultElevationDimension = exports.defaultDimensions = exports.defaultColorDimension = exports.defaultAggregation = exports.default = exports.DECK_AGGREGATION_MAP = void 0;
8
8
  exports.getAggregatedData = getAggregatedData;
9
9
  exports.getDimensionScale = getDimensionScale;
10
10
  exports.getDimensionSortedBins = getDimensionSortedBins;
@@ -12,16 +12,12 @@ exports.getDimensionValueDomain = getDimensionValueDomain;
12
12
  exports.getGetValue = getGetValue;
13
13
  exports.getScaleFunctor = getScaleFunctor;
14
14
  exports.getValueFunc = getValueFunc;
15
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
16
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
18
15
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
19
16
  var _aggregationLayers = require("@deck.gl/aggregation-layers");
20
17
  var _window = require("global/window");
21
18
  var _aggregateUtils = require("../../utils/aggregate-utils");
22
19
  var _defaultSettings = require("../../constants/default-settings");
23
- 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; }
24
- 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; } // Copyright (c) 2022 Uber Technologies, Inc.
20
+ // Copyright (c) 2022 Uber Technologies, Inc.
25
21
  //
26
22
  // Permission is hereby granted, free of charge, to any person obtaining a copy
27
23
  // of this software and associated documentation files (the "Software"), to deal
@@ -40,59 +36,78 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
40
36
  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
41
37
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
42
38
  // THE SOFTWARE.
39
+
43
40
  /* eslint-disable guard-for-in */
44
- var DECK_AGGREGATION_MAP = exports.DECK_AGGREGATION_MAP = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _aggregationLayers.AGGREGATION_OPERATION.SUM, _defaultSettings.AGGREGATION_TYPES.sum), _aggregationLayers.AGGREGATION_OPERATION.MEAN, _defaultSettings.AGGREGATION_TYPES.average), _aggregationLayers.AGGREGATION_OPERATION.MIN, _defaultSettings.AGGREGATION_TYPES.minimum), _aggregationLayers.AGGREGATION_OPERATION.MAX, _defaultSettings.AGGREGATION_TYPES.maximum);
41
+
42
+ /* @ts-expect-error BinSorter has been removed in deck.gl 9.1 so this entire file will no longer work */
43
+
44
+ const DECK_AGGREGATION_MAP = exports.DECK_AGGREGATION_MAP = {
45
+ SUM: _defaultSettings.AGGREGATION_TYPES.sum,
46
+ MEAN: _defaultSettings.AGGREGATION_TYPES.average,
47
+ MIN: _defaultSettings.AGGREGATION_TYPES.minimum,
48
+ MAX: _defaultSettings.AGGREGATION_TYPES.maximum
49
+ };
45
50
  function getValueFunc(aggregation, accessor) {
46
- if (!aggregation || !_aggregationLayers.AGGREGATION_OPERATION[aggregation.toUpperCase()]) {
47
- _window.console.warn("Aggregation ".concat(aggregation, " is not supported"));
51
+ const op = aggregation.toUpperCase();
52
+ if (!aggregation || !DECK_AGGREGATION_MAP[aggregation.toUpperCase()]) {
53
+ _window.console.warn(`Aggregation ${aggregation} is not supported`);
48
54
  }
49
- var op = _aggregationLayers.AGGREGATION_OPERATION[aggregation.toUpperCase()] || _aggregationLayers.AGGREGATION_OPERATION.SUM;
50
- var keplerOp = DECK_AGGREGATION_MAP[op];
51
- return function (pts) {
52
- return (0, _aggregateUtils.aggregate)(pts.map(accessor), keplerOp);
53
- };
55
+ const keplerOp = DECK_AGGREGATION_MAP[op || 'SUM'];
56
+ return pts => (0, _aggregateUtils.aggregate)(pts.map(accessor), keplerOp);
54
57
  }
55
58
  function getScaleFunctor(scaleType) {
56
59
  if (!scaleType || !_defaultSettings.SCALE_FUNC[scaleType]) {
57
- _window.console.warn("Scale ".concat(scaleType, " is not supported"));
60
+ _window.console.warn(`Scale ${scaleType} is not supported`);
58
61
  }
59
62
  return _defaultSettings.SCALE_FUNC[scaleType] || _defaultSettings.SCALE_FUNC.quantize;
60
63
  }
61
64
  function nop() {}
62
65
  function getGetValue(step, props, dimensionUpdater) {
63
- var key = dimensionUpdater.key;
64
- var _step$triggers = step.triggers,
65
- value = _step$triggers.value,
66
- weight = _step$triggers.weight,
67
- aggregation = _step$triggers.aggregation;
68
- var getValue = props[value.prop];
66
+ const {
67
+ key
68
+ } = dimensionUpdater;
69
+ const {
70
+ value,
71
+ weight,
72
+ aggregation
73
+ } = step.triggers;
74
+ let getValue = props[value.prop];
69
75
  if (getValue === null) {
70
76
  // If `getValue` is not provided from props, build it with aggregation and weight.
71
77
  getValue = getValueFunc(props[aggregation.prop], props[weight.prop]);
72
78
  }
73
79
  if (getValue) {
74
80
  this._setDimensionState(key, {
75
- getValue: getValue
81
+ getValue
76
82
  });
77
83
  }
78
84
  }
79
85
  function getDimensionSortedBins(step, props, dimensionUpdater) {
80
- var key = dimensionUpdater.key;
81
- var getValue = this.state.dimensions[key].getValue;
82
- var sortedBins = new _aggregationLayers._BinSorter(this.state.layerData.data || [], {
83
- getValue: getValue,
86
+ const {
87
+ key
88
+ } = dimensionUpdater;
89
+ const {
90
+ getValue
91
+ } = this.state.dimensions[key];
92
+ const sortedBins = new _aggregationLayers._BinSorter(this.state.layerData.data || [], {
93
+ getValue,
84
94
  filterData: props._filterData
85
95
  });
86
96
  this._setDimensionState(key, {
87
- sortedBins: sortedBins
97
+ sortedBins
88
98
  });
89
99
  }
90
100
  function getDimensionValueDomain(step, props, dimensionUpdater) {
91
- var key = dimensionUpdater.key;
92
- var _step$triggers2 = step.triggers,
93
- lowerPercentile = _step$triggers2.lowerPercentile,
94
- upperPercentile = _step$triggers2.upperPercentile,
95
- scaleType = _step$triggers2.scaleType;
101
+ const {
102
+ key
103
+ } = dimensionUpdater;
104
+ const {
105
+ triggers: {
106
+ lowerPercentile,
107
+ upperPercentile,
108
+ scaleType
109
+ }
110
+ } = step;
96
111
  if (!this.state.dimensions[key].sortedBins) {
97
112
  // the previous step should set sortedBins, if not, something went wrong
98
113
  return;
@@ -100,37 +115,42 @@ function getDimensionValueDomain(step, props, dimensionUpdater) {
100
115
 
101
116
  // for log and sqrt scale, returns linear domain by default
102
117
  // TODO: support other scale function domain in bin sorter
103
- var valueDomain = this.state.dimensions[key].sortedBins.getValueDomainByScale(props[scaleType.prop], [props[lowerPercentile.prop], props[upperPercentile.prop]]);
118
+ const valueDomain = this.state.dimensions[key].sortedBins.getValueDomainByScale(props[scaleType.prop], [props[lowerPercentile.prop], props[upperPercentile.prop]]);
104
119
  this._setDimensionState(key, {
105
120
  // By default sortedBins order by ascending frecuency but if we've an ordinal scale we want to order by descending frecuency
106
121
  valueDomain: props[scaleType.prop] === _defaultSettings.SCALE_TYPES.ordinal ? valueDomain.reverse() : valueDomain
107
122
  });
108
123
  }
109
124
  function getDimensionScale(step, props, dimensionUpdater) {
110
- var key = dimensionUpdater.key;
111
- var _step$triggers3 = step.triggers,
112
- domain = _step$triggers3.domain,
113
- range = _step$triggers3.range,
114
- scaleType = _step$triggers3.scaleType;
115
- var onSet = step.onSet;
125
+ const {
126
+ key
127
+ } = dimensionUpdater;
128
+ const {
129
+ domain,
130
+ range,
131
+ scaleType
132
+ } = step.triggers;
133
+ const {
134
+ onSet
135
+ } = step;
116
136
  if (!this.state.dimensions[key].valueDomain) {
117
137
  // the previous step should set valueDomain, if not, something went wrong
118
138
  return;
119
139
  }
120
- var dimensionRange = props[range.prop];
121
- var dimensionDomain = props[domain.prop] || this.state.dimensions[key].valueDomain;
122
- var scaleTypeProp = scaleType && props[scaleType.prop];
123
- var scaleFunctor = getScaleFunctor(scaleTypeProp)();
124
- var scaleFunc = scaleFunctor.domain(scaleTypeProp === _defaultSettings.SCALE_TYPES.ordinal ? dimensionDomain.slice(0, dimensionRange.length) : dimensionDomain).range(dimensionRange).unknown(_defaultSettings.UNKNOWN_COLOR);
125
- if ((0, _typeof2["default"])(onSet) === 'object' && typeof props[onSet.props] === 'function') {
140
+ const dimensionRange = props[range.prop];
141
+ const dimensionDomain = props[domain.prop] || this.state.dimensions[key].valueDomain;
142
+ const scaleTypeProp = scaleType && props[scaleType.prop];
143
+ const scaleFunctor = getScaleFunctor(scaleTypeProp)();
144
+ const scaleFunc = scaleFunctor.domain(scaleTypeProp === _defaultSettings.SCALE_TYPES.ordinal ? dimensionDomain.slice(0, dimensionRange.length) : dimensionDomain).range(dimensionRange).unknown(_defaultSettings.UNKNOWN_COLOR);
145
+ if (typeof onSet === 'object' && typeof props[onSet.props] === 'function') {
126
146
  props[onSet.props](this.state.dimensions[key].valueDomain);
127
147
  }
128
148
  this._setDimensionState(key, {
129
- scaleFunc: scaleFunc
149
+ scaleFunc
130
150
  });
131
151
  }
132
152
  function normalizeResult() {
133
- var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
153
+ let result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
134
154
  // support previous hexagonAggregator API
135
155
  if (result.hexagons) {
136
156
  return Object.assign({
@@ -144,17 +164,21 @@ function normalizeResult() {
144
164
  return result;
145
165
  }
146
166
  function getAggregatedData(step, props, aggregation, aggregationParams) {
147
- var aggr = step.triggers.aggregator;
148
- var aggregator = props[aggr.prop];
167
+ const {
168
+ triggers: {
169
+ aggregator: aggr
170
+ }
171
+ } = step;
172
+ const aggregator = props[aggr.prop];
149
173
 
150
174
  // result should contain a data array and other props
151
175
  // result = {data: [], ...other props}
152
- var result = aggregator(props, aggregationParams);
176
+ const result = aggregator(props, aggregationParams);
153
177
  this.setState({
154
178
  layerData: normalizeResult(result)
155
179
  });
156
180
  }
157
- var defaultAggregation = exports.defaultAggregation = {
181
+ const defaultAggregation = exports.defaultAggregation = {
158
182
  key: 'position',
159
183
  updateSteps: [{
160
184
  key: 'aggregate',
@@ -174,15 +198,17 @@ var defaultAggregation = exports.defaultAggregation = {
174
198
  }]
175
199
  };
176
200
  function getSubLayerAccessor(dimensionState, dimension, layerProps) {
177
- return function (cell) {
178
- var sortedBins = dimensionState.sortedBins,
179
- scaleFunc = dimensionState.scaleFunc;
180
- var bin = sortedBins.binMap[cell.index];
201
+ return cell => {
202
+ const {
203
+ sortedBins,
204
+ scaleFunc
205
+ } = dimensionState;
206
+ const bin = sortedBins.binMap[cell.index];
181
207
  if (bin && bin.counts === 0) {
182
208
  // no points left in bin after filtering
183
209
  return dimension.nullValue;
184
210
  }
185
- var cv = bin && bin.value;
211
+ const cv = bin && bin.value;
186
212
  // const domain = scaleFunc.domain();
187
213
 
188
214
  // const isValueInDomain = cv >= domain[0] && cv <= domain[domain.length - 1];
@@ -192,14 +218,16 @@ function getSubLayerAccessor(dimensionState, dimension, layerProps) {
192
218
  return scaleFunc(cv);
193
219
  };
194
220
  }
195
- var defaultColorDimension = exports.defaultColorDimension = {
221
+ const defaultColorDimension = exports.defaultColorDimension = {
196
222
  key: 'fillColor',
197
223
  accessor: 'getFillColor',
198
- getPickingInfo: function getPickingInfo(dimensionState, cell) {
199
- var sortedBins = dimensionState.sortedBins;
200
- var colorValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
224
+ getPickingInfo: (dimensionState, cell) => {
225
+ const {
226
+ sortedBins
227
+ } = dimensionState;
228
+ const colorValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
201
229
  return {
202
- colorValue: colorValue
230
+ colorValue
203
231
  };
204
232
  },
205
233
  nullValue: [0, 0, 0, 0],
@@ -260,16 +288,18 @@ var defaultColorDimension = exports.defaultColorDimension = {
260
288
  },
261
289
  updater: getDimensionScale
262
290
  }],
263
- getSubLayerAccessor: getSubLayerAccessor
291
+ getSubLayerAccessor
264
292
  };
265
- var defaultElevationDimension = exports.defaultElevationDimension = {
293
+ const defaultElevationDimension = exports.defaultElevationDimension = {
266
294
  key: 'elevation',
267
295
  accessor: 'getElevation',
268
- getPickingInfo: function getPickingInfo(dimensionState, cell) {
269
- var sortedBins = dimensionState.sortedBins;
270
- var elevationValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
296
+ getPickingInfo: (dimensionState, cell) => {
297
+ const {
298
+ sortedBins
299
+ } = dimensionState;
300
+ const elevationValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
271
301
  return {
272
- elevationValue: elevationValue
302
+ elevationValue
273
303
  };
274
304
  },
275
305
  nullValue: -1,
@@ -330,14 +360,16 @@ var defaultElevationDimension = exports.defaultElevationDimension = {
330
360
  },
331
361
  updater: getDimensionScale
332
362
  }],
333
- getSubLayerAccessor: getSubLayerAccessor
363
+ getSubLayerAccessor
334
364
  };
335
- var _defaultDimensions = exports.defaultDimensions = [defaultColorDimension, defaultElevationDimension];
336
- var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
337
- function CPUAggregator() {
338
- var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
339
- (0, _classCallCheck2["default"])(this, CPUAggregator);
340
- this.state = _objectSpread({
365
+ const defaultDimensions = exports.defaultDimensions = [defaultColorDimension, defaultElevationDimension];
366
+ class CPUAggregator {
367
+ constructor() {
368
+ let opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
369
+ (0, _defineProperty2.default)(this, "state", void 0);
370
+ (0, _defineProperty2.default)(this, "dimensionUpdaters", void 0);
371
+ (0, _defineProperty2.default)(this, "aggregationUpdater", void 0);
372
+ this.state = {
341
373
  layerData: {},
342
374
  dimensions: {
343
375
  // color: {
@@ -352,234 +384,201 @@ var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
352
384
  // sortedBins: null,
353
385
  // scaleFunc: nop
354
386
  // }
355
- }
356
- }, opts.initialState);
387
+ },
388
+ ...opts.initialState
389
+ };
357
390
  this.dimensionUpdaters = {};
358
391
  this.aggregationUpdater = opts.aggregation || defaultAggregation;
359
- this._addDimension(opts.dimensions || _defaultDimensions);
392
+ this._addDimension(opts.dimensions || defaultDimensions);
360
393
  }
361
- return (0, _createClass2["default"])(CPUAggregator, [{
362
- key: "updateAllDimensions",
363
- value: function updateAllDimensions(props) {
364
- var dimensionChanges = [];
365
- // update all dimensions
366
- for (var dim in this.dimensionUpdaters) {
367
- var updaters = this._accumulateUpdaters(0, props, this.dimensionUpdaters[dim]);
368
- dimensionChanges = dimensionChanges.concat(updaters);
369
- }
370
- dimensionChanges.forEach(function (f) {
371
- return typeof f === 'function' && f();
372
- });
373
- }
374
- }, {
375
- key: "updateAggregation",
376
- value: function updateAggregation(props, aggregationParams) {
377
- var updaters = this._accumulateUpdaters(0, props, this.aggregationUpdater);
378
- updaters.forEach(function (f) {
379
- return typeof f === 'function' && f(aggregationParams);
380
- });
394
+ static defaultDimensions() {
395
+ return defaultDimensions;
396
+ }
397
+ updateAllDimensions(props) {
398
+ let dimensionChanges = [];
399
+ // update all dimensions
400
+ for (const dim in this.dimensionUpdaters) {
401
+ const updaters = this._accumulateUpdaters(0, props, this.dimensionUpdaters[dim]);
402
+ dimensionChanges = dimensionChanges.concat(updaters);
381
403
  }
382
- }, {
383
- key: "updateState",
384
- value: function updateState(opts, aggregationParams) {
385
- var oldProps = opts.oldProps,
386
- props = opts.props,
387
- changeFlags = opts.changeFlags;
388
- var dimensionChanges = [];
389
- if (changeFlags.dataChanged) {
390
- // if data changed update everything
391
- this.updateAggregation(props, aggregationParams);
392
- this.updateAllDimensions(props);
393
- return this.state;
394
- }
395
- var aggregationChanges = this._getAggregationChanges(oldProps, props, changeFlags);
396
- if (aggregationChanges && aggregationChanges.length) {
397
- // get aggregatedData
398
- aggregationChanges.forEach(function (f) {
399
- return typeof f === 'function' && f(aggregationParams);
400
- });
401
- this.updateAllDimensions(props);
402
- } else {
403
- // only update dimensions
404
- dimensionChanges = this._getDimensionChanges(oldProps, props, changeFlags) || [];
405
- dimensionChanges.forEach(function (f) {
406
- return typeof f === 'function' && f();
407
- });
408
- }
404
+ dimensionChanges.forEach(f => typeof f === 'function' && f());
405
+ }
406
+ updateAggregation(props, aggregationParams) {
407
+ const updaters = this._accumulateUpdaters(0, props, this.aggregationUpdater);
408
+ updaters.forEach(f => typeof f === 'function' && f(aggregationParams));
409
+ }
410
+ updateState(opts, aggregationParams) {
411
+ const {
412
+ oldProps,
413
+ props,
414
+ changeFlags
415
+ } = opts;
416
+ let dimensionChanges = [];
417
+ if (changeFlags.dataChanged) {
418
+ // if data changed update everything
419
+ this.updateAggregation(props, aggregationParams);
420
+ this.updateAllDimensions(props);
409
421
  return this.state;
410
422
  }
411
-
412
- // Update private state
413
- }, {
414
- key: "setState",
415
- value: function setState(updateObject) {
416
- this.state = Object.assign({}, this.state, updateObject);
423
+ const aggregationChanges = this._getAggregationChanges(oldProps, props, changeFlags);
424
+ if (aggregationChanges && aggregationChanges.length) {
425
+ // get aggregatedData
426
+ aggregationChanges.forEach(f => typeof f === 'function' && f(aggregationParams));
427
+ this.updateAllDimensions(props);
428
+ } else {
429
+ // only update dimensions
430
+ dimensionChanges = this._getDimensionChanges(oldProps, props, changeFlags) || [];
431
+ dimensionChanges.forEach(f => typeof f === 'function' && f());
417
432
  }
433
+ return this.state;
434
+ }
418
435
 
419
- // Update private state.dimensions
420
- }, {
421
- key: "_setDimensionState",
422
- value: function _setDimensionState(key, updateObject) {
423
- this.setState({
424
- dimensions: Object.assign({}, this.state.dimensions, (0, _defineProperty2["default"])({}, key, Object.assign({}, this.state.dimensions[key], updateObject)))
425
- });
426
- }
427
- }, {
428
- key: "_addAggregation",
429
- value: function _addAggregation(aggregation) {
430
- this.aggregationUpdater = aggregation;
431
- }
432
- }, {
433
- key: "_addDimension",
434
- value: function _addDimension() {
435
- var _this = this;
436
- var dimensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
437
- dimensions.forEach(function (dimension) {
438
- var key = dimension.key;
439
- _this.dimensionUpdaters[key] = dimension;
440
- });
441
- }
442
- }, {
443
- key: "_needUpdateStep",
444
- value: function _needUpdateStep(dimensionStep, oldProps, props, changeFlags) {
445
- // whether need to update current dimension step
446
- // dimension step is the value, domain, scaleFunction of each dimension
447
- // each step is an object with properties links to layer prop and whether the prop is
448
- // controlled by updateTriggers
449
- return Object.values(dimensionStep.triggers).some(function (item) {
450
- if (item.updateTrigger) {
451
- // check based on updateTriggers change first
452
- return changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged[item.updateTrigger]);
453
- }
454
- // fallback to direct comparison
455
- return oldProps[item.prop] !== props[item.prop];
456
- });
457
- }
458
- }, {
459
- key: "_accumulateUpdaters",
460
- value: function _accumulateUpdaters(step, props, dimension) {
461
- var updaters = [];
462
- for (var i = step; i < dimension.updateSteps.length; i++) {
463
- var updater = dimension.updateSteps[i].updater;
464
- if (typeof updater === 'function') {
465
- updaters.push(updater.bind(this, dimension.updateSteps[i], props, dimension));
466
- }
436
+ // Update private state
437
+ setState(updateObject) {
438
+ this.state = Object.assign({}, this.state, updateObject);
439
+ }
440
+
441
+ // Update private state.dimensions
442
+ _setDimensionState(key, updateObject) {
443
+ this.setState({
444
+ dimensions: Object.assign({}, this.state.dimensions, {
445
+ [key]: Object.assign({}, this.state.dimensions[key], updateObject)
446
+ })
447
+ });
448
+ }
449
+ _addAggregation(aggregation) {
450
+ this.aggregationUpdater = aggregation;
451
+ }
452
+ _addDimension() {
453
+ let dimensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
454
+ dimensions.forEach(dimension => {
455
+ const {
456
+ key
457
+ } = dimension;
458
+ this.dimensionUpdaters[key] = dimension;
459
+ });
460
+ }
461
+ _needUpdateStep(dimensionStep, oldProps, props, changeFlags) {
462
+ // whether need to update current dimension step
463
+ // dimension step is the value, domain, scaleFunction of each dimension
464
+ // each step is an object with properties links to layer prop and whether the prop is
465
+ // controlled by updateTriggers
466
+ return Object.values(dimensionStep.triggers).some(item => {
467
+ if (item.updateTrigger) {
468
+ // check based on updateTriggers change first
469
+ return changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged[item.updateTrigger]);
467
470
  }
468
- return updaters;
469
- }
470
- }, {
471
- key: "_getAllUpdaters",
472
- value: function _getAllUpdaters(dimension, oldProps, props, changeFlags) {
473
- var _this2 = this;
474
- var updaters = [];
475
- var needUpdateStep = dimension.updateSteps.findIndex(function (step) {
476
- return _this2._needUpdateStep(step, oldProps, props, changeFlags);
477
- });
478
- if (needUpdateStep > -1) {
479
- updaters = updaters.concat(this._accumulateUpdaters(needUpdateStep, props, dimension));
471
+ // fallback to direct comparison
472
+ return oldProps[item.prop] !== props[item.prop];
473
+ });
474
+ }
475
+ _accumulateUpdaters(step, props, dimension) {
476
+ const updaters = [];
477
+ for (let i = step; i < dimension.updateSteps.length; i++) {
478
+ const updater = dimension.updateSteps[i].updater;
479
+ if (typeof updater === 'function') {
480
+ updaters.push(updater.bind(this, dimension.updateSteps[i], props, dimension));
480
481
  }
481
- return updaters;
482
482
  }
483
- }, {
484
- key: "_getAggregationChanges",
485
- value: function _getAggregationChanges(oldProps, props, changeFlags) {
486
- var updaters = this._getAllUpdaters(this.aggregationUpdater, oldProps, props, changeFlags);
487
- return updaters.length ? updaters : null;
483
+ return updaters;
484
+ }
485
+ _getAllUpdaters(dimension, oldProps, props, changeFlags) {
486
+ let updaters = [];
487
+ const needUpdateStep = dimension.updateSteps.findIndex(step => this._needUpdateStep(step, oldProps, props, changeFlags));
488
+ if (needUpdateStep > -1) {
489
+ updaters = updaters.concat(this._accumulateUpdaters(needUpdateStep, props, dimension));
488
490
  }
489
- }, {
490
- key: "_getDimensionChanges",
491
- value: function _getDimensionChanges(oldProps, props, changeFlags) {
492
- var updaters = [];
491
+ return updaters;
492
+ }
493
+ _getAggregationChanges(oldProps, props, changeFlags) {
494
+ const updaters = this._getAllUpdaters(this.aggregationUpdater, oldProps, props, changeFlags);
495
+ return updaters.length ? updaters : null;
496
+ }
497
+ _getDimensionChanges(oldProps, props, changeFlags) {
498
+ let updaters = [];
493
499
 
494
- // get dimension to be updated
495
- for (var key in this.dimensionUpdaters) {
496
- // return the first triggered updater for each dimension
497
- var dimension = this.dimensionUpdaters[key];
498
- var dimensionUpdaters = this._getAllUpdaters(dimension, oldProps, props, changeFlags);
499
- updaters = updaters.concat(dimensionUpdaters);
500
- }
501
- return updaters.length ? updaters : null;
500
+ // get dimension to be updated
501
+ for (const key in this.dimensionUpdaters) {
502
+ // return the first triggered updater for each dimension
503
+ const dimension = this.dimensionUpdaters[key];
504
+ const dimensionUpdaters = this._getAllUpdaters(dimension, oldProps, props, changeFlags);
505
+ updaters = updaters.concat(dimensionUpdaters);
502
506
  }
503
- }, {
504
- key: "getUpdateTriggers",
505
- value: function getUpdateTriggers(props) {
506
- var _this3 = this;
507
- var _updateTriggers = props.updateTriggers || {};
508
- var updateTriggers = {};
509
- var _loop = function _loop() {
510
- var _this3$dimensionUpdat = _this3.dimensionUpdaters[key],
511
- accessor = _this3$dimensionUpdat.accessor,
512
- updateSteps = _this3$dimensionUpdat.updateSteps;
513
- // fold dimension triggers into each accessor
514
- updateTriggers[accessor] = {};
515
- updateSteps.forEach(function (step) {
516
- Object.values(step.triggers || []).forEach(function (_ref) {
517
- var prop = _ref.prop,
518
- updateTrigger = _ref.updateTrigger;
519
- if (updateTrigger) {
520
- // if prop is based on updateTrigger e.g. getColorValue, getColorWeight
521
- // and updateTriggers is passed in from layer prop
522
- // fold the updateTriggers into accessor
523
- var fromProp = _updateTriggers[updateTrigger];
524
- if ((0, _typeof2["default"])(fromProp) === 'object' && !Array.isArray(fromProp)) {
525
- // if updateTrigger is an object spread it
526
- Object.assign(updateTriggers[accessor], fromProp);
527
- } else if (fromProp !== undefined) {
528
- updateTriggers[accessor][prop] = fromProp;
529
- }
530
- } else {
531
- // if prop is not based on updateTrigger
532
- updateTriggers[accessor][prop] = props[prop];
507
+ return updaters.length ? updaters : null;
508
+ }
509
+ getUpdateTriggers(props) {
510
+ const _updateTriggers = props.updateTriggers || {};
511
+ const updateTriggers = {};
512
+ for (const key in this.dimensionUpdaters) {
513
+ const {
514
+ accessor,
515
+ updateSteps
516
+ } = this.dimensionUpdaters[key];
517
+ // fold dimension triggers into each accessor
518
+ updateTriggers[accessor] = {};
519
+ updateSteps.forEach(step => {
520
+ Object.values(step.triggers || []).forEach(_ref => {
521
+ let {
522
+ prop,
523
+ updateTrigger
524
+ } = _ref;
525
+ if (updateTrigger) {
526
+ // if prop is based on updateTrigger e.g. getColorValue, getColorWeight
527
+ // and updateTriggers is passed in from layer prop
528
+ // fold the updateTriggers into accessor
529
+ const fromProp = _updateTriggers[updateTrigger];
530
+ if (typeof fromProp === 'object' && !Array.isArray(fromProp)) {
531
+ // if updateTrigger is an object spread it
532
+ Object.assign(updateTriggers[accessor], fromProp);
533
+ } else if (fromProp !== undefined) {
534
+ updateTriggers[accessor][prop] = fromProp;
533
535
  }
534
- });
535
- });
536
- };
537
- for (var key in this.dimensionUpdaters) {
538
- _loop();
539
- }
540
- return updateTriggers;
541
- }
542
- }, {
543
- key: "getPickingInfo",
544
- value: function getPickingInfo(_ref2, layerProps) {
545
- var info = _ref2.info;
546
- var isPicked = info.picked && info.index > -1;
547
- var object = null;
548
- if (isPicked) {
549
- var cell = this.state.layerData.data[info.index];
550
- var binInfo = {};
551
- for (var key in this.dimensionUpdaters) {
552
- var _getPickingInfo = this.dimensionUpdaters[key].getPickingInfo;
553
- if (typeof _getPickingInfo === 'function') {
554
- binInfo = Object.assign({}, binInfo, _getPickingInfo(this.state.dimensions[key], cell, layerProps));
536
+ } else {
537
+ // if prop is not based on updateTrigger
538
+ updateTriggers[accessor][prop] = props[prop];
555
539
  }
556
- }
557
- object = Object.assign(binInfo, cell, {
558
- points: cell.filteredPoints || cell.points
559
540
  });
560
- }
561
-
562
- // add bin and to info
563
- return Object.assign(info, {
564
- picked: Boolean(object),
565
- // override object with picked cell
566
- object: object
567
541
  });
568
542
  }
569
- }, {
570
- key: "getAccessor",
571
- value: function getAccessor(dimensionKey, layerProps) {
572
- if (!this.dimensionUpdaters.hasOwnProperty(dimensionKey)) {
573
- return nop;
543
+ return updateTriggers;
544
+ }
545
+ getPickingInfo(_ref2, layerProps) {
546
+ let {
547
+ info
548
+ } = _ref2;
549
+ const isPicked = info.picked && info.index > -1;
550
+ let object = null;
551
+ if (isPicked) {
552
+ const cell = this.state.layerData.data[info.index];
553
+ let binInfo = {};
554
+ for (const key in this.dimensionUpdaters) {
555
+ const {
556
+ getPickingInfo
557
+ } = this.dimensionUpdaters[key];
558
+ if (typeof getPickingInfo === 'function') {
559
+ binInfo = Object.assign({}, binInfo, getPickingInfo(this.state.dimensions[key], cell, layerProps));
560
+ }
574
561
  }
575
- return this.dimensionUpdaters[dimensionKey].getSubLayerAccessor(this.state.dimensions[dimensionKey], this.dimensionUpdaters[dimensionKey], layerProps);
562
+ object = Object.assign(binInfo, cell, {
563
+ points: cell.filteredPoints || cell.points
564
+ });
576
565
  }
577
- }], [{
578
- key: "defaultDimensions",
579
- value: function defaultDimensions() {
580
- return _defaultDimensions;
566
+
567
+ // add bin and to info
568
+ return Object.assign(info, {
569
+ picked: Boolean(object),
570
+ // override object with picked cell
571
+ object
572
+ });
573
+ }
574
+ getAccessor(dimensionKey, layerProps) {
575
+ if (!this.dimensionUpdaters.hasOwnProperty(dimensionKey)) {
576
+ return nop;
581
577
  }
582
- }]);
583
- }();
578
+ return this.dimensionUpdaters[dimensionKey].getSubLayerAccessor(this.state.dimensions[dimensionKey], this.dimensionUpdaters[dimensionKey], layerProps);
579
+ }
580
+ }
581
+ exports.default = CPUAggregator;
582
+ (0, _defineProperty2.default)(CPUAggregator, "getDimensionScale", void 0);
584
583
  CPUAggregator.getDimensionScale = getDimensionScale;
585
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYWdncmVnYXRpb25MYXllcnMiLCJyZXF1aXJlIiwiX3dpbmRvdyIsIl9hZ2dyZWdhdGVVdGlscyIsIl9kZWZhdWx0U2V0dGluZ3MiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIkRFQ0tfQUdHUkVHQVRJT05fTUFQIiwiZXhwb3J0cyIsIkFHR1JFR0FUSU9OX09QRVJBVElPTiIsIlNVTSIsIkFHR1JFR0FUSU9OX1RZUEVTIiwic3VtIiwiTUVBTiIsImF2ZXJhZ2UiLCJNSU4iLCJtaW5pbXVtIiwiTUFYIiwibWF4aW11bSIsImdldFZhbHVlRnVuYyIsImFnZ3JlZ2F0aW9uIiwiYWNjZXNzb3IiLCJ0b1VwcGVyQ2FzZSIsIkNvbnNvbGUiLCJ3YXJuIiwiY29uY2F0Iiwib3AiLCJrZXBsZXJPcCIsInB0cyIsImFnZ3JlZ2F0ZSIsIm1hcCIsImdldFNjYWxlRnVuY3RvciIsInNjYWxlVHlwZSIsIlNDQUxFX0ZVTkMiLCJxdWFudGl6ZSIsIm5vcCIsImdldEdldFZhbHVlIiwic3RlcCIsInByb3BzIiwiZGltZW5zaW9uVXBkYXRlciIsImtleSIsIl9zdGVwJHRyaWdnZXJzIiwidHJpZ2dlcnMiLCJ2YWx1ZSIsIndlaWdodCIsImdldFZhbHVlIiwicHJvcCIsIl9zZXREaW1lbnNpb25TdGF0ZSIsImdldERpbWVuc2lvblNvcnRlZEJpbnMiLCJzdGF0ZSIsImRpbWVuc2lvbnMiLCJzb3J0ZWRCaW5zIiwiQmluU29ydGVyIiwibGF5ZXJEYXRhIiwiZGF0YSIsImZpbHRlckRhdGEiLCJfZmlsdGVyRGF0YSIsImdldERpbWVuc2lvblZhbHVlRG9tYWluIiwiX3N0ZXAkdHJpZ2dlcnMyIiwibG93ZXJQZXJjZW50aWxlIiwidXBwZXJQZXJjZW50aWxlIiwidmFsdWVEb21haW4iLCJnZXRWYWx1ZURvbWFpbkJ5U2NhbGUiLCJTQ0FMRV9UWVBFUyIsIm9yZGluYWwiLCJyZXZlcnNlIiwiZ2V0RGltZW5zaW9uU2NhbGUiLCJfc3RlcCR0cmlnZ2VyczMiLCJkb21haW4iLCJyYW5nZSIsIm9uU2V0IiwiZGltZW5zaW9uUmFuZ2UiLCJkaW1lbnNpb25Eb21haW4iLCJzY2FsZVR5cGVQcm9wIiwic2NhbGVGdW5jdG9yIiwic2NhbGVGdW5jIiwic2xpY2UiLCJ1bmtub3duIiwiVU5LTk9XTl9DT0xPUiIsIl90eXBlb2YyIiwibm9ybWFsaXplUmVzdWx0IiwicmVzdWx0IiwidW5kZWZpbmVkIiwiaGV4YWdvbnMiLCJhc3NpZ24iLCJnZXRBZ2dyZWdhdGVkRGF0YSIsImFnZ3JlZ2F0aW9uUGFyYW1zIiwiYWdnciIsImFnZ3JlZ2F0b3IiLCJzZXRTdGF0ZSIsImRlZmF1bHRBZ2dyZWdhdGlvbiIsInVwZGF0ZVN0ZXBzIiwiY2VsbFNpemUiLCJwb3NpdGlvbiIsInVwZGF0ZVRyaWdnZXIiLCJ1cGRhdGVyIiwiZ2V0U3ViTGF5ZXJBY2Nlc3NvciIsImRpbWVuc2lvblN0YXRlIiwiZGltZW5zaW9uIiwibGF5ZXJQcm9wcyIsImNlbGwiLCJiaW4iLCJiaW5NYXAiLCJpbmRleCIsImNvdW50cyIsIm51bGxWYWx1ZSIsImN2IiwiZGVmYXVsdENvbG9yRGltZW5zaW9uIiwiZ2V0UGlja2luZ0luZm8iLCJjb2xvclZhbHVlIiwiZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbiIsImVsZXZhdGlvblZhbHVlIiwiZGVmYXVsdERpbWVuc2lvbnMiLCJDUFVBZ2dyZWdhdG9yIiwib3B0cyIsIl9jbGFzc0NhbGxDaGVjazIiLCJpbml0aWFsU3RhdGUiLCJkaW1lbnNpb25VcGRhdGVycyIsImFnZ3JlZ2F0aW9uVXBkYXRlciIsIl9hZGREaW1lbnNpb24iLCJfY3JlYXRlQ2xhc3MyIiwidXBkYXRlQWxsRGltZW5zaW9ucyIsImRpbWVuc2lvbkNoYW5nZXMiLCJkaW0iLCJ1cGRhdGVycyIsIl9hY2N1bXVsYXRlVXBkYXRlcnMiLCJmIiwidXBkYXRlQWdncmVnYXRpb24iLCJ1cGRhdGVTdGF0ZSIsIm9sZFByb3BzIiwiY2hhbmdlRmxhZ3MiLCJkYXRhQ2hhbmdlZCIsImFnZ3JlZ2F0aW9uQ2hhbmdlcyIsIl9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMiLCJfZ2V0RGltZW5zaW9uQ2hhbmdlcyIsInVwZGF0ZU9iamVjdCIsIl9hZGRBZ2dyZWdhdGlvbiIsIl90aGlzIiwiX25lZWRVcGRhdGVTdGVwIiwiZGltZW5zaW9uU3RlcCIsInZhbHVlcyIsInNvbWUiLCJpdGVtIiwidXBkYXRlVHJpZ2dlcnNDaGFuZ2VkIiwiYWxsIiwiaSIsImJpbmQiLCJfZ2V0QWxsVXBkYXRlcnMiLCJfdGhpczIiLCJuZWVkVXBkYXRlU3RlcCIsImZpbmRJbmRleCIsImdldFVwZGF0ZVRyaWdnZXJzIiwiX3RoaXMzIiwiX3VwZGF0ZVRyaWdnZXJzIiwidXBkYXRlVHJpZ2dlcnMiLCJfbG9vcCIsIl90aGlzMyRkaW1lbnNpb25VcGRhdCIsIl9yZWYiLCJmcm9tUHJvcCIsIkFycmF5IiwiaXNBcnJheSIsIl9yZWYyIiwiaW5mbyIsImlzUGlja2VkIiwicGlja2VkIiwib2JqZWN0IiwiYmluSW5mbyIsInBvaW50cyIsImZpbHRlcmVkUG9pbnRzIiwiQm9vbGVhbiIsImdldEFjY2Vzc29yIiwiZGltZW5zaW9uS2V5IiwiaGFzT3duUHJvcGVydHkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVja2dsLWxheWVycy9sYXllci11dGlscy9jcHUtYWdncmVnYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG4vKiBlc2xpbnQtZGlzYWJsZSBndWFyZC1mb3ItaW4gKi9cbmltcG9ydCB7QUdHUkVHQVRJT05fT1BFUkFUSU9OLCBfQmluU29ydGVyIGFzIEJpblNvcnRlcn0gZnJvbSAnQGRlY2suZ2wvYWdncmVnYXRpb24tbGF5ZXJzJztcbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcblxuaW1wb3J0IHthZ2dyZWdhdGV9IGZyb20gJy4uLy4uL3V0aWxzL2FnZ3JlZ2F0ZS11dGlscyc7XG5pbXBvcnQge0FHR1JFR0FUSU9OX1RZUEVTLCBTQ0FMRV9GVU5DLCBTQ0FMRV9UWVBFUywgVU5LTk9XTl9DT0xPUn0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtSR0JBQ29sb3J9IGZyb20gJy4uLy4uL3JlZHVjZXJzJztcblxuZXhwb3J0IHR5cGUgVXBkYXRlclR5cGUgPSAodGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBCaW5kZWRVcGRhdGVyVHlwZSA9ICgpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBBZ2dyZWdhdGVkVXBkYXRlclR5cGUgPSAoXG4gIHRoaXM6IENQVUFnZ3JlZ2F0b3IsXG4gIHN0ZXAsXG4gIHByb3BzLFxuICBhZ2dyZWdhdGlvbixcbiAgYWdncmVnYXRpb25QYXJhbXNcbikgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEJpbmRlZEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZSA9IChhZ2dyZWdhdGlvblBhcmFtcykgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVXBkYXRlU3RlcHNUeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdHJpZ2dlcnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICBwcm9wOiBzdHJpbmc7XG4gICAgICB1cGRhdGVUcmlnZ2VyPzogc3RyaW5nO1xuICAgIH07XG4gIH07XG4gIG9uU2V0Pzoge1xuICAgIHByb3BzOiBzdHJpbmc7XG4gIH07XG4gIHVwZGF0ZXI6IFVwZGF0ZXJUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgRGltZW5zaW9uVHlwZTxWYWx1ZVR5cGUgPSBhbnk+ID0ge1xuICBrZXk6IHN0cmluZztcbiAgYWNjZXNzb3I6IHN0cmluZztcbiAgZ2V0UGlja2luZ0luZm86IChkaW1lbnNpb25TdGF0ZSwgY2VsbCwgbGF5ZXJQcm9wcz8pID0+IGFueTtcbiAgbnVsbFZhbHVlOiBWYWx1ZVR5cGU7XG4gIHVwZGF0ZVN0ZXBzOiBVcGRhdGVTdGVwc1R5cGVbXTtcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3Nvcjtcbn07XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdHJpZ2dlcnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICBwcm9wOiBzdHJpbmc7XG4gICAgICB1cGRhdGVUcmlnZ2VyPzogc3RyaW5nO1xuICAgIH07XG4gIH07XG4gIHVwZGF0ZXI6IEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZTtcbn07XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0aW9uVHlwZSA9IHtcbiAga2V5OiBzdHJpbmc7XG4gIHVwZGF0ZVN0ZXBzOiBBZ2dyZWdhdGlvblVwZGF0ZVN0ZXBzVHlwZVtdO1xufTtcblxuZXhwb3J0IGNvbnN0IERFQ0tfQUdHUkVHQVRJT05fTUFQID0ge1xuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLlNVTV06IEFHR1JFR0FUSU9OX1RZUEVTLnN1bSxcbiAgW0FHR1JFR0FUSU9OX09QRVJBVElPTi5NRUFOXTogQUdHUkVHQVRJT05fVFlQRVMuYXZlcmFnZSxcbiAgW0FHR1JFR0FUSU9OX09QRVJBVElPTi5NSU5dOiBBR0dSRUdBVElPTl9UWVBFUy5taW5pbXVtLFxuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLk1BWF06IEFHR1JFR0FUSU9OX1RZUEVTLm1heGltdW1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUZ1bmMoYWdncmVnYXRpb24sIGFjY2Vzc29yKSB7XG4gIGlmICghYWdncmVnYXRpb24gfHwgIUFHR1JFR0FUSU9OX09QRVJBVElPTlthZ2dyZWdhdGlvbi50b1VwcGVyQ2FzZSgpXSkge1xuICAgIENvbnNvbGUud2FybihgQWdncmVnYXRpb24gJHthZ2dyZWdhdGlvbn0gaXMgbm90IHN1cHBvcnRlZGApO1xuICB9XG5cbiAgY29uc3Qgb3AgPSBBR0dSRUdBVElPTl9PUEVSQVRJT05bYWdncmVnYXRpb24udG9VcHBlckNhc2UoKV0gfHwgQUdHUkVHQVRJT05fT1BFUkFUSU9OLlNVTTtcbiAgY29uc3Qga2VwbGVyT3AgPSBERUNLX0FHR1JFR0FUSU9OX01BUFtvcF07XG5cbiAgcmV0dXJuIHB0cyA9PiBhZ2dyZWdhdGUocHRzLm1hcChhY2Nlc3NvciksIGtlcGxlck9wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGUpIHtcbiAgaWYgKCFzY2FsZVR5cGUgfHwgIVNDQUxFX0ZVTkNbc2NhbGVUeXBlXSkge1xuICAgIENvbnNvbGUud2FybihgU2NhbGUgJHtzY2FsZVR5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgKTtcbiAgfVxuICByZXR1cm4gU0NBTEVfRlVOQ1tzY2FsZVR5cGVdIHx8IFNDQUxFX0ZVTkMucXVhbnRpemU7XG59XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZXRWYWx1ZSh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHt2YWx1ZSwgd2VpZ2h0LCBhZ2dyZWdhdGlvbn0gPSBzdGVwLnRyaWdnZXJzO1xuXG4gIGxldCBnZXRWYWx1ZSA9IHByb3BzW3ZhbHVlLnByb3BdO1xuXG4gIGlmIChnZXRWYWx1ZSA9PT0gbnVsbCkge1xuICAgIC8vIElmIGBnZXRWYWx1ZWAgaXMgbm90IHByb3ZpZGVkIGZyb20gcHJvcHMsIGJ1aWxkIGl0IHdpdGggYWdncmVnYXRpb24gYW5kIHdlaWdodC5cbiAgICBnZXRWYWx1ZSA9IGdldFZhbHVlRnVuYyhwcm9wc1thZ2dyZWdhdGlvbi5wcm9wXSwgcHJvcHNbd2VpZ2h0LnByb3BdKTtcbiAgfVxuXG4gIGlmIChnZXRWYWx1ZSkge1xuICAgIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge2dldFZhbHVlfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNvcnRlZEJpbnModGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7Z2V0VmFsdWV9ID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV07XG4gIGNvbnN0IHNvcnRlZEJpbnMgPSBuZXcgQmluU29ydGVyKHRoaXMuc3RhdGUubGF5ZXJEYXRhLmRhdGEgfHwgW10sIHtcbiAgICBnZXRWYWx1ZSxcbiAgICBmaWx0ZXJEYXRhOiBwcm9wcy5fZmlsdGVyRGF0YVxuICB9KTtcbiAgdGhpcy5fc2V0RGltZW5zaW9uU3RhdGUoa2V5LCB7c29ydGVkQmluc30pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGltZW5zaW9uVmFsdWVEb21haW4odGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7XG4gICAgdHJpZ2dlcnM6IHtsb3dlclBlcmNlbnRpbGUsIHVwcGVyUGVyY2VudGlsZSwgc2NhbGVUeXBlfVxuICB9ID0gc3RlcDtcblxuICBpZiAoIXRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLnNvcnRlZEJpbnMpIHtcbiAgICAvLyB0aGUgcHJldmlvdXMgc3RlcCBzaG91bGQgc2V0IHNvcnRlZEJpbnMsIGlmIG5vdCwgc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBmb3IgbG9nIGFuZCBzcXJ0IHNjYWxlLCByZXR1cm5zIGxpbmVhciBkb21haW4gYnkgZGVmYXVsdFxuICAvLyBUT0RPOiBzdXBwb3J0IG90aGVyIHNjYWxlIGZ1bmN0aW9uIGRvbWFpbiBpbiBiaW4gc29ydGVyXG4gIGNvbnN0IHZhbHVlRG9tYWluID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0uc29ydGVkQmlucy5nZXRWYWx1ZURvbWFpbkJ5U2NhbGUoXG4gICAgcHJvcHNbc2NhbGVUeXBlLnByb3BdLFxuICAgIFtwcm9wc1tsb3dlclBlcmNlbnRpbGUucHJvcF0sIHByb3BzW3VwcGVyUGVyY2VudGlsZS5wcm9wXV1cbiAgKTtcblxuICB0aGlzLl9zZXREaW1lbnNpb25TdGF0ZShrZXksIHtcbiAgICAvLyBCeSBkZWZhdWx0IHNvcnRlZEJpbnMgb3JkZXIgYnkgYXNjZW5kaW5nIGZyZWN1ZW5jeSAgYnV0IGlmIHdlJ3ZlIGFuIG9yZGluYWwgc2NhbGUgd2Ugd2FudCB0byBvcmRlciBieSBkZXNjZW5kaW5nIGZyZWN1ZW5jeVxuICAgIHZhbHVlRG9tYWluOiBwcm9wc1tzY2FsZVR5cGUucHJvcF0gPT09IFNDQUxFX1RZUEVTLm9yZGluYWwgPyB2YWx1ZURvbWFpbi5yZXZlcnNlKCkgOiB2YWx1ZURvbWFpblxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNjYWxlKHRoaXM6IENQVUFnZ3JlZ2F0b3IsIHN0ZXAsIHByb3BzLCBkaW1lbnNpb25VcGRhdGVyKSB7XG4gIGNvbnN0IHtrZXl9ID0gZGltZW5zaW9uVXBkYXRlcjtcbiAgY29uc3Qge2RvbWFpbiwgcmFuZ2UsIHNjYWxlVHlwZX0gPSBzdGVwLnRyaWdnZXJzO1xuICBjb25zdCB7b25TZXR9ID0gc3RlcDtcbiAgaWYgKCF0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS52YWx1ZURvbWFpbikge1xuICAgIC8vIHRoZSBwcmV2aW91cyBzdGVwIHNob3VsZCBzZXQgdmFsdWVEb21haW4sIGlmIG5vdCwgc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkaW1lbnNpb25SYW5nZSA9IHByb3BzW3JhbmdlLnByb3BdO1xuICBjb25zdCBkaW1lbnNpb25Eb21haW4gPSBwcm9wc1tkb21haW4ucHJvcF0gfHwgdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0udmFsdWVEb21haW47XG5cbiAgY29uc3Qgc2NhbGVUeXBlUHJvcCA9IHNjYWxlVHlwZSAmJiBwcm9wc1tzY2FsZVR5cGUucHJvcF07XG4gIGNvbnN0IHNjYWxlRnVuY3RvciA9IGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGVQcm9wKSgpO1xuXG4gIGNvbnN0IHNjYWxlRnVuYyA9IHNjYWxlRnVuY3RvclxuICAgIC5kb21haW4oXG4gICAgICBzY2FsZVR5cGVQcm9wID09PSBTQ0FMRV9UWVBFUy5vcmRpbmFsXG4gICAgICAgID8gZGltZW5zaW9uRG9tYWluLnNsaWNlKDAsIGRpbWVuc2lvblJhbmdlLmxlbmd0aClcbiAgICAgICAgOiBkaW1lbnNpb25Eb21haW5cbiAgICApXG4gICAgLnJhbmdlKGRpbWVuc2lvblJhbmdlKVxuICAgIC51bmtub3duKFVOS05PV05fQ09MT1IpO1xuXG4gIGlmICh0eXBlb2Ygb25TZXQgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwcm9wc1tvblNldC5wcm9wc10gPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm9wc1tvblNldC5wcm9wc10odGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0udmFsdWVEb21haW4pO1xuICB9XG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge3NjYWxlRnVuY30pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXN1bHQocmVzdWx0OiB7aGV4YWdvbnM/OyBsYXllckRhdGE/fSA9IHt9KSB7XG4gIC8vIHN1cHBvcnQgcHJldmlvdXMgaGV4YWdvbkFnZ3JlZ2F0b3IgQVBJXG4gIGlmIChyZXN1bHQuaGV4YWdvbnMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGF0YTogcmVzdWx0LmhleGFnb25zfSwgcmVzdWx0KTtcbiAgfSBlbHNlIGlmIChyZXN1bHQubGF5ZXJEYXRhKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe2RhdGE6IHJlc3VsdC5sYXllckRhdGF9LCByZXN1bHQpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0ZWREYXRhKFxuICB0aGlzOiBDUFVBZ2dyZWdhdG9yLFxuICBzdGVwLFxuICBwcm9wcyxcbiAgYWdncmVnYXRpb24sXG4gIGFnZ3JlZ2F0aW9uUGFyYW1zXG4pIHtcbiAgY29uc3Qge1xuICAgIHRyaWdnZXJzOiB7YWdncmVnYXRvcjogYWdncn1cbiAgfSA9IHN0ZXA7XG4gIGNvbnN0IGFnZ3JlZ2F0b3IgPSBwcm9wc1thZ2dyLnByb3BdO1xuXG4gIC8vIHJlc3VsdCBzaG91bGQgY29udGFpbiBhIGRhdGEgYXJyYXkgYW5kIG90aGVyIHByb3BzXG4gIC8vIHJlc3VsdCA9IHtkYXRhOiBbXSwgLi4ub3RoZXIgcHJvcHN9XG4gIGNvbnN0IHJlc3VsdCA9IGFnZ3JlZ2F0b3IocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKTtcbiAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgbGF5ZXJEYXRhOiBub3JtYWxpemVSZXN1bHQocmVzdWx0KVxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRBZ2dyZWdhdGlvbjogQWdncmVnYXRpb25UeXBlID0ge1xuICBrZXk6ICdwb3NpdGlvbicsXG4gIHVwZGF0ZVN0ZXBzOiBbXG4gICAge1xuICAgICAga2V5OiAnYWdncmVnYXRlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGNlbGxTaXplOiB7XG4gICAgICAgICAgcHJvcDogJ2NlbGxTaXplJ1xuICAgICAgICB9LFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHByb3A6ICdnZXRQb3NpdGlvbicsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldFBvc2l0aW9uJ1xuICAgICAgICB9LFxuICAgICAgICBhZ2dyZWdhdG9yOiB7XG4gICAgICAgICAgcHJvcDogJ2dyaWRBZ2dyZWdhdG9yJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0QWdncmVnYXRlZERhdGFcbiAgICB9XG4gIF1cbn07XG5cbmZ1bmN0aW9uIGdldFN1YkxheWVyQWNjZXNzb3IoZGltZW5zaW9uU3RhdGUsIGRpbWVuc2lvbiwgbGF5ZXJQcm9wcykge1xuICByZXR1cm4gY2VsbCA9PiB7XG4gICAgY29uc3Qge3NvcnRlZEJpbnMsIHNjYWxlRnVuY30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBiaW4gPSBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XTtcblxuICAgIGlmIChiaW4gJiYgYmluLmNvdW50cyA9PT0gMCkge1xuICAgICAgLy8gbm8gcG9pbnRzIGxlZnQgaW4gYmluIGFmdGVyIGZpbHRlcmluZ1xuICAgICAgcmV0dXJuIGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3YgPSBiaW4gJiYgYmluLnZhbHVlO1xuICAgIC8vIGNvbnN0IGRvbWFpbiA9IHNjYWxlRnVuYy5kb21haW4oKTtcblxuICAgIC8vIGNvbnN0IGlzVmFsdWVJbkRvbWFpbiA9IGN2ID49IGRvbWFpblswXSAmJiBjdiA8PSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdO1xuXG4gICAgLy8gaWYgY2VsbCB2YWx1ZSBpcyBvdXRzaWRlIGRvbWFpbiwgc2V0IGFscGhhIHRvIDBcbiAgICAvLyByZXR1cm4gaXNWYWx1ZUluRG9tYWluID8gc2NhbGVGdW5jKGN2KSA6IGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gICAgcmV0dXJuIHNjYWxlRnVuYyhjdik7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29sb3JEaW1lbnNpb246IERpbWVuc2lvblR5cGU8UkdCQUNvbG9yPiA9IHtcbiAga2V5OiAnZmlsbENvbG9yJyxcbiAgYWNjZXNzb3I6ICdnZXRGaWxsQ29sb3InLFxuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsKSA9PiB7XG4gICAgY29uc3Qge3NvcnRlZEJpbnN9ID0gZGltZW5zaW9uU3RhdGU7XG4gICAgY29uc3QgY29sb3JWYWx1ZSA9IHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdICYmIHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdLnZhbHVlO1xuICAgIHJldHVybiB7Y29sb3JWYWx1ZX07XG4gIH0sXG4gIG51bGxWYWx1ZTogWzAsIDAsIDAsIDBdLFxuICB1cGRhdGVTdGVwczogW1xuICAgIHtcbiAgICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvcDogJ2dldENvbG9yVmFsdWUnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRDb2xvclZhbHVlJ1xuICAgICAgICB9LFxuICAgICAgICB3ZWlnaHQ6IHtcbiAgICAgICAgICBwcm9wOiAnZ2V0Q29sb3JXZWlnaHQnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRDb2xvcldlaWdodCdcbiAgICAgICAgfSxcbiAgICAgICAgYWdncmVnYXRpb246IHtcbiAgICAgICAgICBwcm9wOiAnY29sb3JBZ2dyZWdhdGlvbidcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldEdldFZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXRCaW5zJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIF9maWx0ZXJEYXRhOiB7XG4gICAgICAgICAgcHJvcDogJ19maWx0ZXJEYXRhJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnX2ZpbHRlckRhdGEnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25Tb3J0ZWRCaW5zXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXREb21haW4nLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgbG93ZXJQZXJjZW50aWxlOiB7XG4gICAgICAgICAgcHJvcDogJ2xvd2VyUGVyY2VudGlsZSdcbiAgICAgICAgfSxcbiAgICAgICAgdXBwZXJQZXJjZW50aWxlOiB7XG4gICAgICAgICAgcHJvcDogJ3VwcGVyUGVyY2VudGlsZSdcbiAgICAgICAgfSxcbiAgICAgICAgc2NhbGVUeXBlOiB7cHJvcDogJ2NvbG9yU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25WYWx1ZURvbWFpblxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0U2NhbGVGdW5jJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGRvbWFpbjoge3Byb3A6ICdjb2xvckRvbWFpbid9LFxuICAgICAgICByYW5nZToge3Byb3A6ICdjb2xvclJhbmdlJ30sXG4gICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdjb2xvclNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgb25TZXQ6IHtcbiAgICAgICAgcHJvcHM6ICdvblNldENvbG9yRG9tYWluJ1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNjYWxlXG4gICAgfVxuICBdLFxuICBnZXRTdWJMYXllckFjY2Vzc29yXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbjogRGltZW5zaW9uVHlwZTxudW1iZXI+ID0ge1xuICBrZXk6ICdlbGV2YXRpb24nLFxuICBhY2Nlc3NvcjogJ2dldEVsZXZhdGlvbicsXG4gIGdldFBpY2tpbmdJbmZvOiAoZGltZW5zaW9uU3RhdGUsIGNlbGwpID0+IHtcbiAgICBjb25zdCB7c29ydGVkQmluc30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBlbGV2YXRpb25WYWx1ZSA9IHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdICYmIHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdLnZhbHVlO1xuICAgIHJldHVybiB7ZWxldmF0aW9uVmFsdWV9O1xuICB9LFxuICBudWxsVmFsdWU6IC0xLFxuICB1cGRhdGVTdGVwczogW1xuICAgIHtcbiAgICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvcDogJ2dldEVsZXZhdGlvblZhbHVlJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0RWxldmF0aW9uVmFsdWUnXG4gICAgICAgIH0sXG4gICAgICAgIHdlaWdodDoge1xuICAgICAgICAgIHByb3A6ICdnZXRFbGV2YXRpb25XZWlnaHQnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRFbGV2YXRpb25XZWlnaHQnXG4gICAgICAgIH0sXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiB7XG4gICAgICAgICAgcHJvcDogJ2VsZXZhdGlvbkFnZ3JlZ2F0aW9uJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0R2V0VmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldEJpbnMnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgX2ZpbHRlckRhdGE6IHtcbiAgICAgICAgICBwcm9wOiAnX2ZpbHRlckRhdGEnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdfZmlsdGVyRGF0YSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNvcnRlZEJpbnNcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldERvbWFpbicsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBsb3dlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uTG93ZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICB1cHBlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uVXBwZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnZWxldmF0aW9uU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25WYWx1ZURvbWFpblxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0U2NhbGVGdW5jJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGRvbWFpbjoge3Byb3A6ICdlbGV2YXRpb25Eb21haW4nfSxcbiAgICAgICAgcmFuZ2U6IHtwcm9wOiAnZWxldmF0aW9uUmFuZ2UnfSxcbiAgICAgICAgc2NhbGVUeXBlOiB7cHJvcDogJ2VsZXZhdGlvblNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgb25TZXQ6IHtcbiAgICAgICAgcHJvcHM6ICdvblNldEVsZXZhdGlvbkRvbWFpbidcbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25TY2FsZVxuICAgIH1cbiAgXSxcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3NvclxufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHREaW1lbnNpb25zID0gW2RlZmF1bHRDb2xvckRpbWVuc2lvbiwgZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbl07XG5cbmV4cG9ydCB0eXBlIENQVUFnZ3JlZ2F0b3JTdGF0ZSA9IHtsYXllckRhdGE6IHtkYXRhP307IGRpbWVuc2lvbnM6IHt9fTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ1BVQWdncmVnYXRvciB7XG4gIHN0YXRpYyBnZXREaW1lbnNpb25TY2FsZTogYW55O1xuICBzdGF0ZTogQ1BVQWdncmVnYXRvclN0YXRlO1xuICBkaW1lbnNpb25VcGRhdGVyczoge1trZXk6IHN0cmluZ106IERpbWVuc2lvblR5cGV9O1xuICBhZ2dyZWdhdGlvblVwZGF0ZXI6IEFnZ3JlZ2F0aW9uVHlwZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBvcHRzOiB7XG4gICAgICBpbml0aWFsU3RhdGU/OiBDUFVBZ2dyZWdhdG9yU3RhdGU7XG4gICAgICBkaW1lbnNpb25zPzogRGltZW5zaW9uVHlwZVtdO1xuICAgICAgYWdncmVnYXRpb24/OiBBZ2dyZWdhdGlvblR5cGU7XG4gICAgfSA9IHt9XG4gICkge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBsYXllckRhdGE6IHt9LFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICAvLyBjb2xvcjoge1xuICAgICAgICAvLyAgIGdldFZhbHVlOiBudWxsLFxuICAgICAgICAvLyAgIGRvbWFpbjogbnVsbCxcbiAgICAgICAgLy8gICBzb3J0ZWRCaW5zOiBudWxsLFxuICAgICAgICAvLyAgIHNjYWxlRnVuYzogbm9wXG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIGVsZXZhdGlvbjoge1xuICAgICAgICAvLyAgIGdldFZhbHVlOiBudWxsLFxuICAgICAgICAvLyAgIGRvbWFpbjogbnVsbCxcbiAgICAgICAgLy8gICBzb3J0ZWRCaW5zOiBudWxsLFxuICAgICAgICAvLyAgIHNjYWxlRnVuYzogbm9wXG4gICAgICAgIC8vIH1cbiAgICAgIH0sXG4gICAgICAuLi5vcHRzLmluaXRpYWxTdGF0ZVxuICAgIH07XG5cbiAgICB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzID0ge307XG4gICAgdGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIgPSBvcHRzLmFnZ3JlZ2F0aW9uIHx8IGRlZmF1bHRBZ2dyZWdhdGlvbjtcblxuICAgIHRoaXMuX2FkZERpbWVuc2lvbihvcHRzLmRpbWVuc2lvbnMgfHwgZGVmYXVsdERpbWVuc2lvbnMpO1xuICB9XG5cbiAgc3RhdGljIGRlZmF1bHREaW1lbnNpb25zKCkge1xuICAgIHJldHVybiBkZWZhdWx0RGltZW5zaW9ucztcbiAgfVxuXG4gIHVwZGF0ZUFsbERpbWVuc2lvbnMocHJvcHMpIHtcbiAgICBsZXQgZGltZW5zaW9uQ2hhbmdlczogQmluZGVkVXBkYXRlclR5cGVbXSA9IFtdO1xuICAgIC8vIHVwZGF0ZSBhbGwgZGltZW5zaW9uc1xuICAgIGZvciAoY29uc3QgZGltIGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZXJzID0gdGhpcy5fYWNjdW11bGF0ZVVwZGF0ZXJzKDAsIHByb3BzLCB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2RpbV0pO1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcyA9IGRpbWVuc2lvbkNoYW5nZXMuY29uY2F0KHVwZGF0ZXJzKTtcbiAgICB9XG5cbiAgICBkaW1lbnNpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKCkpO1xuICB9XG5cbiAgdXBkYXRlQWdncmVnYXRpb24ocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKSB7XG4gICAgY29uc3QgdXBkYXRlcnMgPSB0aGlzLl9hY2N1bXVsYXRlVXBkYXRlcnMoMCwgcHJvcHMsIHRoaXMuYWdncmVnYXRpb25VcGRhdGVyKTtcbiAgICB1cGRhdGVycy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZihhZ2dyZWdhdGlvblBhcmFtcykpO1xuICB9XG5cbiAgdXBkYXRlU3RhdGUob3B0cywgYWdncmVnYXRpb25QYXJhbXMpIHtcbiAgICBjb25zdCB7b2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFnc30gPSBvcHRzO1xuICAgIGxldCBkaW1lbnNpb25DaGFuZ2VzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG5cbiAgICBpZiAoY2hhbmdlRmxhZ3MuZGF0YUNoYW5nZWQpIHtcbiAgICAgIC8vIGlmIGRhdGEgY2hhbmdlZCB1cGRhdGUgZXZlcnl0aGluZ1xuICAgICAgdGhpcy51cGRhdGVBZ2dyZWdhdGlvbihwcm9wcywgYWdncmVnYXRpb25QYXJhbXMpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcblxuICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgYWdncmVnYXRpb25DaGFuZ2VzID0gdGhpcy5fZ2V0QWdncmVnYXRpb25DaGFuZ2VzKG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuXG4gICAgaWYgKGFnZ3JlZ2F0aW9uQ2hhbmdlcyAmJiBhZ2dyZWdhdGlvbkNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAvLyBnZXQgYWdncmVnYXRlZERhdGFcbiAgICAgIGFnZ3JlZ2F0aW9uQ2hhbmdlcy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZihhZ2dyZWdhdGlvblBhcmFtcykpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb25seSB1cGRhdGUgZGltZW5zaW9uc1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcyA9IHRoaXMuX2dldERpbWVuc2lvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykgfHwgW107XG4gICAgICBkaW1lbnNpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9XG5cbiAgLy8gVXBkYXRlIHByaXZhdGUgc3RhdGVcbiAgc2V0U3RhdGUodXBkYXRlT2JqZWN0KSB7XG4gICAgdGhpcy5zdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3RhdGUsIHVwZGF0ZU9iamVjdCk7XG4gIH1cblxuICAvLyBVcGRhdGUgcHJpdmF0ZSBzdGF0ZS5kaW1lbnNpb25zXG4gIF9zZXREaW1lbnNpb25TdGF0ZShrZXksIHVwZGF0ZU9iamVjdCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZGltZW5zaW9uczogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZS5kaW1lbnNpb25zLCB7XG4gICAgICAgIFtrZXldOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XSwgdXBkYXRlT2JqZWN0KVxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIF9hZGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbjogQWdncmVnYXRpb25UeXBlKSB7XG4gICAgdGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIgPSBhZ2dyZWdhdGlvbjtcbiAgfVxuXG4gIF9hZGREaW1lbnNpb24oZGltZW5zaW9uczogRGltZW5zaW9uVHlwZVtdID0gW10pIHtcbiAgICBkaW1lbnNpb25zLmZvckVhY2goZGltZW5zaW9uID0+IHtcbiAgICAgIGNvbnN0IHtrZXl9ID0gZGltZW5zaW9uO1xuICAgICAgdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldID0gZGltZW5zaW9uO1xuICAgIH0pO1xuICB9XG5cbiAgX25lZWRVcGRhdGVTdGVwKFxuICAgIGRpbWVuc2lvblN0ZXA6IFVwZGF0ZVN0ZXBzVHlwZSB8IEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlLFxuICAgIG9sZFByb3BzLFxuICAgIHByb3BzLFxuICAgIGNoYW5nZUZsYWdzXG4gICkge1xuICAgIC8vIHdoZXRoZXIgbmVlZCB0byB1cGRhdGUgY3VycmVudCBkaW1lbnNpb24gc3RlcFxuICAgIC8vIGRpbWVuc2lvbiBzdGVwIGlzIHRoZSB2YWx1ZSwgZG9tYWluLCBzY2FsZUZ1bmN0aW9uIG9mIGVhY2ggZGltZW5zaW9uXG4gICAgLy8gZWFjaCBzdGVwIGlzIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgbGlua3MgdG8gbGF5ZXIgcHJvcCBhbmQgd2hldGhlciB0aGUgcHJvcCBpc1xuICAgIC8vIGNvbnRyb2xsZWQgYnkgdXBkYXRlVHJpZ2dlcnNcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhkaW1lbnNpb25TdGVwLnRyaWdnZXJzKS5zb21lKGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW0udXBkYXRlVHJpZ2dlcikge1xuICAgICAgICAvLyBjaGVjayBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VycyBjaGFuZ2UgZmlyc3RcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBjaGFuZ2VGbGFncy51cGRhdGVUcmlnZ2Vyc0NoYW5nZWQgJiZcbiAgICAgICAgICAoY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkLmFsbCB8fFxuICAgICAgICAgICAgY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkW2l0ZW0udXBkYXRlVHJpZ2dlcl0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBmYWxsYmFjayB0byBkaXJlY3QgY29tcGFyaXNvblxuICAgICAgcmV0dXJuIG9sZFByb3BzW2l0ZW0ucHJvcF0gIT09IHByb3BzW2l0ZW0ucHJvcF07XG4gICAgfSk7XG4gIH1cblxuICBfYWNjdW11bGF0ZVVwZGF0ZXJzPFVwZGF0ZXJPYmplY3RUeXBlIGV4dGVuZHMgRGltZW5zaW9uVHlwZSB8IEFnZ3JlZ2F0aW9uVHlwZT4oXG4gICAgc3RlcCxcbiAgICBwcm9wcyxcbiAgICBkaW1lbnNpb246IFVwZGF0ZXJPYmplY3RUeXBlXG4gICkge1xuICAgIHR5cGUgVXBkYXRlclR5cGUgPSBVcGRhdGVyT2JqZWN0VHlwZSBleHRlbmRzIERpbWVuc2lvblR5cGVcbiAgICAgID8gQmluZGVkVXBkYXRlclR5cGVcbiAgICAgIDogQmluZGVkQWdncmVnYXRlZFVwZGF0ZXJUeXBlO1xuICAgIGNvbnN0IHVwZGF0ZXJzOiBVcGRhdGVyVHlwZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IHN0ZXA7IGkgPCBkaW1lbnNpb24udXBkYXRlU3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHVwZGF0ZXIgPSBkaW1lbnNpb24udXBkYXRlU3RlcHNbaV0udXBkYXRlcjtcbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB1cGRhdGVycy5wdXNoKFxuICAgICAgICAgIHVwZGF0ZXIuYmluZCh0aGlzLCBkaW1lbnNpb24udXBkYXRlU3RlcHNbaV0sIHByb3BzLCBkaW1lbnNpb24pIGFzIFVwZGF0ZXJUeXBlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZXJzO1xuICB9XG5cbiAgX2dldEFsbFVwZGF0ZXJzPFVwZGF0ZXJPYmplY3RUeXBlIGV4dGVuZHMgRGltZW5zaW9uVHlwZSB8IEFnZ3JlZ2F0aW9uVHlwZT4oXG4gICAgZGltZW5zaW9uOiBVcGRhdGVyT2JqZWN0VHlwZSxcbiAgICBvbGRQcm9wcyxcbiAgICBwcm9wcyxcbiAgICBjaGFuZ2VGbGFnc1xuICApIHtcbiAgICB0eXBlIFVwZGF0ZXJUeXBlID0gVXBkYXRlck9iamVjdFR5cGUgZXh0ZW5kcyBEaW1lbnNpb25UeXBlXG4gICAgICA/IEJpbmRlZFVwZGF0ZXJUeXBlXG4gICAgICA6IEJpbmRlZEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZTtcbiAgICBsZXQgdXBkYXRlcnM6IFVwZGF0ZXJUeXBlW10gPSBbXTtcbiAgICBjb25zdCBuZWVkVXBkYXRlU3RlcCA9IGRpbWVuc2lvbi51cGRhdGVTdGVwcy5maW5kSW5kZXgoc3RlcCA9PlxuICAgICAgdGhpcy5fbmVlZFVwZGF0ZVN0ZXAoc3RlcCwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncylcbiAgICApO1xuXG4gICAgaWYgKG5lZWRVcGRhdGVTdGVwID4gLTEpIHtcbiAgICAgIHVwZGF0ZXJzID0gdXBkYXRlcnMuY29uY2F0KHRoaXMuX2FjY3VtdWxhdGVVcGRhdGVycyhuZWVkVXBkYXRlU3RlcCwgcHJvcHMsIGRpbWVuc2lvbikpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycztcbiAgfVxuXG4gIF9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykge1xuICAgIGNvbnN0IHVwZGF0ZXJzID0gdGhpcy5fZ2V0QWxsVXBkYXRlcnModGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIsIG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuICAgIHJldHVybiB1cGRhdGVycy5sZW5ndGggPyB1cGRhdGVycyA6IG51bGw7XG4gIH1cblxuICBfZ2V0RGltZW5zaW9uQ2hhbmdlcyhvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKSB7XG4gICAgbGV0IHVwZGF0ZXJzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG5cbiAgICAvLyBnZXQgZGltZW5zaW9uIHRvIGJlIHVwZGF0ZWRcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICAvLyByZXR1cm4gdGhlIGZpcnN0IHRyaWdnZXJlZCB1cGRhdGVyIGZvciBlYWNoIGRpbWVuc2lvblxuICAgICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgY29uc3QgZGltZW5zaW9uVXBkYXRlcnMgPSB0aGlzLl9nZXRBbGxVcGRhdGVycyhkaW1lbnNpb24sIG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuICAgICAgdXBkYXRlcnMgPSB1cGRhdGVycy5jb25jYXQoZGltZW5zaW9uVXBkYXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycy5sZW5ndGggPyB1cGRhdGVycyA6IG51bGw7XG4gIH1cblxuICBnZXRVcGRhdGVUcmlnZ2Vycyhwcm9wcykge1xuICAgIGNvbnN0IF91cGRhdGVUcmlnZ2VycyA9IHByb3BzLnVwZGF0ZVRyaWdnZXJzIHx8IHt9O1xuICAgIGNvbnN0IHVwZGF0ZVRyaWdnZXJzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFjY2Vzc29yLFxuICAgICAgICB1cGRhdGVTdGVwc1xuICAgICAgfToge2FjY2Vzc29yOyB1cGRhdGVTdGVwczogVXBkYXRlU3RlcHNUeXBlW119ID0gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgLy8gZm9sZCBkaW1lbnNpb24gdHJpZ2dlcnMgaW50byBlYWNoIGFjY2Vzc29yXG4gICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0gPSB7fTtcblxuICAgICAgdXBkYXRlU3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhzdGVwLnRyaWdnZXJzIHx8IFtdKS5mb3JFYWNoKCh7cHJvcCwgdXBkYXRlVHJpZ2dlcn0pID0+IHtcbiAgICAgICAgICBpZiAodXBkYXRlVHJpZ2dlcikge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VyIGUuZy4gZ2V0Q29sb3JWYWx1ZSwgZ2V0Q29sb3JXZWlnaHRcbiAgICAgICAgICAgIC8vIGFuZCB1cGRhdGVUcmlnZ2VycyBpcyBwYXNzZWQgaW4gZnJvbSBsYXllciBwcm9wXG4gICAgICAgICAgICAvLyBmb2xkIHRoZSB1cGRhdGVUcmlnZ2VycyBpbnRvIGFjY2Vzc29yXG4gICAgICAgICAgICBjb25zdCBmcm9tUHJvcCA9IF91cGRhdGVUcmlnZ2Vyc1t1cGRhdGVUcmlnZ2VyXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnJvbVByb3AgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGZyb21Qcm9wKSkge1xuICAgICAgICAgICAgICAvLyBpZiB1cGRhdGVUcmlnZ2VyIGlzIGFuIG9iamVjdCBzcHJlYWQgaXRcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0sIGZyb21Qcm9wKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJvbVByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl1bcHJvcF0gPSBmcm9tUHJvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBub3QgYmFzZWQgb24gdXBkYXRlVHJpZ2dlclxuICAgICAgICAgICAgdXBkYXRlVHJpZ2dlcnNbYWNjZXNzb3JdW3Byb3BdID0gcHJvcHNbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVUcmlnZ2VycztcbiAgfVxuXG4gIGdldFBpY2tpbmdJbmZvKHtpbmZvfSwgbGF5ZXJQcm9wcykge1xuICAgIGNvbnN0IGlzUGlja2VkID0gaW5mby5waWNrZWQgJiYgaW5mby5pbmRleCA+IC0xO1xuICAgIGxldCBvYmplY3QgPSBudWxsO1xuXG4gICAgaWYgKGlzUGlja2VkKSB7XG4gICAgICBjb25zdCBjZWxsID0gdGhpcy5zdGF0ZS5sYXllckRhdGEuZGF0YVtpbmZvLmluZGV4XTtcblxuICAgICAgbGV0IGJpbkluZm8gPSB7fTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgICAgY29uc3Qge2dldFBpY2tpbmdJbmZvfSA9IHRoaXMuZGltZW5zaW9uVXBkYXRlcnNba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXRQaWNraW5nSW5mbyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGJpbkluZm8gPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBiaW5JbmZvLFxuICAgICAgICAgICAgZ2V0UGlja2luZ0luZm8odGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0sIGNlbGwsIGxheWVyUHJvcHMpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvYmplY3QgPSBPYmplY3QuYXNzaWduKGJpbkluZm8sIGNlbGwsIHtcbiAgICAgICAgcG9pbnRzOiBjZWxsLmZpbHRlcmVkUG9pbnRzIHx8IGNlbGwucG9pbnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBhZGQgYmluICBhbmQgIHRvIGluZm9cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihpbmZvLCB7XG4gICAgICBwaWNrZWQ6IEJvb2xlYW4ob2JqZWN0KSxcbiAgICAgIC8vIG92ZXJyaWRlIG9iamVjdCB3aXRoIHBpY2tlZCBjZWxsXG4gICAgICBvYmplY3RcbiAgICB9KTtcbiAgfVxuXG4gIGdldEFjY2Vzc29yKGRpbWVuc2lvbktleSwgbGF5ZXJQcm9wcykge1xuICAgIGlmICghdGhpcy5kaW1lbnNpb25VcGRhdGVycy5oYXNPd25Qcm9wZXJ0eShkaW1lbnNpb25LZXkpKSB7XG4gICAgICByZXR1cm4gbm9wO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1tkaW1lbnNpb25LZXldLmdldFN1YkxheWVyQWNjZXNzb3IoXG4gICAgICB0aGlzLnN0YXRlLmRpbWVuc2lvbnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIGxheWVyUHJvcHNcbiAgICApO1xuICB9XG59XG5cbkNQVUFnZ3JlZ2F0b3IuZ2V0RGltZW5zaW9uU2NhbGUgPSBnZXREaW1lbnNpb25TY2FsZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLElBQUFBLGtCQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxlQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBQTJHLFNBQUFJLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FB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
584
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYWdncmVnYXRpb25MYXllcnMiLCJyZXF1aXJlIiwiX3dpbmRvdyIsIl9hZ2dyZWdhdGVVdGlscyIsIl9kZWZhdWx0U2V0dGluZ3MiLCJERUNLX0FHR1JFR0FUSU9OX01BUCIsImV4cG9ydHMiLCJTVU0iLCJBR0dSRUdBVElPTl9UWVBFUyIsInN1bSIsIk1FQU4iLCJhdmVyYWdlIiwiTUlOIiwibWluaW11bSIsIk1BWCIsIm1heGltdW0iLCJnZXRWYWx1ZUZ1bmMiLCJhZ2dyZWdhdGlvbiIsImFjY2Vzc29yIiwib3AiLCJ0b1VwcGVyQ2FzZSIsIkNvbnNvbGUiLCJ3YXJuIiwia2VwbGVyT3AiLCJwdHMiLCJhZ2dyZWdhdGUiLCJtYXAiLCJnZXRTY2FsZUZ1bmN0b3IiLCJzY2FsZVR5cGUiLCJTQ0FMRV9GVU5DIiwicXVhbnRpemUiLCJub3AiLCJnZXRHZXRWYWx1ZSIsInN0ZXAiLCJwcm9wcyIsImRpbWVuc2lvblVwZGF0ZXIiLCJrZXkiLCJ2YWx1ZSIsIndlaWdodCIsInRyaWdnZXJzIiwiZ2V0VmFsdWUiLCJwcm9wIiwiX3NldERpbWVuc2lvblN0YXRlIiwiZ2V0RGltZW5zaW9uU29ydGVkQmlucyIsInN0YXRlIiwiZGltZW5zaW9ucyIsInNvcnRlZEJpbnMiLCJCaW5Tb3J0ZXIiLCJsYXllckRhdGEiLCJkYXRhIiwiZmlsdGVyRGF0YSIsIl9maWx0ZXJEYXRhIiwiZ2V0RGltZW5zaW9uVmFsdWVEb21haW4iLCJsb3dlclBlcmNlbnRpbGUiLCJ1cHBlclBlcmNlbnRpbGUiLCJ2YWx1ZURvbWFpbiIsImdldFZhbHVlRG9tYWluQnlTY2FsZSIsIlNDQUxFX1RZUEVTIiwib3JkaW5hbCIsInJldmVyc2UiLCJnZXREaW1lbnNpb25TY2FsZSIsImRvbWFpbiIsInJhbmdlIiwib25TZXQiLCJkaW1lbnNpb25SYW5nZSIsImRpbWVuc2lvbkRvbWFpbiIsInNjYWxlVHlwZVByb3AiLCJzY2FsZUZ1bmN0b3IiLCJzY2FsZUZ1bmMiLCJzbGljZSIsImxlbmd0aCIsInVua25vd24iLCJVTktOT1dOX0NPTE9SIiwibm9ybWFsaXplUmVzdWx0IiwicmVzdWx0IiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiaGV4YWdvbnMiLCJPYmplY3QiLCJhc3NpZ24iLCJnZXRBZ2dyZWdhdGVkRGF0YSIsImFnZ3JlZ2F0aW9uUGFyYW1zIiwiYWdncmVnYXRvciIsImFnZ3IiLCJzZXRTdGF0ZSIsImRlZmF1bHRBZ2dyZWdhdGlvbiIsInVwZGF0ZVN0ZXBzIiwiY2VsbFNpemUiLCJwb3NpdGlvbiIsInVwZGF0ZVRyaWdnZXIiLCJ1cGRhdGVyIiwiZ2V0U3ViTGF5ZXJBY2Nlc3NvciIsImRpbWVuc2lvblN0YXRlIiwiZGltZW5zaW9uIiwibGF5ZXJQcm9wcyIsImNlbGwiLCJiaW4iLCJiaW5NYXAiLCJpbmRleCIsImNvdW50cyIsIm51bGxWYWx1ZSIsImN2IiwiZGVmYXVsdENvbG9yRGltZW5zaW9uIiwiZ2V0UGlja2luZ0luZm8iLCJjb2xvclZhbHVlIiwiZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbiIsImVsZXZhdGlvblZhbHVlIiwiZGVmYXVsdERpbWVuc2lvbnMiLCJDUFVBZ2dyZWdhdG9yIiwiY29uc3RydWN0b3IiLCJvcHRzIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJpbml0aWFsU3RhdGUiLCJkaW1lbnNpb25VcGRhdGVycyIsImFnZ3JlZ2F0aW9uVXBkYXRlciIsIl9hZGREaW1lbnNpb24iLCJ1cGRhdGVBbGxEaW1lbnNpb25zIiwiZGltZW5zaW9uQ2hhbmdlcyIsImRpbSIsInVwZGF0ZXJzIiwiX2FjY3VtdWxhdGVVcGRhdGVycyIsImNvbmNhdCIsImZvckVhY2giLCJmIiwidXBkYXRlQWdncmVnYXRpb24iLCJ1cGRhdGVTdGF0ZSIsIm9sZFByb3BzIiwiY2hhbmdlRmxhZ3MiLCJkYXRhQ2hhbmdlZCIsImFnZ3JlZ2F0aW9uQ2hhbmdlcyIsIl9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMiLCJfZ2V0RGltZW5zaW9uQ2hhbmdlcyIsInVwZGF0ZU9iamVjdCIsIl9hZGRBZ2dyZWdhdGlvbiIsIl9uZWVkVXBkYXRlU3RlcCIsImRpbWVuc2lvblN0ZXAiLCJ2YWx1ZXMiLCJzb21lIiwiaXRlbSIsInVwZGF0ZVRyaWdnZXJzQ2hhbmdlZCIsImFsbCIsImkiLCJwdXNoIiwiYmluZCIsIl9nZXRBbGxVcGRhdGVycyIsIm5lZWRVcGRhdGVTdGVwIiwiZmluZEluZGV4IiwiZ2V0VXBkYXRlVHJpZ2dlcnMiLCJfdXBkYXRlVHJpZ2dlcnMiLCJ1cGRhdGVUcmlnZ2VycyIsIl9yZWYiLCJmcm9tUHJvcCIsIkFycmF5IiwiaXNBcnJheSIsIl9yZWYyIiwiaW5mbyIsImlzUGlja2VkIiwicGlja2VkIiwib2JqZWN0IiwiYmluSW5mbyIsInBvaW50cyIsImZpbHRlcmVkUG9pbnRzIiwiQm9vbGVhbiIsImdldEFjY2Vzc29yIiwiZGltZW5zaW9uS2V5IiwiaGFzT3duUHJvcGVydHkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGVja2dsLWxheWVycy9sYXllci11dGlscy9jcHUtYWdncmVnYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG4vKiBlc2xpbnQtZGlzYWJsZSBndWFyZC1mb3ItaW4gKi9cbmltcG9ydCB0eXBlIHtBZ2dyZWdhdGlvbk9wZXJhdGlvbn0gZnJvbSAnQGRlY2suZ2wvYWdncmVnYXRpb24tbGF5ZXJzJztcbi8qIEB0cy1leHBlY3QtZXJyb3IgQmluU29ydGVyIGhhcyBiZWVuIHJlbW92ZWQgaW4gZGVjay5nbCA5LjEgc28gdGhpcyBlbnRpcmUgZmlsZSB3aWxsIG5vIGxvbmdlciB3b3JrICovXG5pbXBvcnQge19CaW5Tb3J0ZXIgYXMgQmluU29ydGVyfSBmcm9tICdAZGVjay5nbC9hZ2dyZWdhdGlvbi1sYXllcnMnO1xuaW1wb3J0IHtjb25zb2xlIGFzIENvbnNvbGV9IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuXG5pbXBvcnQge2FnZ3JlZ2F0ZX0gZnJvbSAnLi4vLi4vdXRpbHMvYWdncmVnYXRlLXV0aWxzJztcbmltcG9ydCB7XG4gIEFHR1JFR0FUSU9OX1RZUEVTLFxuICBTQ0FMRV9GVU5DLFxuICBTQ0FMRV9UWVBFUyxcbiAgVU5LTk9XTl9DT0xPUlxufSBmcm9tICcuLi8uLi9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5pbXBvcnQge1JHQkFDb2xvciwgVmFsdWVPZn0gZnJvbSAnLi4vLi4vcmVkdWNlcnMnO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVyVHlwZSA9ICh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEJpbmRlZFVwZGF0ZXJUeXBlID0gKCkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZSA9IChcbiAgdGhpczogQ1BVQWdncmVnYXRvcixcbiAgc3RlcCxcbiAgcHJvcHMsXG4gIGFnZ3JlZ2F0aW9uLFxuICBhZ2dyZWdhdGlvblBhcmFtc1xuKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgQmluZGVkQWdncmVnYXRlZFVwZGF0ZXJUeXBlID0gKGFnZ3JlZ2F0aW9uUGFyYW1zKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVTdGVwc1R5cGUgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0cmlnZ2Vyczoge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgIHByb3A6IHN0cmluZztcbiAgICAgIHVwZGF0ZVRyaWdnZXI/OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgb25TZXQ/OiB7XG4gICAgcHJvcHM6IHN0cmluZztcbiAgfTtcbiAgdXBkYXRlcjogVXBkYXRlclR5cGU7XG59O1xuXG5leHBvcnQgdHlwZSBEaW1lbnNpb25UeXBlPFZhbHVlVHlwZSA9IGFueT4gPSB7XG4gIGtleTogc3RyaW5nO1xuICBhY2Nlc3Nvcjogc3RyaW5nO1xuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsLCBsYXllclByb3BzPykgPT4gYW55O1xuICBudWxsVmFsdWU6IFZhbHVlVHlwZTtcbiAgdXBkYXRlU3RlcHM6IFVwZGF0ZVN0ZXBzVHlwZVtdO1xuICBnZXRTdWJMYXllckFjY2Vzc29yO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25VcGRhdGVTdGVwc1R5cGUgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0cmlnZ2Vyczoge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgIHByb3A6IHN0cmluZztcbiAgICAgIHVwZGF0ZVRyaWdnZXI/OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgdXBkYXRlcjogQWdncmVnYXRlZFVwZGF0ZXJUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25UeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdXBkYXRlU3RlcHM6IEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlW107XG59O1xuXG5leHBvcnQgY29uc3QgREVDS19BR0dSRUdBVElPTl9NQVA6IFBhcnRpYWw8UmVjb3JkPFxuICBBZ2dyZWdhdGlvbk9wZXJhdGlvbixcbiAgVmFsdWVPZjx0eXBlb2YgQUdHUkVHQVRJT05fVFlQRVM+XG4+PiA9IHtcbiAgU1VNOiBBR0dSRUdBVElPTl9UWVBFUy5zdW0sXG4gIE1FQU46IEFHR1JFR0FUSU9OX1RZUEVTLmF2ZXJhZ2UsXG4gIE1JTjogQUdHUkVHQVRJT05fVFlQRVMubWluaW11bSxcbiAgTUFYOiBBR0dSRUdBVElPTl9UWVBFUy5tYXhpbXVtXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVGdW5jKGFnZ3JlZ2F0aW9uLCBhY2Nlc3Nvcikge1xuICBjb25zdCBvcDogQWdncmVnYXRpb25PcGVyYXRpb24gPSBhZ2dyZWdhdGlvbi50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWFnZ3JlZ2F0aW9uIHx8ICFERUNLX0FHR1JFR0FUSU9OX01BUFthZ2dyZWdhdGlvbi50b1VwcGVyQ2FzZSgpXSkge1xuICAgIENvbnNvbGUud2FybihgQWdncmVnYXRpb24gJHthZ2dyZWdhdGlvbn0gaXMgbm90IHN1cHBvcnRlZGApO1xuICB9XG5cbiAgY29uc3Qga2VwbGVyT3AgPSBERUNLX0FHR1JFR0FUSU9OX01BUFtvcCB8fCAnU1VNJ107XG5cbiAgcmV0dXJuIHB0cyA9PiBhZ2dyZWdhdGUocHRzLm1hcChhY2Nlc3NvciksIGtlcGxlck9wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGUpIHtcbiAgaWYgKCFzY2FsZVR5cGUgfHwgIVNDQUxFX0ZVTkNbc2NhbGVUeXBlXSkge1xuICAgIENvbnNvbGUud2FybihgU2NhbGUgJHtzY2FsZVR5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgKTtcbiAgfVxuICByZXR1cm4gU0NBTEVfRlVOQ1tzY2FsZVR5cGVdIHx8IFNDQUxFX0ZVTkMucXVhbnRpemU7XG59XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZXRWYWx1ZSh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHt2YWx1ZSwgd2VpZ2h0LCBhZ2dyZWdhdGlvbn0gPSBzdGVwLnRyaWdnZXJzO1xuXG4gIGxldCBnZXRWYWx1ZSA9IHByb3BzW3ZhbHVlLnByb3BdO1xuXG4gIGlmIChnZXRWYWx1ZSA9PT0gbnVsbCkge1xuICAgIC8vIElmIGBnZXRWYWx1ZWAgaXMgbm90IHByb3ZpZGVkIGZyb20gcHJvcHMsIGJ1aWxkIGl0IHdpdGggYWdncmVnYXRpb24gYW5kIHdlaWdodC5cbiAgICBnZXRWYWx1ZSA9IGdldFZhbHVlRnVuYyhwcm9wc1thZ2dyZWdhdGlvbi5wcm9wXSwgcHJvcHNbd2VpZ2h0LnByb3BdKTtcbiAgfVxuXG4gIGlmIChnZXRWYWx1ZSkge1xuICAgIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge2dldFZhbHVlfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNvcnRlZEJpbnModGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7Z2V0VmFsdWV9ID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV07XG4gIGNvbnN0IHNvcnRlZEJpbnMgPSBuZXcgQmluU29ydGVyKHRoaXMuc3RhdGUubGF5ZXJEYXRhLmRhdGEgfHwgW10sIHtcbiAgICBnZXRWYWx1ZSxcbiAgICBmaWx0ZXJEYXRhOiBwcm9wcy5fZmlsdGVyRGF0YVxuICB9KTtcbiAgdGhpcy5fc2V0RGltZW5zaW9uU3RhdGUoa2V5LCB7c29ydGVkQmluc30pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGltZW5zaW9uVmFsdWVEb21haW4odGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7XG4gICAgdHJpZ2dlcnM6IHtsb3dlclBlcmNlbnRpbGUsIHVwcGVyUGVyY2VudGlsZSwgc2NhbGVUeXBlfVxuICB9ID0gc3RlcDtcblxuICBpZiAoIXRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLnNvcnRlZEJpbnMpIHtcbiAgICAvLyB0aGUgcHJldmlvdXMgc3RlcCBzaG91bGQgc2V0IHNvcnRlZEJpbnMsIGlmIG5vdCwgc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBmb3IgbG9nIGFuZCBzcXJ0IHNjYWxlLCByZXR1cm5zIGxpbmVhciBkb21haW4gYnkgZGVmYXVsdFxuICAvLyBUT0RPOiBzdXBwb3J0IG90aGVyIHNjYWxlIGZ1bmN0aW9uIGRvbWFpbiBpbiBiaW4gc29ydGVyXG4gIGNvbnN0IHZhbHVlRG9tYWluID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0uc29ydGVkQmlucy5nZXRWYWx1ZURvbWFpbkJ5U2NhbGUoXG4gICAgcHJvcHNbc2NhbGVUeXBlLnByb3BdLFxuICAgIFtwcm9wc1tsb3dlclBlcmNlbnRpbGUucHJvcF0sIHByb3BzW3VwcGVyUGVyY2VudGlsZS5wcm9wXV1cbiAgKTtcblxuICB0aGlzLl9zZXREaW1lbnNpb25TdGF0ZShrZXksIHtcbiAgICAvLyBCeSBkZWZhdWx0IHNvcnRlZEJpbnMgb3JkZXIgYnkgYXNjZW5kaW5nIGZyZWN1ZW5jeSAgYnV0IGlmIHdlJ3ZlIGFuIG9yZGluYWwgc2NhbGUgd2Ugd2FudCB0byBvcmRlciBieSBkZXNjZW5kaW5nIGZyZWN1ZW5jeVxuICAgIHZhbHVlRG9tYWluOiBwcm9wc1tzY2FsZVR5cGUucHJvcF0gPT09IFNDQUxFX1RZUEVTLm9yZGluYWwgPyB2YWx1ZURvbWFpbi5yZXZlcnNlKCkgOiB2YWx1ZURvbWFpblxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNjYWxlKHRoaXM6IENQVUFnZ3JlZ2F0b3IsIHN0ZXAsIHByb3BzLCBkaW1lbnNpb25VcGRhdGVyKSB7XG4gIGNvbnN0IHtrZXl9ID0gZGltZW5zaW9uVXBkYXRlcjtcbiAgY29uc3Qge2RvbWFpbiwgcmFuZ2UsIHNjYWxlVHlwZX0gPSBzdGVwLnRyaWdnZXJzO1xuICBjb25zdCB7b25TZXR9ID0gc3RlcDtcbiAgaWYgKCF0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS52YWx1ZURvbWFpbikge1xuICAgIC8vIHRoZSBwcmV2aW91cyBzdGVwIHNob3VsZCBzZXQgdmFsdWVEb21haW4sIGlmIG5vdCwgc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkaW1lbnNpb25SYW5nZSA9IHByb3BzW3JhbmdlLnByb3BdO1xuICBjb25zdCBkaW1lbnNpb25Eb21haW4gPSBwcm9wc1tkb21haW4ucHJvcF0gfHwgdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0udmFsdWVEb21haW47XG5cbiAgY29uc3Qgc2NhbGVUeXBlUHJvcCA9IHNjYWxlVHlwZSAmJiBwcm9wc1tzY2FsZVR5cGUucHJvcF07XG4gIGNvbnN0IHNjYWxlRnVuY3RvciA9IGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGVQcm9wKSgpO1xuXG4gIGNvbnN0IHNjYWxlRnVuYyA9IHNjYWxlRnVuY3RvclxuICAgIC5kb21haW4oXG4gICAgICBzY2FsZVR5cGVQcm9wID09PSBTQ0FMRV9UWVBFUy5vcmRpbmFsXG4gICAgICAgID8gZGltZW5zaW9uRG9tYWluLnNsaWNlKDAsIGRpbWVuc2lvblJhbmdlLmxlbmd0aClcbiAgICAgICAgOiBkaW1lbnNpb25Eb21haW5cbiAgICApXG4gICAgLnJhbmdlKGRpbWVuc2lvblJhbmdlKVxuICAgIC51bmtub3duKFVOS05PV05fQ09MT1IpO1xuXG4gIGlmICh0eXBlb2Ygb25TZXQgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwcm9wc1tvblNldC5wcm9wc10gPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm9wc1tvblNldC5wcm9wc10odGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0udmFsdWVEb21haW4pO1xuICB9XG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge3NjYWxlRnVuY30pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXN1bHQocmVzdWx0OiB7aGV4YWdvbnM/OyBsYXllckRhdGE/fSA9IHt9KSB7XG4gIC8vIHN1cHBvcnQgcHJldmlvdXMgaGV4YWdvbkFnZ3JlZ2F0b3IgQVBJXG4gIGlmIChyZXN1bHQuaGV4YWdvbnMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGF0YTogcmVzdWx0LmhleGFnb25zfSwgcmVzdWx0KTtcbiAgfSBlbHNlIGlmIChyZXN1bHQubGF5ZXJEYXRhKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe2RhdGE6IHJlc3VsdC5sYXllckRhdGF9LCByZXN1bHQpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0ZWREYXRhKFxuICB0aGlzOiBDUFVBZ2dyZWdhdG9yLFxuICBzdGVwLFxuICBwcm9wcyxcbiAgYWdncmVnYXRpb24sXG4gIGFnZ3JlZ2F0aW9uUGFyYW1zXG4pIHtcbiAgY29uc3Qge1xuICAgIHRyaWdnZXJzOiB7YWdncmVnYXRvcjogYWdncn1cbiAgfSA9IHN0ZXA7XG4gIGNvbnN0IGFnZ3JlZ2F0b3IgPSBwcm9wc1thZ2dyLnByb3BdO1xuXG4gIC8vIHJlc3VsdCBzaG91bGQgY29udGFpbiBhIGRhdGEgYXJyYXkgYW5kIG90aGVyIHByb3BzXG4gIC8vIHJlc3VsdCA9IHtkYXRhOiBbXSwgLi4ub3RoZXIgcHJvcHN9XG4gIGNvbnN0IHJlc3VsdCA9IGFnZ3JlZ2F0b3IocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKTtcbiAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgbGF5ZXJEYXRhOiBub3JtYWxpemVSZXN1bHQocmVzdWx0KVxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRBZ2dyZWdhdGlvbjogQWdncmVnYXRpb25UeXBlID0ge1xuICBrZXk6ICdwb3NpdGlvbicsXG4gIHVwZGF0ZVN0ZXBzOiBbXG4gICAge1xuICAgICAga2V5OiAnYWdncmVnYXRlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGNlbGxTaXplOiB7XG4gICAgICAgICAgcHJvcDogJ2NlbGxTaXplJ1xuICAgICAgICB9LFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHByb3A6ICdnZXRQb3NpdGlvbicsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldFBvc2l0aW9uJ1xuICAgICAgICB9LFxuICAgICAgICBhZ2dyZWdhdG9yOiB7XG4gICAgICAgICAgcHJvcDogJ2dyaWRBZ2dyZWdhdG9yJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0QWdncmVnYXRlZERhdGFcbiAgICB9XG4gIF1cbn07XG5cbmZ1bmN0aW9uIGdldFN1YkxheWVyQWNjZXNzb3IoZGltZW5zaW9uU3RhdGUsIGRpbWVuc2lvbiwgbGF5ZXJQcm9wcykge1xuICByZXR1cm4gY2VsbCA9PiB7XG4gICAgY29uc3Qge3NvcnRlZEJpbnMsIHNjYWxlRnVuY30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBiaW4gPSBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XTtcblxuICAgIGlmIChiaW4gJiYgYmluLmNvdW50cyA9PT0gMCkge1xuICAgICAgLy8gbm8gcG9pbnRzIGxlZnQgaW4gYmluIGFmdGVyIGZpbHRlcmluZ1xuICAgICAgcmV0dXJuIGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3YgPSBiaW4gJiYgYmluLnZhbHVlO1xuICAgIC8vIGNvbnN0IGRvbWFpbiA9IHNjYWxlRnVuYy5kb21haW4oKTtcblxuICAgIC8vIGNvbnN0IGlzVmFsdWVJbkRvbWFpbiA9IGN2ID49IGRvbWFpblswXSAmJiBjdiA8PSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdO1xuXG4gICAgLy8gaWYgY2VsbCB2YWx1ZSBpcyBvdXRzaWRlIGRvbWFpbiwgc2V0IGFscGhhIHRvIDBcbiAgICAvLyByZXR1cm4gaXNWYWx1ZUluRG9tYWluID8gc2NhbGVGdW5jKGN2KSA6IGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gICAgcmV0dXJuIHNjYWxlRnVuYyhjdik7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29sb3JEaW1lbnNpb246IERpbWVuc2lvblR5cGU8UkdCQUNvbG9yPiA9IHtcbiAga2V5OiAnZmlsbENvbG9yJyxcbiAgYWNjZXNzb3I6ICdnZXRGaWxsQ29sb3InLFxuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsKSA9PiB7XG4gICAgY29uc3Qge3NvcnRlZEJpbnN9ID0gZGltZW5zaW9uU3RhdGU7XG4gICAgY29uc3QgY29sb3JWYWx1ZSA9IHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdICYmIHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdLnZhbHVlO1xuICAgIHJldHVybiB7Y29sb3JWYWx1ZX07XG4gIH0sXG4gIG51bGxWYWx1ZTogWzAsIDAsIDAsIDBdLFxuICB1cGRhdGVTdGVwczogW1xuICAgIHtcbiAgICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvcDogJ2dldENvbG9yVmFsdWUnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRDb2xvclZhbHVlJ1xuICAgICAgICB9LFxuICAgICAgICB3ZWlnaHQ6IHtcbiAgICAgICAgICBwcm9wOiAnZ2V0Q29sb3JXZWlnaHQnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRDb2xvcldlaWdodCdcbiAgICAgICAgfSxcbiAgICAgICAgYWdncmVnYXRpb246IHtcbiAgICAgICAgICBwcm9wOiAnY29sb3JBZ2dyZWdhdGlvbidcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldEdldFZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXRCaW5zJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIF9maWx0ZXJEYXRhOiB7XG4gICAgICAgICAgcHJvcDogJ19maWx0ZXJEYXRhJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnX2ZpbHRlckRhdGEnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25Tb3J0ZWRCaW5zXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXREb21haW4nLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgbG93ZXJQZXJjZW50aWxlOiB7XG4gICAgICAgICAgcHJvcDogJ2xvd2VyUGVyY2VudGlsZSdcbiAgICAgICAgfSxcbiAgICAgICAgdXBwZXJQZXJjZW50aWxlOiB7XG4gICAgICAgICAgcHJvcDogJ3VwcGVyUGVyY2VudGlsZSdcbiAgICAgICAgfSxcbiAgICAgICAgc2NhbGVUeXBlOiB7cHJvcDogJ2NvbG9yU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25WYWx1ZURvbWFpblxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0U2NhbGVGdW5jJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGRvbWFpbjoge3Byb3A6ICdjb2xvckRvbWFpbid9LFxuICAgICAgICByYW5nZToge3Byb3A6ICdjb2xvclJhbmdlJ30sXG4gICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdjb2xvclNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgb25TZXQ6IHtcbiAgICAgICAgcHJvcHM6ICdvblNldENvbG9yRG9tYWluJ1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNjYWxlXG4gICAgfVxuICBdLFxuICBnZXRTdWJMYXllckFjY2Vzc29yXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbjogRGltZW5zaW9uVHlwZTxudW1iZXI+ID0ge1xuICBrZXk6ICdlbGV2YXRpb24nLFxuICBhY2Nlc3NvcjogJ2dldEVsZXZhdGlvbicsXG4gIGdldFBpY2tpbmdJbmZvOiAoZGltZW5zaW9uU3RhdGUsIGNlbGwpID0+IHtcbiAgICBjb25zdCB7c29ydGVkQmluc30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBlbGV2YXRpb25WYWx1ZSA9IHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdICYmIHNvcnRlZEJpbnMuYmluTWFwW2NlbGwuaW5kZXhdLnZhbHVlO1xuICAgIHJldHVybiB7ZWxldmF0aW9uVmFsdWV9O1xuICB9LFxuICBudWxsVmFsdWU6IC0xLFxuICB1cGRhdGVTdGVwczogW1xuICAgIHtcbiAgICAgIGtleTogJ2dldFZhbHVlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgcHJvcDogJ2dldEVsZXZhdGlvblZhbHVlJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0RWxldmF0aW9uVmFsdWUnXG4gICAgICAgIH0sXG4gICAgICAgIHdlaWdodDoge1xuICAgICAgICAgIHByb3A6ICdnZXRFbGV2YXRpb25XZWlnaHQnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRFbGV2YXRpb25XZWlnaHQnXG4gICAgICAgIH0sXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiB7XG4gICAgICAgICAgcHJvcDogJ2VsZXZhdGlvbkFnZ3JlZ2F0aW9uJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0R2V0VmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldEJpbnMnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgX2ZpbHRlckRhdGE6IHtcbiAgICAgICAgICBwcm9wOiAnX2ZpbHRlckRhdGEnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdfZmlsdGVyRGF0YSdcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNvcnRlZEJpbnNcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldERvbWFpbicsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBsb3dlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uTG93ZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICB1cHBlclBlcmNlbnRpbGU6IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uVXBwZXJQZXJjZW50aWxlJ1xuICAgICAgICB9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnZWxldmF0aW9uU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25WYWx1ZURvbWFpblxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0U2NhbGVGdW5jJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGRvbWFpbjoge3Byb3A6ICdlbGV2YXRpb25Eb21haW4nfSxcbiAgICAgICAgcmFuZ2U6IHtwcm9wOiAnZWxldmF0aW9uUmFuZ2UnfSxcbiAgICAgICAgc2NhbGVUeXBlOiB7cHJvcDogJ2VsZXZhdGlvblNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgb25TZXQ6IHtcbiAgICAgICAgcHJvcHM6ICdvblNldEVsZXZhdGlvbkRvbWFpbidcbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25TY2FsZVxuICAgIH1cbiAgXSxcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3NvclxufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHREaW1lbnNpb25zID0gW2RlZmF1bHRDb2xvckRpbWVuc2lvbiwgZGVmYXVsdEVsZXZhdGlvbkRpbWVuc2lvbl07XG5cbmV4cG9ydCB0eXBlIENQVUFnZ3JlZ2F0b3JTdGF0ZSA9IHtsYXllckRhdGE6IHtkYXRhP307IGRpbWVuc2lvbnM6IHt9fTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ1BVQWdncmVnYXRvciB7XG4gIHN0YXRpYyBnZXREaW1lbnNpb25TY2FsZTogYW55O1xuICBzdGF0ZTogQ1BVQWdncmVnYXRvclN0YXRlO1xuICBkaW1lbnNpb25VcGRhdGVyczoge1trZXk6IHN0cmluZ106IERpbWVuc2lvblR5cGV9O1xuICBhZ2dyZWdhdGlvblVwZGF0ZXI6IEFnZ3JlZ2F0aW9uVHlwZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBvcHRzOiB7XG4gICAgICBpbml0aWFsU3RhdGU/OiBDUFVBZ2dyZWdhdG9yU3RhdGU7XG4gICAgICBkaW1lbnNpb25zPzogRGltZW5zaW9uVHlwZVtdO1xuICAgICAgYWdncmVnYXRpb24/OiBBZ2dyZWdhdGlvblR5cGU7XG4gICAgfSA9IHt9XG4gICkge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBsYXllckRhdGE6IHt9LFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICAvLyBjb2xvcjoge1xuICAgICAgICAvLyAgIGdldFZhbHVlOiBudWxsLFxuICAgICAgICAvLyAgIGRvbWFpbjogbnVsbCxcbiAgICAgICAgLy8gICBzb3J0ZWRCaW5zOiBudWxsLFxuICAgICAgICAvLyAgIHNjYWxlRnVuYzogbm9wXG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIGVsZXZhdGlvbjoge1xuICAgICAgICAvLyAgIGdldFZhbHVlOiBudWxsLFxuICAgICAgICAvLyAgIGRvbWFpbjogbnVsbCxcbiAgICAgICAgLy8gICBzb3J0ZWRCaW5zOiBudWxsLFxuICAgICAgICAvLyAgIHNjYWxlRnVuYzogbm9wXG4gICAgICAgIC8vIH1cbiAgICAgIH0sXG4gICAgICAuLi5vcHRzLmluaXRpYWxTdGF0ZVxuICAgIH07XG5cbiAgICB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzID0ge307XG4gICAgdGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIgPSBvcHRzLmFnZ3JlZ2F0aW9uIHx8IGRlZmF1bHRBZ2dyZWdhdGlvbjtcblxuICAgIHRoaXMuX2FkZERpbWVuc2lvbihvcHRzLmRpbWVuc2lvbnMgfHwgZGVmYXVsdERpbWVuc2lvbnMpO1xuICB9XG5cbiAgc3RhdGljIGRlZmF1bHREaW1lbnNpb25zKCkge1xuICAgIHJldHVybiBkZWZhdWx0RGltZW5zaW9ucztcbiAgfVxuXG4gIHVwZGF0ZUFsbERpbWVuc2lvbnMocHJvcHMpIHtcbiAgICBsZXQgZGltZW5zaW9uQ2hhbmdlczogQmluZGVkVXBkYXRlclR5cGVbXSA9IFtdO1xuICAgIC8vIHVwZGF0ZSBhbGwgZGltZW5zaW9uc1xuICAgIGZvciAoY29uc3QgZGltIGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZXJzID0gdGhpcy5fYWNjdW11bGF0ZVVwZGF0ZXJzKDAsIHByb3BzLCB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2RpbV0pO1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcyA9IGRpbWVuc2lvbkNoYW5nZXMuY29uY2F0KHVwZGF0ZXJzKTtcbiAgICB9XG5cbiAgICBkaW1lbnNpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKCkpO1xuICB9XG5cbiAgdXBkYXRlQWdncmVnYXRpb24ocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKSB7XG4gICAgY29uc3QgdXBkYXRlcnMgPSB0aGlzLl9hY2N1bXVsYXRlVXBkYXRlcnMoMCwgcHJvcHMsIHRoaXMuYWdncmVnYXRpb25VcGRhdGVyKTtcbiAgICB1cGRhdGVycy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZihhZ2dyZWdhdGlvblBhcmFtcykpO1xuICB9XG5cbiAgdXBkYXRlU3RhdGUob3B0cywgYWdncmVnYXRpb25QYXJhbXMpIHtcbiAgICBjb25zdCB7b2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFnc30gPSBvcHRzO1xuICAgIGxldCBkaW1lbnNpb25DaGFuZ2VzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG5cbiAgICBpZiAoY2hhbmdlRmxhZ3MuZGF0YUNoYW5nZWQpIHtcbiAgICAgIC8vIGlmIGRhdGEgY2hhbmdlZCB1cGRhdGUgZXZlcnl0aGluZ1xuICAgICAgdGhpcy51cGRhdGVBZ2dyZWdhdGlvbihwcm9wcywgYWdncmVnYXRpb25QYXJhbXMpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcblxuICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgYWdncmVnYXRpb25DaGFuZ2VzID0gdGhpcy5fZ2V0QWdncmVnYXRpb25DaGFuZ2VzKG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuXG4gICAgaWYgKGFnZ3JlZ2F0aW9uQ2hhbmdlcyAmJiBhZ2dyZWdhdGlvbkNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAvLyBnZXQgYWdncmVnYXRlZERhdGFcbiAgICAgIGFnZ3JlZ2F0aW9uQ2hhbmdlcy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZihhZ2dyZWdhdGlvblBhcmFtcykpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb25seSB1cGRhdGUgZGltZW5zaW9uc1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcyA9IHRoaXMuX2dldERpbWVuc2lvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykgfHwgW107XG4gICAgICBkaW1lbnNpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9XG5cbiAgLy8gVXBkYXRlIHByaXZhdGUgc3RhdGVcbiAgc2V0U3RhdGUodXBkYXRlT2JqZWN0KSB7XG4gICAgdGhpcy5zdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3RhdGUsIHVwZGF0ZU9iamVjdCk7XG4gIH1cblxuICAvLyBVcGRhdGUgcHJpdmF0ZSBzdGF0ZS5kaW1lbnNpb25zXG4gIF9zZXREaW1lbnNpb25TdGF0ZShrZXksIHVwZGF0ZU9iamVjdCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZGltZW5zaW9uczogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZS5kaW1lbnNpb25zLCB7XG4gICAgICAgIFtrZXldOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XSwgdXBkYXRlT2JqZWN0KVxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIF9hZGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbjogQWdncmVnYXRpb25UeXBlKSB7XG4gICAgdGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIgPSBhZ2dyZWdhdGlvbjtcbiAgfVxuXG4gIF9hZGREaW1lbnNpb24oZGltZW5zaW9uczogRGltZW5zaW9uVHlwZVtdID0gW10pIHtcbiAgICBkaW1lbnNpb25zLmZvckVhY2goZGltZW5zaW9uID0+IHtcbiAgICAgIGNvbnN0IHtrZXl9ID0gZGltZW5zaW9uO1xuICAgICAgdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldID0gZGltZW5zaW9uO1xuICAgIH0pO1xuICB9XG5cbiAgX25lZWRVcGRhdGVTdGVwKFxuICAgIGRpbWVuc2lvblN0ZXA6IFVwZGF0ZVN0ZXBzVHlwZSB8IEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlLFxuICAgIG9sZFByb3BzLFxuICAgIHByb3BzLFxuICAgIGNoYW5nZUZsYWdzXG4gICkge1xuICAgIC8vIHdoZXRoZXIgbmVlZCB0byB1cGRhdGUgY3VycmVudCBkaW1lbnNpb24gc3RlcFxuICAgIC8vIGRpbWVuc2lvbiBzdGVwIGlzIHRoZSB2YWx1ZSwgZG9tYWluLCBzY2FsZUZ1bmN0aW9uIG9mIGVhY2ggZGltZW5zaW9uXG4gICAgLy8gZWFjaCBzdGVwIGlzIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgbGlua3MgdG8gbGF5ZXIgcHJvcCBhbmQgd2hldGhlciB0aGUgcHJvcCBpc1xuICAgIC8vIGNvbnRyb2xsZWQgYnkgdXBkYXRlVHJpZ2dlcnNcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhkaW1lbnNpb25TdGVwLnRyaWdnZXJzKS5zb21lKGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW0udXBkYXRlVHJpZ2dlcikge1xuICAgICAgICAvLyBjaGVjayBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VycyBjaGFuZ2UgZmlyc3RcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBjaGFuZ2VGbGFncy51cGRhdGVUcmlnZ2Vyc0NoYW5nZWQgJiZcbiAgICAgICAgICAoY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkLmFsbCB8fFxuICAgICAgICAgICAgY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkW2l0ZW0udXBkYXRlVHJpZ2dlcl0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBmYWxsYmFjayB0byBkaXJlY3QgY29tcGFyaXNvblxuICAgICAgcmV0dXJuIG9sZFByb3BzW2l0ZW0ucHJvcF0gIT09IHByb3BzW2l0ZW0ucHJvcF07XG4gICAgfSk7XG4gIH1cblxuICBfYWNjdW11bGF0ZVVwZGF0ZXJzPFVwZGF0ZXJPYmplY3RUeXBlIGV4dGVuZHMgRGltZW5zaW9uVHlwZSB8IEFnZ3JlZ2F0aW9uVHlwZT4oXG4gICAgc3RlcCxcbiAgICBwcm9wcyxcbiAgICBkaW1lbnNpb246IFVwZGF0ZXJPYmplY3RUeXBlXG4gICkge1xuICAgIHR5cGUgVXBkYXRlclR5cGUgPSBVcGRhdGVyT2JqZWN0VHlwZSBleHRlbmRzIERpbWVuc2lvblR5cGVcbiAgICAgID8gQmluZGVkVXBkYXRlclR5cGVcbiAgICAgIDogQmluZGVkQWdncmVnYXRlZFVwZGF0ZXJUeXBlO1xuICAgIGNvbnN0IHVwZGF0ZXJzOiBVcGRhdGVyVHlwZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IHN0ZXA7IGkgPCBkaW1lbnNpb24udXBkYXRlU3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHVwZGF0ZXIgPSBkaW1lbnNpb24udXBkYXRlU3RlcHNbaV0udXBkYXRlcjtcbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB1cGRhdGVycy5wdXNoKFxuICAgICAgICAgIHVwZGF0ZXIuYmluZCh0aGlzLCBkaW1lbnNpb24udXBkYXRlU3RlcHNbaV0sIHByb3BzLCBkaW1lbnNpb24pIGFzIFVwZGF0ZXJUeXBlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZXJzO1xuICB9XG5cbiAgX2dldEFsbFVwZGF0ZXJzPFVwZGF0ZXJPYmplY3RUeXBlIGV4dGVuZHMgRGltZW5zaW9uVHlwZSB8IEFnZ3JlZ2F0aW9uVHlwZT4oXG4gICAgZGltZW5zaW9uOiBVcGRhdGVyT2JqZWN0VHlwZSxcbiAgICBvbGRQcm9wcyxcbiAgICBwcm9wcyxcbiAgICBjaGFuZ2VGbGFnc1xuICApIHtcbiAgICB0eXBlIFVwZGF0ZXJUeXBlID0gVXBkYXRlck9iamVjdFR5cGUgZXh0ZW5kcyBEaW1lbnNpb25UeXBlXG4gICAgICA/IEJpbmRlZFVwZGF0ZXJUeXBlXG4gICAgICA6IEJpbmRlZEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZTtcbiAgICBsZXQgdXBkYXRlcnM6IFVwZGF0ZXJUeXBlW10gPSBbXTtcbiAgICBjb25zdCBuZWVkVXBkYXRlU3RlcCA9IGRpbWVuc2lvbi51cGRhdGVTdGVwcy5maW5kSW5kZXgoc3RlcCA9PlxuICAgICAgdGhpcy5fbmVlZFVwZGF0ZVN0ZXAoc3RlcCwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncylcbiAgICApO1xuXG4gICAgaWYgKG5lZWRVcGRhdGVTdGVwID4gLTEpIHtcbiAgICAgIHVwZGF0ZXJzID0gdXBkYXRlcnMuY29uY2F0KHRoaXMuX2FjY3VtdWxhdGVVcGRhdGVycyhuZWVkVXBkYXRlU3RlcCwgcHJvcHMsIGRpbWVuc2lvbikpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycztcbiAgfVxuXG4gIF9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykge1xuICAgIGNvbnN0IHVwZGF0ZXJzID0gdGhpcy5fZ2V0QWxsVXBkYXRlcnModGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIsIG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuICAgIHJldHVybiB1cGRhdGVycy5sZW5ndGggPyB1cGRhdGVycyA6IG51bGw7XG4gIH1cblxuICBfZ2V0RGltZW5zaW9uQ2hhbmdlcyhvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKSB7XG4gICAgbGV0IHVwZGF0ZXJzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG5cbiAgICAvLyBnZXQgZGltZW5zaW9uIHRvIGJlIHVwZGF0ZWRcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICAvLyByZXR1cm4gdGhlIGZpcnN0IHRyaWdnZXJlZCB1cGRhdGVyIGZvciBlYWNoIGRpbWVuc2lvblxuICAgICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgY29uc3QgZGltZW5zaW9uVXBkYXRlcnMgPSB0aGlzLl9nZXRBbGxVcGRhdGVycyhkaW1lbnNpb24sIG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuICAgICAgdXBkYXRlcnMgPSB1cGRhdGVycy5jb25jYXQoZGltZW5zaW9uVXBkYXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycy5sZW5ndGggPyB1cGRhdGVycyA6IG51bGw7XG4gIH1cblxuICBnZXRVcGRhdGVUcmlnZ2Vycyhwcm9wcykge1xuICAgIGNvbnN0IF91cGRhdGVUcmlnZ2VycyA9IHByb3BzLnVwZGF0ZVRyaWdnZXJzIHx8IHt9O1xuICAgIGNvbnN0IHVwZGF0ZVRyaWdnZXJzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFjY2Vzc29yLFxuICAgICAgICB1cGRhdGVTdGVwc1xuICAgICAgfToge2FjY2Vzc29yOyB1cGRhdGVTdGVwczogVXBkYXRlU3RlcHNUeXBlW119ID0gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgLy8gZm9sZCBkaW1lbnNpb24gdHJpZ2dlcnMgaW50byBlYWNoIGFjY2Vzc29yXG4gICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0gPSB7fTtcblxuICAgICAgdXBkYXRlU3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhzdGVwLnRyaWdnZXJzIHx8IFtdKS5mb3JFYWNoKCh7cHJvcCwgdXBkYXRlVHJpZ2dlcn0pID0+IHtcbiAgICAgICAgICBpZiAodXBkYXRlVHJpZ2dlcikge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VyIGUuZy4gZ2V0Q29sb3JWYWx1ZSwgZ2V0Q29sb3JXZWlnaHRcbiAgICAgICAgICAgIC8vIGFuZCB1cGRhdGVUcmlnZ2VycyBpcyBwYXNzZWQgaW4gZnJvbSBsYXllciBwcm9wXG4gICAgICAgICAgICAvLyBmb2xkIHRoZSB1cGRhdGVUcmlnZ2VycyBpbnRvIGFjY2Vzc29yXG4gICAgICAgICAgICBjb25zdCBmcm9tUHJvcCA9IF91cGRhdGVUcmlnZ2Vyc1t1cGRhdGVUcmlnZ2VyXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnJvbVByb3AgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGZyb21Qcm9wKSkge1xuICAgICAgICAgICAgICAvLyBpZiB1cGRhdGVUcmlnZ2VyIGlzIGFuIG9iamVjdCBzcHJlYWQgaXRcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0sIGZyb21Qcm9wKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJvbVByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl1bcHJvcF0gPSBmcm9tUHJvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBub3QgYmFzZWQgb24gdXBkYXRlVHJpZ2dlclxuICAgICAgICAgICAgdXBkYXRlVHJpZ2dlcnNbYWNjZXNzb3JdW3Byb3BdID0gcHJvcHNbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVUcmlnZ2VycztcbiAgfVxuXG4gIGdldFBpY2tpbmdJbmZvKHtpbmZvfSwgbGF5ZXJQcm9wcykge1xuICAgIGNvbnN0IGlzUGlja2VkID0gaW5mby5waWNrZWQgJiYgaW5mby5pbmRleCA+IC0xO1xuICAgIGxldCBvYmplY3QgPSBudWxsO1xuXG4gICAgaWYgKGlzUGlja2VkKSB7XG4gICAgICBjb25zdCBjZWxsID0gdGhpcy5zdGF0ZS5sYXllckRhdGEuZGF0YVtpbmZvLmluZGV4XTtcblxuICAgICAgbGV0IGJpbkluZm8gPSB7fTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgICAgY29uc3Qge2dldFBpY2tpbmdJbmZvfSA9IHRoaXMuZGltZW5zaW9uVXBkYXRlcnNba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXRQaWNraW5nSW5mbyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGJpbkluZm8gPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICBiaW5JbmZvLFxuICAgICAgICAgICAgZ2V0UGlja2luZ0luZm8odGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0sIGNlbGwsIGxheWVyUHJvcHMpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvYmplY3QgPSBPYmplY3QuYXNzaWduKGJpbkluZm8sIGNlbGwsIHtcbiAgICAgICAgcG9pbnRzOiBjZWxsLmZpbHRlcmVkUG9pbnRzIHx8IGNlbGwucG9pbnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBhZGQgYmluICBhbmQgIHRvIGluZm9cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihpbmZvLCB7XG4gICAgICBwaWNrZWQ6IEJvb2xlYW4ob2JqZWN0KSxcbiAgICAgIC8vIG92ZXJyaWRlIG9iamVjdCB3aXRoIHBpY2tlZCBjZWxsXG4gICAgICBvYmplY3RcbiAgICB9KTtcbiAgfVxuXG4gIGdldEFjY2Vzc29yKGRpbWVuc2lvbktleSwgbGF5ZXJQcm9wcykge1xuICAgIGlmICghdGhpcy5kaW1lbnNpb25VcGRhdGVycy5oYXNPd25Qcm9wZXJ0eShkaW1lbnNpb25LZXkpKSB7XG4gICAgICByZXR1cm4gbm9wO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1tkaW1lbnNpb25LZXldLmdldFN1YkxheWVyQWNjZXNzb3IoXG4gICAgICB0aGlzLnN0YXRlLmRpbWVuc2lvbnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIGxheWVyUHJvcHNcbiAgICApO1xuICB9XG59XG5cbkNQVUFnZ3JlZ2F0b3IuZ2V0RGltZW5zaW9uU2NhbGUgPSBnZXREaW1lbnNpb25TY2FsZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBLElBQUFBLGtCQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxlQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQStETyxNQUFNSSxvQkFHWCxHQUFBQyxPQUFBLENBQUFELG9CQUFBLEdBQUc7RUFDSEUsR0FBRyxFQUFFQyxrQ0FBaUIsQ0FBQ0MsR0FBRztFQUMxQkMsSUFBSSxFQUFFRixrQ0FBaUIsQ0FBQ0csT0FBTztFQUMvQkMsR0FBRyxFQUFFSixrQ0FBaUIsQ0FBQ0ssT0FBTztFQUM5QkMsR0FBRyxFQUFFTixrQ0FBaUIsQ0FBQ087QUFDekIsQ0FBQztBQUVNLFNBQVNDLFlBQVlBLENBQUNDLFdBQVcsRUFBRUMsUUFBUSxFQUFFO0VBQ2xELE1BQU1DLEVBQXdCLEdBQUdGLFdBQVcsQ0FBQ0csV0FBVyxDQUFD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