@dsivd/prestations-ng 15.5.13 → 16.0.0-beta1
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/CHANGELOG.md +666 -1
- package/CONTRIBUTING.md +32 -1
- package/ESLINT_MIGRATION_GUIDE.md +1 -1
- package/README.md +6 -0
- package/UPGRADING_V12.md +0 -15
- package/UPGRADING_V13.md +0 -15
- package/UPGRADING_V14.md +8 -26
- package/UPGRADING_V15.md +113 -0
- package/UPGRADING_V16.md +63 -0
- package/abstract-page-component.d.ts +8 -8
- package/directives/currency-formatter.directive.d.ts +4 -1
- package/directives/iban-formatter.directive.d.ts +1 -1
- package/directives/ide-formatter.directive.d.ts +1 -1
- package/directives/ndc-formatter.directive.d.ts +1 -1
- package/dsivd-prestations-ng-v16.0.0-beta1.tgz +0 -0
- package/esm2020/abstract-page-component.mjs +223 -0
- package/esm2020/directives/currency-formatter.directive.mjs +143 -0
- package/{esm2015/directives/formatter.module.js → esm2020/directives/formatter.module.mjs} +8 -8
- package/{esm2015/directives/iban-formatter.directive.js → esm2020/directives/iban-formatter.directive.mjs} +4 -4
- package/{esm2015/directives/ide-formatter.directive.js → esm2020/directives/ide-formatter.directive.mjs} +4 -4
- package/{esm2015/directives/ndc-formatter.directive.js → esm2020/directives/ndc-formatter.directive.mjs} +4 -4
- package/{esm2015/dsivd-prestations-ng.js → esm2020/dsivd-prestations-ng.mjs} +0 -0
- package/{esm2015/foehn-address/address.type.js → esm2020/foehn-address/address.type.mjs} +1 -1
- package/esm2020/foehn-address/foehn-address.module.mjs +55 -0
- package/{esm2015/foehn-address/foehn-display-address.component.js → esm2020/foehn-address/foehn-display-address.component.mjs} +5 -9
- package/esm2020/foehn-address/foehn-input-address.component.mjs +406 -0
- package/esm2020/foehn-address/foehn-input-foreign-locality.component.mjs +66 -0
- package/esm2020/foehn-address/foehn-input-foreign-street.component.mjs +55 -0
- package/esm2020/foehn-agenda/calendar.type.mjs +3 -0
- package/esm2020/foehn-agenda/current-week.type.mjs +4 -0
- package/esm2020/foehn-agenda/day-slots.type.mjs +3 -0
- package/esm2020/foehn-agenda/foehn-agenda-navigation/foehn-agenda-navigation.component.mjs +74 -0
- package/esm2020/foehn-agenda/foehn-agenda-timeslot-panel/foehn-agenda-timeslot-panel.component.mjs +242 -0
- package/esm2020/foehn-agenda/foehn-agenda.component.mjs +95 -0
- package/esm2020/foehn-agenda/foehn-agenda.module.mjs +62 -0
- package/esm2020/foehn-agenda/pagination-week.type.mjs +3 -0
- package/esm2020/foehn-agenda/selected-slot.type.mjs +3 -0
- package/esm2020/foehn-autocomplete/foehn-autocomplete.component.mjs +608 -0
- package/esm2020/foehn-autocomplete/foehn-autocomplete.module.mjs +40 -0
- package/esm2020/foehn-boolean/foehn-boolean-checkbox.component.mjs +28 -0
- package/esm2020/foehn-boolean/foehn-boolean-radio.component.mjs +40 -0
- package/esm2020/foehn-boolean/foehn-boolean.module.mjs +33 -0
- package/esm2020/foehn-breadcrumb/breadcrumb-event.service.mjs +181 -0
- package/{esm2015/foehn-breadcrumb/breadcrumb.js → esm2020/foehn-breadcrumb/breadcrumb.mjs} +0 -0
- package/esm2020/foehn-breadcrumb/foehn-breadcrumb.component.mjs +80 -0
- package/esm2020/foehn-breadcrumb/foehn-breadcrumb.module.mjs +19 -0
- package/esm2020/foehn-checkables/foehn-checkable-group.component.mjs +298 -0
- package/esm2020/foehn-checkables/foehn-checkables.module.mjs +68 -0
- package/esm2020/foehn-checkables/foehn-checkbox.component.mjs +37 -0
- package/esm2020/foehn-checkables/foehn-radio.component.mjs +64 -0
- package/esm2020/foehn-checkables/foehn-select.component.mjs +53 -0
- package/{esm2015/foehn-checkables/form-select-option-group.js → esm2020/foehn-checkables/form-select-option-group.mjs} +0 -0
- package/{esm2015/foehn-checkables/form-select-option.js → esm2020/foehn-checkables/form-select-option.mjs} +0 -0
- package/{esm2015/foehn-confirm-modal/foehn-confirm-modal-content.js → esm2020/foehn-confirm-modal/foehn-confirm-modal-content.mjs} +1 -1
- package/esm2020/foehn-confirm-modal/foehn-confirm-modal.component.mjs +40 -0
- package/esm2020/foehn-confirm-modal/foehn-confirm-modal.module.mjs +19 -0
- package/{esm2015/foehn-confirm-modal/foehn-confirm-modal.service.js → esm2020/foehn-confirm-modal/foehn-confirm-modal.service.mjs} +4 -4
- package/esm2020/foehn-date-picker/date-picker-navigation.helper.mjs +167 -0
- package/esm2020/foehn-date-picker/date-picker.helper.mjs +132 -0
- package/{esm2015/foehn-date-picker/day-month.type.js → esm2020/foehn-date-picker/day-month.type.mjs} +0 -0
- package/{esm2015/foehn-date-picker/focused-day.type.js → esm2020/foehn-date-picker/focused-day.type.mjs} +0 -0
- package/esm2020/foehn-date-picker/foehn-date-picker.component.mjs +387 -0
- package/esm2020/foehn-date-picker/foehn-date-picker.module.mjs +40 -0
- package/{esm2015/foehn-date-picker/month-year.type.js → esm2020/foehn-date-picker/month-year.type.mjs} +0 -0
- package/esm2020/foehn-date-picker-button/foehn-date-picker-button.component.mjs +97 -0
- package/esm2020/foehn-date-picker-button/foehn-date-picker-button.module.mjs +36 -0
- package/esm2020/foehn-debug-summary/foehn-debug-summary.component.mjs +67 -0
- package/{esm2015/foehn-debug-summary/foehn-debug-summary.component.module.js → esm2020/foehn-debug-summary/foehn-debug-summary.component.module.mjs} +7 -7
- package/esm2020/foehn-decision-electronique/foehn-decision-electronique.component.mjs +37 -0
- package/esm2020/foehn-decision-electronique/foehn-decision-electronique.module.mjs +32 -0
- package/esm2020/foehn-footer/foehn-footer.component.mjs +130 -0
- package/{esm2015/foehn-footer/foehn-footer.module.js → esm2020/foehn-footer/foehn-footer.module.mjs} +6 -6
- package/{esm2015/foehn-footer/footer-link.type.js → esm2020/foehn-footer/footer-link.type.mjs} +0 -0
- package/esm2020/foehn-form/foehn-form.component.mjs +135 -0
- package/esm2020/foehn-form/foehn-form.module.mjs +32 -0
- package/esm2020/foehn-form/register-ng-model.service.mjs +23 -0
- package/esm2020/foehn-growl/foehn-growl.component.mjs +44 -0
- package/{esm2015/foehn-growl/foehn-growl.module.js → esm2020/foehn-growl/foehn-growl.module.mjs} +6 -6
- package/{esm2015/foehn-growl/growl-broker.service.js → esm2020/foehn-growl/growl-broker.service.mjs} +5 -5
- package/{esm2015/foehn-growl/growl-message.js → esm2020/foehn-growl/growl-message.mjs} +1 -1
- package/{esm2015/foehn-growl/growl-types.js → esm2020/foehn-growl/growl-types.mjs} +0 -0
- package/esm2020/foehn-header/foehn-header.component.mjs +68 -0
- package/esm2020/foehn-header/foehn-header.module.mjs +21 -0
- package/{esm2015/foehn-header/foehn-skip-link.component.js → esm2020/foehn-header/foehn-skip-link.component.mjs} +5 -8
- package/esm2020/foehn-help-modal/foehn-help-modal.component.mjs +44 -0
- package/esm2020/foehn-help-modal/foehn-help-modal.module.mjs +20 -0
- package/esm2020/foehn-help-modal/foehn-help-modal.type.mjs +2 -0
- package/{esm2015/foehn-icons/abstract-icon-component.js → esm2020/foehn-icons/abstract-icon-component.mjs} +5 -5
- package/esm2020/foehn-icons/foehn-icon-calendar.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-check-square-o.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-check.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-chevron-down.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-chevron-left.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-chevron-right.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-chevron-up.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-clock.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-comment-dots.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-edit.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-external-link-alt.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-file-pdf.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-info-circle.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-lock.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-map-marker.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-minus-circle.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-plus-circle.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-plus-square.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-search.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-times.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-trash-alt.component.mjs +19 -0
- package/esm2020/foehn-icons/foehn-icon-unlock-alt.component.mjs +19 -0
- package/{esm2015/foehn-icons/foehn-icons.module.js → esm2020/foehn-icons/foehn-icons.module.mjs} +20 -20
- package/esm2020/foehn-input/foehn-input-email.component.mjs +59 -0
- package/esm2020/foehn-input/foehn-input-hidden.component.mjs +55 -0
- package/esm2020/foehn-input/foehn-input-number.component.mjs +276 -0
- package/esm2020/foehn-input/foehn-input-password.component.mjs +52 -0
- package/esm2020/foehn-input/foehn-input-phone.component.mjs +92 -0
- package/{esm2015/foehn-input/foehn-input-string.component.js → esm2020/foehn-input/foehn-input-string.component.mjs} +5 -5
- package/esm2020/foehn-input/foehn-input-text.component.mjs +76 -0
- package/esm2020/foehn-input/foehn-input-textarea.component.mjs +109 -0
- package/esm2020/foehn-input/foehn-input.component.mjs +390 -0
- package/esm2020/foehn-input/foehn-input.module.mjs +93 -0
- package/{esm2015/foehn-input/pattern.const.js → esm2020/foehn-input/pattern.const.mjs} +0 -0
- package/esm2020/foehn-input-date/foehn-input-date.component.mjs +118 -0
- package/esm2020/foehn-input-date-time/foehn-input-date-time.component.mjs +143 -0
- package/esm2020/foehn-input-time/foehn-input-time.component.mjs +74 -0
- package/esm2020/foehn-list/foehn-list.component.mjs +128 -0
- package/esm2020/foehn-list/foehn-list.module.mjs +19 -0
- package/{esm2015/foehn-list/page-change-event.js → esm2020/foehn-list/page-change-event.mjs} +0 -0
- package/esm2020/foehn-menu-prestation/abstract-list-item-detail-page.component.mjs +122 -0
- package/{esm2015/foehn-menu-prestation/abstract-menu-page.component.js → esm2020/foehn-menu-prestation/abstract-menu-page.component.mjs} +4 -4
- package/{esm2015/foehn-menu-prestation/abstract-page-from-menu.component.js → esm2020/foehn-menu-prestation/abstract-page-from-menu.component.mjs} +4 -4
- package/esm2020/foehn-menu-prestation/foehn-error-pill/foehn-error-pill.component.mjs +23 -0
- package/{esm2015/foehn-menu-prestation/foehn-list-summary/foehn-list-item-description.js → esm2020/foehn-menu-prestation/foehn-list-summary/foehn-list-item-description.mjs} +0 -0
- package/{esm2015/foehn-menu-prestation/foehn-list-summary/foehn-list-item.js → esm2020/foehn-menu-prestation/foehn-list-summary/foehn-list-item.mjs} +0 -0
- package/esm2020/foehn-menu-prestation/foehn-list-summary/foehn-list-summary.component.mjs +71 -0
- package/esm2020/foehn-menu-prestation/foehn-menu-items/foehn-menu-item/foehn-menu-item.component.mjs +35 -0
- package/esm2020/foehn-menu-prestation/foehn-menu-items/foehn-menu-item-transmit/foehn-menu-item-transmit.component.mjs +51 -0
- package/esm2020/foehn-menu-prestation/foehn-menu-prestation.module.mjs +59 -0
- package/{esm2015/foehn-misc/foehn-abbr.component.js → esm2020/foehn-misc/foehn-abbr.component.mjs} +5 -9
- package/{esm2015/foehn-misc/foehn-misc.module.js → esm2020/foehn-misc/foehn-misc.module.mjs} +5 -5
- package/esm2020/foehn-modal/foehn-modal.component.mjs +94 -0
- package/esm2020/foehn-modal/foehn-modal.module.mjs +21 -0
- package/esm2020/foehn-multiselect-autocomplete/foehn-multiselect-autocomplete.component.mjs +268 -0
- package/esm2020/foehn-multiselect-autocomplete/foehn-multiselect-autocomplete.module.mjs +40 -0
- package/esm2020/foehn-nav13/foehn-input-nav13.component.mjs +114 -0
- package/esm2020/foehn-nav13/foehn-input-nav13.module.mjs +32 -0
- package/esm2020/foehn-navigation/foehn-navigation.component.mjs +94 -0
- package/esm2020/foehn-navigation/foehn-navigation.module.mjs +32 -0
- package/esm2020/foehn-navigation/foehn-navigation.service.mjs +303 -0
- package/{esm2015/foehn-notfound/foehn-notfound.component.js → esm2020/foehn-notfound/foehn-notfound.component.mjs} +7 -10
- package/esm2020/foehn-notfound/foehn-notfound.module.mjs +20 -0
- package/{esm2015/foehn-page/foehn-page-counter.component.js → esm2020/foehn-page/foehn-page-counter.component.mjs} +5 -8
- package/esm2020/foehn-page/foehn-page-modal.component.mjs +53 -0
- package/{esm2015/foehn-page/foehn-page-modal.service.js → esm2020/foehn-page/foehn-page-modal.service.mjs} +4 -4
- package/esm2020/foehn-page/foehn-page.component.mjs +218 -0
- package/esm2020/foehn-page/foehn-page.module.mjs +78 -0
- package/{esm2015/foehn-page/foehn-page.service.js → esm2020/foehn-page/foehn-page.service.mjs} +4 -4
- package/esm2020/foehn-recap-section/foehn-recap-section.component.mjs +88 -0
- package/esm2020/foehn-recap-section/foehn-recap-section.module.mjs +20 -0
- package/{esm2015/foehn-recap-section/foehn-recap-section.type.js → esm2020/foehn-recap-section/foehn-recap-section.type.mjs} +0 -0
- package/{esm2015/foehn-remaining-alerts-summary/foehn-remaining-alerts-summary.component.js → esm2020/foehn-remaining-alerts-summary/foehn-remaining-alerts-summary.component.mjs} +5 -9
- package/{esm2015/foehn-remaining-alerts-summary/foehn-remaining-alerts-summary.module.js → esm2020/foehn-remaining-alerts-summary/foehn-remaining-alerts-summary.module.mjs} +6 -6
- package/esm2020/foehn-status-progress-bar/foehn-status-progress-bar.component.mjs +56 -0
- package/esm2020/foehn-status-progress-bar/foehn-status-progress-bar.module.mjs +20 -0
- package/esm2020/foehn-table/foehn-table-column-configuration.mjs +3 -0
- package/esm2020/foehn-table/foehn-table-page-change-event.mjs +3 -0
- package/esm2020/foehn-table/foehn-table.component.mjs +148 -0
- package/esm2020/foehn-table/foehn-table.module.mjs +32 -0
- package/esm2020/foehn-table/tableSort.mjs +3 -0
- package/esm2020/foehn-upload/abstract-foehn-uploader.component.mjs +192 -0
- package/{esm2015/foehn-upload/document-reference.js → esm2020/foehn-upload/document-reference.mjs} +0 -0
- package/esm2020/foehn-upload/foehn-bo-multi-upload/bo-multi-upload.service.mjs +71 -0
- package/{esm2015/foehn-upload/foehn-bo-multi-upload/bo-multi-upload.type.js → esm2020/foehn-upload/foehn-bo-multi-upload/bo-multi-upload.type.mjs} +0 -0
- package/esm2020/foehn-upload/foehn-bo-multi-upload/foehn-bo-multi-upload.component.mjs +174 -0
- package/esm2020/foehn-upload/foehn-bo-multi-upload/foehn-bo-multi-upload.module.mjs +40 -0
- package/esm2020/foehn-upload/foehn-multi-upload/foehn-multi-upload.component.mjs +224 -0
- package/esm2020/foehn-upload/foehn-multi-upload/foehn-multi-upload.module.mjs +40 -0
- package/esm2020/foehn-upload/foehn-multi-upload/multi-upload.service.mjs +83 -0
- package/{esm2015/foehn-upload/foehn-multi-upload/multi-upload.type.js → esm2020/foehn-upload/foehn-multi-upload/multi-upload.type.mjs} +0 -0
- package/esm2020/foehn-upload/foehn-multi-upload/pending-upload.service.mjs +158 -0
- package/esm2020/foehn-upload/foehn-picture-upload/foehn-picture-upload.component.mjs +202 -0
- package/esm2020/foehn-upload/foehn-picture-upload/foehn-picture-upload.module.mjs +44 -0
- package/esm2020/foehn-upload/foehn-upload-progress-bar/foehn-upload-progress-bar.component.mjs +75 -0
- package/esm2020/foehn-upload/foehn-upload-progress-bar/foehn-upload-progress-bar.module.mjs +21 -0
- package/esm2020/foehn-upload/foehn-upload-progress-bar/upload-progress.service.mjs +62 -0
- package/esm2020/foehn-upload/foehn-upload-progress-bar/upload-progress.type.mjs +3 -0
- package/{esm2015/foehn-upload/pending-upload.type.js → esm2020/foehn-upload/pending-upload.type.mjs} +1 -1
- package/esm2020/foehn-upload/uploader.helper.mjs +327 -0
- package/{esm2015/foehn-user-connected-as/foehn-user-connected-as.component.js → esm2020/foehn-user-connected-as/foehn-user-connected-as.component.mjs} +5 -8
- package/{esm2015/foehn-user-connected-as/foehn-user-connected-as.module.js → esm2020/foehn-user-connected-as/foehn-user-connected-as.module.mjs} +6 -6
- package/esm2020/foehn-validation-alert-summary/foehn-validation-alert-summary.component.mjs +96 -0
- package/esm2020/foehn-validation-alert-summary/foehn-validation-alert-summary.module.mjs +19 -0
- package/esm2020/foehn-validation-alerts/foehn-validation-alerts.component.mjs +29 -0
- package/{esm2015/foehn-validation-alerts/foehn-validation-alerts.module.js → esm2020/foehn-validation-alerts/foehn-validation-alerts.module.mjs} +6 -6
- package/esm2020/form-error.mjs +2 -0
- package/esm2020/form-post-response.mjs +10 -0
- package/{esm2015/gesdem/gesdem-error-handler.service.js → esm2020/gesdem/gesdem-error-handler.service.mjs} +4 -4
- package/esm2020/gesdem/gesdem-event.service.mjs +38 -0
- package/esm2020/gesdem/gesdem-handler.service.mjs +160 -0
- package/esm2020/gesdem/gesdem-loader.guard.mjs +41 -0
- package/{esm2015/gesdem/gesdem-statut-utils.js → esm2020/gesdem/gesdem-statut-utils.mjs} +0 -0
- package/esm2020/gesdem-action-recovery/gesdem-action-recovery-login/gesdem-action-recovery-login.component.mjs +101 -0
- package/esm2020/gesdem-action-recovery/gesdem-action-recovery-registration/gesdem-action-recovery-registration.component.mjs +130 -0
- package/esm2020/gesdem-action-recovery/gesdem-action-recovery.module.mjs +50 -0
- package/esm2020/gesdem-action-recovery/gesdem-action-recovery.service.mjs +82 -0
- package/{esm2015/gesdem-action-recovery/reprise-info.js → esm2020/gesdem-action-recovery/reprise-info.mjs} +0 -0
- package/esm2020/gesdem-confirmation/gesdem-confirmation.component.mjs +201 -0
- package/esm2020/gesdem-confirmation/gesdem-confirmation.module.mjs +32 -0
- package/esm2020/gesdem-error/gesdem-error.component.mjs +87 -0
- package/esm2020/gesdem-error/gesdem-error.module.mjs +36 -0
- package/esm2020/global.const.mjs +5 -0
- package/esm2020/helpers/object.helper.mjs +89 -0
- package/{esm2015/i18n-form.js → esm2020/i18n-form.mjs} +0 -0
- package/esm2020/index.mjs +263 -0
- package/{esm2015/pipes/currency.pipe.js → esm2020/pipes/currency.pipe.mjs} +4 -4
- package/{esm2015/pipes/date.pipe.js → esm2020/pipes/date.pipe.mjs} +4 -4
- package/{esm2015/pipes/formatIde.pipe.js → esm2020/pipes/formatIde.pipe.mjs} +3 -3
- package/{esm2015/pipes/pipes.module.js → esm2020/pipes/pipes.module.mjs} +7 -7
- package/{esm2015/prestations-ng-core.module.js → esm2020/prestations-ng-core.module.mjs} +7 -7
- package/esm2020/refinf/model/address-type-light.mjs +3 -0
- package/esm2020/refinf/model/canton.mjs +3 -0
- package/esm2020/refinf/model/district.mjs +3 -0
- package/esm2020/refinf/model/municipality.mjs +3 -0
- package/esm2020/refinf/model/place-of-origin.mjs +3 -0
- package/esm2020/refinf/model/postal-locality.mjs +3 -0
- package/esm2020/sdk-appinfo/application-info.mjs +14 -0
- package/esm2020/sdk-appinfo/application-info.service.mjs +104 -0
- package/{esm2015/sdk-currency/currency.helper.js → esm2020/sdk-currency/currency.helper.mjs} +3 -3
- package/esm2020/sdk-date/date.helper.mjs +100 -0
- package/esm2020/sdk-dictionary/default-dictionary.mjs +166 -0
- package/{esm2015/sdk-dictionary/sdk-dictionary.module.js → esm2020/sdk-dictionary/sdk-dictionary.module.mjs} +5 -5
- package/{esm2015/sdk-dictionary/sdk-dictionary.pipe.js → esm2020/sdk-dictionary/sdk-dictionary.pipe.mjs} +6 -6
- package/esm2020/sdk-dictionary/sdk-dictionary.service.mjs +111 -0
- package/{esm2015/sdk-epayment/model/EPaymentParameters.js → esm2020/sdk-epayment/model/EPaymentParameters.mjs} +0 -0
- package/esm2020/sdk-epayment/sdk-epayment.component.mjs +81 -0
- package/esm2020/sdk-epayment/sdk-epayment.module.mjs +21 -0
- package/esm2020/sdk-epayment/sdk-epayment.service.mjs +52 -0
- package/{esm2015/sdk-recaptcha/grecaptcha/grecaptcha.component.js → esm2020/sdk-recaptcha/grecaptcha/grecaptcha.component.mjs} +6 -10
- package/esm2020/sdk-recaptcha/recaptcha.service.mjs +162 -0
- package/esm2020/sdk-recaptcha/sdk-recaptcha.component.mjs +69 -0
- package/esm2020/sdk-recaptcha/sdk-recaptcha.module.mjs +19 -0
- package/esm2020/sdk-redirect/iam-expired-interceptor.service.mjs +58 -0
- package/esm2020/sdk-redirect/redirect.component.mjs +35 -0
- package/esm2020/sdk-redirect/sdk-redirect.module.mjs +19 -0
- package/{esm2015/sdk-session-info/session-info-data.js → esm2020/sdk-session-info/session-info-data.mjs} +1 -1
- package/{esm2015/sdk-session-info/session-info-with-application.service.js → esm2020/sdk-session-info/session-info-with-application.service.mjs} +5 -5
- package/esm2020/sdk-session-info/session-info.service.mjs +50 -0
- package/esm2020/sdk-statistics/sdk-statistics.service.mjs +70 -0
- package/esm2020/sdk-support-alert/support-alert-container.component.mjs +49 -0
- package/esm2020/sdk-support-alert/support-alert.component.mjs +34 -0
- package/{esm2015/sdk-support-alert/support-alert.model.js → esm2020/sdk-support-alert/support-alert.model.mjs} +0 -0
- package/esm2020/sdk-support-alert/support-alert.module.mjs +21 -0
- package/esm2020/sdk-support-alert/support-alert.service.mjs +117 -0
- package/{esm2015/service-locator.js → esm2020/service-locator.mjs} +0 -0
- package/esm2020/supported-browser.mjs +2 -0
- package/esm2020/validation/validation-handler.service.mjs +44 -0
- package/fesm2015/dsivd-prestations-ng.mjs +13397 -0
- package/fesm2015/dsivd-prestations-ng.mjs.map +1 -0
- package/fesm2020/dsivd-prestations-ng.mjs +13372 -0
- package/fesm2020/dsivd-prestations-ng.mjs.map +1 -0
- package/foehn-address/address.type.d.ts +3 -3
- package/foehn-address/foehn-display-address.component.d.ts +1 -1
- package/foehn-address/foehn-input-address.component.d.ts +18 -8
- package/foehn-address/foehn-input-foreign-locality.component.d.ts +1 -1
- package/foehn-address/foehn-input-foreign-street.component.d.ts +1 -1
- package/foehn-agenda/calendar.type.d.ts +9 -0
- package/foehn-agenda/current-week.type.d.ts +5 -0
- package/foehn-agenda/day-slots.type.d.ts +5 -0
- package/foehn-agenda/foehn-agenda-navigation/foehn-agenda-navigation.component.d.ts +21 -0
- package/foehn-agenda/foehn-agenda-timeslot-panel/foehn-agenda-timeslot-panel.component.d.ts +51 -0
- package/foehn-agenda/foehn-agenda.component.d.ts +29 -0
- package/foehn-agenda/foehn-agenda.module.d.ts +17 -0
- package/foehn-agenda/pagination-week.type.d.ts +5 -0
- package/foehn-agenda/selected-slot.type.d.ts +7 -0
- package/foehn-autocomplete/foehn-autocomplete.component.d.ts +22 -6
- package/foehn-boolean/foehn-boolean-checkbox.component.d.ts +1 -1
- package/foehn-boolean/foehn-boolean-radio.component.d.ts +2 -1
- package/foehn-breadcrumb/breadcrumb-event.service.d.ts +2 -2
- package/foehn-breadcrumb/foehn-breadcrumb.component.d.ts +6 -5
- package/foehn-checkables/foehn-checkable-group.component.d.ts +8 -8
- package/foehn-checkables/foehn-checkables.module.d.ts +3 -1
- package/foehn-checkables/foehn-checkbox.component.d.ts +1 -1
- package/foehn-checkables/foehn-radio.component.d.ts +1 -1
- package/foehn-checkables/foehn-select.component.d.ts +2 -10
- package/foehn-confirm-modal/foehn-confirm-modal-content.d.ts +1 -0
- package/foehn-confirm-modal/foehn-confirm-modal.component.d.ts +2 -2
- package/foehn-date-picker/date-picker-navigation.helper.d.ts +7 -1
- package/foehn-date-picker/date-picker.helper.d.ts +3 -2
- package/foehn-date-picker/foehn-date-picker.component.d.ts +21 -10
- package/foehn-date-picker-button/foehn-date-picker-button.component.d.ts +13 -5
- package/foehn-debug-summary/foehn-debug-summary.component.d.ts +7 -5
- package/foehn-decision-electronique/foehn-decision-electronique.component.d.ts +2 -2
- package/foehn-decision-electronique/foehn-decision-electronique.module.d.ts +2 -1
- package/foehn-footer/foehn-footer.component.d.ts +4 -4
- package/foehn-form/foehn-form.component.d.ts +7 -4
- package/foehn-form/register-ng-model.service.d.ts +9 -0
- package/foehn-growl/foehn-growl.component.d.ts +3 -3
- package/foehn-growl/growl-broker.service.d.ts +1 -1
- package/foehn-header/foehn-header.component.d.ts +7 -7
- package/foehn-header/foehn-skip-link.component.d.ts +2 -2
- package/foehn-help-modal/foehn-help-modal.component.d.ts +1 -1
- package/foehn-help-modal/foehn-help-modal.type.d.ts +4 -0
- package/foehn-icons/abstract-icon-component.d.ts +1 -1
- package/foehn-icons/foehn-icon-calendar.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-check-square-o.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-check.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-chevron-down.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-chevron-left.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-chevron-right.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-chevron-up.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-clock.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-comment-dots.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-edit.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-external-link-alt.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-file-pdf.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-info-circle.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-lock.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-map-marker.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-minus-circle.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-plus-circle.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-plus-square.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-search.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-times.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-trash-alt.component.d.ts +1 -1
- package/foehn-icons/foehn-icon-unlock-alt.component.d.ts +1 -1
- package/foehn-input/foehn-input-email.component.d.ts +4 -2
- package/foehn-input/foehn-input-hidden.component.d.ts +1 -1
- package/foehn-input/foehn-input-number.component.d.ts +16 -6
- package/foehn-input/foehn-input-password.component.d.ts +1 -1
- package/foehn-input/foehn-input-phone.component.d.ts +1 -1
- package/foehn-input/foehn-input-string.component.d.ts +1 -1
- package/foehn-input/foehn-input-text.component.d.ts +1 -1
- package/foehn-input/foehn-input-textarea.component.d.ts +5 -2
- package/foehn-input/foehn-input.component.d.ts +25 -9
- package/foehn-input/foehn-input.module.d.ts +9 -6
- package/foehn-input-date/foehn-input-date.component.d.ts +10 -3
- package/foehn-input-date-time/foehn-input-date-time.component.d.ts +29 -0
- package/foehn-input-time/foehn-input-time.component.d.ts +1 -1
- package/foehn-list/foehn-list.component.d.ts +2 -3
- package/foehn-menu-prestation/abstract-list-item-detail-page.component.d.ts +5 -5
- package/foehn-menu-prestation/abstract-menu-page.component.d.ts +1 -1
- package/foehn-menu-prestation/abstract-page-from-menu.component.d.ts +1 -1
- package/foehn-menu-prestation/foehn-error-pill/foehn-error-pill.component.d.ts +1 -1
- package/foehn-menu-prestation/foehn-list-summary/foehn-list-summary.component.d.ts +3 -3
- package/foehn-menu-prestation/foehn-menu-items/foehn-menu-item/foehn-menu-item.component.d.ts +1 -1
- package/foehn-menu-prestation/foehn-menu-items/foehn-menu-item-transmit/foehn-menu-item-transmit.component.d.ts +2 -2
- package/foehn-misc/foehn-abbr.component.d.ts +1 -1
- package/foehn-modal/foehn-modal.component.d.ts +2 -3
- package/foehn-modal/foehn-modal.module.d.ts +3 -1
- package/foehn-multiselect-autocomplete/foehn-multiselect-autocomplete.component.d.ts +51 -0
- package/foehn-multiselect-autocomplete/foehn-multiselect-autocomplete.module.d.ts +13 -0
- package/foehn-nav13/foehn-input-nav13.component.d.ts +2 -1
- package/foehn-navigation/foehn-navigation.component.d.ts +2 -2
- package/foehn-navigation/foehn-navigation.service.d.ts +4 -3
- package/foehn-notfound/foehn-notfound.component.d.ts +1 -1
- package/foehn-page/foehn-page-counter.component.d.ts +1 -1
- package/foehn-page/foehn-page-modal.component.d.ts +1 -1
- package/foehn-page/foehn-page-modal.service.d.ts +1 -1
- package/foehn-page/foehn-page.component.d.ts +15 -12
- package/foehn-page/foehn-page.module.d.ts +2 -1
- package/foehn-page/foehn-page.service.d.ts +2 -2
- package/foehn-recap-section/foehn-recap-section.component.d.ts +3 -1
- package/foehn-remaining-alerts-summary/foehn-remaining-alerts-summary.component.d.ts +1 -1
- package/foehn-status-progress-bar/foehn-status-progress-bar.component.d.ts +23 -0
- package/foehn-status-progress-bar/foehn-status-progress-bar.module.d.ts +10 -0
- package/foehn-table/foehn-table-column-configuration.d.ts +18 -0
- package/foehn-table/foehn-table-page-change-event.d.ts +5 -0
- package/foehn-table/foehn-table.component.d.ts +33 -0
- package/foehn-table/foehn-table.module.d.ts +11 -0
- package/foehn-table/tableSort.d.ts +4 -0
- package/foehn-upload/abstract-foehn-uploader.component.d.ts +7 -7
- package/foehn-upload/foehn-bo-multi-upload/bo-multi-upload.service.d.ts +6 -4
- package/foehn-upload/foehn-bo-multi-upload/foehn-bo-multi-upload.component.d.ts +6 -5
- package/foehn-upload/foehn-bo-multi-upload/foehn-bo-multi-upload.module.d.ts +2 -1
- package/foehn-upload/foehn-multi-upload/foehn-multi-upload.component.d.ts +9 -8
- package/foehn-upload/foehn-multi-upload/foehn-multi-upload.module.d.ts +2 -1
- package/foehn-upload/foehn-multi-upload/multi-upload.service.d.ts +6 -4
- package/foehn-upload/foehn-multi-upload/pending-upload.service.d.ts +3 -3
- package/foehn-upload/foehn-picture-upload/foehn-picture-upload.component.d.ts +7 -4
- package/foehn-upload/foehn-picture-upload/foehn-picture-upload.module.d.ts +2 -1
- package/foehn-upload/foehn-upload-progress-bar/foehn-upload-progress-bar.component.d.ts +19 -0
- package/foehn-upload/foehn-upload-progress-bar/foehn-upload-progress-bar.module.d.ts +11 -0
- package/foehn-upload/foehn-upload-progress-bar/upload-progress.service.d.ts +19 -0
- package/foehn-upload/foehn-upload-progress-bar/upload-progress.type.d.ts +4 -0
- package/foehn-upload/pending-upload.type.d.ts +1 -0
- package/foehn-upload/uploader.helper.d.ts +13 -13
- package/foehn-user-connected-as/foehn-user-connected-as.component.d.ts +2 -2
- package/foehn-validation-alert-summary/foehn-validation-alert-summary.component.d.ts +2 -2
- package/foehn-validation-alerts/foehn-validation-alerts.component.d.ts +4 -4
- package/{error-template.d.ts → form-error.d.ts} +1 -1
- package/form-post-response.d.ts +17 -0
- package/gesdem/gesdem-error-handler.service.d.ts +2 -2
- package/gesdem/gesdem-event.service.d.ts +7 -7
- package/gesdem/gesdem-handler.service.d.ts +8 -6
- package/gesdem/gesdem-loader.guard.d.ts +1 -1
- package/gesdem-action-recovery/gesdem-action-recovery-login/gesdem-action-recovery-login.component.d.ts +5 -5
- package/gesdem-action-recovery/gesdem-action-recovery-registration/gesdem-action-recovery-registration.component.d.ts +7 -7
- package/gesdem-action-recovery/gesdem-action-recovery.service.d.ts +3 -3
- package/gesdem-confirmation/gesdem-confirmation.component.d.ts +10 -9
- package/gesdem-error/gesdem-error.component.d.ts +10 -3
- package/gesdem-error/gesdem-error.module.d.ts +2 -1
- package/global.const.d.ts +1 -0
- package/index.d.ts +102 -70
- package/package.json +34 -21
- package/pipes/currency.pipe.d.ts +1 -1
- package/pipes/date.pipe.d.ts +1 -1
- package/pipes/formatIde.pipe.d.ts +1 -1
- package/refinf/model/address-type-light.d.ts +5 -0
- package/refinf/model/canton.d.ts +4 -0
- package/refinf/model/district.d.ts +7 -0
- package/refinf/model/municipality.d.ts +8 -0
- package/refinf/model/place-of-origin.d.ts +9 -0
- package/refinf/model/postal-locality.d.ts +11 -0
- package/schematics/ng-add/index.js +10 -10
- package/schematics/ng-update/migrations/update-13_1_0/index.js +2 -2
- package/schematics/ng-update/migrations/update-13_2_0/index.js +3 -3
- package/schematics/ng-update/migrations/update-13_5_1/index.js +3 -3
- package/schematics/ng-update/migrations/update-14_5_0/index.js +2 -2
- package/schematics/update-karma-config/index.js +2 -2
- package/schematics/utility/migrate-to-karma-coverage.js +3 -3
- package/sdk-appinfo/application-info.d.ts +1 -0
- package/sdk-appinfo/application-info.service.d.ts +4 -4
- package/sdk-dictionary/sdk-dictionary.pipe.d.ts +1 -1
- package/sdk-dictionary/sdk-dictionary.service.d.ts +9 -0
- package/sdk-epayment/sdk-epayment.component.d.ts +6 -16
- package/sdk-epayment/sdk-epayment.service.d.ts +3 -6
- package/sdk-recaptcha/grecaptcha/grecaptcha.component.d.ts +2 -2
- package/sdk-recaptcha/recaptcha.service.d.ts +5 -5
- package/sdk-recaptcha/sdk-recaptcha.component.d.ts +4 -4
- package/sdk-redirect/iam-expired-interceptor.service.d.ts +3 -3
- package/sdk-redirect/redirect.component.d.ts +3 -9
- package/sdk-session-info/session-info-data.d.ts +0 -1
- package/sdk-session-info/session-info.service.d.ts +4 -4
- package/sdk-statistics/sdk-statistics.service.d.ts +22 -0
- package/sdk-support-alert/support-alert-container.component.d.ts +3 -3
- package/sdk-support-alert/support-alert.component.d.ts +1 -1
- package/sdk-support-alert/support-alert.service.d.ts +5 -4
- package/validation/validation-handler.service.d.ts +4 -4
- package/backend-response.d.ts +0 -18
- package/bundles/dsivd-prestations-ng.umd.js +0 -13188
- package/bundles/dsivd-prestations-ng.umd.js.map +0 -1
- package/dsivd-prestations-ng-v15.5.13.tgz +0 -0
- package/dsivd-prestations-ng.d.ts +0 -5
- package/esm2015/abstract-page-component.js +0 -224
- package/esm2015/backend-response.js +0 -10
- package/esm2015/directives/currency-formatter.directive.js +0 -116
- package/esm2015/error-template.js +0 -2
- package/esm2015/foehn-address/foehn-address.module.js +0 -57
- package/esm2015/foehn-address/foehn-input-address.component.js +0 -365
- package/esm2015/foehn-address/foehn-input-foreign-locality.component.js +0 -71
- package/esm2015/foehn-address/foehn-input-foreign-street.component.js +0 -60
- package/esm2015/foehn-autocomplete/foehn-autocomplete.component.js +0 -556
- package/esm2015/foehn-autocomplete/foehn-autocomplete.module.js +0 -42
- package/esm2015/foehn-boolean/foehn-boolean-checkbox.component.js +0 -32
- package/esm2015/foehn-boolean/foehn-boolean-radio.component.js +0 -41
- package/esm2015/foehn-boolean/foehn-boolean.module.js +0 -35
- package/esm2015/foehn-breadcrumb/breadcrumb-event.service.js +0 -182
- package/esm2015/foehn-breadcrumb/foehn-breadcrumb.component.js +0 -85
- package/esm2015/foehn-breadcrumb/foehn-breadcrumb.module.js +0 -19
- package/esm2015/foehn-checkables/foehn-checkable-group.component.js +0 -294
- package/esm2015/foehn-checkables/foehn-checkables.module.js +0 -62
- package/esm2015/foehn-checkables/foehn-checkbox.component.js +0 -40
- package/esm2015/foehn-checkables/foehn-radio.component.js +0 -67
- package/esm2015/foehn-checkables/foehn-select.component.js +0 -66
- package/esm2015/foehn-confirm-modal/foehn-confirm-modal.component.js +0 -42
- package/esm2015/foehn-confirm-modal/foehn-confirm-modal.module.js +0 -19
- package/esm2015/foehn-date-picker/date-picker-navigation.helper.js +0 -117
- package/esm2015/foehn-date-picker/date-picker.helper.js +0 -126
- package/esm2015/foehn-date-picker/foehn-date-picker.component.js +0 -300
- package/esm2015/foehn-date-picker/foehn-date-picker.module.js +0 -42
- package/esm2015/foehn-date-picker-button/foehn-date-picker-button.component.js +0 -74
- package/esm2015/foehn-date-picker-button/foehn-date-picker-button.module.js +0 -38
- package/esm2015/foehn-debug-summary/foehn-debug-summary.component.js +0 -61
- package/esm2015/foehn-decision-electronique/foehn-decision-electronique.component.js +0 -40
- package/esm2015/foehn-decision-electronique/foehn-decision-electronique.module.js +0 -20
- package/esm2015/foehn-footer/foehn-footer.component.js +0 -132
- package/esm2015/foehn-form/foehn-form.component.js +0 -146
- package/esm2015/foehn-form/foehn-form.module.js +0 -20
- package/esm2015/foehn-growl/foehn-growl.component.js +0 -47
- package/esm2015/foehn-header/foehn-header.component.js +0 -73
- package/esm2015/foehn-header/foehn-header.module.js +0 -21
- package/esm2015/foehn-help-modal/foehn-help-modal.component.js +0 -48
- package/esm2015/foehn-help-modal/foehn-help-modal.module.js +0 -20
- package/esm2015/foehn-help-modal/foehn-help-modal.type.js +0 -2
- package/esm2015/foehn-icons/foehn-icon-calendar.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-check-square-o.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-check.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-chevron-down.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-chevron-left.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-chevron-right.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-chevron-up.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-clock.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-comment-dots.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-edit.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-external-link-alt.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-file-pdf.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-info-circle.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-lock.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-map-marker.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-minus-circle.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-plus-circle.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-plus-square.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-search.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-times.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-trash-alt.component.js +0 -22
- package/esm2015/foehn-icons/foehn-icon-unlock-alt.component.js +0 -22
- package/esm2015/foehn-input/foehn-input-email.component.js +0 -55
- package/esm2015/foehn-input/foehn-input-hidden.component.js +0 -57
- package/esm2015/foehn-input/foehn-input-number.component.js +0 -190
- package/esm2015/foehn-input/foehn-input-password.component.js +0 -55
- package/esm2015/foehn-input/foehn-input-phone.component.js +0 -96
- package/esm2015/foehn-input/foehn-input-text.component.js +0 -80
- package/esm2015/foehn-input/foehn-input-textarea.component.js +0 -104
- package/esm2015/foehn-input/foehn-input.component.js +0 -364
- package/esm2015/foehn-input/foehn-input.module.js +0 -82
- package/esm2015/foehn-input-date/foehn-input-date.component.js +0 -94
- package/esm2015/foehn-input-time/foehn-input-time.component.js +0 -79
- package/esm2015/foehn-list/foehn-list.component.js +0 -135
- package/esm2015/foehn-list/foehn-list.module.js +0 -19
- package/esm2015/foehn-menu-prestation/abstract-list-item-detail-page.component.js +0 -122
- package/esm2015/foehn-menu-prestation/foehn-error-pill/foehn-error-pill.component.js +0 -26
- package/esm2015/foehn-menu-prestation/foehn-list-summary/foehn-list-summary.component.js +0 -75
- package/esm2015/foehn-menu-prestation/foehn-menu-items/foehn-menu-item/foehn-menu-item.component.js +0 -38
- package/esm2015/foehn-menu-prestation/foehn-menu-items/foehn-menu-item-transmit/foehn-menu-item-transmit.component.js +0 -54
- package/esm2015/foehn-menu-prestation/foehn-menu-prestation.module.js +0 -61
- package/esm2015/foehn-modal/foehn-modal.component.js +0 -100
- package/esm2015/foehn-modal/foehn-modal.module.js +0 -19
- package/esm2015/foehn-nav13/foehn-input-nav13.component.js +0 -98
- package/esm2015/foehn-nav13/foehn-input-nav13.module.js +0 -34
- package/esm2015/foehn-navigation/foehn-navigation.component.js +0 -98
- package/esm2015/foehn-navigation/foehn-navigation.module.js +0 -34
- package/esm2015/foehn-navigation/foehn-navigation.service.js +0 -297
- package/esm2015/foehn-notfound/foehn-notfound.module.js +0 -20
- package/esm2015/foehn-page/foehn-page-modal.component.js +0 -55
- package/esm2015/foehn-page/foehn-page.component.js +0 -214
- package/esm2015/foehn-page/foehn-page.module.js +0 -76
- package/esm2015/foehn-recap-section/foehn-recap-section.component.js +0 -88
- package/esm2015/foehn-recap-section/foehn-recap-section.module.js +0 -20
- package/esm2015/foehn-upload/abstract-foehn-uploader.component.js +0 -192
- package/esm2015/foehn-upload/foehn-bo-multi-upload/bo-multi-upload.service.js +0 -62
- package/esm2015/foehn-upload/foehn-bo-multi-upload/foehn-bo-multi-upload.component.js +0 -168
- package/esm2015/foehn-upload/foehn-bo-multi-upload/foehn-bo-multi-upload.module.js +0 -38
- package/esm2015/foehn-upload/foehn-multi-upload/foehn-multi-upload.component.js +0 -217
- package/esm2015/foehn-upload/foehn-multi-upload/foehn-multi-upload.module.js +0 -38
- package/esm2015/foehn-upload/foehn-multi-upload/multi-upload.service.js +0 -76
- package/esm2015/foehn-upload/foehn-multi-upload/pending-upload.service.js +0 -157
- package/esm2015/foehn-upload/foehn-picture-upload/foehn-picture-upload.component.js +0 -164
- package/esm2015/foehn-upload/foehn-picture-upload/foehn-picture-upload.module.js +0 -42
- package/esm2015/foehn-upload/uploader.helper.js +0 -322
- package/esm2015/foehn-validation-alert-summary/foehn-validation-alert-summary.component.js +0 -88
- package/esm2015/foehn-validation-alert-summary/foehn-validation-alert-summary.module.js +0 -19
- package/esm2015/foehn-validation-alerts/foehn-validation-alerts.component.js +0 -32
- package/esm2015/gesdem/gesdem-event.service.js +0 -38
- package/esm2015/gesdem/gesdem-handler.service.js +0 -151
- package/esm2015/gesdem/gesdem-loader.guard.js +0 -40
- package/esm2015/gesdem-action-recovery/gesdem-action-recovery-login/gesdem-action-recovery-login.component.js +0 -103
- package/esm2015/gesdem-action-recovery/gesdem-action-recovery-registration/gesdem-action-recovery-registration.component.js +0 -133
- package/esm2015/gesdem-action-recovery/gesdem-action-recovery.module.js +0 -52
- package/esm2015/gesdem-action-recovery/gesdem-action-recovery.service.js +0 -82
- package/esm2015/gesdem-confirmation/gesdem-confirmation.component.js +0 -194
- package/esm2015/gesdem-confirmation/gesdem-confirmation.module.js +0 -34
- package/esm2015/gesdem-error/gesdem-error.component.js +0 -70
- package/esm2015/gesdem-error/gesdem-error.module.js +0 -34
- package/esm2015/helpers/object.helper.js +0 -88
- package/esm2015/index.js +0 -224
- package/esm2015/sdk-appinfo/application-info.js +0 -14
- package/esm2015/sdk-appinfo/application-info.service.js +0 -111
- package/esm2015/sdk-date/date.helper.js +0 -90
- package/esm2015/sdk-dictionary/default-dictionary.js +0 -80
- package/esm2015/sdk-dictionary/sdk-dictionary.service.js +0 -96
- package/esm2015/sdk-epayment/model/EPaymentRequest.js +0 -3
- package/esm2015/sdk-epayment/sdk-epayment.component.js +0 -113
- package/esm2015/sdk-epayment/sdk-epayment.module.js +0 -21
- package/esm2015/sdk-epayment/sdk-epayment.service.js +0 -46
- package/esm2015/sdk-recaptcha/recaptcha.service.js +0 -162
- package/esm2015/sdk-recaptcha/sdk-recaptcha.component.js +0 -72
- package/esm2015/sdk-recaptcha/sdk-recaptcha.module.js +0 -19
- package/esm2015/sdk-redirect/iam-expired-interceptor.service.js +0 -48
- package/esm2015/sdk-redirect/redirect.component.js +0 -47
- package/esm2015/sdk-redirect/sdk-redirect.module.js +0 -19
- package/esm2015/sdk-session-info/session-info.service.js +0 -44
- package/esm2015/sdk-support-alert/support-alert-container.component.js +0 -53
- package/esm2015/sdk-support-alert/support-alert.component.js +0 -38
- package/esm2015/sdk-support-alert/support-alert.module.js +0 -21
- package/esm2015/sdk-support-alert/support-alert.service.js +0 -113
- package/esm2015/supported-browser.js +0 -2
- package/esm2015/validation/validation-handler.service.js +0 -44
- package/fesm2015/dsivd-prestations-ng.js +0 -11618
- package/fesm2015/dsivd-prestations-ng.js.map +0 -1
- package/sdk-epayment/model/EPaymentRequest.d.ts +0 -5
|
@@ -1,556 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import { Component, forwardRef, Input, ViewChild } from '@angular/core';
|
|
3
|
-
import { FoehnCheckableGroupComponent } from '../foehn-checkables/foehn-checkable-group.component';
|
|
4
|
-
import { FoehnInputComponent } from '../foehn-input/foehn-input.component';
|
|
5
|
-
import { of, Subject } from 'rxjs';
|
|
6
|
-
import { debounceTime, filter } from 'rxjs/operators';
|
|
7
|
-
// This component uses some ES7 features that are not polyfilled by Angular.
|
|
8
|
-
import 'core-js/modules/es.array.includes';
|
|
9
|
-
import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "../foehn-validation-alerts/foehn-validation-alerts.component";
|
|
12
|
-
import * as i2 from "../foehn-icons/foehn-icon-times.component";
|
|
13
|
-
import * as i3 from "@angular/cdk/scrolling";
|
|
14
|
-
import * as i4 from "@angular/common";
|
|
15
|
-
import * as i5 from "@angular/forms";
|
|
16
|
-
import * as i6 from "../sdk-dictionary/sdk-dictionary.pipe";
|
|
17
|
-
// eslint-disable-next-line prefer-arrow/prefer-arrow-functions,jsdoc/require-jsdoc
|
|
18
|
-
function normalizeUtf8(value) {
|
|
19
|
-
// Some browsers such as IE11 don't support the feature. Add the polyfill if you want it.
|
|
20
|
-
if (typeof value.normalize !== 'function') {
|
|
21
|
-
return value;
|
|
22
|
-
}
|
|
23
|
-
// Remove accents
|
|
24
|
-
return value.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
|
|
25
|
-
}
|
|
26
|
-
// eslint-disable-next-line prefer-arrow/prefer-arrow-functions,jsdoc/require-jsdoc
|
|
27
|
-
function normalizeSearch(value) {
|
|
28
|
-
if (!value) {
|
|
29
|
-
return value;
|
|
30
|
-
}
|
|
31
|
-
return normalizeUtf8(value.toLocaleLowerCase());
|
|
32
|
-
}
|
|
33
|
-
export class FoehnAutocompleteComponent extends FoehnCheckableGroupComponent {
|
|
34
|
-
constructor(zone) {
|
|
35
|
-
super(zone);
|
|
36
|
-
this.searchValueMinCharsCount = 0;
|
|
37
|
-
/**
|
|
38
|
-
* Allow to provide custom values to the autocomplete.
|
|
39
|
-
*
|
|
40
|
-
* A custom value is a value that is not in the `elements` set.
|
|
41
|
-
*/
|
|
42
|
-
this.allowCustomValue = false;
|
|
43
|
-
this.hideSuggestions = true;
|
|
44
|
-
this.ITEM_CALCULATED_HEIGHT = 40;
|
|
45
|
-
this.currentItemGlobalIndex = -1;
|
|
46
|
-
this.NB_ITEMS_VISIBLE = 5;
|
|
47
|
-
this.filterSubject = new Subject();
|
|
48
|
-
this.SUGGESTION_SELECTED_CLASS = 'suggestion-selected';
|
|
49
|
-
this.filterSubcription = this.filterSubject
|
|
50
|
-
.pipe(debounceTime(200))
|
|
51
|
-
.subscribe(this.filterElements.bind(this));
|
|
52
|
-
this.VIEW_PORT_HEIGHT =
|
|
53
|
-
this.ITEM_CALCULATED_HEIGHT * this.NB_ITEMS_VISIBLE;
|
|
54
|
-
}
|
|
55
|
-
ngOnInit() {
|
|
56
|
-
super.ngOnInit();
|
|
57
|
-
if (this.searchValueMinCharsCount === 0) {
|
|
58
|
-
this.getElements().subscribe(() => {
|
|
59
|
-
this.setDisplayedElements(this.elements);
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
if (this.searchValueMinCharsCount > 0) {
|
|
63
|
-
this.placeholder = `Saisissez au moins ${this.searchValueMinCharsCount} caractère${this.searchValueMinCharsCount > 1 ? 's' : ''}`;
|
|
64
|
-
}
|
|
65
|
-
this.onInitSubscription = this.onInitSubject
|
|
66
|
-
.asObservable()
|
|
67
|
-
.subscribe(() => {
|
|
68
|
-
// Hack to refresh the data once the list is downloaded.
|
|
69
|
-
this.updateNgModel(this.model_);
|
|
70
|
-
});
|
|
71
|
-
// When the model changes, select the right value to display.
|
|
72
|
-
this.modelChangeSubscription = this.modelChange.subscribe((value) => {
|
|
73
|
-
this.getElements()
|
|
74
|
-
.pipe(filter((elements) => !!elements))
|
|
75
|
-
// eslint-disable-next-line rxjs/no-nested-subscribe
|
|
76
|
-
.subscribe((elements) => {
|
|
77
|
-
if (value === null) {
|
|
78
|
-
// Clear the value.
|
|
79
|
-
this.inputValue = null;
|
|
80
|
-
this.filterElements(true);
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
const elemToCompare = value
|
|
84
|
-
? value
|
|
85
|
-
: this.defaultElementValue;
|
|
86
|
-
if (elemToCompare) {
|
|
87
|
-
this.inputValue = this.getMatchingValue(elements, elemToCompare);
|
|
88
|
-
this.filterElements(true);
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
ngOnDestroy() {
|
|
94
|
-
super.ngOnDestroy();
|
|
95
|
-
this.filterSubcription.unsubscribe();
|
|
96
|
-
if (this.onInitSubscription) {
|
|
97
|
-
this.onInitSubscription.unsubscribe();
|
|
98
|
-
}
|
|
99
|
-
if (this.modelChangeSubscription) {
|
|
100
|
-
this.modelChangeSubscription.unsubscribe();
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
onInputFocus() {
|
|
104
|
-
this.filterSubject.next();
|
|
105
|
-
this.inputHasFocus = true;
|
|
106
|
-
if ((this.isEmpty(this.searchValue) &&
|
|
107
|
-
this.searchValueMinCharsCount === 0) ||
|
|
108
|
-
(!this.isEmpty(this.searchValue) &&
|
|
109
|
-
this.searchValueMinCharsCount <= this.searchValue.length)) {
|
|
110
|
-
this.hideSuggestions = false;
|
|
111
|
-
this.clearOnBlurTimeout();
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
// Workaround for IE11 that loses focus on input when scrollbar is clicked
|
|
115
|
-
// --> put back focus on input and cancel suggestions hiding timer
|
|
116
|
-
setFocusOnInput() {
|
|
117
|
-
this.inputElement.nativeElement.focus();
|
|
118
|
-
this.clearOnBlurTimeout();
|
|
119
|
-
}
|
|
120
|
-
onInputBlur() {
|
|
121
|
-
// This method is called before onClickSuggestion. Setting inputHasFocus to false makes suggestions disappeared
|
|
122
|
-
// and onClickSuggestion is never called. Setting a timeout here avoid this problem.
|
|
123
|
-
this.currentBlurTimer = setTimeout(() => {
|
|
124
|
-
// Don't close the list if the list has the focus. This is done to allow VoiceOver users on iOS to
|
|
125
|
-
// select an option with their finger. Same if focus is set on list scroll bar
|
|
126
|
-
if (!this.listHasFocus &&
|
|
127
|
-
document.activeElement.className !==
|
|
128
|
-
'form-group autocomplete-form-group') {
|
|
129
|
-
this.inputHasFocus = false;
|
|
130
|
-
this.hideSuggestions = true;
|
|
131
|
-
this.checkAndSetInputValue();
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
onKeyDown(keyEvent) {
|
|
136
|
-
// The input might not be marked as focused in case the user selects a value from the list.
|
|
137
|
-
this.inputHasFocus = true;
|
|
138
|
-
const propagate = this.onKeyDownInner(keyEvent);
|
|
139
|
-
if (propagate) {
|
|
140
|
-
this.filterSubject.next();
|
|
141
|
-
}
|
|
142
|
-
return propagate;
|
|
143
|
-
}
|
|
144
|
-
onKeyDownInner(keyEvent) {
|
|
145
|
-
// IE doesn't support keyEvent.code, and has different values
|
|
146
|
-
// in keyEvent.key (Down instead of ArrowDown for instance), hence the multi-support.
|
|
147
|
-
const ie11CompatibleCode = keyEvent.code || keyEvent.key;
|
|
148
|
-
switch (ie11CompatibleCode) {
|
|
149
|
-
case 'Down':
|
|
150
|
-
case 'ArrowDown':
|
|
151
|
-
if (!this.suggestionsDisplayed()) {
|
|
152
|
-
this.hideSuggestions = false;
|
|
153
|
-
break;
|
|
154
|
-
}
|
|
155
|
-
this.selectNextElement(true);
|
|
156
|
-
break;
|
|
157
|
-
case 'Up':
|
|
158
|
-
case 'ArrowUp':
|
|
159
|
-
this.selectNextElement(false);
|
|
160
|
-
break;
|
|
161
|
-
case 'Space':
|
|
162
|
-
case 'Spacebar':
|
|
163
|
-
if (this.getSelectedElement()) {
|
|
164
|
-
this.setSelectedElement();
|
|
165
|
-
break;
|
|
166
|
-
}
|
|
167
|
-
return true;
|
|
168
|
-
case 'Enter':
|
|
169
|
-
if (!this.getSelectedElement()) {
|
|
170
|
-
const value = this.getFirstSuggestion();
|
|
171
|
-
if (!value) {
|
|
172
|
-
// Just before form submit, calls checkAndSetInputValue because focusout is called too late
|
|
173
|
-
// (new value is already lost).
|
|
174
|
-
this.checkAndSetInputValue();
|
|
175
|
-
return true;
|
|
176
|
-
}
|
|
177
|
-
// autocomplete without need to select it manually
|
|
178
|
-
this.setInputValue(value);
|
|
179
|
-
this.checkAndSetInputValue();
|
|
180
|
-
return false;
|
|
181
|
-
}
|
|
182
|
-
this.setSelectedElement();
|
|
183
|
-
this.checkAndSetInputValue();
|
|
184
|
-
return false;
|
|
185
|
-
case 'Tab':
|
|
186
|
-
case 'Right':
|
|
187
|
-
case 'ArrowRight':
|
|
188
|
-
if (!this.getSelectedElement()) {
|
|
189
|
-
return true;
|
|
190
|
-
}
|
|
191
|
-
this.setSelectedElement();
|
|
192
|
-
this.checkAndSetInputValue();
|
|
193
|
-
return false;
|
|
194
|
-
case 'Escape':
|
|
195
|
-
if (this.suggestionsDisplayed()) {
|
|
196
|
-
this.hideSuggestions = true;
|
|
197
|
-
return false;
|
|
198
|
-
}
|
|
199
|
-
return true;
|
|
200
|
-
default:
|
|
201
|
-
return true;
|
|
202
|
-
}
|
|
203
|
-
keyEvent.stopPropagation();
|
|
204
|
-
return false;
|
|
205
|
-
}
|
|
206
|
-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
207
|
-
onListOptionMouseDown(event) {
|
|
208
|
-
// Safari triggers focusOut before click, but if you
|
|
209
|
-
// preventDefault on mouseDown, you can stop that from happening.
|
|
210
|
-
// If this is removed, clicking on an option in Safari will trigger
|
|
211
|
-
// `handleOptionBlur`, which closes the menu, and the click will
|
|
212
|
-
// trigger on the element underneath instead.
|
|
213
|
-
event.preventDefault();
|
|
214
|
-
}
|
|
215
|
-
onListOptionFocus() {
|
|
216
|
-
this.listHasFocus = true;
|
|
217
|
-
}
|
|
218
|
-
onListOptionBlur() {
|
|
219
|
-
this.listHasFocus = false;
|
|
220
|
-
}
|
|
221
|
-
filterElements(hideSuggestions = false) {
|
|
222
|
-
this.searchValue = this.inputValue;
|
|
223
|
-
if (!this.elements) {
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
if (this.isEmpty(this.searchValue) ||
|
|
227
|
-
this.searchValue.length < this.searchValueMinCharsCount) {
|
|
228
|
-
if (this.searchValueMinCharsCount === 0) {
|
|
229
|
-
this.setDisplayedElements(this.elements);
|
|
230
|
-
}
|
|
231
|
-
else {
|
|
232
|
-
this.setSuggestionsDisplayed(true, []);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
else {
|
|
236
|
-
this.setSuggestionsDisplayed(hideSuggestions, this.elements.filter((e) => this.matchResult(e)));
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
240
|
-
getLabelWithEmphasis(elem) {
|
|
241
|
-
let label = this.getLabel(elem);
|
|
242
|
-
if (!this.isEmpty(this.searchValue)) {
|
|
243
|
-
const startIndex = normalizeSearch(label).indexOf(normalizeSearch(this.searchValue));
|
|
244
|
-
if (startIndex !== -1) {
|
|
245
|
-
label = `${startIndex > 0 ? label.substr(0, startIndex) : ''}<b>${label.substr(startIndex, this.searchValue.length)}</b>${label.length > startIndex + this.searchValue.length
|
|
246
|
-
? label.substr(startIndex + this.searchValue.length, label.length)
|
|
247
|
-
: ''}`;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
return label;
|
|
251
|
-
}
|
|
252
|
-
onClear() {
|
|
253
|
-
super.onClear();
|
|
254
|
-
this.inputValue = null;
|
|
255
|
-
this.inputElement.nativeElement.focus();
|
|
256
|
-
this.hideSuggestions = false;
|
|
257
|
-
this.filterElements();
|
|
258
|
-
}
|
|
259
|
-
displayClearButton() {
|
|
260
|
-
return of(!!this.inputValue && !this.disabled);
|
|
261
|
-
}
|
|
262
|
-
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
263
|
-
onClickSuggestion(element) {
|
|
264
|
-
this.setInputValue(this.getLabel(element));
|
|
265
|
-
this.checkAndSetInputValue();
|
|
266
|
-
// Force the focus on the input to ensure that VoiceOver doesn't set the focus on another field on the page.
|
|
267
|
-
setTimeout(() => {
|
|
268
|
-
this.setFocusOnInput();
|
|
269
|
-
// The input shouldn't be marked as focused as we don't want to display the list.
|
|
270
|
-
this.inputHasFocus = false;
|
|
271
|
-
}, 0);
|
|
272
|
-
}
|
|
273
|
-
reset() {
|
|
274
|
-
this.setInputValue(null);
|
|
275
|
-
this.checkAndSetInputValue();
|
|
276
|
-
}
|
|
277
|
-
shouldDisplayListbox() {
|
|
278
|
-
const isVisible = this.inputHasFocus &&
|
|
279
|
-
!this.hideSuggestions &&
|
|
280
|
-
this.displayedElements &&
|
|
281
|
-
this.displayedElements.length > 0;
|
|
282
|
-
if (!isVisible) {
|
|
283
|
-
this.currentItemGlobalIndex = -1;
|
|
284
|
-
}
|
|
285
|
-
return isVisible;
|
|
286
|
-
}
|
|
287
|
-
getActiveDescendantId() {
|
|
288
|
-
return this.shouldDisplayListbox() && this.activeDescendantId
|
|
289
|
-
? this.activeDescendantId
|
|
290
|
-
: null;
|
|
291
|
-
}
|
|
292
|
-
showSuggestionsWhenInputHasFocusAndIsEmpty(val) {
|
|
293
|
-
if (!val && this.inputHasFocus) {
|
|
294
|
-
this.hideSuggestions = false;
|
|
295
|
-
this.filterElements();
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
clearOnBlurTimeout() {
|
|
299
|
-
if (this.currentBlurTimer) {
|
|
300
|
-
clearTimeout(this.currentBlurTimer);
|
|
301
|
-
this.currentBlurTimer = null;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
setSelectedElement() {
|
|
305
|
-
this.setInputValue(this.getSelectedElement());
|
|
306
|
-
}
|
|
307
|
-
setInputValue(value, hideSuggestions = true) {
|
|
308
|
-
if (hideSuggestions) {
|
|
309
|
-
const event = document.createEvent('Event');
|
|
310
|
-
event.initEvent('input', true, true);
|
|
311
|
-
this.inputElement.nativeElement.dispatchEvent(event);
|
|
312
|
-
}
|
|
313
|
-
this.inputValue = value;
|
|
314
|
-
this.searchValue = value;
|
|
315
|
-
this.hideSuggestions = hideSuggestions;
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Verifies if value in input matches a value from suggestions. If not, empty the input if the custom value
|
|
319
|
-
* option is not set.
|
|
320
|
-
*/
|
|
321
|
-
checkAndSetInputValue() {
|
|
322
|
-
if (!!this.inputValue) {
|
|
323
|
-
const matchingElement = this.elements.filter((a) => this.getLabel(a) === this.inputValue);
|
|
324
|
-
if (matchingElement.length) {
|
|
325
|
-
const newValue = this.getValue(matchingElement[0]);
|
|
326
|
-
this.manuallyUpdateValue(newValue);
|
|
327
|
-
return;
|
|
328
|
-
}
|
|
329
|
-
if (this.allowCustomValue) {
|
|
330
|
-
const newModel = this.getCustomValue(this.inputValue);
|
|
331
|
-
this.manuallyUpdateValue(newModel);
|
|
332
|
-
return;
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
this.manuallyUpdateValue(null);
|
|
336
|
-
this.inputValue = null;
|
|
337
|
-
this.searchValue = null;
|
|
338
|
-
}
|
|
339
|
-
setSuggestionsDisplayed(hideSuggestions, displayedElements) {
|
|
340
|
-
this.setDisplayedElements(displayedElements);
|
|
341
|
-
this.hideSuggestions = hideSuggestions;
|
|
342
|
-
this.notifyScreenReaderUsers();
|
|
343
|
-
}
|
|
344
|
-
setDisplayedElements(filteredElements) {
|
|
345
|
-
this.activeDescendantId = null;
|
|
346
|
-
this.displayedElements = filteredElements;
|
|
347
|
-
this.resizeDisplayViewPort(filteredElements);
|
|
348
|
-
}
|
|
349
|
-
resizeDisplayViewPort(filteredElements) {
|
|
350
|
-
if (!!filteredElements) {
|
|
351
|
-
if (filteredElements.length < this.NB_ITEMS_VISIBLE) {
|
|
352
|
-
this.VIEW_PORT_HEIGHT =
|
|
353
|
-
this.ITEM_CALCULATED_HEIGHT * filteredElements.length;
|
|
354
|
-
if (!!this.virtualScrollViewport) {
|
|
355
|
-
this.virtualScrollViewport.checkViewportSize();
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
else {
|
|
359
|
-
const MAX_HEIGHT = this.NB_ITEMS_VISIBLE * this.ITEM_CALCULATED_HEIGHT;
|
|
360
|
-
if (this.VIEW_PORT_HEIGHT < MAX_HEIGHT) {
|
|
361
|
-
this.VIEW_PORT_HEIGHT = MAX_HEIGHT;
|
|
362
|
-
if (!!this.virtualScrollViewport) {
|
|
363
|
-
this.virtualScrollViewport.checkViewportSize();
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
getSelectedElement() {
|
|
370
|
-
if (this.suggestionsList) {
|
|
371
|
-
const suggestions = this.getSuggestionList();
|
|
372
|
-
for (const indexStr in suggestions) {
|
|
373
|
-
if (suggestions.hasOwnProperty(indexStr)) {
|
|
374
|
-
const index = parseInt(indexStr, 10);
|
|
375
|
-
if (!isNaN(index)) {
|
|
376
|
-
const item = suggestions[index];
|
|
377
|
-
if (item.className.includes(this.SUGGESTION_SELECTED_CLASS)) {
|
|
378
|
-
return item.innerText;
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
return null;
|
|
385
|
-
}
|
|
386
|
-
selectNextElement(down) {
|
|
387
|
-
if (this.suggestionsDisplayed()) {
|
|
388
|
-
const suggestions = this.getSuggestionList();
|
|
389
|
-
let newItemSelected = null;
|
|
390
|
-
const step = down ? 1 : -1;
|
|
391
|
-
for (const indexStr in suggestions) {
|
|
392
|
-
if (suggestions.hasOwnProperty(indexStr)) {
|
|
393
|
-
const index = parseInt(indexStr, 10);
|
|
394
|
-
if (!isNaN(index)) {
|
|
395
|
-
const item = suggestions[index];
|
|
396
|
-
const nextIndex = index + step;
|
|
397
|
-
const isCurrentItemSelected = item.className.includes(this.SUGGESTION_SELECTED_CLASS);
|
|
398
|
-
this.unselectItem(item);
|
|
399
|
-
if (isCurrentItemSelected && nextIndex >= 0) {
|
|
400
|
-
this.selectItem((newItemSelected =
|
|
401
|
-
nextIndex < suggestions.length
|
|
402
|
-
? suggestions[nextIndex]
|
|
403
|
-
: suggestions[suggestions.length - 1]));
|
|
404
|
-
break;
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
// If no item was selected before, select first one
|
|
410
|
-
if (!newItemSelected && suggestions.length > 0) {
|
|
411
|
-
this.currentItemGlobalIndex = 0;
|
|
412
|
-
this.selectItem((newItemSelected = suggestions[0]));
|
|
413
|
-
}
|
|
414
|
-
else {
|
|
415
|
-
// Manage global item selected index
|
|
416
|
-
const MAX_INDEX = this.displayedElements.length - 1;
|
|
417
|
-
this.currentItemGlobalIndex += step;
|
|
418
|
-
if (this.currentItemGlobalIndex > MAX_INDEX) {
|
|
419
|
-
this.currentItemGlobalIndex = MAX_INDEX;
|
|
420
|
-
}
|
|
421
|
-
if (this.currentItemGlobalIndex < 0) {
|
|
422
|
-
this.currentItemGlobalIndex = 0;
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
// Scrolls down or up if newItemSelected is not visible
|
|
426
|
-
const suggestionsNativeElement = this.virtualScrollViewport
|
|
427
|
-
.elementRef.nativeElement;
|
|
428
|
-
if (!this.isVisible(suggestionsNativeElement, newItemSelected)) {
|
|
429
|
-
this.virtualScrollViewport.scrollToIndex(this.currentItemGlobalIndex);
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
getSuggestionList() {
|
|
434
|
-
const suggestionsNativeElement = this.suggestionsList.nativeElement;
|
|
435
|
-
// Converts the suggestions to an array to work consistently across browsers.
|
|
436
|
-
return Array.prototype.slice.call(suggestionsNativeElement.children);
|
|
437
|
-
}
|
|
438
|
-
unselectItem(item) {
|
|
439
|
-
item.className = item.className.replace(` ${this.SUGGESTION_SELECTED_CLASS}`, '');
|
|
440
|
-
item.attributes['aria-selected'] = false;
|
|
441
|
-
}
|
|
442
|
-
selectItem(item) {
|
|
443
|
-
if (!item.className.includes(this.SUGGESTION_SELECTED_CLASS)) {
|
|
444
|
-
item.className += ` ${this.SUGGESTION_SELECTED_CLASS}`;
|
|
445
|
-
}
|
|
446
|
-
item.attributes['aria-selected'] = true;
|
|
447
|
-
this.activeDescendantId = item.id;
|
|
448
|
-
}
|
|
449
|
-
isVisible(parent, element) {
|
|
450
|
-
const elementOffsetTop = element.offsetTop +
|
|
451
|
-
this.virtualScrollViewport.getOffsetToRenderedContentStart();
|
|
452
|
-
// element is below visible area
|
|
453
|
-
const isBelow = elementOffsetTop < parent.offsetHeight + parent.scrollTop;
|
|
454
|
-
// element is above visible area
|
|
455
|
-
const isAbove = elementOffsetTop > parent.scrollTop;
|
|
456
|
-
return isBelow && isAbove;
|
|
457
|
-
}
|
|
458
|
-
suggestionsDisplayed() {
|
|
459
|
-
return (this.suggestionsList &&
|
|
460
|
-
this.suggestionsList.nativeElement.children.length > 0);
|
|
461
|
-
}
|
|
462
|
-
getFirstSuggestion() {
|
|
463
|
-
if (this.suggestionsList &&
|
|
464
|
-
this.suggestionsList.nativeElement.children.length === 1) {
|
|
465
|
-
return this.suggestionsList.nativeElement.children[0].innerText;
|
|
466
|
-
}
|
|
467
|
-
return null;
|
|
468
|
-
}
|
|
469
|
-
notifyScreenReaderUsers() {
|
|
470
|
-
// Forces NVDA to re-read the content of the sc-only notification.
|
|
471
|
-
this.notificationMessageUpdated = !this.notificationMessageUpdated;
|
|
472
|
-
}
|
|
473
|
-
getMatchingValue(elements, elemToCompare) {
|
|
474
|
-
// Look for a potential matching value in the set
|
|
475
|
-
const matchingElement = elements.filter((element) => {
|
|
476
|
-
const value = this.getValue(element);
|
|
477
|
-
return (value &&
|
|
478
|
-
(this.areValuesEquals(value, elemToCompare) ||
|
|
479
|
-
value.toString() === elemToCompare));
|
|
480
|
-
});
|
|
481
|
-
// Map with the label.
|
|
482
|
-
const matchingValueLabel = this.getLabel(matchingElement[0]);
|
|
483
|
-
// Don't override the value if custom values are allowed and there's no match.
|
|
484
|
-
return this.allowCustomValue
|
|
485
|
-
? matchingValueLabel || this.getModelValueDisplayValue()
|
|
486
|
-
: matchingValueLabel;
|
|
487
|
-
}
|
|
488
|
-
matchResult(element) {
|
|
489
|
-
const searchValue = normalizeSearch(this.searchValue);
|
|
490
|
-
const label = normalizeSearch(this.getLabel(element));
|
|
491
|
-
if (!label) {
|
|
492
|
-
return false;
|
|
493
|
-
}
|
|
494
|
-
return label.includes(searchValue);
|
|
495
|
-
}
|
|
496
|
-
manuallyUpdateValue(newValue) {
|
|
497
|
-
if (!newValue ||
|
|
498
|
-
!this.model ||
|
|
499
|
-
!this.areValuesEquals(newValue, this.model)) {
|
|
500
|
-
// This is important to do on top of the updateNgModel as
|
|
501
|
-
// updateNgModel can be triggered from other sources.
|
|
502
|
-
this.handleChange(newValue);
|
|
503
|
-
}
|
|
504
|
-
this.updateNgModel(newValue);
|
|
505
|
-
}
|
|
506
|
-
getCustomValue(value) {
|
|
507
|
-
if (!this.customValueModelGenerator || typeof value !== 'string') {
|
|
508
|
-
return value;
|
|
509
|
-
}
|
|
510
|
-
return this.customValueModelGenerator(value);
|
|
511
|
-
}
|
|
512
|
-
getModelValueDisplayValue() {
|
|
513
|
-
return typeof this.model === 'string'
|
|
514
|
-
? this.model
|
|
515
|
-
: this.getLabel(this.model);
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
FoehnAutocompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: FoehnAutocompleteComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
519
|
-
FoehnAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.4", type: FoehnAutocompleteComponent, selector: "foehn-autocomplete", inputs: { searchValueMinCharsCount: "searchValueMinCharsCount", allowCustomValue: "allowCustomValue", customValueModelGenerator: "customValueModelGenerator" }, providers: [
|
|
520
|
-
{
|
|
521
|
-
provide: FoehnInputComponent,
|
|
522
|
-
useExisting: forwardRef(() => FoehnAutocompleteComponent),
|
|
523
|
-
multi: true
|
|
524
|
-
}
|
|
525
|
-
], viewQueries: [{ propertyName: "virtualScrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }, { propertyName: "suggestionsList", first: true, predicate: ["suggestionsList"], descendants: true }, { propertyName: "inputElement", first: true, predicate: ["entryComponent"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<!--\n Accessible autocomplete widget following the listbox combobox pattern.\n ref: https://www.w3.org/TR/wai-aria-practices-1.1/examples/combobox/aria1.1pattern/listbox-combo.html\n-->\n<div\n class=\"form-group autocomplete-form-group\"\n [class.has-danger]=\"hasErrorsToDisplay()\"\n [class.vd-form-group-danger]=\"hasErrorsToDisplay()\"\n [attr.aria-expanded]=\"shouldDisplayListbox()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.id]=\"buildId('Container')\"\n tabindex=\"-1\"\n>\n <label\n [attr.for]=\"buildChildId()\"\n *ngIf=\"!!label\"\n [ngClass]=\"isLabelSrOnly ? 'sr-only' : labelStyleModifier\"\n [attr.id]=\"buildChildId() + 'Label'\"\n >\n <span [innerHTML]=\"label\"></span>\n <span\n *ngIf=\"!required && !hideNotRequiredExtraLabel\"\n aria-hidden=\"true\"\n >\n {{ 'foehn-input.optional' | fromDictionary }}\n </span>\n </label>\n\n <foehn-validation-alerts [component]=\"this\"></foehn-validation-alerts>\n\n <div *ngIf=\"!elements\">Chargement...</div>\n\n <small\n *ngIf=\"helpText\"\n [attr.id]=\"buildChildId() + 'Help'\"\n class=\"form-text text-secondary\"\n [innerHTML]=\"helpText\"\n ></small>\n\n <ng-content></ng-content>\n\n <div class=\"sr-only\">\n Utilisez les fl\u00E8ches haut et bas pour naviguer dans la liste, puis la\n touche Entrer pour s\u00E9lectionner une option.\n </div>\n\n <!-- Give screen reader users the total of results when then input changes. -->\n <div\n class=\"sr-only\"\n aria-live=\"polite\"\n role=\"status\"\n aria-atomic=\"true\"\n *ngIf=\"displayedElements && shouldDisplayListbox()\"\n >\n Nombre de r\u00E9sultats: {{ displayedElements.length }}\n <!-- Trick to have NVDA re-reading this properly -->\n <span>{{ notificationMessageUpdated ? ',' : ',,' }}</span>\n </div>\n\n <input\n [class.is-invalid]=\"hasErrorsToDisplay()\"\n class=\"form-control autocomplete\"\n type=\"text\"\n role=\"textbox\"\n [name]=\"name || label\"\n [attr.id]=\"buildChildId()\"\n [attr.placeholder]=\"placeholder || null\"\n [attr.disabled]=\"disabled ? 'disabled' : null\"\n [attr.aria-describedby]=\"getDescribedBy()\"\n [attr.aria-required]=\"required || null\"\n [attr.aria-invalid]=\"hasErrorsToDisplay() || null\"\n [attr.autocomplete]=\"'off'\"\n [attr.aria-activedescendant]=\"getActiveDescendantId()\"\n [attr.aria-owns]=\"\n shouldDisplayListbox() ? buildChildId() + 'Listbox' : null\n \"\n [attr.list]=\"buildChildId() + 'list'\"\n [(ngModel)]=\"inputValue\"\n (ngModelChange)=\"showSuggestionsWhenInputHasFocusAndIsEmpty($event)\"\n (paste)=\"onPaste($event)\"\n (focus)=\"onInputFocus()\"\n (blur)=\"onInputBlur()\"\n (keydown)=\"onKeyDown($event)\"\n autocomplete=\"off\"\n #entryComponent\n />\n\n <button\n type=\"button\"\n *ngIf=\"displayClearButton() | async\"\n class=\"autocomplete-clear-button btn\"\n (click)=\"onClear()\"\n [id]=\"buildChildId() + 'Clear'\"\n >\n <foehn-icon-times\n class=\"autocomplete-clear-button-icon\"\n title=\"R\u00E9initialiser le champ\"\n ></foehn-icon-times>\n </button>\n\n <div\n class=\"form-group suggestions-list-container\"\n *ngIf=\"shouldDisplayListbox()\"\n >\n <cdk-virtual-scroll-viewport\n [itemSize]=\"ITEM_CALCULATED_HEIGHT\"\n [style.height.px]=\"VIEW_PORT_HEIGHT\"\n >\n <ul\n [attr.id]=\"buildChildId() + 'Listbox'\"\n [attr.aria-labelledby]=\"buildChildId() + 'Label'\"\n role=\"listbox\"\n class=\"suggestions-list\"\n #suggestionsList\n >\n <li\n tabindex=\"-1\"\n role=\"option\"\n class=\"suggestion\"\n *cdkVirtualFor=\"\n let element of displayedElements;\n index as i\n \"\n [attr.id]=\"buildChildId() + 'Option' + i\"\n (click)=\"onClickSuggestion(element)\"\n (mousedown)=\"onListOptionMouseDown($event)\"\n (focus)=\"onListOptionFocus()\"\n (blur)=\"onListOptionBlur()\"\n >\n <!-- Ensures that screen readers don't consider any spaces around the emphasis -->\n <span [innerHtml]=\"getLabelWithEmphasis(element)\"></span>\n </li>\n </ul>\n </cdk-virtual-scroll-viewport>\n </div>\n</div>\n", styles: ["div.suggestions-list-container{position:relative;width:100%}cdk-virtual-scroll-viewport{width:100%;position:absolute;top:0;left:0;z-index:10;background:white;overflow-y:auto;box-shadow:0 4px 8px #0003,0 6px 20px #00000030;list-style:none;margin:inherit;padding:inherit}ul.suggestions-list{list-style:none;margin:0;padding:0}li.suggestion{width:100%;padding:.5em;font-size:1em}li.suggestion:hover,.suggestion-selected{background-color:#82afcc}li.suggestion:hover{cursor:pointer;background-color:#ddd}input.autocomplete::-ms-clear{display:none}input.autocomplete{padding-right:30px}.autocomplete-form-group{position:relative}.autocomplete-clear-button{position:absolute;bottom:4px;right:4px;height:30px;width:30px;background:none;border:none}.autocomplete-clear-button-icon{top:4px;right:8px;position:absolute}:host ::ng-deep .autocomplete-clear-button.btn .svg-inline--fa{color:#595959!important}:host ::ng-deep .autocomplete-clear-button.btn:hover .svg-inline--fa{color:#000!important}\n"], components: [{ type: i1.FoehnValidationAlertsComponent, selector: "foehn-validation-alerts", inputs: ["component", "shouldErrorsBeLive"] }, { type: i2.FoehnIconTimesComponent, selector: "foehn-icon-times" }, { type: i3.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { type: i3.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }], pipes: { "fromDictionary": i6.SdkDictionaryPipe, "async": i4.AsyncPipe } });
|
|
526
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: FoehnAutocompleteComponent, decorators: [{
|
|
527
|
-
type: Component,
|
|
528
|
-
args: [{
|
|
529
|
-
selector: 'foehn-autocomplete',
|
|
530
|
-
templateUrl: './foehn-autocomplete.component.html',
|
|
531
|
-
styleUrls: ['./foehn-autocomplete.component.css'],
|
|
532
|
-
providers: [
|
|
533
|
-
{
|
|
534
|
-
provide: FoehnInputComponent,
|
|
535
|
-
useExisting: forwardRef(() => FoehnAutocompleteComponent),
|
|
536
|
-
multi: true
|
|
537
|
-
}
|
|
538
|
-
]
|
|
539
|
-
}]
|
|
540
|
-
}], ctorParameters: function () { return [{ type: i0.NgZone }]; }, propDecorators: { virtualScrollViewport: [{
|
|
541
|
-
type: ViewChild,
|
|
542
|
-
args: [CdkVirtualScrollViewport]
|
|
543
|
-
}], suggestionsList: [{
|
|
544
|
-
type: ViewChild,
|
|
545
|
-
args: ['suggestionsList']
|
|
546
|
-
}], inputElement: [{
|
|
547
|
-
type: ViewChild,
|
|
548
|
-
args: ['entryComponent', { static: true }]
|
|
549
|
-
}], searchValueMinCharsCount: [{
|
|
550
|
-
type: Input
|
|
551
|
-
}], allowCustomValue: [{
|
|
552
|
-
type: Input
|
|
553
|
-
}], customValueModelGenerator: [{
|
|
554
|
-
type: Input
|
|
555
|
-
}] } });
|
|
556
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9laG4tYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1hdXRvY29tcGxldGUvZm9laG4tYXV0b2NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1hdXRvY29tcGxldGUvZm9laG4tYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQ0gsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBSUwsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ25HLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELDRFQUE0RTtBQUM1RSxPQUFPLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7OztBQUVsRSxtRkFBbUY7QUFDbkYsU0FBUyxhQUFhLENBQUMsS0FBYTtJQUNoQyx5RkFBeUY7SUFDekYsSUFBSSxPQUFPLEtBQUssQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUFFO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0lBRUQsaUJBQWlCO0lBQ2pCLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELG1GQUFt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MEIsNk1BUnhCO1FBQ1A7WUFDSSxPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsMEJBQTBCLENBQUM7WUFDekQsS0FBSyxFQUFFLElBQUk7U0FDZDtLQUNKLGlGQUtVLHdCQUF3QiwyUkNyRHZDLHMwSkF3SUE7MkZEdEZhLDBCQUEwQjtrQkFadEMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixXQUFXLEVBQUUscUNBQXFDO29CQUNsRCxTQUFTLEVBQUUsQ0FBQyxvQ0FBb0MsQ0FBQztvQkFDakQsU0FBUyxFQUFFO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxtQkFBbUI7NEJBQzVCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDJCQUEyQixDQUFDOzRCQUN6RCxLQUFLLEVBQUUsSUFBSTt5QkFDZDtxQkFDSjtpQkFDSjs2RkFLRyxxQkFBcUI7c0JBRHBCLFNBQVM7dUJBQUMsd0JBQXdCO2dCQUluQyxlQUFlO3NCQURkLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUk1QixZQUFZO3NCQURYLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUk3Qyx3QkFBd0I7c0JBRHZCLEtBQUs7Z0JBU04sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBV04seUJBQXlCO3NCQUR4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgZm9yd2FyZFJlZixcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb2VobkNoZWNrYWJsZUdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9laG4tY2hlY2thYmxlcy9mb2Vobi1jaGVja2FibGUtZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IEZvZWhuSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi9mb2Vobi1pbnB1dC9mb2Vobi1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG4vLyBUaGlzIGNvbXBvbmVudCB1c2VzIHNvbWUgRVM3IGZlYXR1cmVzIHRoYXQgYXJlIG5vdCBwb2x5ZmlsbGVkIGJ5IEFuZ3VsYXIuXG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcyc7XG5pbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1hcnJvdy9wcmVmZXItYXJyb3ctZnVuY3Rpb25zLGpzZG9jL3JlcXVpcmUtanNkb2NcbmZ1bmN0aW9uIG5vcm1hbGl6ZVV0ZjgodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gU29tZSBicm93c2VycyBzdWNoIGFzIElFMTEgZG9uJ3Qgc3VwcG9ydCB0aGUgZmVhdHVyZS4gQWRkIHRoZSBwb2x5ZmlsbCBpZiB5b3Ugd2FudCBpdC5cbiAgICBpZiAodHlwZW9mIHZhbHVlLm5vcm1hbGl6ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFjY2VudHNcbiAgICByZXR1cm4gdmFsdWUubm9ybWFsaXplKCdORkQnKS5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCAnJyk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItYXJyb3cvcHJlZmVyLWFycm93LWZ1bmN0aW9ucyxqc2RvYy9yZXF1aXJlLWpzZG9jXG5mdW5jdGlvbiBub3JtYWxpemVTZWFyY2godmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZVV0ZjgodmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZm9laG4tYXV0b2NvbXBsZXRlJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZm9laG4tYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9mb2Vobi1hdXRvY29tcGxldGUuY29tcG9uZW50LmNzcyddLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBGb2VobklucHV0Q29tcG9uZW50LFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRm9laG5BdXRvY29tcGxldGVDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgRm9laG5BdXRvY29tcGxldGVDb21wb25lbnRcbiAgICBleHRlbmRzIEZvZWhuQ2hlY2thYmxlR3JvdXBDb21wb25lbnRcbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBAVmlld0NoaWxkKENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydClcbiAgICB2aXJ0dWFsU2Nyb2xsVmlld3BvcnQ6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcblxuICAgIEBWaWV3Q2hpbGQoJ3N1Z2dlc3Rpb25zTGlzdCcpXG4gICAgc3VnZ2VzdGlvbnNMaXN0OiBhbnk7XG5cbiAgICBAVmlld0NoaWxkKCdlbnRyeUNvbXBvbmVudCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgaW5wdXRFbGVtZW50OiBhbnk7XG5cbiAgICBASW5wdXQoKVxuICAgIHNlYXJjaFZhbHVlTWluQ2hhcnNDb3VudCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBBbGxvdyB0byBwcm92aWRlIGN1c3RvbSB2YWx1ZXMgdG8gdGhlIGF1dG9jb21wbGV0ZS5cbiAgICAgKlxuICAgICAqIEEgY3VzdG9tIHZhbHVlIGlzIGEgdmFsdWUgdGhhdCBpcyBub3QgaW4gdGhlIGBlbGVtZW50c2Agc2V0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgYWxsb3dDdXN0b21WYWx1ZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQWxsb3cgdG8gcHJvdmlkZSBhIGdlbmVyYXRvciB0byBjcmVhdGUgdGhlIG1vZGVsIHdpdGggY3VzdG9tIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIHR5cGUgb2YgdGhlIG1vZGVsIGlzIGFuIG9iamVjdCBhbmQgbm90IGp1c3RcbiAgICAgKiBhIHN0cmluZy4gVXNlIHRoaXMgaXMgYGFsbG93Q3VzdG9tVmFsdWVgIGlzIHRydWUgYW5kIGBlbGVtZW50VmFsdWVgXG4gICAgICogaXMgYSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGN1c3RvbVZhbHVlTW9kZWxHZW5lcmF0b3I6IChpbnB1dDogc3RyaW5nKSA9PiBhbnk7XG5cbiAgICBpbnB1dFZhbHVlOiBzdHJpbmc7XG4gICAgc2VhcmNoVmFsdWU6IHN0cmluZztcbiAgICBpbnB1dEhhc0ZvY3VzOiBib29sZWFuO1xuICAgIGhpZGVTdWdnZXN0aW9ucyA9IHRydWU7XG4gICAgY3VycmVudEJsdXJUaW1lcjogYW55O1xuICAgIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cbiAgICBWSUVXX1BPUlRfSEVJR0hUOiBudW1iZXI7XG4gICAgcmVhZG9ubHkgSVRFTV9DQUxDVUxBVEVEX0hFSUdIVCA9IDQwO1xuXG4gICAgZGlzcGxheWVkRWxlbWVudHM6IGFueVtdO1xuICAgIG5vdGlmaWNhdGlvbk1lc3NhZ2VVcGRhdGVkOiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBjdXJyZW50SXRlbUdsb2JhbEluZGV4ID0gLTE7XG4gICAgcHJpdmF0ZSByZWFkb25seSBOQl9JVEVNU19WSVNJQkxFID0gNTtcblxuICAgIHByaXZhdGUgZmlsdGVyU3ViamVjdCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwcml2YXRlIGZpbHRlclN1YmNyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBsaXN0SGFzRm9jdXM6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBhY3RpdmVEZXNjZW5kYW50SWQ6IHN0cmluZztcblxuICAgIHByaXZhdGUgb25Jbml0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBtb2RlbENoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgcHJpdmF0ZSBTVUdHRVNUSU9OX1NFTEVDVEVEX0NMQVNTID0gJ3N1Z2dlc3Rpb24tc2VsZWN0ZWQnO1xuXG4gICAgY29uc3RydWN0b3Ioem9uZTogTmdab25lKSB7XG4gICAgICAgIHN1cGVyKHpvbmUpO1xuICAgICAgICB0aGlzLmZpbHRlclN1YmNyaXB0aW9uID0gdGhpcy5maWx0ZXJTdWJqZWN0XG4gICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMjAwKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodGhpcy5maWx0ZXJFbGVtZW50cy5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLlZJRVdfUE9SVF9IRUlHSFQgPVxuICAgICAgICAgICAgdGhpcy5JVEVNX0NBTENVTEFURURfSEVJR0hUICogdGhpcy5OQl9JVEVNU19WSVNJQkxFO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFZhbHVlTWluQ2hhcnNDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5nZXRFbGVtZW50cygpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5ZWRFbGVtZW50cyh0aGlzLmVsZW1lbnRzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVmFsdWVNaW5DaGFyc0NvdW50ID4gMCkge1xuICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IGBTYWlzaXNzZXogYXUgbW9pbnMgJHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlTWluQ2hhcnNDb3VudFxuICAgICAgICAgICAgfSBjYXJhY3TDqHJlJHt0aGlzLnNlYXJjaFZhbHVlTWluQ2hhcnNDb3VudCA+IDEgPyAncycgOiAnJ31gO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkluaXRTdWJzY3JpcHRpb24gPSB0aGlzLm9uSW5pdFN1YmplY3RcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSGFjayB0byByZWZyZXNoIHRoZSBkYXRhIG9uY2UgdGhlIGxpc3QgaXMgZG93bmxvYWRlZC5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU5nTW9kZWwodGhpcy5tb2RlbF8pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gV2hlbiB0aGUgbW9kZWwgY2hhbmdlcywgc2VsZWN0IHRoZSByaWdodCB2YWx1ZSB0byBkaXNwbGF5LlxuICAgICAgICB0aGlzLm1vZGVsQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5tb2RlbENoYW5nZS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAodmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0RWxlbWVudHMoKVxuICAgICAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoKGVsZW1lbnRzOiBhbnkpID0+ICEhZWxlbWVudHMpKVxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcnhqcy9uby1uZXN0ZWQtc3Vic2NyaWJlXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGVsZW1lbnRzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyRWxlbWVudHModHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtVG9Db21wYXJlID0gdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmRlZmF1bHRFbGVtZW50VmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtVG9Db21wYXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFZhbHVlID0gdGhpcy5nZXRNYXRjaGluZ1ZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVRvQ29tcGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJFbGVtZW50cyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgICAgIHRoaXMuZmlsdGVyU3ViY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcblxuICAgICAgICBpZiAodGhpcy5vbkluaXRTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMub25Jbml0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tb2RlbENoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5tb2RlbENoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25JbnB1dEZvY3VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZpbHRlclN1YmplY3QubmV4dCgpO1xuICAgICAgICB0aGlzLmlucHV0SGFzRm9jdXMgPSB0cnVlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy5pc0VtcHR5KHRoaXMuc2VhcmNoVmFsdWUpICYmXG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZU1pbkNoYXJzQ291bnQgPT09IDApIHx8XG4gICAgICAgICAgICAoIXRoaXMuaXNFbXB0eSh0aGlzLnNlYXJjaFZhbHVlKSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVmFsdWVNaW5DaGFyc0NvdW50IDw9IHRoaXMuc2VhcmNoVmFsdWUubGVuZ3RoKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb25zID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNsZWFyT25CbHVyVGltZW91dCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gV29ya2Fyb3VuZCBmb3IgSUUxMSB0aGF0IGxvc2VzIGZvY3VzIG9uIGlucHV0IHdoZW4gc2Nyb2xsYmFyIGlzIGNsaWNrZWRcbiAgICAvLyAtLT4gcHV0IGJhY2sgZm9jdXMgb24gaW5wdXQgYW5kIGNhbmNlbCBzdWdnZXN0aW9ucyBoaWRpbmcgdGltZXJcbiAgICBzZXRGb2N1c09uSW5wdXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5jbGVhck9uQmx1clRpbWVvdXQoKTtcbiAgICB9XG5cbiAgICBvbklucHV0Qmx1cigpOiB2b2lkIHtcbiAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJlZm9yZSBvbkNsaWNrU3VnZ2VzdGlvbi4gU2V0dGluZyBpbnB1dEhhc0ZvY3VzIHRvIGZhbHNlIG1ha2VzIHN1Z2dlc3Rpb25zIGRpc2FwcGVhcmVkXG4gICAgICAgIC8vIGFuZCBvbkNsaWNrU3VnZ2VzdGlvbiBpcyBuZXZlciBjYWxsZWQuIFNldHRpbmcgYSB0aW1lb3V0IGhlcmUgYXZvaWQgdGhpcyBwcm9ibGVtLlxuICAgICAgICB0aGlzLmN1cnJlbnRCbHVyVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vIERvbid0IGNsb3NlIHRoZSBsaXN0IGlmIHRoZSBsaXN0IGhhcyB0aGUgZm9jdXMuIFRoaXMgaXMgZG9uZSB0byBhbGxvdyBWb2ljZU92ZXIgdXNlcnMgb24gaU9TIHRvXG4gICAgICAgICAgICAvLyBzZWxlY3QgYW4gb3B0aW9uIHdpdGggdGhlaXIgZmluZ2VyLiBTYW1lIGlmIGZvY3VzIGlzIHNldCBvbiBsaXN0IHNjcm9sbCBiYXJcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhdGhpcy5saXN0SGFzRm9jdXMgJiZcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmNsYXNzTmFtZSAhPT1cbiAgICAgICAgICAgICAgICAgICAgJ2Zvcm0tZ3JvdXAgYXV0b2NvbXBsZXRlLWZvcm0tZ3JvdXAnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0SGFzRm9jdXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGVTdWdnZXN0aW9ucyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0FuZFNldElucHV0VmFsdWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25LZXlEb3duKGtleUV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIC8vIFRoZSBpbnB1dCBtaWdodCBub3QgYmUgbWFya2VkIGFzIGZvY3VzZWQgaW4gY2FzZSB0aGUgdXNlciBzZWxlY3RzIGEgdmFsdWUgZnJvbSB0aGUgbGlzdC5cbiAgICAgICAgdGhpcy5pbnB1dEhhc0ZvY3VzID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcHJvcGFnYXRlID0gdGhpcy5vbktleURvd25Jbm5lcihrZXlFdmVudCk7XG4gICAgICAgIGlmIChwcm9wYWdhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyU3ViamVjdC5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BhZ2F0ZTtcbiAgICB9XG5cbiAgICBvbktleURvd25Jbm5lcihrZXlFdmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBJRSBkb2Vzbid0IHN1cHBvcnQga2V5RXZlbnQuY29kZSwgYW5kIGhhcyBkaWZmZXJlbnQgdmFsdWVzXG4gICAgICAgIC8vIGluIGtleUV2ZW50LmtleSAoRG93biBpbnN0ZWFkIG9mIEFycm93RG93biBmb3IgaW5zdGFuY2UpLCBoZW5jZSB0aGUgbXVsdGktc3VwcG9ydC5cbiAgICAgICAgY29uc3QgaWUxMUNvbXBhdGlibGVDb2RlID0ga2V5RXZlbnQuY29kZSB8fCBrZXlFdmVudC5rZXk7XG4gICAgICAgIHN3aXRjaCAoaWUxMUNvbXBhdGlibGVDb2RlKSB7XG4gICAgICAgICAgICBjYXNlICdEb3duJzpcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnN1Z2dlc3Rpb25zRGlzcGxheWVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlU3VnZ2VzdGlvbnMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0TmV4dEVsZW1lbnQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdVcCc6XG4gICAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdE5leHRFbGVtZW50KGZhbHNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1NwYWNlJzpcbiAgICAgICAgICAgIGNhc2UgJ1NwYWNlYmFyJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRTZWxlY3RlZEVsZW1lbnQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkRWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdldFNlbGVjdGVkRWxlbWVudCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRGaXJzdFN1Z2dlc3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBiZWZvcmUgZm9ybSBzdWJtaXQsIGNhbGxzIGNoZWNrQW5kU2V0SW5wdXRWYWx1ZSBiZWNhdXNlIGZvY3Vzb3V0IGlzIGNhbGxlZCB0b28gbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gKG5ldyB2YWx1ZSBpcyBhbHJlYWR5IGxvc3QpLlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0FuZFNldElucHV0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGF1dG9jb21wbGV0ZSB3aXRob3V0IG5lZWQgdG8gc2VsZWN0IGl0IG1hbnVhbGx5XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tBbmRTZXRJbnB1dFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQW5kU2V0SW5wdXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgICAgICBjYXNlICdSaWdodCc6XG4gICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZ2V0U2VsZWN0ZWRFbGVtZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0FuZFNldElucHV0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3VnZ2VzdGlvbnNEaXNwbGF5ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVTdWdnZXN0aW9ucyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAga2V5RXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuICAgIG9uTGlzdE9wdGlvbk1vdXNlRG93bihldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIFNhZmFyaSB0cmlnZ2VycyBmb2N1c091dCBiZWZvcmUgY2xpY2ssIGJ1dCBpZiB5b3VcbiAgICAgICAgLy8gcHJldmVudERlZmF1bHQgb24gbW91c2VEb3duLCB5b3UgY2FuIHN0b3AgdGhhdCBmcm9tIGhhcHBlbmluZy5cbiAgICAgICAgLy8gSWYgdGhpcyBpcyByZW1vdmVkLCBjbGlja2luZyBvbiBhbiBvcHRpb24gaW4gU2FmYXJpIHdpbGwgdHJpZ2dlclxuICAgICAgICAvLyBgaGFuZGxlT3B0aW9uQmx1cmAsIHdoaWNoIGNsb3NlcyB0aGUgbWVudSwgYW5kIHRoZSBjbGljayB3aWxsXG4gICAgICAgIC8vIHRyaWdnZXIgb24gdGhlIGVsZW1lbnQgdW5kZXJuZWF0aCBpbnN0ZWFkLlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIG9uTGlzdE9wdGlvbkZvY3VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxpc3RIYXNGb2N1cyA9IHRydWU7XG4gICAgfVxuXG4gICAgb25MaXN0T3B0aW9uQmx1cigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5saXN0SGFzRm9jdXMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBmaWx0ZXJFbGVtZW50cyhoaWRlU3VnZ2VzdGlvbnM6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gdGhpcy5pbnB1dFZhbHVlO1xuXG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pc0VtcHR5KHRoaXMuc2VhcmNoVmFsdWUpIHx8XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFZhbHVlLmxlbmd0aCA8IHRoaXMuc2VhcmNoVmFsdWVNaW5DaGFyc0NvdW50XG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoVmFsdWVNaW5DaGFyc0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5ZWRFbGVtZW50cyh0aGlzLmVsZW1lbnRzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdWdnZXN0aW9uc0Rpc3BsYXllZCh0cnVlLCBbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFN1Z2dlc3Rpb25zRGlzcGxheWVkKFxuICAgICAgICAgICAgICAgIGhpZGVTdWdnZXN0aW9ucyxcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRzLmZpbHRlcigoZTogYW55KSA9PiB0aGlzLm1hdGNoUmVzdWx0KGUpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG4gICAgZ2V0TGFiZWxXaXRoRW1waGFzaXMoZWxlbTogYW55KTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGxhYmVsID0gdGhpcy5nZXRMYWJlbChlbGVtKTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNFbXB0eSh0aGlzLnNlYXJjaFZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IG5vcm1hbGl6ZVNlYXJjaChsYWJlbCkuaW5kZXhPZihcbiAgICAgICAgICAgICAgICBub3JtYWxpemVTZWFyY2godGhpcy5zZWFyY2hWYWx1ZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoc3RhcnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IGAke1xuICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID4gMCA/IGxhYmVsLnN1YnN0cigwLCBzdGFydEluZGV4KSA6ICcnXG4gICAgICAgICAgICAgICAgfTxiPiR7bGFiZWwuc3Vic3RyKHN0YXJ0SW5kZXgsIHRoaXMuc2VhcmNoVmFsdWUubGVuZ3RoKX08L2I+JHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwubGVuZ3RoID4gc3RhcnRJbmRleCArIHRoaXMuc2VhcmNoVmFsdWUubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGxhYmVsLnN1YnN0cihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggKyB0aGlzLnNlYXJjaFZhbHVlLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICAgICAgfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGFiZWw7XG4gICAgfVxuXG4gICAgb25DbGVhcigpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIub25DbGVhcigpO1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBudWxsO1xuICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb25zID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlsdGVyRWxlbWVudHMoKTtcbiAgICB9XG5cbiAgICBkaXNwbGF5Q2xlYXJCdXR0b24oKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiBvZighIXRoaXMuaW5wdXRWYWx1ZSAmJiAhdGhpcy5kaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbiAgICBvbkNsaWNrU3VnZ2VzdGlvbihlbGVtZW50OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKHRoaXMuZ2V0TGFiZWwoZWxlbWVudCkpO1xuICAgICAgICB0aGlzLmNoZWNrQW5kU2V0SW5wdXRWYWx1ZSgpO1xuXG4gICAgICAgIC8vIEZvcmNlIHRoZSBmb2N1cyBvbiB0aGUgaW5wdXQgdG8gZW5zdXJlIHRoYXQgVm9pY2VPdmVyIGRvZXNuJ3Qgc2V0IHRoZSBmb2N1cyBvbiBhbm90aGVyIGZpZWxkIG9uIHRoZSBwYWdlLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0Rm9jdXNPbklucHV0KCk7XG4gICAgICAgICAgICAvLyBUaGUgaW5wdXQgc2hvdWxkbid0IGJlIG1hcmtlZCBhcyBmb2N1c2VkIGFzIHdlIGRvbid0IHdhbnQgdG8gZGlzcGxheSB0aGUgbGlzdC5cbiAgICAgICAgICAgIHRoaXMuaW5wdXRIYXNGb2N1cyA9IGZhbHNlO1xuICAgICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICByZXNldCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKG51bGwpO1xuICAgICAgICB0aGlzLmNoZWNrQW5kU2V0SW5wdXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIHNob3VsZERpc3BsYXlMaXN0Ym94KCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpc1Zpc2libGUgPVxuICAgICAgICAgICAgdGhpcy5pbnB1dEhhc0ZvY3VzICYmXG4gICAgICAgICAgICAhdGhpcy5oaWRlU3VnZ2VzdGlvbnMgJiZcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkRWxlbWVudHMgJiZcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkRWxlbWVudHMubGVuZ3RoID4gMDtcbiAgICAgICAgaWYgKCFpc1Zpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEl0ZW1HbG9iYWxJbmRleCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1Zpc2libGU7XG4gICAgfVxuXG4gICAgZ2V0QWN0aXZlRGVzY2VuZGFudElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3VsZERpc3BsYXlMaXN0Ym94KCkgJiYgdGhpcy5hY3RpdmVEZXNjZW5kYW50SWRcbiAgICAgICAgICAgID8gdGhpcy5hY3RpdmVEZXNjZW5kYW50SWRcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG5cbiAgICBzaG93U3VnZ2VzdGlvbnNXaGVuSW5wdXRIYXNGb2N1c0FuZElzRW1wdHkodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF2YWwgJiYgdGhpcy5pbnB1dEhhc0ZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVTdWdnZXN0aW9ucyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJFbGVtZW50cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhck9uQmx1clRpbWVvdXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRCbHVyVGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmN1cnJlbnRCbHVyVGltZXIpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Qmx1clRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0U2VsZWN0ZWRFbGVtZW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldElucHV0VmFsdWUodGhpcy5nZXRTZWxlY3RlZEVsZW1lbnQoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRJbnB1dFZhbHVlKFxuICAgICAgICB2YWx1ZTogc3RyaW5nLFxuICAgICAgICBoaWRlU3VnZ2VzdGlvbnM6IGJvb2xlYW4gPSB0cnVlXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmIChoaWRlU3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgICAgICAgICBldmVudC5pbml0RXZlbnQoJ2lucHV0JywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuaGlkZVN1Z2dlc3Rpb25zID0gaGlkZVN1Z2dlc3Rpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZlcmlmaWVzIGlmIHZhbHVlIGluIGlucHV0IG1hdGNoZXMgYSB2YWx1ZSBmcm9tIHN1Z2dlc3Rpb25zLiBJZiBub3QsIGVtcHR5IHRoZSBpbnB1dCBpZiB0aGUgY3VzdG9tIHZhbHVlXG4gICAgICogb3B0aW9uIGlzIG5vdCBzZXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjaGVja0FuZFNldElucHV0VmFsdWUoKTogdm9pZCB7XG4gICAgICAgIGlmICghIXRoaXMuaW5wdXRWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmdFbGVtZW50ID0gdGhpcy5lbGVtZW50cy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGE6IGFueSkgPT4gdGhpcy5nZXRMYWJlbChhKSA9PT0gdGhpcy5pbnB1dFZhbHVlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAobWF0Y2hpbmdFbGVtZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5nZXRWYWx1ZShtYXRjaGluZ0VsZW1lbnRbMF0pO1xuICAgICAgICAgICAgICAgIHRoaXMubWFudWFsbHlVcGRhdGVWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5hbGxvd0N1c3RvbVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3TW9kZWwgPSB0aGlzLmdldEN1c3RvbVZhbHVlKHRoaXMuaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tYW51YWxseVVwZGF0ZVZhbHVlKG5ld01vZGVsKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1hbnVhbGx5VXBkYXRlVmFsdWUobnVsbCk7XG4gICAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0U3VnZ2VzdGlvbnNEaXNwbGF5ZWQoXG4gICAgICAgIGhpZGVTdWdnZXN0aW9uczogYm9vbGVhbixcbiAgICAgICAgZGlzcGxheWVkRWxlbWVudHM6IGFueVtdXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0RGlzcGxheWVkRWxlbWVudHMoZGlzcGxheWVkRWxlbWVudHMpO1xuICAgICAgICB0aGlzLmhpZGVTdWdnZXN0aW9ucyA9IGhpZGVTdWdnZXN0aW9ucztcbiAgICAgICAgdGhpcy5ub3RpZnlTY3JlZW5SZWFkZXJVc2VycygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RGlzcGxheWVkRWxlbWVudHMoZmlsdGVyZWRFbGVtZW50czogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZlRGVzY2VuZGFudElkID0gbnVsbDtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRFbGVtZW50cyA9IGZpbHRlcmVkRWxlbWVudHM7XG5cbiAgICAgICAgdGhpcy5yZXNpemVEaXNwbGF5Vmlld1BvcnQoZmlsdGVyZWRFbGVtZW50cyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNpemVEaXNwbGF5Vmlld1BvcnQoZmlsdGVyZWRFbGVtZW50czogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICghIWZpbHRlcmVkRWxlbWVudHMpIHtcbiAgICAgICAgICAgIGlmIChmaWx0ZXJlZEVsZW1lbnRzLmxlbmd0aCA8IHRoaXMuTkJfSVRFTVNfVklTSUJMRSkge1xuICAgICAgICAgICAgICAgIHRoaXMuVklFV19QT1JUX0hFSUdIVCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuSVRFTV9DQUxDVUxBVEVEX0hFSUdIVCAqIGZpbHRlcmVkRWxlbWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmICghIXRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0LmNoZWNrVmlld3BvcnRTaXplKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBNQVhfSEVJR0hUID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5OQl9JVEVNU19WSVNJQkxFICogdGhpcy5JVEVNX0NBTENVTEFURURfSEVJR0hUO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLlZJRVdfUE9SVF9IRUlHSFQgPCBNQVhfSEVJR0hUKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuVklFV19QT1JUX0hFSUdIVCA9IE1BWF9IRUlHSFQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICghIXRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydC5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTZWxlY3RlZEVsZW1lbnQoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuc3VnZ2VzdGlvbnNMaXN0KSB7XG4gICAgICAgICAgICBjb25zdCBzdWdnZXN0aW9ucyA9IHRoaXMuZ2V0U3VnZ2VzdGlvbkxpc3QoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaW5kZXhTdHIgaW4gc3VnZ2VzdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbnMuaGFzT3duUHJvcGVydHkoaW5kZXhTdHIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoaW5kZXhTdHIsIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihpbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBzdWdnZXN0aW9uc1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5jbGFzc05hbWUuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU1VHR0VTVElPTl9TRUxFQ1RFRF9DTEFTU1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdE5leHRFbGVtZW50KGRvd246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3VnZ2VzdGlvbnNEaXNwbGF5ZWQoKSkge1xuICAgICAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSB0aGlzLmdldFN1Z2dlc3Rpb25MaXN0KCk7XG4gICAgICAgICAgICBsZXQgbmV3SXRlbVNlbGVjdGVkID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXAgPSBkb3duID8gMSA6IC0xO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGluZGV4U3RyIGluIHN1Z2dlc3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN1Z2dlc3Rpb25zLmhhc093blByb3BlcnR5KGluZGV4U3RyKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KGluZGV4U3RyLCAxMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4oaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gc3VnZ2VzdGlvbnNbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dEluZGV4OiBudW1iZXIgPSBpbmRleCArIHN0ZXA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRJdGVtU2VsZWN0ZWQgPSBpdGVtLmNsYXNzTmFtZS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNVR0dFU1RJT05fU0VMRUNURURfQ0xBU1NcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc2VsZWN0SXRlbShpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0N1cnJlbnRJdGVtU2VsZWN0ZWQgJiYgbmV4dEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXdJdGVtU2VsZWN0ZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEluZGV4IDwgc3VnZ2VzdGlvbnMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzdWdnZXN0aW9uc1tuZXh0SW5kZXhdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdWdnZXN0aW9uc1tzdWdnZXN0aW9ucy5sZW5ndGggLSAxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBubyBpdGVtIHdhcyBzZWxlY3RlZCBiZWZvcmUsIHNlbGVjdCBmaXJzdCBvbmVcbiAgICAgICAgICAgIGlmICghbmV3SXRlbVNlbGVjdGVkICYmIHN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJdGVtR2xvYmFsSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbSgobmV3SXRlbVNlbGVjdGVkID0gc3VnZ2VzdGlvbnNbMF0pKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTWFuYWdlIGdsb2JhbCBpdGVtIHNlbGVjdGVkIGluZGV4XG4gICAgICAgICAgICAgICAgY29uc3QgTUFYX0lOREVYID0gdGhpcy5kaXNwbGF5ZWRFbGVtZW50cy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEl0ZW1HbG9iYWxJbmRleCArPSBzdGVwO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRJdGVtR2xvYmFsSW5kZXggPiBNQVhfSU5ERVgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SXRlbUdsb2JhbEluZGV4ID0gTUFYX0lOREVYO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50SXRlbUdsb2JhbEluZGV4IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJdGVtR2xvYmFsSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2Nyb2xscyBkb3duIG9yIHVwIGlmIG5ld0l0ZW1TZWxlY3RlZCBpcyBub3QgdmlzaWJsZVxuICAgICAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnNOYXRpdmVFbGVtZW50ID0gdGhpcy52aXJ0dWFsU2Nyb2xsVmlld3BvcnRcbiAgICAgICAgICAgICAgICAuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmlzaWJsZShzdWdnZXN0aW9uc05hdGl2ZUVsZW1lbnQsIG5ld0l0ZW1TZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpcnR1YWxTY3JvbGxWaWV3cG9ydC5zY3JvbGxUb0luZGV4KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJdGVtR2xvYmFsSW5kZXhcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTdWdnZXN0aW9uTGlzdCgpOiBIVE1MRWxlbWVudFtdIHtcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnNOYXRpdmVFbGVtZW50ID0gdGhpcy5zdWdnZXN0aW9uc0xpc3QubmF0aXZlRWxlbWVudDtcbiAgICAgICAgLy8gQ29udmVydHMgdGhlIHN1Z2dlc3Rpb25zIHRvIGFuIGFycmF5IHRvIHdvcmsgY29uc2lzdGVudGx5IGFjcm9zcyBicm93c2Vycy5cbiAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHN1Z2dlc3Rpb25zTmF0aXZlRWxlbWVudC5jaGlsZHJlbik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1bnNlbGVjdEl0ZW0oaXRlbTogYW55KTogdm9pZCB7XG4gICAgICAgIGl0ZW0uY2xhc3NOYW1lID0gaXRlbS5jbGFzc05hbWUucmVwbGFjZShcbiAgICAgICAgICAgIGAgJHt0aGlzLlNVR0dFU1RJT05fU0VMRUNURURfQ0xBU1N9YCxcbiAgICAgICAgICAgICcnXG4gICAgICAgICk7XG4gICAgICAgIGl0ZW0uYXR0cmlidXRlc1snYXJpYS1zZWxlY3RlZCddID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3RJdGVtKGl0ZW06IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAoIWl0ZW0uY2xhc3NOYW1lLmluY2x1ZGVzKHRoaXMuU1VHR0VTVElPTl9TRUxFQ1RFRF9DTEFTUykpIHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NOYW1lICs9IGAgJHt0aGlzLlNVR0dFU1RJT05fU0VMRUNURURfQ0xBU1N9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW0uYXR0cmlidXRlc1snYXJpYS1zZWxlY3RlZCddID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmFjdGl2ZURlc2NlbmRhbnRJZCA9IGl0ZW0uaWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1Zpc2libGUocGFyZW50OiBhbnksIGVsZW1lbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBlbGVtZW50T2Zmc2V0VG9wID1cbiAgICAgICAgICAgIGVsZW1lbnQub2Zmc2V0VG9wICtcbiAgICAgICAgICAgIHRoaXMudmlydHVhbFNjcm9sbFZpZXdwb3J0LmdldE9mZnNldFRvUmVuZGVyZWRDb250ZW50U3RhcnQoKTtcbiAgICAgICAgLy8gZWxlbWVudCBpcyBiZWxvdyB2aXNpYmxlIGFyZWFcbiAgICAgICAgY29uc3QgaXNCZWxvdyA9XG4gICAgICAgICAgICBlbGVtZW50T2Zmc2V0VG9wIDwgcGFyZW50Lm9mZnNldEhlaWdodCArIHBhcmVudC5zY3JvbGxUb3A7XG4gICAgICAgIC8vIGVsZW1lbnQgaXMgYWJvdmUgdmlzaWJsZSBhcmVhXG4gICAgICAgIGNvbnN0IGlzQWJvdmUgPSBlbGVtZW50T2Zmc2V0VG9wID4gcGFyZW50LnNjcm9sbFRvcDtcbiAgICAgICAgcmV0dXJuIGlzQmVsb3cgJiYgaXNBYm92ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN1Z2dlc3Rpb25zRGlzcGxheWVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5zdWdnZXN0aW9uc0xpc3QgJiZcbiAgICAgICAgICAgIHRoaXMuc3VnZ2VzdGlvbnNMaXN0Lm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Rmlyc3RTdWdnZXN0aW9uKCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuc3VnZ2VzdGlvbnNMaXN0ICYmXG4gICAgICAgICAgICB0aGlzLnN1Z2dlc3Rpb25zTGlzdC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN1Z2dlc3Rpb25zTGlzdC5uYXRpdmVFbGVtZW50LmNoaWxkcmVuWzBdLmlubmVyVGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5vdGlmeVNjcmVlblJlYWRlclVzZXJzKCk6IHZvaWQge1xuICAgICAgICAvLyBGb3JjZXMgTlZEQSB0byByZS1yZWFkIHRoZSBjb250ZW50IG9mIHRoZSBzYy1vbmx5IG5vdGlmaWNhdGlvbi5cbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlVXBkYXRlZCA9ICF0aGlzLm5vdGlmaWNhdGlvbk1lc3NhZ2VVcGRhdGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TWF0Y2hpbmdWYWx1ZShlbGVtZW50czogYW55LCBlbGVtVG9Db21wYXJlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICAvLyBMb29rIGZvciBhIHBvdGVudGlhbCBtYXRjaGluZyB2YWx1ZSBpbiB0aGUgc2V0XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nRWxlbWVudCA9IGVsZW1lbnRzLmZpbHRlcigoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoZWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHZhbHVlICYmXG4gICAgICAgICAgICAgICAgKHRoaXMuYXJlVmFsdWVzRXF1YWxzKHZhbHVlLCBlbGVtVG9Db21wYXJlKSB8fFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS50b1N0cmluZygpID09PSBlbGVtVG9Db21wYXJlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTWFwIHdpdGggdGhlIGxhYmVsLlxuICAgICAgICBjb25zdCBtYXRjaGluZ1ZhbHVlTGFiZWwgPSB0aGlzLmdldExhYmVsKG1hdGNoaW5nRWxlbWVudFswXSk7XG5cbiAgICAgICAgLy8gRG9uJ3Qgb3ZlcnJpZGUgdGhlIHZhbHVlIGlmIGN1c3RvbSB2YWx1ZXMgYXJlIGFsbG93ZWQgYW5kIHRoZXJlJ3Mgbm8gbWF0Y2guXG4gICAgICAgIHJldHVybiB0aGlzLmFsbG93Q3VzdG9tVmFsdWVcbiAgICAgICAgICAgID8gbWF0Y2hpbmdWYWx1ZUxhYmVsIHx8IHRoaXMuZ2V0TW9kZWxWYWx1ZURpc3BsYXlWYWx1ZSgpXG4gICAgICAgICAgICA6IG1hdGNoaW5nVmFsdWVMYWJlbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1hdGNoUmVzdWx0PFQ+KGVsZW1lbnQ6IFQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoVmFsdWUgPSBub3JtYWxpemVTZWFyY2godGhpcy5zZWFyY2hWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gbm9ybWFsaXplU2VhcmNoKHRoaXMuZ2V0TGFiZWwoZWxlbWVudCkpO1xuICAgICAgICBpZiAoIWxhYmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGFiZWwuaW5jbHVkZXMoc2VhcmNoVmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFudWFsbHlVcGRhdGVWYWx1ZShuZXdWYWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhbmV3VmFsdWUgfHxcbiAgICAgICAgICAgICF0aGlzLm1vZGVsIHx8XG4gICAgICAgICAgICAhdGhpcy5hcmVWYWx1ZXNFcXVhbHMobmV3VmFsdWUsIHRoaXMubW9kZWwpXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgdG8gZG8gb24gdG9wIG9mIHRoZSB1cGRhdGVOZ01vZGVsIGFzXG4gICAgICAgICAgICAvLyB1cGRhdGVOZ01vZGVsIGNhbiBiZSB0cmlnZ2VyZWQgZnJvbSBvdGhlciBzb3VyY2VzLlxuICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFuZ2UobmV3VmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVOZ01vZGVsKG5ld1ZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEN1c3RvbVZhbHVlKHZhbHVlOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICBpZiAoIXRoaXMuY3VzdG9tVmFsdWVNb2RlbEdlbmVyYXRvciB8fCB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21WYWx1ZU1vZGVsR2VuZXJhdG9yKHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1vZGVsVmFsdWVEaXNwbGF5VmFsdWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLm1vZGVsID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyB0aGlzLm1vZGVsXG4gICAgICAgICAgICA6IHRoaXMuZ2V0TGFiZWwodGhpcy5tb2RlbCk7XG4gICAgfVxufVxuIiwiPCEtLVxuICAgIEFjY2Vzc2libGUgYXV0b2NvbXBsZXRlIHdpZGdldCBmb2xsb3dpbmcgdGhlIGxpc3Rib3ggY29tYm9ib3ggcGF0dGVybi5cbiAgICByZWY6IGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS1wcmFjdGljZXMtMS4xL2V4YW1wbGVzL2NvbWJvYm94L2FyaWExLjFwYXR0ZXJuL2xpc3Rib3gtY29tYm8uaHRtbFxuLS0+XG48ZGl2XG4gICAgY2xhc3M9XCJmb3JtLWdyb3VwIGF1dG9jb21wbGV0ZS1mb3JtLWdyb3VwXCJcbiAgICBbY2xhc3MuaGFzLWRhbmdlcl09XCJoYXNFcnJvcnNUb0Rpc3BsYXkoKVwiXG4gICAgW2NsYXNzLnZkLWZvcm0tZ3JvdXAtZGFuZ2VyXT1cImhhc0Vycm9yc1RvRGlzcGxheSgpXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInNob3VsZERpc3BsYXlMaXN0Ym94KClcIlxuICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiJ2xpc3Rib3gnXCJcbiAgICBbYXR0ci5pZF09XCJidWlsZElkKCdDb250YWluZXInKVwiXG4gICAgdGFiaW5kZXg9XCItMVwiXG4+XG4gICAgPGxhYmVsXG4gICAgICAgIFthdHRyLmZvcl09XCJidWlsZENoaWxkSWQoKVwiXG4gICAgICAgICpuZ0lmPVwiISFsYWJlbFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cImlzTGFiZWxTck9ubHkgPyAnc3Itb25seScgOiBsYWJlbFN0eWxlTW9kaWZpZXJcIlxuICAgICAgICBbYXR0ci5pZF09XCJidWlsZENoaWxkSWQoKSArICdMYWJlbCdcIlxuICAgID5cbiAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJsYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiIXJlcXVpcmVkICYmICFoaWRlTm90UmVxdWlyZWRFeHRyYUxhYmVsXCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7ICdmb2Vobi1pbnB1dC5vcHRpb25hbCcgfCBmcm9tRGljdGlvbmFyeSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgPC9sYWJlbD5cblxuICAgIDxmb2Vobi12YWxpZGF0aW9uLWFsZXJ0cyBbY29tcG9uZW50XT1cInRoaXNcIj48L2ZvZWhuLXZhbGlkYXRpb24tYWxlcnRzPlxuXG4gICAgPGRpdiAqbmdJZj1cIiFlbGVtZW50c1wiPkNoYXJnZW1lbnQuLi48L2Rpdj5cblxuICAgIDxzbWFsbFxuICAgICAgICAqbmdJZj1cImhlbHBUZXh0XCJcbiAgICAgICAgW2F0dHIuaWRdPVwiYnVpbGRDaGlsZElkKCkgKyAnSGVscCdcIlxuICAgICAgICBjbGFzcz1cImZvcm0tdGV4dCB0ZXh0LXNlY29uZGFyeVwiXG4gICAgICAgIFtpbm5lckhUTUxdPVwiaGVscFRleHRcIlxuICAgID48L3NtYWxsPlxuXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG4gICAgPGRpdiBjbGFzcz1cInNyLW9ubHlcIj5cbiAgICAgICAgVXRpbGlzZXogbGVzIGZsw6hjaGVzIGhhdXQgZXQgYmFzIHBvdXIgbmF2aWd1ZXIgZGFucyBsYSBsaXN0ZSwgcHVpcyBsYVxuICAgICAgICB0b3VjaGUgRW50cmVyIHBvdXIgc8OpbGVjdGlvbm5lciB1bmUgb3B0aW9uLlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBHaXZlIHNjcmVlbiByZWFkZXIgdXNlcnMgdGhlIHRvdGFsIG9mIHJlc3VsdHMgd2hlbiB0aGVuIGlucHV0IGNoYW5nZXMuIC0tPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJzci1vbmx5XCJcbiAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgcm9sZT1cInN0YXR1c1wiXG4gICAgICAgIGFyaWEtYXRvbWljPVwidHJ1ZVwiXG4gICAgICAgICpuZ0lmPVwiZGlzcGxheWVkRWxlbWVudHMgJiYgc2hvdWxkRGlzcGxheUxpc3Rib3goKVwiXG4gICAgPlxuICAgICAgICBOb21icmUgZGUgcsOpc3VsdGF0czoge3sgZGlzcGxheWVkRWxlbWVudHMubGVuZ3RoIH19XG4gICAgICAgIDwhLS0gVHJpY2sgdG8gaGF2ZSBOVkRBIHJlLXJlYWRpbmcgdGhpcyBwcm9wZXJseSAtLT5cbiAgICAgICAgPHNwYW4+e3sgbm90aWZpY2F0aW9uTWVzc2FnZVVwZGF0ZWQgPyAnLCcgOiAnLCwnIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGlucHV0XG4gICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImhhc0Vycm9yc1RvRGlzcGxheSgpXCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICByb2xlPVwidGV4dGJveFwiXG4gICAgICAgIFtuYW1lXT1cIm5hbWUgfHwgbGFiZWxcIlxuICAgICAgICBbYXR0ci5pZF09XCJidWlsZENoaWxkSWQoKVwiXG4gICAgICAgIFthdHRyLnBsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyIHx8IG51bGxcIlxuICAgICAgICBbYXR0ci5kaXNhYmxlZF09XCJkaXNhYmxlZCA/ICdkaXNhYmxlZCcgOiBudWxsXCJcbiAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJnZXREZXNjcmliZWRCeSgpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJyZXF1aXJlZCB8fCBudWxsXCJcbiAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImhhc0Vycm9yc1RvRGlzcGxheSgpIHx8IG51bGxcIlxuICAgICAgICBbYXR0ci5hdXRvY29tcGxldGVdPVwiJ29mZidcIlxuICAgICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiZ2V0QWN0aXZlRGVzY2VuZGFudElkKClcIlxuICAgICAgICBbYXR0ci5hcmlhLW93bnNdPVwiXG4gICAgICAgICAgICBzaG91bGREaXNwbGF5TGlzdGJveCgpID8gYnVpbGRDaGlsZElkKCkgKyAnTGlzdGJveCcgOiBudWxsXG4gICAgICAgIFwiXG4gICAgICAgIFthdHRyLmxpc3RdPVwiYnVpbGRDaGlsZElkKCkgKyAnbGlzdCdcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cImlucHV0VmFsdWVcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzaG93U3VnZ2VzdGlvbnNXaGVuSW5wdXRIYXNGb2N1c0FuZElzRW1wdHkoJGV2ZW50KVwiXG4gICAgICAgIChwYXN0ZSk9XCJvblBhc3RlKCRldmVudClcIlxuICAgICAgICAoZm9jdXMpPVwib25JbnB1dEZvY3VzKClcIlxuICAgICAgICAoYmx1cik9XCJvbklucHV0Qmx1cigpXCJcbiAgICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAjZW50cnlDb21wb25lbnRcbiAgICAvPlxuXG4gICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKm5nSWY9XCJkaXNwbGF5Q2xlYXJCdXR0b24oKSB8IGFzeW5jXCJcbiAgICAgICAgY2xhc3M9XCJhdXRvY29tcGxldGUtY2xlYXItYnV0dG9uIGJ0blwiXG4gICAgICAgIChjbGljayk9XCJvbkNsZWFyKClcIlxuICAgICAgICBbaWRdPVwiYnVpbGRDaGlsZElkKCkgKyAnQ2xlYXInXCJcbiAgICA+XG4gICAgICAgIDxmb2Vobi1pY29uLXRpbWVzXG4gICAgICAgICAgICBjbGFzcz1cImF1dG9jb21wbGV0ZS1jbGVhci1idXR0b24taWNvblwiXG4gICAgICAgICAgICB0aXRsZT1cIlLDqWluaXRpYWxpc2VyIGxlIGNoYW1wXCJcbiAgICAgICAgPjwvZm9laG4taWNvbi10aW1lcz5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJmb3JtLWdyb3VwIHN1Z2dlc3Rpb25zLWxpc3QtY29udGFpbmVyXCJcbiAgICAgICAgKm5nSWY9XCJzaG91bGREaXNwbGF5TGlzdGJveCgpXCJcbiAgICA+XG4gICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcbiAgICAgICAgICAgIFtpdGVtU2l6ZV09XCJJVEVNX0NBTENVTEFURURfSEVJR0hUXCJcbiAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiVklFV19QT1JUX0hFSUdIVFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cImJ1aWxkQ2hpbGRJZCgpICsgJ0xpc3Rib3gnXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYnVpbGRDaGlsZElkKCkgKyAnTGFiZWwnXCJcbiAgICAgICAgICAgICAgICByb2xlPVwibGlzdGJveFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzdWdnZXN0aW9ucy1saXN0XCJcbiAgICAgICAgICAgICAgICAjc3VnZ2VzdGlvbnNMaXN0XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdWdnZXN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgKmNka1ZpcnR1YWxGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50IG9mIGRpc3BsYXllZEVsZW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggYXMgaVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJidWlsZENoaWxkSWQoKSArICdPcHRpb24nICsgaVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrU3VnZ2VzdGlvbihlbGVtZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25MaXN0T3B0aW9uTW91c2VEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwib25MaXN0T3B0aW9uRm9jdXMoKVwiXG4gICAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uTGlzdE9wdGlvbkJsdXIoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIEVuc3VyZXMgdGhhdCBzY3JlZW4gcmVhZGVycyBkb24ndCBjb25zaWRlciBhbnkgc3BhY2VzIGFyb3VuZCB0aGUgZW1waGFzaXMgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckh0bWxdPVwiZ2V0TGFiZWxXaXRoRW1waGFzaXMoZWxlbWVudClcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|