@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
@@ -6,15 +6,12 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.copyTable = copyTable;
8
8
  exports.copyTableAndUpdate = copyTableAndUpdate;
9
- exports["default"] = void 0;
9
+ exports.default = void 0;
10
10
  exports.findPointFieldPairs = findPointFieldPairs;
11
11
  exports.pinTableColumns = pinTableColumns;
12
12
  exports.removeSuffixAndDelimiters = removeSuffixAndDelimiters;
13
13
  exports.sortDatasetByColumn = sortDatasetByColumn;
14
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
14
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
17
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
18
15
  var _console = require("global/console");
19
16
  var _defaultSettings = require("../../constants/default-settings");
20
17
  var _d3Array = require("d3-array");
@@ -25,11 +22,7 @@ var _dataUtils = require("../data-utils");
25
22
  var _dataScaleUtils = require("../data-scale-utils");
26
23
  var _dataContainerUtils = require("./data-container-utils");
27
24
  var _colorUtils = require("../color-utils");
28
- function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
29
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
30
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
31
- 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; }
32
- 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.
25
+ // Copyright (c) 2022 Uber Technologies, Inc.
33
26
  //
34
27
  // Permission is hereby granted, free of charge, to any person obtaining a copy
35
28
  // of this software and associated documentation files (the "Software"), to deal
@@ -48,24 +41,43 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
48
41
  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
49
42
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
50
43
  // THE SOFTWARE.
44
+
51
45
  // import {validateInputData} from 'processors/data-processor';
46
+
52
47
  // Unique identifier of each field
