@coreui/angular-pro 5.2.23 → 5.3.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 +5 -5
- package/fesm2022/coreui-angular-pro.mjs +1067 -1166
- package/fesm2022/coreui-angular-pro.mjs.map +1 -1
- package/lib/grid/col.directive.d.ts +26 -26
- package/lib/smart-table/smart-table-head/smart-table-head.component.d.ts +2 -2
- package/lib/tabs-2/tab/tab.directive.d.ts +4 -3
- package/lib/tabs-2/tabs-list/tabs-list.component.d.ts +1 -1
- package/package.json +9 -11
- package/esm2022/coreui-angular-pro.mjs +0 -5
- package/esm2022/lib/accordion/accordion/accordion.component.mjs +0 -34
- package/esm2022/lib/accordion/accordion-button/accordion-button.directive.mjs +0 -35
- package/esm2022/lib/accordion/accordion-item/accordion-item.component.mjs +0 -59
- package/esm2022/lib/accordion/accordion.module.mjs +0 -36
- package/esm2022/lib/accordion/accordion.service.mjs +0 -36
- package/esm2022/lib/accordion/index.mjs +0 -2
- package/esm2022/lib/accordion/public_api.mjs +0 -5
- package/esm2022/lib/alert/alert-heading.directive.mjs +0 -15
- package/esm2022/lib/alert/alert-link.directive.mjs +0 -15
- package/esm2022/lib/alert/alert.component.mjs +0 -173
- package/esm2022/lib/alert/alert.module.mjs +0 -30
- package/esm2022/lib/alert/index.mjs +0 -2
- package/esm2022/lib/alert/public_api.mjs +0 -5
- package/esm2022/lib/avatar/avatar.component.mjs +0 -71
- package/esm2022/lib/avatar/avatar.module.mjs +0 -20
- package/esm2022/lib/avatar/index.mjs +0 -2
- package/esm2022/lib/avatar/public_api.mjs +0 -3
- package/esm2022/lib/backdrop/backdrop.service.mjs +0 -82
- package/esm2022/lib/backdrop/index.mjs +0 -2
- package/esm2022/lib/backdrop/public_api.mjs +0 -2
- package/esm2022/lib/badge/badge.component.mjs +0 -77
- package/esm2022/lib/badge/badge.module.mjs +0 -20
- package/esm2022/lib/badge/index.mjs +0 -2
- package/esm2022/lib/badge/public_api.mjs +0 -3
- package/esm2022/lib/breadcrumb/breadcrumb/breadcrumb.component.mjs +0 -40
- package/esm2022/lib/breadcrumb/breadcrumb-item/breadcrumb-item.component.mjs +0 -39
- package/esm2022/lib/breadcrumb/breadcrumb-item/breadcrumb-item.mjs +0 -2
- package/esm2022/lib/breadcrumb/breadcrumb-router/breadcrumb-router.component.mjs +0 -41
- package/esm2022/lib/breadcrumb/breadcrumb-router/breadcrumb-router.service.mjs +0 -52
- package/esm2022/lib/breadcrumb/breadcrumb.module.mjs +0 -34
- package/esm2022/lib/breadcrumb/index.mjs +0 -2
- package/esm2022/lib/breadcrumb/public_api.mjs +0 -6
- package/esm2022/lib/button/button-close.directive.mjs +0 -46
- package/esm2022/lib/button/button.directive.mjs +0 -88
- package/esm2022/lib/button/button.module.mjs +0 -25
- package/esm2022/lib/button/index.mjs +0 -2
- package/esm2022/lib/button/public_api.mjs +0 -4
- package/esm2022/lib/button-group/button-group/button-group.component.mjs +0 -41
- package/esm2022/lib/button-group/button-group.module.mjs +0 -17
- package/esm2022/lib/button-group/button-toolbar/button-toolbar.component.mjs +0 -24
- package/esm2022/lib/button-group/index.mjs +0 -2
- package/esm2022/lib/button-group/public_api.mjs +0 -4
- package/esm2022/lib/calendar/calendar/calendar-class-view.pipe.mjs +0 -20
- package/esm2022/lib/calendar/calendar/calendar.component.mjs +0 -380
- package/esm2022/lib/calendar/calendar-month/calendar-class-day.pipe.mjs +0 -30
- package/esm2022/lib/calendar/calendar-month/calendar-class-month.pipe.mjs +0 -24
- package/esm2022/lib/calendar/calendar-month/calendar-class-row.pipe.mjs +0 -24
- package/esm2022/lib/calendar/calendar-month/calendar-class-year.pipe.mjs +0 -22
- package/esm2022/lib/calendar/calendar-month/calendar-day-title.pipe.mjs +0 -17
- package/esm2022/lib/calendar/calendar-month/calendar-day.directive.mjs +0 -138
- package/esm2022/lib/calendar/calendar-month/calendar-day.pipe.mjs +0 -19
- package/esm2022/lib/calendar/calendar-month/calendar-month.component.mjs +0 -448
- package/esm2022/lib/calendar/calendar-month/calendar-row.directive.mjs +0 -123
- package/esm2022/lib/calendar/calendar-month/calendar-weekday.pipe.mjs +0 -21
- package/esm2022/lib/calendar/calendar-navigation/calendar-navigation.component.mjs +0 -87
- package/esm2022/lib/calendar/calendar.module.mjs +0 -57
- package/esm2022/lib/calendar/calendar.service.mjs +0 -66
- package/esm2022/lib/calendar/calendar.utils.mjs +0 -393
- package/esm2022/lib/calendar/index.mjs +0 -2
- package/esm2022/lib/calendar/public_api.mjs +0 -5
- package/esm2022/lib/callout/callout.component.mjs +0 -25
- package/esm2022/lib/callout/callout.module.mjs +0 -16
- package/esm2022/lib/callout/index.mjs +0 -2
- package/esm2022/lib/callout/public_api.mjs +0 -3
- package/esm2022/lib/card/card-body.component.mjs +0 -16
- package/esm2022/lib/card/card-footer.component.mjs +0 -16
- package/esm2022/lib/card/card-group.component.mjs +0 -16
- package/esm2022/lib/card/card-header-actions.component.mjs +0 -16
- package/esm2022/lib/card/card-header.component.mjs +0 -16
- package/esm2022/lib/card/card-img-overlay/card-img-overlay.component.mjs +0 -11
- package/esm2022/lib/card/card-img.directive.mjs +0 -32
- package/esm2022/lib/card/card-link.directive.mjs +0 -15
- package/esm2022/lib/card/card-subtitle.directive.mjs +0 -15
- package/esm2022/lib/card/card-text.directive.mjs +0 -15
- package/esm2022/lib/card/card-title.directive.mjs +0 -15
- package/esm2022/lib/card/card.component.mjs +0 -50
- package/esm2022/lib/card/card.module.mjs +0 -75
- package/esm2022/lib/card/index.mjs +0 -2
- package/esm2022/lib/card/public_api.mjs +0 -14
- package/esm2022/lib/carousel/carousel/carousel.component.mjs +0 -212
- package/esm2022/lib/carousel/carousel-caption/carousel-caption.component.mjs +0 -17
- package/esm2022/lib/carousel/carousel-control/carousel-control.component.mjs +0 -82
- package/esm2022/lib/carousel/carousel-indicators/carousel-indicators.component.mjs +0 -44
- package/esm2022/lib/carousel/carousel-inner/carousel-inner.component.mjs +0 -47
- package/esm2022/lib/carousel/carousel-item/carousel-item.component.mjs +0 -67
- package/esm2022/lib/carousel/carousel-state.mjs +0 -77
- package/esm2022/lib/carousel/carousel-state.type.mjs +0 -2
- package/esm2022/lib/carousel/carousel.animation.mjs +0 -70
- package/esm2022/lib/carousel/carousel.config.mjs +0 -22
- package/esm2022/lib/carousel/carousel.module.mjs +0 -52
- package/esm2022/lib/carousel/carousel.service.mjs +0 -18
- package/esm2022/lib/carousel/index.mjs +0 -2
- package/esm2022/lib/carousel/public_api.mjs +0 -9
- package/esm2022/lib/collapse/collapse.animations.mjs +0 -9
- package/esm2022/lib/collapse/collapse.directive.mjs +0 -145
- package/esm2022/lib/collapse/collapse.module.mjs +0 -19
- package/esm2022/lib/collapse/index.mjs +0 -2
- package/esm2022/lib/collapse/public_api.mjs +0 -3
- package/esm2022/lib/coreui.types.mjs +0 -10
- package/esm2022/lib/date-picker/date-picker.component.mjs +0 -80
- package/esm2022/lib/date-picker/date-picker.module.mjs +0 -16
- package/esm2022/lib/date-picker/index.mjs +0 -2
- package/esm2022/lib/date-picker/public_api.mjs +0 -3
- package/esm2022/lib/date-range-picker/date-range-picker/custom-range-key.pipe.mjs +0 -17
- package/esm2022/lib/date-range-picker/date-range-picker/date-range-picker.component.mjs +0 -599
- package/esm2022/lib/date-range-picker/date-range-picker.module.mjs +0 -16
- package/esm2022/lib/date-range-picker/index.mjs +0 -2
- package/esm2022/lib/date-range-picker/public_api.mjs +0 -3
- package/esm2022/lib/dropdown/dropdown/dropdown.component.mjs +0 -371
- package/esm2022/lib/dropdown/dropdown-close/dropdown-close.directive.mjs +0 -73
- package/esm2022/lib/dropdown/dropdown-divider/dropdown-divider.directive.mjs +0 -15
- package/esm2022/lib/dropdown/dropdown-header/dropdown-header.directive.mjs +0 -15
- package/esm2022/lib/dropdown/dropdown-item/dropdown-item-plain.directive.mjs +0 -15
- package/esm2022/lib/dropdown/dropdown-item/dropdown-item.directive.mjs +0 -96
- package/esm2022/lib/dropdown/dropdown-menu/dropdown-menu.directive.mjs +0 -119
- package/esm2022/lib/dropdown/dropdown.module.mjs +0 -56
- package/esm2022/lib/dropdown/dropdown.service.mjs +0 -18
- package/esm2022/lib/dropdown/index.mjs +0 -2
- package/esm2022/lib/dropdown/public_api.mjs +0 -10
- package/esm2022/lib/element-cover/element-cover.component.mjs +0 -79
- package/esm2022/lib/element-cover/element-cover.module.mjs +0 -16
- package/esm2022/lib/element-cover/index.mjs +0 -2
- package/esm2022/lib/element-cover/public_api.mjs +0 -3
- package/esm2022/lib/footer/footer.component.mjs +0 -39
- package/esm2022/lib/footer/footer.module.mjs +0 -16
- package/esm2022/lib/footer/index.mjs +0 -2
- package/esm2022/lib/footer/public_api.mjs +0 -3
- package/esm2022/lib/form/form/form.directive.mjs +0 -33
- package/esm2022/lib/form/form-check/form-check-input.directive.mjs +0 -78
- package/esm2022/lib/form/form-check/form-check-label.directive.mjs +0 -15
- package/esm2022/lib/form/form-check/form-check.component.mjs +0 -77
- package/esm2022/lib/form/form-control/form-control.directive.mjs +0 -66
- package/esm2022/lib/form/form-feedback/form-feedback.component.mjs +0 -38
- package/esm2022/lib/form/form-floating/form-floating.directive.mjs +0 -32
- package/esm2022/lib/form/form-label/form-label.directive.mjs +0 -41
- package/esm2022/lib/form/form-select/form-select.directive.mjs +0 -36
- package/esm2022/lib/form/form-text/form-text.directive.mjs +0 -15
- package/esm2022/lib/form/form.module.mjs +0 -75
- package/esm2022/lib/form/index.mjs +0 -2
- package/esm2022/lib/form/input-group/input-group.component.mjs +0 -29
- package/esm2022/lib/form/input-group-text/input-group-text.directive.mjs +0 -15
- package/esm2022/lib/form/public_api.mjs +0 -14
- package/esm2022/lib/grid/col.component.mjs +0 -12
- package/esm2022/lib/grid/col.directive.mjs +0 -157
- package/esm2022/lib/grid/col.type.mjs +0 -2
- package/esm2022/lib/grid/container.component.mjs +0 -33
- package/esm2022/lib/grid/container.type.mjs +0 -2
- package/esm2022/lib/grid/grid.module.mjs +0 -45
- package/esm2022/lib/grid/gutter.directive.mjs +0 -57
- package/esm2022/lib/grid/gutter.type.mjs +0 -2
- package/esm2022/lib/grid/index.mjs +0 -2
- package/esm2022/lib/grid/public_api.mjs +0 -8
- package/esm2022/lib/grid/row.component.mjs +0 -16
- package/esm2022/lib/grid/row.directive.mjs +0 -47
- package/esm2022/lib/grid/row.type.mjs +0 -2
- package/esm2022/lib/header/header/header.component.mjs +0 -45
- package/esm2022/lib/header/header-brand/header-brand.component.mjs +0 -32
- package/esm2022/lib/header/header-divider/header-divider.component.mjs +0 -21
- package/esm2022/lib/header/header-nav/header-nav.component.mjs +0 -28
- package/esm2022/lib/header/header-text/header-text.component.mjs +0 -21
- package/esm2022/lib/header/header-toggler/header-toggler.directive.mjs +0 -55
- package/esm2022/lib/header/header.module.mjs +0 -45
- package/esm2022/lib/header/index.mjs +0 -2
- package/esm2022/lib/header/public_api.mjs +0 -8
- package/esm2022/lib/image/img.directive.mjs +0 -58
- package/esm2022/lib/image/img.module.mjs +0 -16
- package/esm2022/lib/image/index.mjs +0 -2
- package/esm2022/lib/image/public_api.mjs +0 -3
- package/esm2022/lib/list-group/index.mjs +0 -2
- package/esm2022/lib/list-group/list-group-item.directive.mjs +0 -63
- package/esm2022/lib/list-group/list-group.directive.mjs +0 -38
- package/esm2022/lib/list-group/list-group.module.mjs +0 -17
- package/esm2022/lib/list-group/public_api.mjs +0 -4
- package/esm2022/lib/loading-button/index.mjs +0 -2
- package/esm2022/lib/loading-button/loading-button.animations.mjs +0 -26
- package/esm2022/lib/loading-button/loading-button.component.mjs +0 -65
- package/esm2022/lib/loading-button/loading-button.module.mjs +0 -16
- package/esm2022/lib/loading-button/public_api.mjs +0 -3
- package/esm2022/lib/modal/index.mjs +0 -2
- package/esm2022/lib/modal/modal/modal.component.mjs +0 -334
- package/esm2022/lib/modal/modal-body/modal-body.component.mjs +0 -11
- package/esm2022/lib/modal/modal-content/modal-content.component.mjs +0 -16
- package/esm2022/lib/modal/modal-dialog/modal-dialog.component.mjs +0 -32
- package/esm2022/lib/modal/modal-dismiss/modal-toggle.directive.mjs +0 -28
- package/esm2022/lib/modal/modal-footer/modal-footer.component.mjs +0 -16
- package/esm2022/lib/modal/modal-header/modal-header.component.mjs +0 -16
- package/esm2022/lib/modal/modal-title/modal-title.directive.mjs +0 -15
- package/esm2022/lib/modal/modal.module.mjs +0 -57
- package/esm2022/lib/modal/modal.service.mjs +0 -21
- package/esm2022/lib/modal/public_api.mjs +0 -11
- package/esm2022/lib/multi-select/index.mjs +0 -2
- package/esm2022/lib/multi-select/multi-select/multi-select-search.directive.mjs +0 -65
- package/esm2022/lib/multi-select/multi-select/multi-select.component.mjs +0 -1296
- package/esm2022/lib/multi-select/multi-select-native-select/multi-select-native-select.component.mjs +0 -30
- package/esm2022/lib/multi-select/multi-select-optgroup/multi-select-optgroup-label.component.mjs +0 -11
- package/esm2022/lib/multi-select/multi-select-optgroup/multi-select-optgroup.component.mjs +0 -59
- package/esm2022/lib/multi-select/multi-select-option/multi-select-option.component.mjs +0 -302
- package/esm2022/lib/multi-select/multi-select-tag/multi-select-tag.component.mjs +0 -44
- package/esm2022/lib/multi-select/multi-select.module.mjs +0 -37
- package/esm2022/lib/multi-select/multi-select.service.mjs +0 -50
- package/esm2022/lib/multi-select/multi-select.type.mjs +0 -2
- package/esm2022/lib/multi-select/public_api.mjs +0 -6
- package/esm2022/lib/nav/index.mjs +0 -2
- package/esm2022/lib/nav/nav-item.component.mjs +0 -11
- package/esm2022/lib/nav/nav-link.directive.mjs +0 -76
- package/esm2022/lib/nav/nav.component.mjs +0 -25
- package/esm2022/lib/nav/nav.module.mjs +0 -30
- package/esm2022/lib/nav/public_api.mjs +0 -5
- package/esm2022/lib/navbar/index.mjs +0 -2
- package/esm2022/lib/navbar/navbar-brand/navbar-brand.directive.mjs +0 -18
- package/esm2022/lib/navbar/navbar-nav/navbar-nav.component.mjs +0 -29
- package/esm2022/lib/navbar/navbar-text/navbar-text.component.mjs +0 -16
- package/esm2022/lib/navbar/navbar-toggler/navbar-toggler.directive.mjs +0 -63
- package/esm2022/lib/navbar/navbar.component.mjs +0 -107
- package/esm2022/lib/navbar/navbar.module.mjs +0 -40
- package/esm2022/lib/navbar/public_api.mjs +0 -7
- package/esm2022/lib/offcanvas/index.mjs +0 -2
- package/esm2022/lib/offcanvas/offcanvas/offcanvas.component.mjs +0 -309
- package/esm2022/lib/offcanvas/offcanvas-body/offcanvas-body.component.mjs +0 -11
- package/esm2022/lib/offcanvas/offcanvas-header/offcanvas-header.component.mjs +0 -16
- package/esm2022/lib/offcanvas/offcanvas-title/offcanvas-title.directive.mjs +0 -15
- package/esm2022/lib/offcanvas/offcanvas-toggle/offcanvas-toggle.directive.mjs +0 -28
- package/esm2022/lib/offcanvas/offcanvas.module.mjs +0 -49
- package/esm2022/lib/offcanvas/offcanvas.service.mjs +0 -21
- package/esm2022/lib/offcanvas/public_api.mjs +0 -8
- package/esm2022/lib/pagination/index.mjs +0 -2
- package/esm2022/lib/pagination/page-item/page-item.component.mjs +0 -12
- package/esm2022/lib/pagination/page-item/page-item.directive.mjs +0 -64
- package/esm2022/lib/pagination/page-link/page-link.directive.mjs +0 -15
- package/esm2022/lib/pagination/pagination/pagination.component.mjs +0 -41
- package/esm2022/lib/pagination/pagination.module.mjs +0 -35
- package/esm2022/lib/pagination/public_api.mjs +0 -6
- package/esm2022/lib/placeholder/index.mjs +0 -2
- package/esm2022/lib/placeholder/placeholder-animation.directive.mjs +0 -34
- package/esm2022/lib/placeholder/placeholder.directive.mjs +0 -43
- package/esm2022/lib/placeholder/placeholder.module.mjs +0 -25
- package/esm2022/lib/placeholder/public_api.mjs +0 -4
- package/esm2022/lib/popover/index.mjs +0 -2
- package/esm2022/lib/popover/popover/popover.component.mjs +0 -70
- package/esm2022/lib/popover/popover.directive.mjs +0 -204
- package/esm2022/lib/popover/popover.module.mjs +0 -25
- package/esm2022/lib/popover/public_api.mjs +0 -4
- package/esm2022/lib/progress/index.mjs +0 -2
- package/esm2022/lib/progress/progress-bar.component.mjs +0 -40
- package/esm2022/lib/progress/progress-bar.directive.mjs +0 -113
- package/esm2022/lib/progress/progress-stacked.component.mjs +0 -19
- package/esm2022/lib/progress/progress.component.mjs +0 -74
- package/esm2022/lib/progress/progress.module.mjs +0 -35
- package/esm2022/lib/progress/progress.type.mjs +0 -2
- package/esm2022/lib/progress/public_api.mjs +0 -6
- package/esm2022/lib/rating/index.mjs +0 -2
- package/esm2022/lib/rating/public_api.mjs +0 -3
- package/esm2022/lib/rating/rating-item-label/rating-item-label.component.mjs +0 -40
- package/esm2022/lib/rating/rating.component.mjs +0 -355
- package/esm2022/lib/rating/rating.module.mjs +0 -16
- package/esm2022/lib/services/class-toggle.service.mjs +0 -30
- package/esm2022/lib/services/color-mode.service.mjs +0 -78
- package/esm2022/lib/services/in-memory-storage.service.mjs +0 -32
- package/esm2022/lib/services/index.mjs +0 -2
- package/esm2022/lib/services/intersection.service.mjs +0 -51
- package/esm2022/lib/services/listeners.service.mjs +0 -52
- package/esm2022/lib/services/local-storage.service.mjs +0 -45
- package/esm2022/lib/services/public_api.mjs +0 -7
- package/esm2022/lib/shared/element-ref.directive.mjs +0 -18
- package/esm2022/lib/shared/html-attr.directive.mjs +0 -56
- package/esm2022/lib/shared/index.mjs +0 -2
- package/esm2022/lib/shared/public_api.mjs +0 -6
- package/esm2022/lib/shared/shared.module.mjs +0 -24
- package/esm2022/lib/shared/template-id.directive.mjs +0 -20
- package/esm2022/lib/shared/theme.directive.mjs +0 -45
- package/esm2022/lib/sidebar/index.mjs +0 -2
- package/esm2022/lib/sidebar/public_api.mjs +0 -10
- package/esm2022/lib/sidebar/sidebar/sidebar.component.mjs +0 -241
- package/esm2022/lib/sidebar/sidebar-backdrop/sidebar-backdrop.service.mjs +0 -62
- package/esm2022/lib/sidebar/sidebar-brand/sidebar-brand.component.mjs +0 -30
- package/esm2022/lib/sidebar/sidebar-footer/sidebar-footer.component.mjs +0 -16
- package/esm2022/lib/sidebar/sidebar-header/sidebar-header.component.mjs +0 -16
- package/esm2022/lib/sidebar/sidebar-nav/index.mjs +0 -2
- package/esm2022/lib/sidebar/sidebar-nav/public_api.mjs +0 -14
- package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-badge.pipe.mjs +0 -25
- package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-divider.component.mjs +0 -17
- package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-group.service.mjs +0 -18
- package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-icon.pipe.mjs +0 -21
- package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-item-class.pipe.mjs +0 -34
- package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-label.component.mjs +0 -43
- package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-link.component.mjs +0 -111
- package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-link.pipe.mjs +0 -23
- package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav-title.component.mjs +0 -71
- package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav.component.mjs +0 -230
- package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav.mjs +0 -2
- package/esm2022/lib/sidebar/sidebar-nav/sidebar-nav.service.mjs +0 -54
- package/esm2022/lib/sidebar/sidebar-toggle/sidebar-toggle.directive.mjs +0 -41
- package/esm2022/lib/sidebar/sidebar-toggler/sidebar-toggler.directive.mjs +0 -39
- package/esm2022/lib/sidebar/sidebar.module.mjs +0 -83
- package/esm2022/lib/sidebar/sidebar.service.mjs +0 -21
- package/esm2022/lib/smart-pagination/index.mjs +0 -2
- package/esm2022/lib/smart-pagination/public_api.mjs +0 -3
- package/esm2022/lib/smart-pagination/smart-pagination.component.mjs +0 -191
- package/esm2022/lib/smart-pagination/smart-pagination.module.mjs +0 -16
- package/esm2022/lib/smart-pagination/smart-pagination.type.mjs +0 -2
- package/esm2022/lib/smart-table/index.mjs +0 -2
- package/esm2022/lib/smart-table/public_api.mjs +0 -5
- package/esm2022/lib/smart-table/smart-table/smart-table.component.mjs +0 -526
- package/esm2022/lib/smart-table/smart-table-column-filter/smart-table-column-filter.component.mjs +0 -27
- package/esm2022/lib/smart-table/smart-table-filter/filter-input.directive.mjs +0 -69
- package/esm2022/lib/smart-table/smart-table-filter/smart-table-filter.component.mjs +0 -42
- package/esm2022/lib/smart-table/smart-table-head/smart-table-column-label.pipe.mjs +0 -18
- package/esm2022/lib/smart-table/smart-table-head/smart-table-head.component.mjs +0 -229
- package/esm2022/lib/smart-table/smart-table-items-per-page-selector/smart-table-items-per-page-selector.component.mjs +0 -46
- package/esm2022/lib/smart-table/smart-table.module.mjs +0 -17
- package/esm2022/lib/smart-table/smart-table.type.mjs +0 -2
- package/esm2022/lib/smart-table/smart-table.utils.mjs +0 -181
- package/esm2022/lib/spinner/index.mjs +0 -2
- package/esm2022/lib/spinner/public_api.mjs +0 -3
- package/esm2022/lib/spinner/spinner.component.mjs +0 -52
- package/esm2022/lib/spinner/spinner.module.mjs +0 -20
- package/esm2022/lib/table/index.mjs +0 -2
- package/esm2022/lib/table/public_api.mjs +0 -5
- package/esm2022/lib/table/table-active.directive.mjs +0 -32
- package/esm2022/lib/table/table-color.directive.mjs +0 -25
- package/esm2022/lib/table/table.directive.mjs +0 -112
- package/esm2022/lib/table/table.module.mjs +0 -30
- package/esm2022/lib/table/table.type.mjs +0 -2
- package/esm2022/lib/tabs/index.mjs +0 -2
- package/esm2022/lib/tabs/public_api.mjs +0 -6
- package/esm2022/lib/tabs/tab-content/tab-content.component.mjs +0 -83
- package/esm2022/lib/tabs/tab-content-ref.directive.mjs +0 -141
- package/esm2022/lib/tabs/tab-pane/tab-pane.component.mjs +0 -60
- package/esm2022/lib/tabs/tab.service.mjs +0 -21
- package/esm2022/lib/tabs/tabs.module.mjs +0 -36
- package/esm2022/lib/tabs-2/index.mjs +0 -2
- package/esm2022/lib/tabs-2/public_api.mjs +0 -8
- package/esm2022/lib/tabs-2/tab/tab.directive.mjs +0 -96
- package/esm2022/lib/tabs-2/tab-panel/tab-panel.component.mjs +0 -113
- package/esm2022/lib/tabs-2/tabs-content/tabs-content.component.mjs +0 -19
- package/esm2022/lib/tabs-2/tabs-list/tabs-list.component.mjs +0 -93
- package/esm2022/lib/tabs-2/tabs.component.mjs +0 -37
- package/esm2022/lib/tabs-2/tabs.service.mjs +0 -15
- package/esm2022/lib/tabs-2/tabs2.module.mjs +0 -22
- package/esm2022/lib/time-picker/index.mjs +0 -2
- package/esm2022/lib/time-picker/public_api.mjs +0 -3
- package/esm2022/lib/time-picker/time-picker-roll-col/time-picker-roll-am-pm.component.mjs +0 -110
- package/esm2022/lib/time-picker/time-picker-roll-col/time-picker-roll-col.component.mjs +0 -114
- package/esm2022/lib/time-picker/time-picker.component.mjs +0 -517
- package/esm2022/lib/time-picker/time-picker.module.mjs +0 -16
- package/esm2022/lib/time-picker/time.utils.mjs +0 -645
- package/esm2022/lib/toast/index.mjs +0 -2
- package/esm2022/lib/toast/public_api.mjs +0 -9
- package/esm2022/lib/toast/toast/toast.component.mjs +0 -204
- package/esm2022/lib/toast/toast-body/toast-body.component.mjs +0 -21
- package/esm2022/lib/toast/toast-close.directive.mjs +0 -29
- package/esm2022/lib/toast/toast-header/toast-header.component.mjs +0 -30
- package/esm2022/lib/toast/toast.module.mjs +0 -47
- package/esm2022/lib/toast/toaster/toaster-host.directive.mjs +0 -18
- package/esm2022/lib/toast/toaster/toaster.component.mjs +0 -123
- package/esm2022/lib/toast/toaster/toaster.service.mjs +0 -22
- package/esm2022/lib/tooltip/index.mjs +0 -2
- package/esm2022/lib/tooltip/public_api.mjs +0 -4
- package/esm2022/lib/tooltip/tooltip/tooltip.component.mjs +0 -66
- package/esm2022/lib/tooltip/tooltip.directive.mjs +0 -204
- package/esm2022/lib/tooltip/tooltip.module.mjs +0 -25
- package/esm2022/lib/utilities/align.directive.mjs +0 -25
- package/esm2022/lib/utilities/bg-color.directive.mjs +0 -34
- package/esm2022/lib/utilities/border.directive.mjs +0 -67
- package/esm2022/lib/utilities/border.type.mjs +0 -2
- package/esm2022/lib/utilities/index.mjs +0 -2
- package/esm2022/lib/utilities/public_api.mjs +0 -9
- package/esm2022/lib/utilities/rounded.directive.mjs +0 -66
- package/esm2022/lib/utilities/rounded.type.mjs +0 -2
- package/esm2022/lib/utilities/shadow-on-scroll.directive.mjs +0 -48
- package/esm2022/lib/utilities/text-bg-color.directive.mjs +0 -30
- package/esm2022/lib/utilities/text-color.directive.mjs +0 -30
- package/esm2022/lib/utilities/utilities.module.mjs +0 -16
- package/esm2022/lib/widget/index.mjs +0 -2
- package/esm2022/lib/widget/public_api.mjs +0 -8
- package/esm2022/lib/widget/widget-stat-a/widget-stat-a.component.mjs +0 -55
- package/esm2022/lib/widget/widget-stat-b/widget-stat-b.component.mjs +0 -57
- package/esm2022/lib/widget/widget-stat-c/widget-stat-c.component.mjs +0 -71
- package/esm2022/lib/widget/widget-stat-d/widget-stat-d.component.mjs +0 -36
- package/esm2022/lib/widget/widget-stat-e/widget-stat-e.component.mjs +0 -36
- package/esm2022/lib/widget/widget-stat-f/widget-stat-f.component.mjs +0 -96
- package/esm2022/lib/widget/widget.module.mjs +0 -45
- package/esm2022/public-api.mjs +0 -53
|
@@ -1,448 +0,0 @@
|
|
|
1
|
-
import { Component, computed, DestroyRef, effect, inject, input, numberAttribute, signal, ViewChildren } from '@angular/core';
|
|
2
|
-
import { AsyncPipe, NgClass } from '@angular/common';
|
|
3
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
-
import { take } from 'rxjs/operators';
|
|
5
|
-
import { convertToDateObject, createGroupsInArray, equalDates, getMonthDetails, getMonthsNames, getYears, isDateDisabled, isDateInRangeDisabled } from '../calendar.utils';
|
|
6
|
-
import { CalendarService } from '../calendar.service';
|
|
7
|
-
import { CalendarWeekdayPipe } from './calendar-weekday.pipe';
|
|
8
|
-
import { CalendarClassYearPipe } from './calendar-class-year.pipe';
|
|
9
|
-
import { CalendarClassMonthPipe } from './calendar-class-month.pipe';
|
|
10
|
-
import { CalendarDayPipe } from './calendar-day.pipe';
|
|
11
|
-
import { CalendarDayDirective } from './calendar-day.directive';
|
|
12
|
-
import { CalendarDayTitlePipe } from './calendar-day-title.pipe';
|
|
13
|
-
import { CalendarClassDayPipe } from './calendar-class-day.pipe';
|
|
14
|
-
import { CalendarClassRowPipe } from './calendar-class-row.pipe';
|
|
15
|
-
import { CalendarRowDirective } from './calendar-row.directive';
|
|
16
|
-
import * as i0 from "@angular/core";
|
|
17
|
-
export class CalendarMonthComponent {
|
|
18
|
-
#destroyRef;
|
|
19
|
-
#calendarService;
|
|
20
|
-
constructor() {
|
|
21
|
-
this.#destroyRef = inject(DestroyRef);
|
|
22
|
-
this.#calendarService = inject(CalendarService);
|
|
23
|
-
this.pageIndex = input(0, { transform: numberAttribute });
|
|
24
|
-
this.addMonths = computed(() => {
|
|
25
|
-
const view = this.view();
|
|
26
|
-
const pageIndex = this.pageIndex();
|
|
27
|
-
return pageIndex * (view === 'years' ? 144 : view === 'months' ? 12 : 1);
|
|
28
|
-
});
|
|
29
|
-
/**
|
|
30
|
-
* Initial selected date.
|
|
31
|
-
* @type (Date | null)
|
|
32
|
-
*/
|
|
33
|
-
this.startDate = signal(null, { equal: equalDates });
|
|
34
|
-
/**
|
|
35
|
-
* Initial selected to date (range).
|
|
36
|
-
* @type Date | null
|
|
37
|
-
*/
|
|
38
|
-
this.endDate = signal(null, { equal: equalDates });
|
|
39
|
-
this.datesEffect = effect(() => {
|
|
40
|
-
const startDate = this.startDate();
|
|
41
|
-
const endDate = startDate && this.range() ? this.endDate() : null;
|
|
42
|
-
this.#calendarService.update({ startDate: startDate, endDate: endDate });
|
|
43
|
-
}, { allowSignalWrites: true });
|
|
44
|
-
/**
|
|
45
|
-
* Specify the list of dates that cannot be selected.
|
|
46
|
-
* @type Date[] | Date[][]
|
|
47
|
-
*/
|
|
48
|
-
this.disabledDates = signal([]);
|
|
49
|
-
/**
|
|
50
|
-
* Sets the day of start week.
|
|
51
|
-
* - 0 - Sunday,
|
|
52
|
-
* - 1 - Monday,
|
|
53
|
-
* - 2 - Tuesday,
|
|
54
|
-
* - 3 - Wednesday,
|
|
55
|
-
* - 4 - Thursday,
|
|
56
|
-
* - 5 - Friday,
|
|
57
|
-
* - 6 - Saturday,
|
|
58
|
-
*/
|
|
59
|
-
this.firstDayOfWeek = signal(1);
|
|
60
|
-
/**
|
|
61
|
-
* Sets the default locale for components. If not set, it is inherited from the browser.
|
|
62
|
-
* @default 'default'
|
|
63
|
-
*/
|
|
64
|
-
this.locale = signal('default');
|
|
65
|
-
/**
|
|
66
|
-
* Allow range selection.
|
|
67
|
-
* @type boolean
|
|
68
|
-
* @default false
|
|
69
|
-
*/
|
|
70
|
-
this.range = signal(false);
|
|
71
|
-
/**
|
|
72
|
-
* Set length or format of day name.
|
|
73
|
-
* @type number | 'long' | 'narrow' | 'short'
|
|
74
|
-
* @default 'short'
|
|
75
|
-
*/
|
|
76
|
-
this.weekdayFormat = signal('short');
|
|
77
|
-
/**
|
|
78
|
-
* Set calendar view.
|
|
79
|
-
* @type 'days' | 'months' | 'years'
|
|
80
|
-
* @default 'days'
|
|
81
|
-
*/
|
|
82
|
-
this.view = signal('days');
|
|
83
|
-
/**
|
|
84
|
-
* Max selectable date.
|
|
85
|
-
*/
|
|
86
|
-
this.maxDate = signal(null, { equal: equalDates });
|
|
87
|
-
/**
|
|
88
|
-
* Min selectable date.
|
|
89
|
-
*/
|
|
90
|
-
this.minDate = signal(null, { equal: equalDates });
|
|
91
|
-
this.listOfMonths = computed(() => {
|
|
92
|
-
return createGroupsInArray(getMonthsNames(this.locale(), this.date().getFullYear()), 4);
|
|
93
|
-
});
|
|
94
|
-
this.listOfYears = computed(() => createGroupsInArray(getYears(this.date().getFullYear()), 4));
|
|
95
|
-
/**
|
|
96
|
-
* Default date of the component
|
|
97
|
-
* @type Date
|
|
98
|
-
*/
|
|
99
|
-
this.calendarDate = signal(new Date(), { equal: equalDates });
|
|
100
|
-
this.date = computed(() => {
|
|
101
|
-
const date = this.calendarDate();
|
|
102
|
-
return new Date(date.getFullYear(), date.getMonth() + this.addMonths(), 1, 0, 0, 0, 0);
|
|
103
|
-
}, { equal: (a, b) => a.getTime() === b.getTime() });
|
|
104
|
-
this.calendarDateEffect = effect(() => {
|
|
105
|
-
this.#calendarService.update({ calendarDate: this.calendarDate() });
|
|
106
|
-
}, { allowSignalWrites: true });
|
|
107
|
-
this.dateFilter = signal(undefined);
|
|
108
|
-
this.dayFormat = signal('numeric');
|
|
109
|
-
this.selectAdjacentDays = signal(false);
|
|
110
|
-
this.showAdjacentDays = signal(true);
|
|
111
|
-
this.selectionType = signal('day');
|
|
112
|
-
this.showWeekNumber = signal(false);
|
|
113
|
-
this.weekNumbersLabel = signal('');
|
|
114
|
-
this.monthDetails = computed(() => {
|
|
115
|
-
const date = this.date();
|
|
116
|
-
return getMonthDetails(date.getFullYear(), date.getMonth(), this.firstDayOfWeek());
|
|
117
|
-
});
|
|
118
|
-
this.weekDays = computed(() => {
|
|
119
|
-
const monthDetails = this.monthDetails();
|
|
120
|
-
return monthDetails[0].days;
|
|
121
|
-
});
|
|
122
|
-
this.calendarStateSubscribe();
|
|
123
|
-
}
|
|
124
|
-
yearNumber(year) {
|
|
125
|
-
return new Date(year, 0).toLocaleDateString(this.locale(), { year: 'numeric' });
|
|
126
|
-
}
|
|
127
|
-
isDateDisabled(date) {
|
|
128
|
-
const selectionType = this.selectionType();
|
|
129
|
-
const disabledDates = this.disabledDates();
|
|
130
|
-
const dateFilterFn = this.dateFilter();
|
|
131
|
-
const maxDate = this.maxDate();
|
|
132
|
-
const minDate = this.minDate();
|
|
133
|
-
if (selectionType === 'year') {
|
|
134
|
-
const min = minDate ? new Date(minDate.getFullYear(), 0, 1, 0, 0, 0, 0) : null;
|
|
135
|
-
const max = maxDate ? new Date(maxDate.getFullYear(), 11, 31, 0, 0, 0, 0) : null;
|
|
136
|
-
return isDateDisabled(date, min, max, disabledDates) || (dateFilterFn ? !dateFilterFn(date) : false);
|
|
137
|
-
}
|
|
138
|
-
if (selectionType === 'month') {
|
|
139
|
-
const min = minDate ? new Date(minDate.getFullYear(), minDate.getMonth(), 1, 0, 0, 0, 0) : null;
|
|
140
|
-
const max = maxDate ? new Date(maxDate.getFullYear(), maxDate.getMonth() + 1, 1, 0, 0, -1, 0) : null;
|
|
141
|
-
return isDateDisabled(date, min, max, disabledDates) || (dateFilterFn ? !dateFilterFn(date) : false);
|
|
142
|
-
}
|
|
143
|
-
return isDateDisabled(date, minDate, maxDate, disabledDates) || (dateFilterFn ? !dateFilterFn(date) : false);
|
|
144
|
-
}
|
|
145
|
-
calendarCellTitle(date) {
|
|
146
|
-
return date.toLocaleDateString(this.locale());
|
|
147
|
-
}
|
|
148
|
-
handleCellMouseEnter(hoverDate) {
|
|
149
|
-
if (!hoverDate) {
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
const selectionType = this.selectionType();
|
|
153
|
-
const updateHoverValue = (['day', 'week'].includes(selectionType) && this.view() === 'days') ||
|
|
154
|
-
(['month'].includes(selectionType) && this.view() === 'months') ||
|
|
155
|
-
(['year'].includes(selectionType) && this.view() === 'years');
|
|
156
|
-
// if (updateHoverValue) {
|
|
157
|
-
const hoverValue = this.isDateDisabled(hoverDate) || !updateHoverValue ? null : hoverDate;
|
|
158
|
-
this.#calendarService.update({ hoverDate: hoverValue });
|
|
159
|
-
// }
|
|
160
|
-
}
|
|
161
|
-
handleYearCellClick(year) {
|
|
162
|
-
if (this.selectionType() === 'year') {
|
|
163
|
-
let date = new Date(year, 0, 1, 0, 0, 0, 0);
|
|
164
|
-
if (this.range() && this.startDate() && !this.endDate()) {
|
|
165
|
-
date = new Date(date.getFullYear(), 12, 1, 0, 0, -1, 0);
|
|
166
|
-
}
|
|
167
|
-
this.handleDayCellClick(date);
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
const calendarDate = new Date(year, 0, 1, 0, 0, 0, 0);
|
|
171
|
-
this.view.set('months');
|
|
172
|
-
this.#calendarService.update({ view: this.view(), calendarDate: calendarDate });
|
|
173
|
-
}
|
|
174
|
-
handleYearCellKeyUp($event, date) {
|
|
175
|
-
if (!date) {
|
|
176
|
-
return;
|
|
177
|
-
}
|
|
178
|
-
if (['Space', 'Enter'].includes($event.code)) {
|
|
179
|
-
this.handleYearCellClick(date.getFullYear());
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
if (['Tab', 'ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown'].includes($event.code)) {
|
|
183
|
-
this.handleCellMouseEnter(new Date(date));
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
handleMonthCellKeyUp($event, date) {
|
|
188
|
-
if (!date) {
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
if (['Space', 'Enter'].includes($event.code)) {
|
|
192
|
-
this.handleMonthCellClick(date);
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
if (['Tab', 'ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown'].includes($event.code)) {
|
|
196
|
-
this.handleCellMouseEnter(date);
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
handleMonthCellClick(value) {
|
|
201
|
-
if (!value) {
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
if (this.selectionType() === 'month') {
|
|
205
|
-
let date = new Date(value.getFullYear(), value.getMonth(), 1, 0, 0, 0, 0);
|
|
206
|
-
if (this.range() && this.startDate() && !this.endDate()) {
|
|
207
|
-
date = new Date(date.getFullYear(), date.getMonth() + 1, 1, 0, 0, -1, 0);
|
|
208
|
-
}
|
|
209
|
-
this.handleDayCellClick(date);
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
this.view.set('days');
|
|
213
|
-
this.#calendarService.update({ view: this.view() });
|
|
214
|
-
// this.setCalendarPage(0, 0, value.getMonth() - this.addMonths());
|
|
215
|
-
const calendarDate = new Date(value.getFullYear(), value.getMonth() - this.addMonths(), 1, 0, 0, 0, 0);
|
|
216
|
-
this.#calendarService.update({ calendarDate: calendarDate });
|
|
217
|
-
}
|
|
218
|
-
setCalendarPage(years, months = 0, setMonth) {
|
|
219
|
-
const year = this.date().getFullYear();
|
|
220
|
-
const month = this.date().getMonth();
|
|
221
|
-
const d = new Date(year, month, 1, 0, 0, 0, 0);
|
|
222
|
-
years && d.setFullYear(d.getFullYear() + years);
|
|
223
|
-
months && d.setMonth(d.getMonth() + months);
|
|
224
|
-
typeof setMonth === 'number' && d.setMonth(setMonth);
|
|
225
|
-
this.#calendarService.update({ calendarDate: d });
|
|
226
|
-
}
|
|
227
|
-
handleDayCellKeyDown($event, date) {
|
|
228
|
-
if (!date) {
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
if (!['Tab', 'ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown'].includes($event.code)) {
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
$event.preventDefault();
|
|
235
|
-
this.handleCellMouseEnter(date);
|
|
236
|
-
const eventKey = $event.key === 'Tab' ? ($event.shiftKey ? 'ArrowLeft' : 'ArrowRight') : $event.key;
|
|
237
|
-
const selectionType = this.selectionType();
|
|
238
|
-
const view = this.view();
|
|
239
|
-
const maxDate = this.maxDate();
|
|
240
|
-
if (maxDate &&
|
|
241
|
-
date >= convertToDateObject(maxDate, selectionType) &&
|
|
242
|
-
['ArrowRight', 'ArrowDown'].includes(eventKey)) {
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
const minDate = this.minDate();
|
|
246
|
-
if (minDate && date <= convertToDateObject(minDate, selectionType) && ['ArrowLeft', 'ArrowUp'].includes(eventKey)) {
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
let element = $event.target;
|
|
250
|
-
if (selectionType === 'week' && view === 'days' && element.tabIndex === -1) {
|
|
251
|
-
element = element.closest('tr[tabindex="0"]');
|
|
252
|
-
}
|
|
253
|
-
const elements = ['week'].includes(selectionType) && view === 'days' ? this.calendarRows : this.calendarDays;
|
|
254
|
-
const list = elements
|
|
255
|
-
.toArray()
|
|
256
|
-
.map((calendarCell) => calendarCell.elementRef.nativeElement)
|
|
257
|
-
// .filter((element) => this.selectionType === 'week' ? element?.tabIndex === 0 : element?.classList.contains('current'))
|
|
258
|
-
.filter((element) => element?.tabIndex === 0);
|
|
259
|
-
const index = list.indexOf(element);
|
|
260
|
-
const first = index === 0;
|
|
261
|
-
const last = index === list.length - 1;
|
|
262
|
-
const toBoundary = {
|
|
263
|
-
start: index,
|
|
264
|
-
end: list.length - (index + 1)
|
|
265
|
-
};
|
|
266
|
-
const gap = {
|
|
267
|
-
ArrowRight: 1,
|
|
268
|
-
ArrowLeft: -1,
|
|
269
|
-
ArrowUp: selectionType === 'week' && view === 'days' ? -1 : view === 'days' ? -7 : -3,
|
|
270
|
-
ArrowDown: selectionType === 'week' && view === 'days' ? 1 : view === 'days' ? 7 : 3
|
|
271
|
-
};
|
|
272
|
-
if ((eventKey === 'ArrowRight' && last) ||
|
|
273
|
-
(eventKey === 'ArrowDown' && toBoundary.end < gap.ArrowDown) ||
|
|
274
|
-
(eventKey === 'ArrowLeft' && first) ||
|
|
275
|
-
(eventKey === 'ArrowUp' && toBoundary.start < Math.abs(gap.ArrowUp))) {
|
|
276
|
-
elements.changes
|
|
277
|
-
.pipe(take(1), takeUntilDestroyed(this.#destroyRef))
|
|
278
|
-
.subscribe((change) => {
|
|
279
|
-
const _list = change
|
|
280
|
-
.toArray()
|
|
281
|
-
// .filter(element => this.selectionType === 'week' ? element?.elementRef.nativeElement.tabIndex === 0 : element?.elementRef.nativeElement.classList.contains('current'));
|
|
282
|
-
.filter((directive) => directive?.elementRef.nativeElement.tabIndex === 0);
|
|
283
|
-
if (_list.length) {
|
|
284
|
-
let dayToFocus;
|
|
285
|
-
switch (eventKey) {
|
|
286
|
-
case 'ArrowRight': {
|
|
287
|
-
dayToFocus = _list[0];
|
|
288
|
-
break;
|
|
289
|
-
}
|
|
290
|
-
case 'ArrowLeft': {
|
|
291
|
-
dayToFocus = _list[_list.length - 1];
|
|
292
|
-
break;
|
|
293
|
-
}
|
|
294
|
-
case 'ArrowDown': {
|
|
295
|
-
dayToFocus = _list[gap.ArrowDown - (list.length - index)];
|
|
296
|
-
break;
|
|
297
|
-
}
|
|
298
|
-
case 'ArrowUp': {
|
|
299
|
-
dayToFocus = _list[_list.length - (Math.abs(gap.ArrowUp) + 1 - (index + 1))];
|
|
300
|
-
break;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
if (!dayToFocus?.disabled) {
|
|
304
|
-
// console.log('dayToFocus', dayToFocus?.date);
|
|
305
|
-
dayToFocus?.focus('keyboard');
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
});
|
|
309
|
-
switch (view) {
|
|
310
|
-
case 'days':
|
|
311
|
-
this.setCalendarPage(0, ['ArrowRight', 'ArrowDown'].includes(eventKey) ? 1 : -1);
|
|
312
|
-
break;
|
|
313
|
-
case 'months':
|
|
314
|
-
this.setCalendarPage(['ArrowRight', 'ArrowDown'].includes(eventKey) ? 1 : -1);
|
|
315
|
-
break;
|
|
316
|
-
case 'years':
|
|
317
|
-
this.setCalendarPage(['ArrowRight', 'ArrowDown'].includes(eventKey) ? 12 : -12);
|
|
318
|
-
break;
|
|
319
|
-
}
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
// @ts-ignore
|
|
323
|
-
const nextElement = list[index + gap[eventKey]];
|
|
324
|
-
if (nextElement?.tabIndex === 0) {
|
|
325
|
-
nextElement.focus();
|
|
326
|
-
return;
|
|
327
|
-
}
|
|
328
|
-
for (let i = index; i < list.length; list.length && ['ArrowRight', 'ArrowDown'].includes(eventKey) ? i++ : i--) {
|
|
329
|
-
// @ts-ignore
|
|
330
|
-
const nextElement = list[i + gap[eventKey]];
|
|
331
|
-
if (nextElement?.tabIndex === 0) {
|
|
332
|
-
// @ts-ignore
|
|
333
|
-
nextElement?.focus();
|
|
334
|
-
break;
|
|
335
|
-
}
|
|
336
|
-
// @ts-ignore
|
|
337
|
-
if (!nextElement) {
|
|
338
|
-
break;
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
handleCellMouseLeave() {
|
|
343
|
-
this.#calendarService.update({ hoverDate: null });
|
|
344
|
-
}
|
|
345
|
-
handleDayCellKeyUp($event, date) {
|
|
346
|
-
if (['Space', 'Enter'].includes($event.code)) {
|
|
347
|
-
this.handleDayCellClick(date);
|
|
348
|
-
return;
|
|
349
|
-
}
|
|
350
|
-
if (['Tab', 'ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown'].includes($event.code)) {
|
|
351
|
-
this.handleCellMouseEnter(date);
|
|
352
|
-
return;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
handleDayCellClick(date) {
|
|
356
|
-
if (this.selectionType() === 'day' && this.isDateDisabled(date)) {
|
|
357
|
-
return;
|
|
358
|
-
}
|
|
359
|
-
if (!this.range()) {
|
|
360
|
-
this.endDate.set(null);
|
|
361
|
-
this.startDate.set(date);
|
|
362
|
-
return;
|
|
363
|
-
}
|
|
364
|
-
const startDate = this.startDate();
|
|
365
|
-
const endDate = this.endDate();
|
|
366
|
-
if (startDate && endDate) {
|
|
367
|
-
this.startDate.set(null);
|
|
368
|
-
this.endDate.set(null);
|
|
369
|
-
return;
|
|
370
|
-
}
|
|
371
|
-
if (!!startDate && !endDate) {
|
|
372
|
-
if (startDate && date < startDate) {
|
|
373
|
-
this.endDate.set(null);
|
|
374
|
-
this.startDate.set(date);
|
|
375
|
-
}
|
|
376
|
-
else {
|
|
377
|
-
const addDays = this.selectionType() !== 'week' ? 1 : 7;
|
|
378
|
-
this.endDate.set(new Date(date.getFullYear(), date.getMonth(), date.getDate() + addDays, 0, 0, -1, 0));
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
else {
|
|
382
|
-
this.endDate.set(null);
|
|
383
|
-
this.startDate.set(date);
|
|
384
|
-
}
|
|
385
|
-
{
|
|
386
|
-
const startDate = this.startDate();
|
|
387
|
-
const endDate = this.endDate();
|
|
388
|
-
if (startDate && endDate) {
|
|
389
|
-
const dateFilterFn = this.dateFilter();
|
|
390
|
-
if (isDateInRangeDisabled(startDate, endDate, this.disabledDates(), dateFilterFn)) {
|
|
391
|
-
this.startDate.set(null);
|
|
392
|
-
this.endDate.set(null);
|
|
393
|
-
return;
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
calendarStateSubscribe() {
|
|
399
|
-
this.#calendarService.calendarState$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((state) => {
|
|
400
|
-
const keys = Object.keys(state);
|
|
401
|
-
for (const key of keys) {
|
|
402
|
-
if (key in this) {
|
|
403
|
-
// @ts-ignore
|
|
404
|
-
const isWritableSignal = typeof this[key] === 'function' && typeof this[key].set === 'function';
|
|
405
|
-
// @ts-ignore
|
|
406
|
-
isWritableSignal ? this[key].set(state[key]) : (this[key] = state[key]);
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
});
|
|
410
|
-
}
|
|
411
|
-
getMonthStart(index) {
|
|
412
|
-
return new Date(this.calendarDate().getFullYear(), index + this.addMonths(), 1, 0, 0, 0, 0);
|
|
413
|
-
}
|
|
414
|
-
getMonthEnd(index) {
|
|
415
|
-
return new Date(this.calendarDate().getFullYear(), index + 1 + this.addMonths(), 1, 0, 0, -1, 0);
|
|
416
|
-
}
|
|
417
|
-
getYearStart(year) {
|
|
418
|
-
return new Date(year, 0, 1);
|
|
419
|
-
}
|
|
420
|
-
getYearEnd(year) {
|
|
421
|
-
return new Date(year, 11, 1, 0, 0, -1, 0);
|
|
422
|
-
}
|
|
423
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: CalendarMonthComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
424
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: CalendarMonthComponent, isStandalone: true, selector: "c-calendar-month", inputs: { pageIndex: { classPropertyName: "pageIndex", publicName: "pageIndex", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "calendarDays", predicate: CalendarDayDirective, descendants: true }, { propertyName: "calendarRows", predicate: CalendarRowDirective, descendants: true }], exportAs: ["cCalendarMonth"], ngImport: i0, template: "<table>\n @if (view() === 'days') {\n <thead>\n <tr>\n @if (showWeekNumber()) {\n <th class=\"calendar-cell\">\n <div class=\"calendar-header-cell-inner\">{{ weekNumbersLabel() }}</div>\n </th>\n }\n @for (weekDay of weekDays(); track weekDay.date; let i = $index) {\n @let date = weekDay.date ;\n <th class=\"calendar-cell\" abbr=\"{{date | calendarWeekday:'long':locale()}}\">\n <div class=\"calendar-header-cell-inner\">\n {{ date | calendarWeekday:weekdayFormat():locale() }}\n </div>\n </th>\n }\n </tr>\n </thead>\n }\n <tbody (mouseleave)=\"handleCellMouseLeave()\">\n @switch (view()) {\n @case ('years') {\n @for (yearsRow of listOfYears(); track yearsRow[0]; let rowIdx = $index) {\n <tr>\n @for (year of yearsRow; track year; let idx = $index) {\n <td\n #calendarYear=\"cCalendarDay\"\n (click)=\"!calendarYear.disabled$() && handleYearCellClick(year)\"\n (keydown)=\"calendarYear.date() && handleDayCellKeyDown($event, calendarYear.date())\"\n (keyup)=\"handleYearCellKeyUp($event, calendarYear.date())\"\n (mouseenter)=\"calendarYear.date() && handleCellMouseEnter(calendarYear.date())\"\n [attr.aria-label]=\"calendarYear.date()?.getFullYear()\"\n [date]=\"getYearStart(year)\"\n [ngClass]=\"year | calendarClassYear\"\n [tabindex]=\"calendarYear.disabled$() ? -1 : 0\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ yearNumber(year) }}\n </div>\n </td>\n }\n </tr>\n }\n }\n @case ('months') {\n @for (monthsRow of listOfMonths(); track monthsRow[0]; let rowIdx = $index) {\n <tr>\n @for (month of monthsRow; track month; let idx = $index) {\n @let monthStart = getMonthStart(rowIdx*3+idx);\n <td\n #calendarMonth=\"cCalendarDay\"\n (click)=\"!calendarMonth.disabled$() && handleMonthCellClick(calendarMonth.date())\"\n (keydown)=\"calendarMonth.date() && handleDayCellKeyDown($event, calendarMonth.date())\"\n (keyup)=\"handleMonthCellKeyUp($event, calendarMonth.date())\"\n (mouseenter)=\"calendarMonth.date() && handleCellMouseEnter(calendarMonth.date())\"\n [attr.aria-label]=\"calendarMonth.date()?.getFullYear()+' '+month.month\"\n [date]=\"monthStart\"\n [ngClass]=\"monthStart | calendarClassMonth:(rowIdx*3+idx)\"\n [tabindex]=\"calendarMonth.disabled$() ? -1 : 0\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ month.month }}\n </div>\n </td>\n }\n </tr>\n }\n\n }\n @default {\n @let weekSelection = selectionType() === 'week';\n @let daySelection = selectionType() === 'day';\n @for (week of monthDetails(); track week.days[0]; let i = $index) {\n <tr #calendarRow=\"cCalendarRow\"\n (click)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellClick(calendarRow.date)\"\n (keydown)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellKeyDown($event, calendarRow.date)\"\n (keyup)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellKeyUp($event, calendarRow.date)\"\n (mouseenter)=\"weekSelection && calendarRow.date && handleCellMouseEnter(calendarRow.date)\"\n [cCalendarRow]=\"week\"\n >\n @if (showWeekNumber()) {\n <th class=\"calendar-cell-week-number\">\n {{ week.weekNumber === 0 ? 53 : week.weekNumber }}\n </th>\n }\n @for (dateObj of week.days; track dateObj.date; let idx = $index) {\n @let currentMonth = dateObj.month === 'current';\n @if (currentMonth || showAdjacentDays()) {\n @let selectable = daySelection && (currentMonth || selectAdjacentDays());\n <td #calendarCell=\"cCalendarDay\"\n (click)=\"selectable && handleDayCellClick(dateObj.date)\"\n (keydown)=\"selectable && handleDayCellKeyDown($event, dateObj.date)\"\n (keyup)=\"selectable && handleDayCellKeyUp($event, dateObj.date)\"\n (mouseenter)=\"selectable && handleCellMouseEnter(dateObj.date)\"\n [attr.aria-label]=\"dateObj.date | calendarDayTitle:locale()\"\n [date]=\"dateObj.date\"\n [month]=\"dateObj.month\"\n [ngClass]=\"dateObj | calendarClassDay:{minDate: minDate(), maxDate: maxDate(), disabledDates: disabledDates(), dateFilter: dateFilter()}\"\n [tabindex]=\"selectable && !isDateDisabled(dateObj.date) ? 0 : -1\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ dateObj.date | calendarDay:dayFormat():locale() }}\n </div>\n </td>\n } @else {\n <td class=\"calendar-cell\"></td>\n }\n }\n </tr>\n }\n }\n }\n </tbody>\n</table>\n\n", styles: [".btn-transparent:focus-visible{outline:-webkit-focus-ring-color auto 1px}.calendar-row:focus-visible{box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem}.calendar-row:focus-within:not([tabindex=\"-1\"]){outline:0;box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem;outline-style:auto!important}.calendar-row:focus:not([tabindex=\"-1\"]){outline:0;box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem;outline-style:auto!important}.calendar-cell:focus:not(:focus-visible):not([tabindex=\"-1\"]){box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem}.calendar-cell-inner{-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "directive", type: CalendarDayDirective, selector: "[cCalendarDay]", inputs: ["date", "month"], exportAs: ["cCalendarDay"] }, { kind: "pipe", type: CalendarDayPipe, name: "calendarDay" }, { kind: "pipe", type: CalendarDayTitlePipe, name: "calendarDayTitle" }, { kind: "directive", type: CalendarRowDirective, selector: "[cCalendarRow]", inputs: ["cCalendarRow"], exportAs: ["cCalendarRow"] }, { kind: "pipe", type: CalendarClassDayPipe, name: "calendarClassDay" }, { kind: "pipe", type: CalendarClassMonthPipe, name: "calendarClassMonth" }, { kind: "pipe", type: CalendarClassYearPipe, name: "calendarClassYear" }, { kind: "pipe", type: CalendarWeekdayPipe, name: "calendarWeekday" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
|
|
425
|
-
}
|
|
426
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: CalendarMonthComponent, decorators: [{
|
|
427
|
-
type: Component,
|
|
428
|
-
args: [{ selector: 'c-calendar-month', exportAs: 'cCalendarMonth', standalone: true, imports: [
|
|
429
|
-
CalendarDayDirective,
|
|
430
|
-
CalendarDayPipe,
|
|
431
|
-
CalendarDayTitlePipe,
|
|
432
|
-
CalendarRowDirective,
|
|
433
|
-
CalendarClassDayPipe,
|
|
434
|
-
CalendarClassMonthPipe,
|
|
435
|
-
CalendarClassRowPipe,
|
|
436
|
-
CalendarClassYearPipe,
|
|
437
|
-
CalendarWeekdayPipe,
|
|
438
|
-
NgClass,
|
|
439
|
-
AsyncPipe
|
|
440
|
-
], template: "<table>\n @if (view() === 'days') {\n <thead>\n <tr>\n @if (showWeekNumber()) {\n <th class=\"calendar-cell\">\n <div class=\"calendar-header-cell-inner\">{{ weekNumbersLabel() }}</div>\n </th>\n }\n @for (weekDay of weekDays(); track weekDay.date; let i = $index) {\n @let date = weekDay.date ;\n <th class=\"calendar-cell\" abbr=\"{{date | calendarWeekday:'long':locale()}}\">\n <div class=\"calendar-header-cell-inner\">\n {{ date | calendarWeekday:weekdayFormat():locale() }}\n </div>\n </th>\n }\n </tr>\n </thead>\n }\n <tbody (mouseleave)=\"handleCellMouseLeave()\">\n @switch (view()) {\n @case ('years') {\n @for (yearsRow of listOfYears(); track yearsRow[0]; let rowIdx = $index) {\n <tr>\n @for (year of yearsRow; track year; let idx = $index) {\n <td\n #calendarYear=\"cCalendarDay\"\n (click)=\"!calendarYear.disabled$() && handleYearCellClick(year)\"\n (keydown)=\"calendarYear.date() && handleDayCellKeyDown($event, calendarYear.date())\"\n (keyup)=\"handleYearCellKeyUp($event, calendarYear.date())\"\n (mouseenter)=\"calendarYear.date() && handleCellMouseEnter(calendarYear.date())\"\n [attr.aria-label]=\"calendarYear.date()?.getFullYear()\"\n [date]=\"getYearStart(year)\"\n [ngClass]=\"year | calendarClassYear\"\n [tabindex]=\"calendarYear.disabled$() ? -1 : 0\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ yearNumber(year) }}\n </div>\n </td>\n }\n </tr>\n }\n }\n @case ('months') {\n @for (monthsRow of listOfMonths(); track monthsRow[0]; let rowIdx = $index) {\n <tr>\n @for (month of monthsRow; track month; let idx = $index) {\n @let monthStart = getMonthStart(rowIdx*3+idx);\n <td\n #calendarMonth=\"cCalendarDay\"\n (click)=\"!calendarMonth.disabled$() && handleMonthCellClick(calendarMonth.date())\"\n (keydown)=\"calendarMonth.date() && handleDayCellKeyDown($event, calendarMonth.date())\"\n (keyup)=\"handleMonthCellKeyUp($event, calendarMonth.date())\"\n (mouseenter)=\"calendarMonth.date() && handleCellMouseEnter(calendarMonth.date())\"\n [attr.aria-label]=\"calendarMonth.date()?.getFullYear()+' '+month.month\"\n [date]=\"monthStart\"\n [ngClass]=\"monthStart | calendarClassMonth:(rowIdx*3+idx)\"\n [tabindex]=\"calendarMonth.disabled$() ? -1 : 0\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ month.month }}\n </div>\n </td>\n }\n </tr>\n }\n\n }\n @default {\n @let weekSelection = selectionType() === 'week';\n @let daySelection = selectionType() === 'day';\n @for (week of monthDetails(); track week.days[0]; let i = $index) {\n <tr #calendarRow=\"cCalendarRow\"\n (click)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellClick(calendarRow.date)\"\n (keydown)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellKeyDown($event, calendarRow.date)\"\n (keyup)=\"weekSelection && (calendarRow.current) && calendarRow.date && handleDayCellKeyUp($event, calendarRow.date)\"\n (mouseenter)=\"weekSelection && calendarRow.date && handleCellMouseEnter(calendarRow.date)\"\n [cCalendarRow]=\"week\"\n >\n @if (showWeekNumber()) {\n <th class=\"calendar-cell-week-number\">\n {{ week.weekNumber === 0 ? 53 : week.weekNumber }}\n </th>\n }\n @for (dateObj of week.days; track dateObj.date; let idx = $index) {\n @let currentMonth = dateObj.month === 'current';\n @if (currentMonth || showAdjacentDays()) {\n @let selectable = daySelection && (currentMonth || selectAdjacentDays());\n <td #calendarCell=\"cCalendarDay\"\n (click)=\"selectable && handleDayCellClick(dateObj.date)\"\n (keydown)=\"selectable && handleDayCellKeyDown($event, dateObj.date)\"\n (keyup)=\"selectable && handleDayCellKeyUp($event, dateObj.date)\"\n (mouseenter)=\"selectable && handleCellMouseEnter(dateObj.date)\"\n [attr.aria-label]=\"dateObj.date | calendarDayTitle:locale()\"\n [date]=\"dateObj.date\"\n [month]=\"dateObj.month\"\n [ngClass]=\"dateObj | calendarClassDay:{minDate: minDate(), maxDate: maxDate(), disabledDates: disabledDates(), dateFilter: dateFilter()}\"\n [tabindex]=\"selectable && !isDateDisabled(dateObj.date) ? 0 : -1\"\n cCalendarDay\n >\n <div class=\"calendar-cell-inner\">\n {{ dateObj.date | calendarDay:dayFormat():locale() }}\n </div>\n </td>\n } @else {\n <td class=\"calendar-cell\"></td>\n }\n }\n </tr>\n }\n }\n }\n </tbody>\n</table>\n\n", styles: [".btn-transparent:focus-visible{outline:-webkit-focus-ring-color auto 1px}.calendar-row:focus-visible{box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem}.calendar-row:focus-within:not([tabindex=\"-1\"]){outline:0;box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem;outline-style:auto!important}.calendar-row:focus:not([tabindex=\"-1\"]){outline:0;box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem;outline-style:auto!important}.calendar-cell:focus:not(:focus-visible):not([tabindex=\"-1\"]){box-shadow:var(--cui-calendar-cell-focus-box-shadow);border-radius:.375rem}.calendar-cell-inner{-webkit-user-select:none;user-select:none}\n"] }]
|
|
441
|
-
}], ctorParameters: () => [], propDecorators: { calendarDays: [{
|
|
442
|
-
type: ViewChildren,
|
|
443
|
-
args: [CalendarDayDirective]
|
|
444
|
-
}], calendarRows: [{
|
|
445
|
-
type: ViewChildren,
|
|
446
|
-
args: [CalendarRowDirective]
|
|
447
|
-
}] } });
|
|
448
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbW9udGguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9jYWxlbmRhci9jYWxlbmRhci1tb250aC9jYWxlbmRhci1tb250aC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JldWktYW5ndWxhci9zcmMvbGliL2NhbGVuZGFyL2NhbGVuZGFyLW1vbnRoL2NhbGVuZGFyLW1vbnRoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxlQUFlLEVBRWYsTUFBTSxFQUNOLFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0QyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixVQUFVLEVBQ1YsZUFBZSxFQUNmLGNBQWMsRUFDZCxRQUFRLEVBQ1IsY0FBYyxFQUNkLHFCQUFxQixFQUN0QixNQUFNLG1CQUFtQixDQUFDO0FBRTNCLE9BQU8sRUFBRSxlQUFlLEVBQThELE1BQU0scUJBQXFCLENBQUM7QUFDbEgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxN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R0FDcEIsb0JBQW9CLG9EQUNwQixzQkFBc0Isc0RBRXRCLHFCQUFxQixxREFDckIsbUJBQW1CLHdEQUNuQixPQUFPOzsyRkFJRSxzQkFBc0I7a0JBcEJsQyxTQUFTOytCQUNFLGtCQUFrQixZQUdsQixnQkFBZ0IsY0FDZCxJQUFJLFdBQ1A7d0JBQ1Asb0JBQW9CO3dCQUNwQixlQUFlO3dCQUNmLG9CQUFvQjt3QkFDcEIsb0JBQW9CO3dCQUNwQixvQkFBb0I7d0JBQ3BCLHNCQUFzQjt3QkFDdEIsb0JBQW9CO3dCQUNwQixxQkFBcUI7d0JBQ3JCLG1CQUFtQjt3QkFDbkIsT0FBTzt3QkFDUCxTQUFTO3FCQUNWO3dEQWdJbUMsWUFBWTtzQkFBL0MsWUFBWTt1QkFBQyxvQkFBb0I7Z0JBQ0UsWUFBWTtzQkFBL0MsWUFBWTt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBEZXN0cm95UmVmLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG51bWJlckF0dHJpYnV0ZSxcbiAgUXVlcnlMaXN0LFxuICBzaWduYWwsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdDbGFzcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBjb252ZXJ0VG9EYXRlT2JqZWN0LFxuICBjcmVhdGVHcm91cHNJbkFycmF5LFxuICBlcXVhbERhdGVzLFxuICBnZXRNb250aERldGFpbHMsXG4gIGdldE1vbnRoc05hbWVzLFxuICBnZXRZZWFycyxcbiAgaXNEYXRlRGlzYWJsZWQsXG4gIGlzRGF0ZUluUmFuZ2VEaXNhYmxlZFxufSBmcm9tICcuLi9jYWxlbmRhci51dGlscyc7XG5cbmltcG9ydCB7IENhbGVuZGFyU2VydmljZSwgRGF0ZUZpbHRlclR5cGUsIERheUZvcm1hdFR5cGUsIE1vbnRoRGV0YWlscywgU2VsZWN0aW9uVHlwZSB9IGZyb20gJy4uL2NhbGVuZGFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FsZW5kYXJXZWVrZGF5UGlwZSB9IGZyb20gJy4vY2FsZW5kYXItd2Vla2RheS5waXBlJztcbmltcG9ydCB7IENhbGVuZGFyQ2xhc3NZZWFyUGlwZSB9IGZyb20gJy4vY2FsZW5kYXItY2xhc3MteWVhci5waXBlJztcbmltcG9ydCB7IENhbGVuZGFyQ2xhc3NNb250aFBpcGUgfSBmcm9tICcuL2NhbGVuZGFyLWNsYXNzLW1vbnRoLnBpcGUnO1xuaW1wb3J0IHsgQ2FsZW5kYXJEYXlQaXBlIH0gZnJvbSAnLi9jYWxlbmRhci1kYXkucGlwZSc7XG5pbXBvcnQgeyBDYWxlbmRhckRheURpcmVjdGl2ZSB9IGZyb20gJy4vY2FsZW5kYXItZGF5LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDYWxlbmRhckRheVRpdGxlUGlwZSB9IGZyb20gJy4vY2FsZW5kYXItZGF5LXRpdGxlLnBpcGUnO1xuaW1wb3J0IHsgQ2FsZW5kYXJDbGFzc0RheVBpcGUgfSBmcm9tICcuL2NhbGVuZGFyLWNsYXNzLWRheS5waXBlJztcbmltcG9ydCB7IENhbGVuZGFyQ2xhc3NSb3dQaXBlIH0gZnJvbSAnLi9jYWxlbmRhci1jbGFzcy1yb3cucGlwZSc7XG5pbXBvcnQgeyBDYWxlbmRhclJvd0RpcmVjdGl2ZSB9IGZyb20gJy4vY2FsZW5kYXItcm93LmRpcmVjdGl2ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2MtY2FsZW5kYXItbW9udGgnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItbW9udGguY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci1tb250aC5jb21wb25lbnQuc2NzcyddLFxuICBleHBvcnRBczogJ2NDYWxlbmRhck1vbnRoJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENhbGVuZGFyRGF5RGlyZWN0aXZlLFxuICAgIENhbGVuZGFyRGF5UGlwZSxcbiAgICBDYWxlbmRhckRheVRpdGxlUGlwZSxcbiAgICBDYWxlbmRhclJvd0RpcmVjdGl2ZSxcbiAgICBDYWxlbmRhckNsYXNzRGF5UGlwZSxcbiAgICBDYWxlbmRhckNsYXNzTW9udGhQaXBlLFxuICAgIENhbGVuZGFyQ2xhc3NSb3dQaXBlLFxuICAgIENhbGVuZGFyQ2xhc3NZZWFyUGlwZSxcbiAgICBDYWxlbmRhcldlZWtkYXlQaXBlLFxuICAgIE5nQ2xhc3MsXG4gICAgQXN5bmNQaXBlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJNb250aENvbXBvbmVudCB7XG4gICNkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAjY2FsZW5kYXJTZXJ2aWNlID0gaW5qZWN0KENhbGVuZGFyU2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jYWxlbmRhclN0YXRlU3Vic2NyaWJlKCk7XG4gIH1cblxuICByZWFkb25seSBwYWdlSW5kZXggPSBpbnB1dCgwLCB7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pO1xuXG4gIHJlYWRvbmx5IGFkZE1vbnRocyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3KCk7XG4gICAgY29uc3QgcGFnZUluZGV4ID0gdGhpcy5wYWdlSW5kZXgoKTtcbiAgICByZXR1cm4gcGFnZUluZGV4ICogKHZpZXcgPT09ICd5ZWFycycgPyAxNDQgOiB2aWV3ID09PSAnbW9udGhzJyA/IDEyIDogMSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsIHNlbGVjdGVkIGRhdGUuXG4gICAqIEB0eXBlICAoRGF0ZSB8IG51bGwpXG4gICAqL1xuICByZWFkb25seSBzdGFydERhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwsIHsgZXF1YWw6IGVxdWFsRGF0ZXMgfSk7XG5cbiAgLyoqXG4gICAqIEluaXRpYWwgc2VsZWN0ZWQgdG8gZGF0ZSAocmFuZ2UpLlxuICAgKiBAdHlwZSAgRGF0ZSB8IG51bGxcbiAgICovXG4gIHJlYWRvbmx5IGVuZERhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwsIHsgZXF1YWw6IGVxdWFsRGF0ZXMgfSk7XG5cbiAgcmVhZG9ubHkgZGF0ZXNFZmZlY3QgPSBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3Qgc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGUoKTtcbiAgICAgIGNvbnN0IGVuZERhdGUgPSBzdGFydERhdGUgJiYgdGhpcy5yYW5nZSgpID8gdGhpcy5lbmREYXRlKCkgOiBudWxsO1xuICAgICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IHN0YXJ0RGF0ZTogc3RhcnREYXRlLCBlbmREYXRlOiBlbmREYXRlIH0pO1xuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICk7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIGxpc3Qgb2YgZGF0ZXMgdGhhdCBjYW5ub3QgYmUgc2VsZWN0ZWQuXG4gICAqIEB0eXBlICBEYXRlW10gfCBEYXRlW11bXVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZWREYXRlcyA9IHNpZ25hbDwoRGF0ZVtdIHwgRGF0ZSlbXT4oW10pO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkYXkgb2Ygc3RhcnQgd2Vlay5cbiAgICogLSAwIC0gU3VuZGF5LFxuICAgKiAtIDEgLSBNb25kYXksXG4gICAqIC0gMiAtIFR1ZXNkYXksXG4gICAqIC0gMyAtIFdlZG5lc2RheSxcbiAgICogLSA0IC0gVGh1cnNkYXksXG4gICAqIC0gNSAtIEZyaWRheSxcbiAgICogLSA2IC0gU2F0dXJkYXksXG4gICAqL1xuICByZWFkb25seSBmaXJzdERheU9mV2VlayA9IHNpZ25hbCgxKTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgZGVmYXVsdCBsb2NhbGUgZm9yIGNvbXBvbmVudHMuIElmIG5vdCBzZXQsIGl0IGlzIGluaGVyaXRlZCBmcm9tIHRoZSBicm93c2VyLlxuICAgKiBAZGVmYXVsdCAnZGVmYXVsdCdcbiAgICovXG4gIHJlYWRvbmx5IGxvY2FsZSA9IHNpZ25hbCgnZGVmYXVsdCcpO1xuXG4gIC8qKlxuICAgKiBBbGxvdyByYW5nZSBzZWxlY3Rpb24uXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHJhbmdlID0gc2lnbmFsKGZhbHNlKTtcblxuICAvKipcbiAgICogU2V0IGxlbmd0aCBvciBmb3JtYXQgb2YgZGF5IG5hbWUuXG4gICAqIEB0eXBlIG51bWJlciB8ICdsb25nJyB8ICduYXJyb3cnIHwgJ3Nob3J0J1xuICAgKiBAZGVmYXVsdCAnc2hvcnQnXG4gICAqL1xuICByZWFkb25seSB3ZWVrZGF5Rm9ybWF0ID0gc2lnbmFsPG51bWJlciB8ICdsb25nJyB8ICduYXJyb3cnIHwgJ3Nob3J0Jz4oJ3Nob3J0Jyk7XG5cbiAgLyoqXG4gICAqIFNldCBjYWxlbmRhciB2aWV3LlxuICAgKiBAdHlwZSAnZGF5cycgfCAnbW9udGhzJyB8ICd5ZWFycydcbiAgICogQGRlZmF1bHQgJ2RheXMnXG4gICAqL1xuICByZWFkb25seSB2aWV3ID0gc2lnbmFsPCdkYXlzJyB8ICdtb250aHMnIHwgJ3llYXJzJz4oJ2RheXMnKTtcblxuICAvKipcbiAgICogTWF4IHNlbGVjdGFibGUgZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IG1heERhdGUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwsIHsgZXF1YWw6IGVxdWFsRGF0ZXMgfSk7XG5cbiAgLyoqXG4gICAqIE1pbiBzZWxlY3RhYmxlIGRhdGUuXG4gICAqL1xuICByZWFkb25seSBtaW5EYXRlID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsLCB7IGVxdWFsOiBlcXVhbERhdGVzIH0pO1xuXG4gIHJlYWRvbmx5IGxpc3RPZk1vbnRocyA9IGNvbXB1dGVkPHsgeWVhcjogbnVtYmVyOyBtb250aDogc3RyaW5nIH1bXVtdPigoKSA9PiB7XG4gICAgcmV0dXJuIGNyZWF0ZUdyb3Vwc0luQXJyYXkoZ2V0TW9udGhzTmFtZXModGhpcy5sb2NhbGUoKSwgdGhpcy5kYXRlKCkuZ2V0RnVsbFllYXIoKSksIDQpO1xuICB9KTtcblxuICByZWFkb25seSBsaXN0T2ZZZWFycyA9IGNvbXB1dGVkPG51bWJlcltdW10+KCgpID0+IGNyZWF0ZUdyb3Vwc0luQXJyYXkoZ2V0WWVhcnModGhpcy5kYXRlKCkuZ2V0RnVsbFllYXIoKSksIDQpKTtcblxuICAvKipcbiAgICogRGVmYXVsdCBkYXRlIG9mIHRoZSBjb21wb25lbnRcbiAgICogQHR5cGUgRGF0ZVxuICAgKi9cblxuICByZWFkb25seSBjYWxlbmRhckRhdGUgPSBzaWduYWw8RGF0ZT4obmV3IERhdGUoKSwgeyBlcXVhbDogZXF1YWxEYXRlcyB9KTtcblxuICByZWFkb25seSBkYXRlID0gY29tcHV0ZWQoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuY2FsZW5kYXJEYXRlKCk7XG4gICAgICByZXR1cm4gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkgKyB0aGlzLmFkZE1vbnRocygpLCAxLCAwLCAwLCAwLCAwKTtcbiAgICB9LFxuICAgIHsgZXF1YWw6IChhOiBEYXRlLCBiOiBEYXRlKSA9PiBhLmdldFRpbWUoKSA9PT0gYi5nZXRUaW1lKCkgfVxuICApO1xuXG4gIHJlYWRvbmx5IGNhbGVuZGFyRGF0ZUVmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgY2FsZW5kYXJEYXRlOiB0aGlzLmNhbGVuZGFyRGF0ZSgpIH0pO1xuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICk7XG5cbiAgLy8gcmVhZG9ubHkgY2FsZW5kYXJEYXlzID0gdmlld0NoaWxkcmVuKENhbGVuZGFyRGF5RGlyZWN0aXZlKTtcbiAgLy8gcmVhZG9ubHkgY2FsZW5kYXJSb3dzID0gdmlld0NoaWxkcmVuKENhbGVuZGFyUm93RGlyZWN0aXZlKTtcbiAgLy9cbiAgLy8gcmVhZG9ubHkgY2FsZW5kYXJEYXlzJCA9IHRvT2JzZXJ2YWJsZSh0aGlzLmNhbGVuZGFyRGF5cyk7XG4gIC8vIHJlYWRvbmx5IGNhbGVuZGFyUm93cyQgPSB0b09ic2VydmFibGUodGhpcy5jYWxlbmRhclJvd3MpO1xuXG4gIEBWaWV3Q2hpbGRyZW4oQ2FsZW5kYXJEYXlEaXJlY3RpdmUpIGNhbGVuZGFyRGF5cyE6IFF1ZXJ5TGlzdDxDYWxlbmRhckRheURpcmVjdGl2ZT47XG4gIEBWaWV3Q2hpbGRyZW4oQ2FsZW5kYXJSb3dEaXJlY3RpdmUpIGNhbGVuZGFyUm93cyE6IFF1ZXJ5TGlzdDxDYWxlbmRhclJvd0RpcmVjdGl2ZT47XG5cbiAgcmVhZG9ubHkgZGF0ZUZpbHRlciA9IHNpZ25hbDxEYXRlRmlsdGVyVHlwZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgZGF5Rm9ybWF0ID0gc2lnbmFsPERheUZvcm1hdFR5cGU+KCdudW1lcmljJyk7XG4gIHJlYWRvbmx5IHNlbGVjdEFkamFjZW50RGF5cyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHNob3dBZGphY2VudERheXMgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IHNlbGVjdGlvblR5cGUgPSBzaWduYWw8U2VsZWN0aW9uVHlwZT4oJ2RheScpO1xuICByZWFkb25seSBzaG93V2Vla051bWJlciA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IHdlZWtOdW1iZXJzTGFiZWwgPSBzaWduYWw8c3RyaW5nPignJyk7XG5cbiAgcmVhZG9ubHkgbW9udGhEZXRhaWxzID0gY29tcHV0ZWQ8TW9udGhEZXRhaWxzPigoKSA9PiB7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF0ZSgpO1xuICAgIHJldHVybiBnZXRNb250aERldGFpbHMoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIHRoaXMuZmlyc3REYXlPZldlZWsoKSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHdlZWtEYXlzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG1vbnRoRGV0YWlscyA9IHRoaXMubW9udGhEZXRhaWxzKCk7XG4gICAgcmV0dXJuIG1vbnRoRGV0YWlsc1swXS5kYXlzO1xuICB9KTtcblxuICB5ZWFyTnVtYmVyKHllYXI6IGFueSkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCAwKS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGUoKSwgeyB5ZWFyOiAnbnVtZXJpYycgfSk7XG4gIH1cblxuICBpc0RhdGVEaXNhYmxlZChkYXRlOiBEYXRlKSB7XG4gICAgY29uc3Qgc2VsZWN0aW9uVHlwZSA9IHRoaXMuc2VsZWN0aW9uVHlwZSgpO1xuICAgIGNvbnN0IGRpc2FibGVkRGF0ZXMgPSB0aGlzLmRpc2FibGVkRGF0ZXMoKTtcbiAgICBjb25zdCBkYXRlRmlsdGVyRm4gPSB0aGlzLmRhdGVGaWx0ZXIoKTtcbiAgICBjb25zdCBtYXhEYXRlID0gdGhpcy5tYXhEYXRlKCk7XG4gICAgY29uc3QgbWluRGF0ZSA9IHRoaXMubWluRGF0ZSgpO1xuICAgIGlmIChzZWxlY3Rpb25UeXBlID09PSAneWVhcicpIHtcbiAgICAgIGNvbnN0IG1pbiA9IG1pbkRhdGUgPyBuZXcgRGF0ZShtaW5EYXRlLmdldEZ1bGxZZWFyKCksIDAsIDEsIDAsIDAsIDAsIDApIDogbnVsbDtcbiAgICAgIGNvbnN0IG1heCA9IG1heERhdGUgPyBuZXcgRGF0ZShtYXhEYXRlLmdldEZ1bGxZZWFyKCksIDExLCAzMSwgMCwgMCwgMCwgMCkgOiBudWxsO1xuICAgICAgcmV0dXJuIGlzRGF0ZURpc2FibGVkKGRhdGUsIG1pbiwgbWF4LCBkaXNhYmxlZERhdGVzKSB8fCAoZGF0ZUZpbHRlckZuID8gIWRhdGVGaWx0ZXJGbihkYXRlKSA6IGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKHNlbGVjdGlvblR5cGUgPT09ICdtb250aCcpIHtcbiAgICAgIGNvbnN0IG1pbiA9IG1pbkRhdGUgPyBuZXcgRGF0ZShtaW5EYXRlLmdldEZ1bGxZZWFyKCksIG1pbkRhdGUuZ2V0TW9udGgoKSwgMSwgMCwgMCwgMCwgMCkgOiBudWxsO1xuICAgICAgY29uc3QgbWF4ID0gbWF4RGF0ZSA/IG5ldyBEYXRlKG1heERhdGUuZ2V0RnVsbFllYXIoKSwgbWF4RGF0ZS5nZXRNb250aCgpICsgMSwgMSwgMCwgMCwgLTEsIDApIDogbnVsbDtcbiAgICAgIHJldHVybiBpc0RhdGVEaXNhYmxlZChkYXRlLCBtaW4sIG1heCwgZGlzYWJsZWREYXRlcykgfHwgKGRhdGVGaWx0ZXJGbiA/ICFkYXRlRmlsdGVyRm4oZGF0ZSkgOiBmYWxzZSk7XG4gICAgfVxuICAgIHJldHVybiBpc0RhdGVEaXNhYmxlZChkYXRlLCBtaW5EYXRlLCBtYXhEYXRlLCBkaXNhYmxlZERhdGVzKSB8fCAoZGF0ZUZpbHRlckZuID8gIWRhdGVGaWx0ZXJGbihkYXRlKSA6IGZhbHNlKTtcbiAgfVxuXG4gIGNhbGVuZGFyQ2VsbFRpdGxlKGRhdGU6IERhdGUpIHtcbiAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5sb2NhbGUoKSk7XG4gIH1cblxuICBoYW5kbGVDZWxsTW91c2VFbnRlcihob3ZlckRhdGU6IERhdGUgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIWhvdmVyRGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlID0gdGhpcy5zZWxlY3Rpb25UeXBlKCk7XG4gICAgY29uc3QgdXBkYXRlSG92ZXJWYWx1ZSA9XG4gICAgICAoWydkYXknLCAnd2VlayddLmluY2x1ZGVzKHNlbGVjdGlvblR5cGUpICYmIHRoaXMudmlldygpID09PSAnZGF5cycpIHx8XG4gICAgICAoWydtb250aCddLmluY2x1ZGVzKHNlbGVjdGlvblR5cGUpICYmIHRoaXMudmlldygpID09PSAnbW9udGhzJykgfHxcbiAgICAgIChbJ3llYXInXS5pbmNsdWRlcyhzZWxlY3Rpb25UeXBlKSAmJiB0aGlzLnZpZXcoKSA9PT0gJ3llYXJzJyk7XG5cbiAgICAvLyBpZiAodXBkYXRlSG92ZXJWYWx1ZSkge1xuICAgIGNvbnN0IGhvdmVyVmFsdWUgPSB0aGlzLmlzRGF0ZURpc2FibGVkKGhvdmVyRGF0ZSkgfHwgIXVwZGF0ZUhvdmVyVmFsdWUgPyBudWxsIDogaG92ZXJEYXRlO1xuICAgIHRoaXMuI2NhbGVuZGFyU2VydmljZS51cGRhdGUoeyBob3ZlckRhdGU6IGhvdmVyVmFsdWUgfSk7XG4gICAgLy8gfVxuICB9XG5cbiAgaGFuZGxlWWVhckNlbGxDbGljayh5ZWFyOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25UeXBlKCkgPT09ICd5ZWFyJykge1xuICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCAwLCAxLCAwLCAwLCAwLCAwKTtcbiAgICAgIGlmICh0aGlzLnJhbmdlKCkgJiYgdGhpcy5zdGFydERhdGUoKSAmJiAhdGhpcy5lbmREYXRlKCkpIHtcbiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgMTIsIDEsIDAsIDAsIC0xLCAwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFuZGxlRGF5Q2VsbENsaWNrKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjYWxlbmRhckRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCAwLCAxLCAwLCAwLCAwLCAwKTtcbiAgICB0aGlzLnZpZXcuc2V0KCdtb250aHMnKTtcbiAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgdmlldzogdGhpcy52aWV3KCksIGNhbGVuZGFyRGF0ZTogY2FsZW5kYXJEYXRlIH0pO1xuICB9XG5cbiAgaGFuZGxlWWVhckNlbGxLZXlVcCgkZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGRhdGU6IERhdGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFsnU3BhY2UnLCAnRW50ZXInXS5pbmNsdWRlcygkZXZlbnQuY29kZSkpIHtcbiAgICAgIHRoaXMuaGFuZGxlWWVhckNlbGxDbGljayhkYXRlLmdldEZ1bGxZZWFyKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoWydUYWInLCAnQXJyb3dSaWdodCcsICdBcnJvd0xlZnQnLCAnQXJyb3dVcCcsICdBcnJvd0Rvd24nXS5pbmNsdWRlcygkZXZlbnQuY29kZSkpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ2VsbE1vdXNlRW50ZXIobmV3IERhdGUoZGF0ZSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vbnRoQ2VsbEtleVVwKCRldmVudDogS2V5Ym9hcmRFdmVudCwgZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoWydTcGFjZScsICdFbnRlciddLmluY2x1ZGVzKCRldmVudC5jb2RlKSkge1xuICAgICAgdGhpcy5oYW5kbGVNb250aENlbGxDbGljayhkYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKFsnVGFiJywgJ0Fycm93UmlnaHQnLCAnQXJyb3dMZWZ0JywgJ0Fycm93VXAnLCAnQXJyb3dEb3duJ10uaW5jbHVkZXMoJGV2ZW50LmNvZGUpKSB7XG4gICAgICB0aGlzLmhhbmRsZUNlbGxNb3VzZUVudGVyKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vbnRoQ2VsbENsaWNrKHZhbHVlOiBEYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25UeXBlKCkgPT09ICdtb250aCcpIHtcbiAgICAgIGxldCBkYXRlID0gbmV3IERhdGUodmFsdWUuZ2V0RnVsbFllYXIoKSwgdmFsdWUuZ2V0TW9udGgoKSwgMSwgMCwgMCwgMCwgMCk7XG4gICAgICBpZiAodGhpcy5yYW5nZSgpICYmIHRoaXMuc3RhcnREYXRlKCkgJiYgIXRoaXMuZW5kRGF0ZSgpKSB7XG4gICAgICAgIGRhdGUgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSArIDEsIDEsIDAsIDAsIC0xLCAwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaGFuZGxlRGF5Q2VsbENsaWNrKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZpZXcuc2V0KCdkYXlzJyk7XG4gICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IHZpZXc6IHRoaXMudmlldygpIH0pO1xuICAgIC8vIHRoaXMuc2V0Q2FsZW5kYXJQYWdlKDAsIDAsIHZhbHVlLmdldE1vbnRoKCkgLSB0aGlzLmFkZE1vbnRocygpKTtcbiAgICBjb25zdCBjYWxlbmRhckRhdGUgPSBuZXcgRGF0ZSh2YWx1ZS5nZXRGdWxsWWVhcigpLCB2YWx1ZS5nZXRNb250aCgpIC0gdGhpcy5hZGRNb250aHMoKSwgMSwgMCwgMCwgMCwgMCk7XG4gICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLnVwZGF0ZSh7IGNhbGVuZGFyRGF0ZTogY2FsZW5kYXJEYXRlIH0pO1xuICB9XG5cbiAgc2V0Q2FsZW5kYXJQYWdlKHllYXJzOiBudW1iZXIsIG1vbnRocyA9IDAsIHNldE1vbnRoPzogbnVtYmVyKSB7XG4gICAgY29uc3QgeWVhciA9IHRoaXMuZGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgbW9udGggPSB0aGlzLmRhdGUoKS5nZXRNb250aCgpO1xuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSwgMCwgMCwgMCwgMCk7XG5cbiAgICB5ZWFycyAmJiBkLnNldEZ1bGxZZWFyKGQuZ2V0RnVsbFllYXIoKSArIHllYXJzKTtcbiAgICBtb250aHMgJiYgZC5zZXRNb250aChkLmdldE1vbnRoKCkgKyBtb250aHMpO1xuICAgIHR5cGVvZiBzZXRNb250aCA9PT0gJ251bWJlcicgJiYgZC5zZXRNb250aChzZXRNb250aCk7XG5cbiAgICB0aGlzLiNjYWxlbmRhclNlcnZpY2UudXBkYXRlKHsgY2FsZW5kYXJEYXRlOiBkIH0pO1xuICB9XG5cbiAgaGFuZGxlRGF5Q2VsbEtleURvd24oJGV2ZW50OiBLZXlib2FyZEV2ZW50LCBkYXRlOiBEYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghWydUYWInLCAnQXJyb3dSaWdodCcsICdBcnJvd0xlZnQnLCAnQXJyb3dVcCcsICdBcnJvd0Rvd24nXS5pbmNsdWRlcygkZXZlbnQuY29kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5oYW5kbGVDZWxsTW91c2VFbnRlcihkYXRlKTtcblxuICAgIGNvbnN0IGV2ZW50S2V5ID0gJGV2ZW50LmtleSA9PT0gJ1RhYicgPyAoJGV2ZW50LnNoaWZ0S2V5ID8gJ0Fycm93TGVmdCcgOiAnQXJyb3dSaWdodCcpIDogJGV2ZW50LmtleTtcbiAgICBjb25zdCBzZWxlY3Rpb25UeXBlID0gdGhpcy5zZWxlY3Rpb25UeXBlKCk7XG4gICAgY29uc3QgdmlldyA9IHRoaXMudmlldygpO1xuICAgIGNvbnN0IG1heERhdGUgPSB0aGlzLm1heERhdGUoKTtcbiAgICBpZiAoXG4gICAgICBtYXhEYXRlICYmXG4gICAgICBkYXRlID49IGNvbnZlcnRUb0RhdGVPYmplY3QobWF4RGF0ZSwgc2VsZWN0aW9uVHlwZSkgJiZcbiAgICAgIFsnQXJyb3dSaWdodCcsICdBcnJvd0Rvd24nXS5pbmNsdWRlcyhldmVudEtleSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbWluRGF0ZSA9IHRoaXMubWluRGF0ZSgpO1xuICAgIGlmIChtaW5EYXRlICYmIGRhdGUgPD0gY29udmVydFRvRGF0ZU9iamVjdChtaW5EYXRlLCBzZWxlY3Rpb25UeXBlKSAmJiBbJ0Fycm93TGVmdCcsICdBcnJvd1VwJ10uaW5jbHVkZXMoZXZlbnRLZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGVsZW1lbnQgPSAkZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKHNlbGVjdGlvblR5cGUgPT09ICd3ZWVrJyAmJiB2aWV3ID09PSAnZGF5cycgJiYgZWxlbWVudC50YWJJbmRleCA9PT0gLTEpIHtcbiAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmNsb3Nlc3QoJ3RyW3RhYmluZGV4PVwiMFwiXScpIGFzIEhUTUxFbGVtZW50O1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRzID0gWyd3ZWVrJ10uaW5jbHVkZXMoc2VsZWN0aW9uVHlwZSkgJiYgdmlldyA9PT0gJ2RheXMnID8gdGhpcy5jYWxlbmRhclJvd3MgOiB0aGlzLmNhbGVuZGFyRGF5cztcblxuICAgIGNvbnN0IGxpc3QgPSBlbGVtZW50c1xuICAgICAgLnRvQXJyYXkoKVxuICAgICAgLm1hcCgoY2FsZW5kYXJDZWxsKSA9PiBjYWxlbmRhckNlbGwuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KVxuICAgICAgLy8gLmZpbHRlcigoZWxlbWVudCkgPT4gdGhpcy5zZWxlY3Rpb25UeXBlID09PSAnd2VlaycgPyBlbGVtZW50Py50YWJJbmRleCA9PT0gMCA6IGVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygnY3VycmVudCcpKVxuICAgICAgLmZpbHRlcigoZWxlbWVudCkgPT4gZWxlbWVudD8udGFiSW5kZXggPT09IDApO1xuXG4gICAgY29uc3QgaW5kZXggPSBsaXN0LmluZGV4T2YoZWxlbWVudCk7XG4gICAgY29uc3QgZmlyc3QgPSBpbmRleCA9PT0gMDtcbiAgICBjb25zdCBsYXN0ID0gaW5kZXggPT09IGxpc3QubGVuZ3RoIC0gMTtcblxuICAgIGNvbnN0IHRvQm91bmRhcnkgPSB7XG4gICAgICBzdGFydDogaW5kZXgsXG4gICAgICBlbmQ6IGxpc3QubGVuZ3RoIC0gKGluZGV4ICsgMSlcbiAgICB9O1xuXG4gICAgY29uc3QgZ2FwID0ge1xuICAgICAgQXJyb3dSaWdodDogMSxcbiAgICAgIEFycm93TGVmdDogLTEsXG4gICAgICBBcnJvd1VwOiBzZWxlY3Rpb25UeXBlID09PSAnd2VlaycgJiYgdmlldyA9PT0gJ2RheXMnID8gLTEgOiB2aWV3ID09PSAnZGF5cycgPyAtNyA6IC0zLFxuICAgICAgQXJyb3dEb3duOiBzZWxlY3Rpb25UeXBlID09PSAnd2VlaycgJiYgdmlldyA9PT0gJ2RheXMnID8gMSA6IHZpZXcgPT09ICdkYXlzJyA/IDcgOiAzXG4gICAgfTtcblxuICAgIGlmIChcbiAgICAgIChldmVudEtleSA9PT0gJ0Fycm93UmlnaHQnICYmIGxhc3QpIHx8XG4gICAgICAoZXZlbnRLZXkgPT09ICdBcnJvd0Rvd24nICYmIHRvQm91bmRhcnkuZW5kIDwgZ2FwLkFycm93RG93bikgfHxcbiAgICAgIChldmVudEtleSA9PT0gJ0Fycm93TGVmdCcgJiYgZmlyc3QpIHx8XG4gICAgICAoZXZlbnRLZXkgPT09ICdBcnJvd1VwJyAmJiB0b0JvdW5kYXJ5LnN0YXJ0IDwgTWF0aC5hYnMoZ2FwLkFycm93VXApKVxuICAgICkge1xuICAgICAgZWxlbWVudHMuY2hhbmdlc1xuICAgICAgICAucGlwZSh0YWtlKDEpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy4jZGVzdHJveVJlZikpXG4gICAgICAgIC5zdWJzY3JpYmUoKGNoYW5nZTogUXVlcnlMaXN0PENhbGVuZGFyUm93RGlyZWN0aXZlIHwgQ2FsZW5kYXJEYXlEaXJlY3RpdmU+KSA9PiB7XG4gICAgICAgICAgY29uc3QgX2xpc3QgPSBjaGFuZ2VcbiAgICAgICAgICAgIC50b0FycmF5KClcbiAgICAgICAgICAgIC8vIC5maWx0ZXIoZWxlbWVudCA9PiB0aGlzLnNlbGVjdGlvblR5cGUgPT09ICd3ZWVrJyA/IGVsZW1lbnQ/LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC50YWJJbmRleCA9PT0gMCA6IGVsZW1lbnQ/LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2N1cnJlbnQnKSk7XG4gICAgICAgICAgICAuZmlsdGVyKChkaXJlY3RpdmUpID0+IGRpcmVjdGl2ZT8uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnRhYkluZGV4ID09PSAwKTtcblxuICAgICAgICAgIGlmIChfbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBkYXlUb0ZvY3VzOiBDYWxlbmRhckRheURpcmVjdGl2ZSB8IENhbGVuZGFyUm93RGlyZWN0aXZlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgc3dpdGNoIChldmVudEtleSkge1xuICAgICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0Jzoge1xuICAgICAgICAgICAgICAgIGRheVRvRm9jdXMgPSBfbGlzdFswXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOiB7XG4gICAgICAgICAgICAgICAgZGF5VG9Gb2N1cyA9IF9saXN0W19saXN0Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6IHtcbiAgICAgICAgICAgICAgICBkYXlUb0ZvY3VzID0gX2xpc3RbZ2FwLkFycm93RG93biAtIChsaXN0Lmxlbmd0aCAtIGluZGV4KV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6IHtcbiAgICAgICAgICAgICAgICBkYXlUb0ZvY3VzID0gX2xpc3RbX2xpc3QubGVuZ3RoIC0gKE1hdGguYWJzKGdhcC5BcnJvd1VwKSArIDEgLSAoaW5kZXggKyAxKSldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWRheVRvRm9jdXM/LmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdkYXlUb0ZvY3VzJywgZGF5VG9Gb2N1cz8uZGF0ZSk7XG4gICAgICAgICAgICAgIGRheVRvRm9jdXM/LmZvY3VzKCdrZXlib2FyZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIHN3aXRjaCAodmlldykge1xuICAgICAgICBjYXNlICdkYXlzJzpcbiAgICAgICAgICB0aGlzLnNldENhbGVuZGFyUGFnZSgwLCBbJ0Fycm93UmlnaHQnLCAnQXJyb3dEb3duJ10uaW5jbHVkZXMoZXZlbnRLZXkpID8gMSA6IC0xKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbW9udGhzJzpcbiAgICAgICAgICB0aGlzLnNldENhbGVuZGFyUGFnZShbJ0Fycm93UmlnaHQnLCAnQXJyb3dEb3duJ10uaW5jbHVkZXMoZXZlbnRLZXkpID8gMSA6IC0xKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAneWVhcnMnOlxuICAgICAgICAgIHRoaXMuc2V0Q2FsZW5kYXJQYWdlKFsnQXJyb3dSaWdodCcsICdBcnJvd0Rvd24nXS5pbmNsdWRlcyhldmVudEtleSkgPyAxMiA6IC0xMik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgbmV4dEVsZW1lbnQgPSBsaXN0W2luZGV4ICsgZ2FwW2V2ZW50S2V5XV07XG4gICAgaWYgKG5leHRFbGVtZW50Py50YWJJbmRleCA9PT0gMCkge1xuICAgICAgbmV4dEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gaW5kZXg7IGkgPCBsaXN0Lmxlbmd0aDsgbGlzdC5sZW5ndGggJiYgWydBcnJvd1JpZ2h0JywgJ0Fycm93RG93biddLmluY2x1ZGVzKGV2ZW50S2V5KSA/IGkrKyA6IGktLSkge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBsaXN0W2kgKyBnYXBbZXZlbnRLZXldXTtcbiAgICAgIGlmIChuZXh0RWxlbWVudD8udGFiSW5kZXggPT09IDApIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBuZXh0RWxlbWVudD8uZm9jdXMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpZiAoIW5leHRFbGVtZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNlbGxNb3VzZUxlYXZlKCkge1xuICAgIHRoaXMuI2NhbGVuZGFyU2VydmljZS51cGRhdGUoeyBob3ZlckRhdGU6IG51bGwgfSk7XG4gIH1cblxuICBoYW5kbGVEYXlDZWxsS2V5VXAoJGV2ZW50OiBLZXlib2FyZEV2ZW50LCBkYXRlOiBEYXRlKSB7XG4gICAgaWYgKFsnU3BhY2UnLCAnRW50ZXInXS5pbmNsdWRlcygkZXZlbnQuY29kZSkpIHtcbiAgICAgIHRoaXMuaGFuZGxlRGF5Q2VsbENsaWNrKGRhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoWydUYWInLCAnQXJyb3dSaWdodCcsICdBcnJvd0xlZnQnLCAnQXJyb3dVcCcsICdBcnJvd0Rvd24nXS5pbmNsdWRlcygkZXZlbnQuY29kZSkpIHtcbiAgICAgIHRoaXMuaGFuZGxlQ2VsbE1vdXNlRW50ZXIoZGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlRGF5Q2VsbENsaWNrKGRhdGU6IERhdGUpIHtcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25UeXBlKCkgPT09ICdkYXknICYmIHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucmFuZ2UoKSkge1xuICAgICAgdGhpcy5lbmREYXRlLnNldChudWxsKTtcbiAgICAgIHRoaXMuc3RhcnREYXRlLnNldChkYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZSgpO1xuICAgIGNvbnN0IGVuZERhdGUgPSB0aGlzLmVuZERhdGUoKTtcblxuICAgIGlmIChzdGFydERhdGUgJiYgZW5kRGF0ZSkge1xuICAgICAgdGhpcy5zdGFydERhdGUuc2V0KG51bGwpO1xuICAgICAgdGhpcy5lbmREYXRlLnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoISFzdGFydERhdGUgJiYgIWVuZERhdGUpIHtcbiAgICAgIGlmIChzdGFydERhdGUgJiYgZGF0ZSA8IHN0YXJ0RGF0ZSkge1xuICAgICAgICB0aGlzLmVuZERhdGUuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBhZGREYXlzID0gdGhpcy5zZWxlY3Rpb25UeXBlKCkgIT09ICd3ZWVrJyA/IDEgOiA3O1xuICAgICAgICB0aGlzLmVuZERhdGUuc2V0KG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSArIGFkZERheXMsIDAsIDAsIC0xLCAwKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5kRGF0ZS5zZXQobnVsbCk7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5zZXQoZGF0ZSk7XG4gICAgfVxuICAgIHtcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlKCk7XG4gICAgICBjb25zdCBlbmREYXRlID0gdGhpcy5lbmREYXRlKCk7XG4gICAgICBpZiAoc3RhcnREYXRlICYmIGVuZERhdGUpIHtcbiAgICAgICAgY29uc3QgZGF0ZUZpbHRlckZuID0gdGhpcy5kYXRlRmlsdGVyKCk7XG4gICAgICAgIGlmIChpc0RhdGVJblJhbmdlRGlzYWJsZWQoc3RhcnREYXRlLCBlbmREYXRlLCB0aGlzLmRpc2FibGVkRGF0ZXMoKSwgZGF0ZUZpbHRlckZuKSkge1xuICAgICAgICAgIHRoaXMuc3RhcnREYXRlLnNldChudWxsKTtcbiAgICAgICAgICB0aGlzLmVuZERhdGUuc2V0KG51bGwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNhbGVuZGFyU3RhdGVTdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy4jY2FsZW5kYXJTZXJ2aWNlLmNhbGVuZGFyU3RhdGUkLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuI2Rlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc3RhdGUpO1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGlmIChrZXkgaW4gdGhpcykge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICBjb25zdCBpc1dyaXRhYmxlU2lnbmFsID0gdHlwZW9mIHRoaXNba2V5XSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdGhpc1trZXldLnNldCA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgaXNXcml0YWJsZVNpZ25hbCA/IHRoaXNba2V5XS5zZXQoc3RhdGVba2V5XSkgOiAodGhpc1trZXldID0gc3RhdGVba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldE1vbnRoU3RhcnQoaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLmNhbGVuZGFyRGF0ZSgpLmdldEZ1bGxZZWFyKCksIGluZGV4ICsgdGhpcy5hZGRNb250aHMoKSwgMSwgMCwgMCwgMCwgMCk7XG4gIH1cblxuICBnZXRNb250aEVuZChpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuY2FsZW5kYXJEYXRlKCkuZ2V0RnVsbFllYXIoKSwgaW5kZXggKyAxICsgdGhpcy5hZGRNb250aHMoKSwgMSwgMCwgMCwgLTEsIDApO1xuICB9XG5cbiAgZ2V0WWVhclN0YXJ0KHllYXI6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCAwLCAxKTtcbiAgfVxuXG4gIGdldFllYXJFbmQoeWVhcjogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIDExLCAxLCAwLCAwLCAtMSwgMCk7XG4gIH1cbn1cbiIsIjx0YWJsZT5cbiAgQGlmICh2aWV3KCkgPT09ICdkYXlzJykge1xuICAgIDx0aGVhZD5cbiAgICA8dHI+XG4gICAgICBAaWYgKHNob3dXZWVrTnVtYmVyKCkpIHtcbiAgICAgICAgPHRoIGNsYXNzPVwiY2FsZW5kYXItY2VsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1oZWFkZXItY2VsbC1pbm5lclwiPnt7IHdlZWtOdW1iZXJzTGFiZWwoKSB9fTwvZGl2PlxuICAgICAgICA8L3RoPlxuICAgICAgfVxuICAgICAgQGZvciAod2Vla0RheSBvZiB3ZWVrRGF5cygpOyB0cmFjayB3ZWVrRGF5LmRhdGU7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgIEBsZXQgZGF0ZSA9IHdlZWtEYXkuZGF0ZSA7XG4gICAgICAgIDx0aCBjbGFzcz1cImNhbGVuZGFyLWNlbGxcIiBhYmJyPVwie3tkYXRlIHwgY2FsZW5kYXJXZWVrZGF5Oidsb25nJzpsb2NhbGUoKX19XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWhlYWRlci1jZWxsLWlubmVyXCI+XG4gICAgICAgICAgICB7eyBkYXRlIHwgY2FsZW5kYXJXZWVrZGF5OndlZWtkYXlGb3JtYXQoKTpsb2NhbGUoKSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RoPlxuICAgICAgfVxuICAgIDwvdHI+XG4gICAgPC90aGVhZD5cbiAgfVxuICA8dGJvZHkgKG1vdXNlbGVhdmUpPVwiaGFuZGxlQ2VsbE1vdXNlTGVhdmUoKVwiPlxuICAgIEBzd2l0Y2ggKHZpZXcoKSkge1xuICAgICAgQGNhc2UgKCd5ZWFycycpIHtcbiAgICAgICAgQGZvciAoeWVhcnNSb3cgb2YgbGlzdE9mWWVhcnMoKTsgdHJhY2sgeWVhcnNSb3dbMF07IGxldCByb3dJZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICBAZm9yICh5ZWFyIG9mIHllYXJzUm93OyB0cmFjayB5ZWFyOyBsZXQgaWR4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICNjYWxlbmRhclllYXI9XCJjQ2FsZW5kYXJEYXlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCIhY2FsZW5kYXJZZWFyLmRpc2FibGVkJCgpICYmIGhhbmRsZVllYXJDZWxsQ2xpY2soeWVhcilcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImNhbGVuZGFyWWVhci5kYXRlKCkgJiYgaGFuZGxlRGF5Q2VsbEtleURvd24oJGV2ZW50LCBjYWxlbmRhclllYXIuZGF0ZSgpKVwiXG4gICAgICAgICAgICAgICAgKGtleXVwKT1cImhhbmRsZVllYXJDZWxsS2V5VXAoJGV2ZW50LCBjYWxlbmRhclllYXIuZGF0ZSgpKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiY2FsZW5kYXJZZWFyLmRhdGUoKSAmJiBoYW5kbGVDZWxsTW91c2VFbnRlcihjYWxlbmRhclllYXIuZGF0ZSgpKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjYWxlbmRhclllYXIuZGF0ZSgpPy5nZXRGdWxsWWVhcigpXCJcbiAgICAgICAgICAgICAgICBbZGF0ZV09XCJnZXRZZWFyU3RhcnQoeWVhcilcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInllYXIgfCBjYWxlbmRhckNsYXNzWWVhclwiXG4gICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cImNhbGVuZGFyWWVhci5kaXNhYmxlZCQoKSA/IC0xIDogMFwiXG4gICAgICAgICAgICAgICAgY0NhbGVuZGFyRGF5XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY2VsbC1pbm5lclwiPlxuICAgICAgICAgICAgICAgICAge3sgeWVhck51bWJlcih5ZWFyKSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIEBjYXNlICgnbW9udGhzJykge1xuICAgICAgICBAZm9yIChtb250aHNSb3cgb2YgbGlzdE9mTW9udGhzKCk7IHRyYWNrIG1vbnRoc1Jvd1swXTsgbGV0IHJvd0lkeCA9ICRpbmRleCkge1xuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIEBmb3IgKG1vbnRoIG9mIG1vbnRoc1JvdzsgdHJhY2sgbW9udGg7IGxldCBpZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgQGxldCBtb250aFN0YXJ0ID0gZ2V0TW9udGhTdGFydChyb3dJZHgqMytpZHgpO1xuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAjY2FsZW5kYXJNb250aD1cImNDYWxlbmRhckRheVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiFjYWxlbmRhck1vbnRoLmRpc2FibGVkJCgpICYmIGhhbmRsZU1vbnRoQ2VsbENsaWNrKGNhbGVuZGFyTW9udGguZGF0ZSgpKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwiY2FsZW5kYXJNb250aC5kYXRlKCkgJiYgaGFuZGxlRGF5Q2VsbEtleURvd24oJGV2ZW50LCBjYWxlbmRhck1vbnRoLmRhdGUoKSlcIlxuICAgICAgICAgICAgICAgIChrZXl1cCk9XCJoYW5kbGVNb250aENlbGxLZXlVcCgkZXZlbnQsIGNhbGVuZGFyTW9udGguZGF0ZSgpKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiY2FsZW5kYXJNb250aC5kYXRlKCkgJiYgaGFuZGxlQ2VsbE1vdXNlRW50ZXIoY2FsZW5kYXJNb250aC5kYXRlKCkpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNhbGVuZGFyTW9udGguZGF0ZSgpPy5nZXRGdWxsWWVhcigpKycgJyttb250aC5tb250aFwiXG4gICAgICAgICAgICAgICAgW2RhdGVdPVwibW9udGhTdGFydFwiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwibW9udGhTdGFydCB8IGNhbGVuZGFyQ2xhc3NNb250aDoocm93SWR4KjMraWR4KVwiXG4gICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cImNhbGVuZGFyTW9udGguZGlzYWJsZWQkKCkgPyAtMSA6IDBcIlxuICAgICAgICAgICAgICAgIGNDYWxlbmRhckRheVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWNlbGwtaW5uZXJcIj5cbiAgICAgICAgICAgICAgICAgIHt7IG1vbnRoLm1vbnRoIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgICBAZGVmYXVsdCB7XG4gICAgICAgIEBsZXQgd2Vla1NlbGVjdGlvbiA9IHNlbGVjdGlvblR5cGUoKSA9PT0gJ3dlZWsnO1xuICAgICAgICBAbGV0IGRheVNlbGVjdGlvbiA9IHNlbGVjdGlvblR5cGUoKSA9PT0gJ2RheSc7XG4gICAgICAgIEBmb3IgKHdlZWsgb2YgbW9udGhEZXRhaWxzKCk7IHRyYWNrIHdlZWsuZGF5c1swXTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICA8dHIgI2NhbGVuZGFyUm93PVwiY0NhbGVuZGFyUm93XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIndlZWtTZWxlY3Rpb24gJiYgKGNhbGVuZGFyUm93LmN1cnJlbnQpICYmIGNhbGVuZGFyUm93LmRhdGUgJiYgaGFuZGxlRGF5Q2VsbENsaWNrKGNhbGVuZGFyUm93LmRhdGUpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24pPVwid2Vla1NlbGVjdGlvbiAmJiAoY2FsZW5kYXJSb3cuY3VycmVudCkgJiYgY2FsZW5kYXJSb3cuZGF0ZSAmJiBoYW5kbGVEYXlDZWxsS2V5RG93bigkZXZlbnQsIGNhbGVuZGFyUm93LmRhdGUpXCJcbiAgICAgICAgICAgICAgKGtleXVwKT1cIndlZWtTZWxlY3Rpb24gJiYgKGNhbGVuZGFyUm93LmN1cnJlbnQpICYmIGNhbGVuZGFyUm93LmRhdGUgJiYgaGFuZGxlRGF5Q2VsbEtleVVwKCRldmVudCwgY2FsZW5kYXJSb3cuZGF0ZSlcIlxuICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJ3ZWVrU2VsZWN0aW9uICYmIGNhbGVuZGFyUm93LmRhdGUgJiYgaGFuZGxlQ2VsbE1vdXNlRW50ZXIoY2FsZW5kYXJSb3cuZGF0ZSlcIlxuICAgICAgICAgICAgICBbY0NhbGVuZGFyUm93XT1cIndlZWtcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBpZiAoc2hvd1dlZWtOdW1iZXIoKSkge1xuICAgICAgICAgICAgICA8dGggY2xhc3M9XCJjYWxlbmRhci1jZWxsLXdlZWstbnVtYmVyXCI+XG4gICAgICAgICAgICAgICAge3sgd2Vlay53ZWVrTnVtYmVyID09PSAwID8gNTMgOiB3ZWVrLndlZWtOdW1iZXIgfX1cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBmb3IgKGRhdGVPYmogb2Ygd2Vlay5kYXlzOyB0cmFjayBkYXRlT2JqLmRhdGU7IGxldCBpZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgQGxldCBjdXJyZW50TW9udGggPSBkYXRlT2JqLm1vbnRoID09PSAnY3VycmVudCc7XG4gICAgICAgICAgICAgIEBpZiAoY3VycmVudE1vbnRoIHx8IHNob3dBZGphY2VudERheXMoKSkge1xuICAgICAgICAgICAgICAgIEBsZXQgc2VsZWN0YWJsZSA9IGRheVNlbGVjdGlvbiAmJiAoY3VycmVudE1vbnRoIHx8IHNlbGVjdEFkamFjZW50RGF5cygpKTtcbiAgICAgICAgICAgICAgICA8dGQgI2NhbGVuZGFyQ2VsbD1cImNDYWxlbmRhckRheVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RhYmxlICYmIGhhbmRsZURheUNlbGxDbGljayhkYXRlT2JqLmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwic2VsZWN0YWJsZSAmJiBoYW5kbGVEYXlDZWxsS2V5RG93bigkZXZlbnQsIGRhdGVPYmouZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwic2VsZWN0YWJsZSAmJiBoYW5kbGVEYXlDZWxsS2V5VXAoJGV2ZW50LCBkYXRlT2JqLmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwic2VsZWN0YWJsZSAmJiBoYW5kbGVDZWxsTW91c2VFbnRlcihkYXRlT2JqLmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJkYXRlT2JqLmRhdGUgfCBjYWxlbmRhckRheVRpdGxlOmxvY2FsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGVdPVwiZGF0ZU9iai5kYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW21vbnRoXT1cImRhdGVPYmoubW9udGhcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJkYXRlT2JqIHwgY2FsZW5kYXJDbGFzc0RheTp7bWluRGF0ZTogbWluRGF0ZSgpLCBtYXhEYXRlOiBtYXhEYXRlKCksIGRpc2FibGVkRGF0ZXM6IGRpc2FibGVkRGF0ZXMoKSwgZGF0ZUZpbHRlcjogZGF0ZUZpbHRlcigpfVwiXG4gICAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJzZWxlY3RhYmxlICYmICFpc0RhdGVEaXNhYmxlZChkYXRlT2JqLmRhdGUpID8gMCA6IC0xXCJcbiAgICAgICAgICAgICAgICAgICAgY0NhbGVuZGFyRGF5XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWNlbGwtaW5uZXJcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgZGF0ZU9iai5kYXRlIHwgY2FsZW5kYXJEYXk6ZGF5Rm9ybWF0KCk6bG9jYWxlKCkgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNhbGVuZGFyLWNlbGxcIj48L3RkPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgPC90Ym9keT5cbjwvdGFibGU+XG5cbiJdfQ==
|