@spicainternational/ngx-sds-components 7.12.0-beta.1 → 8.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 +13 -57
- package/{esm2020 → esm2022}/public-api.mjs +35 -34
- package/{esm2020 → esm2022}/spicainternational-ngx-sds-components.mjs +4 -4
- package/esm2022/src/lib/app-switcher/app-switcher.component.mjs +116 -0
- package/{esm2020 → esm2022}/src/lib/app-switcher/app-switcher.model.mjs +1 -1
- package/esm2022/src/lib/app-switcher/public-api.mjs +3 -0
- package/{esm2020 → esm2022}/src/lib/app-switcher/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs +4 -4
- package/esm2022/src/lib/avatar/avatar-group.component.mjs +82 -0
- package/{esm2020 → esm2022}/src/lib/avatar/avatar-group.model.mjs +1 -1
- package/esm2022/src/lib/avatar/avatar.component.mjs +151 -0
- package/esm2022/src/lib/avatar/public-api.mjs +4 -0
- package/{esm2020 → esm2022}/src/lib/avatar/spicainternational-ngx-sds-components-src-lib-avatar.mjs +4 -4
- package/esm2022/src/lib/badge/badge.directive.mjs +90 -0
- package/{esm2020 → esm2022}/src/lib/badge/badge.types.mjs +1 -1
- package/esm2022/src/lib/badge/components/badge.component.mjs +59 -0
- package/{esm2020 → esm2022}/src/lib/badge/public-api.mjs +2 -3
- package/{esm2020 → esm2022}/src/lib/badge/spicainternational-ngx-sds-components-src-lib-badge.mjs +4 -4
- package/esm2022/src/lib/callout/callout.component.mjs +20 -0
- package/{esm2020 → esm2022}/src/lib/callout/public-api.mjs +2 -3
- package/{esm2020 → esm2022}/src/lib/callout/spicainternational-ngx-sds-components-src-lib-callout.mjs +4 -4
- package/esm2022/src/lib/color-picker/color-picker.component.mjs +82 -0
- package/{esm2020 → esm2022}/src/lib/color-picker/public-api.mjs +2 -3
- package/{esm2020 → esm2022}/src/lib/color-picker/spicainternational-ngx-sds-components-src-lib-color-picker.mjs +4 -4
- package/esm2022/src/lib/date-picker/date-picker.component.mjs +863 -0
- package/esm2022/src/lib/date-picker/date-picker.model.mjs +71 -0
- package/esm2022/src/lib/date-picker/public-api.mjs +3 -0
- package/esm2022/src/lib/date-picker/sds-date-picker.service.mjs +90 -0
- package/{esm2020 → esm2022}/src/lib/date-picker/spicainternational-ngx-sds-components-src-lib-date-picker.mjs +4 -4
- package/esm2022/src/lib/date-pipes/date-compare.pipe.mjs +32 -0
- package/esm2022/src/lib/date-pipes/date-format.pipe.mjs +31 -0
- package/esm2022/src/lib/date-pipes/date-period-format.pipe.mjs +49 -0
- package/{esm2020 → esm2022}/src/lib/date-pipes/date-time-formats.constants.mjs +155 -155
- package/esm2022/src/lib/date-pipes/date-time-range-duration.pipe.mjs +33 -0
- package/esm2022/src/lib/date-pipes/date-time-range-format.pipe.mjs +49 -0
- package/{esm2020 → esm2022}/src/lib/date-pipes/public-api.mjs +8 -8
- package/{esm2020 → esm2022}/src/lib/date-pipes/spicainternational-ngx-sds-components-src-lib-date-pipes.mjs +4 -4
- package/esm2022/src/lib/drawer/drawer.component.mjs +103 -0
- package/{esm2020 → esm2022}/src/lib/drawer/public-api.mjs +2 -3
- package/{esm2020 → esm2022}/src/lib/drawer/spicainternational-ngx-sds-components-src-lib-drawer.mjs +4 -4
- package/esm2022/src/lib/duration-box/duration-box.component.mjs +279 -0
- package/{esm2020 → esm2022}/src/lib/duration-box/duration-box.types.mjs +1 -1
- package/esm2022/src/lib/duration-box/duration.service.mjs +72 -0
- package/{esm2020 → esm2022}/src/lib/duration-box/public-api.mjs +2 -3
- package/{esm2020 → esm2022}/src/lib/duration-box/spicainternational-ngx-sds-components-src-lib-duration-box.mjs +4 -4
- package/esm2022/src/lib/duration-pipe/duration-format.pipe.mjs +27 -0
- package/{esm2020 → esm2022}/src/lib/duration-pipe/public-api.mjs +2 -3
- package/{esm2020 → esm2022}/src/lib/duration-pipe/spicainternational-ngx-sds-components-src-lib-duration-pipe.mjs +4 -4
- package/esm2022/src/lib/ellipsis/directives/ellipsis.directive.mjs +52 -0
- package/{esm2020 → esm2022}/src/lib/ellipsis/public-api.mjs +2 -3
- package/{esm2020 → esm2022}/src/lib/ellipsis/spicainternational-ngx-sds-components-src-lib-ellipsis.mjs +4 -4
- package/esm2022/src/lib/expansion-panel/expansion-panel.component.mjs +86 -0
- package/{esm2020 → esm2022}/src/lib/expansion-panel/expansion-panel.types.mjs +1 -1
- package/{esm2020 → esm2022}/src/lib/expansion-panel/public-api.mjs +2 -3
- package/{esm2020 → esm2022}/src/lib/expansion-panel/spicainternational-ngx-sds-components-src-lib-expansion-panel.mjs +4 -4
- package/esm2022/src/lib/highlight-text/directives/highlight-text.directive.mjs +61 -0
- package/{esm2020 → esm2022}/src/lib/highlight-text/directives/index.mjs +1 -1
- package/esm2022/src/lib/highlight-text/pipes/highlight-text.pipe.mjs +30 -0
- package/{esm2020 → esm2022}/src/lib/highlight-text/pipes/index.mjs +1 -1
- package/esm2022/src/lib/highlight-text/public-api.mjs +3 -0
- package/{esm2020 → esm2022}/src/lib/highlight-text/spicainternational-ngx-sds-components-src-lib-highlight-text.mjs +4 -4
- package/esm2022/src/lib/highlight-text/utils/highlight-text.utils.mjs +97 -0
- package/{esm2020 → esm2022}/src/lib/highlight-text/utils/index.mjs +1 -1
- package/{esm2020 → esm2022}/src/lib/intersection/directives/index.mjs +1 -1
- package/esm2022/src/lib/intersection/directives/intersection.directive.mjs +52 -0
- package/esm2022/src/lib/intersection/public-api.mjs +3 -0
- package/{esm2020 → esm2022}/src/lib/intersection/services/index.mjs +1 -1
- package/{esm2020 → esm2022}/src/lib/intersection/services/intersection.service.mjs +54 -54
- package/{esm2020 → esm2022}/src/lib/intersection/spicainternational-ngx-sds-components-src-lib-intersection.mjs +4 -4
- package/{esm2020 → esm2022}/src/lib/keyboard-shortcut/directives/index.mjs +1 -1
- package/esm2022/src/lib/keyboard-shortcut/directives/keyboard-shortcut.directive.mjs +57 -0
- package/{esm2020 → esm2022}/src/lib/keyboard-shortcut/public-api.mjs +2 -3
- package/{esm2020 → esm2022}/src/lib/keyboard-shortcut/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.mjs +4 -4
- package/esm2022/src/lib/layout/default-layout/default-layout.component.mjs +15 -0
- package/esm2022/src/lib/layout/extra-large-layout/extra-large-layout.component.mjs +15 -0
- package/esm2022/src/lib/layout/fluid-layout/fluid-layout.component.mjs +15 -0
- package/esm2022/src/lib/layout/medium-layout/medium-layout.component.mjs +15 -0
- package/esm2022/src/lib/layout/public-api.mjs +6 -0
- package/esm2022/src/lib/layout/small-layout/small-layout.component.mjs +15 -0
- package/{esm2020 → esm2022}/src/lib/layout/spicainternational-ngx-sds-components-src-lib-layout.mjs +4 -4
- package/esm2022/src/lib/message/message.component.mjs +60 -0
- package/{esm2020 → esm2022}/src/lib/message/public-api.mjs +2 -3
- package/{esm2020 → esm2022}/src/lib/message/spicainternational-ngx-sds-components-src-lib-message.mjs +4 -4
- package/esm2022/src/lib/modal/dialog/dialog.component.mjs +187 -0
- package/{esm2020 → esm2022}/src/lib/modal/dialog/dialog.types.mjs +1 -1
- package/esm2022/src/lib/modal/modal.component.mjs +153 -0
- package/{esm2020 → esm2022}/src/lib/modal/modal.model.mjs +1 -1
- package/{esm2020 → esm2022}/src/lib/modal/public-api.mjs +3 -4
- package/{esm2020 → esm2022}/src/lib/modal/spicainternational-ngx-sds-components-src-lib-modal.mjs +4 -4
- package/esm2022/src/lib/navigation/models/navigation-models.mjs +2 -0
- package/esm2022/src/lib/navigation/navigation-collapsible-frame/navigation-collapsible-frame.component.mjs +17 -0
- package/esm2022/src/lib/navigation/navigation-container/navigation-container.component.mjs +61 -0
- package/esm2022/src/lib/navigation/navigation-external-link/navigation-external-link.component.mjs +38 -0
- package/esm2022/src/lib/navigation/navigation-group/navigation-group.component.mjs +110 -0
- package/esm2022/src/lib/navigation/navigation-header/navigation-header.component.mjs +21 -0
- package/esm2022/src/lib/navigation/navigation-route-link/navigation-route-link.component.mjs +38 -0
- package/esm2022/src/lib/navigation/navigation-separator/navigation-separator.component.mjs +15 -0
- package/esm2022/src/lib/navigation/navigation-user-profile/components/user-profile-action-button/user-profile-action-button.component.mjs +30 -0
- package/esm2022/src/lib/navigation/navigation-user-profile/components/user-profile-selector/user-profile-selector.component.mjs +45 -0
- package/{esm2020 → esm2022}/src/lib/navigation/navigation-user-profile/components/user-profile-selector/user-profile-selector.types.mjs +1 -1
- package/esm2022/src/lib/navigation/navigation-user-profile/components/user-profile-tile/user-profile-tile.component.mjs +25 -0
- package/{esm2020 → esm2022}/src/lib/navigation/navigation-user-profile/navigation-profile.model.mjs +1 -1
- package/esm2022/src/lib/navigation/navigation-user-profile/navigation-user-profile.component.mjs +107 -0
- package/esm2022/src/lib/navigation/product-home/product-home.component.mjs +71 -0
- package/esm2022/src/lib/navigation/public-api.mjs +14 -0
- package/{esm2020 → esm2022}/src/lib/navigation/spicainternational-ngx-sds-components-src-lib-navigation.mjs +4 -4
- package/esm2022/src/lib/navigation/utils/navigation.utils.mjs +48 -0
- package/esm2022/src/lib/number-box/number-box.component.mjs +138 -0
- package/{esm2020 → esm2022}/src/lib/number-box/public-api.mjs +2 -3
- package/{esm2020 → esm2022}/src/lib/number-box/spicainternational-ngx-sds-components-src-lib-number-box.mjs +4 -4
- package/esm2022/src/lib/page-header/page-header.component.mjs +25 -0
- package/{esm2020 → esm2022}/src/lib/page-header/public-api.mjs +2 -3
- package/{esm2020 → esm2022}/src/lib/page-header/spicainternational-ngx-sds-components-src-lib-page-header.mjs +4 -4
- package/esm2022/src/lib/pane/pane.component.mjs +43 -0
- package/{esm2020 → esm2022}/src/lib/pane/pane.model.mjs +1 -1
- package/{esm2020 → esm2022}/src/lib/pane/public-api.mjs +3 -4
- package/{esm2020 → esm2022}/src/lib/pane/spicainternational-ngx-sds-components-src-lib-pane.mjs +4 -4
- package/{esm2020 → esm2022}/src/lib/quick-info/public-api.mjs +2 -3
- package/esm2022/src/lib/quick-info/quick-info.component.mjs +121 -0
- package/{esm2020 → esm2022}/src/lib/quick-info/quick-info.model.mjs +1 -1
- package/{esm2020 → esm2022}/src/lib/quick-info/spicainternational-ngx-sds-components-src-lib-quick-info.mjs +4 -4
- package/{esm2020 → esm2022}/src/lib/segmented-control/public-api.mjs +2 -3
- package/esm2022/src/lib/segmented-control/segmented-control.component.mjs +60 -0
- package/{esm2020 → esm2022}/src/lib/segmented-control/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs +4 -4
- package/{esm2020 → esm2022}/src/lib/side-bar/public-api.mjs +2 -3
- package/esm2022/src/lib/side-bar/side-bar.component.mjs +39 -0
- package/{esm2020 → esm2022}/src/lib/side-bar/spicainternational-ngx-sds-components-src-lib-side-bar.mjs +4 -4
- package/{esm2020 → esm2022}/src/lib/static-value/public-api.mjs +2 -3
- package/{esm2020 → esm2022}/src/lib/static-value/spicainternational-ngx-sds-components-src-lib-static-value.mjs +4 -4
- package/esm2022/src/lib/static-value/static-value.component.mjs +25 -0
- package/{esm2020 → esm2022}/src/lib/table-actions/public-api.mjs +2 -3
- package/{esm2020 → esm2022}/src/lib/table-actions/spicainternational-ngx-sds-components-src-lib-table-actions.mjs +4 -4
- package/esm2022/src/lib/table-actions/table-actions.component.mjs +49 -0
- package/esm2022/src/lib/timeline/components/timeline.component.mjs +388 -0
- package/{esm2020 → esm2022}/src/lib/timeline/models/timeline.model.mjs +1 -1
- package/{esm2020 → esm2022}/src/lib/timeline/public-api.mjs +2 -3
- package/esm2022/src/lib/timeline/services/timeline.service.mjs +152 -0
- package/{esm2020 → esm2022}/src/lib/timeline/spicainternational-ngx-sds-components-src-lib-timeline.mjs +4 -4
- package/{esm2020 → esm2022}/src/lib/timeline/types/timeline.types.mjs +1 -1
- package/{esm2020 → esm2022}/src/lib/timer/public-api.mjs +3 -4
- package/{esm2020 → esm2022}/src/lib/timer/services/index.mjs +1 -1
- package/esm2022/src/lib/timer/services/timer.service.mjs +99 -0
- package/{esm2020 → esm2022}/src/lib/timer/spicainternational-ngx-sds-components-src-lib-timer.mjs +4 -4
- package/{esm2020 → esm2022}/src/lib/timer/utils/index.mjs +1 -1
- package/{esm2020 → esm2022}/src/lib/timer/utils/timer.utils.mjs +96 -96
- package/esm2022/src/lib/tooltip/components/tooltip.component.mjs +26 -0
- package/{esm2020 → esm2022}/src/lib/tooltip/public-api.mjs +2 -3
- package/{esm2020 → esm2022}/src/lib/tooltip/spicainternational-ngx-sds-components-src-lib-tooltip.mjs +4 -4
- package/esm2022/src/lib/tooltip/tooltip.directive.mjs +192 -0
- package/{esm2020 → esm2022}/src/lib/tooltip/tooltip.types.mjs +1 -1
- package/{esm2020 → esm2022}/src/lib/tooltip/utils/index.mjs +1 -1
- package/{esm2020 → esm2022}/src/lib/tooltip/utils/tooltip.utils.mjs +16 -16
- package/esm2022/src/lib/utils/date-time/date-time-format.function.mjs +15 -0
- package/esm2022/src/lib/utils/date-time/intl-date-time-format-options-presets.mjs +29 -0
- package/esm2022/src/lib/utils/date-time/public-api.mjs +3 -0
- package/esm2022/src/lib/utils/date-time/spicainternational-ngx-sds-components-src-lib-utils-date-time.mjs +5 -0
- package/esm2022/src/lib/utils/public-api.mjs +2 -0
- package/esm2022/src/lib/utils/spicainternational-ngx-sds-components-src-lib-utils.mjs +5 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs +122 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-avatar.mjs +236 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-avatar.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-badge.mjs +153 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-badge.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-callout.mjs +27 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-callout.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-color-picker.mjs +89 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-color-picker.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-date-picker.mjs +1025 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-date-picker.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/spicainternational-ngx-sds-components-src-lib-date-pipes.mjs +330 -399
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-date-pipes.mjs.map +1 -0
- package/{fesm2015 → fesm2022}/spicainternational-ngx-sds-components-src-lib-drawer.mjs +103 -118
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-drawer.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-duration-box.mjs +354 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-duration-box.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-duration-pipe.mjs +34 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-duration-pipe.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-ellipsis.mjs +59 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-ellipsis.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-expansion-panel.mjs +93 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-expansion-panel.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/spicainternational-ngx-sds-components-src-lib-highlight-text.mjs +178 -201
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-highlight-text.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/spicainternational-ngx-sds-components-src-lib-intersection.mjs +99 -114
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-intersection.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.mjs +64 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-layout.mjs +70 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-layout.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-message.mjs +67 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-message.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-modal.mjs +343 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-modal.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-navigation.mjs +579 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-navigation.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-number-box.mjs +145 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-number-box.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-page-header.mjs +32 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-page-header.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-pane.mjs +50 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-pane.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-quick-info.mjs +128 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-quick-info.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs +67 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-side-bar.mjs +46 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-side-bar.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-static-value.mjs +32 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-static-value.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-table-actions.mjs +56 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-table-actions.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-timeline.mjs +546 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-timeline.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/spicainternational-ngx-sds-components-src-lib-timer.mjs +192 -223
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-timer.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/spicainternational-ngx-sds-components-src-lib-tooltip.mjs +228 -250
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-tooltip.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-utils-date-time.mjs +49 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-utils-date-time.mjs.map +1 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-utils.mjs +49 -0
- package/fesm2022/spicainternational-ngx-sds-components-src-lib-utils.mjs.map +1 -0
- package/{fesm2015 → fesm2022}/spicainternational-ngx-sds-components.mjs +5 -4
- package/{fesm2015 → fesm2022}/spicainternational-ngx-sds-components.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/package.json +120 -172
- package/public-api.d.ts +31 -30
- package/src/lib/app-switcher/app-switcher.component.d.ts +34 -34
- package/src/lib/app-switcher/app-switcher.model.d.ts +8 -8
- package/src/lib/app-switcher/index.d.ts +5 -5
- package/src/lib/app-switcher/public-api.d.ts +2 -3
- package/src/lib/avatar/avatar-group.component.d.ts +28 -28
- package/src/lib/avatar/avatar-group.model.d.ts +6 -6
- package/src/lib/avatar/avatar.component.d.ts +53 -55
- package/src/lib/avatar/index.d.ts +5 -5
- package/src/lib/avatar/public-api.d.ts +3 -4
- package/src/lib/badge/badge.directive.d.ts +23 -23
- package/src/lib/badge/badge.types.d.ts +2 -2
- package/src/lib/badge/components/badge.component.d.ts +23 -23
- package/src/lib/badge/index.d.ts +5 -5
- package/src/lib/badge/public-api.d.ts +1 -2
- package/src/lib/callout/callout.component.d.ts +10 -10
- package/src/lib/callout/index.d.ts +5 -5
- package/src/lib/callout/public-api.d.ts +1 -2
- package/src/lib/color-picker/color-picker.component.d.ts +27 -28
- package/src/lib/color-picker/index.d.ts +5 -5
- package/src/lib/color-picker/public-api.d.ts +1 -2
- package/src/lib/date-picker/date-picker.component.d.ts +149 -149
- package/src/lib/date-picker/date-picker.model.d.ts +34 -34
- package/src/lib/date-picker/index.d.ts +5 -5
- package/src/lib/date-picker/public-api.d.ts +2 -3
- package/src/lib/date-picker/sds-date-picker.service.d.ts +9 -9
- package/src/lib/date-pipes/date-compare.pipe.d.ts +7 -7
- package/src/lib/date-pipes/date-format.pipe.d.ts +19 -18
- package/src/lib/date-pipes/date-period-format.pipe.d.ts +11 -7
- package/src/lib/date-pipes/date-time-formats.constants.d.ts +22 -22
- package/src/lib/date-pipes/date-time-range-duration.pipe.d.ts +7 -7
- package/src/lib/date-pipes/date-time-range-format.pipe.d.ts +15 -15
- package/src/lib/date-pipes/index.d.ts +5 -5
- package/src/lib/date-pipes/public-api.d.ts +7 -7
- package/src/lib/drawer/drawer.component.d.ts +24 -24
- package/src/lib/drawer/index.d.ts +5 -5
- package/src/lib/drawer/public-api.d.ts +1 -2
- package/src/lib/duration-box/duration-box.component.d.ts +137 -137
- package/src/lib/duration-box/duration-box.types.d.ts +1 -1
- package/src/lib/duration-box/duration.service.d.ts +10 -10
- package/src/lib/duration-box/index.d.ts +5 -5
- package/src/lib/duration-box/public-api.d.ts +1 -2
- package/src/lib/duration-pipe/duration-format.pipe.d.ts +7 -7
- package/src/lib/duration-pipe/index.d.ts +5 -5
- package/src/lib/duration-pipe/public-api.d.ts +1 -2
- package/src/lib/ellipsis/directives/ellipsis.directive.d.ts +13 -13
- package/src/lib/ellipsis/index.d.ts +5 -5
- package/src/lib/ellipsis/public-api.d.ts +1 -2
- package/src/lib/expansion-panel/expansion-panel.component.d.ts +52 -52
- package/src/lib/expansion-panel/expansion-panel.types.d.ts +2 -2
- package/src/lib/expansion-panel/index.d.ts +5 -5
- package/src/lib/expansion-panel/public-api.d.ts +1 -2
- package/src/lib/highlight-text/directives/highlight-text.directive.d.ts +33 -33
- package/src/lib/highlight-text/directives/index.d.ts +1 -1
- package/src/lib/highlight-text/index.d.ts +5 -5
- package/src/lib/highlight-text/pipes/highlight-text.pipe.d.ts +11 -11
- package/src/lib/highlight-text/pipes/index.d.ts +1 -1
- package/src/lib/highlight-text/public-api.d.ts +2 -3
- package/src/lib/highlight-text/utils/highlight-text.utils.d.ts +23 -23
- package/src/lib/highlight-text/utils/index.d.ts +1 -1
- package/src/lib/intersection/directives/index.d.ts +1 -1
- package/src/lib/intersection/directives/intersection.directive.d.ts +24 -24
- package/src/lib/intersection/index.d.ts +5 -5
- package/src/lib/intersection/public-api.d.ts +2 -3
- package/src/lib/intersection/services/index.d.ts +1 -1
- package/src/lib/intersection/services/intersection.service.d.ts +19 -19
- package/src/lib/keyboard-shortcut/directives/index.d.ts +1 -1
- package/src/lib/keyboard-shortcut/directives/keyboard-shortcut.directive.d.ts +22 -22
- package/src/lib/keyboard-shortcut/index.d.ts +5 -5
- package/src/lib/keyboard-shortcut/public-api.d.ts +1 -2
- package/src/lib/layout/default-layout/default-layout.component.d.ts +8 -8
- package/src/lib/layout/extra-large-layout/extra-large-layout.component.d.ts +8 -8
- package/src/lib/layout/fluid-layout/fluid-layout.component.d.ts +8 -8
- package/src/lib/layout/index.d.ts +5 -5
- package/src/lib/layout/medium-layout/medium-layout.component.d.ts +8 -8
- package/src/lib/layout/public-api.d.ts +5 -6
- package/src/lib/layout/small-layout/small-layout.component.d.ts +8 -8
- package/src/lib/message/index.d.ts +5 -5
- package/src/lib/message/message.component.d.ts +24 -24
- package/src/lib/message/public-api.d.ts +1 -2
- package/src/lib/modal/dialog/dialog.component.d.ts +61 -61
- package/src/lib/modal/dialog/dialog.types.d.ts +1 -1
- package/src/lib/modal/index.d.ts +5 -5
- package/src/lib/modal/modal.component.d.ts +54 -54
- package/src/lib/modal/modal.model.d.ts +3 -3
- package/src/lib/modal/public-api.d.ts +2 -3
- package/src/lib/navigation/index.d.ts +5 -5
- package/src/lib/navigation/models/navigation-models.d.ts +4 -0
- package/src/lib/navigation/navigation-collapsible-frame/navigation-collapsible-frame.component.d.ts +7 -0
- package/src/lib/navigation/navigation-container/navigation-container.component.d.ts +26 -9
- package/src/lib/navigation/navigation-external-link/navigation-external-link.component.d.ts +17 -15
- package/src/lib/navigation/navigation-group/navigation-group.component.d.ts +44 -40
- package/src/lib/navigation/navigation-header/navigation-header.component.d.ts +11 -9
- package/src/lib/navigation/navigation-route-link/navigation-route-link.component.d.ts +19 -17
- package/src/lib/navigation/navigation-separator/navigation-separator.component.d.ts +10 -8
- package/src/lib/navigation/navigation-user-profile/components/user-profile-action-button/user-profile-action-button.component.d.ts +11 -11
- package/src/lib/navigation/navigation-user-profile/components/user-profile-selector/user-profile-selector.component.d.ts +17 -17
- package/src/lib/navigation/navigation-user-profile/components/user-profile-selector/user-profile-selector.types.d.ts +1 -1
- package/src/lib/navigation/navigation-user-profile/components/user-profile-tile/user-profile-tile.component.d.ts +9 -9
- package/src/lib/navigation/navigation-user-profile/navigation-profile.model.d.ts +6 -6
- package/src/lib/navigation/navigation-user-profile/navigation-user-profile.component.d.ts +34 -31
- package/src/lib/navigation/product-home/product-home.component.d.ts +32 -23
- package/src/lib/navigation/public-api.d.ts +13 -12
- package/src/lib/navigation/utils/navigation.utils.d.ts +2 -2
- package/src/lib/number-box/index.d.ts +5 -5
- package/src/lib/number-box/number-box.component.d.ts +83 -83
- package/src/lib/number-box/public-api.d.ts +1 -2
- package/src/lib/page-header/index.d.ts +5 -5
- package/src/lib/page-header/page-header.component.d.ts +11 -11
- package/src/lib/page-header/public-api.d.ts +1 -2
- package/src/lib/pane/index.d.ts +5 -5
- package/src/lib/pane/pane.component.d.ts +19 -19
- package/src/lib/pane/pane.model.d.ts +8 -8
- package/src/lib/pane/public-api.d.ts +2 -3
- package/src/lib/quick-info/index.d.ts +5 -5
- package/src/lib/quick-info/public-api.d.ts +1 -2
- package/src/lib/quick-info/quick-info.component.d.ts +43 -43
- package/src/lib/quick-info/quick-info.model.d.ts +9 -9
- package/src/lib/segmented-control/index.d.ts +5 -5
- package/src/lib/segmented-control/public-api.d.ts +1 -2
- package/src/lib/segmented-control/segmented-control.component.d.ts +21 -21
- package/src/lib/side-bar/index.d.ts +5 -5
- package/src/lib/side-bar/public-api.d.ts +1 -2
- package/src/lib/side-bar/side-bar.component.d.ts +24 -74
- package/src/lib/static-value/index.d.ts +5 -5
- package/src/lib/static-value/public-api.d.ts +1 -2
- package/src/lib/static-value/static-value.component.d.ts +12 -12
- package/src/lib/table-actions/index.d.ts +5 -5
- package/src/lib/table-actions/public-api.d.ts +1 -2
- package/src/lib/table-actions/table-actions.component.d.ts +16 -16
- package/src/lib/timeline/components/timeline.component.d.ts +206 -198
- package/src/lib/timeline/index.d.ts +5 -5
- package/src/lib/timeline/models/timeline.model.d.ts +38 -38
- package/src/lib/timeline/public-api.d.ts +1 -2
- package/src/lib/timeline/services/timeline.service.d.ts +24 -21
- package/src/lib/timeline/types/timeline.types.d.ts +2 -2
- package/src/lib/timer/index.d.ts +5 -5
- package/src/lib/timer/public-api.d.ts +2 -3
- package/src/lib/timer/services/index.d.ts +1 -1
- package/src/lib/timer/services/timer.service.d.ts +78 -78
- package/src/lib/timer/utils/index.d.ts +1 -1
- package/src/lib/timer/utils/timer.utils.d.ts +61 -61
- package/src/lib/tooltip/components/tooltip.component.d.ts +18 -18
- package/src/lib/tooltip/index.d.ts +5 -5
- package/src/lib/tooltip/public-api.d.ts +1 -2
- package/src/lib/tooltip/tooltip.directive.d.ts +36 -36
- package/src/lib/tooltip/tooltip.types.d.ts +2 -2
- package/src/lib/tooltip/utils/index.d.ts +1 -1
- package/src/lib/tooltip/utils/tooltip.utils.d.ts +5 -5
- package/src/lib/utils/date-time/date-time-format.function.d.ts +2 -0
- package/src/lib/utils/date-time/index.d.ts +5 -0
- package/src/lib/utils/date-time/intl-date-time-format-options-presets.d.ts +4 -0
- package/src/lib/utils/date-time/public-api.d.ts +2 -0
- package/src/lib/utils/index.d.ts +5 -0
- package/src/lib/utils/public-api.d.ts +1 -0
- package/esm2020/src/lib/app-switcher/app-switcher.component.mjs +0 -107
- package/esm2020/src/lib/app-switcher/app-switcher.module.mjs +0 -36
- package/esm2020/src/lib/app-switcher/public-api.mjs +0 -4
- package/esm2020/src/lib/avatar/avatar-group.component.mjs +0 -80
- package/esm2020/src/lib/avatar/avatar.component.mjs +0 -162
- package/esm2020/src/lib/avatar/avatar.module.mjs +0 -41
- package/esm2020/src/lib/avatar/public-api.mjs +0 -5
- package/esm2020/src/lib/badge/badge.directive.mjs +0 -89
- package/esm2020/src/lib/badge/badge.module.mjs +0 -27
- package/esm2020/src/lib/badge/components/badge.component.mjs +0 -59
- package/esm2020/src/lib/callout/callout.component.mjs +0 -20
- package/esm2020/src/lib/callout/callout.module.mjs +0 -25
- package/esm2020/src/lib/color-picker/color-picker.component.mjs +0 -76
- package/esm2020/src/lib/color-picker/color-picker.module.mjs +0 -33
- package/esm2020/src/lib/date-picker/date-picker.component.mjs +0 -841
- package/esm2020/src/lib/date-picker/date-picker.model.mjs +0 -71
- package/esm2020/src/lib/date-picker/date-picker.module.mjs +0 -68
- package/esm2020/src/lib/date-picker/public-api.mjs +0 -4
- package/esm2020/src/lib/date-picker/sds-date-picker.service.mjs +0 -90
- package/esm2020/src/lib/date-pipes/date-compare.pipe.mjs +0 -31
- package/esm2020/src/lib/date-pipes/date-format.pipe.mjs +0 -73
- package/esm2020/src/lib/date-pipes/date-period-format.pipe.mjs +0 -44
- package/esm2020/src/lib/date-pipes/date-pipes.module.mjs +0 -43
- package/esm2020/src/lib/date-pipes/date-time-range-duration.pipe.mjs +0 -31
- package/esm2020/src/lib/date-pipes/date-time-range-format.pipe.mjs +0 -48
- package/esm2020/src/lib/drawer/drawer.component.mjs +0 -103
- package/esm2020/src/lib/drawer/drawer.module.mjs +0 -18
- package/esm2020/src/lib/duration-box/duration-box.component.mjs +0 -261
- package/esm2020/src/lib/duration-box/duration-box.module.mjs +0 -44
- package/esm2020/src/lib/duration-box/duration.service.mjs +0 -72
- package/esm2020/src/lib/duration-pipe/duration-format.pipe.mjs +0 -26
- package/esm2020/src/lib/duration-pipe/duration-pipe.module.mjs +0 -18
- package/esm2020/src/lib/ellipsis/directives/ellipsis.directive.mjs +0 -51
- package/esm2020/src/lib/ellipsis/ellipsis.module.mjs +0 -24
- package/esm2020/src/lib/expansion-panel/expansion-panel.component.mjs +0 -86
- package/esm2020/src/lib/expansion-panel/expansion-panel.module.mjs +0 -25
- package/esm2020/src/lib/highlight-text/directives/highlight-text.directive.mjs +0 -60
- package/esm2020/src/lib/highlight-text/highlight-text.module.mjs +0 -29
- package/esm2020/src/lib/highlight-text/pipes/highlight-text.pipe.mjs +0 -29
- package/esm2020/src/lib/highlight-text/public-api.mjs +0 -4
- package/esm2020/src/lib/highlight-text/utils/highlight-text.utils.mjs +0 -97
- package/esm2020/src/lib/intersection/directives/intersection.directive.mjs +0 -51
- package/esm2020/src/lib/intersection/intersection.module.mjs +0 -20
- package/esm2020/src/lib/intersection/public-api.mjs +0 -4
- package/esm2020/src/lib/keyboard-shortcut/directives/keyboard-shortcut.directive.mjs +0 -56
- package/esm2020/src/lib/keyboard-shortcut/keyboard-shortcut.module.mjs +0 -24
- package/esm2020/src/lib/layout/default-layout/default-layout.component.mjs +0 -15
- package/esm2020/src/lib/layout/extra-large-layout/extra-large-layout.component.mjs +0 -15
- package/esm2020/src/lib/layout/fluid-layout/fluid-layout.component.mjs +0 -15
- package/esm2020/src/lib/layout/layout.module.mjs +0 -47
- package/esm2020/src/lib/layout/medium-layout/medium-layout.component.mjs +0 -15
- package/esm2020/src/lib/layout/public-api.mjs +0 -7
- package/esm2020/src/lib/layout/small-layout/small-layout.component.mjs +0 -15
- package/esm2020/src/lib/message/message.component.mjs +0 -60
- package/esm2020/src/lib/message/message.module.mjs +0 -28
- package/esm2020/src/lib/modal/dialog/dialog.component.mjs +0 -187
- package/esm2020/src/lib/modal/modal.component.mjs +0 -147
- package/esm2020/src/lib/modal/modal.module.mjs +0 -43
- package/esm2020/src/lib/navigation/navigation-container/navigation-container.component.mjs +0 -17
- package/esm2020/src/lib/navigation/navigation-external-link/navigation-external-link.component.mjs +0 -37
- package/esm2020/src/lib/navigation/navigation-group/navigation-group.component.mjs +0 -100
- package/esm2020/src/lib/navigation/navigation-header/navigation-header.component.mjs +0 -17
- package/esm2020/src/lib/navigation/navigation-route-link/navigation-route-link.component.mjs +0 -33
- package/esm2020/src/lib/navigation/navigation-separator/navigation-separator.component.mjs +0 -14
- package/esm2020/src/lib/navigation/navigation-user-profile/components/user-profile-action-button/user-profile-action-button.component.mjs +0 -26
- package/esm2020/src/lib/navigation/navigation-user-profile/components/user-profile-selector/user-profile-selector.component.mjs +0 -40
- package/esm2020/src/lib/navigation/navigation-user-profile/components/user-profile-tile/user-profile-tile.component.mjs +0 -23
- package/esm2020/src/lib/navigation/navigation-user-profile/navigation-user-profile.component.mjs +0 -99
- package/esm2020/src/lib/navigation/navigation.module.mjs +0 -107
- package/esm2020/src/lib/navigation/pipes/navigation-route-active.pipe.mjs +0 -30
- package/esm2020/src/lib/navigation/product-home/product-home.component.mjs +0 -54
- package/esm2020/src/lib/navigation/public-api.mjs +0 -13
- package/esm2020/src/lib/navigation/utils/navigation.utils.mjs +0 -48
- package/esm2020/src/lib/number-box/number-box.component.mjs +0 -138
- package/esm2020/src/lib/number-box/number-box.module.mjs +0 -28
- package/esm2020/src/lib/page-header/page-header.component.mjs +0 -25
- package/esm2020/src/lib/page-header/page-header.module.mjs +0 -19
- package/esm2020/src/lib/pane/pane.component.mjs +0 -43
- package/esm2020/src/lib/pane/pane.module.mjs +0 -28
- package/esm2020/src/lib/quick-info/quick-info.component.mjs +0 -116
- package/esm2020/src/lib/quick-info/quick-info.module.mjs +0 -33
- package/esm2020/src/lib/segmented-control/segmented-control.component.mjs +0 -55
- package/esm2020/src/lib/segmented-control/segmented-control.module.mjs +0 -29
- package/esm2020/src/lib/side-bar/side-bar.component.mjs +0 -109
- package/esm2020/src/lib/side-bar/side-bar.module.mjs +0 -28
- package/esm2020/src/lib/static-value/static-value.component.mjs +0 -25
- package/esm2020/src/lib/static-value/static-value.module.mjs +0 -28
- package/esm2020/src/lib/table-actions/table-actions.component.mjs +0 -42
- package/esm2020/src/lib/table-actions/table-actions.module.mjs +0 -32
- package/esm2020/src/lib/timeline/components/timeline.component.mjs +0 -364
- package/esm2020/src/lib/timeline/services/timeline.service.mjs +0 -120
- package/esm2020/src/lib/timeline/timeline.module.mjs +0 -24
- package/esm2020/src/lib/timer/services/timer.service.mjs +0 -99
- package/esm2020/src/lib/timer/timer.module.mjs +0 -34
- package/esm2020/src/lib/tooltip/components/tooltip.component.mjs +0 -22
- package/esm2020/src/lib/tooltip/tooltip.directive.mjs +0 -191
- package/esm2020/src/lib/tooltip/tooltip.module.mjs +0 -31
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs +0 -150
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-avatar.mjs +0 -284
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-avatar.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-badge.mjs +0 -175
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-badge.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-callout.mjs +0 -49
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-callout.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-color-picker.mjs +0 -113
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-color-picker.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-date-picker.mjs +0 -1071
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-date-picker.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-date-pipes.mjs +0 -411
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-date-pipes.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-drawer.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-duration-box.mjs +0 -379
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-duration-box.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-duration-pipe.mjs +0 -48
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-duration-pipe.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-ellipsis.mjs +0 -80
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-ellipsis.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-expansion-panel.mjs +0 -115
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-expansion-panel.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-highlight-text.mjs +0 -215
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-highlight-text.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-intersection.mjs +0 -127
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-intersection.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.mjs +0 -85
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-layout.mjs +0 -110
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-layout.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-message.mjs +0 -92
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-message.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-modal.mjs +0 -378
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-modal.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-navigation.mjs +0 -595
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-navigation.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-number-box.mjs +0 -170
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-number-box.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-page-header.mjs +0 -48
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-page-header.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-pane.mjs +0 -75
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-pane.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-quick-info.mjs +0 -155
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-quick-info.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs +0 -88
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-side-bar.mjs +0 -141
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-side-bar.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-static-value.mjs +0 -57
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-static-value.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-table-actions.mjs +0 -78
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-table-actions.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-timeline.mjs +0 -515
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-timeline.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-timer.mjs +0 -235
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-timer.mjs.map +0 -1
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-tooltip.mjs +0 -260
- package/fesm2015/spicainternational-ngx-sds-components-src-lib-tooltip.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs +0 -146
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-app-switcher.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-avatar.mjs +0 -282
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-avatar.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-badge.mjs +0 -175
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-badge.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-callout.mjs +0 -49
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-callout.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-color-picker.mjs +0 -113
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-color-picker.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-date-picker.mjs +0 -1064
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-date-picker.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-date-pipes.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-drawer.mjs +0 -125
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-drawer.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-duration-box.mjs +0 -377
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-duration-box.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-duration-pipe.mjs +0 -48
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-duration-pipe.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-ellipsis.mjs +0 -79
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-ellipsis.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-expansion-panel.mjs +0 -115
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-expansion-panel.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-highlight-text.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-intersection.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.mjs +0 -83
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-keyboard-shortcut.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-layout.mjs +0 -110
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-layout.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-message.mjs +0 -92
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-message.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-modal.mjs +0 -376
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-modal.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-navigation.mjs +0 -595
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-navigation.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-number-box.mjs +0 -170
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-number-box.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-page-header.mjs +0 -48
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-page-header.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-pane.mjs +0 -75
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-pane.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-quick-info.mjs +0 -153
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-quick-info.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs +0 -88
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-segmented-control.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-side-bar.mjs +0 -141
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-side-bar.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-static-value.mjs +0 -57
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-static-value.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-table-actions.mjs +0 -78
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-table-actions.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-timeline.mjs +0 -511
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-timeline.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-timer.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components-src-lib-tooltip.mjs.map +0 -1
- package/fesm2020/spicainternational-ngx-sds-components.mjs +0 -39
- package/fesm2020/spicainternational-ngx-sds-components.mjs.map +0 -1
- package/src/lib/app-switcher/app-switcher.module.d.ts +0 -11
- package/src/lib/avatar/avatar.module.d.ts +0 -11
- package/src/lib/badge/badge.module.d.ts +0 -9
- package/src/lib/callout/callout.module.d.ts +0 -8
- package/src/lib/color-picker/color-picker.module.d.ts +0 -10
- package/src/lib/date-picker/date-picker.module.d.ts +0 -12
- package/src/lib/date-pipes/date-pipes.module.d.ts +0 -12
- package/src/lib/drawer/drawer.module.d.ts +0 -8
- package/src/lib/duration-box/duration-box.module.d.ts +0 -10
- package/src/lib/duration-pipe/duration-pipe.module.d.ts +0 -8
- package/src/lib/ellipsis/ellipsis.module.d.ts +0 -8
- package/src/lib/expansion-panel/expansion-panel.module.d.ts +0 -15
- package/src/lib/highlight-text/highlight-text.module.d.ts +0 -9
- package/src/lib/intersection/intersection.module.d.ts +0 -8
- package/src/lib/keyboard-shortcut/keyboard-shortcut.module.d.ts +0 -8
- package/src/lib/layout/layout.module.d.ts +0 -13
- package/src/lib/message/message.module.d.ts +0 -9
- package/src/lib/modal/modal.module.d.ts +0 -12
- package/src/lib/navigation/navigation.module.d.ts +0 -28
- package/src/lib/navigation/pipes/navigation-route-active.pipe.d.ts +0 -7
- package/src/lib/number-box/number-box.module.d.ts +0 -9
- package/src/lib/page-header/page-header.module.d.ts +0 -8
- package/src/lib/pane/pane.module.d.ts +0 -9
- package/src/lib/quick-info/quick-info.module.d.ts +0 -10
- package/src/lib/segmented-control/segmented-control.module.d.ts +0 -9
- package/src/lib/side-bar/side-bar.module.d.ts +0 -9
- package/src/lib/static-value/static-value.module.d.ts +0 -9
- package/src/lib/table-actions/table-actions.module.d.ts +0 -10
- package/src/lib/timeline/timeline.module.d.ts +0 -8
- package/src/lib/timer/timer.module.d.ts +0 -10
- package/src/lib/tooltip/tooltip.module.d.ts +0 -10
|
@@ -0,0 +1,863 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
|
|
2
|
+
import { locale } from "devextreme/localization";
|
|
3
|
+
import { isSameDay, isSameYear, isSameMonth, startOfDay, startOfMonth, endOfMonth, isAfter, isBefore, add, } from 'date-fns';
|
|
4
|
+
import { faAngleLeft, faAngleRight, faCalendar, faLock } from '@fortawesome/pro-regular-svg-icons';
|
|
5
|
+
import { faArrowRight } from '@fortawesome/pro-light-svg-icons';
|
|
6
|
+
import { PeriodPickerDateRange, } from './date-picker.model';
|
|
7
|
+
import { DxDateBoxModule, DxCalendarModule } from 'devextreme-angular';
|
|
8
|
+
import { DxScrollViewModule } from 'devextreme-angular/ui/scroll-view';
|
|
9
|
+
import { DxoAnimationModule, DxoShowModule, DxoHideModule } from 'devextreme-angular/ui/nested';
|
|
10
|
+
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
|
|
11
|
+
import { DxTemplateModule } from 'devextreme-angular/core';
|
|
12
|
+
import { DxPopoverModule } from 'devextreme-angular/ui/popover';
|
|
13
|
+
import { NgIf, NgFor } from '@angular/common';
|
|
14
|
+
import { CdkTrapFocus } from '@angular/cdk/a11y';
|
|
15
|
+
import { SdsDateComparePipe } from '@spicainternational/ngx-sds-components/src/lib/date-pipes';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
import * as i1 from "./sds-date-picker.service";
|
|
18
|
+
import * as i2 from "@fortawesome/angular-fontawesome";
|
|
19
|
+
import * as i3 from "devextreme-angular/ui/popover";
|
|
20
|
+
import * as i4 from "devextreme-angular/ui/nested";
|
|
21
|
+
import * as i5 from "devextreme-angular/core";
|
|
22
|
+
import * as i6 from "devextreme-angular/ui/scroll-view";
|
|
23
|
+
import * as i7 from "devextreme-angular";
|
|
24
|
+
// import { faLock } from '@fortawesome/pro-solid-svg-icons';
|
|
25
|
+
export class SdsDatePickerComponent {
|
|
26
|
+
// public methods
|
|
27
|
+
constructor(changeRef, datePickerService) {
|
|
28
|
+
this.changeRef = changeRef;
|
|
29
|
+
this.datePickerService = datePickerService;
|
|
30
|
+
this.displayContent = undefined;
|
|
31
|
+
// public interface
|
|
32
|
+
this.selectionKind = 'period';
|
|
33
|
+
this.dateRangeDefinitions = [];
|
|
34
|
+
// single date selector
|
|
35
|
+
this.selectedDate = new Date();
|
|
36
|
+
this.selectedDateChange = new EventEmitter();
|
|
37
|
+
this.selectedDateStartChange = new EventEmitter();
|
|
38
|
+
// format function for displaying date when single date is selected
|
|
39
|
+
this.singleDayFormatFn = undefined;
|
|
40
|
+
// format function for displaying each date when date range is selected
|
|
41
|
+
this.dateRangeFormatFn = undefined;
|
|
42
|
+
this.selectedDateEndChange = new EventEmitter();
|
|
43
|
+
this.periodChange = new EventEmitter();
|
|
44
|
+
this.disabled = false;
|
|
45
|
+
this.validationError = '';
|
|
46
|
+
this.isValid = true;
|
|
47
|
+
this.disabledDates = [];
|
|
48
|
+
this.applyText = 'close';
|
|
49
|
+
this.cancelText = 'close';
|
|
50
|
+
this.firstDayOfWeek = 1;
|
|
51
|
+
this.dateRangeDefinitionsWidth = '11rem';
|
|
52
|
+
this.showPreviousAndNextButtons = true;
|
|
53
|
+
this.width = '30rem';
|
|
54
|
+
this.dropdownWrapperClass = '';
|
|
55
|
+
this.dropdownWrapperId = '';
|
|
56
|
+
this.getPreviousDateCallback = this.getPreviousDay;
|
|
57
|
+
this.getNextDateCallback = this.getNextDay;
|
|
58
|
+
this.getPreviousRangeCallback = this.getPreviousRange;
|
|
59
|
+
this.getNextRangeCallback = this.getNextRange;
|
|
60
|
+
this.useCustomDisplayContent = false;
|
|
61
|
+
this.displayPredefinedDateRangeName = false;
|
|
62
|
+
this.style = 'classic';
|
|
63
|
+
this.compactStyleDisplay = 'predefinedRange';
|
|
64
|
+
this.dateInputDisplayFormat = 'shortDate';
|
|
65
|
+
// #region Aria inputs
|
|
66
|
+
/**
|
|
67
|
+
* @description
|
|
68
|
+
* Component aria-label. Defaults to 'Date picker'
|
|
69
|
+
*/
|
|
70
|
+
this.componentAriaLabel = 'Date picker';
|
|
71
|
+
/**
|
|
72
|
+
* @description
|
|
73
|
+
* Predefined date range definitions dropdown button aria-label. Defaults to 'Open predefined date ranges pane'
|
|
74
|
+
*/
|
|
75
|
+
this.openDateRangeDefinitionsAriaLabel = 'Open predefined date ranges pane';
|
|
76
|
+
/**
|
|
77
|
+
* @description
|
|
78
|
+
* Next period button aria-label. Default to 'Next period'
|
|
79
|
+
*/
|
|
80
|
+
this.nextPeriodAriaLabel = 'Next period';
|
|
81
|
+
/**
|
|
82
|
+
* @description
|
|
83
|
+
* Previous period button aria-label. Defaults to 'Previous period'
|
|
84
|
+
*/
|
|
85
|
+
this.previousPeriodAriaLabel = 'Previous period';
|
|
86
|
+
// public properties
|
|
87
|
+
this.previousPeriodIcon = faAngleLeft;
|
|
88
|
+
this.nextPeriodIcon = faAngleRight;
|
|
89
|
+
this.calendarIcon = faCalendar;
|
|
90
|
+
this.toIcon = faArrowRight;
|
|
91
|
+
this.lockIcon = faLock;
|
|
92
|
+
this.predefinedDateRanges = [];
|
|
93
|
+
this.predefinedDateRangesGeneratedDate = undefined;
|
|
94
|
+
this.dateRanges = [];
|
|
95
|
+
this.selectedDateRangeName = '';
|
|
96
|
+
this.selectedDateRangeTextSegment1 = '';
|
|
97
|
+
this.selectedDateRangeTextSegment2 = '';
|
|
98
|
+
this.selectedDateCalendar = new Date();
|
|
99
|
+
this.selectedDateInternal = new Date();
|
|
100
|
+
this.dateStartOld = '';
|
|
101
|
+
this.dateStart = '';
|
|
102
|
+
this.dateEndOld = '';
|
|
103
|
+
this.dateEnd = '';
|
|
104
|
+
this.showPredefinedOptionsSelector = false;
|
|
105
|
+
this.hidingConfirmedDate = false;
|
|
106
|
+
this.isSettingNotPreprocessedDate = false;
|
|
107
|
+
this.isSelectedPredefinedPeriod = false;
|
|
108
|
+
this.selectedDateFocus = true;
|
|
109
|
+
this.elementUUID = 'sds-as-' + crypto.randomUUID();
|
|
110
|
+
this.initCalendarValue = true;
|
|
111
|
+
this.singleDatePickerBox = undefined;
|
|
112
|
+
this.selectedDateStartBox = undefined;
|
|
113
|
+
this.selectedDateEndBox = undefined;
|
|
114
|
+
this.calendar = undefined;
|
|
115
|
+
this._selectedDateRangeButton = undefined;
|
|
116
|
+
this.randomIdReference = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
|
|
117
|
+
this.isDateDisabled = (args) => {
|
|
118
|
+
if (this.lockBeforeDate && isBefore(args.date, this.lockBeforeDate)) {
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
return this.disabledDates.some((day) => isSameDay(args.date, day));
|
|
122
|
+
};
|
|
123
|
+
this.dateRangeDefinitions = [];
|
|
124
|
+
this.minDateDefault = new Date(1900, 1, 1);
|
|
125
|
+
this.maxDateDefault = add(startOfDay(new Date()), { years: 50 });
|
|
126
|
+
this.showDatepicker = false;
|
|
127
|
+
this.translations = {
|
|
128
|
+
cancel: 'Cancel',
|
|
129
|
+
apply: 'Apply',
|
|
130
|
+
custom: 'Custom',
|
|
131
|
+
presets: 'Presets',
|
|
132
|
+
};
|
|
133
|
+
this.customDateRange = new PeriodPickerDateRange(this.translations.custom, undefined, undefined);
|
|
134
|
+
this.selectedDateRange = this.customDateRange;
|
|
135
|
+
this.selectedDateInternal = startOfDay(new Date());
|
|
136
|
+
this.selectedDateStart = startOfMonth(new Date());
|
|
137
|
+
this.selectedDateEnd = startOfDay(endOfMonth(new Date()));
|
|
138
|
+
this.setSelectedDateRangeText();
|
|
139
|
+
}
|
|
140
|
+
ngOnInit() { }
|
|
141
|
+
ngOnChanges(changes) {
|
|
142
|
+
if (changes['dateRangeDefinitions']) {
|
|
143
|
+
this.generateDateRanges(true);
|
|
144
|
+
}
|
|
145
|
+
if (changes['selectionKind']) {
|
|
146
|
+
if (this.selectionKind == 'single') {
|
|
147
|
+
const date = new Date(this.selectedDateInternal);
|
|
148
|
+
this.matchDateRange(date, date);
|
|
149
|
+
this.setDateRangeText(date, date);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
const date1 = new Date(this.selectedDateStart);
|
|
153
|
+
const date2 = new Date(this.selectedDateEnd);
|
|
154
|
+
this.matchDateRange(date1, date2);
|
|
155
|
+
this.setDateRangeText(date1, date2);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (changes['translations']) {
|
|
159
|
+
this.updateCustomText();
|
|
160
|
+
}
|
|
161
|
+
if (changes['locales']) {
|
|
162
|
+
this.handleLocalesChange();
|
|
163
|
+
}
|
|
164
|
+
if (changes['selectedDateStart'] || changes['selectedDateEnd']) {
|
|
165
|
+
this.dateStartOld = this.selectedDateStart;
|
|
166
|
+
this.dateEndOld = this.selectedDateEnd;
|
|
167
|
+
}
|
|
168
|
+
if (changes['selectedDate']) {
|
|
169
|
+
const value = new Date(changes['selectedDate'].currentValue);
|
|
170
|
+
this.selectedDateInternal = startOfDay(value);
|
|
171
|
+
if (this.selectionKind == 'single') {
|
|
172
|
+
this.dateStart = this.selectedDateInternal;
|
|
173
|
+
this.dateEnd = this.selectedDateInternal;
|
|
174
|
+
this.matchDateRange(this.selectedDateInternal, this.selectedDateInternal);
|
|
175
|
+
this.setDateRangeText(this.selectedDateInternal, this.selectedDateInternal);
|
|
176
|
+
}
|
|
177
|
+
this.changeRef.detectChanges();
|
|
178
|
+
}
|
|
179
|
+
if (changes['selectedDateStart']) {
|
|
180
|
+
const value = changes['selectedDateStart'].currentValue;
|
|
181
|
+
const selectedValue = value instanceof Date ? value : new Date();
|
|
182
|
+
if (this.selectionKind == 'period') {
|
|
183
|
+
if (this.isSettingNotPreprocessedDate && this.showDatepicker) {
|
|
184
|
+
this.dateStart = selectedValue;
|
|
185
|
+
this.selectedDateInternal = selectedValue;
|
|
186
|
+
this.isSettingNotPreprocessedDate = false;
|
|
187
|
+
}
|
|
188
|
+
else if (!this.isSelectedPredefinedPeriod &&
|
|
189
|
+
this.showDatepicker) {
|
|
190
|
+
if (this.selectedDateStartFocus) {
|
|
191
|
+
this.dateStart = selectedValue;
|
|
192
|
+
this.selectedDateInternal = selectedValue;
|
|
193
|
+
if (this.dateEnd instanceof Date &&
|
|
194
|
+
(isSameDay(selectedValue, this.dateEnd) ||
|
|
195
|
+
isAfter(selectedValue, this.dateEnd))) {
|
|
196
|
+
this.dateEnd = selectedValue;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
this.dateStart = selectedValue;
|
|
202
|
+
this.selectedDateFocus = false;
|
|
203
|
+
}
|
|
204
|
+
this.calendar?.instance?.repaint();
|
|
205
|
+
this.removeDxDefaultCalendarFocus();
|
|
206
|
+
if (this.selectedDateStart instanceof Date &&
|
|
207
|
+
this.selectedDateEnd instanceof Date) {
|
|
208
|
+
this.matchDateRange(this.selectedDateStart, this.selectedDateEnd);
|
|
209
|
+
this.setDateRangeText(this.selectedDateStart, this.selectedDateEnd);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
this.changeRef.detectChanges();
|
|
213
|
+
}
|
|
214
|
+
if (changes['selectedDateEnd']) {
|
|
215
|
+
const value = changes['selectedDateEnd'].currentValue;
|
|
216
|
+
const selectedValue = value instanceof Date ? value : new Date();
|
|
217
|
+
if (this.selectionKind == 'period') {
|
|
218
|
+
if (!this.isSelectedPredefinedPeriod) {
|
|
219
|
+
if (this.selectedDateEndFocus) {
|
|
220
|
+
this.dateEnd = selectedValue;
|
|
221
|
+
this.selectedDateInternal = selectedValue;
|
|
222
|
+
if (this.dateStart instanceof Date &&
|
|
223
|
+
(isSameDay(selectedValue, this.dateStart) ||
|
|
224
|
+
isAfter(this.dateStart, selectedValue))) {
|
|
225
|
+
this.dateStart = selectedValue;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
this.dateEnd = selectedValue;
|
|
231
|
+
this.selectedDateInternal = selectedValue;
|
|
232
|
+
}
|
|
233
|
+
this.removeDxDefaultCalendarFocus();
|
|
234
|
+
if (this.selectedDateStart instanceof Date &&
|
|
235
|
+
this.selectedDateEnd instanceof Date) {
|
|
236
|
+
this.matchDateRange(this.selectedDateStart, this.selectedDateEnd);
|
|
237
|
+
this.setDateRangeText(this.selectedDateStart, this.selectedDateEnd);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (changes['firstDayOfWeek']) {
|
|
242
|
+
this.generateDateRanges(true);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
setDateRangeDefinitions(definitions) {
|
|
246
|
+
this.dateRangeDefinitions = definitions;
|
|
247
|
+
this.generateDateRanges(true);
|
|
248
|
+
}
|
|
249
|
+
setTranslations(translations) {
|
|
250
|
+
this.translations = translations;
|
|
251
|
+
this.updateCustomText();
|
|
252
|
+
}
|
|
253
|
+
setLocales(locales) {
|
|
254
|
+
this.locales = locales;
|
|
255
|
+
this.handleLocalesChange();
|
|
256
|
+
}
|
|
257
|
+
get selectedDateStartFocus() {
|
|
258
|
+
return this.selectedDateFocus;
|
|
259
|
+
}
|
|
260
|
+
get selectedDateEndFocus() {
|
|
261
|
+
return !this.selectedDateFocus;
|
|
262
|
+
}
|
|
263
|
+
get isMinimumLimit() {
|
|
264
|
+
if (this.minDate instanceof Date &&
|
|
265
|
+
this.selectedDateInternal instanceof Date) {
|
|
266
|
+
return (isSameDay(this.selectedDateInternal, this.minDate) ||
|
|
267
|
+
isBefore(this.selectedDateInternal, this.minDate));
|
|
268
|
+
}
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
get isMaximumLimit() {
|
|
272
|
+
if (this.maxDate instanceof Date &&
|
|
273
|
+
this.selectedDateInternal instanceof Date) {
|
|
274
|
+
return (isSameDay(this.selectedDateInternal, this.maxDate) ||
|
|
275
|
+
isAfter(this.selectedDateInternal, this.maxDate));
|
|
276
|
+
}
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
onDateChange(event) {
|
|
280
|
+
let selectedDateFromEvent = new Date(event.value);
|
|
281
|
+
if (this.selectionKind == 'period') {
|
|
282
|
+
const interactiveChange = event.event;
|
|
283
|
+
if (interactiveChange) {
|
|
284
|
+
if (this.selectedDateStartFocus) {
|
|
285
|
+
this.handleStartDateChange(selectedDateFromEvent);
|
|
286
|
+
}
|
|
287
|
+
else if (this.selectedDateEndFocus) {
|
|
288
|
+
this.handleEndDateChange(selectedDateFromEvent);
|
|
289
|
+
}
|
|
290
|
+
this.setSelectedDate(this.selectedDateStart, this.selectedDateEnd, false);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
else if (this.selectionKind == 'single') {
|
|
294
|
+
this.showDatepicker = false;
|
|
295
|
+
this.selectedDateInternal = selectedDateFromEvent;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
handleStartDateChange(newDate) {
|
|
299
|
+
this.selectedDateStart = newDate;
|
|
300
|
+
this.selectedDateCalendar = newDate;
|
|
301
|
+
if (!this.initCalendarValue) {
|
|
302
|
+
this.selectedDateFocus = false;
|
|
303
|
+
if (isAfter(newDate, this.selectedDateEnd)) {
|
|
304
|
+
this.selectedDateEnd = newDate;
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
this.selectedDateCalendar = new Date(this.selectedDateEnd);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
handleEndDateChange(newDate) {
|
|
312
|
+
this.selectedDateEnd = newDate;
|
|
313
|
+
this.selectedDateCalendar = newDate;
|
|
314
|
+
if (
|
|
315
|
+
// selected date is before start date -> set start date
|
|
316
|
+
isBefore(newDate, this.selectedDateStart)) {
|
|
317
|
+
this.selectedDateFocus = true;
|
|
318
|
+
this.selectedDateStart = newDate;
|
|
319
|
+
this.selectedDateFocus = false;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
onStartDateChange(event) {
|
|
323
|
+
this.handleStartDateChange(event.value);
|
|
324
|
+
this.setSelectedDate(this.selectedDateStart, this.selectedDateEnd, false);
|
|
325
|
+
}
|
|
326
|
+
onEndDateChange(event) {
|
|
327
|
+
this.handleEndDateChange(event.value);
|
|
328
|
+
this.setSelectedDate(this.selectedDateStart, this.selectedDateEnd, false);
|
|
329
|
+
}
|
|
330
|
+
onRangeKeyReleased(event, range) {
|
|
331
|
+
if (event.key === 'Enter') {
|
|
332
|
+
this.changDateRange(range);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
onStartDateFocus() {
|
|
336
|
+
this.initCalendarValue = true;
|
|
337
|
+
this.selectedDateFocus = true;
|
|
338
|
+
if (this.selectedDateStart) {
|
|
339
|
+
this.selectedDateInternal = new Date(this.selectedDateStart);
|
|
340
|
+
this.selectedDateCalendar = new Date(this.selectedDateStart);
|
|
341
|
+
}
|
|
342
|
+
setTimeout(() => {
|
|
343
|
+
this.initCalendarValue = false;
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
onEndDateFocus() {
|
|
347
|
+
this.selectedDateFocus = false;
|
|
348
|
+
if (this.selectedDateEnd) {
|
|
349
|
+
this.selectedDateInternal = new Date(this.selectedDateEnd);
|
|
350
|
+
this.selectedDateCalendar = new Date(this.selectedDateEnd);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
applyPeriodPicker() {
|
|
354
|
+
this.hidingConfirmedDate = true;
|
|
355
|
+
this.showDatepicker = false;
|
|
356
|
+
}
|
|
357
|
+
onShowingCalendarPopover() {
|
|
358
|
+
this.hidingConfirmedDate = false;
|
|
359
|
+
if (this.selectionKind == 'single') {
|
|
360
|
+
setTimeout(() => {
|
|
361
|
+
this.singleDatePickerBox?.instance.focus();
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
this.dateStartOld = this.selectedDateStart;
|
|
366
|
+
this.dateEndOld = this.selectedDateEnd;
|
|
367
|
+
this.isSettingNotPreprocessedDate = true;
|
|
368
|
+
setTimeout(() => {
|
|
369
|
+
this.selectedDateStartBox?.instance.focus();
|
|
370
|
+
this.onStartDateFocus();
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
closeDatepickerPopup(emitChange = true) {
|
|
375
|
+
// if (this.showDatepicker) {
|
|
376
|
+
// this.showDatepicker = false;
|
|
377
|
+
if (this.selectionKind == 'single') {
|
|
378
|
+
this.setSelectedDate(this.selectedDateInternal, this.selectedDateInternal, emitChange);
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
if (this.hidingConfirmedDate) {
|
|
382
|
+
this.setSelectedDate(this.selectedDateStart, this.selectedDateEnd, true);
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
// this.setSelectedDate(this.dateStartOld, this.dateEndOld, true);
|
|
386
|
+
this.setSelectedDate(this.dateStartOld, this.dateEndOld, false);
|
|
387
|
+
}
|
|
388
|
+
// this.hidingConfirmedDate = false;
|
|
389
|
+
}
|
|
390
|
+
if (this._selectedDateRangeButton) {
|
|
391
|
+
this._selectedDateRangeButton.nativeElement.focus({ focusVisible: false });
|
|
392
|
+
}
|
|
393
|
+
// }
|
|
394
|
+
}
|
|
395
|
+
onHiddenCalendarPopover() {
|
|
396
|
+
this.closeDatepickerPopup();
|
|
397
|
+
}
|
|
398
|
+
setSelectedDate(dateStart, dateEnd, emitChange = true) {
|
|
399
|
+
this.selectedDateStart = dateStart;
|
|
400
|
+
this.selectedDateEnd = dateEnd;
|
|
401
|
+
this.selectedDateInternal = this.selectionKind === 'single' ? dateStart : dateEnd;
|
|
402
|
+
this.isSelectedPredefinedPeriod = false;
|
|
403
|
+
if (emitChange) {
|
|
404
|
+
if (this.selectionKind == 'single') {
|
|
405
|
+
this.selectedDate = new Date(this.selectedDateInternal);
|
|
406
|
+
this.selectedDateChange.emit(this.selectedDateInternal);
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
const dateStartNew = new Date(this.selectedDateStart);
|
|
410
|
+
const dateEndNew = new Date(this.selectedDateEnd);
|
|
411
|
+
const startDateChanged = (this.dateStartOld instanceof Date && !isSameDay(this.dateStartOld, dateStartNew)) ||
|
|
412
|
+
(typeof this.dateStartOld === 'string' && this.dateStartOld === '');
|
|
413
|
+
const endDateChanged = (this.dateEndOld instanceof Date && !isSameDay(this.dateEndOld, dateEndNew)) ||
|
|
414
|
+
(typeof this.dateEndOld === 'string' && this.dateEndOld === '');
|
|
415
|
+
if (startDateChanged) {
|
|
416
|
+
this.dateStartOld = new Date(this.selectedDateStart);
|
|
417
|
+
this.selectedDateStartChange.emit(this.selectedDateStart);
|
|
418
|
+
}
|
|
419
|
+
if (endDateChanged) {
|
|
420
|
+
this.dateEndOld = new Date(this.selectedDateEnd);
|
|
421
|
+
this.selectedDateEndChange.emit(this.selectedDateEnd);
|
|
422
|
+
}
|
|
423
|
+
if (startDateChanged || endDateChanged) {
|
|
424
|
+
this.periodChange.emit([
|
|
425
|
+
this.selectedDateStart,
|
|
426
|
+
this.selectedDateEnd,
|
|
427
|
+
]);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
if (this.selectedDateStart instanceof Date &&
|
|
431
|
+
this.selectedDateEnd instanceof Date) {
|
|
432
|
+
this.matchDateRange(this.selectedDateStart, this.selectedDateEnd);
|
|
433
|
+
this.setDateRangeText(this.selectedDateStart, this.selectedDateEnd);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
this.changeRef.detectChanges();
|
|
437
|
+
}
|
|
438
|
+
goToNextDate() {
|
|
439
|
+
if (this.selectionKind == 'single') {
|
|
440
|
+
const newDate = this.getNextDateCallback(this.selectedDateInternal);
|
|
441
|
+
this.selectedDateInternal = new Date(newDate);
|
|
442
|
+
this.setSelectedDate(newDate, newDate);
|
|
443
|
+
}
|
|
444
|
+
else {
|
|
445
|
+
if (!(this.selectedDateStart instanceof Date) || !(this.selectedDateEnd instanceof Date)) {
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
const range = this.getNextRangeCallback(this.selectedDateStart, this.selectedDateEnd);
|
|
449
|
+
this.setSelectedDate(range[0], range[1]);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
goToPreviousDate() {
|
|
453
|
+
if (this.selectionKind == 'single') {
|
|
454
|
+
const newDate = this.getPreviousDateCallback(this.selectedDateInternal);
|
|
455
|
+
this.selectedDateInternal = new Date(newDate);
|
|
456
|
+
this.setSelectedDate(newDate, newDate);
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
if (!(this.selectedDateStart instanceof Date) || !(this.selectedDateEnd instanceof Date)) {
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
const range = this.getPreviousRangeCallback(this.selectedDateStart, this.selectedDateEnd);
|
|
463
|
+
this.setSelectedDate(range[0], range[1]);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
// public setNextPreviousDay(setNext: any) {
|
|
467
|
+
// this.isSelectedPredefinedPeriod = true;
|
|
468
|
+
// let newDate = setNext
|
|
469
|
+
// ? add(this.selectedDateInternal as Date, { days: 1 })
|
|
470
|
+
// : add(this.selectedDateInternal as Date, { days: -1 });
|
|
471
|
+
// this.selectedDateInternal = new Date(newDate);
|
|
472
|
+
// this.setSelectedDate(newDate, newDate);
|
|
473
|
+
// }
|
|
474
|
+
getNextDay(currentDate) {
|
|
475
|
+
this.isSelectedPredefinedPeriod = true;
|
|
476
|
+
return add(this.selectedDateInternal, { days: 1 });
|
|
477
|
+
}
|
|
478
|
+
getPreviousDay(currentDate) {
|
|
479
|
+
this.isSelectedPredefinedPeriod = true;
|
|
480
|
+
return add(this.selectedDateInternal, { days: -1 });
|
|
481
|
+
}
|
|
482
|
+
getNextRange(currentStartDate, currentEndDate) {
|
|
483
|
+
this.isSelectedPredefinedPeriod = true;
|
|
484
|
+
return this.datePickerService.getRange(new Date(currentStartDate), new Date(currentEndDate), 'next');
|
|
485
|
+
}
|
|
486
|
+
getPreviousRange(currentStartDate, currentEndDate) {
|
|
487
|
+
this.isSelectedPredefinedPeriod = true;
|
|
488
|
+
return this.datePickerService.getRange(new Date(currentStartDate), new Date(currentEndDate), 'previous');
|
|
489
|
+
}
|
|
490
|
+
setNextPreviousRange(setNext) {
|
|
491
|
+
this.isSelectedPredefinedPeriod = true;
|
|
492
|
+
if (!(this.selectedDateStart instanceof Date) ||
|
|
493
|
+
!(this.selectedDateEnd instanceof Date)) {
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
const range = this.datePickerService.getRange(this.selectedDateStart, this.selectedDateEnd, setNext ? 'next' : 'previous');
|
|
497
|
+
this.setSelectedDate(range[0], range[1]);
|
|
498
|
+
}
|
|
499
|
+
getCellCssClass(date) {
|
|
500
|
+
const calendarDate = new Date(date);
|
|
501
|
+
let css = '';
|
|
502
|
+
if (this.selectionKind == 'period') {
|
|
503
|
+
const selectedDateStartAsDate = new Date(this.selectedDateStart);
|
|
504
|
+
const selectedDateEndAsDate = new Date(this.selectedDateEnd);
|
|
505
|
+
if (isAfter(calendarDate, startOfDay(selectedDateStartAsDate)) &&
|
|
506
|
+
isBefore(calendarDate, startOfDay(selectedDateEndAsDate)) &&
|
|
507
|
+
!this.disabledDates.some((day) => isSameDay(calendarDate, day))) {
|
|
508
|
+
css += ' bg-primary-light text-dark rounded-0';
|
|
509
|
+
}
|
|
510
|
+
else {
|
|
511
|
+
if (isSameDay(calendarDate, selectedDateStartAsDate)) {
|
|
512
|
+
css += ' bg-primary text-white rounded-start';
|
|
513
|
+
}
|
|
514
|
+
if (isSameDay(calendarDate, selectedDateEndAsDate)) {
|
|
515
|
+
css += ' bg-primary text-white rounded-end';
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
return css;
|
|
520
|
+
}
|
|
521
|
+
selectEndDate(event) {
|
|
522
|
+
if (this.selectionKind == "period" && this.selectedDateStartFocus && this.calendarCellClicked(event)) {
|
|
523
|
+
this.selectedDateFocus = false;
|
|
524
|
+
this.selectedDateCalendar = new Date(this.selectedDateEnd);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
onKeydown(event) {
|
|
528
|
+
if (this.showDatepicker) {
|
|
529
|
+
if (event.code === 'Escape') {
|
|
530
|
+
this.showDatepicker = false;
|
|
531
|
+
event.stopImmediatePropagation();
|
|
532
|
+
}
|
|
533
|
+
else if (event.code === 'Enter' || event.code === 'NumpadEnter') {
|
|
534
|
+
if (!this.disabled) {
|
|
535
|
+
this.applyPeriodPicker();
|
|
536
|
+
}
|
|
537
|
+
event.stopImmediatePropagation();
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
calendarCellClicked(event) {
|
|
542
|
+
// This check is tightly coupled with current DX implementation so it
|
|
543
|
+
// must be re-checked after each major update of the DX components
|
|
544
|
+
// Also check if dx-calendar provides info about clicked element by
|
|
545
|
+
// design.
|
|
546
|
+
const targetParentClassList = event.target?.offsetParent?.classList;
|
|
547
|
+
if (!targetParentClassList) {
|
|
548
|
+
return false;
|
|
549
|
+
}
|
|
550
|
+
const isCalendarCell = [...targetParentClassList].includes('dx-calendar-cell');
|
|
551
|
+
return isCalendarCell;
|
|
552
|
+
}
|
|
553
|
+
handleLocalesChange() {
|
|
554
|
+
// apply new locale to DX
|
|
555
|
+
// if array of locales was provided use first one
|
|
556
|
+
if (typeof this.locales === 'string') {
|
|
557
|
+
locale(this.locales);
|
|
558
|
+
}
|
|
559
|
+
else if (Array.isArray(this.locales) && this.locales.length > 0) {
|
|
560
|
+
locale(this.locales[0]);
|
|
561
|
+
}
|
|
562
|
+
;
|
|
563
|
+
this.selectedDateStartBox?.instance.repaint();
|
|
564
|
+
this.selectedDateEndBox?.instance.repaint();
|
|
565
|
+
this.singleDatePickerBox?.instance.repaint();
|
|
566
|
+
this.calendar?.instance.repaint();
|
|
567
|
+
this.setSelectedDateRangeText();
|
|
568
|
+
}
|
|
569
|
+
updateCustomText() {
|
|
570
|
+
this.customDateRange.name = this.translations?.custom
|
|
571
|
+
? this.translations.custom
|
|
572
|
+
: '';
|
|
573
|
+
}
|
|
574
|
+
removeDxDefaultCalendarFocus() {
|
|
575
|
+
const element = document.querySelector('#datepickercomponent .dx-calendar-selected-date');
|
|
576
|
+
if (element &&
|
|
577
|
+
element?.classList?.contains('dx-calendar-selected-date')) {
|
|
578
|
+
element?.classList?.remove('dx-calendar-selected-date');
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
setSelectedDateRangeText() {
|
|
582
|
+
if (this.selectionKind == 'single') {
|
|
583
|
+
this.matchDateRange(new Date(this.selectedDateInternal), new Date(this.selectedDateInternal));
|
|
584
|
+
this.setDateRangeText(new Date(this.selectedDateInternal), new Date(this.selectedDateInternal));
|
|
585
|
+
}
|
|
586
|
+
else {
|
|
587
|
+
this.matchDateRange(new Date(this.selectedDateStart), new Date(this.selectedDateEnd));
|
|
588
|
+
this.setDateRangeText(new Date(this.selectedDateStart), new Date(this.selectedDateEnd));
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
toggleDateRangeSelectorVisibility() {
|
|
592
|
+
if (!this.showPredefinedOptionsSelector) {
|
|
593
|
+
this.generateDateRanges();
|
|
594
|
+
}
|
|
595
|
+
this.showPredefinedOptionsSelector =
|
|
596
|
+
!this.showPredefinedOptionsSelector;
|
|
597
|
+
}
|
|
598
|
+
changDateRange(range) {
|
|
599
|
+
this.showPredefinedOptionsSelector = false;
|
|
600
|
+
this.showDatepicker = false;
|
|
601
|
+
this.selectedDateRange = range;
|
|
602
|
+
if (range === this.customDateRange) {
|
|
603
|
+
// this.openDatepickerPopup();
|
|
604
|
+
this.showDatepicker = true;
|
|
605
|
+
}
|
|
606
|
+
else {
|
|
607
|
+
this.dateStart = range.dateFrom
|
|
608
|
+
? range.dateFrom
|
|
609
|
+
: startOfDay(new Date());
|
|
610
|
+
this.dateEnd = range.dateTo ? range.dateTo : startOfDay(new Date());
|
|
611
|
+
this.setSelectedDate(this.dateStart, this.dateEnd, true);
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
matchDateRange(dateFrom, dateTo) {
|
|
615
|
+
if (!dateFrom || !dateTo) {
|
|
616
|
+
this.selectedDateRange = this.customDateRange;
|
|
617
|
+
return;
|
|
618
|
+
}
|
|
619
|
+
this.generateDateRanges();
|
|
620
|
+
const dateRange = this.predefinedDateRanges.filter((x) => isSameDay(x.dateFrom, dateFrom) &&
|
|
621
|
+
isSameDay(x.dateTo, dateTo));
|
|
622
|
+
if (dateRange.length) {
|
|
623
|
+
this.selectedDateRange = dateRange[0];
|
|
624
|
+
}
|
|
625
|
+
else {
|
|
626
|
+
this.selectedDateRange = this.customDateRange;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
setDateRangeText(dateFrom, dateTo) {
|
|
630
|
+
const today = new Date();
|
|
631
|
+
this.selectedDateRangeName = '';
|
|
632
|
+
this.selectedDateRangeTextSegment1 = '';
|
|
633
|
+
this.selectedDateRangeTextSegment2 = '';
|
|
634
|
+
if (!(dateFrom instanceof Date) || !(dateTo instanceof Date)) {
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
637
|
+
// RESOLVE PERIOD
|
|
638
|
+
// one day
|
|
639
|
+
if (isSameDay(dateFrom, dateTo)) {
|
|
640
|
+
if (typeof this.singleDayFormatFn !== 'undefined') {
|
|
641
|
+
this.selectedDateRangeTextSegment1 = this.singleDayFormatFn(dateFrom);
|
|
642
|
+
}
|
|
643
|
+
else {
|
|
644
|
+
if (this.style == 'compact' && this.compactStyleDisplay == 'both' && this.selectedDateRange && this.selectedDateRange != this.customDateRange) {
|
|
645
|
+
this.selectedDateRangeTextSegment1 = this.formatDate(dateFrom); //skip day name, as we have custom text.
|
|
646
|
+
}
|
|
647
|
+
else {
|
|
648
|
+
this.selectedDateRangeTextSegment1 = this.formatDate(dateFrom, 'day-long');
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
// date range
|
|
653
|
+
else {
|
|
654
|
+
// date range - use provided dateRange format function (if defined)
|
|
655
|
+
if (typeof this.dateRangeFormatFn !== 'undefined') {
|
|
656
|
+
this.selectedDateRangeTextSegment1 = this.dateRangeFormatFn(dateFrom);
|
|
657
|
+
this.selectedDateRangeTextSegment2 = this.dateRangeFormatFn(dateTo);
|
|
658
|
+
}
|
|
659
|
+
// full month
|
|
660
|
+
else if (isSameDay(dateFrom, startOfMonth(dateFrom)) &&
|
|
661
|
+
isSameDay(dateTo, endOfMonth(dateTo)) &&
|
|
662
|
+
isSameMonth(dateFrom, dateTo)) {
|
|
663
|
+
this.selectedDateRangeTextSegment1 = this.formatDate(dateFrom, 'month');
|
|
664
|
+
}
|
|
665
|
+
// date range - use default date format function
|
|
666
|
+
else {
|
|
667
|
+
this.selectedDateRangeTextSegment1 = this.formatDate(dateFrom, isSameYear(dateFrom, today) ? 'day-short' : 'day');
|
|
668
|
+
this.selectedDateRangeTextSegment2 = this.formatDate(dateTo, isSameYear(dateTo, today) ? 'day-short' : 'day');
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
if (this.style == 'compact' && this.selectedDateRange && this.selectedDateRange != this.customDateRange) {
|
|
672
|
+
if (this.compactStyleDisplay == 'predefinedRange') {
|
|
673
|
+
this.selectedDateRangeName = this.selectedDateRange.name;
|
|
674
|
+
this.selectedDateRangeTextSegment1 = '';
|
|
675
|
+
this.selectedDateRangeTextSegment2 = '';
|
|
676
|
+
}
|
|
677
|
+
if (this.compactStyleDisplay == 'both') {
|
|
678
|
+
this.selectedDateRangeName = this.selectedDateRange.name + ', ';
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
// @Input() public style: 'classic' | 'compact' = 'classic';
|
|
682
|
+
// @Input() public compactStyleDisplay: 'date' | 'predefinedRange' | 'both' = 'predefinedRange';
|
|
683
|
+
// if (this.style == 'compact' && this.compactStyleDisplay == 'predefinedRange' && this.selectedDateRange && this.selectedDateRange != this.customDateRange) {
|
|
684
|
+
// this.selectedDateRangeTextSegment1 = this.selectedDateRange.name;
|
|
685
|
+
// this.selectedDateRangeTextSegment2 = '';
|
|
686
|
+
// return;
|
|
687
|
+
// }
|
|
688
|
+
// if (this.style == 'compact' && this.compactStyleDisplay == 'both' && this.selectedDateRange && this.selectedDateRange != this.customDateRange) {
|
|
689
|
+
// this.selectedDateRangeTextSegment1 = this.selectedDateRange.name;
|
|
690
|
+
// this.selectedDateRangeTextSegment2 = '';
|
|
691
|
+
// return;
|
|
692
|
+
// }
|
|
693
|
+
}
|
|
694
|
+
formatDate(date, type) {
|
|
695
|
+
switch (type) {
|
|
696
|
+
case 'month':
|
|
697
|
+
return date.toLocaleDateString(this.locales, {
|
|
698
|
+
month: 'long',
|
|
699
|
+
year: 'numeric',
|
|
700
|
+
day: undefined,
|
|
701
|
+
});
|
|
702
|
+
case 'day-long':
|
|
703
|
+
return date.toLocaleDateString(this.locales, {
|
|
704
|
+
day: 'numeric',
|
|
705
|
+
month: 'numeric',
|
|
706
|
+
year: 'numeric',
|
|
707
|
+
weekday: 'long',
|
|
708
|
+
});
|
|
709
|
+
case 'day-short':
|
|
710
|
+
return date.toLocaleDateString(this.locales, {
|
|
711
|
+
day: 'numeric',
|
|
712
|
+
month: 'short',
|
|
713
|
+
});
|
|
714
|
+
case 'day':
|
|
715
|
+
return date.toLocaleDateString(this.locales, {
|
|
716
|
+
day: 'numeric',
|
|
717
|
+
month: 'short',
|
|
718
|
+
year: 'numeric',
|
|
719
|
+
});
|
|
720
|
+
default:
|
|
721
|
+
return date.toLocaleDateString(this.locales, {
|
|
722
|
+
day: 'numeric',
|
|
723
|
+
month: 'numeric',
|
|
724
|
+
year: 'numeric',
|
|
725
|
+
});
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
generateDateRanges(force) {
|
|
729
|
+
const today = startOfDay(new Date());
|
|
730
|
+
if (force ||
|
|
731
|
+
!this.predefinedDateRangesGeneratedDate ||
|
|
732
|
+
!isSameDay(this.predefinedDateRangesGeneratedDate, today)) {
|
|
733
|
+
this.predefinedDateRangesGeneratedDate = today;
|
|
734
|
+
this.predefinedDateRanges =
|
|
735
|
+
this.datePickerService.getPredefinedDateRanges(this.dateRangeDefinitions, today, this.firstDayOfWeek);
|
|
736
|
+
this.dateRanges = [...this.predefinedDateRanges];
|
|
737
|
+
this.dateRanges.push(this.customDateRange);
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SdsDatePickerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SdsDatePickerService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
741
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SdsDatePickerComponent, isStandalone: true, selector: "sds-date-picker", inputs: { selectionKind: "selectionKind", dateRangeDefinitions: "dateRangeDefinitions", selectedDate: "selectedDate", selectedDateStart: "selectedDateStart", singleDayFormatFn: "singleDayFormatFn", dateRangeFormatFn: "dateRangeFormatFn", selectedDateEnd: "selectedDateEnd", minDate: "minDate", maxDate: "maxDate", locales: "locales", disabled: "disabled", validationError: "validationError", isValid: "isValid", disabledDates: "disabledDates", applyText: "applyText", cancelText: "cancelText", translations: "translations", firstDayOfWeek: "firstDayOfWeek", dateRangeDefinitionsWidth: "dateRangeDefinitionsWidth", showPreviousAndNextButtons: "showPreviousAndNextButtons", width: "width", dropdownWrapperClass: "dropdownWrapperClass", dropdownWrapperId: "dropdownWrapperId", getPreviousDateCallback: "getPreviousDateCallback", getNextDateCallback: "getNextDateCallback", getPreviousRangeCallback: "getPreviousRangeCallback", getNextRangeCallback: "getNextRangeCallback", useCustomDisplayContent: "useCustomDisplayContent", displayPredefinedDateRangeName: "displayPredefinedDateRangeName", style: "style", compactStyleDisplay: "compactStyleDisplay", dateInputDisplayFormat: "dateInputDisplayFormat", componentAriaLabel: "componentAriaLabel", openDateRangeDefinitionsAriaLabel: "openDateRangeDefinitionsAriaLabel", nextPeriodAriaLabel: "nextPeriodAriaLabel", previousPeriodAriaLabel: "previousPeriodAriaLabel", lockBeforeDate: "lockBeforeDate", lockBeforeDateHint: "lockBeforeDateHint" }, outputs: { selectedDateChange: "selectedDateChange", selectedDateStartChange: "selectedDateStartChange", selectedDateEndChange: "selectedDateEndChange", periodChange: "periodChange" }, queries: [{ propertyName: "displayContent", first: true, predicate: ["display"], descendants: true }], viewQueries: [{ propertyName: "singleDatePickerBox", first: true, predicate: ["singleDatePickerBox"], descendants: true }, { propertyName: "selectedDateStartBox", first: true, predicate: ["selectedDateStartBox"], descendants: true }, { propertyName: "selectedDateEndBox", first: true, predicate: ["selectedDateEndBox"], descendants: true }, { propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }, { propertyName: "_selectedDateRangeButton", first: true, predicate: ["selectedDateRangeButton"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<!-- <div id=\"datepickerbuttons\"> -->\r\n <div\r\n class=\"datepicker d-inline-flex bg-white sds-no-print\"\r\n role=\"group\"\r\n [attr.aria-label]=\"componentAriaLabel\"\r\n [style.width]=\"width\"\r\n >\r\n\r\n <ng-container *ngIf=\"style == 'classic'\">\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n >\r\n <button\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n id=\"pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n type=\"button\"\r\n class=\"\r\n btn btn-white\r\n border\r\n rounded-start\r\n border-end\r\n p-0\r\n sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n [style.width]=\"dateRangeDefinitionsWidth\"\r\n (click)=\"toggleDateRangeSelectorVisibility()\"\r\n >\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"ps-2 ms-1 me-1 date-range-text text-truncate\">\r\n {{selectedDateRange.name}}\r\n </div>\r\n <button type=\"button\" class=\"btn btn-light date-range-dropdown-button sds-fw-400\" [attr.aria-label]=\"openDateRangeDefinitionsAriaLabel\"\r\n [attr.aria-controls]=\"elementUUID + '_predefined_periods_dropdown'\">\r\n <span class=\"dropdown-toggle\"></span>\r\n </button>\r\n </div>\r\n\r\n </button>\r\n\r\n <dx-popover\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n [id]=\"elementUUID + '_predefined_periods_dropdown'\"\r\n target=\"#pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showPredefinedOptionsSelector\"\r\n [wrapperAttr]=\"{ class: 'sds-datepicker-ranges-popover sds-dx-popup-no-arrow' }\"\r\n [minWidth]=\"dateRangeDefinitionsWidth\"\r\n\r\n >\r\n <div *dxTemplate=\"let data of 'content'\" cdkTrapFocus>\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n role=\"button\"\r\n tabindex=\"0\"\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n (keydown)=\"onRangeKeyReleased($event, range)\"\r\n >\r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n </dx-popover>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <button\r\n *ngIf=\"showPreviousAndNextButtons\"\r\n class=\"btn btn-white border border-end-0 pe-2 sds-fw-400\"\r\n [class.rounded-start] = \"style == 'compact' || (!dateRangeDefinitions || dateRangeDefinitions.length === 0)\"\r\n [class.border-start-0] = \"style == 'classic' && dateRangeDefinitions.length > 0\"\r\n type=\"button\"\r\n [attr.aria-label]=\"previousPeriodAriaLabel\"\r\n [disabled]=\"isMinimumLimit || disabled\"\r\n (click)=\"goToPreviousDate()\"\r\n >\r\n <fa-icon [icon]=\"previousPeriodIcon\"></fa-icon>\r\n\r\n </button>\r\n\r\n <button\r\n #selectedDateRangeButton\r\n id=\"pickerDropdown{{ randomIdReference }}\"\r\n class=\"btn btn-white border-top border-bottom text-truncate px-0 selected-period sds-fw-400\"\r\n [class.rounded-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\r\n [class.border-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\r\n [class.rounded-end] = \"!showPreviousAndNextButtons\"\r\n [class.border-end] = \"!showPreviousAndNextButtons\"\r\n [disabled]=\"disabled\"\r\n type=\"button\"\r\n (click)=\"showDatepicker = !showDatepicker\"\r\n >\r\n\r\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\r\n <div *ngIf=\"!useCustomDisplayContent\"\r\n class=\"d-flex justify-content-center align-items-center\">\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeName}}</span>\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </button>\r\n\r\n <button\r\n *ngIf=\"showPreviousAndNextButtons\"\r\n class=\"btn btn-white border rounded-end border-start-0 ps-2 sds-fw-400\"\r\n type=\"button\"\r\n [attr.aria-label]=\"nextPeriodAriaLabel\"\r\n [disabled]=\"isMaximumLimit || disabled\"\r\n (click)=\"goToNextDate()\"\r\n >\r\n <fa-icon [icon]=\"nextPeriodIcon\"></fa-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"sds-print-only h-100\">\r\n\r\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\r\n <div *ngIf=\"!useCustomDisplayContent\"\r\n class=\"d-flex justify-content-center align-items-center\">\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n<dx-popover\r\n target=\"#pickerDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showDatepicker\"\r\n (onHiding)=\"onHiddenCalendarPopover()\"\r\n (onShowing)=\"onShowingCalendarPopover()\"\r\n class=\"m-0 p-0\"\r\n [wrapperAttr]=\"{\r\n class: 'sds-datepicker-popover ' + dropdownWrapperClass,\r\n id: dropdownWrapperId\r\n }\"\r\n>\r\n <dxo-animation>\r\n <dxo-show\r\n type=\"pop\"\r\n [from]=\"{ scale: 0.9 }\"\r\n [to]=\"{ scale: 1 }\"\r\n ></dxo-show>\r\n <dxo-hide\r\n type=\"fade\"\r\n [from]=\"1\"\r\n [to]=\"0\"\r\n ></dxo-hide>\r\n </dxo-animation>\r\n <div *dxTemplate=\"let data of 'content'\" (keydown)=\"onKeydown($event)\" tabindex=\"1\">\r\n <dx-scroll-view>\r\n <div class=\"d-flex flex-row\">\r\n\r\n <div\r\n *ngIf=\"style == 'compact' && dateRanges.length > 1\"\r\n class=\"d-flex flex-column p-3 bg-gray-100\"\r\n style=\"border-right: 1px solid var(--bs-gray-200)\"\r\n >\r\n <div\r\n *ngIf=\"translations.presets\" class=\"px-3 py-2\">\r\n <label>{{ translations.presets }}</label>\r\n </div>\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n >\r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div id=\"datepickercomponent\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center px-3 pt-3 pb-2\"\r\n >\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <dx-date-box\r\n #selectedDateStartBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\r\n [class.activeInput]=\"selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"selectedDateStart\"\r\n (onValueChanged)=\"onStartDateChange($event)\"\r\n (onFocusIn)=\"onStartDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center px-2\">\r\n <fa-icon [icon]=\"toIcon\"></fa-icon>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #selectedDateEndBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\r\n [class.activeInput]=\"!selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"selectedDateEnd\"\r\n (onValueChanged)=\"onEndDateChange($event)\"\r\n (onFocusIn)=\"onEndDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n </div>\r\n\r\n <div class=\"bg-white mx-2 px-2 py-2 date-picker-date-selection\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'single'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2\"\r\n >\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #singleDatePickerBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input datepicker-input-large\"\r\n [class.activeInput]=\"true\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateInternal\"\r\n >\r\n </dx-date-box>\r\n <!-- (onValueChanged)=\" closeDatepickerPopup()\" -->\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"d-flex justify-content-center align-items-center\"\r\n (click)=\"selectEndDate($event)\">\r\n\r\n <dx-calendar\r\n #calendar\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [disabledDates]=\"isDateDisabled\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"this.selectionKind == 'period' ? selectedDateCalendar : selectedDateInternal\"\r\n (onValueChanged)=\"onDateChange($event)\"\r\n [firstDayOfWeek]=\"firstDayOfWeek\"\r\n >\r\n <div\r\n *dxTemplate=\"let cellData of 'cell'\"\r\n [class]=\"'h-100 pt-1' + getCellCssClass(cellData.date)\"\r\n [style.line-height.px]=\"23\"\r\n\r\n >\r\n\r\n <div *ngIf=\"lockBeforeDate && (cellData.date | sdsDateCompare: lockBeforeDate : 'lte'); then thenLockBlock else elseDefaultBlock\"></div>\r\n <ng-template #thenLockBlock>\r\n <fa-icon [title]=\"lockBeforeDateHint\" [icon]=\"lockIcon\" class=\"locked-day position-absolute-x\"></fa-icon>\r\n </ng-template>\r\n <ng-template #elseDefaultBlock>\r\n {{ cellData.text }}\r\n </ng-template>\r\n </div>\r\n </dx-calendar>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n class=\"d-flex justify-content-end align-items-center px-3 pt-2 pb-3\"\r\n >\r\n <button\r\n class=\"btn btn-secondary sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n (click)=\"showDatepicker = false\"\r\n type=\"button\"\r\n >\r\n {{ translations.cancel}}\r\n </button>\r\n <!-- (click)=\"closeDatepickerPopup()\" -->\r\n <button\r\n class=\"btn btn-primary ms-1 sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n (click)=\"applyPeriodPicker()\"\r\n type=\"button\"\r\n >\r\n {{ translations.apply}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n</dx-popover>\r\n<!-- </div> -->\r\n\r\n", styles: ["#datepickercomponent .datepicker-input{width:125px}#datepickercomponent .datepicker-input-large{width:250px!important}#datepickercomponent .datepicker-input.activeInput{border-color:#2886b1!important;border-width:2px!important}#datepickercomponent ::ng-deep .dx-calendar-cell{padding:inherit!important}#datepickercomponent ::ng-deep .dx-calendar-cell.dx-calendar-other-month{opacity:.5!important}#datepickercomponent .timebox-fixed-width{width:80px}#datepickercomponent ::ng-deep .text-center .dx-texteditor-input{text-align:center!important}#datepickercomponent ::ng-deep .p-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickercomponent ::ng-deep .px-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}.datepicker{display:inline-flex}.datepicker .border,.datepicker .border-bottom,.datepicker .border-top,.datepicker .border-left,.datepicker .border-right{border-color:var(--bs-gray-400)!important}.datepicker>button{border-radius:0;border-left:none;border-right:none}.datepicker .preselect-options-fixed-width{width:150px}.datepicker .selected-period{flex:1 1 auto}.datepicker .date-range-dropdown-button{box-shadow:none!important;border:1px solid white;flex:0;padding-top:.3rem!important;padding-bottom:.3rem!important}.datepicker .date-range-text{flex:1;min-width:0;text-align:start}.predefined-date-range{cursor:pointer;font-size:1rem;line-height:1.5rem;min-width:10rem;border-radius:2px}.predefined-date-range:hover{background-color:#0000000a}.predefined-date-range:active{color:#fff;background-color:#3b8fc2}.predefined-date-range.selected:not(:active){background-color:#e6e6e6}::ng-deep .sds-datepicker-popover.dx-popover-wrapper .dx-popup-content{padding:0}::ng-deep .sds-datepicker-ranges-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-datepicker-ranges-popover .dropdown-item:focus{outline:none}::ng-deep .sds-datepicker-ranges-popover .dropdown-item .selected{background-color:var(--bs-gray-300)}::ng-deep .sds-datepicker-popover .date-picker-date-selection dx-calendar .dx-calendar-cell.dx-calendar-empty-cell:has(fa-icon.locked-day){background:initial!important}\n"], dependencies: [{ kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: SdsDateComparePipe, name: "sdsDateCompare" }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i2.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "ngmodule", type: DxPopoverModule }, { kind: "component", type: i3.DxPopoverComponent, selector: "dx-popover", inputs: ["animation", "closeOnOutsideClick", "container", "contentTemplate", "deferRendering", "disabled", "enableBodyScroll", "height", "hideEvent", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showEvent", "showTitle", "target", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onShowing", "onShown", "onTitleRendered", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "deferRenderingChange", "disabledChange", "enableBodyScrollChange", "heightChange", "hideEventChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showEventChange", "showTitleChange", "targetChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { kind: "component", type: i4.DxoAnimationComponent, selector: "dxo-animation", inputs: ["hide", "show", "duration", "easing", "enabled", "maxPointCountSupported", "complete", "delay", "direction", "from", "staggerDelay", "start", "to", "type"] }, { kind: "component", type: i4.DxoHideComponent, selector: "dxo-hide", inputs: ["complete", "delay", "direction", "duration", "easing", "from", "staggerDelay", "start", "to", "type"] }, { kind: "component", type: i4.DxoShowComponent, selector: "dxo-show", inputs: ["complete", "delay", "direction", "duration", "easing", "from", "staggerDelay", "start", "to", "type"] }, { kind: "directive", type: i5.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "ngmodule", type: DxTemplateModule }, { kind: "ngmodule", type: DxoAnimationModule }, { kind: "ngmodule", type: DxoShowModule }, { kind: "ngmodule", type: DxoHideModule }, { kind: "ngmodule", type: DxScrollViewModule }, { kind: "component", type: i6.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }, { kind: "ngmodule", type: DxDateBoxModule }, { kind: "component", type: i7.DxDateBoxComponent, selector: "dx-date-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "adaptivityEnabled", "applyButtonText", "applyValueMode", "buttons", "calendarOptions", "cancelButtonText", "dateOutOfRangeMessage", "dateSerializationFormat", "deferRendering", "disabled", "disabledDates", "displayFormat", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "interval", "invalidDateMessage", "isDirty", "isValid", "label", "labelMode", "max", "maxLength", "min", "name", "opened", "openOnFieldClick", "pickerType", "placeholder", "readOnly", "rtlEnabled", "showAnalogClock", "showClearButton", "showDropDownButton", "spellcheck", "stylingMode", "tabIndex", "text", "todayButtonText", "type", "useMaskBehavior", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "adaptivityEnabledChange", "applyButtonTextChange", "applyValueModeChange", "buttonsChange", "calendarOptionsChange", "cancelButtonTextChange", "dateOutOfRangeMessageChange", "dateSerializationFormatChange", "deferRenderingChange", "disabledChange", "disabledDatesChange", "displayFormatChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "intervalChange", "invalidDateMessageChange", "isDirtyChange", "isValidChange", "labelChange", "labelModeChange", "maxChange", "maxLengthChange", "minChange", "nameChange", "openedChange", "openOnFieldClickChange", "pickerTypeChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showAnalogClockChange", "showClearButtonChange", "showDropDownButtonChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "todayButtonTextChange", "typeChange", "useMaskBehaviorChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "ngmodule", type: DxCalendarModule }, { kind: "component", type: i7.DxCalendarComponent, selector: "dx-calendar", inputs: ["accessKey", "activeStateEnabled", "cellTemplate", "dateSerializationFormat", "disabled", "disabledDates", "elementAttr", "firstDayOfWeek", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "isDirty", "isValid", "max", "maxZoomLevel", "min", "minZoomLevel", "name", "readOnly", "rtlEnabled", "selectionMode", "selectWeekOnClick", "showTodayButton", "showWeekNumbers", "tabIndex", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "visible", "weekNumberRule", "width", "zoomLevel"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "cellTemplateChange", "dateSerializationFormatChange", "disabledChange", "disabledDatesChange", "elementAttrChange", "firstDayOfWeekChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "isDirtyChange", "isValidChange", "maxChange", "maxZoomLevelChange", "minChange", "minZoomLevelChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "selectionModeChange", "selectWeekOnClickChange", "showTodayButtonChange", "showWeekNumbersChange", "tabIndexChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "visibleChange", "weekNumberRuleChange", "widthChange", "zoomLevelChange", "onBlur"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
742
|
+
}
|
|
743
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SdsDatePickerComponent, decorators: [{
|
|
744
|
+
type: Component,
|
|
745
|
+
args: [{ selector: 'sds-date-picker', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
|
|
746
|
+
NgFor,
|
|
747
|
+
NgIf,
|
|
748
|
+
SdsDateComparePipe,
|
|
749
|
+
CdkTrapFocus,
|
|
750
|
+
FontAwesomeModule,
|
|
751
|
+
DxPopoverModule,
|
|
752
|
+
DxTemplateModule,
|
|
753
|
+
DxoAnimationModule,
|
|
754
|
+
DxoShowModule,
|
|
755
|
+
DxoHideModule,
|
|
756
|
+
DxScrollViewModule,
|
|
757
|
+
DxDateBoxModule,
|
|
758
|
+
DxCalendarModule,
|
|
759
|
+
], template: "<!-- <div id=\"datepickerbuttons\"> -->\r\n <div\r\n class=\"datepicker d-inline-flex bg-white sds-no-print\"\r\n role=\"group\"\r\n [attr.aria-label]=\"componentAriaLabel\"\r\n [style.width]=\"width\"\r\n >\r\n\r\n <ng-container *ngIf=\"style == 'classic'\">\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n >\r\n <button\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n id=\"pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n type=\"button\"\r\n class=\"\r\n btn btn-white\r\n border\r\n rounded-start\r\n border-end\r\n p-0\r\n sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n [style.width]=\"dateRangeDefinitionsWidth\"\r\n (click)=\"toggleDateRangeSelectorVisibility()\"\r\n >\r\n <div class=\"d-flex align-items-center\">\r\n <div class=\"ps-2 ms-1 me-1 date-range-text text-truncate\">\r\n {{selectedDateRange.name}}\r\n </div>\r\n <button type=\"button\" class=\"btn btn-light date-range-dropdown-button sds-fw-400\" [attr.aria-label]=\"openDateRangeDefinitionsAriaLabel\"\r\n [attr.aria-controls]=\"elementUUID + '_predefined_periods_dropdown'\">\r\n <span class=\"dropdown-toggle\"></span>\r\n </button>\r\n </div>\r\n\r\n </button>\r\n\r\n <dx-popover\r\n *ngIf=\"dateRangeDefinitions && dateRangeDefinitions.length > 0\"\r\n [id]=\"elementUUID + '_predefined_periods_dropdown'\"\r\n target=\"#pickerPredefinedRangeDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showPredefinedOptionsSelector\"\r\n [wrapperAttr]=\"{ class: 'sds-datepicker-ranges-popover sds-dx-popup-no-arrow' }\"\r\n [minWidth]=\"dateRangeDefinitionsWidth\"\r\n\r\n >\r\n <div *dxTemplate=\"let data of 'content'\" cdkTrapFocus>\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n role=\"button\"\r\n tabindex=\"0\"\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n (keydown)=\"onRangeKeyReleased($event, range)\"\r\n >\r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n </dx-popover>\r\n </div>\r\n </ng-container>\r\n\r\n\r\n <button\r\n *ngIf=\"showPreviousAndNextButtons\"\r\n class=\"btn btn-white border border-end-0 pe-2 sds-fw-400\"\r\n [class.rounded-start] = \"style == 'compact' || (!dateRangeDefinitions || dateRangeDefinitions.length === 0)\"\r\n [class.border-start-0] = \"style == 'classic' && dateRangeDefinitions.length > 0\"\r\n type=\"button\"\r\n [attr.aria-label]=\"previousPeriodAriaLabel\"\r\n [disabled]=\"isMinimumLimit || disabled\"\r\n (click)=\"goToPreviousDate()\"\r\n >\r\n <fa-icon [icon]=\"previousPeriodIcon\"></fa-icon>\r\n\r\n </button>\r\n\r\n <button\r\n #selectedDateRangeButton\r\n id=\"pickerDropdown{{ randomIdReference }}\"\r\n class=\"btn btn-white border-top border-bottom text-truncate px-0 selected-period sds-fw-400\"\r\n [class.rounded-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\r\n [class.border-start] = \"(!dateRangeDefinitions || dateRangeDefinitions.length === 0) && !showPreviousAndNextButtons\"\r\n [class.rounded-end] = \"!showPreviousAndNextButtons\"\r\n [class.border-end] = \"!showPreviousAndNextButtons\"\r\n [disabled]=\"disabled\"\r\n type=\"button\"\r\n (click)=\"showDatepicker = !showDatepicker\"\r\n >\r\n\r\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\r\n <div *ngIf=\"!useCustomDisplayContent\"\r\n class=\"d-flex justify-content-center align-items-center\">\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeName}}</span>\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </button>\r\n\r\n <button\r\n *ngIf=\"showPreviousAndNextButtons\"\r\n class=\"btn btn-white border rounded-end border-start-0 ps-2 sds-fw-400\"\r\n type=\"button\"\r\n [attr.aria-label]=\"nextPeriodAriaLabel\"\r\n [disabled]=\"isMaximumLimit || disabled\"\r\n (click)=\"goToNextDate()\"\r\n >\r\n <fa-icon [icon]=\"nextPeriodIcon\"></fa-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"sds-print-only h-100\">\r\n\r\n <ng-content *ngIf=\"useCustomDisplayContent\" select=\"display\"></ng-content>\r\n <div *ngIf=\"!useCustomDisplayContent\"\r\n class=\"d-flex justify-content-center align-items-center\">\r\n <!-- <div class=\"mx-1\">\r\n <fa-icon [icon]=\"calendarIcon\" size=\"sm\"></fa-icon>\r\n </div> -->\r\n <div class=\"mx-1 text-truncate\">\r\n <span>{{selectedDateRangeTextSegment1}}</span>\r\n <fa-icon\r\n *ngIf=\"selectedDateRangeTextSegment2\"\r\n class=\"mx-2\"\r\n [icon]=\"toIcon\"\r\n size=\"sm\"\r\n ></fa-icon>\r\n <span>{{selectedDateRangeTextSegment2}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n<dx-popover\r\n target=\"#pickerDropdown{{ randomIdReference }}\"\r\n position=\"bottom\"\r\n [(visible)]=\"showDatepicker\"\r\n (onHiding)=\"onHiddenCalendarPopover()\"\r\n (onShowing)=\"onShowingCalendarPopover()\"\r\n class=\"m-0 p-0\"\r\n [wrapperAttr]=\"{\r\n class: 'sds-datepicker-popover ' + dropdownWrapperClass,\r\n id: dropdownWrapperId\r\n }\"\r\n>\r\n <dxo-animation>\r\n <dxo-show\r\n type=\"pop\"\r\n [from]=\"{ scale: 0.9 }\"\r\n [to]=\"{ scale: 1 }\"\r\n ></dxo-show>\r\n <dxo-hide\r\n type=\"fade\"\r\n [from]=\"1\"\r\n [to]=\"0\"\r\n ></dxo-hide>\r\n </dxo-animation>\r\n <div *dxTemplate=\"let data of 'content'\" (keydown)=\"onKeydown($event)\" tabindex=\"1\">\r\n <dx-scroll-view>\r\n <div class=\"d-flex flex-row\">\r\n\r\n <div\r\n *ngIf=\"style == 'compact' && dateRanges.length > 1\"\r\n class=\"d-flex flex-column p-3 bg-gray-100\"\r\n style=\"border-right: 1px solid var(--bs-gray-200)\"\r\n >\r\n <div\r\n *ngIf=\"translations.presets\" class=\"px-3 py-2\">\r\n <label>{{ translations.presets }}</label>\r\n </div>\r\n <div *ngFor=\"let range of dateRanges\">\r\n <div\r\n class=\"predefined-date-range px-3 py-2 w-100\"\r\n [class.selected]=\"range === selectedDateRange\"\r\n (click)=\"changDateRange(range)\"\r\n >\r\n {{range.name}}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <div id=\"datepickercomponent\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center px-3 pt-3 pb-2\"\r\n >\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <dx-date-box\r\n #selectedDateStartBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\r\n [class.activeInput]=\"selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"selectedDateStart\"\r\n (onValueChanged)=\"onStartDateChange($event)\"\r\n (onFocusIn)=\"onStartDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center px-2\">\r\n <fa-icon [icon]=\"toIcon\"></fa-icon>\r\n </div>\r\n\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #selectedDateEndBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input\"\r\n [class.activeInput]=\"!selectedDateFocus\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"selectedDateEnd\"\r\n (onValueChanged)=\"onEndDateChange($event)\"\r\n (onFocusIn)=\"onEndDateFocus()\"\r\n >\r\n </dx-date-box>\r\n </div>\r\n </div>\r\n\r\n <div class=\"bg-white mx-2 px-2 py-2 date-picker-date-selection\">\r\n <div\r\n *ngIf=\"this.selectionKind == 'single'\"\r\n id=\"date-inputs\"\r\n class=\"d-flex flex-wrap justify-content-center align-items-center p-2\"\r\n >\r\n <div class=\"d-flex justify-content-center align-items-center\">\r\n <dx-date-box\r\n #singleDatePickerBox\r\n class=\"border p-1 m-0 text-center rounded datepicker-input datepicker-input-large\"\r\n [class.activeInput]=\"true\"\r\n [showClearButton]=\"false\"\r\n [showDropDownButton]=\"false\"\r\n [useMaskBehavior]=\"true\"\r\n [displayFormat]=\"dateInputDisplayFormat\"\r\n type=\"date\"\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [(value)]=\"selectedDateInternal\"\r\n >\r\n </dx-date-box>\r\n <!-- (onValueChanged)=\" closeDatepickerPopup()\" -->\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"d-flex justify-content-center align-items-center\"\r\n (click)=\"selectEndDate($event)\">\r\n\r\n <dx-calendar\r\n #calendar\r\n [min]=\"minDate || minDateDefault\"\r\n [max]=\"maxDate || maxDateDefault\"\r\n [disabledDates]=\"isDateDisabled\"\r\n [isValid]=\"isValid\"\r\n [validationError]=\"validationError\"\r\n [disabled]=\"disabled\"\r\n [value]=\"this.selectionKind == 'period' ? selectedDateCalendar : selectedDateInternal\"\r\n (onValueChanged)=\"onDateChange($event)\"\r\n [firstDayOfWeek]=\"firstDayOfWeek\"\r\n >\r\n <div\r\n *dxTemplate=\"let cellData of 'cell'\"\r\n [class]=\"'h-100 pt-1' + getCellCssClass(cellData.date)\"\r\n [style.line-height.px]=\"23\"\r\n\r\n >\r\n\r\n <div *ngIf=\"lockBeforeDate && (cellData.date | sdsDateCompare: lockBeforeDate : 'lte'); then thenLockBlock else elseDefaultBlock\"></div>\r\n <ng-template #thenLockBlock>\r\n <fa-icon [title]=\"lockBeforeDateHint\" [icon]=\"lockIcon\" class=\"locked-day position-absolute-x\"></fa-icon>\r\n </ng-template>\r\n <ng-template #elseDefaultBlock>\r\n {{ cellData.text }}\r\n </ng-template>\r\n </div>\r\n </dx-calendar>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"this.selectionKind == 'period'\"\r\n class=\"d-flex justify-content-end align-items-center px-3 pt-2 pb-3\"\r\n >\r\n <button\r\n class=\"btn btn-secondary sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n (click)=\"showDatepicker = false\"\r\n type=\"button\"\r\n >\r\n {{ translations.cancel}}\r\n </button>\r\n <!-- (click)=\"closeDatepickerPopup()\" -->\r\n <button\r\n class=\"btn btn-primary ms-1 sds-fw-400\"\r\n [disabled]=\"disabled\"\r\n (click)=\"applyPeriodPicker()\"\r\n type=\"button\"\r\n >\r\n {{ translations.apply}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </dx-scroll-view>\r\n </div>\r\n</dx-popover>\r\n<!-- </div> -->\r\n\r\n", styles: ["#datepickercomponent .datepicker-input{width:125px}#datepickercomponent .datepicker-input-large{width:250px!important}#datepickercomponent .datepicker-input.activeInput{border-color:#2886b1!important;border-width:2px!important}#datepickercomponent ::ng-deep .dx-calendar-cell{padding:inherit!important}#datepickercomponent ::ng-deep .dx-calendar-cell.dx-calendar-other-month{opacity:.5!important}#datepickercomponent .timebox-fixed-width{width:80px}#datepickercomponent ::ng-deep .text-center .dx-texteditor-input{text-align:center!important}#datepickercomponent ::ng-deep .p-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .p-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}#datepickercomponent ::ng-deep .px-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .px-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .py-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pb-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pt-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pl-5 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-0 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-1 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-2 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-3 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-4 .dx-texteditor-input,#datepickercomponent ::ng-deep .pr-5 .dx-texteditor-input{min-height:inherit!important;padding:inherit!important}.datepicker{display:inline-flex}.datepicker .border,.datepicker .border-bottom,.datepicker .border-top,.datepicker .border-left,.datepicker .border-right{border-color:var(--bs-gray-400)!important}.datepicker>button{border-radius:0;border-left:none;border-right:none}.datepicker .preselect-options-fixed-width{width:150px}.datepicker .selected-period{flex:1 1 auto}.datepicker .date-range-dropdown-button{box-shadow:none!important;border:1px solid white;flex:0;padding-top:.3rem!important;padding-bottom:.3rem!important}.datepicker .date-range-text{flex:1;min-width:0;text-align:start}.predefined-date-range{cursor:pointer;font-size:1rem;line-height:1.5rem;min-width:10rem;border-radius:2px}.predefined-date-range:hover{background-color:#0000000a}.predefined-date-range:active{color:#fff;background-color:#3b8fc2}.predefined-date-range.selected:not(:active){background-color:#e6e6e6}::ng-deep .sds-datepicker-popover.dx-popover-wrapper .dx-popup-content{padding:0}::ng-deep .sds-datepicker-ranges-popover .dx-popup-content{padding:.25rem;font-size:1rem}::ng-deep .sds-datepicker-ranges-popover .dropdown-item:focus{outline:none}::ng-deep .sds-datepicker-ranges-popover .dropdown-item .selected{background-color:var(--bs-gray-300)}::ng-deep .sds-datepicker-popover .date-picker-date-selection dx-calendar .dx-calendar-cell.dx-calendar-empty-cell:has(fa-icon.locked-day){background:initial!important}\n"] }]
|
|
760
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.SdsDatePickerService }], propDecorators: { displayContent: [{
|
|
761
|
+
type: ContentChild,
|
|
762
|
+
args: ['display']
|
|
763
|
+
}], selectionKind: [{
|
|
764
|
+
type: Input
|
|
765
|
+
}], dateRangeDefinitions: [{
|
|
766
|
+
type: Input
|
|
767
|
+
}], selectedDate: [{
|
|
768
|
+
type: Input
|
|
769
|
+
}], selectedDateChange: [{
|
|
770
|
+
type: Output
|
|
771
|
+
}], selectedDateStart: [{
|
|
772
|
+
type: Input
|
|
773
|
+
}], selectedDateStartChange: [{
|
|
774
|
+
type: Output
|
|
775
|
+
}], singleDayFormatFn: [{
|
|
776
|
+
type: Input
|
|
777
|
+
}], dateRangeFormatFn: [{
|
|
778
|
+
type: Input
|
|
779
|
+
}], selectedDateEnd: [{
|
|
780
|
+
type: Input
|
|
781
|
+
}], selectedDateEndChange: [{
|
|
782
|
+
type: Output
|
|
783
|
+
}], periodChange: [{
|
|
784
|
+
type: Output
|
|
785
|
+
}], minDate: [{
|
|
786
|
+
type: Input
|
|
787
|
+
}], maxDate: [{
|
|
788
|
+
type: Input
|
|
789
|
+
}], locales: [{
|
|
790
|
+
type: Input
|
|
791
|
+
}], disabled: [{
|
|
792
|
+
type: Input
|
|
793
|
+
}], validationError: [{
|
|
794
|
+
type: Input
|
|
795
|
+
}], isValid: [{
|
|
796
|
+
type: Input
|
|
797
|
+
}], disabledDates: [{
|
|
798
|
+
type: Input
|
|
799
|
+
}], applyText: [{
|
|
800
|
+
type: Input
|
|
801
|
+
}], cancelText: [{
|
|
802
|
+
type: Input
|
|
803
|
+
}], translations: [{
|
|
804
|
+
type: Input
|
|
805
|
+
}], firstDayOfWeek: [{
|
|
806
|
+
type: Input
|
|
807
|
+
}], dateRangeDefinitionsWidth: [{
|
|
808
|
+
type: Input
|
|
809
|
+
}], showPreviousAndNextButtons: [{
|
|
810
|
+
type: Input
|
|
811
|
+
}], width: [{
|
|
812
|
+
type: Input
|
|
813
|
+
}], dropdownWrapperClass: [{
|
|
814
|
+
type: Input
|
|
815
|
+
}], dropdownWrapperId: [{
|
|
816
|
+
type: Input
|
|
817
|
+
}], getPreviousDateCallback: [{
|
|
818
|
+
type: Input
|
|
819
|
+
}], getNextDateCallback: [{
|
|
820
|
+
type: Input
|
|
821
|
+
}], getPreviousRangeCallback: [{
|
|
822
|
+
type: Input
|
|
823
|
+
}], getNextRangeCallback: [{
|
|
824
|
+
type: Input
|
|
825
|
+
}], useCustomDisplayContent: [{
|
|
826
|
+
type: Input
|
|
827
|
+
}], displayPredefinedDateRangeName: [{
|
|
828
|
+
type: Input
|
|
829
|
+
}], style: [{
|
|
830
|
+
type: Input
|
|
831
|
+
}], compactStyleDisplay: [{
|
|
832
|
+
type: Input
|
|
833
|
+
}], dateInputDisplayFormat: [{
|
|
834
|
+
type: Input
|
|
835
|
+
}], componentAriaLabel: [{
|
|
836
|
+
type: Input
|
|
837
|
+
}], openDateRangeDefinitionsAriaLabel: [{
|
|
838
|
+
type: Input
|
|
839
|
+
}], nextPeriodAriaLabel: [{
|
|
840
|
+
type: Input
|
|
841
|
+
}], previousPeriodAriaLabel: [{
|
|
842
|
+
type: Input
|
|
843
|
+
}], lockBeforeDate: [{
|
|
844
|
+
type: Input
|
|
845
|
+
}], lockBeforeDateHint: [{
|
|
846
|
+
type: Input
|
|
847
|
+
}], singleDatePickerBox: [{
|
|
848
|
+
type: ViewChild,
|
|
849
|
+
args: ['singleDatePickerBox', { static: false }]
|
|
850
|
+
}], selectedDateStartBox: [{
|
|
851
|
+
type: ViewChild,
|
|
852
|
+
args: ['selectedDateStartBox', { static: false }]
|
|
853
|
+
}], selectedDateEndBox: [{
|
|
854
|
+
type: ViewChild,
|
|
855
|
+
args: ['selectedDateEndBox', { static: false }]
|
|
856
|
+
}], calendar: [{
|
|
857
|
+
type: ViewChild,
|
|
858
|
+
args: ['calendar', { static: false }]
|
|
859
|
+
}], _selectedDateRangeButton: [{
|
|
860
|
+
type: ViewChild,
|
|
861
|
+
args: ['selectedDateRangeButton', { static: true }]
|
|
862
|
+
}] } });
|
|
863
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNkcy1jb21wb25lbnRzL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNkcy1jb21wb25lbnRzL3NyYy9saWIvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFakQsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLE9BQU8sRUFDUCxRQUFRLEVBQ1IsR0FBRyxHQUNOLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFDSCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ1QsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFaEUsT0FBTyxFQUNILHFCQUFxQixHQUd4QixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2hHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQzs7Ozs7Ozs7O0FBRS9GLDZEQUE2RDtBQTJCN0QsTUFBTSxPQUFPLHNCQUFzQjtJQXdKL0IsaUJBQWlCO0lBQ2pCLFlBQ1ksU0FBNEIsRUFDNUIsaUJBQXVDO1FBRHZDLGNBQVMsR0FBVCxTQUFTLENBQW1CO1FBQzVCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBc0I7UUExSjFCLG1CQUFjLEdBQVEsU0FBUyxDQUFDO1FBRXpELG1CQUFtQjtRQUNWLGtCQUFhLEdBQXdCLFFBQVEsQ0FBQztRQUU5Qyx5QkFBb0IsR0FBMkMsRUFBRSxDQUFDO1FBRTNFLHVCQUF1QjtRQUNkLGlCQUFZLEdBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN4Qix1QkFBa0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBSS9DLDRCQUF1QixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFdkQsbUVBQW1FO1FBQzFELHNCQUFpQixHQUEwQyxTQUFTLENBQUM7UUFDOUUsdUVBQXVFO1FBQzlELHNCQUFpQixHQUEwQyxTQUFTLENBQUM7UUFHcEUsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFNbkMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixvQkFBZSxHQUFXLEVBQUUsQ0FBQztRQUM3QixZQUFPLEdBQVksSUFBSSxDQUFDO1FBRXhCLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBRXBCLGNBQVMsR0FBWSxPQUFPLENBQUM7UUFDN0IsZUFBVSxHQUFZLE9BQU8sQ0FBQztRQUk5QixtQkFBYyxHQUE4QixDQUFDLENBQUM7UUFFOUMsOEJBQXlCLEdBQVcsT0FBTyxDQUFDO1FBQzVDLCtCQUEwQixHQUFZLElBQUksQ0FBQztRQUUzQyxVQUFLLEdBQVcsT0FBTyxDQUFDO1FBRXhCLHlCQUFvQixHQUFXLEVBQUUsQ0FBQztRQUNsQyxzQkFBaUIsR0FBVyxFQUFFLENBQUM7UUFFL0IsNEJBQXVCLEdBQW9FLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDL0csd0JBQW1CLEdBQW9FLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFdkcsNkJBQXdCLEdBQTJJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUN6TCx5QkFBb0IsR0FBMkksSUFBSSxDQUFDLFlBQVksQ0FBQztRQUVqTCw0QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFFaEMsbUNBQThCLEdBQUcsS0FBSyxDQUFBO1FBRXRDLFVBQUssR0FBMEIsU0FBUyxDQUFDO1FBQ3pDLHdCQUFtQixHQUF3QyxpQkFBaUIsQ0FBQztRQUU3RSwyQkFBc0IsR0FBVyxXQUFXLENBQUM7UUFFN0Qsc0JBQXNCO1FBQ3RCOzs7V0FHRztRQUNhLHVCQUFrQixHQUFHLGFBQWEsQ0FBQTtRQUVsRDs7O1dBR0c7UUFDYSxzQ0FBaUMsR0FBRyxrQ0FBa0MsQ0FBQTtRQUV0Rjs7O1dBR0c7UUFDYSx3QkFBbUIsR0FBRyxhQUFhLENBQUE7UUFFbkQ7OztXQUdHO1FBQ2EsNEJBQXVCLEdBQUcsaUJBQWlCLENBQUE7UUFRM0Qsb0JBQW9CO1FBQ3BCLHVCQUFrQixHQUFHLFdBQVcsQ0FBQztRQUNqQyxtQkFBYyxHQUFHLFlBQVksQ0FBQztRQUM5QixpQkFBWSxHQUFHLFVBQVUsQ0FBQztRQUMxQixXQUFNLEdBQUcsWUFBWSxDQUFDO1FBQ3RCLGFBQVEsR0FBRyxNQUFNLENBQUM7UUFFbEIseUJBQW9CLEdBQWlDLEVBQUUsQ0FBQztRQUN4RCxzQ0FBaUMsR0FBcUIsU0FBUyxDQUFDO1FBRWhFLGVBQVUsR0FBaUMsRUFBRSxDQUFDO1FBRTlDLDBCQUFxQixHQUFXLEVBQUUsQ0FBQztRQUNuQyxrQ0FBNkIsR0FBVyxFQUFFLENBQUM7UUFDM0Msa0NBQTZCLEdBQVcsRUFBRSxDQUFDO1FBSzNDLHlCQUFvQixHQUEyQixJQUFJLElBQUksRUFBRSxDQUFDO1FBQzFELHlCQUFvQixHQUEyQixJQUFJLElBQUksRUFBRSxDQUFDO1FBRTFELGlCQUFZLEdBQTJCLEVBQUUsQ0FBQztRQUMxQyxjQUFTLEdBQTJCLEVBQUUsQ0FBQztRQUN2QyxlQUFVLEdBQTJCLEVBQUUsQ0FBQztRQUN4QyxZQUFPLEdBQTJCLEVBQUUsQ0FBQztRQUdyQyxrQ0FBNkIsR0FBWSxLQUFLLENBQUM7UUFFL0Msd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBRXJDLGlDQUE0QixHQUFZLEtBQUssQ0FBQztRQUM5QywrQkFBMEIsR0FBWSxLQUFLLENBQUM7UUFDNUMsc0JBQWlCLEdBQVksSUFBSSxDQUFDO1FBRXhCLGdCQUFXLEdBQUcsU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUloRCxzQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFHbEMsd0JBQW1CLEdBQW1DLFNBQVMsQ0FBQztRQUVoRSx5QkFBb0IsR0FBbUMsU0FBUyxDQUFDO1FBRWpFLHVCQUFrQixHQUFtQyxTQUFTLENBQUM7UUFFckIsYUFBUSxHQUV4QyxTQUFTLENBQUM7UUFHcEIsNkJBQXdCLEdBQTJCLFNBQVMsQ0FBQztRQTBLOUQsc0JBQWlCLEdBQVcsSUFBSSxDQUFDLEtBQUssQ0FDekMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDMUMsQ0FBQztRQXdlSyxtQkFBYyxHQUFHLENBQUMsSUFBUyxFQUFXLEVBQUU7WUFDM0MsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUNsRSxPQUFPLElBQUksQ0FBQztZQUNoQixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2RSxDQUFDLENBQUE7UUFscEJHLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7UUFFL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUU1QixJQUFJLENBQUMsWUFBWSxHQUFHO1lBQ2hCLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLEtBQUssRUFBRSxPQUFPO1lBQ2QsTUFBTSxFQUFFLFFBQVE7WUFDaEIsT0FBTyxFQUFFLFNBQVM7U0FDckIsQ0FBQztRQUVGLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxxQkFBcUIsQ0FDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQ3hCLFNBQVMsRUFDVCxTQUFTLENBQ1osQ0FBQztRQUVGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBRTlDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUVwQyxDQUFDO0lBRUQsUUFBUSxLQUFJLENBQUM7SUFFYixXQUFXLENBQUMsT0FBc0I7UUFDOUIsSUFBSSxPQUFPLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUMsQ0FBQztZQUUxQixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUVqRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN0QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFFN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEMsQ0FBQztRQUVMLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQy9CLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7WUFDN0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzNDLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUU3RCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTlDLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO2dCQUV6QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDMUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNoRixDQUFDO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNuQyxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFlBQVksQ0FBQztZQUN4RCxNQUFNLGFBQWEsR0FBRyxLQUFLLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDakUsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLElBQUksQ0FBQyw0QkFBNEIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQzNELElBQUksQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDO29CQUMvQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDO29CQUMxQyxJQUFJLENBQUMsNEJBQTRCLEdBQUcsS0FBSyxDQUFDO2dCQUM5QyxDQUFDO3FCQUFNLElBQ0gsQ0FBQyxJQUFJLENBQUMsMEJBQTBCO29CQUNoQyxJQUFJLENBQUMsY0FBYyxFQUNyQixDQUFDO29CQUNDLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7d0JBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDO3dCQUMvQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDO3dCQUMxQyxJQUNJLElBQUksQ0FBQyxPQUFPLFlBQVksSUFBSTs0QkFDNUIsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUM7Z0NBQ25DLE9BQU8sQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQzNDLENBQUM7NEJBQ0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUM7d0JBQ2pDLENBQUM7b0JBQ0wsQ0FBQztnQkFDTCxDQUFDO3FCQUFNLENBQUM7b0JBQ0osSUFBSSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUM7b0JBQy9CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7Z0JBQ25DLENBQUM7Z0JBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO2dCQUNwQyxJQUNJLElBQUksQ0FBQyxpQkFBaUIsWUFBWSxJQUFJO29CQUN0QyxJQUFJLENBQUMsZUFBZSxZQUFZLElBQUksRUFDdEMsQ0FBQztvQkFDQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUN4RSxDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkMsQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUM3QixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxZQUFZLENBQUM7WUFDdEQsTUFBTSxhQUFhLEdBQUcsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2pFLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO29CQUNuQyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO3dCQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQzt3QkFDN0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGFBQWEsQ0FBQzt3QkFFMUMsSUFDSSxJQUFJLENBQUMsU0FBUyxZQUFZLElBQUk7NEJBQzlCLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO2dDQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQyxFQUM3QyxDQUFDOzRCQUNDLElBQUksQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDO3dCQUNuQyxDQUFDO29CQUNMLENBQUM7Z0JBQ0wsQ0FBQztxQkFBTSxDQUFDO29CQUNKLElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDO29CQUM3QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDO2dCQUM5QyxDQUFDO2dCQUVELElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO2dCQUNwQyxJQUNJLElBQUksQ0FBQyxpQkFBaUIsWUFBWSxJQUFJO29CQUN0QyxJQUFJLENBQUMsZUFBZSxZQUFZLElBQUksRUFDdEMsQ0FBQztvQkFDQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUN4RSxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDTCxDQUFDO0lBT00sdUJBQXVCLENBQUMsV0FBbUQ7UUFDOUUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFdBQVcsQ0FBQztRQUN4QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVNLGVBQWUsQ0FBQyxZQUFzQztRQUN6RCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sVUFBVSxDQUFDLE9BQStCO1FBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxJQUFXLHNCQUFzQjtRQUM3QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBVyxvQkFBb0I7UUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBVyxjQUFjO1FBQ3JCLElBQ0ksSUFBSSxDQUFDLE9BQU8sWUFBWSxJQUFJO1lBQzVCLElBQUksQ0FBQyxvQkFBb0IsWUFBWSxJQUFJLEVBQzNDLENBQUM7WUFDQyxPQUFPLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNsRCxRQUFRLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FDcEQsQ0FBQztRQUNOLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsSUFBVyxjQUFjO1FBQ3JCLElBQ0ksSUFBSSxDQUFDLE9BQU8sWUFBWSxJQUFJO1lBQzVCLElBQUksQ0FBQyxvQkFBb0IsWUFBWSxJQUFJLEVBQzNDLENBQUM7WUFDQyxPQUFPLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNsRCxPQUFPLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FDbkQsQ0FBQztRQUNOLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRU0sWUFBWSxDQUFDLEtBQVU7UUFDMUIsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbEQsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2pDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUV0QyxJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3BCLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7b0JBQzlCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUN0RCxDQUFDO3FCQUFNLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7b0JBQ25DLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNwRCxDQUFDO2dCQUVELElBQUksQ0FBQyxlQUFlLENBQ2hCLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFDcEIsS0FBSyxDQUNSLENBQUM7WUFDTixDQUFDO1FBQ0wsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUM1QixJQUFJLENBQUMsb0JBQW9CLEdBQUcscUJBQXFCLENBQUM7UUFDdEQsQ0FBQztJQUNMLENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxPQUFhO1FBQ3RDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUM7UUFDakMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE9BQU8sQ0FBQztRQUVwQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUUvQixJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGVBQXVCLENBQUMsRUFBRSxDQUFDO2dCQUNqRCxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQztZQUNuQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMvRCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxPQUFhO1FBQ3BDLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxPQUFPLENBQUM7UUFFcEM7UUFDSSx1REFBdUQ7UUFDdkQsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsaUJBQXlCLENBQUMsRUFDbkQsQ0FBQztZQUNDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7WUFDOUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztZQUNqQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQ25DLENBQUM7SUFDTCxDQUFDO0lBRU0saUJBQWlCLENBQUMsS0FBVTtRQUMvQixJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXhDLElBQUksQ0FBQyxlQUFlLENBQ2hCLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFDcEIsS0FBSyxDQUNSLENBQUM7SUFDTixDQUFDO0lBRU0sZUFBZSxDQUFDLEtBQVU7UUFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0QyxJQUFJLENBQUMsZUFBZSxDQUNoQixJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLElBQUksQ0FBQyxlQUFlLEVBQ3BCLEtBQUssQ0FDUixDQUFDO0lBQ04sQ0FBQztJQUVNLGtCQUFrQixDQUFDLEtBQW9CLEVBQUUsS0FBNEI7UUFDeEUsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNMLENBQUM7SUFFTSxnQkFBZ0I7UUFDbkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBRTlCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sY0FBYztRQUNqQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRS9CLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMvRCxDQUFDO0lBQ0wsQ0FBQztJQUVNLGlCQUFpQjtRQUNwQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFTSx3QkFBd0I7UUFDM0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUVqQyxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksUUFBUSxFQUFFLENBQUM7WUFDakMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQy9DLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDdkMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQztZQUN6QyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUVMLENBQUM7SUFFTSxvQkFBb0IsQ0FBQyxVQUFVLEdBQUcsSUFBSTtRQUN6Qyw2QkFBNkI7UUFDN0IsbUNBQW1DO1FBQy9CLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsZUFBZSxDQUNoQixJQUFJLENBQUMsb0JBQW9CLEVBQ3pCLElBQUksQ0FBQyxvQkFBb0IsRUFDekIsVUFBVSxDQUNiLENBQUM7UUFDTixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDN0UsQ0FBQztpQkFDSSxDQUFDO2dCQUNGLGtFQUFrRTtnQkFDbEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDcEUsQ0FBQztZQUNELG9DQUFvQztRQUN4QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFDLFlBQVksRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFDTCxJQUFJO0lBQ1IsQ0FBQztJQUVNLHVCQUF1QjtRQUMxQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQTtJQUMvQixDQUFDO0lBRU0sZUFBZSxDQUNsQixTQUFpQyxFQUNqQyxPQUErQixFQUMvQixVQUFVLEdBQUcsSUFBSTtRQUVqQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDO1FBQ25DLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDO1FBRS9CLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsYUFBYSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFFbEYsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQztRQUV4QyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2IsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQzVELENBQUM7aUJBQU0sQ0FBQztnQkFDSixNQUFNLFlBQVksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDdEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUVsRCxNQUFNLGdCQUFnQixHQUNsQixDQUFDLElBQUksQ0FBQyxZQUFZLFlBQVksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQ2xGLENBQUMsT0FBTyxJQUFJLENBQUMsWUFBWSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RSxNQUFNLGNBQWMsR0FDaEIsQ0FBQyxJQUFJLENBQUMsVUFBVSxZQUFZLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO29CQUM1RSxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFFcEUsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO29CQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUNyRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUM5RCxDQUFDO2dCQUVELElBQUksY0FBYyxFQUFFLENBQUM7b0JBQ2pCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO29CQUNqRCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDMUQsQ0FBQztnQkFFRCxJQUFJLGdCQUFnQixJQUFJLGNBQWMsRUFBRSxDQUFDO29CQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQzt3QkFDbkIsSUFBSSxDQUFDLGlCQUFpQjt3QkFDdEIsSUFBSSxDQUFDLGVBQWU7cUJBQ3ZCLENBQUMsQ0FBQztnQkFDUCxDQUFDO1lBQ0wsQ0FBQztZQUVELElBQ0ksSUFBSSxDQUFDLGlCQUFpQixZQUFZLElBQUk7Z0JBQ3RDLElBQUksQ0FBQyxlQUFlLFlBQVksSUFBSSxFQUN0QyxDQUFDO2dCQUNDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDeEUsQ0FBQztRQUVMLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTSxZQUFZO1FBQ2YsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFM0MsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLFlBQVksSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDdkYsT0FBTztZQUNYLENBQUM7WUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQ25DLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsSUFBSSxDQUFDLGVBQWUsQ0FDdkIsQ0FBQztZQUNGLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7SUFDTCxDQUFDO0lBRU0sZ0JBQWdCO1FBQ25CLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNqQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNDLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxZQUFZLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZGLE9BQU87WUFDWCxDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUN2QyxJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLElBQUksQ0FBQyxlQUFlLENBQ3ZCLENBQUM7WUFDRixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0wsQ0FBQztJQUVELDRDQUE0QztJQUM1Qyw4Q0FBOEM7SUFDOUMsNEJBQTRCO0lBQzVCLGdFQUFnRTtJQUNoRSxrRUFBa0U7SUFFbEUscURBQXFEO0lBQ3JELDhDQUE4QztJQUM5QyxJQUFJO0lBRUcsVUFBVSxDQUFDLFdBQW1DO1FBQ2pELElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7UUFDdkMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUE0QixFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVNLGNBQWMsQ0FBQyxXQUFtQztRQUNyRCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO1FBQ3ZDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBNEIsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUdNLFlBQVksQ0FBQyxnQkFBd0MsRUFBRSxjQUFzQztRQUNoRyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FDbEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFDMUIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQ3hCLE1BQU0sQ0FDVCxDQUFDO0lBQ04sQ0FBQztJQUVNLGdCQUFnQixDQUFDLGdCQUF3QyxFQUFFLGNBQXNDO1FBQ3BHLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7UUFDdkMsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUNsQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUMxQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsRUFDeEIsVUFBVSxDQUNiLENBQUM7SUFDTixDQUFDO0lBRU0sb0JBQW9CLENBQUMsT0FBZ0I7UUFDeEMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztRQUN2QyxJQUNJLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLFlBQVksSUFBSSxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxZQUFZLElBQUksQ0FBQyxFQUN6QyxDQUFDO1lBQ0MsT0FBTztRQUNYLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUN6QyxJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLElBQUksQ0FBQyxlQUFlLEVBQ3BCLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQ2hDLENBQUM7UUFDRixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRU0sZUFBZSxDQUFDLElBQVM7UUFDNUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBRWIsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDakUsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFN0QsSUFDSSxPQUFPLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUMxRCxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUN6RCxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQ2pFLENBQUM7Z0JBQ0MsR0FBRyxJQUFJLHVDQUF1QyxDQUFDO1lBQ25ELENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLFNBQVMsQ0FBQyxZQUFZLEVBQUUsdUJBQXVCLENBQUMsRUFBRSxDQUFDO29CQUNuRCxHQUFHLElBQUksc0NBQXNDLENBQUM7Z0JBQ2xELENBQUM7Z0JBQ0QsSUFBSSxTQUFTLENBQUMsWUFBWSxFQUFFLHFCQUFxQixDQUFDLEVBQUUsQ0FBQztvQkFDakQsR0FBRyxJQUFJLG9DQUFvQyxDQUFDO2dCQUNoRCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFTSxhQUFhLENBQUMsS0FBVTtRQUMzQixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDL0QsQ0FBQztJQUNMLENBQUM7SUFFTSxTQUFTLENBQUMsS0FBb0I7UUFFakMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztnQkFDNUIsS0FBSyxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDckMsQ0FBQztpQkFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssYUFBYSxFQUFFLENBQUM7Z0JBQ2hFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2pCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUM3QixDQUFDO2dCQUNELEtBQUssQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ3JDLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVPLG1CQUFtQixDQUFDLEtBQVU7UUFDbEMscUVBQXFFO1FBQ3JFLGtFQUFrRTtRQUNsRSxtRUFBbUU7UUFDbkUsVUFBVTtRQUNWLE1BQU0scUJBQXFCLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMvRSxPQUFPLGNBQWMsQ0FBQztJQUMxQixDQUFDO0lBRU8sbUJBQW1CO1FBQ3ZCLHlCQUF5QjtRQUN6QixpREFBaUQ7UUFDakQsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6QixDQUFDO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFBQSxDQUFDO1FBQ0YsSUFBSSxDQUFDLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFbEMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVPLGdCQUFnQjtRQUNwQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU07WUFDakQsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTTtZQUMxQixDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2IsQ0FBQztJQUVPLDRCQUE0QjtRQUNoQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUNsQyxpREFBaUQsQ0FDcEQsQ0FBQztRQUNGLElBQ0ksT0FBTztZQUNQLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLDJCQUEyQixDQUFDLEVBQzNELENBQUM7WUFDQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQzVELENBQUM7SUFDTCxDQUFDO0lBRU8sd0JBQXdCO1FBQzVCLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7WUFDOUYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7UUFDcEcsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQ3RGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUM1RixDQUFDO0lBQ0wsQ0FBQztJQUVNLGlDQUFpQztRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUVELElBQUksQ0FBQyw2QkFBNkI7WUFDOUIsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUM7SUFDNUMsQ0FBQztJQUVNLGNBQWMsQ0FBQyxLQUE0QjtRQUM5QyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsS0FBSyxDQUFDO1FBQzNDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFFL0IsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2pDLDhCQUE4QjtZQUM5QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMvQixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVE7Z0JBQzNCLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUTtnQkFDaEIsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdELENBQUM7SUFDTCxDQUFDO0lBU08sY0FBYyxDQUFDLFFBQWUsRUFBRSxNQUFhO1FBQ2pELElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUM5QyxPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRTFCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQzlDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDRixTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQWdCLEVBQUUsUUFBUSxDQUFDO1lBQ3ZDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBYyxFQUFFLE1BQU0sQ0FBQyxDQUMxQyxDQUFDO1FBQ0YsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ2xELENBQUM7SUFDTCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsUUFBZSxFQUFFLE1BQWE7UUFDbkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLDZCQUE2QixHQUFHLEVBQUUsQ0FBQztRQUV4QyxJQUFJLENBQUMsQ0FBQyxRQUFRLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sWUFBWSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzNELE9BQU87UUFDWCxDQUFDO1FBRUQsaUJBQWlCO1FBQ2pCLFVBQVU7UUFDVixJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM5QixJQUFJLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixLQUFLLFdBQVcsRUFBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFFLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQzVJLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUUsd0NBQXdDO2dCQUM3RyxDQUFDO3FCQUFNLENBQUM7b0JBQ0osSUFBSSxDQUFDLDZCQUE2QixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUMvRSxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFDRCxhQUFhO2FBQ1IsQ0FBQztZQUNGLG1FQUFtRTtZQUNuRSxJQUFJLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUNoRCxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN0RSxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hFLENBQUM7WUFDRCxhQUFhO2lCQUNSLElBQ0QsU0FBUyxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNyQyxXQUFXLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUMvQixDQUFDO2dCQUNDLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUNoRCxRQUFRLEVBQ1IsT0FBTyxDQUNWLENBQUM7WUFDTixDQUFDO1lBQ0QsZ0RBQWdEO2lCQUMzQyxDQUFDO2dCQUNGLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUNoRCxRQUFRLEVBQ1IsVUFBVSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQ3BELENBQUM7Z0JBQ0YsSUFBSSxDQUFDLDZCQUE2QixHQUFHLElBQUksQ0FBQyxVQUFVLENBQ2hELE1BQU0sRUFDTixVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FDbEQsQ0FBQztZQUNOLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN0RyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO2dCQUNoRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQztnQkFDekQsSUFBSSxDQUFDLDZCQUE2QixHQUFHLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLDZCQUE2QixHQUFHLEVBQUUsQ0FBQztZQUM1QyxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsbUJBQW1CLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNwRSxDQUFDO1FBQ0wsQ0FBQztRQUNELDREQUE0RDtRQUM1RCxnR0FBZ0c7UUFDaEcsOEpBQThKO1FBQzlKLHdFQUF3RTtRQUN4RSwrQ0FBK0M7UUFDL0MsY0FBYztRQUNkLElBQUk7UUFDSixtSkFBbUo7UUFDbkosd0VBQXdFO1FBQ3hFLCtDQUErQztRQUMvQyxjQUFjO1FBQ2QsSUFBSTtJQUNSLENBQUM7SUFFTyxVQUFVLENBQ2QsSUFBVSxFQUNWLElBQTZEO1FBRTdELFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDWCxLQUFLLE9BQU87Z0JBQ1IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDekMsS0FBSyxFQUFFLE1BQU07b0JBQ2IsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsR0FBRyxFQUFFLFNBQVM7aUJBQ2pCLENBQUMsQ0FBQztZQUNQLEtBQUssVUFBVTtnQkFDWCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUN6QyxHQUFHLEVBQUUsU0FBUztvQkFDZCxLQUFLLEVBQUUsU0FBUztvQkFDaEIsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsT0FBTyxFQUFFLE1BQU07aUJBQ2xCLENBQUMsQ0FBQztZQUNQLEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUN6QyxHQUFHLEVBQUUsU0FBUztvQkFDZCxLQUFLLEVBQUUsT0FBTztpQkFDakIsQ0FBQyxDQUFDO1lBQ1AsS0FBSyxLQUFLO2dCQUNOLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ3pDLEdBQUcsRUFBRSxTQUFTO29CQUNkLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRSxTQUFTO2lCQUNsQixDQUFDLENBQUM7WUFDUDtnQkFDSSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUN6QyxHQUFHLEVBQUUsU0FBUztvQkFDZCxLQUFLLEVBQUUsU0FBUztvQkFDaEIsSUFBSSxFQUFFLFNBQVM7aUJBQ2xCLENBQUMsQ0FBQztRQUNYLENBQUM7SUFDTCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsS0FBZTtRQUN0QyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXJDLElBQ0ksS0FBSztZQUNMLENBQUMsSUFBSSxDQUFDLGlDQUFpQztZQUN2QyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxDQUFDLEVBQzNELENBQUM7WUFDQyxJQUFJLENBQUMsaUNBQWlDLEdBQUcsS0FBSyxDQUFDO1lBRS9DLElBQUksQ0FBQyxvQkFBb0I7Z0JBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx1QkFBdUIsQ0FDMUMsSUFBSSxDQUFDLG9CQUFvQixFQUN6QixLQUFLLEVBQ0wsSUFBSSxDQUFDLGNBQWMsQ0FDdEIsQ0FBQztZQUVOLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0wsQ0FBQzsrR0E5OEJRLHNCQUFzQjttR0FBdEIsc0JBQXNCLCszRUNuRm5DLDA1aEJBeVZBLDI3SUR4UlEsS0FBSyxtSEFDTCxJQUFJLHdGQUVKLGtCQUFrQix1REFFbEIsWUFBWSwySUFDWixpQkFBaUIsa1NBRWpCLGVBQWUsc2hFQUNmLGdCQUFnQiw4QkFDaEIsa0JBQWtCLDhCQUNsQixhQUFhLDhCQUNiLGFBQWEsOEJBQ2Isa0JBQWtCLHV4QkFDbEIsZUFBZSwyZ0ZBQ2YsZ0JBQWdCOzs0RkFHWCxzQkFBc0I7a0JBekJsQyxTQUFTOytCQUNJLGlCQUFpQixtQkFHVix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDTCxLQUFLO3dCQUNMLElBQUk7d0JBRUosa0JBQWtCO3dCQUVsQixZQUFZO3dCQUNaLGlCQUFpQjt3QkFFakIsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLGtCQUFrQjt3QkFDbEIsYUFBYTt3QkFDYixhQUFhO3dCQUNiLGtCQUFrQjt3QkFDbEIsZUFBZTt3QkFDZixnQkFBZ0I7cUJBQ25CO3lIQUd3QixjQUFjO3NCQUF0QyxZQUFZO3VCQUFDLFNBQVM7Z0JBR2QsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFDVyxrQkFBa0I7c0JBQWxDLE1BQU07Z0JBR0UsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNJLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFHRSxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBRUcsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0kscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUUsT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFFVSxZQUFZO3NCQUEzQixLQUFLO2dCQUVVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBRVUseUJBQXlCO3NCQUF4QyxLQUFLO2dCQUNVLDBCQUEwQjtzQkFBekMsS0FBSztnQkFFVSxLQUFLO3NCQUFwQixLQUFLO2dCQUVVLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFDVSxpQkFBaUI7c0JBQWhDLEtBQUs7Z0JBRVUsdUJBQXVCO3NCQUF0QyxLQUFLO2dCQUNVLG1CQUFtQjtzQkFBbEMsS0FBSztnQkFFVSx3QkFBd0I7c0JBQXZDLEtBQUs7Z0JBQ1Usb0JBQW9CO3NCQUFuQyxLQUFLO2dCQUVVLHVCQUF1QjtzQkFBdEMsS0FBSztnQkFFVSw4QkFBOEI7c0JBQTdDLEtBQUs7Z0JBRVUsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxtQkFBbUI7c0JBQWxDLEtBQUs7Z0JBRVUsc0JBQXNCO3NCQUFyQyxLQUFLO2dCQU9VLGtCQUFrQjtzQkFBakMsS0FBSztnQkFNVSxpQ0FBaUM7c0JBQWhELEtBQUs7Z0JBTVUsbUJBQW1CO3NCQUFsQyxLQUFLO2dCQU1VLHVCQUF1QjtzQkFBdEMsS0FBSztnQkFJVSxjQUFjO3NCQUE3QixLQUFLO2dCQUNVLGtCQUFrQjtzQkFBakMsS0FBSztnQkE4Q0UsbUJBQW1CO3NCQUQxQixTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHM0Msb0JBQW9CO3NCQUQzQixTQUFTO3VCQUFDLHNCQUFzQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHNUMsa0JBQWtCO3NCQUR6QixTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHQSxRQUFRO3NCQUF6RCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBS2hDLHdCQUF3QjtzQkFEL0IsU0FBUzt1QkFBQyx5QkFBeUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQWZ0ZXJWaWV3SW5pdCxcclxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBDb250ZW50Q2hpbGQsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBPbkluaXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEeENhbGVuZGFyQ29tcG9uZW50IH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL2NhbGVuZGFyJztcclxuaW1wb3J0IHsgRHhEYXRlQm94Q29tcG9uZW50IH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL2RhdGUtYm94JztcclxuaW1wb3J0IHsgbG9jYWxlIH0gZnJvbSBcImRldmV4dHJlbWUvbG9jYWxpemF0aW9uXCI7XHJcblxyXG5pbXBvcnQge1xyXG4gICAgaXNTYW1lRGF5LFxyXG4gICAgaXNTYW1lWWVhcixcclxuICAgIGlzU2FtZU1vbnRoLFxyXG4gICAgc3RhcnRPZkRheSxcclxuICAgIHN0YXJ0T2ZNb250aCxcclxuICAgIGVuZE9mTW9udGgsXHJcbiAgICBpc0FmdGVyLFxyXG4gICAgaXNCZWZvcmUsXHJcbiAgICBhZGQsXHJcbn0gZnJvbSAnZGF0ZS1mbnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIGZhQW5nbGVMZWZ0LFxyXG4gICAgZmFBbmdsZVJpZ2h0LFxyXG4gICAgZmFDYWxlbmRhcixcclxuICAgIGZhTG9ja1xyXG59IGZyb20gJ0Bmb3J0YXdlc29tZS9wcm8tcmVndWxhci1zdmctaWNvbnMnO1xyXG5cclxuaW1wb3J0IHsgZmFBcnJvd1JpZ2h0IH0gZnJvbSAnQGZvcnRhd2Vzb21lL3Byby1saWdodC1zdmctaWNvbnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIFBlcmlvZFBpY2tlckRhdGVSYW5nZSxcclxuICAgIFBlcmlvZFBpY2tlckRhdGVSYW5nZURlZmluaXRpb24sXHJcbiAgICBQZXJpb2RQaWNrZXJUcmFuc2xhdGlvbnMsXHJcbn0gZnJvbSAnLi9kYXRlLXBpY2tlci5tb2RlbCc7XHJcbmltcG9ydCB7IFNkc0RhdGVQaWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9zZHMtZGF0ZS1waWNrZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IER4RGF0ZUJveE1vZHVsZSwgRHhDYWxlbmRhck1vZHVsZSB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhcic7XHJcbmltcG9ydCB7IER4U2Nyb2xsVmlld01vZHVsZSB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci91aS9zY3JvbGwtdmlldyc7XHJcbmltcG9ydCB7IER4b0FuaW1hdGlvbk1vZHVsZSwgRHhvU2hvd01vZHVsZSwgRHhvSGlkZU1vZHVsZSB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci91aS9uZXN0ZWQnO1xyXG5pbXBvcnQgeyBGb250QXdlc29tZU1vZHVsZSB9IGZyb20gJ0Bmb3J0YXdlc29tZS9hbmd1bGFyLWZvbnRhd2Vzb21lJztcclxuaW1wb3J0IHsgRHhUZW1wbGF0ZU1vZHVsZSB9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRHhQb3BvdmVyTW9kdWxlIH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyL3VpL3BvcG92ZXInO1xyXG5pbXBvcnQgeyBOZ0lmLCBOZ0ZvciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENka1RyYXBGb2N1cyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcclxuaW1wb3J0IHsgU2RzRGF0ZUNvbXBhcmVQaXBlIH0gZnJvbSAnQHNwaWNhaW50ZXJuYXRpb25hbC9uZ3gtc2RzLWNvbXBvbmVudHMvc3JjL2xpYi9kYXRlLXBpcGVzJztcclxuXHJcbi8vIGltcG9ydCB7IGZhTG9jayB9IGZyb20gJ0Bmb3J0YXdlc29tZS9wcm8tc29saWQtc3ZnLWljb25zJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzZHMtZGF0ZS1waWNrZXInLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcGlja2VyLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2RhdGUtcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgTmdGb3IsXHJcbiAgICAgICAgTmdJZixcclxuXHJcbiAgICAgICAgU2RzRGF0ZUNvbXBhcmVQaXBlLFxyXG5cclxuICAgICAgICBDZGtUcmFwRm9jdXMsXHJcbiAgICAgICAgRm9udEF3ZXNvbWVNb2R1bGUsXHJcblxyXG4gICAgICAgIER4UG9wb3Zlck1vZHVsZSxcclxuICAgICAgICBEeFRlbXBsYXRlTW9kdWxlLFxyXG4gICAgICAgIER4b0FuaW1hdGlvbk1vZHVsZSxcclxuICAgICAgICBEeG9TaG93TW9kdWxlLFxyXG4gICAgICAgIER4b0hpZGVNb2R1bGUsXHJcbiAgICAgICAgRHhTY3JvbGxWaWV3TW9kdWxlLFxyXG4gICAgICAgIER4RGF0ZUJveE1vZHVsZSxcclxuICAgICAgICBEeENhbGVuZGFyTW9kdWxlLFxyXG4gICAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNkc0RhdGVQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcbiAgICBAQ29udGVudENoaWxkKCdkaXNwbGF5JykgZGlzcGxheUNvbnRlbnQ6IGFueSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAvLyBwdWJsaWMgaW50ZXJmYWNlXHJcbiAgICBASW5wdXQoKSBzZWxlY3Rpb25LaW5kOiAncGVyaW9kJyB8ICdzaW5nbGUnID0gJ3BlcmlvZCc7XHJcblxyXG4gICAgQElucHV0KCkgZGF0ZVJhbmdlRGVmaW5pdGlvbnM6IEFycmF5PFBlcmlvZFBpY2tlckRhdGVSYW5nZURlZmluaXRpb24+ID0gW107XHJcblxyXG4gICAgLy8gc2luZ2xlIGRhdGUgc2VsZWN0b3JcclxuICAgIEBJbnB1dCgpIHNlbGVjdGVkRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIHNlbGVjdGVkRGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICAvLyBwZXJpb2Qgc2VsZWN0b3JcclxuICAgIEBJbnB1dCgpIHNlbGVjdGVkRGF0ZVN0YXJ0OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlO1xyXG4gICAgQE91dHB1dCgpIHNlbGVjdGVkRGF0ZVN0YXJ0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIC8vIGZvcm1hdCBmdW5jdGlvbiBmb3IgZGlzcGxheWluZyBkYXRlIHdoZW4gc2luZ2xlIGRhdGUgaXMgc2VsZWN0ZWRcclxuICAgIEBJbnB1dCgpIHNpbmdsZURheUZvcm1hdEZuOiAoKGRhdGU6IERhdGUpID0+IHN0cmluZyApIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgLy8gZm9ybWF0IGZ1bmN0aW9uIGZvciBkaXNwbGF5aW5nIGVhY2ggZGF0ZSB3aGVuIGRhdGUgcmFuZ2UgaXMgc2VsZWN0ZWRcclxuICAgIEBJbnB1dCgpIGRhdGVSYW5nZUZvcm1hdEZuOiAoKGRhdGU6IERhdGUpID0+IHN0cmluZyApIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIEBJbnB1dCgpIHNlbGVjdGVkRGF0ZUVuZDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZTtcclxuICAgIEBPdXRwdXQoKSBzZWxlY3RlZERhdGVFbmRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgcGVyaW9kQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIEBJbnB1dCgpIG1pbkRhdGU/OiBEYXRlO1xyXG4gICAgQElucHV0KCkgbWF4RGF0ZT86IERhdGU7XHJcblxyXG4gICAgQElucHV0KCkgbG9jYWxlcz86IHN0cmluZyB8IEFycmF5PHN0cmluZz47XHJcbiAgICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgdmFsaWRhdGlvbkVycm9yOiBzdHJpbmcgPSAnJztcclxuICAgIEBJbnB1dCgpIGlzVmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIEBJbnB1dCgpIGRpc2FibGVkRGF0ZXM6IERhdGVbXSA9IFtdO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBhcHBseVRleHQ/OiBzdHJpbmcgPSAnY2xvc2UnO1xyXG4gICAgQElucHV0KCkgcHVibGljIGNhbmNlbFRleHQ/OiBzdHJpbmcgPSAnY2xvc2UnO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyB0cmFuc2xhdGlvbnM6IFBlcmlvZFBpY2tlclRyYW5zbGF0aW9ucztcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZmlyc3REYXlPZldlZWs6IDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgPSAxO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkYXRlUmFuZ2VEZWZpbml0aW9uc1dpZHRoOiBzdHJpbmcgPSAnMTFyZW0nO1xyXG4gICAgQElucHV0KCkgcHVibGljIHNob3dQcmV2aW91c0FuZE5leHRCdXR0b25zOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgd2lkdGg6IHN0cmluZyA9ICczMHJlbSc7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGRyb3Bkb3duV3JhcHBlckNsYXNzOiBzdHJpbmcgPSAnJztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkcm9wZG93bldyYXBwZXJJZDogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGdldFByZXZpb3VzRGF0ZUNhbGxiYWNrOiAoY3VycmVudERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUpID0+IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSB0aGlzLmdldFByZXZpb3VzRGF5O1xyXG4gICAgQElucHV0KCkgcHVibGljIGdldE5leHREYXRlQ2FsbGJhY2s6IChjdXJyZW50RGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSkgPT4gc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSA9IHRoaXMuZ2V0TmV4dERheTtcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZ2V0UHJldmlvdXNSYW5nZUNhbGxiYWNrOiAoY3VycmVudFN0YXJ0RGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgY3VycmVudEVuZERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUpID0+IFtzdHJpbmcgfCBudW1iZXIgfCBEYXRlLCBzdHJpbmcgfCBudW1iZXIgfCBEYXRlXSA9IHRoaXMuZ2V0UHJldmlvdXNSYW5nZTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBnZXROZXh0UmFuZ2VDYWxsYmFjazogKGN1cnJlbnRTdGFydERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUsIGN1cnJlbnRFbmREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKSA9PiBbc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZV0gPSB0aGlzLmdldE5leHRSYW5nZTtcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdXNlQ3VzdG9tRGlzcGxheUNvbnRlbnQgPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZGlzcGxheVByZWRlZmluZWREYXRlUmFuZ2VOYW1lID0gZmFsc2VcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc3R5bGU6ICdjbGFzc2ljJyB8ICdjb21wYWN0JyA9ICdjbGFzc2ljJztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjb21wYWN0U3R5bGVEaXNwbGF5OiAnZGF0ZScgfCAncHJlZGVmaW5lZFJhbmdlJyB8ICdib3RoJyA9ICdwcmVkZWZpbmVkUmFuZ2UnO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBkYXRlSW5wdXREaXNwbGF5Rm9ybWF0OiBzdHJpbmcgPSAnc2hvcnREYXRlJztcclxuXHJcbiAgICAvLyAjcmVnaW9uIEFyaWEgaW5wdXRzXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgICogQ29tcG9uZW50IGFyaWEtbGFiZWwuIERlZmF1bHRzIHRvICdEYXRlIHBpY2tlcidcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGNvbXBvbmVudEFyaWFMYWJlbCA9ICdEYXRlIHBpY2tlcidcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvblxyXG4gICAgICogUHJlZGVmaW5lZCBkYXRlIHJhbmdlIGRlZmluaXRpb25zIGRyb3Bkb3duIGJ1dHRvbiBhcmlhLWxhYmVsLiBEZWZhdWx0cyB0byAnT3BlbiBwcmVkZWZpbmVkIGRhdGUgcmFuZ2VzIHBhbmUnXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBvcGVuRGF0ZVJhbmdlRGVmaW5pdGlvbnNBcmlhTGFiZWwgPSAnT3BlbiBwcmVkZWZpbmVkIGRhdGUgcmFuZ2VzIHBhbmUnXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb25cclxuICAgICAqIE5leHQgcGVyaW9kIGJ1dHRvbiBhcmlhLWxhYmVsLiBEZWZhdWx0IHRvICdOZXh0IHBlcmlvZCdcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIG5leHRQZXJpb2RBcmlhTGFiZWwgPSAnTmV4dCBwZXJpb2QnXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb25cclxuICAgICAqIFByZXZpb3VzIHBlcmlvZCBidXR0b24gYXJpYS1sYWJlbC4gRGVmYXVsdHMgdG8gJ1ByZXZpb3VzIHBlcmlvZCdcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHByZXZpb3VzUGVyaW9kQXJpYUxhYmVsID0gJ1ByZXZpb3VzIHBlcmlvZCdcclxuXHJcbiAgICAvLyAjZW5kcmVnaW9uIEFSSUEgaW5wdXRzXHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGxvY2tCZWZvcmVEYXRlPzogRGF0ZTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBsb2NrQmVmb3JlRGF0ZUhpbnQ/OiBzdHJpbmc7XHJcblxyXG5cclxuICAgIC8vIHB1YmxpYyBwcm9wZXJ0aWVzXHJcbiAgICBwcmV2aW91c1BlcmlvZEljb24gPSBmYUFuZ2xlTGVmdDtcclxuICAgIG5leHRQZXJpb2RJY29uID0gZmFBbmdsZVJpZ2h0O1xyXG4gICAgY2FsZW5kYXJJY29uID0gZmFDYWxlbmRhcjtcclxuICAgIHRvSWNvbiA9IGZhQXJyb3dSaWdodDtcclxuICAgIGxvY2tJY29uID0gZmFMb2NrO1xyXG5cclxuICAgIHByZWRlZmluZWREYXRlUmFuZ2VzOiBBcnJheTxQZXJpb2RQaWNrZXJEYXRlUmFuZ2U+ID0gW107XHJcbiAgICBwcmVkZWZpbmVkRGF0ZVJhbmdlc0dlbmVyYXRlZERhdGU6IERhdGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICBzZWxlY3RlZERhdGVSYW5nZTogUGVyaW9kUGlja2VyRGF0ZVJhbmdlO1xyXG4gICAgZGF0ZVJhbmdlczogQXJyYXk8UGVyaW9kUGlja2VyRGF0ZVJhbmdlPiA9IFtdO1xyXG5cclxuICAgIHNlbGVjdGVkRGF0ZVJhbmdlTmFtZTogc3RyaW5nID0gJyc7XHJcbiAgICBzZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MTogc3RyaW5nID0gJyc7XHJcbiAgICBzZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50Mjogc3RyaW5nID0gJyc7XHJcblxyXG4gICAgbWluRGF0ZURlZmF1bHQ6IERhdGU7XHJcbiAgICBtYXhEYXRlRGVmYXVsdDogRGF0ZTtcclxuXHJcbiAgICBzZWxlY3RlZERhdGVDYWxlbmRhcjogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICBzZWxlY3RlZERhdGVJbnRlcm5hbDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSA9IG5ldyBEYXRlKCk7XHJcblxyXG4gICAgZGF0ZVN0YXJ0T2xkOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gJyc7XHJcbiAgICBkYXRlU3RhcnQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSAnJztcclxuICAgIGRhdGVFbmRPbGQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSAnJztcclxuICAgIGRhdGVFbmQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUgPSAnJztcclxuXHJcbiAgICBzaG93RGF0ZXBpY2tlcjogYm9vbGVhbjtcclxuICAgIHNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgaGlkaW5nQ29uZmlybWVkRGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGlzU2V0dGluZ05vdFByZXByb2Nlc3NlZERhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBzZWxlY3RlZERhdGVGb2N1czogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgcHJvdGVjdGVkIGVsZW1lbnRVVUlEID0gJ3Nkcy1hcy0nICsgY3J5cHRvLnJhbmRvbVVVSUQoKTtcclxuXHJcbiAgICAvLyBwcml2YXRlIGZpZWxkc1xyXG4gICAgcHJpdmF0ZSBjdXN0b21EYXRlUmFuZ2U6IFBlcmlvZFBpY2tlckRhdGVSYW5nZTtcclxuICAgIHByaXZhdGUgaW5pdENhbGVuZGFyVmFsdWU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3NpbmdsZURhdGVQaWNrZXJCb3gnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICAgIHByaXZhdGUgc2luZ2xlRGF0ZVBpY2tlckJveDogRHhEYXRlQm94Q29tcG9uZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgQFZpZXdDaGlsZCgnc2VsZWN0ZWREYXRlU3RhcnRCb3gnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICAgIHByaXZhdGUgc2VsZWN0ZWREYXRlU3RhcnRCb3g6IER4RGF0ZUJveENvbXBvbmVudCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgIEBWaWV3Q2hpbGQoJ3NlbGVjdGVkRGF0ZUVuZEJveCcsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gICAgcHJpdmF0ZSBzZWxlY3RlZERhdGVFbmRCb3g6IER4RGF0ZUJveENvbXBvbmVudCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdjYWxlbmRhcicsIHsgc3RhdGljOiBmYWxzZSB9KSBwcml2YXRlIGNhbGVuZGFyOlxyXG4gICAgICAgIHwgRHhDYWxlbmRhckNvbXBvbmVudFxyXG4gICAgICAgIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3NlbGVjdGVkRGF0ZVJhbmdlQnV0dG9uJywgeyBzdGF0aWM6IHRydWV9KVxyXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWREYXRlUmFuZ2VCdXR0b246IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgLy8gcHVibGljIG1ldGhvZHNcclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgY2hhbmdlUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICBwcml2YXRlIGRhdGVQaWNrZXJTZXJ2aWNlOiBTZHNEYXRlUGlja2VyU2VydmljZVxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2VEZWZpbml0aW9ucyA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLm1pbkRhdGVEZWZhdWx0ID0gbmV3IERhdGUoMTkwMCwgMSwgMSk7XHJcbiAgICAgICAgdGhpcy5tYXhEYXRlRGVmYXVsdCA9IGFkZChzdGFydE9mRGF5KG5ldyBEYXRlKCkpLCB7IHllYXJzOiA1MCB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zaG93RGF0ZXBpY2tlciA9IGZhbHNlO1xyXG5cclxuICAgICAgICB0aGlzLnRyYW5zbGF0aW9ucyA9IHtcclxuICAgICAgICAgICAgY2FuY2VsOiAnQ2FuY2VsJyxcclxuICAgICAgICAgICAgYXBwbHk6ICdBcHBseScsXHJcbiAgICAgICAgICAgIGN1c3RvbTogJ0N1c3RvbScsXHJcbiAgICAgICAgICAgIHByZXNldHM6ICdQcmVzZXRzJyxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmN1c3RvbURhdGVSYW5nZSA9IG5ldyBQZXJpb2RQaWNrZXJEYXRlUmFuZ2UoXHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRpb25zLmN1c3RvbSxcclxuICAgICAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB1bmRlZmluZWRcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0gdGhpcy5jdXN0b21EYXRlUmFuZ2U7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzdGFydE9mRGF5KG5ldyBEYXRlKCkpO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0ID0gc3RhcnRPZk1vbnRoKG5ldyBEYXRlKCkpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kID0gc3RhcnRPZkRheShlbmRPZk1vbnRoKG5ldyBEYXRlKCkpKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGVSYW5nZVRleHQoKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7fVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICBpZiAoY2hhbmdlc1snZGF0ZVJhbmdlRGVmaW5pdGlvbnMnXSkge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcyh0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzWydzZWxlY3Rpb25LaW5kJ10pe1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UoZGF0ZSwgZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVSYW5nZVRleHQoZGF0ZSwgZGF0ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlMSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZTIgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZShkYXRlMSwgZGF0ZTIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KGRhdGUxLCBkYXRlMik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlc1sndHJhbnNsYXRpb25zJ10pIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDdXN0b21UZXh0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlc1snbG9jYWxlcyddKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTG9jYWxlc0NoYW5nZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZVN0YXJ0J10gfHwgY2hhbmdlc1snc2VsZWN0ZWREYXRlRW5kJ10pIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnRPbGQgPSB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0O1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVFbmRPbGQgPSB0aGlzLnNlbGVjdGVkRGF0ZUVuZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZERhdGUnXSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5ldyBEYXRlKGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZSddLmN1cnJlbnRWYWx1ZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gc3RhcnRPZkRheSh2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVTdGFydCA9IHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWw7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVFbmQgPSB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCwgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVSYW5nZVRleHQodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCwgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZVN0YXJ0J10pIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaGFuZ2VzWydzZWxlY3RlZERhdGVTdGFydCddLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IHZhbHVlIDogbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAncGVyaW9kJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTZXR0aW5nTm90UHJlcHJvY2Vzc2VkRGF0ZSAmJiB0aGlzLnNob3dEYXRlcGlja2VyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTZXR0aW5nTm90UHJlcHJvY2Vzc2VkRGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCAmJlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXJcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0Rm9jdXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlRW5kIGluc3RhbmNlb2YgRGF0ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzU2FtZURheShzZWxlY3RlZFZhbHVlLCB0aGlzLmRhdGVFbmQpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBZnRlcihzZWxlY3RlZFZhbHVlLCB0aGlzLmRhdGVFbmQpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUVuZCA9IHNlbGVjdGVkVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWxlbmRhcj8uaW5zdGFuY2U/LnJlcGFpbnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRHhEZWZhdWx0Q2FsZW5kYXJGb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgaW5zdGFuY2VvZiBEYXRlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgaW5zdGFuY2VvZiBEYXRlXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoRGF0ZVJhbmdlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsIHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVSYW5nZVRleHQodGhpcy5zZWxlY3RlZERhdGVTdGFydCwgdGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZERhdGVFbmQnXSkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZUVuZCddLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IHZhbHVlIDogbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAncGVyaW9kJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlRW5kRm9jdXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlRW5kID0gc2VsZWN0ZWRWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IHNlbGVjdGVkVmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1NhbWVEYXkoc2VsZWN0ZWRWYWx1ZSwgdGhpcy5kYXRlU3RhcnQpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBZnRlcih0aGlzLmRhdGVTdGFydCwgc2VsZWN0ZWRWYWx1ZSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlU3RhcnQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVFbmQgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRHhEZWZhdWx0Q2FsZW5kYXJGb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgaW5zdGFuY2VvZiBEYXRlICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgaW5zdGFuY2VvZiBEYXRlXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoRGF0ZVJhbmdlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsIHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVSYW5nZVRleHQodGhpcy5zZWxlY3RlZERhdGVTdGFydCwgdGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2hhbmdlc1snZmlyc3REYXlPZldlZWsnXSkge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcyh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyByYW5kb21JZFJlZmVyZW5jZTogbnVtYmVyID0gTWF0aC5mbG9vcihcclxuICAgICAgICBNYXRoLnJhbmRvbSgpICogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcclxuICAgICk7XHJcblxyXG4gICAgcHVibGljIHNldERhdGVSYW5nZURlZmluaXRpb25zKGRlZmluaXRpb25zOiBBcnJheTxQZXJpb2RQaWNrZXJEYXRlUmFuZ2VEZWZpbml0aW9uPik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlRGVmaW5pdGlvbnMgPSBkZWZpbml0aW9ucztcclxuICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcyh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0VHJhbnNsYXRpb25zKHRyYW5zbGF0aW9uczogUGVyaW9kUGlja2VyVHJhbnNsYXRpb25zKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGlvbnMgPSB0cmFuc2xhdGlvbnM7XHJcbiAgICAgICAgdGhpcy51cGRhdGVDdXN0b21UZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldExvY2FsZXMobG9jYWxlczogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubG9jYWxlcyA9IGxvY2FsZXM7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVMb2NhbGVzQ2hhbmdlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBzZWxlY3RlZERhdGVTdGFydEZvY3VzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzO1xyXG4gICAgfVxyXG4gICAgcHVibGljIGdldCBzZWxlY3RlZERhdGVFbmRGb2N1cygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuc2VsZWN0ZWREYXRlRm9jdXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldCBpc01pbmltdW1MaW1pdCgpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMubWluRGF0ZSBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCBpbnN0YW5jZW9mIERhdGVcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgIGlzU2FtZURheSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsLCB0aGlzLm1pbkRhdGUpIHx8XHJcbiAgICAgICAgICAgICAgICBpc0JlZm9yZSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsLCB0aGlzLm1pbkRhdGUpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGlzTWF4aW11bUxpbWl0KCkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5tYXhEYXRlIGluc3RhbmNlb2YgRGF0ZSAmJlxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsIGluc3RhbmNlb2YgRGF0ZVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAgaXNTYW1lRGF5KHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwsIHRoaXMubWF4RGF0ZSkgfHxcclxuICAgICAgICAgICAgICAgIGlzQWZ0ZXIodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCwgdGhpcy5tYXhEYXRlKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRGF0ZUNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkRGF0ZUZyb21FdmVudCA9IG5ldyBEYXRlKGV2ZW50LnZhbHVlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAncGVyaW9kJykge1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcmFjdGl2ZUNoYW5nZSA9IGV2ZW50LmV2ZW50O1xyXG5cclxuICAgICAgICAgICAgaWYgKGludGVyYWN0aXZlQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGVTdGFydEZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdGFydERhdGVDaGFuZ2Uoc2VsZWN0ZWREYXRlRnJvbUV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZERhdGVFbmRGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRW5kRGF0ZUNoYW5nZShzZWxlY3RlZERhdGVGcm9tRXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQsXHJcbiAgICAgICAgICAgICAgICAgICAgZmFsc2VcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dEYXRlcGlja2VyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBzZWxlY3RlZERhdGVGcm9tRXZlbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVTdGFydERhdGVDaGFuZ2UobmV3RGF0ZTogRGF0ZSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgPSBuZXdEYXRlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2FsZW5kYXIgPSBuZXdEYXRlO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaW5pdENhbGVuZGFyVmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzQWZ0ZXIobmV3RGF0ZSwgdGhpcy5zZWxlY3RlZERhdGVFbmQgYXMgRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kID0gbmV3RGF0ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2FsZW5kYXIgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZUVuZERhdGVDaGFuZ2UobmV3RGF0ZTogRGF0ZSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kID0gbmV3RGF0ZTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUNhbGVuZGFyID0gbmV3RGF0ZTtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAvLyBzZWxlY3RlZCBkYXRlIGlzIGJlZm9yZSBzdGFydCBkYXRlIC0+IHNldCBzdGFydCBkYXRlXHJcbiAgICAgICAgICAgIGlzQmVmb3JlKG5ld0RhdGUsIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgYXMgRGF0ZSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgPSBuZXdEYXRlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblN0YXJ0RGF0ZUNoYW5nZShldmVudDogYW55KSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVTdGFydERhdGVDaGFuZ2UoZXZlbnQudmFsdWUpO1xyXG5cclxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQsXHJcbiAgICAgICAgICAgIGZhbHNlXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25FbmREYXRlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICB0aGlzLmhhbmRsZUVuZERhdGVDaGFuZ2UoZXZlbnQudmFsdWUpO1xyXG5cclxuICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQsXHJcbiAgICAgICAgICAgIGZhbHNlXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25SYW5nZUtleVJlbGVhc2VkKGV2ZW50OiBLZXlib2FyZEV2ZW50LCByYW5nZTogUGVyaW9kUGlja2VyRGF0ZVJhbmdlKSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nRGF0ZVJhbmdlKHJhbmdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uU3RhcnREYXRlRm9jdXMoKSB7XHJcbiAgICAgICAgdGhpcy5pbml0Q2FsZW5kYXJWYWx1ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVDYWxlbmRhciA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdENhbGVuZGFyVmFsdWUgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25FbmREYXRlRm9jdXMoKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVGb2N1cyA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGVFbmQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVDYWxlbmRhciA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFwcGx5UGVyaW9kUGlja2VyKCkge1xyXG4gICAgICAgIHRoaXMuaGlkaW5nQ29uZmlybWVkRGF0ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zaG93RGF0ZXBpY2tlciA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblNob3dpbmdDYWxlbmRhclBvcG92ZXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5oaWRpbmdDb25maXJtZWREYXRlID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3NpbmdsZScpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNpbmdsZURhdGVQaWNrZXJCb3g/Lmluc3RhbmNlLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0T2xkID0gdGhpcy5zZWxlY3RlZERhdGVTdGFydDtcclxuICAgICAgICAgICAgdGhpcy5kYXRlRW5kT2xkID0gdGhpcy5zZWxlY3RlZERhdGVFbmQ7XHJcbiAgICAgICAgICAgIHRoaXMuaXNTZXR0aW5nTm90UHJlcHJvY2Vzc2VkRGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydEJveD8uaW5zdGFuY2UuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMub25TdGFydERhdGVGb2N1cygpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbG9zZURhdGVwaWNrZXJQb3B1cChlbWl0Q2hhbmdlID0gdHJ1ZSkge1xyXG4gICAgICAgIC8vIGlmICh0aGlzLnNob3dEYXRlcGlja2VyKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsLFxyXG4gICAgICAgICAgICAgICAgICAgIGVtaXRDaGFuZ2VcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWRpbmdDb25maXJtZWREYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCwgdGhpcy5zZWxlY3RlZERhdGVFbmQsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zZXRTZWxlY3RlZERhdGUodGhpcy5kYXRlU3RhcnRPbGQsIHRoaXMuZGF0ZUVuZE9sZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUodGhpcy5kYXRlU3RhcnRPbGQsIHRoaXMuZGF0ZUVuZE9sZCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5oaWRpbmdDb25maXJtZWREYXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZERhdGVSYW5nZUJ1dHRvbil7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGVSYW5nZUJ1dHRvbi5uYXRpdmVFbGVtZW50LmZvY3VzKHtmb2N1c1Zpc2libGU6IGZhbHNlfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uSGlkZGVuQ2FsZW5kYXJQb3BvdmVyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2xvc2VEYXRlcGlja2VyUG9wdXAoKVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRTZWxlY3RlZERhdGUoXHJcbiAgICAgICAgZGF0ZVN0YXJ0OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlLFxyXG4gICAgICAgIGRhdGVFbmQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUsXHJcbiAgICAgICAgZW1pdENoYW5nZSA9IHRydWVcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgPSBkYXRlU3RhcnQ7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVFbmQgPSBkYXRlRW5kO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gdGhpcy5zZWxlY3Rpb25LaW5kID09PSAnc2luZ2xlJyA/IGRhdGVTdGFydCA6IGRhdGVFbmQ7XHJcblxyXG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKGVtaXRDaGFuZ2UpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlU3RhcnROZXcgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVFbmROZXcgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnREYXRlQ2hhbmdlZCA9XHJcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuZGF0ZVN0YXJ0T2xkIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNTYW1lRGF5KHRoaXMuZGF0ZVN0YXJ0T2xkLCBkYXRlU3RhcnROZXcpKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgdGhpcy5kYXRlU3RhcnRPbGQgPT09ICdzdHJpbmcnICYmIHRoaXMuZGF0ZVN0YXJ0T2xkID09PSAnJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmREYXRlQ2hhbmdlZCA9XHJcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuZGF0ZUVuZE9sZCBpbnN0YW5jZW9mIERhdGUgJiYgIWlzU2FtZURheSh0aGlzLmRhdGVFbmRPbGQsIGRhdGVFbmROZXcpKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgdGhpcy5kYXRlRW5kT2xkID09PSAnc3RyaW5nJyAmJiB0aGlzLmRhdGVFbmRPbGQgPT09ICcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnREYXRlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0T2xkID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVTdGFydCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlbmREYXRlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUVuZE9sZCA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZENoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnREYXRlQ2hhbmdlZCB8fCBlbmREYXRlQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVyaW9kQ2hhbmdlLmVtaXQoW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZCxcclxuICAgICAgICAgICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kIGluc3RhbmNlb2YgRGF0ZVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UodGhpcy5zZWxlY3RlZERhdGVTdGFydCwgdGhpcy5zZWxlY3RlZERhdGVFbmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsIHRoaXMuc2VsZWN0ZWREYXRlRW5kKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnb1RvTmV4dERhdGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gdGhpcy5nZXROZXh0RGF0ZUNhbGxiYWNrKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gbmV3IERhdGUobmV3RGF0ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKG5ld0RhdGUsIG5ld0RhdGUpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoISh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0IGluc3RhbmNlb2YgRGF0ZSkgfHwgISh0aGlzLnNlbGVjdGVkRGF0ZUVuZCBpbnN0YW5jZW9mIERhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5nZXROZXh0UmFuZ2VDYWxsYmFjayhcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShyYW5nZVswXSwgcmFuZ2VbMV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ29Ub1ByZXZpb3VzRGF0ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSB0aGlzLmdldFByZXZpb3VzRGF0ZUNhbGxiYWNrKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsID0gbmV3IERhdGUobmV3RGF0ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWREYXRlKG5ld0RhdGUsIG5ld0RhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQgaW5zdGFuY2VvZiBEYXRlKSB8fCAhKHRoaXMuc2VsZWN0ZWREYXRlRW5kIGluc3RhbmNlb2YgRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFByZXZpb3VzUmFuZ2VDYWxsYmFjayhcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShyYW5nZVswXSwgcmFuZ2VbMV0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBwdWJsaWMgc2V0TmV4dFByZXZpb3VzRGF5KHNldE5leHQ6IGFueSkge1xyXG4gICAgLy8gICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSB0cnVlO1xyXG4gICAgLy8gICAgIGxldCBuZXdEYXRlID0gc2V0TmV4dFxyXG4gICAgLy8gICAgICAgICA/IGFkZCh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsIGFzIERhdGUsIHsgZGF5czogMSB9KVxyXG4gICAgLy8gICAgICAgICA6IGFkZCh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsIGFzIERhdGUsIHsgZGF5czogLTEgfSk7XHJcblxyXG4gICAgLy8gICAgIHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwgPSBuZXcgRGF0ZShuZXdEYXRlKTtcclxuICAgIC8vICAgICB0aGlzLnNldFNlbGVjdGVkRGF0ZShuZXdEYXRlLCBuZXdEYXRlKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TmV4dERheShjdXJyZW50RGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSk6IHN0cmluZyB8IG51bWJlciB8IERhdGUge1xyXG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBhZGQodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCBhcyBEYXRlLCB7IGRheXM6IDEgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFByZXZpb3VzRGF5KGN1cnJlbnREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB7XHJcbiAgICAgICAgdGhpcy5pc1NlbGVjdGVkUHJlZGVmaW5lZFBlcmlvZCA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGFkZCh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsIGFzIERhdGUsIHsgZGF5czogLTEgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBnZXROZXh0UmFuZ2UoY3VycmVudFN0YXJ0RGF0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgY3VycmVudEVuZERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUpOiBbc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSwgc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZV0ge1xyXG4gICAgICAgIHRoaXMuaXNTZWxlY3RlZFByZWRlZmluZWRQZXJpb2QgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmdldFJhbmdlKFxyXG4gICAgICAgICAgICBuZXcgRGF0ZShjdXJyZW50U3RhcnREYXRlKSxcclxuICAgICAgICAgICAgbmV3IERhdGUoY3VycmVudEVuZERhdGUpLFxyXG4gICAgICAgICAgICAnbmV4dCdcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQcmV2aW91c1JhbmdlKGN1cnJlbnRTdGFydERhdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGUsIGN1cnJlbnRFbmREYXRlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKTogW3N0cmluZyB8IG51bWJlciB8IERhdGUsIHN0cmluZyB8IG51bWJlciB8IERhdGVdIHtcclxuICAgICAgICB0aGlzLmlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRlUGlja2VyU2VydmljZS5nZXRSYW5nZShcclxuICAgICAgICAgICAgbmV3IERhdGUoY3VycmVudFN0YXJ0RGF0ZSksXHJcbiAgICAgICAgICAgIG5ldyBEYXRlKGN1cnJlbnRFbmREYXRlKSxcclxuICAgICAgICAgICAgJ3ByZXZpb3VzJ1xyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldE5leHRQcmV2aW91c1JhbmdlKHNldE5leHQ6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmlzU2VsZWN0ZWRQcmVkZWZpbmVkUGVyaW9kID0gdHJ1ZTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICEodGhpcy5zZWxlY3RlZERhdGVTdGFydCBpbnN0YW5jZW9mIERhdGUpIHx8XHJcbiAgICAgICAgICAgICEodGhpcy5zZWxlY3RlZERhdGVFbmQgaW5zdGFuY2VvZiBEYXRlKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuZ2V0UmFuZ2UoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQsXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlRW5kLFxyXG4gICAgICAgICAgICBzZXROZXh0ID8gJ25leHQnIDogJ3ByZXZpb3VzJ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUocmFuZ2VbMF0sIHJhbmdlWzFdKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2VsbENzc0NsYXNzKGRhdGU6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyRGF0ZSA9IG5ldyBEYXRlKGRhdGUpO1xyXG4gICAgICAgIGxldCBjc3MgPSAnJztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uS2luZCA9PSAncGVyaW9kJykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZERhdGVTdGFydEFzRGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZERhdGVFbmRBc0RhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBpc0FmdGVyKGNhbGVuZGFyRGF0ZSwgc3RhcnRPZkRheShzZWxlY3RlZERhdGVTdGFydEFzRGF0ZSkpICYmXHJcbiAgICAgICAgICAgICAgICBpc0JlZm9yZShjYWxlbmRhckRhdGUsIHN0YXJ0T2ZEYXkoc2VsZWN0ZWREYXRlRW5kQXNEYXRlKSkgJiZcclxuICAgICAgICAgICAgICAgICF0aGlzLmRpc2FibGVkRGF0ZXMuc29tZSgoZGF5KSA9PiBpc1NhbWVEYXkoY2FsZW5kYXJEYXRlLCBkYXkpKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGNzcyArPSAnIGJnLXByaW1hcnktbGlnaHQgdGV4dC1kYXJrIHJvdW5kZWQtMCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNTYW1lRGF5KGNhbGVuZGFyRGF0ZSwgc2VsZWN0ZWREYXRlU3RhcnRBc0RhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3NzICs9ICcgYmctcHJpbWFyeSB0ZXh0LXdoaXRlIHJvdW5kZWQtc3RhcnQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzU2FtZURheShjYWxlbmRhckRhdGUsIHNlbGVjdGVkRGF0ZUVuZEFzRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjc3MgKz0gJyBiZy1wcmltYXJ5IHRleHQtd2hpdGUgcm91bmRlZC1lbmQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjc3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlbGVjdEVuZERhdGUoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbktpbmQgPT0gXCJwZXJpb2RcIiAmJiB0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0Rm9jdXMgJiYgdGhpcy5jYWxlbmRhckNlbGxDbGlja2VkKGV2ZW50KSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUZvY3VzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2FsZW5kYXIgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpe1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zaG93RGF0ZXBpY2tlcikge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0VzY2FwZScpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmNvZGUgPT09ICdFbnRlcicgfHwgZXZlbnQuY29kZSA9PT0gJ051bXBhZEVudGVyJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBseVBlcmlvZFBpY2tlcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxlbmRhckNlbGxDbGlja2VkKGV2ZW50OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICAvLyBUaGlzIGNoZWNrIGlzIHRpZ2h0bHkgY291cGxlZCB3aXRoIGN1cnJlbnQgRFggaW1wbGVtZW50YXRpb24gc28gaXRcclxuICAgICAgICAvLyBtdXN0IGJlIHJlLWNoZWNrZWQgYWZ0ZXIgZWFjaCBtYWpvciB1cGRhdGUgb2YgdGhlIERYIGNvbXBvbmVudHNcclxuICAgICAgICAvLyBBbHNvIGNoZWNrIGlmIGR4LWNhbGVuZGFyIHByb3ZpZGVzIGluZm8gYWJvdXQgY2xpY2tlZCBlbGVtZW50IGJ5XHJcbiAgICAgICAgLy8gZGVzaWduLlxyXG4gICAgICAgIGNvbnN0IHRhcmdldFBhcmVudENsYXNzTGlzdCA9IGV2ZW50LnRhcmdldD8ub2Zmc2V0UGFyZW50Py5jbGFzc0xpc3Q7XHJcbiAgICAgICAgaWYgKCF0YXJnZXRQYXJlbnRDbGFzc0xpc3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpc0NhbGVuZGFyQ2VsbCA9IFsuLi50YXJnZXRQYXJlbnRDbGFzc0xpc3RdLmluY2x1ZGVzKCdkeC1jYWxlbmRhci1jZWxsJyk7XHJcbiAgICAgICAgcmV0dXJuIGlzQ2FsZW5kYXJDZWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlTG9jYWxlc0NoYW5nZSgpOiB2b2lkIHtcclxuICAgICAgICAvLyBhcHBseSBuZXcgbG9jYWxlIHRvIERYXHJcbiAgICAgICAgLy8gaWYgYXJyYXkgb2YgbG9jYWxlcyB3YXMgcHJvdmlkZWQgdXNlIGZpcnN0IG9uZVxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5sb2NhbGVzID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBsb2NhbGUodGhpcy5sb2NhbGVzKTtcclxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5sb2NhbGVzKSAmJiB0aGlzLmxvY2FsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsb2NhbGUodGhpcy5sb2NhbGVzWzBdKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RhcnRCb3g/Lmluc3RhbmNlLnJlcGFpbnQoKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZUVuZEJveD8uaW5zdGFuY2UucmVwYWludCgpO1xyXG4gICAgICAgIHRoaXMuc2luZ2xlRGF0ZVBpY2tlckJveD8uaW5zdGFuY2UucmVwYWludCgpO1xyXG4gICAgICAgIHRoaXMuY2FsZW5kYXI/Lmluc3RhbmNlLnJlcGFpbnQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGVSYW5nZVRleHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUN1c3RvbVRleHQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jdXN0b21EYXRlUmFuZ2UubmFtZSA9IHRoaXMudHJhbnNsYXRpb25zPy5jdXN0b21cclxuICAgICAgICAgICAgPyB0aGlzLnRyYW5zbGF0aW9ucy5jdXN0b21cclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbW92ZUR4RGVmYXVsdENhbGVuZGFyRm9jdXMoKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgICAgICcjZGF0ZXBpY2tlcmNvbXBvbmVudCAuZHgtY2FsZW5kYXItc2VsZWN0ZWQtZGF0ZSdcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgZWxlbWVudCAmJlxyXG4gICAgICAgICAgICBlbGVtZW50Py5jbGFzc0xpc3Q/LmNvbnRhaW5zKCdkeC1jYWxlbmRhci1zZWxlY3RlZC1kYXRlJylcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgZWxlbWVudD8uY2xhc3NMaXN0Py5yZW1vdmUoJ2R4LWNhbGVuZGFyLXNlbGVjdGVkLWRhdGUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRTZWxlY3RlZERhdGVSYW5nZVRleHQoKXtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25LaW5kID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF0Y2hEYXRlUmFuZ2UobmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVJbnRlcm5hbCksIG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpKTtcclxuICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlSW50ZXJuYWwpLCBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUludGVybmFsKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tYXRjaERhdGVSYW5nZShuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZVN0YXJ0KSwgbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGVFbmQpKTtcclxuICAgICAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VUZXh0KG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlU3RhcnQpLCBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZUVuZCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdG9nZ2xlRGF0ZVJhbmdlU2VsZWN0b3JWaXNpYmlsaXR5KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3Rvcikge1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3RvciA9XHJcbiAgICAgICAgICAgICF0aGlzLnNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjaGFuZ0RhdGVSYW5nZShyYW5nZTogUGVyaW9kUGlja2VyRGF0ZVJhbmdlKSB7XHJcbiAgICAgICAgdGhpcy5zaG93UHJlZGVmaW5lZE9wdGlvbnNTZWxlY3RvciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0gcmFuZ2U7XHJcblxyXG4gICAgICAgIGlmIChyYW5nZSA9PT0gdGhpcy5jdXN0b21EYXRlUmFuZ2UpIHtcclxuICAgICAgICAgICAgLy8gdGhpcy5vcGVuRGF0ZXBpY2tlclBvcHVwKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0RhdGVwaWNrZXIgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVN0YXJ0ID0gcmFuZ2UuZGF0ZUZyb21cclxuICAgICAgICAgICAgICAgID8gcmFuZ2UuZGF0ZUZyb21cclxuICAgICAgICAgICAgICAgIDogc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuICAgICAgICAgICAgdGhpcy5kYXRlRW5kID0gcmFuZ2UuZGF0ZVRvID8gcmFuZ2UuZGF0ZVRvIDogc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZERhdGUodGhpcy5kYXRlU3RhcnQsIHRoaXMuZGF0ZUVuZCwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc0RhdGVEaXNhYmxlZCA9IChhcmdzOiBhbnkpOiBib29sZWFuID0+IHtcclxuICAgICAgICBpZiAodGhpcy5sb2NrQmVmb3JlRGF0ZSAmJiBpc0JlZm9yZShhcmdzLmRhdGUsIHRoaXMubG9ja0JlZm9yZURhdGUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZERhdGVzLnNvbWUoKGRheSkgPT4gaXNTYW1lRGF5KGFyZ3MuZGF0ZSwgZGF5KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtYXRjaERhdGVSYW5nZShkYXRlRnJvbT86IERhdGUsIGRhdGVUbz86IERhdGUpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWRhdGVGcm9tIHx8ICFkYXRlVG8pIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSA9IHRoaXMuY3VzdG9tRGF0ZVJhbmdlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdlbmVyYXRlRGF0ZVJhbmdlcygpO1xyXG5cclxuICAgICAgICBjb25zdCBkYXRlUmFuZ2UgPSB0aGlzLnByZWRlZmluZWREYXRlUmFuZ2VzLmZpbHRlcihcclxuICAgICAgICAgICAgKHgpID0+XHJcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkoeC5kYXRlRnJvbSBhcyBEYXRlLCBkYXRlRnJvbSkgJiZcclxuICAgICAgICAgICAgICAgIGlzU2FtZURheSh4LmRhdGVUbyBhcyBEYXRlLCBkYXRlVG8pXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoZGF0ZVJhbmdlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0gZGF0ZVJhbmdlWzBdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgPSB0aGlzLmN1c3RvbURhdGVSYW5nZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXREYXRlUmFuZ2VUZXh0KGRhdGVGcm9tPzogRGF0ZSwgZGF0ZVRvPzogRGF0ZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlTmFtZSA9ICcnO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSAnJztcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyID0gJyc7XHJcblxyXG4gICAgICAgIGlmICghKGRhdGVGcm9tIGluc3RhbmNlb2YgRGF0ZSkgfHwgIShkYXRlVG8gaW5zdGFuY2VvZiBEYXRlKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSRVNPTFZFIFBFUklPRFxyXG4gICAgICAgIC8vIG9uZSBkYXlcclxuICAgICAgICBpZiAoaXNTYW1lRGF5KGRhdGVGcm9tLCBkYXRlVG8pKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5zaW5nbGVEYXlGb3JtYXRGbiAhPT0gJ3VuZGVmaW5lZCcpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuc2luZ2xlRGF5Rm9ybWF0Rm4oZGF0ZUZyb20pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGUgPT0gJ2NvbXBhY3QnICYmIHRoaXMuY29tcGFjdFN0eWxlRGlzcGxheSA9PSAnYm90aCcgJiYgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSAmJiB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlICE9IHRoaXMuY3VzdG9tRGF0ZVJhbmdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MSA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlRnJvbSk7ICAvL3NraXAgZGF5IG5hbWUsIGFzIHdlIGhhdmUgY3VzdG9tIHRleHQuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSB0aGlzLmZvcm1hdERhdGUoZGF0ZUZyb20sICdkYXktbG9uZycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGRhdGUgcmFuZ2VcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gZGF0ZSByYW5nZSAtIHVzZSBwcm92aWRlZCBkYXRlUmFuZ2UgZm9ybWF0IGZ1bmN0aW9uIChpZiBkZWZpbmVkKVxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGF0ZVJhbmdlRm9ybWF0Rm4gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxID0gdGhpcy5kYXRlUmFuZ2VGb3JtYXRGbihkYXRlRnJvbSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyID0gdGhpcy5kYXRlUmFuZ2VGb3JtYXRGbihkYXRlVG8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGZ1bGwgbW9udGhcclxuICAgICAgICAgICAgZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkoZGF0ZUZyb20sIHN0YXJ0T2ZNb250aChkYXRlRnJvbSkpICYmXHJcbiAgICAgICAgICAgICAgICBpc1NhbWVEYXkoZGF0ZVRvLCBlbmRPZk1vbnRoKGRhdGVUbykpICYmXHJcbiAgICAgICAgICAgICAgICBpc1NhbWVNb250aChkYXRlRnJvbSwgZGF0ZVRvKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSB0aGlzLmZvcm1hdERhdGUoXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUZyb20sXHJcbiAgICAgICAgICAgICAgICAgICAgJ21vbnRoJ1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBkYXRlIHJhbmdlIC0gdXNlIGRlZmF1bHQgZGF0ZSBmb3JtYXQgZnVuY3Rpb25cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxID0gdGhpcy5mb3JtYXREYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVGcm9tLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzU2FtZVllYXIoZGF0ZUZyb20sIHRvZGF5KSA/ICdkYXktc2hvcnQnIDogJ2RheSdcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyID0gdGhpcy5mb3JtYXREYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGVUbyxcclxuICAgICAgICAgICAgICAgICAgICBpc1NhbWVZZWFyKGRhdGVUbywgdG9kYXkpID8gJ2RheS1zaG9ydCcgOiAnZGF5J1xyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc3R5bGUgPT0gJ2NvbXBhY3QnICYmIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgJiYgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSAhPSB0aGlzLmN1c3RvbURhdGVSYW5nZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0U3R5bGVEaXNwbGF5ID09ICdwcmVkZWZpbmVkUmFuZ2UnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlTmFtZSA9IHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UubmFtZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSAnJztcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDIgPSAnJztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY29tcGFjdFN0eWxlRGlzcGxheSA9PSAnYm90aCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VOYW1lID0gdGhpcy5zZWxlY3RlZERhdGVSYW5nZS5uYW1lICsgJywgJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBASW5wdXQoKSBwdWJsaWMgc3R5bGU6ICdjbGFzc2ljJyB8ICdjb21wYWN0JyA9ICdjbGFzc2ljJztcclxuICAgICAgICAvLyBASW5wdXQoKSBwdWJsaWMgY29tcGFjdFN0eWxlRGlzcGxheTogJ2RhdGUnIHwgJ3ByZWRlZmluZWRSYW5nZScgfCAnYm90aCcgPSAncHJlZGVmaW5lZFJhbmdlJztcclxuICAgICAgICAvLyBpZiAodGhpcy5zdHlsZSA9PSAnY29tcGFjdCcgJiYgdGhpcy5jb21wYWN0U3R5bGVEaXNwbGF5ID09ICdwcmVkZWZpbmVkUmFuZ2UnICYmIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UgJiYgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSAhPSB0aGlzLmN1c3RvbURhdGVSYW5nZSkge1xyXG4gICAgICAgIC8vICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxID0gdGhpcy5zZWxlY3RlZERhdGVSYW5nZS5uYW1lO1xyXG4gICAgICAgIC8vICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQyID0gJyc7XHJcbiAgICAgICAgLy8gICAgIHJldHVybjtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuc3R5bGUgPT0gJ2NvbXBhY3QnICYmIHRoaXMuY29tcGFjdFN0eWxlRGlzcGxheSA9PSAnYm90aCcgJiYgdGhpcy5zZWxlY3RlZERhdGVSYW5nZSAmJiB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlICE9IHRoaXMuY3VzdG9tRGF0ZVJhbmdlKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDEgPSB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlLm5hbWU7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDIgPSAnJztcclxuICAgICAgICAvLyAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZvcm1hdERhdGUoXHJcbiAgICAgICAgZGF0ZTogRGF0ZSxcclxuICAgICAgICB0eXBlPzogJ21vbnRoJyB8ICdkYXknIHwgJ2RheS1sb25nJyB8ICdkYXktc2hvcnQnIHwgdW5kZWZpbmVkXHJcbiAgICApOiBzdHJpbmcge1xyXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlICdtb250aCc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdsb25nJyxcclxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgZGF5OiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY2FzZSAnZGF5LWxvbmcnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMubG9jYWxlcywge1xyXG4gICAgICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgICAgIHdlZWtkYXk6ICdsb25nJyxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjYXNlICdkYXktc2hvcnQnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMubG9jYWxlcywge1xyXG4gICAgICAgICAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnc2hvcnQnLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdzaG9ydCcsXHJcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGVzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9udGg6ICdudW1lcmljJyxcclxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZURhdGVSYW5nZXMoZm9yY2U/OiBib29sZWFuKSB7XHJcbiAgICAgICAgY29uc3QgdG9kYXkgPSBzdGFydE9mRGF5KG5ldyBEYXRlKCkpO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIGZvcmNlIHx8XHJcbiAgICAgICAgICAgICF0aGlzLnByZWRlZmluZWREYXRlUmFuZ2VzR2VuZXJhdGVkRGF0ZSB8fFxyXG4gICAgICAgICAgICAhaXNTYW1lRGF5KHRoaXMucHJlZGVmaW5lZERhdGVSYW5nZXNHZW5lcmF0ZWREYXRlLCB0b2RheSlcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5wcmVkZWZpbmVkRGF0ZVJhbmdlc0dlbmVyYXRlZERhdGUgPSB0b2RheTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucHJlZGVmaW5lZERhdGVSYW5nZXMgPVxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlUGlja2VyU2VydmljZS5nZXRQcmVkZWZpbmVkRGF0ZVJhbmdlcyhcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVSYW5nZURlZmluaXRpb25zLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvZGF5LFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3REYXlPZldlZWtcclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRhdGVSYW5nZXMgPSBbLi4udGhpcy5wcmVkZWZpbmVkRGF0ZVJhbmdlc107XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlcy5wdXNoKHRoaXMuY3VzdG9tRGF0ZVJhbmdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBtZXRob2RzXHJcbn1cclxuIiwiPCEtLSA8ZGl2IGlkPVwiZGF0ZXBpY2tlcmJ1dHRvbnNcIj4gLS0+XHJcbiAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJkYXRlcGlja2VyIGQtaW5saW5lLWZsZXggYmctd2hpdGUgc2RzLW5vLXByaW50XCJcclxuICAgICAgICByb2xlPVwiZ3JvdXBcIlxyXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY29tcG9uZW50QXJpYUxhYmVsXCJcclxuICAgICAgICBbc3R5bGUud2lkdGhdPVwid2lkdGhcIlxyXG4gICAgPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3R5bGUgPT0gJ2NsYXNzaWMnXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWdyb3VwXCJcclxuICAgICAgICAgICAgICAgIHJvbGU9XCJncm91cFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGVSYW5nZURlZmluaXRpb25zICYmIGRhdGVSYW5nZURlZmluaXRpb25zLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwicGlja2VyUHJlZGVmaW5lZFJhbmdlRHJvcGRvd257eyByYW5kb21JZFJlZmVyZW5jZSB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnRuIGJ0bi13aGl0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRlZC1zdGFydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXItZW5kXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHAtMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZHMtZnctNDAwXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJkYXRlUmFuZ2VEZWZpbml0aW9uc1dpZHRoXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRGF0ZVJhbmdlU2VsZWN0b3JWaXNpYmlsaXR5KClcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcy0yIG1zLTEgbWUtMSBkYXRlLXJhbmdlLXRleHQgdGV4dC10cnVuY2F0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzZWxlY3RlZERhdGVSYW5nZS5uYW1lfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBkYXRlLXJhbmdlLWRyb3Bkb3duLWJ1dHRvbiBzZHMtZnctNDAwXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJvcGVuRGF0ZVJhbmdlRGVmaW5pdGlvbnNBcmlhTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImVsZW1lbnRVVUlEICsgJ19wcmVkZWZpbmVkX3BlcmlvZHNfZHJvcGRvd24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgPGR4LXBvcG92ZXJcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGVSYW5nZURlZmluaXRpb25zICYmIGRhdGVSYW5nZURlZmluaXRpb25zLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCJlbGVtZW50VVVJRCArICdfcHJlZGVmaW5lZF9wZXJpb2RzX2Ryb3Bkb3duJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiI3BpY2tlclByZWRlZmluZWRSYW5nZURyb3Bkb3due3sgcmFuZG9tSWRSZWZlcmVuY2UgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgICAgICBbKHZpc2libGUpXT1cInNob3dQcmVkZWZpbmVkT3B0aW9uc1NlbGVjdG9yXCJcclxuICAgICAgICAgICAgICAgICAgICBbd3JhcHBlckF0dHJdPVwieyBjbGFzczogJ3Nkcy1kYXRlcGlja2VyLXJhbmdlcy1wb3BvdmVyIHNkcy1keC1wb3B1cC1uby1hcnJvdycgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21pbldpZHRoXT1cImRhdGVSYW5nZURlZmluaXRpb25zV2lkdGhcIlxyXG5cclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCIgY2RrVHJhcEZvY3VzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByYW5nZSBvZiBkYXRlUmFuZ2VzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByZWRlZmluZWQtZGF0ZS1yYW5nZSBweC0zIHB5LTIgdy0xMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJyYW5nZSA9PT0gc2VsZWN0ZWREYXRlUmFuZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ0RhdGVSYW5nZShyYW5nZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uUmFuZ2VLZXlSZWxlYXNlZCgkZXZlbnQsIHJhbmdlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3JhbmdlLm5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9keC1wb3BvdmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgKm5nSWY9XCJzaG93UHJldmlvdXNBbmROZXh0QnV0dG9uc1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBib3JkZXIgYm9yZGVyLWVuZC0wIHBlLTIgc2RzLWZ3LTQwMFwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5yb3VuZGVkLXN0YXJ0XSA9IFwic3R5bGUgPT0gJ2NvbXBhY3QnIHx8ICghZGF0ZVJhbmdlRGVmaW5pdGlvbnMgfHwgZGF0ZVJhbmdlRGVmaW5pdGlvbnMubGVuZ3RoID09PSAwKVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItc3RhcnQtMF0gPSBcInN0eWxlID09ICdjbGFzc2ljJyAmJiBkYXRlUmFuZ2VEZWZpbml0aW9ucy5sZW5ndGggPiAwXCJcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicHJldmlvdXNQZXJpb2RBcmlhTGFiZWxcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNaW5pbXVtTGltaXQgfHwgZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZ29Ub1ByZXZpb3VzRGF0ZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cInByZXZpb3VzUGVyaW9kSWNvblwiPjwvZmEtaWNvbj5cclxuXHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgI3NlbGVjdGVkRGF0ZVJhbmdlQnV0dG9uXHJcbiAgICAgICAgICAgIGlkPVwicGlja2VyRHJvcGRvd257eyByYW5kb21JZFJlZmVyZW5jZSB9fVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBib3JkZXItdG9wIGJvcmRlci1ib3R0b20gdGV4dC10cnVuY2F0ZSBweC0wIHNlbGVjdGVkLXBlcmlvZCBzZHMtZnctNDAwXCJcclxuICAgICAgICAgICAgW2NsYXNzLnJvdW5kZWQtc3RhcnRdID0gXCIoIWRhdGVSYW5nZURlZmluaXRpb25zIHx8IGRhdGVSYW5nZURlZmluaXRpb25zLmxlbmd0aCA9PT0gMCkgJiYgIXNob3dQcmV2aW91c0FuZE5leHRCdXR0b25zXCJcclxuICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1zdGFydF0gPSBcIighZGF0ZVJhbmdlRGVmaW5pdGlvbnMgfHwgZGF0ZVJhbmdlRGVmaW5pdGlvbnMubGVuZ3RoID09PSAwKSAmJiAhc2hvd1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnNcIlxyXG4gICAgICAgICAgICBbY2xhc3Mucm91bmRlZC1lbmRdID0gXCIhc2hvd1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnNcIlxyXG4gICAgICAgICAgICBbY2xhc3MuYm9yZGVyLWVuZF0gPSBcIiFzaG93UHJldmlvdXNBbmROZXh0QnV0dG9uc1wiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2hvd0RhdGVwaWNrZXIgPSAhc2hvd0RhdGVwaWNrZXJcIlxyXG4gICAgICAgID5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250ZW50ICpuZ0lmPVwidXNlQ3VzdG9tRGlzcGxheUNvbnRlbnRcIiBzZWxlY3Q9XCJkaXNwbGF5XCI+PC9uZy1jb250ZW50PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXVzZUN1c3RvbURpc3BsYXlDb250ZW50XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJteC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiY2FsZW5kYXJJY29uXCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTEgdGV4dC10cnVuY2F0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7c2VsZWN0ZWREYXRlUmFuZ2VOYW1lfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tzZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50MX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxmYS1pY29uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm14LTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJ0b0ljb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICAgICAgICAgID48L2ZhLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tzZWxlY3RlZERhdGVSYW5nZVRleHRTZWdtZW50Mn19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd1ByZXZpb3VzQW5kTmV4dEJ1dHRvbnNcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgYm9yZGVyIHJvdW5kZWQtZW5kIGJvcmRlci1zdGFydC0wIHBzLTIgc2RzLWZ3LTQwMFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm5leHRQZXJpb2RBcmlhTGFiZWxcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNYXhpbXVtTGltaXQgfHwgZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZ29Ub05leHREYXRlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwibmV4dFBlcmlvZEljb25cIj48L2ZhLWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwic2RzLXByaW50LW9ubHkgaC0xMDBcIj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCJ1c2VDdXN0b21EaXNwbGF5Q29udGVudFwiIHNlbGVjdD1cImRpc3BsYXlcIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIiF1c2VDdXN0b21EaXNwbGF5Q29udGVudFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm14LTFcIj5cclxuICAgICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cImNhbGVuZGFySWNvblwiIHNpemU9XCJzbVwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMSB0ZXh0LXRydW5jYXRlXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj57e3NlbGVjdGVkRGF0ZVJhbmdlVGV4dFNlZ21lbnQxfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8ZmEtaWNvblxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXgtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwidG9JY29uXCJcclxuICAgICAgICAgICAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgICAgICAgPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7c2VsZWN0ZWREYXRlUmFuZ2VUZXh0U2VnbWVudDJ9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbjxkeC1wb3BvdmVyXHJcbiAgICB0YXJnZXQ9XCIjcGlja2VyRHJvcGRvd257eyByYW5kb21JZFJlZmVyZW5jZSB9fVwiXHJcbiAgICBwb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICBbKHZpc2libGUpXT1cInNob3dEYXRlcGlja2VyXCJcclxuICAgIChvbkhpZGluZyk9XCJvbkhpZGRlbkNhbGVuZGFyUG9wb3ZlcigpXCJcclxuICAgIChvblNob3dpbmcpPVwib25TaG93aW5nQ2FsZW5kYXJQb3BvdmVyKClcIlxyXG4gICAgY2xhc3M9XCJtLTAgcC0wXCJcclxuICAgIFt3cmFwcGVyQXR0cl09XCJ7XHJcbiAgICAgICAgY2xhc3M6ICdzZHMtZGF0ZXBpY2tlci1wb3BvdmVyICcgKyBkcm9wZG93bldyYXBwZXJDbGFzcyxcclxuICAgICAgICBpZDogZHJvcGRvd25XcmFwcGVySWRcclxuICAgIH1cIlxyXG4+XHJcbiAgICA8ZHhvLWFuaW1hdGlvbj5cclxuICAgICAgICA8ZHhvLXNob3dcclxuICAgICAgICAgICAgdHlwZT1cInBvcFwiXHJcbiAgICAgICAgICAgIFtmcm9tXT1cInsgc2NhbGU6IDAuOSB9XCJcclxuICAgICAgICAgICAgW3RvXT1cInsgc2NhbGU6IDEgfVwiXHJcbiAgICAgICAgPjwvZHhvLXNob3c+XHJcbiAgICAgICAgPGR4by1oaWRlXHJcbiAgICAgICAgICAgIHR5cGU9XCJmYWRlXCJcclxuICAgICAgICAgICAgW2Zyb21dPVwiMVwiXHJcbiAgICAgICAgICAgIFt0b109XCIwXCJcclxuICAgICAgICA+PC9keG8taGlkZT5cclxuICAgIDwvZHhvLWFuaW1hdGlvbj5cclxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIiAoa2V5ZG93bik9XCJvbktleWRvd24oJGV2ZW50KVwiIHRhYmluZGV4PVwiMVwiPlxyXG4gICAgICAgIDxkeC1zY3JvbGwtdmlldz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXJvd1wiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN0eWxlID09ICdjb21wYWN0JyAmJiBkYXRlUmFuZ2VzLmxlbmd0aCA+IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIHAtMyBiZy1ncmF5LTEwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1icy1ncmF5LTIwMClcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidHJhbnNsYXRpb25zLnByZXNldHNcIiBjbGFzcz1cInB4LTMgcHktMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3sgdHJhbnNsYXRpb25zLnByZXNldHMgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJhbmdlIG9mIGRhdGVSYW5nZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcmVkZWZpbmVkLWRhdGUtcmFuZ2UgcHgtMyBweS0yIHctMTAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJyYW5nZSA9PT0gc2VsZWN0ZWREYXRlUmFuZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nRGF0ZVJhbmdlKHJhbmdlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tyYW5nZS5uYW1lfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cImRhdGVwaWNrZXJjb21wb25lbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidGhpcy5zZWxlY3Rpb25LaW5kID09ICdwZXJpb2QnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJkYXRlLWlucHV0c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBweC0zIHB0LTMgcGItMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWRhdGUtYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3NlbGVjdGVkRGF0ZVN0YXJ0Qm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJib3JkZXIgcC0xIG0tMCB0ZXh0LWNlbnRlciByb3VuZGVkIGRhdGVwaWNrZXItaW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVJbnB1dF09XCJzZWxlY3RlZERhdGVGb2N1c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dDbGVhckJ1dHRvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dEcm9wRG93bkJ1dHRvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZU1hc2tCZWhhdmlvcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheUZvcm1hdF09XCJkYXRlSW5wdXREaXNwbGF5Rm9ybWF0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlIHx8IG1pbkRhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cIm1heERhdGUgfHwgbWF4RGF0ZURlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1ZhbGlkXT1cImlzVmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uRXJyb3JdPVwidmFsaWRhdGlvbkVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZERhdGVTdGFydFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cIm9uU3RhcnREYXRlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZvY3VzSW4pPVwib25TdGFydERhdGVGb2N1cygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtZGF0ZS1ib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBweC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJ0b0ljb25cIj48L2ZhLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWRhdGUtYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3NlbGVjdGVkRGF0ZUVuZEJveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIHAtMSBtLTAgdGV4dC1jZW50ZXIgcm91bmRlZCBkYXRlcGlja2VyLWlucHV0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlSW5wdXRdPVwiIXNlbGVjdGVkRGF0ZUZvY3VzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NsZWFyQnV0dG9uXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0Ryb3BEb3duQnV0dG9uXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdXNlTWFza0JlaGF2aW9yXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5Rm9ybWF0XT1cImRhdGVJbnB1dERpc3BsYXlGb3JtYXRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cIm1pbkRhdGUgfHwgbWluRGF0ZURlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwibWF4RGF0ZSB8fCBtYXhEYXRlRGVmYXVsdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzVmFsaWRdPVwiaXNWYWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25FcnJvcl09XCJ2YWxpZGF0aW9uRXJyb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkRGF0ZUVuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cIm9uRW5kRGF0ZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25Gb2N1c0luKT1cIm9uRW5kRGF0ZUZvY3VzKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC1kYXRlLWJveD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZy13aGl0ZSBteC0yIHB4LTIgcHktMiBkYXRlLXBpY2tlci1kYXRlLXNlbGVjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRoaXMuc2VsZWN0aW9uS2luZCA9PSAnc2luZ2xlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImRhdGUtaW5wdXRzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBwLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWRhdGUtYm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNzaW5nbGVEYXRlUGlja2VyQm94XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyIHAtMSBtLTAgdGV4dC1jZW50ZXIgcm91bmRlZCBkYXRlcGlja2VyLWlucHV0IGRhdGVwaWNrZXItaW5wdXQtbGFyZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlSW5wdXRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2xlYXJCdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0Ryb3BEb3duQnV0dG9uXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZU1hc2tCZWhhdmlvcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwiZGF0ZUlucHV0RGlzcGxheUZvcm1hdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlIHx8IG1pbkRhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJtYXhEYXRlIHx8IG1heERhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzVmFsaWRdPVwiaXNWYWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uRXJyb3JdPVwidmFsaWRhdGlvbkVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyh2YWx1ZSldPVwic2VsZWN0ZWREYXRlSW50ZXJuYWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2R4LWRhdGUtYm94PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gKG9uVmFsdWVDaGFuZ2VkKT1cIiBjbG9zZURhdGVwaWNrZXJQb3B1cCgpXCIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RW5kRGF0ZSgkZXZlbnQpXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNhbGVuZGFyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NhbGVuZGFyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlIHx8IG1pbkRhdGVEZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cIm1heERhdGUgfHwgbWF4RGF0ZURlZmF1bHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZERhdGVzXT1cImlzRGF0ZURpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNWYWxpZF09XCJpc1ZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvbkVycm9yXT1cInZhbGlkYXRpb25FcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGhpcy5zZWxlY3Rpb25LaW5kID09ICdwZXJpb2QnID8gc2VsZWN0ZWREYXRlQ2FsZW5kYXIgOiBzZWxlY3RlZERhdGVJbnRlcm5hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uVmFsdWVDaGFuZ2VkKT1cIm9uRGF0ZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlyc3REYXlPZldlZWtdPVwiZmlyc3REYXlPZldlZWtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmR4VGVtcGxhdGU9XCJsZXQgY2VsbERhdGEgb2YgJ2NlbGwnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIidoLTEwMCBwdC0xJyArIGdldENlbGxDc3NDbGFzcyhjZWxsRGF0YS5kYXRlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5saW5lLWhlaWdodC5weF09XCIyM1wiXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImxvY2tCZWZvcmVEYXRlICYmIChjZWxsRGF0YS5kYXRlIHwgc2RzRGF0ZUNvbXBhcmU6IGxvY2tCZWZvcmVEYXRlIDogJ2x0ZScpOyB0aGVuIHRoZW5Mb2NrQmxvY2sgZWxzZSBlbHNlRGVmYXVsdEJsb2NrXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdGhlbkxvY2tCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIFt0aXRsZV09XCJsb2NrQmVmb3JlRGF0ZUhpbnRcIiBbaWNvbl09XCJsb2NrSWNvblwiICBjbGFzcz1cImxvY2tlZC1kYXkgcG9zaXRpb24tYWJzb2x1dGUteFwiPjwvZmEtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbHNlRGVmYXVsdEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2VsbERhdGEudGV4dCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC1jYWxlbmRhcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0aGlzLnNlbGVjdGlvbktpbmQgPT0gJ3BlcmlvZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBweC0zIHB0LTIgcGItM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IHNkcy1mdy00MDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93RGF0ZXBpY2tlciA9IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0cmFuc2xhdGlvbnMuY2FuY2VsfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gKGNsaWNrKT1cImNsb3NlRGF0ZXBpY2tlclBvcHVwKClcIiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXMtMSBzZHMtZnctNDAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQZXJpb2RQaWNrZXIoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdHJhbnNsYXRpb25zLmFwcGx5fX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9keC1zY3JvbGwtdmlldz5cclxuICAgIDwvZGl2PlxyXG48L2R4LXBvcG92ZXI+XHJcbjwhLS0gPC9kaXY+IC0tPlxyXG5cclxuIl19
|