@rivet-health/design-system 40.44.0 → 40.44.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/{esm2020 → esm2022}/lib/accessibility/sr-only/sr-only.component.mjs +4 -4
  2. package/esm2022/lib/download/download.service.mjs +47 -0
  3. package/{esm2020 → esm2022}/lib/format/pipes/common.mjs +5 -5
  4. package/{esm2020 → esm2022}/lib/format/pipes/date.pipe.mjs +4 -4
  5. package/{esm2020 → esm2022}/lib/format/pipes/days.pipe.mjs +4 -4
  6. package/{esm2020 → esm2022}/lib/format/pipes/dollars.pipe.mjs +4 -4
  7. package/{esm2020 → esm2022}/lib/format/pipes/number.pipe.mjs +4 -4
  8. package/{esm2020 → esm2022}/lib/format/pipes/percentage.pipe.mjs +4 -4
  9. package/esm2022/lib/format/pipes/sentence-case.pipe.mjs +61 -0
  10. package/esm2022/lib/format/pipes/small-currency.pipe.mjs +24 -0
  11. package/esm2022/lib/format/pipes/small-number.pipe.mjs +29 -0
  12. package/esm2022/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +62 -0
  13. package/esm2022/lib/format/truncate/truncate.component.mjs +51 -0
  14. package/esm2022/lib/icon/dom-cache.mjs +32 -0
  15. package/esm2022/lib/icon/icon.component.mjs +86 -0
  16. package/{esm2020 → esm2022}/lib/icon/icons.mjs +1 -1
  17. package/{esm2020 → esm2022}/lib/input/alphabetic-field/alphabetic-field.component.mjs +4 -4
  18. package/esm2022/lib/input/auto-focus/auto-focus.directive.mjs +48 -0
  19. package/esm2022/lib/input/button/button.component.mjs +139 -0
  20. package/esm2022/lib/input/button-group/button-group.component.mjs +39 -0
  21. package/{esm2020 → esm2022}/lib/input/calendar/calendar.component.mjs +4 -4
  22. package/{esm2020 → esm2022}/lib/input/card-checkbox/card-checkbox.component.mjs +4 -4
  23. package/{esm2020 → esm2022}/lib/input/checkbox/checkbox.component.mjs +4 -4
  24. package/{esm2020 → esm2022}/lib/input/currency-field/currency-field.component.mjs +4 -4
  25. package/esm2022/lib/input/date/date.component.mjs +279 -0
  26. package/esm2022/lib/input/date-range/date-range.component.mjs +477 -0
  27. package/esm2022/lib/input/filter-chip/filter-chip.component.mjs +47 -0
  28. package/{esm2020 → esm2022}/lib/input/filter-dropdown/filter-dropdown.component.mjs +5 -5
  29. package/{esm2020 → esm2022}/lib/input/input-label/input-label.component.mjs +4 -4
  30. package/esm2022/lib/input/mentions-input/mentions-input.component.mjs +745 -0
  31. package/esm2022/lib/input/number-field/number-field.component.mjs +125 -0
  32. package/{esm2020 → esm2022}/lib/input/percentage-field/percentage-field.component.mjs +4 -4
  33. package/esm2022/lib/input/phone-field/phone-field.component.mjs +74 -0
  34. package/{esm2020 → esm2022}/lib/input/radio/radio.component.mjs +4 -4
  35. package/{esm2020 → esm2022}/lib/input/search/search.component.mjs +4 -4
  36. package/esm2022/lib/input/search-select/search-select.component.mjs +189 -0
  37. package/esm2022/lib/input/select/select/select.component.mjs +178 -0
  38. package/{esm2020 → esm2022}/lib/input/select/select-node/select-node.component.mjs +4 -4
  39. package/esm2022/lib/input/select/state.mjs +882 -0
  40. package/{esm2020 → esm2022}/lib/input/simple-select/option-group.pipe.mjs +4 -4
  41. package/esm2022/lib/input/simple-select/simple-select.component.mjs +178 -0
  42. package/esm2022/lib/input/switch-checkbox/switch-checkbox.component.mjs +33 -0
  43. package/esm2022/lib/input/text-field/text-field.component.mjs +115 -0
  44. package/{esm2020 → esm2022}/lib/input/textarea-field/textarea-field.component.mjs +4 -4
  45. package/{esm2020 → esm2022}/lib/input/validation-message/validation-message.component.mjs +4 -4
  46. package/{esm2020 → esm2022}/lib/layout/card/card-actions.component.mjs +4 -4
  47. package/esm2022/lib/layout/card/card-content.component.mjs +64 -0
  48. package/esm2022/lib/layout/card/card-header.component.mjs +201 -0
  49. package/{esm2020 → esm2022}/lib/layout/card/card-link.component.mjs +5 -5
  50. package/{esm2020 → esm2022}/lib/layout/card/card-media.component.mjs +4 -4
  51. package/esm2022/lib/layout/card/card.component.mjs +291 -0
  52. package/{esm2020 → esm2022}/lib/layout/setting-row/setting-row.component.mjs +4 -4
  53. package/esm2022/lib/load/loading/loading.component.mjs +43 -0
  54. package/{esm2020 → esm2022}/lib/load/loading-cover/loading-cover.component.mjs +4 -4
  55. package/esm2022/lib/navigation/editable-heading/editable-heading.component.mjs +243 -0
  56. package/{esm2020 → esm2022}/lib/navigation/link/link.component.mjs +6 -6
  57. package/{esm2020 → esm2022}/lib/navigation/page-header/page-header.component.mjs +4 -4
  58. package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tab/simple-tab.component.mjs +4 -4
  59. package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tabs/simple-tabs.component.mjs +4 -4
  60. package/{esm2020 → esm2022}/lib/navigation/tabs/tab/tab.component.mjs +4 -4
  61. package/{esm2020 → esm2022}/lib/navigation/tabs/tabs/tabs.component.mjs +4 -4
  62. package/{esm2020 → esm2022}/lib/navigation/views/all-views-modal/all-views-modal.component.mjs +4 -4
  63. package/{esm2020 → esm2022}/lib/navigation/views/edit-view/edit-view.component.mjs +9 -9
  64. package/esm2022/lib/navigation/views/permission-picker/permission-picker.component.mjs +151 -0
  65. package/esm2022/lib/navigation/views/state.mjs +456 -0
  66. package/{esm2020 → esm2022}/lib/navigation/views/view-menu/view-menu.component.mjs +5 -5
  67. package/esm2022/lib/navigation/views/views/views.component.mjs +90 -0
  68. package/{esm2020 → esm2022}/lib/notification/badge/badge.component.mjs +4 -4
  69. package/esm2022/lib/notification/banner/banner-action.component.mjs +48 -0
  70. package/esm2022/lib/notification/banner/banner.component.mjs +61 -0
  71. package/esm2022/lib/notification/map-indicator/map-indicator.component.mjs +50 -0
  72. package/esm2022/lib/notification/map-indicator/map-indicators.mjs +15 -0
  73. package/{esm2020 → esm2022}/lib/notification/notification-badge/notification-badge.component.mjs +4 -4
  74. package/esm2022/lib/overlay/callout/callout.component.mjs +130 -0
  75. package/esm2022/lib/overlay/callout/callout.helpers.mjs +113 -0
  76. package/{esm2020 → esm2022}/lib/overlay/callout/help/help.component.mjs +4 -4
  77. package/esm2022/lib/overlay/callout/lock-scroll.directive.mjs +69 -0
  78. package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu-item/menu-item.component.mjs +5 -5
  79. package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu.component.mjs +4 -4
  80. package/esm2022/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +30 -0
  81. package/{esm2020 → esm2022}/lib/overlay/callout/tooltip/tooltip.component.mjs +4 -4
  82. package/esm2022/lib/overlay/callout/tooltip/tooltip.directive.mjs +138 -0
  83. package/esm2022/lib/overlay/modal/dialog/dialog.component.mjs +47 -0
  84. package/{esm2020 → esm2022}/lib/overlay/modal/dialog-stack.service.mjs +4 -4
  85. package/esm2022/lib/overlay/modal/form-dialog/form-dialog.component.mjs +146 -0
  86. package/esm2022/lib/overlay/modal/modal.component.mjs +31 -0
  87. package/{esm2020 → esm2022}/lib/overlay/modal/side-sheet/side-sheet.component.mjs +4 -4
  88. package/esm2022/lib/overlay/overlay-outlet.component.mjs +98 -0
  89. package/{esm2020 → esm2022}/lib/overlay/overlay.directive.mjs +5 -5
  90. package/{esm2020 → esm2022}/lib/overlay/overlay.service.mjs +5 -5
  91. package/{esm2020 → esm2022}/lib/overlay/toast/toast-action.component.mjs +4 -4
  92. package/esm2022/lib/overlay/toast/toast.component.mjs +41 -0
  93. package/{esm2020 → esm2022}/lib/riv.module.mjs +227 -227
  94. package/esm2022/lib/size/size.directive.mjs +33 -0
  95. package/esm2022/lib/table/simple-table/coordinate-helper.mjs +61 -0
  96. package/esm2022/lib/table/simple-table/simple-table-cell.component.mjs +36 -0
  97. package/esm2022/lib/table/simple-table/simple-table-header-cell.component.mjs +37 -0
  98. package/{esm2020 → esm2022}/lib/table/simple-table/simple-table-row.component.mjs +4 -4
  99. package/esm2022/lib/table/simple-table/simple-table.component.mjs +104 -0
  100. package/esm2022/lib/table/table/clipboard.mjs +182 -0
  101. package/esm2022/lib/table/table/state-helpers/collapse-helpers.mjs +116 -0
  102. package/esm2022/lib/table/table/state-helpers/column-helpers.mjs +383 -0
  103. package/{esm2020 → esm2022}/lib/table/table/state-helpers/display-helpers.mjs +1 -1
  104. package/esm2022/lib/table/table/state-helpers/nesting-helpers.mjs +123 -0
  105. package/esm2022/lib/table/table/state-helpers/order-helpers.mjs +164 -0
  106. package/esm2022/lib/table/table/state-helpers/pagination-helpers.mjs +139 -0
  107. package/esm2022/lib/table/table/state-helpers/result-helpers.mjs +70 -0
  108. package/esm2022/lib/table/table/state-helpers/search-helpers.mjs +72 -0
  109. package/esm2022/lib/table/table/state-helpers/selection-helpers.mjs +180 -0
  110. package/esm2022/lib/table/table/state.mjs +1035 -0
  111. package/esm2022/lib/table/table/table/table.component.mjs +367 -0
  112. package/{esm2020 → esm2022}/lib/table/table/table-collapse-all/table-collapse-all.component.mjs +5 -5
  113. package/esm2022/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +227 -0
  114. package/esm2022/lib/table/table/table-column-settings/table-column-settings.component.mjs +134 -0
  115. package/esm2022/lib/table/table/table-csv-export/table-csv-export.component.mjs +35 -0
  116. package/{esm2020 → esm2022}/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.mjs +6 -6
  117. package/esm2022/lib/table/table/table-search/table-search.component.mjs +71 -0
  118. package/{esm2020 → esm2022}/lib/table/table/table-search-columns/table-search-columns.component.mjs +4 -4
  119. package/esm2022/lib/visibility/visibility.directive.mjs +34 -0
  120. package/esm2022/lib/visualization/chart/chart-scaling.mjs +380 -0
  121. package/esm2022/lib/visualization/chart/chart.component.mjs +626 -0
  122. package/esm2022/lib/visualization/chart/chart.mjs +3768 -0
  123. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-cell.component.mjs +5 -5
  124. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-header-cell.component.mjs +4 -4
  125. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-row.component.mjs +4 -4
  126. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table.component.mjs +4 -4
  127. package/{esm2020 → esm2022}/lib/visualization/donut/donut.component.mjs +4 -4
  128. package/{esm2020 → esm2022}/lib/visualization/funnel-chart/funnel-chart.component.mjs +5 -5
  129. package/esm2022/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +33 -0
  130. package/{esm2020 → esm2022}/lib/visualization/highlight/highlight.component.mjs +4 -4
  131. package/esm2022/lib/visualization/highlight/highlight.helpers.mjs +20 -0
  132. package/esm2022/lib/visualization/intervals.mjs +63 -0
  133. package/{esm2020 → esm2022}/lib/visualization/issue/issue.component.mjs +4 -4
  134. package/{esm2020 → esm2022}/lib/visualization/legend-item/legend-item.component.mjs +4 -4
  135. package/{esm2020 → esm2022}/lib/visualization/metric/metric.component.mjs +4 -4
  136. package/{esm2020 → esm2022}/lib/visualization/mini-pie/mini-pie.component.mjs +4 -4
  137. package/{esm2020 → esm2022}/lib/visualization/progress/progress.component.mjs +5 -5
  138. package/esm2022/lib/visualization/stacked-column/stacked-column.component.mjs +377 -0
  139. package/esm2022/lib/visualization/stacked-column/stacked-column.helpers.mjs +18 -0
  140. package/esm2022/lib/visualization/stacked-row/stacked-row.component.mjs +270 -0
  141. package/esm2022/lib/visualization/stacked-row/stacked-row.helpers.mjs +74 -0
  142. package/esm2022/lib/visualization/time-series/time-series.component.mjs +374 -0
  143. package/esm2022/lib/visualization/time-series/time-series.helpers.mjs +15 -0
  144. package/esm2022/lib/visualization/trend/trend.component.mjs +51 -0
  145. package/{esm2020 → esm2022}/lib/visualization/zero-state/zero-state.component.mjs +4 -4
  146. package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs +670 -670
  147. package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs.map +1 -1
  148. package/lib/format/svg-text-truncate/svg-text-truncate.directive.d.ts +1 -1
  149. package/lib/format/truncate/truncate.component.d.ts +1 -1
  150. package/lib/icon/icon.component.d.ts +1 -1
  151. package/lib/input/auto-focus/auto-focus.directive.d.ts +1 -1
  152. package/lib/input/button/button.component.d.ts +1 -1
  153. package/lib/input/calendar/calendar.component.d.ts +1 -1
  154. package/lib/input/checkbox/checkbox.component.d.ts +1 -1
  155. package/lib/input/currency-field/currency-field.component.d.ts +1 -1
  156. package/lib/input/date/date.component.d.ts +1 -1
  157. package/lib/input/date-range/date-range.component.d.ts +1 -1
  158. package/lib/input/filter-chip/filter-chip.component.d.ts +1 -1
  159. package/lib/input/filter-dropdown/filter-dropdown.component.d.ts +1 -1
  160. package/lib/input/input-label/input-label.component.d.ts +1 -1
  161. package/lib/input/mentions-input/mentions-input.component.d.ts +1 -1
  162. package/lib/input/number-field/number-field.component.d.ts +1 -1
  163. package/lib/input/percentage-field/percentage-field.component.d.ts +1 -1
  164. package/lib/input/phone-field/phone-field.component.d.ts +1 -1
  165. package/lib/input/radio/radio.component.d.ts +1 -1
  166. package/lib/input/search/search.component.d.ts +1 -1
  167. package/lib/input/search-select/search-select.component.d.ts +1 -1
  168. package/lib/input/select/select/select.component.d.ts +1 -1
  169. package/lib/input/select/select-node/select-node.component.d.ts +1 -1
  170. package/lib/input/simple-select/simple-select.component.d.ts +1 -1
  171. package/lib/input/switch-checkbox/switch-checkbox.component.d.ts +1 -1
  172. package/lib/input/text-field/text-field.component.d.ts +1 -1
  173. package/lib/input/textarea-field/textarea-field.component.d.ts +1 -1
  174. package/lib/input/validation-message/validation-message.component.d.ts +1 -1
  175. package/lib/layout/card/card-actions.component.d.ts +1 -1
  176. package/lib/layout/card/card-content.component.d.ts +1 -1
  177. package/lib/layout/card/card-header.component.d.ts +1 -1
  178. package/lib/layout/card/card-link.component.d.ts +1 -1
  179. package/lib/layout/card/card-media.component.d.ts +1 -1
  180. package/lib/layout/card/card.component.d.ts +1 -1
  181. package/lib/layout/setting-row/setting-row.component.d.ts +1 -1
  182. package/lib/load/loading/loading.component.d.ts +1 -1
  183. package/lib/load/loading-cover/loading-cover.component.d.ts +1 -1
  184. package/lib/navigation/editable-heading/editable-heading.component.d.ts +1 -1
  185. package/lib/navigation/link/link.component.d.ts +1 -1
  186. package/lib/navigation/page-header/page-header.component.d.ts +1 -1
  187. package/lib/navigation/simple-tabs/simple-tab/simple-tab.component.d.ts +1 -1
  188. package/lib/navigation/tabs/tab/tab.component.d.ts +1 -1
  189. package/lib/navigation/views/all-views-modal/all-views-modal.component.d.ts +1 -1
  190. package/lib/navigation/views/edit-view/edit-view.component.d.ts +1 -1
  191. package/lib/navigation/views/permission-picker/permission-picker.component.d.ts +3 -3
  192. package/lib/navigation/views/view-menu/view-menu.component.d.ts +1 -1
  193. package/lib/navigation/views/views/views.component.d.ts +1 -1
  194. package/lib/notification/badge/badge.component.d.ts +1 -1
  195. package/lib/notification/banner/banner-action.component.d.ts +1 -1
  196. package/lib/notification/banner/banner.component.d.ts +1 -1
  197. package/lib/notification/map-indicator/map-indicator.component.d.ts +1 -1
  198. package/lib/notification/notification-badge/notification-badge.component.d.ts +1 -1
  199. package/lib/overlay/callout/callout.component.d.ts +1 -1
  200. package/lib/overlay/callout/help/help.component.d.ts +1 -1
  201. package/lib/overlay/callout/lock-scroll.directive.d.ts +1 -1
  202. package/lib/overlay/callout/menu/menu-item/menu-item.component.d.ts +1 -1
  203. package/lib/overlay/callout/menu/menu.component.d.ts +1 -1
  204. package/lib/overlay/callout/tooltip/locked-tooltip.directive.d.ts +1 -1
  205. package/lib/overlay/callout/tooltip/tooltip.component.d.ts +1 -1
  206. package/lib/overlay/callout/tooltip/tooltip.directive.d.ts +1 -1
  207. package/lib/overlay/modal/dialog/dialog.component.d.ts +1 -1
  208. package/lib/overlay/modal/form-dialog/form-dialog.component.d.ts +1 -1
  209. package/lib/overlay/modal/modal.component.d.ts +1 -1
  210. package/lib/overlay/modal/side-sheet/side-sheet.component.d.ts +1 -1
  211. package/lib/overlay/toast/toast.component.d.ts +1 -1
  212. package/lib/table/simple-table/simple-table-header-cell.component.d.ts +1 -1
  213. package/lib/table/simple-table/simple-table-row.component.d.ts +1 -1
  214. package/lib/table/table/table/table.component.d.ts +1 -1
  215. package/lib/table/table/table-collapse-all/table-collapse-all.component.d.ts +1 -1
  216. package/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.d.ts +1 -1
  217. package/lib/table/table/table-column-settings/table-column-settings.component.d.ts +1 -1
  218. package/lib/table/table/table-csv-export/table-csv-export.component.d.ts +1 -1
  219. package/lib/table/table/table-search/table-search.component.d.ts +1 -1
  220. package/lib/table/table/table-search-columns/table-search-columns.component.d.ts +1 -1
  221. package/lib/visualization/chart/chart.component.d.ts +1 -1
  222. package/lib/visualization/data-table/data-table-row.component.d.ts +1 -1
  223. package/lib/visualization/donut/donut.component.d.ts +1 -1
  224. package/lib/visualization/funnel-chart/funnel-chart.component.d.ts +1 -1
  225. package/lib/visualization/highlight/highlight.component.d.ts +1 -1
  226. package/lib/visualization/issue/issue.component.d.ts +1 -1
  227. package/lib/visualization/legend-item/legend-item.component.d.ts +1 -1
  228. package/lib/visualization/metric/metric.component.d.ts +1 -1
  229. package/lib/visualization/mini-pie/mini-pie.component.d.ts +1 -1
  230. package/lib/visualization/progress/progress.component.d.ts +1 -1
  231. package/lib/visualization/stacked-column/stacked-column.component.d.ts +3 -3
  232. package/lib/visualization/stacked-row/stacked-row.component.d.ts +1 -1
  233. package/lib/visualization/time-series/time-series.component.d.ts +3 -3
  234. package/lib/visualization/trend/trend.component.d.ts +1 -1
  235. package/lib/visualization/zero-state/zero-state.component.d.ts +1 -1
  236. package/package.json +5 -11
  237. package/esm2020/lib/download/download.service.mjs +0 -47
  238. package/esm2020/lib/format/pipes/sentence-case.pipe.mjs +0 -61
  239. package/esm2020/lib/format/pipes/small-currency.pipe.mjs +0 -24
  240. package/esm2020/lib/format/pipes/small-number.pipe.mjs +0 -29
  241. package/esm2020/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +0 -62
  242. package/esm2020/lib/format/truncate/truncate.component.mjs +0 -51
  243. package/esm2020/lib/icon/dom-cache.mjs +0 -32
  244. package/esm2020/lib/icon/icon.component.mjs +0 -86
  245. package/esm2020/lib/input/auto-focus/auto-focus.directive.mjs +0 -48
  246. package/esm2020/lib/input/button/button.component.mjs +0 -139
  247. package/esm2020/lib/input/button-group/button-group.component.mjs +0 -39
  248. package/esm2020/lib/input/date/date.component.mjs +0 -279
  249. package/esm2020/lib/input/date-range/date-range.component.mjs +0 -477
  250. package/esm2020/lib/input/filter-chip/filter-chip.component.mjs +0 -47
  251. package/esm2020/lib/input/mentions-input/mentions-input.component.mjs +0 -745
  252. package/esm2020/lib/input/number-field/number-field.component.mjs +0 -125
  253. package/esm2020/lib/input/phone-field/phone-field.component.mjs +0 -74
  254. package/esm2020/lib/input/search-select/search-select.component.mjs +0 -189
  255. package/esm2020/lib/input/select/select/select.component.mjs +0 -178
  256. package/esm2020/lib/input/select/state.mjs +0 -882
  257. package/esm2020/lib/input/simple-select/simple-select.component.mjs +0 -178
  258. package/esm2020/lib/input/switch-checkbox/switch-checkbox.component.mjs +0 -33
  259. package/esm2020/lib/input/text-field/text-field.component.mjs +0 -115
  260. package/esm2020/lib/layout/card/card-content.component.mjs +0 -64
  261. package/esm2020/lib/layout/card/card-header.component.mjs +0 -201
  262. package/esm2020/lib/layout/card/card.component.mjs +0 -291
  263. package/esm2020/lib/load/loading/loading.component.mjs +0 -43
  264. package/esm2020/lib/navigation/editable-heading/editable-heading.component.mjs +0 -243
  265. package/esm2020/lib/navigation/views/permission-picker/permission-picker.component.mjs +0 -151
  266. package/esm2020/lib/navigation/views/state.mjs +0 -456
  267. package/esm2020/lib/navigation/views/views/views.component.mjs +0 -90
  268. package/esm2020/lib/notification/banner/banner-action.component.mjs +0 -48
  269. package/esm2020/lib/notification/banner/banner.component.mjs +0 -61
  270. package/esm2020/lib/notification/map-indicator/map-indicator.component.mjs +0 -50
  271. package/esm2020/lib/notification/map-indicator/map-indicators.mjs +0 -15
  272. package/esm2020/lib/overlay/callout/callout.component.mjs +0 -130
  273. package/esm2020/lib/overlay/callout/callout.helpers.mjs +0 -113
  274. package/esm2020/lib/overlay/callout/lock-scroll.directive.mjs +0 -69
  275. package/esm2020/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +0 -30
  276. package/esm2020/lib/overlay/callout/tooltip/tooltip.directive.mjs +0 -138
  277. package/esm2020/lib/overlay/modal/dialog/dialog.component.mjs +0 -47
  278. package/esm2020/lib/overlay/modal/form-dialog/form-dialog.component.mjs +0 -146
  279. package/esm2020/lib/overlay/modal/modal.component.mjs +0 -31
  280. package/esm2020/lib/overlay/overlay-outlet.component.mjs +0 -98
  281. package/esm2020/lib/overlay/toast/toast.component.mjs +0 -41
  282. package/esm2020/lib/size/size.directive.mjs +0 -33
  283. package/esm2020/lib/table/simple-table/coordinate-helper.mjs +0 -61
  284. package/esm2020/lib/table/simple-table/simple-table-cell.component.mjs +0 -36
  285. package/esm2020/lib/table/simple-table/simple-table-header-cell.component.mjs +0 -37
  286. package/esm2020/lib/table/simple-table/simple-table.component.mjs +0 -104
  287. package/esm2020/lib/table/table/clipboard.mjs +0 -182
  288. package/esm2020/lib/table/table/state-helpers/collapse-helpers.mjs +0 -116
  289. package/esm2020/lib/table/table/state-helpers/column-helpers.mjs +0 -383
  290. package/esm2020/lib/table/table/state-helpers/nesting-helpers.mjs +0 -123
  291. package/esm2020/lib/table/table/state-helpers/order-helpers.mjs +0 -164
  292. package/esm2020/lib/table/table/state-helpers/pagination-helpers.mjs +0 -139
  293. package/esm2020/lib/table/table/state-helpers/result-helpers.mjs +0 -70
  294. package/esm2020/lib/table/table/state-helpers/search-helpers.mjs +0 -72
  295. package/esm2020/lib/table/table/state-helpers/selection-helpers.mjs +0 -180
  296. package/esm2020/lib/table/table/state.mjs +0 -1035
  297. package/esm2020/lib/table/table/table/table.component.mjs +0 -367
  298. package/esm2020/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +0 -227
  299. package/esm2020/lib/table/table/table-column-settings/table-column-settings.component.mjs +0 -134
  300. package/esm2020/lib/table/table/table-csv-export/table-csv-export.component.mjs +0 -35
  301. package/esm2020/lib/table/table/table-search/table-search.component.mjs +0 -71
  302. package/esm2020/lib/visibility/visibility.directive.mjs +0 -34
  303. package/esm2020/lib/visualization/chart/chart-scaling.mjs +0 -380
  304. package/esm2020/lib/visualization/chart/chart.component.mjs +0 -626
  305. package/esm2020/lib/visualization/chart/chart.mjs +0 -3768
  306. package/esm2020/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +0 -33
  307. package/esm2020/lib/visualization/highlight/highlight.helpers.mjs +0 -20
  308. package/esm2020/lib/visualization/intervals.mjs +0 -63
  309. package/esm2020/lib/visualization/stacked-column/stacked-column.component.mjs +0 -377
  310. package/esm2020/lib/visualization/stacked-column/stacked-column.helpers.mjs +0 -18
  311. package/esm2020/lib/visualization/stacked-row/stacked-row.component.mjs +0 -270
  312. package/esm2020/lib/visualization/stacked-row/stacked-row.helpers.mjs +0 -74
  313. package/esm2020/lib/visualization/time-series/time-series.component.mjs +0 -374
  314. package/esm2020/lib/visualization/time-series/time-series.helpers.mjs +0 -15
  315. package/esm2020/lib/visualization/trend/trend.component.mjs +0 -51
  316. package/fesm2015/rivet-health-design-system.mjs +0 -18370
  317. package/fesm2015/rivet-health-design-system.mjs.map +0 -1
  318. /package/{esm2020 → esm2022}/lib/overlay/callout/select-callout-defaults.mjs +0 -0
  319. /package/{esm2020 → esm2022}/lib/util/local-storage.mjs +0 -0
  320. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  321. /package/{esm2020 → esm2022}/rivet-health-design-system.mjs +0 -0
