ngx-register-base 1.2.3 → 1.3.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/ng-package.json +15 -0
- package/package.json +12 -15
- package/schematics/ng-update/replace-menu-state-token/index.ts +33 -0
- package/schematics/ng-update/update-prefix/index.ts +38 -0
- package/schematics/utils/{utils.d.ts → utils.ts} +9 -2
- package/src/lib/components/checkbox-selector/checkbox-selector.component.html +91 -0
- package/src/lib/components/checkbox-selector/checkbox-selector.component.less +67 -0
- package/src/lib/components/checkbox-selector/checkbox-selector.component.ts +176 -0
- package/src/lib/components/checkbox-selector/checkbox-selector.types.ts +8 -0
- package/src/lib/components/column-settings/column-settings.component.html +160 -0
- package/src/lib/components/column-settings/column-settings.component.less +131 -0
- package/src/lib/components/column-settings/column-settings.component.ts +352 -0
- package/src/lib/components/column-settings/components/column-settings-template/column-settings-template.component.html +65 -0
- package/src/lib/components/column-settings/components/column-settings-template/column-settings-template.component.less +79 -0
- package/src/lib/components/column-settings/components/column-settings-template/column-settings-template.component.ts +114 -0
- package/src/lib/components/column-settings/consts/column-settings.consts.ts +9 -0
- package/src/lib/components/column-settings/types/column-settings.types.ts +26 -0
- package/src/lib/components/divider/divider.component.html +4 -0
- package/src/lib/components/divider/divider.component.less +10 -0
- package/src/lib/components/divider/divider.component.ts +12 -0
- package/src/lib/components/filter-button/filter-button.component.html +20 -0
- package/src/lib/components/filter-button/filter-button.component.less +41 -0
- package/src/lib/components/filter-button/filter-button.component.ts +18 -0
- package/src/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.html +22 -0
- package/src/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.less +23 -0
- package/src/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.ts +31 -0
- package/src/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.html +49 -0
- package/src/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.less +37 -0
- package/src/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.ts +66 -0
- package/src/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.html +147 -0
- package/src/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.less +45 -0
- package/src/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.ts +114 -0
- package/src/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.html +44 -0
- package/src/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.less +49 -0
- package/src/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.ts +167 -0
- package/src/lib/components/filters/components/filter-list/filter-list.service.ts +97 -0
- package/src/lib/components/filters/components/filter-list/filters-section/filters-section.component.html +18 -0
- package/src/lib/components/filters/components/filter-list/filters-section/filters-section.component.less +55 -0
- package/src/lib/components/filters/components/filter-list/filters-section/filters-section.component.ts +69 -0
- package/src/lib/components/filters/components/filter-list.module.ts +29 -0
- package/src/lib/components/filters/register-table-filter.component.html +53 -0
- package/src/lib/components/filters/register-table-filter.component.less +17 -0
- package/src/lib/components/filters/register-table-filter.component.ts +167 -0
- package/src/lib/components/filters/register-table-filter.module.ts +22 -0
- package/src/lib/components/inputs/inputs.module.ts +104 -0
- package/src/lib/components/inputs/param-calendar-year/param-calendar-year.component.html +49 -0
- package/src/lib/components/inputs/param-calendar-year/param-calendar-year.component.less +70 -0
- package/src/lib/components/inputs/param-calendar-year/param-calendar-year.component.ts +52 -0
- package/src/lib/components/inputs/param-custom/param-custom.component.html +1 -0
- package/src/lib/components/inputs/param-custom/param-custom.component.ts +9 -0
- package/src/lib/components/inputs/param-date/param-date.component.html +55 -0
- package/src/lib/components/inputs/param-date/param-date.component.less +67 -0
- package/src/lib/components/inputs/param-date/param-date.component.ts +77 -0
- package/src/lib/components/inputs/param-date-range/param-date-range.component.html +45 -0
- package/src/lib/components/inputs/param-date-range/param-date-range.component.less +75 -0
- package/src/lib/components/inputs/param-date-range/param-date-range.component.ts +67 -0
- package/src/lib/components/inputs/param-date-time/param-date-time.component.html +70 -0
- package/src/lib/components/inputs/param-date-time/param-date-time.component.less +72 -0
- package/src/lib/components/inputs/param-date-time/param-date-time.component.ts +101 -0
- package/src/lib/components/inputs/param-date-time-range/param-date-time-range.component.html +67 -0
- package/src/lib/components/inputs/param-date-time-range/param-date-time-range.component.less +103 -0
- package/src/lib/components/inputs/param-date-time-range/param-date-time-range.component.ts +128 -0
- package/src/lib/components/inputs/param-month/param-month.component.html +46 -0
- package/src/lib/components/inputs/param-month/param-month.component.less +72 -0
- package/src/lib/components/inputs/param-month/param-month.component.ts +55 -0
- package/src/lib/components/inputs/param-month-range/param-month-range.component.html +39 -0
- package/src/lib/components/inputs/param-month-range/param-month-range.component.less +71 -0
- package/src/lib/components/inputs/param-month-range/param-month-range.component.ts +76 -0
- package/src/lib/components/inputs/param-multi-select/param-multi-select.component.html +84 -0
- package/src/lib/components/inputs/param-multi-select/param-multi-select.component.less +108 -0
- package/src/lib/components/inputs/param-multi-select/param-multi-select.component.ts +448 -0
- package/src/lib/components/inputs/param-select/param-select.component.html +106 -0
- package/src/lib/components/inputs/param-select/param-select.component.less +26 -0
- package/src/lib/components/inputs/param-select/param-select.component.ts +318 -0
- package/src/lib/components/inputs/param-switcher/param-switcher.component.html +8 -0
- package/src/lib/components/inputs/param-switcher/param-switcher.component.less +53 -0
- package/src/lib/components/inputs/param-switcher/param-switcher.component.ts +13 -0
- package/src/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.ts +29 -0
- package/src/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.html +19 -0
- package/src/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.less +76 -0
- package/src/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.ts +134 -0
- package/src/lib/components/inputs/param-switcher-date-time-range/types/param-switcher-date-time-range.types.ts +8 -0
- package/src/lib/components/inputs/param-text/param-text.component.html +59 -0
- package/src/lib/components/inputs/param-text/param-text.component.less +33 -0
- package/src/lib/components/inputs/param-text/param-text.component.ts +36 -0
- package/src/lib/components/inputs/param-textarea/param-textarea.component.html +61 -0
- package/src/lib/components/inputs/param-textarea/param-textarea.component.less +21 -0
- package/src/lib/components/inputs/param-textarea/param-textarea.component.ts +33 -0
- package/src/lib/components/inputs/param-toggle/param-toggle.component.html +40 -0
- package/src/lib/components/inputs/param-toggle/param-toggle.component.less +69 -0
- package/src/lib/components/inputs/param-toggle/param-toggle.component.ts +14 -0
- package/src/lib/components/inputs/param-tree/consts/param-tree.consts.ts +59 -0
- package/src/lib/components/inputs/param-tree/param-tree.component.html +51 -0
- package/src/lib/components/inputs/param-tree/param-tree.component.less +3 -0
- package/src/lib/components/inputs/param-tree/param-tree.component.ts +282 -0
- package/src/lib/components/inputs/param-tree/services/param-tree.service.ts +176 -0
- package/src/lib/components/inputs/param-tree/services/sync-tree-loader.service.ts +18 -0
- package/{lib/components/inputs/param-tree/tokens/param-tree.tokens.d.ts → src/lib/components/inputs/param-tree/tokens/param-tree.tokens.ts} +2 -1
- package/src/lib/components/inputs/param-tree/types/param-tree.types.ts +39 -0
- package/src/lib/components/inputs/param-tree/utils/param-tree.utils.ts +18 -0
- package/src/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.html +78 -0
- package/src/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.less +109 -0
- package/src/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.ts +89 -0
- package/src/lib/components/inputs/param-tree-select/param-tree-select.component.html +54 -0
- package/src/lib/components/inputs/param-tree-select/param-tree-select.component.less +56 -0
- package/src/lib/components/inputs/param-tree-select/param-tree-select.component.ts +91 -0
- package/src/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.html +5 -0
- package/src/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.ts +13 -0
- package/src/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.html +4 -0
- package/src/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.ts +11 -0
- package/src/lib/components/menu-constructor/sproc-menu-constructor.component.html +95 -0
- package/src/lib/components/menu-constructor/sproc-menu-constructor.component.less +183 -0
- package/src/lib/components/menu-constructor/sproc-menu-constructor.component.ts +687 -0
- package/src/lib/components/menu-constructor/store/sproc-abstract-menu-constructor.store.ts +32 -0
- package/src/lib/components/menu-constructor/store/sproc-menu-constructor.consts.ts +46 -0
- package/{lib/components/menu-constructor/store/sproc-menu.tokens.d.ts → src/lib/components/menu-constructor/store/sproc-menu.tokens.ts} +4 -1
- package/src/lib/components/page-menu/README.md +60 -0
- package/src/lib/components/page-menu/schema/sproc-page-menu.consts.ts +8 -0
- package/src/lib/components/page-menu/schema/sproc-page-menu.schema.ts +35 -0
- package/src/lib/components/page-menu/schema/sproc-page-menu.tokens.ts +5 -0
- package/src/lib/components/page-menu/schema/sproc-page-menu.types.ts +42 -0
- package/src/lib/components/page-menu/sproc-page-menu.component.html +166 -0
- package/src/lib/components/page-menu/sproc-page-menu.component.less +228 -0
- package/src/lib/components/page-menu/sproc-page-menu.component.ts +337 -0
- package/src/lib/components/paginator/paginator.component.html +97 -0
- package/src/lib/components/paginator/paginator.component.less +101 -0
- package/src/lib/components/paginator/paginator.component.ts +192 -0
- package/src/lib/components/paginator/types/paginator.types.ts +16 -0
- package/src/lib/components/register-table/consts/register-table.consts.ts +3 -0
- package/src/lib/components/register-table/directives/cell-template.directive.ts +11 -0
- package/src/lib/components/register-table/directives/header-template.directive.ts +11 -0
- package/src/lib/components/register-table/model/schema.ts +62 -0
- package/src/lib/components/register-table/pipes/class-by-type.pipe.ts +28 -0
- package/src/lib/components/register-table/pipes/sticky-column.pipe.ts +11 -0
- package/src/lib/components/register-table/register-table.component.html +257 -0
- package/src/lib/components/register-table/register-table.component.less +151 -0
- package/src/lib/components/register-table/register-table.component.ts +743 -0
- package/src/lib/components/reset-settings-form/reset-settings-form.component.html +14 -0
- package/src/lib/components/reset-settings-form/reset-settings-form.component.less +26 -0
- package/src/lib/components/reset-settings-form/reset-settings-form.component.ts +15 -0
- package/src/lib/components/search-input/search-input.component.html +6 -0
- package/src/lib/components/search-input/search-input.component.less +17 -0
- package/src/lib/components/search-input/search-input.component.ts +31 -0
- package/src/lib/components/sliding-panel/sliding-panel.component.html +13 -0
- package/src/lib/components/sliding-panel/sliding-panel.component.less +112 -0
- package/src/lib/components/sliding-panel/sliding-panel.component.ts +36 -0
- package/src/lib/components/sliding-panel/sliding-panel.module.ts +11 -0
- package/src/lib/consts/date-time.consts.ts +1 -0
- package/src/lib/consts/index.ts +8 -0
- package/src/lib/consts/inputs.consts.ts +9 -0
- package/src/lib/consts/month.consts.ts +82 -0
- package/src/lib/consts/params.consts.ts +1 -0
- package/src/lib/consts/register-base.consts.ts +40 -0
- package/src/lib/core/form-group-wrapper/errors-consts.ts +6 -0
- package/src/lib/core/form-group-wrapper/form-group-wrapper.ts +109 -0
- package/src/lib/core/input-control/input-control.ts +30 -0
- package/src/lib/core/param/param-base.ts +262 -0
- package/src/lib/core/param/param-date-base.ts +30 -0
- package/src/lib/core/param/param-select-base.ts +118 -0
- package/src/lib/core/param/param-text-base.ts +23 -0
- package/{lib/core/param/param.tokens.d.ts → src/lib/core/param/param.tokens.ts} +2 -1
- package/src/lib/core/register-base/register-base.store.ts +84 -0
- package/src/lib/core/register-base/register-base.ts +854 -0
- package/src/lib/directives/date/date-time.types.ts +36 -0
- package/src/lib/directives/date/format-date.pipe.ts +28 -0
- package/src/lib/directives/number/number-only.directive.ts +36 -0
- package/src/lib/directives/sticky/sticky-relative.directive.ts +30 -0
- package/src/lib/directives/sticky/sticky-relative.service.ts +34 -0
- package/src/lib/directives/sticky/sticky.directive.ts +189 -0
- package/src/lib/services/date-time.service.ts +399 -0
- package/src/lib/services/dialog/dialog.service.ts +62 -0
- package/{lib/services/dialog/dialog.types.d.ts → src/lib/services/dialog/dialog.types.ts} +8 -4
- package/src/lib/services/dom-intersection.service.ts +23 -0
- package/src/lib/services/filter/filters-state.service.ts +83 -0
- package/src/lib/services/filter/filters-transmit.service.ts +105 -0
- package/src/lib/services/filter/filters.service.ts +21 -0
- package/src/lib/services/inputs-state.service.ts +157 -0
- package/src/lib/services/inputs.service.ts +114 -0
- package/src/lib/services/key-pressed.service.ts +40 -0
- package/src/lib/services/resize-window-observer.service.ts +37 -0
- package/src/lib/services/selected-objects-state.service.ts +159 -0
- package/src/lib/store/fast-query-store.service.ts +132 -0
- package/{lib/types/event.types.d.ts → src/lib/types/event.types.ts} +1 -1
- package/src/lib/types/hasura.types.ts +41 -0
- package/src/lib/types/inputs.types.ts +63 -0
- package/src/lib/types/params.types.ts +42 -0
- package/src/lib/types/register-base.types.ts +161 -0
- package/src/lib/types/sub-types.ts +15 -0
- package/src/lib/types/user-profile.types.ts +18 -0
- package/src/lib/utils/functions.ts +11 -0
- package/src/lib/utils/get-url-segment.ts +46 -0
- package/src/lib/utils/prizm.shared.module.ts +176 -0
- package/src/lib/utils/rxjs.ts +33 -0
- package/src/lib/utils/select-all-utils.ts +16 -0
- package/tsconfig.lib.json +16 -0
- package/tsconfig.lib.prod.json +11 -0
- package/tsconfig.schematics.json +26 -0
- package/tsconfig.spec.json +15 -0
- package/esm2022/lib/components/checkbox-selector/checkbox-selector.component.mjs +0 -129
- package/esm2022/lib/components/checkbox-selector/checkbox-selector.types.mjs +0 -8
- package/esm2022/lib/components/column-settings/column-settings.component.mjs +0 -249
- package/esm2022/lib/components/column-settings/components/column-settings-template/column-settings-template.component.mjs +0 -80
- package/esm2022/lib/components/column-settings/consts/column-settings.consts.mjs +0 -10
- package/esm2022/lib/components/column-settings/index.mjs +0 -3
- package/esm2022/lib/components/column-settings/types/column-settings.types.mjs +0 -7
- package/esm2022/lib/components/divider/divider.component.mjs +0 -16
- package/esm2022/lib/components/filter-button/filter-button.component.mjs +0 -19
- package/esm2022/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.mjs +0 -31
- package/esm2022/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.mjs +0 -57
- package/esm2022/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.mjs +0 -110
- package/esm2022/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.mjs +0 -130
- package/esm2022/lib/components/filters/components/filter-list/filter-list.service.mjs +0 -89
- package/esm2022/lib/components/filters/components/filter-list/filters-section/filters-section.component.mjs +0 -41
- package/esm2022/lib/components/filters/components/filter-list.module.mjs +0 -45
- package/esm2022/lib/components/filters/index.mjs +0 -3
- package/esm2022/lib/components/filters/register-table-filter.component.mjs +0 -155
- package/esm2022/lib/components/filters/register-table-filter.module.mjs +0 -39
- package/esm2022/lib/components/index.mjs +0 -11
- package/esm2022/lib/components/inputs/index.mjs +0 -20
- package/esm2022/lib/components/inputs/inputs.module.mjs +0 -166
- package/esm2022/lib/components/inputs/param-calendar-year/param-calendar-year.component.mjs +0 -45
- package/esm2022/lib/components/inputs/param-custom/param-custom.component.mjs +0 -12
- package/esm2022/lib/components/inputs/param-date/param-date.component.mjs +0 -76
- package/esm2022/lib/components/inputs/param-date-range/param-date-range.component.mjs +0 -61
- package/esm2022/lib/components/inputs/param-date-time/param-date-time.component.mjs +0 -86
- package/esm2022/lib/components/inputs/param-date-time-range/param-date-time-range.component.mjs +0 -96
- package/esm2022/lib/components/inputs/param-month/param-month.component.mjs +0 -50
- package/esm2022/lib/components/inputs/param-month-range/param-month-range.component.mjs +0 -62
- package/esm2022/lib/components/inputs/param-multi-select/param-multi-select.component.mjs +0 -309
- package/esm2022/lib/components/inputs/param-select/param-select.component.mjs +0 -209
- package/esm2022/lib/components/inputs/param-switcher/param-switcher.component.mjs +0 -21
- package/esm2022/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.mjs +0 -28
- package/esm2022/lib/components/inputs/param-switcher-date-time-range/index.mjs +0 -3
- package/esm2022/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.mjs +0 -105
- package/esm2022/lib/components/inputs/param-switcher-date-time-range/types/param-switcher-date-time-range.types.mjs +0 -10
- package/esm2022/lib/components/inputs/param-text/param-text.component.mjs +0 -40
- package/esm2022/lib/components/inputs/param-textarea/param-textarea.component.mjs +0 -38
- package/esm2022/lib/components/inputs/param-toggle/param-toggle.component.mjs +0 -20
- package/esm2022/lib/components/inputs/param-tree/consts/param-tree.consts.mjs +0 -37
- package/esm2022/lib/components/inputs/param-tree/index.mjs +0 -8
- package/esm2022/lib/components/inputs/param-tree/param-tree.component.mjs +0 -207
- package/esm2022/lib/components/inputs/param-tree/services/param-tree.service.mjs +0 -116
- package/esm2022/lib/components/inputs/param-tree/services/sync-tree-loader.service.mjs +0 -20
- package/esm2022/lib/components/inputs/param-tree/tokens/param-tree.tokens.mjs +0 -3
- package/esm2022/lib/components/inputs/param-tree/types/param-tree.types.mjs +0 -2
- package/esm2022/lib/components/inputs/param-tree/utils/param-tree.utils.mjs +0 -9
- package/esm2022/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.mjs +0 -80
- package/esm2022/lib/components/inputs/param-tree-select/param-tree-select.component.mjs +0 -85
- package/esm2022/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.mjs +0 -15
- package/esm2022/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.mjs +0 -12
- package/esm2022/lib/components/menu-constructor/index.mjs +0 -5
- package/esm2022/lib/components/menu-constructor/sproc-menu-constructor.component.mjs +0 -559
- package/esm2022/lib/components/menu-constructor/store/sproc-abstract-menu-constructor.store.mjs +0 -3
- package/esm2022/lib/components/menu-constructor/store/sproc-menu-constructor.consts.mjs +0 -5
- package/esm2022/lib/components/menu-constructor/store/sproc-menu.tokens.mjs +0 -3
- package/esm2022/lib/components/page-menu/index.mjs +0 -6
- package/esm2022/lib/components/page-menu/schema/sproc-page-menu.consts.mjs +0 -9
- package/esm2022/lib/components/page-menu/schema/sproc-page-menu.schema.mjs +0 -2
- package/esm2022/lib/components/page-menu/schema/sproc-page-menu.tokens.mjs +0 -4
- package/esm2022/lib/components/page-menu/schema/sproc-page-menu.types.mjs +0 -3
- package/esm2022/lib/components/page-menu/sproc-page-menu.component.mjs +0 -275
- package/esm2022/lib/components/paginator/paginator.component.mjs +0 -159
- package/esm2022/lib/components/paginator/types/paginator.types.mjs +0 -2
- package/esm2022/lib/components/register-table/consts/register-table.consts.mjs +0 -4
- package/esm2022/lib/components/register-table/directives/cell-template.directive.mjs +0 -19
- package/esm2022/lib/components/register-table/directives/header-template.directive.mjs +0 -18
- package/esm2022/lib/components/register-table/index.mjs +0 -4
- package/esm2022/lib/components/register-table/model/schema.mjs +0 -10
- package/esm2022/lib/components/register-table/pipes/class-by-type.pipe.mjs +0 -33
- package/esm2022/lib/components/register-table/pipes/sticky-column.pipe.mjs +0 -17
- package/esm2022/lib/components/register-table/register-table.component.mjs +0 -544
- package/esm2022/lib/components/reset-settings-form/reset-settings-form.component.mjs +0 -18
- package/esm2022/lib/components/search-input/search-input.component.mjs +0 -28
- package/esm2022/lib/components/sliding-panel/sliding-panel.component.mjs +0 -48
- package/esm2022/lib/components/sliding-panel/sliding-panel.module.mjs +0 -19
- package/esm2022/lib/consts/date-time.consts.mjs +0 -2
- package/esm2022/lib/consts/index.mjs +0 -4
- package/esm2022/lib/consts/inputs.consts.mjs +0 -4
- package/esm2022/lib/consts/month.consts.mjs +0 -77
- package/esm2022/lib/consts/params.consts.mjs +0 -2
- package/esm2022/lib/consts/register-base.consts.mjs +0 -26
- package/esm2022/lib/core/form-group-wrapper/errors-consts.mjs +0 -8
- package/esm2022/lib/core/form-group-wrapper/form-group-wrapper.mjs +0 -81
- package/esm2022/lib/core/form-group-wrapper/index.mjs +0 -2
- package/esm2022/lib/core/index.mjs +0 -5
- package/esm2022/lib/core/input-control/index.mjs +0 -2
- package/esm2022/lib/core/input-control/input-control.mjs +0 -11
- package/esm2022/lib/core/param/index.mjs +0 -6
- package/esm2022/lib/core/param/param-base.mjs +0 -215
- package/esm2022/lib/core/param/param-date-base.mjs +0 -26
- package/esm2022/lib/core/param/param-select-base.mjs +0 -114
- package/esm2022/lib/core/param/param-text-base.mjs +0 -25
- package/esm2022/lib/core/param/param.tokens.mjs +0 -4
- package/esm2022/lib/core/register-base/index.mjs +0 -3
- package/esm2022/lib/core/register-base/register-base.mjs +0 -575
- package/esm2022/lib/core/register-base/register-base.store.mjs +0 -43
- package/esm2022/lib/directives/date/date-time.types.mjs +0 -34
- package/esm2022/lib/directives/date/format-date.pipe.mjs +0 -33
- package/esm2022/lib/directives/index.mjs +0 -3
- package/esm2022/lib/directives/number/number-only.directive.mjs +0 -41
- package/esm2022/lib/directives/sticky/index.mjs +0 -3
- package/esm2022/lib/directives/sticky/sticky-relative.directive.mjs +0 -32
- package/esm2022/lib/directives/sticky/sticky-relative.service.mjs +0 -32
- package/esm2022/lib/directives/sticky/sticky.directive.mjs +0 -169
- package/esm2022/lib/services/date-time.service.mjs +0 -314
- package/esm2022/lib/services/dialog/dialog.service.mjs +0 -53
- package/esm2022/lib/services/dialog/dialog.types.mjs +0 -2
- package/esm2022/lib/services/dialog/index.mjs +0 -3
- package/esm2022/lib/services/dom-intersection.service.mjs +0 -22
- package/esm2022/lib/services/filter/filters-state.service.mjs +0 -65
- package/esm2022/lib/services/filter/filters-transmit.service.mjs +0 -82
- package/esm2022/lib/services/filter/filters.service.mjs +0 -23
- package/esm2022/lib/services/index.mjs +0 -8
- package/esm2022/lib/services/inputs-state.service.mjs +0 -130
- package/esm2022/lib/services/inputs.service.mjs +0 -88
- package/esm2022/lib/services/key-pressed.service.mjs +0 -37
- package/esm2022/lib/services/resize-window-observer.service.mjs +0 -33
- package/esm2022/lib/services/selected-objects-state.service.mjs +0 -123
- package/esm2022/lib/store/fast-query-store.service.mjs +0 -110
- package/esm2022/lib/store/index.mjs +0 -2
- package/esm2022/lib/types/event.types.mjs +0 -2
- package/esm2022/lib/types/hasura.types.mjs +0 -2
- package/esm2022/lib/types/index.mjs +0 -7
- package/esm2022/lib/types/inputs.types.mjs +0 -19
- package/esm2022/lib/types/params.types.mjs +0 -2
- package/esm2022/lib/types/register-base.types.mjs +0 -6
- package/esm2022/lib/types/sub-types.mjs +0 -2
- package/esm2022/lib/types/user-profile.types.mjs +0 -2
- package/esm2022/lib/utils/functions.mjs +0 -10
- package/esm2022/lib/utils/get-url-segment.mjs +0 -35
- package/esm2022/lib/utils/index.mjs +0 -5
- package/esm2022/lib/utils/prizm.shared.module.mjs +0 -284
- package/esm2022/lib/utils/rxjs.mjs +0 -28
- package/esm2022/lib/utils/select-all-utils.mjs +0 -11
- package/esm2022/ngx-register-base.mjs +0 -5
- package/esm2022/public-api.mjs +0 -9
- package/fesm2022/ngx-register-base.mjs +0 -7465
- package/fesm2022/ngx-register-base.mjs.map +0 -1
- package/index.d.ts +0 -5
- package/lib/components/checkbox-selector/checkbox-selector.component.d.ts +0 -33
- package/lib/components/checkbox-selector/checkbox-selector.types.d.ts +0 -7
- package/lib/components/column-settings/column-settings.component.d.ts +0 -80
- package/lib/components/column-settings/components/column-settings-template/column-settings-template.component.d.ts +0 -24
- package/lib/components/column-settings/consts/column-settings.consts.d.ts +0 -8
- package/lib/components/column-settings/types/column-settings.types.d.ts +0 -22
- package/lib/components/divider/divider.component.d.ts +0 -6
- package/lib/components/filter-button/filter-button.component.d.ts +0 -8
- package/lib/components/filters/components/filter-list/filter-edit/filter-edit.component.d.ts +0 -14
- package/lib/components/filters/components/filter-list/filter-list-footer/filter-list-footer.component.d.ts +0 -25
- package/lib/components/filters/components/filter-list/filter-list-header/filter-list-header.component.d.ts +0 -39
- package/lib/components/filters/components/filter-list/filter-list-saved/filter-list-saved.component.d.ts +0 -41
- package/lib/components/filters/components/filter-list/filter-list.service.d.ts +0 -20
- package/lib/components/filters/components/filter-list/filters-section/filters-section.component.d.ts +0 -15
- package/lib/components/filters/components/filter-list.module.d.ts +0 -15
- package/lib/components/filters/register-table-filter.component.d.ts +0 -40
- package/lib/components/filters/register-table-filter.module.d.ts +0 -13
- package/lib/components/inputs/inputs.module.d.ts +0 -31
- package/lib/components/inputs/param-calendar-year/param-calendar-year.component.d.ts +0 -19
- package/lib/components/inputs/param-custom/param-custom.component.d.ts +0 -6
- package/lib/components/inputs/param-date/param-date.component.d.ts +0 -20
- package/lib/components/inputs/param-date-range/param-date-range.component.d.ts +0 -26
- package/lib/components/inputs/param-date-time/param-date-time.component.d.ts +0 -25
- package/lib/components/inputs/param-date-time-range/param-date-time-range.component.d.ts +0 -28
- package/lib/components/inputs/param-month/param-month.component.d.ts +0 -18
- package/lib/components/inputs/param-month-range/param-month-range.component.d.ts +0 -21
- package/lib/components/inputs/param-multi-select/param-multi-select.component.d.ts +0 -46
- package/lib/components/inputs/param-select/param-select.component.d.ts +0 -30
- package/lib/components/inputs/param-switcher/param-switcher.component.d.ts +0 -8
- package/lib/components/inputs/param-switcher-date-time-range/consts/param-switcher-date-time-range.consts.d.ts +0 -2
- package/lib/components/inputs/param-switcher-date-time-range/param-switcher-date-time-range.component.d.ts +0 -19
- package/lib/components/inputs/param-switcher-date-time-range/types/param-switcher-date-time-range.types.d.ts +0 -8
- package/lib/components/inputs/param-text/param-text.component.d.ts +0 -10
- package/lib/components/inputs/param-textarea/param-textarea.component.d.ts +0 -10
- package/lib/components/inputs/param-toggle/param-toggle.component.d.ts +0 -9
- package/lib/components/inputs/param-tree/consts/param-tree.consts.d.ts +0 -7
- package/lib/components/inputs/param-tree/param-tree.component.d.ts +0 -41
- package/lib/components/inputs/param-tree/services/param-tree.service.d.ts +0 -37
- package/lib/components/inputs/param-tree/services/sync-tree-loader.service.d.ts +0 -10
- package/lib/components/inputs/param-tree/types/param-tree.types.d.ts +0 -32
- package/lib/components/inputs/param-tree/utils/param-tree.utils.d.ts +0 -7
- package/lib/components/inputs/param-tree-multi-select/param-tree-multi-select.component.d.ts +0 -31
- package/lib/components/inputs/param-tree-select/param-tree-select.component.d.ts +0 -30
- package/lib/components/inputs/sub-components/param-delete-content-icon/param-delete-content-btn.component.d.ts +0 -6
- package/lib/components/inputs/sub-components/param-invalid-icon/param-invalid-icon.component.d.ts +0 -5
- package/lib/components/menu-constructor/sproc-menu-constructor.component.d.ts +0 -113
- package/lib/components/menu-constructor/store/sproc-abstract-menu-constructor.store.d.ts +0 -24
- package/lib/components/menu-constructor/store/sproc-menu-constructor.consts.d.ts +0 -36
- package/lib/components/page-menu/schema/sproc-page-menu.consts.d.ts +0 -7
- package/lib/components/page-menu/schema/sproc-page-menu.schema.d.ts +0 -30
- package/lib/components/page-menu/schema/sproc-page-menu.tokens.d.ts +0 -3
- package/lib/components/page-menu/schema/sproc-page-menu.types.d.ts +0 -36
- package/lib/components/page-menu/sproc-page-menu.component.d.ts +0 -48
- package/lib/components/paginator/paginator.component.d.ts +0 -52
- package/lib/components/paginator/types/paginator.types.d.ts +0 -15
- package/lib/components/register-table/consts/register-table.consts.d.ts +0 -3
- package/lib/components/register-table/directives/cell-template.directive.d.ts +0 -9
- package/lib/components/register-table/directives/header-template.directive.d.ts +0 -9
- package/lib/components/register-table/model/schema.d.ts +0 -52
- package/lib/components/register-table/pipes/class-by-type.pipe.d.ts +0 -8
- package/lib/components/register-table/pipes/sticky-column.pipe.d.ts +0 -7
- package/lib/components/register-table/register-table.component.d.ts +0 -165
- package/lib/components/reset-settings-form/reset-settings-form.component.d.ts +0 -9
- package/lib/components/search-input/search-input.component.d.ts +0 -11
- package/lib/components/sliding-panel/sliding-panel.component.d.ts +0 -14
- package/lib/components/sliding-panel/sliding-panel.module.d.ts +0 -9
- package/lib/consts/date-time.consts.d.ts +0 -1
- package/lib/consts/index.d.ts +0 -3
- package/lib/consts/inputs.consts.d.ts +0 -4
- package/lib/consts/month.consts.d.ts +0 -49
- package/lib/consts/params.consts.d.ts +0 -1
- package/lib/consts/register-base.consts.d.ts +0 -19
- package/lib/core/form-group-wrapper/errors-consts.d.ts +0 -5
- package/lib/core/form-group-wrapper/form-group-wrapper.d.ts +0 -15
- package/lib/core/input-control/input-control.d.ts +0 -11
- package/lib/core/param/param-base.d.ts +0 -68
- package/lib/core/param/param-date-base.d.ts +0 -18
- package/lib/core/param/param-select-base.d.ts +0 -42
- package/lib/core/param/param-text-base.d.ts +0 -15
- package/lib/core/register-base/register-base.d.ts +0 -168
- package/lib/core/register-base/register-base.store.d.ts +0 -35
- package/lib/directives/date/date-time.types.d.ts +0 -32
- package/lib/directives/date/format-date.pipe.d.ts +0 -10
- package/lib/directives/number/number-only.directive.d.ts +0 -10
- package/lib/directives/sticky/sticky-relative.directive.d.ts +0 -13
- package/lib/directives/sticky/sticky-relative.service.d.ts +0 -15
- package/lib/directives/sticky/sticky.directive.d.ts +0 -27
- package/lib/services/date-time.service.d.ts +0 -80
- package/lib/services/dialog/dialog.service.d.ts +0 -22
- package/lib/services/dom-intersection.service.d.ts +0 -8
- package/lib/services/filter/filters-state.service.d.ts +0 -21
- package/lib/services/filter/filters-transmit.service.d.ts +0 -28
- package/lib/services/filter/filters.service.d.ts +0 -12
- package/lib/services/inputs-state.service.d.ts +0 -57
- package/lib/services/inputs.service.d.ts +0 -28
- package/lib/services/key-pressed.service.d.ts +0 -15
- package/lib/services/resize-window-observer.service.d.ts +0 -11
- package/lib/services/selected-objects-state.service.d.ts +0 -47
- package/lib/store/fast-query-store.service.d.ts +0 -19
- package/lib/types/hasura.types.d.ts +0 -35
- package/lib/types/inputs.types.d.ts +0 -41
- package/lib/types/params.types.d.ts +0 -27
- package/lib/types/register-base.types.d.ts +0 -123
- package/lib/types/sub-types.d.ts +0 -8
- package/lib/types/user-profile.types.d.ts +0 -17
- package/lib/utils/functions.d.ts +0 -3
- package/lib/utils/get-url-segment.d.ts +0 -7
- package/lib/utils/prizm.shared.module.d.ts +0 -14
- package/lib/utils/rxjs.d.ts +0 -10
- package/lib/utils/select-all-utils.d.ts +0 -8
- package/schematics/ng-update/replace-menu-state-token/index.d.ts +0 -2
- package/schematics/ng-update/replace-menu-state-token/index.js +0 -29
- package/schematics/ng-update/replace-menu-state-token/index.js.map +0 -1
- package/schematics/ng-update/update-prefix/index.d.ts +0 -2
- package/schematics/ng-update/update-prefix/index.js +0 -33
- package/schematics/ng-update/update-prefix/index.js.map +0 -1
- package/schematics/utils/utils.js +0 -25
- package/schematics/utils/utils.js.map +0 -1
- /package/{lib/components/column-settings/index.d.ts → src/lib/components/column-settings/index.ts} +0 -0
- /package/{lib/components/filters/index.d.ts → src/lib/components/filters/index.ts} +0 -0
- /package/{lib/components/index.d.ts → src/lib/components/index.ts} +0 -0
- /package/{lib/components/inputs/index.d.ts → src/lib/components/inputs/index.ts} +0 -0
- /package/{lib/components/inputs/param-switcher-date-time-range/index.d.ts → src/lib/components/inputs/param-switcher-date-time-range/index.ts} +0 -0
- /package/{lib/components/inputs/param-tree/index.d.ts → src/lib/components/inputs/param-tree/index.ts} +0 -0
- /package/{lib/components/menu-constructor/index.d.ts → src/lib/components/menu-constructor/index.ts} +0 -0
- /package/{lib/components/page-menu/index.d.ts → src/lib/components/page-menu/index.ts} +0 -0
- /package/{lib/components/register-table/index.d.ts → src/lib/components/register-table/index.ts} +0 -0
- /package/{lib/core/form-group-wrapper/index.d.ts → src/lib/core/form-group-wrapper/index.ts} +0 -0
- /package/{lib/core/index.d.ts → src/lib/core/index.ts} +0 -0
- /package/{lib/core/input-control/index.d.ts → src/lib/core/input-control/index.ts} +0 -0
- /package/{lib/core/param/index.d.ts → src/lib/core/param/index.ts} +0 -0
- /package/{lib/core/register-base/index.d.ts → src/lib/core/register-base/index.ts} +0 -0
- /package/{lib/directives/index.d.ts → src/lib/directives/index.ts} +0 -0
- /package/{lib/directives/sticky/index.d.ts → src/lib/directives/sticky/index.ts} +0 -0
- /package/{lib/services/dialog/index.d.ts → src/lib/services/dialog/index.ts} +0 -0
- /package/{lib/services/index.d.ts → src/lib/services/index.ts} +0 -0
- /package/{lib/store/index.d.ts → src/lib/store/index.ts} +0 -0
- /package/{lib/types/index.d.ts → src/lib/types/index.ts} +0 -0
- /package/{lib/utils/index.d.ts → src/lib/utils/index.ts} +0 -0
- /package/{public-api.d.ts → src/public-api.ts} +0 -0
|
@@ -1,544 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, contentChildren, DestroyRef, effect, ElementRef, inject, input, output, signal, untracked, viewChild, viewChildren, } from '@angular/core';
|
|
2
|
-
import { DomIntersectionService } from '../../services/dom-intersection.service';
|
|
3
|
-
import { TuiHint, TuiIcon, TuiLoader, TuiScrollbar } from '@taiga-ui/core';
|
|
4
|
-
import { TuiTable } from '@taiga-ui/addon-table';
|
|
5
|
-
import { AsyncPipe, DecimalPipe, NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';
|
|
6
|
-
import { EColumnDataType, } from './model/schema';
|
|
7
|
-
import { TuiCheckbox } from '@taiga-ui/kit';
|
|
8
|
-
import { EDatePattern, ETimezone } from '../../directives/date/date-time.types';
|
|
9
|
-
import { outputFromObservable, takeUntilDestroyed, toObservable, toSignal, } from '@angular/core/rxjs-interop';
|
|
10
|
-
import { HeaderTemplateDirective } from './directives/header-template.directive';
|
|
11
|
-
import { DateTimeService } from '../../services/date-time.service';
|
|
12
|
-
import { CellTemplateDirective } from './directives/cell-template.directive';
|
|
13
|
-
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
14
|
-
import { KEY_PRESSED, KeyPressedService } from '../../services/key-pressed.service';
|
|
15
|
-
import { EOrder, THS_WIDTH_CHANGES_DEBOUNCE_TIME_MLS } from '../../consts/register-base.consts';
|
|
16
|
-
import { ClassByTypePipe } from './pipes/class-by-type.pipe';
|
|
17
|
-
import { StickyColumnPipe } from './pipes/sticky-column.pipe';
|
|
18
|
-
import { CHECKBOX_SELECTOR_KEY, CHECKBOX_SELECTOR_WIDTH_PX, MIN_COL_WIDTH_PX, } from './consts/register-table.consts';
|
|
19
|
-
import { BehaviorSubject, combineLatest, debounceTime, map, skip, Subject, switchMap, tap, } from 'rxjs';
|
|
20
|
-
import { CheckboxSelectorComponent } from '../checkbox-selector/checkbox-selector.component';
|
|
21
|
-
import { distinctUntilChangedJSONs } from '../../utils';
|
|
22
|
-
import { StickyDirective, StickyRelativeDirective } from '../../directives';
|
|
23
|
-
import { ERegisterObjectState } from '../../types';
|
|
24
|
-
import { SelectedObjectsStateService } from '../../services';
|
|
25
|
-
import { TuiResizable, TuiResizer } from '@taiga-ui/cdk';
|
|
26
|
-
import { FormatDatePipe } from '../../directives/date/format-date.pipe';
|
|
27
|
-
import { PaginatorComponent } from '../paginator/paginator.component';
|
|
28
|
-
import * as i0 from "@angular/core";
|
|
29
|
-
import * as i1 from "@taiga-ui/addon-table";
|
|
30
|
-
import * as i2 from "@taiga-ui/core";
|
|
31
|
-
/** Общий компонент для создания таблицы ресстра */
|
|
32
|
-
export class RegisterTableComponent {
|
|
33
|
-
constructor() {
|
|
34
|
-
/** Переданный контент для заголовков таблицы, темплейты с директивой HeaderTemplateDirective */
|
|
35
|
-
this.headerTemplates = contentChildren(HeaderTemplateDirective);
|
|
36
|
-
/** Переданный контент для ячеек таблицы, темплейты с директивой CellTemplateDirective */
|
|
37
|
-
this.cellTemplates = contentChildren(CellTemplateDirective);
|
|
38
|
-
/** Элементы строк таблицы */
|
|
39
|
-
this.bodyRows = viewChildren('bodyRow', { read: ElementRef });
|
|
40
|
-
/** Элемент скролла таблицы */
|
|
41
|
-
this.scrollbar = viewChild(TuiScrollbar, { read: ElementRef });
|
|
42
|
-
/** Состояние загрузки данных таблицы */
|
|
43
|
-
this.isLoading = input.required();
|
|
44
|
-
/** Состояние загрузки данных пагинации */
|
|
45
|
-
this.isPaginatorLoading = input(false);
|
|
46
|
-
/** Номер страницы */
|
|
47
|
-
this.page = input.required();
|
|
48
|
-
/** Количество записей на одной странице */
|
|
49
|
-
this.limit = input.required();
|
|
50
|
-
/** Отображение колонки выбора строк (по умолчанию отображается) */
|
|
51
|
-
this.checkboxColumn = input(true);
|
|
52
|
-
/** Список столбцов */
|
|
53
|
-
this.columns = input.required();
|
|
54
|
-
/** Данные столбцов */
|
|
55
|
-
this.columnsData = input.required();
|
|
56
|
-
/** Идентификаторы фиксированных слева столбцов */
|
|
57
|
-
this.stickyLeftIds = input();
|
|
58
|
-
/** Идентификаторы фиксированных слева столбцов */
|
|
59
|
-
this.stickyRightIds = input();
|
|
60
|
-
/** Всего записей */
|
|
61
|
-
this.totalRecords = input.required();
|
|
62
|
-
/** Всего записей, без учета фильтра */
|
|
63
|
-
this.totalNotFiltered = input.required();
|
|
64
|
-
/** Значения таблицы */
|
|
65
|
-
this.rowData = input.required();
|
|
66
|
-
/**
|
|
67
|
-
* @description Идентификаторы выбранных записей
|
|
68
|
-
*
|
|
69
|
-
* @deprecated Используйте stateObjects
|
|
70
|
-
* */
|
|
71
|
-
this.selectedIds = input(new Set());
|
|
72
|
-
/**
|
|
73
|
-
* @description Объекты выбранных записей
|
|
74
|
-
*
|
|
75
|
-
* @deprecated Используйте stateObjects
|
|
76
|
-
* */
|
|
77
|
-
this.selectedObjects = input(new Set());
|
|
78
|
-
/** Загрузка дополнительных записей при выборе соответствущего пункта в чекбокс-селекторе */
|
|
79
|
-
this.isSelectloading = input(false);
|
|
80
|
-
/** Текст пустой таблицы */
|
|
81
|
-
this.emptyText = input('Нет данных');
|
|
82
|
-
/** Дизейбл сортировки */
|
|
83
|
-
this.sortingDisabled = input(false);
|
|
84
|
-
/** Максимальное значения выбора чекбоксов через поле ввода */
|
|
85
|
-
this.checkboxInputMaxValue = input(null);
|
|
86
|
-
/** Дизейбл выбора чекбоксов */
|
|
87
|
-
this.checkboxDisabled = input(false);
|
|
88
|
-
/** Дизейбл выбора чекбоксов */
|
|
89
|
-
this.paginatorDisabled = input(false);
|
|
90
|
-
this.selectedCounter = computed(() => {
|
|
91
|
-
const selectedSize = this._selectedService?.selectedValues()?.size ?? null;
|
|
92
|
-
const unselectedSize = this._selectedService?.unselectedValues()?.size ?? 0;
|
|
93
|
-
const unfetchedObjects = this._selectedService?.stateUnfetchedObjects();
|
|
94
|
-
const isNotSelected = unfetchedObjects !== ERegisterObjectState.SELECTED;
|
|
95
|
-
if (selectedSize === null) {
|
|
96
|
-
this._deprecatedSelectedRowsCounter();
|
|
97
|
-
return this.selectedIds().size;
|
|
98
|
-
}
|
|
99
|
-
return isNotSelected ? selectedSize : this.totalRecords() - unselectedSize;
|
|
100
|
-
});
|
|
101
|
-
this.dts = inject(DateTimeService);
|
|
102
|
-
this.destroyRef = inject(DestroyRef);
|
|
103
|
-
this._shift = inject(KeyPressedService);
|
|
104
|
-
this._domIntersectionService = inject(DomIntersectionService);
|
|
105
|
-
// TODO удалить optional: true после выполнения задачи SMA2-3134
|
|
106
|
-
this._selectedService = inject(SelectedObjectsStateService, {
|
|
107
|
-
optional: true,
|
|
108
|
-
});
|
|
109
|
-
/** Событие выбора в чекбокс-селекторе */
|
|
110
|
-
this.selectChanged = output();
|
|
111
|
-
/** Событие изменения значений пагинатора */
|
|
112
|
-
this.paginatorChange = output();
|
|
113
|
-
/** Событие нажатия на строку */
|
|
114
|
-
this.rowClick = output();
|
|
115
|
-
/** Событие двойного нажатия на строку */
|
|
116
|
-
this.rowDblClick = output();
|
|
117
|
-
/** Событие нажатия на строку */
|
|
118
|
-
this.rowSelected = output();
|
|
119
|
-
/** Событие сортировки значений в таблице */
|
|
120
|
-
this.sort = output();
|
|
121
|
-
/** Событие изменения ширины колонки */
|
|
122
|
-
this._thsWidthMap = computed(() => new Map(this.columnsData().map(({ name, width }) => [name, new BehaviorSubject(width)])));
|
|
123
|
-
this.thsWidthChange = outputFromObservable(toObservable(this._thsWidthMap).pipe(switchMap((changes) => combineLatest([...changes.entries()].map(([name, $width]) => $width.asObservable().pipe(map((width) => ({ name, width }))))).pipe(distinctUntilChangedJSONs(), debounceTime(THS_WIDTH_CHANGES_DEBOUNCE_TIME_MLS), skip(1)))));
|
|
124
|
-
/** Событие изменения видимых строк таблицы */
|
|
125
|
-
this._observerRowsVisibilityDOM$ = toObservable(this.bodyRows).pipe(switchMap((bodyRows) => combineLatest(bodyRows.map((bodyRow, index) => this._domIntersectionService.createAndObserve(bodyRow).pipe(
|
|
126
|
-
// TODO удалить tap, как только перестанет использоваться is_visible по проекту
|
|
127
|
-
tap((isVisible) => {
|
|
128
|
-
this.rowData()[index].is_visible = isVisible;
|
|
129
|
-
}), map((isVisible) => (isVisible ? this.rowData()[index] : undefined))))).pipe(map((visibleRows) => visibleRows.filter((visibleRow) => !!visibleRow)))));
|
|
130
|
-
this.visibleRowsChange = outputFromObservable(this._observerRowsVisibilityDOM$);
|
|
131
|
-
this.EColumnDataType = EColumnDataType;
|
|
132
|
-
this.ETimezone = ETimezone;
|
|
133
|
-
this.EDatePattern = EDatePattern;
|
|
134
|
-
this.ERegisterObjectState = ERegisterObjectState;
|
|
135
|
-
this.CHECKBOX_SELECTOR_KEY = CHECKBOX_SELECTOR_KEY;
|
|
136
|
-
this.CHECKBOX_SELECTOR_WIDTH_PX = CHECKBOX_SELECTOR_WIDTH_PX;
|
|
137
|
-
this.stickyThStyle = Object.freeze({ 'z-index': 22 });
|
|
138
|
-
this.stickyTdStyle = Object.freeze({ 'z-index': 21 });
|
|
139
|
-
this.columnsWithCheckboxes = computed(() => [
|
|
140
|
-
CHECKBOX_SELECTOR_KEY,
|
|
141
|
-
...this.columns(),
|
|
142
|
-
]);
|
|
143
|
-
this.scrollPosition = signal({ top: 0, left: 0 });
|
|
144
|
-
this.tableWidth = toSignal(combineLatest([toObservable(this.columnsWithCheckboxes), toObservable(this._thsWidthMap)]).pipe(map(({ 0: visibleColumns, 1: changes }) => new Map([...changes.entries()].filter(([thName]) => visibleColumns.includes(thName)))), switchMap((changes) => combineLatest([...changes.entries()].map(({ 1: $width }) => $width.asObservable().pipe(map((width) => width)))).pipe(map((widths) => {
|
|
145
|
-
let tableWidth = this.checkboxColumn() ? CHECKBOX_SELECTOR_WIDTH_PX : 0;
|
|
146
|
-
for (const width of widths) {
|
|
147
|
-
tableWidth += width ? Number(width) : 0;
|
|
148
|
-
}
|
|
149
|
-
return tableWidth;
|
|
150
|
-
})))));
|
|
151
|
-
this.stateObjects = this._selectedService?.state;
|
|
152
|
-
this.visibleColumnsTree = computed(() => this._filterVisibleColumns(this.columnsData(), this.columns()));
|
|
153
|
-
this.maxDepth = computed(() => this._getMaxDepth(this.visibleColumnsTree()));
|
|
154
|
-
this.leaves = computed(() => this._getFlatLeaves(this.visibleColumnsTree()));
|
|
155
|
-
this.headerRows = computed(() => {
|
|
156
|
-
const maxDepth = this.maxDepth();
|
|
157
|
-
const rows = Array.from({ length: maxDepth }, () => []);
|
|
158
|
-
if (maxDepth === 0) {
|
|
159
|
-
return rows;
|
|
160
|
-
}
|
|
161
|
-
for (const col of this.visibleColumnsTree()) {
|
|
162
|
-
this._buildHeaderRecursive(col, 0, maxDepth, rows);
|
|
163
|
-
}
|
|
164
|
-
return rows;
|
|
165
|
-
});
|
|
166
|
-
this._deprecatedSelectedRowsCounter = signal(0);
|
|
167
|
-
this.timeZoneChanges$ = this.dts.isTimeZoneChanged$;
|
|
168
|
-
this.columnOrders = new Map();
|
|
169
|
-
this._projectedHeadersMap = new Map();
|
|
170
|
-
this._projectedCellsMap = new Map();
|
|
171
|
-
this._clickedRow$ = new Subject();
|
|
172
|
-
this._hoveredRow$ = new BehaviorSubject(null);
|
|
173
|
-
this._setScrollPositionAfterDataLoading();
|
|
174
|
-
this._projectHeaderTemplates();
|
|
175
|
-
this._projectCellTemplates();
|
|
176
|
-
// TODO удалить метод, как только перестанет использоваться is_visible по проекту
|
|
177
|
-
this._syncRowVisibilityDOM();
|
|
178
|
-
effect(() => {
|
|
179
|
-
const data = this.rowData();
|
|
180
|
-
if (data.length > 0 && !this.lastSelectedRow) {
|
|
181
|
-
[this.lastSelectedRow] = data;
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
_setScrollPositionAfterDataLoading() {
|
|
186
|
-
effect(() => {
|
|
187
|
-
if (!this.isLoading()) {
|
|
188
|
-
untracked(() => {
|
|
189
|
-
const { top, left } = this.scrollPosition();
|
|
190
|
-
const scrollbarElement = this.scrollbar()?.nativeElement;
|
|
191
|
-
if (scrollbarElement) {
|
|
192
|
-
scrollbarElement.scrollTop = top;
|
|
193
|
-
scrollbarElement.scrollLeft = left;
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
_projectHeaderTemplates() {
|
|
200
|
-
effect(() => {
|
|
201
|
-
this._projectedHeadersMap.clear();
|
|
202
|
-
for (const template of this.headerTemplates()) {
|
|
203
|
-
this._projectedHeadersMap.set(template.headerTemplateName(), template.tpl);
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
_projectCellTemplates() {
|
|
208
|
-
effect(() => {
|
|
209
|
-
this._projectedCellsMap.clear();
|
|
210
|
-
for (const template of this.cellTemplates()) {
|
|
211
|
-
this._projectedCellsMap.set(template.cellTemplateName, template.tpl);
|
|
212
|
-
}
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
_syncRowVisibilityDOM() {
|
|
216
|
-
this._observerRowsVisibilityDOM$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe();
|
|
217
|
-
}
|
|
218
|
-
ngOnDestroy() {
|
|
219
|
-
this._clickedRow$.complete();
|
|
220
|
-
this._hoveredRow$.complete();
|
|
221
|
-
for (const subject of this._thsWidthMap().values()) {
|
|
222
|
-
subject.complete();
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
getProjectionHeaderByName(name) {
|
|
226
|
-
return this._projectedHeadersMap.get(name);
|
|
227
|
-
}
|
|
228
|
-
getProjectionCellByName(name) {
|
|
229
|
-
return this._projectedCellsMap.get(name);
|
|
230
|
-
}
|
|
231
|
-
sortChange({ sortComparator }) {
|
|
232
|
-
if (!sortComparator) {
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
|
-
const id = sortComparator({}, {});
|
|
236
|
-
const columnOrder = this.columnOrders.get(id);
|
|
237
|
-
if (this._shift.isPressed()) {
|
|
238
|
-
this.updateColumnOrder(id, columnOrder);
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
this.columnOrders.clear();
|
|
242
|
-
this.updateColumnOrder(id, columnOrder);
|
|
243
|
-
}
|
|
244
|
-
this.sort.emit([...this.columnOrders.values()]);
|
|
245
|
-
}
|
|
246
|
-
updateColumnOrder(id, columnOrder) {
|
|
247
|
-
if (columnOrder) {
|
|
248
|
-
const { options } = columnOrder;
|
|
249
|
-
const { order } = options;
|
|
250
|
-
if (order === EOrder.DESC) {
|
|
251
|
-
this.columnOrders.delete(id);
|
|
252
|
-
}
|
|
253
|
-
else {
|
|
254
|
-
this.columnOrders.set(id, { options: { ...options, order: EOrder.DESC } });
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
this.columnOrders.set(id, { options: { id, order: EOrder.ASC } });
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
setThName(thName) {
|
|
262
|
-
return () => thName;
|
|
263
|
-
}
|
|
264
|
-
checkAvailableColumnSorting(columnData) {
|
|
265
|
-
const { sortable, type } = columnData;
|
|
266
|
-
const availableSortColumnTypes = [
|
|
267
|
-
EColumnDataType.TEXT,
|
|
268
|
-
EColumnDataType.DATE,
|
|
269
|
-
EColumnDataType.NUM,
|
|
270
|
-
];
|
|
271
|
-
return !this.sortingDisabled() && sortable !== false && availableSortColumnTypes.includes(type);
|
|
272
|
-
}
|
|
273
|
-
checkResizeBlocked(columnData) {
|
|
274
|
-
const resizableBlockedTypes = [
|
|
275
|
-
EColumnDataType.CHECKBOX,
|
|
276
|
-
EColumnDataType.ICON,
|
|
277
|
-
EColumnDataType.ICON_SVG,
|
|
278
|
-
];
|
|
279
|
-
return columnData.fixed || resizableBlockedTypes.includes(columnData.type);
|
|
280
|
-
}
|
|
281
|
-
onRowHover(row) {
|
|
282
|
-
this._hoveredRow$.next(row);
|
|
283
|
-
}
|
|
284
|
-
onRowClick(event, row) {
|
|
285
|
-
const blueHighlightsSelected = window.getSelection();
|
|
286
|
-
blueHighlightsSelected?.removeAllRanges();
|
|
287
|
-
const stateObjects = this.stateObjects?.();
|
|
288
|
-
// TODO оставить только if после SMA2-3134
|
|
289
|
-
if (stateObjects) {
|
|
290
|
-
if (event.shiftKey) {
|
|
291
|
-
this._changeRangeRowsState(stateObjects, this.lastSelectedRow, row);
|
|
292
|
-
}
|
|
293
|
-
else {
|
|
294
|
-
if (event.ctrlKey) {
|
|
295
|
-
this._changeOnlyRowState(stateObjects, row, true);
|
|
296
|
-
}
|
|
297
|
-
else {
|
|
298
|
-
this._changeOnlyRowState(stateObjects, row);
|
|
299
|
-
}
|
|
300
|
-
this.lastSelectedRow = row;
|
|
301
|
-
}
|
|
302
|
-
this.rowClick.emit(row);
|
|
303
|
-
const selectedObjects = this._selectedService?.selectedValues();
|
|
304
|
-
if (selectedObjects) {
|
|
305
|
-
this.rowSelected.emit({
|
|
306
|
-
row: [...selectedObjects],
|
|
307
|
-
count: selectedObjects.size,
|
|
308
|
-
});
|
|
309
|
-
}
|
|
310
|
-
this._clickedRow$.next(row);
|
|
311
|
-
return;
|
|
312
|
-
}
|
|
313
|
-
if (event.shiftKey) {
|
|
314
|
-
this._selectRangeRows(this.lastSelectedRow, row);
|
|
315
|
-
}
|
|
316
|
-
else {
|
|
317
|
-
if (event.ctrlKey) {
|
|
318
|
-
this._selectOnlyRow(row, true);
|
|
319
|
-
}
|
|
320
|
-
else {
|
|
321
|
-
this._selectOnlyRow(row);
|
|
322
|
-
}
|
|
323
|
-
this.lastSelectedRow = row;
|
|
324
|
-
}
|
|
325
|
-
this.rowClick.emit(row);
|
|
326
|
-
this.rowSelected.emit({
|
|
327
|
-
row: [...this.selectedObjects()],
|
|
328
|
-
count: this.selectedObjects().size,
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
_changeOnlyRowState(state, row, saveSelected) {
|
|
332
|
-
if (typeof row !== 'object' || !row || !('id' in row)) {
|
|
333
|
-
console.error('Поле id отсутствует в элементе', row);
|
|
334
|
-
return;
|
|
335
|
-
}
|
|
336
|
-
const id = row.id;
|
|
337
|
-
const wasSelected = state.get(id)?.state === ERegisterObjectState.SELECTED;
|
|
338
|
-
if (saveSelected) {
|
|
339
|
-
this.updateStateObjectByKey(id, {
|
|
340
|
-
state: wasSelected ? ERegisterObjectState.UNSELECTED : ERegisterObjectState.SELECTED,
|
|
341
|
-
});
|
|
342
|
-
}
|
|
343
|
-
else {
|
|
344
|
-
this.updateAllStateObjectsByState(ERegisterObjectState.UNSELECTED);
|
|
345
|
-
this.updateStateObjectByKey(id, { state: ERegisterObjectState.SELECTED });
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
_selectOnlyRow(row, saveSelected) {
|
|
349
|
-
if (typeof row !== 'object' || !row || !('id' in row)) {
|
|
350
|
-
console.error('Поле id отсутствует в элементе', row);
|
|
351
|
-
return;
|
|
352
|
-
}
|
|
353
|
-
const id = row.id;
|
|
354
|
-
const wasSelected = this.selectedIds().has(id);
|
|
355
|
-
if (saveSelected) {
|
|
356
|
-
if (wasSelected) {
|
|
357
|
-
this.selectedIds().delete(id);
|
|
358
|
-
this.selectedObjects().delete(row);
|
|
359
|
-
}
|
|
360
|
-
else {
|
|
361
|
-
this.selectedIds().add(id);
|
|
362
|
-
this.selectedObjects().add(row);
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
else {
|
|
366
|
-
this.selectedIds().clear();
|
|
367
|
-
this.selectedObjects().clear();
|
|
368
|
-
this.selectedIds().add(id);
|
|
369
|
-
this.selectedObjects().add(row);
|
|
370
|
-
}
|
|
371
|
-
this._emitDeprecatedSelectedRows();
|
|
372
|
-
}
|
|
373
|
-
_emitDeprecatedSelectedRows() {
|
|
374
|
-
this._deprecatedSelectedRowsCounter.update((value) => value + 1);
|
|
375
|
-
}
|
|
376
|
-
_changeRangeRowsState(stateObjects, previousRow, currentRow) {
|
|
377
|
-
this.updateAllStateObjectsByState(ERegisterObjectState.UNSELECTED);
|
|
378
|
-
let prevIndex = this.rowData().indexOf(previousRow);
|
|
379
|
-
let currIndex = this.rowData().indexOf(currentRow);
|
|
380
|
-
if (prevIndex > currIndex) {
|
|
381
|
-
const tempIndex = prevIndex;
|
|
382
|
-
prevIndex = currIndex;
|
|
383
|
-
currIndex = tempIndex;
|
|
384
|
-
}
|
|
385
|
-
const idsObjectsShouldSelected = new Set(this.rowData()
|
|
386
|
-
.slice(prevIndex === -1 ? 0 : prevIndex, currIndex + 1)
|
|
387
|
-
.map((row) => row.id));
|
|
388
|
-
const slicedStateObjects = new Map([...stateObjects].filter(([key]) => idsObjectsShouldSelected.has(key)));
|
|
389
|
-
for (const key of slicedStateObjects.keys()) {
|
|
390
|
-
this.updateStateObjectByKey(key, { state: ERegisterObjectState.SELECTED });
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
_selectRangeRows(previousRow, currentRow) {
|
|
394
|
-
let prevIndex = this.rowData().indexOf(previousRow);
|
|
395
|
-
let currIndex = this.rowData().indexOf(currentRow);
|
|
396
|
-
if (prevIndex > currIndex) {
|
|
397
|
-
const tempIndex = prevIndex;
|
|
398
|
-
prevIndex = currIndex;
|
|
399
|
-
currIndex = tempIndex;
|
|
400
|
-
}
|
|
401
|
-
const itemsShouldSelected = this.rowData().slice(prevIndex === -1 ? 0 : prevIndex, currIndex + 1);
|
|
402
|
-
this.selectedIds().clear();
|
|
403
|
-
this.selectedObjects().clear();
|
|
404
|
-
this._emitDeprecatedSelectedRows();
|
|
405
|
-
for (const item of itemsShouldSelected) {
|
|
406
|
-
this.selectedIds().add(item.id);
|
|
407
|
-
this.selectedObjects().add(item);
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
thResizeChanges(name, width) {
|
|
411
|
-
const thWidthChangesEntry = this._thsWidthMap().get(name);
|
|
412
|
-
if (thWidthChangesEntry) {
|
|
413
|
-
const validWidth = width > MIN_COL_WIDTH_PX ? width : MIN_COL_WIDTH_PX;
|
|
414
|
-
thWidthChangesEntry.next(validWidth.toString());
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
getThWidth(name) {
|
|
418
|
-
const thWidthChangesEntry = this._thsWidthMap().get(name);
|
|
419
|
-
return thWidthChangesEntry?.getValue();
|
|
420
|
-
}
|
|
421
|
-
saveScrollEndPosition() {
|
|
422
|
-
const scrollbarElement = this.scrollbar()?.nativeElement;
|
|
423
|
-
if (scrollbarElement && !this.isLoading()) {
|
|
424
|
-
const { scrollTop, scrollLeft } = scrollbarElement;
|
|
425
|
-
this.scrollPosition.set({
|
|
426
|
-
top: scrollTop,
|
|
427
|
-
left: scrollLeft,
|
|
428
|
-
});
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
updateAllStateObjectsByState(state) {
|
|
432
|
-
this._selectedService?.setAllStateObjectsByState(state);
|
|
433
|
-
}
|
|
434
|
-
updateStateObjectByKey(key, updates) {
|
|
435
|
-
this._selectedService?.setStateObjectByKey(key, updates);
|
|
436
|
-
}
|
|
437
|
-
markRowBeforeSelect(row) {
|
|
438
|
-
const shiftPressed = this._shift.isPressed();
|
|
439
|
-
const prevRow = this.lastSelectedRow;
|
|
440
|
-
const hoveredRow = this._hoveredRow$.getValue();
|
|
441
|
-
if (shiftPressed && prevRow && hoveredRow) {
|
|
442
|
-
let beforeIndex = this.rowData().indexOf(prevRow);
|
|
443
|
-
let afterIndex = this.rowData().indexOf(hoveredRow);
|
|
444
|
-
if (beforeIndex > afterIndex) {
|
|
445
|
-
const tempIndex = beforeIndex;
|
|
446
|
-
beforeIndex = afterIndex;
|
|
447
|
-
afterIndex = tempIndex;
|
|
448
|
-
}
|
|
449
|
-
const currentIndex = this.rowData().indexOf(row);
|
|
450
|
-
return beforeIndex <= currentIndex && currentIndex <= afterIndex;
|
|
451
|
-
}
|
|
452
|
-
return false;
|
|
453
|
-
}
|
|
454
|
-
_buildHeaderRecursive(col, level, maxDepth, rows) {
|
|
455
|
-
const children = col.children || [];
|
|
456
|
-
const hasChildren = children.length > 0;
|
|
457
|
-
const customRowspan = col.rowspan || 1;
|
|
458
|
-
const nextLevel = level + customRowspan;
|
|
459
|
-
let colspan = 0;
|
|
460
|
-
if (hasChildren) {
|
|
461
|
-
for (const child of children) {
|
|
462
|
-
colspan += this._buildHeaderRecursive(child, nextLevel, maxDepth, rows);
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
else {
|
|
466
|
-
colspan = 1;
|
|
467
|
-
}
|
|
468
|
-
const rowspan = hasChildren ? customRowspan : maxDepth - level;
|
|
469
|
-
if (rows[level]) {
|
|
470
|
-
rows[level].push({ col, rowspan, colspan });
|
|
471
|
-
}
|
|
472
|
-
return colspan;
|
|
473
|
-
}
|
|
474
|
-
_getFlatLeaves(columns) {
|
|
475
|
-
return columns.flatMap((col) => {
|
|
476
|
-
if (col.children && col.children.length > 0) {
|
|
477
|
-
return this._getFlatLeaves(col.children);
|
|
478
|
-
}
|
|
479
|
-
return [col];
|
|
480
|
-
});
|
|
481
|
-
}
|
|
482
|
-
_filterVisibleColumns(columns, showedNames) {
|
|
483
|
-
return columns
|
|
484
|
-
.map((col) => {
|
|
485
|
-
if (col.children && col.children.length > 0) {
|
|
486
|
-
const visibleChildren = this._filterVisibleColumns(col.children, showedNames);
|
|
487
|
-
return { ...col, children: visibleChildren };
|
|
488
|
-
}
|
|
489
|
-
return col;
|
|
490
|
-
})
|
|
491
|
-
.filter((col) => showedNames.includes(col.name) || (col.children && col.children.length > 0));
|
|
492
|
-
}
|
|
493
|
-
_getMaxDepth(columns) {
|
|
494
|
-
if (!columns || columns.length === 0) {
|
|
495
|
-
return 0;
|
|
496
|
-
}
|
|
497
|
-
return 1 + Math.max(...columns.map((c) => this._getMaxDepth(c.children || [])));
|
|
498
|
-
}
|
|
499
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RegisterTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
500
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RegisterTableComponent, isStandalone: true, selector: "sproc-register-table", inputs: { isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: true, transformFunction: null }, isPaginatorLoading: { classPropertyName: "isPaginatorLoading", publicName: "isPaginatorLoading", isSignal: true, isRequired: false, transformFunction: null }, page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: true, transformFunction: null }, limit: { classPropertyName: "limit", publicName: "limit", isSignal: true, isRequired: true, transformFunction: null }, checkboxColumn: { classPropertyName: "checkboxColumn", publicName: "checkboxColumn", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, columnsData: { classPropertyName: "columnsData", publicName: "columnsData", isSignal: true, isRequired: true, transformFunction: null }, stickyLeftIds: { classPropertyName: "stickyLeftIds", publicName: "stickyLeftIds", isSignal: true, isRequired: false, transformFunction: null }, stickyRightIds: { classPropertyName: "stickyRightIds", publicName: "stickyRightIds", isSignal: true, isRequired: false, transformFunction: null }, totalRecords: { classPropertyName: "totalRecords", publicName: "totalRecords", isSignal: true, isRequired: true, transformFunction: null }, totalNotFiltered: { classPropertyName: "totalNotFiltered", publicName: "totalNotFiltered", isSignal: true, isRequired: true, transformFunction: null }, rowData: { classPropertyName: "rowData", publicName: "rowData", isSignal: true, isRequired: true, transformFunction: null }, selectedIds: { classPropertyName: "selectedIds", publicName: "selectedIds", isSignal: true, isRequired: false, transformFunction: null }, selectedObjects: { classPropertyName: "selectedObjects", publicName: "selectedObjects", isSignal: true, isRequired: false, transformFunction: null }, isSelectloading: { classPropertyName: "isSelectloading", publicName: "isSelectloading", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, sortingDisabled: { classPropertyName: "sortingDisabled", publicName: "sortingDisabled", isSignal: true, isRequired: false, transformFunction: null }, checkboxInputMaxValue: { classPropertyName: "checkboxInputMaxValue", publicName: "checkboxInputMaxValue", isSignal: true, isRequired: false, transformFunction: null }, checkboxDisabled: { classPropertyName: "checkboxDisabled", publicName: "checkboxDisabled", isSignal: true, isRequired: false, transformFunction: null }, paginatorDisabled: { classPropertyName: "paginatorDisabled", publicName: "paginatorDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectChanged: "selectChanged", paginatorChange: "paginatorChange", rowClick: "rowClick", rowDblClick: "rowDblClick", rowSelected: "rowSelected", sort: "sort", thsWidthChange: "thsWidthChange", visibleRowsChange: "visibleRowsChange" }, providers: [
|
|
501
|
-
DomIntersectionService,
|
|
502
|
-
KeyPressedService,
|
|
503
|
-
{
|
|
504
|
-
provide: KEY_PRESSED,
|
|
505
|
-
useValue: 'Shift',
|
|
506
|
-
},
|
|
507
|
-
], queries: [{ propertyName: "headerTemplates", predicate: HeaderTemplateDirective, isSignal: true }, { propertyName: "cellTemplates", predicate: CellTemplateDirective, isSignal: true }], viewQueries: [{ propertyName: "bodyRows", predicate: ["bodyRow"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "scrollbar", first: true, predicate: TuiScrollbar, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<section class=\"register-table__section\">\n <tui-scrollbar class=\"register-table__scrollable\" (scrollend)=\"saveScrollEndPosition()\">\n <tui-loader class=\"register-table__loader\" [showLoader]=\"isLoading() || false\" [overlay]=\"true\">\n <table\n tuiTable\n class=\"table\"\n stickyRelative\n [columns]=\"columnsWithCheckboxes()\"\n [style.width.px]=\"tableWidth()\"\n tuiSortBy=\"\"\n (sortChange)=\"sortChange($event)\"\n >\n <thead>\n @for (hrow of headerRows(); track $index) {\n <tr tuiThGroup>\n @if ($first && checkboxColumn()) {\n <th\n tuiTh\n *tuiHead=\"CHECKBOX_SELECTOR_KEY\"\n class=\"register-table__th-background--table-cell-blue register-table__cell-icon register-table__cell-checkbox-selector\"\n [style.width.px]=\"CHECKBOX_SELECTOR_WIDTH_PX\"\n [sorter]=\"null\"\n [rowSpan]=\"maxDepth()\"\n >\n <sproc-checkbox-selector\n [selected]=\"selectedIds()\"\n [totalRecords]=\"totalRecords()\"\n [loading]=\"isSelectloading()\"\n [disabled]=\"checkboxDisabled()\"\n (onApply)=\"selectChanged.emit($event)\"\n ></sproc-checkbox-selector>\n </th>\n }\n @for (cell of hrow; track cell.col.name) {\n @let thClass = cell.col.class ?? '';\n @let thType = cell.col.type;\n @let thName = cell.col.name;\n @let sortable = checkAvailableColumnSorting(cell.col);\n @let resizeBlocked = checkResizeBlocked(cell.col);\n <th\n tuiTh\n tuiResizable\n *tuiHead=\"thName\"\n [ngClass]=\"['register-table__th', thType | classByType, thClass]\"\n [stickyLeft]=\"cell.col.fixed ?? (thName | stickyColumn: stickyLeftIds())\"\n [stickyRight]=\"cell.col.fixed ?? (thName | stickyColumn: stickyRightIds())\"\n [stylesOnSticky]=\"stickyThStyle\"\n [style]=\"cell.col.headerStyle ?? ''\"\n [style.min-width.px]=\"getThWidth(thName)\"\n [style.width.px]=\"getThWidth(thName)\"\n [style.max-width.px]=\"getThWidth(thName)\"\n [tuiSortable]=\"sortable\"\n [sorter]=\"sortable ? setThName(thName) : null\"\n [tuiHint]=\"cell.col.tooltipText ?? null\"\n [rowSpan]=\"cell.rowspan\"\n [colSpan]=\"cell.colspan\"\n [attr.order]=\"columnOrders.get(thName)?.options?.order\"\n >\n @if (cell.col.isHeadTemplate) {\n @let thProjection = getProjectionHeaderByName(thName);\n\n @if (thProjection) {\n <ng-container\n [ngTemplateOutlet]=\"thProjection\"\n [ngTemplateOutletContext]=\"{\n $implicit: cell.col,\n }\"\n ></ng-container>\n }\n } @else {\n @switch (thType) {\n @case (EColumnDataType.ICON) {\n <tui-icon\n class=\"register-table--icon-color\"\n [icon]=\"cell.col.value!\"\n ></tui-icon>\n }\n @case (EColumnDataType.ICON_SVG) {\n <img [src]=\"cell.col.value\" [alt]=\"thName\" />\n }\n @case (EColumnDataType.TEXT) {\n @if (cell.col.svgSrc) {\n <img [src]=\"cell.col.svgSrc\" [alt]=\"thName\" />\n }\n <span class=\"text-overflow--ellipsis\" [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.NUM) {\n <span [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.DATE) {\n <span [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.CHECKBOX) {\n {{ cell.col.value }}\n }\n }\n }\n @if (!resizeBlocked) {\n <div\n class=\"register-table__cell-resizer\"\n [tuiResizer]=\"[1, 0]\"\n (tuiSizeChange)=\"thResizeChanges(cell.col.name, $event[0])\"\n (click)=\"$event.stopPropagation()\"\n ></div>\n }\n </th>\n }\n </tr>\n }\n </thead>\n @let rows = rowData();\n <tbody tuiTbody>\n @for (row of rows; track row.id) {\n @let state = stateObjects?.();\n @let trSelected =\n state\n ? state.get(row.id)?.state === ERegisterObjectState.SELECTED\n : selectedIds().has(row.id);\n\n <tr\n #bodyRow\n tuiTr\n class=\"register-table__row\"\n [class.selected]=\"trSelected\"\n [class.shift-pressed]=\"markRowBeforeSelect(row)\"\n (mouseenter)=\"onRowHover(row)\"\n (mouseleave)=\"onRowHover(null)\"\n (click)=\"onRowClick($event, row)\"\n (dblclick)=\"rowDblClick.emit(row)\"\n >\n @if (checkboxColumn()) {\n <td\n tuiTd\n *tuiCell=\"CHECKBOX_SELECTOR_KEY\"\n class=\"register-table__cell-checkbox-selector\"\n >\n <input\n tuiCheckbox\n size=\"s\"\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"trSelected\"\n [disabled]=\"checkboxDisabled()\"\n />\n </td>\n }\n @for (columnData of leaves(); track columnData.name) {\n @let tdType = columnData.type;\n @let tdKey = columnData.name;\n @let tdValue = row[tdKey];\n @let tdClass = columnData.classTd ?? '';\n\n <td\n tuiTd\n *tuiCell=\"tdKey\"\n [ngClass]=\"[tdType | classByType: 'td', tdClass]\"\n [stickyLeft]=\"tdKey | stickyColumn: stickyLeftIds()\"\n [stickyRight]=\"tdKey | stickyColumn: stickyRightIds()\"\n [stylesOnSticky]=\"stickyTdStyle\"\n >\n @if (columnData.isTemplate) {\n @let tdProjection = getProjectionCellByName(tdKey);\n\n @if (tdProjection) {\n <ng-container\n [ngTemplateOutlet]=\"tdProjection\"\n [ngTemplateOutletContext]=\"{\n $implicit: tdValue,\n row,\n }\"\n ></ng-container>\n }\n } @else {\n @switch (tdType) {\n @case (EColumnDataType.ICON) {\n @if (tdValue) {\n <tui-icon\n class=\"register-table--icon-color\"\n [icon]=\"columnData.value!\"\n ></tui-icon>\n }\n }\n @case (EColumnDataType.ICON_SVG) {\n @if (tdValue) {\n <img [src]=\"columnData.value\" [alt]=\"tdKey\" />\n }\n }\n @case (EColumnDataType.CHECKBOX) {\n <input\n tuiCheckbox\n size=\"s\"\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"!!tdValue\"\n [disabled]=\"true\"\n />\n }\n @case (EColumnDataType.TEXT) {\n <span [tuiHint]=\"tdValue\">\n {{ tdValue ?? '' }}\n </span>\n <span>\n {{ tdValue ? columnData.postfix : '' }}\n </span>\n }\n @case (EColumnDataType.NUM) {\n {{ tdValue ?? '' | number: columnData.numberPipe }}\n {{ tdValue ? columnData.postfix : '' }}\n }\n @case (EColumnDataType.DATE) {\n {{\n (tdValue\n | formatDate\n : ETimezone.UTC\n : columnData.datePattern ?? EDatePattern.DATE_TIME_WITHOUT_SECONDS\n : (timeZoneChanges$ | async)) ?? ''\n }}\n {{ tdValue ? columnData.postfix : '' }}\n }\n }\n }\n </td>\n }\n </tr>\n } @empty {\n <tr class=\"empty-layer\">\n <td colspan=\"100%\">\n <div class=\"centered-text\">{{ emptyText() }}</div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </tui-loader>\n </tui-scrollbar>\n\n <sproc-paginator\n class=\"register-table__paginator\"\n [page]=\"page()\"\n [rows]=\"limit()\"\n [pageLinkSize]=\"1\"\n [totalRecords]=\"totalRecords()\"\n [totalNotFiltered]=\"totalNotFiltered()\"\n [rowsCountOptions]=\"[30, 40, 50]\"\n [selectedCounter]=\"selectedCounter()\"\n (paginatorChange)=\"paginatorChange.emit($event)\"\n [disabled]=\"paginatorDisabled()\"\n [isLoading]=\"isPaginatorLoading()\"\n >\n </sproc-paginator>\n</section>\n", styles: [".input-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.input-text-12px,.body-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.body-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:20px}.table-heading-12px{font-family:Inter,serif;font-size:12px;font-weight:500;line-height:16px}.table-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.table-text-12px-400{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:16px}.table-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.button-links-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.button-links-12px-600{font-family:Inter,serif;font-size:12px;font-weight:600;line-height:16px}.button-links-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.input-label{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.input-area{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:20px}.static-title-h3{font-family:Inter,serif;font-size:16px;font-weight:600;line-height:20px}.static-title-h4{font-family:Inter,serif;font-size:14px;font-weight:500;line-height:18px}.dynamic-title-h4{font-family:Inter,serif;font-size:14px;font-weight:800;line-height:20px}.main-body-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:20px}.main-body-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:20px}.main-subscription{font-family:Inter,serif;font-size:10px;font-weight:400;line-height:12px}.input-helper-9px{font-family:Inter,serif;font-size:9px;font-weight:300;line-height:12px}.typography-content-text{font-family:Inter,serif;font-size:12px;font-weight:350;line-height:16px}.main-subtitle,.card-content-text{font-family:Inter,serif;font-size:14px;font-weight:400;line-height:16px}.filter-header-text{font-family:Inter,serif;font-size:14px;font-weight:500;line-height:18px}.btn-14px{font-family:Inter,serif;font-size:14px;font-weight:400;line-height:16px}.search-11px{font-family:Inter,serif;font-size:11px;font-weight:300;line-height:12px}:root{--input-text-12px: normal 300 12px / 16px \"Inter\";--input-text-14px: normal 300 14px / 16px \"Inter\"}.textfield-icons-container{display:flex;margin-inline-end:.5rem;margin-inline-start:.5rem;flex-direction:row;align-items:center;gap:8px}.textfield-icons-container .invalid-icon{color:var(--deleted-color);height:16px;width:16px}.textfield-icons-container .cleaner-icon{color:var(--gray-icon);height:16px;width:16px;pointer-events:auto}.textfield-icons-container .cleaner-icon:hover{color:var(--main-black);cursor:pointer}.textfield-icons-container .chevron{color:var(--gray-icon);height:16px;width:16px;pointer-events:none}.clickable:hover{cursor:pointer}:host .register-table__section{position:relative}:host .register-table__scrollable{height:calc(100vh - var(--header-height) - var(--footer-height))}:host .register-table__scrollable .register-table__loader{height:calc(100vh - var(--header-height) - var(--footer-height))}:host .register-table__scrollable .register-table__loader table{border-collapse:separate;border-spacing:0;table-layout:fixed}:host .register-table__scrollable .register-table__loader table thead{position:sticky;top:0;z-index:22}:host .register-table__scrollable .register-table__loader table .register-table__row{background:var(--main-white)}:host .register-table__scrollable .register-table__loader table .register-table__row:hover{background:var(--brand-hovered)}:host .register-table__scrollable .register-table__loader table .register-table__row.selected{background:var(--brand-selected)}:host .register-table__scrollable .register-table__loader table .register-table__row.shift-pressed{background:var(--brand-hovered)}:host .register-table__scrollable .register-table__loader table td,:host .register-table__scrollable .register-table__loader table th{padding:4px 8px;height:32px}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox-selector,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox-selector{padding:4px 6.8px;position:sticky;left:0;z-index:21}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox-selector input,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox-selector input{vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox{text-align:center}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox input,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox input{vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-icon,:host .register-table__scrollable .register-table__loader table th.register-table__cell-icon{width:32px!important;min-width:32px!important;max-width:32px!important;vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-text,:host .register-table__scrollable .register-table__loader table th.register-table__cell-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black)}:host .register-table__scrollable .register-table__loader table td.register-table__cell-num,:host .register-table__scrollable .register-table__loader table th.register-table__cell-num{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black);text-align:right}:host .register-table__scrollable .register-table__loader table td.register-table__cell-date,:host .register-table__scrollable .register-table__loader table th.register-table__cell-date{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black);text-align:center}:host .register-table__scrollable .register-table__loader table th{height:40px}:host .register-table__scrollable .register-table__loader table th.register-table__cell-text{font-family:Inter,serif;font-size:12px;font-weight:500;line-height:16px}:host .register-table__scrollable .register-table__loader table th.register-table__cell-icon .register-table--icon-color{font-size:16px;color:var(--main-black)}:host .register-table__scrollable .register-table__loader table th .register-table__cell-resizer{position:absolute;right:0;top:0;bottom:0;width:1px;transition:background 1s}:host .register-table__scrollable .register-table__loader table th .register-table__cell-resizer:hover{background:var(--brand-active)}:host .register-table__scrollable .register-table__loader table td{background:inherit}:host .register-table__scrollable .register-table__loader table td.register-table__cell-text{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:16px}:host .register-table__scrollable .register-table__loader table .sticky{position:sticky;left:0}:host .register-table__scrollable .register-table__loader table .empty-layer{text-align:center;position:relative}:host .register-table__scrollable .register-table__loader table .empty-layer .centered-text{position:absolute;top:50%;left:40%;transform:translate(-50%,-50%);text-align:center}\n"], dependencies: [{ kind: "component", type: TuiScrollbar, selector: "tui-scrollbar", inputs: ["hidden"] }, { kind: "component", type: TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: TuiCheckbox, selector: "input[type=\"checkbox\"][tuiCheckbox]", inputs: ["size"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: DecimalPipe, name: "number" }, { kind: "pipe", type: FormatDatePipe, name: "formatDate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.TuiTableDirective, selector: "table[tuiTable]", inputs: ["columns", "direction", "size", "sorter"], outputs: ["directionChange", "sorterChange", "sortChange"] }, { kind: "component", type: i1.TuiTableTbody, selector: "tbody[tuiTbody]", inputs: ["data", "heading", "open"], outputs: ["openChange"] }, { kind: "component", type: i1.TuiTableThGroup, selector: "tr[tuiThGroup]" }, { kind: "component", type: i1.TuiTableTh, selector: "th[tuiTh]", inputs: ["sorter", "resizable", "sticky", "requiredSort"] }, { kind: "component", type: i1.TuiTableTd, selector: "th[tuiTd], td[tuiTd]" }, { kind: "component", type: i1.TuiTableTr, selector: "tr[tuiTr]" }, { kind: "directive", type: i1.TuiTableCell, selector: "ng-template[tuiCell]", inputs: ["tuiCell"] }, { kind: "directive", type: i1.TuiTableHead, selector: "[tuiHead]", inputs: ["tuiHead"] }, { kind: "directive", type: i1.TuiTableSortBy, selector: "table[tuiTable][tuiSortBy]", inputs: ["tuiSortBy"], outputs: ["tuiSortByChange", "tuiSortChange"] }, { kind: "directive", type: i1.TuiTableSortable, selector: "th[tuiTh][tuiSortable]", inputs: ["tuiSortable"] }, { kind: "pipe", type: ClassByTypePipe, name: "classByType" }, { kind: "pipe", type: StickyColumnPipe, name: "stickyColumn" }, { kind: "directive", type: i2.TuiHintDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHintContext", "tuiHintAppearance", "tuiHint"] }, { kind: "component", type: PaginatorComponent, selector: "sproc-paginator", inputs: ["textOnPage", "totalRecords", "pageLinkSize", "showMoreDisabled", "disabled", "rows", "page", "paginatorOptions", "rowsCountOptions", "selectedCounter", "totalNotFiltered", "isLoading", "minRowsCount", "maxRowsCount"], outputs: ["rowsChange", "pageChange", "paginatorChange"] }, { kind: "component", type: CheckboxSelectorComponent, selector: "sproc-checkbox-selector", inputs: ["totalRecords", "selected", "disabled", "loading", "inputMaxValue"], outputs: ["onApply"] }, { kind: "directive", type: StickyDirective, selector: "[stickyLeft], [stickyRight], [stickyTop], [stickyBottom]", inputs: ["stickyLeft", "stickyRight", "stickyTop", "stickyBottom", "stickyRelative", "position", "stylesOnSticky"] }, { kind: "directive", type: StickyRelativeDirective, selector: "[stickyRelative]", inputs: ["columns"] }, { kind: "component", type: TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: TuiResizer, selector: "[tuiResizer]", inputs: ["tuiResizer"], outputs: ["tuiSizeChange"] }, { kind: "directive", type: TuiResizable, selector: "[tuiResizable]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
508
|
-
}
|
|
509
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RegisterTableComponent, decorators: [{
|
|
510
|
-
type: Component,
|
|
511
|
-
args: [{ selector: 'sproc-register-table', standalone: true, imports: [
|
|
512
|
-
TuiScrollbar,
|
|
513
|
-
TuiLoader,
|
|
514
|
-
NgClass,
|
|
515
|
-
NgStyle,
|
|
516
|
-
TuiCheckbox,
|
|
517
|
-
NgTemplateOutlet,
|
|
518
|
-
DecimalPipe,
|
|
519
|
-
FormatDatePipe,
|
|
520
|
-
AsyncPipe,
|
|
521
|
-
FormsModule,
|
|
522
|
-
ReactiveFormsModule,
|
|
523
|
-
TuiLoader,
|
|
524
|
-
TuiTable,
|
|
525
|
-
ClassByTypePipe,
|
|
526
|
-
StickyColumnPipe,
|
|
527
|
-
TuiHint,
|
|
528
|
-
PaginatorComponent,
|
|
529
|
-
CheckboxSelectorComponent,
|
|
530
|
-
StickyDirective,
|
|
531
|
-
StickyRelativeDirective,
|
|
532
|
-
TuiIcon,
|
|
533
|
-
TuiResizer,
|
|
534
|
-
TuiResizable,
|
|
535
|
-
], providers: [
|
|
536
|
-
DomIntersectionService,
|
|
537
|
-
KeyPressedService,
|
|
538
|
-
{
|
|
539
|
-
provide: KEY_PRESSED,
|
|
540
|
-
useValue: 'Shift',
|
|
541
|
-
},
|
|
542
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<section class=\"register-table__section\">\n <tui-scrollbar class=\"register-table__scrollable\" (scrollend)=\"saveScrollEndPosition()\">\n <tui-loader class=\"register-table__loader\" [showLoader]=\"isLoading() || false\" [overlay]=\"true\">\n <table\n tuiTable\n class=\"table\"\n stickyRelative\n [columns]=\"columnsWithCheckboxes()\"\n [style.width.px]=\"tableWidth()\"\n tuiSortBy=\"\"\n (sortChange)=\"sortChange($event)\"\n >\n <thead>\n @for (hrow of headerRows(); track $index) {\n <tr tuiThGroup>\n @if ($first && checkboxColumn()) {\n <th\n tuiTh\n *tuiHead=\"CHECKBOX_SELECTOR_KEY\"\n class=\"register-table__th-background--table-cell-blue register-table__cell-icon register-table__cell-checkbox-selector\"\n [style.width.px]=\"CHECKBOX_SELECTOR_WIDTH_PX\"\n [sorter]=\"null\"\n [rowSpan]=\"maxDepth()\"\n >\n <sproc-checkbox-selector\n [selected]=\"selectedIds()\"\n [totalRecords]=\"totalRecords()\"\n [loading]=\"isSelectloading()\"\n [disabled]=\"checkboxDisabled()\"\n (onApply)=\"selectChanged.emit($event)\"\n ></sproc-checkbox-selector>\n </th>\n }\n @for (cell of hrow; track cell.col.name) {\n @let thClass = cell.col.class ?? '';\n @let thType = cell.col.type;\n @let thName = cell.col.name;\n @let sortable = checkAvailableColumnSorting(cell.col);\n @let resizeBlocked = checkResizeBlocked(cell.col);\n <th\n tuiTh\n tuiResizable\n *tuiHead=\"thName\"\n [ngClass]=\"['register-table__th', thType | classByType, thClass]\"\n [stickyLeft]=\"cell.col.fixed ?? (thName | stickyColumn: stickyLeftIds())\"\n [stickyRight]=\"cell.col.fixed ?? (thName | stickyColumn: stickyRightIds())\"\n [stylesOnSticky]=\"stickyThStyle\"\n [style]=\"cell.col.headerStyle ?? ''\"\n [style.min-width.px]=\"getThWidth(thName)\"\n [style.width.px]=\"getThWidth(thName)\"\n [style.max-width.px]=\"getThWidth(thName)\"\n [tuiSortable]=\"sortable\"\n [sorter]=\"sortable ? setThName(thName) : null\"\n [tuiHint]=\"cell.col.tooltipText ?? null\"\n [rowSpan]=\"cell.rowspan\"\n [colSpan]=\"cell.colspan\"\n [attr.order]=\"columnOrders.get(thName)?.options?.order\"\n >\n @if (cell.col.isHeadTemplate) {\n @let thProjection = getProjectionHeaderByName(thName);\n\n @if (thProjection) {\n <ng-container\n [ngTemplateOutlet]=\"thProjection\"\n [ngTemplateOutletContext]=\"{\n $implicit: cell.col,\n }\"\n ></ng-container>\n }\n } @else {\n @switch (thType) {\n @case (EColumnDataType.ICON) {\n <tui-icon\n class=\"register-table--icon-color\"\n [icon]=\"cell.col.value!\"\n ></tui-icon>\n }\n @case (EColumnDataType.ICON_SVG) {\n <img [src]=\"cell.col.value\" [alt]=\"thName\" />\n }\n @case (EColumnDataType.TEXT) {\n @if (cell.col.svgSrc) {\n <img [src]=\"cell.col.svgSrc\" [alt]=\"thName\" />\n }\n <span class=\"text-overflow--ellipsis\" [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.NUM) {\n <span [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.DATE) {\n <span [ngStyle]=\"cell.col.textStyle\">\n {{ cell.col.value }}\n </span>\n }\n @case (EColumnDataType.CHECKBOX) {\n {{ cell.col.value }}\n }\n }\n }\n @if (!resizeBlocked) {\n <div\n class=\"register-table__cell-resizer\"\n [tuiResizer]=\"[1, 0]\"\n (tuiSizeChange)=\"thResizeChanges(cell.col.name, $event[0])\"\n (click)=\"$event.stopPropagation()\"\n ></div>\n }\n </th>\n }\n </tr>\n }\n </thead>\n @let rows = rowData();\n <tbody tuiTbody>\n @for (row of rows; track row.id) {\n @let state = stateObjects?.();\n @let trSelected =\n state\n ? state.get(row.id)?.state === ERegisterObjectState.SELECTED\n : selectedIds().has(row.id);\n\n <tr\n #bodyRow\n tuiTr\n class=\"register-table__row\"\n [class.selected]=\"trSelected\"\n [class.shift-pressed]=\"markRowBeforeSelect(row)\"\n (mouseenter)=\"onRowHover(row)\"\n (mouseleave)=\"onRowHover(null)\"\n (click)=\"onRowClick($event, row)\"\n (dblclick)=\"rowDblClick.emit(row)\"\n >\n @if (checkboxColumn()) {\n <td\n tuiTd\n *tuiCell=\"CHECKBOX_SELECTOR_KEY\"\n class=\"register-table__cell-checkbox-selector\"\n >\n <input\n tuiCheckbox\n size=\"s\"\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"trSelected\"\n [disabled]=\"checkboxDisabled()\"\n />\n </td>\n }\n @for (columnData of leaves(); track columnData.name) {\n @let tdType = columnData.type;\n @let tdKey = columnData.name;\n @let tdValue = row[tdKey];\n @let tdClass = columnData.classTd ?? '';\n\n <td\n tuiTd\n *tuiCell=\"tdKey\"\n [ngClass]=\"[tdType | classByType: 'td', tdClass]\"\n [stickyLeft]=\"tdKey | stickyColumn: stickyLeftIds()\"\n [stickyRight]=\"tdKey | stickyColumn: stickyRightIds()\"\n [stylesOnSticky]=\"stickyTdStyle\"\n >\n @if (columnData.isTemplate) {\n @let tdProjection = getProjectionCellByName(tdKey);\n\n @if (tdProjection) {\n <ng-container\n [ngTemplateOutlet]=\"tdProjection\"\n [ngTemplateOutletContext]=\"{\n $implicit: tdValue,\n row,\n }\"\n ></ng-container>\n }\n } @else {\n @switch (tdType) {\n @case (EColumnDataType.ICON) {\n @if (tdValue) {\n <tui-icon\n class=\"register-table--icon-color\"\n [icon]=\"columnData.value!\"\n ></tui-icon>\n }\n }\n @case (EColumnDataType.ICON_SVG) {\n @if (tdValue) {\n <img [src]=\"columnData.value\" [alt]=\"tdKey\" />\n }\n }\n @case (EColumnDataType.CHECKBOX) {\n <input\n tuiCheckbox\n size=\"s\"\n type=\"checkbox\"\n class=\"checkbox\"\n [checked]=\"!!tdValue\"\n [disabled]=\"true\"\n />\n }\n @case (EColumnDataType.TEXT) {\n <span [tuiHint]=\"tdValue\">\n {{ tdValue ?? '' }}\n </span>\n <span>\n {{ tdValue ? columnData.postfix : '' }}\n </span>\n }\n @case (EColumnDataType.NUM) {\n {{ tdValue ?? '' | number: columnData.numberPipe }}\n {{ tdValue ? columnData.postfix : '' }}\n }\n @case (EColumnDataType.DATE) {\n {{\n (tdValue\n | formatDate\n : ETimezone.UTC\n : columnData.datePattern ?? EDatePattern.DATE_TIME_WITHOUT_SECONDS\n : (timeZoneChanges$ | async)) ?? ''\n }}\n {{ tdValue ? columnData.postfix : '' }}\n }\n }\n }\n </td>\n }\n </tr>\n } @empty {\n <tr class=\"empty-layer\">\n <td colspan=\"100%\">\n <div class=\"centered-text\">{{ emptyText() }}</div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </tui-loader>\n </tui-scrollbar>\n\n <sproc-paginator\n class=\"register-table__paginator\"\n [page]=\"page()\"\n [rows]=\"limit()\"\n [pageLinkSize]=\"1\"\n [totalRecords]=\"totalRecords()\"\n [totalNotFiltered]=\"totalNotFiltered()\"\n [rowsCountOptions]=\"[30, 40, 50]\"\n [selectedCounter]=\"selectedCounter()\"\n (paginatorChange)=\"paginatorChange.emit($event)\"\n [disabled]=\"paginatorDisabled()\"\n [isLoading]=\"isPaginatorLoading()\"\n >\n </sproc-paginator>\n</section>\n", styles: [".input-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.input-text-12px,.body-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.body-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:20px}.table-heading-12px{font-family:Inter,serif;font-size:12px;font-weight:500;line-height:16px}.table-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.table-text-12px-400{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:16px}.table-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.button-links-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.button-links-12px-600{font-family:Inter,serif;font-size:12px;font-weight:600;line-height:16px}.button-links-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:16px}.input-label{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:16px}.input-area{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:20px}.static-title-h3{font-family:Inter,serif;font-size:16px;font-weight:600;line-height:20px}.static-title-h4{font-family:Inter,serif;font-size:14px;font-weight:500;line-height:18px}.dynamic-title-h4{font-family:Inter,serif;font-size:14px;font-weight:800;line-height:20px}.main-body-text-12px{font-family:Inter,serif;font-size:12px;font-weight:300;line-height:20px}.main-body-text-14px{font-family:Inter,serif;font-size:14px;font-weight:300;line-height:20px}.main-subscription{font-family:Inter,serif;font-size:10px;font-weight:400;line-height:12px}.input-helper-9px{font-family:Inter,serif;font-size:9px;font-weight:300;line-height:12px}.typography-content-text{font-family:Inter,serif;font-size:12px;font-weight:350;line-height:16px}.main-subtitle,.card-content-text{font-family:Inter,serif;font-size:14px;font-weight:400;line-height:16px}.filter-header-text{font-family:Inter,serif;font-size:14px;font-weight:500;line-height:18px}.btn-14px{font-family:Inter,serif;font-size:14px;font-weight:400;line-height:16px}.search-11px{font-family:Inter,serif;font-size:11px;font-weight:300;line-height:12px}:root{--input-text-12px: normal 300 12px / 16px \"Inter\";--input-text-14px: normal 300 14px / 16px \"Inter\"}.textfield-icons-container{display:flex;margin-inline-end:.5rem;margin-inline-start:.5rem;flex-direction:row;align-items:center;gap:8px}.textfield-icons-container .invalid-icon{color:var(--deleted-color);height:16px;width:16px}.textfield-icons-container .cleaner-icon{color:var(--gray-icon);height:16px;width:16px;pointer-events:auto}.textfield-icons-container .cleaner-icon:hover{color:var(--main-black);cursor:pointer}.textfield-icons-container .chevron{color:var(--gray-icon);height:16px;width:16px;pointer-events:none}.clickable:hover{cursor:pointer}:host .register-table__section{position:relative}:host .register-table__scrollable{height:calc(100vh - var(--header-height) - var(--footer-height))}:host .register-table__scrollable .register-table__loader{height:calc(100vh - var(--header-height) - var(--footer-height))}:host .register-table__scrollable .register-table__loader table{border-collapse:separate;border-spacing:0;table-layout:fixed}:host .register-table__scrollable .register-table__loader table thead{position:sticky;top:0;z-index:22}:host .register-table__scrollable .register-table__loader table .register-table__row{background:var(--main-white)}:host .register-table__scrollable .register-table__loader table .register-table__row:hover{background:var(--brand-hovered)}:host .register-table__scrollable .register-table__loader table .register-table__row.selected{background:var(--brand-selected)}:host .register-table__scrollable .register-table__loader table .register-table__row.shift-pressed{background:var(--brand-hovered)}:host .register-table__scrollable .register-table__loader table td,:host .register-table__scrollable .register-table__loader table th{padding:4px 8px;height:32px}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox-selector,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox-selector{padding:4px 6.8px;position:sticky;left:0;z-index:21}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox-selector input,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox-selector input{vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox{text-align:center}:host .register-table__scrollable .register-table__loader table td.register-table__cell-checkbox input,:host .register-table__scrollable .register-table__loader table th.register-table__cell-checkbox input{vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-icon,:host .register-table__scrollable .register-table__loader table th.register-table__cell-icon{width:32px!important;min-width:32px!important;max-width:32px!important;vertical-align:middle}:host .register-table__scrollable .register-table__loader table td.register-table__cell-text,:host .register-table__scrollable .register-table__loader table th.register-table__cell-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black)}:host .register-table__scrollable .register-table__loader table td.register-table__cell-num,:host .register-table__scrollable .register-table__loader table th.register-table__cell-num{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black);text-align:right}:host .register-table__scrollable .register-table__loader table td.register-table__cell-date,:host .register-table__scrollable .register-table__loader table th.register-table__cell-date{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--main-black);text-align:center}:host .register-table__scrollable .register-table__loader table th{height:40px}:host .register-table__scrollable .register-table__loader table th.register-table__cell-text{font-family:Inter,serif;font-size:12px;font-weight:500;line-height:16px}:host .register-table__scrollable .register-table__loader table th.register-table__cell-icon .register-table--icon-color{font-size:16px;color:var(--main-black)}:host .register-table__scrollable .register-table__loader table th .register-table__cell-resizer{position:absolute;right:0;top:0;bottom:0;width:1px;transition:background 1s}:host .register-table__scrollable .register-table__loader table th .register-table__cell-resizer:hover{background:var(--brand-active)}:host .register-table__scrollable .register-table__loader table td{background:inherit}:host .register-table__scrollable .register-table__loader table td.register-table__cell-text{font-family:Inter,serif;font-size:12px;font-weight:400;line-height:16px}:host .register-table__scrollable .register-table__loader table .sticky{position:sticky;left:0}:host .register-table__scrollable .register-table__loader table .empty-layer{text-align:center;position:relative}:host .register-table__scrollable .register-table__loader table .empty-layer .centered-text{position:absolute;top:50%;left:40%;transform:translate(-50%,-50%);text-align:center}\n"] }]
|
|
543
|
-
}], ctorParameters: () => [] });
|
|
544
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXItdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXJlZ2lzdGVyLWJhc2Uvc3JjL2xpYi9jb21wb25lbnRzL3JlZ2lzdGVyLXRhYmxlL3JlZ2lzdGVyLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1yZWdpc3Rlci1iYXNlL3NyYy9saWIvY29tcG9uZW50cy9yZWdpc3Rlci10YWJsZS9yZWdpc3Rlci10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsZUFBZSxFQUNmLFVBQVUsRUFDVixNQUFNLEVBQ04sVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLE1BQU0sRUFFTixTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFFBQVEsRUFBc0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0YsT0FBTyxFQUVMLGVBQWUsR0FJaEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEYsT0FBTyxFQUNMLG9CQUFv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Uzt3QkFDVCxXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsU0FBUzt3QkFDVCxRQUFRO3dCQUNSLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixPQUFPO3dCQUNQLGtCQUFrQjt3QkFDbEIseUJBQXlCO3dCQUN6QixlQUFlO3dCQUNmLHVCQUF1Qjt3QkFDdkIsT0FBTzt3QkFDUCxVQUFVO3dCQUNWLFlBQVk7cUJBQ2IsYUFDVTt3QkFDVCxzQkFBc0I7d0JBQ3RCLGlCQUFpQjt3QkFDakI7NEJBQ0UsT0FBTyxFQUFFLFdBQVc7NEJBQ3BCLFFBQVEsRUFBRSxPQUFPO3lCQUNsQjtxQkFDRixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBjb250ZW50Q2hpbGRyZW4sXG4gIERlc3Ryb3lSZWYsXG4gIGVmZmVjdCxcbiAgRWxlbWVudFJlZixcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgT25EZXN0cm95LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgVGVtcGxhdGVSZWYsXG4gIHVudHJhY2tlZCxcbiAgdmlld0NoaWxkLFxuICB2aWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG9tSW50ZXJzZWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RvbS1pbnRlcnNlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBUdWlIaW50LCBUdWlJY29uLCBUdWlMb2FkZXIsIFR1aVNjcm9sbGJhciB9IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcbmltcG9ydCB7IFR1aVRhYmxlLCBUdWlUYWJsZVNvcnRDaGFuZ2UgfSBmcm9tICdAdGFpZ2EtdWkvYWRkb24tdGFibGUnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBEZWNpbWFsUGlwZSwgTmdDbGFzcywgTmdTdHlsZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDb2x1bW5EYXRhVHlwZXMsXG4gIEVDb2x1bW5EYXRhVHlwZSxcbiAgSUNvbHVtbkRhdGEsXG4gIFJlZ2lzdGVyVGFibGVDZWxsU29ydGVyLFxuICBUaFdpZHRoRW50cnksXG59IGZyb20gJy4vbW9kZWwvc2NoZW1hJztcbmltcG9ydCB7IFR1aUNoZWNrYm94IH0gZnJvbSAnQHRhaWdhLXVpL2tpdCc7XG5pbXBvcnQgeyBFRGF0ZVBhdHRlcm4sIEVUaW1lem9uZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZGF0ZS9kYXRlLXRpbWUudHlwZXMnO1xuaW1wb3J0IHtcbiAgb3V0cHV0RnJvbU9ic2VydmFibGUsXG4gIHRha2VVbnRpbERlc3Ryb3llZCxcbiAgdG9PYnNlcnZhYmxlLFxuICB0b1NpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvaGVhZGVyLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEYXRlVGltZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRlLXRpbWUuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvY2VsbC10ZW1wbGF0ZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBLRVlfUFJFU1NFRCwgS2V5UHJlc3NlZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9rZXktcHJlc3NlZC5zZXJ2aWNlJztcbmltcG9ydCB7IEVPcmRlciwgVEhTX1dJRFRIX0NIQU5HRVNfREVCT1VOQ0VfVElNRV9NTFMgfSBmcm9tICcuLi8uLi9jb25zdHMvcmVnaXN0ZXItYmFzZS5jb25zdHMnO1xuaW1wb3J0IHsgQ2xhc3NCeVR5cGVQaXBlIH0gZnJvbSAnLi9waXBlcy9jbGFzcy1ieS10eXBlLnBpcGUnO1xuaW1wb3J0IHsgU3RpY2t5Q29sdW1uUGlwZSB9IGZyb20gJy4vcGlwZXMvc3RpY2t5LWNvbHVtbi5waXBlJztcbmltcG9ydCB7XG4gIENIRUNLQk9YX1NFTEVDVE9SX0tFWSxcbiAgQ0hFQ0tCT1hfU0VMRUNUT1JfV0lEVEhfUFgsXG4gIE1JTl9DT0xfV0lEVEhfUFgsXG59IGZyb20gJy4vY29uc3RzL3JlZ2lzdGVyLXRhYmxlLmNvbnN0cyc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGRlYm91bmNlVGltZSxcbiAgbWFwLFxuICBza2lwLFxuICBTdWJqZWN0LFxuICBzd2l0Y2hNYXAsXG4gIHRhcCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDaGVja2JveFNlbGVjdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vY2hlY2tib3gtc2VsZWN0b3IvY2hlY2tib3gtc2VsZWN0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkSlNPTnMgfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQgeyBTdGlja3lEaXJlY3RpdmUsIFN0aWNreVJlbGF0aXZlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBTY2FsYXJVVUlEIH0gZnJvbSAnaGFzdXJhJztcbmltcG9ydCB7IEVSZWdpc3Rlck9iamVjdFN0YXRlLCBJUmVnaXN0ZXJPYmplY3QgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBBcHBseVNlbGVjdGlvblR5cGVzIH0gZnJvbSAnLi4vY2hlY2tib3gtc2VsZWN0b3IvY2hlY2tib3gtc2VsZWN0b3IudHlwZXMnO1xuaW1wb3J0IHsgU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgVHVpUmVzaXphYmxlLCBUdWlSZXNpemVyIH0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQgeyBGb3JtYXREYXRlUGlwZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvZGF0ZS9mb3JtYXQtZGF0ZS5waXBlJztcbmltcG9ydCB7IElQYWdpbmF0b3JPdXRwdXQgfSBmcm9tICcuLi9wYWdpbmF0b3IvdHlwZXMvcGFnaW5hdG9yLnR5cGVzJztcbmltcG9ydCB7IFBhZ2luYXRvckNvbXBvbmVudCB9IGZyb20gJy4uL3BhZ2luYXRvci9wYWdpbmF0b3IuY29tcG9uZW50JztcblxuLyoqINCe0LHRidC40Lkg0LrQvtC80L/QvtC90LXQvdGCINC00LvRjyDRgdC+0LfQtNCw0L3QuNGPINGC0LDQsdC70LjRhtGLINGA0LXRgdGB0YLRgNCwICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcHJvYy1yZWdpc3Rlci10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZWdpc3Rlci10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JlZ2lzdGVyLXRhYmxlLmNvbXBvbmVudC5sZXNzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBUdWlTY3JvbGxiYXIsXG4gICAgVHVpTG9hZGVyLFxuICAgIE5nQ2xhc3MsXG4gICAgTmdTdHlsZSxcbiAgICBUdWlDaGVja2JveCxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIERlY2ltYWxQaXBlLFxuICAgIEZvcm1hdERhdGVQaXBlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFR1aUxvYWRlcixcbiAgICBUdWlUYWJsZSxcbiAgICBDbGFzc0J5VHlwZVBpcGUsXG4gICAgU3RpY2t5Q29sdW1uUGlwZSxcbiAgICBUdWlIaW50LFxuICAgIFBhZ2luYXRvckNvbXBvbmVudCxcbiAgICBDaGVja2JveFNlbGVjdG9yQ29tcG9uZW50LFxuICAgIFN0aWNreURpcmVjdGl2ZSxcbiAgICBTdGlja3lSZWxhdGl2ZURpcmVjdGl2ZSxcbiAgICBUdWlJY29uLFxuICAgIFR1aVJlc2l6ZXIsXG4gICAgVHVpUmVzaXphYmxlLFxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICBEb21JbnRlcnNlY3Rpb25TZXJ2aWNlLFxuICAgIEtleVByZXNzZWRTZXJ2aWNlLFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IEtFWV9QUkVTU0VELFxuICAgICAgdXNlVmFsdWU6ICdTaGlmdCcsXG4gICAgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFJlZ2lzdGVyVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAvKiog0J/QtdGA0LXQtNCw0L3QvdGL0Lkg0LrQvtC90YLQtdC90YIg0LTQu9GPINC30LDQs9C+0LvQvtCy0LrQvtCyINGC0LDQsdC70LjRhtGLLCDRgtC10LzQv9C70LXQudGC0Ysg0YEg0LTQuNGA0LXQutGC0LjQstC+0LkgSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUgKi9cbiAgcHVibGljIGhlYWRlclRlbXBsYXRlcyA9IGNvbnRlbnRDaGlsZHJlbjxIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZT4oSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUpO1xuICAvKiog0J/QtdGA0LXQtNCw0L3QvdGL0Lkg0LrQvtC90YLQtdC90YIg0LTQu9GPINGP0YfQtdC10Log0YLQsNCx0LvQuNGG0YssINGC0LXQvNC/0LvQtdC50YLRiyDRgSDQtNC40YDQtdC60YLQuNCy0L7QuSBDZWxsVGVtcGxhdGVEaXJlY3RpdmUgKi9cbiAgcHVibGljIGNlbGxUZW1wbGF0ZXMgPSBjb250ZW50Q2hpbGRyZW48Q2VsbFRlbXBsYXRlRGlyZWN0aXZlPihDZWxsVGVtcGxhdGVEaXJlY3RpdmUpO1xuXG4gIC8qKiDQrdC70LXQvNC10L3RgtGLINGB0YLRgNC+0Log0YLQsNCx0LvQuNGG0YsgKi9cbiAgcHVibGljIGJvZHlSb3dzID0gdmlld0NoaWxkcmVuKCdib2R5Um93JywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAvKiog0K3Qu9C10LzQtdC90YIg0YHQutGA0L7Qu9C70LAg0YLQsNCx0LvQuNGG0YsgKi9cbiAgcHVibGljIHNjcm9sbGJhciA9IHZpZXdDaGlsZChUdWlTY3JvbGxiYXIsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgLyoqINCh0L7RgdGC0L7Rj9C90LjQtSDQt9Cw0LPRgNGD0LfQutC4INC00LDQvdC90YvRhSDRgtCw0LHQu9C40YbRiyAqL1xuICBwdWJsaWMgaXNMb2FkaW5nID0gaW5wdXQucmVxdWlyZWQ8Ym9vbGVhbiB8IG51bGw+KCk7XG4gIC8qKiDQodC+0YHRgtC+0Y/QvdC40LUg0LfQsNCz0YDRg9C30LrQuCDQtNCw0L3QvdGL0YUg0L/QsNCz0LjQvdCw0YbQuNC4ICovXG4gIHB1YmxpYyBpc1BhZ2luYXRvckxvYWRpbmcgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG4gIC8qKiDQndC+0LzQtdGAINGB0YLRgNCw0L3QuNGG0YsgKi9cbiAgcHVibGljIHBhZ2UgPSBpbnB1dC5yZXF1aXJlZDxudW1iZXIgfCBudWxsPigpO1xuICAvKiog0JrQvtC70LjRh9C10YHRgtCy0L4g0LfQsNC/0LjRgdC10Lkg0L3QsCDQvtC00L3QvtC5INGB0YLRgNCw0L3QuNGG0LUgKi9cbiAgcHVibGljIGxpbWl0ID0gaW5wdXQucmVxdWlyZWQ8bnVtYmVyIHwgbnVsbD4oKTtcbiAgLyoqINCe0YLQvtCx0YDQsNC20LXQvdC40LUg0LrQvtC70L7QvdC60Lgg0LLRi9Cx0L7RgNCwINGB0YLRgNC+0LogKNC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOINC+0YLQvtCx0YDQsNC20LDQtdGC0YHRjykgKi9cbiAgcHVibGljIGNoZWNrYm94Q29sdW1uID0gaW5wdXQodHJ1ZSk7XG4gIC8qKiDQodC/0LjRgdC+0Log0YHRgtC+0LvQsdGG0L7QsiAqL1xuICBwdWJsaWMgY29sdW1ucyA9IGlucHV0LnJlcXVpcmVkPHN0cmluZ1tdPigpO1xuICAvKiog0JTQsNC90L3Ri9C1INGB0YLQvtC70LHRhtC+0LIgKi9cbiAgcHVibGljIGNvbHVtbnNEYXRhID0gaW5wdXQucmVxdWlyZWQ8SUNvbHVtbkRhdGFbXT4oKTtcbiAgLyoqINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGA0Ysg0YTQuNC60YHQuNGA0L7QstCw0L3QvdGL0YUg0YHQu9C10LLQsCDRgdGC0L7Qu9Cx0YbQvtCyICovXG4gIHB1YmxpYyBzdGlja3lMZWZ0SWRzID0gaW5wdXQ8c3RyaW5nW10gfCB1bmRlZmluZWQ+KCk7XG4gIC8qKiDQmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgNGLINGE0LjQutGB0LjRgNC+0LLQsNC90L3Ri9GFINGB0LvQtdCy0LAg0YHRgtC+0LvQsdGG0L7QsiAqL1xuICBwdWJsaWMgc3RpY2t5UmlnaHRJZHMgPSBpbnB1dDxzdHJpbmdbXSB8IHVuZGVmaW5lZD4oKTtcbiAgLyoqINCS0YHQtdCz0L4g0LfQsNC/0LjRgdC10LkgKi9cbiAgcHVibGljIHRvdGFsUmVjb3JkcyA9IGlucHV0LnJlcXVpcmVkPG51bWJlcj4oKTtcbiAgLyoqINCS0YHQtdCz0L4g0LfQsNC/0LjRgdC10LksINCx0LXQtyDRg9GH0LXRgtCwINGE0LjQu9GM0YLRgNCwICovXG4gIHB1YmxpYyB0b3RhbE5vdEZpbHRlcmVkID0gaW5wdXQucmVxdWlyZWQ8bnVtYmVyPigpO1xuICAvKiog0JfQvdCw0YfQtdC90LjRjyDRgtCw0LHQu9C40YbRiyAqL1xuICBwdWJsaWMgcm93RGF0YSA9IGlucHV0LnJlcXVpcmVkPGFueVtdPigpO1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGA0Ysg0LLRi9Cx0YDQsNC90L3Ri9GFINC30LDQv9C40YHQtdC5XG4gICAqXG4gICAqIEBkZXByZWNhdGVkINCY0YHQv9C+0LvRjNC30YPQudGC0LUgc3RhdGVPYmplY3RzXG4gICAqICovXG4gIHB1YmxpYyBzZWxlY3RlZElkcyA9IGlucHV0KG5ldyBTZXQ8U2NhbGFyVVVJRD4oKSk7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24g0J7QsdGK0LXQutGC0Ysg0LLRi9Cx0YDQsNC90L3Ri9GFINC30LDQv9C40YHQtdC5XG4gICAqXG4gICAqIEBkZXByZWNhdGVkINCY0YHQv9C+0LvRjNC30YPQudGC0LUgc3RhdGVPYmplY3RzXG4gICAqICovXG4gIHB1YmxpYyBzZWxlY3RlZE9iamVjdHMgPSBpbnB1dChuZXcgU2V0PGFueT4oKSk7XG4gIC8qKiDQl9Cw0LPRgNGD0LfQutCwINC00L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0YUg0LfQsNC/0LjRgdC10Lkg0L/RgNC4INCy0YvQsdC+0YDQtSDRgdC+0L7RgtCy0LXRgtGB0YLQstGD0YnQtdCz0L4g0L/Rg9C90LrRgtCwINCyINGH0LXQutCx0L7QutGBLdGB0LXQu9C10LrRgtC+0YDQtSAqL1xuICBwdWJsaWMgaXNTZWxlY3Rsb2FkaW5nID0gaW5wdXQ8Ym9vbGVhbiB8IG51bGw+KGZhbHNlKTtcbiAgLyoqINCi0LXQutGB0YIg0L/Rg9GB0YLQvtC5INGC0LDQsdC70LjRhtGLICovXG4gIHB1YmxpYyBlbXB0eVRleHQgPSBpbnB1dDxzdHJpbmc+KCfQndC10YIg0LTQsNC90L3Ri9GFJyk7XG4gIC8qKiDQlNC40LfQtdC50LHQuyDRgdC+0YDRgtC40YDQvtCy0LrQuCAqL1xuICBwdWJsaWMgc29ydGluZ0Rpc2FibGVkID0gaW5wdXQoZmFsc2UpO1xuICAvKiog0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC30L3QsNGH0LXQvdC40Y8g0LLRi9Cx0L7RgNCwINGH0LXQutCx0L7QutGB0L7QsiDRh9C10YDQtdC3INC/0L7Qu9C1INCy0LLQvtC00LAgKi9cbiAgcHVibGljIGNoZWNrYm94SW5wdXRNYXhWYWx1ZSA9IGlucHV0PG51bWJlciB8IG51bGw+KG51bGwpO1xuICAvKiog0JTQuNC30LXQudCx0Lsg0LLRi9Cx0L7RgNCwINGH0LXQutCx0L7QutGB0L7QsiAqL1xuICBwdWJsaWMgY2hlY2tib3hEaXNhYmxlZCA9IGlucHV0KGZhbHNlKTtcbiAgLyoqINCU0LjQt9C10LnQsdC7INCy0YvQsdC+0YDQsCDRh9C10LrQsdC+0LrRgdC+0LIgKi9cbiAgcHVibGljIHBhZ2luYXRvckRpc2FibGVkID0gaW5wdXQoZmFsc2UpO1xuXG4gIHB1YmxpYyBzZWxlY3RlZENvdW50ZXIgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRTaXplID0gdGhpcy5fc2VsZWN0ZWRTZXJ2aWNlPy5zZWxlY3RlZFZhbHVlcygpPy5zaXplID8/IG51bGw7XG4gICAgY29uc3QgdW5zZWxlY3RlZFNpemUgPSB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnVuc2VsZWN0ZWRWYWx1ZXMoKT8uc2l6ZSA/PyAwO1xuICAgIGNvbnN0IHVuZmV0Y2hlZE9iamVjdHMgPSB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnN0YXRlVW5mZXRjaGVkT2JqZWN0cygpO1xuICAgIGNvbnN0IGlzTm90U2VsZWN0ZWQgPSB1bmZldGNoZWRPYmplY3RzICE9PSBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRDtcblxuICAgIGlmIChzZWxlY3RlZFNpemUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2RlcHJlY2F0ZWRTZWxlY3RlZFJvd3NDb3VudGVyKCk7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZElkcygpLnNpemU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzTm90U2VsZWN0ZWQgPyBzZWxlY3RlZFNpemUgOiB0aGlzLnRvdGFsUmVjb3JkcygpIC0gdW5zZWxlY3RlZFNpemU7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBkdHMgPSBpbmplY3QoRGF0ZVRpbWVTZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc2hpZnQgPSBpbmplY3QoS2V5UHJlc3NlZFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kb21JbnRlcnNlY3Rpb25TZXJ2aWNlID0gaW5qZWN0KERvbUludGVyc2VjdGlvblNlcnZpY2UpO1xuICAvLyBUT0RPINGD0LTQsNC70LjRgtGMIG9wdGlvbmFsOiB0cnVlINC/0L7RgdC70LUg0LLRi9C/0L7Qu9C90LXQvdC40Y8g0LfQsNC00LDRh9C4IFNNQTItMzEzNFxuICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3RlZFNlcnZpY2UgPSBpbmplY3QoU2VsZWN0ZWRPYmplY3RzU3RhdGVTZXJ2aWNlLCB7XG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0pO1xuXG4gIC8qKiDQodC+0LHRi9GC0LjQtSDQstGL0LHQvtGA0LAg0LIg0YfQtdC60LHQvtC60YEt0YHQtdC70LXQutGC0L7RgNC1ICovXG4gIHB1YmxpYyBzZWxlY3RDaGFuZ2VkID0gb3V0cHV0PEFwcGx5U2VsZWN0aW9uVHlwZXM+KCk7XG4gIC8qKiDQodC+0LHRi9GC0LjQtSDQuNC30LzQtdC90LXQvdC40Y8g0LfQvdCw0YfQtdC90LjQuSDQv9Cw0LPQuNC90LDRgtC+0YDQsCAqL1xuICBwdWJsaWMgcGFnaW5hdG9yQ2hhbmdlID0gb3V0cHV0PElQYWdpbmF0b3JPdXRwdXQ+KCk7XG4gIC8qKiDQodC+0LHRi9GC0LjQtSDQvdCw0LbQsNGC0LjRjyDQvdCwINGB0YLRgNC+0LrRgyAqL1xuICBwdWJsaWMgcm93Q2xpY2sgPSBvdXRwdXQ8YW55PigpO1xuICAvKiog0KHQvtCx0YvRgtC40LUg0LTQstC+0LnQvdC+0LPQviDQvdCw0LbQsNGC0LjRjyDQvdCwINGB0YLRgNC+0LrRgyAqL1xuICBwdWJsaWMgcm93RGJsQ2xpY2sgPSBvdXRwdXQ8YW55PigpO1xuICAvKiog0KHQvtCx0YvRgtC40LUg0L3QsNC20LDRgtC40Y8g0L3QsCDRgdGC0YDQvtC60YMgKi9cbiAgcHVibGljIHJvd1NlbGVjdGVkID0gb3V0cHV0PHsgcm93OiBhbnlbXTsgY291bnQ6IG51bWJlciB9PigpO1xuICAvKiog0KHQvtCx0YvRgtC40LUg0YHQvtGA0YLQuNGA0L7QstC60Lgg0LfQvdCw0YfQtdC90LjQuSDQsiDRgtCw0LHQu9C40YbQtSAqL1xuICBwdWJsaWMgc29ydCA9IG91dHB1dDxSZWdpc3RlclRhYmxlQ2VsbFNvcnRlcjxhbnk+W10+KCk7XG4gIC8qKiDQodC+0LHRi9GC0LjQtSDQuNC30LzQtdC90LXQvdC40Y8g0YjQuNGA0LjQvdGLINC60L7Qu9C+0L3QutC4ICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Roc1dpZHRoTWFwID0gY29tcHV0ZWQoXG4gICAgKCkgPT4gbmV3IE1hcCh0aGlzLmNvbHVtbnNEYXRhKCkubWFwKCh7IG5hbWUsIHdpZHRoIH0pID0+IFtuYW1lLCBuZXcgQmVoYXZpb3JTdWJqZWN0KHdpZHRoKV0pKVxuICApO1xuICBwdWJsaWMgdGhzV2lkdGhDaGFuZ2UgPSBvdXRwdXRGcm9tT2JzZXJ2YWJsZTxUaFdpZHRoRW50cnlbXT4oXG4gICAgdG9PYnNlcnZhYmxlKHRoaXMuX3Roc1dpZHRoTWFwKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChjaGFuZ2VzKSA9PlxuICAgICAgICBjb21iaW5lTGF0ZXN0KFxuICAgICAgICAgIFsuLi5jaGFuZ2VzLmVudHJpZXMoKV0ubWFwKChbbmFtZSwgJHdpZHRoXSkgPT5cbiAgICAgICAgICAgICR3aWR0aC5hc09ic2VydmFibGUoKS5waXBlKG1hcCgod2lkdGgpID0+ICh7IG5hbWUsIHdpZHRoIH0pKSlcbiAgICAgICAgICApXG4gICAgICAgICkucGlwZShcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZEpTT05zKCksXG4gICAgICAgICAgZGVib3VuY2VUaW1lKFRIU19XSURUSF9DSEFOR0VTX0RFQk9VTkNFX1RJTUVfTUxTKSxcbiAgICAgICAgICBza2lwKDEpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gICk7XG4gIC8qKiDQodC+0LHRi9GC0LjQtSDQuNC30LzQtdC90LXQvdC40Y8g0LLQuNC00LjQvNGL0YUg0YHRgtGA0L7QuiDRgtCw0LHQu9C40YbRiyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9vYnNlcnZlclJvd3NWaXNpYmlsaXR5RE9NJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLmJvZHlSb3dzKS5waXBlKFxuICAgIHN3aXRjaE1hcCgoYm9keVJvd3MpID0+XG4gICAgICBjb21iaW5lTGF0ZXN0KFxuICAgICAgICBib2R5Um93cy5tYXAoKGJvZHlSb3csIGluZGV4KSA9PlxuICAgICAgICAgIHRoaXMuX2RvbUludGVyc2VjdGlvblNlcnZpY2UuY3JlYXRlQW5kT2JzZXJ2ZShib2R5Um93KS5waXBlKFxuICAgICAgICAgICAgLy8gVE9ETyDRg9C00LDQu9C40YLRjCB0YXAsINC60LDQuiDRgtC+0LvRjNC60L4g0L/QtdGA0LXRgdGC0LDQvdC10YIg0LjRgdC/0L7Qu9GM0LfQvtCy0LDRgtGM0YHRjyBpc192aXNpYmxlINC/0L4g0L/RgNC+0LXQutGC0YNcbiAgICAgICAgICAgIHRhcCgoaXNWaXNpYmxlKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucm93RGF0YSgpW2luZGV4XS5pc192aXNpYmxlID0gaXNWaXNpYmxlO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtYXAoKGlzVmlzaWJsZSkgPT4gKGlzVmlzaWJsZSA/IHRoaXMucm93RGF0YSgpW2luZGV4XSA6IHVuZGVmaW5lZCkpXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApLnBpcGUobWFwKCh2aXNpYmxlUm93cykgPT4gdmlzaWJsZVJvd3MuZmlsdGVyKCh2aXNpYmxlUm93KSA9PiAhIXZpc2libGVSb3cpKSlcbiAgICApXG4gICk7XG4gIHB1YmxpYyB2aXNpYmxlUm93c0NoYW5nZSA9IG91dHB1dEZyb21PYnNlcnZhYmxlPGFueVtdPih0aGlzLl9vYnNlcnZlclJvd3NWaXNpYmlsaXR5RE9NJCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEVDb2x1bW5EYXRhVHlwZSA9IEVDb2x1bW5EYXRhVHlwZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEVUaW1lem9uZSA9IEVUaW1lem9uZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEVEYXRlUGF0dGVybiA9IEVEYXRlUGF0dGVybjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEVSZWdpc3Rlck9iamVjdFN0YXRlID0gRVJlZ2lzdGVyT2JqZWN0U3RhdGU7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IENIRUNLQk9YX1NFTEVDVE9SX0tFWSA9IENIRUNLQk9YX1NFTEVDVE9SX0tFWTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IENIRUNLQk9YX1NFTEVDVE9SX1dJRFRIX1BYID0gQ0hFQ0tCT1hfU0VMRUNUT1JfV0lEVEhfUFg7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0aWNreVRoU3R5bGUgPSBPYmplY3QuZnJlZXplKHsgJ3otaW5kZXgnOiAyMiB9KTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0aWNreVRkU3R5bGUgPSBPYmplY3QuZnJlZXplKHsgJ3otaW5kZXgnOiAyMSB9KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29sdW1uc1dpdGhDaGVja2JveGVzID0gY29tcHV0ZWQoKCkgPT4gW1xuICAgIENIRUNLQk9YX1NFTEVDVE9SX0tFWSxcbiAgICAuLi50aGlzLmNvbHVtbnMoKSxcbiAgXSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzY3JvbGxQb3NpdGlvbiA9IHNpZ25hbDx7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfT4oeyB0b3A6IDAsIGxlZnQ6IDAgfSk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0YWJsZVdpZHRoID0gdG9TaWduYWwoXG4gICAgY29tYmluZUxhdGVzdChbdG9PYnNlcnZhYmxlKHRoaXMuY29sdW1uc1dpdGhDaGVja2JveGVzKSwgdG9PYnNlcnZhYmxlKHRoaXMuX3Roc1dpZHRoTWFwKV0pLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgICh7IDA6IHZpc2libGVDb2x1bW5zLCAxOiBjaGFuZ2VzIH0pID0+XG4gICAgICAgICAgbmV3IE1hcChbLi4uY2hhbmdlcy5lbnRyaWVzKCldLmZpbHRlcigoW3RoTmFtZV0pID0+IHZpc2libGVDb2x1bW5zLmluY2x1ZGVzKHRoTmFtZSkpKVxuICAgICAgKSxcbiAgICAgIHN3aXRjaE1hcCgoY2hhbmdlcykgPT5cbiAgICAgICAgY29tYmluZUxhdGVzdChcbiAgICAgICAgICBbLi4uY2hhbmdlcy5lbnRyaWVzKCldLm1hcCgoeyAxOiAkd2lkdGggfSkgPT5cbiAgICAgICAgICAgICR3aWR0aC5hc09ic2VydmFibGUoKS5waXBlKG1hcCgod2lkdGgpID0+IHdpZHRoKSlcbiAgICAgICAgICApXG4gICAgICAgICkucGlwZShcbiAgICAgICAgICBtYXAoKHdpZHRocykgPT4ge1xuICAgICAgICAgICAgbGV0IHRhYmxlV2lkdGggPSB0aGlzLmNoZWNrYm94Q29sdW1uKCkgPyBDSEVDS0JPWF9TRUxFQ1RPUl9XSURUSF9QWCA6IDA7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgd2lkdGggb2Ygd2lkdGhzKSB7XG4gICAgICAgICAgICAgIHRhYmxlV2lkdGggKz0gd2lkdGggPyBOdW1iZXIod2lkdGgpIDogMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRhYmxlV2lkdGg7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgKTtcblxuICBwcm90ZWN0ZWQgc3RhdGVPYmplY3RzID0gdGhpcy5fc2VsZWN0ZWRTZXJ2aWNlPy5zdGF0ZTtcblxuICBwcm90ZWN0ZWQgdmlzaWJsZUNvbHVtbnNUcmVlID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLl9maWx0ZXJWaXNpYmxlQ29sdW1ucyh0aGlzLmNvbHVtbnNEYXRhKCksIHRoaXMuY29sdW1ucygpKVxuICApO1xuICBwcm90ZWN0ZWQgbWF4RGVwdGggPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9nZXRNYXhEZXB0aCh0aGlzLnZpc2libGVDb2x1bW5zVHJlZSgpKSk7XG4gIHByb3RlY3RlZCBsZWF2ZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9nZXRGbGF0TGVhdmVzKHRoaXMudmlzaWJsZUNvbHVtbnNUcmVlKCkpKTtcblxuICBwcm90ZWN0ZWQgaGVhZGVyUm93cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBtYXhEZXB0aCA9IHRoaXMubWF4RGVwdGgoKTtcbiAgICBjb25zdCByb3dzOiB7IGNvbDogSUNvbHVtbkRhdGE7IHJvd3NwYW46IG51bWJlcjsgY29sc3BhbjogbnVtYmVyIH1bXVtdID0gQXJyYXkuZnJvbShcbiAgICAgIHsgbGVuZ3RoOiBtYXhEZXB0aCB9LFxuICAgICAgKCkgPT4gW11cbiAgICApO1xuXG4gICAgaWYgKG1heERlcHRoID09PSAwKSB7XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbCBvZiB0aGlzLnZpc2libGVDb2x1bW5zVHJlZSgpKSB7XG4gICAgICB0aGlzLl9idWlsZEhlYWRlclJlY3Vyc2l2ZShjb2wsIDAsIG1heERlcHRoLCByb3dzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cztcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfZGVwcmVjYXRlZFNlbGVjdGVkUm93c0NvdW50ZXIgPSBzaWduYWwoMCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRpbWVab25lQ2hhbmdlcyQgPSB0aGlzLmR0cy5pc1RpbWVab25lQ2hhbmdlZCQ7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbHVtbk9yZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBSZWdpc3RlclRhYmxlQ2VsbFNvcnRlcjxhbnk+PigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Byb2plY3RlZEhlYWRlcnNNYXAgPSBuZXcgTWFwPHN0cmluZywgVGVtcGxhdGVSZWY8YW55Pj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvamVjdGVkQ2VsbHNNYXAgPSBuZXcgTWFwPHN0cmluZywgVGVtcGxhdGVSZWY8YW55Pj4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9jbGlja2VkUm93JCA9IG5ldyBTdWJqZWN0PHVua25vd24+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfaG92ZXJlZFJvdyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHVua25vd24+KG51bGwpO1xuXG4gIHByb3RlY3RlZCBsYXN0U2VsZWN0ZWRSb3c6IHVua25vd247XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fc2V0U2Nyb2xsUG9zaXRpb25BZnRlckRhdGFMb2FkaW5nKCk7XG4gICAgdGhpcy5fcHJvamVjdEhlYWRlclRlbXBsYXRlcygpO1xuICAgIHRoaXMuX3Byb2plY3RDZWxsVGVtcGxhdGVzKCk7XG4gICAgLy8gVE9ETyDRg9C00LDQu9C40YLRjCDQvNC10YLQvtC0LCDQutCw0Log0YLQvtC70YzQutC+INC/0LXRgNC10YHRgtCw0L3QtdGCINC40YHQv9C+0LvRjNC30L7QstCw0YLRjNGB0Y8gaXNfdmlzaWJsZSDQv9C+INC/0YDQvtC10LrRgtGDXG4gICAgdGhpcy5fc3luY1Jvd1Zpc2liaWxpdHlET00oKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5yb3dEYXRhKCk7XG5cbiAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDAgJiYgIXRoaXMubGFzdFNlbGVjdGVkUm93KSB7XG4gICAgICAgIFt0aGlzLmxhc3RTZWxlY3RlZFJvd10gPSBkYXRhO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0U2Nyb2xsUG9zaXRpb25BZnRlckRhdGFMb2FkaW5nKCk6IHZvaWQge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNMb2FkaW5nKCkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHRvcCwgbGVmdCB9ID0gdGhpcy5zY3JvbGxQb3NpdGlvbigpO1xuICAgICAgICAgIGNvbnN0IHNjcm9sbGJhckVsZW1lbnQgPSB0aGlzLnNjcm9sbGJhcigpPy5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgICAgaWYgKHNjcm9sbGJhckVsZW1lbnQpIHtcbiAgICAgICAgICAgIHNjcm9sbGJhckVsZW1lbnQuc2Nyb2xsVG9wID0gdG9wO1xuICAgICAgICAgICAgc2Nyb2xsYmFyRWxlbWVudC5zY3JvbGxMZWZ0ID0gbGVmdDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJvamVjdEhlYWRlclRlbXBsYXRlcygpOiB2b2lkIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5fcHJvamVjdGVkSGVhZGVyc01hcC5jbGVhcigpO1xuICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZSBvZiB0aGlzLmhlYWRlclRlbXBsYXRlcygpKSB7XG4gICAgICAgIHRoaXMuX3Byb2plY3RlZEhlYWRlcnNNYXAuc2V0KHRlbXBsYXRlLmhlYWRlclRlbXBsYXRlTmFtZSgpLCB0ZW1wbGF0ZS50cGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJvamVjdENlbGxUZW1wbGF0ZXMoKTogdm9pZCB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMuX3Byb2plY3RlZENlbGxzTWFwLmNsZWFyKCk7XG4gICAgICBmb3IgKGNvbnN0IHRlbXBsYXRlIG9mIHRoaXMuY2VsbFRlbXBsYXRlcygpKSB7XG4gICAgICAgIHRoaXMuX3Byb2plY3RlZENlbGxzTWFwLnNldCh0ZW1wbGF0ZS5jZWxsVGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZS50cGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3luY1Jvd1Zpc2liaWxpdHlET00oKTogdm9pZCB7XG4gICAgdGhpcy5fb2JzZXJ2ZXJSb3dzVmlzaWJpbGl0eURPTSQucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fY2xpY2tlZFJvdyQuY29tcGxldGUoKTtcbiAgICB0aGlzLl9ob3ZlcmVkUm93JC5jb21wbGV0ZSgpO1xuICAgIGZvciAoY29uc3Qgc3ViamVjdCBvZiB0aGlzLl90aHNXaWR0aE1hcCgpLnZhbHVlcygpKSB7XG4gICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByb2plY3Rpb25IZWFkZXJCeU5hbWUobmFtZTogc3RyaW5nKTogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb2plY3RlZEhlYWRlcnNNYXAuZ2V0KG5hbWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFByb2plY3Rpb25DZWxsQnlOYW1lKG5hbWU6IHN0cmluZyk6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wcm9qZWN0ZWRDZWxsc01hcC5nZXQobmFtZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc29ydENoYW5nZSh7IHNvcnRDb21wYXJhdG9yIH06IFR1aVRhYmxlU29ydENoYW5nZTxQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIGFueT4+Pik6IHZvaWQge1xuICAgIGlmICghc29ydENvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IHNvcnRDb21wYXJhdG9yKHt9LCB7fSkgYXMgYW55IGFzIHN0cmluZztcbiAgICBjb25zdCBjb2x1bW5PcmRlciA9IHRoaXMuY29sdW1uT3JkZXJzLmdldChpZCk7XG5cbiAgICBpZiAodGhpcy5fc2hpZnQuaXNQcmVzc2VkKCkpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29sdW1uT3JkZXIoaWQsIGNvbHVtbk9yZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2x1bW5PcmRlcnMuY2xlYXIoKTtcbiAgICAgIHRoaXMudXBkYXRlQ29sdW1uT3JkZXIoaWQsIGNvbHVtbk9yZGVyKTtcbiAgICB9XG5cbiAgICB0aGlzLnNvcnQuZW1pdChbLi4udGhpcy5jb2x1bW5PcmRlcnMudmFsdWVzKCldKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uT3JkZXIoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBjb2x1bW5PcmRlcjogUmVnaXN0ZXJUYWJsZUNlbGxTb3J0ZXI8YW55PiB8IHVuZGVmaW5lZFxuICApOiB2b2lkIHtcbiAgICBpZiAoY29sdW1uT3JkZXIpIHtcbiAgICAgIGNvbnN0IHsgb3B0aW9ucyB9ID0gY29sdW1uT3JkZXI7XG4gICAgICBjb25zdCB7IG9yZGVyIH0gPSBvcHRpb25zO1xuXG4gICAgICBpZiAob3JkZXIgPT09IEVPcmRlci5ERVNDKSB7XG4gICAgICAgIHRoaXMuY29sdW1uT3JkZXJzLmRlbGV0ZShpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbHVtbk9yZGVycy5zZXQoaWQsIHsgb3B0aW9uczogeyAuLi5vcHRpb25zLCBvcmRlcjogRU9yZGVyLkRFU0MgfSB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2x1bW5PcmRlcnMuc2V0KGlkLCB7IG9wdGlvbnM6IHsgaWQsIG9yZGVyOiBFT3JkZXIuQVNDIH0gfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldFRoTmFtZSh0aE5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuICgpID0+IHRoTmFtZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0F2YWlsYWJsZUNvbHVtblNvcnRpbmcoY29sdW1uRGF0YTogSUNvbHVtbkRhdGEpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IHNvcnRhYmxlLCB0eXBlIH0gPSBjb2x1bW5EYXRhO1xuICAgIGNvbnN0IGF2YWlsYWJsZVNvcnRDb2x1bW5UeXBlczogQ29sdW1uRGF0YVR5cGVzW10gPSBbXG4gICAgICBFQ29sdW1uRGF0YVR5cGUuVEVYVCxcbiAgICAgIEVDb2x1bW5EYXRhVHlwZS5EQVRFLFxuICAgICAgRUNvbHVtbkRhdGFUeXBlLk5VTSxcbiAgICBdO1xuXG4gICAgcmV0dXJuICF0aGlzLnNvcnRpbmdEaXNhYmxlZCgpICYmIHNvcnRhYmxlICE9PSBmYWxzZSAmJiBhdmFpbGFibGVTb3J0Q29sdW1uVHlwZXMuaW5jbHVkZXModHlwZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tSZXNpemVCbG9ja2VkKGNvbHVtbkRhdGE6IElDb2x1bW5EYXRhKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzaXphYmxlQmxvY2tlZFR5cGVzOiBDb2x1bW5EYXRhVHlwZXNbXSA9IFtcbiAgICAgIEVDb2x1bW5EYXRhVHlwZS5DSEVDS0JPWCxcbiAgICAgIEVDb2x1bW5EYXRhVHlwZS5JQ09OLFxuICAgICAgRUNvbHVtbkRhdGFUeXBlLklDT05fU1ZHLFxuICAgIF07XG5cbiAgICByZXR1cm4gY29sdW1uRGF0YS5maXhlZCB8fCByZXNpemFibGVCbG9ja2VkVHlwZXMuaW5jbHVkZXMoY29sdW1uRGF0YS50eXBlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblJvd0hvdmVyKHJvdzogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuX2hvdmVyZWRSb3ckLm5leHQocm93KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblJvd0NsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCByb3c6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBibHVlSGlnaGxpZ2h0c1NlbGVjdGVkID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGJsdWVIaWdobGlnaHRzU2VsZWN0ZWQ/LnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgY29uc3Qgc3RhdGVPYmplY3RzID0gdGhpcy5zdGF0ZU9iamVjdHM/LigpO1xuXG4gICAgLy8gVE9ETyDQvtGB0YLQsNCy0LjRgtGMINGC0L7Qu9GM0LrQviBpZiDQv9C+0YHQu9C1IFNNQTItMzEzNFxuICAgIGlmIChzdGF0ZU9iamVjdHMpIHtcbiAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICB0aGlzLl9jaGFuZ2VSYW5nZVJvd3NTdGF0ZShzdGF0ZU9iamVjdHMsIHRoaXMubGFzdFNlbGVjdGVkUm93LCByb3cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgICAgICB0aGlzLl9jaGFuZ2VPbmx5Um93U3RhdGUoc3RhdGVPYmplY3RzLCByb3csIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2NoYW5nZU9ubHlSb3dTdGF0ZShzdGF0ZU9iamVjdHMsIHJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRSb3cgPSByb3c7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucm93Q2xpY2suZW1pdChyb3cpO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZE9iamVjdHMgPSB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnNlbGVjdGVkVmFsdWVzKCk7XG5cbiAgICAgIGlmIChzZWxlY3RlZE9iamVjdHMpIHtcbiAgICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHtcbiAgICAgICAgICByb3c6IFsuLi5zZWxlY3RlZE9iamVjdHNdLFxuICAgICAgICAgIGNvdW50OiBzZWxlY3RlZE9iamVjdHMuc2l6ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2NsaWNrZWRSb3ckLm5leHQocm93KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIHRoaXMuX3NlbGVjdFJhbmdlUm93cyh0aGlzLmxhc3RTZWxlY3RlZFJvdywgcm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0T25seVJvdyhyb3csIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0T25seVJvdyhyb3cpO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRSb3cgPSByb3c7XG4gICAgfVxuXG4gICAgdGhpcy5yb3dDbGljay5lbWl0KHJvdyk7XG4gICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHtcbiAgICAgIHJvdzogWy4uLnRoaXMuc2VsZWN0ZWRPYmplY3RzKCldLFxuICAgICAgY291bnQ6IHRoaXMuc2VsZWN0ZWRPYmplY3RzKCkuc2l6ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2NoYW5nZU9ubHlSb3dTdGF0ZShcbiAgICBzdGF0ZTogTWFwPFNjYWxhclVVSUQsIElSZWdpc3Rlck9iamVjdD4sXG4gICAgcm93OiB1bmtub3duLFxuICAgIHNhdmVTZWxlY3RlZD86IGJvb2xlYW5cbiAgKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiByb3cgIT09ICdvYmplY3QnIHx8ICFyb3cgfHwgISgnaWQnIGluIHJvdykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ9Cf0L7Qu9C1IGlkINC+0YLRgdGD0YLRgdGC0LLRg9C10YIg0LIg0Y3Qu9C10LzQtdC90YLQtScsIHJvdyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSByb3cuaWQgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHdhc1NlbGVjdGVkID0gc3RhdGUuZ2V0KGlkKT8uc3RhdGUgPT09IEVSZWdpc3Rlck9iamVjdFN0YXRlLlNFTEVDVEVEO1xuXG4gICAgaWYgKHNhdmVTZWxlY3RlZCkge1xuICAgICAgdGhpcy51cGRhdGVTdGF0ZU9iamVjdEJ5S2V5KGlkLCB7XG4gICAgICAgIHN0YXRlOiB3YXNTZWxlY3RlZCA/IEVSZWdpc3Rlck9iamVjdFN0YXRlLlVOU0VMRUNURUQgOiBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZUFsbFN0YXRlT2JqZWN0c0J5U3RhdGUoRVJlZ2lzdGVyT2JqZWN0U3RhdGUuVU5TRUxFQ1RFRCk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkoaWQsIHsgc3RhdGU6IEVSZWdpc3Rlck9iamVjdFN0YXRlLlNFTEVDVEVEIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdE9ubHlSb3cocm93OiB1bmtub3duLCBzYXZlU2VsZWN0ZWQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiByb3cgIT09ICdvYmplY3QnIHx8ICFyb3cgfHwgISgnaWQnIGluIHJvdykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ9Cf0L7Qu9C1IGlkINC+0YLRgdGD0YLRgdGC0LLRg9C10YIg0LIg0Y3Qu9C10LzQtdC90YLQtScsIHJvdyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSByb3cuaWQgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHdhc1NlbGVjdGVkID0gdGhpcy5zZWxlY3RlZElkcygpLmhhcyhpZCk7XG5cbiAgICBpZiAoc2F2ZVNlbGVjdGVkKSB7XG4gICAgICBpZiAod2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZElkcygpLmRlbGV0ZShpZCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzKCkuZGVsZXRlKHJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSWRzKCkuYWRkKGlkKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdHMoKS5hZGQocm93KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZElkcygpLmNsZWFyKCk7XG4gICAgICB0aGlzLnNlbGVjdGVkT2JqZWN0cygpLmNsZWFyKCk7XG4gICAgICB0aGlzLnNlbGVjdGVkSWRzKCkuYWRkKGlkKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzKCkuYWRkKHJvdyk7XG4gICAgfVxuICAgIHRoaXMuX2VtaXREZXByZWNhdGVkU2VsZWN0ZWRSb3dzKCk7XG4gIH1cblxuICBwcml2YXRlIF9lbWl0RGVwcmVjYXRlZFNlbGVjdGVkUm93cygpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXByZWNhdGVkU2VsZWN0ZWRSb3dzQ291bnRlci51cGRhdGUoKHZhbHVlKSA9PiB2YWx1ZSArIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hhbmdlUmFuZ2VSb3dzU3RhdGUoXG4gICAgc3RhdGVPYmplY3RzOiBNYXA8U2NhbGFyVVVJRCwgSVJlZ2lzdGVyT2JqZWN0PixcbiAgICBwcmV2aW91c1JvdzogdW5rbm93bixcbiAgICBjdXJyZW50Um93OiB1bmtub3duXG4gICk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlQWxsU3RhdGVPYmplY3RzQnlTdGF0ZShFUmVnaXN0ZXJPYmplY3RTdGF0ZS5VTlNFTEVDVEVEKTtcblxuICAgIGxldCBwcmV2SW5kZXggPSB0aGlzLnJvd0RhdGEoKS5pbmRleE9mKHByZXZpb3VzUm93KTtcbiAgICBsZXQgY3VyckluZGV4ID0gdGhpcy5yb3dEYXRhKCkuaW5kZXhPZihjdXJyZW50Um93KTtcblxuICAgIGlmIChwcmV2SW5kZXggPiBjdXJySW5kZXgpIHtcbiAgICAgIGNvbnN0IHRlbXBJbmRleCA9IHByZXZJbmRleDtcbiAgICAgIHByZXZJbmRleCA9IGN1cnJJbmRleDtcbiAgICAgIGN1cnJJbmRleCA9IHRlbXBJbmRleDtcbiAgICB9XG5cbiAgICBjb25zdCBpZHNPYmplY3RzU2hvdWxkU2VsZWN0ZWQ6IFNldDxTY2FsYXJVVUlEPiA9IG5ldyBTZXQoXG4gICAgICB0aGlzLnJvd0RhdGEoKVxuICAgICAgICAuc2xpY2UocHJldkluZGV4ID09PSAtMSA/IDAgOiBwcmV2SW5kZXgsIGN1cnJJbmRleCArIDEpXG4gICAgICAgIC5tYXAoKHJvdykgPT4gcm93LmlkKVxuICAgICk7XG5cbiAgICBjb25zdCBzbGljZWRTdGF0ZU9iamVjdHMgPSBuZXcgTWFwKFxuICAgICAgWy4uLnN0YXRlT2JqZWN0c10uZmlsdGVyKChba2V5XSkgPT4gaWRzT2JqZWN0c1Nob3VsZFNlbGVjdGVkLmhhcyhrZXkpKVxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBzbGljZWRTdGF0ZU9iamVjdHMua2V5cygpKSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkoa2V5LCB7IHN0YXRlOiBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRCB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RSYW5nZVJvd3MocHJldmlvdXNSb3c6IHVua25vd24sIGN1cnJlbnRSb3c6IHVua25vd24pOiB2b2lkIHtcbiAgICBsZXQgcHJldkluZGV4ID0gdGhpcy5yb3dEYXRhKCkuaW5kZXhPZihwcmV2aW91c1Jvdyk7XG4gICAgbGV0IGN1cnJJbmRleCA9IHRoaXMucm93RGF0YSgpLmluZGV4T2YoY3VycmVudFJvdyk7XG5cbiAgICBpZiAocHJldkluZGV4ID4gY3VyckluZGV4KSB7XG4gICAgICBjb25zdCB0ZW1wSW5kZXggPSBwcmV2SW5kZXg7XG4gICAgICBwcmV2SW5kZXggPSBjdXJySW5kZXg7XG4gICAgICBjdXJySW5kZXggPSB0ZW1wSW5kZXg7XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbXNTaG91bGRTZWxlY3RlZCA9IHRoaXMucm93RGF0YSgpLnNsaWNlKFxuICAgICAgcHJldkluZGV4ID09PSAtMSA/IDAgOiBwcmV2SW5kZXgsXG4gICAgICBjdXJySW5kZXggKyAxXG4gICAgKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRJZHMoKS5jbGVhcigpO1xuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RzKCkuY2xlYXIoKTtcbiAgICB0aGlzLl9lbWl0RGVwcmVjYXRlZFNlbGVjdGVkUm93cygpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zU2hvdWxkU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJZHMoKS5hZGQoaXRlbS5pZCk7XG4gICAgICB0aGlzLnNlbGVjdGVkT2JqZWN0cygpLmFkZChpdGVtKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdGhSZXNpemVDaGFuZ2VzKG5hbWU6IHN0cmluZywgd2lkdGg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHRoV2lkdGhDaGFuZ2VzRW50cnkgPSB0aGlzLl90aHNXaWR0aE1hcCgpLmdldChuYW1lKTtcblxuICAgIGlmICh0aFdpZHRoQ2hhbmdlc0VudHJ5KSB7XG4gICAgICBjb25zdCB2YWxpZFdpZHRoID0gd2lkdGggPiBNSU5fQ09MX1dJRFRIX1BYID8gd2lkdGggOiBNSU5fQ09MX1dJRFRIX1BYO1xuICAgICAgdGhXaWR0aENoYW5nZXNFbnRyeS5uZXh0KHZhbGlkV2lkdGgudG9TdHJpbmcoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRoV2lkdGgobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB0aFdpZHRoQ2hhbmdlc0VudHJ5ID0gdGhpcy5fdGhzV2lkdGhNYXAoKS5nZXQobmFtZSk7XG5cbiAgICByZXR1cm4gdGhXaWR0aENoYW5nZXNFbnRyeT8uZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzYXZlU2Nyb2xsRW5kUG9zaXRpb24oKTogdm9pZCB7XG4gICAgY29uc3Qgc2Nyb2xsYmFyRWxlbWVudCA9IHRoaXMuc2Nyb2xsYmFyKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoc2Nyb2xsYmFyRWxlbWVudCAmJiAhdGhpcy5pc0xvYWRpbmcoKSkge1xuICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbExlZnQgfSA9IHNjcm9sbGJhckVsZW1lbnQ7XG5cbiAgICAgIHRoaXMuc2Nyb2xsUG9zaXRpb24uc2V0KHtcbiAgICAgICAgdG9wOiBzY3JvbGxUb3AsXG4gICAgICAgIGxlZnQ6IHNjcm9sbExlZnQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQWxsU3RhdGVPYmplY3RzQnlTdGF0ZShzdGF0ZTogRVJlZ2lzdGVyT2JqZWN0U3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnNldEFsbFN0YXRlT2JqZWN0c0J5U3RhdGUoc3RhdGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVN0YXRlT2JqZWN0QnlLZXkoa2V5OiBTY2FsYXJVVUlELCB1cGRhdGVzOiBQYXJ0aWFsPElSZWdpc3Rlck9iamVjdD4pOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3RlZFNlcnZpY2U/LnNldFN0YXRlT2JqZWN0QnlLZXkoa2V5LCB1cGRhdGVzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrUm93QmVmb3JlU2VsZWN0KHJvdzogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNoaWZ0UHJlc3NlZCA9IHRoaXMuX3NoaWZ0LmlzUHJlc3NlZCgpO1xuICAgIGNvbnN0IHByZXZSb3cgPSB0aGlzLmxhc3RTZWxlY3RlZFJvdztcbiAgICBjb25zdCBob3ZlcmVkUm93ID0gdGhpcy5faG92ZXJlZFJvdyQuZ2V0VmFsdWUoKTtcblxuICAgIGlmIChzaGlmdFByZXNzZWQgJiYgcHJldlJvdyAmJiBob3ZlcmVkUm93KSB7XG4gICAgICBsZXQgYmVmb3JlSW5kZXggPSB0aGlzLnJvd0RhdGEoKS5pbmRleE9mKHByZXZSb3cpO1xuICAgICAgbGV0IGFmdGVySW5kZXggPSB0aGlzLnJvd0RhdGEoKS5pbmRleE9mKGhvdmVyZWRSb3cpO1xuXG4gICAgICBpZiAoYmVmb3JlSW5kZXggPiBhZnRlckluZGV4KSB7XG4gICAgICAgIGNvbnN0IHRlbXBJbmRleCA9IGJlZm9yZUluZGV4O1xuICAgICAgICBiZWZvcmVJbmRleCA9IGFmdGVySW5kZXg7XG4gICAgICAgIGFmdGVySW5kZXggPSB0ZW1wSW5kZXg7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMucm93RGF0YSgpLmluZGV4T2Yocm93KTtcblxuICAgICAgcmV0dXJuIGJlZm9yZUluZGV4IDw9IGN1cnJlbnRJbmRleCAmJiBjdXJyZW50SW5kZXggPD0gYWZ0ZXJJbmRleDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9idWlsZEhlYWRlclJlY3Vyc2l2ZShcbiAgICBjb2w6IElDb2x1bW5EYXRhLFxuICAgIGxldmVsOiBudW1iZXIsXG4gICAgbWF4RGVwdGg6IG51bWJlcixcbiAgICByb3dzOiB7IGNvbDogSUNvbHVtbkRhdGE7IHJvd3NwYW46IG51bWJlcjsgY29sc3BhbjogbnVtYmVyIH1bXVtdXG4gICk6IG51bWJlciB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjb2wuY2hpbGRyZW4gfHwgW107XG4gICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBjaGlsZHJlbi5sZW5ndGggPiAwO1xuXG4gICAgY29uc3QgY3VzdG9tUm93c3BhbiA9IGNvbC5yb3dzcGFuIHx8IDE7XG4gICAgY29uc3QgbmV4dExldmVsID0gbGV2ZWwgKyBjdXN0b21Sb3dzcGFuO1xuXG4gICAgbGV0IGNvbHNwYW4gPSAwO1xuXG4gICAgaWYgKGhhc0NoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgIGNvbHNwYW4gKz0gdGhpcy5fYnVpbGRIZWFkZXJSZWN1cnNpdmUoY2hpbGQsIG5leHRMZXZlbCwgbWF4RGVwdGgsIHJvd3MpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb2xzcGFuID0gMTtcbiAgICB9XG5cbiAgICBjb25zdCByb3dzcGFuID0gaGFzQ2hpbGRyZW4gPyBjdXN0b21Sb3dzcGFuIDogbWF4RGVwdGggLSBsZXZlbDtcblxuICAgIGlmIChyb3dzW2xldmVsXSkge1xuICAgICAgcm93c1tsZXZlbF0ucHVzaCh7IGNvbCwgcm93c3BhbiwgY29sc3BhbiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29sc3BhbjtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEZsYXRMZWF2ZXMoY29sdW1uczogSUNvbHVtbkRhdGFbXSk6IElDb2x1bW5EYXRhW10ge1xuICAgIHJldHVybiBjb2x1bW5zLmZsYXRNYXAoKGNvbCkgPT4ge1xuICAgICAgaWYgKGNvbC5jaGlsZHJlbiAmJiBjb2wuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RmxhdExlYXZlcyhjb2wuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtjb2xdO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlsdGVyVmlzaWJsZUNvbHVtbnMoY29sdW1uczogSUNvbHVtbkRhdGFbXSwgc2hvd2VkTmFtZXM6IHN0cmluZ1tdKTogSUNvbHVtbkRhdGFbXSB7XG4gICAgcmV0dXJuIGNvbHVtbnNcbiAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICBpZiAoY29sLmNoaWxkcmVuICYmIGNvbC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdmlzaWJsZUNoaWxkcmVuID0gdGhpcy5fZmlsdGVyVmlzaWJsZUNvbHVtbnMoY29sLmNoaWxkcmVuLCBzaG93ZWROYW1lcyk7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uY29sLCBjaGlsZHJlbjogdmlzaWJsZUNoaWxkcmVuIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbDtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChjb2wpID0+IHNob3dlZE5hbWVzLmluY2x1ZGVzKGNvbC5uYW1lKSB8fCAoY29sLmNoaWxkcmVuICYmIGNvbC5jaGlsZHJlbi5sZW5ndGggPiAwKSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRNYXhEZXB0aChjb2x1bW5zOiBJQ29sdW1uRGF0YVtdKTogbnVtYmVyIHtcbiAgICBpZiAoIWNvbHVtbnMgfHwgY29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiAxICsgTWF0aC5tYXgoLi4uY29sdW1ucy5tYXAoKGMpID0+IHRoaXMuX2dldE1heERlcHRoKGMuY2hpbGRyZW4gfHwgW10pKSk7XG4gIH1cbn1cbiIsIjxzZWN0aW9uIGNsYXNzPVwicmVnaXN0ZXItdGFibGVfX3NlY3Rpb25cIj5cbiAgPHR1aS1zY3JvbGxiYXIgY2xhc3M9XCJyZWdpc3Rlci10YWJsZV9fc2Nyb2xsYWJsZVwiIChzY3JvbGxlbmQpPVwic2F2ZVNjcm9sbEVuZFBvc2l0aW9uKClcIj5cbiAgICA8dHVpLWxvYWRlciBjbGFzcz1cInJlZ2lzdGVyLXRhYmxlX19sb2FkZXJcIiBbc2hvd0xvYWRlcl09XCJpc0xvYWRpbmcoKSB8fCBmYWxzZVwiIFtvdmVybGF5XT1cInRydWVcIj5cbiAgICAgIDx0YWJsZVxuICAgICAgICB0dWlUYWJsZVxuICAgICAgICBjbGFzcz1cInRhYmxlXCJcbiAgICAgICAgc3RpY2t5UmVsYXRpdmVcbiAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1dpdGhDaGVja2JveGVzKClcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwidGFibGVXaWR0aCgpXCJcbiAgICAgICAgdHVpU29ydEJ5PVwiXCJcbiAgICAgICAgKHNvcnRDaGFuZ2UpPVwic29ydENoYW5nZSgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIEBmb3IgKGhyb3cgb2YgaGVhZGVyUm93cygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDx0ciB0dWlUaEdyb3VwPlxuICAgICAgICAgICAgICBAaWYgKCRmaXJzdCAmJiBjaGVja2JveENvbHVtbigpKSB7XG4gICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICB0dWlUaFxuICAgICAgICAgICAgICAgICAgKnR1aUhlYWQ9XCJDSEVDS0JPWF9TRUxFQ1RPUl9LRVlcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWdpc3Rlci10YWJsZV9fdGgtYmFja2dyb3VuZC0tdGFibGUtY2VsbC1ibHVlIHJlZ2lzdGVyLXRhYmxlX19jZWxsLWljb24gcmVnaXN0ZXItdGFibGVfX2NlbGwtY2hlY2tib3gtc2VsZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cIkNIRUNLQk9YX1NFTEVDVE9SX1dJRFRIX1BYXCJcbiAgICAgICAgICAgICAgICAgIFtzb3J0ZXJdPVwibnVsbFwiXG4gICAgICAgICAgICAgICAgICBbcm93U3Bhbl09XCJtYXhEZXB0aCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8c3Byb2MtY2hlY2tib3gtc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cInNlbGVjdGVkSWRzKClcIlxuICAgICAgICAgICAgICAgICAgICBbdG90YWxSZWNvcmRzXT1cInRvdGFsUmVjb3JkcygpXCJcbiAgICAgICAgICAgICAgICAgICAgW2xvYWRpbmddPVwiaXNTZWxlY3Rsb2FkaW5nKClcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY2hlY2tib3hEaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgKG9uQXBwbHkpPVwic2VsZWN0Q2hhbmdlZC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgPjwvc3Byb2MtY2hlY2tib3gtc2VsZWN0b3I+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAZm9yIChjZWxsIG9mIGhyb3c7IHRyYWNrIGNlbGwuY29sLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBAbGV0IHRoQ2xhc3MgPSBjZWxsLmNvbC5jbGFzcyA/PyAnJztcbiAgICAgICAgICAgICAgICBAbGV0IHRoVHlwZSA9IGNlbGwuY29sLnR5cGU7XG4gICAgICAgICAgICAgICAgQGxldCB0aE5hbWUgPSBjZWxsLmNvbC5uYW1lO1xuICAgICAgICAgICAgICAgIEBsZXQgc29ydGFibGUgPSBjaGVja0F2YWlsYWJsZUNvbHVtblNvcnRpbmcoY2VsbC5jb2wpO1xuICAgICAgICAgICAgICAgIEBsZXQgcmVzaXplQmxvY2tlZCA9IGNoZWNrUmVzaXplQmxvY2tlZChjZWxsLmNvbCk7XG4gICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICB0dWlUaFxuICAgICAgICAgICAgICAgICAgdHVpUmVzaXphYmxlXG4gICAgICAgICAgICAgICAgICAqdHVpSGVhZD1cInRoTmFtZVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbJ3JlZ2lzdGVyLXRhYmxlX190aCcsIHRoVHlwZSB8IGNsYXNzQnlUeXBlLCB0aENsYXNzXVwiXG4gICAgICAgICAgICAgICAgICBbc3RpY2t5TGVmdF09XCJjZWxsLmNvbC5maXhlZCA/PyAodGhOYW1lIHwgc3RpY2t5Q29sdW1uOiBzdGlja3lMZWZ0SWRzKCkpXCJcbiAgICAgICAgICAgICAgICAgIFtzdGlja3lSaWdodF09XCJjZWxsLmNvbC5maXhlZCA/PyAodGhOYW1lIHwgc3RpY2t5Q29sdW1uOiBzdGlja3lSaWdodElkcygpKVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGVzT25TdGlja3ldPVwic3RpY2t5VGhTdHlsZVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGVdPVwiY2VsbC5jb2wuaGVhZGVyU3R5bGUgPz8gJydcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJnZXRUaFdpZHRoKHRoTmFtZSlcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImdldFRoV2lkdGgodGhOYW1lKVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImdldFRoV2lkdGgodGhOYW1lKVwiXG4gICAgICAgICAgICAgICAgICBbdHVpU29ydGFibGVdPVwic29ydGFibGVcIlxuICAgICAgICAgICAgICAgICAgW3NvcnRlcl09XCJzb3J0YWJsZSA/IHNldFRoTmFtZSh0aE5hbWUpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICBbdHVpSGludF09XCJjZWxsLmNvbC50b29sdGlwVGV4dCA/PyBudWxsXCJcbiAgICAgICAgICAgICAgICAgIFtyb3dTcGFuXT1cImNlbGwucm93c3BhblwiXG4gICAgICAgICAgICAgICAgICBbY29sU3Bhbl09XCJjZWxsLmNvbHNwYW5cIlxuICAgICAgICAgICAgICAgICAgW2F0dHIub3JkZXJdPVwiY29sdW1uT3JkZXJzLmdldCh0aE5hbWUpPy5vcHRpb25zPy5vcmRlclwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGlmIChjZWxsLmNvbC5pc0hlYWRUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBAbGV0IHRoUHJvamVjdGlvbiA9IGdldFByb2plY3Rpb25IZWFkZXJCeU5hbWUodGhOYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICBAaWYgKHRoUHJvamVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRoUHJvamVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGNlbGwuY29sLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQHN3aXRjaCAodGhUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5JQ09OKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHVpLWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWdpc3Rlci10YWJsZS0taWNvbi1jb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImNlbGwuY29sLnZhbHVlIVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC90dWktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5JQ09OX1NWRykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImNlbGwuY29sLnZhbHVlXCIgW2FsdF09XCJ0aE5hbWVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRUNvbHVtbkRhdGFUeXBlLlRFWFQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY2VsbC5jb2wuc3ZnU3JjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJjZWxsLmNvbC5zdmdTcmNcIiBbYWx0XT1cInRoTmFtZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtb3ZlcmZsb3ctLWVsbGlwc2lzXCIgW25nU3R5bGVdPVwiY2VsbC5jb2wudGV4dFN0eWxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNlbGwuY29sLnZhbHVlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBjYXNlIChFQ29sdW1uRGF0YVR5cGUuTlVNKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdTdHlsZV09XCJjZWxsLmNvbC50ZXh0U3R5bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2VsbC5jb2wudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5EQVRFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdTdHlsZV09XCJjZWxsLmNvbC50ZXh0U3R5bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2VsbC5jb2wudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5DSEVDS0JPWCkge1xuICAgICAgICAgICAgICAgICAgICAgICAge3sgY2VsbC5jb2wudmFsdWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBpZiAoIXJlc2l6ZUJsb2NrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicmVnaXN0ZXItdGFibGVfX2NlbGwtcmVzaXplclwiXG4gICAgICAgICAgICAgICAgICAgICAgW3R1aVJlc2l6ZXJdPVwiWzEsIDBdXCJcbiAgICAgICAgICAgICAgICAgICAgICAodHVpU2l6ZUNoYW5nZSk9XCJ0aFJlc2l6ZUNoYW5nZXMoY2VsbC5jb2wubmFtZSwgJGV2ZW50WzBdKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgQGxldCByb3dzID0gcm93RGF0YSgpO1xuICAgICAgICA8dGJvZHkgdHVpVGJvZHk+XG4gICAgICAgICAgQGZvciAocm93IG9mIHJvd3M7IHRyYWNrIHJvdy5pZCkge1xuICAgICAgICAgICAgQGxldCBzdGF0ZSA9IHN0YXRlT2JqZWN0cz8uKCk7XG4gICAgICAgICAgICBAbGV0IHRyU2VsZWN0ZWQgPVxuICAgICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICAgICAgID8gc3RhdGUuZ2V0KHJvdy5pZCk/LnN0YXRlID09PSBFUmVnaXN0ZXJPYmplY3RTdGF0ZS5TRUxFQ1RFRFxuICAgICAgICAgICAgICAgIDogc2VsZWN0ZWRJZHMoKS5oYXMocm93LmlkKTtcblxuICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICNib2R5Um93XG4gICAgICAgICAgICAgIHR1aVRyXG4gICAgICAgICAgICAgIGNsYXNzPVwicmVnaXN0ZXItdGFibGVfX3Jvd1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJ0clNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnNoaWZ0LXByZXNzZWRdPVwibWFya1Jvd0JlZm9yZVNlbGVjdChyb3cpXCJcbiAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25Sb3dIb3Zlcihyb3cpXCJcbiAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25Sb3dIb3ZlcihudWxsKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblJvd0NsaWNrKCRldmVudCwgcm93KVwiXG4gICAgICAgICAgICAgIChkYmxjbGljayk9XCJyb3dEYmxDbGljay5lbWl0KHJvdylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBAaWYgKGNoZWNrYm94Q29sdW1uKCkpIHtcbiAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgIHR1aVRkXG4gICAgICAgICAgICAgICAgICAqdHVpQ2VsbD1cIkNIRUNLQk9YX1NFTEVDVE9SX0tFWVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInJlZ2lzdGVyLXRhYmxlX19jZWxsLWNoZWNrYm94LXNlbGVjdG9yXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHVpQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidHJTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjaGVja2JveERpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBmb3IgKGNvbHVtbkRhdGEgb2YgbGVhdmVzKCk7IHRyYWNrIGNvbHVtbkRhdGEubmFtZSkge1xuICAgICAgICAgICAgICAgIEBsZXQgdGRUeXBlID0gY29sdW1uRGF0YS50eXBlO1xuICAgICAgICAgICAgICAgIEBsZXQgdGRLZXkgPSBjb2x1bW5EYXRhLm5hbWU7XG4gICAgICAgICAgICAgICAgQGxldCB0ZFZhbHVlID0gcm93W3RkS2V5XTtcbiAgICAgICAgICAgICAgICBAbGV0IHRkQ2xhc3MgPSBjb2x1bW5EYXRhLmNsYXNzVGQgPz8gJyc7XG5cbiAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgIHR1aVRkXG4gICAgICAgICAgICAgICAgICAqdHVpQ2VsbD1cInRkS2V5XCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlt0ZFR5cGUgfCBjbGFzc0J5VHlwZTogJ3RkJywgdGRDbGFzc11cIlxuICAgICAgICAgICAgICAgICAgW3N0aWNreUxlZnRdPVwidGRLZXkgfCBzdGlja3lDb2x1bW46IHN0aWNreUxlZnRJZHMoKVwiXG4gICAgICAgICAgICAgICAgICBbc3RpY2t5UmlnaHRdPVwidGRLZXkgfCBzdGlja3lDb2x1bW46IHN0aWNreVJpZ2h0SWRzKClcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlc09uU3RpY2t5XT1cInN0aWNreVRkU3R5bGVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEBpZiAoY29sdW1uRGF0YS5pc1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIEBsZXQgdGRQcm9qZWN0aW9uID0gZ2V0UHJvamVjdGlvbkNlbGxCeU5hbWUodGRLZXkpO1xuXG4gICAgICAgICAgICAgICAgICAgIEBpZiAodGRQcm9qZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGRQcm9qZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogdGRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgQHN3aXRjaCAodGRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5JQ09OKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHRkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHR1aS1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWdpc3Rlci10YWJsZS0taWNvbi1jb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiY29sdW1uRGF0YS52YWx1ZSFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC90dWktaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5JQ09OX1NWRykge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICh0ZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJjb2x1bW5EYXRhLnZhbHVlXCIgW2FsdF09XCJ0ZEtleVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIEBjYXNlIChFQ29sdW1uRGF0YVR5cGUuQ0hFQ0tCT1gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCIhIXRkVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRUNvbHVtbkRhdGFUeXBlLlRFWFQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFt0dWlIaW50XT1cInRkVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdGRWYWx1ZSA/PyAnJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRkVmFsdWUgPyBjb2x1bW5EYXRhLnBvc3RmaXggOiAnJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRUNvbHVtbkRhdGFUeXBlLk5VTSkge1xuICAgICAgICAgICAgICAgICAgICAgICAge3sgdGRWYWx1ZSA/PyAnJyB8IG51bWJlcjogY29sdW1uRGF0YS5udW1iZXJQaXBlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZFZhbHVlID8gY29sdW1uRGF0YS5wb3N0Zml4IDogJycgfX1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEVDb2x1bW5EYXRhVHlwZS5EQVRFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAodGRWYWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZm9ybWF0RGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFVGltZXpvbmUuVVRDXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbHVtbkRhdGEuZGF0ZVBhdHRlcm4gPz8gRURhdGVQYXR0ZXJuLkRBVEVfVElNRV9XSVRIT1VUX1NFQ09ORFNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHRpbWVab25lQ2hhbmdlcyQgfCBhc3luYykpID8/ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdGRWYWx1ZSA/IGNvbHVtbkRhdGEucG9zdGZpeCA6ICcnIH19XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICB9IEBlbXB0eSB7XG4gICAgICAgICAgICA8dHIgY2xhc3M9XCJlbXB0eS1sYXllclwiPlxuICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjEwMCVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VudGVyZWQtdGV4dFwiPnt7IGVtcHR5VGV4dCgpIH19PC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC90dWktbG9hZGVyPlxuICA8L3R1aS1zY3JvbGxiYXI+XG5cbiAgPHNwcm9jLXBhZ2luYXRvclxuICAgIGNsYXNzPVwicmVnaXN0ZXItdGFibGVfX3BhZ2luYXRvclwiXG4gICAgW3BhZ2VdPVwicGFnZSgpXCJcbiAgICBbcm93c109XCJsaW1pdCgpXCJcbiAgICBbcGFnZUxpbmtTaXplXT1cIjFcIlxuICAgIFt0b3RhbFJlY29yZHNdPVwidG90YWxSZWNvcmRzKClcIlxuICAgIFt0b3RhbE5vdEZpbHRlcmVkXT1cInRvdGFsTm90RmlsdGVyZWQoKVwiXG4gICAgW3Jvd3NDb3VudE9wdGlvbnNdPVwiWzMwLCA0MCwgNTBdXCJcbiAgICBbc2VsZWN0ZWRDb3VudGVyXT1cInNlbGVjdGVkQ291bnRlcigpXCJcbiAgICAocGFnaW5hdG9yQ2hhbmdlKT1cInBhZ2luYXRvckNoYW5nZS5lbWl0KCRldmVudClcIlxuICAgIFtkaXNhYmxlZF09XCJwYWdpbmF0b3JEaXNhYmxlZCgpXCJcbiAgICBbaXNMb2FkaW5nXT1cImlzUGFnaW5hdG9yTG9hZGluZygpXCJcbiAgPlxuICA8L3Nwcm9jLXBhZ2luYXRvcj5cbjwvc2VjdGlvbj5cbiJdfQ==
|