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

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 (423) hide show
  1. package/dist/actions/action-wrapper.js +41 -36
  2. package/dist/actions/actions.js +21 -15
  3. package/dist/actions/identity-actions.js +20 -14
  4. package/dist/actions/index.js +16 -16
  5. package/dist/actions/map-state-actions.js +18 -12
  6. package/dist/actions/map-style-actions.js +46 -30
  7. package/dist/actions/provider-actions.js +73 -49
  8. package/dist/actions/ui-state-actions.js +113 -73
  9. package/dist/actions/vis-state-actions.js +148 -152
  10. package/dist/cloud-providers/index.js +7 -6
  11. package/dist/cloud-providers/provider.js +279 -189
  12. package/dist/components/bottom-widget.js +117 -105
  13. package/dist/components/common/action-panel.js +74 -122
  14. package/dist/components/common/animation-control/animation-control.js +54 -69
  15. package/dist/components/common/animation-control/animation-controller.js +160 -134
  16. package/dist/components/common/animation-control/animation-speed-slider.js +54 -47
  17. package/dist/components/common/animation-control/floating-time-display.js +100 -120
  18. package/dist/components/common/animation-control/playback-controls.js +144 -147
  19. package/dist/components/common/animation-control/speed-control.js +23 -31
  20. package/dist/components/common/checkbox.js +70 -56
  21. package/dist/components/common/color-legend.js +110 -83
  22. package/dist/components/common/data-table/button.js +23 -31
  23. package/dist/components/common/data-table/canvas.js +5 -11
  24. package/dist/components/common/data-table/cell-size.js +61 -51
  25. package/dist/components/common/data-table/grid.js +59 -40
  26. package/dist/components/common/data-table/index.js +348 -464
  27. package/dist/components/common/data-table/option-dropdown.js +33 -50
  28. package/dist/components/common/dataset-label.js +13 -17
  29. package/dist/components/common/error-boundary.js +45 -27
  30. package/dist/components/common/field-selector.js +139 -99
  31. package/dist/components/common/field-token.js +9 -24
  32. package/dist/components/common/file-uploader/file-drop.js +115 -96
  33. package/dist/components/common/file-uploader/file-upload-progress.js +45 -68
  34. package/dist/components/common/file-uploader/file-upload.js +187 -215
  35. package/dist/components/common/file-uploader/upload-button.js +22 -35
  36. package/dist/components/common/histogram-plot.js +58 -47
  37. package/dist/components/common/icons/add.js +27 -14
  38. package/dist/components/common/icons/anchor_window.js +18 -16
  39. package/dist/components/common/icons/arrow-down-alt.js +27 -14
  40. package/dist/components/common/icons/arrow-down-solid.js +27 -14
  41. package/dist/components/common/icons/arrow-down.js +27 -14
  42. package/dist/components/common/icons/arrow-left.js +30 -17
  43. package/dist/components/common/icons/arrow-right.js +27 -14
  44. package/dist/components/common/icons/arrow-up-alt.js +28 -15
  45. package/dist/components/common/icons/arrow-up-solid.js +27 -14
  46. package/dist/components/common/icons/arrow-up.js +27 -14
  47. package/dist/components/common/icons/base.js +57 -39
  48. package/dist/components/common/icons/bug.js +29 -16
  49. package/dist/components/common/icons/cancel.js +27 -14
  50. package/dist/components/common/icons/checkmark.js +31 -18
  51. package/dist/components/common/icons/chevron-right.js +33 -20
  52. package/dist/components/common/icons/clipboard.js +28 -15
  53. package/dist/components/common/icons/clock.js +29 -16
  54. package/dist/components/common/icons/close.js +32 -19
  55. package/dist/components/common/icons/code-alt.js +29 -16
  56. package/dist/components/common/icons/copy.js +31 -18
  57. package/dist/components/common/icons/crosshairs.js +29 -16
  58. package/dist/components/common/icons/cube-3d.js +31 -18
  59. package/dist/components/common/icons/cursor-click.js +31 -18
  60. package/dist/components/common/icons/data-table.js +28 -15
  61. package/dist/components/common/icons/db.js +28 -15
  62. package/dist/components/common/icons/delete.js +29 -16
  63. package/dist/components/common/icons/docs.js +43 -30
  64. package/dist/components/common/icons/drag-n-drop.js +29 -16
  65. package/dist/components/common/icons/draw-polygon.js +46 -33
  66. package/dist/components/common/icons/email.js +31 -18
  67. package/dist/components/common/icons/expand.js +29 -16
  68. package/dist/components/common/icons/eye-seen.js +29 -16
  69. package/dist/components/common/icons/eye-unseen.js +29 -16
  70. package/dist/components/common/icons/file-type.js +19 -35
  71. package/dist/components/common/icons/file.js +27 -14
  72. package/dist/components/common/icons/files.js +26 -14
  73. package/dist/components/common/icons/filter-funnel.js +27 -14
  74. package/dist/components/common/icons/free-window.js +18 -16
  75. package/dist/components/common/icons/gear.js +29 -16
  76. package/dist/components/common/icons/hash.js +27 -14
  77. package/dist/components/common/icons/histogram.js +27 -15
  78. package/dist/components/common/icons/index.js +156 -156
  79. package/dist/components/common/icons/info.js +38 -25
  80. package/dist/components/common/icons/layers.js +27 -14
  81. package/dist/components/common/icons/left-arrow.js +29 -16
  82. package/dist/components/common/icons/legend.js +27 -14
  83. package/dist/components/common/icons/line-chart.js +27 -14
  84. package/dist/components/common/icons/login.js +30 -17
  85. package/dist/components/common/icons/logout.js +29 -16
  86. package/dist/components/common/icons/map-icon.js +32 -18
  87. package/dist/components/common/icons/map.js +32 -18
  88. package/dist/components/common/icons/messages.js +27 -14
  89. package/dist/components/common/icons/minus.js +27 -14
  90. package/dist/components/common/icons/order-by-dataset.js +17 -15
  91. package/dist/components/common/icons/order-by-list.js +9 -7
  92. package/dist/components/common/icons/pause.js +27 -14
  93. package/dist/components/common/icons/picture.js +26 -14
  94. package/dist/components/common/icons/pin.js +30 -17
  95. package/dist/components/common/icons/play.js +27 -14
  96. package/dist/components/common/icons/polygon.js +48 -35
  97. package/dist/components/common/icons/rectangle.js +49 -36
  98. package/dist/components/common/icons/reduce.js +30 -17
  99. package/dist/components/common/icons/reset.js +27 -14
  100. package/dist/components/common/icons/rocket.js +27 -14
  101. package/dist/components/common/icons/save.js +29 -16
  102. package/dist/components/common/icons/save2.js +33 -20
  103. package/dist/components/common/icons/search.js +29 -16
  104. package/dist/components/common/icons/settings.js +29 -16
  105. package/dist/components/common/icons/share.js +27 -14
  106. package/dist/components/common/icons/split.js +55 -42
  107. package/dist/components/common/icons/square-select.js +29 -16
  108. package/dist/components/common/icons/swap-horizontal.js +31 -18
  109. package/dist/components/common/icons/table.js +27 -14
  110. package/dist/components/common/icons/trash.js +29 -16
  111. package/dist/components/common/icons/upload.js +27 -14
  112. package/dist/components/common/icons/vert-dots.js +65 -52
  113. package/dist/components/common/icons/vert-three-dots.js +40 -27
  114. package/dist/components/common/icons/warning.js +39 -26
  115. package/dist/components/common/image-preview.js +33 -71
  116. package/dist/components/common/info-helper.js +29 -36
  117. package/dist/components/common/item-selector/accessor.js +13 -7
  118. package/dist/components/common/item-selector/chickleted-input.js +56 -72
  119. package/dist/components/common/item-selector/dropdown-list.js +214 -182
  120. package/dist/components/common/item-selector/item-selector-submenu.js +55 -34
  121. package/dist/components/common/item-selector/item-selector.js +194 -183
  122. package/dist/components/common/item-selector/typeahead.js +248 -236
  123. package/dist/components/common/line-chart.js +58 -80
  124. package/dist/components/common/loading-spinner.js +31 -46
  125. package/dist/components/common/logo.js +48 -61
  126. package/dist/components/common/map-layer-selector.js +25 -31
  127. package/dist/components/common/modal.js +106 -167
  128. package/dist/components/common/portaled.js +189 -169
  129. package/dist/components/common/progress-bar.js +24 -27
  130. package/dist/components/common/range-brush.js +215 -176
  131. package/dist/components/common/range-plot.js +63 -52
  132. package/dist/components/common/range-slider.js +231 -206
  133. package/dist/components/common/slider/mouse-event.js +66 -59
  134. package/dist/components/common/slider/slider-bar-handle.js +61 -51
  135. package/dist/components/common/slider/slider-handle.js +102 -127
  136. package/dist/components/common/slider/slider.js +162 -143
  137. package/dist/components/common/styled-components.js +256 -518
  138. package/dist/components/common/switch.js +11 -11
  139. package/dist/components/common/time-range-slider-time-title.js +32 -49
  140. package/dist/components/common/time-range-slider.js +45 -56
  141. package/dist/components/common/time-slider-marker.js +52 -71
  142. package/dist/components/common/tippy-tooltip.js +59 -89
  143. package/dist/components/common/toolbar-item.js +45 -53
  144. package/dist/components/common/toolbar.js +18 -24
  145. package/dist/components/common/vertical-toolbar.js +6 -13
  146. package/dist/components/container.js +119 -87
  147. package/dist/components/context.js +8 -6
  148. package/dist/components/editor/constants.js +4 -4
  149. package/dist/components/editor/editor.js +157 -122
  150. package/dist/components/editor/feature-action-panel.js +59 -52
  151. package/dist/components/editor/feature-styles.js +29 -46
  152. package/dist/components/editor/handle-style.js +29 -38
  153. package/dist/components/filters/components.js +4 -8
  154. package/dist/components/filters/filter-panels/filter-panel-with-field-select.js +43 -33
  155. package/dist/components/filters/filter-panels/multi-select-filter-panel.js +21 -20
  156. package/dist/components/filters/filter-panels/new-filter-panel.js +31 -24
  157. package/dist/components/filters/filter-panels/polygon-filter-panel.js +31 -26
  158. package/dist/components/filters/filter-panels/range-filter-panel.js +21 -20
  159. package/dist/components/filters/filter-panels/single-select-filter-panel.js +21 -20
  160. package/dist/components/filters/filter-panels/time-range-filter-panel.js +31 -28
  161. package/dist/components/filters/index.js +10 -10
  162. package/dist/components/filters/multi-select-filter.js +9 -11
  163. package/dist/components/filters/polygon-filter.js +41 -26
  164. package/dist/components/filters/range-filter.js +7 -9
  165. package/dist/components/filters/single-select-filter.js +13 -11
  166. package/dist/components/filters/time-range-filter.js +14 -16
  167. package/dist/components/filters/time-widget.js +84 -125
  168. package/dist/components/geocoder/geocoder.js +177 -158
  169. package/dist/components/geocoder-panel.js +87 -66
  170. package/dist/components/index.js +329 -328
  171. package/dist/components/injector.js +63 -44
  172. package/dist/components/kepler-gl.js +361 -325
  173. package/dist/components/map/coordinate-info.js +16 -18
  174. package/dist/components/map/layer-hover-info.js +86 -108
  175. package/dist/components/map/layer-selector-panel.js +48 -50
  176. package/dist/components/map/locale-panel.js +44 -38
  177. package/dist/components/map/map-control-panel.js +47 -70
  178. package/dist/components/map/map-control-toolbar.js +6 -9
  179. package/dist/components/map/map-control-tooltip.js +8 -10
  180. package/dist/components/map/map-control.js +27 -35
  181. package/dist/components/map/map-draw-panel.js +48 -38
  182. package/dist/components/map/map-legend-panel.js +50 -47
  183. package/dist/components/map/map-legend.js +116 -133
  184. package/dist/components/map/map-popover.js +100 -155
  185. package/dist/components/map/split-map-button.js +34 -30
  186. package/dist/components/map/toggle-3d-button.js +27 -25
  187. package/dist/components/map-container.js +359 -313
  188. package/dist/components/maps-layout.js +26 -16
  189. package/dist/components/modal-container.js +355 -359
  190. package/dist/components/modals/add-map-style-modal.js +194 -233
  191. package/dist/components/modals/cloud-tile.js +67 -96
  192. package/dist/components/modals/data-table-modal.js +152 -155
  193. package/dist/components/modals/delete-data-modal.js +20 -20
  194. package/dist/components/modals/error-display.js +7 -9
  195. package/dist/components/modals/export-data-modal.js +140 -118
  196. package/dist/components/modals/export-image-modal.js +69 -82
  197. package/dist/components/modals/export-map-modal/components.js +18 -20
  198. package/dist/components/modals/export-map-modal/export-html-map.js +74 -82
  199. package/dist/components/modals/export-map-modal/export-json-map.js +45 -65
  200. package/dist/components/modals/export-map-modal/export-map-modal.js +47 -42
  201. package/dist/components/modals/image-modal-container.js +21 -20
  202. package/dist/components/modals/load-data-modal.js +30 -28
  203. package/dist/components/modals/load-storage-map.js +178 -277
  204. package/dist/components/modals/loading-dialog.js +19 -41
  205. package/dist/components/modals/modal-dialog.js +6 -4
  206. package/dist/components/modals/modal-tabs.js +48 -83
  207. package/dist/components/modals/overwrite-map-modal.js +30 -41
  208. package/dist/components/modals/provider-modal-container.js +42 -23
  209. package/dist/components/modals/save-map-modal.js +83 -107
  210. package/dist/components/modals/share-map-modal.js +95 -101
  211. package/dist/components/modals/status-panel.js +43 -63
  212. package/dist/components/modals/storage-map-viewer.js +70 -133
  213. package/dist/components/notification-panel/notification-item.js +97 -94
  214. package/dist/components/notification-panel.js +43 -35
  215. package/dist/components/performance.js +53 -49
  216. package/dist/components/plot-container.js +169 -151
  217. package/dist/components/side-panel/cloud-storage-dropdown.js +15 -13
  218. package/dist/components/side-panel/common/dataset-info.js +12 -16
  219. package/dist/components/side-panel/common/dataset-tag.js +27 -48
  220. package/dist/components/side-panel/common/dataset-title.js +116 -119
  221. package/dist/components/side-panel/common/source-data-catalog.js +32 -31
  222. package/dist/components/side-panel/common/source-data-selector.js +77 -52
  223. package/dist/components/side-panel/custom-panel.js +8 -6
  224. package/dist/components/side-panel/filter-manager.js +62 -48
  225. package/dist/components/side-panel/filter-panel/filter-panel-header.js +25 -35
  226. package/dist/components/side-panel/filter-panel/filter-panel.js +64 -46
  227. package/dist/components/side-panel/interaction-manager.js +18 -20
  228. package/dist/components/side-panel/interaction-panel/brush-config.js +17 -17
  229. package/dist/components/side-panel/interaction-panel/interaction-panel.js +95 -76
  230. package/dist/components/side-panel/interaction-panel/tooltip-config/tooltip-chicklet.js +143 -118
  231. package/dist/components/side-panel/interaction-panel/tooltip-config.js +76 -95
  232. package/dist/components/side-panel/layer-manager.js +115 -105
  233. package/dist/components/side-panel/layer-panel/add-layer-button.js +54 -92
  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 +37 -50
  236. package/dist/components/side-panel/layer-panel/color-range-selector.js +207 -196
  237. package/dist/components/side-panel/layer-panel/color-selector.js +110 -104
  238. package/dist/components/side-panel/layer-panel/column-selector.js +22 -34
  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 +205 -248
  241. package/dist/components/side-panel/layer-panel/custom-picker.js +69 -51
  242. package/dist/components/side-panel/layer-panel/dataset-layer-group.js +42 -37
  243. package/dist/components/side-panel/layer-panel/dataset-layer-section.js +27 -31
  244. package/dist/components/side-panel/layer-panel/dataset-section.js +35 -45
  245. package/dist/components/side-panel/layer-panel/dimension-scale-selector.js +13 -14
  246. package/dist/components/side-panel/layer-panel/hex-column-config.js +55 -32
  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 +46 -42
  249. package/dist/components/side-panel/layer-panel/layer-config-group.js +144 -178
  250. package/dist/components/side-panel/layer-panel/layer-configurator.js +830 -826
  251. package/dist/components/side-panel/layer-panel/layer-list.js +94 -101
  252. package/dist/components/side-panel/layer-panel/layer-panel-header.js +82 -124
  253. package/dist/components/side-panel/layer-panel/layer-panel.js +105 -111
  254. package/dist/components/side-panel/layer-panel/layer-type-dropdown-list.js +58 -67
  255. package/dist/components/side-panel/layer-panel/layer-type-list-item.js +32 -47
  256. package/dist/components/side-panel/layer-panel/layer-type-selector.js +41 -30
  257. package/dist/components/side-panel/layer-panel/layer-visibility-by-zoom.js +43 -42
  258. package/dist/components/side-panel/layer-panel/panel-view-list-toggle.js +57 -55
  259. package/dist/components/side-panel/layer-panel/single-color-palette.js +33 -48
  260. package/dist/components/side-panel/layer-panel/text-label-panel.js +116 -81
  261. package/dist/components/side-panel/layer-panel/vis-config-by-field-selector.js +102 -88
  262. package/dist/components/side-panel/layer-panel/vis-config-slider.js +85 -99
  263. package/dist/components/side-panel/layer-panel/vis-config-switch.js +29 -38
  264. package/dist/components/side-panel/map-manager.js +89 -70
  265. package/dist/components/side-panel/map-style-panel/map-layer-selector.js +60 -72
  266. package/dist/components/side-panel/map-style-panel/map-style-selector.js +42 -64
  267. package/dist/components/side-panel/panel-dropdown.js +37 -21
  268. package/dist/components/side-panel/panel-header-action.js +65 -60
  269. package/dist/components/side-panel/panel-header.js +184 -165
  270. package/dist/components/side-panel/panel-tab.js +29 -35
  271. package/dist/components/side-panel/panel-title.js +18 -15
  272. package/dist/components/side-panel/panel-toggle.js +31 -30
  273. package/dist/components/side-panel/side-bar.js +91 -100
  274. package/dist/components/side-panel.js +123 -108
  275. package/dist/connect/keplergl-connect.js +26 -17
  276. package/dist/connect/with-local-selector.js +63 -31
  277. package/dist/constants/action-types.js +115 -113
  278. package/dist/constants/color-palette.js +16 -14
  279. package/dist/constants/color-ranges.js +28 -23
  280. package/dist/constants/custom-color-ranges.js +12 -12
  281. package/dist/constants/default-settings.js +254 -323
  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 +5 -9
  286. package/dist/constants/user-guides.js +10 -10
  287. package/dist/deckgl-layers/3d-building-layer/3d-building-layer.js +63 -37
  288. package/dist/deckgl-layers/3d-building-layer/3d-building-utils.js +56 -52
  289. package/dist/deckgl-layers/cluster-layer/cluster-layer.js +168 -165
  290. package/dist/deckgl-layers/column-layer/enhanced-column-layer.js +43 -24
  291. package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +40 -27
  292. package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +40 -27
  293. package/dist/deckgl-layers/layer-utils/cluster-utils.js +68 -60
  294. package/dist/deckgl-layers/layer-utils/cpu-aggregator.js +282 -276
  295. package/dist/deckgl-layers/layer-utils/shader-utils.js +2 -2
  296. package/dist/deckgl-layers/line-layer/line-layer.js +70 -62
  297. package/dist/deckgl-layers/svg-icon-layer/scatterplot-icon-layer.js +51 -37
  298. package/dist/deckgl-layers/svg-icon-layer/svg-icon-layer.js +85 -65
  299. package/dist/index.js +16 -15
  300. package/dist/layers/aggregation-layer.js +331 -299
  301. package/dist/layers/arc-layer/arc-layer-icon.js +41 -27
  302. package/dist/layers/arc-layer/arc-layer.js +201 -174
  303. package/dist/layers/base-layer.js +1544 -1371
  304. package/dist/layers/cluster-layer/cluster-layer-icon.js +44 -30
  305. package/dist/layers/cluster-layer/cluster-layer.js +103 -89
  306. package/dist/layers/default-layer-icon.js +53 -39
  307. package/dist/layers/geojson-layer/geojson-layer-icon.js +55 -42
  308. package/dist/layers/geojson-layer/geojson-layer.js +353 -292
  309. package/dist/layers/geojson-layer/geojson-utils.js +36 -31
  310. package/dist/layers/grid-layer/grid-layer-icon.js +100 -87
  311. package/dist/layers/grid-layer/grid-layer.js +61 -51
  312. package/dist/layers/grid-layer/grid-utils.js +9 -13
  313. package/dist/layers/h3-hexagon-layer/h3-hexagon-layer-icon.js +35 -21
  314. package/dist/layers/h3-hexagon-layer/h3-hexagon-layer.js +260 -225
  315. package/dist/layers/h3-hexagon-layer/h3-utils.js +16 -16
  316. package/dist/layers/heatmap-layer/heatmap-layer-icon.js +52 -39
  317. package/dist/layers/heatmap-layer/heatmap-layer.js +171 -140
  318. package/dist/layers/hexagon-layer/hexagon-layer-icon.js +64 -51
  319. package/dist/layers/hexagon-layer/hexagon-layer.js +63 -49
  320. package/dist/layers/hexagon-layer/hexagon-utils.js +14 -15
  321. package/dist/layers/icon-layer/icon-info-modal.js +75 -82
  322. package/dist/layers/icon-layer/icon-layer-icon.js +37 -24
  323. package/dist/layers/icon-layer/icon-layer.js +303 -274
  324. package/dist/layers/index.js +29 -43
  325. package/dist/layers/layer-factory.js +41 -25
  326. package/dist/layers/layer-text-label.js +23 -21
  327. package/dist/layers/layer-update.js +18 -16
  328. package/dist/layers/line-layer/line-layer-icon.js +43 -30
  329. package/dist/layers/line-layer/line-layer.js +142 -123
  330. package/dist/layers/mapbox-utils.js +62 -61
  331. package/dist/layers/mapboxgl-layer.js +169 -124
  332. package/dist/layers/point-layer/point-layer-icon.js +59 -45
  333. package/dist/layers/point-layer/point-layer.js +386 -355
  334. package/dist/layers/s2-geometry-layer/s2-geometry-layer.js +238 -208
  335. package/dist/layers/s2-geometry-layer/s2-layer-icon.js +35 -21
  336. package/dist/layers/s2-geometry-layer/s2-utils.js +8 -9
  337. package/dist/layers/scenegraph-layer/scenegraph-info-modal.js +25 -24
  338. package/dist/layers/scenegraph-layer/scenegraph-layer-icon.js +115 -102
  339. package/dist/layers/scenegraph-layer/scenegraph-layer.js +172 -148
  340. package/dist/layers/trip-layer/trip-info-modal.js +30 -50
  341. package/dist/layers/trip-layer/trip-layer-icon.js +53 -40
  342. package/dist/layers/trip-layer/trip-layer.js +307 -239
  343. package/dist/layers/trip-layer/trip-utils.js +50 -34
  344. package/dist/layers/types.js +2 -2
  345. package/dist/localization/formatted-message.js +10 -8
  346. package/dist/localization/index.js +7 -7
  347. package/dist/localization/locales.js +9 -6
  348. package/dist/localization/messages.js +10 -13
  349. package/dist/localization/translations/ca.js +13 -11
  350. package/dist/localization/translations/cn.js +13 -11
  351. package/dist/localization/translations/en.js +13 -11
  352. package/dist/localization/translations/es.js +13 -11
  353. package/dist/localization/translations/fi.js +13 -11
  354. package/dist/localization/translations/ja.js +13 -11
  355. package/dist/localization/translations/pt.js +13 -11
  356. package/dist/localization/translations/ru.js +13 -11
  357. package/dist/middleware/index.js +5 -3
  358. package/dist/processors/data-processor.js +201 -164
  359. package/dist/processors/file-handler.js +233 -111
  360. package/dist/processors/index.js +4 -4
  361. package/dist/reducers/combined-updaters.js +41 -41
  362. package/dist/reducers/composer-helpers.js +45 -20
  363. package/dist/reducers/composers.js +8 -9
  364. package/dist/reducers/core.js +35 -31
  365. package/dist/reducers/index.js +22 -21
  366. package/dist/reducers/map-state-updaters.js +47 -65
  367. package/dist/reducers/map-state.js +15 -23
  368. package/dist/reducers/map-style-updaters.js +159 -233
  369. package/dist/reducers/map-style.js +16 -30
  370. package/dist/reducers/provider-state-updaters.js +229 -217
  371. package/dist/reducers/provider-state.js +17 -29
  372. package/dist/reducers/root.js +58 -86
  373. package/dist/reducers/ui-state-updaters.js +218 -337
  374. package/dist/reducers/ui-state.js +16 -45
  375. package/dist/reducers/vis-state-merger.js +209 -205
  376. package/dist/reducers/vis-state-selectors.js +19 -5
  377. package/dist/reducers/vis-state-updaters.js +876 -1003
  378. package/dist/reducers/vis-state.js +16 -75
  379. package/dist/schemas/dataset-schema.js +108 -84
  380. package/dist/schemas/index.js +29 -28
  381. package/dist/schemas/map-state-schema.js +18 -21
  382. package/dist/schemas/map-style-schema.js +55 -47
  383. package/dist/schemas/schema-manager.js +161 -147
  384. package/dist/schemas/schema-utils.js +9 -8
  385. package/dist/schemas/schema.js +87 -72
  386. package/dist/schemas/versions.js +3 -3
  387. package/dist/schemas/vis-state-schema.js +583 -441
  388. package/dist/styles/base.js +1021 -1217
  389. package/dist/styles/index.js +3 -3
  390. package/dist/styles/media-breakpoints.js +18 -23
  391. package/dist/tasks/tasks.js +39 -36
  392. package/dist/templates/export-map-html.js +4 -233
  393. package/dist/utils/aggregate-utils.js +16 -13
  394. package/dist/utils/color-utils.js +37 -29
  395. package/dist/utils/custom-scales.js +3 -3
  396. package/dist/utils/data-scale-utils.js +13 -6
  397. package/dist/utils/data-utils.js +83 -60
  398. package/dist/utils/dataset-utils.js +77 -48
  399. package/dist/utils/dom-to-image.js +163 -108
  400. package/dist/utils/dom-utils.js +105 -88
  401. package/dist/utils/export-utils.js +103 -116
  402. package/dist/utils/filter-utils.js +374 -379
  403. package/dist/utils/gl-utils.js +15 -16
  404. package/dist/utils/gpu-filter-utils.js +73 -54
  405. package/dist/utils/index.js +48 -47
  406. package/dist/utils/interaction-utils.js +46 -53
  407. package/dist/utils/layer-utils.js +78 -89
  408. package/dist/utils/locale-utils.js +16 -24
  409. package/dist/utils/map-style-utils/mapbox-gl-style-editor.js +76 -67
  410. package/dist/utils/map-style-utils/mapbox-utils.js +3 -4
  411. package/dist/utils/mapbox-utils.js +4 -3
  412. package/dist/utils/notifications-utils.js +38 -33
  413. package/dist/utils/observe-dimensions.js +54 -42
  414. package/dist/utils/projection-utils.js +11 -14
  415. package/dist/utils/split-map-utils.js +33 -30
  416. package/dist/utils/table-utils/data-container-utils.js +14 -15
  417. package/dist/utils/table-utils/data-row.js +65 -58
  418. package/dist/utils/table-utils/index.js +2 -2
  419. package/dist/utils/table-utils/indexed-data-container.js +173 -105
  420. package/dist/utils/table-utils/kepler-table.js +386 -362
  421. package/dist/utils/table-utils/row-data-container.js +164 -99
  422. package/dist/utils/utils.js +30 -29
  423. package/package.json +1 -1