53
- var FID_KEY = 'name';
54
- var KeplerTable = /*#__PURE__*/function () {
55
- // fields and data
56
-
57
- // table-injected metadata
58
-
59
- // table-injected metadata
60
-
61
- function KeplerTable(_ref) {
62
- var _ref$info = _ref.info,
63
- info = _ref$info === void 0 ? {} : _ref$info,
64
- data = _ref.data,
65
- color = _ref.color,
66
- metadata = _ref.metadata,
67
- supportedFilterTypes = _ref.supportedFilterTypes;
68
- (0, _classCallCheck2["default"])(this, KeplerTable);
48
+ const FID_KEY = 'name';
49
+ class KeplerTable {
50
+ constructor(_ref) {
51
+ let {
52
+ info = {},
53
+ data,
54
+ color,
55
+ metadata,
56
+ supportedFilterTypes
57
+ } = _ref;
58
+ (0, _defineProperty2.default)(this, "id", void 0);
59
+ (0, _defineProperty2.default)(this, "type", void 0);
60
+ (0, _defineProperty2.default)(this, "label", void 0);
61
+ (0, _defineProperty2.default)(this, "color", void 0);
62
+ // fields and data
63
+ (0, _defineProperty2.default)(this, "fields", void 0);
64
+ (0, _defineProperty2.default)(this, "dataContainer", void 0);
65
+ (0, _defineProperty2.default)(this, "allIndexes", void 0);
66
+ (0, _defineProperty2.default)(this, "filteredIndex", void 0);
67
+ (0, _defineProperty2.default)(this, "filteredIdxCPU", void 0);
68
+ (0, _defineProperty2.default)(this, "filteredIndexForDomain", void 0);
69
+ (0, _defineProperty2.default)(this, "fieldPairs", void 0);
70
+ (0, _defineProperty2.default)(this, "gpuFilter", void 0);
71
+ (0, _defineProperty2.default)(this, "filterRecord", void 0);
72
+ (0, _defineProperty2.default)(this, "filterRecordCPU", void 0);
73
+ (0, _defineProperty2.default)(this, "changedFilters", void 0);
74
+ // table-injected metadata
75
+ (0, _defineProperty2.default)(this, "sortColumn", void 0);
76
+ (0, _defineProperty2.default)(this, "sortOrder", void 0);
77
+ (0, _defineProperty2.default)(this, "pinnedColumns", void 0);
78
+ (0, _defineProperty2.default)(this, "supportedFilterTypes", void 0);
79
+ // table-injected metadata
80
+ (0, _defineProperty2.default)(this, "metadata", void 0);
69
81
  // TODO - what to do if validation fails? Can kepler handle exceptions?
70
82
  // const validatedData = validateInputData(data);
71
83
  // if (!validatedData) {
@@ -73,33 +85,34 @@ var KeplerTable = /*#__PURE__*/function () {
73
85
  // }
74
86
 
75
87
  // @ts-expect-error
76
- var dataContainer = (0, _dataContainerUtils.createDataContainer)(data.rows, {
88
+ const dataContainer = (0, _dataContainerUtils.createDataContainer)(data.rows, {
77
89
  fields: data.fields
78
90
  });
79
- var datasetInfo = _objectSpread({
91
+ const datasetInfo = {
80
92
  id: (0, _utils.generateHashId)(4),
81
- label: 'new dataset'
82
- }, info || {});
83
- var dataId = datasetInfo.id;
93
+ label: 'new dataset',
94
+ ...(info || {})
95
+ };
96
+ const dataId = datasetInfo.id;
84
97
  // @ts-expect-error
85
- var fields = data.fields.map(function (f, i) {
86
- return _objectSpread(_objectSpread({}, f), {}, {
87
- fieldIdx: i,
88
- id: f.name,
89
- displayName: f.displayName || f.name,
90
- valueAccessor: _dataUtils.maybeToDate.bind(null,
91
- // is time
92
- f.type === _defaultSettings.ALL_FIELD_TYPES.timestamp || f.type === _defaultSettings.ALL_FIELD_TYPES.date, i, f.format, dataContainer)
93
- });
94
- });
95
- var allIndexes = dataContainer.getPlainIndex();
98
+ const fields = data.fields.map((f, i) => ({
99
+ ...f,
100
+ fieldIdx: i,
101
+ id: f.name,
102
+ displayName: f.displayName || f.name,
103
+ valueAccessor: _dataUtils.maybeToDate.bind(null,
104
+ // is time
105
+ f.type === _defaultSettings.ALL_FIELD_TYPES.timestamp || f.type === _defaultSettings.ALL_FIELD_TYPES.date, i, f.format, dataContainer)
106
+ }));
107
+ const allIndexes = dataContainer.getPlainIndex();
96
108
  this.id = datasetInfo.id;
97
109
  this.label = datasetInfo.label;
98
110
  this.color = color;
99
- this.metadata = _objectSpread(_objectSpread({}, metadata), {}, {
111
+ this.metadata = {
112
+ ...metadata,
100
113
  id: datasetInfo.id,
101
114
  label: datasetInfo.label
102
- });
115
+ };
103
116
  this.dataContainer = dataContainer;
104
117
  this.allIndexes = allIndexes;
105
118
  this.filteredIndex = allIndexes;
@@ -116,298 +129,283 @@ var KeplerTable = /*#__PURE__*/function () {
116
129
  * Get field
117
130
  * @param columnName
118
131
  */
119
- return (0, _createClass2["default"])(KeplerTable, [{
120
- key: "getColumnField",
121
- value: function getColumnField(columnName) {
122
- var field = this.fields.find(function (fd) {
123
- return fd[FID_KEY] === columnName;
124
- });
125
- this._assetField(columnName, field);
126
- return field;
127
- }
132
+ getColumnField(columnName) {
133
+ const field = this.fields.find(fd => fd[FID_KEY] === columnName);
134
+ this._assetField(columnName, field);
135
+ return field;
136
+ }
128
137
 
129
- /**
130
- * Get fieldIdx
131
- * @param columnName
132
- */
133
- }, {
134
- key: "getColumnFieldIdx",
135
- value: function getColumnFieldIdx(columnName) {
136
- var fieldIdx = this.fields.findIndex(function (fd) {
137
- return fd[FID_KEY] === columnName;
138
- });
139
- this._assetField(columnName, Boolean(fieldIdx > -1));
140
- return fieldIdx;
141
- }
138
+ /**
139
+ * Get fieldIdx
140
+ * @param columnName
141
+ */
142
+ getColumnFieldIdx(columnName) {
143
+ const fieldIdx = this.fields.findIndex(fd => fd[FID_KEY] === columnName);
144
+ this._assetField(columnName, Boolean(fieldIdx > -1));
145
+ return fieldIdx;
146
+ }
142
147
 
143
- /**
144
- * Get the value of a cell
145
- */
146
- }, {
147
- key: "getValue",
148
- value: function getValue(columnName, rowIdx) {
149
- var field = this.getColumnField(columnName);
150
- return field ? field.valueAccessor({
151
- index: rowIdx
152
- }) : null;
153
- }
148
+ /**
149
+ * Get the value of a cell
150
+ */
151
+ getValue(columnName, rowIdx) {
152
+ const field = this.getColumnField(columnName);
153
+ return field ? field.valueAccessor({
154
+ index: rowIdx
155
+ }) : null;
156
+ }
154
157
 
155
- /**
156
- * Updates existing field with a new object
157
- * @param fieldIdx
158
- * @param newField
159
- */
160
- }, {
161
- key: "updateColumnField",
162
- value: function updateColumnField(fieldIdx, newField) {
163
- this.fields = Object.assign((0, _toConsumableArray2["default"])(this.fields), (0, _defineProperty2["default"])({}, fieldIdx, newField));
164
- }
158
+ /**
159
+ * Updates existing field with a new object
160
+ * @param fieldIdx
161
+ * @param newField
162
+ */
163
+ updateColumnField(fieldIdx, newField) {
164
+ this.fields = Object.assign([...this.fields], {
165
+ [fieldIdx]: newField
166
+ });
167
+ }
165
168
 
166
- /**
167
- * Update dataset color by custom color
168
- * @param newColor
169
- */
170
- }, {
171
- key: "updateTableColor",
172
- value: function updateTableColor(newColor) {
173
- this.color = newColor;
174
- }
169
+ /**
170
+ * Update dataset color by custom color
171
+ * @param newColor
172
+ */
173
+ updateTableColor(newColor) {
174
+ this.color = newColor;
175
+ }
175
176
 
176
- /**
177
- * Save filterProps to field and retrieve it
178
- * @param columnName
179
- */
180
- }, {
181
- key: "getColumnFilterProps",
182
- value: function getColumnFilterProps(columnName) {
183
- var fieldIdx = this.getColumnFieldIdx(columnName);
184
- if (fieldIdx < 0) {
185
- return null;
186
- }
187
- var field = this.fields[fieldIdx];
188
- if (field.hasOwnProperty('filterProps')) {
189
- return field.filterProps;
190
- }
191
- var fieldDomain = this.getColumnFilterDomain(field);
192
- if (!fieldDomain) {
193
- return null;
194
- }
195
- var filterProps = (0, _filterUtils.getFilterProps)(field, fieldDomain);
196
- var newField = _objectSpread(_objectSpread({}, field), {}, {
197
- filterProps: filterProps
198
- });
199
- this.updateColumnField(fieldIdx, newField);
200
- return filterProps;
177
+ /**
178
+ * Save filterProps to field and retrieve it
179
+ * @param columnName
180
+ */
181
+ getColumnFilterProps(columnName) {
182
+ const fieldIdx = this.getColumnFieldIdx(columnName);
183
+ if (fieldIdx < 0) {
184
+ return null;
185
+ }
186
+ const field = this.fields[fieldIdx];
187
+ if (field.hasOwnProperty('filterProps')) {
188
+ return field.filterProps;
189
+ }
190
+ const fieldDomain = this.getColumnFilterDomain(field);
191
+ if (!fieldDomain) {
192
+ return null;
201
193
  }
194
+ const filterProps = (0, _filterUtils.getFilterProps)(field, fieldDomain);
195
+ const newField = {
196
+ ...field,
197
+ filterProps
198
+ };
199
+ this.updateColumnField(fieldIdx, newField);
200
+ return filterProps;
201
+ }
202
202
 
203
- /**
204
- * Apply filters to dataset, return the filtered dataset with updated `gpuFilter`, `filterRecord`, `filteredIndex`, `filteredIndexForDomain`
205
- * @param filters
206
- * @param layers
207
- * @param opt
208
- */
209
- }, {
210
- key: "filterTable",
211
- value: function filterTable(filters, layers, opt) {
212
- var _this = this;
213
- var dataContainer = this.dataContainer,
214
- dataId = this.id,
215
- oldFilterRecord = this.filterRecord,
216
- fields = this.fields;
217
-
218
- // if there is no filters
219
- var filterRecord = (0, _filterUtils.getFilterRecord)(dataId, filters, opt || {});
220
- this.filterRecord = filterRecord;
221
- this.gpuFilter = (0, _gpuFilterUtils.getGpuFilterProps)(filters, dataId, fields);
222
-
223
- // const newDataset = set(['filterRecord'], filterRecord, dataset);
224
-
225
- if (!filters.length) {
226
- this.filteredIndex = this.allIndexes;
227
- this.filteredIndexForDomain = this.allIndexes;
228
- return this;
229
- }
230
- this.changedFilters = (0, _filterUtils.diffFilters)(filterRecord, oldFilterRecord);
231
-
232
- // generate 2 sets of filter result
233
- // filteredIndex used to calculate layer data
234
- // filteredIndexForDomain used to calculate layer Domain
235
- var shouldCalDomain = Boolean(this.changedFilters.dynamicDomain);
236
- var shouldCalIndex = Boolean(this.changedFilters.cpu);
237
- var filterResult = {};
238
- if (shouldCalDomain || shouldCalIndex) {
239
- var dynamicDomainFilters = shouldCalDomain ? filterRecord.dynamicDomain : null;
240
- var cpuFilters = shouldCalIndex ? filterRecord.cpu : null;
241
- var filterFuncs = filters.reduce(function (acc, filter) {
242
- var fieldIndex = (0, _gpuFilterUtils.getDatasetFieldIndexForFilter)(_this.id, filter);
243
- var field = fieldIndex !== -1 ? fields[fieldIndex] : null;
244
- return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, filter.id, (0, _filterUtils.getFilterFunction)(field, _this.id, filter, layers, dataContainer)));
245
- }, {});
246
- filterResult = (0, _filterUtils.filterDataByFilterTypes)({
247
- dynamicDomainFilters: dynamicDomainFilters,
248
- cpuFilters: cpuFilters,
249
- filterFuncs: filterFuncs
250
- }, dataContainer);
251
- }
252
- this.filteredIndex = filterResult.filteredIndex || this.filteredIndex;
253
- this.filteredIndexForDomain = filterResult.filteredIndexForDomain || this.filteredIndexForDomain;
203
+ /**
204
+ * Apply filters to dataset, return the filtered dataset with updated `gpuFilter`, `filterRecord`, `filteredIndex`, `filteredIndexForDomain`
205
+ * @param filters
206
+ * @param layers
207
+ * @param opt
208
+ */
209
+ filterTable(filters, layers, opt) {
210
+ const {
211
+ dataContainer,
212
+ id: dataId,
213
+ filterRecord: oldFilterRecord,
214
+ fields
215
+ } = this;
216
+
217
+ // if there is no filters
218
+ const filterRecord = (0, _filterUtils.getFilterRecord)(dataId, filters, opt || {});
219
+ this.filterRecord = filterRecord;
220
+ this.gpuFilter = (0, _gpuFilterUtils.getGpuFilterProps)(filters, dataId, fields);
221
+
222
+ // const newDataset = set(['filterRecord'], filterRecord, dataset);
223
+
224
+ if (!filters.length) {
225
+ this.filteredIndex = this.allIndexes;
226
+ this.filteredIndexForDomain = this.allIndexes;
254
227
  return this;
255
228
  }
229
+ this.changedFilters = (0, _filterUtils.diffFilters)(filterRecord, oldFilterRecord);
230
+
231
+ // generate 2 sets of filter result
232
+ // filteredIndex used to calculate layer data
233
+ // filteredIndexForDomain used to calculate layer Domain
234
+ const shouldCalDomain = Boolean(this.changedFilters.dynamicDomain);
235
+ const shouldCalIndex = Boolean(this.changedFilters.cpu);
236
+ let filterResult = {};
237
+ if (shouldCalDomain || shouldCalIndex) {
238
+ const dynamicDomainFilters = shouldCalDomain ? filterRecord.dynamicDomain : null;
239
+ const cpuFilters = shouldCalIndex ? filterRecord.cpu : null;
240
+ const filterFuncs = filters.reduce((acc, filter) => {
241
+ const fieldIndex = (0, _gpuFilterUtils.getDatasetFieldIndexForFilter)(this.id, filter);
242
+ const field = fieldIndex !== -1 ? fields[fieldIndex] : null;
243
+ return {
244
+ ...acc,
245
+ [filter.id]: (0, _filterUtils.getFilterFunction)(field, this.id, filter, layers, dataContainer)
246
+ };
247
+ }, {});
248
+ filterResult = (0, _filterUtils.filterDataByFilterTypes)({
249
+ dynamicDomainFilters,
250
+ cpuFilters,
251
+ filterFuncs
252
+ }, dataContainer);
253
+ }
254
+ this.filteredIndex = filterResult.filteredIndex || this.filteredIndex;
255
+ this.filteredIndexForDomain = filterResult.filteredIndexForDomain || this.filteredIndexForDomain;
256
+ return this;
257
+ }
256
258
 
257
- /**
258
- * Apply filters to a dataset all on CPU, assign to `filteredIdxCPU`, `filterRecordCPU`
259
- * @param filters
260
- * @param layers
261
- */
262
- }, {
263
- key: "filterTableCPU",
264
- value: function filterTableCPU(filters, layers) {
265
- var opt = {
266
- cpuOnly: true,
267
- ignoreDomain: true
268
- };
269
-
270
- // no filter
271
- if (!filters.length) {
272
- this.filteredIdxCPU = this.allIndexes;
273
- this.filterRecordCPU = (0, _filterUtils.getFilterRecord)(this.id, filters, opt);
274
- return this;
275
- }
276
-
277
- // no gpu filter
278
- if (!filters.find(function (f) {
279
- return f.gpu;
280
- })) {
281
- this.filteredIdxCPU = this.filteredIndex;
282
- this.filterRecordCPU = (0, _filterUtils.getFilterRecord)(this.id, filters, opt);
283
- return this;
284
- }
285
-
286
- // make a copy for cpu filtering
287
- var copied = copyTable(this);
288
- copied.filterRecord = this.filterRecordCPU;
289
- copied.filteredIndex = this.filteredIdxCPU || [];
290
- var filtered = copied.filterTable(filters, layers, opt);
291
- this.filteredIdxCPU = filtered.filteredIndex;
292
- this.filterRecordCPU = filtered.filterRecord;
259
+ /**
260
+ * Apply filters to a dataset all on CPU, assign to `filteredIdxCPU`, `filterRecordCPU`
261
+ * @param filters
262
+ * @param layers
263
+ */
264
+ filterTableCPU(filters, layers) {
265
+ const opt = {
266
+ cpuOnly: true,
267
+ ignoreDomain: true
268
+ };
269
+
270
+ // no filter
271
+ if (!filters.length) {
272
+ this.filteredIdxCPU = this.allIndexes;
273
+ this.filterRecordCPU = (0, _filterUtils.getFilterRecord)(this.id, filters, opt);
293
274
  return this;
294
275
  }
295
276
 
296
- /**
297
- * Calculate field domain based on field type and data
298
- * for Filter
299
- */
300
- }, {
301
- key: "getColumnFilterDomain",
302
- value: function getColumnFilterDomain(field) {
303
- var dataContainer = this.dataContainer;
304
- var valueAccessor = field.valueAccessor;
305
- var domain;
306
- switch (field.type) {
307
- case _defaultSettings.ALL_FIELD_TYPES.real:
308
- case _defaultSettings.ALL_FIELD_TYPES.integer:
309
- // calculate domain and step
310
- return (0, _filterUtils.getNumericFieldDomain)(dataContainer, valueAccessor);
311
- case _defaultSettings.ALL_FIELD_TYPES["boolean"]:
312
- return {
313
- domain: [true, false]
314
- };
315
- case _defaultSettings.ALL_FIELD_TYPES.string:
316
- case _defaultSettings.ALL_FIELD_TYPES.date:
317
- domain = (0, _dataScaleUtils.getOrdinalDomain)(dataContainer, valueAccessor);
318
- return {
319
- domain: domain
320
- };
321
- case _defaultSettings.ALL_FIELD_TYPES.timestamp:
322
- return (0, _filterUtils.getTimestampFieldDomain)(dataContainer, valueAccessor);
323
- default:
324
- return {
325
- domain: (0, _dataScaleUtils.getOrdinalDomain)(dataContainer, valueAccessor)
326
- };
327
- }
277
+ // no gpu filter
278
+ if (!filters.find(f => f.gpu)) {
279
+ this.filteredIdxCPU = this.filteredIndex;
280
+ this.filterRecordCPU = (0, _filterUtils.getFilterRecord)(this.id, filters, opt);
281
+ return this;
328
282
  }
329
283
 
330
- /**
331
- * Get the domain of this column based on scale type
332
- */
333
- }, {
334
- key: "getColumnLayerDomain",
335
- value: function getColumnLayerDomain(field, scaleType) {
336
- var dataContainer = this.dataContainer,
337
- filteredIndexForDomain = this.filteredIndexForDomain;
338
- if (!_defaultSettings.SCALE_TYPES[scaleType]) {
339
- _console.console.error("scale type ".concat(scaleType, " not supported"));
340
- return null;
341
- }
342
- var valueAccessor = field.valueAccessor;
343
- var indexValueAccessor = function indexValueAccessor(i) {
344
- return valueAccessor({
345
- index: i
346
- });
347
- };
348
- var sortFunction = (0, _dataUtils.getSortingFunction)(field.type);
349
- switch (scaleType) {
350
- case _defaultSettings.SCALE_TYPES.ordinal:
351
- case _defaultSettings.SCALE_TYPES.point:
352
- // do not recalculate ordinal domain based on filtered data
353
- // don't need to update ordinal domain every time
354
- return (0, _dataScaleUtils.getOrdinalDomain)(dataContainer, valueAccessor);
355
- case _defaultSettings.SCALE_TYPES.quantile:
356
- return (0, _dataScaleUtils.getQuantileDomain)(filteredIndexForDomain, indexValueAccessor, sortFunction);
357
- case _defaultSettings.SCALE_TYPES.log:
358
- return (0, _dataScaleUtils.getLogDomain)(filteredIndexForDomain, indexValueAccessor);
359
- case _defaultSettings.SCALE_TYPES.quantize:
360
- case _defaultSettings.SCALE_TYPES.linear:
361
- case _defaultSettings.SCALE_TYPES.sqrt:
362
- default:
363
- return (0, _dataScaleUtils.getLinearDomain)(filteredIndexForDomain, indexValueAccessor);
364
- }
365
- }
366
- }, {
367
- key: "calculateLegend",
368
- value: function calculateLegend(leftField, rightField) {
369
- var limitOfNumberOfLegendEntries = 20;
370
- var leftValues = this.dataContainer.mapIndex(leftField.valueAccessor);
371
- var rightValues = this.dataContainer.mapIndex(rightField.valueAccessor);
372
- var pairing = leftValues.reduce(function (previous, current, idx) {
373
- previous.push([current, rightValues[idx]]);
374
- return previous;
375
- }, []);
376
- return (0, _dataUtils.uniqueSortedPairByFrequency)(pairing).map(function (row) {
284
+ // make a copy for cpu filtering
285
+ const copied = copyTable(this);
286
+ copied.filterRecord = this.filterRecordCPU;
287
+ copied.filteredIndex = this.filteredIdxCPU || [];
288
+ const filtered = copied.filterTable(filters, layers, opt);
289
+ this.filteredIdxCPU = filtered.filteredIndex;
290
+ this.filterRecordCPU = filtered.filterRecord;
291
+ return this;
292
+ }
293
+
294
+ /**
295
+ * Calculate field domain based on field type and data
296
+ * for Filter
297
+ */
298
+ getColumnFilterDomain(field) {
299
+ const {
300
+ dataContainer
301
+ } = this;
302
+ const {
303
+ valueAccessor
304
+ } = field;
305
+ let domain;
306
+ switch (field.type) {
307
+ case _defaultSettings.ALL_FIELD_TYPES.real:
308
+ case _defaultSettings.ALL_FIELD_TYPES.integer:
309
+ // calculate domain and step
310
+ return (0, _filterUtils.getNumericFieldDomain)(dataContainer, valueAccessor);
311
+ case _defaultSettings.ALL_FIELD_TYPES.boolean:
312
+ return {
313
+ domain: [true, false]
314
+ };
315
+ case _defaultSettings.ALL_FIELD_TYPES.string:
316
+ case _defaultSettings.ALL_FIELD_TYPES.date:
317
+ domain = (0, _dataScaleUtils.getOrdinalDomain)(dataContainer, valueAccessor);
377
318
  return {
378
- label: row.left,
379
- color: (0, _colorUtils.checkColorOrFallback)(row.right)
319
+ domain
320
+ };
321
+ case _defaultSettings.ALL_FIELD_TYPES.timestamp:
322
+ return (0, _filterUtils.getTimestampFieldDomain)(dataContainer, valueAccessor);
323
+ default:
324
+ return {
325
+ domain: (0, _dataScaleUtils.getOrdinalDomain)(dataContainer, valueAccessor)
380
326
  };
381
- }).slice(0, limitOfNumberOfLegendEntries + 1); // Limit to limitOfNumberOfLegendEntries + 1, then limit to limitOfNumberOfLegendEntries in LegendManagers
382
327
  }
328
+ }
383
329
 
384
- /**
385
- * Get a sample of rows to calculate layer boundaries
386
- */
387
- // getSampleData(rows)
388
-
389
- /**
390
- * Parse cell value based on column type and return a string representation
391
- * Value the field value, type the field type
392
- */
393
- // parseFieldValue(value, type)
394
-
395
- // sortDatasetByColumn()
396
-
397
- /**
398
- * Assert whether field exist
399
- * @param fieldName
400
- * @param condition
401
- */
402
- }, {
403
- key: "_assetField",
404
- value: function _assetField(fieldName, condition) {
405
- if (!condition) {
406
- _console.console.error("".concat(fieldName, " doesnt exist in dataset ").concat(this.id));
407
- }
330
+ /**
331
+ * Get the domain of this column based on scale type
332
+ */
333
+ getColumnLayerDomain(field, scaleType) {
334
+ const {
335
+ dataContainer,
336
+ filteredIndexForDomain
337
+ } = this;
338
+ if (!_defaultSettings.SCALE_TYPES[scaleType]) {
339
+ _console.console.error(`scale type ${scaleType} not supported`);
340
+ return null;
341
+ }
342
+ const {
343
+ valueAccessor
344
+ } = field;
345
+ const indexValueAccessor = i => valueAccessor({
346
+ index: i
347
+ });
348
+ const sortFunction = (0, _dataUtils.getSortingFunction)(field.type);
349
+ switch (scaleType) {
350
+ case _defaultSettings.SCALE_TYPES.ordinal:
351
+ case _defaultSettings.SCALE_TYPES.point:
352
+ // do not recalculate ordinal domain based on filtered data
353
+ // don't need to update ordinal domain every time
354
+ return (0, _dataScaleUtils.getOrdinalDomain)(dataContainer, valueAccessor);
355
+ case _defaultSettings.SCALE_TYPES.quantile:
356
+ return (0, _dataScaleUtils.getQuantileDomain)(filteredIndexForDomain, indexValueAccessor, sortFunction);
357
+ case _defaultSettings.SCALE_TYPES.log:
358
+ return (0, _dataScaleUtils.getLogDomain)(filteredIndexForDomain, indexValueAccessor);
359
+ case _defaultSettings.SCALE_TYPES.quantize:
360
+ case _defaultSettings.SCALE_TYPES.linear:
361
+ case _defaultSettings.SCALE_TYPES.sqrt:
362
+ default:
363
+ return (0, _dataScaleUtils.getLinearDomain)(filteredIndexForDomain, indexValueAccessor);
408
364
  }
409
- }]);
410
- }(); // HELPER FUNCTIONS (MAINLY EXPORTED FOR TEST...)
365
+ }
366
+ calculateLegend(leftField, rightField) {
367
+ const limitOfNumberOfLegendEntries = 20;
368
+ const leftValues = this.dataContainer.mapIndex(leftField.valueAccessor);
369
+ const rightValues = this.dataContainer.mapIndex(rightField.valueAccessor);
370
+ const pairing = leftValues.reduce((previous, current, idx) => {
371
+ previous.push([current, rightValues[idx]]);
372
+ return previous;
373
+ }, []);
374
+ return (0, _dataUtils.uniqueSortedPairByFrequency)(pairing).map(row => {
375
+ return {
376
+ label: row.left,
377
+ color: (0, _colorUtils.checkColorOrFallback)(row.right)
378
+ };
379
+ }).slice(0, limitOfNumberOfLegendEntries + 1); // Limit to limitOfNumberOfLegendEntries + 1, then limit to limitOfNumberOfLegendEntries in LegendManagers
380
+ }
381
+
382
+ /**
383
+ * Get a sample of rows to calculate layer boundaries
384
+ */
385
+ // getSampleData(rows)
386
+
387
+ /**
388
+ * Parse cell value based on column type and return a string representation
389
+ * Value the field value, type the field type
390
+ */
391
+ // parseFieldValue(value, type)
392
+
393
+ // sortDatasetByColumn()
394
+
395
+ /**
396
+ * Assert whether field exist
397
+ * @param fieldName
398
+ * @param condition
399
+ */
400
+ _assetField(fieldName, condition) {
401
+ if (!condition) {
402
+ _console.console.error(`${fieldName} doesnt exist in dataset ${this.id}`);
403
+ }
404
+ }
405
+ }
406
+
407
+ // HELPER FUNCTIONS (MAINLY EXPORTED FOR TEST...)
408
+
411
409
  function removeSuffixAndDelimiters(layerName, suffix) {
412
410
  return layerName.replace(new RegExp(suffix, 'ig'), '').replace(/[_,.]+/g, ' ').trim();
413
411
  }
@@ -419,64 +417,44 @@ function removeSuffixAndDelimiters(layerName, suffix) {
419
417
  * @returns found point fields
420
418
  */
421
419
  function findPointFieldPairs(fields) {
422
- var allNames = fields.map(function (f) {
423
- return f.name.toLowerCase();
424
- });
420
+ const allNames = fields.map(f => f.name.toLowerCase());
425
421
 
426
422
  // get list of all fields with matching suffixes
427
- var acc = [];
428
- var result = allNames.reduce(function (carry, fieldName, idx) {
423
+ const acc = [];
424
+ const result = allNames.reduce((carry, fieldName, idx) => {
429
425
  // This search for pairs will early exit if found.
430
- var _iterator = _createForOfIteratorHelper(_defaultSettings.TRIP_POINT_FIELDS),
431
- _step;
432
- try {
433
- var _loop = function _loop() {
434
- var suffixPair = _step.value;
435
- // match first suffix```
436
- if (fieldName.endsWith(suffixPair[0])) {
437
- // match second suffix
438
- var otherPattern = new RegExp("".concat(suffixPair[0], "$"));
439
- var partner = fieldName.replace(otherPattern, suffixPair[1]);
440
- var partnerIdx = allNames.findIndex(function (d) {
441
- return d === partner;
442
- });
443
- if (partnerIdx > -1) {
444
- var defaultName = removeSuffixAndDelimiters(fieldName, suffixPair[0]);
445
- carry.push({
446
- defaultName: defaultName,
447
- pair: {
448
- lat: {
449
- fieldIdx: idx,
450
- value: fields[idx].name
451
- },
452
- lng: {
453
- fieldIdx: partnerIdx,
454
- value: fields[partnerIdx].name
455
- }
456
- },
457
- suffix: suffixPair
458
- });
459
- return {
460
- v: carry
461
- };
462
- }
463
- }
464
- },
465
- _ret;
466
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
467
- _ret = _loop();
468
- if (_ret) return _ret.v;
426
+ for (const suffixPair of _defaultSettings.TRIP_POINT_FIELDS) {
427
+ // match first suffix```
428
+ if (fieldName.endsWith(suffixPair[0])) {
429
+ // match second suffix
430
+ const otherPattern = new RegExp(`${suffixPair[0]}\$`);
431
+ const partner = fieldName.replace(otherPattern, suffixPair[1]);
432
+ const partnerIdx = allNames.findIndex(d => d === partner);
433
+ if (partnerIdx > -1) {
434
+ const defaultName = removeSuffixAndDelimiters(fieldName, suffixPair[0]);
435
+ carry.push({
436
+ defaultName,
437
+ pair: {
438
+ lat: {
439
+ fieldIdx: idx,
440
+ value: fields[idx].name
441
+ },
442
+ lng: {
443
+ fieldIdx: partnerIdx,
444
+ value: fields[partnerIdx].name
445
+ }
446
+ },
447
+ suffix: suffixPair
448
+ });
449
+ return carry;
450
+ }
469
451
  }
470
- } catch (err) {
471
- _iterator.e(err);
472
- } finally {
473
- _iterator.f();
474
452
  }
475
453
  return carry;
476
454
  }, acc);
477
455
 
478
456
  // prioritize the 'latitude'/'longitude' pair
479
- result.sort(function (a, b) {
457
+ result.sort((a, b) => {
480
458
  if (a.defaultName === '' && a.suffix[0] === 'latitude') return -1;
481
459
  if (b.defaultName === '' && b.suffix[0] === 'latitude') return 1;
482
460
  return 0;
@@ -492,47 +470,45 @@ function findPointFieldPairs(fields) {
492
470
  * @type
493
471
  */
494
472
  function sortDatasetByColumn(dataset, column, mode) {
495
- var allIndexes = dataset.allIndexes,
496
- fields = dataset.fields,
497
- dataContainer = dataset.dataContainer;
498
- var fieldIndex = fields.findIndex(function (f) {
499
- return f.name === column;
500
- });
473
+ const {
474
+ allIndexes,
475
+ fields,
476
+ dataContainer
477
+ } = dataset;
478
+ const fieldIndex = fields.findIndex(f => f.name === column);
501
479
  if (fieldIndex < 0) {
502
480
  return dataset;
503
481
  }
504
- var sortBy = _defaultSettings.SORT_ORDER[mode || ''] || _defaultSettings.SORT_ORDER.ASCENDING;
482
+ const sortBy = _defaultSettings.SORT_ORDER[mode || ''] || _defaultSettings.SORT_ORDER.ASCENDING;
505
483
  if (sortBy === _defaultSettings.SORT_ORDER.UNSORT) {
506
484
  dataset.sortColumn = {};
507
485
  dataset.sortOrder = null;
508
486
  return dataset;
509
487
  }
510
- var sortFunction = sortBy === _defaultSettings.SORT_ORDER.ASCENDING ? _d3Array.ascending : _d3Array.descending;
511
- var sortOrder = allIndexes.slice().sort(function (a, b) {
512
- return sortFunction(dataContainer.valueAt(a, fieldIndex), dataContainer.valueAt(b, fieldIndex));
513
- });
514
- dataset.sortColumn = (0, _defineProperty2["default"])({}, column, sortBy);
488
+ const sortFunction = sortBy === _defaultSettings.SORT_ORDER.ASCENDING ? _d3Array.ascending : _d3Array.descending;
489
+ const sortOrder = allIndexes.slice().sort((a, b) => sortFunction(dataContainer.valueAt(a, fieldIndex), dataContainer.valueAt(b, fieldIndex)));
490
+ dataset.sortColumn = {
491
+ [column]: sortBy
492
+ };
515
493
  dataset.sortOrder = sortOrder;
516
494
  return dataset;
517
495
  }
518
496
  function pinTableColumns(dataset, column) {
519
- var field = dataset.getColumnField(column);
497
+ const field = dataset.getColumnField(column);
520
498
  if (!field) {
521
499
  return dataset;
522
500
  }
523
- var pinnedColumns;
501
+ let pinnedColumns;
524
502
  if (Array.isArray(dataset.pinnedColumns) && dataset.pinnedColumns.includes(field.name)) {
525
503
  // unpin it
526
- pinnedColumns = dataset.pinnedColumns.filter(function (co) {
527
- return co !== field.name;
528
- });
504
+ pinnedColumns = dataset.pinnedColumns.filter(co => co !== field.name);
529
505
  } else {
530
506
  pinnedColumns = (dataset.pinnedColumns || []).concat(field.name);
531
507
  }
532
508
 
533
509
  // @ts-ignore
534
510
  return copyTableAndUpdate(dataset, {
535
- pinnedColumns: pinnedColumns
511
+ pinnedColumns
536
512
  });
537
513
  }
538
514
  function copyTable(original) {
@@ -544,11 +520,11 @@ function copyTable(original) {
544
520
  * @returns
545
521
  */
546
522
  function copyTableAndUpdate(original) {
547
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
548
- return Object.entries(options).reduce(function (acc, entry) {
523
+ let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
524
+ return Object.entries(options).reduce((acc, entry) => {
549
525
  acc[entry[0]] = entry[1];
550
526
  return acc;
551
527
  }, copyTable(original));
552
528
  }
553
- var _default = exports["default"] = KeplerTable;
554
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc29sZSIsInJlcXVpcmUiLCJfZGVmYXVsdFNldHRpbmdzIiwiX2QzQXJyYXkiLCJfdXRpbHMiLCJfZ3B1RmlsdGVyVXRpbHMiLCJfZmlsdGVyVXRpbHMiLCJfZGF0YVV0aWxzIiwiX2RhdGFTY2FsZVV0aWxzIiwiX2RhdGFDb250YWluZXJVdGlscyIsIl9jb2xvclV0aWxzIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJyIiwiZSIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJvd25LZXlzIiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiRklEX0tFWSIsIktlcGxlclRhYmxlIiwiX3JlZiIsIl9yZWYkaW5mbyIsImluZm8iLCJkYXRhIiwiY29sb3IiLCJtZXRhZGF0YSIsInN1cHBvcnRlZEZpbHRlclR5cGVzIiwiX2NsYXNzQ2FsbENoZWNrMiIsImRhdGFDb250YWluZXIiLCJjcmVhdGVEYXRhQ29udGFpbmVyIiwicm93cyIsImZpZWxkcyIsImRhdGFzZXRJbmZvIiwiaWQiLCJnZW5lcmF0ZUhhc2hJZCIsImxhYmVsIiwiZGF0YUlkIiwibWFwIiwiaSIsImZpZWxkSWR4IiwiZGlzcGxheU5hbWUiLCJ2YWx1ZUFjY2Vzc29yIiwibWF5YmVUb0RhdGUiLCJiaW5kIiwidHlwZSIsIkFMTF9GSUVMRF9UWVBFUyIsInRpbWVzdGFtcCIsImRhdGUiLCJmb3JtYXQiLCJhbGxJbmRleGVzIiwiZ2V0UGxhaW5JbmRleCIsImZpbHRlcmVkSW5kZXgiLCJmaWx0ZXJlZEluZGV4Rm9yRG9tYWluIiwiZmllbGRQYWlycyIsImZpbmRQb2ludEZpZWxkUGFpcnMiLCJncHVGaWx0ZXIiLCJnZXRHcHVGaWx0ZXJQcm9wcyIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJnZXRDb2x1bW5GaWVsZCIsImNvbHVtbk5hbWUiLCJmaWVsZCIsImZpbmQiLCJmZCIsIl9hc3NldEZpZWxkIiwiZ2V0Q29sdW1uRmllbGRJZHgiLCJmaW5kSW5kZXgiLCJCb29sZWFuIiwiZ2V0VmFsdWUiLCJyb3dJZHgiLCJpbmRleCIsInVwZGF0ZUNvbHVtbkZpZWxkIiwibmV3RmllbGQiLCJhc3NpZ24iLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwidXBkYXRlVGFibGVDb2xvciIsIm5ld0NvbG9yIiwiZ2V0Q29sdW1uRmlsdGVyUHJvcHMiLCJoYXNPd25Qcm9wZXJ0eSIsImZpbHRlclByb3BzIiwiZmllbGREb21haW4iLCJnZXRDb2x1bW5GaWx0ZXJEb21haW4iLCJnZXRGaWx0ZXJQcm9wcyIsImZpbHRlclRhYmxlIiwiZmlsdGVycyIsImxheWVycyIsIm9wdCIsIl90aGlzIiwib2xkRmlsdGVyUmVjb3JkIiwiZmlsdGVyUmVjb3JkIiwiZ2V0RmlsdGVyUmVjb3JkIiwiY2hhbmdlZEZpbHRlcnMiLCJkaWZmRmlsdGVycyIsInNob3VsZENhbERvbWFpbiIsImR5bmFtaWNEb21haW4iLCJzaG91bGRDYWxJbmRleCIsImNwdSIsImZpbHRlclJlc3VsdCIsImR5bmFtaWNEb21haW5GaWx0ZXJzIiwiY3B1RmlsdGVycyIsImZpbHRlckZ1bmNzIiwicmVkdWNlIiwiYWNjIiwiZmllbGRJbmRleCIsImdldERhdGFzZXRGaWVsZEluZGV4Rm9yRmlsdGVyIiwiZ2V0RmlsdGVyRnVuY3Rpb24iLCJmaWx0ZXJEYXRhQnlGaWx0ZXJUeXBlcyIsImZpbHRlclRhYmxlQ1BVIiwiY3B1T25seSIsImlnbm9yZURvbWFpbiIsImZpbHRlcmVkSWR4Q1BVIiwiZmlsdGVyUmVjb3JkQ1BVIiwiZ3B1IiwiY29waWVkIiwiY29weVRhYmxlIiwiZmlsdGVyZWQiLCJkb21haW4iLCJyZWFsIiwiaW50ZWdlciIsImdldE51bWVyaWNGaWVsZERvbWFpbiIsInN0cmluZyIsImdldE9yZGluYWxEb21haW4iLCJnZXRUaW1lc3RhbXBGaWVsZERvbWFpbiIsImdldENvbHVtbkxheWVyRG9tYWluIiwic2NhbGVUeXBlIiwiU0NBTEVfVFlQRVMiLCJDb25zb2xlIiwiZXJyb3IiLCJjb25jYXQiLCJpbmRleFZhbHVlQWNjZXNzb3IiLCJzb3J0RnVuY3Rpb24iLCJnZXRTb3J0aW5nRnVuY3Rpb24iLCJvcmRpbmFsIiwicG9pbnQiLCJxdWFudGlsZSIsImdldFF1YW50aWxlRG9tYWluIiwibG9nIiwiZ2V0TG9nRG9tYWluIiwicXVhbnRpemUiLCJsaW5lYXIiLCJzcXJ0IiwiZ2V0TGluZWFyRG9tYWluIiwiY2FsY3VsYXRlTGVnZW5kIiwibGVmdEZpZWxkIiwicmlnaHRGaWVsZCIsImxpbWl0T2ZOdW1iZXJPZkxlZ2VuZEVudHJpZXMiLCJsZWZ0VmFsdWVzIiwibWFwSW5kZXgiLCJyaWdodFZhbHVlcyIsInBhaXJpbmciLCJwcmV2aW91cyIsImN1cnJlbnQiLCJpZHgiLCJ1bmlxdWVTb3J0ZWRQYWlyQnlGcmVxdWVuY3kiLCJyb3ciLCJsZWZ0IiwiY2hlY2tDb2xvck9yRmFsbGJhY2siLCJyaWdodCIsImZpZWxkTmFtZSIsImNvbmRpdGlvbiIsInJlbW92ZVN1ZmZpeEFuZERlbGltaXRlcnMiLCJsYXllck5hbWUiLCJzdWZmaXgiLCJyZXBsYWNlIiwiUmVnRXhwIiwidHJpbSIsImFsbE5hbWVzIiwidG9Mb3dlckNhc2UiLCJyZXN1bHQiLCJjYXJyeSIsIl9pdGVyYXRvciIsIlRSSVBfUE9JTlRfRklFTERTIiwiX3N0ZXAiLCJfbG9vcCIsInN1ZmZpeFBhaXIiLCJlbmRzV2l0aCIsIm90aGVyUGF0dGVybiIsInBhcnRuZXIiLCJwYXJ0bmVySWR4IiwiZCIsImRlZmF1bHROYW1lIiwicGFpciIsImxhdCIsImxuZyIsInYiLCJfcmV0IiwiZXJyIiwic29ydCIsImIiLCJzb3J0RGF0YXNldEJ5Q29sdW1uIiwiZGF0YXNldCIsImNvbHVtbiIsIm1vZGUiLCJzb3J0QnkiLCJTT1JUX09SREVSIiwiQVNDRU5ESU5HIiwiVU5TT1JUIiwic29ydENvbHVtbiIsInNvcnRPcmRlciIsImFzY2VuZGluZyIsImRlc2NlbmRpbmciLCJ2YWx1ZUF0IiwicGluVGFibGVDb2x1bW5zIiwicGlubmVkQ29sdW1ucyIsImluY2x1ZGVzIiwiY28iLCJjb3B5VGFibGVBbmRVcGRhdGUiLCJvcmlnaW5hbCIsImNyZWF0ZSIsImdldFByb3RvdHlwZU9mIiwib3B0aW9ucyIsInVuZGVmaW5lZCIsImVudHJpZXMiLCJlbnRyeSIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90YWJsZS11dGlscy9rZXBsZXItdGFibGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIyIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtjb25zb2xlIGFzIENvbnNvbGV9IGZyb20gJ2dsb2JhbC9jb25zb2xlJztcbmltcG9ydCB7VFJJUF9QT0lOVF9GSUVMRFMsIFNPUlRfT1JERVJ9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcbmltcG9ydCB7YXNjZW5kaW5nLCBkZXNjZW5kaW5nfSBmcm9tICdkMy1hcnJheSc7XG5cbi8vIGltcG9ydCB7dmFsaWRhdGVJbnB1dERhdGF9IGZyb20gJ3Byb2Nlc3NvcnMvZGF0YS1wcm9jZXNzb3InO1xuaW1wb3J0IHtnZW5lcmF0ZUhhc2hJZH0gZnJvbSAndXRpbHMvdXRpbHMnO1xuaW1wb3J0IHtnZXRHcHVGaWx0ZXJQcm9wcywgZ2V0RGF0YXNldEZpZWxkSW5kZXhGb3JGaWx0ZXJ9IGZyb20gJ3V0aWxzL2dwdS1maWx0ZXItdXRpbHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsdGVyUHJvcHMsXG4gIGdldEZpbHRlclJlY29yZCxcbiAgZGlmZkZpbHRlcnMsXG4gIGdldEZpbHRlckZ1bmN0aW9uLFxuICBmaWx0ZXJEYXRhQnlGaWx0ZXJUeXBlcyxcbiAgZ2V0TnVtZXJpY0ZpZWxkRG9tYWluLFxuICBnZXRUaW1lc3RhbXBGaWVsZERvbWFpbixcbiAgRmlsdGVyUmVzdWx0XG59IGZyb20gJ3V0aWxzL2ZpbHRlci11dGlscyc7XG5pbXBvcnQge21heWJlVG9EYXRlLCBnZXRTb3J0aW5nRnVuY3Rpb259IGZyb20gJ3V0aWxzL2RhdGEtdXRpbHMnO1xuaW1wb3J0IHtcbiAgZ2V0UXVhbnRpbGVEb21haW4sXG4gIGdldE9yZGluYWxEb21haW4sXG4gIGdldExvZ0RvbWFpbixcbiAgZ2V0TGluZWFyRG9tYWluXG59IGZyb20gJ3V0aWxzL2RhdGEtc2NhbGUtdXRpbHMnO1xuXG5pbXBvcnQge0FMTF9GSUVMRF9UWVBFUywgU0NBTEVfVFlQRVN9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcblxuaW1wb3J0IHtjcmVhdGVEYXRhQ29udGFpbmVyfSBmcm9tICcuL2RhdGEtY29udGFpbmVyLXV0aWxzJztcbmltcG9ydCB7dW5pcXVlU29ydGVkUGFpckJ5RnJlcXVlbmN5fSBmcm9tICd1dGlscy9kYXRhLXV0aWxzJztcbmltcG9ydCB7Y2hlY2tDb2xvck9yRmFsbGJhY2t9IGZyb20gJ3V0aWxzL2NvbG9yLXV0aWxzJztcblxuaW1wb3J0IHtSR0JDb2xvcn0gZnJvbSAncmVkdWNlcnMvdHlwZXMnO1xuaW1wb3J0IHtMYXllcn0gZnJvbSAnbGF5ZXJzJztcbmltcG9ydCB7RmllbGREb21haW4sIEZpbHRlcn0gZnJvbSAncmVkdWNlcnMvdmlzLXN0YXRlLXVwZGF0ZXJzJztcbmltcG9ydCB7RGF0YUNvbnRhaW5lckludGVyZmFjZX0gZnJvbSAnLi9kYXRhLWNvbnRhaW5lci1pbnRlcmZhY2UnO1xuaW1wb3J0IHtQcm90b0RhdGFzZXR9IGZyb20gJ2FjdGlvbnMnO1xuXG5leHBvcnQgdHlwZSBGaWVsZCA9IHtcbiAgYW5hbHl6ZXJUeXBlOiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIGZvcm1hdDogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIGZpZWxkSWR4OiBudW1iZXI7XG4gIHZhbHVlQWNjZXNzb3Iodjoge2luZGV4OiBudW1iZXJ9KTogYW55O1xuICBmaWx0ZXJQcm9wcz86IGFueTtcbiAgbWV0YWRhdGE/OiBhbnk7XG59O1xuXG5leHBvcnQgdHlwZSBHcHVGaWx0ZXIgPSB7XG4gIGZpbHRlclJhbmdlOiBudW1iZXJbXVtdO1xuICBmaWx0ZXJWYWx1ZVVwZGF0ZVRyaWdnZXJzOiBhbnk7XG4gIGZpbHRlclZhbHVlQWNjZXNzb3I6IChcbiAgICBkYzogRGF0YUNvbnRhaW5lckludGVyZmFjZVxuICApID0+IChcbiAgICBnZXRJbmRleD86IChhbnkpID0+IG51bWJlcixcbiAgICBnZXREYXRhPzogKGRjOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlLCBkOiBhbnksIGZpZWxkSW5kZXg6IG51bWJlcikgPT4gYW55XG4gICkgPT4gKGQ6IGFueSkgPT4gbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgRmllbGRQYWlyID0ge1xuICBkZWZhdWx0TmFtZTogc3RyaW5nO1xuICBwYWlyOiB7XG4gICAgW2tleTogc3RyaW5nXToge1xuICAgICAgZmllbGRJZHg6IG51bWJlcjtcbiAgICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgc3VmZml4OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIEZpbHRlclJlY29yZCA9IHtcbiAgZHluYW1pY0RvbWFpbjogRmlsdGVyW107XG4gIGZpeGVkRG9tYWluOiBGaWx0ZXJbXTtcbiAgY3B1OiBGaWx0ZXJbXTtcbiAgZ3B1OiBGaWx0ZXJbXTtcbn07XG5cbmV4cG9ydCB0eXBlIEZpbHRlckRhdGFzZXRPcHQgPSB7XG4gIC8vIG9ubHkgYWxsb3cgY3B1IGZpbHRlcmluZ1xuICBjcHVPbmx5PzogYm9vbGVhbjtcbiAgLy8gaWdub3JlIGZpbHRlciBmb3IgZG9tYWluIGNhbGN1bGF0aW9uXG4gIGlnbm9yZURvbWFpbj86IGJvb2xlYW47XG59O1xuXG4vLyBVbmlxdWUgaWRlbnRpZmllciBvZiBlYWNoIGZpZWxkXG5jb25zdCBGSURfS0VZID0gJ25hbWUnO1xuXG5jbGFzcyBLZXBsZXJUYWJsZSB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgdHlwZT86IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgY29sb3I6IFJHQkNvbG9yO1xuXG4gIC8vIGZpZWxkcyBhbmQgZGF0YVxuICBmaWVsZHM6IEZpZWxkW107XG5cbiAgZGF0YUNvbnRhaW5lcjogRGF0YUNvbnRhaW5lckludGVyZmFjZTtcblxuICBhbGxJbmRleGVzOiBudW1iZXJbXTtcbiAgZmlsdGVyZWRJbmRleDogbnVtYmVyW107XG4gIGZpbHRlcmVkSWR4Q1BVPzogbnVtYmVyW107XG4gIGZpbHRlcmVkSW5kZXhGb3JEb21haW46IG51bWJlcltdO1xuICBmaWVsZFBhaXJzOiBGaWVsZFBhaXJbXTtcbiAgZ3B1RmlsdGVyOiBHcHVGaWx0ZXI7XG4gIGZpbHRlclJlY29yZD86IEZpbHRlclJlY29yZDtcbiAgZmlsdGVyUmVjb3JkQ1BVPzogRmlsdGVyUmVjb3JkO1xuICBjaGFuZ2VkRmlsdGVycz86IGFueTtcblxuICAvLyB0YWJsZS1pbmplY3RlZCBtZXRhZGF0YVxuICBzb3J0Q29sdW1uPzoge1xuICAgIC8vIGNvbHVtbiBuYW1lOiBzb3J0ZWQgaWR4XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nOyAvLyBBU0NFTkRJTkcgfCBERVNDRU5ESU5HIHwgVU5TT1JUXG4gIH07XG4gIHNvcnRPcmRlcj86IG51bWJlcltdIHwgbnVsbDtcblxuICBwaW5uZWRDb2x1bW5zPzogc3RyaW5nW107XG4gIHN1cHBvcnRlZEZpbHRlclR5cGVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgLy8gdGFibGUtaW5qZWN0ZWQgbWV0YWRhdGFcbiAgbWV0YWRhdGE6IG9iamVjdDtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgaW5mbyA9IHt9LFxuICAgIGRhdGEsXG4gICAgY29sb3IsXG4gICAgbWV0YWRhdGEsXG4gICAgc3VwcG9ydGVkRmlsdGVyVHlwZXNcbiAgfToge1xuICAgIGluZm8/OiBQcm90b0RhdGFzZXRbJ2luZm8nXTtcbiAgICBkYXRhOiBQcm90b0RhdGFzZXRbJ2RhdGEnXTtcbiAgICBjb2xvcjogUkdCQ29sb3I7XG4gICAgbWV0YWRhdGE/OiBQcm90b0RhdGFzZXRbJ21ldGFkYXRhJ107XG4gICAgc3VwcG9ydGVkRmlsdGVyVHlwZXM/OiBQcm90b0RhdGFzZXRbJ3N1cHBvcnRlZEZpbHRlclR5cGVzJ107XG4gIH0pIHtcbiAgICAvLyBUT0RPIC0gd2hhdCB0byBkbyBpZiB2YWxpZGF0aW9uIGZhaWxzPyBDYW4ga2VwbGVyIGhhbmRsZSBleGNlcHRpb25zP1xuICAgIC8vIGNvbnN0IHZhbGlkYXRlZERhdGEgPSB2YWxpZGF0ZUlucHV0RGF0YShkYXRhKTtcbiAgICAvLyBpZiAoIXZhbGlkYXRlZERhdGEpIHtcbiAgICAvLyAgIHJldHVybiB0aGlzO1xuICAgIC8vIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBjb25zdCBkYXRhQ29udGFpbmVyID0gY3JlYXRlRGF0YUNvbnRhaW5lcihkYXRhLnJvd3MsIHtmaWVsZHM6IGRhdGEuZmllbGRzfSk7XG5cbiAgICBjb25zdCBkYXRhc2V0SW5mbyA9IHtcbiAgICAgIGlkOiBnZW5lcmF0ZUhhc2hJZCg0KSxcbiAgICAgIGxhYmVsOiAnbmV3IGRhdGFzZXQnLFxuICAgICAgLi4uKGluZm8gfHwge30pXG4gICAgfTtcbiAgICBjb25zdCBkYXRhSWQgPSBkYXRhc2V0SW5mby5pZDtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgY29uc3QgZmllbGRzOiBGaWVsZFtdID0gZGF0YS5maWVsZHMubWFwKChmLCBpKSA9PiAoe1xuICAgICAgLi4uZixcbiAgICAgIGZpZWxkSWR4OiBpLFxuICAgICAgaWQ6IGYubmFtZSxcbiAgICAgIGRpc3BsYXlOYW1lOiBmLmRpc3BsYXlOYW1lIHx8IGYubmFtZSxcbiAgICAgIHZhbHVlQWNjZXNzb3I6IG1heWJlVG9EYXRlLmJpbmQoXG4gICAgICAgIG51bGwsXG4gICAgICAgIC8vIGlzIHRpbWVcbiAgICAgICAgZi50eXBlID09PSBBTExfRklFTERfVFlQRVMudGltZXN0YW1wIHx8IGYudHlwZSA9PT0gQUxMX0ZJRUxEX1RZUEVTLmRhdGUsXG4gICAgICAgIGksXG4gICAgICAgIGYuZm9ybWF0LFxuICAgICAgICBkYXRhQ29udGFpbmVyXG4gICAgICApXG4gICAgfSkpO1xuXG4gICAgY29uc3QgYWxsSW5kZXhlcyA9IGRhdGFDb250YWluZXIuZ2V0UGxhaW5JbmRleCgpO1xuXG4gICAgdGhpcy5pZCA9IGRhdGFzZXRJbmZvLmlkO1xuICAgIHRoaXMubGFiZWwgPSBkYXRhc2V0SW5mby5sYWJlbDtcbiAgICB0aGlzLmNvbG9yID0gY29sb3I7XG4gICAgdGhpcy5tZXRhZGF0YSA9IHtcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgICAgaWQ6IGRhdGFzZXRJbmZvLmlkLFxuICAgICAgbGFiZWw6IGRhdGFzZXRJbmZvLmxhYmVsXG4gICAgfTtcblxuICAgIHRoaXMuZGF0YUNvbnRhaW5lciA9IGRhdGFDb250YWluZXI7XG4gICAgdGhpcy5hbGxJbmRleGVzID0gYWxsSW5kZXhlcztcbiAgICB0aGlzLmZpbHRlcmVkSW5kZXggPSBhbGxJbmRleGVzO1xuICAgIHRoaXMuZmlsdGVyZWRJbmRleEZvckRvbWFpbiA9IGFsbEluZGV4ZXM7XG4gICAgdGhpcy5maWVsZFBhaXJzID0gZmluZFBvaW50RmllbGRQYWlycyhmaWVsZHMpO1xuICAgIHRoaXMuZmllbGRzID0gZmllbGRzO1xuICAgIHRoaXMuZ3B1RmlsdGVyID0gZ2V0R3B1RmlsdGVyUHJvcHMoW10sIGRhdGFJZCwgZmllbGRzKTtcbiAgICBpZiAoc3VwcG9ydGVkRmlsdGVyVHlwZXMpIHtcbiAgICAgIHRoaXMuc3VwcG9ydGVkRmlsdGVyVHlwZXMgPSBzdXBwb3J0ZWRGaWx0ZXJUeXBlcztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZpZWxkXG4gICAqIEBwYXJhbSBjb2x1bW5OYW1lXG4gICAqL1xuICBnZXRDb2x1bW5GaWVsZChjb2x1bW5OYW1lOiBzdHJpbmcpOiBGaWVsZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmZpZWxkcy5maW5kKGZkID0+IGZkW0ZJRF9LRVldID09PSBjb2x1bW5OYW1lKTtcbiAgICB0aGlzLl9hc3NldEZpZWxkKGNvbHVtbk5hbWUsIGZpZWxkKTtcbiAgICByZXR1cm4gZmllbGQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZpZWxkSWR4XG4gICAqIEBwYXJhbSBjb2x1bW5OYW1lXG4gICAqL1xuICBnZXRDb2x1bW5GaWVsZElkeChjb2x1bW5OYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IGZpZWxkSWR4ID0gdGhpcy5maWVsZHMuZmluZEluZGV4KGZkID0+IGZkW0ZJRF9LRVldID09PSBjb2x1bW5OYW1lKTtcbiAgICB0aGlzLl9hc3NldEZpZWxkKGNvbHVtbk5hbWUsIEJvb2xlYW4oZmllbGRJZHggPiAtMSkpO1xuICAgIHJldHVybiBmaWVsZElkeDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIGEgY2VsbFxuICAgKi9cbiAgZ2V0VmFsdWUoY29sdW1uTmFtZTogc3RyaW5nLCByb3dJZHg6IG51bWJlcik6IGFueSB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmdldENvbHVtbkZpZWxkKGNvbHVtbk5hbWUpO1xuICAgIHJldHVybiBmaWVsZCA/IGZpZWxkLnZhbHVlQWNjZXNzb3Ioe2luZGV4OiByb3dJZHh9KSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBleGlzdGluZyBmaWVsZCB3aXRoIGEgbmV3IG9iamVjdFxuICAgKiBAcGFyYW0gZmllbGRJZHhcbiAgICogQHBhcmFtIG5ld0ZpZWxkXG4gICAqL1xuICB1cGRhdGVDb2x1bW5GaWVsZChmaWVsZElkeDogbnVtYmVyLCBuZXdGaWVsZDogRmllbGQpOiB2b2lkIHtcbiAgICB0aGlzLmZpZWxkcyA9IE9iamVjdC5hc3NpZ24oWy4uLnRoaXMuZmllbGRzXSwge1tmaWVsZElkeF06IG5ld0ZpZWxkfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGRhdGFzZXQgY29sb3IgYnkgY3VzdG9tIGNvbG9yXG4gICAqIEBwYXJhbSBuZXdDb2xvclxuICAgKi9cbiAgdXBkYXRlVGFibGVDb2xvcihuZXdDb2xvcjogUkdCQ29sb3IpOiB2b2lkIHtcbiAgICB0aGlzLmNvbG9yID0gbmV3Q29sb3I7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBmaWx0ZXJQcm9wcyB0byBmaWVsZCBhbmQgcmV0cmlldmUgaXRcbiAgICogQHBhcmFtIGNvbHVtbk5hbWVcbiAgICovXG4gIGdldENvbHVtbkZpbHRlclByb3BzKGNvbHVtbk5hbWU6IHN0cmluZyk6IEZpZWxkWydmaWx0ZXJQcm9wcyddIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmllbGRJZHggPSB0aGlzLmdldENvbHVtbkZpZWxkSWR4KGNvbHVtbk5hbWUpO1xuICAgIGlmIChmaWVsZElkeCA8IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzW2ZpZWxkSWR4XTtcbiAgICBpZiAoZmllbGQuaGFzT3duUHJvcGVydHkoJ2ZpbHRlclByb3BzJykpIHtcbiAgICAgIHJldHVybiBmaWVsZC5maWx0ZXJQcm9wcztcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZERvbWFpbiA9IHRoaXMuZ2V0Q29sdW1uRmlsdGVyRG9tYWluKGZpZWxkKTtcbiAgICBpZiAoIWZpZWxkRG9tYWluKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJQcm9wcyA9IGdldEZpbHRlclByb3BzKGZpZWxkLCBmaWVsZERvbWFpbik7XG4gICAgY29uc3QgbmV3RmllbGQgPSB7XG4gICAgICAuLi5maWVsZCxcbiAgICAgIGZpbHRlclByb3BzXG4gICAgfTtcblxuICAgIHRoaXMudXBkYXRlQ29sdW1uRmllbGQoZmllbGRJZHgsIG5ld0ZpZWxkKTtcblxuICAgIHJldHVybiBmaWx0ZXJQcm9wcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBmaWx0ZXJzIHRvIGRhdGFzZXQsIHJldHVybiB0aGUgZmlsdGVyZWQgZGF0YXNldCB3aXRoIHVwZGF0ZWQgYGdwdUZpbHRlcmAsIGBmaWx0ZXJSZWNvcmRgLCBgZmlsdGVyZWRJbmRleGAsIGBmaWx0ZXJlZEluZGV4Rm9yRG9tYWluYFxuICAgKiBAcGFyYW0gZmlsdGVyc1xuICAgKiBAcGFyYW0gbGF5ZXJzXG4gICAqIEBwYXJhbSBvcHRcbiAgICovXG4gIGZpbHRlclRhYmxlKGZpbHRlcnM6IEZpbHRlcltdLCBsYXllcnM6IExheWVyW10sIG9wdD86IEZpbHRlckRhdGFzZXRPcHQpOiBLZXBsZXJUYWJsZSB7XG4gICAgY29uc3Qge2RhdGFDb250YWluZXIsIGlkOiBkYXRhSWQsIGZpbHRlclJlY29yZDogb2xkRmlsdGVyUmVjb3JkLCBmaWVsZHN9ID0gdGhpcztcblxuICAgIC8vIGlmIHRoZXJlIGlzIG5vIGZpbHRlcnNcbiAgICBjb25zdCBmaWx0ZXJSZWNvcmQgPSBnZXRGaWx0ZXJSZWNvcmQoZGF0YUlkLCBmaWx0ZXJzLCBvcHQgfHwge30pO1xuXG4gICAgdGhpcy5maWx0ZXJSZWNvcmQgPSBmaWx0ZXJSZWNvcmQ7XG4gICAgdGhpcy5ncHVGaWx0ZXIgPSBnZXRHcHVGaWx0ZXJQcm9wcyhmaWx0ZXJzLCBkYXRhSWQsIGZpZWxkcyk7XG5cbiAgICAvLyBjb25zdCBuZXdEYXRhc2V0ID0gc2V0KFsnZmlsdGVyUmVjb3JkJ10sIGZpbHRlclJlY29yZCwgZGF0YXNldCk7XG5cbiAgICBpZiAoIWZpbHRlcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkSW5kZXggPSB0aGlzLmFsbEluZGV4ZXM7XG4gICAgICB0aGlzLmZpbHRlcmVkSW5kZXhGb3JEb21haW4gPSB0aGlzLmFsbEluZGV4ZXM7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLmNoYW5nZWRGaWx0ZXJzID0gZGlmZkZpbHRlcnMoZmlsdGVyUmVjb3JkLCBvbGRGaWx0ZXJSZWNvcmQpO1xuXG4gICAgLy8gZ2VuZXJhdGUgMiBzZXRzIG9mIGZpbHRlciByZXN1bHRcbiAgICAvLyBmaWx0ZXJlZEluZGV4IHVzZWQgdG8gY2FsY3VsYXRlIGxheWVyIGRhdGFcbiAgICAvLyBmaWx0ZXJlZEluZGV4Rm9yRG9tYWluIHVzZWQgdG8gY2FsY3VsYXRlIGxheWVyIERvbWFpblxuICAgIGNvbnN0IHNob3VsZENhbERvbWFpbiA9IEJvb2xlYW4odGhpcy5jaGFuZ2VkRmlsdGVycy5keW5hbWljRG9tYWluKTtcbiAgICBjb25zdCBzaG91bGRDYWxJbmRleCA9IEJvb2xlYW4odGhpcy5jaGFuZ2VkRmlsdGVycy5jcHUpO1xuXG4gICAgbGV0IGZpbHRlclJlc3VsdDogRmlsdGVyUmVzdWx0ID0ge307XG4gICAgaWYgKHNob3VsZENhbERvbWFpbiB8fCBzaG91bGRDYWxJbmRleCkge1xuICAgICAgY29uc3QgZHluYW1pY0RvbWFpbkZpbHRlcnMgPSBzaG91bGRDYWxEb21haW4gPyBmaWx0ZXJSZWNvcmQuZHluYW1pY0RvbWFpbiA6IG51bGw7XG4gICAgICBjb25zdCBjcHVGaWx0ZXJzID0gc2hvdWxkQ2FsSW5kZXggPyBmaWx0ZXJSZWNvcmQuY3B1IDogbnVsbDtcblxuICAgICAgY29uc3QgZmlsdGVyRnVuY3MgPSBmaWx0ZXJzLnJlZHVjZSgoYWNjLCBmaWx0ZXIpID0+IHtcbiAgICAgICAgY29uc3QgZmllbGRJbmRleCA9IGdldERhdGFzZXRGaWVsZEluZGV4Rm9yRmlsdGVyKHRoaXMuaWQsIGZpbHRlcik7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZmllbGRJbmRleCAhPT0gLTEgPyBmaWVsZHNbZmllbGRJbmRleF0gOiBudWxsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgIFtmaWx0ZXIuaWRdOiBnZXRGaWx0ZXJGdW5jdGlvbihmaWVsZCwgdGhpcy5pZCwgZmlsdGVyLCBsYXllcnMsIGRhdGFDb250YWluZXIpXG4gICAgICAgIH07XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIGZpbHRlclJlc3VsdCA9IGZpbHRlckRhdGFCeUZpbHRlclR5cGVzKFxuICAgICAgICB7ZHluYW1pY0RvbWFpbkZpbHRlcnMsIGNwdUZpbHRlcnMsIGZpbHRlckZ1bmNzfSxcbiAgICAgICAgZGF0YUNvbnRhaW5lclxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmZpbHRlcmVkSW5kZXggPSBmaWx0ZXJSZXN1bHQuZmlsdGVyZWRJbmRleCB8fCB0aGlzLmZpbHRlcmVkSW5kZXg7XG4gICAgdGhpcy5maWx0ZXJlZEluZGV4Rm9yRG9tYWluID1cbiAgICAgIGZpbHRlclJlc3VsdC5maWx0ZXJlZEluZGV4Rm9yRG9tYWluIHx8IHRoaXMuZmlsdGVyZWRJbmRleEZvckRvbWFpbjtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGZpbHRlcnMgdG8gYSBkYXRhc2V0IGFsbCBvbiBDUFUsIGFzc2lnbiB0byBgZmlsdGVyZWRJZHhDUFVgLCBgZmlsdGVyUmVjb3JkQ1BVYFxuICAgKiBAcGFyYW0gZmlsdGVyc1xuICAgKiBAcGFyYW0gbGF5ZXJzXG4gICAqL1xuICBmaWx0ZXJUYWJsZUNQVShmaWx0ZXJzOiBGaWx0ZXJbXSwgbGF5ZXJzOiBMYXllcltdKTogS2VwbGVyVGFibGUge1xuICAgIGNvbnN0IG9wdCA9IHtcbiAgICAgIGNwdU9ubHk6IHRydWUsXG4gICAgICBpZ25vcmVEb21haW46IHRydWVcbiAgICB9O1xuXG4gICAgLy8gbm8gZmlsdGVyXG4gICAgaWYgKCFmaWx0ZXJzLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWx0ZXJlZElkeENQVSA9IHRoaXMuYWxsSW5kZXhlcztcbiAgICAgIHRoaXMuZmlsdGVyUmVjb3JkQ1BVID0gZ2V0RmlsdGVyUmVjb3JkKHRoaXMuaWQsIGZpbHRlcnMsIG9wdCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBubyBncHUgZmlsdGVyXG4gICAgaWYgKCFmaWx0ZXJzLmZpbmQoZiA9PiBmLmdwdSkpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRJZHhDUFUgPSB0aGlzLmZpbHRlcmVkSW5kZXg7XG4gICAgICB0aGlzLmZpbHRlclJlY29yZENQVSA9IGdldEZpbHRlclJlY29yZCh0aGlzLmlkLCBmaWx0ZXJzLCBvcHQpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBhIGNvcHkgZm9yIGNwdSBmaWx0ZXJpbmdcbiAgICBjb25zdCBjb3BpZWQgPSBjb3B5VGFibGUodGhpcyk7XG5cbiAgICBjb3BpZWQuZmlsdGVyUmVjb3JkID0gdGhpcy5maWx0ZXJSZWNvcmRDUFU7XG4gICAgY29waWVkLmZpbHRlcmVkSW5kZXggPSB0aGlzLmZpbHRlcmVkSWR4Q1BVIHx8IFtdO1xuXG4gICAgY29uc3QgZmlsdGVyZWQgPSBjb3BpZWQuZmlsdGVyVGFibGUoZmlsdGVycywgbGF5ZXJzLCBvcHQpO1xuXG4gICAgdGhpcy5maWx0ZXJlZElkeENQVSA9IGZpbHRlcmVkLmZpbHRlcmVkSW5kZXg7XG4gICAgdGhpcy5maWx0ZXJSZWNvcmRDUFUgPSBmaWx0ZXJlZC5maWx0ZXJSZWNvcmQ7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgZmllbGQgZG9tYWluIGJhc2VkIG9uIGZpZWxkIHR5cGUgYW5kIGRhdGFcbiAgICogZm9yIEZpbHRlclxuICAgKi9cbiAgZ2V0Q29sdW1uRmlsdGVyRG9tYWluKGZpZWxkOiBGaWVsZCk6IEZpZWxkRG9tYWluIHtcbiAgICBjb25zdCB7ZGF0YUNvbnRhaW5lcn0gPSB0aGlzO1xuICAgIGNvbnN0IHt2YWx1ZUFjY2Vzc29yfSA9IGZpZWxkO1xuXG4gICAgbGV0IGRvbWFpbjtcblxuICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgICAgY2FzZSBBTExfRklFTERfVFlQRVMucmVhbDpcbiAgICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLmludGVnZXI6XG4gICAgICAgIC8vIGNhbGN1bGF0ZSBkb21haW4gYW5kIHN0ZXBcbiAgICAgICAgcmV0dXJuIGdldE51bWVyaWNGaWVsZERvbWFpbihkYXRhQ29udGFpbmVyLCB2YWx1ZUFjY2Vzc29yKTtcblxuICAgICAgY2FzZSBBTExfRklFTERfVFlQRVMuYm9vbGVhbjpcbiAgICAgICAgcmV0dXJuIHtkb21haW46IFt0cnVlLCBmYWxzZV19O1xuXG4gICAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5zdHJpbmc6XG4gICAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5kYXRlOlxuICAgICAgICBkb21haW4gPSBnZXRPcmRpbmFsRG9tYWluKGRhdGFDb250YWluZXIsIHZhbHVlQWNjZXNzb3IpO1xuICAgICAgICByZXR1cm4ge2RvbWFpbn07XG5cbiAgICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnRpbWVzdGFtcDpcbiAgICAgICAgcmV0dXJuIGdldFRpbWVzdGFtcEZpZWxkRG9tYWluKGRhdGFDb250YWluZXIsIHZhbHVlQWNjZXNzb3IpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge2RvbWFpbjogZ2V0T3JkaW5hbERvbWFpbihkYXRhQ29udGFpbmVyLCB2YWx1ZUFjY2Vzc29yKX07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqICBHZXQgdGhlIGRvbWFpbiBvZiB0aGlzIGNvbHVtbiBiYXNlZCBvbiBzY2FsZSB0eXBlXG4gICAqL1xuICBnZXRDb2x1bW5MYXllckRvbWFpbihcbiAgICBmaWVsZDogRmllbGQsXG4gICAgc2NhbGVUeXBlOiBzdHJpbmdcbiAgKTogbnVtYmVyW10gfCBzdHJpbmdbXSB8IFtudW1iZXIsIG51bWJlcl0gfCBudWxsIHtcbiAgICBjb25zdCB7ZGF0YUNvbnRhaW5lciwgZmlsdGVyZWRJbmRleEZvckRvbWFpbn0gPSB0aGlzO1xuXG4gICAgaWYgKCFTQ0FMRV9UWVBFU1tzY2FsZVR5cGVdKSB7XG4gICAgICBDb25zb2xlLmVycm9yKGBzY2FsZSB0eXBlICR7c2NhbGVUeXBlfSBub3Qgc3VwcG9ydGVkYCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7dmFsdWVBY2Nlc3Nvcn0gPSBmaWVsZDtcbiAgICBjb25zdCBpbmRleFZhbHVlQWNjZXNzb3IgPSBpID0+IHZhbHVlQWNjZXNzb3Ioe2luZGV4OiBpfSk7XG4gICAgY29uc3Qgc29ydEZ1bmN0aW9uID0gZ2V0U29ydGluZ0Z1bmN0aW9uKGZpZWxkLnR5cGUpO1xuXG4gICAgc3dpdGNoIChzY2FsZVR5cGUpIHtcbiAgICAgIGNhc2UgU0NBTEVfVFlQRVMub3JkaW5hbDpcbiAgICAgIGNhc2UgU0NBTEVfVFlQRVMucG9pbnQ6XG4gICAgICAgIC8vIGRvIG5vdCByZWNhbGN1bGF0ZSBvcmRpbmFsIGRvbWFpbiBiYXNlZCBvbiBmaWx0ZXJlZCBkYXRhXG4gICAgICAgIC8vIGRvbid0IG5lZWQgdG8gdXBkYXRlIG9yZGluYWwgZG9tYWluIGV2ZXJ5IHRpbWVcbiAgICAgICAgcmV0dXJuIGdldE9yZGluYWxEb21haW4oZGF0YUNvbnRhaW5lciwgdmFsdWVBY2Nlc3Nvcik7XG5cbiAgICAgIGNhc2UgU0NBTEVfVFlQRVMucXVhbnRpbGU6XG4gICAgICAgIHJldHVybiBnZXRRdWFudGlsZURvbWFpbihmaWx0ZXJlZEluZGV4Rm9yRG9tYWluLCBpbmRleFZhbHVlQWNjZXNzb3IsIHNvcnRGdW5jdGlvbik7XG5cbiAgICAgIGNhc2UgU0NBTEVfVFlQRVMubG9nOlxuICAgICAgICByZXR1cm4gZ2V0TG9nRG9tYWluKGZpbHRlcmVkSW5kZXhGb3JEb21haW4sIGluZGV4VmFsdWVBY2Nlc3Nvcik7XG5cbiAgICAgIGNhc2UgU0NBTEVfVFlQRVMucXVhbnRpemU6XG4gICAgICBjYXNlIFNDQUxFX1RZUEVTLmxpbmVhcjpcbiAgICAgIGNhc2UgU0NBTEVfVFlQRVMuc3FydDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBnZXRMaW5lYXJEb21haW4oZmlsdGVyZWRJbmRleEZvckRvbWFpbiwgaW5kZXhWYWx1ZUFjY2Vzc29yKTtcbiAgICB9XG4gIH1cblxuICBjYWxjdWxhdGVMZWdlbmQobGVmdEZpZWxkLCByaWdodEZpZWxkKSB7XG4gICAgY29uc3QgbGltaXRPZk51bWJlck9mTGVnZW5kRW50cmllcyA9IDIwO1xuICAgIGNvbnN0IGxlZnRWYWx1ZXMgPSB0aGlzLmRhdGFDb250YWluZXIubWFwSW5kZXgobGVmdEZpZWxkLnZhbHVlQWNjZXNzb3IpO1xuICAgIGNvbnN0IHJpZ2h0VmFsdWVzID0gdGhpcy5kYXRhQ29udGFpbmVyLm1hcEluZGV4KHJpZ2h0RmllbGQudmFsdWVBY2Nlc3Nvcik7XG5cbiAgICBjb25zdCBwYWlyaW5nID0gbGVmdFZhbHVlcy5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50LCBpZHgpID0+IHtcbiAgICAgIHByZXZpb3VzLnB1c2goW2N1cnJlbnQsIHJpZ2h0VmFsdWVzW2lkeF1dKTtcbiAgICAgIHJldHVybiBwcmV2aW91cztcbiAgICB9LCBbXSk7XG5cbiAgICByZXR1cm4gdW5pcXVlU29ydGVkUGFpckJ5RnJlcXVlbmN5KHBhaXJpbmcpXG4gICAgICAubWFwKHJvdyA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGFiZWw6IHJvdy5sZWZ0LFxuICAgICAgICAgIGNvbG9yOiBjaGVja0NvbG9yT3JGYWxsYmFjayhyb3cucmlnaHQpXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLnNsaWNlKDAsIGxpbWl0T2ZOdW1iZXJPZkxlZ2VuZEVudHJpZXMgKyAxKTsgLy8gTGltaXQgdG8gbGltaXRPZk51bWJlck9mTGVnZW5kRW50cmllcyArIDEsIHRoZW4gbGltaXQgdG8gbGltaXRPZk51bWJlck9mTGVnZW5kRW50cmllcyBpbiBMZWdlbmRNYW5hZ2Vyc1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNhbXBsZSBvZiByb3dzIHRvIGNhbGN1bGF0ZSBsYXllciBib3VuZGFyaWVzXG4gICAqL1xuICAvLyBnZXRTYW1wbGVEYXRhKHJvd3MpXG5cbiAgLyoqXG4gICAqIFBhcnNlIGNlbGwgdmFsdWUgYmFzZWQgb24gY29sdW1uIHR5cGUgYW5kIHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvblxuICAgKiBWYWx1ZSB0aGUgZmllbGQgdmFsdWUsIHR5cGUgdGhlIGZpZWxkIHR5cGVcbiAgICovXG4gIC8vIHBhcnNlRmllbGRWYWx1ZSh2YWx1ZSwgdHlwZSlcblxuICAvLyBzb3J0RGF0YXNldEJ5Q29sdW1uKClcblxuICAvKipcbiAgICogQXNzZXJ0IHdoZXRoZXIgZmllbGQgZXhpc3RcbiAgICogQHBhcmFtIGZpZWxkTmFtZVxuICAgKiBAcGFyYW0gY29uZGl0aW9uXG4gICAqL1xuICBfYXNzZXRGaWVsZChmaWVsZE5hbWU6IHN0cmluZywgY29uZGl0aW9uOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgQ29uc29sZS5lcnJvcihgJHtmaWVsZE5hbWV9IGRvZXNudCBleGlzdCBpbiBkYXRhc2V0ICR7dGhpcy5pZH1gKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OUyAoTUFJTkxZIEVYUE9SVEVEIEZPUiBURVNULi4uKVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlU3VmZml4QW5kRGVsaW1pdGVycyhsYXllck5hbWUsIHN1ZmZpeCkge1xuICByZXR1cm4gbGF5ZXJOYW1lXG4gICAgLnJlcGxhY2UobmV3IFJlZ0V4cChzdWZmaXgsICdpZycpLCAnJylcbiAgICAucmVwbGFjZSgvW18sLl0rL2csICcgJylcbiAgICAudHJpbSgpO1xufVxuXG4vKipcbiAqIEZpbmQgcG9pbnQgZmllbGRzIHBhaXJzIGZyb20gZmllbGRzXG4gKlxuICogQHBhcmFtIGZpZWxkc1xuICogQHJldHVybnMgZm91bmQgcG9pbnQgZmllbGRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUG9pbnRGaWVsZFBhaXJzKGZpZWxkczogRmllbGRbXSk6IEZpZWxkUGFpcltdIHtcbiAgY29uc3QgYWxsTmFtZXMgPSBmaWVsZHMubWFwKGYgPT4gZi5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuXG4gIC8vIGdldCBsaXN0IG9mIGFsbCBmaWVsZHMgd2l0aCBtYXRjaGluZyBzdWZmaXhlc1xuICBjb25zdCBhY2M6IEZpZWxkUGFpcltdID0gW107XG4gIGNvbnN0IHJlc3VsdCA9IGFsbE5hbWVzLnJlZHVjZSgoY2FycnksIGZpZWxkTmFtZSwgaWR4KSA9PiB7XG4gICAgLy8gVGhpcyBzZWFyY2ggZm9yIHBhaXJzIHdpbGwgZWFybHkgZXhpdCBpZiBmb3VuZC5cbiAgICBmb3IgKGNvbnN0IHN1ZmZpeFBhaXIgb2YgVFJJUF9QT0lOVF9GSUVMRFMpIHtcbiAgICAgIC8vIG1hdGNoIGZpcnN0IHN1ZmZpeGBgYFxuICAgICAgaWYgKGZpZWxkTmFtZS5lbmRzV2l0aChzdWZmaXhQYWlyWzBdKSkge1xuICAgICAgICAvLyBtYXRjaCBzZWNvbmQgc3VmZml4XG4gICAgICAgIGNvbnN0IG90aGVyUGF0dGVybiA9IG5ldyBSZWdFeHAoYCR7c3VmZml4UGFpclswXX1cXCRgKTtcbiAgICAgICAgY29uc3QgcGFydG5lciA9IGZpZWxkTmFtZS5yZXBsYWNlKG90aGVyUGF0dGVybiwgc3VmZml4UGFpclsxXSk7XG5cbiAgICAgICAgY29uc3QgcGFydG5lcklkeCA9IGFsbE5hbWVzLmZpbmRJbmRleChkID0+IGQgPT09IHBhcnRuZXIpO1xuICAgICAgICBpZiAocGFydG5lcklkeCA+IC0xKSB7XG4gICAgICAgICAgY29uc3QgZGVmYXVsdE5hbWUgPSByZW1vdmVTdWZmaXhBbmREZWxpbWl0ZXJzKGZpZWxkTmFtZSwgc3VmZml4UGFpclswXSk7XG5cbiAgICAgICAgICBjYXJyeS5wdXNoKHtcbiAgICAgICAgICAgIGRlZmF1bHROYW1lLFxuICAgICAgICAgICAgcGFpcjoge1xuICAgICAgICAgICAgICBsYXQ6IHtcbiAgICAgICAgICAgICAgICBmaWVsZElkeDogaWR4LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWVsZHNbaWR4XS5uYW1lXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGxuZzoge1xuICAgICAgICAgICAgICAgIGZpZWxkSWR4OiBwYXJ0bmVySWR4LFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWVsZHNbcGFydG5lcklkeF0ubmFtZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3VmZml4OiBzdWZmaXhQYWlyXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGNhcnJ5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjYXJyeTtcbiAgfSwgYWNjKTtcblxuICAvLyBwcmlvcml0aXplIHRoZSAnbGF0aXR1ZGUnLydsb25naXR1ZGUnIHBhaXJcbiAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoYS5kZWZhdWx0TmFtZSA9PT0gJycgJiYgYS5zdWZmaXhbMF0gPT09ICdsYXRpdHVkZScpIHJldHVybiAtMTtcbiAgICBpZiAoYi5kZWZhdWx0TmFtZSA9PT0gJycgJiYgYi5zdWZmaXhbMF0gPT09ICdsYXRpdHVkZScpIHJldHVybiAxO1xuICAgIHJldHVybiAwO1xuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gZGF0YXNldFxuICogQHBhcmFtIGNvbHVtblxuICogQHBhcmFtIG1vZGVcbiAqIEB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0RGF0YXNldEJ5Q29sdW1uKFxuICBkYXRhc2V0OiBLZXBsZXJUYWJsZSxcbiAgY29sdW1uOiBzdHJpbmcsXG4gIG1vZGU/OiBzdHJpbmdcbik6IEtlcGxlclRhYmxlIHtcbiAgY29uc3Qge2FsbEluZGV4ZXMsIGZpZWxkcywgZGF0YUNvbnRhaW5lcn0gPSBkYXRhc2V0O1xuICBjb25zdCBmaWVsZEluZGV4ID0gZmllbGRzLmZpbmRJbmRleChmID0+IGYubmFtZSA9PT0gY29sdW1uKTtcbiAgaWYgKGZpZWxkSW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIGRhdGFzZXQ7XG4gIH1cblxuICBjb25zdCBzb3J0QnkgPSBTT1JUX09SREVSW21vZGUgfHwgJyddIHx8IFNPUlRfT1JERVIuQVNDRU5ESU5HO1xuXG4gIGlmIChzb3J0QnkgPT09IFNPUlRfT1JERVIuVU5TT1JUKSB7XG4gICAgZGF0YXNldC5zb3J0Q29sdW1uID0ge307XG4gICAgZGF0YXNldC5zb3J0T3JkZXIgPSBudWxsO1xuXG4gICAgcmV0dXJuIGRhdGFzZXQ7XG4gIH1cblxuICBjb25zdCBzb3J0RnVuY3Rpb24gPSBzb3J0QnkgPT09IFNPUlRfT1JERVIuQVNDRU5ESU5HID8gYXNjZW5kaW5nIDogZGVzY2VuZGluZztcbiAgY29uc3Qgc29ydE9yZGVyID0gYWxsSW5kZXhlc1xuICAgIC5zbGljZSgpXG4gICAgLnNvcnQoKGEsIGIpID0+XG4gICAgICBzb3J0RnVuY3Rpb24oZGF0YUNvbnRhaW5lci52YWx1ZUF0KGEsIGZpZWxkSW5kZXgpLCBkYXRhQ29udGFpbmVyLnZhbHVlQXQoYiwgZmllbGRJbmRleCkpXG4gICAgKTtcblxuICBkYXRhc2V0LnNvcnRDb2x1bW4gPSB7XG4gICAgW2NvbHVtbl06IHNvcnRCeVxuICB9O1xuICBkYXRhc2V0LnNvcnRPcmRlciA9IHNvcnRPcmRlcjtcblxuICByZXR1cm4gZGF0YXNldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBpblRhYmxlQ29sdW1ucyhkYXRhc2V0OiBLZXBsZXJUYWJsZSwgY29sdW1uOiBzdHJpbmcpOiBLZXBsZXJUYWJsZSB7XG4gIGNvbnN0IGZpZWxkID0gZGF0YXNldC5nZXRDb2x1bW5GaWVsZChjb2x1bW4pO1xuICBpZiAoIWZpZWxkKSB7XG4gICAgcmV0dXJuIGRhdGFzZXQ7XG4gIH1cblxuICBsZXQgcGlubmVkQ29sdW1ucztcbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YXNldC5waW5uZWRDb2x1bW5zKSAmJiBkYXRhc2V0LnBpbm5lZENvbHVtbnMuaW5jbHVkZXMoZmllbGQubmFtZSkpIHtcbiAgICAvLyB1bnBpbiBpdFxuICAgIHBpbm5lZENvbHVtbnMgPSBkYXRhc2V0LnBpbm5lZENvbHVtbnMuZmlsdGVyKGNvID0+IGNvICE9PSBmaWVsZC5uYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBwaW5uZWRDb2x1bW5zID0gKGRhdGFzZXQucGlubmVkQ29sdW1ucyB8fCBbXSkuY29uY2F0KGZpZWxkLm5hbWUpO1xuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gY29weVRhYmxlQW5kVXBkYXRlKGRhdGFzZXQsIHtwaW5uZWRDb2x1bW5zfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29weVRhYmxlPFQgZXh0ZW5kcyB7fT4ob3JpZ2luYWw6IFQpOiBUIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpKSwgb3JpZ2luYWwpO1xufVxuXG4vKipcbiAqIEB0eXBlXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVRhYmxlQW5kVXBkYXRlPFQgZXh0ZW5kcyB7fT4ob3JpZ2luYWw6IFQsIG9wdGlvbnM6IFBhcnRpYWw8VD4gPSB7fSk6IFQge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMob3B0aW9ucykucmVkdWNlKChhY2MsIGVudHJ5KSA9PiB7XG4gICAgYWNjW2VudHJ5WzBdXSA9IGVudHJ5WzFdO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIGNvcHlUYWJsZShvcmlnaW5hbCkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBLZXBsZXJUYWJsZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkEsSUFBQUEsUUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsZ0JBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFFBQUEsR0FBQUYsT0FBQTtBQUdBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGVBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFlBQUEsR0FBQUwsT0FBQTtBQVVBLElBQUFNLFVBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLGVBQUEsR0FBQVAsT0FBQTtBQVNBLElBQUFRLG1CQUFBLEdBQUFSLE9BQUE7QUFFQSxJQUFBUyxXQUFBLEdBQUFULE9BQUE7QUFBdUQsU0FBQVUsMkJBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLHlCQUFBQyxNQUFBLElBQUFILENBQUEsQ0FBQUcsTUFBQSxDQUFBQyxRQUFBLEtBQUFKLENBQUEscUJBQUFFLENBQUEsUUFBQUcsS0FBQSxDQUFBQyxPQUFBLENBQUFOLENBQUEsTUFBQUUsQ0FBQSxHQUFBSywyQkFBQSxDQUFBUCxDQUFBLE1BQUFDLENBQUEsSUFBQUQsQ0FBQSx1QkFBQUEsQ0FBQSxDQUFBUSxNQUFBLElBQUFOLENBQUEsS0FBQUYsQ0FBQSxHQUFBRSxDQUFBLE9BQUFPLEVBQUEsTUFBQUMsQ0FBQSxZQUFBQSxFQUFBLGVBQUFDLENBQUEsRUFBQUQs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
529
+ var _default = exports.default = KeplerTable;
530
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc29sZSIsInJlcXVpcmUiLCJfZGVmYXVsdFNldHRpbmdzIiwiX2QzQXJyYXkiLCJfdXRpbHMiLCJfZ3B1RmlsdGVyVXRpbHMiLCJfZmlsdGVyVXRpbHMiLCJfZGF0YVV0aWxzIiwiX2RhdGFTY2FsZVV0aWxzIiwiX2RhdGFDb250YWluZXJVdGlscyIsIl9jb2xvclV0aWxzIiwiRklEX0tFWSIsIktlcGxlclRhYmxlIiwiY29uc3RydWN0b3IiLCJfcmVmIiwiaW5mbyIsImRhdGEiLCJjb2xvciIsIm1ldGFkYXRhIiwic3VwcG9ydGVkRmlsdGVyVHlwZXMiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsImRhdGFDb250YWluZXIiLCJjcmVhdGVEYXRhQ29udGFpbmVyIiwicm93cyIsImZpZWxkcyIsImRhdGFzZXRJbmZvIiwiaWQiLCJnZW5lcmF0ZUhhc2hJZCIsImxhYmVsIiwiZGF0YUlkIiwibWFwIiwiZiIsImkiLCJmaWVsZElkeCIsIm5hbWUiLCJkaXNwbGF5TmFtZSIsInZhbHVlQWNjZXNzb3IiLCJtYXliZVRvRGF0ZSIsImJpbmQiLCJ0eXBlIiwiQUxMX0ZJRUxEX1RZUEVTIiwidGltZXN0YW1wIiwiZGF0ZSIsImZvcm1hdCIsImFsbEluZGV4ZXMiLCJnZXRQbGFpbkluZGV4IiwiZmlsdGVyZWRJbmRleCIsImZpbHRlcmVkSW5kZXhGb3JEb21haW4iLCJmaWVsZFBhaXJzIiwiZmluZFBvaW50RmllbGRQYWlycyIsImdwdUZpbHRlciIsImdldEdwdUZpbHRlclByb3BzIiwiZ2V0Q29sdW1uRmllbGQiLCJjb2x1bW5OYW1lIiwiZmllbGQiLCJmaW5kIiwiZmQiLCJfYXNzZXRGaWVsZCIsImdldENvbHVtbkZpZWxkSWR4IiwiZmluZEluZGV4IiwiQm9vbGVhbiIsImdldFZhbHVlIiwicm93SWR4IiwiaW5kZXgiLCJ1cGRhdGVDb2x1bW5GaWVsZCIsIm5ld0ZpZWxkIiwiT2JqZWN0IiwiYXNzaWduIiwidXBkYXRlVGFibGVDb2xvciIsIm5ld0NvbG9yIiwiZ2V0Q29sdW1uRmlsdGVyUHJvcHMiLCJoYXNPd25Qcm9wZXJ0eSIsImZpbHRlclByb3BzIiwiZmllbGREb21haW4iLCJnZXRDb2x1bW5GaWx0ZXJEb21haW4iLCJnZXRGaWx0ZXJQcm9wcyIsImZpbHRlclRhYmxlIiwiZmlsdGVycyIsImxheWVycyIsIm9wdCIsImZpbHRlclJlY29yZCIsIm9sZEZpbHRlclJlY29yZCIsImdldEZpbHRlclJlY29yZCIsImxlbmd0aCIsImNoYW5nZWRGaWx0ZXJzIiwiZGlmZkZpbHRlcnMiLCJzaG91bGRDYWxEb21haW4iLCJkeW5hbWljRG9tYWluIiwic2hvdWxkQ2FsSW5kZXgiLCJjcHUiLCJmaWx0ZXJSZXN1bHQiLCJkeW5hbWljRG9tYWluRmlsdGVycyIsImNwdUZpbHRlcnMiLCJmaWx0ZXJGdW5jcyIsInJlZHVjZSIsImFjYyIsImZpbHRlciIsImZpZWxkSW5kZXgiLCJnZXREYXRhc2V0RmllbGRJbmRleEZvckZpbHRlciIsImdldEZpbHRlckZ1bmN0aW9uIiwiZmlsdGVyRGF0YUJ5RmlsdGVyVHlwZXMiLCJmaWx0ZXJUYWJsZUNQVSIsImNwdU9ubHkiLCJpZ25vcmVEb21haW4iLCJmaWx0ZXJlZElkeENQVSIsImZpbHRlclJlY29yZENQVSIsImdwdSIsImNvcGllZCIsImNvcHlUYWJsZSIsImZpbHRlcmVkIiwiZG9tYWluIiwicmVhbCIsImludGVnZXIiLCJnZXROdW1lcmljRmllbGREb21haW4iLCJib29sZWFuIiwic3RyaW5nIiwiZ2V0T3JkaW5hbERvbWFpbiIsImdldFRpbWVzdGFtcEZpZWxkRG9tYWluIiwiZ2V0Q29sdW1uTGF5ZXJEb21haW4iLCJzY2FsZVR5cGUiLCJTQ0FMRV9UWVBFUyIsIkNvbnNvbGUiLCJlcnJvciIsImluZGV4VmFsdWVBY2Nlc3NvciIsInNvcnRGdW5jdGlvbiIsImdldFNvcnRpbmdGdW5jdGlvbiIsIm9yZGluYWwiLCJwb2ludCIsInF1YW50aWxlIiwiZ2V0UXVhbnRpbGVEb21haW4iLCJsb2ciLCJnZXRMb2dEb21haW4iLCJxdWFudGl6ZSIsImxpbmVhciIsInNxcnQiLCJnZXRMaW5lYXJEb21haW4iLCJjYWxjdWxhdGVMZWdlbmQiLCJsZWZ0RmllbGQiLCJyaWdodEZpZWxkIiwibGltaXRPZk51bWJlck9mTGVnZW5kRW50cmllcyIsImxlZnRWYWx1ZXMiLCJtYXBJbmRleCIsInJpZ2h0VmFsdWVzIiwicGFpcmluZyIsInByZXZpb3VzIiwiY3VycmVudCIsImlkeCIsInB1c2giLCJ1bmlxdWVTb3J0ZWRQYWlyQnlGcmVxdWVuY3kiLCJyb3ciLCJsZWZ0IiwiY2hlY2tDb2xvck9yRmFsbGJhY2siLCJyaWdodCIsInNsaWNlIiwiZmllbGROYW1lIiwiY29uZGl0aW9uIiwicmVtb3ZlU3VmZml4QW5kRGVsaW1pdGVycyIsImxheWVyTmFtZSIsInN1ZmZpeCIsInJlcGxhY2UiLCJSZWdFeHAiLCJ0cmltIiwiYWxsTmFtZXMiLCJ0b0xvd2VyQ2FzZSIsInJlc3VsdCIsImNhcnJ5Iiwic3VmZml4UGFpciIsIlRSSVBfUE9JTlRfRklFTERTIiwiZW5kc1dpdGgiLCJvdGhlclBhdHRlcm4iLCJwYXJ0bmVyIiwicGFydG5lcklkeCIsImQiLCJkZWZhdWx0TmFtZSIsInBhaXIiLCJsYXQiLCJ2YWx1ZSIsImxuZyIsInNvcnQiLCJhIiwiYiIsInNvcnREYXRhc2V0QnlDb2x1bW4iLCJkYXRhc2V0IiwiY29sdW1uIiwibW9kZSIsInNvcnRCeSIsIlNPUlRfT1JERVIiLCJBU0NFTkRJTkciLCJVTlNPUlQiLCJzb3J0Q29sdW1uIiwic29ydE9yZGVyIiwiYXNjZW5kaW5nIiwiZGVzY2VuZGluZyIsInZhbHVlQXQiLCJwaW5UYWJsZUNvbHVtbnMiLCJwaW5uZWRDb2x1bW5zIiwiQXJyYXkiLCJpc0FycmF5IiwiaW5jbHVkZXMiLCJjbyIsImNvbmNhdCIsImNvcHlUYWJsZUFuZFVwZGF0ZSIsIm9yaWdpbmFsIiwiY3JlYXRlIiwiZ2V0UHJvdG90eXBlT2YiLCJvcHRpb25zIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiZW50cmllcyIsImVudHJ5IiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL3RhYmxlLXV0aWxzL2tlcGxlci10YWJsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge2NvbnNvbGUgYXMgQ29uc29sZX0gZnJvbSAnZ2xvYmFsL2NvbnNvbGUnO1xuaW1wb3J0IHtUUklQX1BPSU5UX0ZJRUxEUywgU09SVF9PUkRFUn0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHthc2NlbmRpbmcsIGRlc2NlbmRpbmd9IGZyb20gJ2QzLWFycmF5JztcblxuLy8gaW1wb3J0IHt2YWxpZGF0ZUlucHV0RGF0YX0gZnJvbSAncHJvY2Vzc29ycy9kYXRhLXByb2Nlc3Nvcic7XG5pbXBvcnQge2dlbmVyYXRlSGFzaElkfSBmcm9tICd1dGlscy91dGlscyc7XG5pbXBvcnQge2dldEdwdUZpbHRlclByb3BzLCBnZXREYXRhc2V0RmllbGRJbmRleEZvckZpbHRlcn0gZnJvbSAndXRpbHMvZ3B1LWZpbHRlci11dGlscyc7XG5pbXBvcnQge1xuICBnZXRGaWx0ZXJQcm9wcyxcbiAgZ2V0RmlsdGVyUmVjb3JkLFxuICBkaWZmRmlsdGVycyxcbiAgZ2V0RmlsdGVyRnVuY3Rpb24sXG4gIGZpbHRlckRhdGFCeUZpbHRlclR5cGVzLFxuICBnZXROdW1lcmljRmllbGREb21haW4sXG4gIGdldFRpbWVzdGFtcEZpZWxkRG9tYWluLFxuICBGaWx0ZXJSZXN1bHRcbn0gZnJvbSAndXRpbHMvZmlsdGVyLXV0aWxzJztcbmltcG9ydCB7bWF5YmVUb0RhdGUsIGdldFNvcnRpbmdGdW5jdGlvbn0gZnJvbSAndXRpbHMvZGF0YS11dGlscyc7XG5pbXBvcnQge1xuICBnZXRRdWFudGlsZURvbWFpbixcbiAgZ2V0T3JkaW5hbERvbWFpbixcbiAgZ2V0TG9nRG9tYWluLFxuICBnZXRMaW5lYXJEb21haW5cbn0gZnJvbSAndXRpbHMvZGF0YS1zY2FsZS11dGlscyc7XG5cbmltcG9ydCB7QUxMX0ZJRUxEX1RZUEVTLCBTQ0FMRV9UWVBFU30gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuXG5pbXBvcnQge2NyZWF0ZURhdGFDb250YWluZXJ9IGZyb20gJy4vZGF0YS1jb250YWluZXItdXRpbHMnO1xuaW1wb3J0IHt1bmlxdWVTb3J0ZWRQYWlyQnlGcmVxdWVuY3l9IGZyb20gJ3V0aWxzL2RhdGEtdXRpbHMnO1xuaW1wb3J0IHtjaGVja0NvbG9yT3JGYWxsYmFja30gZnJvbSAndXRpbHMvY29sb3ItdXRpbHMnO1xuXG5pbXBvcnQge1JHQkNvbG9yfSBmcm9tICdyZWR1Y2Vycy90eXBlcyc7XG5pbXBvcnQge0xheWVyfSBmcm9tICdsYXllcnMnO1xuaW1wb3J0IHtGaWVsZERvbWFpbiwgRmlsdGVyfSBmcm9tICdyZWR1Y2Vycy92aXMtc3RhdGUtdXBkYXRlcnMnO1xuaW1wb3J0IHtEYXRhQ29udGFpbmVySW50ZXJmYWNlfSBmcm9tICcuL2RhdGEtY29udGFpbmVyLWludGVyZmFjZSc7XG5pbXBvcnQge1Byb3RvRGF0YXNldH0gZnJvbSAnYWN0aW9ucyc7XG5cbmV4cG9ydCB0eXBlIEZpZWxkID0ge1xuICBhbmFseXplclR5cGU6IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgZm9ybWF0OiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgZmllbGRJZHg6IG51bWJlcjtcbiAgdmFsdWVBY2Nlc3Nvcih2OiB7aW5kZXg6IG51bWJlcn0pOiBhbnk7XG4gIGZpbHRlclByb3BzPzogYW55O1xuICBtZXRhZGF0YT86IGFueTtcbn07XG5cbmV4cG9ydCB0eXBlIEdwdUZpbHRlciA9IHtcbiAgZmlsdGVyUmFuZ2U6IG51bWJlcltdW107XG4gIGZpbHRlclZhbHVlVXBkYXRlVHJpZ2dlcnM6IGFueTtcbiAgZmlsdGVyVmFsdWVBY2Nlc3NvcjogKFxuICAgIGRjOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlXG4gICkgPT4gKFxuICAgIGdldEluZGV4PzogKGFueSkgPT4gbnVtYmVyLFxuICAgIGdldERhdGE/OiAoZGM6IERhdGFDb250YWluZXJJbnRlcmZhY2UsIGQ6IGFueSwgZmllbGRJbmRleDogbnVtYmVyKSA9PiBhbnlcbiAgKSA9PiAoZDogYW55KSA9PiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBGaWVsZFBhaXIgPSB7XG4gIGRlZmF1bHROYW1lOiBzdHJpbmc7XG4gIHBhaXI6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICBmaWVsZElkeDogbnVtYmVyO1xuICAgICAgdmFsdWU6IHN0cmluZztcbiAgICB9O1xuICB9O1xuICBzdWZmaXg6IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgRmlsdGVyUmVjb3JkID0ge1xuICBkeW5hbWljRG9tYWluOiBGaWx0ZXJbXTtcbiAgZml4ZWREb21haW46IEZpbHRlcltdO1xuICBjcHU6IEZpbHRlcltdO1xuICBncHU6IEZpbHRlcltdO1xufTtcblxuZXhwb3J0IHR5cGUgRmlsdGVyRGF0YXNldE9wdCA9IHtcbiAgLy8gb25seSBhbGxvdyBjcHUgZmlsdGVyaW5nXG4gIGNwdU9ubHk/OiBib29sZWFuO1xuICAvLyBpZ25vcmUgZmlsdGVyIGZvciBkb21haW4gY2FsY3VsYXRpb25cbiAgaWdub3JlRG9tYWluPzogYm9vbGVhbjtcbn07XG5cbi8vIFVuaXF1ZSBpZGVudGlmaWVyIG9mIGVhY2ggZmllbGRcbmNvbnN0IEZJRF9LRVkgPSAnbmFtZSc7XG5cbmNsYXNzIEtlcGxlclRhYmxlIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICB0eXBlPzogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBjb2xvcjogUkdCQ29sb3I7XG5cbiAgLy8gZmllbGRzIGFuZCBkYXRhXG4gIGZpZWxkczogRmllbGRbXTtcblxuICBkYXRhQ29udGFpbmVyOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlO1xuXG4gIGFsbEluZGV4ZXM6IG51bWJlcltdO1xuICBmaWx0ZXJlZEluZGV4OiBudW1iZXJbXTtcbiAgZmlsdGVyZWRJZHhDUFU/OiBudW1iZXJbXTtcbiAgZmlsdGVyZWRJbmRleEZvckRvbWFpbjogbnVtYmVyW107XG4gIGZpZWxkUGFpcnM6IEZpZWxkUGFpcltdO1xuICBncHVGaWx0ZXI6IEdwdUZpbHRlcjtcbiAgZmlsdGVyUmVjb3JkPzogRmlsdGVyUmVjb3JkO1xuICBmaWx0ZXJSZWNvcmRDUFU/OiBGaWx0ZXJSZWNvcmQ7XG4gIGNoYW5nZWRGaWx0ZXJzPzogYW55O1xuXG4gIC8vIHRhYmxlLWluamVjdGVkIG1ldGFkYXRhXG4gIHNvcnRDb2x1bW4/OiB7XG4gICAgLy8gY29sdW1uIG5hbWU6IHNvcnRlZCBpZHhcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7IC8vIEFTQ0VORElORyB8IERFU0NFTkRJTkcgfCBVTlNPUlRcbiAgfTtcbiAgc29ydE9yZGVyPzogbnVtYmVyW10gfCBudWxsO1xuXG4gIHBpbm5lZENvbHVtbnM/OiBzdHJpbmdbXTtcbiAgc3VwcG9ydGVkRmlsdGVyVHlwZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAvLyB0YWJsZS1pbmplY3RlZCBtZXRhZGF0YVxuICBtZXRhZGF0YTogb2JqZWN0O1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBpbmZvID0ge30sXG4gICAgZGF0YSxcbiAgICBjb2xvcixcbiAgICBtZXRhZGF0YSxcbiAgICBzdXBwb3J0ZWRGaWx0ZXJUeXBlc1xuICB9OiB7XG4gICAgaW5mbz86IFByb3RvRGF0YXNldFsnaW5mbyddO1xuICAgIGRhdGE6IFByb3RvRGF0YXNldFsnZGF0YSddO1xuICAgIGNvbG9yOiBSR0JDb2xvcjtcbiAgICBtZXRhZGF0YT86IFByb3RvRGF0YXNldFsnbWV0YWRhdGEnXTtcbiAgICBzdXBwb3J0ZWRGaWx0ZXJUeXBlcz86IFByb3RvRGF0YXNldFsnc3VwcG9ydGVkRmlsdGVyVHlwZXMnXTtcbiAgfSkge1xuICAgIC8vIFRPRE8gLSB3aGF0IHRvIGRvIGlmIHZhbGlkYXRpb24gZmFpbHM/IENhbiBrZXBsZXIgaGFuZGxlIGV4Y2VwdGlvbnM/XG4gICAgLy8gY29uc3QgdmFsaWRhdGVkRGF0YSA9IHZhbGlkYXRlSW5wdXREYXRhKGRhdGEpO1xuICAgIC8vIGlmICghdmFsaWRhdGVkRGF0YSkge1xuICAgIC8vICAgcmV0dXJuIHRoaXM7XG4gICAgLy8gfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIGNvbnN0IGRhdGFDb250YWluZXIgPSBjcmVhdGVEYXRhQ29udGFpbmVyKGRhdGEucm93cywge2ZpZWxkczogZGF0YS5maWVsZHN9KTtcblxuICAgIGNvbnN0IGRhdGFzZXRJbmZvID0ge1xuICAgICAgaWQ6IGdlbmVyYXRlSGFzaElkKDQpLFxuICAgICAgbGFiZWw6ICduZXcgZGF0YXNldCcsXG4gICAgICAuLi4oaW5mbyB8fCB7fSlcbiAgICB9O1xuICAgIGNvbnN0IGRhdGFJZCA9IGRhdGFzZXRJbmZvLmlkO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBjb25zdCBmaWVsZHM6IEZpZWxkW10gPSBkYXRhLmZpZWxkcy5tYXAoKGYsIGkpID0+ICh7XG4gICAgICAuLi5mLFxuICAgICAgZmllbGRJZHg6IGksXG4gICAgICBpZDogZi5uYW1lLFxuICAgICAgZGlzcGxheU5hbWU6IGYuZGlzcGxheU5hbWUgfHwgZi5uYW1lLFxuICAgICAgdmFsdWVBY2Nlc3NvcjogbWF5YmVUb0RhdGUuYmluZChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgLy8gaXMgdGltZVxuICAgICAgICBmLnR5cGUgPT09IEFMTF9GSUVMRF9UWVBFUy50aW1lc3RhbXAgfHwgZi50eXBlID09PSBBTExfRklFTERfVFlQRVMuZGF0ZSxcbiAgICAgICAgaSxcbiAgICAgICAgZi5mb3JtYXQsXG4gICAgICAgIGRhdGFDb250YWluZXJcbiAgICAgIClcbiAgICB9KSk7XG5cbiAgICBjb25zdCBhbGxJbmRleGVzID0gZGF0YUNvbnRhaW5lci5nZXRQbGFpbkluZGV4KCk7XG5cbiAgICB0aGlzLmlkID0gZGF0YXNldEluZm8uaWQ7XG4gICAgdGhpcy5sYWJlbCA9IGRhdGFzZXRJbmZvLmxhYmVsO1xuICAgIHRoaXMuY29sb3IgPSBjb2xvcjtcbiAgICB0aGlzLm1ldGFkYXRhID0ge1xuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgICBpZDogZGF0YXNldEluZm8uaWQsXG4gICAgICBsYWJlbDogZGF0YXNldEluZm8ubGFiZWxcbiAgICB9O1xuXG4gICAgdGhpcy5kYXRhQ29udGFpbmVyID0gZGF0YUNvbnRhaW5lcjtcbiAgICB0aGlzLmFsbEluZGV4ZXMgPSBhbGxJbmRleGVzO1xuICAgIHRoaXMuZmlsdGVyZWRJbmRleCA9IGFsbEluZGV4ZXM7XG4gICAgdGhpcy5maWx0ZXJlZEluZGV4Rm9yRG9tYWluID0gYWxsSW5kZXhlcztcbiAgICB0aGlzLmZpZWxkUGFpcnMgPSBmaW5kUG9pbnRGaWVsZFBhaXJzKGZpZWxkcyk7XG4gICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7XG4gICAgdGhpcy5ncHVGaWx0ZXIgPSBnZXRHcHVGaWx0ZXJQcm9wcyhbXSwgZGF0YUlkLCBmaWVsZHMpO1xuICAgIGlmIChzdXBwb3J0ZWRGaWx0ZXJUeXBlcykge1xuICAgICAgdGhpcy5zdXBwb3J0ZWRGaWx0ZXJUeXBlcyA9IHN1cHBvcnRlZEZpbHRlclR5cGVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZmllbGRcbiAgICogQHBhcmFtIGNvbHVtbk5hbWVcbiAgICovXG4gIGdldENvbHVtbkZpZWxkKGNvbHVtbk5hbWU6IHN0cmluZyk6IEZpZWxkIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzLmZpbmQoZmQgPT4gZmRbRklEX0tFWV0gPT09IGNvbHVtbk5hbWUpO1xuICAgIHRoaXMuX2Fzc2V0RmllbGQoY29sdW1uTmFtZSwgZmllbGQpO1xuICAgIHJldHVybiBmaWVsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZmllbGRJZHhcbiAgICogQHBhcmFtIGNvbHVtbk5hbWVcbiAgICovXG4gIGdldENvbHVtbkZpZWxkSWR4KGNvbHVtbk5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgZmllbGRJZHggPSB0aGlzLmZpZWxkcy5maW5kSW5kZXgoZmQgPT4gZmRbRklEX0tFWV0gPT09IGNvbHVtbk5hbWUpO1xuICAgIHRoaXMuX2Fzc2V0RmllbGQoY29sdW1uTmFtZSwgQm9vbGVhbihmaWVsZElkeCA+IC0xKSk7XG4gICAgcmV0dXJuIGZpZWxkSWR4O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdmFsdWUgb2YgYSBjZWxsXG4gICAqL1xuICBnZXRWYWx1ZShjb2x1bW5OYW1lOiBzdHJpbmcsIHJvd0lkeDogbnVtYmVyKTogYW55IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZ2V0Q29sdW1uRmllbGQoY29sdW1uTmFtZSk7XG4gICAgcmV0dXJuIGZpZWxkID8gZmllbGQudmFsdWVBY2Nlc3Nvcih7aW5kZXg6IHJvd0lkeH0pIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGV4aXN0aW5nIGZpZWxkIHdpdGggYSBuZXcgb2JqZWN0XG4gICAqIEBwYXJhbSBmaWVsZElkeFxuICAgKiBAcGFyYW0gbmV3RmllbGRcbiAgICovXG4gIHVwZGF0ZUNvbHVtbkZpZWxkKGZpZWxkSWR4OiBudW1iZXIsIG5ld0ZpZWxkOiBGaWVsZCk6IHZvaWQge1xuICAgIHRoaXMuZmllbGRzID0gT2JqZWN0LmFzc2lnbihbLi4udGhpcy5maWVsZHNdLCB7W2ZpZWxkSWR4XTogbmV3RmllbGR9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgZGF0YXNldCBjb2xvciBieSBjdXN0b20gY29sb3JcbiAgICogQHBhcmFtIG5ld0NvbG9yXG4gICAqL1xuICB1cGRhdGVUYWJsZUNvbG9yKG5ld0NvbG9yOiBSR0JDb2xvcik6IHZvaWQge1xuICAgIHRoaXMuY29sb3IgPSBuZXdDb2xvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGZpbHRlclByb3BzIHRvIGZpZWxkIGFuZCByZXRyaWV2ZSBpdFxuICAgKiBAcGFyYW0gY29sdW1uTmFtZVxuICAgKi9cbiAgZ2V0Q29sdW1uRmlsdGVyUHJvcHMoY29sdW1uTmFtZTogc3RyaW5nKTogRmllbGRbJ2ZpbHRlclByb3BzJ10gfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmaWVsZElkeCA9IHRoaXMuZ2V0Q29sdW1uRmllbGRJZHgoY29sdW1uTmFtZSk7XG4gICAgaWYgKGZpZWxkSWR4IDwgMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHNbZmllbGRJZHhdO1xuICAgIGlmIChmaWVsZC5oYXNPd25Qcm9wZXJ0eSgnZmlsdGVyUHJvcHMnKSkge1xuICAgICAgcmV0dXJuIGZpZWxkLmZpbHRlclByb3BzO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkRG9tYWluID0gdGhpcy5nZXRDb2x1bW5GaWx0ZXJEb21haW4oZmllbGQpO1xuICAgIGlmICghZmllbGREb21haW4pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlclByb3BzID0gZ2V0RmlsdGVyUHJvcHMoZmllbGQsIGZpZWxkRG9tYWluKTtcbiAgICBjb25zdCBuZXdGaWVsZCA9IHtcbiAgICAgIC4uLmZpZWxkLFxuICAgICAgZmlsdGVyUHJvcHNcbiAgICB9O1xuXG4gICAgdGhpcy51cGRhdGVDb2x1bW5GaWVsZChmaWVsZElkeCwgbmV3RmllbGQpO1xuXG4gICAgcmV0dXJuIGZpbHRlclByb3BzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGZpbHRlcnMgdG8gZGF0YXNldCwgcmV0dXJuIHRoZSBmaWx0ZXJlZCBkYXRhc2V0IHdpdGggdXBkYXRlZCBgZ3B1RmlsdGVyYCwgYGZpbHRlclJlY29yZGAsIGBmaWx0ZXJlZEluZGV4YCwgYGZpbHRlcmVkSW5kZXhGb3JEb21haW5gXG4gICAqIEBwYXJhbSBmaWx0ZXJzXG4gICAqIEBwYXJhbSBsYXllcnNcbiAgICogQHBhcmFtIG9wdFxuICAgKi9cbiAgZmlsdGVyVGFibGUoZmlsdGVyczogRmlsdGVyW10sIGxheWVyczogTGF5ZXJbXSwgb3B0PzogRmlsdGVyRGF0YXNldE9wdCk6IEtlcGxlclRhYmxlIHtcbiAgICBjb25zdCB7ZGF0YUNvbnRhaW5lciwgaWQ6IGRhdGFJZCwgZmlsdGVyUmVjb3JkOiBvbGRGaWx0ZXJSZWNvcmQsIGZpZWxkc30gPSB0aGlzO1xuXG4gICAgLy8gaWYgdGhlcmUgaXMgbm8gZmlsdGVyc1xuICAgIGNvbnN0IGZpbHRlclJlY29yZCA9IGdldEZpbHRlclJlY29yZChkYXRhSWQsIGZpbHRlcnMsIG9wdCB8fCB7fSk7XG5cbiAgICB0aGlzLmZpbHRlclJlY29yZCA9IGZpbHRlclJlY29yZDtcbiAgICB0aGlzLmdwdUZpbHRlciA9IGdldEdwdUZpbHRlclByb3BzKGZpbHRlcnMsIGRhdGFJZCwgZmllbGRzKTtcblxuICAgIC8vIGNvbnN0IG5ld0RhdGFzZXQgPSBzZXQoWydmaWx0ZXJSZWNvcmQnXSwgZmlsdGVyUmVjb3JkLCBkYXRhc2V0KTtcblxuICAgIGlmICghZmlsdGVycy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRJbmRleCA9IHRoaXMuYWxsSW5kZXhlcztcbiAgICAgIHRoaXMuZmlsdGVyZWRJbmRleEZvckRvbWFpbiA9IHRoaXMuYWxsSW5kZXhlcztcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlZEZpbHRlcnMgPSBkaWZmRmlsdGVycyhmaWx0ZXJSZWNvcmQsIG9sZEZpbHRlclJlY29yZCk7XG5cbiAgICAvLyBnZW5lcmF0ZSAyIHNldHMgb2YgZmlsdGVyIHJlc3VsdFxuICAgIC8vIGZpbHRlcmVkSW5kZXggdXNlZCB0byBjYWxjdWxhdGUgbGF5ZXIgZGF0YVxuICAgIC8vIGZpbHRlcmVkSW5kZXhGb3JEb21haW4gdXNlZCB0byBjYWxjdWxhdGUgbGF5ZXIgRG9tYWluXG4gICAgY29uc3Qgc2hvdWxkQ2FsRG9tYWluID0gQm9vbGVhbih0aGlzLmNoYW5nZWRGaWx0ZXJzLmR5bmFtaWNEb21haW4pO1xuICAgIGNvbnN0IHNob3VsZENhbEluZGV4ID0gQm9vbGVhbih0aGlzLmNoYW5nZWRGaWx0ZXJzLmNwdSk7XG5cbiAgICBsZXQgZmlsdGVyUmVzdWx0OiBGaWx0ZXJSZXN1bHQgPSB7fTtcbiAgICBpZiAoc2hvdWxkQ2FsRG9tYWluIHx8IHNob3VsZENhbEluZGV4KSB7XG4gICAgICBjb25zdCBkeW5hbWljRG9tYWluRmlsdGVycyA9IHNob3VsZENhbERvbWFpbiA/IGZpbHRlclJlY29yZC5keW5hbWljRG9tYWluIDogbnVsbDtcbiAgICAgIGNvbnN0IGNwdUZpbHRlcnMgPSBzaG91bGRDYWxJbmRleCA/IGZpbHRlclJlY29yZC5jcHUgOiBudWxsO1xuXG4gICAgICBjb25zdCBmaWx0ZXJGdW5jcyA9IGZpbHRlcnMucmVkdWNlKChhY2MsIGZpbHRlcikgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZEluZGV4ID0gZ2V0RGF0YXNldEZpZWxkSW5kZXhGb3JGaWx0ZXIodGhpcy5pZCwgZmlsdGVyKTtcbiAgICAgICAgY29uc3QgZmllbGQgPSBmaWVsZEluZGV4ICE9PSAtMSA/IGZpZWxkc1tmaWVsZEluZGV4XSA6IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgW2ZpbHRlci5pZF06IGdldEZpbHRlckZ1bmN0aW9uKGZpZWxkLCB0aGlzLmlkLCBmaWx0ZXIsIGxheWVycywgZGF0YUNvbnRhaW5lcilcbiAgICAgICAgfTtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgZmlsdGVyUmVzdWx0ID0gZmlsdGVyRGF0YUJ5RmlsdGVyVHlwZXMoXG4gICAgICAgIHtkeW5hbWljRG9tYWluRmlsdGVycywgY3B1RmlsdGVycywgZmlsdGVyRnVuY3N9LFxuICAgICAgICBkYXRhQ29udGFpbmVyXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyZWRJbmRleCA9IGZpbHRlclJlc3VsdC5maWx0ZXJlZEluZGV4IHx8IHRoaXMuZmlsdGVyZWRJbmRleDtcbiAgICB0aGlzLmZpbHRlcmVkSW5kZXhGb3JEb21haW4gPVxuICAgICAgZmlsdGVyUmVzdWx0LmZpbHRlcmVkSW5kZXhGb3JEb21haW4gfHwgdGhpcy5maWx0ZXJlZEluZGV4Rm9yRG9tYWluO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgZmlsdGVycyB0byBhIGRhdGFzZXQgYWxsIG9uIENQVSwgYXNzaWduIHRvIGBmaWx0ZXJlZElkeENQVWAsIGBmaWx0ZXJSZWNvcmRDUFVgXG4gICAqIEBwYXJhbSBmaWx0ZXJzXG4gICAqIEBwYXJhbSBsYXllcnNcbiAgICovXG4gIGZpbHRlclRhYmxlQ1BVKGZpbHRlcnM6IEZpbHRlcltdLCBsYXllcnM6IExheWVyW10pOiBLZXBsZXJUYWJsZSB7XG4gICAgY29uc3Qgb3B0ID0ge1xuICAgICAgY3B1T25seTogdHJ1ZSxcbiAgICAgIGlnbm9yZURvbWFpbjogdHJ1ZVxuICAgIH07XG5cbiAgICAvLyBubyBmaWx0ZXJcbiAgICBpZiAoIWZpbHRlcnMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkSWR4Q1BVID0gdGhpcy5hbGxJbmRleGVzO1xuICAgICAgdGhpcy5maWx0ZXJSZWNvcmRDUFUgPSBnZXRGaWx0ZXJSZWNvcmQodGhpcy5pZCwgZmlsdGVycywgb3B0KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIG5vIGdwdSBmaWx0ZXJcbiAgICBpZiAoIWZpbHRlcnMuZmluZChmID0+IGYuZ3B1KSkge1xuICAgICAgdGhpcy5maWx0ZXJlZElkeENQVSA9IHRoaXMuZmlsdGVyZWRJbmRleDtcbiAgICAgIHRoaXMuZmlsdGVyUmVjb3JkQ1BVID0gZ2V0RmlsdGVyUmVjb3JkKHRoaXMuaWQsIGZpbHRlcnMsIG9wdCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBtYWtlIGEgY29weSBmb3IgY3B1IGZpbHRlcmluZ1xuICAgIGNvbnN0IGNvcGllZCA9IGNvcHlUYWJsZSh0aGlzKTtcblxuICAgIGNvcGllZC5maWx0ZXJSZWNvcmQgPSB0aGlzLmZpbHRlclJlY29yZENQVTtcbiAgICBjb3BpZWQuZmlsdGVyZWRJbmRleCA9IHRoaXMuZmlsdGVyZWRJZHhDUFUgfHwgW107XG5cbiAgICBjb25zdCBmaWx0ZXJlZCA9IGNvcGllZC5maWx0ZXJUYWJsZShmaWx0ZXJzLCBsYXllcnMsIG9wdCk7XG5cbiAgICB0aGlzLmZpbHRlcmVkSWR4Q1BVID0gZmlsdGVyZWQuZmlsdGVyZWRJbmRleDtcbiAgICB0aGlzLmZpbHRlclJlY29yZENQVSA9IGZpbHRlcmVkLmZpbHRlclJlY29yZDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBmaWVsZCBkb21haW4gYmFzZWQgb24gZmllbGQgdHlwZSBhbmQgZGF0YVxuICAgKiBmb3IgRmlsdGVyXG4gICAqL1xuICBnZXRDb2x1bW5GaWx0ZXJEb21haW4oZmllbGQ6IEZpZWxkKTogRmllbGREb21haW4ge1xuICAgIGNvbnN0IHtkYXRhQ29udGFpbmVyfSA9IHRoaXM7XG4gICAgY29uc3Qge3ZhbHVlQWNjZXNzb3J9ID0gZmllbGQ7XG5cbiAgICBsZXQgZG9tYWluO1xuXG4gICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5yZWFsOlxuICAgICAgY2FzZSBBTExfRklFTERfVFlQRVMuaW50ZWdlcjpcbiAgICAgICAgLy8gY2FsY3VsYXRlIGRvbWFpbiBhbmQgc3RlcFxuICAgICAgICByZXR1cm4gZ2V0TnVtZXJpY0ZpZWxkRG9tYWluKGRhdGFDb250YWluZXIsIHZhbHVlQWNjZXNzb3IpO1xuXG4gICAgICBjYXNlIEFMTF9GSUVMRF9UWVBFUy5ib29sZWFuOlxuICAgICAgICByZXR1cm4ge2RvbWFpbjogW3RydWUsIGZhbHNlXX07XG5cbiAgICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLnN0cmluZzpcbiAgICAgIGNhc2UgQUxMX0ZJRUxEX1RZUEVTLmRhdGU6XG4gICAgICAgIGRvbWFpbiA9IGdldE9yZGluYWxEb21haW4oZGF0YUNvbnRhaW5lciwgdmFsdWVBY2Nlc3Nvcik7XG4gICAgICAgIHJldHVybiB7ZG9tYWlufTtcblxuICAgICAgY2FzZSBBTExfRklFTERfVFlQRVMudGltZXN0YW1wOlxuICAgICAgICByZXR1cm4gZ2V0VGltZXN0YW1wRmllbGREb21haW4oZGF0YUNvbnRhaW5lciwgdmFsdWVBY2Nlc3Nvcik7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB7ZG9tYWluOiBnZXRPcmRpbmFsRG9tYWluKGRhdGFDb250YWluZXIsIHZhbHVlQWNjZXNzb3IpfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogIEdldCB0aGUgZG9tYWluIG9mIHRoaXMgY29sdW1uIGJhc2VkIG9uIHNjYWxlIHR5cGVcbiAgICovXG4gIGdldENvbHVtbkxheWVyRG9tYWluKFxuICAgIGZpZWxkOiBGaWVsZCxcbiAgICBzY2FsZVR5cGU6IHN0cmluZ1xuICApOiBudW1iZXJbXSB8IHN0cmluZ1tdIHwgW251bWJlciwgbnVtYmVyXSB8IG51bGwge1xuICAgIGNvbnN0IHtkYXRhQ29udGFpbmVyLCBmaWx0ZXJlZEluZGV4Rm9yRG9tYWlufSA9IHRoaXM7XG5cbiAgICBpZiAoIVNDQUxFX1RZUEVTW3NjYWxlVHlwZV0pIHtcbiAgICAgIENvbnNvbGUuZXJyb3IoYHNjYWxlIHR5cGUgJHtzY2FsZVR5cGV9IG5vdCBzdXBwb3J0ZWRgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHt2YWx1ZUFjY2Vzc29yfSA9IGZpZWxkO1xuICAgIGNvbnN0IGluZGV4VmFsdWVBY2Nlc3NvciA9IGkgPT4gdmFsdWVBY2Nlc3Nvcih7aW5kZXg6IGl9KTtcbiAgICBjb25zdCBzb3J0RnVuY3Rpb24gPSBnZXRTb3J0aW5nRnVuY3Rpb24oZmllbGQudHlwZSk7XG5cbiAgICBzd2l0Y2ggKHNjYWxlVHlwZSkge1xuICAgICAgY2FzZSBTQ0FMRV9UWVBFUy5vcmRpbmFsOlxuICAgICAgY2FzZSBTQ0FMRV9UWVBFUy5wb2ludDpcbiAgICAgICAgLy8gZG8gbm90IHJlY2FsY3VsYXRlIG9yZGluYWwgZG9tYWluIGJhc2VkIG9uIGZpbHRlcmVkIGRhdGFcbiAgICAgICAgLy8gZG9uJ3QgbmVlZCB0byB1cGRhdGUgb3JkaW5hbCBkb21haW4gZXZlcnkgdGltZVxuICAgICAgICByZXR1cm4gZ2V0T3JkaW5hbERvbWFpbihkYXRhQ29udGFpbmVyLCB2YWx1ZUFjY2Vzc29yKTtcblxuICAgICAgY2FzZSBTQ0FMRV9UWVBFUy5xdWFudGlsZTpcbiAgICAgICAgcmV0dXJuIGdldFF1YW50aWxlRG9tYWluKGZpbHRlcmVkSW5kZXhGb3JEb21haW4sIGluZGV4VmFsdWVBY2Nlc3Nvciwgc29ydEZ1bmN0aW9uKTtcblxuICAgICAgY2FzZSBTQ0FMRV9UWVBFUy5sb2c6XG4gICAgICAgIHJldHVybiBnZXRMb2dEb21haW4oZmlsdGVyZWRJbmRleEZvckRvbWFpbiwgaW5kZXhWYWx1ZUFjY2Vzc29yKTtcblxuICAgICAgY2FzZSBTQ0FMRV9UWVBFUy5xdWFudGl6ZTpcbiAgICAgIGNhc2UgU0NBTEVfVFlQRVMubGluZWFyOlxuICAgICAgY2FzZSBTQ0FMRV9UWVBFUy5zcXJ0OlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGdldExpbmVhckRvbWFpbihmaWx0ZXJlZEluZGV4Rm9yRG9tYWluLCBpbmRleFZhbHVlQWNjZXNzb3IpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGN1bGF0ZUxlZ2VuZChsZWZ0RmllbGQsIHJpZ2h0RmllbGQpIHtcbiAgICBjb25zdCBsaW1pdE9mTnVtYmVyT2ZMZWdlbmRFbnRyaWVzID0gMjA7XG4gICAgY29uc3QgbGVmdFZhbHVlcyA9IHRoaXMuZGF0YUNvbnRhaW5lci5tYXBJbmRleChsZWZ0RmllbGQudmFsdWVBY2Nlc3Nvcik7XG4gICAgY29uc3QgcmlnaHRWYWx1ZXMgPSB0aGlzLmRhdGFDb250YWluZXIubWFwSW5kZXgocmlnaHRGaWVsZC52YWx1ZUFjY2Vzc29yKTtcblxuICAgIGNvbnN0IHBhaXJpbmcgPSBsZWZ0VmFsdWVzLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQsIGlkeCkgPT4ge1xuICAgICAgcHJldmlvdXMucHVzaChbY3VycmVudCwgcmlnaHRWYWx1ZXNbaWR4XV0pO1xuICAgICAgcmV0dXJuIHByZXZpb3VzO1xuICAgIH0sIFtdKTtcblxuICAgIHJldHVybiB1bmlxdWVTb3J0ZWRQYWlyQnlGcmVxdWVuY3kocGFpcmluZylcbiAgICAgIC5tYXAocm93ID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYWJlbDogcm93LmxlZnQsXG4gICAgICAgICAgY29sb3I6IGNoZWNrQ29sb3JPckZhbGxiYWNrKHJvdy5yaWdodClcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuc2xpY2UoMCwgbGltaXRPZk51bWJlck9mTGVnZW5kRW50cmllcyArIDEpOyAvLyBMaW1pdCB0byBsaW1pdE9mTnVtYmVyT2ZMZWdlbmRFbnRyaWVzICsgMSwgdGhlbiBsaW1pdCB0byBsaW1pdE9mTnVtYmVyT2ZMZWdlbmRFbnRyaWVzIGluIExlZ2VuZE1hbmFnZXJzXG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc2FtcGxlIG9mIHJvd3MgdG8gY2FsY3VsYXRlIGxheWVyIGJvdW5kYXJpZXNcbiAgICovXG4gIC8vIGdldFNhbXBsZURhdGEocm93cylcblxuICAvKipcbiAgICogUGFyc2UgY2VsbCB2YWx1ZSBiYXNlZCBvbiBjb2x1bW4gdHlwZSBhbmQgcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAqIFZhbHVlIHRoZSBmaWVsZCB2YWx1ZSwgdHlwZSB0aGUgZmllbGQgdHlwZVxuICAgKi9cbiAgLy8gcGFyc2VGaWVsZFZhbHVlKHZhbHVlLCB0eXBlKVxuXG4gIC8vIHNvcnREYXRhc2V0QnlDb2x1bW4oKVxuXG4gIC8qKlxuICAgKiBBc3NlcnQgd2hldGhlciBmaWVsZCBleGlzdFxuICAgKiBAcGFyYW0gZmllbGROYW1lXG4gICAqIEBwYXJhbSBjb25kaXRpb25cbiAgICovXG4gIF9hc3NldEZpZWxkKGZpZWxkTmFtZTogc3RyaW5nLCBjb25kaXRpb246IGFueSk6IHZvaWQge1xuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICBDb25zb2xlLmVycm9yKGAke2ZpZWxkTmFtZX0gZG9lc250IGV4aXN0IGluIGRhdGFzZXQgJHt0aGlzLmlkfWApO1xuICAgIH1cbiAgfVxufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TIChNQUlOTFkgRVhQT1JURUQgRk9SIFRFU1QuLi4pXG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVTdWZmaXhBbmREZWxpbWl0ZXJzKGxheWVyTmFtZSwgc3VmZml4KSB7XG4gIHJldHVybiBsYXllck5hbWVcbiAgICAucmVwbGFjZShuZXcgUmVnRXhwKHN1ZmZpeCwgJ2lnJyksICcnKVxuICAgIC5yZXBsYWNlKC9bXywuXSsvZywgJyAnKVxuICAgIC50cmltKCk7XG59XG5cbi8qKlxuICogRmluZCBwb2ludCBmaWVsZHMgcGFpcnMgZnJvbSBmaWVsZHNcbiAqXG4gKiBAcGFyYW0gZmllbGRzXG4gKiBAcmV0dXJucyBmb3VuZCBwb2ludCBmaWVsZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQb2ludEZpZWxkUGFpcnMoZmllbGRzOiBGaWVsZFtdKTogRmllbGRQYWlyW10ge1xuICBjb25zdCBhbGxOYW1lcyA9IGZpZWxkcy5tYXAoZiA9PiBmLm5hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgLy8gZ2V0IGxpc3Qgb2YgYWxsIGZpZWxkcyB3aXRoIG1hdGNoaW5nIHN1ZmZpeGVzXG4gIGNvbnN0IGFjYzogRmllbGRQYWlyW10gPSBbXTtcbiAgY29uc3QgcmVzdWx0ID0gYWxsTmFtZXMucmVkdWNlKChjYXJyeSwgZmllbGROYW1lLCBpZHgpID0+IHtcbiAgICAvLyBUaGlzIHNlYXJjaCBmb3IgcGFpcnMgd2lsbCBlYXJseSBleGl0IGlmIGZvdW5kLlxuICAgIGZvciAoY29uc3Qgc3VmZml4UGFpciBvZiBUUklQX1BPSU5UX0ZJRUxEUykge1xuICAgICAgLy8gbWF0Y2ggZmlyc3Qgc3VmZml4YGBgXG4gICAgICBpZiAoZmllbGROYW1lLmVuZHNXaXRoKHN1ZmZpeFBhaXJbMF0pKSB7XG4gICAgICAgIC8vIG1hdGNoIHNlY29uZCBzdWZmaXhcbiAgICAgICAgY29uc3Qgb3RoZXJQYXR0ZXJuID0gbmV3IFJlZ0V4cChgJHtzdWZmaXhQYWlyWzBdfVxcJGApO1xuICAgICAgICBjb25zdCBwYXJ0bmVyID0gZmllbGROYW1lLnJlcGxhY2Uob3RoZXJQYXR0ZXJuLCBzdWZmaXhQYWlyWzFdKTtcblxuICAgICAgICBjb25zdCBwYXJ0bmVySWR4ID0gYWxsTmFtZXMuZmluZEluZGV4KGQgPT4gZCA9PT0gcGFydG5lcik7XG4gICAgICAgIGlmIChwYXJ0bmVySWR4ID4gLTEpIHtcbiAgICAgICAgICBjb25zdCBkZWZhdWx0TmFtZSA9IHJlbW92ZVN1ZmZpeEFuZERlbGltaXRlcnMoZmllbGROYW1lLCBzdWZmaXhQYWlyWzBdKTtcblxuICAgICAgICAgIGNhcnJ5LnB1c2goe1xuICAgICAgICAgICAgZGVmYXVsdE5hbWUsXG4gICAgICAgICAgICBwYWlyOiB7XG4gICAgICAgICAgICAgIGxhdDoge1xuICAgICAgICAgICAgICAgIGZpZWxkSWR4OiBpZHgsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpZWxkc1tpZHhdLm5hbWVcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbG5nOiB7XG4gICAgICAgICAgICAgICAgZmllbGRJZHg6IHBhcnRuZXJJZHgsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpZWxkc1twYXJ0bmVySWR4XS5uYW1lXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWZmaXg6IHN1ZmZpeFBhaXJcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gY2Fycnk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNhcnJ5O1xuICB9LCBhY2MpO1xuXG4gIC8vIHByaW9yaXRpemUgdGhlICdsYXRpdHVkZScvJ2xvbmdpdHVkZScgcGFpclxuICByZXN1bHQuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLmRlZmF1bHROYW1lID09PSAnJyAmJiBhLnN1ZmZpeFswXSA9PT0gJ2xhdGl0dWRlJykgcmV0dXJuIC0xO1xuICAgIGlmIChiLmRlZmF1bHROYW1lID09PSAnJyAmJiBiLnN1ZmZpeFswXSA9PT0gJ2xhdGl0dWRlJykgcmV0dXJuIDE7XG4gICAgcmV0dXJuIDA7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBkYXRhc2V0XG4gKiBAcGFyYW0gY29sdW1uXG4gKiBAcGFyYW0gbW9kZVxuICogQHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnREYXRhc2V0QnlDb2x1bW4oXG4gIGRhdGFzZXQ6IEtlcGxlclRhYmxlLFxuICBjb2x1bW46IHN0cmluZyxcbiAgbW9kZT86IHN0cmluZ1xuKTogS2VwbGVyVGFibGUge1xuICBjb25zdCB7YWxsSW5kZXhlcywgZmllbGRzLCBkYXRhQ29udGFpbmVyfSA9IGRhdGFzZXQ7XG4gIGNvbnN0IGZpZWxkSW5kZXggPSBmaWVsZHMuZmluZEluZGV4KGYgPT4gZi5uYW1lID09PSBjb2x1bW4pO1xuICBpZiAoZmllbGRJbmRleCA8IDApIHtcbiAgICByZXR1cm4gZGF0YXNldDtcbiAgfVxuXG4gIGNvbnN0IHNvcnRCeSA9IFNPUlRfT1JERVJbbW9kZSB8fCAnJ10gfHwgU09SVF9PUkRFUi5BU0NFTkRJTkc7XG5cbiAgaWYgKHNvcnRCeSA9PT0gU09SVF9PUkRFUi5VTlNPUlQpIHtcbiAgICBkYXRhc2V0LnNvcnRDb2x1bW4gPSB7fTtcbiAgICBkYXRhc2V0LnNvcnRPcmRlciA9IG51bGw7XG5cbiAgICByZXR1cm4gZGF0YXNldDtcbiAgfVxuXG4gIGNvbnN0IHNvcnRGdW5jdGlvbiA9IHNvcnRCeSA9PT0gU09SVF9PUkRFUi5BU0NFTkRJTkcgPyBhc2NlbmRpbmcgOiBkZXNjZW5kaW5nO1xuICBjb25zdCBzb3J0T3JkZXIgPSBhbGxJbmRleGVzXG4gICAgLnNsaWNlKClcbiAgICAuc29ydCgoYSwgYikgPT5cbiAgICAgIHNvcnRGdW5jdGlvbihkYXRhQ29udGFpbmVyLnZhbHVlQXQoYSwgZmllbGRJbmRleCksIGRhdGFDb250YWluZXIudmFsdWVBdChiLCBmaWVsZEluZGV4KSlcbiAgICApO1xuXG4gIGRhdGFzZXQuc29ydENvbHVtbiA9IHtcbiAgICBbY29sdW1uXTogc29ydEJ5XG4gIH07XG4gIGRhdGFzZXQuc29ydE9yZGVyID0gc29ydE9yZGVyO1xuXG4gIHJldHVybiBkYXRhc2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGluVGFibGVDb2x1bW5zKGRhdGFzZXQ6IEtlcGxlclRhYmxlLCBjb2x1bW46IHN0cmluZyk6IEtlcGxlclRhYmxlIHtcbiAgY29uc3QgZmllbGQgPSBkYXRhc2V0LmdldENvbHVtbkZpZWxkKGNvbHVtbik7XG4gIGlmICghZmllbGQpIHtcbiAgICByZXR1cm4gZGF0YXNldDtcbiAgfVxuXG4gIGxldCBwaW5uZWRDb2x1bW5zO1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhc2V0LnBpbm5lZENvbHVtbnMpICYmIGRhdGFzZXQucGlubmVkQ29sdW1ucy5pbmNsdWRlcyhmaWVsZC5uYW1lKSkge1xuICAgIC8vIHVucGluIGl0XG4gICAgcGlubmVkQ29sdW1ucyA9IGRhdGFzZXQucGlubmVkQ29sdW1ucy5maWx0ZXIoY28gPT4gY28gIT09IGZpZWxkLm5hbWUpO1xuICB9IGVsc2Uge1xuICAgIHBpbm5lZENvbHVtbnMgPSAoZGF0YXNldC5waW5uZWRDb2x1bW5zIHx8IFtdKS5jb25jYXQoZmllbGQubmFtZSk7XG4gIH1cblxuICAvLyBAdHMtaWdub3JlXG4gIHJldHVybiBjb3B5VGFibGVBbmRVcGRhdGUoZGF0YXNldCwge3Bpbm5lZENvbHVtbnN9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb3B5VGFibGU8VCBleHRlbmRzIHt9PihvcmlnaW5hbDogVCk6IFQge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihvcmlnaW5hbCkpLCBvcmlnaW5hbCk7XG59XG5cbi8qKlxuICogQHR5cGVcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5VGFibGVBbmRVcGRhdGU8VCBleHRlbmRzIHt9PihvcmlnaW5hbDogVCwgb3B0aW9uczogUGFydGlhbDxUPiA9IHt9KTogVCB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhvcHRpb25zKS5yZWR1Y2UoKGFjYywgZW50cnkpID0+IHtcbiAgICBhY2NbZW50cnlbMF1dID0gZW50cnlbMV07XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgY29weVRhYmxlKG9yaWdpbmFsKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEtlcGxlclRhYmxlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQW9CQSxJQUFBQSxRQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxnQkFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBR0EsSUFBQUcsTUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksZUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssWUFBQSxHQUFBTCxPQUFBO0FB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TUFBTSxDQUFDO0VBQzVDLElBQUksQ0FBQ2pJLEtBQUssRUFBRTtJQUNWLE9BQU9nSSxPQUFPO0VBQ2hCO0VBRUEsSUFBSWEsYUFBYTtFQUNqQixJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ2YsT0FBTyxDQUFDYSxhQUFhLENBQUMsSUFBSWIsT0FBTyxDQUFDYSxhQUFhLENBQUNHLFFBQVEsQ0FBQ2hKLEtBQUssQ0FBQ3BCLElBQUksQ0FBQyxFQUFFO0lBQ3RGO0lBQ0FpSyxhQUFhLEdBQUdiLE9BQU8sQ0FBQ2EsYUFBYSxDQUFDbkcsTUFBTSxDQUFDdUcsRUFBRSxJQUFJQSxFQUFFLEtBQUtqSixLQUFLLENBQUNwQixJQUFJLENBQUM7RUFDdkUsQ0FBQyxNQUFNO0lBQ0xpSyxhQUFhLEdBQUcsQ0FBQ2IsT0FBTyxDQUFDYSxhQUFhLElBQUksRUFBRSxFQUFFSyxNQUFNLENBQUNsSixLQUFLLENBQUNwQixJQUFJLENBQUM7RUFDbEU7O0VBRUE7RUFDQSxPQUFPdUssa0JBQWtCLENBQUNuQixPQUFPLEVBQUU7SUFBQ2E7RUFBYSxDQUFDLENBQUM7QUFDckQ7QUFDTyxTQUFTdkYsU0FBU0EsQ0FBZThGLFFBQVcsRUFBSztFQUN0RCxPQUFPeEksTUFBTSxDQUFDQyxNQUFNLENBQUNELE1BQU0sQ0FBQ3lJLE1BQU0sQ0FBQ3pJLE1BQU0sQ0FBQzBJLGNBQWMsQ0FBQ0YsUUFBUSxDQUFDLENBQUMsRUFBRUEsUUFBUSxDQUFDO0FBQ2hGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0Qsa0JBQWtCQSxDQUFlQyxRQUFXLEVBQStCO0VBQUEsSUFBN0JHLE9BQW1CLEdBQUFDLFNBQUEsQ0FBQTNILE1BQUEsUUFBQTJILFNBQUEsUUFBQUMsU0FBQSxHQUFBRCxTQUFBLE1BQUcsQ0FBQyxDQUFDO0VBQ3BGLE9BQU81SSxNQUFNLENBQUM4SSxPQUFPLENBQUNILE9BQU8sQ0FBQyxDQUFDL0csTUFBTSxDQUFDLENBQUNDLEdBQUcsRUFBRWtILEtBQUssS0FBSztJQUNwRGxILEdBQUcsQ0FBQ2tILEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHQSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE9BQU9sSCxHQUFHO0VBQ1osQ0FBQyxFQUFFYSxTQUFTLENBQUM4RixRQUFRLENBQUMsQ0FBQztBQUN6QjtBQUFDLElBQUFRLFFBQUEsR0FBQUMsT0FBQSxDQUFBL0wsT0FBQSxHQUVjVCxXQUFXIiwiaWdub3JlTGlzdCI6W119