@one-paragon/angular-utilities 0.3.10 → 0.3.11-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/karma.conf.js +44 -0
- package/ng-package.json +7 -0
- package/package.json +16 -30
- package/src/action-state/action-state-spinner/action-state-spinner.component.css +16 -0
- package/src/action-state/action-state-spinner/action-state-spinner.component.html +6 -0
- package/src/action-state/action-state-spinner/action-state-spinner.component.spec.ts +25 -0
- package/src/action-state/action-state-spinner/action-state-spinner.component.ts +26 -0
- package/src/action-state/action-state-ui/action-state-ui.module.ts +13 -0
- package/{action-state/index.d.ts → src/action-state/index.ts} +8 -4
- package/src/action-state/ngrx-ext/ngrx-ext.module.ts +15 -0
- package/src/action-state/ngrx.ts +69 -0
- package/src/http-request-state/HttpRequestStateFactory.ts +29 -0
- package/src/http-request-state/HttpRequestStateStore.ts +147 -0
- package/src/http-request-state/directives/HttpStateDirectiveBase.ts +38 -0
- package/src/http-request-state/directives/http-error-state-directive.ts +32 -0
- package/src/http-request-state/directives/http-inProgress-state-directive.ts +32 -0
- package/src/http-request-state/directives/http-notStarted-state-directive.ts +31 -0
- package/src/http-request-state/directives/http-success-state-directive.ts +40 -0
- package/src/http-request-state/directives/request-state-directive.spec.ts +72 -0
- package/src/http-request-state/directives/request-state-directive.ts +79 -0
- package/src/http-request-state/helpers.ts +30 -0
- package/src/http-request-state/http-request-state.ts +69 -0
- package/src/http-request-state/http-state-module.ts +23 -0
- package/{http-request-state/index.d.ts → src/http-request-state/index.ts} +1 -1
- package/src/http-request-state/observable.spec.ts +43 -0
- package/src/http-request-state/rxjs/getRequestorBody.ts +10 -0
- package/src/http-request-state/rxjs/getRequestorState.ts +8 -0
- package/src/http-request-state/rxjs/tapError.ts +16 -0
- package/src/http-request-state/rxjs/tapSuccess.ts +16 -0
- package/src/http-request-state/strategies.spec.ts +42 -0
- package/src/http-request-state/types.ts +50 -0
- package/src/ngrx/actionable-selector.ts +95 -0
- package/src/ngrx/index.ts +1 -0
- package/{public-api.d.ts → src/public-api.ts} +35 -16
- package/src/rxjs/defaultShareReplay.ts +8 -0
- package/{rxjs/index.d.ts → src/rxjs/index.ts} +4 -4
- package/src/rxjs/mapError.ts +8 -0
- package/src/rxjs/rxjs-operators.ts +132 -0
- package/src/rxjs/subjectifier.ts +15 -0
- package/src/specs/clickSubject.spec.ts +95 -0
- package/src/specs/dialog.spec.ts +101 -0
- package/src/specs/toggleGroupDirective.spec.ts +229 -0
- package/src/table-builder/classes/DefaultSettings.ts +11 -0
- package/src/table-builder/classes/MatTableObservableDataSource.ts +23 -0
- package/src/table-builder/classes/TableBuilderConfig.ts +35 -0
- package/src/table-builder/classes/TableBuilderDataSource.ts +57 -0
- package/src/table-builder/classes/TableState.ts +83 -0
- package/src/table-builder/classes/filter-info.ts +131 -0
- package/src/table-builder/classes/table-builder-general-settings.ts +90 -0
- package/src/table-builder/classes/table-builder.ts +52 -0
- package/src/table-builder/classes/table-store.ts +394 -0
- package/src/table-builder/components/array-column.component.ts +36 -0
- package/src/table-builder/components/column-builder/column-builder.component.html +58 -0
- package/src/table-builder/components/column-builder/column-builder.component.scss +43 -0
- package/src/table-builder/components/column-builder/column-builder.component.spec.ts +49 -0
- package/src/table-builder/components/column-builder/column-builder.component.ts +117 -0
- package/src/table-builder/components/column-builder/column-helpers.ts +38 -0
- package/src/table-builder/components/date-filter/date-filter.component.html +23 -0
- package/src/table-builder/components/date-filter/date-filter.component.ts +24 -0
- package/src/table-builder/components/date-time-filter/date-time-filter.component.html +9 -0
- package/src/table-builder/components/date-time-filter/date-time-filter.component.ts +22 -0
- package/src/table-builder/components/filter/filter.component.html +88 -0
- package/src/table-builder/components/filter/filter.component.scss +64 -0
- package/src/table-builder/components/filter/filter.component.spec.ts +87 -0
- package/src/table-builder/components/filter/filter.component.ts +55 -0
- package/src/table-builder/components/filter/in-list/in-list-filter.component.ts +92 -0
- package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.html +55 -0
- package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.scss +57 -0
- package/src/table-builder/components/gen-col-displayer/gen-col-displayer.component.ts +55 -0
- package/src/table-builder/components/generic-table/generic-table.component.html +71 -0
- package/src/table-builder/components/generic-table/generic-table.component.scss +51 -0
- package/src/table-builder/components/generic-table/generic-table.component.ts +220 -0
- package/src/table-builder/components/generic-table/paginator.component.ts +94 -0
- package/src/table-builder/components/group-by-list/group-by-list.component.css +8 -0
- package/src/table-builder/components/group-by-list/group-by-list.component.html +12 -0
- package/src/table-builder/components/group-by-list/group-by-list.component.spec.ts +23 -0
- package/src/table-builder/components/group-by-list/group-by-list.component.ts +21 -0
- package/src/table-builder/components/header-menu/header-menu.component.html +98 -0
- package/src/table-builder/components/header-menu/header-menu.component.scss +96 -0
- package/src/table-builder/components/header-menu/header-menu.component.ts +98 -0
- package/src/table-builder/components/in-filter/in-filter.component.css +3 -0
- package/src/table-builder/components/in-filter/in-filter.component.html +20 -0
- package/src/table-builder/components/in-filter/in-filter.component.ts +64 -0
- package/{table-builder/components/index.d.ts → src/table-builder/components/index.ts} +9 -9
- package/src/table-builder/components/initialization-component/initialization-component.html +29 -0
- package/src/table-builder/components/initialization-component/initialization-component.ts +24 -0
- package/src/table-builder/components/link-column.component.ts +47 -0
- package/src/table-builder/components/number-filter/number-filter.component.css +10 -0
- package/src/table-builder/components/number-filter/number-filter.component.html +19 -0
- package/src/table-builder/components/number-filter/number-filter.component.spec.ts +30 -0
- package/src/table-builder/components/number-filter/number-filter.component.ts +25 -0
- package/src/table-builder/components/scroll-strategy.ts +82 -0
- package/src/table-builder/components/sort-menu/sort-menu.component-store.ts +62 -0
- package/src/table-builder/components/sort-menu/sort-menu.component.html +111 -0
- package/src/table-builder/components/sort-menu/sort-menu.component.scss +119 -0
- package/src/table-builder/components/sort-menu/sort-menu.component.ts +95 -0
- package/{table-builder/components/table-container/table-container-imports.d.ts → src/table-builder/components/table-container/table-container-imports.ts} +30 -14
- package/src/table-builder/components/table-container/table-container.css +45 -0
- package/src/table-builder/components/table-container/table-container.helpers/data-state.helpers.ts +141 -0
- package/src/table-builder/components/table-container/table-container.helpers/filter-state.helpers.ts +106 -0
- package/src/table-builder/components/table-container/table-container.helpers/groupBy.helpers.ts +69 -0
- package/src/table-builder/components/table-container/table-container.helpers/sort-state.helpers.ts +45 -0
- package/src/table-builder/components/table-container/table-container.html +117 -0
- package/src/table-builder/components/table-container/table-container.spec.ts +154 -0
- package/src/table-builder/components/table-container/table-container.ts +325 -0
- package/src/table-builder/components/table-container/tableProps.ts +18 -0
- package/src/table-builder/components/table-container/virtual-scroll-container.ts +126 -0
- package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.html +31 -0
- package/src/table-builder/components/table-container-filter/filter-list/filter-list.component.ts +52 -0
- package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.css +42 -0
- package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.html +10 -0
- package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.spec.ts +86 -0
- package/src/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.ts +38 -0
- package/src/table-builder/components/table-container-filter/table-wrapper-filter-store.ts +23 -0
- package/src/table-builder/directives/custom-cell-directive.ts +46 -0
- package/{table-builder/directives/index.d.ts → src/table-builder/directives/index.ts} +6 -5
- package/src/table-builder/directives/multi-sort.directive.spec.ts +124 -0
- package/src/table-builder/directives/multi-sort.directive.ts +49 -0
- package/src/table-builder/directives/resize-column.directive.ts +105 -0
- package/src/table-builder/directives/table-wrapper.directive.ts +14 -0
- package/src/table-builder/directives/tb-filter.directive.ts +370 -0
- package/src/table-builder/enums/filterTypes.ts +79 -0
- package/src/table-builder/functions/boolean-filter-function.ts +13 -0
- package/src/table-builder/functions/date-filter-function.ts +69 -0
- package/src/table-builder/functions/download-data.ts +11 -0
- package/src/table-builder/functions/null-filter-function.ts +9 -0
- package/src/table-builder/functions/number-filter-function.ts +42 -0
- package/src/table-builder/functions/sort-data-function.ts +23 -0
- package/src/table-builder/functions/string-filter-function.ts +52 -0
- package/{table-builder/interfaces/ColumnInfo.d.ts → src/table-builder/interfaces/ColumnInfo.ts} +3 -2
- package/src/table-builder/interfaces/column-template.ts +9 -0
- package/{table-builder/interfaces/dictionary.d.ts → src/table-builder/interfaces/dictionary.ts} +3 -3
- package/src/table-builder/interfaces/report-def.ts +153 -0
- package/src/table-builder/ngrx/tableBuilderStateStore.ts +143 -0
- package/src/table-builder/pipes/column-total.pipe.ts +17 -0
- package/src/table-builder/pipes/format-filter-type.pipe.ts +12 -0
- package/src/table-builder/pipes/format-filter-value.pipe.ts +41 -0
- package/src/table-builder/pipes/key-display.ts +16 -0
- package/src/table-builder/services/export-to-csv.service.ts +96 -0
- package/src/table-builder/services/link-creator.service.ts +68 -0
- package/src/table-builder/services/table-template-service.ts +55 -0
- package/src/table-builder/services/transform-creator.ts +92 -0
- package/src/table-builder/specs/table-custom-filters.spec.ts +262 -0
- package/src/table-builder/styles/collapser.styles.scss +15 -0
- package/src/table-builder/table-builder.module.ts +73 -0
- package/src/test.ts +17 -0
- package/src/utilities/array-helpers.ts +13 -0
- package/src/utilities/directives/auto-focus.directive.ts +20 -0
- package/src/utilities/directives/clickEmitterDirective.ts +16 -0
- package/src/utilities/directives/clickSubject.ts +20 -0
- package/src/utilities/directives/conditional-classes.directive.ts +36 -0
- package/src/utilities/directives/dialog-service.ts +19 -0
- package/src/utilities/directives/dialog.ts +142 -0
- package/src/utilities/directives/mat-toggle-group-directive.ts +61 -0
- package/src/utilities/directives/prevent-enter.directive.ts +13 -0
- package/src/utilities/directives/stop-propagation.directive.ts +20 -0
- package/src/utilities/directives/styler.ts +39 -0
- package/src/utilities/directives/trim-whitespace.directive.ts +21 -0
- package/{utilities/index.d.ts → src/utilities/index.ts} +22 -15
- package/src/utilities/module.ts +55 -0
- package/src/utilities/pipes/function.pipe.ts +16 -0
- package/src/utilities/pipes/phone.pipe.ts +15 -0
- package/src/utilities/pipes/space-case.pipes.spec.ts +47 -0
- package/src/utilities/pipes/space-case.pipes.ts +23 -0
- package/tsconfig.lib.json +19 -0
- package/tsconfig.lib.prod.json +10 -0
- package/tsconfig.spec.json +17 -0
- package/action-state/action-state-spinner/action-state-spinner.component.d.ts +0 -12
- package/action-state/action-state-ui/action-state-ui.module.d.ts +0 -7
- package/action-state/ngrx-ext/ngrx-ext.module.d.ts +0 -8
- package/action-state/ngrx.d.ts +0 -31
- package/esm2022/action-state/action-state-spinner/action-state-spinner.component.mjs +0 -24
- package/esm2022/action-state/action-state-ui/action-state-ui.module.mjs +0 -20
- package/esm2022/action-state/index.mjs +0 -8
- package/esm2022/action-state/ngrx-ext/ngrx-ext.module.mjs +0 -23
- package/esm2022/action-state/ngrx.mjs +0 -42
- package/esm2022/http-request-state/HttpRequestStateFactory.mjs +0 -27
- package/esm2022/http-request-state/HttpRequestStateStore.mjs +0 -98
- package/esm2022/http-request-state/directives/HttpStateDirectiveBase.mjs +0 -34
- package/esm2022/http-request-state/directives/http-error-state-directive.mjs +0 -29
- package/esm2022/http-request-state/directives/http-inProgress-state-directive.mjs +0 -29
- package/esm2022/http-request-state/directives/http-notStarted-state-directive.mjs +0 -29
- package/esm2022/http-request-state/directives/http-success-state-directive.mjs +0 -34
- package/esm2022/http-request-state/directives/index.mjs +0 -6
- package/esm2022/http-request-state/directives/request-state-directive.mjs +0 -60
- package/esm2022/http-request-state/helpers.mjs +0 -22
- package/esm2022/http-request-state/http-request-state.mjs +0 -39
- package/esm2022/http-request-state/http-state-module.mjs +0 -40
- package/esm2022/http-request-state/index.mjs +0 -7
- package/esm2022/http-request-state/rxjs/getRequestorBody.mjs +0 -4
- package/esm2022/http-request-state/rxjs/getRequestorState.mjs +0 -3
- package/esm2022/http-request-state/rxjs/index.mjs +0 -5
- package/esm2022/http-request-state/rxjs/tapError.mjs +0 -12
- package/esm2022/http-request-state/rxjs/tapSuccess.mjs +0 -12
- package/esm2022/http-request-state/types.mjs +0 -16
- package/esm2022/ngrx/actionable-selector.mjs +0 -73
- package/esm2022/ngrx/index.mjs +0 -2
- package/esm2022/one-paragon-angular-utilities.mjs +0 -5
- package/esm2022/public-api.mjs +0 -20
- package/esm2022/rxjs/defaultShareReplay.mjs +0 -7
- package/esm2022/rxjs/index.mjs +0 -5
- package/esm2022/rxjs/mapError.mjs +0 -8
- package/esm2022/rxjs/rxjs-operators.mjs +0 -92
- package/esm2022/rxjs/subjectifier.mjs +0 -15
- package/esm2022/table-builder/classes/DefaultSettings.mjs +0 -6
- package/esm2022/table-builder/classes/MatTableObservableDataSource.mjs +0 -21
- package/esm2022/table-builder/classes/TableBuilderConfig.mjs +0 -18
- package/esm2022/table-builder/classes/TableBuilderDataSource.mjs +0 -50
- package/esm2022/table-builder/classes/TableState.mjs +0 -42
- package/esm2022/table-builder/classes/display-col.mjs +0 -2
- package/esm2022/table-builder/classes/filter-info.mjs +0 -73
- package/esm2022/table-builder/classes/table-builder-general-settings.mjs +0 -68
- package/esm2022/table-builder/classes/table-builder.mjs +0 -82
- package/esm2022/table-builder/classes/table-store.mjs +0 -314
- package/esm2022/table-builder/components/array-column.component.mjs +0 -78
- package/esm2022/table-builder/components/column-builder/column-builder.component.mjs +0 -118
- package/esm2022/table-builder/components/date-filter/date-filter.component.mjs +0 -29
- package/esm2022/table-builder/components/date-time-filter/date-time-filter.component.mjs +0 -24
- package/esm2022/table-builder/components/filter/filter.component.mjs +0 -66
- package/esm2022/table-builder/components/filter/in-list/in-list-filter.component.mjs +0 -101
- package/esm2022/table-builder/components/gen-col-displayer/gen-col-displayer.component.mjs +0 -52
- package/esm2022/table-builder/components/generic-table/generic-table.component.mjs +0 -205
- package/esm2022/table-builder/components/generic-table/paginator.component.mjs +0 -79
- package/esm2022/table-builder/components/group-by-list/group-by-list.component.mjs +0 -23
- package/esm2022/table-builder/components/header-menu/header-menu.component.mjs +0 -101
- package/esm2022/table-builder/components/in-filter/in-filter.component.mjs +0 -64
- package/esm2022/table-builder/components/index.mjs +0 -10
- package/esm2022/table-builder/components/initialization-component/initialization-component.mjs +0 -36
- package/esm2022/table-builder/components/link-column.component.mjs +0 -73
- package/esm2022/table-builder/components/number-filter/number-filter.component.mjs +0 -29
- package/esm2022/table-builder/components/scroll-strategy.mjs +0 -63
- package/esm2022/table-builder/components/sort-menu/sort-menu.component-store.mjs +0 -43
- package/esm2022/table-builder/components/sort-menu/sort-menu.component.mjs +0 -81
- package/esm2022/table-builder/components/table-container/table-container-imports.mjs +0 -26
- package/esm2022/table-builder/components/table-container/table-container.helpers/data-state.helpers.mjs +0 -2
- package/esm2022/table-builder/components/table-container/table-container.helpers/filter-state.helpers.mjs +0 -62
- package/esm2022/table-builder/components/table-container/table-container.helpers/groupBy.helpers.mjs +0 -56
- package/esm2022/table-builder/components/table-container/table-container.helpers/sort-state.helpers.mjs +0 -36
- package/esm2022/table-builder/components/table-container/table-container.mjs +0 -337
- package/esm2022/table-builder/components/table-container/tableProps.mjs +0 -9
- package/esm2022/table-builder/components/table-container/virtual-scroll-container.mjs +0 -101
- package/esm2022/table-builder/components/table-container-filter/filter-list/filter-list.component.mjs +0 -47
- package/esm2022/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.mjs +0 -36
- package/esm2022/table-builder/components/table-container-filter/table-wrapper-filter-store.mjs +0 -25
- package/esm2022/table-builder/components/table-context.mjs +0 -2
- package/esm2022/table-builder/directives/custom-cell-directive.mjs +0 -60
- package/esm2022/table-builder/directives/index.mjs +0 -6
- package/esm2022/table-builder/directives/multi-sort.directive.mjs +0 -50
- package/esm2022/table-builder/directives/resize-column.directive.mjs +0 -87
- package/esm2022/table-builder/directives/table-wrapper.directive.mjs +0 -20
- package/esm2022/table-builder/directives/tb-filter.directive.mjs +0 -410
- package/esm2022/table-builder/enums/filterTypes.mjs +0 -72
- package/esm2022/table-builder/functions/boolean-filter-function.mjs +0 -10
- package/esm2022/table-builder/functions/date-filter-function.mjs +0 -58
- package/esm2022/table-builder/functions/download-data.mjs +0 -12
- package/esm2022/table-builder/functions/null-filter-function.mjs +0 -8
- package/esm2022/table-builder/functions/number-filter-function.mjs +0 -32
- package/esm2022/table-builder/functions/sort-data-function.mjs +0 -17
- package/esm2022/table-builder/functions/string-filter-function.mjs +0 -41
- package/esm2022/table-builder/interfaces/ColumnInfo.mjs +0 -2
- package/esm2022/table-builder/interfaces/dictionary.mjs +0 -2
- package/esm2022/table-builder/interfaces/report-def.mjs +0 -35
- package/esm2022/table-builder/ngrx/tableBuilderStateStore.mjs +0 -115
- package/esm2022/table-builder/pipes/column-total.pipe.mjs +0 -22
- package/esm2022/table-builder/pipes/format-filter-type.pipe.mjs +0 -18
- package/esm2022/table-builder/pipes/format-filter-value.pipe.mjs +0 -45
- package/esm2022/table-builder/pipes/key-display.mjs +0 -20
- package/esm2022/table-builder/services/export-to-csv.service.mjs +0 -88
- package/esm2022/table-builder/services/link-creator.service.mjs +0 -42
- package/esm2022/table-builder/services/table-template-service.mjs +0 -44
- package/esm2022/table-builder/services/transform-creator.mjs +0 -78
- package/esm2022/table-builder/table-builder.module.mjs +0 -124
- package/esm2022/utilities/array-helpers.mjs +0 -14
- package/esm2022/utilities/directives/auto-focus.directive.mjs +0 -27
- package/esm2022/utilities/directives/clickEmitterDirective.mjs +0 -22
- package/esm2022/utilities/directives/clickSubject.mjs +0 -28
- package/esm2022/utilities/directives/conditional-classes.directive.mjs +0 -36
- package/esm2022/utilities/directives/dialog-service.mjs +0 -23
- package/esm2022/utilities/directives/dialog.mjs +0 -138
- package/esm2022/utilities/directives/mat-toggle-group-directive.mjs +0 -60
- package/esm2022/utilities/directives/prevent-enter.directive.mjs +0 -20
- package/esm2022/utilities/directives/stop-propagation.directive.mjs +0 -26
- package/esm2022/utilities/directives/styler.mjs +0 -42
- package/esm2022/utilities/directives/trim-whitespace.directive.mjs +0 -30
- package/esm2022/utilities/index.mjs +0 -16
- package/esm2022/utilities/module.mjs +0 -90
- package/esm2022/utilities/pipes/function.pipe.mjs +0 -22
- package/esm2022/utilities/pipes/phone.pipe.mjs +0 -20
- package/esm2022/utilities/pipes/space-case.pipes.mjs +0 -28
- package/fesm2022/one-paragon-angular-utilities.mjs +0 -5045
- package/fesm2022/one-paragon-angular-utilities.mjs.map +0 -1
- package/http-request-state/HttpRequestStateFactory.d.ts +0 -15
- package/http-request-state/HttpRequestStateStore.d.ts +0 -49
- package/http-request-state/directives/HttpStateDirectiveBase.d.ts +0 -16
- package/http-request-state/directives/http-error-state-directive.d.ts +0 -12
- package/http-request-state/directives/http-inProgress-state-directive.d.ts +0 -12
- package/http-request-state/directives/http-notStarted-state-directive.d.ts +0 -12
- package/http-request-state/directives/http-success-state-directive.d.ts +0 -21
- package/http-request-state/directives/request-state-directive.d.ts +0 -35
- package/http-request-state/helpers.d.ts +0 -9
- package/http-request-state/http-request-state.d.ts +0 -12
- package/http-request-state/http-state-module.d.ts +0 -11
- package/http-request-state/rxjs/getRequestorBody.d.ts +0 -3
- package/http-request-state/rxjs/getRequestorState.d.ts +0 -3
- package/http-request-state/rxjs/tapError.d.ts +0 -3
- package/http-request-state/rxjs/tapSuccess.d.ts +0 -3
- package/http-request-state/types.d.ts +0 -36
- package/index.d.ts +0 -5
- package/ngrx/actionable-selector.d.ts +0 -17
- package/ngrx/index.d.ts +0 -1
- package/rxjs/defaultShareReplay.d.ts +0 -2
- package/rxjs/mapError.d.ts +0 -2
- package/rxjs/rxjs-operators.d.ts +0 -13
- package/rxjs/subjectifier.d.ts +0 -9
- package/table-builder/classes/DefaultSettings.d.ts +0 -9
- package/table-builder/classes/MatTableObservableDataSource.d.ts +0 -9
- package/table-builder/classes/TableBuilderConfig.d.ts +0 -21
- package/table-builder/classes/TableBuilderDataSource.d.ts +0 -13
- package/table-builder/classes/TableState.d.ts +0 -55
- package/table-builder/classes/filter-info.d.ts +0 -127
- package/table-builder/classes/table-builder-general-settings.d.ts +0 -43
- package/table-builder/classes/table-builder.d.ts +0 -14
- package/table-builder/classes/table-store.d.ts +0 -124
- package/table-builder/components/array-column.component.d.ts +0 -14
- package/table-builder/components/column-builder/column-builder.component.d.ts +0 -54
- package/table-builder/components/date-filter/date-filter.component.d.ts +0 -10
- package/table-builder/components/date-time-filter/date-time-filter.component.d.ts +0 -10
- package/table-builder/components/filter/filter.component.d.ts +0 -112
- package/table-builder/components/filter/in-list/in-list-filter.component.d.ts +0 -27
- package/table-builder/components/gen-col-displayer/gen-col-displayer.component.d.ts +0 -16
- package/table-builder/components/generic-table/generic-table.component.d.ts +0 -69
- package/table-builder/components/generic-table/paginator.component.d.ts +0 -27
- package/table-builder/components/group-by-list/group-by-list.component.d.ts +0 -7
- package/table-builder/components/header-menu/header-menu.component.d.ts +0 -25
- package/table-builder/components/in-filter/in-filter.component.d.ts +0 -21
- package/table-builder/components/initialization-component/initialization-component.d.ts +0 -12
- package/table-builder/components/link-column.component.d.ts +0 -17
- package/table-builder/components/number-filter/number-filter.component.d.ts +0 -12
- package/table-builder/components/scroll-strategy.d.ts +0 -23
- package/table-builder/components/sort-menu/sort-menu.component-store.d.ts +0 -24
- package/table-builder/components/sort-menu/sort-menu.component.d.ts +0 -25
- package/table-builder/components/table-container/table-container.d.ts +0 -75
- package/table-builder/components/table-container/table-container.helpers/data-state.helpers.d.ts +0 -5
- package/table-builder/components/table-container/table-container.helpers/filter-state.helpers.d.ts +0 -15
- package/table-builder/components/table-container/table-container.helpers/groupBy.helpers.d.ts +0 -15
- package/table-builder/components/table-container/table-container.helpers/sort-state.helpers.d.ts +0 -9
- package/table-builder/components/table-container/tableProps.d.ts +0 -11
- package/table-builder/components/table-container/virtual-scroll-container.d.ts +0 -17
- package/table-builder/components/table-container-filter/filter-list/filter-list.component.d.ts +0 -16
- package/table-builder/components/table-container-filter/gen-filter-displayer/gen-filter-displayer.component.d.ts +0 -14
- package/table-builder/components/table-container-filter/table-wrapper-filter-store.d.ts +0 -14
- package/table-builder/components/table-context.d.ts +0 -10
- package/table-builder/directives/custom-cell-directive.d.ts +0 -19
- package/table-builder/directives/multi-sort.directive.d.ts +0 -11
- package/table-builder/directives/resize-column.directive.d.ts +0 -43
- package/table-builder/directives/table-wrapper.directive.d.ts +0 -8
- package/table-builder/directives/tb-filter.directive.d.ts +0 -120
- package/table-builder/enums/filterTypes.d.ts +0 -77
- package/table-builder/functions/boolean-filter-function.d.ts +0 -3
- package/table-builder/functions/date-filter-function.d.ts +0 -4
- package/table-builder/functions/download-data.d.ts +0 -1
- package/table-builder/functions/null-filter-function.d.ts +0 -2
- package/table-builder/functions/number-filter-function.d.ts +0 -4
- package/table-builder/functions/sort-data-function.d.ts +0 -6
- package/table-builder/functions/string-filter-function.d.ts +0 -7
- package/table-builder/interfaces/report-def.d.ts +0 -147
- package/table-builder/ngrx/tableBuilderStateStore.d.ts +0 -62
- package/table-builder/pipes/column-total.pipe.d.ts +0 -8
- package/table-builder/pipes/format-filter-type.pipe.d.ts +0 -8
- package/table-builder/pipes/format-filter-value.pipe.d.ts +0 -14
- package/table-builder/pipes/key-display.d.ts +0 -11
- package/table-builder/services/export-to-csv.service.d.ts +0 -22
- package/table-builder/services/link-creator.service.d.ts +0 -12
- package/table-builder/services/table-template-service.d.ts +0 -14
- package/table-builder/services/transform-creator.d.ts +0 -19
- package/table-builder/table-builder.module.d.ts +0 -21
- package/utilities/array-helpers.d.ts +0 -1
- package/utilities/directives/auto-focus.directive.d.ts +0 -10
- package/utilities/directives/clickEmitterDirective.d.ts +0 -7
- package/utilities/directives/clickSubject.d.ts +0 -9
- package/utilities/directives/conditional-classes.directive.d.ts +0 -14
- package/utilities/directives/dialog-service.d.ts +0 -10
- package/utilities/directives/dialog.d.ts +0 -46
- package/utilities/directives/mat-toggle-group-directive.d.ts +0 -21
- package/utilities/directives/prevent-enter.directive.d.ts +0 -6
- package/utilities/directives/stop-propagation.directive.d.ts +0 -7
- package/utilities/directives/styler.d.ts +0 -16
- package/utilities/directives/trim-whitespace.directive.d.ts +0 -9
- package/utilities/module.d.ts +0 -19
- package/utilities/pipes/function.pipe.d.ts +0 -7
- package/utilities/pipes/phone.pipe.d.ts +0 -7
- package/utilities/pipes/space-case.pipes.d.ts +0 -17
- /package/{http-request-state/directives/index.d.ts → src/http-request-state/directives/index.ts} +0 -0
- /package/{http-request-state/rxjs/index.d.ts → src/http-request-state/rxjs/index.ts} +0 -0
- /package/{table-builder/classes/display-col.d.ts → src/table-builder/classes/display-col.ts} +0 -0
|
@@ -1,337 +0,0 @@
|
|
|
1
|
-
import { Component, Input, EventEmitter, Output, ContentChildren, ChangeDetectionStrategy, ViewChild, inject, forwardRef, } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, from, ReplaySubject, combineLatest, of } from 'rxjs';
|
|
3
|
-
import { FieldType } from '../../interfaces/report-def';
|
|
4
|
-
import { first, last, map, tap, withLatestFrom, mergeAll, scan, switchAll, startWith, timestamp } from 'rxjs/operators';
|
|
5
|
-
import { MatRowDef } from '@angular/material/table';
|
|
6
|
-
import { CustomCellDirective, TableCustomFilterDirective, TableFilterDirective } from '../../directives';
|
|
7
|
-
import { stateIs, TableStore } from '../../classes/table-store';
|
|
8
|
-
import { mapArray, notNull } from '../../../rxjs/rxjs-operators';
|
|
9
|
-
import { ExportToCsvService } from '../../services/export-to-csv.service';
|
|
10
|
-
import { ArrayDefaults } from '../../classes/DefaultSettings';
|
|
11
|
-
import { TableBuilderConfigToken } from '../../classes/TableBuilderConfig';
|
|
12
|
-
import { InitializationState } from '../../classes/TableState';
|
|
13
|
-
import { filterData, sortData, tbNoShowSymbol } from '../../functions/sort-data-function';
|
|
14
|
-
import { WrapperFilterStore } from '../table-container-filter/table-wrapper-filter-store';
|
|
15
|
-
import { cloneDeep } from 'lodash';
|
|
16
|
-
import { defaultShareReplay } from '../../../rxjs';
|
|
17
|
-
import { createFilterFunc, isCustomFilter, isFilterInfo } from '../../classes/filter-info';
|
|
18
|
-
import { TableWrapperDirective } from '../../directives/table-wrapper.directive';
|
|
19
|
-
import { createLinkCreator } from '../../services/link-creator.service';
|
|
20
|
-
import { TableBuilderStateStore } from '../../ngrx/tableBuilderStateStore';
|
|
21
|
-
import { containerImports } from './table-container-imports';
|
|
22
|
-
import { initialFilterState, predicateAndFilterInfos, updateFilterState } from './table-container.helpers/filter-state.helpers';
|
|
23
|
-
import { initialSortState, updateSortState } from './table-container.helpers/sort-state.helpers';
|
|
24
|
-
import { initialGroupByState, updateGroupByState } from './table-container.helpers/groupBy.helpers';
|
|
25
|
-
import { initialDataState } from './table-container.helpers/data-state.helpers';
|
|
26
|
-
import { defaultProps } from './tableProps';
|
|
27
|
-
import { TableVirtualScrollStrategy } from '../scroll-strategy';
|
|
28
|
-
import { PaginatorComponent } from '../generic-table/paginator.component';
|
|
29
|
-
import { TableBuilderDataSource } from '../../classes/TableBuilderDataSource';
|
|
30
|
-
import * as i0 from "@angular/core";
|
|
31
|
-
import * as i1 from "@angular/common";
|
|
32
|
-
import * as i2 from "../generic-table/paginator.component";
|
|
33
|
-
import * as i3 from "@ngrx/component";
|
|
34
|
-
import * as i4 from "../../directives/multi-sort.directive";
|
|
35
|
-
import * as i5 from "../group-by-list/group-by-list.component";
|
|
36
|
-
import * as i6 from "../table-container-filter/filter-list/filter-list.component";
|
|
37
|
-
import * as i7 from "../table-container-filter/gen-filter-displayer/gen-filter-displayer.component";
|
|
38
|
-
import * as i8 from "../gen-col-displayer/gen-col-displayer.component";
|
|
39
|
-
import * as i9 from "../sort-menu/sort-menu.component";
|
|
40
|
-
import * as i10 from "../generic-table/generic-table.component";
|
|
41
|
-
import * as i11 from "../../../utilities/directives/stop-propagation.directive";
|
|
42
|
-
import * as i12 from "../../../utilities/directives/clickEmitterDirective";
|
|
43
|
-
import * as i13 from "../../../utilities/directives/dialog";
|
|
44
|
-
import * as i14 from "@angular/material/button";
|
|
45
|
-
import * as i15 from "@angular/material/menu";
|
|
46
|
-
import * as i16 from "@angular/material/icon";
|
|
47
|
-
import * as i17 from "@angular/material/tooltip";
|
|
48
|
-
import * as i18 from "@angular/material/input";
|
|
49
|
-
import * as i19 from "@angular/material/form-field";
|
|
50
|
-
import * as i20 from "./virtual-scroll-container";
|
|
51
|
-
export class TableContainerComponent {
|
|
52
|
-
constructor() {
|
|
53
|
-
this.props = defaultProps;
|
|
54
|
-
this.context = {
|
|
55
|
-
tableProps: this.props,
|
|
56
|
-
scrollStrategy: new TableVirtualScrollStrategy(48, 56),
|
|
57
|
-
};
|
|
58
|
-
this.selection$ = new EventEmitter();
|
|
59
|
-
this.displayDataSubject = new ReplaySubject(1);
|
|
60
|
-
this.displayData = this.displayDataSubject.pipe(switchAll(), defaultShareReplay());
|
|
61
|
-
this.dataSubject = new ReplaySubject(1);
|
|
62
|
-
this.data = this.dataSubject.pipe(switchAll(), defaultShareReplay());
|
|
63
|
-
this.onStateReset = new EventEmitter();
|
|
64
|
-
this.onSaveState = new EventEmitter();
|
|
65
|
-
this.state = inject(TableStore);
|
|
66
|
-
this.state$ = this.state.getSavableState().pipe(map(state => cloneDeep(state)), defaultShareReplay());
|
|
67
|
-
this.collapseFooter$ = this.state.state$.pipe(map(state => state.persistedTableSettings.collapseFooter));
|
|
68
|
-
this.config = inject(TableBuilderConfigToken);
|
|
69
|
-
this.exportToCsvService = inject((ExportToCsvService));
|
|
70
|
-
this.wrapper = inject(TableWrapperDirective, { optional: true });
|
|
71
|
-
this.store = inject(TableBuilderStateStore);
|
|
72
|
-
this._ = this.state.on(this.state.getSavableState().pipe(last()), finalState => {
|
|
73
|
-
if (this.tableId) {
|
|
74
|
-
this.store.setLocalProfile({ key: this.tableId, value: finalState });
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
this.customFilters$ = new BehaviorSubject([]);
|
|
78
|
-
this.mapMetaDatas = (meta) => {
|
|
79
|
-
if (meta.fieldType === FieldType.Array) {
|
|
80
|
-
const additional = { ...meta.additional };
|
|
81
|
-
additional.arrayStyle = additional?.arrayStyle ?? ArrayDefaults.arrayStyle;
|
|
82
|
-
additional.limit = additional.limit ?? this.config.arrayInfo?.limit ?? ArrayDefaults.limit;
|
|
83
|
-
return { ...meta, additional };
|
|
84
|
-
}
|
|
85
|
-
return meta;
|
|
86
|
-
};
|
|
87
|
-
this.collapseHeader$ = this.state.state$.pipe(map(state => state.persistedTableSettings.collapseHeader));
|
|
88
|
-
this.addFilterDirectives = (state) => {
|
|
89
|
-
let allFilterDirectives = [...this.filterDirectives, ...this.customFilterDirectives];
|
|
90
|
-
if (this.wrapper) {
|
|
91
|
-
allFilterDirectives = [...allFilterDirectives, ...this.wrapper.registrations];
|
|
92
|
-
}
|
|
93
|
-
const customFilters = [];
|
|
94
|
-
allFilterDirectives.filter(f => !f.used).forEach(f => {
|
|
95
|
-
f.used = true;
|
|
96
|
-
if (f.savable) {
|
|
97
|
-
var filter = state.filters[f.filterId];
|
|
98
|
-
if (isFilterInfo(filter)) {
|
|
99
|
-
const filterDirective = f;
|
|
100
|
-
filterDirective.fieldType = filter.fieldType;
|
|
101
|
-
filterDirective.filterType = filter.filterType;
|
|
102
|
-
filterDirective.setFilterValue(filter.filterValue);
|
|
103
|
-
filterDirective.key = filter.key;
|
|
104
|
-
filterDirective.update();
|
|
105
|
-
}
|
|
106
|
-
if (isCustomFilter(filter)) {
|
|
107
|
-
f.active = filter.active ?? false;
|
|
108
|
-
}
|
|
109
|
-
this.state.addFilter(f.filter$);
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
customFilters.push(f);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
const customFilters$ = from(customFilters.map(cf => cf.filter$)).pipe(mergeAll(), scan((a, b) => {
|
|
116
|
-
if (b.active) {
|
|
117
|
-
a[b.filterId] = isCustomFilter(b) ? b.predicate : createFilterFunc(b);
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
delete a[b.filterId];
|
|
121
|
-
}
|
|
122
|
-
return a;
|
|
123
|
-
}, {}), map(f => Object.values(f)));
|
|
124
|
-
this.state.on(customFilters$, (f) => {
|
|
125
|
-
this.customFilters$.next(f);
|
|
126
|
-
});
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
set indexColumn(val) {
|
|
130
|
-
this.props.indexColumn = val;
|
|
131
|
-
}
|
|
132
|
-
set selectionColumn(val) {
|
|
133
|
-
this.props.selectionColumn = val;
|
|
134
|
-
}
|
|
135
|
-
set isSticky(val) {
|
|
136
|
-
this.props.isSticky = val;
|
|
137
|
-
}
|
|
138
|
-
set stickyFooter(val) {
|
|
139
|
-
this.props.stickyFooter = val;
|
|
140
|
-
}
|
|
141
|
-
set pageSize(value) {
|
|
142
|
-
this.state.setPageSize(value);
|
|
143
|
-
}
|
|
144
|
-
set groupHeaderTemplate(template) {
|
|
145
|
-
this.props.groupHeaderTemplate = template;
|
|
146
|
-
}
|
|
147
|
-
set usePaginator(val) {
|
|
148
|
-
this.props.usePaginator = val;
|
|
149
|
-
}
|
|
150
|
-
set itemHeight(val) {
|
|
151
|
-
this.context.scrollStrategy.setItemHeight(val);
|
|
152
|
-
}
|
|
153
|
-
set headerOffset(val) {
|
|
154
|
-
this.context.scrollStrategy.setHeaderOffset(val);
|
|
155
|
-
}
|
|
156
|
-
set useVirtualScroll(val) {
|
|
157
|
-
this.props.useVirtualScroll = val;
|
|
158
|
-
}
|
|
159
|
-
firstPage() {
|
|
160
|
-
this.paginatorComponent?.paginator?.firstPage();
|
|
161
|
-
}
|
|
162
|
-
lastPage() {
|
|
163
|
-
this.paginatorComponent?.paginator?.lastPage();
|
|
164
|
-
}
|
|
165
|
-
resetState() {
|
|
166
|
-
this.customFilterDirectives.forEach(cf => cf.reset());
|
|
167
|
-
this.filterDirectives.forEach(cf => cf.reset());
|
|
168
|
-
this.state.resetState();
|
|
169
|
-
this.onStateReset.next(null);
|
|
170
|
-
}
|
|
171
|
-
initializeState() {
|
|
172
|
-
this.state.setTableSettings(this.tableBuilder.settings);
|
|
173
|
-
this.state.runOnceWhen(stateIs(InitializationState.MetaDataLoaded), () => {
|
|
174
|
-
if (this.tableId) {
|
|
175
|
-
const persistedState$ = this.store.selectLocalProfileState(this.tableId).pipe(tap(persistedState => {
|
|
176
|
-
if (!persistedState) {
|
|
177
|
-
this.state.setInitializationState(InitializationState.LoadedFromStore);
|
|
178
|
-
}
|
|
179
|
-
}), notNull());
|
|
180
|
-
this.state.updateStateFromPersistedState(persistedState$);
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
this.state.setInitializationState(InitializationState.LoadedFromStore);
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
initializeData() {
|
|
188
|
-
const predicateFilters$ = combineLatest([this.inputFilters?.pipe(startWith([])) ?? of([]), this.customFilters$])
|
|
189
|
-
.pipe(map(([a, b]) => [...a, ...b]));
|
|
190
|
-
const filterState$ = predicateAndFilterInfos(this.state.filters$, predicateFilters$).pipe(scan(updateFilterState, initialFilterState));
|
|
191
|
-
const sortsState$ = this.state.sort$.pipe(scan(updateSortState, initialSortState));
|
|
192
|
-
const sortedAndFilteredData$ = combineLatest([
|
|
193
|
-
this.tableBuilder.getData$().pipe(timestamp()),
|
|
194
|
-
sortsState$.pipe(timestamp()),
|
|
195
|
-
filterState$.pipe(timestamp())
|
|
196
|
-
]).pipe(scan(({ mappedData: resultData }, [data, sort, f], index) => {
|
|
197
|
-
if (index === 0 || (data.timestamp > sort.timestamp && data.timestamp > f.timestamp)) {
|
|
198
|
-
return ({ mappedData: filterData(sortData(data.value, sort.value.sortsToRun), f.value.allFilters) });
|
|
199
|
-
}
|
|
200
|
-
if (sort.timestamp > f.timestamp) {
|
|
201
|
-
return ({ mappedData: sortData(resultData, sort.value.sortsToRun) });
|
|
202
|
-
}
|
|
203
|
-
return ({ mappedData: filterData(resultData, f.value.onlyAddedFilters || f.value.allFilters, !f.value.onlyAddedFilters) });
|
|
204
|
-
}, initialDataState)).pipe(map(({ mappedData: resultData }) => resultData.filter(item => !item[tbNoShowSymbol])), defaultShareReplay());
|
|
205
|
-
const flatGrouped$ = combineLatest([sortedAndFilteredData$.pipe(timestamp()), this.state.groupByKeys$.pipe(timestamp()), this.state.expandedGroups$.pipe(timestamp())]).pipe(scan(updateGroupByState, initialGroupByState), map(({ displayData }) => displayData), defaultShareReplay());
|
|
206
|
-
this.displayDataSubject.next(flatGrouped$);
|
|
207
|
-
this.dataSubject.next(sortedAndFilteredData$);
|
|
208
|
-
this.state.on(this.displayData, (data) => {
|
|
209
|
-
this.state.updateState({ dataLen: data.length });
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
ngOnInit() {
|
|
213
|
-
const ds = new TableBuilderDataSource(this.displayData, this.state, this.context);
|
|
214
|
-
this.context.dataSource = ds;
|
|
215
|
-
this.initializeState();
|
|
216
|
-
this.initializeData();
|
|
217
|
-
if (this.tableId) {
|
|
218
|
-
this.stateKeys$ = this.store.selectLocalProfileKeys(this.tableId);
|
|
219
|
-
this.currentStateKey$ = this.store.selectLocalProfileCurrentKey(this.tableId);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
exportToCsv() {
|
|
223
|
-
const sorted = this.data.pipe(withLatestFrom(this.state.sort$), map(([data, sorted]) => sortData(data, sorted)));
|
|
224
|
-
this.exportToCsvService.exportToCsv(sorted);
|
|
225
|
-
}
|
|
226
|
-
saveState() {
|
|
227
|
-
this.state.getSavableState().pipe(first()).subscribe(tableState => {
|
|
228
|
-
this.onSaveState.next(null);
|
|
229
|
-
this.store.saveLocalProfile({ key: this.tableId, value: tableState, persist: true });
|
|
230
|
-
this.store.setLocalProfile({ key: this.tableId, value: tableState });
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
setProfileState(val) {
|
|
234
|
-
this.store.setLocalProfilesState({ key: this.tableId, current: val });
|
|
235
|
-
}
|
|
236
|
-
deleteProfileState(stateKey) {
|
|
237
|
-
this.store.deleteLocalProfile({ key: this.tableId, stateKey });
|
|
238
|
-
}
|
|
239
|
-
ngAfterContentInit() {
|
|
240
|
-
this.initializeColumns();
|
|
241
|
-
this.state.runOnceWhen(stateIs(InitializationState.LoadedFromStore), state => {
|
|
242
|
-
this.addFilterDirectives(state);
|
|
243
|
-
this.state.updateState({ initializationState: InitializationState.Ready });
|
|
244
|
-
});
|
|
245
|
-
}
|
|
246
|
-
initializeColumns() {
|
|
247
|
-
const customCellMap = new Map(this.customCells.map(cc => [cc.customCell, cc]));
|
|
248
|
-
this.state.setMetaData(this.tableBuilder.metaData$.pipe(map((mds) => {
|
|
249
|
-
mds = mds.map(this.mapMetaDatas);
|
|
250
|
-
return [
|
|
251
|
-
...mds,
|
|
252
|
-
...this.customCells.map(cc => cc.getMetaData(mds.find(item => item.key === cc.customCell)))
|
|
253
|
-
];
|
|
254
|
-
})));
|
|
255
|
-
this.state.setLinkMaps(this.tableBuilder.metaData$.pipe(map((mds) => {
|
|
256
|
-
return mds.reduce((acc, md) => {
|
|
257
|
-
if (md.fieldType === FieldType.Link) {
|
|
258
|
-
acc[md.key] = createLinkCreator(md);
|
|
259
|
-
}
|
|
260
|
-
return acc;
|
|
261
|
-
}, {});
|
|
262
|
-
})));
|
|
263
|
-
this.myColumns$ = this.state.metaDataArray$.pipe(mapArray(metaData => ({ metaData, customCell: customCellMap.get(metaData.key) })));
|
|
264
|
-
}
|
|
265
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: TableContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
266
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.3", type: TableContainerComponent, isStandalone: true, selector: "tb-table-container", inputs: { indexColumn: "indexColumn", selectionColumn: "selectionColumn", isSticky: "isSticky", stickyFooter: "stickyFooter", pageSize: "pageSize", groupHeaderTemplate: "groupHeaderTemplate", usePaginator: "usePaginator", itemHeight: "itemHeight", headerOffset: "headerOffset", useVirtualScroll: "useVirtualScroll", tableId: "tableId", tableBuilder: "tableBuilder", trackBy: "trackBy", inputFilters: "inputFilters" }, outputs: { selection$: "selection$", data: "data", onStateReset: "onStateReset", onSaveState: "onSaveState", state$: "state$" }, providers: [TableStore, ExportToCsvService, WrapperFilterStore], queries: [{ propertyName: "customFilterDirectives", predicate: TableCustomFilterDirective, descendants: true }, { propertyName: "filterDirectives", predicate: TableFilterDirective, descendants: true }, { propertyName: "customRows", predicate: MatRowDef }, { propertyName: "customCells", predicate: CustomCellDirective }], viewQueries: [{ propertyName: "paginatorComponent", first: true, predicate: PaginatorComponent, descendants: true }], ngImport: i0, template: "<ng-content select=\"[before]\" />\r\n\r\n<ng-container multiSort *ngrxLet=\"state.tableSettings$ as tableSettings\">\r\n <div class=\"header-wrapper\">\r\n <div class=\"title\">\r\n @if ((!(collapseHeader$ | async)) || tableSettings.showTitleWhenHeaderCollapsed) {\r\n <ng-content select=\".tb-header-title\"/>\r\n }\r\n @if((state.groupByKeys$ | async)?.length){\r\n <group-by-list />\r\n }\r\n </div>\r\n <div class=\"flx-row-end\">\r\n <lib-filter-list />\r\n @if (!tableSettings.hideHeader) {\r\n @if (!(collapseHeader$ | async)) {\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"/>\r\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"mainMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #mainMenu='matMenu'>\r\n <ng-container *ngTemplateOutlet=\"headerMenuExtra\"/>\r\n </mat-menu>\r\n }\r\n @else {\r\n <mat-icon color=\"primary\" [matMenuTriggerFor]=\"mainMenu\" class=\"flat-menu-button pointer\">more_horiz</mat-icon>\r\n <mat-menu #mainMenu='matMenu'>\r\n <div class=\"flex-column\">\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"/>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"headerMenuExtra\"/>\r\n </mat-menu>\r\n }\r\n <mat-icon [matTooltip]=\"(collapseHeader$ | async) ? 'expand' : 'collapse'\" class=\"collapse-icon header\"\r\n (click)=\"state.toggleCollapseHeader()\">\r\n {{(collapseHeader$ | async) ? 'expand_less' : 'expand_more'}}\r\n </mat-icon>\r\n }\r\n\r\n </div>\r\n </div>\r\n <div>\r\n @if(props.useVirtualScroll) {\r\n <tb-virtual-scroll-container>\r\n <tb-generic-table [rows]='customRows' [data$]=\"data\" [displayData$]=\"displayData\"\r\n (selection$)='selection$.emit($event)' [columnInfos]='myColumns$' [trackBy]=\"trackBy\"></tb-generic-table>\r\n </tb-virtual-scroll-container>\r\n }\r\n @else {\r\n <tb-generic-table [rows]='customRows' [data$]=\"data\" [displayData$]=\"displayData\"\r\n (selection$)='selection$.emit($event)' [columnInfos]='myColumns$' [trackBy]=\"trackBy\"></tb-generic-table>\r\n }\r\n @if(props.usePaginator) {\r\n <div class=\"paginator\">\r\n <tb-paginator #tbPaginator [data$]=\"data\" />\r\n\r\n <mat-icon [matTooltip]=\"(collapseFooter$ | async) ? 'expand' : 'collapse'\" class=\"collapse-icon footer\"\r\n (click)=\"state.toggleCollapseFooter()\">\r\n {{(collapseFooter$ | async) ? 'expand_more' : 'expand_less'}}\r\n </mat-icon>\r\n </div>\r\n }\r\n </div>\r\n\r\n\r\n\r\n <ng-template #headerMenu>\r\n @if (!tableSettings.hideFilter) {<tb-filter-displayer/>}\r\n @if (!tableSettings.hideColumnSettings) {<tb-col-displayer/>}\r\n @if (!tableSettings.hideSort) {<tb-sort-menu/>}\r\n </ng-template>\r\n\r\n <ng-template #headerMenuExtra>\r\n <button mat-menu-item (click)=\"resetState()\">\r\n <mat-icon color=\"primary\">autorenew</mat-icon>\r\n <span>Reset table</span>\r\n </button>\r\n @if (!tableSettings.hideExport) {\r\n <button mat-menu-item (click)=\"exportToCsv()\">\r\n <mat-icon color=\"primary\">file_download</mat-icon>\r\n <span>Export Table</span>\r\n </button>\r\n }\r\n @if (currentStateKey$ | async; as currentKey) {\r\n @if (tableId) {\r\n <button mat-menu-item (click)=\"saveState()\">\r\n <mat-icon color=\"primary\">save</mat-icon>\r\n <span>Save to {{currentKey}}</span>\r\n </button>\r\n <button mat-menu-item [matMenuTriggerFor]=\"savedNames\">\r\n <span>Choose Profile</span>\r\n </button>\r\n }\r\n }\r\n\r\n <mat-menu #savedNames='matMenu' panelClass='wide-menu'>\r\n <button mat-menu-item clickEmitter #add='clickEmitter'>\r\n <mat-icon>add</mat-icon>\r\n <span>New</span>\r\n </button>\r\n @for (key of stateKeys$ | async; track key) {\r\n <button mat-menu-item (click)='setProfileState(key)'>\r\n <span>{{key}}</span>\r\n <mat-icon color='warn' (click)='deleteProfileState(key)' stop-propagation>delete_forever</mat-icon>\r\n </button>\r\n }\r\n </mat-menu>\r\n <ng-container *opDialog='add'>\r\n <mat-form-field>\r\n <input class=\"add-key\" matInput #addedKey />\r\n </mat-form-field>\r\n <button mat-button (click)='setProfileState(addedKey.value); add.next(false);' [disabled]=\"!addedKey.value\">\r\n Add\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n</ng-container>\r\n", styles: [".wide-menu{width:200px!important}.header-wrapper{display:flex;flex-direction:row;justify-content:space-between;width:100%}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.flat-menu{line-height:initial;height:initial}.pointer{cursor:pointer}.add-key{width:90%}.paginator{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;background-color:#fff;bottom:0;position:sticky;border-top:.5px solid rgba(0,0,0,.12)}\n", ".collapse-icon{font-size:16px;height:16px;color:#3f51b5;align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}\n"], dependencies: [{ kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.PaginatorComponent, selector: "tb-paginator", inputs: ["data$"] }, { kind: "directive", type: i3.LetDirective, selector: "[ngrxLet]", inputs: ["ngrxLet", "ngrxLetSuspenseTpl"] }, { kind: "directive", type: i4.MultiSortDirective, selector: "[multiSort]", inputs: ["matSortDisabled"], exportAs: ["multiSort"] }, { kind: "component", type: i5.GroupByListComponent, selector: "group-by-list" }, { kind: "component", type: i6.FilterChipsComponent, selector: "lib-filter-list" }, { kind: "component", type: i7.GenFilterDisplayerComponent, selector: "tb-filter-displayer" }, { kind: "component", type: i8.GenColDisplayerComponent, selector: "tb-col-displayer" }, { kind: "component", type: i9.SortMenuComponent, selector: "tb-sort-menu" }, { kind: "component", type: i10.GenericTableComponent, selector: "tb-generic-table", inputs: ["trackBy", "displayData$", "data$", "rows", "columnBuilders", "columnInfos"], outputs: ["selection$"] }, { kind: "directive", type: i11.StopPropagationDirective, selector: "[stop-propagation]" }, { kind: "directive", type: i12.ClickEmitterDirective, selector: "[clickEmitter]", exportAs: ["clickEmitter"] }, { kind: "directive", type: i13.DialogDirective, selector: "[opDialog]", inputs: ["opDialogAddDialogClass", "opDialogConfig", "opDialog", "opDialogOrigin"], outputs: ["opDialogClosed"] }, { kind: "ngmodule", type: i14.MatButtonModule }, { kind: "component", type: i14.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i14.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: i15.MatMenuModule }, { kind: "component", type: i15.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i15.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i15.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: i16.MatIconModule }, { kind: "component", type: i16.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: i17.MatTooltipModule }, { kind: "directive", type: i17.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: i18.MatInputModule }, { kind: "directive", type: i18.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i19.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i20.VirtualScrollContainer, selector: "tb-virtual-scroll-container" }], viewProviders: [
|
|
267
|
-
{
|
|
268
|
-
provide: "TABLE_CONTEXT",
|
|
269
|
-
useFactory: (c) => c.context,
|
|
270
|
-
deps: [forwardRef(() => TableContainerComponent)],
|
|
271
|
-
},
|
|
272
|
-
], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
273
|
-
}
|
|
274
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: TableContainerComponent, decorators: [{
|
|
275
|
-
type: Component,
|
|
276
|
-
args: [{ selector: 'tb-table-container', changeDetection: ChangeDetectionStrategy.OnPush, providers: [TableStore, ExportToCsvService, WrapperFilterStore], standalone: true, imports: containerImports, viewProviders: [
|
|
277
|
-
{
|
|
278
|
-
provide: "TABLE_CONTEXT",
|
|
279
|
-
useFactory: (c) => c.context,
|
|
280
|
-
deps: [forwardRef(() => TableContainerComponent)],
|
|
281
|
-
},
|
|
282
|
-
], template: "<ng-content select=\"[before]\" />\r\n\r\n<ng-container multiSort *ngrxLet=\"state.tableSettings$ as tableSettings\">\r\n <div class=\"header-wrapper\">\r\n <div class=\"title\">\r\n @if ((!(collapseHeader$ | async)) || tableSettings.showTitleWhenHeaderCollapsed) {\r\n <ng-content select=\".tb-header-title\"/>\r\n }\r\n @if((state.groupByKeys$ | async)?.length){\r\n <group-by-list />\r\n }\r\n </div>\r\n <div class=\"flx-row-end\">\r\n <lib-filter-list />\r\n @if (!tableSettings.hideHeader) {\r\n @if (!(collapseHeader$ | async)) {\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"/>\r\n <button mat-icon-button color='primary' [matMenuTriggerFor]=\"mainMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n <mat-menu #mainMenu='matMenu'>\r\n <ng-container *ngTemplateOutlet=\"headerMenuExtra\"/>\r\n </mat-menu>\r\n }\r\n @else {\r\n <mat-icon color=\"primary\" [matMenuTriggerFor]=\"mainMenu\" class=\"flat-menu-button pointer\">more_horiz</mat-icon>\r\n <mat-menu #mainMenu='matMenu'>\r\n <div class=\"flex-column\">\r\n <ng-container *ngTemplateOutlet=\"headerMenu\"/>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"headerMenuExtra\"/>\r\n </mat-menu>\r\n }\r\n <mat-icon [matTooltip]=\"(collapseHeader$ | async) ? 'expand' : 'collapse'\" class=\"collapse-icon header\"\r\n (click)=\"state.toggleCollapseHeader()\">\r\n {{(collapseHeader$ | async) ? 'expand_less' : 'expand_more'}}\r\n </mat-icon>\r\n }\r\n\r\n </div>\r\n </div>\r\n <div>\r\n @if(props.useVirtualScroll) {\r\n <tb-virtual-scroll-container>\r\n <tb-generic-table [rows]='customRows' [data$]=\"data\" [displayData$]=\"displayData\"\r\n (selection$)='selection$.emit($event)' [columnInfos]='myColumns$' [trackBy]=\"trackBy\"></tb-generic-table>\r\n </tb-virtual-scroll-container>\r\n }\r\n @else {\r\n <tb-generic-table [rows]='customRows' [data$]=\"data\" [displayData$]=\"displayData\"\r\n (selection$)='selection$.emit($event)' [columnInfos]='myColumns$' [trackBy]=\"trackBy\"></tb-generic-table>\r\n }\r\n @if(props.usePaginator) {\r\n <div class=\"paginator\">\r\n <tb-paginator #tbPaginator [data$]=\"data\" />\r\n\r\n <mat-icon [matTooltip]=\"(collapseFooter$ | async) ? 'expand' : 'collapse'\" class=\"collapse-icon footer\"\r\n (click)=\"state.toggleCollapseFooter()\">\r\n {{(collapseFooter$ | async) ? 'expand_more' : 'expand_less'}}\r\n </mat-icon>\r\n </div>\r\n }\r\n </div>\r\n\r\n\r\n\r\n <ng-template #headerMenu>\r\n @if (!tableSettings.hideFilter) {<tb-filter-displayer/>}\r\n @if (!tableSettings.hideColumnSettings) {<tb-col-displayer/>}\r\n @if (!tableSettings.hideSort) {<tb-sort-menu/>}\r\n </ng-template>\r\n\r\n <ng-template #headerMenuExtra>\r\n <button mat-menu-item (click)=\"resetState()\">\r\n <mat-icon color=\"primary\">autorenew</mat-icon>\r\n <span>Reset table</span>\r\n </button>\r\n @if (!tableSettings.hideExport) {\r\n <button mat-menu-item (click)=\"exportToCsv()\">\r\n <mat-icon color=\"primary\">file_download</mat-icon>\r\n <span>Export Table</span>\r\n </button>\r\n }\r\n @if (currentStateKey$ | async; as currentKey) {\r\n @if (tableId) {\r\n <button mat-menu-item (click)=\"saveState()\">\r\n <mat-icon color=\"primary\">save</mat-icon>\r\n <span>Save to {{currentKey}}</span>\r\n </button>\r\n <button mat-menu-item [matMenuTriggerFor]=\"savedNames\">\r\n <span>Choose Profile</span>\r\n </button>\r\n }\r\n }\r\n\r\n <mat-menu #savedNames='matMenu' panelClass='wide-menu'>\r\n <button mat-menu-item clickEmitter #add='clickEmitter'>\r\n <mat-icon>add</mat-icon>\r\n <span>New</span>\r\n </button>\r\n @for (key of stateKeys$ | async; track key) {\r\n <button mat-menu-item (click)='setProfileState(key)'>\r\n <span>{{key}}</span>\r\n <mat-icon color='warn' (click)='deleteProfileState(key)' stop-propagation>delete_forever</mat-icon>\r\n </button>\r\n }\r\n </mat-menu>\r\n <ng-container *opDialog='add'>\r\n <mat-form-field>\r\n <input class=\"add-key\" matInput #addedKey />\r\n </mat-form-field>\r\n <button mat-button (click)='setProfileState(addedKey.value); add.next(false);' [disabled]=\"!addedKey.value\">\r\n Add\r\n </button>\r\n </ng-container>\r\n </ng-template>\r\n</ng-container>\r\n", styles: [".wide-menu{width:200px!important}.header-wrapper{display:flex;flex-direction:row;justify-content:space-between;width:100%}.flx-row-end{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.flat-menu{line-height:initial;height:initial}.pointer{cursor:pointer}.add-key{width:90%}.paginator{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;background-color:#fff;bottom:0;position:sticky;border-top:.5px solid rgba(0,0,0,.12)}\n", ".collapse-icon{font-size:16px;height:16px;color:#3f51b5;align-self:flex-start}.collapse-icon:hover{cursor:pointer}.hide{display:none}\n"] }]
|
|
283
|
-
}], propDecorators: { indexColumn: [{
|
|
284
|
-
type: Input
|
|
285
|
-
}], selectionColumn: [{
|
|
286
|
-
type: Input
|
|
287
|
-
}], isSticky: [{
|
|
288
|
-
type: Input
|
|
289
|
-
}], stickyFooter: [{
|
|
290
|
-
type: Input
|
|
291
|
-
}], pageSize: [{
|
|
292
|
-
type: Input
|
|
293
|
-
}], groupHeaderTemplate: [{
|
|
294
|
-
type: Input
|
|
295
|
-
}], usePaginator: [{
|
|
296
|
-
type: Input
|
|
297
|
-
}], itemHeight: [{
|
|
298
|
-
type: Input
|
|
299
|
-
}], headerOffset: [{
|
|
300
|
-
type: Input
|
|
301
|
-
}], useVirtualScroll: [{
|
|
302
|
-
type: Input
|
|
303
|
-
}], paginatorComponent: [{
|
|
304
|
-
type: ViewChild,
|
|
305
|
-
args: [PaginatorComponent]
|
|
306
|
-
}], customFilterDirectives: [{
|
|
307
|
-
type: ContentChildren,
|
|
308
|
-
args: [TableCustomFilterDirective, { descendants: true }]
|
|
309
|
-
}], filterDirectives: [{
|
|
310
|
-
type: ContentChildren,
|
|
311
|
-
args: [TableFilterDirective, { descendants: true }]
|
|
312
|
-
}], customRows: [{
|
|
313
|
-
type: ContentChildren,
|
|
314
|
-
args: [MatRowDef]
|
|
315
|
-
}], customCells: [{
|
|
316
|
-
type: ContentChildren,
|
|
317
|
-
args: [CustomCellDirective]
|
|
318
|
-
}], tableId: [{
|
|
319
|
-
type: Input
|
|
320
|
-
}], tableBuilder: [{
|
|
321
|
-
type: Input
|
|
322
|
-
}], trackBy: [{
|
|
323
|
-
type: Input
|
|
324
|
-
}], inputFilters: [{
|
|
325
|
-
type: Input
|
|
326
|
-
}], selection$: [{
|
|
327
|
-
type: Output
|
|
328
|
-
}], data: [{
|
|
329
|
-
type: Output
|
|
330
|
-
}], onStateReset: [{
|
|
331
|
-
type: Output
|
|
332
|
-
}], onSaveState: [{
|
|
333
|
-
type: Output
|
|
334
|
-
}], state$: [{
|
|
335
|
-
type: Output
|
|
336
|
-
}] } });
|
|
337
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci11dGlsaXRpZXMvc3JjL3RhYmxlLWJ1aWxkZXIvY29tcG9uZW50cy90YWJsZS1jb250YWluZXIvdGFibGUtY29udGFpbmVyLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci11dGlsaXRpZXMvc3JjL3RhYmxlLWJ1aWxkZXIvY29tcG9uZW50cy90YWJsZS1jb250YWluZXIvdGFibGUtY29udGFpbmVyLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLE1BQU0sRUFDTixlQUFlLEVBRWYsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxNQUFNLEVBRU4sVUFBVSxHQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQWMsSUFBSSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNGLE9BQU8sRUFBbUIsU0FBUyxFQUFZLE1BQU0sNkJBQTZCLENBQUM7QUFDbkYsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5SSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLDBCQUEwQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekcsT0FBTyxFQUFHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxN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dUJBQUMsa0JBQWtCO2dCQUVxQyxzQkFBc0I7c0JBQXZGLGVBQWU7dUJBQUMsMEJBQTBCLEVBQUUsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFDO2dCQUNKLGdCQUFnQjtzQkFBM0UsZUFBZTt1QkFBQyxvQkFBb0IsRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUM7Z0JBQzlCLFVBQVU7c0JBQXJDLGVBQWU7dUJBQUMsU0FBUztnQkFDWSxXQUFXO3NCQUFoRCxlQUFlO3VCQUFDLG1CQUFtQjtnQkFFM0IsT0FBTztzQkFBZixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTTtnQkFRRyxJQUFJO3NCQUFiLE1BQU07Z0JBSUcsWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPdXRwdXQsXHJcbiAgQ29udGVudENoaWxkcmVuLFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBQcmVkaWNhdGUsXHJcbiAgVmlld0NoaWxkLFxyXG4gIGluamVjdCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBmb3J3YXJkUmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGZyb20sIFJlcGxheVN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEFycmF5QWRkaXRpb25hbCwgRmllbGRUeXBlLCBNZXRhRGF0YSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LWRlZic7XHJcbmltcG9ydCB7IGZpcnN0LCBsYXN0LCBtYXAsIHRhcCwgd2l0aExhdGVzdEZyb20sIG1lcmdlQWxsLCBzY2FuLCBzd2l0Y2hBbGwsIHN0YXJ0V2l0aCwgdGltZXN0YW1wLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVGFibGVCdWlsZGVyIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy90YWJsZS1idWlsZGVyJztcclxuaW1wb3J0IHsgTWF0Um93RGVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBDdXN0b21DZWxsRGlyZWN0aXZlLCBUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZSwgVGFibGVGaWx0ZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzJztcclxuaW1wb3J0IHsgIHN0YXRlSXMsIFRhYmxlU3RvcmUgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3RhYmxlLXN0b3JlJztcclxuaW1wb3J0IHsgbWFwQXJyYXksIG5vdE51bGwgfSBmcm9tICcuLi8uLi8uLi9yeGpzL3J4anMtb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRXhwb3J0VG9Dc3ZTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXhwb3J0LXRvLWNzdi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXJyYXlEZWZhdWx0cyB9IGZyb20gJy4uLy4uL2NsYXNzZXMvRGVmYXVsdFNldHRpbmdzJztcclxuaW1wb3J0IHsgVGFibGVCdWlsZGVyQ29uZmlnVG9rZW4gfSBmcm9tICcuLi8uLi9jbGFzc2VzL1RhYmxlQnVpbGRlckNvbmZpZyc7XHJcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU3RhdGUsIFRhYmxlU3RhdGUgfSBmcm9tICcuLi8uLi9jbGFzc2VzL1RhYmxlU3RhdGUnO1xyXG5pbXBvcnQgeyBmaWx0ZXJEYXRhLCBzb3J0RGF0YSwgdGJOb1Nob3dTeW1ib2wgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvc29ydC1kYXRhLWZ1bmN0aW9uJztcclxuaW1wb3J0IHsgV3JhcHBlckZpbHRlclN0b3JlIH0gZnJvbSAnLi4vdGFibGUtY29udGFpbmVyLWZpbHRlci90YWJsZS13cmFwcGVyLWZpbHRlci1zdG9yZSc7XHJcbmltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7IENvbHVtbkluZm8gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0NvbHVtbkluZm8nO1xyXG5pbXBvcnQgeyBkZWZhdWx0U2hhcmVSZXBsYXkgfSBmcm9tICcuLi8uLi8uLi9yeGpzJztcclxuaW1wb3J0IHsgY3JlYXRlRmlsdGVyRnVuYywgaXNDdXN0b21GaWx0ZXIsIGlzRmlsdGVySW5mbyB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZmlsdGVyLWluZm8nO1xyXG5pbXBvcnQgeyBEaWN0aW9uYXJ5IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9kaWN0aW9uYXJ5JztcclxuaW1wb3J0IHsgVGFibGVXcmFwcGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy90YWJsZS13cmFwcGVyLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IGNyZWF0ZUxpbmtDcmVhdG9yIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbGluay1jcmVhdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUYWJsZUJ1aWxkZXJTdGF0ZVN0b3JlIH0gZnJvbSAnLi4vLi4vbmdyeC90YWJsZUJ1aWxkZXJTdGF0ZVN0b3JlJztcclxuaW1wb3J0IHsgY29udGFpbmVySW1wb3J0cyB9IGZyb20gJy4vdGFibGUtY29udGFpbmVyLWltcG9ydHMnO1xyXG5pbXBvcnQgeyBpbml0aWFsRmlsdGVyU3RhdGUsIHByZWRpY2F0ZUFuZEZpbHRlckluZm9zLCB1cGRhdGVGaWx0ZXJTdGF0ZSB9IGZyb20gJy4vdGFibGUtY29udGFpbmVyLmhlbHBlcnMvZmlsdGVyLXN0YXRlLmhlbHBlcnMnO1xyXG5pbXBvcnQgeyBpbml0aWFsU29ydFN0YXRlLCB1cGRhdGVTb3J0U3RhdGUgfSBmcm9tICcuL3RhYmxlLWNvbnRhaW5lci5oZWxwZXJzL3NvcnQtc3RhdGUuaGVscGVycyc7XHJcbmltcG9ydCB7IGluaXRpYWxHcm91cEJ5U3RhdGUsIHVwZGF0ZUdyb3VwQnlTdGF0ZSB9IGZyb20gJy4vdGFibGUtY29udGFpbmVyLmhlbHBlcnMvZ3JvdXBCeS5oZWxwZXJzJztcclxuaW1wb3J0IHsgaW5pdGlhbERhdGFTdGF0ZSB9IGZyb20gJy4vdGFibGUtY29udGFpbmVyLmhlbHBlcnMvZGF0YS1zdGF0ZS5oZWxwZXJzJztcclxuaW1wb3J0IHsgdGFibGVQcm9wcywgZGVmYXVsdFByb3BzIH0gZnJvbSAnLi90YWJsZVByb3BzJztcclxuaW1wb3J0IHsgVGFibGVDb250ZXh0IH0gZnJvbSAnLi4vdGFibGUtY29udGV4dCc7XHJcbmltcG9ydCB7IFRhYmxlVmlydHVhbFNjcm9sbFN0cmF0ZWd5IH0gZnJvbSAnLi4vc2Nyb2xsLXN0cmF0ZWd5JztcclxuaW1wb3J0IHsgUGFnaW5hdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vZ2VuZXJpYy10YWJsZS9wYWdpbmF0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGFibGVCdWlsZGVyRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvVGFibGVCdWlsZGVyRGF0YVNvdXJjZSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0Yi10YWJsZS1jb250YWluZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS1jb250YWluZXIuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUtY29udGFpbmVyLmNzcycsJy4uLy4uL3N0eWxlcy9jb2xsYXBzZXIuc3R5bGVzLnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBwcm92aWRlcnM6IFtUYWJsZVN0b3JlLCBFeHBvcnRUb0NzdlNlcnZpY2UsIFdyYXBwZXJGaWx0ZXJTdG9yZV0sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBjb250YWluZXJJbXBvcnRzLFxyXG4gIHZpZXdQcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogXCJUQUJMRV9DT05URVhUXCIsXHJcbiAgICAgIHVzZUZhY3Rvcnk6IChjOiBUYWJsZUNvbnRhaW5lckNvbXBvbmVudCkgPT4gYy5jb250ZXh0LFxyXG4gICAgIGRlcHM6IFtmb3J3YXJkUmVmKCgpID0+IFRhYmxlQ29udGFpbmVyQ29tcG9uZW50KV0sXHJcbiAgICB9LFxyXG4gIF1cclxufSkgZXhwb3J0IGNsYXNzIFRhYmxlQ29udGFpbmVyQ29tcG9uZW50PFQgPSBhbnk+IHtcclxuICBwcm9wczogdGFibGVQcm9wcyA9IGRlZmF1bHRQcm9wcztcclxuXHJcbiAgY29udGV4dDogVGFibGVDb250ZXh0PFQ+ID0ge1xyXG4gICAgdGFibGVQcm9wczogdGhpcy5wcm9wcyxcclxuICAgIHNjcm9sbFN0cmF0ZWd5OiBuZXcgVGFibGVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3koNDgsNTYpLFxyXG4gIH07XHJcblxyXG4gIEBJbnB1dCgpIHNldCBpbmRleENvbHVtbih2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMucHJvcHMuaW5kZXhDb2x1bW4gPSB2YWw7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHNldCBzZWxlY3Rpb25Db2x1bW4odmFsOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnByb3BzLnNlbGVjdGlvbkNvbHVtbiA9IHZhbDtcclxuICB9XHJcbiAgQElucHV0KCkgc2V0IGlzU3RpY2t5KHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5wcm9wcy5pc1N0aWNreSA9IHZhbDtcclxuICB9XHJcbiAgQElucHV0KCkgc2V0IHN0aWNreUZvb3Rlcih2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMucHJvcHMuc3RpY2t5Rm9vdGVyID0gdmFsO1xyXG4gIH1cclxuICBASW5wdXQoKSBzZXQgcGFnZVNpemUodmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5zdGF0ZS5zZXRQYWdlU2l6ZSh2YWx1ZSk7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHNldCBncm91cEhlYWRlclRlbXBsYXRlKCB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55Pikge1xyXG4gICAgdGhpcy5wcm9wcy5ncm91cEhlYWRlclRlbXBsYXRlID0gdGVtcGxhdGU7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHNldCB1c2VQYWdpbmF0b3IodmFsOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnByb3BzLnVzZVBhZ2luYXRvciA9IHZhbDtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCBpdGVtSGVpZ2h0KHZhbDogbnVtYmVyKSB7XHJcbiAgICAgdGhpcy5jb250ZXh0LnNjcm9sbFN0cmF0ZWd5LnNldEl0ZW1IZWlnaHQodmFsKTtcclxuICB9XHJcbiAgQElucHV0KCkgc2V0IGhlYWRlck9mZnNldCh2YWw6IG51bWJlcikge1xyXG4gICAgdGhpcy5jb250ZXh0LnNjcm9sbFN0cmF0ZWd5LnNldEhlYWRlck9mZnNldCh2YWwpO1xyXG4gIH1cclxuICBASW5wdXQoKSBzZXQgdXNlVmlydHVhbFNjcm9sbCh2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMucHJvcHMudXNlVmlydHVhbFNjcm9sbCA9IHZhbDtcclxuICB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoUGFnaW5hdG9yQ29tcG9uZW50KSAgcGFnaW5hdG9yQ29tcG9uZW50PzogUGFnaW5hdG9yQ29tcG9uZW50O1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKFRhYmxlQ3VzdG9tRmlsdGVyRGlyZWN0aXZlLCB7ZGVzY2VuZGFudHM6IHRydWV9KSBjdXN0b21GaWx0ZXJEaXJlY3RpdmVzITogUXVlcnlMaXN0PFRhYmxlQ3VzdG9tRmlsdGVyRGlyZWN0aXZlPjtcclxuICBAQ29udGVudENoaWxkcmVuKFRhYmxlRmlsdGVyRGlyZWN0aXZlLCB7ZGVzY2VuZGFudHM6IHRydWV9KSBmaWx0ZXJEaXJlY3RpdmVzITogUXVlcnlMaXN0PFRhYmxlRmlsdGVyRGlyZWN0aXZlPjtcclxuICBAQ29udGVudENoaWxkcmVuKE1hdFJvd0RlZikgY3VzdG9tUm93cyE6IFF1ZXJ5TGlzdDxNYXRSb3dEZWY8YW55Pj47XHJcbiAgQENvbnRlbnRDaGlsZHJlbihDdXN0b21DZWxsRGlyZWN0aXZlKSBjdXN0b21DZWxscyE6IFF1ZXJ5TGlzdDxDdXN0b21DZWxsRGlyZWN0aXZlPjtcclxuXHJcbiAgQElucHV0KCkgdGFibGVJZCE6IHN0cmluZztcclxuICBASW5wdXQoKSB0YWJsZUJ1aWxkZXIhOiBUYWJsZUJ1aWxkZXI7XHJcbiAgQElucHV0KCkgdHJhY2tCeSE6IHN0cmluZztcclxuICBASW5wdXQoKSBpbnB1dEZpbHRlcnM/OiBPYnNlcnZhYmxlPEFycmF5PFByZWRpY2F0ZTxUPj4+O1xyXG5cclxuICBAT3V0cHV0KCkgc2VsZWN0aW9uJCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBkaXNwbGF5RGF0YVN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxPYnNlcnZhYmxlPFRbXT4+KDEpO1xyXG4gIGRpc3BsYXlEYXRhID0gdGhpcy5kaXNwbGF5RGF0YVN1YmplY3QucGlwZShcclxuICAgIHN3aXRjaEFsbCgpLFxyXG4gICAgZGVmYXVsdFNoYXJlUmVwbGF5KCksXHJcbiAgKTtcclxuXHJcbiAgZGF0YVN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxPYnNlcnZhYmxlPFRbXT4+KDEpO1xyXG4gIEBPdXRwdXQoKSBkYXRhID0gdGhpcy5kYXRhU3ViamVjdC5waXBlKFxyXG4gICAgc3dpdGNoQWxsKCksXHJcbiAgICBkZWZhdWx0U2hhcmVSZXBsYXkoKSxcclxuICApO1xyXG4gIEBPdXRwdXQoKSBvblN0YXRlUmVzZXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG9uU2F2ZVN0YXRlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIHN0YXRlID0gaW5qZWN0KFRhYmxlU3RvcmUpO1xyXG4gIEBPdXRwdXQoKSBzdGF0ZSQgPSB0aGlzLnN0YXRlLmdldFNhdmFibGVTdGF0ZSgpLnBpcGUoXHJcbiAgICBtYXAoc3RhdGUgPT4gY2xvbmVEZWVwKHN0YXRlKSksXHJcbiAgICBkZWZhdWx0U2hhcmVSZXBsYXkoKSxcclxuICApO1xyXG5cclxuICBjb2xsYXBzZUZvb3RlciQgPSB0aGlzLnN0YXRlLnN0YXRlJC5waXBlKG1hcChzdGF0ZSA9PiBzdGF0ZS5wZXJzaXN0ZWRUYWJsZVNldHRpbmdzLmNvbGxhcHNlRm9vdGVyKSk7XHJcblxyXG4gIG15Q29sdW1ucyQhOiBPYnNlcnZhYmxlPENvbHVtbkluZm9bXT47XHJcbiAgc3RhdGVLZXlzJD86IE9ic2VydmFibGU8c3RyaW5nW10gfCBudWxsPjtcclxuICBjdXJyZW50U3RhdGVLZXkkPzogT2JzZXJ2YWJsZTxzdHJpbmc+O1xyXG5cclxuICBjb25maWcgPSBpbmplY3QoVGFibGVCdWlsZGVyQ29uZmlnVG9rZW4pO1xyXG4gIGV4cG9ydFRvQ3N2U2VydmljZSA9IGluamVjdChFeHBvcnRUb0NzdlNlcnZpY2U8VD4pO1xyXG4gIHdyYXBwZXIgPSBpbmplY3QoVGFibGVXcmFwcGVyRGlyZWN0aXZlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xyXG4gIHN0b3JlID0gaW5qZWN0KFRhYmxlQnVpbGRlclN0YXRlU3RvcmUpO1xyXG4gIF8gPSB0aGlzLnN0YXRlLm9uKCB0aGlzLnN0YXRlLmdldFNhdmFibGVTdGF0ZSgpLnBpcGUobGFzdCgpKSwgZmluYWxTdGF0ZSA9PiB7XHJcbiAgICBpZih0aGlzLnRhYmxlSWQpIHtcclxuICAgICAgdGhpcy5zdG9yZS5zZXRMb2NhbFByb2ZpbGUoe2tleTp0aGlzLnRhYmxlSWQsdmFsdWU6IGZpbmFsU3RhdGV9KTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcblxyXG4gIGZpcnN0UGFnZSgpOiB2b2lkIHtcclxuICAgdGhpcy5wYWdpbmF0b3JDb21wb25lbnQ/LnBhZ2luYXRvcj8uZmlyc3RQYWdlKCk7XHJcbiAgfVxyXG5cclxuICBsYXN0UGFnZSgpOiB2b2lkIHtcclxuICAgdGhpcy5wYWdpbmF0b3JDb21wb25lbnQ/LnBhZ2luYXRvcj8ubGFzdFBhZ2UoKTtcclxuICB9XHJcblxyXG4gIHJlc2V0U3RhdGUoKSB7XHJcbiAgICB0aGlzLmN1c3RvbUZpbHRlckRpcmVjdGl2ZXMuZm9yRWFjaCggY2YgPT4gY2YucmVzZXQoKSk7XHJcbiAgICB0aGlzLmZpbHRlckRpcmVjdGl2ZXMuZm9yRWFjaCggY2YgPT4gY2YucmVzZXQoKSApO1xyXG4gICAgdGhpcy5zdGF0ZS5yZXNldFN0YXRlKCk7XHJcbiAgICB0aGlzLm9uU3RhdGVSZXNldC5uZXh0KG51bGwpXHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplU3RhdGUoKSB7XHJcbiAgICB0aGlzLnN0YXRlLnNldFRhYmxlU2V0dGluZ3ModGhpcy50YWJsZUJ1aWxkZXIuc2V0dGluZ3MpO1xyXG4gICAgdGhpcy5zdGF0ZS5ydW5PbmNlV2hlbihcclxuICAgICAgc3RhdGVJcyhJbml0aWFsaXphdGlvblN0YXRlLk1ldGFEYXRhTG9hZGVkKSxcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIGlmKHRoaXMudGFibGVJZCkge1xyXG4gICAgICAgICAgY29uc3QgcGVyc2lzdGVkU3RhdGUkID0gdGhpcy5zdG9yZS5zZWxlY3RMb2NhbFByb2ZpbGVTdGF0ZSh0aGlzLnRhYmxlSWQpLnBpcGUoXHJcbiAgICAgICAgICAgIHRhcCggcGVyc2lzdGVkU3RhdGUgPT4ge1xyXG4gICAgICAgICAgICAgIGlmKCFwZXJzaXN0ZWRTdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5zZXRJbml0aWFsaXphdGlvblN0YXRlKEluaXRpYWxpemF0aW9uU3RhdGUuTG9hZGVkRnJvbVN0b3JlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBub3ROdWxsKCksXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5zdGF0ZS51cGRhdGVTdGF0ZUZyb21QZXJzaXN0ZWRTdGF0ZShwZXJzaXN0ZWRTdGF0ZSQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXRlLnNldEluaXRpYWxpemF0aW9uU3RhdGUoSW5pdGlhbGl6YXRpb25TdGF0ZS5Mb2FkZWRGcm9tU3RvcmUpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBjdXN0b21GaWx0ZXJzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UHJlZGljYXRlPFQ+W10+KFtdKTtcclxuICBpbml0aWFsaXplRGF0YSgpIHtcclxuXHJcbiAgICBjb25zdCBwcmVkaWNhdGVGaWx0ZXJzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuaW5wdXRGaWx0ZXJzPy5waXBlKHN0YXJ0V2l0aChbXSkpID8/IG9mKFtdIGFzIFByZWRpY2F0ZTxUPltdKSwgdGhpcy5jdXN0b21GaWx0ZXJzJF0pXHJcbiAgICAgIC5waXBlKG1hcCgoW2EsIGJdKSA9PiBbLi4uYSwgLi4uYl0pKTtcclxuXHJcbiAgICBjb25zdCBmaWx0ZXJTdGF0ZSQgPSBwcmVkaWNhdGVBbmRGaWx0ZXJJbmZvcyh0aGlzLnN0YXRlLmZpbHRlcnMkLCBwcmVkaWNhdGVGaWx0ZXJzJCkucGlwZShcclxuICAgICAgc2Nhbih1cGRhdGVGaWx0ZXJTdGF0ZSwgaW5pdGlhbEZpbHRlclN0YXRlKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBzb3J0c1N0YXRlJCA9IHRoaXMuc3RhdGUuc29ydCQucGlwZShzY2FuKHVwZGF0ZVNvcnRTdGF0ZSwgaW5pdGlhbFNvcnRTdGF0ZSkpO1xyXG5cclxuICAgIGNvbnN0IHNvcnRlZEFuZEZpbHRlcmVkRGF0YSQgPSBjb21iaW5lTGF0ZXN0KFtcclxuICAgICAgdGhpcy50YWJsZUJ1aWxkZXIuZ2V0RGF0YSQoKS5waXBlKHRpbWVzdGFtcCgpKSxcclxuICAgICAgc29ydHNTdGF0ZSQucGlwZSh0aW1lc3RhbXAoKSksXHJcbiAgICAgIGZpbHRlclN0YXRlJC5waXBlKHRpbWVzdGFtcCgpKVxyXG4gICAgXSkucGlwZShzY2FuKCh7IG1hcHBlZERhdGE6IHJlc3VsdERhdGEgfSwgW2RhdGEsIHNvcnQsIGZdLCBpbmRleCk9PiB7XHJcblxyXG4gICAgICBpZihpbmRleCA9PT0gMCB8fCAoZGF0YS50aW1lc3RhbXAgPiBzb3J0LnRpbWVzdGFtcCAmJiBkYXRhLnRpbWVzdGFtcCA+IGYudGltZXN0YW1wKSl7XHJcbiAgICAgICAgcmV0dXJuICh7IG1hcHBlZERhdGE6IGZpbHRlckRhdGEoc29ydERhdGEoZGF0YS52YWx1ZSAsIHNvcnQudmFsdWUuc29ydHNUb1J1biApLCBmLnZhbHVlLmFsbEZpbHRlcnMpfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmKHNvcnQudGltZXN0YW1wID4gZi50aW1lc3RhbXApe1xyXG4gICAgICAgIHJldHVybiAoeyBtYXBwZWREYXRhOiBzb3J0RGF0YShyZXN1bHREYXRhLCBzb3J0LnZhbHVlLnNvcnRzVG9SdW4pfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiAoeyBtYXBwZWREYXRhOiBmaWx0ZXJEYXRhKHJlc3VsdERhdGEsIGYudmFsdWUub25seUFkZGVkRmlsdGVycyB8fCBmLnZhbHVlLmFsbEZpbHRlcnMsICFmLnZhbHVlLm9ubHlBZGRlZEZpbHRlcnMpfSk7XHJcbiAgICB9LCBpbml0aWFsRGF0YVN0YXRlKSkucGlwZShcclxuICAgICAgbWFwKCh7IG1hcHBlZERhdGE6IHJlc3VsdERhdGEgfSkgPT4gcmVzdWx0RGF0YS5maWx0ZXIoaXRlbSA9PiAhaXRlbVt0Yk5vU2hvd1N5bWJvbF0pKSxcclxuICAgICAgZGVmYXVsdFNoYXJlUmVwbGF5KClcclxuICAgICAgKVxyXG5cclxuICAgIGNvbnN0IGZsYXRHcm91cGVkJCA9IGNvbWJpbmVMYXRlc3QoW3NvcnRlZEFuZEZpbHRlcmVkRGF0YSQucGlwZSh0aW1lc3RhbXAoKSksIHRoaXMuc3RhdGUuZ3JvdXBCeUtleXMkLnBpcGUodGltZXN0YW1wKCkpLCB0aGlzLnN0YXRlLmV4cGFuZGVkR3JvdXBzJC5waXBlKHRpbWVzdGFtcCgpKV0pLnBpcGUoXHJcbiAgICAgIHNjYW4odXBkYXRlR3JvdXBCeVN0YXRlLCBpbml0aWFsR3JvdXBCeVN0YXRlKSxcclxuICAgICAgbWFwKCh7ZGlzcGxheURhdGF9KSA9PiBkaXNwbGF5RGF0YSksXHJcbiAgICAgIGRlZmF1bHRTaGFyZVJlcGxheSgpXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuZGlzcGxheURhdGFTdWJqZWN0Lm5leHQoZmxhdEdyb3VwZWQkKTtcclxuICAgIHRoaXMuZGF0YVN1YmplY3QubmV4dChzb3J0ZWRBbmRGaWx0ZXJlZERhdGEkKTtcclxuXHJcbiAgICB0aGlzLnN0YXRlLm9uKHRoaXMuZGlzcGxheURhdGEsIChkYXRhKSA9PiB7XHJcbiAgICAgIHRoaXMuc3RhdGUudXBkYXRlU3RhdGUoe2RhdGFMZW46IGRhdGEubGVuZ3RofSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBjb25zdCBkcyA9IG5ldyBUYWJsZUJ1aWxkZXJEYXRhU291cmNlPFQ+KFxyXG4gICAgICB0aGlzLmRpc3BsYXlEYXRhLFxyXG4gICAgICB0aGlzLnN0YXRlLFxyXG4gICAgICB0aGlzLmNvbnRleHQsXHJcbiAgICApO1xyXG4gICAgdGhpcy5jb250ZXh0LmRhdGFTb3VyY2UgPSBkcztcclxuICAgIHRoaXMuaW5pdGlhbGl6ZVN0YXRlKCk7XHJcbiAgICB0aGlzLmluaXRpYWxpemVEYXRhKCk7XHJcblxyXG4gICAgaWYodGhpcy50YWJsZUlkKSB7XHJcbiAgICAgIHRoaXMuc3RhdGVLZXlzJCA9IHRoaXMuc3RvcmUuc2VsZWN0TG9jYWxQcm9maWxlS2V5cyh0aGlzLnRhYmxlSWQpO1xyXG4gICAgICB0aGlzLmN1cnJlbnRTdGF0ZUtleSQgPSB0aGlzLnN0b3JlLnNlbGVjdExvY2FsUHJvZmlsZUN1cnJlbnRLZXkodGhpcy50YWJsZUlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydFRvQ3N2KCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc29ydGVkID0gdGhpcy5kYXRhLnBpcGUoXHJcbiAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RhdGUuc29ydCQpLFxyXG4gICAgICBtYXAoKFtkYXRhLCBzb3J0ZWRdKSA9PiBzb3J0RGF0YShkYXRhLCBzb3J0ZWQpKVxyXG4gICAgKTtcclxuICAgIHRoaXMuZXhwb3J0VG9Dc3ZTZXJ2aWNlLmV4cG9ydFRvQ3N2KHNvcnRlZCk7XHJcbiAgfVxyXG5cclxuICBzYXZlU3RhdGUoKSB7XHJcbiAgICB0aGlzLnN0YXRlLmdldFNhdmFibGVTdGF0ZSgpLnBpcGUoXHJcbiAgICAgIGZpcnN0KClcclxuICAgICkuc3Vic2NyaWJlKHRhYmxlU3RhdGUgPT4ge1xyXG4gICAgICB0aGlzLm9uU2F2ZVN0YXRlLm5leHQobnVsbCk7XHJcbiAgICAgIHRoaXMuc3RvcmUuc2F2ZUxvY2FsUHJvZmlsZSh7IGtleTogdGhpcy50YWJsZUlkLCB2YWx1ZTp0YWJsZVN0YXRlLCBwZXJzaXN0OiB0cnVlfSApO1xyXG4gICAgICB0aGlzLnN0b3JlLnNldExvY2FsUHJvZmlsZSh7IGtleTogdGhpcy50YWJsZUlkLCB2YWx1ZTp0YWJsZVN0YXRlIH0gKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UHJvZmlsZVN0YXRlKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnN0b3JlLnNldExvY2FsUHJvZmlsZXNTdGF0ZSh7a2V5OnRoaXMudGFibGVJZCwgY3VycmVudDogdmFsfSk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVQcm9maWxlU3RhdGUoc3RhdGVLZXk6IHN0cmluZykge1xyXG4gICAgdGhpcy5zdG9yZS5kZWxldGVMb2NhbFByb2ZpbGUoe2tleTp0aGlzLnRhYmxlSWQsIHN0YXRlS2V5fSk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICB0aGlzLmluaXRpYWxpemVDb2x1bW5zKCk7XHJcbiAgICB0aGlzLnN0YXRlLnJ1bk9uY2VXaGVuKFxyXG4gICAgICBzdGF0ZUlzKEluaXRpYWxpemF0aW9uU3RhdGUuTG9hZGVkRnJvbVN0b3JlKSxcclxuICAgICAgc3RhdGUgPT4ge1xyXG4gICAgICAgIHRoaXMuYWRkRmlsdGVyRGlyZWN0aXZlcyhzdGF0ZSk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZS51cGRhdGVTdGF0ZSh7aW5pdGlhbGl6YXRpb25TdGF0ZTogSW5pdGlhbGl6YXRpb25TdGF0ZS5SZWFkeX0pO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVDb2x1bW5zKCkge1xyXG4gICAgY29uc3QgY3VzdG9tQ2VsbE1hcCA9IG5ldyBNYXAodGhpcy5jdXN0b21DZWxscy5tYXAoY2MgPT4gW2NjLmN1c3RvbUNlbGwsY2NdKSk7XHJcbiAgICB0aGlzLnN0YXRlLnNldE1ldGFEYXRhKHRoaXMudGFibGVCdWlsZGVyLm1ldGFEYXRhJCEucGlwZShcclxuICAgICAgbWFwKChtZHMpID0+IHtcclxuICAgICAgICBtZHMgPSBtZHMubWFwKHRoaXMubWFwTWV0YURhdGFzKTtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgLi4ubWRzLFxyXG4gICAgICAgICAgLi4udGhpcy5jdXN0b21DZWxscy5tYXAoIGNjID0+IGNjLmdldE1ldGFEYXRhKG1kcy5maW5kKCBpdGVtID0+IGl0ZW0ua2V5ID09PSBjYy5jdXN0b21DZWxsICkpIClcclxuICAgICAgICBdXHJcbiAgICAgIH0pXHJcbiAgICApKTtcclxuICAgIHRoaXMuc3RhdGUuc2V0TGlua01hcHModGhpcy50YWJsZUJ1aWxkZXIubWV0YURhdGEkIS5waXBlKFxyXG4gICAgICBtYXAoKG1kcykgPT4ge1xyXG4gICAgICAgIHJldHVybiBtZHMucmVkdWNlKChhY2MsIG1kKSA9PiB7XHJcbiAgICAgICAgICBpZihtZC5maWVsZFR5cGUgPT09IEZpZWxkVHlwZS5MaW5rKXsgYWNjW21kLmtleV09IGNyZWF0ZUxpbmtDcmVhdG9yKG1kKX1cclxuICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgfSx7fSlcclxuICAgICAgfSlcclxuICAgICkpXHJcblxyXG4gICAgdGhpcy5teUNvbHVtbnMkID0gdGhpcy5zdGF0ZS5tZXRhRGF0YUFycmF5JC5waXBlKFxyXG4gICAgICBtYXBBcnJheSggbWV0YURhdGEgPT4gKHttZXRhRGF0YSwgY3VzdG9tQ2VsbDogY3VzdG9tQ2VsbE1hcC5nZXQobWV0YURhdGEua2V5KSF9KSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBtYXBNZXRhRGF0YXMgPSAobWV0YSA6IE1ldGFEYXRhPFQ+KSA9PiB7XHJcbiAgICBpZihtZXRhLmZpZWxkVHlwZSA9PT0gRmllbGRUeXBlLkFycmF5KXtcclxuICAgICAgY29uc3QgYWRkaXRpb25hbCA9IHsuLi5tZXRhLmFkZGl0aW9uYWx9IGFzIEFycmF5QWRkaXRpb25hbDtcclxuICAgICAgYWRkaXRpb25hbC5hcnJheVN0eWxlID0gYWRkaXRpb25hbD8uYXJyYXlTdHlsZSA/PyBBcnJheURlZmF1bHRzLmFycmF5U3R5bGU7XHJcbiAgICAgIGFkZGl0aW9uYWwubGltaXQgPSBhZGRpdGlvbmFsLmxpbWl0ID8/IHRoaXMuY29uZmlnLmFycmF5SW5mbz8ubGltaXQgPz8gQXJyYXlEZWZhdWx0cy5saW1pdDtcclxuICAgICAgcmV0dXJuIHsuLi5tZXRhLGFkZGl0aW9uYWx9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWV0YTtcclxuICB9XHJcblxyXG4gIGNvbGxhcHNlSGVhZGVyJCA9IHRoaXMuc3RhdGUuc3RhdGUkLnBpcGUobWFwKHN0YXRlID0+IHN0YXRlLnBlcnNpc3RlZFRhYmxlU2V0dGluZ3MuY29sbGFwc2VIZWFkZXIpKTtcclxuXHJcbiAgYWRkRmlsdGVyRGlyZWN0aXZlcyA9IChzdGF0ZTogVGFibGVTdGF0ZSkgPT4ge1xyXG4gICAgbGV0IGFsbEZpbHRlckRpcmVjdGl2ZXMgPSBbLi4udGhpcy5maWx0ZXJEaXJlY3RpdmVzLCAuLi50aGlzLmN1c3RvbUZpbHRlckRpcmVjdGl2ZXNdO1xyXG4gICAgaWYodGhpcy53cmFwcGVyKSB7XHJcbiAgICAgIGFsbEZpbHRlckRpcmVjdGl2ZXMgPSBbLi4uYWxsRmlsdGVyRGlyZWN0aXZlcywgLi4udGhpcy53cmFwcGVyLnJlZ2lzdHJhdGlvbnNdO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGN1c3RvbUZpbHRlcnM6IChUYWJsZUN1c3RvbUZpbHRlckRpcmVjdGl2ZSB8IFRhYmxlRmlsdGVyRGlyZWN0aXZlIClbXSA9IFtdO1xyXG5cclxuICAgIGFsbEZpbHRlckRpcmVjdGl2ZXMuZmlsdGVyKCBmID0+ICFmLnVzZWQpLmZvckVhY2goIGYgPT4ge1xyXG4gICAgICBmLnVzZWQgPSB0cnVlO1xyXG4gICAgICBpZihmLnNhdmFibGUpIHtcclxuICAgICAgICB2YXIgZmlsdGVyID0gc3RhdGUuZmlsdGVyc1tmLmZpbHRlcklkXTtcclxuICAgICAgICBpZihpc0ZpbHRlckluZm8oZmlsdGVyKSkge1xyXG4gICAgICAgICAgY29uc3QgZmlsdGVyRGlyZWN0aXZlOiBUYWJsZUZpbHRlckRpcmVjdGl2ZSA9IGYgYXMgVGFibGVGaWx0ZXJEaXJlY3RpdmU7XHJcbiAgICAgICAgICBmaWx0ZXJEaXJlY3RpdmUuZmllbGRUeXBlID0gZmlsdGVyLmZpZWxkVHlwZTtcclxuICAgICAgICAgIGZpbHRlckRpcmVjdGl2ZS5maWx0ZXJUeXBlID0gZmlsdGVyLmZpbHRlclR5cGU7XHJcbiAgICAgICAgICBmaWx0ZXJEaXJlY3RpdmUuc2V0RmlsdGVyVmFsdWUoZmlsdGVyLmZpbHRlclZhbHVlKTtcclxuICAgICAgICAgIGZpbHRlckRpcmVjdGl2ZS5rZXkgPSBmaWx0ZXIua2V5O1xyXG4gICAgICAgICAgZmlsdGVyRGlyZWN0aXZlLnVwZGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihpc0N1c3RvbUZpbHRlcihmaWx0ZXIpKSB7XHJcbiAgICAgICAgICBmLmFjdGl2ZSA9IGZpbHRlci5hY3RpdmUgPz8gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc3RhdGUuYWRkRmlsdGVyKChmLmZpbHRlciQgYXMgYW55KSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY3VzdG9tRmlsdGVycy5wdXNoKGYpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBjdXN0b21GaWx0ZXJzJCA9ICBmcm9tKCBjdXN0b21GaWx0ZXJzLm1hcCggY2YgPT4gY2YuZmlsdGVyJCAgKSkucGlwZShcclxuICAgICAgbWVyZ2VBbGwoKSxcclxuICAgICAgc2NhbiggKGEsYik9PiB7XHJcbiAgICAgICAgICBpZihiLmFjdGl2ZSkge1xyXG4gICAgICAgICAgICBhW2IuZmlsdGVySWRdID0gaXNDdXN0b21GaWx0ZXIoYikgPyBiLnByZWRpY2F0ZSA6IGNyZWF0ZUZpbHRlckZ1bmMoYik7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkZWxldGUgYVtiLmZpbHRlcklkXSA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIHJldHVybiBhO1xyXG4gICAgICB9LCB7fSBhcyBEaWN0aW9uYXJ5PFByZWRpY2F0ZTxhbnk+PiksXHJcbiAgICAgIG1hcCggZiA9PiBPYmplY3QudmFsdWVzKGYpKVxyXG4gICAgKTtcclxuICAgIHRoaXMuc3RhdGUub24oY3VzdG9tRmlsdGVycyQsIChmKSA9PiB7XHJcbiAgICAgIHRoaXMuY3VzdG9tRmlsdGVycyQubmV4dChmKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8bmctY29udGVudCBzZWxlY3Q9XCJbYmVmb3JlXVwiIC8+XHJcblxyXG48bmctY29udGFpbmVyIG11bHRpU29ydCAqbmdyeExldD1cInN0YXRlLnRhYmxlU2V0dGluZ3MkIGFzIHRhYmxlU2V0dGluZ3NcIj5cclxuICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXdyYXBwZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPlxyXG4gICAgICBAaWYgKCghKGNvbGxhcHNlSGVhZGVyJCB8IGFzeW5jKSkgfHwgdGFibGVTZXR0aW5ncy5zaG93VGl0bGVXaGVuSGVhZGVyQ29sbGFwc2VkKSB7XHJcbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiLnRiLWhlYWRlci10aXRsZVwiLz5cclxuICAgICAgfVxyXG4gICAgICBAaWYoKHN0YXRlLmdyb3VwQnlLZXlzJCB8IGFzeW5jKT8ubGVuZ3RoKXtcclxuICAgICAgICA8Z3JvdXAtYnktbGlzdCAvPlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbHgtcm93LWVuZFwiPlxyXG4gICAgICA8bGliLWZpbHRlci1saXN0IC8+XHJcbiAgICAgIEBpZiAoIXRhYmxlU2V0dGluZ3MuaGlkZUhlYWRlcikge1xyXG4gICAgICAgIEBpZiAoIShjb2xsYXBzZUhlYWRlciQgfCBhc3luYykpIHtcclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJNZW51XCIvPlxyXG4gICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gY29sb3I9J3ByaW1hcnknIFttYXRNZW51VHJpZ2dlckZvcl09XCJtYWluTWVudVwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+bW9yZV92ZXJ0PC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPG1hdC1tZW51ICNtYWluTWVudT0nbWF0TWVudSc+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJNZW51RXh0cmFcIi8+XHJcbiAgICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICAgIH1cclxuICAgICAgICBAZWxzZSB7XHJcbiAgICAgICAgICA8bWF0LWljb24gY29sb3I9XCJwcmltYXJ5XCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1haW5NZW51XCIgY2xhc3M9XCJmbGF0LW1lbnUtYnV0dG9uIHBvaW50ZXJcIj5tb3JlX2hvcml6PC9tYXQtaWNvbj5cclxuICAgICAgICAgIDxtYXQtbWVudSAjbWFpbk1lbnU9J21hdE1lbnUnPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2x1bW5cIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyTWVudVwiLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJNZW51RXh0cmFcIi8+XHJcbiAgICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICAgIH1cclxuICAgICAgICA8bWF0LWljb24gW21hdFRvb2x0aXBdPVwiKGNvbGxhcHNlSGVhZGVyJCB8IGFzeW5jKSA/ICdleHBhbmQnIDogJ2NvbGxhcHNlJ1wiIGNsYXNzPVwiY29sbGFwc2UtaWNvbiBoZWFkZXJcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInN0YXRlLnRvZ2dsZUNvbGxhcHNlSGVhZGVyKClcIj5cclxuICAgICAgICAgIHt7KGNvbGxhcHNlSGVhZGVyJCB8IGFzeW5jKSA/ICdleHBhbmRfbGVzcycgOiAnZXhwYW5kX21vcmUnfX1cclxuICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgICB9XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdj5cclxuICAgIEBpZihwcm9wcy51c2VWaXJ0dWFsU2Nyb2xsKSB7XHJcbiAgICA8dGItdmlydHVhbC1zY3JvbGwtY29udGFpbmVyPlxyXG4gICAgICA8dGItZ2VuZXJpYy10YWJsZSBbcm93c109J2N1c3RvbVJvd3MnIFtkYXRhJF09XCJkYXRhXCIgW2Rpc3BsYXlEYXRhJF09XCJkaXNwbGF5RGF0YVwiXHJcbiAgICAgICAgKHNlbGVjdGlvbiQpPSdzZWxlY3Rpb24kLmVtaXQoJGV2ZW50KScgW2NvbHVtbkluZm9zXT0nbXlDb2x1bW5zJCcgW3RyYWNrQnldPVwidHJhY2tCeVwiPjwvdGItZ2VuZXJpYy10YWJsZT5cclxuICAgIDwvdGItdmlydHVhbC1zY3JvbGwtY29udGFpbmVyPlxyXG4gICAgfVxyXG4gICAgQGVsc2Uge1xyXG4gICAgPHRiLWdlbmVyaWMtdGFibGUgW3Jvd3NdPSdjdXN0b21Sb3dzJyBbZGF0YSRdPVwiZGF0YVwiIFtkaXNwbGF5RGF0YSRdPVwiZGlzcGxheURhdGFcIlxyXG4gICAgICAoc2VsZWN0aW9uJCk9J3NlbGVjdGlvbiQuZW1pdCgkZXZlbnQpJyBbY29sdW1uSW5mb3NdPSdteUNvbHVtbnMkJyBbdHJhY2tCeV09XCJ0cmFja0J5XCI+PC90Yi1nZW5lcmljLXRhYmxlPlxyXG4gICAgfVxyXG4gICAgQGlmKHByb3BzLnVzZVBhZ2luYXRvcikge1xyXG4gICAgPGRpdiBjbGFzcz1cInBhZ2luYXRvclwiPlxyXG4gICAgICA8dGItcGFnaW5hdG9yICN0YlBhZ2luYXRvciBbZGF0YSRdPVwiZGF0YVwiIC8+XHJcblxyXG4gICAgICA8bWF0LWljb24gW21hdFRvb2x0aXBdPVwiKGNvbGxhcHNlRm9vdGVyJCB8IGFzeW5jKSA/ICdleHBhbmQnIDogJ2NvbGxhcHNlJ1wiIGNsYXNzPVwiY29sbGFwc2UtaWNvbiBmb290ZXJcIlxyXG4gICAgICAgIChjbGljayk9XCJzdGF0ZS50b2dnbGVDb2xsYXBzZUZvb3RlcigpXCI+XHJcbiAgICAgICAge3soY29sbGFwc2VGb290ZXIkIHwgYXN5bmMpID8gJ2V4cGFuZF9tb3JlJyA6ICdleHBhbmRfbGVzcyd9fVxyXG4gICAgICA8L21hdC1pY29uPlxyXG4gICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcblxyXG5cclxuXHJcbiAgPG5nLXRlbXBsYXRlICNoZWFkZXJNZW51PlxyXG4gICAgQGlmICghdGFibGVTZXR0aW5ncy5oaWRlRmlsdGVyKSB7PHRiLWZpbHRlci1kaXNwbGF5ZXIvPn1cclxuICAgIEBpZiAoIXRhYmxlU2V0dGluZ3MuaGlkZUNvbHVtblNldHRpbmdzKSB7PHRiLWNvbC1kaXNwbGF5ZXIvPn1cclxuICAgIEBpZiAoIXRhYmxlU2V0dGluZ3MuaGlkZVNvcnQpIHs8dGItc29ydC1tZW51Lz59XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgPG5nLXRlbXBsYXRlICNoZWFkZXJNZW51RXh0cmE+XHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInJlc2V0U3RhdGUoKVwiPlxyXG4gICAgICA8bWF0LWljb24gY29sb3I9XCJwcmltYXJ5XCI+YXV0b3JlbmV3PC9tYXQtaWNvbj5cclxuICAgICAgPHNwYW4+UmVzZXQgdGFibGU8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIEBpZiAoIXRhYmxlU2V0dGluZ3MuaGlkZUV4cG9ydCkge1xyXG4gICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImV4cG9ydFRvQ3N2KClcIj5cclxuICAgICAgICA8bWF0LWljb24gY29sb3I9XCJwcmltYXJ5XCI+ZmlsZV9kb3dubG9hZDwvbWF0LWljb24+XHJcbiAgICAgICAgPHNwYW4+RXhwb3J0IFRhYmxlPC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuICAgIEBpZiAoY3VycmVudFN0YXRlS2V5JCB8IGFzeW5jOyBhcyBjdXJyZW50S2V5KSB7XHJcbiAgICAgIEBpZiAodGFibGVJZCkge1xyXG4gICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic2F2ZVN0YXRlKClcIj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cInByaW1hcnlcIj5zYXZlPC9tYXQtaWNvbj5cclxuICAgICAgICAgIDxzcGFuPlNhdmUgdG8ge3tjdXJyZW50S2V5fX08L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFttYXRNZW51VHJpZ2dlckZvcl09XCJzYXZlZE5hbWVzXCI+XHJcbiAgICAgICAgICA8c3Bhbj5DaG9vc2UgUHJvZmlsZTwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIDxtYXQtbWVudSAjc2F2ZWROYW1lcz0nbWF0TWVudScgcGFuZWxDbGFzcz0nd2lkZS1tZW51Jz5cclxuICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIGNsaWNrRW1pdHRlciAgI2FkZD0nY2xpY2tFbWl0dGVyJz5cclxuICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cclxuICAgICAgICA8c3Bhbj5OZXc8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICBAZm9yIChrZXkgb2Ygc3RhdGVLZXlzJCB8IGFzeW5jOyB0cmFjayBrZXkpIHtcclxuICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT0nc2V0UHJvZmlsZVN0YXRlKGtleSknPlxyXG4gICAgICAgICAgPHNwYW4+e3trZXl9fTwvc3Bhbj5cclxuICAgICAgICAgIDxtYXQtaWNvbiBjb2xvcj0nd2FybicgKGNsaWNrKT0nZGVsZXRlUHJvZmlsZVN0YXRlKGtleSknIHN0b3AtcHJvcGFnYXRpb24+ZGVsZXRlX2ZvcmV2ZXI8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICB9XHJcbiAgICA8L21hdC1tZW51PlxyXG4gICAgPG5nLWNvbnRhaW5lciAqb3BEaWFsb2c9J2FkZCc+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8aW5wdXQgY2xhc3M9XCJhZGQta2V5XCIgbWF0SW5wdXQgI2FkZGVkS2V5IC8+XHJcbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPSdzZXRQcm9maWxlU3RhdGUoYWRkZWRLZXkudmFsdWUpOyBhZGQubmV4dChmYWxzZSk7JyBbZGlzYWJsZWRdPVwiIWFkZGVkS2V5LnZhbHVlXCI+XHJcbiAgICAgICAgQWRkXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuPC9uZy1jb250YWluZXI+XHJcbiJdfQ==
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export const defaultProps = {
|
|
2
|
-
usePaginator: true,
|
|
3
|
-
useVirtualScroll: false,
|
|
4
|
-
indexColumn: false,
|
|
5
|
-
selectionColumn: false,
|
|
6
|
-
isSticky: false,
|
|
7
|
-
stickyFooter: false,
|
|
8
|
-
};
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGVQcm9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdXRpbGl0aWVzL3NyYy90YWJsZS1idWlsZGVyL2NvbXBvbmVudHMvdGFibGUtY29udGFpbmVyL3RhYmxlUHJvcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBWUEsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFlO0lBQ3RDLFlBQVksRUFBRSxJQUFJO0lBQ2xCLGdCQUFnQixFQUFFLEtBQUs7SUFDdkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsZUFBZSxFQUFFLEtBQUs7SUFDdEIsUUFBUSxFQUFFLEtBQUs7SUFDZixZQUFZLEVBQUUsS0FBSztDQUNwQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgdGFibGVQcm9wcyB7XHJcbiAgdXNlUGFnaW5hdG9yOiBib29sZWFuO1xyXG4gIHVzZVZpcnR1YWxTY3JvbGw6IGJvb2xlYW47XHJcbiAgaW5kZXhDb2x1bW46IGJvb2xlYW47XHJcbiAgc2VsZWN0aW9uQ29sdW1uOiBib29sZWFuO1xyXG4gIGlzU3RpY2t5OiBib29sZWFuO1xyXG4gIHN0aWNreUZvb3Rlcjpib29sZWFuO1xyXG4gIGdyb3VwSGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdFByb3BzOiB0YWJsZVByb3BzID0ge1xyXG4gIHVzZVBhZ2luYXRvcjogdHJ1ZSxcclxuICB1c2VWaXJ0dWFsU2Nyb2xsOiBmYWxzZSxcclxuICBpbmRleENvbHVtbjogZmFsc2UsXHJcbiAgc2VsZWN0aW9uQ29sdW1uOiBmYWxzZSxcclxuICBpc1N0aWNreTogZmFsc2UsXHJcbiAgc3RpY2t5Rm9vdGVyOiBmYWxzZSxcclxufVxyXG4iXX0=
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, Inject, ViewChild, forwardRef, } from '@angular/core';
|
|
2
|
-
import { CdkVirtualScrollViewport, ScrollingModule, VIRTUAL_SCROLL_STRATEGY, } from '@angular/cdk/scrolling';
|
|
3
|
-
import { distinctUntilChanged, map } from 'rxjs';
|
|
4
|
-
import { defaultShareReplay } from '../../../rxjs';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "../../classes/table-store";
|
|
7
|
-
import * as i2 from "@angular/cdk/scrolling";
|
|
8
|
-
export class VirtualScrollContainer {
|
|
9
|
-
constructor(context, state) {
|
|
10
|
-
this.context = context;
|
|
11
|
-
this.state = state;
|
|
12
|
-
this.resizeHandler = () => {
|
|
13
|
-
if (this.viewport) {
|
|
14
|
-
this.setSize(this.viewport.elementRef);
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
ngOnInit() {
|
|
19
|
-
addEventListener('resize', this.resizeHandler);
|
|
20
|
-
setTimeout(() => {
|
|
21
|
-
this.setSize(this.viewport.elementRef);
|
|
22
|
-
}, 0);
|
|
23
|
-
if (this.context.tableProps.usePaginator) {
|
|
24
|
-
this.state.on(this.state.select((s) => s.pageSize), (len) => this.context.scrollStrategy.setDataLength(len));
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
this.state.on(this.state.select((s) => s.dataLen), (len) => this.context.scrollStrategy.setDataLength(len));
|
|
28
|
-
}
|
|
29
|
-
this.state.on(this.viewport.renderedRangeStream, (range) => {
|
|
30
|
-
this.state.updateState({
|
|
31
|
-
virtualStart: range.start,
|
|
32
|
-
virtualEnd: range.end,
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
var offset$ = this.viewport.scrolledIndexChange.pipe(map(() => this.viewport.getOffsetToRenderedContentStart() ?? 0), distinctUntilChanged(), defaultShareReplay());
|
|
36
|
-
this.state.on(offset$, (offset) => {
|
|
37
|
-
this.state.updateState({ virtualScrollOffset: offset });
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
ngOnDestroy() {
|
|
41
|
-
removeEventListener('resize', this.resizeHandler);
|
|
42
|
-
}
|
|
43
|
-
setSize(el) {
|
|
44
|
-
const vsViewport = el.nativeElement;
|
|
45
|
-
const vsContentWrapper = vsViewport?.children[0];
|
|
46
|
-
const hasHorizontalScrollBar = vsViewport?.scrollWidth > vsViewport?.clientWidth;
|
|
47
|
-
const rect = vsContentWrapper.getBoundingClientRect();
|
|
48
|
-
let wrapperHeight = 0;
|
|
49
|
-
if (rect.top >= 0) {
|
|
50
|
-
wrapperHeight = rect.bottom;
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
wrapperHeight = rect.bottom + rect.top;
|
|
54
|
-
}
|
|
55
|
-
if (wrapperHeight < window.innerHeight) {
|
|
56
|
-
vsViewport.setAttribute('style', `height: ${vsContentWrapper.clientHeight + (hasHorizontalScrollBar ? 17 : 0)}px !important;`);
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
vsViewport.setAttribute('style', `height: ${window.innerHeight - el.nativeElement.offsetTop - (0 || 167)}px !important;`);
|
|
60
|
-
}
|
|
61
|
-
this.viewport?.checkViewportSize();
|
|
62
|
-
const virtualScrollOffset = this.viewport.getOffsetToRenderedContentStart() ?? 0;
|
|
63
|
-
this.state.updateState({ virtualScrollOffset });
|
|
64
|
-
}
|
|
65
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: VirtualScrollContainer, deps: [{ token: 'TABLE_CONTEXT' }, { token: i1.TableStore }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
66
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.3", type: VirtualScrollContainer, isStandalone: true, selector: "tb-virtual-scroll-container", viewQueries: [{ propertyName: "viewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true, static: true }], ngImport: i0, template: `<cdk-virtual-scroll-viewport>
|
|
67
|
-
<ng-content></ng-content>
|
|
68
|
-
</cdk-virtual-scroll-viewport> `, isInline: true, dependencies: [{ kind: "ngmodule", type: ScrollingModule }, { kind: "component", type: i2.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }], viewProviders: [
|
|
69
|
-
{
|
|
70
|
-
provide: VIRTUAL_SCROLL_STRATEGY,
|
|
71
|
-
useFactory: (c) => c.context.scrollStrategy,
|
|
72
|
-
deps: [forwardRef(() => VirtualScrollContainer)],
|
|
73
|
-
},
|
|
74
|
-
], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
75
|
-
}
|
|
76
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: VirtualScrollContainer, decorators: [{
|
|
77
|
-
type: Component,
|
|
78
|
-
args: [{
|
|
79
|
-
selector: 'tb-virtual-scroll-container',
|
|
80
|
-
template: `<cdk-virtual-scroll-viewport>
|
|
81
|
-
<ng-content></ng-content>
|
|
82
|
-
</cdk-virtual-scroll-viewport> `,
|
|
83
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
84
|
-
standalone: true,
|
|
85
|
-
imports: [ScrollingModule],
|
|
86
|
-
viewProviders: [
|
|
87
|
-
{
|
|
88
|
-
provide: VIRTUAL_SCROLL_STRATEGY,
|
|
89
|
-
useFactory: (c) => c.context.scrollStrategy,
|
|
90
|
-
deps: [forwardRef(() => VirtualScrollContainer)],
|
|
91
|
-
},
|
|
92
|
-
],
|
|
93
|
-
}]
|
|
94
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
95
|
-
type: Inject,
|
|
96
|
-
args: ['TABLE_CONTEXT']
|
|
97
|
-
}] }, { type: i1.TableStore }], propDecorators: { viewport: [{
|
|
98
|
-
type: ViewChild,
|
|
99
|
-
args: [CdkVirtualScrollViewport, { static: true }]
|
|
100
|
-
}] } });
|
|
101
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC1zY3JvbGwtY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci11dGlsaXRpZXMvc3JjL3RhYmxlLWJ1aWxkZXIvY29tcG9uZW50cy90YWJsZS1jb250YWluZXIvdmlydHVhbC1zY3JvbGwtY29udGFpbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUVULE1BQU0sRUFHTixTQUFTLEVBQ1QsVUFBVSxHQUNYLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsZUFBZSxFQUNmLHVCQUF1QixHQUN4QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBbUJuRCxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLFlBQ2tDLE9BQXFCLEVBQzdDLEtBQWlCO1FBRE8sWUFBTyxHQUFQLE9BQU8sQ0FBYztRQUM3QyxVQUFLLEdBQUwsS0FBSyxDQUFZO1FBNEUzQixrQkFBYSxHQUFHLEdBQUcsRUFBRTtZQUNuQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN4QztRQUNILENBQUMsQ0FBQztJQS9FQyxDQUFDO0lBS0osUUFBUTtRQUNOLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0MsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6QyxDQUFDLEVBQUUsQ0FBQyxD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QUk4QixRQUFRO3NCQUE5RCxTQUFTO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5qZWN0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIGZvcndhcmRSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRhYmxlQ29udGV4dCB9IGZyb20gJy4uL3RhYmxlLWNvbnRleHQnO1xyXG5pbXBvcnQge1xyXG4gIENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCxcclxuICBTY3JvbGxpbmdNb2R1bGUsXHJcbiAgVklSVFVBTF9TQ1JPTExfU1RSQVRFR1ksXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XHJcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVmYXVsdFNoYXJlUmVwbGF5IH0gZnJvbSAnLi4vLi4vLi4vcnhqcyc7XHJcbmltcG9ydCB7IFRhYmxlU3RvcmUgfSBmcm9tICcuLi8uLi9jbGFzc2VzL3RhYmxlLXN0b3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndGItdmlydHVhbC1zY3JvbGwtY29udGFpbmVyJyxcclxuICB0ZW1wbGF0ZTogYDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XHJcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+IGAsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbU2Nyb2xsaW5nTW9kdWxlXSxcclxuICB2aWV3UHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IFZJUlRVQUxfU0NST0xMX1NUUkFURUdZLFxyXG4gICAgICB1c2VGYWN0b3J5OiAoYzogVmlydHVhbFNjcm9sbENvbnRhaW5lcikgPT4gYy5jb250ZXh0LnNjcm9sbFN0cmF0ZWd5LFxyXG4gICAgICBkZXBzOiBbZm9yd2FyZFJlZigoKSA9PiBWaXJ0dWFsU2Nyb2xsQ29udGFpbmVyKV0sXHJcbiAgICB9LFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBWaXJ0dWFsU2Nyb2xsQ29udGFpbmVyPFQgPSBhbnk+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdCgnVEFCTEVfQ09OVEVYVCcpIHB1YmxpYyBjb250ZXh0OiBUYWJsZUNvbnRleHQsXHJcbiAgICBwcml2YXRlIHN0YXRlOiBUYWJsZVN0b3JlXHJcbiAgKSB7fVxyXG5cclxuICBAVmlld0NoaWxkKENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgeyBzdGF0aWM6IHRydWUgfSkgdmlld3BvcnQhOkNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcclxuXHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5yZXNpemVIYW5kbGVyKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnNldFNpemUodGhpcy52aWV3cG9ydC5lbGVtZW50UmVmKTtcclxuICAgIH0sIDApO1xyXG5cclxuICAgIGlmICh0aGlzLmNvbnRleHQudGFibGVQcm9wcy51c2VQYWdpbmF0b3IpIHtcclxuICAgICAgdGhpcy5zdGF0ZS5vbihcclxuICAgICAgICB0aGlzLnN0YXRlLnNlbGVjdCgocykgPT4gcy5wYWdlU2l6ZSksXHJcbiAgICAgICAgKGxlbikgPT4gdGhpcy5jb250ZXh0LnNjcm9sbFN0cmF0ZWd5LnNldERhdGFMZW5ndGgobGVuKVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdGF0ZS5vbihcclxuICAgICAgICB0aGlzLnN0YXRlLnNlbGVjdCgocykgPT4gcy5kYXRhTGVuKSxcclxuICAgICAgICAobGVuKSA9PiB0aGlzLmNvbnRleHQuc2Nyb2xsU3RyYXRlZ3kuc2V0RGF0YUxlbmd0aChsZW4pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0YXRlLm9uKHRoaXMudmlld3BvcnQucmVuZGVyZWRSYW5nZVN0cmVhbSwgKHJhbmdlKSA9PiB7XHJcbiAgICAgIHRoaXMuc3RhdGUudXBkYXRlU3RhdGUoe1xyXG4gICAgICAgIHZpcnR1YWxTdGFydDogcmFuZ2Uuc3RhcnQsXHJcbiAgICAgICAgdmlydHVhbEVuZDogcmFuZ2UuZW5kLFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgdmFyIG9mZnNldCQgPSB0aGlzLnZpZXdwb3J0LnNjcm9sbGVkSW5kZXhDaGFuZ2UucGlwZShcclxuICAgICAgbWFwKCgpID0+IHRoaXMudmlld3BvcnQuZ2V0T2Zmc2V0VG9SZW5kZXJlZENvbnRlbnRTdGFydCgpID8/IDApLFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxyXG4gICAgICBkZWZhdWx0U2hhcmVSZXBsYXkoKVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnN0YXRlLm9uKG9mZnNldCQsIChvZmZzZXQpID0+IHtcclxuICAgICAgdGhpcy5zdGF0ZS51cGRhdGVTdGF0ZSh7IHZpcnR1YWxTY3JvbGxPZmZzZXQ6IG9mZnNldCB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICByZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnJlc2l6ZUhhbmRsZXIpO1xyXG4gIH1cclxuXHJcbiAgc2V0U2l6ZShlbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHtcclxuICAgIGNvbnN0IHZzVmlld3BvcnQ6IEVsZW1lbnQgPSBlbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgdnNDb250ZW50V3JhcHBlcjogRWxlbWVudCA9IHZzVmlld3BvcnQ/LmNoaWxkcmVuWzBdO1xyXG4gICAgY29uc3QgaGFzSG9yaXpvbnRhbFNjcm9sbEJhciA9XHJcbiAgICAgIHZzVmlld3BvcnQ/LnNjcm9sbFdpZHRoID4gdnNWaWV3cG9ydD8uY2xpZW50V2lkdGg7XHJcbiAgICBjb25zdCByZWN0ID0gdnNDb250ZW50V3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGxldCB3cmFwcGVySGVpZ2h0ID0gMDtcclxuICAgIGlmIChyZWN0LnRvcCA+PSAwKSB7XHJcbiAgICAgIHdyYXBwZXJIZWlnaHQgPSByZWN0LmJvdHRvbTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdyYXBwZXJIZWlnaHQgPSByZWN0LmJvdHRvbSArIHJlY3QudG9wO1xyXG4gICAgfVxyXG4gICAgaWYgKHdyYXBwZXJIZWlnaHQgPCB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcclxuICAgICAgdnNWaWV3cG9ydC5zZXRBdHRyaWJ1dGUoXHJcbiAgICAgICAgJ3N0eWxlJyxcclxuICAgICAgICBgaGVpZ2h0OiAke1xyXG4gICAgICAgICAgdnNDb250ZW50V3JhcHBlci5jbGllbnRIZWlnaHQgKyAoaGFzSG9yaXpvbnRhbFNjcm9sbEJhciA/IDE3IDogMClcclxuICAgICAgICB9cHggIWltcG9ydGFudDtgXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2c1ZpZXdwb3J0LnNldEF0dHJpYnV0ZShcclxuICAgICAgICAnc3R5bGUnLFxyXG4gICAgICAgIGBoZWlnaHQ6ICR7XHJcbiAgICAgICAgICB3aW5kb3cuaW5uZXJIZWlnaHQgLSBlbC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcCAtICgwIHx8IDE2NylcclxuICAgICAgICB9cHggIWltcG9ydGFudDtgXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnZpZXdwb3J0Py5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xyXG4gICAgY29uc3QgdmlydHVhbFNjcm9sbE9mZnNldCA9IHRoaXMudmlld3BvcnQuZ2V0T2Zmc2V0VG9SZW5kZXJlZENvbnRlbnRTdGFydCgpID8/IDBcclxuICAgIHRoaXMuc3RhdGUudXBkYXRlU3RhdGUoeyB2aXJ0dWFsU2Nyb2xsT2Zmc2V0IH0pO1xyXG4gIH1cclxuXHJcbiAgcmVzaXplSGFuZGxlciA9ICgpID0+IHtcclxuICAgIGlmICh0aGlzLnZpZXdwb3J0KSB7XHJcbiAgICAgIHRoaXMuc2V0U2l6ZSh0aGlzLnZpZXdwb3J0LmVsZW1lbnRSZWYpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG59XHJcbiJdfQ==
|