@@ -22,6 +22,10 @@ exports.validateLayersByDatasets = validateLayersByDatasets;
22
22
  exports.validateSavedLayerColumns = validateSavedLayerColumns;
23
23
  exports.validateSavedTextLabel = validateSavedTextLabel;
24
24
  exports.validateSavedVisualChannels = validateSavedVisualChannels;
25
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
26
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
27
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
28
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
25
29
  var _uniq = _interopRequireDefault(require("lodash/uniq"));
26
30
  var _pick = _interopRequireDefault(require("lodash/pick"));
27
31
  var _flattenDeep = _interopRequireDefault(require("lodash/flattenDeep"));
@@ -31,7 +35,12 @@ var _splitMapUtils = require("../utils/split-map-utils");
31
35
  var _gpuFilterUtils = require("../utils/gpu-filter-utils");
32
36
  var _defaultSettings = require("../constants/default-settings");
33
37
  var _schemas = require("../schemas");
34
- // Copyright (c) 2022 Uber Technologies, Inc.
38
+ var _excluded = ["enabled"];
39
+ 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; } } }; }
40
+ 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; } }
41
+ 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; }
42
+ 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; }
43
+ 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.
35
44
  //
36
45
  // Permission is hereby granted, free of charge, to any person obtaining a copy
37
46
  // of this software and associated documentation files (the "Software"), to deal
@@ -50,7 +59,6 @@ var _schemas = require("../schemas");
50
59
  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
51
60
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
52
61
  // THE SOFTWARE.
53
-
54
62
  /**
55
63
  * Merge loaded filters with current state, if no fields or data are loaded
56
64
  * save it for later
@@ -60,46 +68,45 @@ function mergeFilters(state, filtersToMerge, fromConfig) {
60
68
  if (!Array.isArray(filtersToMerge) || !filtersToMerge.length) {
61
69
  return state;
62
70
  }
63
- const {
64
- validated,
65
- failed,
66
- updatedDatasets
67
- } = (0, _filterUtils.validateFiltersUpdateDatasets)(state, filtersToMerge);
71
+ var _validateFiltersUpdat = (0, _filterUtils.validateFiltersUpdateDatasets)(state, filtersToMerge),
72
+ validated = _validateFiltersUpdat.validated,
73
+ failed = _validateFiltersUpdat.failed,
74
+ updatedDatasets = _validateFiltersUpdat.updatedDatasets;
68
75
 
69
76
  // merge filter with existing
70
- let updatedFilters = [...(state.filters || []), ...validated];
77
+ var updatedFilters = [].concat((0, _toConsumableArray2["default"])(state.filters || []), (0, _toConsumableArray2["default"])(validated));
71
78
  updatedFilters = (0, _gpuFilterUtils.resetFilterGpuMode)(updatedFilters);
72
79
  updatedFilters = (0, _gpuFilterUtils.assignGpuChannels)(updatedFilters);
73
80
  // filter data
74
- const datasetsToFilter = (0, _uniq.default)((0, _flattenDeep.default)(validated.map(f => f.dataId)));
75
- const filtered = (0, _filterUtils.applyFiltersToDatasets)(datasetsToFilter, updatedDatasets, updatedFilters, state.layers);
76
- return {
77
- ...state,
81
+ var datasetsToFilter = (0, _uniq["default"])((0, _flattenDeep["default"])(validated.map(function (f) {
82
+ return f.dataId;
83
+ })));
84
+ var filtered = (0, _filterUtils.applyFiltersToDatasets)(datasetsToFilter, updatedDatasets, updatedFilters, state.layers);
85
+ return _objectSpread(_objectSpread({}, state), {}, {
78
86
  filters: updatedFilters,
79
87
  datasets: filtered,
80
- filterToBeMerged: [...state.filterToBeMerged, ...failed]
81
- };
88
+ filterToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.filterToBeMerged), (0, _toConsumableArray2["default"])(failed))
89
+ });
82
90
  }
83
91
  function createLayerFromConfig(state, layerConfig) {
84
92
  // first validate config against dataset
85
- const {
86
- validated,
87
- failed
88
- } = validateLayersByDatasets(state.datasets, state.layerClasses, [layerConfig]);
93
+ var _validateLayersByData = validateLayersByDatasets(state.datasets, state.layerClasses, [layerConfig]),
94
+ validated = _validateLayersByData.validated,
95
+ failed = _validateLayersByData.failed;
89
96
  if (failed !== null && failed !== void 0 && failed.length || !validated.length) {
90
97
  // failed
91
98
  return null;
92
99
  }
93
- const newLayer = validated[0];
100
+ var newLayer = validated[0];
94
101
  newLayer.updateLayerDomain(state.datasets);
95
102
  return newLayer;
96
103
  }
97
104
  function serializeLayer(newLayer) {
98
- const savedVisState = _schemas.visStateSchema[_schemas.CURRENT_VERSION].save({
105
+ var savedVisState = _schemas.visStateSchema[_schemas.CURRENT_VERSION].save({
99
106
  layers: [newLayer],
100
107
  layerOrder: [0]
101
108
  }).visState;
102
- const loadedLayer = _schemas.visStateSchema[_schemas.CURRENT_VERSION].load(savedVisState).visState.layers[0];
109
+ var loadedLayer = _schemas.visStateSchema[_schemas.CURRENT_VERSION].load(savedVisState).visState.layers[0];
103
110
  return loadedLayer;
104
111
  }
105
112
 
@@ -109,66 +116,80 @@ function serializeLayer(newLayer) {
109
116
  *
110
117
  */
111
118
  function mergeLayers(state) {
112
- let layersToMerge = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
113
- let fromConfig = arguments.length > 2 ? arguments[2] : undefined;
114
- const preserveLayerOrder = fromConfig ? layersToMerge.map(l => l.id) : state.preserveLayerOrder;
119
+ var layersToMerge = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
120
+ var fromConfig = arguments.length > 2 ? arguments[2] : undefined;
121
+ var preserveLayerOrder = fromConfig ? layersToMerge.map(function (l) {
122
+ return l.id;
123
+ }) : state.preserveLayerOrder;
115
124
  if (!Array.isArray(layersToMerge) || !layersToMerge.length) {
116
125
  return state;
117
126
  }
118
- const {
119
- validated: mergedLayer,
120
- failed: unmerged
121
- } = validateLayersByDatasets(state.datasets, state.layerClasses, layersToMerge);
127
+ var _validateLayersByData2 = validateLayersByDatasets(state.datasets, state.layerClasses, layersToMerge),
128
+ mergedLayer = _validateLayersByData2.validated,
129
+ unmerged = _validateLayersByData2.failed;
122
130
 
123
131
  // put new layers in front of current layers
124
- const {
125
- newLayerOrder,
126
- newLayers
127
- } = insertLayerAtRightOrder(state.layers, mergedLayer, state.layerOrder,
128
- // @ts-expect-error
129
- preserveLayerOrder);
130
- return {
131
- ...state,
132
+ var _insertLayerAtRightOr = insertLayerAtRightOrder(state.layers, mergedLayer, state.layerOrder,
133
+ // @ts-expect-error
134
+ preserveLayerOrder),
135
+ newLayerOrder = _insertLayerAtRightOr.newLayerOrder,
136
+ newLayers = _insertLayerAtRightOr.newLayers;
137
+ return _objectSpread(_objectSpread({}, state), {}, {
132
138
  layers: newLayers,
133
139
  layerOrder: newLayerOrder,
134
140
  // @ts-expect-error
135
- preserveLayerOrder,
136
- layerToBeMerged: [...state.layerToBeMerged, ...unmerged]
137
- };
141
+ preserveLayerOrder: preserveLayerOrder,
142
+ layerToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.layerToBeMerged), (0, _toConsumableArray2["default"])(unmerged))
143
+ });
138
144
  }
