@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.
- package/{esm2020 → esm2022}/lib/accessibility/sr-only/sr-only.component.mjs +4 -4
- package/esm2022/lib/download/download.service.mjs +47 -0
- package/{esm2020 → esm2022}/lib/format/pipes/common.mjs +5 -5
- package/{esm2020 → esm2022}/lib/format/pipes/date.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/format/pipes/days.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/format/pipes/dollars.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/format/pipes/number.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/format/pipes/percentage.pipe.mjs +4 -4
- package/esm2022/lib/format/pipes/sentence-case.pipe.mjs +61 -0
- package/esm2022/lib/format/pipes/small-currency.pipe.mjs +24 -0
- package/esm2022/lib/format/pipes/small-number.pipe.mjs +29 -0
- package/esm2022/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +62 -0
- package/esm2022/lib/format/truncate/truncate.component.mjs +51 -0
- package/esm2022/lib/icon/dom-cache.mjs +32 -0
- package/esm2022/lib/icon/icon.component.mjs +86 -0
- package/{esm2020 → esm2022}/lib/icon/icons.mjs +1 -1
- package/{esm2020 → esm2022}/lib/input/alphabetic-field/alphabetic-field.component.mjs +4 -4
- package/esm2022/lib/input/auto-focus/auto-focus.directive.mjs +48 -0
- package/esm2022/lib/input/button/button.component.mjs +139 -0
- package/esm2022/lib/input/button-group/button-group.component.mjs +39 -0
- package/{esm2020 → esm2022}/lib/input/calendar/calendar.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/card-checkbox/card-checkbox.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/checkbox/checkbox.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/currency-field/currency-field.component.mjs +4 -4
- package/esm2022/lib/input/date/date.component.mjs +279 -0
- package/esm2022/lib/input/date-range/date-range.component.mjs +477 -0
- package/esm2022/lib/input/filter-chip/filter-chip.component.mjs +47 -0
- package/{esm2020 → esm2022}/lib/input/filter-dropdown/filter-dropdown.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/input/input-label/input-label.component.mjs +4 -4
- package/esm2022/lib/input/mentions-input/mentions-input.component.mjs +745 -0
- package/esm2022/lib/input/number-field/number-field.component.mjs +125 -0
- package/{esm2020 → esm2022}/lib/input/percentage-field/percentage-field.component.mjs +4 -4
- package/esm2022/lib/input/phone-field/phone-field.component.mjs +74 -0
- package/{esm2020 → esm2022}/lib/input/radio/radio.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/search/search.component.mjs +4 -4
- package/esm2022/lib/input/search-select/search-select.component.mjs +189 -0
- package/esm2022/lib/input/select/select/select.component.mjs +178 -0
- package/{esm2020 → esm2022}/lib/input/select/select-node/select-node.component.mjs +4 -4
- package/esm2022/lib/input/select/state.mjs +882 -0
- package/{esm2020 → esm2022}/lib/input/simple-select/option-group.pipe.mjs +4 -4
- package/esm2022/lib/input/simple-select/simple-select.component.mjs +178 -0
- package/esm2022/lib/input/switch-checkbox/switch-checkbox.component.mjs +33 -0
- package/esm2022/lib/input/text-field/text-field.component.mjs +115 -0
- package/{esm2020 → esm2022}/lib/input/textarea-field/textarea-field.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/input/validation-message/validation-message.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/layout/card/card-actions.component.mjs +4 -4
- package/esm2022/lib/layout/card/card-content.component.mjs +64 -0
- package/esm2022/lib/layout/card/card-header.component.mjs +201 -0
- package/{esm2020 → esm2022}/lib/layout/card/card-link.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/layout/card/card-media.component.mjs +4 -4
- package/esm2022/lib/layout/card/card.component.mjs +291 -0
- package/{esm2020 → esm2022}/lib/layout/setting-row/setting-row.component.mjs +4 -4
- package/esm2022/lib/load/loading/loading.component.mjs +43 -0
- package/{esm2020 → esm2022}/lib/load/loading-cover/loading-cover.component.mjs +4 -4
- package/esm2022/lib/navigation/editable-heading/editable-heading.component.mjs +243 -0
- package/{esm2020 → esm2022}/lib/navigation/link/link.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/navigation/page-header/page-header.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tab/simple-tab.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tabs/simple-tabs.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/tabs/tab/tab.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/tabs/tabs/tabs.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/views/all-views-modal/all-views-modal.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/navigation/views/edit-view/edit-view.component.mjs +9 -9
- package/esm2022/lib/navigation/views/permission-picker/permission-picker.component.mjs +151 -0
- package/esm2022/lib/navigation/views/state.mjs +456 -0
- package/{esm2020 → esm2022}/lib/navigation/views/view-menu/view-menu.component.mjs +5 -5
- package/esm2022/lib/navigation/views/views/views.component.mjs +90 -0
- package/{esm2020 → esm2022}/lib/notification/badge/badge.component.mjs +4 -4
- package/esm2022/lib/notification/banner/banner-action.component.mjs +48 -0
- package/esm2022/lib/notification/banner/banner.component.mjs +61 -0
- package/esm2022/lib/notification/map-indicator/map-indicator.component.mjs +50 -0
- package/esm2022/lib/notification/map-indicator/map-indicators.mjs +15 -0
- package/{esm2020 → esm2022}/lib/notification/notification-badge/notification-badge.component.mjs +4 -4
- package/esm2022/lib/overlay/callout/callout.component.mjs +130 -0
- package/esm2022/lib/overlay/callout/callout.helpers.mjs +113 -0
- package/{esm2020 → esm2022}/lib/overlay/callout/help/help.component.mjs +4 -4
- package/esm2022/lib/overlay/callout/lock-scroll.directive.mjs +69 -0
- package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu-item/menu-item.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu.component.mjs +4 -4
- package/esm2022/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +30 -0
- package/{esm2020 → esm2022}/lib/overlay/callout/tooltip/tooltip.component.mjs +4 -4
- package/esm2022/lib/overlay/callout/tooltip/tooltip.directive.mjs +138 -0
- package/esm2022/lib/overlay/modal/dialog/dialog.component.mjs +47 -0
- package/{esm2020 → esm2022}/lib/overlay/modal/dialog-stack.service.mjs +4 -4
- package/esm2022/lib/overlay/modal/form-dialog/form-dialog.component.mjs +146 -0
- package/esm2022/lib/overlay/modal/modal.component.mjs +31 -0
- package/{esm2020 → esm2022}/lib/overlay/modal/side-sheet/side-sheet.component.mjs +4 -4
- package/esm2022/lib/overlay/overlay-outlet.component.mjs +98 -0
- package/{esm2020 → esm2022}/lib/overlay/overlay.directive.mjs +5 -5
- package/{esm2020 → esm2022}/lib/overlay/overlay.service.mjs +5 -5
- package/{esm2020 → esm2022}/lib/overlay/toast/toast-action.component.mjs +4 -4
- package/esm2022/lib/overlay/toast/toast.component.mjs +41 -0
- package/{esm2020 → esm2022}/lib/riv.module.mjs +227 -227
- package/esm2022/lib/size/size.directive.mjs +33 -0
- package/esm2022/lib/table/simple-table/coordinate-helper.mjs +61 -0
- package/esm2022/lib/table/simple-table/simple-table-cell.component.mjs +36 -0
- package/esm2022/lib/table/simple-table/simple-table-header-cell.component.mjs +37 -0
- package/{esm2020 → esm2022}/lib/table/simple-table/simple-table-row.component.mjs +4 -4
- package/esm2022/lib/table/simple-table/simple-table.component.mjs +104 -0
- package/esm2022/lib/table/table/clipboard.mjs +182 -0
- package/esm2022/lib/table/table/state-helpers/collapse-helpers.mjs +116 -0
- package/esm2022/lib/table/table/state-helpers/column-helpers.mjs +383 -0
- package/{esm2020 → esm2022}/lib/table/table/state-helpers/display-helpers.mjs +1 -1
- package/esm2022/lib/table/table/state-helpers/nesting-helpers.mjs +123 -0
- package/esm2022/lib/table/table/state-helpers/order-helpers.mjs +164 -0
- package/esm2022/lib/table/table/state-helpers/pagination-helpers.mjs +139 -0
- package/esm2022/lib/table/table/state-helpers/result-helpers.mjs +70 -0
- package/esm2022/lib/table/table/state-helpers/search-helpers.mjs +72 -0
- package/esm2022/lib/table/table/state-helpers/selection-helpers.mjs +180 -0
- package/esm2022/lib/table/table/state.mjs +1035 -0
- package/esm2022/lib/table/table/table/table.component.mjs +367 -0
- package/{esm2020 → esm2022}/lib/table/table/table-collapse-all/table-collapse-all.component.mjs +5 -5
- package/esm2022/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +227 -0
- package/esm2022/lib/table/table/table-column-settings/table-column-settings.component.mjs +134 -0
- package/esm2022/lib/table/table/table-csv-export/table-csv-export.component.mjs +35 -0
- package/{esm2020 → esm2022}/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.mjs +6 -6
- package/esm2022/lib/table/table/table-search/table-search.component.mjs +71 -0
- package/{esm2020 → esm2022}/lib/table/table/table-search-columns/table-search-columns.component.mjs +4 -4
- package/esm2022/lib/visibility/visibility.directive.mjs +34 -0
- package/esm2022/lib/visualization/chart/chart-scaling.mjs +380 -0
- package/esm2022/lib/visualization/chart/chart.component.mjs +626 -0
- package/esm2022/lib/visualization/chart/chart.mjs +3768 -0
- package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-cell.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-header-cell.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-row.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/data-table/data-table.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/donut/donut.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/funnel-chart/funnel-chart.component.mjs +5 -5
- package/esm2022/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +33 -0
- package/{esm2020 → esm2022}/lib/visualization/highlight/highlight.component.mjs +4 -4
- package/esm2022/lib/visualization/highlight/highlight.helpers.mjs +20 -0
- package/esm2022/lib/visualization/intervals.mjs +63 -0
- package/{esm2020 → esm2022}/lib/visualization/issue/issue.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/legend-item/legend-item.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/metric/metric.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/mini-pie/mini-pie.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/visualization/progress/progress.component.mjs +5 -5
- package/esm2022/lib/visualization/stacked-column/stacked-column.component.mjs +377 -0
- package/esm2022/lib/visualization/stacked-column/stacked-column.helpers.mjs +18 -0
- package/esm2022/lib/visualization/stacked-row/stacked-row.component.mjs +270 -0
- package/esm2022/lib/visualization/stacked-row/stacked-row.helpers.mjs +74 -0
- package/esm2022/lib/visualization/time-series/time-series.component.mjs +374 -0
- package/esm2022/lib/visualization/time-series/time-series.helpers.mjs +15 -0
- package/esm2022/lib/visualization/trend/trend.component.mjs +51 -0
- package/{esm2020 → esm2022}/lib/visualization/zero-state/zero-state.component.mjs +4 -4
- package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs +670 -670
- package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs.map +1 -1
- package/lib/format/svg-text-truncate/svg-text-truncate.directive.d.ts +1 -1
- package/lib/format/truncate/truncate.component.d.ts +1 -1
- package/lib/icon/icon.component.d.ts +1 -1
- package/lib/input/auto-focus/auto-focus.directive.d.ts +1 -1
- package/lib/input/button/button.component.d.ts +1 -1
- package/lib/input/calendar/calendar.component.d.ts +1 -1
- package/lib/input/checkbox/checkbox.component.d.ts +1 -1
- package/lib/input/currency-field/currency-field.component.d.ts +1 -1
- package/lib/input/date/date.component.d.ts +1 -1
- package/lib/input/date-range/date-range.component.d.ts +1 -1
- package/lib/input/filter-chip/filter-chip.component.d.ts +1 -1
- package/lib/input/filter-dropdown/filter-dropdown.component.d.ts +1 -1
- package/lib/input/input-label/input-label.component.d.ts +1 -1
- package/lib/input/mentions-input/mentions-input.component.d.ts +1 -1
- package/lib/input/number-field/number-field.component.d.ts +1 -1
- package/lib/input/percentage-field/percentage-field.component.d.ts +1 -1
- package/lib/input/phone-field/phone-field.component.d.ts +1 -1
- package/lib/input/radio/radio.component.d.ts +1 -1
- package/lib/input/search/search.component.d.ts +1 -1
- package/lib/input/search-select/search-select.component.d.ts +1 -1
- package/lib/input/select/select/select.component.d.ts +1 -1
- package/lib/input/select/select-node/select-node.component.d.ts +1 -1
- package/lib/input/simple-select/simple-select.component.d.ts +1 -1
- package/lib/input/switch-checkbox/switch-checkbox.component.d.ts +1 -1
- package/lib/input/text-field/text-field.component.d.ts +1 -1
- package/lib/input/textarea-field/textarea-field.component.d.ts +1 -1
- package/lib/input/validation-message/validation-message.component.d.ts +1 -1
- package/lib/layout/card/card-actions.component.d.ts +1 -1
- package/lib/layout/card/card-content.component.d.ts +1 -1
- package/lib/layout/card/card-header.component.d.ts +1 -1
- package/lib/layout/card/card-link.component.d.ts +1 -1
- package/lib/layout/card/card-media.component.d.ts +1 -1
- package/lib/layout/card/card.component.d.ts +1 -1
- package/lib/layout/setting-row/setting-row.component.d.ts +1 -1
- package/lib/load/loading/loading.component.d.ts +1 -1
- package/lib/load/loading-cover/loading-cover.component.d.ts +1 -1
- package/lib/navigation/editable-heading/editable-heading.component.d.ts +1 -1
- package/lib/navigation/link/link.component.d.ts +1 -1
- package/lib/navigation/page-header/page-header.component.d.ts +1 -1
- package/lib/navigation/simple-tabs/simple-tab/simple-tab.component.d.ts +1 -1
- package/lib/navigation/tabs/tab/tab.component.d.ts +1 -1
- package/lib/navigation/views/all-views-modal/all-views-modal.component.d.ts +1 -1
- package/lib/navigation/views/edit-view/edit-view.component.d.ts +1 -1
- package/lib/navigation/views/permission-picker/permission-picker.component.d.ts +3 -3
- package/lib/navigation/views/view-menu/view-menu.component.d.ts +1 -1
- package/lib/navigation/views/views/views.component.d.ts +1 -1
- package/lib/notification/badge/badge.component.d.ts +1 -1
- package/lib/notification/banner/banner-action.component.d.ts +1 -1
- package/lib/notification/banner/banner.component.d.ts +1 -1
- package/lib/notification/map-indicator/map-indicator.component.d.ts +1 -1
- package/lib/notification/notification-badge/notification-badge.component.d.ts +1 -1
- package/lib/overlay/callout/callout.component.d.ts +1 -1
- package/lib/overlay/callout/help/help.component.d.ts +1 -1
- package/lib/overlay/callout/lock-scroll.directive.d.ts +1 -1
- package/lib/overlay/callout/menu/menu-item/menu-item.component.d.ts +1 -1
- package/lib/overlay/callout/menu/menu.component.d.ts +1 -1
- package/lib/overlay/callout/tooltip/locked-tooltip.directive.d.ts +1 -1
- package/lib/overlay/callout/tooltip/tooltip.component.d.ts +1 -1
- package/lib/overlay/callout/tooltip/tooltip.directive.d.ts +1 -1
- package/lib/overlay/modal/dialog/dialog.component.d.ts +1 -1
- package/lib/overlay/modal/form-dialog/form-dialog.component.d.ts +1 -1
- package/lib/overlay/modal/modal.component.d.ts +1 -1
- package/lib/overlay/modal/side-sheet/side-sheet.component.d.ts +1 -1
- package/lib/overlay/toast/toast.component.d.ts +1 -1
- package/lib/table/simple-table/simple-table-header-cell.component.d.ts +1 -1
- package/lib/table/simple-table/simple-table-row.component.d.ts +1 -1
- package/lib/table/table/table/table.component.d.ts +1 -1
- package/lib/table/table/table-collapse-all/table-collapse-all.component.d.ts +1 -1
- package/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.d.ts +1 -1
- package/lib/table/table/table-column-settings/table-column-settings.component.d.ts +1 -1
- package/lib/table/table/table-csv-export/table-csv-export.component.d.ts +1 -1
- package/lib/table/table/table-search/table-search.component.d.ts +1 -1
- package/lib/table/table/table-search-columns/table-search-columns.component.d.ts +1 -1
- package/lib/visualization/chart/chart.component.d.ts +1 -1
- package/lib/visualization/data-table/data-table-row.component.d.ts +1 -1
- package/lib/visualization/donut/donut.component.d.ts +1 -1
- package/lib/visualization/funnel-chart/funnel-chart.component.d.ts +1 -1
- package/lib/visualization/highlight/highlight.component.d.ts +1 -1
- package/lib/visualization/issue/issue.component.d.ts +1 -1
- package/lib/visualization/legend-item/legend-item.component.d.ts +1 -1
- package/lib/visualization/metric/metric.component.d.ts +1 -1
- package/lib/visualization/mini-pie/mini-pie.component.d.ts +1 -1
- package/lib/visualization/progress/progress.component.d.ts +1 -1
- package/lib/visualization/stacked-column/stacked-column.component.d.ts +3 -3
- package/lib/visualization/stacked-row/stacked-row.component.d.ts +1 -1
- package/lib/visualization/time-series/time-series.component.d.ts +3 -3
- package/lib/visualization/trend/trend.component.d.ts +1 -1
- package/lib/visualization/zero-state/zero-state.component.d.ts +1 -1
- package/package.json +5 -11
- package/esm2020/lib/download/download.service.mjs +0 -47
- package/esm2020/lib/format/pipes/sentence-case.pipe.mjs +0 -61
- package/esm2020/lib/format/pipes/small-currency.pipe.mjs +0 -24
- package/esm2020/lib/format/pipes/small-number.pipe.mjs +0 -29
- package/esm2020/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +0 -62
- package/esm2020/lib/format/truncate/truncate.component.mjs +0 -51
- package/esm2020/lib/icon/dom-cache.mjs +0 -32
- package/esm2020/lib/icon/icon.component.mjs +0 -86
- package/esm2020/lib/input/auto-focus/auto-focus.directive.mjs +0 -48
- package/esm2020/lib/input/button/button.component.mjs +0 -139
- package/esm2020/lib/input/button-group/button-group.component.mjs +0 -39
- package/esm2020/lib/input/date/date.component.mjs +0 -279
- package/esm2020/lib/input/date-range/date-range.component.mjs +0 -477
- package/esm2020/lib/input/filter-chip/filter-chip.component.mjs +0 -47
- package/esm2020/lib/input/mentions-input/mentions-input.component.mjs +0 -745
- package/esm2020/lib/input/number-field/number-field.component.mjs +0 -125
- package/esm2020/lib/input/phone-field/phone-field.component.mjs +0 -74
- package/esm2020/lib/input/search-select/search-select.component.mjs +0 -189
- package/esm2020/lib/input/select/select/select.component.mjs +0 -178
- package/esm2020/lib/input/select/state.mjs +0 -882
- package/esm2020/lib/input/simple-select/simple-select.component.mjs +0 -178
- package/esm2020/lib/input/switch-checkbox/switch-checkbox.component.mjs +0 -33
- package/esm2020/lib/input/text-field/text-field.component.mjs +0 -115
- package/esm2020/lib/layout/card/card-content.component.mjs +0 -64
- package/esm2020/lib/layout/card/card-header.component.mjs +0 -201
- package/esm2020/lib/layout/card/card.component.mjs +0 -291
- package/esm2020/lib/load/loading/loading.component.mjs +0 -43
- package/esm2020/lib/navigation/editable-heading/editable-heading.component.mjs +0 -243
- package/esm2020/lib/navigation/views/permission-picker/permission-picker.component.mjs +0 -151
- package/esm2020/lib/navigation/views/state.mjs +0 -456
- package/esm2020/lib/navigation/views/views/views.component.mjs +0 -90
- package/esm2020/lib/notification/banner/banner-action.component.mjs +0 -48
- package/esm2020/lib/notification/banner/banner.component.mjs +0 -61
- package/esm2020/lib/notification/map-indicator/map-indicator.component.mjs +0 -50
- package/esm2020/lib/notification/map-indicator/map-indicators.mjs +0 -15
- package/esm2020/lib/overlay/callout/callout.component.mjs +0 -130
- package/esm2020/lib/overlay/callout/callout.helpers.mjs +0 -113
- package/esm2020/lib/overlay/callout/lock-scroll.directive.mjs +0 -69
- package/esm2020/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +0 -30
- package/esm2020/lib/overlay/callout/tooltip/tooltip.directive.mjs +0 -138
- package/esm2020/lib/overlay/modal/dialog/dialog.component.mjs +0 -47
- package/esm2020/lib/overlay/modal/form-dialog/form-dialog.component.mjs +0 -146
- package/esm2020/lib/overlay/modal/modal.component.mjs +0 -31
- package/esm2020/lib/overlay/overlay-outlet.component.mjs +0 -98
- package/esm2020/lib/overlay/toast/toast.component.mjs +0 -41
- package/esm2020/lib/size/size.directive.mjs +0 -33
- package/esm2020/lib/table/simple-table/coordinate-helper.mjs +0 -61
- package/esm2020/lib/table/simple-table/simple-table-cell.component.mjs +0 -36
- package/esm2020/lib/table/simple-table/simple-table-header-cell.component.mjs +0 -37
- package/esm2020/lib/table/simple-table/simple-table.component.mjs +0 -104
- package/esm2020/lib/table/table/clipboard.mjs +0 -182
- package/esm2020/lib/table/table/state-helpers/collapse-helpers.mjs +0 -116
- package/esm2020/lib/table/table/state-helpers/column-helpers.mjs +0 -383
- package/esm2020/lib/table/table/state-helpers/nesting-helpers.mjs +0 -123
- package/esm2020/lib/table/table/state-helpers/order-helpers.mjs +0 -164
- package/esm2020/lib/table/table/state-helpers/pagination-helpers.mjs +0 -139
- package/esm2020/lib/table/table/state-helpers/result-helpers.mjs +0 -70
- package/esm2020/lib/table/table/state-helpers/search-helpers.mjs +0 -72
- package/esm2020/lib/table/table/state-helpers/selection-helpers.mjs +0 -180
- package/esm2020/lib/table/table/state.mjs +0 -1035
- package/esm2020/lib/table/table/table/table.component.mjs +0 -367
- package/esm2020/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +0 -227
- package/esm2020/lib/table/table/table-column-settings/table-column-settings.component.mjs +0 -134
- package/esm2020/lib/table/table/table-csv-export/table-csv-export.component.mjs +0 -35
- package/esm2020/lib/table/table/table-search/table-search.component.mjs +0 -71
- package/esm2020/lib/visibility/visibility.directive.mjs +0 -34
- package/esm2020/lib/visualization/chart/chart-scaling.mjs +0 -380
- package/esm2020/lib/visualization/chart/chart.component.mjs +0 -626
- package/esm2020/lib/visualization/chart/chart.mjs +0 -3768
- package/esm2020/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +0 -33
- package/esm2020/lib/visualization/highlight/highlight.helpers.mjs +0 -20
- package/esm2020/lib/visualization/intervals.mjs +0 -63
- package/esm2020/lib/visualization/stacked-column/stacked-column.component.mjs +0 -377
- package/esm2020/lib/visualization/stacked-column/stacked-column.helpers.mjs +0 -18
- package/esm2020/lib/visualization/stacked-row/stacked-row.component.mjs +0 -270
- package/esm2020/lib/visualization/stacked-row/stacked-row.helpers.mjs +0 -74
- package/esm2020/lib/visualization/time-series/time-series.component.mjs +0 -374
- package/esm2020/lib/visualization/time-series/time-series.helpers.mjs +0 -15
- package/esm2020/lib/visualization/trend/trend.component.mjs +0 -51
- package/fesm2015/rivet-health-design-system.mjs +0 -18370
- package/fesm2015/rivet-health-design-system.mjs.map +0 -1
- /package/{esm2020 → esm2022}/lib/overlay/callout/select-callout-defaults.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/util/local-storage.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/rivet-health-design-system.mjs +0 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Input, Output, TemplateRef, } from '@angular/core';
|
|
2
|
+
import { scaleLinear } from 'd3-scale';
|
|
3
|
+
import { BehaviorSubject, combineLatest, map, shareReplay, } from 'rxjs';
|
|
4
|
+
import { getKeyOrder, getLegendItems, getRowDisplayInfo, standardizeRowStacks, } from './stacked-row.helpers';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
import * as i2 from "../../overlay/callout/callout.component";
|
|
8
|
+
import * as i3 from "../legend-item/legend-item.component";
|
|
9
|
+
import * as i4 from "../../overlay/overlay.directive";
|
|
10
|
+
import * as i5 from "../../size/size.directive";
|
|
11
|
+
import * as i6 from "../../format/svg-text-truncate/svg-text-truncate.directive";
|
|
12
|
+
import * as i7 from "../zero-state/zero-state.component";
|
|
13
|
+
// TODO: once we upgrade to Angular 16, this component can be cleaned up with
|
|
14
|
+
// signals instead of RxJS.
|
|
15
|
+
// https://www.notion.so/rivet/Resolve-TODOs-after-Angular-upgrade-1f2667eb2a3180b79f6ad92a7e576f08
|
|
16
|
+
export class StackedRowComponent {
|
|
17
|
+
constructor() {
|
|
18
|
+
// This is the list of rows we will display, in the order we will display them.
|
|
19
|
+
this.input$ = new BehaviorSubject([]);
|
|
20
|
+
// Width helps determine the size of the viewbox this graph is displaying in.
|
|
21
|
+
this.width$ = new BehaviorSubject(0);
|
|
22
|
+
// ValueFormatter determines how we style the values in a metric and the x-axis
|
|
23
|
+
this.valueFormatter = v => v.toString();
|
|
24
|
+
this.zeroStateMessage$ = new BehaviorSubject('No data to display.');
|
|
25
|
+
this.stackClicked = new EventEmitter();
|
|
26
|
+
this.chartAndRowHeights$ = this.input$.pipe(map(input => {
|
|
27
|
+
const heightWithoutRows = input.length * this.SECTION_PADDING.BETWEEN_ROW +
|
|
28
|
+
this.SECTION_PADDING.OUTER_TOP_BOTTOM * 2 +
|
|
29
|
+
this.SECTION_HEIGHTS.X_AXIS_LABEL;
|
|
30
|
+
// The combined height of all rows at their min/max
|
|
31
|
+
const minHeight = input.length * this.RECTANGLE_HEIGHTS.MIN_HEIGHT + heightWithoutRows;
|
|
32
|
+
const maxHeight = input.length * this.RECTANGLE_HEIGHTS.MAX_HEIGHT + heightWithoutRows;
|
|
33
|
+
// If the max-sized rows don't need the target size, shrink the chart
|
|
34
|
+
if (maxHeight < this.TARGET_HEIGHT)
|
|
35
|
+
return {
|
|
36
|
+
chartHeight: maxHeight,
|
|
37
|
+
rowHeight: this.RECTANGLE_HEIGHTS.MAX_HEIGHT,
|
|
38
|
+
};
|
|
39
|
+
// If the min-sized rows need more than the target size, grow the chart
|
|
40
|
+
if (minHeight > this.TARGET_HEIGHT)
|
|
41
|
+
return {
|
|
42
|
+
chartHeight: minHeight,
|
|
43
|
+
rowHeight: this.RECTANGLE_HEIGHTS.MIN_HEIGHT,
|
|
44
|
+
};
|
|
45
|
+
// Otherwise shrink the rows to fit the target size
|
|
46
|
+
return {
|
|
47
|
+
chartHeight: this.TARGET_HEIGHT,
|
|
48
|
+
rowHeight: (this.TARGET_HEIGHT - heightWithoutRows) / input.length,
|
|
49
|
+
};
|
|
50
|
+
}));
|
|
51
|
+
/*
|
|
52
|
+
The layout we are shooting for is:
|
|
53
|
+
|
|
54
|
+
| X Axis Labels |
|
|
55
|
+
Row Name | Rectangles | Totals
|
|
56
|
+
*/
|
|
57
|
+
this.TARGET_HEIGHT = 300;
|
|
58
|
+
this.RECTANGLE_HEIGHTS = {
|
|
59
|
+
MIN_HEIGHT: 12, // Sets the smallest size a row can shrink to
|
|
60
|
+
MAX_HEIGHT: 42, // Sets the largest size a row can expand to
|
|
61
|
+
};
|
|
62
|
+
this.LABEL_HEIGHT = 8;
|
|
63
|
+
this.SECTION_HEIGHTS = {
|
|
64
|
+
// Space reserved for the x-axis labels
|
|
65
|
+
X_AXIS_LABEL: 14,
|
|
66
|
+
};
|
|
67
|
+
this.SECTION_WIDTHS = {
|
|
68
|
+
// Space reserved for the name at the start of the row
|
|
69
|
+
ROW_NAME: 100,
|
|
70
|
+
// Space reserved for the totals at the end of the row
|
|
71
|
+
ROW_TOTAL_LABEL: 72,
|
|
72
|
+
};
|
|
73
|
+
this.SECTION_PADDING = {
|
|
74
|
+
// Padding between each edge of the viewbox and the content
|
|
75
|
+
OUTER_TOP_BOTTOM: 4,
|
|
76
|
+
OUTER_LEFT_RIGHT: 4,
|
|
77
|
+
// Padding between the bottom of one row and the top of the next row
|
|
78
|
+
BETWEEN_ROW: 4,
|
|
79
|
+
// Space between the row and the top of a rectangle in that row
|
|
80
|
+
RECTANGLE_TO_ROW: 6,
|
|
81
|
+
};
|
|
82
|
+
// The number of X-axis segments to create, with labels at the start of each segment.
|
|
83
|
+
this.X_TICK_COUNT_MAX = 8;
|
|
84
|
+
this.X_TICK_COUNT_MIN = 3;
|
|
85
|
+
this.X_TICK_MAX_WIDTH = 900;
|
|
86
|
+
this.X_TICK_MIN_WIDTH = 400;
|
|
87
|
+
this.drawData$ = combineLatest([
|
|
88
|
+
this.input$,
|
|
89
|
+
this.width$,
|
|
90
|
+
this.chartAndRowHeights$,
|
|
91
|
+
]).pipe(map(([input, width, height]) => {
|
|
92
|
+
return this.getDrawnData(input, width, height.chartHeight, height.rowHeight);
|
|
93
|
+
}), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
94
|
+
// Lets us know whether to display the zero data state
|
|
95
|
+
this.empty$ = this.input$.pipe(map(input => input.every(stack => stack.data.length === 0)), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
96
|
+
// What rectangle we are currently hovering over
|
|
97
|
+
this.hoveredRectangle$ = new BehaviorSubject(null);
|
|
98
|
+
// What band we are currently hovering over
|
|
99
|
+
this.hoveredBand$ = new BehaviorSubject(null);
|
|
100
|
+
// Create the metric to display based on the currently hovered rectangle
|
|
101
|
+
this.callout$ = combineLatest([this.hoveredBand$, this.drawData$]).pipe(map(([hoveredBand, drawData]) => {
|
|
102
|
+
if (!hoveredBand || !drawData)
|
|
103
|
+
return null;
|
|
104
|
+
const { target } = hoveredBand.event;
|
|
105
|
+
if (!target)
|
|
106
|
+
return null;
|
|
107
|
+
const anchor = target.getBoundingClientRect();
|
|
108
|
+
const metrics = drawData.rects
|
|
109
|
+
.filter(rect => rect.rowName === hoveredBand.rowName)
|
|
110
|
+
.map(rect => ({
|
|
111
|
+
rect,
|
|
112
|
+
label: rect.stackedRowElement.label,
|
|
113
|
+
value: this.valueFormatter(rect.stackedRowElement.value),
|
|
114
|
+
colorToken: rect.stackedRowElement.colorToken,
|
|
115
|
+
}));
|
|
116
|
+
return { anchor, metrics };
|
|
117
|
+
}), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
118
|
+
}
|
|
119
|
+
set input(v) {
|
|
120
|
+
this.input$.next(v);
|
|
121
|
+
}
|
|
122
|
+
get input() {
|
|
123
|
+
return this.input$.getValue();
|
|
124
|
+
}
|
|
125
|
+
set width(v) {
|
|
126
|
+
this.width$.next(v);
|
|
127
|
+
}
|
|
128
|
+
set zeroStateMessage(v) {
|
|
129
|
+
this.zeroStateMessage$.next(v);
|
|
130
|
+
}
|
|
131
|
+
get zeroStateMessage() {
|
|
132
|
+
return this.zeroStateMessage$.getValue();
|
|
133
|
+
}
|
|
134
|
+
// Zero on the X axis is after the left padding and the row name.
|
|
135
|
+
locationOfXAxisZero() {
|
|
136
|
+
return this.SECTION_PADDING.OUTER_LEFT_RIGHT + this.SECTION_WIDTHS.ROW_NAME;
|
|
137
|
+
}
|
|
138
|
+
// The end of the X axis is right before the row total and the right padding.
|
|
139
|
+
locationOfXAxisEnd(width) {
|
|
140
|
+
const spaceOnRight = this.SECTION_WIDTHS.ROW_TOTAL_LABEL +
|
|
141
|
+
this.SECTION_PADDING.OUTER_LEFT_RIGHT;
|
|
142
|
+
return width - spaceOnRight;
|
|
143
|
+
}
|
|
144
|
+
// The y-index of the x-axis ticks
|
|
145
|
+
locationOfXAxisTick() {
|
|
146
|
+
return (this.SECTION_PADDING.OUTER_TOP_BOTTOM + this.SECTION_HEIGHTS.X_AXIS_LABEL);
|
|
147
|
+
}
|
|
148
|
+
// The y-index of the top of the current row
|
|
149
|
+
getTopOfRow(rowIndex, rowHeight) {
|
|
150
|
+
const spaceAboveRows = this.SECTION_PADDING.OUTER_TOP_BOTTOM + this.SECTION_HEIGHTS.X_AXIS_LABEL;
|
|
151
|
+
const aboveRows = rowIndex * rowHeight;
|
|
152
|
+
const aboveRowPaddings = rowIndex * this.SECTION_PADDING.BETWEEN_ROW;
|
|
153
|
+
const allAboveRows = aboveRows + aboveRowPaddings;
|
|
154
|
+
return spaceAboveRows + allAboveRows;
|
|
155
|
+
}
|
|
156
|
+
// Calculate all the values we need for displaying the graph on screen.
|
|
157
|
+
getDrawnData(rowStacks, width, chartHeight, rowHeight) {
|
|
158
|
+
if (rowStacks.length == 0) {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
const viewBox = `0 0 ${width} ${chartHeight}`;
|
|
162
|
+
const keysInOrder = getKeyOrder(rowStacks);
|
|
163
|
+
const standardizedRows = standardizeRowStacks(rowStacks, keysInOrder);
|
|
164
|
+
const rowsForDisplay = standardizedRows.map((stackData, i) => {
|
|
165
|
+
return getRowDisplayInfo(stackData, i);
|
|
166
|
+
});
|
|
167
|
+
// The maximum value of the domain should be the highest total value from the rows.
|
|
168
|
+
const domainMax = Math.max(0, ...rowsForDisplay.map(row => row.rowTotal));
|
|
169
|
+
const xScale = scaleLinear()
|
|
170
|
+
.domain([0, domainMax])
|
|
171
|
+
.range([this.locationOfXAxisZero(), this.locationOfXAxisEnd(width)]);
|
|
172
|
+
// Setup a linear scale for tick count based on width
|
|
173
|
+
const tickScale = scaleLinear()
|
|
174
|
+
.domain([this.X_TICK_MIN_WIDTH, this.X_TICK_MAX_WIDTH])
|
|
175
|
+
.range([this.X_TICK_COUNT_MIN, this.X_TICK_COUNT_MAX])
|
|
176
|
+
.clamp(true); // Ensures the scale does not go beyond the defined range
|
|
177
|
+
const xtickCountAdjusted = Math.round(tickScale(width));
|
|
178
|
+
const xTicks = xScale.ticks(xtickCountAdjusted);
|
|
179
|
+
const rects = this.createRectanglesFromRows(rowsForDisplay, xScale, rowHeight);
|
|
180
|
+
const rowNamesToDraw = this.getRowNamesToDraw(rowsForDisplay, rowHeight);
|
|
181
|
+
const rowTotalsToDraw = this.getRowTotalsToDraw(rowsForDisplay, width, rowHeight);
|
|
182
|
+
const legendItems = getLegendItems(rowsForDisplay, keysInOrder);
|
|
183
|
+
return {
|
|
184
|
+
legendItems: legendItems,
|
|
185
|
+
rowHeight: rowHeight,
|
|
186
|
+
rects: rects,
|
|
187
|
+
rowNames: rowNamesToDraw,
|
|
188
|
+
rowTotals: rowTotalsToDraw,
|
|
189
|
+
viewBox: viewBox,
|
|
190
|
+
xScale: xScale,
|
|
191
|
+
xTicks: xTicks,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
// Get data for all the rectangles for all the rows
|
|
195
|
+
createRectanglesFromRows(displayRows, xScale, rowHeight) {
|
|
196
|
+
const rectangles = [];
|
|
197
|
+
displayRows.forEach((currentRow, rowIndex) => {
|
|
198
|
+
currentRow.elementsButStacked.forEach((currentElement, _) => {
|
|
199
|
+
const topOfRow = this.getTopOfRow(rowIndex, rowHeight);
|
|
200
|
+
const rectangleWidth = xScale(currentElement.topline) - xScale(currentElement.baseline);
|
|
201
|
+
const rectangleHeight = rowHeight;
|
|
202
|
+
const rectangleX = xScale(currentElement.baseline);
|
|
203
|
+
const rectangleY = topOfRow + this.SECTION_PADDING.RECTANGLE_TO_ROW;
|
|
204
|
+
const fill = `var(${currentElement.colorToken})`;
|
|
205
|
+
rectangles.push({
|
|
206
|
+
x: rectangleX,
|
|
207
|
+
y: rectangleY,
|
|
208
|
+
width: Math.max(rectangleWidth, 0),
|
|
209
|
+
height: rectangleHeight,
|
|
210
|
+
fill: fill,
|
|
211
|
+
striped: currentElement.style === 'striped',
|
|
212
|
+
rowName: currentRow.rowName,
|
|
213
|
+
stackedRowElement: currentElement,
|
|
214
|
+
stackIndex: currentRow.stackIndex,
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
return rectangles;
|
|
219
|
+
}
|
|
220
|
+
// Get data on the row names we are drawing
|
|
221
|
+
getRowNamesToDraw(displayRows, rowHeight) {
|
|
222
|
+
return displayRows.map((row, rowIndex) => {
|
|
223
|
+
const rowLabelX = this.SECTION_PADDING.OUTER_LEFT_RIGHT;
|
|
224
|
+
// The row name looks right if its base is at the base of the associated rectangle
|
|
225
|
+
const rowLabelY = this.getTopOfRow(rowIndex, rowHeight) +
|
|
226
|
+
this.SECTION_PADDING.RECTANGLE_TO_ROW +
|
|
227
|
+
this.LABEL_HEIGHT / 2 +
|
|
228
|
+
rowHeight / 2;
|
|
229
|
+
return {
|
|
230
|
+
label: row.rowName,
|
|
231
|
+
x: rowLabelX,
|
|
232
|
+
y: rowLabelY,
|
|
233
|
+
};
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
// Get data on the row totals we are drawing
|
|
237
|
+
getRowTotalsToDraw(displayRows, width, rowHeight) {
|
|
238
|
+
return displayRows.map((row, rowIndex) => {
|
|
239
|
+
const rowLabelX = width - this.SECTION_PADDING.OUTER_LEFT_RIGHT;
|
|
240
|
+
// The row totals looks right if its base is at the base of the associated rectangle
|
|
241
|
+
const rowLabelY = this.getTopOfRow(rowIndex, rowHeight) +
|
|
242
|
+
this.SECTION_PADDING.RECTANGLE_TO_ROW +
|
|
243
|
+
this.LABEL_HEIGHT / 2 +
|
|
244
|
+
rowHeight / 2;
|
|
245
|
+
return {
|
|
246
|
+
label: this.valueFormatter(row.rowTotal),
|
|
247
|
+
x: rowLabelX,
|
|
248
|
+
y: rowLabelY,
|
|
249
|
+
};
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StackedRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
253
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: StackedRowComponent, selector: "riv-stacked-row", inputs: { input: "input", valueFormatter: "valueFormatter", zeroStateMessage: "zeroStateMessage" }, outputs: { stackClicked: "stackClicked" }, queries: [{ propertyName: "calloutHeaderTemplate", first: true, predicate: TemplateRef, descendants: true }], ngImport: i0, template: "<div\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let draw\"\n [attr.viewBox]=\"draw.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"draw.rowHeight\"\n [attr.height]=\"draw.rowHeight\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"draw.rowHeight\"\n [attr.y2]=\"draw.rowHeight\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let rowNameToDraw of draw.rowNames\">\n <text\n rivSVGTextTruncate\n [text]=\"rowNameToDraw.label\"\n [width]=\"SECTION_WIDTHS.ROW_NAME\"\n class=\"row-title\"\n [attr.x]=\"rowNameToDraw.x\"\n [attr.y]=\"rowNameToDraw.y\"\n ></text>\n </g>\n <g *ngFor=\"let tick of draw.xTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"draw.xScale(tick)\"\n y=\"0\"\n width=\"1\"\n height=\"100%\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"draw.xScale(tick)\"\n [attr.y]=\"locationOfXAxisTick()\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g\n *ngFor=\"let rect of draw.rects\"\n (mouseenter)=\"hoveredBand$.next({ rowName: rect.rowName, event: $event })\"\n (mouseleave)=\"hoveredBand$.next(null)\"\n (click)=\"\n stackClicked.emit({ stackIndex: rect.stackIndex });\n hoveredBand$.next(null)\n \"\n >\n <rect\n class=\"row\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.rowName !== rect.rowName\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <g *ngFor=\"let rowTotalToDraw of draw.rowTotals\">\n <text\n class=\"row-total\"\n [attr.x]=\"rowTotalToDraw.x\"\n [attr.y]=\"rowTotalToDraw.y\"\n text-anchor=\"end\"\n >\n {{ rowTotalToDraw.label }}\n </text>\n </g>\n </svg>\n <legend *ngIf=\"drawData$ | async; let draw\">\n <riv-legend-item\n *ngFor=\"let item of draw.legendItems\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [style]=\"item.style ? item.style : 'solid'\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [isModal]=\"false\"\n [preferredPosition]=\"'bottom-center'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <ng-container\n [ngTemplateOutlet]=\"calloutHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: callout }\"\n ></ng-container>\n <div *ngFor=\"let metric of callout?.metrics\" class=\"callout-row\">\n <span class=\"series-label\">\n <riv-legend-item [colorToken]=\"metric.colorToken\"></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.row-title{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.row-total{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);fill:var(--type-light-low-contrast)}.row{transition:opacity var(--short-transition)}.row.blurred{opacity:.4}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{padding:var(--size-medium) 0;display:flex;gap:var(--size-large);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i3.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility", "iconTooltip", "clickable", "showCheckWhenClickable"], outputs: ["itemClick"] }, { kind: "directive", type: i4.OverlayDirective, selector: "[riv-overlay]" }, { kind: "directive", type: i5.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "directive", type: i6.SVGTextTruncateDirective, selector: "svg text[rivSVGTextTruncate]", inputs: ["text", "width"] }, { kind: "component", type: i7.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
254
|
+
}
|
|
255
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StackedRowComponent, decorators: [{
|
|
256
|
+
type: Component,
|
|
257
|
+
args: [{ selector: 'riv-stacked-row', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let draw\"\n [attr.viewBox]=\"draw.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"draw.rowHeight\"\n [attr.height]=\"draw.rowHeight\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"draw.rowHeight\"\n [attr.y2]=\"draw.rowHeight\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let rowNameToDraw of draw.rowNames\">\n <text\n rivSVGTextTruncate\n [text]=\"rowNameToDraw.label\"\n [width]=\"SECTION_WIDTHS.ROW_NAME\"\n class=\"row-title\"\n [attr.x]=\"rowNameToDraw.x\"\n [attr.y]=\"rowNameToDraw.y\"\n ></text>\n </g>\n <g *ngFor=\"let tick of draw.xTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"draw.xScale(tick)\"\n y=\"0\"\n width=\"1\"\n height=\"100%\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"draw.xScale(tick)\"\n [attr.y]=\"locationOfXAxisTick()\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g\n *ngFor=\"let rect of draw.rects\"\n (mouseenter)=\"hoveredBand$.next({ rowName: rect.rowName, event: $event })\"\n (mouseleave)=\"hoveredBand$.next(null)\"\n (click)=\"\n stackClicked.emit({ stackIndex: rect.stackIndex });\n hoveredBand$.next(null)\n \"\n >\n <rect\n class=\"row\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.rowName !== rect.rowName\n \"\n ></rect>\n <rect\n *ngIf=\"rect.striped\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </g>\n <g *ngFor=\"let rowTotalToDraw of draw.rowTotals\">\n <text\n class=\"row-total\"\n [attr.x]=\"rowTotalToDraw.x\"\n [attr.y]=\"rowTotalToDraw.y\"\n text-anchor=\"end\"\n >\n {{ rowTotalToDraw.label }}\n </text>\n </g>\n </svg>\n <legend *ngIf=\"drawData$ | async; let draw\">\n <riv-legend-item\n *ngFor=\"let item of draw.legendItems\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [style]=\"item.style ? item.style : 'solid'\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-overlay\n [anchor]=\"callout?.anchor ?? null\"\n [isModal]=\"false\"\n [preferredPosition]=\"'bottom-center'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <ng-container\n [ngTemplateOutlet]=\"calloutHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: callout }\"\n ></ng-container>\n <div *ngFor=\"let metric of callout?.metrics\" class=\"callout-row\">\n <span class=\"series-label\">\n <riv-legend-item [colorToken]=\"metric.colorToken\"></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.row-title{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.row-total{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);fill:var(--type-light-low-contrast)}.row{transition:opacity var(--short-transition)}.row.blurred{opacity:.4}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{padding:var(--size-medium) 0;display:flex;gap:var(--size-large);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}\n"] }]
|
|
258
|
+
}], propDecorators: { input: [{
|
|
259
|
+
type: Input
|
|
260
|
+
}], valueFormatter: [{
|
|
261
|
+
type: Input
|
|
262
|
+
}], zeroStateMessage: [{
|
|
263
|
+
type: Input
|
|
264
|
+
}], calloutHeaderTemplate: [{
|
|
265
|
+
type: ContentChild,
|
|
266
|
+
args: [TemplateRef]
|
|
267
|
+
}], stackClicked: [{
|
|
268
|
+
type: Output
|
|
269
|
+
}] } });
|
|
270
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLXJvdy9zdGFja2VkLXJvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtcm93L3N0YWNrZWQtcm93LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixXQUFXLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsZUFBZSxFQUVmLGFBQWEsRUFDYixHQUFHLEVBQ0gsV0FBVyxHQUNaLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUtMLFdBQVcsRUFDWCxjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLG9CQUFvQixHQUNyQixNQUFNLHVCQUF1QixDQUFDOzs7Ozs7Ozs7QUFFL0IsNkVBQTZFO0FBQzdFLDJCQUEyQjtBQUMzQixtR0FBbUc7QUFPbkcsTUFBTSxPQUFPLG1CQUFtQjtJQU5oQztRQU9FLCtFQUErRTtRQUM5RCxXQUFNLEdBQUcsSUFBSSxlQUFlLENBQzNDLEVBQUUsQ0FDSCxDQUFDO1FBU0YsNkVBQTZFO1FBQzVELFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUt6RCwrRUFBK0U7UUFFeEUsbUJBQWMsR0FBMEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFaEQsc0JBQWlCLEdBQUcsSUFBSSxlQUFlLENBQ3RELHFCQUFxQixDQUN0QixDQUFDO1FB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SUFDNUMsa0JBQWtCLENBQ2hCLFdBQTZCLEVBQzdCLEtBQWEsRUFDYixTQUFpQjtRQUVqQixPQUFPLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDdkMsTUFBTSxTQUFTLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUM7WUFDaEUsb0ZBQW9GO1lBQ3BGLE1BQU0sU0FBUyxHQUNiLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0I7Z0JBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQztnQkFDckIsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUVoQixPQUFPO2dCQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7Z0JBQ3hDLENBQUMsRUFBRSxTQUFTO2dCQUNaLENBQUMsRUFBRSxTQUFTO2FBQ2IsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0F0U1UsbUJBQW1CO21HQUFuQixtQkFBbUIseVBBa0NoQixXQUFXLGdEQ3pFM0IsbTdIQTZJQTs7NEZEdEdhLG1CQUFtQjtrQkFOL0IsU0FBUzsrQkFDRSxpQkFBaUIsbUJBR1YsdUJBQXVCLENBQUMsTUFBTTs4QkFRcEMsS0FBSztzQkFEZixLQUFLO2dCQWdCQyxjQUFjO3NCQURwQixLQUFLO2dCQU9LLGdCQUFnQjtzQkFEMUIsS0FBSztnQkFTTixxQkFBcUI7c0JBRHBCLFlBQVk7dUJBQUMsV0FBVztnQkFNekIsWUFBWTtzQkFEWCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEludGVyblNldCB9IGZyb20gJ2QzLWFycmF5JztcbmltcG9ydCB7IFNjYWxlTGluZWFyLCBzY2FsZUxpbmVhciB9IGZyb20gJ2QzLXNjYWxlJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgY29tYmluZUxhdGVzdCxcbiAgbWFwLFxuICBzaGFyZVJlcGxheSxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMZWdlbmRJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi4vbGVnZW5kLWl0ZW0vbGVnZW5kLWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7XG4gIFJvd0Rpc3BsYXlJbmZvLFxuICBSb3dMYWJlbCxcbiAgUm93UmVjdGFuZ2xlLFxuICBTdGFja2VkUm93RHJhd0RhdGEsXG4gIGdldEtleU9yZGVyLFxuICBnZXRMZWdlbmRJdGVtcyxcbiAgZ2V0Um93RGlzcGxheUluZm8sXG4gIHN0YW5kYXJkaXplUm93U3RhY2tzLFxufSBmcm9tICcuL3N0YWNrZWQtcm93LmhlbHBlcnMnO1xuXG4vLyBUT0RPOiBvbmNlIHdlIHVwZ3JhZGUgdG8gQW5ndWxhciAxNiwgdGhpcyBjb21wb25lbnQgY2FuIGJlIGNsZWFuZWQgdXAgd2l0aFxuLy8gc2lnbmFscyBpbnN0ZWFkIG9mIFJ4SlMuXG4vLyBodHRwczovL3d3dy5ub3Rpb24uc28vcml2ZXQvUmVzb2x2ZS1UT0RPcy1hZnRlci1Bbmd1bGFyLXVwZ3JhZGUtMWYyNjY3ZWIyYTMxODBiNzlmNmFkOTJhN2U1NzZmMDhcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jpdi1zdGFja2VkLXJvdycsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGFja2VkLXJvdy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0YWNrZWQtcm93LmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFN0YWNrZWRSb3dDb21wb25lbnQge1xuICAvLyBUaGlzIGlzIHRoZSBsaXN0IG9mIHJvd3Mgd2Ugd2lsbCBkaXNwbGF5LCBpbiB0aGUgb3JkZXIgd2Ugd2lsbCBkaXNwbGF5IHRoZW0uXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5wdXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTdGFja2VkUm93Q29tcG9uZW50LlJvd1N0YWNrW10+KFxuICAgIFtdLFxuICApO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGlucHV0KHY6IFN0YWNrZWRSb3dDb21wb25lbnQuUm93U3RhY2tbXSkge1xuICAgIHRoaXMuaW5wdXQkLm5leHQodik7XG4gIH1cbiAgcHVibGljIGdldCBpbnB1dCgpOiBTdGFja2VkUm93Q29tcG9uZW50LlJvd1N0YWNrW10ge1xuICAgIHJldHVybiB0aGlzLmlucHV0JC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLy8gV2lkdGggaGVscHMgZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSB2aWV3Ym94IHRoaXMgZ3JhcGggaXMgZGlzcGxheWluZyBpbi5cbiAgcHJpdmF0ZSByZWFkb25seSB3aWR0aCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIHByb3RlY3RlZCBzZXQgd2lkdGgodjogbnVtYmVyKSB7XG4gICAgdGhpcy53aWR0aCQubmV4dCh2KTtcbiAgfVxuXG4gIC8vIFZhbHVlRm9ybWF0dGVyIGRldGVybWluZXMgaG93IHdlIHN0eWxlIHRoZSB2YWx1ZXMgaW4gYSBtZXRyaWMgYW5kIHRoZSB4LWF4aXNcbiAgQElucHV0KClcbiAgcHVibGljIHZhbHVlRm9ybWF0dGVyOiAodjogbnVtYmVyKSA9PiBzdHJpbmcgPSB2ID0+IHYudG9TdHJpbmcoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHplcm9TdGF0ZU1lc3NhZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KFxuICAgICdObyBkYXRhIHRvIGRpc3BsYXkuJyxcbiAgKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCB6ZXJvU3RhdGVNZXNzYWdlKHY6IHN0cmluZykge1xuICAgIHRoaXMuemVyb1N0YXRlTWVzc2FnZSQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IHplcm9TdGF0ZU1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy56ZXJvU3RhdGVNZXNzYWdlJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgQENvbnRlbnRDaGlsZChUZW1wbGF0ZVJlZilcbiAgY2FsbG91dEhlYWRlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8e1xuICAgICRpbXBsaWNpdDogU3RhY2tlZFJvd0NvbXBvbmVudC5DYWxsb3V0Q29udGV4dDtcbiAgfT47XG5cbiAgQE91dHB1dCgpXG4gIHN0YWNrQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U3RhY2tlZFJvd0NvbXBvbmVudC5TdGFja0NsaWNrZWQ+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjaGFydEFuZFJvd0hlaWdodHMkID0gdGhpcy5pbnB1dCQucGlwZShcbiAgICBtYXAoaW5wdXQgPT4ge1xuICAgICAgY29uc3QgaGVpZ2h0V2l0aG91dFJvd3MgPVxuICAgICAgICBpbnB1dC5sZW5ndGggKiB0aGlzLlNFQ1RJT05fUEFERElORy5CRVRXRUVOX1JPVyArXG4gICAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX1RPUF9CT1RUT00gKiAyICtcbiAgICAgICAgdGhpcy5TRUNUSU9OX0hFSUdIVFMuWF9BWElTX0xBQkVMO1xuXG4gICAgICAvLyBUaGUgY29tYmluZWQgaGVpZ2h0IG9mIGFsbCByb3dzIGF0IHRoZWlyIG1pbi9tYXhcbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9XG4gICAgICAgIGlucHV0Lmxlbmd0aCAqIHRoaXMuUkVDVEFOR0xFX0hFSUdIVFMuTUlOX0hFSUdIVCArIGhlaWdodFdpdGhvdXRSb3dzO1xuICAgICAgY29uc3QgbWF4SGVpZ2h0ID1cbiAgICAgICAgaW5wdXQubGVuZ3RoICogdGhpcy5SRUNUQU5HTEVfSEVJR0hUUy5NQVhfSEVJR0hUICsgaGVpZ2h0V2l0aG91dFJvd3M7XG5cbiAgICAgIC8vIElmIHRoZSBtYXgtc2l6ZWQgcm93cyBkb24ndCBuZWVkIHRoZSB0YXJnZXQgc2l6ZSwgc2hyaW5rIHRoZSBjaGFydFxuICAgICAgaWYgKG1heEhlaWdodCA8IHRoaXMuVEFSR0VUX0hFSUdIVClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjaGFydEhlaWdodDogbWF4SGVpZ2h0LFxuICAgICAgICAgIHJvd0hlaWdodDogdGhpcy5SRUNUQU5HTEVfSEVJR0hUUy5NQVhfSEVJR0hULFxuICAgICAgICB9O1xuICAgICAgLy8gSWYgdGhlIG1pbi1zaXplZCByb3dzIG5lZWQgbW9yZSB0aGFuIHRoZSB0YXJnZXQgc2l6ZSwgZ3JvdyB0aGUgY2hhcnRcbiAgICAgIGlmIChtaW5IZWlnaHQgPiB0aGlzLlRBUkdFVF9IRUlHSFQpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2hhcnRIZWlnaHQ6IG1pbkhlaWdodCxcbiAgICAgICAgICByb3dIZWlnaHQ6IHRoaXMuUkVDVEFOR0xFX0hFSUdIVFMuTUlOX0hFSUdIVCxcbiAgICAgICAgfTtcbiAgICAgIC8vIE90aGVyd2lzZSBzaHJpbmsgdGhlIHJvd3MgdG8gZml0IHRoZSB0YXJnZXQgc2l6ZVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hhcnRIZWlnaHQ6IHRoaXMuVEFSR0VUX0hFSUdIVCxcbiAgICAgICAgcm93SGVpZ2h0OiAodGhpcy5UQVJHRVRfSEVJR0hUIC0gaGVpZ2h0V2l0aG91dFJvd3MpIC8gaW5wdXQubGVuZ3RoLFxuICAgICAgfTtcbiAgICB9KSxcbiAgKTtcblxuICAvKlxuICAgIFRoZSBsYXlvdXQgd2UgYXJlIHNob290aW5nIGZvciBpczpcblxuICAgICAgICAgICAgICB8ICAgWCBBeGlzIExhYmVscyAgfFxuICAgIFJvdyBOYW1lICB8ICAgUmVjdGFuZ2xlcyAgICAgfCAgIFRvdGFsc1xuICAqL1xuICByZWFkb25seSBUQVJHRVRfSEVJR0hUID0gMzAwO1xuXG4gIHJlYWRvbmx5IFJFQ1RBTkdMRV9IRUlHSFRTID0ge1xuICAgIE1JTl9IRUlHSFQ6IDEyLCAvLyBTZXRzIHRoZSBzbWFsbGVzdCBzaXplIGEgcm93IGNhbiBzaHJpbmsgdG9cbiAgICBNQVhfSEVJR0hUOiA0MiwgLy8gU2V0cyB0aGUgbGFyZ2VzdCBzaXplIGEgcm93IGNhbiBleHBhbmQgdG9cbiAgfTtcblxuICByZWFkb25seSBMQUJFTF9IRUlHSFQgPSA4O1xuXG4gIHJlYWRvbmx5IFNFQ1RJT05fSEVJR0hUUyA9IHtcbiAgICAvLyBTcGFjZSByZXNlcnZlZCBmb3IgdGhlIHgtYXhpcyBsYWJlbHNcbiAgICBYX0FYSVNfTEFCRUw6IDE0LFxuICB9O1xuXG4gIHJlYWRvbmx5IFNFQ1RJT05fV0lEVEhTID0ge1xuICAgIC8vIFNwYWNlIHJlc2VydmVkIGZvciB0aGUgbmFtZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHJvd1xuICAgIFJPV19OQU1FOiAxMDAsXG4gICAgLy8gU3BhY2UgcmVzZXJ2ZWQgZm9yIHRoZSB0b3RhbHMgYXQgdGhlIGVuZCBvZiB0aGUgcm93XG4gICAgUk9XX1RPVEFMX0xBQkVMOiA3MixcbiAgfTtcblxuICByZWFkb25seSBTRUNUSU9OX1BBRERJTkcgPSB7XG4gICAgLy8gUGFkZGluZyBiZXR3ZWVuIGVhY2ggZWRnZSBvZiB0aGUgdmlld2JveCBhbmQgdGhlIGNvbnRlbnRcbiAgICBPVVRFUl9UT1BfQk9UVE9NOiA0LFxuICAgIE9VVEVSX0xFRlRfUklHSFQ6IDQsXG4gICAgLy8gUGFkZGluZyBiZXR3ZWVuIHRoZSBib3R0b20gb2Ygb25lIHJvdyBhbmQgdGhlIHRvcCBvZiB0aGUgbmV4dCByb3dcbiAgICBCRVRXRUVOX1JPVzogNCxcbiAgICAvLyBTcGFjZSBiZXR3ZWVuIHRoZSByb3cgYW5kIHRoZSB0b3Agb2YgYSByZWN0YW5nbGUgaW4gdGhhdCByb3dcbiAgICBSRUNUQU5HTEVfVE9fUk9XOiA2LFxuICB9O1xuXG4gIC8vIFRoZSBudW1iZXIgb2YgWC1heGlzIHNlZ21lbnRzIHRvIGNyZWF0ZSwgd2l0aCBsYWJlbHMgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggc2VnbWVudC5cbiAgcmVhZG9ubHkgWF9USUNLX0NPVU5UX01BWCA9IDg7XG4gIHJlYWRvbmx5IFhfVElDS19DT1VOVF9NSU4gPSAzO1xuICByZWFkb25seSBYX1RJQ0tfTUFYX1dJRFRIID0gOTAwO1xuICByZWFkb25seSBYX1RJQ0tfTUlOX1dJRFRIID0gNDAwO1xuXG4gIC8vIFplcm8gb24gdGhlIFggYXhpcyBpcyBhZnRlciB0aGUgbGVmdCBwYWRkaW5nIGFuZCB0aGUgcm93IG5hbWUuXG4gIGxvY2F0aW9uT2ZYQXhpc1plcm8oKSB7XG4gICAgcmV0dXJuIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX0xFRlRfUklHSFQgKyB0aGlzLlNFQ1RJT05fV0lEVEhTLlJPV19OQU1FO1xuICB9XG4gIC8vIFRoZSBlbmQgb2YgdGhlIFggYXhpcyBpcyByaWdodCBiZWZvcmUgdGhlIHJvdyB0b3RhbCBhbmQgdGhlIHJpZ2h0IHBhZGRpbmcuXG4gIGxvY2F0aW9uT2ZYQXhpc0VuZCh3aWR0aDogbnVtYmVyKSB7XG4gICAgY29uc3Qgc3BhY2VPblJpZ2h0OiBudW1iZXIgPVxuICAgICAgdGhpcy5TRUNUSU9OX1dJRFRIUy5ST1dfVE9UQUxfTEFCRUwgK1xuICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfTEVGVF9SSUdIVDtcbiAgICByZXR1cm4gd2lkdGggLSBzcGFjZU9uUmlnaHQ7XG4gIH1cbiAgLy8gVGhlIHktaW5kZXggb2YgdGhlIHgtYXhpcyB0aWNrc1xuICBsb2NhdGlvbk9mWEF4aXNUaWNrKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9UT1BfQk9UVE9NICsgdGhpcy5TRUNUSU9OX0hFSUdIVFMuWF9BWElTX0xBQkVMXG4gICAgKTtcbiAgfVxuICAvLyBUaGUgeS1pbmRleCBvZiB0aGUgdG9wIG9mIHRoZSBjdXJyZW50IHJvd1xuICBnZXRUb3BPZlJvdyhyb3dJbmRleDogbnVtYmVyLCByb3dIZWlnaHQ6IG51bWJlcikge1xuICAgIGNvbnN0IHNwYWNlQWJvdmVSb3dzOiBudW1iZXIgPVxuICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfVE9QX0JPVFRPTSArIHRoaXMuU0VDVElPTl9IRUlHSFRTLlhfQVhJU19MQUJFTDtcblxuICAgIGNvbnN0IGFib3ZlUm93czogbnVtYmVyID0gcm93SW5kZXggKiByb3dIZWlnaHQ7XG4gICAgY29uc3QgYWJvdmVSb3dQYWRkaW5nczogbnVtYmVyID1cbiAgICAgIHJvd0luZGV4ICogdGhpcy5TRUNUSU9OX1BBRERJTkcuQkVUV0VFTl9ST1c7XG4gICAgY29uc3QgYWxsQWJvdmVSb3dzOiBudW1iZXIgPSBhYm92ZVJvd3MgKyBhYm92ZVJvd1BhZGRpbmdzO1xuXG4gICAgcmV0dXJuIHNwYWNlQWJvdmVSb3dzICsgYWxsQWJvdmVSb3dzO1xuICB9XG5cbiAgLy8gQ2FsY3VsYXRlIGFsbCB0aGUgdmFsdWVzIHdlIG5lZWQgZm9yIGRpc3BsYXlpbmcgdGhlIGdyYXBoIG9uIHNjcmVlbi5cbiAgZ2V0RHJhd25EYXRhKFxuICAgIHJvd1N0YWNrczogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgY2hhcnRIZWlnaHQ6IG51bWJlcixcbiAgICByb3dIZWlnaHQ6IG51bWJlcixcbiAgKSB7XG4gICAgaWYgKHJvd1N0YWNrcy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHZpZXdCb3ggPSBgMCAwICR7d2lkdGh9ICR7Y2hhcnRIZWlnaHR9YDtcblxuICAgIGNvbnN0IGtleXNJbk9yZGVyOiBJbnRlcm5TZXQ8c3RyaW5nPiA9IGdldEtleU9yZGVyKHJvd1N0YWNrcyk7XG4gICAgY29uc3Qgc3RhbmRhcmRpemVkUm93czogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdID1cbiAgICAgIHN0YW5kYXJkaXplUm93U3RhY2tzKHJvd1N0YWNrcywga2V5c0luT3JkZXIpO1xuICAgIGNvbnN0IHJvd3NGb3JEaXNwbGF5OiBSb3dEaXNwbGF5SW5mb1tdID0gc3RhbmRhcmRpemVkUm93cy5tYXAoXG4gICAgICAoc3RhY2tEYXRhLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiBnZXRSb3dEaXNwbGF5SW5mbyhzdGFja0RhdGEsIGkpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gVGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIGRvbWFpbiBzaG91bGQgYmUgdGhlIGhpZ2hlc3QgdG90YWwgdmFsdWUgZnJvbSB0aGUgcm93cy5cbiAgICBjb25zdCBkb21haW5NYXggPSBNYXRoLm1heCgwLCAuLi5yb3dzRm9yRGlzcGxheS5tYXAocm93ID0+IHJvdy5yb3dUb3RhbCkpO1xuICAgIGNvbnN0IHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPiA9IHNjYWxlTGluZWFyKClcbiAgICAgIC5kb21haW4oWzAsIGRvbWFpbk1heF0pXG4gICAgICAucmFuZ2UoW3RoaXMubG9jYXRpb25PZlhBeGlzWmVybygpLCB0aGlzLmxvY2F0aW9uT2ZYQXhpc0VuZCh3aWR0aCldKTtcblxuICAgIC8vIFNldHVwIGEgbGluZWFyIHNjYWxlIGZvciB0aWNrIGNvdW50IGJhc2VkIG9uIHdpZHRoXG4gICAgY29uc3QgdGlja1NjYWxlID0gc2NhbGVMaW5lYXIoKVxuICAgICAgLmRvbWFpbihbdGhpcy5YX1RJQ0tfTUlOX1dJRFRILCB0aGlzLlhfVElDS19NQVhfV0lEVEhdKVxuICAgICAgLnJhbmdlKFt0aGlzLlhfVElDS19DT1VOVF9NSU4sIHRoaXMuWF9USUNLX0NPVU5UX01BWF0pXG4gICAgICAuY2xhbXAodHJ1ZSk7IC8vIEVuc3VyZXMgdGhlIHNjYWxlIGRvZXMgbm90IGdvIGJleW9uZCB0aGUgZGVmaW5lZCByYW5nZVxuXG4gICAgY29uc3QgeHRpY2tDb3VudEFkanVzdGVkID0gTWF0aC5yb3VuZCh0aWNrU2NhbGUod2lkdGgpKTtcbiAgICBjb25zdCB4VGlja3MgPSB4U2NhbGUudGlja3MoeHRpY2tDb3VudEFkanVzdGVkKTtcblxuICAgIGNvbnN0IHJlY3RzOiBSb3dSZWN0YW5nbGVbXSA9IHRoaXMuY3JlYXRlUmVjdGFuZ2xlc0Zyb21Sb3dzKFxuICAgICAgcm93c0ZvckRpc3BsYXksXG4gICAgICB4U2NhbGUsXG4gICAgICByb3dIZWlnaHQsXG4gICAgKTtcblxuICAgIGNvbnN0IHJvd05hbWVzVG9EcmF3OiBSb3dMYWJlbFtdID0gdGhpcy5nZXRSb3dOYW1lc1RvRHJhdyhcbiAgICAgIHJvd3NGb3JEaXNwbGF5LFxuICAgICAgcm93SGVpZ2h0LFxuICAgICk7XG4gICAgY29uc3Qgcm93VG90YWxzVG9EcmF3OiBSb3dMYWJlbFtdID0gdGhpcy5nZXRSb3dUb3RhbHNUb0RyYXcoXG4gICAgICByb3dzRm9yRGlzcGxheSxcbiAgICAgIHdpZHRoLFxuICAgICAgcm93SGVpZ2h0LFxuICAgICk7XG5cbiAgICBjb25zdCBsZWdlbmRJdGVtcyA9IGdldExlZ2VuZEl0ZW1zKHJvd3NGb3JEaXNwbGF5LCBrZXlzSW5PcmRlcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGVnZW5kSXRlbXM6IGxlZ2VuZEl0ZW1zLFxuICAgICAgcm93SGVpZ2h0OiByb3dIZWlnaHQsXG4gICAgICByZWN0czogcmVjdHMsXG4gICAgICByb3dOYW1lczogcm93TmFtZXNUb0RyYXcsXG4gICAgICByb3dUb3RhbHM6IHJvd1RvdGFsc1RvRHJhdyxcbiAgICAgIHZpZXdCb3g6IHZpZXdCb3gsXG4gICAgICB4U2NhbGU6IHhTY2FsZSxcbiAgICAgIHhUaWNrczogeFRpY2tzLFxuICAgIH07XG4gIH1cblxuICAvLyBHZXQgZGF0YSBmb3IgYWxsIHRoZSByZWN0YW5nbGVzIGZvciBhbGwgdGhlIHJvd3NcbiAgY3JlYXRlUmVjdGFuZ2xlc0Zyb21Sb3dzKFxuICAgIGRpc3BsYXlSb3dzOiBSb3dEaXNwbGF5SW5mb1tdLFxuICAgIHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPixcbiAgICByb3dIZWlnaHQ6IG51bWJlcixcbiAgKTogUm93UmVjdGFuZ2xlW10ge1xuICAgIGNvbnN0IHJlY3RhbmdsZXM6IFJvd1JlY3RhbmdsZVtdID0gW107XG4gICAgZGlzcGxheVJvd3MuZm9yRWFjaCgoY3VycmVudFJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgIGN1cnJlbnRSb3cuZWxlbWVudHNCdXRTdGFja2VkLmZvckVhY2goKGN1cnJlbnRFbGVtZW50LCBfKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvcE9mUm93OiBudW1iZXIgPSB0aGlzLmdldFRvcE9mUm93KHJvd0luZGV4LCByb3dIZWlnaHQpO1xuXG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZVdpZHRoOiBudW1iZXIgPVxuICAgICAgICAgIHhTY2FsZShjdXJyZW50RWxlbWVudC50b3BsaW5lKSAtIHhTY2FsZShjdXJyZW50RWxlbWVudC5iYXNlbGluZSk7XG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZUhlaWdodDogbnVtYmVyID0gcm93SGVpZ2h0O1xuXG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZVg6IG51bWJlciA9IHhTY2FsZShjdXJyZW50RWxlbWVudC5iYXNlbGluZSk7XG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZVk6IG51bWJlciA9XG4gICAgICAgICAgdG9wT2ZSb3cgKyB0aGlzLlNFQ1RJT05fUEFERElORy5SRUNUQU5HTEVfVE9fUk9XO1xuXG4gICAgICAgIGNvbnN0IGZpbGwgPSBgdmFyKCR7Y3VycmVudEVsZW1lbnQuY29sb3JUb2tlbn0pYDtcblxuICAgICAgICByZWN0YW5nbGVzLnB1c2goe1xuICAgICAgICAgIHg6IHJlY3RhbmdsZVgsXG4gICAgICAgICAgeTogcmVjdGFuZ2xlWSxcbiAgICAgICAgICB3aWR0aDogTWF0aC5tYXgocmVjdGFuZ2xlV2lkdGgsIDApLFxuICAgICAgICAgIGhlaWdodDogcmVjdGFuZ2xlSGVpZ2h0LFxuICAgICAgICAgIGZpbGw6IGZpbGwsXG4gICAgICAgICAgc3RyaXBlZDogY3VycmVudEVsZW1lbnQuc3R5bGUgPT09ICdzdHJpcGVkJyxcbiAgICAgICAgICByb3dOYW1lOiBjdXJyZW50Um93LnJvd05hbWUsXG4gICAgICAgICAgc3RhY2tlZFJvd0VsZW1lbnQ6IGN1cnJlbnRFbGVtZW50LFxuICAgICAgICAgIHN0YWNrSW5kZXg6IGN1cnJlbnRSb3cuc3RhY2tJbmRleCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVjdGFuZ2xlcztcbiAgfVxuXG4gIC8vIEdldCBkYXRhIG9uIHRoZSByb3cgbmFtZXMgd2UgYXJlIGRyYXdpbmdcbiAgZ2V0Um93TmFtZXNUb0RyYXcoXG4gICAgZGlzcGxheVJvd3M6IFJvd0Rpc3BsYXlJbmZvW10sXG4gICAgcm93SGVpZ2h0OiBudW1iZXIsXG4gICk6IFJvd0xhYmVsW10ge1xuICAgIHJldHVybiBkaXNwbGF5Um93cy5tYXAoKHJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHJvd0xhYmVsWCA9IHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX0xFRlRfUklHSFQ7XG4gICAgICAvLyBUaGUgcm93IG5hbWUgbG9va3MgcmlnaHQgaWYgaXRzIGJhc2UgaXMgYXQgdGhlIGJhc2Ugb2YgdGhlIGFzc29jaWF0ZWQgcmVjdGFuZ2xlXG4gICAgICBjb25zdCByb3dMYWJlbFkgPVxuICAgICAgICB0aGlzLmdldFRvcE9mUm93KHJvd0luZGV4LCByb3dIZWlnaHQpICtcbiAgICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuUkVDVEFOR0xFX1RPX1JPVyArXG4gICAgICAgIHRoaXMuTEFCRUxfSEVJR0hUIC8gMiArXG4gICAgICAgIHJvd0hlaWdodCAvIDI7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhYmVsOiByb3cucm93TmFtZSxcbiAgICAgICAgeDogcm93TGFiZWxYLFxuICAgICAgICB5OiByb3dMYWJlbFksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8gR2V0IGRhdGEgb24gdGhlIHJvdyB0b3RhbHMgd2UgYXJlIGRyYXdpbmdcbiAgZ2V0Um93VG90YWxzVG9EcmF3KFxuICAgIGRpc3BsYXlSb3dzOiBSb3dEaXNwbGF5SW5mb1tdLFxuICAgIHdpZHRoOiBudW1iZXIsXG4gICAgcm93SGVpZ2h0OiBudW1iZXIsXG4gICk6IFJvd0xhYmVsW10ge1xuICAgIHJldHVybiBkaXNwbGF5Um93cy5tYXAoKHJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHJvd0xhYmVsWCA9IHdpZHRoIC0gdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfTEVGVF9SSUdIVDtcbiAgICAgIC8vIFRoZSByb3cgdG90YWxzIGxvb2tzIHJpZ2h0IGlmIGl0cyBiYXNlIGlzIGF0IHRoZSBiYXNlIG9mIHRoZSBhc3NvY2lhdGVkIHJlY3RhbmdsZVxuICAgICAgY29uc3Qgcm93TGFiZWxZID1cbiAgICAgICAgdGhpcy5nZXRUb3BPZlJvdyhyb3dJbmRleCwgcm93SGVpZ2h0KSArXG4gICAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLlJFQ1RBTkdMRV9UT19ST1cgK1xuICAgICAgICB0aGlzLkxBQkVMX0hFSUdIVCAvIDIgK1xuICAgICAgICByb3dIZWlnaHQgLyAyO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogdGhpcy52YWx1ZUZvcm1hdHRlcihyb3cucm93VG90YWwpLFxuICAgICAgICB4OiByb3dMYWJlbFgsXG4gICAgICAgIHk6IHJvd0xhYmVsWSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICByZWFkb25seSBkcmF3RGF0YSQ6IE9ic2VydmFibGU8U3RhY2tlZFJvd0RyYXdEYXRhIHwgbnVsbD4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmlucHV0JCxcbiAgICB0aGlzLndpZHRoJCxcbiAgICB0aGlzLmNoYXJ0QW5kUm93SGVpZ2h0cyQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW5wdXQsIHdpZHRoLCBoZWlnaHRdKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5nZXREcmF3bkRhdGEoXG4gICAgICAgIGlucHV0LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LmNoYXJ0SGVpZ2h0LFxuICAgICAgICBoZWlnaHQucm93SGVpZ2h0LFxuICAgICAgKTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIC8vIExldHMgdXMga25vdyB3aGV0aGVyIHRvIGRpc3BsYXkgdGhlIHplcm8gZGF0YSBzdGF0ZVxuICByZWFkb25seSBlbXB0eSQgPSB0aGlzLmlucHV0JC5waXBlKFxuICAgIG1hcChpbnB1dCA9PiBpbnB1dC5ldmVyeShzdGFjayA9PiBzdGFjay5kYXRhLmxlbmd0aCA9PT0gMCkpLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgLy8gV2hhdCByZWN0YW5nbGUgd2UgYXJlIGN1cnJlbnRseSBob3ZlcmluZyBvdmVyXG4gIHJlYWRvbmx5IGhvdmVyZWRSZWN0YW5nbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgcmVjdGFuZ2xlOiBSb3dSZWN0YW5nbGU7XG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQ7XG4gIH0gfCBudWxsPihudWxsKTtcblxuICAvLyBXaGF0IGJhbmQgd2UgYXJlIGN1cnJlbnRseSBob3ZlcmluZyBvdmVyXG4gIHJlYWRvbmx5IGhvdmVyZWRCYW5kJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIHJvd05hbWU6IHN0cmluZztcbiAgICBldmVudDogTW91c2VFdmVudDtcbiAgfSB8IG51bGw+KG51bGwpO1xuXG4gIC8vIENyZWF0ZSB0aGUgbWV0cmljIHRvIGRpc3BsYXkgYmFzZWQgb24gdGhlIGN1cnJlbnRseSBob3ZlcmVkIHJlY3RhbmdsZVxuICByZWFkb25seSBjYWxsb3V0JCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuaG92ZXJlZEJhbmQkLCB0aGlzLmRyYXdEYXRhJF0pLnBpcGUoXG4gICAgbWFwKChbaG92ZXJlZEJhbmQsIGRyYXdEYXRhXSkgPT4ge1xuICAgICAgaWYgKCFob3ZlcmVkQmFuZCB8fCAhZHJhd0RhdGEpIHJldHVybiBudWxsO1xuXG4gICAgICBjb25zdCB7IHRhcmdldCB9ID0gaG92ZXJlZEJhbmQuZXZlbnQ7XG4gICAgICBpZiAoIXRhcmdldCkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBhbmNob3IgPSAoPFNWR1JlY3RFbGVtZW50PnRhcmdldCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIHR5cGUgTWV0cmljID0geyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nOyBjb2xvclRva2VuOiBzdHJpbmcgfTtcbiAgICAgIGNvbnN0IG1ldHJpY3M6IE1ldHJpY1tdID0gZHJhd0RhdGEucmVjdHNcbiAgICAgICAgLmZpbHRlcihyZWN0ID0+IHJlY3Qucm93TmFtZSA9PT0gaG92ZXJlZEJhbmQucm93TmFtZSlcbiAgICAgICAgLm1hcChyZWN0ID0+ICh7XG4gICAgICAgICAgcmVjdCxcbiAgICAgICAgICBsYWJlbDogcmVjdC5zdGFja2VkUm93RWxlbWVudC5sYWJlbCxcbiAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZUZvcm1hdHRlcihyZWN0LnN0YWNrZWRSb3dFbGVtZW50LnZhbHVlKSxcbiAgICAgICAgICBjb2xvclRva2VuOiByZWN0LnN0YWNrZWRSb3dFbGVtZW50LmNvbG9yVG9rZW4sXG4gICAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIHsgYW5jaG9yLCBtZXRyaWNzIH07XG4gICAgfSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBTdGFja2VkUm93Q29tcG9uZW50IHtcbiAgLy8gQSBzcGVjaWZpY2FsbHkgY29sb3JlZCBzZWN0aW9uIG9mIG9uZSByb3cuXG4gIGV4cG9ydCB0eXBlIFJvd0VsZW1lbnQgPSB7XG4gICAgbGFiZWw6IHN0cmluZzsgLy8gTGVnZW5kIGVsZW1lbnQgbmFtZVxuICAgIHZhbHVlOiBudW1iZXI7XG4gICAgY29sb3JUb2tlbjogc3RyaW5nO1xuICAgIHN0eWxlPzogTGVnZW5kSXRlbUNvbXBvbmVudC5TdHlsZTtcbiAgfTtcbiAgLy8gVGhlIGlucHV0IHRoYXQgZGV0ZXJtaW5lcyBvbmUgcm93LlxuICBleHBvcnQgdHlwZSBSb3dTdGFjayA9IHtcbiAgICByb3dOYW1lOiBzdHJpbmc7XG4gICAgZGF0YTogUm93RWxlbWVudFtdO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFN0YWNrQ2xpY2tlZCA9IHtcbiAgICBzdGFja0luZGV4OiBudW1iZXI7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgQ2FsbG91dENvbnRleHQgPSB7XG4gICAgYW5jaG9yOiBET01SZWN0O1xuICAgIG1ldHJpY3M6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgY29sb3JUb2tlbjogc3RyaW5nIH1bXTtcbiAgfTtcbn1cbiIsIjxkaXZcbiAgKm5nSWY9XCIoZW1wdHkkIHwgYXN5bmMpID09PSBmYWxzZTsgZWxzZSB6ZXJvU3RhdGVcIlxuICBjbGFzcz1cImNvbnRhaW5lclwiXG4gIChyaXZDbGllbnRTaXplKT1cIndpZHRoID0gJGV2ZW50LndpZHRoXCJcbj5cbiAgPHN2Z1xuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICpuZ0lmPVwiZHJhd0RhdGEkIHwgYXN5bmM7IGxldCBkcmF3XCJcbiAgICBbYXR0ci52aWV3Qm94XT1cImRyYXcudmlld0JveFwiXG4gID5cbiAgICA8ZGVmcz5cbiAgICAgIDxwYXR0ZXJuXG4gICAgICAgIGlkPVwic3RyaXBlc1wiXG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgeT1cIjBcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJkcmF3LnJvd0hlaWdodFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJkcmF3LnJvd0hlaWdodFwiXG4gICAgICAgIHBhdHRlcm5Vbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcbiAgICAgID5cbiAgICAgICAgPGxpbmVcbiAgICAgICAgICBbYXR0ci54MV09XCIwXCJcbiAgICAgICAgICBbYXR0ci55MV09XCIwXCJcbiAgICAgICAgICBbYXR0ci54Ml09XCJkcmF3LnJvd0hlaWdodFwiXG4gICAgICAgICAgW2F0dHIueTJdPVwiZHJhdy5yb3dIZWlnaHRcIlxuICAgICAgICAgIHN0cm9rZT1cInZhcigtLXdoaXRlLTEwMClcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICA+PC9saW5lPlxuICAgICAgPC9wYXR0ZXJuPlxuICAgIDwvZGVmcz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgcm93TmFtZVRvRHJhdyBvZiBkcmF3LnJvd05hbWVzXCI+XG4gICAgICA8dGV4dFxuICAgICAgICByaXZTVkdUZXh0VHJ1bmNhdGVcbiAgICAgICAgW3RleHRdPVwicm93TmFtZVRvRHJhdy5sYWJlbFwiXG4gICAgICAgIFt3aWR0aF09XCJTRUNUSU9OX1dJRFRIUy5ST1dfTkFNRVwiXG4gICAgICAgIGNsYXNzPVwicm93LXRpdGxlXCJcbiAgICAgICAgW2F0dHIueF09XCJyb3dOYW1lVG9EcmF3LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJvd05hbWVUb0RyYXcueVwiXG4gICAgICA+PC90ZXh0PlxuICAgIDwvZz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkcmF3LnhUaWNrc1wiPlxuICAgICAgPHJlY3RcbiAgICAgICAgY2xhc3M9XCJ0aWNrXCJcbiAgICAgICAgW2F0dHIueF09XCJkcmF3LnhTY2FsZSh0aWNrKVwiXG4gICAgICAgIHk9XCIwXCJcbiAgICAgICAgd2lkdGg9XCIxXCJcbiAgICAgICAgaGVpZ2h0PVwiMTAwJVwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJkcmF3LnhTY2FsZSh0aWNrKVwiXG4gICAgICAgIFthdHRyLnldPVwibG9jYXRpb25PZlhBeGlzVGljaygpXCJcbiAgICAgICAgZHg9XCI0XCJcbiAgICAgICAgZHk9XCItNFwiXG4gICAgICA+XG4gICAgICAgIHt7IHZhbHVlRm9ybWF0dGVyKHRpY2spIH19XG4gICAgICA8L3RleHQ+XG4gICAgPC9nPlxuICAgIDxnXG4gICAgICAqbmdGb3I9XCJsZXQgcmVjdCBvZiBkcmF3LnJlY3RzXCJcbiAgICAgIChtb3VzZWVudGVyKT1cImhvdmVyZWRCYW5kJC5uZXh0KHsgcm93TmFtZTogcmVjdC5yb3dOYW1lLCBldmVudDogJGV2ZW50IH0pXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cImhvdmVyZWRCYW5kJC5uZXh0KG51bGwpXCJcbiAgICAgIChjbGljayk9XCJcbiAgICAgICAgc3RhY2tDbGlja2VkLmVtaXQoeyBzdGFja0luZGV4OiByZWN0LnN0YWNrSW5kZXggfSk7XG4gICAgICAgIGhvdmVyZWRCYW5kJC5uZXh0KG51bGwpXG4gICAgICBcIlxuICAgID5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwicm93XCJcbiAgICAgICAgW2F0dHIueF09XCJyZWN0LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwicmVjdC5oZWlnaHRcIlxuICAgICAgICBbYXR0ci5maWxsXT1cInJlY3QuZmlsbFwiXG4gICAgICAgIFtjbGFzcy5ibHVycmVkXT1cIlxuICAgICAgICAgIChob3ZlcmVkQmFuZCQgfCBhc3luYykgIT09IG51bGwgJiZcbiAgICAgICAgICAoaG92ZXJlZEJhbmQkIHwgYXN5bmMpPy5yb3dOYW1lICE9PSByZWN0LnJvd05hbWVcbiAgICAgICAgXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8cmVjdFxuICAgICAgICAqbmdJZj1cInJlY3Quc3RyaXBlZFwiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgZmlsbD1cInVybCgjc3RyaXBlcylcIlxuICAgICAgPjwvcmVjdD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHJvd1RvdGFsVG9EcmF3IG9mIGRyYXcucm93VG90YWxzXCI+XG4gICAgICA8dGV4dFxuICAgICAgICBjbGFzcz1cInJvdy10b3RhbFwiXG4gICAgICAgIFthdHRyLnhdPVwicm93VG90YWxUb0RyYXcueFwiXG4gICAgICAgIFthdHRyLnldPVwicm93VG90YWxUb0RyYXcueVwiXG4gICAgICAgIHRleHQtYW5jaG9yPVwiZW5kXCJcbiAgICAgID5cbiAgICAgICAge3sgcm93VG90YWxUb0RyYXcubGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gIDwvc3ZnPlxuICA8bGVnZW5kICpuZ0lmPVwiZHJhd0RhdGEkIHwgYXN5bmM7IGxldCBkcmF3XCI+XG4gICAgPHJpdi1sZWdlbmQtaXRlbVxuICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZHJhdy5sZWdlbmRJdGVtc1wiXG4gICAgICBbbGFiZWxdPVwiaXRlbS5sYWJlbFwiXG4gICAgICBbY29sb3JUb2tlbl09XCJpdGVtLmNvbG9yVG9rZW5cIlxuICAgICAgW3N0eWxlXT1cIml0ZW0uc3R5bGUgPyBpdGVtLnN0eWxlIDogJ3NvbGlkJ1wiXG4gICAgPjwvcml2LWxlZ2VuZC1pdGVtPlxuICA8L2xlZ2VuZD5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY2FsbG91dCQgfCBhc3luYzsgbGV0IGNhbGxvdXRcIj5cbiAgPHJpdi1jYWxsb3V0XG4gICAgKnJpdi1vdmVybGF5XG4gICAgW2FuY2hvcl09XCJjYWxsb3V0Py5hbmNob3IgPz8gbnVsbFwiXG4gICAgW2lzTW9kYWxdPVwiZmFsc2VcIlxuICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCInYm90dG9tLWNlbnRlcidcIlxuICAgIFthbGxvd2VkUG9zaXRpb25zXT1cIltcbiAgICAgICdjZW50ZXItcmlnaHQnLFxuICAgICAgJ2NlbnRlci1sZWZ0JyxcbiAgICAgICd0b3AtY2VudGVyJyxcbiAgICAgICdib3R0b20tY2VudGVyJ1xuICAgIF1cIlxuICAgIFt0aGVtZV09XCInbGlnaHQnXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LWNvbnRlbnRcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2FsbG91dEhlYWRlclRlbXBsYXRlXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjYWxsb3V0IH1cIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbWV0cmljIG9mIGNhbGxvdXQ/Lm1ldHJpY3NcIiBjbGFzcz1cImNhbGxvdXQtcm93XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2VyaWVzLWxhYmVsXCI+XG4gICAgICAgICAgPHJpdi1sZWdlbmQtaXRlbSBbY29sb3JUb2tlbl09XCJtZXRyaWMuY29sb3JUb2tlblwiPjwvcml2LWxlZ2VuZC1pdGVtPlxuICAgICAgICAgIDxzcGFuPnt7IG1ldHJpYy5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyBtZXRyaWMudmFsdWUgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9yaXYtY2FsbG91dD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI3plcm9TdGF0ZT5cbiAgPHJpdi16ZXJvLXN0YXRlIFttZXNzYWdlXT1cInplcm9TdGF0ZU1lc3NhZ2VcIj48L3Jpdi16ZXJvLXN0YXRlPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { union } from 'd3-array';
|
|
2
|
+
// Get a ordered+unique list of keys from the row elements
|
|
3
|
+
export function getKeyOrder(rowStacks) {
|
|
4
|
+
const allRowElements = [];
|
|
5
|
+
for (const rowStack of rowStacks) {
|
|
6
|
+
allRowElements.push(...rowStack.data);
|
|
7
|
+
}
|
|
8
|
+
const orderedKeys = union([
|
|
9
|
+
...allRowElements.map(rowElement => rowElement.label),
|
|
10
|
+
]);
|
|
11
|
+
return orderedKeys;
|
|
12
|
+
}
|
|
13
|
+
// Get a list of the legend items we should show
|
|
14
|
+
export function getLegendItems(rowsForDisplay, keysInOrder) {
|
|
15
|
+
const legendItemArray = [];
|
|
16
|
+
for (const rowForDisplay of rowsForDisplay) {
|
|
17
|
+
for (const key of keysInOrder) {
|
|
18
|
+
const elementMatchingKey = rowForDisplay.elementsButStacked.find(element => element.label == key);
|
|
19
|
+
if (elementMatchingKey &&
|
|
20
|
+
elementMatchingKey.value > 0 &&
|
|
21
|
+
!legendItemArray.find(item => item.label == key)) {
|
|
22
|
+
legendItemArray.push({
|
|
23
|
+
label: elementMatchingKey.label,
|
|
24
|
+
colorToken: elementMatchingKey.colorToken,
|
|
25
|
+
style: elementMatchingKey.style,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return legendItemArray;
|
|
31
|
+
}
|
|
32
|
+
// Make sure we have input in a standard format.
|
|
33
|
+
export function standardizeRowStacks(rowStacks, keysInOrder) {
|
|
34
|
+
const standardizedRows = [];
|
|
35
|
+
for (const rowStack of rowStacks) {
|
|
36
|
+
const standardizedData = [];
|
|
37
|
+
for (const key of keysInOrder) {
|
|
38
|
+
const elementMatchingKey = rowStack.data.find(element => element.label == key);
|
|
39
|
+
if (elementMatchingKey) {
|
|
40
|
+
standardizedData.push({
|
|
41
|
+
...elementMatchingKey,
|
|
42
|
+
value: Math.abs(elementMatchingKey.value),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
standardizedRows.push({
|
|
47
|
+
rowName: rowStack.rowName,
|
|
48
|
+
data: standardizedData,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return standardizedRows;
|
|
52
|
+
}
|
|
53
|
+
// Stacks the elements and creates the baselines and toplines
|
|
54
|
+
export function getRowDisplayInfo(rowStack, index) {
|
|
55
|
+
const elementsButStacked = [];
|
|
56
|
+
let currentBaseline = 0;
|
|
57
|
+
let currentTopline = 0;
|
|
58
|
+
for (const currentElement of rowStack.data) {
|
|
59
|
+
currentTopline += currentElement.value ?? 0;
|
|
60
|
+
elementsButStacked.push({
|
|
61
|
+
...currentElement,
|
|
62
|
+
baseline: currentBaseline,
|
|
63
|
+
topline: currentTopline,
|
|
64
|
+
});
|
|
65
|
+
currentBaseline = currentTopline;
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
rowName: rowStack.rowName,
|
|
69
|
+
elementsButStacked: elementsButStacked,
|
|
70
|
+
rowTotal: currentTopline,
|
|
71
|
+
stackIndex: index,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1yb3cuaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Jpdi9zcmMvbGliL3Zpc3VhbGl6YXRpb24vc3RhY2tlZC1yb3cvc3RhY2tlZC1yb3cuaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBdUQ1QywwREFBMEQ7QUFDMUQsTUFBTSxVQUFVLFdBQVcsQ0FDekIsU0FBeUM7SUFFekMsTUFBTSxjQUFjLEdBQXFDLEVBQUUsQ0FBQztJQUM1RCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2pDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUNELE1BQU0sV0FBVyxHQUFzQixLQUFLLENBQUM7UUFDM0MsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztLQUN0RCxDQUFDLENBQUM7SUFDSCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQsZ0RBQWdEO0FBQ2hELE1BQU0sVUFBVSxjQUFjLENBQzVCLGNBQWdDLEVBQ2hDLFdBQThCO0lBTTlCLE1BQU0sZUFBZSxHQUFzQyxFQUFFLENBQUM7SUFDOUQsS0FBSyxNQUFNLGFBQWEsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUMzQyxLQUFLLE1BQU0sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQzlCLE1BQU0sa0JBQWtCLEdBQ3RCLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ3pFLElBQ0Usa0JBQWtCO2dCQUNsQixrQkFBa0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQztnQkFDNUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsRUFDaEQsQ0FBQztnQkFDRCxlQUFlLENBQUMsSUFBSSxDQUFDO29CQUNuQixLQUFLLEVBQUUsa0JBQWtCLENBQUMsS0FBSztvQkFDL0IsVUFBVSxFQUFFLGtCQUFrQixDQUFDLFVBQVU7b0JBQ3pDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxLQUFLO2lCQUNoQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDO0FBRUQsZ0RBQWdEO0FBQ2hELE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsU0FBeUMsRUFDekMsV0FBOEI7SUFFOUIsTUFBTSxnQkFBZ0IsR0FBbUMsRUFBRSxDQUFDO0lBQzVELEtBQUssTUFBTSxRQUFRLElBQUksU0FBUyxFQUFFLENBQUM7UUFDakMsTUFBTSxnQkFBZ0IsR0FBcUMsRUFBRSxDQUFDO1FBQzlELEtBQUssTUFBTSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7WUFDOUIsTUFBTSxrQkFBa0IsR0FDdEIsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDdkIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO29CQUNwQixHQUFHLGtCQUFrQjtvQkFDckIsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDO2lCQUMxQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUNELGdCQUFnQixDQUFDLElBQUksQ0FBQztZQUNwQixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87WUFDekIsSUFBSSxFQUFFLGdCQUFnQjtTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxnQkFBZ0IsQ0FBQztBQUMxQixDQUFDO0FBRUQsNkRBQTZEO0FBQzdELE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsUUFBc0MsRUFDdEMsS0FBYTtJQUViLE1BQU0sa0JBQWtCLEdBQXdCLEVBQUUsQ0FBQztJQUNuRCxJQUFJLGVBQWUsR0FBVyxDQUFDLENBQUM7SUFDaEMsSUFBSSxjQUFjLEdBQVcsQ0FBQyxDQUFDO0lBRS9CLEtBQUssTUFBTSxjQUFjLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNDLGNBQWMsSUFBSSxjQUFjLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUU1QyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7WUFDdEIsR0FBRyxjQUFjO1lBQ2pCLFFBQVEsRUFBRSxlQUFlO1lBQ3pCLE9BQU8sRUFBRSxjQUFjO1NBQ3hCLENBQUMsQ0FBQztRQUVILGVBQWUsR0FBRyxjQUFjLENBQUM7SUFDbkMsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87UUFDekIsa0JBQWtCLEVBQUUsa0JBQWtCO1FBQ3RDLFFBQVEsRUFBRSxjQUFjO1FBQ3hCLFVBQVUsRUFBRSxLQUFLO0tBQ2xCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW50ZXJuU2V0LCB1bmlvbiB9IGZyb20gJ2QzLWFycmF5JztcbmltcG9ydCB7IFNjYWxlTGluZWFyIH0gZnJvbSAnZDMtc2NhbGUnO1xuaW1wb3J0IHsgTGVnZW5kSXRlbUNvbXBvbmVudCB9IGZyb20gJy4uL2xlZ2VuZC1pdGVtL2xlZ2VuZC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdGFja2VkUm93Q29tcG9uZW50IH0gZnJvbSAnLi9zdGFja2VkLXJvdy5jb21wb25lbnQnO1xuXG4vLyBBIHJvdyBlbGVtZW50IHdpdGggYSBiYXNlbGluZSwgdG9wbGluZSwgYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBzdGFjayBpdCBiZWxvbmdzIHRvXG50eXBlIFN0YWNrZWRSb3dFbGVtZW50ID0gU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dFbGVtZW50ICYge1xuICBiYXNlbGluZTogbnVtYmVyO1xuICB0b3BsaW5lOiBudW1iZXI7XG59O1xuXG4vLyBUaGUgZGF0YSBhYm91dCBhIHJlY3RhbmdsZSB3ZSBkaXNwbGF5IG9uIHNjcmVlblxuZXhwb3J0IHR5cGUgUm93UmVjdGFuZ2xlID0ge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGZpbGw6IHN0cmluZztcbiAgc3RyaXBlZDogYm9vbGVhbjtcbiAgcm93TmFtZTogc3RyaW5nO1xuICBzdGFja2VkUm93RWxlbWVudDogU3RhY2tlZFJvd0VsZW1lbnQ7XG4gIHN0YWNrSW5kZXg6IG51bWJlcjtcbn07XG5cbi8vIFRoZSBkYXRhIGFib3V0IGEgcm93IGxhYmVsIHdlIGRpc3BsYXkgb24gc2NyZWVuXG5leHBvcnQgdHlwZSBSb3dMYWJlbCA9IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIGxhYmVsOiBzdHJpbmc7XG59O1xuXG4vLyBUaGUgZGF0YSB3ZSBhcmUgZGlzcGxheWluZyBpbiB0aGlzIGNvbXBvbmVudFxuZXhwb3J0IHR5cGUgU3RhY2tlZFJvd0RyYXdEYXRhID0ge1xuICBsZWdlbmRJdGVtczoge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgY29sb3JUb2tlbjogc3RyaW5nO1xuICAgIHN0eWxlPzogTGVnZW5kSXRlbUNvbXBvbmVudC5TdHlsZTtcbiAgfVtdO1xuICByb3dIZWlnaHQ6IG51bWJlcjtcbiAgcmVjdHM6IFJvd1JlY3RhbmdsZVtdO1xuICByb3dOYW1lczogUm93TGFiZWxbXTtcbiAgcm93VG90YWxzOiBSb3dMYWJlbFtdO1xuICB2aWV3Qm94OiBzdHJpbmc7XG4gIHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPjtcbiAgeFRpY2tzOiBudW1iZXJbXTtcbn07XG5cbi8vIEV2ZXJ5dGhpbmcgdGhhdCBkZXNjcmliZXMgYSByb3cgd2Ugd2lsbCBkaXNwbGF5XG5leHBvcnQgdHlwZSBSb3dEaXNwbGF5SW5mbyA9IHtcbiAgcm93TmFtZTogc3RyaW5nO1xuICBlbGVtZW50c0J1dFN0YWNrZWQ6IFN0YWNrZWRSb3dFbGVtZW50W107XG4gIHJvd1RvdGFsOiBudW1iZXI7XG4gIHN0YWNrSW5kZXg6IG51bWJlcjtcbn07XG5cbi8vIEdldCBhIG9yZGVyZWQrdW5pcXVlIGxpc3Qgb2Yga2V5cyBmcm9tIHRoZSByb3cgZWxlbWVudHNcbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXlPcmRlcihcbiAgcm93U3RhY2tzOiBTdGFja2VkUm93Q29tcG9uZW50LlJvd1N0YWNrW10sXG4pOiBJbnRlcm5TZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IGFsbFJvd0VsZW1lbnRzOiBTdGFja2VkUm93Q29tcG9uZW50LlJvd0VsZW1lbnRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJvd1N0YWNrIG9mIHJvd1N0YWNrcykge1xuICAgIGFsbFJvd0VsZW1lbnRzLnB1c2goLi4ucm93U3RhY2suZGF0YSk7XG4gIH1cbiAgY29uc3Qgb3JkZXJlZEtleXM6IEludGVyblNldDxzdHJpbmc+ID0gdW5pb24oW1xuICAgIC4uLmFsbFJvd0VsZW1lbnRzLm1hcChyb3dFbGVtZW50ID0+IHJvd0VsZW1lbnQubGFiZWwpLFxuICBdKTtcbiAgcmV0dXJuIG9yZGVyZWRLZXlzO1xufVxuXG4vLyBHZXQgYSBsaXN0IG9mIHRoZSBsZWdlbmQgaXRlbXMgd2Ugc2hvdWxkIHNob3dcbmV4cG9ydCBmdW5jdGlvbiBnZXRMZWdlbmRJdGVtcyhcbiAgcm93c0ZvckRpc3BsYXk6IFJvd0Rpc3BsYXlJbmZvW10sXG4gIGtleXNJbk9yZGVyOiBJbnRlcm5TZXQ8c3RyaW5nPixcbik6IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgY29sb3JUb2tlbjogc3RyaW5nO1xuICBzdHlsZT86IExlZ2VuZEl0ZW1Db21wb25lbnQuU3R5bGU7XG59W10ge1xuICBjb25zdCBsZWdlbmRJdGVtQXJyYXk6IFJldHVyblR5cGU8dHlwZW9mIGdldExlZ2VuZEl0ZW1zPiA9IFtdO1xuICBmb3IgKGNvbnN0IHJvd0ZvckRpc3BsYXkgb2Ygcm93c0ZvckRpc3BsYXkpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzSW5PcmRlcikge1xuICAgICAgY29uc3QgZWxlbWVudE1hdGNoaW5nS2V5OiBTdGFja2VkUm93RWxlbWVudCB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHJvd0ZvckRpc3BsYXkuZWxlbWVudHNCdXRTdGFja2VkLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50LmxhYmVsID09IGtleSk7XG4gICAgICBpZiAoXG4gICAgICAgIGVsZW1lbnRNYXRjaGluZ0tleSAmJlxuICAgICAgICBlbGVtZW50TWF0Y2hpbmdLZXkudmFsdWUgPiAwICYmXG4gICAgICAgICFsZWdlbmRJdGVtQXJyYXkuZmluZChpdGVtID0+IGl0ZW0ubGFiZWwgPT0ga2V5KVxuICAgICAgKSB7XG4gICAgICAgIGxlZ2VuZEl0ZW1BcnJheS5wdXNoKHtcbiAgICAgICAgICBsYWJlbDogZWxlbWVudE1hdGNoaW5nS2V5LmxhYmVsLFxuICAgICAgICAgIGNvbG9yVG9rZW46IGVsZW1lbnRNYXRjaGluZ0tleS5jb2xvclRva2VuLFxuICAgICAgICAgIHN0eWxlOiBlbGVtZW50TWF0Y2hpbmdLZXkuc3R5bGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbGVnZW5kSXRlbUFycmF5O1xufVxuXG4vLyBNYWtlIHN1cmUgd2UgaGF2ZSBpbnB1dCBpbiBhIHN0YW5kYXJkIGZvcm1hdC5cbmV4cG9ydCBmdW5jdGlvbiBzdGFuZGFyZGl6ZVJvd1N0YWNrcyhcbiAgcm93U3RhY2tzOiBTdGFja2VkUm93Q29tcG9uZW50LlJvd1N0YWNrW10sXG4gIGtleXNJbk9yZGVyOiBJbnRlcm5TZXQ8c3RyaW5nPixcbik6IFN0YWNrZWRSb3dDb21wb25lbnQuUm93U3RhY2tbXSB7XG4gIGNvbnN0IHN0YW5kYXJkaXplZFJvd3M6IFN0YWNrZWRSb3dDb21wb25lbnQuUm93U3RhY2tbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJvd1N0YWNrIG9mIHJvd1N0YWNrcykge1xuICAgIGNvbnN0IHN0YW5kYXJkaXplZERhdGE6IFN0YWNrZWRSb3dDb21wb25lbnQuUm93RWxlbWVudFtdID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0luT3JkZXIpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRNYXRjaGluZ0tleTogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dFbGVtZW50IHwgdW5kZWZpbmVkID1cbiAgICAgICAgcm93U3RhY2suZGF0YS5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5sYWJlbCA9PSBrZXkpO1xuICAgICAgaWYgKGVsZW1lbnRNYXRjaGluZ0tleSkge1xuICAgICAgICBzdGFuZGFyZGl6ZWREYXRhLnB1c2goe1xuICAgICAgICAgIC4uLmVsZW1lbnRNYXRjaGluZ0tleSxcbiAgICAgICAgICB2YWx1ZTogTWF0aC5hYnMoZWxlbWVudE1hdGNoaW5nS2V5LnZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHN0YW5kYXJkaXplZFJvd3MucHVzaCh7XG4gICAgICByb3dOYW1lOiByb3dTdGFjay5yb3dOYW1lLFxuICAgICAgZGF0YTogc3RhbmRhcmRpemVkRGF0YSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gc3RhbmRhcmRpemVkUm93cztcbn1cblxuLy8gU3RhY2tzIHRoZSBlbGVtZW50cyBhbmQgY3JlYXRlcyB0aGUgYmFzZWxpbmVzIGFuZCB0b3BsaW5lc1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvd0Rpc3BsYXlJbmZvKFxuICByb3dTdGFjazogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFjayxcbiAgaW5kZXg6IG51bWJlcixcbik6IFJvd0Rpc3BsYXlJbmZvIHtcbiAgY29uc3QgZWxlbWVudHNCdXRTdGFja2VkOiBTdGFja2VkUm93RWxlbWVudFtdID0gW107XG4gIGxldCBjdXJyZW50QmFzZWxpbmU6IG51bWJlciA9IDA7XG4gIGxldCBjdXJyZW50VG9wbGluZTogbnVtYmVyID0gMDtcblxuICBmb3IgKGNvbnN0IGN1cnJlbnRFbGVtZW50IG9mIHJvd1N0YWNrLmRhdGEpIHtcbiAgICBjdXJyZW50VG9wbGluZSArPSBjdXJyZW50RWxlbWVudC52YWx1ZSA/PyAwO1xuXG4gICAgZWxlbWVudHNCdXRTdGFja2VkLnB1c2goe1xuICAgICAgLi4uY3VycmVudEVsZW1lbnQsXG4gICAgICBiYXNlbGluZTogY3VycmVudEJhc2VsaW5lLFxuICAgICAgdG9wbGluZTogY3VycmVudFRvcGxpbmUsXG4gICAgfSk7XG5cbiAgICBjdXJyZW50QmFzZWxpbmUgPSBjdXJyZW50VG9wbGluZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcm93TmFtZTogcm93U3RhY2sucm93TmFtZSxcbiAgICBlbGVtZW50c0J1dFN0YWNrZWQ6IGVsZW1lbnRzQnV0U3RhY2tlZCxcbiAgICByb3dUb3RhbDogY3VycmVudFRvcGxpbmUsXG4gICAgc3RhY2tJbmRleDogaW5kZXgsXG4gIH07XG59XG4iXX0=
|