@ardium-ui/ui 1.0.0
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/README.md +25 -0
- package/esm2022/ardium-ui-ui.mjs +5 -0
- package/esm2022/lib/_internal/boolean-component.mjs +108 -0
- package/esm2022/lib/_internal/clear-button/clear-button.component.mjs +12 -0
- package/esm2022/lib/_internal/clear-button/clear-button.module.mjs +18 -0
- package/esm2022/lib/_internal/disablable-component.mjs +44 -0
- package/esm2022/lib/_internal/focusable-component.mjs +91 -0
- package/esm2022/lib/_internal/item-storages/dropdown-item-storage.mjs +436 -0
- package/esm2022/lib/_internal/item-storages/simple-item-storage.mjs +349 -0
- package/esm2022/lib/_internal/item-storages/simplest-item-storage.mjs +155 -0
- package/esm2022/lib/_internal/models/pagination.model.mjs +124 -0
- package/esm2022/lib/_internal/ngmodel-component.mjs +42 -0
- package/esm2022/lib/_internal/queue.mjs +59 -0
- package/esm2022/lib/_internal/selectable-list-component.mjs +304 -0
- package/esm2022/lib/badge/badge.directive.mjs +123 -0
- package/esm2022/lib/badge/badge.module.mjs +18 -0
- package/esm2022/lib/badge/badge.types.mjs +16 -0
- package/esm2022/lib/buttons/_button-base.mjs +45 -0
- package/esm2022/lib/buttons/button/button.component.mjs +49 -0
- package/esm2022/lib/buttons/button/button.module.mjs +18 -0
- package/esm2022/lib/buttons/fab/fab.component.mjs +40 -0
- package/esm2022/lib/buttons/fab/fab.module.mjs +18 -0
- package/esm2022/lib/buttons/general-button.types.mjs +55 -0
- package/esm2022/lib/buttons/icon-button/icon-button.component.mjs +37 -0
- package/esm2022/lib/buttons/icon-button/icon-button.module.mjs +18 -0
- package/esm2022/lib/calendar/calendar.component.mjs +982 -0
- package/esm2022/lib/calendar/calendar.directives.mjs +107 -0
- package/esm2022/lib/calendar/calendar.helpers.mjs +47 -0
- package/esm2022/lib/calendar/calendar.module.mjs +21 -0
- package/esm2022/lib/calendar/calendar.types.mjs +11 -0
- package/esm2022/lib/card/card.children.mjs +97 -0
- package/esm2022/lib/card/card.component.mjs +40 -0
- package/esm2022/lib/card/card.module.mjs +59 -0
- package/esm2022/lib/card/card.types.mjs +9 -0
- package/esm2022/lib/checkbox/checkbox.component.mjs +73 -0
- package/esm2022/lib/checkbox/checkbox.module.mjs +18 -0
- package/esm2022/lib/checkbox/checkbox.types.mjs +6 -0
- package/esm2022/lib/checkbox-list/checkbox-list.component.mjs +139 -0
- package/esm2022/lib/checkbox-list/checkbox-list.module.mjs +19 -0
- package/esm2022/lib/checkbox-list/checkbox-list.types.mjs +7 -0
- package/esm2022/lib/chip/chip.component.mjs +55 -0
- package/esm2022/lib/chip/chip.module.mjs +21 -0
- package/esm2022/lib/chip/deletable-chip/deletable-chip.component.mjs +80 -0
- package/esm2022/lib/chip/selectable-chip/selectable-chip.component.mjs +77 -0
- package/esm2022/lib/color/color-display/color-display.component.mjs +48 -0
- package/esm2022/lib/color/color-display/color-display.module.mjs +18 -0
- package/esm2022/lib/color/color-display/color-display.types.mjs +9 -0
- package/esm2022/lib/color/color-picker/color-picker.component.mjs +484 -0
- package/esm2022/lib/color/color-picker/color-picker.directives.mjs +55 -0
- package/esm2022/lib/color/color-picker/color-picker.module.mjs +43 -0
- package/esm2022/lib/color/color-picker/color-picker.types.mjs +11 -0
- package/esm2022/lib/dialog/dialog.component.mjs +167 -0
- package/esm2022/lib/dialog/dialog.directives.mjs +14 -0
- package/esm2022/lib/dialog/dialog.module.mjs +21 -0
- package/esm2022/lib/dialog/dialog.types.mjs +6 -0
- package/esm2022/lib/divider/divider.component.mjs +26 -0
- package/esm2022/lib/divider/divider.module.mjs +18 -0
- package/esm2022/lib/dropdown-panel/dropdown-panel.component.mjs +130 -0
- package/esm2022/lib/dropdown-panel/dropdown-panel.module.mjs +18 -0
- package/esm2022/lib/dropdown-panel/dropdown-panel.types.mjs +10 -0
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.component.mjs +82 -0
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.directives.mjs +42 -0
- package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.module.mjs +58 -0
- package/esm2022/lib/file-inputs/file-input/file-input.component.mjs +153 -0
- package/esm2022/lib/file-inputs/file-input/file-input.directives.mjs +73 -0
- package/esm2022/lib/file-inputs/file-input/file-input.module.mjs +21 -0
- package/esm2022/lib/file-inputs/file-input-base.mjs +187 -0
- package/esm2022/lib/file-inputs/file-input-types.mjs +2 -0
- package/esm2022/lib/form-field-frame/form-field-frame.component.mjs +74 -0
- package/esm2022/lib/form-field-frame/form-field-frame.directives.mjs +25 -0
- package/esm2022/lib/form-field-frame/form-field-frame.module.mjs +19 -0
- package/esm2022/lib/icon/icon.component.mjs +85 -0
- package/esm2022/lib/icon/icon.module.mjs +19 -0
- package/esm2022/lib/icon/icon.pipe.mjs +18 -0
- package/esm2022/lib/inputs/color-input/color-input.component.mjs +421 -0
- package/esm2022/lib/inputs/color-input/color-input.directives.mjs +101 -0
- package/esm2022/lib/inputs/color-input/color-input.module.mjs +85 -0
- package/esm2022/lib/inputs/color-input/color-input.types.mjs +2 -0
- package/esm2022/lib/inputs/digit-input/digit-input.component.mjs +218 -0
- package/esm2022/lib/inputs/digit-input/digit-input.model.mjs +217 -0
- package/esm2022/lib/inputs/digit-input/digit-input.module.mjs +18 -0
- package/esm2022/lib/inputs/digit-input/digit-input.types.mjs +15 -0
- package/esm2022/lib/inputs/digit-input/digit-input.utils.mjs +8 -0
- package/esm2022/lib/inputs/hex-input/hex-input.component.mjs +234 -0
- package/esm2022/lib/inputs/hex-input/hex-input.directives.mjs +36 -0
- package/esm2022/lib/inputs/hex-input/hex-input.module.mjs +21 -0
- package/esm2022/lib/inputs/hex-input.model.mjs +106 -0
- package/esm2022/lib/inputs/input/input.component.mjs +344 -0
- package/esm2022/lib/inputs/input/input.directives.mjs +58 -0
- package/esm2022/lib/inputs/input/input.module.mjs +47 -0
- package/esm2022/lib/inputs/input-transformers.mjs +66 -0
- package/esm2022/lib/inputs/input-types.mjs +6 -0
- package/esm2022/lib/inputs/input-utils.mjs +205 -0
- package/esm2022/lib/inputs/number-input/number-input.component.mjs +289 -0
- package/esm2022/lib/inputs/number-input/number-input.directives.mjs +14 -0
- package/esm2022/lib/inputs/number-input/number-input.module.mjs +21 -0
- package/esm2022/lib/inputs/password-input/password-input.component.mjs +222 -0
- package/esm2022/lib/inputs/password-input/password-input.directives.mjs +49 -0
- package/esm2022/lib/inputs/password-input/password-input.module.mjs +41 -0
- package/esm2022/lib/inputs/password-input/password-input.types.mjs +2 -0
- package/esm2022/lib/inputs/simple-input/simple-input.component.mjs +219 -0
- package/esm2022/lib/inputs/simple-input/simple-input.directives.mjs +36 -0
- package/esm2022/lib/inputs/simple-input/simple-input.module.mjs +37 -0
- package/esm2022/lib/kbd/kbd.component.mjs +42 -0
- package/esm2022/lib/kbd/kbd.module.mjs +19 -0
- package/esm2022/lib/kbd/kbd.pipe.mjs +17 -0
- package/esm2022/lib/kbd-shortcut/kbd-shortcut.component.mjs +55 -0
- package/esm2022/lib/kbd-shortcut/kbd-shortcut.module.mjs +19 -0
- package/esm2022/lib/modal/modal.component.mjs +120 -0
- package/esm2022/lib/modal/modal.module.mjs +21 -0
- package/esm2022/lib/option/option.component.mjs +77 -0
- package/esm2022/lib/option/option.module.mjs +18 -0
- package/esm2022/lib/progress-bar/progress-bar.component.mjs +95 -0
- package/esm2022/lib/progress-bar/progress-bar.directive.mjs +14 -0
- package/esm2022/lib/progress-bar/progress-bar.module.mjs +19 -0
- package/esm2022/lib/progress-bar/progress-bar.types.mjs +19 -0
- package/esm2022/lib/progress-circle/progress-circle.component.mjs +94 -0
- package/esm2022/lib/progress-circle/progress-circle.directive.mjs +14 -0
- package/esm2022/lib/progress-circle/progress-circle.module.mjs +19 -0
- package/esm2022/lib/progress-circle/progress-circle.types.mjs +10 -0
- package/esm2022/lib/radio/radio/radio.component.mjs +53 -0
- package/esm2022/lib/radio/radio-group.component.mjs +207 -0
- package/esm2022/lib/radio/radio.module.mjs +19 -0
- package/esm2022/lib/search-functions.mjs +64 -0
- package/esm2022/lib/segment/segment.component.mjs +168 -0
- package/esm2022/lib/segment/segment.directives.mjs +14 -0
- package/esm2022/lib/segment/segment.module.mjs +19 -0
- package/esm2022/lib/segment/segment.types.mjs +12 -0
- package/esm2022/lib/select/select.component.mjs +1160 -0
- package/esm2022/lib/select/select.directive.mjs +171 -0
- package/esm2022/lib/select/select.module.mjs +112 -0
- package/esm2022/lib/select/select.types.mjs +2 -0
- package/esm2022/lib/slide-toggle/slide-toggle.component.mjs +46 -0
- package/esm2022/lib/slide-toggle/slide-toggle.module.mjs +18 -0
- package/esm2022/lib/slider/abstract-slider.mjs +330 -0
- package/esm2022/lib/slider/range-slider/range-slider.component.mjs +143 -0
- package/esm2022/lib/slider/range-slider/range-slider.module.mjs +18 -0
- package/esm2022/lib/slider/slider.component.mjs +93 -0
- package/esm2022/lib/slider/slider.directive.mjs +16 -0
- package/esm2022/lib/slider/slider.module.mjs +20 -0
- package/esm2022/lib/slider/slider.types.mjs +10 -0
- package/esm2022/lib/snackbar/index.mjs +5 -0
- package/esm2022/lib/snackbar/snackbar-ref.mjs +51 -0
- package/esm2022/lib/snackbar/snackbar.component.mjs +48 -0
- package/esm2022/lib/snackbar/snackbar.service.mjs +227 -0
- package/esm2022/lib/snackbar/snackbar.token.mjs +20 -0
- package/esm2022/lib/snackbar/snackbar.types.mjs +25 -0
- package/esm2022/lib/spinner/spinner.component.mjs +22 -0
- package/esm2022/lib/spinner/spinner.module.mjs +18 -0
- package/esm2022/lib/star/star-button/star-button.component.mjs +53 -0
- package/esm2022/lib/star/star-button/star-button.module.mjs +19 -0
- package/esm2022/lib/star/star-display/star-display.component.mjs +66 -0
- package/esm2022/lib/star/star-display/star-display.module.mjs +19 -0
- package/esm2022/lib/star/star-input/star-input.component.mjs +221 -0
- package/esm2022/lib/star/star-input/star-input.module.mjs +19 -0
- package/esm2022/lib/star/star.component.mjs +28 -0
- package/esm2022/lib/star/star.module.mjs +18 -0
- package/esm2022/lib/star/star.types.mjs +23 -0
- package/esm2022/lib/statebox/statebox.component.mjs +158 -0
- package/esm2022/lib/statebox/statebox.module.mjs +18 -0
- package/esm2022/lib/statebox/statebox.types.mjs +2 -0
- package/esm2022/lib/table/table-item-storage.mjs +560 -0
- package/esm2022/lib/table/table.component.mjs +468 -0
- package/esm2022/lib/table/table.directives.mjs +64 -0
- package/esm2022/lib/table/table.module.mjs +46 -0
- package/esm2022/lib/table/table.types.mjs +30 -0
- package/esm2022/lib/table/utils.mjs +18 -0
- package/esm2022/lib/table-from-csv/table-from-csv.component.mjs +64 -0
- package/esm2022/lib/table-from-csv/table-from-csv.module.mjs +19 -0
- package/esm2022/lib/table-pagination/table-pagination.component.mjs +172 -0
- package/esm2022/lib/table-pagination/table-pagination.module.mjs +21 -0
- package/esm2022/lib/table-pagination/table-pagination.types.mjs +7 -0
- package/esm2022/lib/types/alignment.types.mjs +10 -0
- package/esm2022/lib/types/colors.types.mjs +43 -0
- package/esm2022/lib/types/item-storage.types.mjs +6 -0
- package/esm2022/lib/types/theming.types.mjs +48 -0
- package/esm2022/lib/types/utility.types.mjs +5 -0
- package/esm2022/public-api.mjs +194 -0
- package/fesm2022/ardium-ui-ui.mjs +14316 -0
- package/fesm2022/ardium-ui-ui.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/_internal/boolean-component.d.ts +50 -0
- package/lib/_internal/clear-button/clear-button.component.d.ts +6 -0
- package/lib/_internal/clear-button/clear-button.module.d.ts +8 -0
- package/lib/_internal/disablable-component.d.ts +11 -0
- package/lib/_internal/focusable-component.d.ts +52 -0
- package/lib/_internal/item-storages/dropdown-item-storage.d.ts +87 -0
- package/lib/_internal/item-storages/simple-item-storage.d.ts +159 -0
- package/lib/_internal/item-storages/simplest-item-storage.d.ts +70 -0
- package/lib/_internal/models/pagination.model.d.ts +53 -0
- package/lib/_internal/ngmodel-component.d.ts +42 -0
- package/lib/_internal/queue.d.ts +21 -0
- package/lib/_internal/selectable-list-component.d.ts +71 -0
- package/lib/badge/badge.directive.d.ts +31 -0
- package/lib/badge/badge.module.d.ts +8 -0
- package/lib/badge/badge.types.d.ts +17 -0
- package/lib/buttons/_button-base.d.ts +18 -0
- package/lib/buttons/button/button.component.d.ts +15 -0
- package/lib/buttons/button/button.module.d.ts +8 -0
- package/lib/buttons/fab/fab.component.d.ts +12 -0
- package/lib/buttons/fab/fab.module.d.ts +8 -0
- package/lib/buttons/general-button.types.d.ts +57 -0
- package/lib/buttons/icon-button/icon-button.component.d.ts +13 -0
- package/lib/buttons/icon-button/icon-button.module.d.ts +8 -0
- package/lib/calendar/calendar.component.d.ts +155 -0
- package/lib/calendar/calendar.directives.d.ts +51 -0
- package/lib/calendar/calendar.helpers.d.ts +15 -0
- package/lib/calendar/calendar.module.d.ts +11 -0
- package/lib/calendar/calendar.types.d.ts +80 -0
- package/lib/card/card.children.d.ts +43 -0
- package/lib/card/card.component.d.ts +13 -0
- package/lib/card/card.module.d.ts +9 -0
- package/lib/card/card.types.d.ts +10 -0
- package/lib/checkbox/checkbox.component.d.ts +21 -0
- package/lib/checkbox/checkbox.module.d.ts +8 -0
- package/lib/checkbox/checkbox.types.d.ts +6 -0
- package/lib/checkbox-list/checkbox-list.component.d.ts +50 -0
- package/lib/checkbox-list/checkbox-list.module.d.ts +9 -0
- package/lib/checkbox-list/checkbox-list.types.d.ts +7 -0
- package/lib/chip/chip.component.d.ts +18 -0
- package/lib/chip/chip.module.d.ts +11 -0
- package/lib/chip/deletable-chip/deletable-chip.component.d.ts +24 -0
- package/lib/chip/selectable-chip/selectable-chip.component.d.ts +24 -0
- package/lib/color/color-display/color-display.component.d.ts +17 -0
- package/lib/color/color-display/color-display.module.d.ts +8 -0
- package/lib/color/color-display/color-display.types.d.ts +9 -0
- package/lib/color/color-picker/color-picker.component.d.ts +125 -0
- package/lib/color/color-picker/color-picker.directives.d.ts +27 -0
- package/lib/color/color-picker/color-picker.module.d.ts +13 -0
- package/lib/color/color-picker/color-picker.types.d.ts +21 -0
- package/lib/dialog/dialog.component.d.ts +44 -0
- package/lib/dialog/dialog.directives.d.ts +9 -0
- package/lib/dialog/dialog.module.d.ts +11 -0
- package/lib/dialog/dialog.types.d.ts +28 -0
- package/lib/divider/divider.component.d.ts +8 -0
- package/lib/divider/divider.module.d.ts +8 -0
- package/lib/dropdown-panel/dropdown-panel.component.d.ts +37 -0
- package/lib/dropdown-panel/dropdown-panel.module.d.ts +8 -0
- package/lib/dropdown-panel/dropdown-panel.types.d.ts +12 -0
- package/lib/file-inputs/file-drop-area/file-drop-area.component.d.ts +22 -0
- package/lib/file-inputs/file-drop-area/file-drop-area.directives.d.ts +21 -0
- package/lib/file-inputs/file-drop-area/file-drop-area.module.d.ts +12 -0
- package/lib/file-inputs/file-input/file-input.component.d.ts +41 -0
- package/lib/file-inputs/file-input/file-input.directives.d.ts +39 -0
- package/lib/file-inputs/file-input/file-input.module.d.ts +11 -0
- package/lib/file-inputs/file-input-base.d.ts +43 -0
- package/lib/file-inputs/file-input-types.d.ts +10 -0
- package/lib/form-field-frame/form-field-frame.component.d.ts +32 -0
- package/lib/form-field-frame/form-field-frame.directives.d.ts +14 -0
- package/lib/form-field-frame/form-field-frame.module.d.ts +9 -0
- package/lib/icon/icon.component.d.ts +32 -0
- package/lib/icon/icon.module.d.ts +9 -0
- package/lib/icon/icon.pipe.d.ts +7 -0
- package/lib/inputs/color-input/color-input.component.d.ts +147 -0
- package/lib/inputs/color-input/color-input.directives.d.ts +52 -0
- package/lib/inputs/color-input/color-input.module.d.ts +16 -0
- package/lib/inputs/color-input/color-input.types.d.ts +5 -0
- package/lib/inputs/digit-input/digit-input.component.d.ts +50 -0
- package/lib/inputs/digit-input/digit-input.model.d.ts +26 -0
- package/lib/inputs/digit-input/digit-input.module.d.ts +8 -0
- package/lib/inputs/digit-input/digit-input.types.d.ts +27 -0
- package/lib/inputs/digit-input/digit-input.utils.d.ts +17 -0
- package/lib/inputs/hex-input/hex-input.component.d.ts +60 -0
- package/lib/inputs/hex-input/hex-input.directives.d.ts +20 -0
- package/lib/inputs/hex-input/hex-input.module.d.ts +11 -0
- package/lib/inputs/hex-input.model.d.ts +27 -0
- package/lib/inputs/input/input.component.d.ts +79 -0
- package/lib/inputs/input/input.directives.d.ts +33 -0
- package/lib/inputs/input/input.module.d.ts +13 -0
- package/lib/inputs/input-transformers.d.ts +24 -0
- package/lib/inputs/input-types.d.ts +6 -0
- package/lib/inputs/input-utils.d.ts +58 -0
- package/lib/inputs/number-input/number-input.component.d.ts +70 -0
- package/lib/inputs/number-input/number-input.directives.d.ts +8 -0
- package/lib/inputs/number-input/number-input.module.d.ts +11 -0
- package/lib/inputs/password-input/password-input.component.d.ts +54 -0
- package/lib/inputs/password-input/password-input.directives.d.ts +27 -0
- package/lib/inputs/password-input/password-input.module.d.ts +11 -0
- package/lib/inputs/password-input/password-input.types.d.ts +3 -0
- package/lib/inputs/simple-input/simple-input.component.d.ts +58 -0
- package/lib/inputs/simple-input/simple-input.directives.d.ts +20 -0
- package/lib/inputs/simple-input/simple-input.module.d.ts +11 -0
- package/lib/kbd/kbd.component.d.ts +15 -0
- package/lib/kbd/kbd.module.d.ts +9 -0
- package/lib/kbd/kbd.pipe.d.ts +7 -0
- package/lib/kbd-shortcut/kbd-shortcut.component.d.ts +18 -0
- package/lib/kbd-shortcut/kbd-shortcut.module.d.ts +9 -0
- package/lib/modal/modal.component.d.ts +36 -0
- package/lib/modal/modal.module.d.ts +11 -0
- package/lib/option/option.component.d.ts +29 -0
- package/lib/option/option.module.d.ts +8 -0
- package/lib/progress-bar/progress-bar.component.d.ts +26 -0
- package/lib/progress-bar/progress-bar.directive.d.ts +9 -0
- package/lib/progress-bar/progress-bar.module.d.ts +9 -0
- package/lib/progress-bar/progress-bar.types.d.ts +26 -0
- package/lib/progress-circle/progress-circle.component.d.ts +28 -0
- package/lib/progress-circle/progress-circle.directive.d.ts +9 -0
- package/lib/progress-circle/progress-circle.module.d.ts +9 -0
- package/lib/progress-circle/progress-circle.types.d.ts +17 -0
- package/lib/radio/radio/radio.component.d.ts +23 -0
- package/lib/radio/radio-group.component.d.ts +43 -0
- package/lib/radio/radio.module.d.ts +9 -0
- package/lib/search-functions.d.ts +10 -0
- package/lib/segment/segment.component.d.ts +48 -0
- package/lib/segment/segment.directives.d.ts +9 -0
- package/lib/segment/segment.module.d.ts +9 -0
- package/lib/segment/segment.types.d.ts +16 -0
- package/lib/select/select.component.d.ts +255 -0
- package/lib/select/select.directive.d.ts +94 -0
- package/lib/select/select.module.d.ts +14 -0
- package/lib/select/select.types.d.ts +109 -0
- package/lib/slide-toggle/slide-toggle.component.d.ts +14 -0
- package/lib/slide-toggle/slide-toggle.module.d.ts +8 -0
- package/lib/slider/abstract-slider.d.ts +88 -0
- package/lib/slider/range-slider/range-slider.component.d.ts +29 -0
- package/lib/slider/range-slider/range-slider.module.d.ts +8 -0
- package/lib/slider/slider.component.d.ts +18 -0
- package/lib/slider/slider.directive.d.ts +9 -0
- package/lib/slider/slider.module.d.ts +10 -0
- package/lib/slider/slider.types.d.ts +28 -0
- package/lib/snackbar/index.d.ts +4 -0
- package/lib/snackbar/snackbar-ref.d.ts +37 -0
- package/lib/snackbar/snackbar.component.d.ts +16 -0
- package/lib/snackbar/snackbar.service.d.ts +31 -0
- package/lib/snackbar/snackbar.token.d.ts +5 -0
- package/lib/snackbar/snackbar.types.d.ts +48 -0
- package/lib/spinner/spinner.component.d.ts +8 -0
- package/lib/spinner/spinner.module.d.ts +8 -0
- package/lib/star/star-button/star-button.component.d.ts +16 -0
- package/lib/star/star-button/star-button.module.d.ts +9 -0
- package/lib/star/star-display/star-display.component.d.ts +16 -0
- package/lib/star/star-display/star-display.module.d.ts +9 -0
- package/lib/star/star-input/star-input.component.d.ts +51 -0
- package/lib/star/star-input/star-input.module.d.ts +9 -0
- package/lib/star/star.component.d.ts +10 -0
- package/lib/star/star.module.d.ts +8 -0
- package/lib/star/star.types.d.ts +30 -0
- package/lib/statebox/statebox.component.d.ts +31 -0
- package/lib/statebox/statebox.module.d.ts +8 -0
- package/lib/statebox/statebox.types.d.ts +22 -0
- package/lib/table/table-item-storage.d.ts +266 -0
- package/lib/table/table.component.d.ts +127 -0
- package/lib/table/table.directives.d.ts +35 -0
- package/lib/table/table.module.d.ts +12 -0
- package/lib/table/table.types.d.ts +83 -0
- package/lib/table/utils.d.ts +4 -0
- package/lib/table-from-csv/table-from-csv.component.d.ts +16 -0
- package/lib/table-from-csv/table-from-csv.module.d.ts +9 -0
- package/lib/table-pagination/table-pagination.component.d.ts +48 -0
- package/lib/table-pagination/table-pagination.module.d.ts +11 -0
- package/lib/table-pagination/table-pagination.types.d.ts +9 -0
- package/lib/types/alignment.types.d.ts +11 -0
- package/lib/types/colors.types.d.ts +71 -0
- package/lib/types/item-storage.types.d.ts +98 -0
- package/lib/types/theming.types.d.ts +61 -0
- package/lib/types/utility.types.d.ts +11 -0
- package/package.json +36 -0
- package/prebuilt-themes/default/badge.css +208 -0
- package/prebuilt-themes/default/badge.css.map +1 -0
- package/prebuilt-themes/default/buttons/button.css +290 -0
- package/prebuilt-themes/default/buttons/button.css.map +1 -0
- package/prebuilt-themes/default/buttons/fab.css +307 -0
- package/prebuilt-themes/default/buttons/fab.css.map +1 -0
- package/prebuilt-themes/default/buttons/icon-button.css +288 -0
- package/prebuilt-themes/default/buttons/icon-button.css.map +1 -0
- package/prebuilt-themes/default/calendar.css +293 -0
- package/prebuilt-themes/default/calendar.css.map +1 -0
- package/prebuilt-themes/default/card.css +122 -0
- package/prebuilt-themes/default/card.css.map +1 -0
- package/prebuilt-themes/default/checkbox-list.css +65 -0
- package/prebuilt-themes/default/checkbox-list.css.map +1 -0
- package/prebuilt-themes/default/checkbox.css +365 -0
- package/prebuilt-themes/default/checkbox.css.map +1 -0
- package/prebuilt-themes/default/chips.css +367 -0
- package/prebuilt-themes/default/chips.css.map +1 -0
- package/prebuilt-themes/default/color-display.css +29 -0
- package/prebuilt-themes/default/color-display.css.map +1 -0
- package/prebuilt-themes/default/color-picker.css +106 -0
- package/prebuilt-themes/default/color-picker.css.map +1 -0
- package/prebuilt-themes/default/core.css +84 -0
- package/prebuilt-themes/default/core.css.map +1 -0
- package/prebuilt-themes/default/dialog.css +18 -0
- package/prebuilt-themes/default/dialog.css.map +1 -0
- package/prebuilt-themes/default/divider.css +11 -0
- package/prebuilt-themes/default/divider.css.map +1 -0
- package/prebuilt-themes/default/dropdown-panel.css +37 -0
- package/prebuilt-themes/default/dropdown-panel.css.map +1 -0
- package/prebuilt-themes/default/file-drop-area.css +279 -0
- package/prebuilt-themes/default/file-drop-area.css.map +1 -0
- package/prebuilt-themes/default/form-field-frame.css +84 -0
- package/prebuilt-themes/default/form-field-frame.css.map +1 -0
- package/prebuilt-themes/default/inputs/color-input.css +139 -0
- package/prebuilt-themes/default/inputs/color-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/digit-input.css +45 -0
- package/prebuilt-themes/default/inputs/digit-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/file-input.css +169 -0
- package/prebuilt-themes/default/inputs/file-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/hex-input.css +119 -0
- package/prebuilt-themes/default/inputs/hex-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/input.css +139 -0
- package/prebuilt-themes/default/inputs/input.css.map +1 -0
- package/prebuilt-themes/default/inputs/number-input.css +150 -0
- package/prebuilt-themes/default/inputs/number-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/password-input.css +73 -0
- package/prebuilt-themes/default/inputs/password-input.css.map +1 -0
- package/prebuilt-themes/default/inputs/search-bar.css +114 -0
- package/prebuilt-themes/default/inputs/search-bar.css.map +1 -0
- package/prebuilt-themes/default/inputs/simple-input.css +114 -0
- package/prebuilt-themes/default/inputs/simple-input.css.map +1 -0
- package/prebuilt-themes/default/kbd-shortcut.css +12 -0
- package/prebuilt-themes/default/kbd-shortcut.css.map +1 -0
- package/prebuilt-themes/default/kbd.css +17 -0
- package/prebuilt-themes/default/kbd.css.map +1 -0
- package/prebuilt-themes/default/modal.css +73 -0
- package/prebuilt-themes/default/modal.css.map +1 -0
- package/prebuilt-themes/default/progress-bar.css +267 -0
- package/prebuilt-themes/default/progress-bar.css.map +1 -0
- package/prebuilt-themes/default/progress-circle.css +167 -0
- package/prebuilt-themes/default/progress-circle.css.map +1 -0
- package/prebuilt-themes/default/radio.css +226 -0
- package/prebuilt-themes/default/radio.css.map +1 -0
- package/prebuilt-themes/default/segment.css +391 -0
- package/prebuilt-themes/default/segment.css.map +1 -0
- package/prebuilt-themes/default/select.css +275 -0
- package/prebuilt-themes/default/select.css.map +1 -0
- package/prebuilt-themes/default/slide-toggle.css +264 -0
- package/prebuilt-themes/default/slide-toggle.css.map +1 -0
- package/prebuilt-themes/default/slider.css +354 -0
- package/prebuilt-themes/default/slider.css.map +1 -0
- package/prebuilt-themes/default/snackbar.css +183 -0
- package/prebuilt-themes/default/snackbar.css.map +1 -0
- package/prebuilt-themes/default/spinner.css +151 -0
- package/prebuilt-themes/default/spinner.css.map +1 -0
- package/prebuilt-themes/default/stars.css +291 -0
- package/prebuilt-themes/default/stars.css.map +1 -0
- package/prebuilt-themes/default/statebox.css +235 -0
- package/prebuilt-themes/default/statebox.css.map +1 -0
- package/prebuilt-themes/default/table-pagination.css +48 -0
- package/prebuilt-themes/default/table-pagination.css.map +1 -0
- package/prebuilt-themes/default/table.css +418 -0
- package/prebuilt-themes/default/table.css.map +1 -0
- package/public-api.d.ts +145 -0
- package/themes/_variables.scss +121 -0
- package/themes/default/_clear-button.scss +73 -0
- package/themes/default/_coloring.scss +137 -0
- package/themes/default/_dropdown-arrow.scss +12 -0
- package/themes/default/_mixins.scss +70 -0
- package/themes/default/badge.scss +94 -0
- package/themes/default/buttons/_button-mixins.scss +144 -0
- package/themes/default/buttons/button.scss +62 -0
- package/themes/default/buttons/fab.scss +72 -0
- package/themes/default/buttons/icon-button.scss +59 -0
- package/themes/default/calendar.scss +182 -0
- package/themes/default/card.scss +126 -0
- package/themes/default/checkbox-list.scss +83 -0
- package/themes/default/checkbox.scss +109 -0
- package/themes/default/chips.scss +206 -0
- package/themes/default/color-display.scss +41 -0
- package/themes/default/color-picker.scss +111 -0
- package/themes/default/core.scss +96 -0
- package/themes/default/dialog.scss +16 -0
- package/themes/default/divider.scss +13 -0
- package/themes/default/dropdown-panel.scss +45 -0
- package/themes/default/file-drop-area.scss +162 -0
- package/themes/default/form-field-frame.scss +78 -0
- package/themes/default/inputs/_shared.scss +46 -0
- package/themes/default/inputs/color-input.scss +46 -0
- package/themes/default/inputs/digit-input.scss +56 -0
- package/themes/default/inputs/file-input.scss +78 -0
- package/themes/default/inputs/hex-input.scss +27 -0
- package/themes/default/inputs/input.scss +52 -0
- package/themes/default/inputs/number-input.scss +121 -0
- package/themes/default/inputs/password-input.scss +43 -0
- package/themes/default/inputs/search-bar.scss +19 -0
- package/themes/default/inputs/simple-input.scss +19 -0
- package/themes/default/kbd-shortcut.scss +13 -0
- package/themes/default/kbd.scss +20 -0
- package/themes/default/modal.scss +93 -0
- package/themes/default/progress-bar.scss +166 -0
- package/themes/default/progress-circle.scss +56 -0
- package/themes/default/radio.scss +112 -0
- package/themes/default/segment.scss +339 -0
- package/themes/default/select.scss +253 -0
- package/themes/default/slide-toggle.scss +151 -0
- package/themes/default/slider.scss +224 -0
- package/themes/default/snackbar.scss +60 -0
- package/themes/default/spinner.scss +21 -0
- package/themes/default/stars.scss +122 -0
- package/themes/default/statebox.scss +109 -0
- package/themes/default/table-pagination.scss +56 -0
- package/themes/default/table.scss +403 -0
|
@@ -0,0 +1,560 @@
|
|
|
1
|
+
import resolvePath from 'resolve-object-path';
|
|
2
|
+
import { evaluate, isDefined, isNull } from 'simple-bool';
|
|
3
|
+
import { SortType, TablePaginationStrategy } from './table.types';
|
|
4
|
+
import { areAllDataColumns, isTableSubheader, merge2dArrays } from './utils';
|
|
5
|
+
export class HeaderCell {
|
|
6
|
+
get width() {
|
|
7
|
+
if (isTableSubheader(this.cell))
|
|
8
|
+
return null;
|
|
9
|
+
return this._getWidth(this.cell.width);
|
|
10
|
+
}
|
|
11
|
+
get minWidth() {
|
|
12
|
+
if (isTableSubheader(this.cell))
|
|
13
|
+
return null;
|
|
14
|
+
return this._getWidth(this.cell.minWidth);
|
|
15
|
+
}
|
|
16
|
+
_getWidth(width) {
|
|
17
|
+
if (!width)
|
|
18
|
+
return null;
|
|
19
|
+
if (typeof width == 'number')
|
|
20
|
+
return `${width}px`;
|
|
21
|
+
return width;
|
|
22
|
+
}
|
|
23
|
+
constructor(cell, colspan = 1, rowspan = 1) {
|
|
24
|
+
this.cell = cell;
|
|
25
|
+
this.colspan = colspan;
|
|
26
|
+
this.rowspan = rowspan;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class TableItemStorage {
|
|
30
|
+
constructor(_ardParentComp) {
|
|
31
|
+
this._ardParentComp = _ardParentComp;
|
|
32
|
+
this._items = [];
|
|
33
|
+
this._sortedItems = [];
|
|
34
|
+
this._highlightedItems = [];
|
|
35
|
+
this._selectedItems = [];
|
|
36
|
+
this._dataColumns = [];
|
|
37
|
+
this._headerCells = [];
|
|
38
|
+
//! sorting
|
|
39
|
+
this._currentSortColumn = null;
|
|
40
|
+
this._currentSortType = null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Gets all items.
|
|
44
|
+
*/
|
|
45
|
+
get items() {
|
|
46
|
+
return this._items;
|
|
47
|
+
}
|
|
48
|
+
get sortedItems() {
|
|
49
|
+
return this._sortedItems;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Gets items based on the current pagination state.
|
|
53
|
+
*/
|
|
54
|
+
get paginatedItems() {
|
|
55
|
+
//prettier-ignore
|
|
56
|
+
if (!this._ardParentComp.paginated
|
|
57
|
+
|| this._ardParentComp.paginationStrategy == TablePaginationStrategy.Noop) {
|
|
58
|
+
return this.sortedItems;
|
|
59
|
+
}
|
|
60
|
+
const page = this._ardParentComp.page;
|
|
61
|
+
const IPP = this._ardParentComp.itemsPerPage;
|
|
62
|
+
const itemsStart = (page - 1) * IPP;
|
|
63
|
+
const itemsEnd = page * IPP;
|
|
64
|
+
return this.sortedItems.slice(itemsStart, itemsEnd);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Gets all currently selected items.
|
|
68
|
+
*/
|
|
69
|
+
get selectedItems() {
|
|
70
|
+
return this._selectedItems;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Gets all currently highlighted items.
|
|
74
|
+
*/
|
|
75
|
+
get highlightedItems() {
|
|
76
|
+
return this._highlightedItems;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Gets the values of the currently selected items.
|
|
80
|
+
*/
|
|
81
|
+
get value() {
|
|
82
|
+
return this._itemsToValue(this.selectedItems);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Maps an array of items into their values.
|
|
86
|
+
* @param items The items to convert to value.
|
|
87
|
+
* @returns An array of item values.
|
|
88
|
+
*/
|
|
89
|
+
_itemsToValue(items) {
|
|
90
|
+
return items.map(item => item.itemData);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Returns true if at least one item is highlighted, otherwise false.
|
|
94
|
+
*/
|
|
95
|
+
get isAnyItemHighlighted() {
|
|
96
|
+
return this._highlightedItems.length > 0;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Checks if any item in the table is selected.
|
|
100
|
+
* @returns A boolean value indicating if any item is selected.
|
|
101
|
+
*/
|
|
102
|
+
get isAnyItemSelected() {
|
|
103
|
+
return this._selectedItems.length > 0;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Checks if all items in the table are selected.
|
|
107
|
+
* @returns A boolean value indicating if all items are selected.
|
|
108
|
+
*/
|
|
109
|
+
get areAllSelected() {
|
|
110
|
+
return this._selectedItems.length == this._items.filter(item => !item.disabled).length;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Returns true if the parent component defines the limit of concurrently selectable items and the amount of currently selected items matches that limit. Otherwise returns false.
|
|
114
|
+
*
|
|
115
|
+
* **TLDR**: true if `maxSelectedItems` is defined and the number of selected items matches that value.
|
|
116
|
+
*/
|
|
117
|
+
get isItemLimitReached() {
|
|
118
|
+
if (!isDefined(this._ardParentComp.maxSelectedItems)) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
return this._ardParentComp.maxSelectedItems <= this.selectedItems.length;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Gets the header cells of the table.
|
|
125
|
+
* @returns a 2D array of header cells.
|
|
126
|
+
*/
|
|
127
|
+
get headerCells() {
|
|
128
|
+
return this._headerCells;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Checks if the table has defined columns.
|
|
132
|
+
* @returns a boolean value indicating if the table has defined columns.
|
|
133
|
+
*/
|
|
134
|
+
get hasDefinedColumns() {
|
|
135
|
+
return this._dataColumns.length > 0;
|
|
136
|
+
}
|
|
137
|
+
//! setting columns
|
|
138
|
+
/**
|
|
139
|
+
* Sets the columns of the table.
|
|
140
|
+
* @param cols an array of table data columns or table subheaders.
|
|
141
|
+
*/
|
|
142
|
+
setColumns(cols) {
|
|
143
|
+
const maxNestingLevel = this._getHeaderMaxNesting(cols);
|
|
144
|
+
const headerCells = this._mapColumnsToArray(cols, maxNestingLevel, 0);
|
|
145
|
+
this._headerCells = this._filterHeaderCells(headerCells);
|
|
146
|
+
this._dataColumns = this._extractDataSources(cols);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Filters out null values from the header cells array.
|
|
150
|
+
* @param cells a 2D array of header cells or null values.
|
|
151
|
+
* @returns a 2D array of header cells without null values and empty arrays.
|
|
152
|
+
*/
|
|
153
|
+
_filterHeaderCells(cells) {
|
|
154
|
+
for (let i = 0; i < cells.length; i++) {
|
|
155
|
+
cells[i] = cells[i].filter(v => v != null);
|
|
156
|
+
}
|
|
157
|
+
return cells.filter(row => row.length);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Extracts the data sources from the columns array.
|
|
161
|
+
* @param cols an array of table data columns or table subheaders.
|
|
162
|
+
* @returns an array of table data columns.
|
|
163
|
+
*/
|
|
164
|
+
_extractDataSources(cols) {
|
|
165
|
+
let dataColumns = [];
|
|
166
|
+
for (const col of cols) {
|
|
167
|
+
if (!isTableSubheader(col)) {
|
|
168
|
+
dataColumns.push(col);
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
dataColumns.push(...this._extractDataSources(col.children));
|
|
172
|
+
}
|
|
173
|
+
return dataColumns;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Gets the maximum nesting level of the columns array.
|
|
177
|
+
* @param cols an array of table data columns or table subheaders.
|
|
178
|
+
* @returns the maximum nesting level as a number.
|
|
179
|
+
*/
|
|
180
|
+
_getHeaderMaxNesting(cols) {
|
|
181
|
+
if (areAllDataColumns(cols))
|
|
182
|
+
return 1;
|
|
183
|
+
let max = 1;
|
|
184
|
+
for (const col of cols.filter(v => isTableSubheader(v))) {
|
|
185
|
+
const height = 1 + this._getHeaderMaxNesting(col.children);
|
|
186
|
+
if (height > max)
|
|
187
|
+
max = height;
|
|
188
|
+
}
|
|
189
|
+
return max;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Maps the columns tree to a 2D array of header cells or null values.
|
|
193
|
+
* @param cols an array of table data columns or table subheaders.
|
|
194
|
+
* @param maxNesting the maximum nesting level of the columns array.
|
|
195
|
+
* @param currentNesting the current nesting level of the columns array.
|
|
196
|
+
* @returns a 2D array of header cells or null values.
|
|
197
|
+
*/
|
|
198
|
+
_mapColumnsToArray(cols, maxNesting, currentNesting) {
|
|
199
|
+
if (areAllDataColumns(cols)) {
|
|
200
|
+
return [cols.map(col => new HeaderCell(col, 1, maxNesting - currentNesting))];
|
|
201
|
+
}
|
|
202
|
+
const headerCells = [[]];
|
|
203
|
+
for (const col of cols) {
|
|
204
|
+
if (!isTableSubheader(col)) {
|
|
205
|
+
headerCells[0].push(new HeaderCell(col, 1, maxNesting - currentNesting));
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
const childCells = [[], ...this._mapColumnsToArray(col.children, maxNesting, currentNesting + 1)];
|
|
209
|
+
const height = childCells.length - 1;
|
|
210
|
+
const width = childCells[1].length;
|
|
211
|
+
for (let i = 0; i < height; i++) {
|
|
212
|
+
headerCells.push([null]);
|
|
213
|
+
}
|
|
214
|
+
headerCells[0].push(new HeaderCell(col, width, 1));
|
|
215
|
+
for (let i = 0; i < width - 1; i++) {
|
|
216
|
+
headerCells[0].push(null);
|
|
217
|
+
}
|
|
218
|
+
merge2dArrays(headerCells, childCells);
|
|
219
|
+
}
|
|
220
|
+
return headerCells;
|
|
221
|
+
}
|
|
222
|
+
//! setting items
|
|
223
|
+
/**
|
|
224
|
+
* Sets the component's items. Takes into account the values defined by the parent component for `rowDisabledFrom`, `rowBoldFrom`, and `rowHighlightedFrom`.
|
|
225
|
+
* @param items An array of items to be set as the component's items.
|
|
226
|
+
*/
|
|
227
|
+
setItems(items) {
|
|
228
|
+
if (!this.hasDefinedColumns)
|
|
229
|
+
return;
|
|
230
|
+
this._items = items.map((item, index) => {
|
|
231
|
+
return this._setItemsMapFn(item, index);
|
|
232
|
+
});
|
|
233
|
+
this._sortedItems = this._items;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Maps raw item data to an {@link ArdTableRow} object.
|
|
237
|
+
*
|
|
238
|
+
* @param {any} rawItemData - The raw data of the item.
|
|
239
|
+
* @param {number} index - The index of the item.
|
|
240
|
+
* @returns {ArdTableRow} Returns an ArdTableRow object with mapped properties.
|
|
241
|
+
* @private
|
|
242
|
+
*/
|
|
243
|
+
_setItemsMapFn(rawItemData, index) {
|
|
244
|
+
//get data
|
|
245
|
+
const [data, dataColumns] = this._getRowData(rawItemData, index);
|
|
246
|
+
//get bold
|
|
247
|
+
const rowBoldFromPath = this._ardParentComp.rowBoldFrom ?? this._ardParentComp.DEFAULTS.rowBoldFrom;
|
|
248
|
+
let bold = resolvePath(rawItemData, rowBoldFromPath);
|
|
249
|
+
if (this._ardParentComp.invertRowBold) {
|
|
250
|
+
bold = !bold;
|
|
251
|
+
}
|
|
252
|
+
//get disabled
|
|
253
|
+
const disabledPath = this._ardParentComp.rowDisabledFrom ?? this._ardParentComp.DEFAULTS.rowDisabledFrom;
|
|
254
|
+
let disabled = evaluate(resolvePath(rawItemData, disabledPath));
|
|
255
|
+
if (this._ardParentComp.invertRowDisabled) {
|
|
256
|
+
disabled = !disabled;
|
|
257
|
+
}
|
|
258
|
+
//return
|
|
259
|
+
return {
|
|
260
|
+
itemData: rawItemData,
|
|
261
|
+
index,
|
|
262
|
+
data,
|
|
263
|
+
dataColumns,
|
|
264
|
+
disabled,
|
|
265
|
+
bold,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Retrieves data for a row based on data columns configuration.
|
|
270
|
+
*
|
|
271
|
+
* @param {any} rawItemData - The raw data of the item.
|
|
272
|
+
* @param {number} index - The index of the item.
|
|
273
|
+
* @returns {any[]} Returns an array containing the row data.
|
|
274
|
+
* @private
|
|
275
|
+
*/
|
|
276
|
+
_getRowData(rawItemData, index) {
|
|
277
|
+
let data = [];
|
|
278
|
+
for (const dataColumn of this._dataColumns) {
|
|
279
|
+
const sourcePath = dataColumn.dataSource;
|
|
280
|
+
if (typeof sourcePath == 'string') {
|
|
281
|
+
if (this._ardParentComp.treatDataSourceAsString) {
|
|
282
|
+
data.push(rawItemData[sourcePath]);
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
data.push(resolvePath(rawItemData, sourcePath));
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
if (sourcePath.type == 'autocount') {
|
|
289
|
+
data.push(index + 1);
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
if (sourcePath.type == 'checkbox') {
|
|
293
|
+
data.push({ _ardCheckbox: true, index });
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
const sourceString = typeof sourcePath == 'object' ? JSON.stringify(sourcePath) : sourcePath;
|
|
297
|
+
console.error(new Error(`Unexpected data source "${sourceString}".`));
|
|
298
|
+
}
|
|
299
|
+
return [data, this._dataColumns];
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Writes a new value to the item storage. Selects the correct items based on the provided values, warning the user if the value is not found.
|
|
303
|
+
* @param indexes The value of the ngModel to set.
|
|
304
|
+
*/
|
|
305
|
+
writeValue(indexes) {
|
|
306
|
+
this._forceUnselectAll();
|
|
307
|
+
this.selectItem(...indexes);
|
|
308
|
+
}
|
|
309
|
+
//! selecting items
|
|
310
|
+
/**
|
|
311
|
+
* Checks if an item with the given index is selected.
|
|
312
|
+
*
|
|
313
|
+
* @param {number} index The index of the item to check.
|
|
314
|
+
* @returns {boolean} _true_ if the item is selected, otherwise _false_.
|
|
315
|
+
*/
|
|
316
|
+
isItemSelected(index) {
|
|
317
|
+
return this._selectedItems.some(item => item.index == index);
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Selects all items.
|
|
321
|
+
*
|
|
322
|
+
* Accounts for the limit of concurrently selected items defined by the parent component.
|
|
323
|
+
* @returns a tuple containing two arrays:
|
|
324
|
+
* * An array of items selected.
|
|
325
|
+
* * An array of items failed to select.
|
|
326
|
+
*/
|
|
327
|
+
selectAll() {
|
|
328
|
+
return this.selectItem(...this._items.map(v => v.index));
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Unselects all selected items.
|
|
332
|
+
*
|
|
333
|
+
* If the parent component requires at least one value to be selected at all times, the first selected items is left selected.
|
|
334
|
+
* @returns An array of items cleared, mapped to only their values.
|
|
335
|
+
*/
|
|
336
|
+
unselectAll() {
|
|
337
|
+
for (const item of this._selectedItems) {
|
|
338
|
+
item.selected = false;
|
|
339
|
+
}
|
|
340
|
+
const ret = this._itemsToValue(this._selectedItems);
|
|
341
|
+
this._selectedItems = [];
|
|
342
|
+
return ret;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Unselects all selected items, no matter what the component settings are.
|
|
346
|
+
* @returns An array of items cleared, mapped to only their values.
|
|
347
|
+
*/
|
|
348
|
+
_forceUnselectAll() {
|
|
349
|
+
for (const item of this._selectedItems) {
|
|
350
|
+
item.selected = false;
|
|
351
|
+
}
|
|
352
|
+
const ret = this._itemsToValue(this._selectedItems);
|
|
353
|
+
this._selectedItems = [];
|
|
354
|
+
return ret;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Selects one or multiple items.
|
|
358
|
+
*
|
|
359
|
+
* Accounts for the limit of concurrently selected items defined by the parent component.
|
|
360
|
+
*
|
|
361
|
+
* @param indexes A rest operator array of item indexes to be selected.
|
|
362
|
+
* @returns a tuple containing two arrays:
|
|
363
|
+
* * An array of items selected.
|
|
364
|
+
* * An array of items failed to select.
|
|
365
|
+
*/
|
|
366
|
+
selectItem(...indexes) {
|
|
367
|
+
const itemsToBeSelected = this._items.filter(item => !item.disabled && indexes.includes(item.index));
|
|
368
|
+
if (this.isItemLimitReached) {
|
|
369
|
+
return [[], this._itemsToValue(itemsToBeSelected)];
|
|
370
|
+
}
|
|
371
|
+
let itemsSelectedCount = 0;
|
|
372
|
+
const itemsSelected = [];
|
|
373
|
+
for (const item of itemsToBeSelected) {
|
|
374
|
+
itemsSelectedCount++;
|
|
375
|
+
if (item.selected)
|
|
376
|
+
continue;
|
|
377
|
+
if (this.isItemLimitReached) {
|
|
378
|
+
break;
|
|
379
|
+
}
|
|
380
|
+
item.selected = true;
|
|
381
|
+
this._selectedItems.push(item);
|
|
382
|
+
itemsSelected.push(item);
|
|
383
|
+
}
|
|
384
|
+
const itemsFailedToSelect = itemsToBeSelected.slice(itemsSelectedCount - 1);
|
|
385
|
+
return [this._itemsToValue(itemsSelected), this._itemsToValue(itemsFailedToSelect)];
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Unselects one or multiple items.
|
|
389
|
+
* @param items A rest operator array of item indexes to be unselected.
|
|
390
|
+
* @returns An array of items unselected, mapped to only their values.
|
|
391
|
+
*/
|
|
392
|
+
unselectItem(...indexes) {
|
|
393
|
+
const itemsToBeSelected = this._items.filter(item => indexes.includes(item.index));
|
|
394
|
+
for (const item of itemsToBeSelected) {
|
|
395
|
+
item.selected = false;
|
|
396
|
+
}
|
|
397
|
+
this._selectedItems = this._selectedItems.filter(v => v.selected);
|
|
398
|
+
return this._itemsToValue(itemsToBeSelected);
|
|
399
|
+
}
|
|
400
|
+
//! highlighting items
|
|
401
|
+
/**
|
|
402
|
+
* Unhighlights all currently highlighted items.
|
|
403
|
+
*/
|
|
404
|
+
unhighlightAll() {
|
|
405
|
+
for (const item of this._highlightedItems) {
|
|
406
|
+
item.highlighted = false;
|
|
407
|
+
}
|
|
408
|
+
this._highlightedItems = [];
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Highlights the given item, while unhighlighting all other items. Does nothing when the item is disabled.
|
|
412
|
+
* @param item The index of the item to be highlighted.
|
|
413
|
+
* @returns The highlighted item.
|
|
414
|
+
*/
|
|
415
|
+
highlightSingleItem(index) {
|
|
416
|
+
this.unhighlightAll();
|
|
417
|
+
return this.highlightItem(index);
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Highlights all given items.
|
|
421
|
+
* @param items A rest operator array of item indexes to be highlighted.
|
|
422
|
+
* @returns The last highlighted item.
|
|
423
|
+
*/
|
|
424
|
+
highlightItem(...indexes) {
|
|
425
|
+
const items = this._items.filter(item => indexes.includes(item.index));
|
|
426
|
+
for (const item of items) {
|
|
427
|
+
item.highlighted = true;
|
|
428
|
+
}
|
|
429
|
+
this._highlightedItems.push(...items);
|
|
430
|
+
return items.last();
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Unhighlights all given items.
|
|
434
|
+
* @param items A rest operator array of item indexes to be unhighlighted.
|
|
435
|
+
*/
|
|
436
|
+
unhighlightItem(...indexes) {
|
|
437
|
+
const items = this._items.filter(item => indexes.includes(item.index));
|
|
438
|
+
for (const item of items) {
|
|
439
|
+
if (!item || !item.highlighted)
|
|
440
|
+
return;
|
|
441
|
+
item.highlighted = false;
|
|
442
|
+
}
|
|
443
|
+
this._highlightedItems = this._highlightedItems.filter(v => v.highlighted);
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Highlights the first item out of all items.
|
|
447
|
+
* @returns The highlighted item.
|
|
448
|
+
*/
|
|
449
|
+
highlightFirstItem() {
|
|
450
|
+
this.unhighlightAll();
|
|
451
|
+
let itemToHighlight = this._getHiglightableItems().first().index;
|
|
452
|
+
return this.highlightItem(itemToHighlight);
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Highlights the last item out of all items.
|
|
456
|
+
* @returns The highlighted item.
|
|
457
|
+
*/
|
|
458
|
+
highlightLastItem() {
|
|
459
|
+
this.unhighlightAll();
|
|
460
|
+
let itemToHighlight = this._getHiglightableItems().last().index;
|
|
461
|
+
return this.highlightItem(itemToHighlight);
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Highlights all non-disabled items.
|
|
465
|
+
*/
|
|
466
|
+
highlightAllItems() {
|
|
467
|
+
let itemsToHighlight = this._getHiglightableItems().map(v => v.index);
|
|
468
|
+
this.highlightItem(...itemsToHighlight);
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Highlights the next non-disabled item defined by the offset amount.
|
|
472
|
+
*
|
|
473
|
+
* If `hasShift` is set to true, all originally highlighted items are kept. Otherwise, all original items are unselected.
|
|
474
|
+
* @param offset The amount of items to offset the highlight by.
|
|
475
|
+
* @param hasShift Whether the user has the shift key pressed.
|
|
476
|
+
* @returns The item highlighted.
|
|
477
|
+
*/
|
|
478
|
+
highlightNextItem(offset, hasShift) {
|
|
479
|
+
if (!this.isAnyItemHighlighted) {
|
|
480
|
+
return this.highlightFirstItem();
|
|
481
|
+
}
|
|
482
|
+
const currentItem = this.highlightedItems.last();
|
|
483
|
+
const itemsWithoutDisabled = this._items.filter(item => !item.disabled && (!this.isItemLimitReached || item.selected));
|
|
484
|
+
const currentIndexInItems = itemsWithoutDisabled.findIndex(item => item.index == currentItem.index);
|
|
485
|
+
let nextItemIndex = currentIndexInItems + offset;
|
|
486
|
+
if (nextItemIndex >= itemsWithoutDisabled.length) {
|
|
487
|
+
nextItemIndex -= itemsWithoutDisabled.length;
|
|
488
|
+
}
|
|
489
|
+
if (nextItemIndex < 0) {
|
|
490
|
+
nextItemIndex += itemsWithoutDisabled.length;
|
|
491
|
+
}
|
|
492
|
+
const itemToHighlight = itemsWithoutDisabled[nextItemIndex];
|
|
493
|
+
if (hasShift) {
|
|
494
|
+
if (itemToHighlight.highlighted) {
|
|
495
|
+
this.unhighlightItem(nextItemIndex);
|
|
496
|
+
}
|
|
497
|
+
return this.highlightItem(nextItemIndex);
|
|
498
|
+
}
|
|
499
|
+
return this.highlightSingleItem(nextItemIndex);
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Finds all highlightable items. An item is considered highlightable if it is **not** disabled.
|
|
503
|
+
* @returns An array of all highlightable items.
|
|
504
|
+
*/
|
|
505
|
+
_getHiglightableItems() {
|
|
506
|
+
return this._items.filter(item => !item.disabled);
|
|
507
|
+
}
|
|
508
|
+
toggleCurrentSortColumn(column) {
|
|
509
|
+
if (this._currentSortColumn == column) {
|
|
510
|
+
if (this._currentSortType == SortType.Ascending) {
|
|
511
|
+
this._currentSortType = SortType.Descending;
|
|
512
|
+
}
|
|
513
|
+
else {
|
|
514
|
+
this._currentSortType = SortType.Ascending;
|
|
515
|
+
}
|
|
516
|
+
this._generateSortedRows(true);
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
this._currentSortColumn = column;
|
|
520
|
+
this._currentSortType = SortType.Ascending;
|
|
521
|
+
this._generateSortedRows();
|
|
522
|
+
}
|
|
523
|
+
resetSort() {
|
|
524
|
+
this._currentSortColumn = null;
|
|
525
|
+
this._currentSortType = null;
|
|
526
|
+
this._sortedItems = [...this.items];
|
|
527
|
+
}
|
|
528
|
+
getColumnSortType(column) {
|
|
529
|
+
if (this._currentSortColumn == column) {
|
|
530
|
+
return this._currentSortType;
|
|
531
|
+
}
|
|
532
|
+
return null;
|
|
533
|
+
}
|
|
534
|
+
_generateSortedRows(justReverse) {
|
|
535
|
+
if (justReverse) {
|
|
536
|
+
this._sortedItems.reverse();
|
|
537
|
+
return;
|
|
538
|
+
}
|
|
539
|
+
const sortColumnIndex = this._currentSortColumn;
|
|
540
|
+
if (isNull(sortColumnIndex) || !this._currentSortType) {
|
|
541
|
+
this._sortedItems = this.items;
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
const sortColumn = this._dataColumns[sortColumnIndex];
|
|
545
|
+
if (!sortColumn) {
|
|
546
|
+
throw new Error(`Encountered an issue in <ard-table>: could not find the column with index ${sortColumnIndex}. This is most likely an Ardium bug, please report it on GitHub.`);
|
|
547
|
+
}
|
|
548
|
+
const direction = this._currentSortType == SortType.Ascending ? 1 : -1;
|
|
549
|
+
const sortFn = sortColumn.sortFn ??
|
|
550
|
+
((a, b) => {
|
|
551
|
+
if (a > b)
|
|
552
|
+
return direction;
|
|
553
|
+
if (a < b)
|
|
554
|
+
return -1 * direction;
|
|
555
|
+
return 0;
|
|
556
|
+
});
|
|
557
|
+
this._sortedItems = [...this.items].sort((a, b) => sortFn(a.data[sortColumnIndex], b.data[sortColumnIndex]));
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtaXRlbS1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi90YWJsZS90YWJsZS1pdGVtLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxXQUFXLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFELE9BQU8sRUFBRSxRQUFRLEVBQW1CLHVCQUF1QixFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUNuRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBaUM3RSxNQUFNLE9BQU8sVUFBVTtJQUtuQixJQUFJLEtBQUs7UUFDTCxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUM3QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsSUFBSSxRQUFRO1FBQ1IsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDN0MsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNPLFNBQVMsQ0FBQyxLQUFrQztRQUNoRCxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3hCLElBQUksT0FBTyxLQUFLLElBQUksUUFBUTtZQUFFLE9BQU8sR0FBRyxLQUFLLElBQUksQ0FBQztRQUNsRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsWUFBWSxJQUFzQyxFQUFFLFVBQWtCLENBQUMsRUFBRSxVQUFr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QkFDTixJQUFJLENBQUMsR0FBRyxDQUFDO29CQUFFLE9BQU8sU0FBUyxDQUFDO2dCQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDO29CQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO2dCQUNqQyxPQUFPLENBQUMsQ0FBQztZQUNiLENBQUMsQ0FBQyxDQUFDO1FBRVAsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pILENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZXNvbHZlUGF0aCBmcm9tICdyZXNvbHZlLW9iamVjdC1wYXRoJztcbmltcG9ydCB7IGV2YWx1YXRlLCBpc0RlZmluZWQsIGlzTnVsbCB9IGZyb20gJ3NpbXBsZS1ib29sJztcbmltcG9ydCB7IENvbXBhcmVXaXRoRm4gfSBmcm9tICcuLi90eXBlcy9pdGVtLXN0b3JhZ2UudHlwZXMnO1xuaW1wb3J0IHsgU29ydFR5cGUsIFRhYmxlRGF0YUNvbHVtbiwgVGFibGVQYWdpbmF0aW9uU3RyYXRlZ3ksIFRhYmxlU3ViaGVhZGVyIH0gZnJvbSAnLi90YWJsZS50eXBlcyc7XG5pbXBvcnQgeyBhcmVBbGxEYXRhQ29sdW1ucywgaXNUYWJsZVN1YmhlYWRlciwgbWVyZ2UyZEFycmF5cyB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFyZFRhYmxlUm93IHtcbiAgICByZWFkb25seSBpdGVtRGF0YTogYW55O1xuICAgIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgaXNFbXB0eT86IGJvb2xlYW47XG4gICAgZGF0YTogYW55W107XG4gICAgZGF0YUNvbHVtbnM6IFRhYmxlRGF0YUNvbHVtbltdO1xuICAgIGNsYXNzPzogc3RyaW5nO1xuICAgIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgICBib2xkPzogYm9vbGVhbjtcbiAgICBzZWxlY3RlZD86IGJvb2xlYW47XG4gICAgaGlnaGxpZ2h0ZWQ/OiBib29sZWFuO1xufVxuZXhwb3J0IGludGVyZmFjZSBUYWJsZUl0ZW1TdG9yYWdlSG9zdERlZmF1bHRzIHtcbiAgICByb3dEaXNhYmxlZEZyb206IHN0cmluZztcbiAgICByb3dCb2xkRnJvbTogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBUYWJsZUl0ZW1TdG9yYWdlSG9zdCB7XG4gICAgcm93RGlzYWJsZWRGcm9tPzogc3RyaW5nO1xuICAgIHJvd0JvbGRGcm9tPzogc3RyaW5nO1xuICAgIGludmVydFJvd0Rpc2FibGVkPzogYm9vbGVhbjtcbiAgICBpbnZlcnRSb3dCb2xkPzogYm9vbGVhbjtcbiAgICBkYXRhPzogYW55W107XG4gICAgcmVhZG9ubHkgREVGQVVMVFM6IFRhYmxlSXRlbVN0b3JhZ2VIb3N0RGVmYXVsdHM7XG4gICAgbWF4U2VsZWN0ZWRJdGVtcz86IG51bWJlcjtcbiAgICB0cmVhdERhdGFTb3VyY2VBc1N0cmluZz86IGJvb2xlYW47XG5cbiAgICBwYWdpbmF0ZWQ6IGJvb2xlYW47XG4gICAgcGFnaW5hdGlvblN0cmF0ZWd5OiBUYWJsZVBhZ2luYXRpb25TdHJhdGVneTtcbiAgICBpdGVtc1BlclBhZ2U6IG51bWJlcjtcbiAgICBwYWdlOiBudW1iZXI7XG59XG5leHBvcnQgY2xhc3MgSGVhZGVyQ2VsbCB7XG4gICAgY29sc3BhbiE6IG51bWJlcjtcbiAgICByb3dzcGFuITogbnVtYmVyO1xuICAgIGNlbGwhOiBUYWJsZURhdGFDb2x1bW4gfCBUYWJsZVN1YmhlYWRlcjtcblxuICAgIGdldCB3aWR0aCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKGlzVGFibGVTdWJoZWFkZXIodGhpcy5jZWxsKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRXaWR0aCh0aGlzLmNlbGwud2lkdGgpO1xuICAgIH1cbiAgICBnZXQgbWluV2lkdGgoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGlmIChpc1RhYmxlU3ViaGVhZGVyKHRoaXMuY2VsbCkpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0V2lkdGgodGhpcy5jZWxsLm1pbldpZHRoKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfZ2V0V2lkdGgod2lkdGg6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAoIXdpZHRoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKHR5cGVvZiB3aWR0aCA9PSAnbnVtYmVyJykgcmV0dXJuIGAke3dpZHRofXB4YDtcbiAgICAgICAgcmV0dXJuIHdpZHRoO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGNlbGw6IFRhYmxlRGF0YUNvbHVtbiB8IFRhYmxlU3ViaGVhZGVyLCBjb2xzcGFuOiBudW1iZXIgPSAxLCByb3dzcGFuOiBudW1iZXIgPSAxKSB7XG4gICAgICAgIHRoaXMuY2VsbCA9IGNlbGw7XG4gICAgICAgIHRoaXMuY29sc3BhbiA9IGNvbHNwYW47XG4gICAgICAgIHRoaXMucm93c3BhbiA9IHJvd3NwYW47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVJdGVtU3RvcmFnZSB7XG4gICAgcHJpdmF0ZSBfaXRlbXM6IEFyZFRhYmxlUm93W10gPSBbXTtcbiAgICBwcml2YXRlIF9zb3J0ZWRJdGVtczogQXJkVGFibGVSb3dbXSA9IFtdO1xuICAgIHByaXZhdGUgX2hpZ2hsaWdodGVkSXRlbXM6IEFyZFRhYmxlUm93W10gPSBbXTtcbiAgICBwcml2YXRlIF9zZWxlY3RlZEl0ZW1zOiBBcmRUYWJsZVJvd1tdID0gW107XG5cbiAgICBwcml2YXRlIF9kYXRhQ29sdW1uczogVGFibGVEYXRhQ29sdW1uW10gPSBbXTtcbiAgICBwcml2YXRlIF9oZWFkZXJDZWxsczogSGVhZGVyQ2VsbFtdW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2FyZFBhcmVudENvbXA6IFRhYmxlSXRlbVN0b3JhZ2VIb3N0KSB7fVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgaXRlbXMuXG4gICAgICovXG4gICAgZ2V0IGl0ZW1zKCk6IEFyZFRhYmxlUm93W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gICAgfVxuICAgIGdldCBzb3J0ZWRJdGVtcygpOiBBcmRUYWJsZVJvd1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRlZEl0ZW1zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGl0ZW1zIGJhc2VkIG9uIHRoZSBjdXJyZW50IHBhZ2luYXRpb24gc3RhdGUuXG4gICAgICovXG4gICAgZ2V0IHBhZ2luYXRlZEl0ZW1zKCk6IEFyZFRhYmxlUm93W10ge1xuICAgICAgICAvL3ByZXR0aWVyLWlnbm9yZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5fYXJkUGFyZW50Q29tcC5wYWdpbmF0ZWRcbiAgICAgICAgICAgIHx8IHRoaXMuX2FyZFBhcmVudENvbXAucGFnaW5hdGlvblN0cmF0ZWd5ID09IFRhYmxlUGFnaW5hdGlvblN0cmF0ZWd5Lk5vb3BcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zb3J0ZWRJdGVtcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWdlID0gdGhpcy5fYXJkUGFyZW50Q29tcC5wYWdlO1xuICAgICAgICBjb25zdCBJUFAgPSB0aGlzLl9hcmRQYXJlbnRDb21wLml0ZW1zUGVyUGFnZTtcbiAgICAgICAgY29uc3QgaXRlbXNTdGFydCA9IChwYWdlIC0gMSkgKiBJUFA7XG4gICAgICAgIGNvbnN0IGl0ZW1zRW5kID0gcGFnZSAqIElQUDtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ydGVkSXRlbXMuc2xpY2UoaXRlbXNTdGFydCwgaXRlbXNFbmQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbXMuXG4gICAgICovXG4gICAgZ2V0IHNlbGVjdGVkSXRlbXMoKTogQXJkVGFibGVSb3dbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEl0ZW1zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgaXRlbXMuXG4gICAgICovXG4gICAgZ2V0IGhpZ2hsaWdodGVkSXRlbXMoKTogQXJkVGFibGVSb3dbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oaWdobGlnaHRlZEl0ZW1zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZXMgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcy5cbiAgICAgKi9cbiAgICBnZXQgdmFsdWUoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXNUb1ZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1hcHMgYW4gYXJyYXkgb2YgaXRlbXMgaW50byB0aGVpciB2YWx1ZXMuXG4gICAgICogQHBhcmFtIGl0ZW1zIFRoZSBpdGVtcyB0byBjb252ZXJ0IHRvIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGl0ZW0gdmFsdWVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2l0ZW1zVG9WYWx1ZShpdGVtczogQXJkVGFibGVSb3dbXSk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1zLm1hcChpdGVtID0+IGl0ZW0uaXRlbURhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgaXRlbSBpcyBoaWdobGlnaHRlZCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqL1xuICAgIGdldCBpc0FueUl0ZW1IaWdobGlnaHRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGFueSBpdGVtIGluIHRoZSB0YWJsZSBpcyBzZWxlY3RlZC5cbiAgICAgKiBAcmV0dXJucyBBIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiBhbnkgaXRlbSBpcyBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBnZXQgaXNBbnlJdGVtU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbGwgaXRlbXMgaW4gdGhlIHRhYmxlIGFyZSBzZWxlY3RlZC5cbiAgICAgKiBAcmV0dXJucyBBIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiBhbGwgaXRlbXMgYXJlIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIGdldCBhcmVBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkSXRlbXMubGVuZ3RoID09IHRoaXMuX2l0ZW1zLmZpbHRlcihpdGVtID0+ICFpdGVtLmRpc2FibGVkKS5sZW5ndGg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFyZW50IGNvbXBvbmVudCBkZWZpbmVzIHRoZSBsaW1pdCBvZiBjb25jdXJyZW50bHkgc2VsZWN0YWJsZSBpdGVtcyBhbmQgdGhlIGFtb3VudCBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbXMgbWF0Y2hlcyB0aGF0IGxpbWl0LiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cbiAgICAgKlxuICAgICAqICoqVExEUioqOiB0cnVlIGlmIGBtYXhTZWxlY3RlZEl0ZW1zYCBpcyBkZWZpbmVkIGFuZCB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGl0ZW1zIG1hdGNoZXMgdGhhdCB2YWx1ZS5cbiAgICAgKi9cbiAgICBnZXQgaXNJdGVtTGltaXRSZWFjaGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWlzRGVmaW5lZCh0aGlzLl9hcmRQYXJlbnRDb21wLm1heFNlbGVjdGVkSXRlbXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FyZFBhcmVudENvbXAubWF4U2VsZWN0ZWRJdGVtcyA8PSB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGhlYWRlciBjZWxscyBvZiB0aGUgdGFibGUuXG4gICAgICogQHJldHVybnMgYSAyRCBhcnJheSBvZiBoZWFkZXIgY2VsbHMuXG4gICAgICovXG4gICAgZ2V0IGhlYWRlckNlbGxzKCk6IEhlYWRlckNlbGxbXVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWRlckNlbGxzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHRhYmxlIGhhcyBkZWZpbmVkIGNvbHVtbnMuXG4gICAgICogQHJldHVybnMgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgdGhlIHRhYmxlIGhhcyBkZWZpbmVkIGNvbHVtbnMuXG4gICAgICovXG4gICAgZ2V0IGhhc0RlZmluZWRDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YUNvbHVtbnMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvLyEgc2V0dGluZyBjb2x1bW5zXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY29sdW1ucyBvZiB0aGUgdGFibGUuXG4gICAgICogQHBhcmFtIGNvbHMgYW4gYXJyYXkgb2YgdGFibGUgZGF0YSBjb2x1bW5zIG9yIHRhYmxlIHN1YmhlYWRlcnMuXG4gICAgICovXG4gICAgc2V0Q29sdW1ucyhjb2xzOiAoVGFibGVEYXRhQ29sdW1uIHwgVGFibGVTdWJoZWFkZXIpW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWF4TmVzdGluZ0xldmVsID0gdGhpcy5fZ2V0SGVhZGVyTWF4TmVzdGluZyhjb2xzKTtcbiAgICAgICAgY29uc3QgaGVhZGVyQ2VsbHMgPSB0aGlzLl9tYXBDb2x1bW5zVG9BcnJheShjb2xzLCBtYXhOZXN0aW5nTGV2ZWwsIDApO1xuICAgICAgICB0aGlzLl9oZWFkZXJDZWxscyA9IHRoaXMuX2ZpbHRlckhlYWRlckNlbGxzKGhlYWRlckNlbGxzKTtcbiAgICAgICAgdGhpcy5fZGF0YUNvbHVtbnMgPSB0aGlzLl9leHRyYWN0RGF0YVNvdXJjZXMoY29scyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbHRlcnMgb3V0IG51bGwgdmFsdWVzIGZyb20gdGhlIGhlYWRlciBjZWxscyBhcnJheS5cbiAgICAgKiBAcGFyYW0gY2VsbHMgYSAyRCBhcnJheSBvZiBoZWFkZXIgY2VsbHMgb3IgbnVsbCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgYSAyRCBhcnJheSBvZiBoZWFkZXIgY2VsbHMgd2l0aG91dCBudWxsIHZhbHVlcyBhbmQgZW1wdHkgYXJyYXlzLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZpbHRlckhlYWRlckNlbGxzKGNlbGxzOiAoSGVhZGVyQ2VsbCB8IG51bGwpW11bXSk6IEhlYWRlckNlbGxbXVtdIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY2VsbHNbaV0gPSBjZWxsc1tpXS5maWx0ZXIodiA9PiB2ICE9IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjZWxscy5maWx0ZXIocm93ID0+IHJvdy5sZW5ndGgpIGFzIEhlYWRlckNlbGxbXVtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyB0aGUgZGF0YSBzb3VyY2VzIGZyb20gdGhlIGNvbHVtbnMgYXJyYXkuXG4gICAgICogQHBhcmFtIGNvbHMgYW4gYXJyYXkgb2YgdGFibGUgZGF0YSBjb2x1bW5zIG9yIHRhYmxlIHN1YmhlYWRlcnMuXG4gICAgICogQHJldHVybnMgYW4gYXJyYXkgb2YgdGFibGUgZGF0YSBjb2x1bW5zLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2V4dHJhY3REYXRhU291cmNlcyhjb2xzOiAoVGFibGVEYXRhQ29sdW1uIHwgVGFibGVTdWJoZWFkZXIpW10pOiBUYWJsZURhdGFDb2x1bW5bXSB7XG4gICAgICAgIGxldCBkYXRhQ29sdW1uczogVGFibGVEYXRhQ29sdW1uW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2xzKSB7XG4gICAgICAgICAgICBpZiAoIWlzVGFibGVTdWJoZWFkZXIoY29sKSkge1xuICAgICAgICAgICAgICAgIGRhdGFDb2x1bW5zLnB1c2goY29sKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGFDb2x1bW5zLnB1c2goLi4udGhpcy5fZXh0cmFjdERhdGFTb3VyY2VzKGNvbC5jaGlsZHJlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGFDb2x1bW5zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIG5lc3RpbmcgbGV2ZWwgb2YgdGhlIGNvbHVtbnMgYXJyYXkuXG4gICAgICogQHBhcmFtIGNvbHMgYW4gYXJyYXkgb2YgdGFibGUgZGF0YSBjb2x1bW5zIG9yIHRhYmxlIHN1YmhlYWRlcnMuXG4gICAgICogQHJldHVybnMgdGhlIG1heGltdW0gbmVzdGluZyBsZXZlbCBhcyBhIG51bWJlci5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRIZWFkZXJNYXhOZXN0aW5nKGNvbHM6IChUYWJsZURhdGFDb2x1bW4gfCBUYWJsZVN1YmhlYWRlcilbXSk6IG51bWJlciB7XG4gICAgICAgIGlmIChhcmVBbGxEYXRhQ29sdW1ucyhjb2xzKSkgcmV0dXJuIDE7XG4gICAgICAgIGxldCBtYXggPSAxO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2xzLmZpbHRlcih2ID0+IGlzVGFibGVTdWJoZWFkZXIodikpIGFzIFRhYmxlU3ViaGVhZGVyW10pIHtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IDEgKyB0aGlzLl9nZXRIZWFkZXJNYXhOZXN0aW5nKGNvbC5jaGlsZHJlbik7XG4gICAgICAgICAgICBpZiAoaGVpZ2h0ID4gbWF4KSBtYXggPSBoZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFwcyB0aGUgY29sdW1ucyB0cmVlIHRvIGEgMkQgYXJyYXkgb2YgaGVhZGVyIGNlbGxzIG9yIG51bGwgdmFsdWVzLlxuICAgICAqIEBwYXJhbSBjb2xzIGFuIGFycmF5IG9mIHRhYmxlIGRhdGEgY29sdW1ucyBvciB0YWJsZSBzdWJoZWFkZXJzLlxuICAgICAqIEBwYXJhbSBtYXhOZXN0aW5nIHRoZSBtYXhpbXVtIG5lc3RpbmcgbGV2ZWwgb2YgdGhlIGNvbHVtbnMgYXJyYXkuXG4gICAgICogQHBhcmFtIGN1cnJlbnROZXN0aW5nIHRoZSBjdXJyZW50IG5lc3RpbmcgbGV2ZWwgb2YgdGhlIGNvbHVtbnMgYXJyYXkuXG4gICAgICogQHJldHVybnMgYSAyRCBhcnJheSBvZiBoZWFkZXIgY2VsbHMgb3IgbnVsbCB2YWx1ZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbWFwQ29sdW1uc1RvQXJyYXkoY29sczogKFRhYmxlRGF0YUNvbHVtbiB8IFRhYmxlU3ViaGVhZGVyKVtdLCBtYXhOZXN0aW5nOiBudW1iZXIsIGN1cnJlbnROZXN0aW5nOiBudW1iZXIpOiAoSGVhZGVyQ2VsbCB8IG51bGwpW11bXSB7XG4gICAgICAgIGlmIChhcmVBbGxEYXRhQ29sdW1ucyhjb2xzKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtjb2xzLm1hcChjb2wgPT4gbmV3IEhlYWRlckNlbGwoY29sLCAxLCBtYXhOZXN0aW5nIC0gY3VycmVudE5lc3RpbmcpKV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVhZGVyQ2VsbHM6IChIZWFkZXJDZWxsIHwgbnVsbClbXVtdID0gW1tdXTtcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgY29scykge1xuICAgICAgICAgICAgaWYgKCFpc1RhYmxlU3ViaGVhZGVyKGNvbCkpIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJDZWxsc1swXS5wdXNoKG5ldyBIZWFkZXJDZWxsKGNvbCwgMSwgbWF4TmVzdGluZyAtIGN1cnJlbnROZXN0aW5nKSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjaGlsZENlbGxzOiAoSGVhZGVyQ2VsbCB8IG51bGwpW11bXSA9IFtbXSwgLi4udGhpcy5fbWFwQ29sdW1uc1RvQXJyYXkoY29sLmNoaWxkcmVuLCBtYXhOZXN0aW5nLCBjdXJyZW50TmVzdGluZyArIDEpXTtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGNoaWxkQ2VsbHMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gY2hpbGRDZWxsc1sxXS5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyQ2VsbHMucHVzaChbbnVsbF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGVhZGVyQ2VsbHNbMF0ucHVzaChuZXcgSGVhZGVyQ2VsbChjb2wsIHdpZHRoLCAxKSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyQ2VsbHNbMF0ucHVzaChudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1lcmdlMmRBcnJheXMoaGVhZGVyQ2VsbHMsIGNoaWxkQ2VsbHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZWFkZXJDZWxscztcbiAgICB9XG5cbiAgICAvLyEgc2V0dGluZyBpdGVtc1xuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNvbXBvbmVudCdzIGl0ZW1zLiBUYWtlcyBpbnRvIGFjY291bnQgdGhlIHZhbHVlcyBkZWZpbmVkIGJ5IHRoZSBwYXJlbnQgY29tcG9uZW50IGZvciBgcm93RGlzYWJsZWRGcm9tYCwgYHJvd0JvbGRGcm9tYCwgYW5kIGByb3dIaWdobGlnaHRlZEZyb21gLlxuICAgICAqIEBwYXJhbSBpdGVtcyBBbiBhcnJheSBvZiBpdGVtcyB0byBiZSBzZXQgYXMgdGhlIGNvbXBvbmVudCdzIGl0ZW1zLlxuICAgICAqL1xuICAgIHNldEl0ZW1zKGl0ZW1zOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaGFzRGVmaW5lZENvbHVtbnMpIHJldHVybjtcblxuICAgICAgICB0aGlzLl9pdGVtcyA9IGl0ZW1zLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZXRJdGVtc01hcEZuKGl0ZW0sIGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3NvcnRlZEl0ZW1zID0gdGhpcy5faXRlbXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1hcHMgcmF3IGl0ZW0gZGF0YSB0byBhbiB7QGxpbmsgQXJkVGFibGVSb3d9IG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7YW55fSByYXdJdGVtRGF0YSAtIFRoZSByYXcgZGF0YSBvZiB0aGUgaXRlbS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0uXG4gICAgICogQHJldHVybnMge0FyZFRhYmxlUm93fSBSZXR1cm5zIGFuIEFyZFRhYmxlUm93IG9iamVjdCB3aXRoIG1hcHBlZCBwcm9wZXJ0aWVzLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0SXRlbXNNYXBGbihyYXdJdGVtRGF0YTogYW55LCBpbmRleDogbnVtYmVyKTogQXJkVGFibGVSb3cge1xuICAgICAgICAvL2dldCBkYXRhXG4gICAgICAgIGNvbnN0IFtkYXRhLCBkYXRhQ29sdW1uc10gPSB0aGlzLl9nZXRSb3dEYXRhKHJhd0l0ZW1EYXRhLCBpbmRleCk7XG5cbiAgICAgICAgLy9nZXQgYm9sZFxuICAgICAgICBjb25zdCByb3dCb2xkRnJvbVBhdGggPSB0aGlzLl9hcmRQYXJlbnRDb21wLnJvd0JvbGRGcm9tID8/IHRoaXMuX2FyZFBhcmVudENvbXAuREVGQVVMVFMucm93Qm9sZEZyb207XG4gICAgICAgIGxldCBib2xkID0gcmVzb2x2ZVBhdGgocmF3SXRlbURhdGEsIHJvd0JvbGRGcm9tUGF0aCk7XG4gICAgICAgIGlmICh0aGlzLl9hcmRQYXJlbnRDb21wLmludmVydFJvd0JvbGQpIHtcbiAgICAgICAgICAgIGJvbGQgPSAhYm9sZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZ2V0IGRpc2FibGVkXG4gICAgICAgIGNvbnN0IGRpc2FibGVkUGF0aCA9IHRoaXMuX2FyZFBhcmVudENvbXAucm93RGlzYWJsZWRGcm9tID8/IHRoaXMuX2FyZFBhcmVudENvbXAuREVGQVVMVFMucm93RGlzYWJsZWRGcm9tO1xuICAgICAgICBsZXQgZGlzYWJsZWQgPSBldmFsdWF0ZShyZXNvbHZlUGF0aChyYXdJdGVtRGF0YSwgZGlzYWJsZWRQYXRoKSk7XG4gICAgICAgIGlmICh0aGlzLl9hcmRQYXJlbnRDb21wLmludmVydFJvd0Rpc2FibGVkKSB7XG4gICAgICAgICAgICBkaXNhYmxlZCA9ICFkaXNhYmxlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vcmV0dXJuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpdGVtRGF0YTogcmF3SXRlbURhdGEsXG4gICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICBkYXRhQ29sdW1ucyxcbiAgICAgICAgICAgIGRpc2FibGVkLFxuICAgICAgICAgICAgYm9sZCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGRhdGEgZm9yIGEgcm93IGJhc2VkIG9uIGRhdGEgY29sdW1ucyBjb25maWd1cmF0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHthbnl9IHJhd0l0ZW1EYXRhIC0gVGhlIHJhdyBkYXRhIG9mIHRoZSBpdGVtLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgaXRlbS5cbiAgICAgKiBAcmV0dXJucyB7YW55W119IFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcm93IGRhdGEuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRSb3dEYXRhKHJhd0l0ZW1EYXRhOiBhbnksIGluZGV4OiBudW1iZXIpOiBbYW55W10sIFRhYmxlRGF0YUNvbHVtbltdXSB7XG4gICAgICAgIGxldCBkYXRhOiBhbnlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGRhdGFDb2x1bW4gb2YgdGhpcy5fZGF0YUNvbHVtbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVBhdGggPSBkYXRhQ29sdW1uLmRhdGFTb3VyY2U7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlUGF0aCA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hcmRQYXJlbnRDb21wLnRyZWF0RGF0YVNvdXJjZUFzU3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEucHVzaChyYXdJdGVtRGF0YVtzb3VyY2VQYXRoXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkYXRhLnB1c2gocmVzb2x2ZVBhdGgocmF3SXRlbURhdGEsIHNvdXJjZVBhdGgpKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzb3VyY2VQYXRoLnR5cGUgPT0gJ2F1dG9jb3VudCcpIHtcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2goaW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzb3VyY2VQYXRoLnR5cGUgPT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgICAgIGRhdGEucHVzaCh7IF9hcmRDaGVja2JveDogdHJ1ZSwgaW5kZXggfSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VTdHJpbmcgPSB0eXBlb2Ygc291cmNlUGF0aCA9PSAnb2JqZWN0JyA/IEpTT04uc3RyaW5naWZ5KHNvdXJjZVBhdGgpIDogc291cmNlUGF0aDtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobmV3IEVycm9yKGBVbmV4cGVjdGVkIGRhdGEgc291cmNlIFwiJHtzb3VyY2VTdHJpbmd9XCIuYCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbZGF0YSwgdGhpcy5fZGF0YUNvbHVtbnNdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgYSBuZXcgdmFsdWUgdG8gdGhlIGl0ZW0gc3RvcmFnZS4gU2VsZWN0cyB0aGUgY29ycmVjdCBpdGVtcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgdmFsdWVzLCB3YXJuaW5nIHRoZSB1c2VyIGlmIHRoZSB2YWx1ZSBpcyBub3QgZm91bmQuXG4gICAgICogQHBhcmFtIGluZGV4ZXMgVGhlIHZhbHVlIG9mIHRoZSBuZ01vZGVsIHRvIHNldC5cbiAgICAgKi9cbiAgICB3cml0ZVZhbHVlKGluZGV4ZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2ZvcmNlVW5zZWxlY3RBbGwoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RJdGVtKC4uLmluZGV4ZXMpO1xuICAgIH1cblxuICAgIC8vISBzZWxlY3RpbmcgaXRlbXNcbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYW4gaXRlbSB3aXRoIHRoZSBnaXZlbiBpbmRleCBpcyBzZWxlY3RlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IF90cnVlXyBpZiB0aGUgaXRlbSBpcyBzZWxlY3RlZCwgb3RoZXJ3aXNlIF9mYWxzZV8uXG4gICAgICovXG4gICAgaXNJdGVtU2VsZWN0ZWQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRJdGVtcy5zb21lKGl0ZW0gPT4gaXRlbS5pbmRleCA9PSBpbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbGVjdHMgYWxsIGl0ZW1zLlxuICAgICAqXG4gICAgICogQWNjb3VudHMgZm9yIHRoZSBsaW1pdCBvZiBjb25jdXJyZW50bHkgc2VsZWN0ZWQgaXRlbXMgZGVmaW5lZCBieSB0aGUgcGFyZW50IGNvbXBvbmVudC5cbiAgICAgKiBAcmV0dXJucyBhIHR1cGxlIGNvbnRhaW5pbmcgdHdvIGFycmF5czpcbiAgICAgKiAqIEFuIGFycmF5IG9mIGl0ZW1zIHNlbGVjdGVkLlxuICAgICAqICogQW4gYXJyYXkgb2YgaXRlbXMgZmFpbGVkIHRvIHNlbGVjdC5cbiAgICAgKi9cbiAgICBzZWxlY3RBbGwoKTogW2FueVtdLCBhbnlbXV0ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RJdGVtKC4uLnRoaXMuX2l0ZW1zLm1hcCh2ID0+IHYuaW5kZXgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVW5zZWxlY3RzIGFsbCBzZWxlY3RlZCBpdGVtcy5cbiAgICAgKlxuICAgICAqIElmIHRoZSBwYXJlbnQgY29tcG9uZW50IHJlcXVpcmVzIGF0IGxlYXN0IG9uZSB2YWx1ZSB0byBiZSBzZWxlY3RlZCBhdCBhbGwgdGltZXMsIHRoZSBmaXJzdCBzZWxlY3RlZCBpdGVtcyBpcyBsZWZ0IHNlbGVjdGVkLlxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGl0ZW1zIGNsZWFyZWQsIG1hcHBlZCB0byBvbmx5IHRoZWlyIHZhbHVlcy5cbiAgICAgKi9cbiAgICB1bnNlbGVjdEFsbCgpOiBhbnlbXSB7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLl9zZWxlY3RlZEl0ZW1zKSB7XG4gICAgICAgICAgICBpdGVtLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXQgPSB0aGlzLl9pdGVtc1RvVmFsdWUodGhpcy5fc2VsZWN0ZWRJdGVtcyk7XG5cbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRJdGVtcyA9IFtdO1xuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVuc2VsZWN0cyBhbGwgc2VsZWN0ZWQgaXRlbXMsIG5vIG1hdHRlciB3aGF0IHRoZSBjb21wb25lbnQgc2V0dGluZ3MgYXJlLlxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGl0ZW1zIGNsZWFyZWQsIG1hcHBlZCB0byBvbmx5IHRoZWlyIHZhbHVlcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb3JjZVVuc2VsZWN0QWxsKCk6IGFueVtdIHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuX3NlbGVjdGVkSXRlbXMpIHtcbiAgICAgICAgICAgIGl0ZW0uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJldCA9IHRoaXMuX2l0ZW1zVG9WYWx1ZSh0aGlzLl9zZWxlY3RlZEl0ZW1zKTtcblxuICAgICAgICB0aGlzLl9zZWxlY3RlZEl0ZW1zID0gW107XG5cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VsZWN0cyBvbmUgb3IgbXVsdGlwbGUgaXRlbXMuXG4gICAgICpcbiAgICAgKiBBY2NvdW50cyBmb3IgdGhlIGxpbWl0IG9mIGNvbmN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcyBkZWZpbmVkIGJ5IHRoZSBwYXJlbnQgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIGluZGV4ZXMgQSByZXN0IG9wZXJhdG9yIGFycmF5IG9mIGl0ZW0gaW5kZXhlcyB0byBiZSBzZWxlY3RlZC5cbiAgICAgKiBAcmV0dXJucyBhIHR1cGxlIGNvbnRhaW5pbmcgdHdvIGFycmF5czpcbiAgICAgKiAqIEFuIGFycmF5IG9mIGl0ZW1zIHNlbGVjdGVkLlxuICAgICAqICogQW4gYXJyYXkgb2YgaXRlbXMgZmFpbGVkIHRvIHNlbGVjdC5cbiAgICAgKi9cbiAgICBzZWxlY3RJdGVtKC4uLmluZGV4ZXM6IG51bWJlcltdKTogW2FueVtdLCBhbnlbXV0ge1xuICAgICAgICBjb25zdCBpdGVtc1RvQmVTZWxlY3RlZCA9IHRoaXMuX2l0ZW1zLmZpbHRlcihpdGVtID0+ICFpdGVtLmRpc2FibGVkICYmIGluZGV4ZXMuaW5jbHVkZXMoaXRlbS5pbmRleCkpO1xuICAgICAgICBpZiAodGhpcy5pc0l0ZW1MaW1pdFJlYWNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBbW10sIHRoaXMuX2l0ZW1zVG9WYWx1ZShpdGVtc1RvQmVTZWxlY3RlZCldO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGl0ZW1zU2VsZWN0ZWRDb3VudCA9IDA7XG4gICAgICAgIGNvbnN0IGl0ZW1zU2VsZWN0ZWQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zVG9CZVNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpdGVtc1NlbGVjdGVkQ291bnQrKztcbiAgICAgICAgICAgIGlmIChpdGVtLnNlbGVjdGVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSXRlbUxpbWl0UmVhY2hlZCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICBpdGVtc1NlbGVjdGVkLnB1c2goaXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVtc0ZhaWxlZFRvU2VsZWN0ID0gaXRlbXNUb0JlU2VsZWN0ZWQuc2xpY2UoaXRlbXNTZWxlY3RlZENvdW50IC0gMSk7XG4gICAgICAgIHJldHVybiBbdGhpcy5faXRlbXNUb1ZhbHVlKGl0ZW1zU2VsZWN0ZWQpLCB0aGlzLl9pdGVtc1RvVmFsdWUoaXRlbXNGYWlsZWRUb1NlbGVjdCldO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVbnNlbGVjdHMgb25lIG9yIG11bHRpcGxlIGl0ZW1zLlxuICAgICAqIEBwYXJhbSBpdGVtcyBBIHJlc3Qgb3BlcmF0b3IgYXJyYXkgb2YgaXRlbSBpbmRleGVzIHRvIGJlIHVuc2VsZWN0ZWQuXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgaXRlbXMgdW5zZWxlY3RlZCwgbWFwcGVkIHRvIG9ubHkgdGhlaXIgdmFsdWVzLlxuICAgICAqL1xuICAgIHVuc2VsZWN0SXRlbSguLi5pbmRleGVzOiBudW1iZXJbXSk6IGFueVtdIHtcbiAgICAgICAgY29uc3QgaXRlbXNUb0JlU2VsZWN0ZWQgPSB0aGlzLl9pdGVtcy5maWx0ZXIoaXRlbSA9PiBpbmRleGVzLmluY2x1ZGVzKGl0ZW0uaW5kZXgpKTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zVG9CZVNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpdGVtLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRJdGVtcyA9IHRoaXMuX3NlbGVjdGVkSXRlbXMuZmlsdGVyKHYgPT4gdi5zZWxlY3RlZCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zVG9WYWx1ZShpdGVtc1RvQmVTZWxlY3RlZCk7XG4gICAgfVxuXG4gICAgLy8hIGhpZ2hsaWdodGluZyBpdGVtc1xuICAgIC8qKlxuICAgICAqIFVuaGlnaGxpZ2h0cyBhbGwgY3VycmVudGx5IGhpZ2hsaWdodGVkIGl0ZW1zLlxuICAgICAqL1xuICAgIHVuaGlnaGxpZ2h0QWxsKCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5faGlnaGxpZ2h0ZWRJdGVtcykge1xuICAgICAgICAgICAgaXRlbS5oaWdobGlnaHRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMgPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGlnaGxpZ2h0cyB0aGUgZ2l2ZW4gaXRlbSwgd2hpbGUgdW5oaWdobGlnaHRpbmcgYWxsIG90aGVyIGl0ZW1zLiBEb2VzIG5vdGhpbmcgd2hlbiB0aGUgaXRlbSBpcyBkaXNhYmxlZC5cbiAgICAgKiBAcGFyYW0gaXRlbSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gYmUgaGlnaGxpZ2h0ZWQuXG4gICAgICogQHJldHVybnMgVGhlIGhpZ2hsaWdodGVkIGl0ZW0uXG4gICAgICovXG4gICAgaGlnaGxpZ2h0U2luZ2xlSXRlbShpbmRleDogbnVtYmVyKTogQXJkVGFibGVSb3cgfCBudWxsIHtcbiAgICAgICAgdGhpcy51bmhpZ2hsaWdodEFsbCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRJdGVtKGluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGlnaGxpZ2h0cyBhbGwgZ2l2ZW4gaXRlbXMuXG4gICAgICogQHBhcmFtIGl0ZW1zIEEgcmVzdCBvcGVyYXRvciBhcnJheSBvZiBpdGVtIGluZGV4ZXMgdG8gYmUgaGlnaGxpZ2h0ZWQuXG4gICAgICogQHJldHVybnMgVGhlIGxhc3QgaGlnaGxpZ2h0ZWQgaXRlbS5cbiAgICAgKi9cbiAgICBoaWdobGlnaHRJdGVtKC4uLmluZGV4ZXM6IG51bWJlcltdKTogQXJkVGFibGVSb3cge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuX2l0ZW1zLmZpbHRlcihpdGVtID0+IGluZGV4ZXMuaW5jbHVkZXMoaXRlbS5pbmRleCkpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIGl0ZW0uaGlnaGxpZ2h0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMucHVzaCguLi5pdGVtcyk7XG4gICAgICAgIHJldHVybiBpdGVtcy5sYXN0KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVuaGlnaGxpZ2h0cyBhbGwgZ2l2ZW4gaXRlbXMuXG4gICAgICogQHBhcmFtIGl0ZW1zIEEgcmVzdCBvcGVyYXRvciBhcnJheSBvZiBpdGVtIGluZGV4ZXMgdG8gYmUgdW5oaWdobGlnaHRlZC5cbiAgICAgKi9cbiAgICB1bmhpZ2hsaWdodEl0ZW0oLi4uaW5kZXhlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLl9pdGVtcy5maWx0ZXIoaXRlbSA9PiBpbmRleGVzLmluY2x1ZGVzKGl0ZW0uaW5kZXgpKTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBpZiAoIWl0ZW0gfHwgIWl0ZW0uaGlnaGxpZ2h0ZWQpIHJldHVybjtcblxuICAgICAgICAgICAgaXRlbS5oaWdobGlnaHRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hpZ2hsaWdodGVkSXRlbXMgPSB0aGlzLl9oaWdobGlnaHRlZEl0ZW1zLmZpbHRlcih2ID0+IHYuaGlnaGxpZ2h0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIaWdobGlnaHRzIHRoZSBmaXJzdCBpdGVtIG91dCBvZiBhbGwgaXRlbXMuXG4gICAgICogQHJldHVybnMgVGhlIGhpZ2hsaWdodGVkIGl0ZW0uXG4gICAgICovXG4gICAgaGlnaGxpZ2h0Rmlyc3RJdGVtKCk6IEFyZFRhYmxlUm93IHwgbnVsbCB7XG4gICAgICAgIHRoaXMudW5oaWdobGlnaHRBbGwoKTtcblxuICAgICAgICBsZXQgaXRlbVRvSGlnaGxpZ2h0ID0gdGhpcy5fZ2V0SGlnbGlnaHRhYmxlSXRlbXMoKS5maXJzdCgpLmluZGV4O1xuICAgICAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRJdGVtKGl0ZW1Ub0hpZ2hsaWdodCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhpZ2hsaWdodHMgdGhlIGxhc3QgaXRlbSBvdXQgb2YgYWxsIGl0ZW1zLlxuICAgICAqIEByZXR1cm5zIFRoZSBoaWdobGlnaHRlZCBpdGVtLlxuICAgICAqL1xuICAgIGhpZ2hsaWdodExhc3RJdGVtKCk6IEFyZFRhYmxlUm93IHwgbnVsbCB7XG4gICAgICAgIHRoaXMudW5oaWdobGlnaHRBbGwoKTtcblxuICAgICAgICBsZXQgaXRlbVRvSGlnaGxpZ2h0ID0gdGhpcy5fZ2V0SGlnbGlnaHRhYmxlSXRlbXMoKS5sYXN0KCkuaW5kZXg7XG4gICAgICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodEl0ZW0oaXRlbVRvSGlnaGxpZ2h0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGlnaGxpZ2h0cyBhbGwgbm9uLWRpc2FibGVkIGl0ZW1zLlxuICAgICAqL1xuICAgIGhpZ2hsaWdodEFsbEl0ZW1zKCk6IHZvaWQge1xuICAgICAgICBsZXQgaXRlbXNUb0hpZ2hsaWdodCA9IHRoaXMuX2dldEhpZ2xpZ2h0YWJsZUl0ZW1zKCkubWFwKHYgPT4gdi5pbmRleCk7XG5cbiAgICAgICAgdGhpcy5oaWdobGlnaHRJdGVtKC4uLml0ZW1zVG9IaWdobGlnaHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIaWdobGlnaHRzIHRoZSBuZXh0IG5vbi1kaXNhYmxlZCBpdGVtIGRlZmluZWQgYnkgdGhlIG9mZnNldCBhbW91bnQuXG4gICAgICpcbiAgICAgKiBJZiBgaGFzU2hpZnRgIGlzIHNldCB0byB0cnVlLCBhbGwgb3JpZ2luYWxseSBoaWdobGlnaHRlZCBpdGVtcyBhcmUga2VwdC4gT3RoZXJ3aXNlLCBhbGwgb3JpZ2luYWwgaXRlbXMgYXJlIHVuc2VsZWN0ZWQuXG4gICAgICogQHBhcmFtIG9mZnNldCBUaGUgYW1vdW50IG9mIGl0ZW1zIHRvIG9mZnNldCB0aGUgaGlnaGxpZ2h0IGJ5LlxuICAgICAqIEBwYXJhbSBoYXNTaGlmdCBXaGV0aGVyIHRoZSB1c2VyIGhhcyB0aGUgc2hpZnQga2V5IHByZXNzZWQuXG4gICAgICogQHJldHVybnMgVGhlIGl0ZW0gaGlnaGxpZ2h0ZWQuXG4gICAgICovXG4gICAgaGlnaGxpZ2h0TmV4dEl0ZW0ob2Zmc2V0OiBudW1iZXIsIGhhc1NoaWZ0PzogYm9vbGVhbik6IEFyZFRhYmxlUm93IHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5pc0FueUl0ZW1IaWdobGlnaHRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0Rmlyc3RJdGVtKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VycmVudEl0ZW0gPSB0aGlzLmhpZ2hsaWdodGVkSXRlbXMubGFzdCgpO1xuICAgICAgICBjb25zdCBpdGVtc1dpdGhvdXREaXNhYmxlZCA9IHRoaXMuX2l0ZW1zLmZpbHRlcihpdGVtID0+ICFpdGVtLmRpc2FibGVkICYmICghdGhpcy5pc0l0ZW1MaW1pdFJlYWNoZWQgfHwgaXRlbS5zZWxlY3RlZCkpO1xuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXhJbkl0ZW1zID0gaXRlbXNXaXRob3V0RGlzYWJsZWQuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5pbmRleCA9PSBjdXJyZW50SXRlbS5pbmRleCk7XG5cbiAgICAgICAgbGV0IG5leHRJdGVtSW5kZXggPSBjdXJyZW50SW5kZXhJbkl0ZW1zICsgb2Zmc2V0O1xuICAgICAgICBpZiAobmV4dEl0ZW1JbmRleCA+PSBpdGVtc1dpdGhvdXREaXNhYmxlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIG5leHRJdGVtSW5kZXggLT0gaXRlbXNXaXRob3V0RGlzYWJsZWQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXh0SXRlbUluZGV4IDwgMCkge1xuICAgICAgICAgICAgbmV4dEl0ZW1JbmRleCArPSBpdGVtc1dpdGhvdXREaXNhYmxlZC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbVRvSGlnaGxpZ2h0ID0gaXRlbXNXaXRob3V0RGlzYWJsZWRbbmV4dEl0ZW1JbmRleF07XG5cbiAgICAgICAgaWYgKGhhc1NoaWZ0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbVRvSGlnaGxpZ2h0LmhpZ2hsaWdodGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bmhpZ2hsaWdodEl0ZW0obmV4dEl0ZW1JbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oaWdobGlnaHRJdGVtKG5leHRJdGVtSW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodFNpbmdsZUl0ZW0obmV4dEl0ZW1JbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbmRzIGFsbCBoaWdobGlnaHRhYmxlIGl0ZW1zLiBBbiBpdGVtIGlzIGNvbnNpZGVyZWQgaGlnaGxpZ2h0YWJsZSBpZiBpdCBpcyAqKm5vdCoqIGRpc2FibGVkLlxuICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGFsbCBoaWdobGlnaHRhYmxlIGl0ZW1zLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldEhpZ2xpZ2h0YWJsZUl0ZW1zKCk6IEFyZFRhYmxlUm93W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXMuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uZGlzYWJsZWQpO1xuICAgIH1cblxuICAgIC8vISBzb3J0aW5nXG4gICAgcHJpdmF0ZSBfY3VycmVudFNvcnRDb2x1bW46IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX2N1cnJlbnRTb3J0VHlwZTogU29ydFR5cGUgfCBudWxsID0gbnVsbDtcblxuICAgIHRvZ2dsZUN1cnJlbnRTb3J0Q29sdW1uKGNvbHVtbjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50U29ydENvbHVtbiA9PSBjb2x1bW4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50U29ydFR5cGUgPT0gU29ydFR5cGUuQXNjZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFNvcnRUeXBlID0gU29ydFR5cGUuRGVzY2VuZGluZztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFNvcnRUeXBlID0gU29ydFR5cGUuQXNjZW5kaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZ2VuZXJhdGVTb3J0ZWRSb3dzKHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTb3J0Q29sdW1uID0gY29sdW1uO1xuICAgICAgICB0aGlzLl9jdXJyZW50U29ydFR5cGUgPSBTb3J0VHlwZS5Bc2NlbmRpbmc7XG4gICAgICAgIHRoaXMuX2dlbmVyYXRlU29ydGVkUm93cygpO1xuICAgIH1cbiAgICByZXNldFNvcnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTb3J0Q29sdW1uID0gbnVsbDtcbiAgICAgICAgdGhpcy5fY3VycmVudFNvcnRUeXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc29ydGVkSXRlbXMgPSBbLi4udGhpcy5pdGVtc107XG4gICAgfVxuICAgIGdldENvbHVtblNvcnRUeXBlKGNvbHVtbjogbnVtYmVyKTogU29ydFR5cGUgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRTb3J0Q29sdW1uID09IGNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTb3J0VHlwZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcHJpdmF0ZSBfZ2VuZXJhdGVTb3J0ZWRSb3dzKGp1c3RSZXZlcnNlPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoanVzdFJldmVyc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3NvcnRlZEl0ZW1zLnJldmVyc2UoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3J0Q29sdW1uSW5kZXggPSB0aGlzLl9jdXJyZW50U29ydENvbHVtbjtcbiAgICAgICAgaWYgKGlzTnVsbChzb3J0Q29sdW1uSW5kZXgpIHx8ICF0aGlzLl9jdXJyZW50U29ydFR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NvcnRlZEl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3J0Q29sdW1uID0gdGhpcy5fZGF0YUNvbHVtbnNbc29ydENvbHVtbkluZGV4XTtcbiAgICAgICAgaWYgKCFzb3J0Q29sdW1uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYEVuY291bnRlcmVkIGFuIGlzc3VlIGluIDxhcmQtdGFibGU+OiBjb3VsZCBub3QgZmluZCB0aGUgY29sdW1uIHdpdGggaW5kZXggJHtzb3J0Q29sdW1uSW5kZXh9LiBUaGlzIGlzIG1vc3QgbGlrZWx5IGFuIEFyZGl1bSBidWcsIHBsZWFzZSByZXBvcnQgaXQgb24gR2l0SHViLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLl9jdXJyZW50U29ydFR5cGUgPT0gU29ydFR5cGUuQXNjZW5kaW5nID8gMSA6IC0xO1xuICAgICAgICBjb25zdCBzb3J0Rm4gPVxuICAgICAgICAgICAgc29ydENvbHVtbi5zb3J0Rm4gPz9cbiAgICAgICAgICAgICgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhID4gYikgcmV0dXJuIGRpcmVjdGlvbjtcbiAgICAgICAgICAgICAgICBpZiAoYSA8IGIpIHJldHVybiAtMSAqIGRpcmVjdGlvbjtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3NvcnRlZEl0ZW1zID0gWy4uLnRoaXMuaXRlbXNdLnNvcnQoKGEsIGIpID0+IHNvcnRGbihhLmRhdGFbc29ydENvbHVtbkluZGV4XSwgYi5kYXRhW3NvcnRDb2x1bW5JbmRleF0pKTtcbiAgICB9XG59XG4iXX0=
|