139
145
  function insertLayerAtRightOrder(currentLayers, layersToInsert, currentOrder) {
140
- let preservedOrder = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
146
+ var preservedOrder = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
141
147
  // perservedOrder ['a', 'b', 'c'];
142
148
  // layerOrder [1, 0, 3]
143
149
  // layerOrderMap ['a', 'c']
144
- let layerOrderQueue = currentOrder.map(i => currentLayers[i].id);
145
- let newLayers = currentLayers;
146
- for (const newLayer of layersToInsert) {
147
- // find where to insert it
148
- const expectedIdx = preservedOrder.indexOf(newLayer.id);
149
- // if cant find place to insert, insert at the font
150
- let insertAt = 0;
151
- if (expectedIdx > 0) {
152
- // look for layer to insert after
153
- let i = expectedIdx + 1;
154
- let preceedIdx = -1;
155
- while (i-- > 0 && preceedIdx === -1) {
156
- const preceedLayer = preservedOrder[i];
157
- preceedIdx = layerOrderQueue.indexOf(preceedLayer);
158
- }
159
- if (preceedIdx > -1) {
160
- insertAt = preceedIdx + 1;
150
+ var layerOrderQueue = currentOrder.map(function (i) {
151
+ return currentLayers[i].id;
152
+ });
153
+ var newLayers = currentLayers;
154
+ var _iterator = _createForOfIteratorHelper(layersToInsert),
155
+ _step;
156
+ try {
157
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
158
+ var newLayer = _step.value;
159
+ // find where to insert it
160
+ var expectedIdx = preservedOrder.indexOf(newLayer.id);
161
+ // if cant find place to insert, insert at the font
162
+ var insertAt = 0;
163
+ if (expectedIdx > 0) {
164
+ // look for layer to insert after
165
+ var i = expectedIdx + 1;
166
+ var preceedIdx = -1;
167
+ while (i-- > 0 && preceedIdx === -1) {
168
+ var preceedLayer = preservedOrder[i];
169
+ preceedIdx = layerOrderQueue.indexOf(preceedLayer);
170
+ }
171
+ if (preceedIdx > -1) {
172
+ insertAt = preceedIdx + 1;
173
+ }
161
174
  }
175
+ layerOrderQueue = (0, _utils.arrayInsert)(layerOrderQueue, insertAt, newLayer.id);
176
+ newLayers = newLayers.concat(newLayer);
162
177
  }
163
- layerOrderQueue = (0, _utils.arrayInsert)(layerOrderQueue, insertAt, newLayer.id);
164
- newLayers = newLayers.concat(newLayer);
165
- }
166
178
 
167
- // reconstruct layerOrder after insert
168
- const newLayerOrder = layerOrderQueue.map(id => newLayers.findIndex(l => l.id === id));
179
+ // reconstruct layerOrder after insert
180
+ } catch (err) {
181
+ _iterator.e(err);
182
+ } finally {
183
+ _iterator.f();
184
+ }
185
+ var newLayerOrder = layerOrderQueue.map(function (id) {
186
+ return newLayers.findIndex(function (l) {
187
+ return l.id === id;
188
+ });
189
+ });
169
190
  return {
170
- newLayerOrder,
171
- newLayers
191
+ newLayerOrder: newLayerOrder,
192
+ newLayers: newLayers
172
193
  };
173
194
  }
174
195
 
@@ -177,31 +198,26 @@ function insertLayerAtRightOrder(currentLayers, layersToInsert, currentOrder) {
177
198
  *
178
199
  */
179
200
  function mergeInteractions(state, interactionToBeMerged, fromConfig) {
180
- const merged = {};
181
- const unmerged = {};
201
+ var merged = {};
202
+ var unmerged = {};
182
203
  if (interactionToBeMerged) {
183
- Object.keys(interactionToBeMerged).forEach(key => {
204
+ Object.keys(interactionToBeMerged).forEach(function (key) {
184
205
  if (!state.interactionConfig[key]) {
185
206
  return;
186
207
  }
187
- const currentConfig = key === 'tooltip' || key === 'brush' ? state.interactionConfig[key].config : null;
188
- const {
189
- enabled,
190
- ...configSaved
191
- } = interactionToBeMerged[key] || {};
192
- let configToMerge = configSaved;
208
+ var currentConfig = key === 'tooltip' || key === 'brush' ? state.interactionConfig[key].config : null;
209
+ var _ref = interactionToBeMerged[key] || {},
210
+ enabled = _ref.enabled,
211
+ configSaved = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
212
+ var configToMerge = configSaved;
193
213
  if (key === 'tooltip') {
194
- const {
195
- mergedTooltip,
196
- unmergedTooltip
197
- } = mergeInteractionTooltipConfig(state, configSaved);
214
+ var _mergeInteractionTool = mergeInteractionTooltipConfig(state, configSaved),
215
+ mergedTooltip = _mergeInteractionTool.mergedTooltip,
216
+ unmergedTooltip = _mergeInteractionTool.unmergedTooltip;
198
217
 
199
218
  // merge new dataset tooltips with original dataset tooltips
200
219
  configToMerge = {
201
- fieldsToShow: {
202
- ...currentConfig.fieldsToShow,
203
- ...mergedTooltip
204
- }
220
+ fieldsToShow: _objectSpread(_objectSpread({}, currentConfig.fieldsToShow), mergedTooltip)
205
221
  };
206
222
  if (Object.keys(unmergedTooltip).length) {
207
223
  // @ts-expect-error
@@ -213,27 +229,18 @@ function mergeInteractions(state, interactionToBeMerged, fromConfig) {
213
229
  }
214
230
 
215
231
  // @ts-expect-error
216
- merged[key] = {
217
- ...state.interactionConfig[key],
218
- enabled: Boolean(enabled),
219
- ...(currentConfig ? {
220
- config: (0, _pick.default)({
221
- ...currentConfig,
222
- ...configToMerge
223
- }, Object.keys(currentConfig))
224
- } : {})
225
- };
232
+ merged[key] = _objectSpread(_objectSpread({}, state.interactionConfig[key]), {}, {
233
+ enabled: Boolean(enabled)
234
+ }, currentConfig ? {
235
+ config: (0, _pick["default"])(_objectSpread(_objectSpread({}, currentConfig), configToMerge), Object.keys(currentConfig))
236
+ } : {});
226
237
  });
227
238
  }
228
- return {
229
- ...state,
239
+ return _objectSpread(_objectSpread({}, state), {}, {
230
240
  // @ts-expect-error
231
- interactionConfig: {
232
- ...state.interactionConfig,
233
- ...merged
234
- },
241
+ interactionConfig: _objectSpread(_objectSpread({}, state.interactionConfig), merged),
235
242
  interactionToBeMerged: unmerged
236
- };
243
+ });
237
244
  }
238
245
 
239
246
  /**
@@ -244,31 +251,31 @@ function mergeInteractions(state, interactionToBeMerged, fromConfig) {
244
251
  * : add to splitMaps, and add current layers to splitMaps
245
252
  */
246
253
  function mergeSplitMaps(state) {
247
- let splitMaps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
248
- let fromConfig = arguments.length > 2 ? arguments[2] : undefined;
249
- const merged = [...state.splitMaps];
250
- const unmerged = [];
251
- splitMaps.forEach((sm, i) => {
252
- Object.entries(sm.layers).forEach(_ref => {
253
- let [id, value] = _ref;
254
+ var splitMaps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
255
+ var fromConfig = arguments.length > 2 ? arguments[2] : undefined;
256
+ var merged = (0, _toConsumableArray2["default"])(state.splitMaps);
257
+ var unmerged = [];
258
+ splitMaps.forEach(function (sm, i) {
259
+ Object.entries(sm.layers).forEach(function (_ref2) {
260
+ var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2),
261
+ id = _ref3[0],
262
+ value = _ref3[1];
254
263
  // check if layer exists
255
- const pushTo = state.layers.find(l => l.id === id) ? merged : unmerged;
264
+ var pushTo = state.layers.find(function (l) {
265
+ return l.id === id;
266
+ }) ? merged : unmerged;
256
267
 
257
268
  // create map panel if current map is not split
258
269
  pushTo[i] = pushTo[i] || {
259
270
  layers: pushTo === merged ? (0, _splitMapUtils.getInitialMapLayersForSplitMap)(state.layers) : []
260
271
  };
261
- pushTo[i].layers = {
262
- ...pushTo[i].layers,
263
- [id]: value
264
- };
272
+ pushTo[i].layers = _objectSpread(_objectSpread({}, pushTo[i].layers), {}, (0, _defineProperty2["default"])({}, id, value));
265
273
  });
266
274
  });
267
- return {
268
- ...state,
275
+ return _objectSpread(_objectSpread({}, state), {}, {
269
276
  splitMaps: merged,
270
- splitMapsToBeMerged: [...state.splitMapsToBeMerged, ...unmerged]
271
- };
277
+ splitMapsToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.splitMapsToBeMerged), unmerged)
278
+ });
272
279
  }
273
280
 
274
281
  /**
@@ -280,29 +287,36 @@ function mergeSplitMaps(state) {
280
287
  * @return - {mergedTooltip: {}, unmergedTooltip: {}}
281
288
  */
282
289
  function mergeInteractionTooltipConfig(state) {
283
- let tooltipConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
284
- const unmergedTooltip = {};
285
- const mergedTooltip = {};
290
+ var tooltipConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
291
+ var unmergedTooltip = {};
292
+ var mergedTooltip = {};
286
293
  if (!tooltipConfig || !tooltipConfig.fieldsToShow || !Object.keys(tooltipConfig.fieldsToShow).length) {
287
294
  return {
288
- mergedTooltip,
289
- unmergedTooltip
295
+ mergedTooltip: mergedTooltip,
296
+ unmergedTooltip: unmergedTooltip
290
297
  };
291
298
  }
292
- for (const dataId in tooltipConfig.fieldsToShow) {
299
+ var _loop = function _loop() {
293
300
  if (!state.datasets[dataId]) {
294
301
  // is not yet loaded
295
302
  unmergedTooltip[dataId] = tooltipConfig.fieldsToShow[dataId];
296
303
  } else {
297
304
  // if dataset is loaded
298
- const allFields = state.datasets[dataId].fields.map(d => d.name);
299
- const foundFieldsToShow = state.datasets[dataId].metadata.isDynamicSpatialIndex ? tooltipConfig.fieldsToShow[dataId] : tooltipConfig.fieldsToShow[dataId].filter(field => allFields.includes(field.name));
305
+ var allFields = state.datasets[dataId].fields.map(function (d) {
306
+ return d.name;
307
+ });
308
+ var foundFieldsToShow = state.datasets[dataId].metadata.isDynamicSpatialIndex ? tooltipConfig.fieldsToShow[dataId] : tooltipConfig.fieldsToShow[dataId].filter(function (field) {
309
+ return allFields.includes(field.name);
310
+ });
300
311
  mergedTooltip[dataId] = foundFieldsToShow;
301
312
  }
313
+ };
314
+ for (var dataId in tooltipConfig.fieldsToShow) {
315
+ _loop();
302
316
  }
303
317
  return {
304
- mergedTooltip,
305
- unmergedTooltip
318
+ mergedTooltip: mergedTooltip,
319
+ unmergedTooltip: unmergedTooltip
306
320
  };
307
321
  }
308
322
  /**
@@ -311,10 +325,9 @@ function mergeInteractionTooltipConfig(state) {
311
325
  */
312
326
  function mergeLayerBlending(state, layerBlending, fromConfig) {
313
327
  if (layerBlending && _defaultSettings.LAYER_BLENDINGS[layerBlending]) {
314
- return {
315
- ...state,
316
- layerBlending
317
- };
328
+ return _objectSpread(_objectSpread({}, state), {}, {
329
+ layerBlending: layerBlending
330
+ });
318
331
  }
319
332
  return state;
320
333
  }
@@ -324,14 +337,11 @@ function mergeLayerBlending(state, layerBlending, fromConfig) {
324
337
  */
325
338
  function mergeAnimationConfig(state, animation, fromConfig) {
326
339
  if (animation && animation.currentTime) {
327
- return {
328
- ...state,
329
- animationConfig: {
330
- ...state.animationConfig,
331
- ...animation,
340
+ return _objectSpread(_objectSpread({}, state), {}, {
341
+ animationConfig: _objectSpread(_objectSpread(_objectSpread({}, state.animationConfig), animation), {}, {
332
342
  domain: null
333
- }
334
- };
343
+ })
344
+ });
335
345
  }
336
346
  return state;
337
347
  }
@@ -347,20 +357,17 @@ function mergeAnimationConfig(state, animation, fromConfig) {
347
357
  */
348
358
 
349
359
  function validateSavedLayerColumns(fields) {
350
- let savedCols = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
351
- let emptyCols = arguments.length > 2 ? arguments[2] : undefined;
360
+ var savedCols = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
361
+ var emptyCols = arguments.length > 2 ? arguments[2] : undefined;
352
362
  // Prepare columns for the validator
353
- const columns = {};
354
- for (const key of Object.keys(emptyCols)) {
355
- columns[key] = {
356
- ...emptyCols[key]
357
- };
358
- const saved = savedCols[key];
363
+ var columns = {};
364
+ var _loop2 = function _loop2() {
365
+ var key = _Object$keys[_i];
366
+ columns[key] = _objectSpread({}, emptyCols[key]);
367
+ var saved = savedCols[key];
359
368
  if (saved) {
360
- const fieldIdx = fields.findIndex(_ref2 => {
361
- let {
362
- name
363
- } = _ref2;
369
+ var fieldIdx = fields.findIndex(function (_ref4) {
370
+ var name = _ref4.name;
364
371
  return name === saved;
365
372
  });
366
373
  if (fieldIdx > -1) {
@@ -369,10 +376,15 @@ function validateSavedLayerColumns(fields) {
369
376
  columns[key].value = saved;
370
377
  }
371
378
  }
379
+ };
380
+ for (var _i = 0, _Object$keys = Object.keys(emptyCols); _i < _Object$keys.length; _i++) {
381
+ _loop2();
372
382
  }
373
383
 
374
384
  // find actual column fieldIdx, in case it has changed
375
- const allColFound = Object.keys(columns).every(key => validateColumn(columns[key], columns, fields));
385
+ var allColFound = Object.keys(columns).every(function (key) {
386
+ return validateColumn(columns[key], columns, fields);
387
+ });
376
388
  if (allColFound) {
377
389
  return columns;
378
390
  }
@@ -396,17 +408,21 @@ function validateColumn(column, columns, allFields) {
396
408
  * @param {Object} savedTextLabel
397
409
  * @return {Object} - validated textlabel
398
410
  */
399
- function validateSavedTextLabel(fields, _ref3, savedTextLabel) {
400
- let [layerTextLabel] = _ref3;
401
- const savedTextLabels = Array.isArray(savedTextLabel) ? savedTextLabel : [savedTextLabel];
411
+ function validateSavedTextLabel(fields, _ref5, savedTextLabel) {
412
+ var _ref6 = (0, _slicedToArray2["default"])(_ref5, 1),
413
+ layerTextLabel = _ref6[0];
414
+ var savedTextLabels = Array.isArray(savedTextLabel) ? savedTextLabel : [savedTextLabel];
402
415
 
403
416
  // validate field
404
- return savedTextLabels.map(textLabel => {
405
- const field = textLabel.field ? fields.find(fd => Object.keys(textLabel.field).every(key => textLabel.field[key] === fd[key])) : null;
406
- return Object.keys(layerTextLabel).reduce((accu, key) => ({
407
- ...accu,
408
- [key]: key === 'field' ? field : textLabel[key] || layerTextLabel[key]
409
- }), {});
417
+ return savedTextLabels.map(function (textLabel) {
418
+ var field = textLabel.field ? fields.find(function (fd) {
419
+ return Object.keys(textLabel.field).every(function (key) {
420
+ return textLabel.field[key] === fd[key];
421
+ });
422
+ }) : null;
423
+ return Object.keys(layerTextLabel).reduce(function (accu, key) {
424
+ return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, key === 'field' ? field : textLabel[key] || layerTextLabel[key]));
425
+ }, {});
410
426
  });
411
427
  }
412
428
 
@@ -415,37 +431,29 @@ function validateSavedTextLabel(fields, _ref3, savedTextLabel) {
415
431
  * refer to vis-state-schema.js VisualChannelSchemaV1
416
432
  */
417
433
  function validateSavedVisualChannels(fields, newLayer, savedLayer) {
418
- Object.values(newLayer.visualChannels).forEach(_ref4 => {
419
- let {
420
- field,
421
- scale,
422
- key
423
- } = _ref4;
424
- let foundField;
425
- const colorFieldProps = {};
434
+ Object.values(newLayer.visualChannels).forEach(function (_ref7) {
435
+ var field = _ref7.field,
436
+ scale = _ref7.scale,
437
+ key = _ref7.key;
438
+ var foundField;
439
+ var colorFieldProps = {};
426
440
  if (savedLayer.config) {
427
441
  var _savedLayer$config$fi;
428
442
  if (savedLayer.config[field]) {
429
- foundField = fields.find(fd => savedLayer.config && fd.name === savedLayer.config[field].name);
443
+ foundField = fields.find(function (fd) {
444
+ return savedLayer.config && fd.name === savedLayer.config[field].name;
445
+ });
430
446
  }
431
447
  if ((_savedLayer$config$fi = savedLayer.config[field]) !== null && _savedLayer$config$fi !== void 0 && _savedLayer$config$fi.colorColumn) {
432
- const colorColumnField = fields.find(fd => savedLayer.config && fd.name === savedLayer.config[field].colorColumn);
448
+ var colorColumnField = fields.find(function (fd) {
449
+ return savedLayer.config && fd.name === savedLayer.config[field].colorColumn;
450
+ });
433
451
  if (colorColumnField) {
434
452
  colorFieldProps.colorColumn = colorColumnField.name;
435
453
  colorFieldProps.colorColumnIdx = colorColumnField.fieldIdx;
436
454
  }
437
455
  }
438
- const foundChannel = {
439
- ...(foundField ? {
440
- [field]: {
441
- ...foundField,
442
- ...colorFieldProps
443
- }
444
- } : {}),
445
- ...(savedLayer.config[scale] ? {
446
- [scale]: savedLayer.config[scale]
447
- } : {})
448
- };
456
+ var foundChannel = _objectSpread(_objectSpread({}, foundField ? (0, _defineProperty2["default"])({}, field, _objectSpread(_objectSpread({}, foundField), colorFieldProps)) : {}), savedLayer.config[scale] ? (0, _defineProperty2["default"])({}, scale, savedLayer.config[scale]) : {});
449
457
  if (Object.keys(foundChannel).length) {
450
458
  newLayer.updateLayerConfig(foundChannel);
451
459
  }
@@ -455,12 +463,12 @@ function validateSavedVisualChannels(fields, newLayer, savedLayer) {
455
463
  return newLayer;
456
464
  }
457
465
  function validateLayersByDatasets(datasets, layerClasses) {
458
- let layers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
459
- const validated = [];
460
- const failed = [];
461
- layers.forEach(layer => {
466
+ var layers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
467
+ var validated = [];
468
+ var failed = [];
469
+ layers.forEach(function (layer) {
462
470
  var _layer$config;
463
- let validateLayer = null;
471
+ var validateLayer = null;
464
472
  if (layer !== null && layer !== void 0 && (_layer$config = layer.config) !== null && _layer$config !== void 0 && _layer$config.dataId) {
465
473
  if (datasets[layer.config.dataId]) {
466
474
  // datasets are already loaded
@@ -475,30 +483,26 @@ function validateLayersByDatasets(datasets, layerClasses) {
475
483
  }
476
484
  });
477
485
  return {
478
- validated,
479
- failed
486
+ validated: validated,
487
+ failed: failed
480
488
  };
481
489
  }
482
490
  /**
483
491
  * Validate saved layer config with new data,
484
492
  * update fieldIdx based on new fields
485
493
  */
486
- function validateLayerWithData(_ref5, savedLayer, layerClasses) {
487
- let {
488
- fields,
489
- id: dataId
490
- } = _ref5;
491
- let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
492
- const {
493
- type
494
- } = savedLayer;
494
+ function validateLayerWithData(_ref10, savedLayer, layerClasses) {
495
+ var fields = _ref10.fields,
496
+ dataId = _ref10.id;
497
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
498
+ var type = savedLayer.type;
495
499
  // layer doesnt have a valid type
496
500
  if (!type || !layerClasses.hasOwnProperty(type) || !savedLayer.config) {
497
501
  return null;
498
502
  }
499
- let newLayer = new layerClasses[type]({
503
+ var newLayer = new layerClasses[type]({
500
504
  id: savedLayer.id,
501
- dataId,
505
+ dataId: dataId,
502
506
  label: savedLayer.config.label,
503
507
  color: savedLayer.config.color,
504
508
  isVisible: savedLayer.config.isVisible,
@@ -508,12 +512,12 @@ function validateLayerWithData(_ref5, savedLayer, layerClasses) {
508
512
  });
509
513
 
510
514
  // find column fieldIdx
511
- const columnConfig = newLayer.getLayerColumns();
515
+ var columnConfig = newLayer.getLayerColumns();
512
516
  if (Object.keys(columnConfig).length) {
513
- const columns = validateSavedLayerColumns(fields, savedLayer.config.columns, columnConfig);
517
+ var columns = validateSavedLayerColumns(fields, savedLayer.config.columns, columnConfig);
514
518
  if (columns) {
515
519
  newLayer.updateLayerConfig({
516
- columns
520
+ columns: columns
517
521
  });
518
522
  } else if (!options.allowEmptyColumn) {
519
523
  return null;
@@ -524,22 +528,22 @@ function validateLayerWithData(_ref5, savedLayer, layerClasses) {
524
528
  // find visual channel field by matching both name and type
525
529
  // refer to vis-state-schema.js VisualChannelSchemaV1
526
530
  newLayer = validateSavedVisualChannels(fields, newLayer, savedLayer);
527
- const textLabel = savedLayer.config.textLabel && newLayer.config.textLabel ? validateSavedTextLabel(fields, newLayer.config.textLabel, savedLayer.config.textLabel) : newLayer.config.textLabel;
531
+ var textLabel = savedLayer.config.textLabel && newLayer.config.textLabel ? validateSavedTextLabel(fields, newLayer.config.textLabel, savedLayer.config.textLabel) : newLayer.config.textLabel;
528
532
 
529
533
  // copy visConfig over to emptyLayer to make sure it has all the props
530
- const visConfig = newLayer.copyLayerConfig(newLayer.config.visConfig, savedLayer.config.visConfig || {}, {
534
+ var visConfig = newLayer.copyLayerConfig(newLayer.config.visConfig, savedLayer.config.visConfig || {}, {
531
535
  shallowCopy: ['colorRange', 'strokeColorRange']
532
536
  });
533
537
  newLayer.updateLayerConfig({
534
- visConfig,
535
- textLabel
538
+ visConfig: visConfig,
539
+ textLabel: textLabel
536
540
  });
537
541
  return newLayer;
538
542
  }
539
543
  function isValidMerger(merger) {
540
544
  return (0, _utils.isObject)(merger) && typeof merger.merge === 'function' && typeof merger.prop === 'string';
541
545
  }
542
- const VIS_STATE_MERGERS = exports.VIS_STATE_MERGERS = [{
546
+ var VIS_STATE_MERGERS = exports.VIS_STATE_MERGERS = [{
543
547
  merge: mergeLayers,
544
548
  prop: 'layers',
545
549
  toMergeProp: 'layerToBeMerged'
@@ -562,4 +566,4 @@ const VIS_STATE_MERGERS = exports.VIS_STATE_MERGERS = [{
562
566
  merge: mergeAnimationConfig,
563
567
  prop: 'animationConfig'
564
568
  }];
565
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdW5pcSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3BpY2siLCJfZmxhdHRlbkRlZXAiLCJfdXRpbHMiLCJfZmlsdGVyVXRpbHMiLCJfc3BsaXRNYXBVdGlscyIsIl9ncHVGaWx0ZXJVdGlscyIsIl9kZWZhdWx0U2V0dGluZ3MiLCJfc2NoZW1hcyIsIm1lcmdlRmlsdGVycyIsInN0YXRlIiwiZmlsdGVyc1RvTWVyZ2UiLCJmcm9tQ29uZmlnIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwidmFsaWRhdGVkIiwiZmFpbGVkIiwidXBkYXRlZERhdGFzZXRzIiwidmFsaWRhdGVGaWx0ZXJzVXBkYXRlRGF0YXNldHMiLCJ1cGRhdGVkRmlsdGVycyIsImZpbHRlcnMiLCJyZXNldEZpbHRlckdwdU1vZGUiLCJhc3NpZ25HcHVDaGFubmVscyIsImRhdGFzZXRzVG9GaWx0ZXIiLCJ1bmlxIiwiZmxhdHRlbkRlZXAiLCJtYXAiLCJmIiwiZGF0YUlkIiwiZmlsdGVyZWQiLCJhcHBseUZpbHRlcnNUb0RhdGFzZXRzIiwibGF5ZXJzIiwiZGF0YXNldHMiLCJmaWx0ZXJUb0JlTWVyZ2VkIiwiY3JlYXRlTGF5ZXJGcm9tQ29uZmlnIiwibGF5ZXJDb25maWciLCJ2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMiLCJsYXllckNsYXNzZXMiLCJuZXdMYXllciIsInVwZGF0ZUxheWVyRG9tYWluIiwic2VyaWFsaXplTGF5ZXIiLCJzYXZlZFZpc1N0YXRlIiwidmlzU3RhdGVTY2hlbWEiLCJDVVJSRU5UX1ZFUlNJT04iLCJzYXZlIiwibGF5ZXJPcmRlciIsInZpc1N0YXRlIiwibG9hZGVkTGF5ZXIiLCJsb2FkIiwibWVyZ2VMYXllcnMiLCJsYXllcnNUb01lcmdlIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwicHJlc2VydmVMYXllck9yZGVyIiwibCIsImlkIiwibWVyZ2VkTGF5ZXIiLCJ1bm1lcmdlZCIsIm5ld0xheWVyT3JkZXIiLCJuZXdMYXllcnMiLCJpbnNlcnRMYXllckF0UmlnaHRPcmRlciIsImxheWVyVG9CZU1lcmdlZCIsImN1cnJlbnRMYXllcnMiLCJsYXllcnNUb0luc2VydCIsImN1cnJlbnRPcmRlciIsInByZXNlcnZlZE9yZGVyIiwibGF5ZXJPcmRlclF1ZXVlIiwiaSIsImV4cGVjdGVkSWR4IiwiaW5kZXhPZiIsImluc2VydEF0IiwicHJlY2VlZElkeCIsInByZWNlZWRMYXllciIsImFycmF5SW5zZXJ0IiwiY29uY2F0IiwiZmluZEluZGV4IiwibWVyZ2VJbnRlcmFjdGlvbnMiLCJpbnRlcmFjdGlvblRvQmVNZXJnZWQiLCJtZXJnZWQiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsImludGVyYWN0aW9uQ29uZmlnIiwiY3VycmVudENvbmZpZyIsImNvbmZpZyIsImVuYWJsZWQiLCJjb25maWdTYXZlZCIsImNvbmZpZ1RvTWVyZ2UiLCJtZXJnZWRUb29sdGlwIiwidW5tZXJnZWRUb29sdGlwIiwibWVyZ2VJbnRlcmFjdGlvblRvb2x0aXBDb25maWciLCJmaWVsZHNUb1Nob3ciLCJ0b29sdGlwIiwiQm9vbGVhbiIsInBpY2siLCJtZXJnZVNwbGl0TWFwcyIsInNwbGl0TWFwcyIsInNtIiwiZW50cmllcyIsIl9yZWYiLCJ2YWx1ZSIsInB1c2hUbyIsImZpbmQiLCJnZXRJbml0aWFsTWFwTGF5ZXJzRm9yU3BsaXRNYXAiLCJzcGxpdE1hcHNUb0JlTWVyZ2VkIiwidG9vbHRpcENvbmZpZyIsImFsbEZpZWxkcyIsImZpZWxkcyIsImQiLCJuYW1lIiwiZm91bmRGaWVsZHNUb1Nob3ciLCJtZXRhZGF0YSIsImlzRHluYW1pY1NwYXRpYWxJbmRleCIsImZpbHRlciIsImZpZWxkIiwiaW5jbHVkZXMiLCJtZXJnZUxheWVyQmxlbmRpbmciLCJsYXllckJsZW5kaW5nIiwiTEFZRVJfQkxFTkRJTkdTIiwibWVyZ2VBbmltYXRpb25Db25maWciLCJhbmltYXRpb24iLCJjdXJyZW50VGltZSIsImFuaW1hdGlvbkNvbmZpZyIsImRvbWFpbiIsInZhbGlkYXRlU2F2ZWRMYXllckNvbHVtbnMiLCJzYXZlZENvbHMiLCJlbXB0eUNvbHMiLCJjb2x1bW5zIiwic2F2ZWQiLCJmaWVsZElkeCIsIl9yZWYyIiwiYWxsQ29sRm91bmQiLCJldmVyeSIsInZhbGlkYXRlQ29sdW1uIiwiY29sdW1uIiwib3B0aW9uYWwiLCJ2YWxpZGF0b3IiLCJ2YWxpZGF0ZVNhdmVkVGV4dExhYmVsIiwiX3JlZjMiLCJzYXZlZFRleHRMYWJlbCIsImxheWVyVGV4dExhYmVsIiwic2F2ZWRUZXh0TGFiZWxzIiwidGV4dExhYmVsIiwiZmQiLCJyZWR1Y2UiLCJhY2N1IiwidmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzIiwic2F2ZWRMYXllciIsInZhbHVlcyIsInZpc3VhbENoYW5uZWxzIiwiX3JlZjQiLCJzY2FsZSIsImZvdW5kRmllbGQiLCJjb2xvckZpZWxkUHJvcHMiLCJfc2F2ZWRMYXllciRjb25maWckZmkiLCJjb2xvckNvbHVtbiIsImNvbG9yQ29sdW1uRmllbGQiLCJjb2xvckNvbHVtbklkeCIsImZvdW5kQ2hhbm5lbCIsInVwZGF0ZUxheWVyQ29uZmlnIiwidmFsaWRhdGVWaXN1YWxDaGFubmVsIiwibGF5ZXIiLCJfbGF5ZXIkY29uZmlnIiwidmFsaWRhdGVMYXllciIsInZhbGlkYXRlTGF5ZXJXaXRoRGF0YSIsInB1c2giLCJfcmVmNSIsIm9wdGlvbnMiLCJ0eXBlIiwiaGFzT3duUHJvcGVydHkiLCJsYWJlbCIsImNvbG9yIiwiaXNWaXNpYmxlIiwiaGlkZGVuIiwiaGlnaGxpZ2h0Q29sb3IiLCJ2aXNpYmlsaXR5Qnlab29tIiwiY29sdW1uQ29uZmlnIiwiZ2V0TGF5ZXJDb2x1bW5zIiwiYWxsb3dFbXB0eUNvbHVtbiIsInZpc0NvbmZpZyIsImNvcHlMYXllckNvbmZpZyIsInNoYWxsb3dDb3B5IiwiaXNWYWxpZE1lcmdlciIsIm1lcmdlciIsImlzT2JqZWN0IiwibWVyZ2UiLCJwcm9wIiwiVklTX1NUQVRFX01FUkdFUlMiLCJleHBvcnRzIiwidG9NZXJnZVByb3AiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVkdWNlcnMvdmlzLXN0YXRlLW1lcmdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gvdW5pcSc7XG5pbXBvcnQgcGljayBmcm9tICdsb2Rhc2gvcGljayc7XG5pbXBvcnQgZmxhdHRlbkRlZXAgZnJvbSAnbG9kYXNoL2ZsYXR0ZW5EZWVwJztcbmltcG9ydCB7aXNPYmplY3QsIGFycmF5SW5zZXJ0fSBmcm9tICd1dGlscy91dGlscyc7XG5pbXBvcnQge2FwcGx5RmlsdGVyc1RvRGF0YXNldHMsIHZhbGlkYXRlRmlsdGVyc1VwZGF0ZURhdGFzZXRzfSBmcm9tICd1dGlscy9maWx0ZXItdXRpbHMnO1xuXG5pbXBvcnQge2dldEluaXRpYWxNYXBMYXllcnNGb3JTcGxpdE1hcH0gZnJvbSAndXRpbHMvc3BsaXQtbWFwLXV0aWxzJztcbmltcG9ydCB7cmVzZXRGaWx0ZXJHcHVNb2RlLCBhc3NpZ25HcHVDaGFubmVsc30gZnJvbSAndXRpbHMvZ3B1LWZpbHRlci11dGlscyc7XG5pbXBvcnQge0xBWUVSX0JMRU5ESU5HU30gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtDVVJSRU5UX1ZFUlNJT04sIHZpc1N0YXRlU2NoZW1hfSBmcm9tICdzY2hlbWFzJztcblxuaW1wb3J0IHtWaXNTdGF0ZSwgRGF0YXNldHN9IGZyb20gJy4vdmlzLXN0YXRlLXVwZGF0ZXJzJztcbmltcG9ydCB7S2VwbGVyVGFibGV9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7UGFyc2VkQ29uZmlnLCBQYXJzZWRMYXllcn0gZnJvbSAnc2NoZW1hcyc7XG5pbXBvcnQge0xheWVyLCBMYXllckNvbHVtbnMsIExheWVyQ29sdW1ufSBmcm9tICdsYXllcnMnO1xuaW1wb3J0IHtUb29sdGlwSW5mb30gZnJvbSAnLi92aXMtc3RhdGUtdXBkYXRlcnMnO1xuaW1wb3J0IHtTYXZlZEludGVyYWN0aW9uQ29uZmlnfSBmcm9tICdzY2hlbWFzL3NjaGVtYS1tYW5hZ2VyJztcblxuZXhwb3J0IHR5cGUgTWVyZ2VyID0ge1xuICBtZXJnZTogKHN0YXRlOiBWaXNTdGF0ZSwgY29uZmlnOiBhbnksIGZyb21Db25maWc/OiBib29sZWFuKSA9PiBWaXNTdGF0ZTtcbiAgcHJvcDogc3RyaW5nO1xuICB0b01lcmdlUHJvcD86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBWaXNTdGF0ZU1lcmdlcnMgPSBNZXJnZXJbXTtcblxuLyoqXG4gKiBNZXJnZSBsb2FkZWQgZmlsdGVycyB3aXRoIGN1cnJlbnQgc3RhdGUsIGlmIG5vIGZpZWxkcyBvciBkYXRhIGFyZSBsb2FkZWRcbiAqIHNhdmUgaXQgZm9yIGxhdGVyXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VGaWx0ZXJzKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGZpbHRlcnNUb01lcmdlOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydmaWx0ZXJzJ10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBWaXNTdGF0ZSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXJzVG9NZXJnZSkgfHwgIWZpbHRlcnNUb01lcmdlLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHt2YWxpZGF0ZWQsIGZhaWxlZCwgdXBkYXRlZERhdGFzZXRzfSA9IHZhbGlkYXRlRmlsdGVyc1VwZGF0ZURhdGFzZXRzKHN0YXRlLCBmaWx0ZXJzVG9NZXJnZSk7XG5cbiAgLy8gbWVyZ2UgZmlsdGVyIHdpdGggZXhpc3RpbmdcbiAgbGV0IHVwZGF0ZWRGaWx0ZXJzID0gWy4uLihzdGF0ZS5maWx0ZXJzIHx8IFtdKSwgLi4udmFsaWRhdGVkXTtcbiAgdXBkYXRlZEZpbHRlcnMgPSByZXNldEZpbHRlckdwdU1vZGUodXBkYXRlZEZpbHRlcnMpO1xuICB1cGRhdGVkRmlsdGVycyA9IGFzc2lnbkdwdUNoYW5uZWxzKHVwZGF0ZWRGaWx0ZXJzKTtcbiAgLy8gZmlsdGVyIGRhdGFcbiAgY29uc3QgZGF0YXNldHNUb0ZpbHRlciA9IHVuaXEoZmxhdHRlbkRlZXAodmFsaWRhdGVkLm1hcChmID0+IGYuZGF0YUlkKSkpO1xuXG4gIGNvbnN0IGZpbHRlcmVkID0gYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyhcbiAgICBkYXRhc2V0c1RvRmlsdGVyLFxuICAgIHVwZGF0ZWREYXRhc2V0cyxcbiAgICB1cGRhdGVkRmlsdGVycyxcbiAgICBzdGF0ZS5sYXllcnNcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGZpbHRlcnM6IHVwZGF0ZWRGaWx0ZXJzLFxuICAgIGRhdGFzZXRzOiBmaWx0ZXJlZCxcbiAgICBmaWx0ZXJUb0JlTWVyZ2VkOiBbLi4uc3RhdGUuZmlsdGVyVG9CZU1lcmdlZCwgLi4uZmFpbGVkXVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGF5ZXJGcm9tQ29uZmlnKHN0YXRlOiBWaXNTdGF0ZSwgbGF5ZXJDb25maWc6IGFueSk6IExheWVyIHwgbnVsbCB7XG4gIC8vIGZpcnN0IHZhbGlkYXRlIGNvbmZpZyBhZ2FpbnN0IGRhdGFzZXRcbiAgY29uc3Qge3ZhbGlkYXRlZCwgZmFpbGVkfSA9IHZhbGlkYXRlTGF5ZXJzQnlEYXRhc2V0cyhzdGF0ZS5kYXRhc2V0cywgc3RhdGUubGF5ZXJDbGFzc2VzLCBbXG4gICAgbGF5ZXJDb25maWdcbiAgXSk7XG5cbiAgaWYgKGZhaWxlZD8ubGVuZ3RoIHx8ICF2YWxpZGF0ZWQubGVuZ3RoKSB7XG4gICAgLy8gZmFpbGVkXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBuZXdMYXllciA9IHZhbGlkYXRlZFswXTtcbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJEb21haW4oc3RhdGUuZGF0YXNldHMpO1xuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVMYXllcihuZXdMYXllcik6IFBhcnNlZExheWVyIHtcbiAgY29uc3Qgc2F2ZWRWaXNTdGF0ZSA9IHZpc1N0YXRlU2NoZW1hW0NVUlJFTlRfVkVSU0lPTl0uc2F2ZSh7XG4gICAgbGF5ZXJzOiBbbmV3TGF5ZXJdLFxuICAgIGxheWVyT3JkZXI6IFswXVxuICB9KS52aXNTdGF0ZTtcbiAgY29uc3QgbG9hZGVkTGF5ZXIgPSB2aXNTdGF0ZVNjaGVtYVtDVVJSRU5UX1ZFUlNJT05dLmxvYWQoc2F2ZWRWaXNTdGF0ZSkudmlzU3RhdGUubGF5ZXJzWzBdO1xuICByZXR1cm4gbG9hZGVkTGF5ZXI7XG59XG5cbi8qKlxuICogTWVyZ2UgbGF5ZXJzIGZyb20gZGUtc2VyaWFsaXplZCBzdGF0ZSwgaWYgbm8gZmllbGRzIG9yIGRhdGEgYXJlIGxvYWRlZFxuICogc2F2ZSBpdCBmb3IgbGF0ZXJcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUxheWVycyhcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBsYXllcnNUb01lcmdlOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydsYXllcnMnXSA9IFtdLFxuICBmcm9tQ29uZmlnPzogYm9vbGVhblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBwcmVzZXJ2ZUxheWVyT3JkZXIgPSBmcm9tQ29uZmlnID8gbGF5ZXJzVG9NZXJnZS5tYXAobCA9PiBsLmlkKSA6IHN0YXRlLnByZXNlcnZlTGF5ZXJPcmRlcjtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkobGF5ZXJzVG9NZXJnZSkgfHwgIWxheWVyc1RvTWVyZ2UubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3Qge3ZhbGlkYXRlZDogbWVyZ2VkTGF5ZXIsIGZhaWxlZDogdW5tZXJnZWR9ID0gdmFsaWRhdGVMYXllcnNCeURhdGFzZXRzKFxuICAgIHN0YXRlLmRhdGFzZXRzLFxuICAgIHN0YXRlLmxheWVyQ2xhc3NlcyxcbiAgICBsYXllcnNUb01lcmdlXG4gICk7XG5cbiAgLy8gcHV0IG5ldyBsYXllcnMgaW4gZnJvbnQgb2YgY3VycmVudCBsYXllcnNcbiAgY29uc3Qge25ld0xheWVyT3JkZXIsIG5ld0xheWVyc30gPSBpbnNlcnRMYXllckF0UmlnaHRPcmRlcihcbiAgICBzdGF0ZS5sYXllcnMsXG4gICAgbWVyZ2VkTGF5ZXIsXG4gICAgc3RhdGUubGF5ZXJPcmRlcixcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgcHJlc2VydmVMYXllck9yZGVyXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IG5ld0xheWVycyxcbiAgICBsYXllck9yZGVyOiBuZXdMYXllck9yZGVyLFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBwcmVzZXJ2ZUxheWVyT3JkZXIsXG4gICAgbGF5ZXJUb0JlTWVyZ2VkOiBbLi4uc3RhdGUubGF5ZXJUb0JlTWVyZ2VkLCAuLi51bm1lcmdlZF1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExheWVyQXRSaWdodE9yZGVyKFxuICBjdXJyZW50TGF5ZXJzLFxuICBsYXllcnNUb0luc2VydCxcbiAgY3VycmVudE9yZGVyLFxuICBwcmVzZXJ2ZWRPcmRlcjogc3RyaW5nW10gPSBbXVxuKSB7XG4gIC8vIHBlcnNlcnZlZE9yZGVyIFsnYScsICdiJywgJ2MnXTtcbiAgLy8gbGF5ZXJPcmRlciBbMSwgMCwgM11cbiAgLy8gbGF5ZXJPcmRlck1hcCBbJ2EnLCAnYyddXG4gIGxldCBsYXllck9yZGVyUXVldWUgPSBjdXJyZW50T3JkZXIubWFwKGkgPT4gY3VycmVudExheWVyc1tpXS5pZCk7XG4gIGxldCBuZXdMYXllcnMgPSBjdXJyZW50TGF5ZXJzO1xuXG4gIGZvciAoY29uc3QgbmV3TGF5ZXIgb2YgbGF5ZXJzVG9JbnNlcnQpIHtcbiAgICAvLyBmaW5kIHdoZXJlIHRvIGluc2VydCBpdFxuICAgIGNvbnN0IGV4cGVjdGVkSWR4ID0gcHJlc2VydmVkT3JkZXIuaW5kZXhPZihuZXdMYXllci5pZCk7XG4gICAgLy8gaWYgY2FudCBmaW5kIHBsYWNlIHRvIGluc2VydCwgaW5zZXJ0IGF0IHRoZSBmb250XG4gICAgbGV0IGluc2VydEF0ID0gMDtcblxuICAgIGlmIChleHBlY3RlZElkeCA+IDApIHtcbiAgICAgIC8vIGxvb2sgZm9yIGxheWVyIHRvIGluc2VydCBhZnRlclxuICAgICAgbGV0IGkgPSBleHBlY3RlZElkeCArIDE7XG4gICAgICBsZXQgcHJlY2VlZElkeCA9IC0xO1xuICAgICAgd2hpbGUgKGktLSA+IDAgJiYgcHJlY2VlZElkeCA9PT0gLTEpIHtcbiAgICAgICAgY29uc3QgcHJlY2VlZExheWVyID0gcHJlc2VydmVkT3JkZXJbaV07XG4gICAgICAgIHByZWNlZWRJZHggPSBsYXllck9yZGVyUXVldWUuaW5kZXhPZihwcmVjZWVkTGF5ZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJlY2VlZElkeCA+IC0xKSB7XG4gICAgICAgIGluc2VydEF0ID0gcHJlY2VlZElkeCArIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGF5ZXJPcmRlclF1ZXVlID0gYXJyYXlJbnNlcnQobGF5ZXJPcmRlclF1ZXVlLCBpbnNlcnRBdCwgbmV3TGF5ZXIuaWQpO1xuICAgIG5ld0xheWVycyA9IG5ld0xheWVycy5jb25jYXQobmV3TGF5ZXIpO1xuICB9XG5cbiAgLy8gcmVjb25zdHJ1Y3QgbGF5ZXJPcmRlciBhZnRlciBpbnNlcnRcbiAgY29uc3QgbmV3TGF5ZXJPcmRlciA9IGxheWVyT3JkZXJRdWV1ZS5tYXAoaWQgPT4gbmV3TGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IGlkKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBuZXdMYXllck9yZGVyLFxuICAgIG5ld0xheWVyc1xuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGludGVyYWN0aW9ucyB3aXRoIHNhdmVkIGNvbmZpZ1xuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSW50ZXJhY3Rpb25zKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGludGVyYWN0aW9uVG9CZU1lcmdlZDogUGFydGlhbDxTYXZlZEludGVyYWN0aW9uQ29uZmlnPiB8IHVuZGVmaW5lZCxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgbWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG4gIGNvbnN0IHVubWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG5cbiAgaWYgKGludGVyYWN0aW9uVG9CZU1lcmdlZCkge1xuICAgIChPYmplY3Qua2V5cyhpbnRlcmFjdGlvblRvQmVNZXJnZWQpIGFzIEFycmF5PGtleW9mIFNhdmVkSW50ZXJhY3Rpb25Db25maWc+KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoIXN0YXRlLmludGVyYWN0aW9uQ29uZmlnW2tleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50Q29uZmlnID1cbiAgICAgICAga2V5ID09PSAndG9vbHRpcCcgfHwga2V5ID09PSAnYnJ1c2gnID8gc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XS5jb25maWcgOiBudWxsO1xuXG4gICAgICBjb25zdCB7ZW5hYmxlZCwgLi4uY29uZmlnU2F2ZWR9ID0gaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkW2tleV0gfHwge307XG5cbiAgICAgIGxldCBjb25maWdUb01lcmdlID0gY29uZmlnU2F2ZWQ7XG5cbiAgICAgIGlmIChrZXkgPT09ICd0b29sdGlwJykge1xuICAgICAgICBjb25zdCB7bWVyZ2VkVG9vbHRpcCwgdW5tZXJnZWRUb29sdGlwfSA9IG1lcmdlSW50ZXJhY3Rpb25Ub29sdGlwQ29uZmlnKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbmZpZ1NhdmVkIGFzIFNhdmVkSW50ZXJhY3Rpb25Db25maWdbJ3Rvb2x0aXAnXVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIG1lcmdlIG5ldyBkYXRhc2V0IHRvb2x0aXBzIHdpdGggb3JpZ2luYWwgZGF0YXNldCB0b29sdGlwc1xuICAgICAgICBjb25maWdUb01lcmdlID0ge1xuICAgICAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAgICAgLi4uKGN1cnJlbnRDb25maWcgYXMgVG9vbHRpcEluZm9bJ2NvbmZpZyddKS5maWVsZHNUb1Nob3csXG4gICAgICAgICAgICAuLi5tZXJnZWRUb29sdGlwXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh1bm1lcmdlZFRvb2x0aXApLmxlbmd0aCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICB1bm1lcmdlZC50b29sdGlwID0ge2ZpZWxkc1RvU2hvdzogdW5tZXJnZWRUb29sdGlwLCBlbmFibGVkOiBCb29sZWFuKGVuYWJsZWQpfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICBtZXJnZWRba2V5XSA9IHtcbiAgICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XSxcbiAgICAgICAgZW5hYmxlZDogQm9vbGVhbihlbmFibGVkKSxcbiAgICAgICAgLi4uKGN1cnJlbnRDb25maWdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgY29uZmlnOiBwaWNrKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAuLi5jb25maWdUb01lcmdlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjdXJyZW50Q29uZmlnKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSlcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBpbnRlcmFjdGlvbkNvbmZpZzoge1xuICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICAuLi5tZXJnZWRcbiAgICB9LFxuICAgIGludGVyYWN0aW9uVG9CZU1lcmdlZDogdW5tZXJnZWRcbiAgfTtcbn1cblxuLyoqXG4gKiBNZXJnZSBzcGxpdE1hcHMgY29uZmlnIHdpdGggY3VycmVudCB2aXNTdGV0ZS5cbiAqIDEuIGlmIGN1cnJlbnQgbWFwIGlzIHNwbGl0LCBidXQgc3BsaXRNYXAgRE9FU05PVCBjb250YWluIG1hcHNcbiAqICAgIDogZG9uJ3QgbWVyZ2UgYW55dGhpbmdcbiAqIDIuIGlmIGN1cnJlbnQgbWFwIGlzIE5PVCBzcGxpdCwgYnV0IHNwbGl0TWFwcyBjb250YWluIG1hcHNcbiAqICAgIDogYWRkIHRvIHNwbGl0TWFwcywgYW5kIGFkZCBjdXJyZW50IGxheWVycyB0byBzcGxpdE1hcHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlU3BsaXRNYXBzKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHNwbGl0TWFwczogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnc3BsaXRNYXBzJ10gPSBbXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgbWVyZ2VkID0gWy4uLnN0YXRlLnNwbGl0TWFwc107XG4gIGNvbnN0IHVubWVyZ2VkID0gW107XG4gIHNwbGl0TWFwcy5mb3JFYWNoKChzbSwgaSkgPT4ge1xuICAgIE9iamVjdC5lbnRyaWVzKHNtLmxheWVycykuZm9yRWFjaCgoW2lkLCB2YWx1ZV0pID0+IHtcbiAgICAgIC8vIGNoZWNrIGlmIGxheWVyIGV4aXN0c1xuICAgICAgY29uc3QgcHVzaFRvID0gc3RhdGUubGF5ZXJzLmZpbmQobCA9PiBsLmlkID09PSBpZCkgPyBtZXJnZWQgOiB1bm1lcmdlZDtcblxuICAgICAgLy8gY3JlYXRlIG1hcCBwYW5lbCBpZiBjdXJyZW50IG1hcCBpcyBub3Qgc3BsaXRcbiAgICAgIHB1c2hUb1tpXSA9IHB1c2hUb1tpXSB8fCB7XG4gICAgICAgIGxheWVyczogcHVzaFRvID09PSBtZXJnZWQgPyBnZXRJbml0aWFsTWFwTGF5ZXJzRm9yU3BsaXRNYXAoc3RhdGUubGF5ZXJzKSA6IFtdXG4gICAgICB9O1xuICAgICAgcHVzaFRvW2ldLmxheWVycyA9IHtcbiAgICAgICAgLi4ucHVzaFRvW2ldLmxheWVycyxcbiAgICAgICAgW2lkXTogdmFsdWVcbiAgICAgIH07XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgc3BsaXRNYXBzOiBtZXJnZWQsXG4gICAgc3BsaXRNYXBzVG9CZU1lcmdlZDogWy4uLnN0YXRlLnNwbGl0TWFwc1RvQmVNZXJnZWQsIC4uLnVubWVyZ2VkXVxuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAgd2l0aCBzYXZlZCBjb25maWcsXG4gKiB2YWxpZGF0ZSBmaWVsZHNUb1Nob3dcbiAqXG4gKiBAcGFyYW0gc3RhdGVcbiAqIEBwYXJhbSB0b29sdGlwQ29uZmlnXG4gKiBAcmV0dXJuIC0ge21lcmdlZFRvb2x0aXA6IHt9LCB1bm1lcmdlZFRvb2x0aXA6IHt9fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VJbnRlcmFjdGlvblRvb2x0aXBDb25maWcoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgdG9vbHRpcENvbmZpZzogUGljazxUb29sdGlwSW5mb1snY29uZmlnJ10sICdmaWVsZHNUb1Nob3cnPiB8IG51bGwgPSBudWxsXG4pIHtcbiAgY29uc3QgdW5tZXJnZWRUb29sdGlwOiBUb29sdGlwSW5mb1snY29uZmlnJ11bJ2ZpZWxkc1RvU2hvdyddID0ge307XG4gIGNvbnN0IG1lcmdlZFRvb2x0aXA6IFRvb2x0aXBJbmZvWydjb25maWcnXVsnZmllbGRzVG9TaG93J10gPSB7fTtcblxuICBpZiAoXG4gICAgIXRvb2x0aXBDb25maWcgfHxcbiAgICAhdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cgfHxcbiAgICAhT2JqZWN0LmtleXModG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cpLmxlbmd0aFxuICApIHtcbiAgICByZXR1cm4ge21lcmdlZFRvb2x0aXAsIHVubWVyZ2VkVG9vbHRpcH07XG4gIH1cblxuICBmb3IgKGNvbnN0IGRhdGFJZCBpbiB0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvdykge1xuICAgIGlmICghc3RhdGUuZGF0YXNldHNbZGF0YUlkXSkge1xuICAgICAgLy8gaXMgbm90IHlldCBsb2FkZWRcbiAgICAgIHVubWVyZ2VkVG9vbHRpcFtkYXRhSWRdID0gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgZGF0YXNldCBpcyBsb2FkZWRcbiAgICAgIGNvbnN0IGFsbEZpZWxkcyA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF0uZmllbGRzLm1hcChkID0+IGQubmFtZSk7XG4gICAgICBjb25zdCBmb3VuZEZpZWxkc1RvU2hvdyA9IChzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLm1ldGFkYXRhIGFzIGFueSkuaXNEeW5hbWljU3BhdGlhbEluZGV4XG4gICAgICAgID8gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXVxuICAgICAgICA6IHRvb2x0aXBDb25maWcuZmllbGRzVG9TaG93W2RhdGFJZF0uZmlsdGVyKGZpZWxkID0+IGFsbEZpZWxkcy5pbmNsdWRlcyhmaWVsZC5uYW1lKSk7XG5cbiAgICAgIG1lcmdlZFRvb2x0aXBbZGF0YUlkXSA9IGZvdW5kRmllbGRzVG9TaG93O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7bWVyZ2VkVG9vbHRpcCwgdW5tZXJnZWRUb29sdGlwfTtcbn1cbi8qKlxuICogTWVyZ2UgbGF5ZXJCbGVuZGluZyB3aXRoIHNhdmVkXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMYXllckJsZW5kaW5nKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGxheWVyQmxlbmRpbmc6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVyQmxlbmRpbmcnXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFZpc1N0YXRlIHtcbiAgaWYgKGxheWVyQmxlbmRpbmcgJiYgTEFZRVJfQkxFTkRJTkdTW2xheWVyQmxlbmRpbmddKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbGF5ZXJCbGVuZGluZ1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogTWVyZ2UgYW5pbWF0aW9uIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VBbmltYXRpb25Db25maWcoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYW5pbWF0aW9uOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydhbmltYXRpb25Db25maWcnXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFZpc1N0YXRlIHtcbiAgaWYgKGFuaW1hdGlvbiAmJiBhbmltYXRpb24uY3VycmVudFRpbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgICAgICAuLi5hbmltYXRpb24sXG4gICAgICAgIGRvbWFpbjogbnVsbFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgbGF5ZXIgY29sdW1ucyB3aXRoIG5ldyBkYXRhLFxuICogdXBkYXRlIGZpZWxkSWR4IGJhc2VkIG9uIG5ldyBmaWVsZHNcbiAqXG4gKiBAcGFyYW0gZmllbGRzXG4gKiBAcGFyYW0gc2F2ZWRDb2xzXG4gKiBAcGFyYW0gZW1wdHlDb2xzXG4gKiBAcmV0dXJuIC0gdmFsaWRhdGVkIGNvbHVtbnMgb3IgbnVsbFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkTGF5ZXJDb2x1bW5zKFxuICBmaWVsZHM6IEtlcGxlclRhYmxlWydmaWVsZHMnXSxcbiAgc2F2ZWRDb2xzOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICB9ID0ge30sXG4gIGVtcHR5Q29sczogTGF5ZXJDb2x1bW5zXG4pIHtcbiAgLy8gUHJlcGFyZSBjb2x1bW5zIGZvciB0aGUgdmFsaWRhdG9yXG4gIGNvbnN0IGNvbHVtbnM6IHR5cGVvZiBlbXB0eUNvbHMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW1wdHlDb2xzKSkge1xuICAgIGNvbHVtbnNba2V5XSA9IHsuLi5lbXB0eUNvbHNba2V5XX07XG5cbiAgICBjb25zdCBzYXZlZCA9IHNhdmVkQ29sc1trZXldO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgY29uc3QgZmllbGRJZHggPSBmaWVsZHMuZmluZEluZGV4KCh7bmFtZX0pID0+IG5hbWUgPT09IHNhdmVkKTtcblxuICAgICAgaWYgKGZpZWxkSWR4ID4gLTEpIHtcbiAgICAgICAgLy8gdXBkYXRlIGZvdW5kIGNvbHVtbnNcbiAgICAgICAgY29sdW1uc1trZXldLmZpZWxkSWR4ID0gZmllbGRJZHg7XG4gICAgICAgIGNvbHVtbnNba2V5XS52YWx1ZSA9IHNhdmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmQgYWN0dWFsIGNvbHVtbiBmaWVsZElkeCwgaW4gY2FzZSBpdCBoYXMgY2hhbmdlZFxuICBjb25zdCBhbGxDb2xGb3VuZCA9IE9iamVjdC5rZXlzKGNvbHVtbnMpLmV2ZXJ5KGtleSA9PlxuICAgIHZhbGlkYXRlQ29sdW1uKGNvbHVtbnNba2V5XSwgY29sdW1ucywgZmllbGRzKVxuICApO1xuXG4gIGlmIChhbGxDb2xGb3VuZCkge1xuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNvbHVtbihcbiAgY29sdW1uOiBMYXllckNvbHVtbiAmIHt2YWxpZGF0b3I/OiB0eXBlb2YgdmFsaWRhdGVDb2x1bW59LFxuICBjb2x1bW5zOiBMYXllckNvbHVtbnMsXG4gIGFsbEZpZWxkczogS2VwbGVyVGFibGVbJ2ZpZWxkcyddXG4pOiBib29sZWFuIHtcbiAgaWYgKGNvbHVtbi5vcHRpb25hbCB8fCBjb2x1bW4udmFsdWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoY29sdW1uLnZhbGlkYXRvcikge1xuICAgIHJldHVybiBjb2x1bW4udmFsaWRhdG9yKGNvbHVtbiwgY29sdW1ucywgYWxsRmllbGRzKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgdGV4dCBsYWJlbCBjb25maWcgd2l0aCBuZXcgZGF0YVxuICogcmVmZXIgdG8gdmlzLXN0YXRlLXNjaGVtYS5qcyBUZXh0TGFiZWxTY2hlbWFWMVxuICpcbiAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gZmllbGRzXG4gKiBAcGFyYW0ge09iamVjdH0gc2F2ZWRUZXh0TGFiZWxcbiAqIEByZXR1cm4ge09iamVjdH0gLSB2YWxpZGF0ZWQgdGV4dGxhYmVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkVGV4dExhYmVsKGZpZWxkcywgW2xheWVyVGV4dExhYmVsXSwgc2F2ZWRUZXh0TGFiZWwpIHtcbiAgY29uc3Qgc2F2ZWRUZXh0TGFiZWxzID0gQXJyYXkuaXNBcnJheShzYXZlZFRleHRMYWJlbCkgPyBzYXZlZFRleHRMYWJlbCA6IFtzYXZlZFRleHRMYWJlbF07XG5cbiAgLy8gdmFsaWRhdGUgZmllbGRcbiAgcmV0dXJuIHNhdmVkVGV4dExhYmVscy5tYXAodGV4dExhYmVsID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRleHRMYWJlbC5maWVsZFxuICAgICAgPyBmaWVsZHMuZmluZChmZCA9PlxuICAgICAgICAgIE9iamVjdC5rZXlzKHRleHRMYWJlbC5maWVsZCkuZXZlcnkoa2V5ID0+IHRleHRMYWJlbC5maWVsZFtrZXldID09PSBmZFtrZXldKVxuICAgICAgICApXG4gICAgICA6IG51bGw7XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMobGF5ZXJUZXh0TGFiZWwpLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiBrZXkgPT09ICdmaWVsZCcgPyBmaWVsZCA6IHRleHRMYWJlbFtrZXldIHx8IGxheWVyVGV4dExhYmVsW2tleV1cbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzYXZlZCB2aXN1YWwgY2hhbm5lbHMgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiByZWZlciB0byB2aXMtc3RhdGUtc2NoZW1hLmpzIFZpc3VhbENoYW5uZWxTY2hlbWFWMVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzKFxuICBmaWVsZHM6IEtlcGxlclRhYmxlWydmaWVsZHMnXSxcbiAgbmV3TGF5ZXI6IExheWVyLFxuICBzYXZlZExheWVyOiBQYXJzZWRMYXllclxuKTogbnVsbCB8IExheWVyIHtcbiAgT2JqZWN0LnZhbHVlcyhuZXdMYXllci52aXN1YWxDaGFubmVscykuZm9yRWFjaCgoe2ZpZWxkLCBzY2FsZSwga2V5fSkgPT4ge1xuICAgIGxldCBmb3VuZEZpZWxkO1xuICAgIGNvbnN0IGNvbG9yRmllbGRQcm9wcyA9IHt9O1xuICAgIGlmIChzYXZlZExheWVyLmNvbmZpZykge1xuICAgICAgaWYgKHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXSkge1xuICAgICAgICBmb3VuZEZpZWxkID0gZmllbGRzLmZpbmQoXG4gICAgICAgICAgZmQgPT4gc2F2ZWRMYXllci5jb25maWcgJiYgZmQubmFtZSA9PT0gc2F2ZWRMYXllci5jb25maWdbZmllbGRdLm5hbWVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXT8uY29sb3JDb2x1bW4pIHtcbiAgICAgICAgY29uc3QgY29sb3JDb2x1bW5GaWVsZCA9IGZpZWxkcy5maW5kKFxuICAgICAgICAgIGZkID0+IHNhdmVkTGF5ZXIuY29uZmlnICYmIGZkLm5hbWUgPT09IHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXS5jb2xvckNvbHVtblxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjb2xvckNvbHVtbkZpZWxkKSB7XG4gICAgICAgICAgKGNvbG9yRmllbGRQcm9wcyBhcyBhbnkpLmNvbG9yQ29sdW1uID0gY29sb3JDb2x1bW5GaWVsZC5uYW1lO1xuICAgICAgICAgIChjb2xvckZpZWxkUHJvcHMgYXMgYW55KS5jb2xvckNvbHVtbklkeCA9IGNvbG9yQ29sdW1uRmllbGQuZmllbGRJZHg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZm91bmRDaGFubmVsID0ge1xuICAgICAgICAuLi4oZm91bmRGaWVsZCA/IHtbZmllbGRdOiB7Li4uZm91bmRGaWVsZCwgLi4uY29sb3JGaWVsZFByb3BzfX0gOiB7fSksXG4gICAgICAgIC4uLihzYXZlZExheWVyLmNvbmZpZ1tzY2FsZV0gPyB7W3NjYWxlXTogc2F2ZWRMYXllci5jb25maWdbc2NhbGVdfSA6IHt9KVxuICAgICAgfTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhmb3VuZENoYW5uZWwpLmxlbmd0aCkge1xuICAgICAgICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyhmb3VuZENoYW5uZWwpO1xuICAgICAgfVxuXG4gICAgICBuZXdMYXllci52YWxpZGF0ZVZpc3VhbENoYW5uZWwoa2V5KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMoXG4gIGRhdGFzZXRzOiBEYXRhc2V0cyxcbiAgbGF5ZXJDbGFzc2VzOiBWaXNTdGF0ZVsnbGF5ZXJDbGFzc2VzJ10sXG4gIGxheWVyczogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJzJ10gPSBbXVxuKSB7XG4gIGNvbnN0IHZhbGlkYXRlZDogTGF5ZXJbXSA9IFtdO1xuICBjb25zdCBmYWlsZWQ6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVycyddID0gW107XG5cbiAgbGF5ZXJzLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgIGxldCB2YWxpZGF0ZUxheWVyOiBMYXllciB8IG51bGwgPSBudWxsO1xuXG4gICAgaWYgKGxheWVyPy5jb25maWc/LmRhdGFJZCkge1xuICAgICAgaWYgKGRhdGFzZXRzW2xheWVyLmNvbmZpZy5kYXRhSWRdKSB7XG4gICAgICAgIC8vIGRhdGFzZXRzIGFyZSBhbHJlYWR5IGxvYWRlZFxuICAgICAgICB2YWxpZGF0ZUxheWVyID0gdmFsaWRhdGVMYXllcldpdGhEYXRhKGRhdGFzZXRzW2xheWVyLmNvbmZpZy5kYXRhSWRdLCBsYXllciwgbGF5ZXJDbGFzc2VzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVMYXllcikge1xuICAgICAgdmFsaWRhdGVkLnB1c2godmFsaWRhdGVMYXllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRhdGFzZXRzIG5vdCB5ZXQgbG9hZGVkXG4gICAgICBmYWlsZWQucHVzaChsYXllcik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge3ZhbGlkYXRlZCwgZmFpbGVkfTtcbn1cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgbGF5ZXIgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiB1cGRhdGUgZmllbGRJZHggYmFzZWQgb24gbmV3IGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVMYXllcldpdGhEYXRhKFxuICB7ZmllbGRzLCBpZDogZGF0YUlkfTogS2VwbGVyVGFibGUsXG4gIHNhdmVkTGF5ZXI6IFBhcnNlZExheWVyLFxuICBsYXllckNsYXNzZXM6IFZpc1N0YXRlWydsYXllckNsYXNzZXMnXSxcbiAgb3B0aW9uczoge1xuICAgIGFsbG93RW1wdHlDb2x1bW4/OiBib29sZWFuO1xuICB9ID0ge31cbik6IExheWVyIHwgbnVsbCB7XG4gIGNvbnN0IHt0eXBlfSA9IHNhdmVkTGF5ZXI7XG4gIC8vIGxheWVyIGRvZXNudCBoYXZlIGEgdmFsaWQgdHlwZVxuICBpZiAoIXR5cGUgfHwgIWxheWVyQ2xhc3Nlcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSB8fCAhc2F2ZWRMYXllci5jb25maWcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBuZXdMYXllciA9IG5ldyBsYXllckNsYXNzZXNbdHlwZV0oe1xuICAgIGlkOiBzYXZlZExheWVyLmlkLFxuICAgIGRhdGFJZCxcbiAgICBsYWJlbDogc2F2ZWRMYXllci5jb25maWcubGFiZWwsXG4gICAgY29sb3I6IHNhdmVkTGF5ZXIuY29uZmlnLmNvbG9yLFxuICAgIGlzVmlzaWJsZTogc2F2ZWRMYXllci5jb25maWcuaXNWaXNpYmxlLFxuICAgIGhpZGRlbjogc2F2ZWRMYXllci5jb25maWcuaGlkZGVuLFxuICAgIGhpZ2hsaWdodENvbG9yOiBzYXZlZExheWVyLmNvbmZpZy5oaWdobGlnaHRDb2xvcixcbiAgICB2aXNpYmlsaXR5Qnlab29tOiAoc2F2ZWRMYXllci5jb25maWcgYXMgYW55KS52aXNpYmlsaXR5Qnlab29tIFxuICB9KTtcblxuICAvLyBmaW5kIGNvbHVtbiBmaWVsZElkeFxuICBjb25zdCBjb2x1bW5Db25maWcgPSBuZXdMYXllci5nZXRMYXllckNvbHVtbnMoKTtcbiAgaWYgKE9iamVjdC5rZXlzKGNvbHVtbkNvbmZpZykubGVuZ3RoKSB7XG4gICAgY29uc3QgY29sdW1ucyA9IHZhbGlkYXRlU2F2ZWRMYXllckNvbHVtbnMoZmllbGRzLCBzYXZlZExheWVyLmNvbmZpZy5jb2x1bW5zLCBjb2x1bW5Db25maWcpO1xuICAgIGlmIChjb2x1bW5zKSB7XG4gICAgICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyh7Y29sdW1uc30pO1xuICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMuYWxsb3dFbXB0eUNvbHVtbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gdmlzdWFsIGNoYW5uZWwgZmllbGQgaXMgc2F2ZWQgdG8gYmUge25hbWUsIHR5cGV9XG4gIC8vIGZpbmQgdmlzdWFsIGNoYW5uZWwgZmllbGQgYnkgbWF0Y2hpbmcgYm90aCBuYW1lIGFuZCB0eXBlXG4gIC8vIHJlZmVyIHRvIHZpcy1zdGF0ZS1zY2hlbWEuanMgVmlzdWFsQ2hhbm5lbFNjaGVtYVYxXG4gIG5ld0xheWVyID0gdmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzKGZpZWxkcywgbmV3TGF5ZXIsIHNhdmVkTGF5ZXIpO1xuXG4gIGNvbnN0IHRleHRMYWJlbCA9XG4gICAgc2F2ZWRMYXllci5jb25maWcudGV4dExhYmVsICYmIG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWxcbiAgICAgID8gdmFsaWRhdGVTYXZlZFRleHRMYWJlbChmaWVsZHMsIG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWwsIHNhdmVkTGF5ZXIuY29uZmlnLnRleHRMYWJlbClcbiAgICAgIDogbmV3TGF5ZXIuY29uZmlnLnRleHRMYWJlbDtcblxuICAvLyBjb3B5IHZpc0NvbmZpZyBvdmVyIHRvIGVtcHR5TGF5ZXIgdG8gbWFrZSBzdXJlIGl0IGhhcyBhbGwgdGhlIHByb3BzXG4gIGNvbnN0IHZpc0NvbmZpZyA9IG5ld0xheWVyLmNvcHlMYXllckNvbmZpZyhcbiAgICBuZXdMYXllci5jb25maWcudmlzQ29uZmlnLFxuICAgIHNhdmVkTGF5ZXIuY29uZmlnLnZpc0NvbmZpZyB8fCB7fSxcbiAgICB7c2hhbGxvd0NvcHk6IFsnY29sb3JSYW5nZScsICdzdHJva2VDb2xvclJhbmdlJ119XG4gICk7XG5cbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgIHZpc0NvbmZpZyxcbiAgICB0ZXh0TGFiZWxcbiAgfSk7XG5cbiAgcmV0dXJuIG5ld0xheWVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE1lcmdlcihtZXJnZXI6IE1lcmdlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNPYmplY3QobWVyZ2VyKSAmJiB0eXBlb2YgbWVyZ2VyLm1lcmdlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtZXJnZXIucHJvcCA9PT0gJ3N0cmluZyc7XG59XG5cbmV4cG9ydCBjb25zdCBWSVNfU1RBVEVfTUVSR0VSUzogVmlzU3RhdGVNZXJnZXJzID0gW1xuICB7bWVyZ2U6IG1lcmdlTGF5ZXJzLCBwcm9wOiAnbGF5ZXJzJywgdG9NZXJnZVByb3A6ICdsYXllclRvQmVNZXJnZWQnfSxcbiAge21lcmdlOiBtZXJnZUZpbHRlcnMsIHByb3A6ICdmaWx0ZXJzJywgdG9NZXJnZVByb3A6ICdmaWx0ZXJUb0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VJbnRlcmFjdGlvbnMsIHByb3A6ICdpbnRlcmFjdGlvbkNvbmZpZycsIHRvTWVyZ2VQcm9wOiAnaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VMYXllckJsZW5kaW5nLCBwcm9wOiAnbGF5ZXJCbGVuZGluZyd9LFxuICB7bWVyZ2U6IG1lcmdlU3BsaXRNYXBzLCBwcm9wOiAnc3BsaXRNYXBzJywgdG9NZXJnZVByb3A6ICdzcGxpdE1hcHNUb0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VBbmltYXRpb25Db25maWcsIHByb3A6ICdhbmltYXRpb25Db25maWcnfVxuXTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7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QzBELFNBQVMsSUFBSXpHLFFBQVEsQ0FBQytDLE1BQU0sQ0FBQzBELFNBQVMsR0FDcERMLHNCQUFzQixDQUFDOUIsTUFBTSxFQUFFdEUsUUFBUSxDQUFDK0MsTUFBTSxDQUFDMEQsU0FBUyxFQUFFSyxVQUFVLENBQUMvRCxNQUFNLENBQUMwRCxTQUFTLENBQUMsR0FDdEZ6RyxRQUFRLENBQUMrQyxNQUFNLENBQUMwRCxTQUFTOztFQUUvQjtFQUNBLE1BQU1xQyxTQUFTLEdBQUc5SSxRQUFRLENBQUMrSSxlQUFlLENBQ3hDL0ksUUFBUSxDQUFDK0MsTUFBTSxDQUFDK0YsU0FBUyxFQUN6QmhDLFVBQVUsQ0FBQy9ELE1BQU0sQ0FBQytGLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFDakM7SUFBQ0UsV0FBVyxFQUFFLENBQUMsWUFBWSxFQUFFLGtCQUFrQjtFQUFDLENBQ2xELENBQUM7RUFFRGhKLFFBQVEsQ0FBQzBILGlCQUFpQixDQUFDO0lBQ3pCb0IsU0FBUztJQUNUckM7RUFDRixDQUFDLENBQUM7RUFFRixPQUFPekcsUUFBUTtBQUNqQjtBQUVPLFNBQVNpSixhQUFhQSxDQUFDQyxNQUFjLEVBQVc7RUFDckQsT0FBTyxJQUFBQyxlQUFRLEVBQUNELE1BQU0sQ0FBQyxJQUFJLE9BQU9BLE1BQU0sQ0FBQ0UsS0FBSyxLQUFLLFVBQVUsSUFBSSxPQUFPRixNQUFNLENBQUNHLElBQUksS0FBSyxRQUFRO0FBQ2xHO0FBRU8sTUFBTUMsaUJBQWtDLEdBQUFDLE9BQUEsQ0FBQUQsaUJBQUEsR0FBRyxDQUNoRDtFQUFDRixLQUFLLEVBQUV6SSxXQUFXO0VBQUUwSSxJQUFJLEVBQUUsUUFBUTtFQUFFRyxXQUFXLEVBQUU7QUFBaUIsQ0FBQyxFQUNwRTtFQUFDSixLQUFLLEVBQUVsTCxZQUFZO0VBQUVtTCxJQUFJLEVBQUUsU0FBUztFQUFFRyxXQUFXLEVBQUU7QUFBa0IsQ0FBQyxFQUN2RTtFQUFDSixLQUFLLEVBQUU5RyxpQkFBaUI7RUFBRStHLElBQUksRUFBRSxtQkFBbUI7RUFBRUcsV0FBVyxFQUFFO0FBQXVCLENBQUMsRUFDM0Y7RUFBQ0osS0FBSyxFQUFFckUsa0JBQWtCO0VBQUVzRSxJQUFJLEVBQUU7QUFBZSxDQUFDLEVBQ2xEO0VBQUNELEtBQUssRUFBRTFGLGNBQWM7RUFBRTJGLElBQUksRUFBRSxXQUFXO0VBQUVHLFdBQVcsRUFBRTtBQUFxQixDQUFDLEVBQzlFO0VBQUNKLEtBQUssRUFBRWxFLG9CQUFvQjtFQUFFbUUsSUFBSSxFQUFFO0FBQWlCLENBQUMsQ0FDdkQiLCJpZ25vcmVMaXN0IjpbXX0=
569
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdW5pcSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3BpY2siLCJfZmxhdHRlbkRlZXAiLCJfdXRpbHMiLCJfZmlsdGVyVXRpbHMiLCJfc3BsaXRNYXBVdGlscyIsIl9ncHVGaWx0ZXJVdGlscyIsIl9kZWZhdWx0U2V0dGluZ3MiLCJfc2NoZW1hcyIsIl9leGNsdWRlZCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiciIsImUiLCJ0IiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJfbiIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImYiLCJUeXBlRXJyb3IiLCJvIiwiYSIsInUiLCJjYWxsIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0Iiwib3duS2V5cyIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIm1lcmdlRmlsdGVycyIsInN0YXRlIiwiZmlsdGVyc1RvTWVyZ2UiLCJmcm9tQ29uZmlnIiwiX3ZhbGlkYXRlRmlsdGVyc1VwZGF0IiwidmFsaWRhdGVGaWx0ZXJzVXBkYXRlRGF0YXNldHMiLCJ2YWxpZGF0ZWQiLCJmYWlsZWQiLCJ1cGRhdGVkRGF0YXNldHMiLCJ1cGRhdGVkRmlsdGVycyIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJmaWx0ZXJzIiwicmVzZXRGaWx0ZXJHcHVNb2RlIiwiYXNzaWduR3B1Q2hhbm5lbHMiLCJkYXRhc2V0c1RvRmlsdGVyIiwidW5pcSIsImZsYXR0ZW5EZWVwIiwibWFwIiwiZGF0YUlkIiwiZmlsdGVyZWQiLCJhcHBseUZpbHRlcnNUb0RhdGFzZXRzIiwibGF5ZXJzIiwiZGF0YXNldHMiLCJmaWx0ZXJUb0JlTWVyZ2VkIiwiY3JlYXRlTGF5ZXJGcm9tQ29uZmlnIiwibGF5ZXJDb25maWciLCJfdmFsaWRhdGVMYXllcnNCeURhdGEiLCJ2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMiLCJsYXllckNsYXNzZXMiLCJuZXdMYXllciIsInVwZGF0ZUxheWVyRG9tYWluIiwic2VyaWFsaXplTGF5ZXIiLCJzYXZlZFZpc1N0YXRlIiwidmlzU3RhdGVTY2hlbWEiLCJDVVJSRU5UX1ZFUlNJT04iLCJzYXZlIiwibGF5ZXJPcmRlciIsInZpc1N0YXRlIiwibG9hZGVkTGF5ZXIiLCJsb2FkIiwibWVyZ2VMYXllcnMiLCJsYXllcnNUb01lcmdlIiwidW5kZWZpbmVkIiwicHJlc2VydmVMYXllck9yZGVyIiwibCIsImlkIiwiX3ZhbGlkYXRlTGF5ZXJzQnlEYXRhMiIsIm1lcmdlZExheWVyIiwidW5tZXJnZWQiLCJfaW5zZXJ0TGF5ZXJBdFJpZ2h0T3IiLCJpbnNlcnRMYXllckF0UmlnaHRPcmRlciIsIm5ld0xheWVyT3JkZXIiLCJuZXdMYXllcnMiLCJsYXllclRvQmVNZXJnZWQiLCJjdXJyZW50TGF5ZXJzIiwibGF5ZXJzVG9JbnNlcnQiLCJjdXJyZW50T3JkZXIiLCJwcmVzZXJ2ZWRPcmRlciIsImxheWVyT3JkZXJRdWV1ZSIsImkiLCJfaXRlcmF0b3IiLCJfc3RlcCIsImV4cGVjdGVkSWR4IiwiaW5kZXhPZiIsImluc2VydEF0IiwicHJlY2VlZElkeCIsInByZWNlZWRMYXllciIsImFycmF5SW5zZXJ0IiwiZXJyIiwiZmluZEluZGV4IiwibWVyZ2VJbnRlcmFjdGlvbnMiLCJpbnRlcmFjdGlvblRvQmVNZXJnZWQiLCJtZXJnZWQiLCJrZXkiLCJpbnRlcmFjdGlvbkNvbmZpZyIsImN1cnJlbnRDb25maWciLCJjb25maWciLCJfcmVmIiwiZW5hYmxlZCIsImNvbmZpZ1NhdmVkIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImNvbmZpZ1RvTWVyZ2UiLCJfbWVyZ2VJbnRlcmFjdGlvblRvb2wiLCJtZXJnZUludGVyYWN0aW9uVG9vbHRpcENvbmZpZyIsIm1lcmdlZFRvb2x0aXAiLCJ1bm1lcmdlZFRvb2x0aXAiLCJmaWVsZHNUb1Nob3ciLCJ0b29sdGlwIiwiQm9vbGVhbiIsInBpY2siLCJtZXJnZVNwbGl0TWFwcyIsInNwbGl0TWFwcyIsInNtIiwiZW50cmllcyIsIl9yZWYyIiwiX3JlZjMiLCJfc2xpY2VkVG9BcnJheTIiLCJwdXNoVG8iLCJmaW5kIiwiZ2V0SW5pdGlhbE1hcExheWVyc0ZvclNwbGl0TWFwIiwic3BsaXRNYXBzVG9CZU1lcmdlZCIsInRvb2x0aXBDb25maWciLCJfbG9vcCIsImFsbEZpZWxkcyIsImZpZWxkcyIsImQiLCJmb3VuZEZpZWxkc1RvU2hvdyIsIm1ldGFkYXRhIiwiaXNEeW5hbWljU3BhdGlhbEluZGV4IiwiZmllbGQiLCJpbmNsdWRlcyIsIm1lcmdlTGF5ZXJCbGVuZGluZyIsImxheWVyQmxlbmRpbmciLCJMQVlFUl9CTEVORElOR1MiLCJtZXJnZUFuaW1hdGlvbkNvbmZpZyIsImFuaW1hdGlvbiIsImN1cnJlbnRUaW1lIiwiYW5pbWF0aW9uQ29uZmlnIiwiZG9tYWluIiwidmFsaWRhdGVTYXZlZExheWVyQ29sdW1ucyIsInNhdmVkQ29scyIsImVtcHR5Q29scyIsImNvbHVtbnMiLCJfbG9vcDIiLCJfT2JqZWN0JGtleXMiLCJfaSIsInNhdmVkIiwiZmllbGRJZHgiLCJfcmVmNCIsImFsbENvbEZvdW5kIiwiZXZlcnkiLCJ2YWxpZGF0ZUNvbHVtbiIsImNvbHVtbiIsIm9wdGlvbmFsIiwidmFsaWRhdG9yIiwidmFsaWRhdGVTYXZlZFRleHRMYWJlbCIsIl9yZWY1Iiwic2F2ZWRUZXh0TGFiZWwiLCJfcmVmNiIsImxheWVyVGV4dExhYmVsIiwic2F2ZWRUZXh0TGFiZWxzIiwidGV4dExhYmVsIiwiZmQiLCJyZWR1Y2UiLCJhY2N1IiwidmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzIiwic2F2ZWRMYXllciIsInZhbHVlcyIsInZpc3VhbENoYW5uZWxzIiwiX3JlZjciLCJzY2FsZSIsImZvdW5kRmllbGQiLCJjb2xvckZpZWxkUHJvcHMiLCJfc2F2ZWRMYXllciRjb25maWckZmkiLCJjb2xvckNvbHVtbiIsImNvbG9yQ29sdW1uRmllbGQiLCJjb2xvckNvbHVtbklkeCIsImZvdW5kQ2hhbm5lbCIsInVwZGF0ZUxheWVyQ29uZmlnIiwidmFsaWRhdGVWaXN1YWxDaGFubmVsIiwibGF5ZXIiLCJfbGF5ZXIkY29uZmlnIiwidmFsaWRhdGVMYXllciIsInZhbGlkYXRlTGF5ZXJXaXRoRGF0YSIsIl9yZWYxMCIsIm9wdGlvbnMiLCJ0eXBlIiwiaGFzT3duUHJvcGVydHkiLCJsYWJlbCIsImNvbG9yIiwiaXNWaXNpYmxlIiwiaGlkZGVuIiwiaGlnaGxpZ2h0Q29sb3IiLCJ2aXNpYmlsaXR5Qnlab29tIiwiY29sdW1uQ29uZmlnIiwiZ2V0TGF5ZXJDb2x1bW5zIiwiYWxsb3dFbXB0eUNvbHVtbiIsInZpc0NvbmZpZyIsImNvcHlMYXllckNvbmZpZyIsInNoYWxsb3dDb3B5IiwiaXNWYWxpZE1lcmdlciIsIm1lcmdlciIsImlzT2JqZWN0IiwibWVyZ2UiLCJwcm9wIiwiVklTX1NUQVRFX01FUkdFUlMiLCJleHBvcnRzIiwidG9NZXJnZVByb3AiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVkdWNlcnMvdmlzLXN0YXRlLW1lcmdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gvdW5pcSc7XG5pbXBvcnQgcGljayBmcm9tICdsb2Rhc2gvcGljayc7XG5pbXBvcnQgZmxhdHRlbkRlZXAgZnJvbSAnbG9kYXNoL2ZsYXR0ZW5EZWVwJztcbmltcG9ydCB7aXNPYmplY3QsIGFycmF5SW5zZXJ0fSBmcm9tICd1dGlscy91dGlscyc7XG5pbXBvcnQge2FwcGx5RmlsdGVyc1RvRGF0YXNldHMsIHZhbGlkYXRlRmlsdGVyc1VwZGF0ZURhdGFzZXRzfSBmcm9tICd1dGlscy9maWx0ZXItdXRpbHMnO1xuXG5pbXBvcnQge2dldEluaXRpYWxNYXBMYXllcnNGb3JTcGxpdE1hcH0gZnJvbSAndXRpbHMvc3BsaXQtbWFwLXV0aWxzJztcbmltcG9ydCB7cmVzZXRGaWx0ZXJHcHVNb2RlLCBhc3NpZ25HcHVDaGFubmVsc30gZnJvbSAndXRpbHMvZ3B1LWZpbHRlci11dGlscyc7XG5pbXBvcnQge0xBWUVSX0JMRU5ESU5HU30gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuaW1wb3J0IHtDVVJSRU5UX1ZFUlNJT04sIHZpc1N0YXRlU2NoZW1hfSBmcm9tICdzY2hlbWFzJztcblxuaW1wb3J0IHtWaXNTdGF0ZSwgRGF0YXNldHN9IGZyb20gJy4vdmlzLXN0YXRlLXVwZGF0ZXJzJztcbmltcG9ydCB7S2VwbGVyVGFibGV9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7UGFyc2VkQ29uZmlnLCBQYXJzZWRMYXllcn0gZnJvbSAnc2NoZW1hcyc7XG5pbXBvcnQge0xheWVyLCBMYXllckNvbHVtbnMsIExheWVyQ29sdW1ufSBmcm9tICdsYXllcnMnO1xuaW1wb3J0IHtUb29sdGlwSW5mb30gZnJvbSAnLi92aXMtc3RhdGUtdXBkYXRlcnMnO1xuaW1wb3J0IHtTYXZlZEludGVyYWN0aW9uQ29uZmlnfSBmcm9tICdzY2hlbWFzL3NjaGVtYS1tYW5hZ2VyJztcblxuZXhwb3J0IHR5cGUgTWVyZ2VyID0ge1xuICBtZXJnZTogKHN0YXRlOiBWaXNTdGF0ZSwgY29uZmlnOiBhbnksIGZyb21Db25maWc/OiBib29sZWFuKSA9PiBWaXNTdGF0ZTtcbiAgcHJvcDogc3RyaW5nO1xuICB0b01lcmdlUHJvcD86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBWaXNTdGF0ZU1lcmdlcnMgPSBNZXJnZXJbXTtcblxuLyoqXG4gKiBNZXJnZSBsb2FkZWQgZmlsdGVycyB3aXRoIGN1cnJlbnQgc3RhdGUsIGlmIG5vIGZpZWxkcyBvciBkYXRhIGFyZSBsb2FkZWRcbiAqIHNhdmUgaXQgZm9yIGxhdGVyXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VGaWx0ZXJzKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGZpbHRlcnNUb01lcmdlOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydmaWx0ZXJzJ10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBWaXNTdGF0ZSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShmaWx0ZXJzVG9NZXJnZSkgfHwgIWZpbHRlcnNUb01lcmdlLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHt2YWxpZGF0ZWQsIGZhaWxlZCwgdXBkYXRlZERhdGFzZXRzfSA9IHZhbGlkYXRlRmlsdGVyc1VwZGF0ZURhdGFzZXRzKHN0YXRlLCBmaWx0ZXJzVG9NZXJnZSk7XG5cbiAgLy8gbWVyZ2UgZmlsdGVyIHdpdGggZXhpc3RpbmdcbiAgbGV0IHVwZGF0ZWRGaWx0ZXJzID0gWy4uLihzdGF0ZS5maWx0ZXJzIHx8IFtdKSwgLi4udmFsaWRhdGVkXTtcbiAgdXBkYXRlZEZpbHRlcnMgPSByZXNldEZpbHRlckdwdU1vZGUodXBkYXRlZEZpbHRlcnMpO1xuICB1cGRhdGVkRmlsdGVycyA9IGFzc2lnbkdwdUNoYW5uZWxzKHVwZGF0ZWRGaWx0ZXJzKTtcbiAgLy8gZmlsdGVyIGRhdGFcbiAgY29uc3QgZGF0YXNldHNUb0ZpbHRlciA9IHVuaXEoZmxhdHRlbkRlZXAodmFsaWRhdGVkLm1hcChmID0+IGYuZGF0YUlkKSkpO1xuXG4gIGNvbnN0IGZpbHRlcmVkID0gYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyhcbiAgICBkYXRhc2V0c1RvRmlsdGVyLFxuICAgIHVwZGF0ZWREYXRhc2V0cyxcbiAgICB1cGRhdGVkRmlsdGVycyxcbiAgICBzdGF0ZS5sYXllcnNcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGZpbHRlcnM6IHVwZGF0ZWRGaWx0ZXJzLFxuICAgIGRhdGFzZXRzOiBmaWx0ZXJlZCxcbiAgICBmaWx0ZXJUb0JlTWVyZ2VkOiBbLi4uc3RhdGUuZmlsdGVyVG9CZU1lcmdlZCwgLi4uZmFpbGVkXVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGF5ZXJGcm9tQ29uZmlnKHN0YXRlOiBWaXNTdGF0ZSwgbGF5ZXJDb25maWc6IGFueSk6IExheWVyIHwgbnVsbCB7XG4gIC8vIGZpcnN0IHZhbGlkYXRlIGNvbmZpZyBhZ2FpbnN0IGRhdGFzZXRcbiAgY29uc3Qge3ZhbGlkYXRlZCwgZmFpbGVkfSA9IHZhbGlkYXRlTGF5ZXJzQnlEYXRhc2V0cyhzdGF0ZS5kYXRhc2V0cywgc3RhdGUubGF5ZXJDbGFzc2VzLCBbXG4gICAgbGF5ZXJDb25maWdcbiAgXSk7XG5cbiAgaWYgKGZhaWxlZD8ubGVuZ3RoIHx8ICF2YWxpZGF0ZWQubGVuZ3RoKSB7XG4gICAgLy8gZmFpbGVkXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBuZXdMYXllciA9IHZhbGlkYXRlZFswXTtcbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJEb21haW4oc3RhdGUuZGF0YXNldHMpO1xuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVMYXllcihuZXdMYXllcik6IFBhcnNlZExheWVyIHtcbiAgY29uc3Qgc2F2ZWRWaXNTdGF0ZSA9IHZpc1N0YXRlU2NoZW1hW0NVUlJFTlRfVkVSU0lPTl0uc2F2ZSh7XG4gICAgbGF5ZXJzOiBbbmV3TGF5ZXJdLFxuICAgIGxheWVyT3JkZXI6IFswXVxuICB9KS52aXNTdGF0ZTtcbiAgY29uc3QgbG9hZGVkTGF5ZXIgPSB2aXNTdGF0ZVNjaGVtYVtDVVJSRU5UX1ZFUlNJT05dLmxvYWQoc2F2ZWRWaXNTdGF0ZSkudmlzU3RhdGUubGF5ZXJzWzBdO1xuICByZXR1cm4gbG9hZGVkTGF5ZXI7XG59XG5cbi8qKlxuICogTWVyZ2UgbGF5ZXJzIGZyb20gZGUtc2VyaWFsaXplZCBzdGF0ZSwgaWYgbm8gZmllbGRzIG9yIGRhdGEgYXJlIGxvYWRlZFxuICogc2F2ZSBpdCBmb3IgbGF0ZXJcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUxheWVycyhcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBsYXllcnNUb01lcmdlOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydsYXllcnMnXSA9IFtdLFxuICBmcm9tQ29uZmlnPzogYm9vbGVhblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBwcmVzZXJ2ZUxheWVyT3JkZXIgPSBmcm9tQ29uZmlnID8gbGF5ZXJzVG9NZXJnZS5tYXAobCA9PiBsLmlkKSA6IHN0YXRlLnByZXNlcnZlTGF5ZXJPcmRlcjtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkobGF5ZXJzVG9NZXJnZSkgfHwgIWxheWVyc1RvTWVyZ2UubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3Qge3ZhbGlkYXRlZDogbWVyZ2VkTGF5ZXIsIGZhaWxlZDogdW5tZXJnZWR9ID0gdmFsaWRhdGVMYXllcnNCeURhdGFzZXRzKFxuICAgIHN0YXRlLmRhdGFzZXRzLFxuICAgIHN0YXRlLmxheWVyQ2xhc3NlcyxcbiAgICBsYXllcnNUb01lcmdlXG4gICk7XG5cbiAgLy8gcHV0IG5ldyBsYXllcnMgaW4gZnJvbnQgb2YgY3VycmVudCBsYXllcnNcbiAgY29uc3Qge25ld0xheWVyT3JkZXIsIG5ld0xheWVyc30gPSBpbnNlcnRMYXllckF0UmlnaHRPcmRlcihcbiAgICBzdGF0ZS5sYXllcnMsXG4gICAgbWVyZ2VkTGF5ZXIsXG4gICAgc3RhdGUubGF5ZXJPcmRlcixcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgcHJlc2VydmVMYXllck9yZGVyXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IG5ld0xheWVycyxcbiAgICBsYXllck9yZGVyOiBuZXdMYXllck9yZGVyLFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBwcmVzZXJ2ZUxheWVyT3JkZXIsXG4gICAgbGF5ZXJUb0JlTWVyZ2VkOiBbLi4uc3RhdGUubGF5ZXJUb0JlTWVyZ2VkLCAuLi51bm1lcmdlZF1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExheWVyQXRSaWdodE9yZGVyKFxuICBjdXJyZW50TGF5ZXJzLFxuICBsYXllcnNUb0luc2VydCxcbiAgY3VycmVudE9yZGVyLFxuICBwcmVzZXJ2ZWRPcmRlcjogc3RyaW5nW10gPSBbXVxuKSB7XG4gIC8vIHBlcnNlcnZlZE9yZGVyIFsnYScsICdiJywgJ2MnXTtcbiAgLy8gbGF5ZXJPcmRlciBbMSwgMCwgM11cbiAgLy8gbGF5ZXJPcmRlck1hcCBbJ2EnLCAnYyddXG4gIGxldCBsYXllck9yZGVyUXVldWUgPSBjdXJyZW50T3JkZXIubWFwKGkgPT4gY3VycmVudExheWVyc1tpXS5pZCk7XG4gIGxldCBuZXdMYXllcnMgPSBjdXJyZW50TGF5ZXJzO1xuXG4gIGZvciAoY29uc3QgbmV3TGF5ZXIgb2YgbGF5ZXJzVG9JbnNlcnQpIHtcbiAgICAvLyBmaW5kIHdoZXJlIHRvIGluc2VydCBpdFxuICAgIGNvbnN0IGV4cGVjdGVkSWR4ID0gcHJlc2VydmVkT3JkZXIuaW5kZXhPZihuZXdMYXllci5pZCk7XG4gICAgLy8gaWYgY2FudCBmaW5kIHBsYWNlIHRvIGluc2VydCwgaW5zZXJ0IGF0IHRoZSBmb250XG4gICAgbGV0IGluc2VydEF0ID0gMDtcblxuICAgIGlmIChleHBlY3RlZElkeCA+IDApIHtcbiAgICAgIC8vIGxvb2sgZm9yIGxheWVyIHRvIGluc2VydCBhZnRlclxuICAgICAgbGV0IGkgPSBleHBlY3RlZElkeCArIDE7XG4gICAgICBsZXQgcHJlY2VlZElkeCA9IC0xO1xuICAgICAgd2hpbGUgKGktLSA+IDAgJiYgcHJlY2VlZElkeCA9PT0gLTEpIHtcbiAgICAgICAgY29uc3QgcHJlY2VlZExheWVyID0gcHJlc2VydmVkT3JkZXJbaV07XG4gICAgICAgIHByZWNlZWRJZHggPSBsYXllck9yZGVyUXVldWUuaW5kZXhPZihwcmVjZWVkTGF5ZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJlY2VlZElkeCA+IC0xKSB7XG4gICAgICAgIGluc2VydEF0ID0gcHJlY2VlZElkeCArIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGF5ZXJPcmRlclF1ZXVlID0gYXJyYXlJbnNlcnQobGF5ZXJPcmRlclF1ZXVlLCBpbnNlcnRBdCwgbmV3TGF5ZXIuaWQpO1xuICAgIG5ld0xheWVycyA9IG5ld0xheWVycy5jb25jYXQobmV3TGF5ZXIpO1xuICB9XG5cbiAgLy8gcmVjb25zdHJ1Y3QgbGF5ZXJPcmRlciBhZnRlciBpbnNlcnRcbiAgY29uc3QgbmV3TGF5ZXJPcmRlciA9IGxheWVyT3JkZXJRdWV1ZS5tYXAoaWQgPT4gbmV3TGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IGlkKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBuZXdMYXllck9yZGVyLFxuICAgIG5ld0xheWVyc1xuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGludGVyYWN0aW9ucyB3aXRoIHNhdmVkIGNvbmZpZ1xuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSW50ZXJhY3Rpb25zKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGludGVyYWN0aW9uVG9CZU1lcmdlZDogUGFydGlhbDxTYXZlZEludGVyYWN0aW9uQ29uZmlnPiB8IHVuZGVmaW5lZCxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgbWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG4gIGNvbnN0IHVubWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG5cbiAgaWYgKGludGVyYWN0aW9uVG9CZU1lcmdlZCkge1xuICAgIChPYmplY3Qua2V5cyhpbnRlcmFjdGlvblRvQmVNZXJnZWQpIGFzIEFycmF5PGtleW9mIFNhdmVkSW50ZXJhY3Rpb25Db25maWc+KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoIXN0YXRlLmludGVyYWN0aW9uQ29uZmlnW2tleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50Q29uZmlnID1cbiAgICAgICAga2V5ID09PSAndG9vbHRpcCcgfHwga2V5ID09PSAnYnJ1c2gnID8gc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XS5jb25maWcgOiBudWxsO1xuXG4gICAgICBjb25zdCB7ZW5hYmxlZCwgLi4uY29uZmlnU2F2ZWR9ID0gaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkW2tleV0gfHwge307XG5cbiAgICAgIGxldCBjb25maWdUb01lcmdlID0gY29uZmlnU2F2ZWQ7XG5cbiAgICAgIGlmIChrZXkgPT09ICd0b29sdGlwJykge1xuICAgICAgICBjb25zdCB7bWVyZ2VkVG9vbHRpcCwgdW5tZXJnZWRUb29sdGlwfSA9IG1lcmdlSW50ZXJhY3Rpb25Ub29sdGlwQ29uZmlnKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbmZpZ1NhdmVkIGFzIFNhdmVkSW50ZXJhY3Rpb25Db25maWdbJ3Rvb2x0aXAnXVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIG1lcmdlIG5ldyBkYXRhc2V0IHRvb2x0aXBzIHdpdGggb3JpZ2luYWwgZGF0YXNldCB0b29sdGlwc1xuICAgICAgICBjb25maWdUb01lcmdlID0ge1xuICAgICAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAgICAgLi4uKGN1cnJlbnRDb25maWcgYXMgVG9vbHRpcEluZm9bJ2NvbmZpZyddKS5maWVsZHNUb1Nob3csXG4gICAgICAgICAgICAuLi5tZXJnZWRUb29sdGlwXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh1bm1lcmdlZFRvb2x0aXApLmxlbmd0aCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICB1bm1lcmdlZC50b29sdGlwID0ge2ZpZWxkc1RvU2hvdzogdW5tZXJnZWRUb29sdGlwLCBlbmFibGVkOiBCb29sZWFuKGVuYWJsZWQpfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICBtZXJnZWRba2V5XSA9IHtcbiAgICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XSxcbiAgICAgICAgZW5hYmxlZDogQm9vbGVhbihlbmFibGVkKSxcbiAgICAgICAgLi4uKGN1cnJlbnRDb25maWdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgY29uZmlnOiBwaWNrKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAuLi5jb25maWdUb01lcmdlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjdXJyZW50Q29uZmlnKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSlcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBpbnRlcmFjdGlvbkNvbmZpZzoge1xuICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICAuLi5tZXJnZWRcbiAgICB9LFxuICAgIGludGVyYWN0aW9uVG9CZU1lcmdlZDogdW5tZXJnZWRcbiAgfTtcbn1cblxuLyoqXG4gKiBNZXJnZSBzcGxpdE1hcHMgY29uZmlnIHdpdGggY3VycmVudCB2aXNTdGV0ZS5cbiAqIDEuIGlmIGN1cnJlbnQgbWFwIGlzIHNwbGl0LCBidXQgc3BsaXRNYXAgRE9FU05PVCBjb250YWluIG1hcHNcbiAqICAgIDogZG9uJ3QgbWVyZ2UgYW55dGhpbmdcbiAqIDIuIGlmIGN1cnJlbnQgbWFwIGlzIE5PVCBzcGxpdCwgYnV0IHNwbGl0TWFwcyBjb250YWluIG1hcHNcbiAqICAgIDogYWRkIHRvIHNwbGl0TWFwcywgYW5kIGFkZCBjdXJyZW50IGxheWVycyB0byBzcGxpdE1hcHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlU3BsaXRNYXBzKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHNwbGl0TWFwczogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnc3BsaXRNYXBzJ10gPSBbXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgbWVyZ2VkID0gWy4uLnN0YXRlLnNwbGl0TWFwc107XG4gIGNvbnN0IHVubWVyZ2VkID0gW107XG4gIHNwbGl0TWFwcy5mb3JFYWNoKChzbSwgaSkgPT4ge1xuICAgIE9iamVjdC5lbnRyaWVzKHNtLmxheWVycykuZm9yRWFjaCgoW2lkLCB2YWx1ZV0pID0+IHtcbiAgICAgIC8vIGNoZWNrIGlmIGxheWVyIGV4aXN0c1xuICAgICAgY29uc3QgcHVzaFRvID0gc3RhdGUubGF5ZXJzLmZpbmQobCA9PiBsLmlkID09PSBpZCkgPyBtZXJnZWQgOiB1bm1lcmdlZDtcblxuICAgICAgLy8gY3JlYXRlIG1hcCBwYW5lbCBpZiBjdXJyZW50IG1hcCBpcyBub3Qgc3BsaXRcbiAgICAgIHB1c2hUb1tpXSA9IHB1c2hUb1tpXSB8fCB7XG4gICAgICAgIGxheWVyczogcHVzaFRvID09PSBtZXJnZWQgPyBnZXRJbml0aWFsTWFwTGF5ZXJzRm9yU3BsaXRNYXAoc3RhdGUubGF5ZXJzKSA6IFtdXG4gICAgICB9O1xuICAgICAgcHVzaFRvW2ldLmxheWVycyA9IHtcbiAgICAgICAgLi4ucHVzaFRvW2ldLmxheWVycyxcbiAgICAgICAgW2lkXTogdmFsdWVcbiAgICAgIH07XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgc3BsaXRNYXBzOiBtZXJnZWQsXG4gICAgc3BsaXRNYXBzVG9CZU1lcmdlZDogWy4uLnN0YXRlLnNwbGl0TWFwc1RvQmVNZXJnZWQsIC4uLnVubWVyZ2VkXVxuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAgd2l0aCBzYXZlZCBjb25maWcsXG4gKiB2YWxpZGF0ZSBmaWVsZHNUb1Nob3dcbiAqXG4gKiBAcGFyYW0gc3RhdGVcbiAqIEBwYXJhbSB0b29sdGlwQ29uZmlnXG4gKiBAcmV0dXJuIC0ge21lcmdlZFRvb2x0aXA6IHt9LCB1bm1lcmdlZFRvb2x0aXA6IHt9fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VJbnRlcmFjdGlvblRvb2x0aXBDb25maWcoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgdG9vbHRpcENvbmZpZzogUGljazxUb29sdGlwSW5mb1snY29uZmlnJ10sICdmaWVsZHNUb1Nob3cnPiB8IG51bGwgPSBudWxsXG4pIHtcbiAgY29uc3QgdW5tZXJnZWRUb29sdGlwOiBUb29sdGlwSW5mb1snY29uZmlnJ11bJ2ZpZWxkc1RvU2hvdyddID0ge307XG4gIGNvbnN0IG1lcmdlZFRvb2x0aXA6IFRvb2x0aXBJbmZvWydjb25maWcnXVsnZmllbGRzVG9TaG93J10gPSB7fTtcblxuICBpZiAoXG4gICAgIXRvb2x0aXBDb25maWcgfHxcbiAgICAhdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cgfHxcbiAgICAhT2JqZWN0LmtleXModG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cpLmxlbmd0aFxuICApIHtcbiAgICByZXR1cm4ge21lcmdlZFRvb2x0aXAsIHVubWVyZ2VkVG9vbHRpcH07XG4gIH1cblxuICBmb3IgKGNvbnN0IGRhdGFJZCBpbiB0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvdykge1xuICAgIGlmICghc3RhdGUuZGF0YXNldHNbZGF0YUlkXSkge1xuICAgICAgLy8gaXMgbm90IHlldCBsb2FkZWRcbiAgICAgIHVubWVyZ2VkVG9vbHRpcFtkYXRhSWRdID0gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgZGF0YXNldCBpcyBsb2FkZWRcbiAgICAgIGNvbnN0IGFsbEZpZWxkcyA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF0uZmllbGRzLm1hcChkID0+IGQubmFtZSk7XG4gICAgICBjb25zdCBmb3VuZEZpZWxkc1RvU2hvdyA9IChzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLm1ldGFkYXRhIGFzIGFueSkuaXNEeW5hbWljU3BhdGlhbEluZGV4XG4gICAgICAgID8gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXVxuICAgICAgICA6IHRvb2x0aXBDb25maWcuZmllbGRzVG9TaG93W2RhdGFJZF0uZmlsdGVyKGZpZWxkID0+IGFsbEZpZWxkcy5pbmNsdWRlcyhmaWVsZC5uYW1lKSk7XG5cbiAgICAgIG1lcmdlZFRvb2x0aXBbZGF0YUlkXSA9IGZvdW5kRmllbGRzVG9TaG93O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7bWVyZ2VkVG9vbHRpcCwgdW5tZXJnZWRUb29sdGlwfTtcbn1cbi8qKlxuICogTWVyZ2UgbGF5ZXJCbGVuZGluZyB3aXRoIHNhdmVkXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMYXllckJsZW5kaW5nKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGxheWVyQmxlbmRpbmc6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVyQmxlbmRpbmcnXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFZpc1N0YXRlIHtcbiAgaWYgKGxheWVyQmxlbmRpbmcgJiYgTEFZRVJfQkxFTkRJTkdTW2xheWVyQmxlbmRpbmddKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbGF5ZXJCbGVuZGluZ1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogTWVyZ2UgYW5pbWF0aW9uIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VBbmltYXRpb25Db25maWcoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYW5pbWF0aW9uOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydhbmltYXRpb25Db25maWcnXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFZpc1N0YXRlIHtcbiAgaWYgKGFuaW1hdGlvbiAmJiBhbmltYXRpb24uY3VycmVudFRpbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgICAgICAuLi5hbmltYXRpb24sXG4gICAgICAgIGRvbWFpbjogbnVsbFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgbGF5ZXIgY29sdW1ucyB3aXRoIG5ldyBkYXRhLFxuICogdXBkYXRlIGZpZWxkSWR4IGJhc2VkIG9uIG5ldyBmaWVsZHNcbiAqXG4gKiBAcGFyYW0gZmllbGRzXG4gKiBAcGFyYW0gc2F2ZWRDb2xzXG4gKiBAcGFyYW0gZW1wdHlDb2xzXG4gKiBAcmV0dXJuIC0gdmFsaWRhdGVkIGNvbHVtbnMgb3IgbnVsbFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkTGF5ZXJDb2x1bW5zKFxuICBmaWVsZHM6IEtlcGxlclRhYmxlWydmaWVsZHMnXSxcbiAgc2F2ZWRDb2xzOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICB9ID0ge30sXG4gIGVtcHR5Q29sczogTGF5ZXJDb2x1bW5zXG4pIHtcbiAgLy8gUHJlcGFyZSBjb2x1bW5zIGZvciB0aGUgdmFsaWRhdG9yXG4gIGNvbnN0IGNvbHVtbnM6IHR5cGVvZiBlbXB0eUNvbHMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW1wdHlDb2xzKSkge1xuICAgIGNvbHVtbnNba2V5XSA9IHsuLi5lbXB0eUNvbHNba2V5XX07XG5cbiAgICBjb25zdCBzYXZlZCA9IHNhdmVkQ29sc1trZXldO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgY29uc3QgZmllbGRJZHggPSBmaWVsZHMuZmluZEluZGV4KCh7bmFtZX0pID0+IG5hbWUgPT09IHNhdmVkKTtcblxuICAgICAgaWYgKGZpZWxkSWR4ID4gLTEpIHtcbiAgICAgICAgLy8gdXBkYXRlIGZvdW5kIGNvbHVtbnNcbiAgICAgICAgY29sdW1uc1trZXldLmZpZWxkSWR4ID0gZmllbGRJZHg7XG4gICAgICAgIGNvbHVtbnNba2V5XS52YWx1ZSA9IHNhdmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmQgYWN0dWFsIGNvbHVtbiBmaWVsZElkeCwgaW4gY2FzZSBpdCBoYXMgY2hhbmdlZFxuICBjb25zdCBhbGxDb2xGb3VuZCA9IE9iamVjdC5rZXlzKGNvbHVtbnMpLmV2ZXJ5KGtleSA9PlxuICAgIHZhbGlkYXRlQ29sdW1uKGNvbHVtbnNba2V5XSwgY29sdW1ucywgZmllbGRzKVxuICApO1xuXG4gIGlmIChhbGxDb2xGb3VuZCkge1xuICAgIHJldHVybiBjb2x1bW5zO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNvbHVtbihcbiAgY29sdW1uOiBMYXllckNvbHVtbiAmIHt2YWxpZGF0b3I/OiB0eXBlb2YgdmFsaWRhdGVDb2x1bW59LFxuICBjb2x1bW5zOiBMYXllckNvbHVtbnMsXG4gIGFsbEZpZWxkczogS2VwbGVyVGFibGVbJ2ZpZWxkcyddXG4pOiBib29sZWFuIHtcbiAgaWYgKGNvbHVtbi5vcHRpb25hbCB8fCBjb2x1bW4udmFsdWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoY29sdW1uLnZhbGlkYXRvcikge1xuICAgIHJldHVybiBjb2x1bW4udmFsaWRhdG9yKGNvbHVtbiwgY29sdW1ucywgYWxsRmllbGRzKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgdGV4dCBsYWJlbCBjb25maWcgd2l0aCBuZXcgZGF0YVxuICogcmVmZXIgdG8gdmlzLXN0YXRlLXNjaGVtYS5qcyBUZXh0TGFiZWxTY2hlbWFWMVxuICpcbiAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gZmllbGRzXG4gKiBAcGFyYW0ge09iamVjdH0gc2F2ZWRUZXh0TGFiZWxcbiAqIEByZXR1cm4ge09iamVjdH0gLSB2YWxpZGF0ZWQgdGV4dGxhYmVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkVGV4dExhYmVsKGZpZWxkcywgW2xheWVyVGV4dExhYmVsXSwgc2F2ZWRUZXh0TGFiZWwpIHtcbiAgY29uc3Qgc2F2ZWRUZXh0TGFiZWxzID0gQXJyYXkuaXNBcnJheShzYXZlZFRleHRMYWJlbCkgPyBzYXZlZFRleHRMYWJlbCA6IFtzYXZlZFRleHRMYWJlbF07XG5cbiAgLy8gdmFsaWRhdGUgZmllbGRcbiAgcmV0dXJuIHNhdmVkVGV4dExhYmVscy5tYXAodGV4dExhYmVsID0+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRleHRMYWJlbC5maWVsZFxuICAgICAgPyBmaWVsZHMuZmluZChmZCA9PlxuICAgICAgICAgIE9iamVjdC5rZXlzKHRleHRMYWJlbC5maWVsZCkuZXZlcnkoa2V5ID0+IHRleHRMYWJlbC5maWVsZFtrZXldID09PSBmZFtrZXldKVxuICAgICAgICApXG4gICAgICA6IG51bGw7XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMobGF5ZXJUZXh0TGFiZWwpLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiBrZXkgPT09ICdmaWVsZCcgPyBmaWVsZCA6IHRleHRMYWJlbFtrZXldIHx8IGxheWVyVGV4dExhYmVsW2tleV1cbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzYXZlZCB2aXN1YWwgY2hhbm5lbHMgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiByZWZlciB0byB2aXMtc3RhdGUtc2NoZW1hLmpzIFZpc3VhbENoYW5uZWxTY2hlbWFWMVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzKFxuICBmaWVsZHM6IEtlcGxlclRhYmxlWydmaWVsZHMnXSxcbiAgbmV3TGF5ZXI6IExheWVyLFxuICBzYXZlZExheWVyOiBQYXJzZWRMYXllclxuKTogbnVsbCB8IExheWVyIHtcbiAgT2JqZWN0LnZhbHVlcyhuZXdMYXllci52aXN1YWxDaGFubmVscykuZm9yRWFjaCgoe2ZpZWxkLCBzY2FsZSwga2V5fSkgPT4ge1xuICAgIGxldCBmb3VuZEZpZWxkO1xuICAgIGNvbnN0IGNvbG9yRmllbGRQcm9wcyA9IHt9O1xuICAgIGlmIChzYXZlZExheWVyLmNvbmZpZykge1xuICAgICAgaWYgKHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXSkge1xuICAgICAgICBmb3VuZEZpZWxkID0gZmllbGRzLmZpbmQoXG4gICAgICAgICAgZmQgPT4gc2F2ZWRMYXllci5jb25maWcgJiYgZmQubmFtZSA9PT0gc2F2ZWRMYXllci5jb25maWdbZmllbGRdLm5hbWVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXT8uY29sb3JDb2x1bW4pIHtcbiAgICAgICAgY29uc3QgY29sb3JDb2x1bW5GaWVsZCA9IGZpZWxkcy5maW5kKFxuICAgICAgICAgIGZkID0+IHNhdmVkTGF5ZXIuY29uZmlnICYmIGZkLm5hbWUgPT09IHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXS5jb2xvckNvbHVtblxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjb2xvckNvbHVtbkZpZWxkKSB7XG4gICAgICAgICAgKGNvbG9yRmllbGRQcm9wcyBhcyBhbnkpLmNvbG9yQ29sdW1uID0gY29sb3JDb2x1bW5GaWVsZC5uYW1lO1xuICAgICAgICAgIChjb2xvckZpZWxkUHJvcHMgYXMgYW55KS5jb2xvckNvbHVtbklkeCA9IGNvbG9yQ29sdW1uRmllbGQuZmllbGRJZHg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZm91bmRDaGFubmVsID0ge1xuICAgICAgICAuLi4oZm91bmRGaWVsZCA/IHtbZmllbGRdOiB7Li4uZm91bmRGaWVsZCwgLi4uY29sb3JGaWVsZFByb3BzfX0gOiB7fSksXG4gICAgICAgIC4uLihzYXZlZExheWVyLmNvbmZpZ1tzY2FsZV0gPyB7W3NjYWxlXTogc2F2ZWRMYXllci5jb25maWdbc2NhbGVdfSA6IHt9KVxuICAgICAgfTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhmb3VuZENoYW5uZWwpLmxlbmd0aCkge1xuICAgICAgICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyhmb3VuZENoYW5uZWwpO1xuICAgICAgfVxuXG4gICAgICBuZXdMYXllci52YWxpZGF0ZVZpc3VhbENoYW5uZWwoa2V5KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMoXG4gIGRhdGFzZXRzOiBEYXRhc2V0cyxcbiAgbGF5ZXJDbGFzc2VzOiBWaXNTdGF0ZVsnbGF5ZXJDbGFzc2VzJ10sXG4gIGxheWVyczogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJzJ10gPSBbXVxuKSB7XG4gIGNvbnN0IHZhbGlkYXRlZDogTGF5ZXJbXSA9IFtdO1xuICBjb25zdCBmYWlsZWQ6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVycyddID0gW107XG5cbiAgbGF5ZXJzLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgIGxldCB2YWxpZGF0ZUxheWVyOiBMYXllciB8IG51bGwgPSBudWxsO1xuXG4gICAgaWYgKGxheWVyPy5jb25maWc/LmRhdGFJZCkge1xuICAgICAgaWYgKGRhdGFzZXRzW2xheWVyLmNvbmZpZy5kYXRhSWRdKSB7XG4gICAgICAgIC8vIGRhdGFzZXRzIGFyZSBhbHJlYWR5IGxvYWRlZFxuICAgICAgICB2YWxpZGF0ZUxheWVyID0gdmFsaWRhdGVMYXllcldpdGhEYXRhKGRhdGFzZXRzW2xheWVyLmNvbmZpZy5kYXRhSWRdLCBsYXllciwgbGF5ZXJDbGFzc2VzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVMYXllcikge1xuICAgICAgdmFsaWRhdGVkLnB1c2godmFsaWRhdGVMYXllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRhdGFzZXRzIG5vdCB5ZXQgbG9hZGVkXG4gICAgICBmYWlsZWQucHVzaChsYXllcik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge3ZhbGlkYXRlZCwgZmFpbGVkfTtcbn1cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgbGF5ZXIgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiB1cGRhdGUgZmllbGRJZHggYmFzZWQgb24gbmV3IGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVMYXllcldpdGhEYXRhKFxuICB7ZmllbGRzLCBpZDogZGF0YUlkfTogS2VwbGVyVGFibGUsXG4gIHNhdmVkTGF5ZXI6IFBhcnNlZExheWVyLFxuICBsYXllckNsYXNzZXM6IFZpc1N0YXRlWydsYXllckNsYXNzZXMnXSxcbiAgb3B0aW9uczoge1xuICAgIGFsbG93RW1wdHlDb2x1bW4/OiBib29sZWFuO1xuICB9ID0ge31cbik6IExheWVyIHwgbnVsbCB7XG4gIGNvbnN0IHt0eXBlfSA9IHNhdmVkTGF5ZXI7XG4gIC8vIGxheWVyIGRvZXNudCBoYXZlIGEgdmFsaWQgdHlwZVxuICBpZiAoIXR5cGUgfHwgIWxheWVyQ2xhc3Nlcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSB8fCAhc2F2ZWRMYXllci5jb25maWcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBuZXdMYXllciA9IG5ldyBsYXllckNsYXNzZXNbdHlwZV0oe1xuICAgIGlkOiBzYXZlZExheWVyLmlkLFxuICAgIGRhdGFJZCxcbiAgICBsYWJlbDogc2F2ZWRMYXllci5jb25maWcubGFiZWwsXG4gICAgY29sb3I6IHNhdmVkTGF5ZXIuY29uZmlnLmNvbG9yLFxuICAgIGlzVmlzaWJsZTogc2F2ZWRMYXllci5jb25maWcuaXNWaXNpYmxlLFxuICAgIGhpZGRlbjogc2F2ZWRMYXllci5jb25maWcuaGlkZGVuLFxuICAgIGhpZ2hsaWdodENvbG9yOiBzYXZlZExheWVyLmNvbmZpZy5oaWdobGlnaHRDb2xvcixcbiAgICB2aXNpYmlsaXR5Qnlab29tOiAoc2F2ZWRMYXllci5jb25maWcgYXMgYW55KS52aXNpYmlsaXR5Qnlab29tIFxuICB9KTtcblxuICAvLyBmaW5kIGNvbHVtbiBmaWVsZElkeFxuICBjb25zdCBjb2x1bW5Db25maWcgPSBuZXdMYXllci5nZXRMYXllckNvbHVtbnMoKTtcbiAgaWYgKE9iamVjdC5rZXlzKGNvbHVtbkNvbmZpZykubGVuZ3RoKSB7XG4gICAgY29uc3QgY29sdW1ucyA9IHZhbGlkYXRlU2F2ZWRMYXllckNvbHVtbnMoZmllbGRzLCBzYXZlZExheWVyLmNvbmZpZy5jb2x1bW5zLCBjb2x1bW5Db25maWcpO1xuICAgIGlmIChjb2x1bW5zKSB7XG4gICAgICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyh7Y29sdW1uc30pO1xuICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMuYWxsb3dFbXB0eUNvbHVtbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gdmlzdWFsIGNoYW5uZWwgZmllbGQgaXMgc2F2ZWQgdG8gYmUge25hbWUsIHR5cGV9XG4gIC8vIGZpbmQgdmlzdWFsIGNoYW5uZWwgZmllbGQgYnkgbWF0Y2hpbmcgYm90aCBuYW1lIGFuZCB0eXBlXG4gIC8vIHJlZmVyIHRvIHZpcy1zdGF0ZS1zY2hlbWEuanMgVmlzdWFsQ2hhbm5lbFNjaGVtYVYxXG4gIG5ld0xheWVyID0gdmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzKGZpZWxkcywgbmV3TGF5ZXIsIHNhdmVkTGF5ZXIpO1xuXG4gIGNvbnN0IHRleHRMYWJlbCA9XG4gICAgc2F2ZWRMYXllci5jb25maWcudGV4dExhYmVsICYmIG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWxcbiAgICAgID8gdmFsaWRhdGVTYXZlZFRleHRMYWJlbChmaWVsZHMsIG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWwsIHNhdmVkTGF5ZXIuY29uZmlnLnRleHRMYWJlbClcbiAgICAgIDogbmV3TGF5ZXIuY29uZmlnLnRleHRMYWJlbDtcblxuICAvLyBjb3B5IHZpc0NvbmZpZyBvdmVyIHRvIGVtcHR5TGF5ZXIgdG8gbWFrZSBzdXJlIGl0IGhhcyBhbGwgdGhlIHByb3BzXG4gIGNvbnN0IHZpc0NvbmZpZyA9IG5ld0xheWVyLmNvcHlMYXllckNvbmZpZyhcbiAgICBuZXdMYXllci5jb25maWcudmlzQ29uZmlnLFxuICAgIHNhdmVkTGF5ZXIuY29uZmlnLnZpc0NvbmZpZyB8fCB7fSxcbiAgICB7c2hhbGxvd0NvcHk6IFsnY29sb3JSYW5nZScsICdzdHJva2VDb2xvclJhbmdlJ119XG4gICk7XG5cbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgIHZpc0NvbmZpZyxcbiAgICB0ZXh0TGFiZWxcbiAgfSk7XG5cbiAgcmV0dXJuIG5ld0xheWVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE1lcmdlcihtZXJnZXI6IE1lcmdlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNPYmplY3QobWVyZ2VyKSAmJiB0eXBlb2YgbWVyZ2VyLm1lcmdlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtZXJnZXIucHJvcCA9PT0gJ3N0cmluZyc7XG59XG5cbmV4cG9ydCBjb25zdCBWSVNfU1RBVEVfTUVSR0VSUzogVmlzU3RhdGVNZXJnZXJzID0gW1xuICB7bWVyZ2U6IG1lcmdlTGF5ZXJzLCBwcm9wOiAnbGF5ZXJzJywgdG9NZXJnZVByb3A6ICdsYXllclRvQmVNZXJnZWQnfSxcbiAge21lcmdlOiBtZXJnZUZpbHRlcnMsIHByb3A6ICdmaWx0ZXJzJywgdG9NZXJnZVByb3A6ICdmaWx0ZXJUb0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VJbnRlcmFjdGlvbnMsIHByb3A6ICdpbnRlcmFjdGlvbkNvbmZpZycsIHRvTWVyZ2VQcm9wOiAnaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VMYXllckJsZW5kaW5nLCBwcm9wOiAnbGF5ZXJCbGVuZGluZyd9LFxuICB7bWVyZ2U6IG1lcmdlU3BsaXRNYXBzLCBwcm9wOiAnc3BsaXRNYXBzJywgdG9NZXJnZVByb3A6ICdzcGxpdE1hcHNUb0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VBbmltYXRpb25Db25maWcsIHByb3A6ICdhbmltYXRpb25Db25maWcnfVxuXTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQSxJQUFBQSxLQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxLQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxZQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxZQUFBLEdBQUFKLE9BQUE7QUFFQSxJQUFBSyxjQUFBLEdB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VUFBVSxDQUFDdEUsTUFBTSxDQUFDaUUsU0FBUyxJQUFJaEgsUUFBUSxDQUFDK0MsTUFBTSxDQUFDaUUsU0FBUyxHQUNwRE4sc0JBQXNCLENBQUMvQixNQUFNLEVBQUUzRSxRQUFRLENBQUMrQyxNQUFNLENBQUNpRSxTQUFTLEVBQUVLLFVBQVUsQ0FBQ3RFLE1BQU0sQ0FBQ2lFLFNBQVMsQ0FBQyxHQUN0RmhILFFBQVEsQ0FBQytDLE1BQU0sQ0FBQ2lFLFNBQVM7O0VBRS9CO0VBQ0EsSUFBTW9DLFNBQVMsR0FBR3BKLFFBQVEsQ0FBQ3FKLGVBQWUsQ0FDeENySixRQUFRLENBQUMrQyxNQUFNLENBQUNxRyxTQUFTLEVBQ3pCL0IsVUFBVSxDQUFDdEUsTUFBTSxDQUFDcUcsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUNqQztJQUFDRSxXQUFXLEVBQUUsQ0FBQyxZQUFZLEVBQUUsa0JBQWtCO0VBQUMsQ0FDbEQsQ0FBQztFQUVEdEosUUFBUSxDQUFDaUksaUJBQWlCLENBQUM7SUFDekJtQixTQUFTLEVBQVRBLFNBQVM7SUFDVHBDLFNBQVMsRUFBVEE7RUFDRixDQUFDLENBQUM7RUFFRixPQUFPaEgsUUFBUTtBQUNqQjtBQUVPLFNBQVN1SixhQUFhQSxDQUFDQyxNQUFjLEVBQVc7RUFDckQsT0FBTyxJQUFBQyxlQUFRLEVBQUNELE1BQU0sQ0FBQyxJQUFJLE9BQU9BLE1BQU0sQ0FBQ0UsS0FBSyxLQUFLLFVBQVUsSUFBSSxPQUFPRixNQUFNLENBQUNHLElBQUksS0FBSyxRQUFRO0FBQ2xHO0FBRU8sSUFBTUMsaUJBQWtDLEdBQUFDLE9BQUEsQ0FBQUQsaUJBQUEsR0FBRyxDQUNoRDtFQUFDRixLQUFLLEVBQUUvSSxXQUFXO0VBQUVnSixJQUFJLEVBQUUsUUFBUTtFQUFFRyxXQUFXLEVBQUU7QUFBaUIsQ0FBQyxFQUNwRTtFQUFDSixLQUFLLEVBQUV4TCxZQUFZO0VBQUV5TCxJQUFJLEVBQUUsU0FBUztFQUFFRyxXQUFXLEVBQUU7QUFBa0IsQ0FBQyxFQUN2RTtFQUFDSixLQUFLLEVBQUVqSCxpQkFBaUI7RUFBRWtILElBQUksRUFBRSxtQkFBbUI7RUFBRUcsV0FBVyxFQUFFO0FBQXVCLENBQUMsRUFDM0Y7RUFBQ0osS0FBSyxFQUFFeEUsa0JBQWtCO0VBQUV5RSxJQUFJLEVBQUU7QUFBZSxDQUFDLEVBQ2xEO0VBQUNELEtBQUssRUFBRTdGLGNBQWM7RUFBRThGLElBQUksRUFBRSxXQUFXO0VBQUVHLFdBQVcsRUFBRTtBQUFxQixDQUFDLEVBQzlFO0VBQUNKLEtBQUssRUFBRXJFLG9CQUFvQjtFQUFFc0UsSUFBSSxFQUFFO0FBQWlCLENBQUMsQ0FDdkQiLCJpZ25vcmVMaXN0IjpbXX0=