@@ -1,383 +0,0 @@
1
- import { difference, partition as lodashPartition } from 'lodash';
2
- import { RivTable } from '../state';
3
- export var TableColumnHelpers;
4
- (function (TableColumnHelpers) {
5
- function getColumnAlignment(dataType, isFirst) {
6
- if (isFirst)
7
- return 'left';
8
- switch (dataType) {
9
- case 'date':
10
- case 'longText':
11
- return 'left';
12
- case 'advanced':
13
- case 'icon':
14
- case 'shortText':
15
- return 'center';
16
- case 'currency':
17
- case 'number':
18
- return 'right';
19
- }
20
- }
21
- TableColumnHelpers.getColumnAlignment = getColumnAlignment;
22
- function getAllColumns(state, supportedColumns, columnNameMap) {
23
- // If the table offers more columns than the user has configuration settings
24
- // for (or if the user has no configuration settings yet), we'll append them
25
- // to the end (unless they should be pinned by default, in which case we'll
26
- // append them after the other pinned columns). This ensures that new columns
27
- // we add to existing tables over time (1) get displayed even though they
28
- // don't appear in the user's configuration settings yet, and (2) don't
29
- // interrupt their existing setup.
30
- const columnNamesWithoutUserSettings = difference([...supportedColumns.keys()], state.display.columnSettings.map(({ key }) => key));
31
- // Throw out settings for columns no longer offered by the table.
32
- const onlyColumnsWithUserSettings = state.display.columnSettings.filter(({ key }) => supportedColumns.has(key));
33
- const columnsWithUserSettings = onlyColumnsWithUserSettings.map(columnSetting => {
34
- return {
35
- ...columnSetting,
36
- /*
37
- Overwrite the enabled/pinned state if the column should be "always pinned".
38
- Otherwise, respect the saved user settings.
39
- */
40
- enabled: !!supportedColumns.get(columnSetting.key)?.alwaysPinned
41
- ? true
42
- : columnSetting.enabled,
43
- pinned: !!supportedColumns.get(columnSetting.key)?.alwaysPinned
44
- ? true
45
- : columnSetting.pinned,
46
- };
47
- });
48
- const columnsWithoutUserSettings = [
49
- ...columnNamesWithoutUserSettings,
50
- ].map((key) => ({
51
- key,
52
- enabled: true,
53
- preferredWidth: 'auto',
54
- pinned: !!supportedColumns.get(key)?.defaultPinned ||
55
- !!supportedColumns.get(key)?.alwaysPinned,
56
- }));
57
- return orderIntentionally([...columnsWithUserSettings, ...columnsWithoutUserSettings], columnNameMap, supportedColumns);
58
- }
59
- TableColumnHelpers.getAllColumns = getAllColumns;
60
- function orderIntentionally(columns, columnNameMap, columnMetadataMap) {
61
- const [alwaysPinnedColumns, sometimesPinnedColumns] = lodashPartition(columns, column => {
62
- const currentColumnMetadata = columnMetadataMap.get(column.key);
63
- return currentColumnMetadata?.alwaysPinned ?? false;
64
- });
65
- const [pinnedColumns, unpinnedColumns] = lodashPartition(sometimesPinnedColumns, column => column.pinned);
66
- const [enabledUnpinnedColumns, disabledColumns] = lodashPartition(unpinnedColumns, column => column.enabled);
67
- const sortedDisabledColumns = disabledColumns.sort((a, b) => {
68
- const aName = columnNameMap.get(a.key) ?? a.key;
69
- const bName = columnNameMap.get(b.key) ?? b.key;
70
- return aName.localeCompare(bName);
71
- });
72
- return [
73
- ...alwaysPinnedColumns,
74
- ...pinnedColumns,
75
- ...enabledUnpinnedColumns,
76
- ...sortedDisabledColumns,
77
- ];
78
- }
79
- function getAlignment(metadata, index, allowSelection) {
80
- return getColumnAlignment(metadata.dataType, index === 0 && !allowSelection);
81
- }
82
- function resolveColumns(state, supportedColumns, columnNameMap, allowSelection, filterTo, hasHeaders) {
83
- const allColumns = getAllColumns(state, supportedColumns, columnNameMap);
84
- return allColumns
85
- .filter(({ enabled }) => (filterTo === 'enabled' ? enabled : !enabled))
86
- .reduce((fullColumns, settings, i) => {
87
- const metadata = supportedColumns.get(settings.key);
88
- const resolvedWidth = settings.preferredWidth === 'auto'
89
- ? metadata.minWidth
90
- : Math.max(metadata.minWidth, settings.preferredWidth);
91
- const previousColumn = fullColumns[i - 1];
92
- return [
93
- ...fullColumns,
94
- {
95
- ...settings,
96
- ...metadata,
97
- width: resolvedWidth,
98
- left: settings.pinned
99
- ? previousColumn
100
- ? (previousColumn.left || 0) + previousColumn.width
101
- : !!allowSelection || !!hasHeaders
102
- ? 40 // This makes sure the pinned column accounts for the checkbox/chevron column on the far left
103
- : 0
104
- : null,
105
- alignment: getAlignment(metadata, i, !!allowSelection),
106
- },
107
- ];
108
- }, []);
109
- }
110
- TableColumnHelpers.resolveColumns = resolveColumns;
111
- function changeColumnPin(state, columns, columnNameMap, column, pinned) {
112
- const currentColumnMetadata = columns.get(column);
113
- // You cannot change the pinned status of an always pinned column
114
- if (!!currentColumnMetadata?.alwaysPinned) {
115
- return state;
116
- }
117
- const allColumns = getAllColumns(state, columns, columnNameMap);
118
- if (pinned) {
119
- const target = allColumns.find(c => c.key === column);
120
- const wasEnabled = !!target?.enabled;
121
- if (!wasEnabled) {
122
- const enabledCount = allColumns.filter(col => col.enabled).length;
123
- if (enabledCount >= RivTable.ColumnsMaxShown) {
124
- return state; // refuse the pin since it would exceed the max
125
- }
126
- }
127
- }
128
- return {
129
- ...state,
130
- display: {
131
- ...state.display,
132
- columnSettings: orderIntentionally(allColumns.map(c => ({
133
- ...c,
134
- pinned: c.key === column ? pinned : c.pinned,
135
- // Check/enable if being pinned
136
- enabled: c.key === column && pinned ? true : c.enabled,
137
- })), columnNameMap, columns),
138
- },
139
- };
140
- }
141
- TableColumnHelpers.changeColumnPin = changeColumnPin;
142
- function changeColumnsFreezeState(state, columns, columnNameMap, index, freeze) {
143
- const allColumns = getAllColumns(state, columns, columnNameMap);
144
- const updatedColumnSettings = allColumns.map((currentColumnSettings, currentIndex) => {
145
- const currentColumnMetadata = columns.get(currentColumnSettings.key);
146
- const isColumnAlwaysPinned = currentColumnMetadata?.alwaysPinned ?? false;
147
- if (isColumnAlwaysPinned) {
148
- return {
149
- ...currentColumnSettings,
150
- pinned: true,
151
- enabled: true,
152
- };
153
- }
154
- return {
155
- ...currentColumnSettings,
156
- pinned: freeze && currentIndex <= index,
157
- };
158
- });
159
- return {
160
- ...state,
161
- display: {
162
- ...state.display,
163
- columnSettings: updatedColumnSettings,
164
- },
165
- };
166
- }
167
- TableColumnHelpers.changeColumnsFreezeState = changeColumnsFreezeState;
168
- function moveColumnTo(state, columns, columnNameMap, column, position) {
169
- const currentColumnMetadata = columns.get(column);
170
- // You cannot move an always pinned column
171
- if (!!currentColumnMetadata?.alwaysPinned) {
172
- return state;
173
- }
174
- const allColumns = getAllColumns(state, columns, columnNameMap);
175
- const previousIndex = allColumns.findIndex(c => c.key === column);
176
- const lastIndex = position == 'end' ? allColumns.findIndex(c => !c.enabled) : 0;
177
- const newIndex = position == 'start'
178
- ? 0
179
- : lastIndex == -1
180
- ? allColumns.length - 1
181
- : lastIndex;
182
- if (!allColumns[previousIndex].enabled &&
183
- allColumns.filter(col => col.enabled).length >= RivTable.ColumnsMaxShown)
184
- return state;
185
- const movedState = changeColumnOrder(state, columns, columnNameMap, previousIndex, newIndex);
186
- // Make sure the column is enabled
187
- return changeColumnEnabled(movedState, columns, columnNameMap, column, true);
188
- }
189
- TableColumnHelpers.moveColumnTo = moveColumnTo;
190
- function changeColumnOrder(state, columns, columnNameMap, previousIndex, newIndex) {
191
- const allColumns = getAllColumns(state, columns, columnNameMap);
192
- const itemToMove = allColumns[previousIndex];
193
- const currentColumnMetadata = columns.get(itemToMove.key);
194
- // You cannot move an always pinned column
195
- if (!!currentColumnMetadata?.alwaysPinned) {
196
- return state;
197
- }
198
- // First, put the columns in the desired order.
199
- const withoutItem = allColumns.filter((_, i) => i !== previousIndex);
200
- const reordered = [
201
- ...withoutItem.slice(0, newIndex),
202
- itemToMove,
203
- ...withoutItem.slice(newIndex),
204
- ];
205
- // Then, we may need to fix the pins (all pinned columns appear at the
206
- // beginning of the columns array) since the user is allowed to drag
207
- // and drop columns to and from the pinned area. If the user drags a
208
- // column across that threshold, update its pinned status.
209
- const updated = reordered.map((settings, i, arr) => {
210
- if (newIndex === i) {
211
- return {
212
- ...settings,
213
- pinned: settings.pinned
214
- ? arr[i - 1]?.pinned ?? true
215
- : arr[i + 1]?.pinned ?? false,
216
- enabled: settings.enabled
217
- ? arr[i - 1]?.enabled ?? true
218
- : arr[i + 1]?.enabled ?? false,
219
- };
220
- }
221
- else
222
- return settings;
223
- });
224
- const wasDisabled = !itemToMove.enabled;
225
- const becameEnabled = updated[newIndex].enabled;
226
- if (wasDisabled && becameEnabled) {
227
- const enabledCount = allColumns.filter(c => c.enabled).length;
228
- if (enabledCount >= RivTable.ColumnsMaxShown) {
229
- // Refuse the move; keep state as-is
230
- return state;
231
- }
232
- }
233
- return {
234
- ...state,
235
- display: {
236
- ...state.display,
237
- columnSettings: orderIntentionally(updated, columnNameMap, columns),
238
- },
239
- };
240
- }
241
- TableColumnHelpers.changeColumnOrder = changeColumnOrder;
242
- function columnSettingAfterEnabledChange(currentColumnSettings, columnMetadataMap, enabled) {
243
- const currentColumnMetadata = columnMetadataMap.get(currentColumnSettings.key);
244
- const isColumnAlwaysPinned = currentColumnMetadata?.alwaysPinned ?? false;
245
- const isColumnAlwaysVisible = currentColumnMetadata?.alwaysVisible ?? false;
246
- if (isColumnAlwaysPinned) {
247
- return {
248
- ...currentColumnSettings,
249
- enabled: true,
250
- pinned: true,
251
- };
252
- }
253
- if (isColumnAlwaysVisible) {
254
- return {
255
- ...currentColumnSettings,
256
- enabled: true,
257
- };
258
- }
259
- return {
260
- ...currentColumnSettings,
261
- enabled: enabled,
262
- // Unpin if being unchecked
263
- pinned: !enabled ? false : currentColumnSettings.pinned,
264
- };
265
- }
266
- function changeColumnEnabled(state, columns, columnNameMap, column, enabled) {
267
- const allColumns = getAllColumns(state, columns, columnNameMap);
268
- if (enabled &&
269
- allColumns.filter(col => col.enabled).length >= RivTable.ColumnsMaxShown) {
270
- return state;
271
- }
272
- const updatedColumnSettings = allColumns.map(currentColumnSettings => {
273
- if (currentColumnSettings.key !== column) {
274
- return currentColumnSettings;
275
- }
276
- return columnSettingAfterEnabledChange(currentColumnSettings, columns, enabled);
277
- });
278
- return {
279
- ...state,
280
- display: {
281
- ...state.display,
282
- columnSettings: orderIntentionally(updatedColumnSettings, columnNameMap, columns),
283
- },
284
- };
285
- }
286
- TableColumnHelpers.changeColumnEnabled = changeColumnEnabled;
287
- function enableAllColumns(state, columns, columnNameMap, enabled) {
288
- const allColumns = getAllColumns(state, columns, columnNameMap);
289
- if (enabled && allColumns.length > RivTable.ColumnsMaxShown) {
290
- return state;
291
- }
292
- const updatedColumnSettings = allColumns.map(currentColumnSettings => {
293
- return columnSettingAfterEnabledChange(currentColumnSettings, columns, enabled);
294
- });
295
- return {
296
- ...state,
297
- display: {
298
- ...state.display,
299
- columnSettings: orderIntentionally(updatedColumnSettings, columnNameMap, columns),
300
- },
301
- };
302
- }
303
- TableColumnHelpers.enableAllColumns = enableAllColumns;
304
- function changeColumnWidth(state, columns, columnNameMap, column, preferredWidth) {
305
- const allColumns = getAllColumns(state, columns, columnNameMap);
306
- return {
307
- ...state,
308
- display: {
309
- ...state.display,
310
- columnSettings: allColumns.map(c => ({
311
- ...c,
312
- preferredWidth: c.key === column ? preferredWidth : c.preferredWidth,
313
- })),
314
- },
315
- };
316
- }
317
- TableColumnHelpers.changeColumnWidth = changeColumnWidth;
318
- function resetToDefaultColumns(state, columns, columnNameMap, defaultColumnState) {
319
- return {
320
- ...state,
321
- display: {
322
- ...state.display,
323
- columnSettings: orderIntentionally(defaultColumnState, columnNameMap, columns),
324
- },
325
- };
326
- }
327
- TableColumnHelpers.resetToDefaultColumns = resetToDefaultColumns;
328
- function convertInMemoryColumnMetadataMap(columns) {
329
- return new Map([...columns.entries()].map(([name, { orderKey, ...metadata }]) => [
330
- name,
331
- {
332
- ...metadata,
333
- orderable: !!orderKey,
334
- },
335
- ]));
336
- }
337
- TableColumnHelpers.convertInMemoryColumnMetadataMap = convertInMemoryColumnMetadataMap;
338
- function getColumnSettingsColumnList(state) {
339
- const allColumnMetadata = [
340
- ...state.display.columns,
341
- ...state.display.disabledColumns,
342
- ];
343
- const columnsLength = state.display.allColumns.length;
344
- const allColumns = state.display.allColumns.map((column, i) => {
345
- const nextColumnPinned = i + 2 <= columnsLength
346
- ? state.display.allColumns[i + 1].pinned
347
- : false;
348
- const currentColumnMetadata = allColumnMetadata.find(metadata => metadata.key === column.key);
349
- return {
350
- ...column,
351
- resolvedName: state.display.columnNameMap.get(column.key) ?? column.key,
352
- stateIndex: i,
353
- isLastPinnedColumn: column.pinned && !nextColumnPinned,
354
- alwaysVisible: currentColumnMetadata?.alwaysVisible ?? false,
355
- tooltipForHideIcon: currentColumnMetadata?.tooltipForHideIcon,
356
- alwaysPinned: currentColumnMetadata?.alwaysPinned ?? false,
357
- tooltipForReorderIcon: currentColumnMetadata?.tooltipForReorderIcon,
358
- highlightIndices: [],
359
- };
360
- });
361
- return allColumns;
362
- }
363
- TableColumnHelpers.getColumnSettingsColumnList = getColumnSettingsColumnList;
364
- function createUnavailableColumns(unvailableColumnKeys) {
365
- return unvailableColumnKeys.map(columnKey => {
366
- return {
367
- key: columnKey,
368
- resolvedName: columnKey,
369
- enabled: false,
370
- pinned: false,
371
- isLastPinnedColumn: false,
372
- alwaysVisible: false,
373
- alwaysPinned: false,
374
- preferredWidth: 'auto',
375
- highlightIndices: [],
376
- stateIndex: -1,
377
- isUnavailable: true,
378
- };
379
- });
380
- }
381
- TableColumnHelpers.createUnavailableColumns = createUnavailableColumns;
382
- })(TableColumnHelpers || (TableColumnHelpers = {}));
383
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi90YWJsZS90YWJsZS9zdGF0ZS1oZWxwZXJzL2NvbHVtbi1oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxJQUFJLGVBQWUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVsRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXBDLE1BQU0sS0FBVyxrQkFBa0IsQ0FzcEJsQztBQXRwQkQsV0FBaUIsa0JBQWtCO0lBQ2pDLFNBQWdCLGtCQUFrQixDQUNoQyxRQUFpQyxFQUNqQyxPQUFnQjtRQUVoQixJQUFJLE9BQU87WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUMzQixRQUFRLFFBQVEsRUFBRTtZQUNoQixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssVUFBVTtnQkFDYixPQUFPLE1BQU0sQ0FBQztZQUNoQixLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssV0FBVztnQkFDZCxPQUFPLFFBQVEsQ0FBQztZQUNsQixLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxPQUFPLENBQUM7U0FDbEI7SUFDSCxDQUFDO0lBakJlLHFDQUFrQixxQkFpQmpDLENBQUE7SUFFRCxTQUFnQixhQUFhLENBTTNCLEtBQXFDLEVBQ3JDLGdCQUFpRCxFQUNqRCxhQUF3QztRQUV4Qyw0RUFBNEU7UUFDNUUsNEVBQTRFO1FBQzVFLDJFQUEyRTtRQUMzRSw2RUFBNkU7UUFDN0UseUVBQXlFO1FBQ3pFLHVFQUF1RTtRQUN2RSxrQ0FBa0M7UUFDbEMsTUFBTSw4QkFBOEIsR0FBRyxVQUFVLENBQy9DLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUM1QixLQUFLLENBQUMsT0FB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LEVBQUUsU0FBUztnQkFDZCxZQUFZLEVBQUUsU0FBUztnQkFDdkIsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsTUFBTSxFQUFFLEtBQUs7Z0JBQ2Isa0JBQWtCLEVBQUUsS0FBSztnQkFDekIsYUFBYSxFQUFFLEtBQUs7Z0JBQ3BCLFlBQVksRUFBRSxLQUFLO2dCQUNuQixjQUFjLEVBQUUsTUFBTTtnQkFDdEIsZ0JBQWdCLEVBQUUsRUFBRTtnQkFDcEIsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDZCxhQUFhLEVBQUUsSUFBSTthQUNwQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBckJlLDJDQUF3QiwyQkFxQnZDLENBQUE7QUFDSCxDQUFDLEVBdHBCZ0Isa0JBQWtCLEtBQWxCLGtCQUFrQixRQXNwQmxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGlmZmVyZW5jZSwgcGFydGl0aW9uIGFzIGxvZGFzaFBhcnRpdGlvbiB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBIaWdobGlnaHRDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi92aXN1YWxpemF0aW9uL2hpZ2hsaWdodC9oaWdobGlnaHQuY29tcG9uZW50JztcbmltcG9ydCB7IFJpdlRhYmxlIH0gZnJvbSAnLi4vc3RhdGUnO1xuXG5leHBvcnQgbmFtZXNwYWNlIFRhYmxlQ29sdW1uSGVscGVycyB7XG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRDb2x1bW5BbGlnbm1lbnQoXG4gICAgZGF0YVR5cGU6IFJpdlRhYmxlLkNvbHVtbkRhdGFUeXBlLFxuICAgIGlzRmlyc3Q6IGJvb2xlYW4sXG4gICk6IFJpdlRhYmxlLkNvbHVtbkFsaWdubWVudCB7XG4gICAgaWYgKGlzRmlyc3QpIHJldHVybiAnbGVmdCc7XG4gICAgc3dpdGNoIChkYXRhVHlwZSkge1xuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICBjYXNlICdsb25nVGV4dCc6XG4gICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgICBjYXNlICdhZHZhbmNlZCc6XG4gICAgICBjYXNlICdpY29uJzpcbiAgICAgIGNhc2UgJ3Nob3J0VGV4dCc6XG4gICAgICAgIHJldHVybiAnY2VudGVyJztcbiAgICAgIGNhc2UgJ2N1cnJlbmN5JzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHJldHVybiAncmlnaHQnO1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBnZXRBbGxDb2x1bW5zPFxuICAgIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gICAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4gID4oXG4gICAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgICBzdXBwb3J0ZWRDb2x1bW5zOiBNYXA8QywgUml2VGFibGUuQ29sdW1uTWV0YWRhdGE+LFxuICAgIGNvbHVtbk5hbWVNYXA6IFJpdlRhYmxlLkNvbHVtbk5hbWVNYXA8Qz4sXG4gICk6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10ge1xuICAgIC8vIElmIHRoZSB0YWJsZSBvZmZlcnMgbW9yZSBjb2x1bW5zIHRoYW4gdGhlIHVzZXIgaGFzIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3NcbiAgICAvLyBmb3IgKG9yIGlmIHRoZSB1c2VyIGhhcyBubyBjb25maWd1cmF0aW9uIHNldHRpbmdzIHlldCksIHdlJ2xsIGFwcGVuZCB0aGVtXG4gICAgLy8gdG8gdGhlIGVuZCAodW5sZXNzIHRoZXkgc2hvdWxkIGJlIHBpbm5lZCBieSBkZWZhdWx0LCBpbiB3aGljaCBjYXNlIHdlJ2xsXG4gICAgLy8gYXBwZW5kIHRoZW0gYWZ0ZXIgdGhlIG90aGVyIHBpbm5lZCBjb2x1bW5zKS4gVGhpcyBlbnN1cmVzIHRoYXQgbmV3IGNvbHVtbnNcbiAgICAvLyB3ZSBhZGQgdG8gZXhpc3RpbmcgdGFibGVzIG92ZXIgdGltZSAoMSkgZ2V0IGRpc3BsYXllZCBldmVuIHRob3VnaCB0aGV5XG4gICAgLy8gZG9uJ3QgYXBwZWFyIGluIHRoZSB1c2VyJ3MgY29uZmlndXJhdGlvbiBzZXR0aW5ncyB5ZXQsIGFuZCAoMikgZG9uJ3RcbiAgICAvLyBpbnRlcnJ1cHQgdGhlaXIgZXhpc3Rpbmcgc2V0dXAuXG4gICAgY29uc3QgY29sdW1uTmFtZXNXaXRob3V0VXNlclNldHRpbmdzID0gZGlmZmVyZW5jZShcbiAgICAgIFsuLi5zdXBwb3J0ZWRDb2x1bW5zLmtleXMoKV0sXG4gICAgICBzdGF0ZS5kaXNwbGF5LmNvbHVtblNldHRpbmdzLm1hcCgoeyBrZXkgfSkgPT4ga2V5KSxcbiAgICApO1xuXG4gICAgLy8gVGhyb3cgb3V0IHNldHRpbmdzIGZvciBjb2x1bW5zIG5vIGxvbmdlciBvZmZlcmVkIGJ5IHRoZSB0YWJsZS5cbiAgICBjb25zdCBvbmx5Q29sdW1uc1dpdGhVc2VyU2V0dGluZ3M6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10gPVxuICAgICAgc3RhdGUuZGlzcGxheS5jb2x1bW5TZXR0aW5ncy5maWx0ZXIoKHsga2V5IH0pID0+XG4gICAgICAgIHN1cHBvcnRlZENvbHVtbnMuaGFzKGtleSksXG4gICAgICApO1xuICAgIGNvbnN0IGNvbHVtbnNXaXRoVXNlclNldHRpbmdzOiBSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPltdID1cbiAgICAgIG9ubHlDb2x1bW5zV2l0aFVzZXJTZXR0aW5ncy5tYXAoY29sdW1uU2V0dGluZyA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY29sdW1uU2V0dGluZyxcbiAgICAgICAgICAvKlxuICAgICAgICAgICAgT3ZlcndyaXRlIHRoZSBlbmFibGVkL3Bpbm5lZCBzdGF0ZSBpZiB0aGUgY29sdW1uIHNob3VsZCBiZSBcImFsd2F5cyBwaW5uZWRcIi5cbiAgICAgICAgICAgIE90aGVyd2lzZSwgcmVzcGVjdCB0aGUgc2F2ZWQgdXNlciBzZXR0aW5ncy5cbiAgICAgICAgICAqL1xuICAgICAgICAgIGVuYWJsZWQ6ICEhc3VwcG9ydGVkQ29sdW1ucy5nZXQoY29sdW1uU2V0dGluZy5rZXkpPy5hbHdheXNQaW5uZWRcbiAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgOiBjb2x1bW5TZXR0aW5nLmVuYWJsZWQsXG4gICAgICAgICAgcGlubmVkOiAhIXN1cHBvcnRlZENvbHVtbnMuZ2V0KGNvbHVtblNldHRpbmcua2V5KT8uYWx3YXlzUGlubmVkXG4gICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgIDogY29sdW1uU2V0dGluZy5waW5uZWQsXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgIGNvbnN0IGNvbHVtbnNXaXRob3V0VXNlclNldHRpbmdzOiBSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPltdID0gW1xuICAgICAgLi4uY29sdW1uTmFtZXNXaXRob3V0VXNlclNldHRpbmdzLFxuICAgIF0ubWFwKChrZXk6IEMpID0+ICh7XG4gICAgICBrZXksXG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgcHJlZmVycmVkV2lkdGg6ICdhdXRvJyxcbiAgICAgIHBpbm5lZDpcbiAgICAgICAgISFzdXBwb3J0ZWRDb2x1bW5zLmdldChrZXkpPy5kZWZhdWx0UGlubmVkIHx8XG4gICAgICAgICEhc3VwcG9ydGVkQ29sdW1ucy5nZXQoa2V5KT8uYWx3YXlzUGlubmVkLFxuICAgIH0pKTtcblxuICAgIHJldHVybiBvcmRlckludGVudGlvbmFsbHkoXG4gICAgICBbLi4uY29sdW1uc1dpdGhVc2VyU2V0dGluZ3MsIC4uLmNvbHVtbnNXaXRob3V0VXNlclNldHRpbmdzXSxcbiAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICBzdXBwb3J0ZWRDb2x1bW5zLFxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBvcmRlckludGVudGlvbmFsbHk8QyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbj4oXG4gICAgY29sdW1uczogUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz5bXSxcbiAgICBjb2x1bW5OYW1lTWFwOiBSaXZUYWJsZS5Db2x1bW5OYW1lTWFwPEM+LFxuICAgIGNvbHVtbk1ldGFkYXRhTWFwOiBNYXA8QywgUml2VGFibGUuQ29sdW1uTWV0YWRhdGE+LFxuICApOiBSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPltdIHtcbiAgICBjb25zdCBbYWx3YXlzUGlubmVkQ29sdW1ucywgc29tZXRpbWVzUGlubmVkQ29sdW1uc10gPSBsb2Rhc2hQYXJ0aXRpb24oXG4gICAgICBjb2x1bW5zLFxuICAgICAgY29sdW1uID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudENvbHVtbk1ldGFkYXRhOiBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YSB8IHVuZGVmaW5lZCA9XG4gICAgICAgICAgY29sdW1uTWV0YWRhdGFNYXAuZ2V0KGNvbHVtbi5rZXkpO1xuXG4gICAgICAgIHJldHVybiBjdXJyZW50Q29sdW1uTWV0YWRhdGE/LmFsd2F5c1Bpbm5lZCA/PyBmYWxzZTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IFtwaW5uZWRDb2x1bW5zLCB1bnBpbm5lZENvbHVtbnNdID0gbG9kYXNoUGFydGl0aW9uKFxuICAgICAgc29tZXRpbWVzUGlubmVkQ29sdW1ucyxcbiAgICAgIGNvbHVtbiA9PiBjb2x1bW4ucGlubmVkLFxuICAgICk7XG5cbiAgICBjb25zdCBbZW5hYmxlZFVucGlubmVkQ29sdW1ucywgZGlzYWJsZWRDb2x1bW5zXSA9IGxvZGFzaFBhcnRpdGlvbihcbiAgICAgIHVucGlubmVkQ29sdW1ucyxcbiAgICAgIGNvbHVtbiA9PiBjb2x1bW4uZW5hYmxlZCxcbiAgICApO1xuXG4gICAgY29uc3Qgc29ydGVkRGlzYWJsZWRDb2x1bW5zID0gZGlzYWJsZWRDb2x1bW5zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFOYW1lID0gY29sdW1uTmFtZU1hcC5nZXQoYS5rZXkpID8/IGEua2V5O1xuICAgICAgY29uc3QgYk5hbWUgPSBjb2x1bW5OYW1lTWFwLmdldChiLmtleSkgPz8gYi5rZXk7XG4gICAgICByZXR1cm4gYU5hbWUubG9jYWxlQ29tcGFyZShiTmFtZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gW1xuICAgICAgLi4uYWx3YXlzUGlubmVkQ29sdW1ucyxcbiAgICAgIC4uLnBpbm5lZENvbHVtbnMsXG4gICAgICAuLi5lbmFibGVkVW5waW5uZWRDb2x1bW5zLFxuICAgICAgLi4uc29ydGVkRGlzYWJsZWRDb2x1bW5zLFxuICAgIF07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRBbGlnbm1lbnQoXG4gICAgbWV0YWRhdGE6IFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgYWxsb3dTZWxlY3Rpb24/OiBib29sZWFuLFxuICApOiBSaXZUYWJsZS5Db2x1bW5BbGlnbm1lbnQge1xuICAgIHJldHVybiBnZXRDb2x1bW5BbGlnbm1lbnQoXG4gICAgICBtZXRhZGF0YS5kYXRhVHlwZSxcbiAgICAgIGluZGV4ID09PSAwICYmICFhbGxvd1NlbGVjdGlvbixcbiAgICApO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb2x1bW5zPFxuICAgIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gICAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4gID4oXG4gICAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgICBzdXBwb3J0ZWRDb2x1bW5zOiBNYXA8QywgUml2VGFibGUuQ29sdW1uTWV0YWRhdGE+LFxuICAgIGNvbHVtbk5hbWVNYXA6IFJpdlRhYmxlLkNvbHVtbk5hbWVNYXA8Qz4sXG4gICAgYWxsb3dTZWxlY3Rpb246IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgZmlsdGVyVG86ICdlbmFibGVkJyB8ICdkaXNhYmxlZCcsXG4gICAgaGFzSGVhZGVyczogYm9vbGVhbixcbiAgKTogUml2VGFibGUuRnVsbENvbHVtbjxDPltdIHtcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gZ2V0QWxsQ29sdW1ucyhzdGF0ZSwgc3VwcG9ydGVkQ29sdW1ucywgY29sdW1uTmFtZU1hcCk7XG4gICAgcmV0dXJuIGFsbENvbHVtbnNcbiAgICAgIC5maWx0ZXIoKHsgZW5hYmxlZCB9KSA9PiAoZmlsdGVyVG8gPT09ICdlbmFibGVkJyA/IGVuYWJsZWQgOiAhZW5hYmxlZCkpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoXG4gICAgICAgICAgZnVsbENvbHVtbnM6IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz5bXSxcbiAgICAgICAgICBzZXR0aW5nczogUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz4sXG4gICAgICAgICAgaTogbnVtYmVyLFxuICAgICAgICApOiBSaXZUYWJsZS5GdWxsQ29sdW1uPEM+W10gPT4ge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gc3VwcG9ydGVkQ29sdW1ucy5nZXQoc2V0dGluZ3Mua2V5KSE7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRXaWR0aCA9XG4gICAgICAgICAgICBzZXR0aW5ncy5wcmVmZXJyZWRXaWR0aCA9PT0gJ2F1dG8nXG4gICAgICAgICAgICAgID8gbWV0YWRhdGEubWluV2lkdGhcbiAgICAgICAgICAgICAgOiBNYXRoLm1heChtZXRhZGF0YS5taW5XaWR0aCwgc2V0dGluZ3MucHJlZmVycmVkV2lkdGgpO1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzQ29sdW1uOiBSaXZUYWJsZS5GdWxsQ29sdW1uPEM+IHwgdW5kZWZpbmVkID1cbiAgICAgICAgICAgIGZ1bGxDb2x1bW5zW2kgLSAxXTtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4uZnVsbENvbHVtbnMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnNldHRpbmdzLFxuICAgICAgICAgICAgICAuLi5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgd2lkdGg6IHJlc29sdmVkV2lkdGgsXG4gICAgICAgICAgICAgIGxlZnQ6IHNldHRpbmdzLnBpbm5lZFxuICAgICAgICAgICAgICAgID8gcHJldmlvdXNDb2x1bW5cbiAgICAgICAgICAgICAgICAgID8gKHByZXZpb3VzQ29sdW1uLmxlZnQgfHwgMCkgKyBwcmV2aW91c0NvbHVtbi53aWR0aFxuICAgICAgICAgICAgICAgICAgOiAhIWFsbG93U2VsZWN0aW9uIHx8ICEhaGFzSGVhZGVyc1xuICAgICAgICAgICAgICAgICAgPyA0MCAvLyBUaGlzIG1ha2VzIHN1cmUgdGhlIHBpbm5lZCBjb2x1bW4gYWNjb3VudHMgZm9yIHRoZSBjaGVja2JveC9jaGV2cm9uIGNvbHVtbiBvbiB0aGUgZmFyIGxlZnRcbiAgICAgICAgICAgICAgICAgIDogMFxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgYWxpZ25tZW50OiBnZXRBbGlnbm1lbnQobWV0YWRhdGEsIGksICEhYWxsb3dTZWxlY3Rpb24pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdO1xuICAgICAgICB9LFxuICAgICAgICBbXSxcbiAgICAgICk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gY2hhbmdlQ29sdW1uUGluPFxuICAgIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gICAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4gID4oXG4gICAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgICBjb2x1bW5zOiBNYXA8QywgUml2VGFibGUuQ29sdW1uTWV0YWRhdGE+LFxuICAgIGNvbHVtbk5hbWVNYXA6IFJpdlRhYmxlLkNvbHVtbk5hbWVNYXA8Qz4sXG4gICAgY29sdW1uOiBDLFxuICAgIHBpbm5lZDogYm9vbGVhbixcbiAgKTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+IHtcbiAgICBjb25zdCBjdXJyZW50Q29sdW1uTWV0YWRhdGE6IFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhIHwgdW5kZWZpbmVkID1cbiAgICAgIGNvbHVtbnMuZ2V0KGNvbHVtbik7XG5cbiAgICAvLyBZb3UgY2Fubm90IGNoYW5nZSB0aGUgcGlubmVkIHN0YXR1cyBvZiBhbiBhbHdheXMgcGlubmVkIGNvbHVtblxuICAgIGlmICghIWN1cnJlbnRDb2x1bW5NZXRhZGF0YT8uYWx3YXlzUGlubmVkKSB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsQ29sdW1ucyA9IGdldEFsbENvbHVtbnMoc3RhdGUsIGNvbHVtbnMsIGNvbHVtbk5hbWVNYXApO1xuXG4gICAgaWYgKHBpbm5lZCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gYWxsQ29sdW1ucy5maW5kKGMgPT4gYy5rZXkgPT09IGNvbHVtbik7XG4gICAgICBjb25zdCB3YXNFbmFibGVkID0gISF0YXJnZXQ/LmVuYWJsZWQ7XG4gICAgICBpZiAoIXdhc0VuYWJsZWQpIHtcbiAgICAgICAgY29uc3QgZW5hYmxlZENvdW50ID0gYWxsQ29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5lbmFibGVkKS5sZW5ndGg7XG4gICAgICAgIGlmIChlbmFibGVkQ291bnQgPj0gUml2VGFibGUuQ29sdW1uc01heFNob3duKSB7XG4gICAgICAgICAgcmV0dXJuIHN0YXRlOyAvLyByZWZ1c2UgdGhlIHBpbiBzaW5jZSBpdCB3b3VsZCBleGNlZWQgdGhlIG1heFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZGlzcGxheToge1xuICAgICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgICBjb2x1bW5TZXR0aW5nczogb3JkZXJJbnRlbnRpb25hbGx5KFxuICAgICAgICAgIGFsbENvbHVtbnMubWFwKGMgPT4gKHtcbiAgICAgICAgICAgIC4uLmMsXG4gICAgICAgICAgICBwaW5uZWQ6IGMua2V5ID09PSBjb2x1bW4gPyBwaW5uZWQgOiBjLnBpbm5lZCxcbiAgICAgICAgICAgIC8vIENoZWNrL2VuYWJsZSBpZiBiZWluZyBwaW5uZWRcbiAgICAgICAgICAgIGVuYWJsZWQ6IGMua2V5ID09PSBjb2x1bW4gJiYgcGlubmVkID8gdHJ1ZSA6IGMuZW5hYmxlZCxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICApLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZUNvbHVtbnNGcmVlemVTdGF0ZTxcbiAgICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICAgIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gICAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gICAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuICA+KFxuICAgIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gICAgY29sdW1uczogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPixcbiAgICBjb2x1bW5OYW1lTWFwOiBSaXZUYWJsZS5Db2x1bW5OYW1lTWFwPEM+LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgZnJlZXplOiBib29sZWFuLFxuICApOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4ge1xuICAgIGNvbnN0IGFsbENvbHVtbnMgPSBnZXRBbGxDb2x1bW5zKHN0YXRlLCBjb2x1bW5zLCBjb2x1bW5OYW1lTWFwKTtcblxuICAgIGNvbnN0IHVwZGF0ZWRDb2x1bW5TZXR0aW5nczogUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz5bXSA9IGFsbENvbHVtbnMubWFwKFxuICAgICAgKGN1cnJlbnRDb2x1bW5TZXR0aW5ncywgY3VycmVudEluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb2x1bW5NZXRhZGF0YTogUml2VGFibGUuQ29sdW1uTWV0YWRhdGEgfCB1bmRlZmluZWQgPVxuICAgICAgICAgIGNvbHVtbnMuZ2V0KGN1cnJlbnRDb2x1bW5TZXR0aW5ncy5rZXkpO1xuXG4gICAgICAgIGNvbnN0IGlzQ29sdW1uQWx3YXlzUGlubmVkOiBib29sZWFuID1cbiAgICAgICAgICBjdXJyZW50Q29sdW1uTWV0YWRhdGE/LmFsd2F5c1Bpbm5lZCA/PyBmYWxzZTtcblxuICAgICAgICBpZiAoaXNDb2x1bW5BbHdheXNQaW5uZWQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY3VycmVudENvbHVtblNldHRpbmdzLFxuICAgICAgICAgICAgcGlubmVkOiB0cnVlLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jdXJyZW50Q29sdW1uU2V0dGluZ3MsXG4gICAgICAgICAgcGlubmVkOiBmcmVlemUgJiYgY3VycmVudEluZGV4IDw9IGluZGV4LFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZGlzcGxheToge1xuICAgICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgICBjb2x1bW5TZXR0aW5nczogdXBkYXRlZENvbHVtblNldHRpbmdzLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG1vdmVDb2x1bW5UbzxcbiAgICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICAgIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gICAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gICAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuICA+KFxuICAgIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gICAgY29sdW1uczogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPixcbiAgICBjb2x1bW5OYW1lTWFwOiBSaXZUYWJsZS5Db2x1bW5OYW1lTWFwPEM+LFxuICAgIGNvbHVtbjogQyxcbiAgICBwb3NpdGlvbjogJ3N0YXJ0JyB8ICdlbmQnLFxuICApOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4ge1xuICAgIGNvbnN0IGN1cnJlbnRDb2x1bW5NZXRhZGF0YTogUml2VGFibGUuQ29sdW1uTWV0YWRhdGEgfCB1bmRlZmluZWQgPVxuICAgICAgY29sdW1ucy5nZXQoY29sdW1uKTtcblxuICAgIC8vIFlvdSBjYW5ub3QgbW92ZSBhbiBhbHdheXMgcGlubmVkIGNvbHVtblxuICAgIGlmICghIWN1cnJlbnRDb2x1bW5NZXRhZGF0YT8uYWx3YXlzUGlubmVkKSB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsQ29sdW1ucyA9IGdldEFsbENvbHVtbnMoc3RhdGUsIGNvbHVtbnMsIGNvbHVtbk5hbWVNYXApO1xuICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSBhbGxDb2x1bW5zLmZpbmRJbmRleChjID0+IGMua2V5ID09PSBjb2x1bW4pO1xuICAgIGNvbnN0IGxhc3RJbmRleCA9XG4gICAgICBwb3NpdGlvbiA9PSAnZW5kJyA/IGFsbENvbHVtbnMuZmluZEluZGV4KGMgPT4gIWMuZW5hYmxlZCkgOiAwO1xuICAgIGNvbnN0IG5ld0luZGV4ID1cbiAgICAgIHBvc2l0aW9uID09ICdzdGFydCdcbiAgICAgICAgPyAwXG4gICAgICAgIDogbGFzdEluZGV4ID09IC0xXG4gICAgICAgID8gYWxsQ29sdW1ucy5sZW5ndGggLSAxXG4gICAgICAgIDogbGFzdEluZGV4O1xuXG4gICAgaWYgKFxuICAgICAgIWFsbENvbHVtbnNbcHJldmlvdXNJbmRleF0uZW5hYmxlZCAmJlxuICAgICAgYWxsQ29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5lbmFibGVkKS5sZW5ndGggPj0gUml2VGFibGUuQ29sdW1uc01heFNob3duXG4gICAgKVxuICAgICAgcmV0dXJuIHN0YXRlO1xuXG4gICAgY29uc3QgbW92ZWRTdGF0ZSA9IGNoYW5nZUNvbHVtbk9yZGVyKFxuICAgICAgc3RhdGUsXG4gICAgICBjb2x1bW5zLFxuICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgIHByZXZpb3VzSW5kZXgsXG4gICAgICBuZXdJbmRleCxcbiAgICApO1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgY29sdW1uIGlzIGVuYWJsZWRcbiAgICByZXR1cm4gY2hhbmdlQ29sdW1uRW5hYmxlZChcbiAgICAgIG1vdmVkU3RhdGUsXG4gICAgICBjb2x1bW5zLFxuICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgIGNvbHVtbixcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VDb2x1bW5PcmRlcjxcbiAgICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICAgIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gICAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gICAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuICA+KFxuICAgIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gICAgY29sdW1uczogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPixcbiAgICBjb2x1bW5OYW1lTWFwOiBSaXZUYWJsZS5Db2x1bW5OYW1lTWFwPEM+LFxuICAgIHByZXZpb3VzSW5kZXg6IG51bWJlcixcbiAgICBuZXdJbmRleDogbnVtYmVyLFxuICApOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4ge1xuICAgIGNvbnN0IGFsbENvbHVtbnMgPSBnZXRBbGxDb2x1bW5zKHN0YXRlLCBjb2x1bW5zLCBjb2x1bW5OYW1lTWFwKTtcblxuICAgIGNvbnN0IGl0ZW1Ub01vdmUgPSBhbGxDb2x1bW5zW3ByZXZpb3VzSW5kZXhdO1xuXG4gICAgY29uc3QgY3VycmVudENvbHVtbk1ldGFkYXRhOiBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YSB8IHVuZGVmaW5lZCA9XG4gICAgICBjb2x1bW5zLmdldChpdGVtVG9Nb3ZlLmtleSk7XG4gICAgLy8gWW91IGNhbm5vdCBtb3ZlIGFuIGFsd2F5cyBwaW5uZWQgY29sdW1uXG4gICAgaWYgKCEhY3VycmVudENvbHVtbk1ldGFkYXRhPy5hbHdheXNQaW5uZWQpIHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICAvLyBGaXJzdCwgcHV0IHRoZSBjb2x1bW5zIGluIHRoZSBkZXNpcmVkIG9yZGVyLlxuICAgIGNvbnN0IHdpdGhvdXRJdGVtID0gYWxsQ29sdW1ucy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IHByZXZpb3VzSW5kZXgpO1xuICAgIGNvbnN0IHJlb3JkZXJlZCA9IFtcbiAgICAgIC4uLndpdGhvdXRJdGVtLnNsaWNlKDAsIG5ld0luZGV4KSxcbiAgICAgIGl0ZW1Ub01vdmUsXG4gICAgICAuLi53aXRob3V0SXRlbS5zbGljZShuZXdJbmRleCksXG4gICAgXTtcblxuICAgIC8vIFRoZW4sIHdlIG1heSBuZWVkIHRvIGZpeCB0aGUgcGlucyAoYWxsIHBpbm5lZCBjb2x1bW5zIGFwcGVhciBhdCB0aGVcbiAgICAvLyBiZWdpbm5pbmcgb2YgdGhlIGNvbHVtbnMgYXJyYXkpIHNpbmNlIHRoZSB1c2VyIGlzIGFsbG93ZWQgdG8gZHJhZ1xuICAgIC8vIGFuZCBkcm9wIGNvbHVtbnMgdG8gYW5kIGZyb20gdGhlIHBpbm5lZCBhcmVhLiBJZiB0aGUgdXNlciBkcmFncyBhXG4gICAgLy8gY29sdW1uIGFjcm9zcyB0aGF0IHRocmVzaG9sZCwgdXBkYXRlIGl0cyBwaW5uZWQgc3RhdHVzLlxuICAgIGNvbnN0IHVwZGF0ZWQgPSByZW9yZGVyZWQubWFwKChzZXR0aW5ncywgaSwgYXJyKSA9PiB7XG4gICAgICBpZiAobmV3SW5kZXggPT09IGkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zZXR0aW5ncyxcbiAgICAgICAgICBwaW5uZWQ6IHNldHRpbmdzLnBpbm5lZFxuICAgICAgICAgICAgPyBhcnJbaSAtIDFdPy5waW5uZWQgPz8gdHJ1ZVxuICAgICAgICAgICAgOiBhcnJbaSArIDFdPy5waW5uZWQgPz8gZmFsc2UsXG4gICAgICAgICAgZW5hYmxlZDogc2V0dGluZ3MuZW5hYmxlZFxuICAgICAgICAgICAgPyBhcnJbaSAtIDFdPy5lbmFibGVkID8/IHRydWVcbiAgICAgICAgICAgIDogYXJyW2kgKyAxXT8uZW5hYmxlZCA/PyBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSByZXR1cm4gc2V0dGluZ3M7XG4gICAgfSk7XG5cbiAgICBjb25zdCB3YXNEaXNhYmxlZCA9ICFpdGVtVG9Nb3ZlLmVuYWJsZWQ7XG4gICAgY29uc3QgYmVjYW1lRW5hYmxlZCA9IHVwZGF0ZWRbbmV3SW5kZXhdLmVuYWJsZWQ7XG4gICAgaWYgKHdhc0Rpc2FibGVkICYmIGJlY2FtZUVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IGVuYWJsZWRDb3VudCA9IGFsbENvbHVtbnMuZmlsdGVyKGMgPT4gYy5lbmFibGVkKS5sZW5ndGg7XG4gICAgICBpZiAoZW5hYmxlZENvdW50ID49IFJpdlRhYmxlLkNvbHVtbnNNYXhTaG93bikge1xuICAgICAgICAvLyBSZWZ1c2UgdGhlIG1vdmU7IGtlZXAgc3RhdGUgYXMtaXNcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgLi4uc3RhdGUuZGlzcGxheSxcbiAgICAgICAgY29sdW1uU2V0dGluZ3M6IG9yZGVySW50ZW50aW9uYWxseSh1cGRhdGVkLCBjb2x1bW5OYW1lTWFwLCBjb2x1bW5zKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbHVtblNldHRpbmdBZnRlckVuYWJsZWRDaGFuZ2U8QyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbj4oXG4gICAgY3VycmVudENvbHVtblNldHRpbmdzOiBSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPixcbiAgICBjb2x1bW5NZXRhZGF0YU1hcDogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPixcbiAgICBlbmFibGVkOiBib29sZWFuLFxuICApOiBSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPiB7XG4gICAgY29uc3QgY3VycmVudENvbHVtbk1ldGFkYXRhOiBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YSB8IHVuZGVmaW5lZCA9XG4gICAgICBjb2x1bW5NZXRhZGF0YU1hcC5nZXQoY3VycmVudENvbHVtblNldHRpbmdzLmtleSk7XG5cbiAgICBjb25zdCBpc0NvbHVtbkFsd2F5c1Bpbm5lZDogYm9vbGVhbiA9XG4gICAgICBjdXJyZW50Q29sdW1uTWV0YWRhdGE/LmFsd2F5c1Bpbm5lZCA/PyBmYWxzZTtcbiAgICBjb25zdCBpc0NvbHVtbkFsd2F5c1Zpc2libGU6IGJvb2xlYW4gPVxuICAgICAgY3VycmVudENvbHVtbk1ldGFkYXRhPy5hbHdheXNWaXNpYmxlID8/IGZhbHNlO1xuXG4gICAgaWYgKGlzQ29sdW1uQWx3YXlzUGlubmVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jdXJyZW50Q29sdW1uU2V0dGluZ3MsXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIHBpbm5lZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChpc0NvbHVtbkFsd2F5c1Zpc2libGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmN1cnJlbnRDb2x1bW5TZXR0aW5ncyxcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmN1cnJlbnRDb2x1bW5TZXR0aW5ncyxcbiAgICAgIGVuYWJsZWQ6IGVuYWJsZWQsXG4gICAgICAvLyBVbnBpbiBpZiBiZWluZyB1bmNoZWNrZWRcbiAgICAgIHBpbm5lZDogIWVuYWJsZWQgPyBmYWxzZSA6IGN1cnJlbnRDb2x1bW5TZXR0aW5ncy5waW5uZWQsXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VDb2x1bW5FbmFibGVkPFxuICAgIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gICAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4gID4oXG4gICAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgICBjb2x1bW5zOiBNYXA8QywgUml2VGFibGUuQ29sdW1uTWV0YWRhdGE+LFxuICAgIGNvbHVtbk5hbWVNYXA6IFJpdlRhYmxlLkNvbHVtbk5hbWVNYXA8Qz4sXG4gICAgY29sdW1uOiBDLFxuICAgIGVuYWJsZWQ6IGJvb2xlYW4sXG4gICk6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gICAgY29uc3QgYWxsQ29sdW1ucyA9IGdldEFsbENvbHVtbnMoc3RhdGUsIGNvbHVtbnMsIGNvbHVtbk5hbWVNYXApO1xuICAgIGlmIChcbiAgICAgIGVuYWJsZWQgJiZcbiAgICAgIGFsbENvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuZW5hYmxlZCkubGVuZ3RoID49IFJpdlRhYmxlLkNvbHVtbnNNYXhTaG93blxuICAgICkge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZWRDb2x1bW5TZXR0aW5nczogUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz5bXSA9IGFsbENvbHVtbnMubWFwKFxuICAgICAgY3VycmVudENvbHVtblNldHRpbmdzID0+IHtcbiAgICAgICAgaWYgKGN1cnJlbnRDb2x1bW5TZXR0aW5ncy5rZXkgIT09IGNvbHVtbikge1xuICAgICAgICAgIHJldHVybiBjdXJyZW50Q29sdW1uU2V0dGluZ3M7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29sdW1uU2V0dGluZ0FmdGVyRW5hYmxlZENoYW5nZShcbiAgICAgICAgICBjdXJyZW50Q29sdW1uU2V0dGluZ3MsXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBlbmFibGVkLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZGlzcGxheToge1xuICAgICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgICBjb2x1bW5TZXR0aW5nczogb3JkZXJJbnRlbnRpb25hbGx5KFxuICAgICAgICAgIHVwZGF0ZWRDb2x1bW5TZXR0aW5ncyxcbiAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZW5hYmxlQWxsQ29sdW1uczxcbiAgICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICAgIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gICAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gICAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuICA+KFxuICAgIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gICAgY29sdW1uczogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPixcbiAgICBjb2x1bW5OYW1lTWFwOiBSaXZUYWJsZS5Db2x1bW5OYW1lTWFwPEM+LFxuICAgIGVuYWJsZWQ6IGJvb2xlYW4sXG4gICk6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gICAgY29uc3QgYWxsQ29sdW1ucyA9IGdldEFsbENvbHVtbnMoc3RhdGUsIGNvbHVtbnMsIGNvbHVtbk5hbWVNYXApO1xuICAgIGlmIChlbmFibGVkICYmIGFsbENvbHVtbnMubGVuZ3RoID4gUml2VGFibGUuQ29sdW1uc01heFNob3duKSB7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgdXBkYXRlZENvbHVtblNldHRpbmdzOiBSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPltdID0gYWxsQ29sdW1ucy5tYXAoXG4gICAgICBjdXJyZW50Q29sdW1uU2V0dGluZ3MgPT4ge1xuICAgICAgICByZXR1cm4gY29sdW1uU2V0dGluZ0FmdGVyRW5hYmxlZENoYW5nZShcbiAgICAgICAgICBjdXJyZW50Q29sdW1uU2V0dGluZ3MsXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBlbmFibGVkLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZGlzcGxheToge1xuICAgICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgICBjb2x1bW5TZXR0aW5nczogb3JkZXJJbnRlbnRpb25hbGx5KFxuICAgICAgICAgIHVwZGF0ZWRDb2x1bW5TZXR0aW5ncyxcbiAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gY2hhbmdlQ29sdW1uV2lkdGg8XG4gICAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbiAgPihcbiAgICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICAgIGNvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gICAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbiAgICBjb2x1bW46IEMsXG4gICAgcHJlZmVycmVkV2lkdGg6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+WydwcmVmZXJyZWRXaWR0aCddLFxuICApOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4ge1xuICAgIGNvbnN0IGFsbENvbHVtbnMgPSBnZXRBbGxDb2x1bW5zKHN0YXRlLCBjb2x1bW5zLCBjb2x1bW5OYW1lTWFwKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBkaXNwbGF5OiB7XG4gICAgICAgIC4uLnN0YXRlLmRpc3BsYXksXG4gICAgICAgIGNvbHVtblNldHRpbmdzOiBhbGxDb2x1bW5zLm1hcChjID0+ICh7XG4gICAgICAgICAgLi4uYyxcbiAgICAgICAgICBwcmVmZXJyZWRXaWR0aDogYy5rZXkgPT09IGNvbHVtbiA/IHByZWZlcnJlZFdpZHRoIDogYy5wcmVmZXJyZWRXaWR0aCxcbiAgICAgICAgfSkpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHJlc2V0VG9EZWZhdWx0Q29sdW1uczxcbiAgICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICAgIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gICAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gICAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuICA+KFxuICAgIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gICAgY29sdW1uczogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPixcbiAgICBjb2x1bW5OYW1lTWFwOiBSaXZUYWJsZS5Db2x1bW5OYW1lTWFwPEM+LFxuICAgIGRlZmF1bHRDb2x1bW5TdGF0ZTogUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz5bXSxcbiAgKTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBkaXNwbGF5OiB7XG4gICAgICAgIC4uLnN0YXRlLmRpc3BsYXksXG4gICAgICAgIGNvbHVtblNldHRpbmdzOiBvcmRlckludGVudGlvbmFsbHkoXG4gICAgICAgICAgZGVmYXVsdENvbHVtblN0YXRlLFxuICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0SW5NZW1vcnlDb2x1bW5NZXRhZGF0YU1hcDxcbiAgICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICAgIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gID4oXG4gICAgY29sdW1uczogTWFwPEMsIFJpdlRhYmxlLkluTWVtb3J5Q29sdW1uTWV0YWRhdGE8Uj4+LFxuICApOiBNYXA8QywgUml2VGFibGUuQ29sdW1uTWV0YWRhdGE+IHtcbiAgICByZXR1cm4gbmV3IE1hcChcbiAgICAgIFsuLi5jb2x1bW5zLmVudHJpZXMoKV0ubWFwKChbbmFtZSwgeyBvcmRlcktleSwgLi4ubWV0YWRhdGEgfV0pID0+IFtcbiAgICAgICAgbmFtZSxcbiAgICAgICAge1xuICAgICAgICAgIC4uLm1ldGFkYXRhLFxuICAgICAgICAgIG9yZGVyYWJsZTogISFvcmRlcktleSxcbiAgICAgICAgfSxcbiAgICAgIF0pLFxuICAgICk7XG4gIH1cblxuICBleHBvcnQgdHlwZSBDb2x1bW5MaXN0PEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4+ID1cbiAgICAoUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz4gJiB7XG4gICAgICByZXNvbHZlZE5hbWU6IEMgfCBzdHJpbmc7XG4gICAgICBoaWdobGlnaHRJbmRpY2VzOiBIaWdobGlnaHRDb21wb25lbnQuSGlnaGxpZ2h0SW5kaWNlc1tdO1xuICAgICAgc3RhdGVJbmRleDogbnVtYmVyO1xuICAgICAgaXNMYXN0UGlubmVkQ29sdW1uOiBib29sZWFuO1xuICAgICAgYWx3YXlzVmlzaWJsZTogYm9vbGVhbjtcbiAgICAgIHRvb2x0aXBGb3JIaWRlSWNvbj86IHN0cmluZztcbiAgICAgIGFsd2F5c1Bpbm5lZDogYm9vbGVhbjtcbiAgICAgIHRvb2x0aXBGb3JSZW9yZGVySWNvbj86IHN0cmluZztcbiAgICAgIGlzVW5hdmFpbGFibGU/OiBib29sZWFuO1xuICAgIH0pW107XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldENvbHVtblNldHRpbmdzQ29sdW1uTGlzdDxcbiAgICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICAgIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gICAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gICAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuICA+KHN0YXRlOiBSaXZUYWJsZS5GdWxsU3RhdGU8UiwgQywgRiwgRz4pOiBDb2x1bW5MaXN0PEM+IHtcbiAgICBjb25zdCBhbGxDb2x1bW5NZXRhZGF0YSA9IFtcbiAgICAgIC4uLnN0YXRlLmRpc3BsYXkuY29sdW1ucyxcbiAgICAgIC4uLnN0YXRlLmRpc3BsYXkuZGlzYWJsZWRDb2x1bW5zLFxuICAgIF07XG4gICAgY29uc3QgY29sdW1uc0xlbmd0aCA9IHN0YXRlLmRpc3BsYXkuYWxsQ29sdW1ucy5sZW5ndGg7XG4gICAgY29uc3QgYWxsQ29sdW1uczogQ29sdW1uTGlzdDxDPiA9IHN0YXRlLmRpc3BsYXkuYWxsQ29sdW1ucy5tYXAoXG4gICAgICAoY29sdW1uLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHRDb2x1bW5QaW5uZWQgPVxuICAgICAgICAgIGkgKyAyIDw9IGNvbHVtbnNMZW5ndGhcbiAgICAgICAgICAgID8gc3RhdGUuZGlzcGxheS5hbGxDb2x1bW5zW2kgKyAxXS5waW5uZWRcbiAgICAgICAgICAgIDogZmFsc2U7XG5cbiAgICAgICAgY29uc3QgY3VycmVudENvbHVtbk1ldGFkYXRhOiBSaXZUYWJsZS5GdWxsQ29sdW1uPEM+IHwgdW5kZWZpbmVkID1cbiAgICAgICAgICBhbGxDb2x1bW5NZXRhZGF0YS5maW5kKG1ldGFkYXRhID0+IG1ldGFkYXRhLmtleSA9PT0gY29sdW1uLmtleSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgcmVzb2x2ZWROYW1lOlxuICAgICAgICAgICAgc3RhdGUuZGlzcGxheS5jb2x1bW5OYW1lTWFwLmdldChjb2x1bW4ua2V5KSA/PyBjb2x1bW4ua2V5LFxuICAgICAgICAgIHN0YXRlSW5kZXg6IGksXG4gICAgICAgICAgaXNMYXN0UGlubmVkQ29sdW1uOiBjb2x1bW4ucGlubmVkICYmICFuZXh0Q29sdW1uUGlubmVkLFxuICAgICAgICAgIGFsd2F5c1Zpc2libGU6IGN1cnJlbnRDb2x1bW5NZXRhZGF0YT8uYWx3YXlzVmlzaWJsZSA/PyBmYWxzZSxcbiAgICAgICAgICB0b29sdGlwRm9ySGlkZUljb246IGN1cnJlbnRDb2x1bW5NZXRhZGF0YT8udG9vbHRpcEZvckhpZGVJY29uLFxuICAgICAgICAgIGFsd2F5c1Bpbm5lZDogY3VycmVudENvbHVtbk1ldGFkYXRhPy5hbHdheXNQaW5uZWQgPz8gZmFsc2UsXG4gICAgICAgICAgdG9vbHRpcEZvclJlb3JkZXJJY29uOiBjdXJyZW50Q29sdW1uTWV0YWRhdGE/LnRvb2x0aXBGb3JSZW9yZGVySWNvbixcbiAgICAgICAgICBoaWdobGlnaHRJbmRpY2VzOiBbXSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiBhbGxDb2x1bW5zO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVuYXZhaWxhYmxlQ29sdW1uczxcbiAgICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICAgIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gICAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gICAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuICA+KHVudmFpbGFibGVDb2x1bW5LZXlzOiBDW10pOiBDb2x1bW5MaXN0PEM+IHtcbiAgICByZXR1cm4gdW52YWlsYWJsZUNvbHVtbktleXMubWFwKGNvbHVtbktleSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXk6IGNvbHVtbktleSxcbiAgICAgICAgcmVzb2x2ZWROYW1lOiBjb2x1bW5LZXksXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBwaW5uZWQ6IGZhbHNlLFxuICAgICAgICBpc0xhc3RQaW5uZWRDb2x1bW46IGZhbHNlLFxuICAgICAgICBhbHdheXNWaXNpYmxlOiBmYWxzZSxcbiAgICAgICAgYWx3YXlzUGlubmVkOiBmYWxzZSxcbiAgICAgICAgcHJlZmVycmVkV2lkdGg6ICdhdXRvJyxcbiAgICAgICAgaGlnaGxpZ2h0SW5kaWNlczogW10sXG4gICAgICAgIHN0YXRlSW5kZXg6IC0xLFxuICAgICAgICBpc1VuYXZhaWxhYmxlOiB0cnVlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -1,123 +0,0 @@
1
- import { sumBy } from 'lodash';
2
- import { TableCollapseHelpers } from './collapse-helpers';
3
- export var TableNestingHelpers;
4
- (function (TableNestingHelpers) {
5
- function convertToFullNestedRow(currentRow, coreState, rowLinkFunction) {
6
- const currentSubRows = currentRow.subRows
7
- ? currentRow.subRows.map(subrow => convertToFullNestedRow(subrow, coreState, rowLinkFunction))
8
- : [];
9
- const currentRowLink = rowLinkFunction
10
- ? rowLinkFunction(currentRow.data)
11
- : null;
12
- // We don't currently support selecting nested rows
13
- const currentRowIsSelected = false;
14
- const currentRowIsCollapsed = TableCollapseHelpers.isRowCollapsed(coreState, currentRow.data.id);
15
- return {
16
- id: currentRow.data.id,
17
- data: currentRow.data,
18
- rowLink: currentRowLink,
19
- selected: currentRowIsSelected,
20
- subRows: currentSubRows,
21
- isCollapsed: currentRowIsCollapsed,
22
- };
23
- }
24
- TableNestingHelpers.convertToFullNestedRow = convertToFullNestedRow;
25
- function convertToFullNestedHeaderRow(currentRow, coreState, rowLinkFunction) {
26
- const currentSubRows = currentRow.subRows
27
- ? currentRow.subRows.map(subrow => convertToFullNestedRow(subrow, coreState, rowLinkFunction))
28
- : [];
29
- const currentHeaderIsCollapsed = TableCollapseHelpers.isHeaderCollapsed(coreState, currentRow.headerText);
30
- return {
31
- id: currentRow.headerText ?? '',
32
- subRows: currentSubRows,
33
- headerText: currentRow.headerText,
34
- isCollapsed: currentHeaderIsCollapsed,
35
- };
36
- }
37
- TableNestingHelpers.convertToFullNestedHeaderRow = convertToFullNestedHeaderRow;
38
- function findNestedRowsWithHeadersToKeep(allRows, filteredRows) {
39
- const filteredIds = new Set(filteredRows.map(row => row.id));
40
- function recursiveFindRowsToKeep(currentNestedRow) {
41
- // Keep all subrows if a parent row matches the filter
42
- if (filteredIds.has(currentNestedRow.data.id)) {
43
- return currentNestedRow;
44
- }
45
- if (!currentNestedRow.subRows) {
46
- return null;
47
- }
48
- const subRowsToKeep = [];
49
- for (const subRow of currentNestedRow.subRows) {
50
- const rowToKeep = recursiveFindRowsToKeep(subRow);
51
- if (rowToKeep) {
52
- subRowsToKeep.push(rowToKeep);
53
- }
54
- }
55
- if (subRowsToKeep.length == 0) {
56
- return null;
57
- }
58
- return {
59
- ...currentNestedRow,
60
- subRows: subRowsToKeep,
61
- };
62
- }
63
- const keptNestedRows = [];
64
- for (const outerLevelHeader of allRows) {
65
- if (!outerLevelHeader.subRows) {
66
- continue;
67
- }
68
- const keptSubRows = [];
69
- for (const nestedRow of outerLevelHeader.subRows) {
70
- const rowToKeep = recursiveFindRowsToKeep(nestedRow);
71
- if (rowToKeep) {
72
- keptSubRows.push(rowToKeep);
73
- }
74
- }
75
- if (keptSubRows.length == 0) {
76
- continue;
77
- }
78
- keptNestedRows.push({
79
- ...outerLevelHeader,
80
- subRows: keptSubRows,
81
- });
82
- }
83
- return keptNestedRows;
84
- }
85
- TableNestingHelpers.findNestedRowsWithHeadersToKeep = findNestedRowsWithHeadersToKeep;
86
- // Count how many rows we have at the bottom level of nesting.
87
- function countBottomLevelNestedRows(allNestedRows) {
88
- let bottomLevelRowCount = 0;
89
- function recursiveCountRows(currentNestedRow) {
90
- if (!currentNestedRow.subRows || currentNestedRow.subRows.length == 0) {
91
- bottomLevelRowCount++;
92
- }
93
- else {
94
- for (const subRow of currentNestedRow.subRows) {
95
- recursiveCountRows(subRow);
96
- }
97
- }
98
- }
99
- for (const nestedRow of allNestedRows) {
100
- recursiveCountRows(nestedRow);
101
- }
102
- return bottomLevelRowCount;
103
- }
104
- TableNestingHelpers.countBottomLevelNestedRows = countBottomLevelNestedRows;
105
- // Count the rows pagination pages through.
106
- function countNestedRows(allHeaders, paginateBy) {
107
- return paginateBy === 'topRows'
108
- ? sumBy(allHeaders, header => header.subRows.length)
109
- : countBottomLevelNestedHeaderRows(allHeaders);
110
- }
111
- TableNestingHelpers.countNestedRows = countNestedRows;
112
- // Count how many rows we have at the bottom level of nesting.
113
- function countBottomLevelNestedHeaderRows(allHeaders) {
114
- let bottomLevelRowCount = 0;
115
- for (const headerRow of allHeaders) {
116
- const currentHeaderBottomRowCount = countBottomLevelNestedRows(headerRow.subRows);
117
- bottomLevelRowCount += currentHeaderBottomRowCount;
118
- }
119
- return bottomLevelRowCount;
120
- }
121
- TableNestingHelpers.countBottomLevelNestedHeaderRows = countBottomLevelNestedHeaderRows;
122
- })(TableNestingHelpers || (TableNestingHelpers = {}));
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGluZy1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdGFibGUvdGFibGUvc3RhdGUtaGVscGVycy9uZXN0aW5nLWhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUUvQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUxRCxNQUFNLEtBQVcsbUJBQW1CLENBc0xuQztBQXRMRCxXQUFpQixtQkFBbUI7SUFDbEMsU0FBZ0Isc0JBQXNCLENBTXBDLFVBQWlDLEVBQ2pDLFNBQXlDLEVBQ3pDLGVBQXlEO1FBRXpELE1BQU0sY0FBYyxHQUFnQyxVQUFVLENBQUMsT0FBTztZQUNwRSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FDOUIsc0JBQXNCLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FDM0Q7WUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRVAsTUFBTSxjQUFjLEdBQTRCLGVBQWU7WUFDN0QsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQ2xDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFVCxtREFBbUQ7UUFDbkQsTUFBTSxvQkFBb0IsR0FBWSxLQUFLLENBQUM7UUFFNUMsTUFBTSxxQkFBcUIsR0FBWSxvQkFBb0IsQ0FBQyxjQUFjLENBQ3hFLFNBQVMsRUFDVCxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDbkIsQ0FBQztRQUVGLE9BQU87WUFDTCxFQUFFLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtZQUNyQixPQUFPLEVBQUUsY0FBYztZQUN2QixRQUFRLEVBQUUsb0JBQW9CO1lBQzlCLE9BQU8sRUFBRSxjQUFjO1lBQ3ZCLFdBQVcsRUFBRSxxQkFBcUI7U0FDbkMsQ0FBQztJQUNKLENBQUM7SUFwQ2UsMENBQXNCLHlCQW9DckMsQ0FBQTtJQUVELFNBQWdCLDRCQUE0QixDQU0xQyxVQUF1QyxFQUN2QyxTQUF5QyxFQUN6QyxlQUF5RDtRQUV6RCxNQUFNLGNBQWMsR0FBZ0MsVUFBVSxDQUFDLE9BQU87WUFDcEUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQzlCLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQzNEO1lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVQLE1BQU0sd0JBQXdCLEdBQzVCLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFM0UsT0FBTztZQUNMLEVBQUUsRUFBRSxVQUFVLENBQUMsVUFBVSxJQUFJLEVBQUU7WUFDL0IsT0FBTyxFQUFFLGNBQWM7WUFDdkIsVUFBVSxFQUFFLFVBQVUsQ0FBQyxVQUFVO1lBQ2pDLFdBQVcsRUFBRSx3QkFBd0I7U0FDdEMsQ0FBQztJQUNKLENBQUM7SUF6QmUsZ0RBQTRCLCtCQXlCM0MsQ0FBQTtJQUVELFNBQWdCLCtCQUErQixDQUM3QyxPQUFzQyxFQUN0QyxZQUFpQjtRQUVqQixNQUFNLFdBQVcsR0FBeUIsSUFBSSxHQUFHLENBQy9DLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQ2hDLENBQUM7UUFFRixTQUFTLHVCQUF1QixDQUM5QixnQkFBdUM7WUFFdkMsc0RBQXNEO1lBQ3RELElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7Z0JBQzdDLE9BQU8sZ0JBQWdCLENBQUM7YUFDekI7WUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFO2dCQUM3QixPQUFPLElBQUksQ0FBQzthQUNiO1lBRUQsTUFBTSxhQUFhLEdBQTRCLEVBQUUsQ0FBQztZQUNsRCxLQUFLLE1BQU0sTUFBTSxJQUFJLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtnQkFDN0MsTUFBTSxTQUFTLEdBQ2IsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2xDLElBQUksU0FBUyxFQUFFO29CQUNiLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQy9CO2FBQ0Y7WUFFRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO2dCQUM3QixPQUFPLElBQUksQ0FBQzthQUNiO1lBRUQsT0FBTztnQkFDTCxHQUFHLGdCQUFnQjtnQkFDbkIsT0FBTyxFQUFFLGFBQWE7YUFDdkIsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBa0MsRUFBRSxDQUFDO1FBRXpELEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxPQUFPLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtnQkFDN0IsU0FBUzthQUNWO1lBRUQsTUFBTSxXQUFXLEdBQTRCLEVBQUUsQ0FBQztZQUNoRCxLQUFLLE1BQU0sU0FBUyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sRUFBRTtnQkFDaEQsTUFBTSxTQUFTLEdBQ2IsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksU0FBUyxFQUFFO29CQUNiLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQzdCO2FBQ0Y7WUFFRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO2dCQUMzQixTQUFTO2FBQ1Y7WUFFRCxjQUFjLENBQUMsSUFBSSxDQUFDO2dCQUNsQixHQUFHLGdCQUFnQjtnQkFDbkIsT0FBTyxFQUFFLFdBQVc7YUFDckIsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBbEVlLG1EQUErQixrQ0FrRTlDLENBQUE7SUFFRCw4REFBOEQ7SUFDOUQsU0FBZ0IsMEJBQTBCLENBQ3hDLGFBQXNDO1FBRXRDLElBQUksbUJBQW1CLEdBQVcsQ0FBQyxDQUFDO1FBRXBDLFNBQVMsa0JBQWtCLENBQUMsZ0JBQXVDO1lBQ2pFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7Z0JBQ3JFLG1CQUFtQixFQUFFLENBQUM7YUFDdkI7aUJBQU07Z0JBQ0wsS0FBSyxNQUFNLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUU7b0JBQzdDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUM1QjthQUNGO1FBQ0gsQ0FBQztRQUVELEtBQUssTUFBTSxTQUFTLElBQUksYUFBYSxFQUFFO1lBQ3JDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQy9CO1FBRUQsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBcEJlLDhDQUEwQiw2QkFvQnpDLENBQUE7SUFFRCwyQ0FBMkM7SUFDM0MsU0FBZ0IsZUFBZSxDQUM3QixVQUF5QyxFQUN6QyxVQUFxQztRQUVyQyxPQUFPLFVBQVUsS0FBSyxTQUFTO1lBQzdCLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDcEQsQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFQZSxtQ0FBZSxrQkFPOUIsQ0FBQTtJQUVELDhEQUE4RDtJQUM5RCxTQUFnQixnQ0FBZ0MsQ0FDOUMsVUFBeUM7UUFFekMsSUFBSSxtQkFBbUIsR0FBVyxDQUFDLENBQUM7UUFFcEMsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUU7WUFDbEMsTUFBTSwyQkFBMkIsR0FBVywwQkFBMEIsQ0FDcEUsU0FBUyxDQUFDLE9BQU8sQ0FDbEIsQ0FBQztZQUNGLG1CQUFtQixJQUFJLDJCQUEyQixDQUFDO1NBQ3BEO1FBRUQsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBYmUsb0RBQWdDLG1DQWEvQyxDQUFBO0FBQ0gsQ0FBQyxFQXRMZ0IsbUJBQW1CLEtBQW5CLG1CQUFtQixRQXNMbkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzdW1CeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBSaXZUYWJsZSB9IGZyb20gJy4uL3N0YXRlJztcbmltcG9ydCB7IFRhYmxlQ29sbGFwc2VIZWxwZXJzIH0gZnJvbSAnLi9jb2xsYXBzZS1oZWxwZXJzJztcblxuZXhwb3J0IG5hbWVzcGFjZSBUYWJsZU5lc3RpbmdIZWxwZXJzIHtcbiAgZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb0Z1bGxOZXN0ZWRSb3c8XG4gICAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCA9IHsga2V5OiAnJyB9LFxuICA+KFxuICAgIGN1cnJlbnRSb3c6IFJpdlRhYmxlLk5lc3RlZFJvdzxSPixcbiAgICBjb3JlU3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgICByb3dMaW5rRnVuY3Rpb24/OiAocm93OiBSLCBncm91cD86IEcpID0+IFJpdlRhYmxlLlJvd0xpbmssXG4gICk6IFJpdlRhYmxlLkZ1bGxOZXN0ZWRSb3c8Uj4ge1xuICAgIGNvbnN0IGN1cnJlbnRTdWJSb3dzOiBSaXZUYWJsZS5GdWxsTmVzdGVkUm93PFI+W10gPSBjdXJyZW50Um93LnN1YlJvd3NcbiAgICAgID8gY3VycmVudFJvdy5zdWJSb3dzLm1hcChzdWJyb3cgPT5cbiAgICAgICAgICBjb252ZXJ0VG9GdWxsTmVzdGVkUm93KHN1YnJvdywgY29yZVN0YXRlLCByb3dMaW5rRnVuY3Rpb24pLFxuICAgICAgICApXG4gICAgICA6IFtdO1xuXG4gICAgY29uc3QgY3VycmVudFJvd0xpbms6IFJpdlRhYmxlLlJvd0xpbmsgfCBudWxsID0gcm93TGlua0Z1bmN0aW9uXG4gICAgICA/IHJvd0xpbmtGdW5jdGlvbihjdXJyZW50Um93LmRhdGEpXG4gICAgICA6IG51bGw7XG5cbiAgICAvLyBXZSBkb24ndCBjdXJyZW50bHkgc3VwcG9ydCBzZWxlY3RpbmcgbmVzdGVkIHJvd3NcbiAgICBjb25zdCBjdXJyZW50Um93SXNTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3QgY3VycmVudFJvd0lzQ29sbGFwc2VkOiBib29sZWFuID0gVGFibGVDb2xsYXBzZUhlbHBlcnMuaXNSb3dDb2xsYXBzZWQoXG4gICAgICBjb3JlU3RhdGUsXG4gICAgICBjdXJyZW50Um93LmRhdGEuaWQsXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpZDogY3VycmVudFJvdy5kYXRhLmlkLFxuICAgICAgZGF0YTogY3VycmVudFJvdy5kYXRhLFxuICAgICAgcm93TGluazogY3VycmVudFJvd0xpbmssXG4gICAgICBzZWxlY3RlZDogY3VycmVudFJvd0lzU2VsZWN0ZWQsXG4gICAgICBzdWJSb3dzOiBjdXJyZW50U3ViUm93cyxcbiAgICAgIGlzQ29sbGFwc2VkOiBjdXJyZW50Um93SXNDb2xsYXBzZWQsXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9GdWxsTmVzdGVkSGVhZGVyUm93PFxuICAgIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gICAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAgPSB7IGtleTogJycgfSxcbiAgPihcbiAgICBjdXJyZW50Um93OiBSaXZUYWJsZS5OZXN0ZWRIZWFkZXJSb3c8Uj4sXG4gICAgY29yZVN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gICAgcm93TGlua0Z1bmN0aW9uPzogKHJvdzogUiwgZ3JvdXA/OiBHKSA9PiBSaXZUYWJsZS5Sb3dMaW5rLFxuICApOiBSaXZUYWJsZS5GdWxsTmVzdGVkSGVhZGVyUm93PFI+IHtcbiAgICBjb25zdCBjdXJyZW50U3ViUm93czogUml2VGFibGUuRnVsbE5lc3RlZFJvdzxSPltdID0gY3VycmVudFJvdy5zdWJSb3dzXG4gICAgICA/IGN1cnJlbnRSb3cuc3ViUm93cy5tYXAoc3Vicm93ID0+XG4gICAgICAgICAgY29udmVydFRvRnVsbE5lc3RlZFJvdyhzdWJyb3csIGNvcmVTdGF0ZSwgcm93TGlua0Z1bmN0aW9uKSxcbiAgICAgICAgKVxuICAgICAgOiBbXTtcblxuICAgIGNvbnN0IGN1cnJlbnRIZWFkZXJJc0NvbGxhcHNlZDogYm9vbGVhbiA9XG4gICAgICBUYWJsZUNvbGxhcHNlSGVscGVycy5pc0hlYWRlckNvbGxhcHNlZChjb3JlU3RhdGUsIGN1cnJlbnRSb3cuaGVhZGVyVGV4dCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGN1cnJlbnRSb3cuaGVhZGVyVGV4dCA/PyAnJyxcbiAgICAgIHN1YlJvd3M6IGN1cnJlbnRTdWJSb3dzLFxuICAgICAgaGVhZGVyVGV4dDogY3VycmVudFJvdy5oZWFkZXJUZXh0LFxuICAgICAgaXNDb2xsYXBzZWQ6IGN1cnJlbnRIZWFkZXJJc0NvbGxhcHNlZCxcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGZpbmROZXN0ZWRSb3dzV2l0aEhlYWRlcnNUb0tlZXA8UiBleHRlbmRzIFJpdlRhYmxlLlJvdz4oXG4gICAgYWxsUm93czogUml2VGFibGUuTmVzdGVkSGVhZGVyUm93PFI+W10sXG4gICAgZmlsdGVyZWRSb3dzOiBSW10sXG4gICk6IFJpdlRhYmxlLk5lc3RlZEhlYWRlclJvdzxSPltdIHtcbiAgICBjb25zdCBmaWx0ZXJlZElkczogU2V0PHN0cmluZyB8IG51bWJlcj4gPSBuZXcgU2V0KFxuICAgICAgZmlsdGVyZWRSb3dzLm1hcChyb3cgPT4gcm93LmlkKSxcbiAgICApO1xuXG4gICAgZnVuY3Rpb24gcmVjdXJzaXZlRmluZFJvd3NUb0tlZXAoXG4gICAgICBjdXJyZW50TmVzdGVkUm93OiBSaXZUYWJsZS5OZXN0ZWRSb3c8Uj4sXG4gICAgKTogUml2VGFibGUuTmVzdGVkUm93PFI+IHwgbnVsbCB7XG4gICAgICAvLyBLZWVwIGFsbCBzdWJyb3dzIGlmIGEgcGFyZW50IHJvdyBtYXRjaGVzIHRoZSBmaWx0ZXJcbiAgICAgIGlmIChmaWx0ZXJlZElkcy5oYXMoY3VycmVudE5lc3RlZFJvdy5kYXRhLmlkKSkge1xuICAgICAgICByZXR1cm4gY3VycmVudE5lc3RlZFJvdztcbiAgICAgIH1cblxuICAgICAgaWYgKCFjdXJyZW50TmVzdGVkUm93LnN1YlJvd3MpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN1YlJvd3NUb0tlZXA6IFJpdlRhYmxlLk5lc3RlZFJvdzxSPltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHN1YlJvdyBvZiBjdXJyZW50TmVzdGVkUm93LnN1YlJvd3MpIHtcbiAgICAgICAgY29uc3Qgcm93VG9LZWVwOiBSaXZUYWJsZS5OZXN0ZWRSb3c8Uj4gfCBudWxsID1cbiAgICAgICAgICByZWN1cnNpdmVGaW5kUm93c1RvS2VlcChzdWJSb3cpO1xuICAgICAgICBpZiAocm93VG9LZWVwKSB7XG4gICAgICAgICAgc3ViUm93c1RvS2VlcC5wdXNoKHJvd1RvS2VlcCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN1YlJvd3NUb0tlZXAubGVuZ3RoID09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmN1cnJlbnROZXN0ZWRSb3csXG4gICAgICAgIHN1YlJvd3M6IHN1YlJvd3NUb0tlZXAsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGtlcHROZXN0ZWRSb3dzOiBSaXZUYWJsZS5OZXN0ZWRIZWFkZXJSb3c8Uj5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBvdXRlckxldmVsSGVhZGVyIG9mIGFsbFJvd3MpIHtcbiAgICAgIGlmICghb3V0ZXJMZXZlbEhlYWRlci5zdWJSb3dzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXB0U3ViUm93czogUml2VGFibGUuTmVzdGVkUm93PFI+W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgbmVzdGVkUm93IG9mIG91dGVyTGV2ZWxIZWFkZXIuc3ViUm93cykge1xuICAgICAgICBjb25zdCByb3dUb0tlZXA6IFJpdlRhYmxlLk5lc3RlZFJvdzxSPiB8IG51bGwgPVxuICAgICAgICAgIHJlY3Vyc2l2ZUZpbmRSb3dzVG9LZWVwKG5lc3RlZFJvdyk7XG4gICAgICAgIGlmIChyb3dUb0tlZXApIHtcbiAgICAgICAgICBrZXB0U3ViUm93cy5wdXNoKHJvd1RvS2VlcCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGtlcHRTdWJSb3dzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBrZXB0TmVzdGVkUm93cy5wdXNoKHtcbiAgICAgICAgLi4ub3V0ZXJMZXZlbEhlYWRlcixcbiAgICAgICAgc3ViUm93czoga2VwdFN1YlJvd3MsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ga2VwdE5lc3RlZFJvd3M7XG4gIH1cblxuICAvLyBDb3VudCBob3cgbWFueSByb3dzIHdlIGhhdmUgYXQgdGhlIGJvdHRvbSBsZXZlbCBvZiBuZXN0aW5nLlxuICBleHBvcnQgZnVuY3Rpb24gY291bnRCb3R0b21MZXZlbE5lc3RlZFJvd3M8UiBleHRlbmRzIFJpdlRhYmxlLlJvdz4oXG4gICAgYWxsTmVzdGVkUm93czogUml2VGFibGUuTmVzdGVkUm93PFI+W10sXG4gICk6IG51bWJlciB7XG4gICAgbGV0IGJvdHRvbUxldmVsUm93Q291bnQ6IG51bWJlciA9IDA7XG5cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVDb3VudFJvd3MoY3VycmVudE5lc3RlZFJvdzogUml2VGFibGUuTmVzdGVkUm93PFI+KSB7XG4gICAgICBpZiAoIWN1cnJlbnROZXN0ZWRSb3cuc3ViUm93cyB8fCBjdXJyZW50TmVzdGVkUm93LnN1YlJvd3MubGVuZ3RoID09IDApIHtcbiAgICAgICAgYm90dG9tTGV2ZWxSb3dDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBzdWJSb3cgb2YgY3VycmVudE5lc3RlZFJvdy5zdWJSb3dzKSB7XG4gICAgICAgICAgcmVjdXJzaXZlQ291bnRSb3dzKHN1YlJvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG5lc3RlZFJvdyBvZiBhbGxOZXN0ZWRSb3dzKSB7XG4gICAgICByZWN1cnNpdmVDb3VudFJvd3MobmVzdGVkUm93KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm90dG9tTGV2ZWxSb3dDb3VudDtcbiAgfVxuXG4gIC8vIENvdW50IHRoZSByb3dzIHBhZ2luYXRpb24gcGFnZXMgdGhyb3VnaC5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNvdW50TmVzdGVkUm93czxSIGV4dGVuZHMgUml2VGFibGUuUm93PihcbiAgICBhbGxIZWFkZXJzOiBSaXZUYWJsZS5OZXN0ZWRIZWFkZXJSb3c8Uj5bXSxcbiAgICBwYWdpbmF0ZUJ5OiBSaXZUYWJsZS5OZXN0ZWRQYWdpbmF0ZUJ5LFxuICApOiBudW1iZXIge1xuICAgIHJldHVybiBwYWdpbmF0ZUJ5ID09PSAndG9wUm93cydcbiAgICAgID8gc3VtQnkoYWxsSGVhZGVycywgaGVhZGVyID0+IGhlYWRlci5zdWJSb3dzLmxlbmd0aClcbiAgICAgIDogY291bnRCb3R0b21MZXZlbE5lc3RlZEhlYWRlclJvd3MoYWxsSGVhZGVycyk7XG4gIH1cblxuICAvLyBDb3VudCBob3cgbWFueSByb3dzIHdlIGhhdmUgYXQgdGhlIGJvdHRvbSBsZXZlbCBvZiBuZXN0aW5nLlxuICBleHBvcnQgZnVuY3Rpb24gY291bnRCb3R0b21MZXZlbE5lc3RlZEhlYWRlclJvd3M8UiBleHRlbmRzIFJpdlRhYmxlLlJvdz4oXG4gICAgYWxsSGVhZGVyczogUml2VGFibGUuTmVzdGVkSGVhZGVyUm93PFI+W10sXG4gICk6IG51bWJlciB7XG4gICAgbGV0IGJvdHRvbUxldmVsUm93Q291bnQ6IG51bWJlciA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGhlYWRlclJvdyBvZiBhbGxIZWFkZXJzKSB7XG4gICAgICBjb25zdCBjdXJyZW50SGVhZGVyQm90dG9tUm93Q291bnQ6IG51bWJlciA9IGNvdW50Qm90dG9tTGV2ZWxOZXN0ZWRSb3dzKFxuICAgICAgICBoZWFkZXJSb3cuc3ViUm93cyxcbiAgICAgICk7XG4gICAgICBib3R0b21MZXZlbFJvd0NvdW50ICs9IGN1cnJlbnRIZWFkZXJCb3R0b21Sb3dDb3VudDtcbiAgICB9XG5cbiAgICByZXR1cm4gYm90dG9tTGV2ZWxSb3dDb3VudDtcbiAgfVxufVxuIl19