@impartner/design-components 3.0.2 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -8
- package/fesm2022/impartner-design-components.mjs +1667 -972
- package/fesm2022/impartner-design-components.mjs.map +1 -1
- package/index.d.ts +3634 -3
- package/package.json +9 -12
- package/constants/fontawesome-icons.d.ts +0 -6
- package/constants/index.d.ts +0 -1
- package/esm2022/constants/fontawesome-icons.mjs +0 -3012
- package/esm2022/constants/index.mjs +0 -2
- package/esm2022/impartner-design-components.mjs +0 -5
- package/esm2022/lib/alert/alert.component.mjs +0 -106
- package/esm2022/lib/alert/alert.module.mjs +0 -19
- package/esm2022/lib/alert/index.mjs +0 -4
- package/esm2022/lib/alert/theme/alert-theme.mjs +0 -2
- package/esm2022/lib/alert/theme/index.mjs +0 -2
- package/esm2022/lib/avatar/avatar.component.mjs +0 -48
- package/esm2022/lib/avatar/avatar.module.mjs +0 -19
- package/esm2022/lib/avatar/index.mjs +0 -3
- package/esm2022/lib/avatar-group/avatar-group.component.mjs +0 -16
- package/esm2022/lib/avatar-group/avatar-group.module.mjs +0 -19
- package/esm2022/lib/avatar-group/index.mjs +0 -3
- package/esm2022/lib/backdrop/backdrop.component.mjs +0 -52
- package/esm2022/lib/backdrop/backdrop.module.mjs +0 -19
- package/esm2022/lib/backdrop/index.mjs +0 -3
- package/esm2022/lib/badge/badge.component.mjs +0 -121
- package/esm2022/lib/badge/badge.module.mjs +0 -20
- package/esm2022/lib/badge/index.mjs +0 -4
- package/esm2022/lib/badge/types/badge-icon.mjs +0 -2
- package/esm2022/lib/badge/types/badge-size.mjs +0 -7
- package/esm2022/lib/badge/types/index.mjs +0 -2
- package/esm2022/lib/branding/branded.directive.mjs +0 -19
- package/esm2022/lib/branding/branding.module.mjs +0 -19
- package/esm2022/lib/branding/index.mjs +0 -3
- package/esm2022/lib/breadcrumb/breadcrumb-item.component.mjs +0 -25
- package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +0 -37
- package/esm2022/lib/breadcrumb/breadcrumb.module.mjs +0 -19
- package/esm2022/lib/breadcrumb/index.mjs +0 -4
- package/esm2022/lib/button/button.component.mjs +0 -116
- package/esm2022/lib/button/button.module.mjs +0 -21
- package/esm2022/lib/button/index.mjs +0 -4
- package/esm2022/lib/button/themes/button-theme.mjs +0 -2
- package/esm2022/lib/button/themes/index.mjs +0 -2
- package/esm2022/lib/button-group/button-group.component.mjs +0 -52
- package/esm2022/lib/button-group/button-group.module.mjs +0 -20
- package/esm2022/lib/button-group/index.mjs +0 -3
- package/esm2022/lib/card-heading/card-heading.component.mjs +0 -30
- package/esm2022/lib/card-heading/card-heading.module.mjs +0 -19
- package/esm2022/lib/card-heading/index.mjs +0 -3
- package/esm2022/lib/data-card/data-card.component.mjs +0 -123
- package/esm2022/lib/data-card/data-card.module.mjs +0 -21
- package/esm2022/lib/data-card/index.mjs +0 -3
- package/esm2022/lib/datetime-picker/components/datepicker-nav/datepicker-nav.component.mjs +0 -105
- package/esm2022/lib/datetime-picker/components/datepicker-nav/index.mjs +0 -2
- package/esm2022/lib/datetime-picker/components/datepicker-template-host/datepicker-template-host.component.mjs +0 -33
- package/esm2022/lib/datetime-picker/components/datepicker-template-host/index.mjs +0 -2
- package/esm2022/lib/datetime-picker/components/datetime-picker/datetime-picker.component.mjs +0 -369
- package/esm2022/lib/datetime-picker/components/datetime-picker/index.mjs +0 -2
- package/esm2022/lib/datetime-picker/components/datetime-picker-input/datetime-picker-input.component.mjs +0 -367
- package/esm2022/lib/datetime-picker/components/datetime-picker-input/index.mjs +0 -2
- package/esm2022/lib/datetime-picker/components/datetime-picker-input-footer/datetime-picker-input-footer.component.mjs +0 -68
- package/esm2022/lib/datetime-picker/components/datetime-picker-input-footer/index.mjs +0 -2
- package/esm2022/lib/datetime-picker/components/index.mjs +0 -6
- package/esm2022/lib/datetime-picker/constants/datetime-picker-defaults.mjs +0 -12
- package/esm2022/lib/datetime-picker/constants/index.mjs +0 -2
- package/esm2022/lib/datetime-picker/datetime-picker.module.mjs +0 -22
- package/esm2022/lib/datetime-picker/index.mjs +0 -4
- package/esm2022/lib/datetime-picker/services/datetime-formatter/datetime-formatter.service.mjs +0 -40
- package/esm2022/lib/datetime-picker/services/datetime-formatter/index.mjs +0 -2
- package/esm2022/lib/datetime-picker/services/index.mjs +0 -2
- package/esm2022/lib/datetime-picker/types/datetime-picker-value.interface.mjs +0 -2
- package/esm2022/lib/datetime-picker/types/index.mjs +0 -2
- package/esm2022/lib/design-components.module.mjs +0 -132
- package/esm2022/lib/dropdown/components/dropdown-item/dropdown-item.component.mjs +0 -22
- package/esm2022/lib/dropdown/components/index.mjs +0 -2
- package/esm2022/lib/dropdown/dropdown.component.mjs +0 -143
- package/esm2022/lib/dropdown/dropdown.module.mjs +0 -21
- package/esm2022/lib/dropdown/index.mjs +0 -5
- package/esm2022/lib/dropdown/types/dropdown-position.mjs +0 -2
- package/esm2022/lib/dropdown/types/index.mjs +0 -2
- package/esm2022/lib/file-upload/directives/file-drop.directive.mjs +0 -50
- package/esm2022/lib/file-upload/directives/index.mjs +0 -2
- package/esm2022/lib/file-upload/file-upload.component.mjs +0 -335
- package/esm2022/lib/file-upload/file-upload.module.mjs +0 -38
- package/esm2022/lib/file-upload/index.mjs +0 -5
- package/esm2022/lib/file-upload/pipes/human-readable-byte-size.pipe.mjs +0 -23
- package/esm2022/lib/file-upload/pipes/index.mjs +0 -2
- package/esm2022/lib/form-field/component/directives/corner-hint.directive.mjs +0 -15
- package/esm2022/lib/form-field/component/directives/error.directive.mjs +0 -27
- package/esm2022/lib/form-field/component/directives/form-root.directive.mjs +0 -93
- package/esm2022/lib/form-field/component/directives/hint.directive.mjs +0 -25
- package/esm2022/lib/form-field/component/directives/index.mjs +0 -25
- package/esm2022/lib/form-field/component/directives/label.directive.mjs +0 -15
- package/esm2022/lib/form-field/component/directives/prefix.directive.mjs +0 -25
- package/esm2022/lib/form-field/component/directives/suffix.directive.mjs +0 -25
- package/esm2022/lib/form-field/component/form-field.component.mjs +0 -131
- package/esm2022/lib/form-field/component/form-field.module.mjs +0 -24
- package/esm2022/lib/form-field/component/index.mjs +0 -4
- package/esm2022/lib/form-field/controls/checkbox/checkbox.component.mjs +0 -345
- package/esm2022/lib/form-field/controls/checkbox/checkbox.module.mjs +0 -16
- package/esm2022/lib/form-field/controls/checkbox/index.mjs +0 -3
- package/esm2022/lib/form-field/controls/index.mjs +0 -6
- package/esm2022/lib/form-field/controls/input/index.mjs +0 -2
- package/esm2022/lib/form-field/controls/input/input.directive.mjs +0 -234
- package/esm2022/lib/form-field/controls/radio/index.mjs +0 -6
- package/esm2022/lib/form-field/controls/radio/injection-tokens.mjs +0 -4
- package/esm2022/lib/form-field/controls/radio/interfaces/index.mjs +0 -4
- package/esm2022/lib/form-field/controls/radio/interfaces/radio-button.interface.mjs +0 -2
- package/esm2022/lib/form-field/controls/radio/interfaces/radio-change-event.interface.mjs +0 -11
- package/esm2022/lib/form-field/controls/radio/interfaces/radio-group.interface.mjs +0 -2
- package/esm2022/lib/form-field/controls/radio/radio-button/radio-button.component.mjs +0 -262
- package/esm2022/lib/form-field/controls/radio/radio-group/radio-group.directive.mjs +0 -290
- package/esm2022/lib/form-field/controls/radio/radio.module.mjs +0 -17
- package/esm2022/lib/form-field/controls/select/index.mjs +0 -9
- package/esm2022/lib/form-field/controls/select/interfaces/index.mjs +0 -2
- package/esm2022/lib/form-field/controls/select/interfaces/select-option.interface.mjs +0 -2
- package/esm2022/lib/form-field/controls/select/option/index.mjs +0 -2
- package/esm2022/lib/form-field/controls/select/option/select-option.component.mjs +0 -44
- package/esm2022/lib/form-field/controls/select/option-display/index.mjs +0 -2
- package/esm2022/lib/form-field/controls/select/option-display/select-option-display.component.mjs +0 -162
- package/esm2022/lib/form-field/controls/select/option-group/index.mjs +0 -2
- package/esm2022/lib/form-field/controls/select/option-group/select-option-group.component.mjs +0 -35
- package/esm2022/lib/form-field/controls/select/option-parent.mjs +0 -4
- package/esm2022/lib/form-field/controls/select/select-model.mjs +0 -150
- package/esm2022/lib/form-field/controls/select/select.component.mjs +0 -725
- package/esm2022/lib/form-field/controls/select/select.module.mjs +0 -37
- package/esm2022/lib/form-field/controls/select/value-tags-display/index.mjs +0 -2
- package/esm2022/lib/form-field/controls/select/value-tags-display/select-value-tags-display.component.mjs +0 -91
- package/esm2022/lib/form-field/controls/shared/index.mjs +0 -2
- package/esm2022/lib/form-field/controls/shared/toggle/components/index.mjs +0 -2
- package/esm2022/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.mjs +0 -17
- package/esm2022/lib/form-field/controls/shared/toggle/index.mjs +0 -4
- package/esm2022/lib/form-field/controls/shared/toggle/toggle.component.mjs +0 -112
- package/esm2022/lib/form-field/controls/shared/toggle/toggle.module.mjs +0 -18
- package/esm2022/lib/form-field/controls/tag-select/index.mjs +0 -2
- package/esm2022/lib/form-field/controls/tag-select/tag-select.component.mjs +0 -146
- package/esm2022/lib/form-field/form-field-errors.mjs +0 -5
- package/esm2022/lib/form-field/impdc-forms.mjs +0 -7
- package/esm2022/lib/form-field/impdc-forms.module.mjs +0 -53
- package/esm2022/lib/form-field/index.mjs +0 -2
- package/esm2022/lib/form-field/services/error-state-matcher.service.mjs +0 -28
- package/esm2022/lib/form-field/services/index.mjs +0 -3
- package/esm2022/lib/form-field/services/unique-selection-dispatcher.service.mjs +0 -48
- package/esm2022/lib/form-field/shared/constructors.type.mjs +0 -2
- package/esm2022/lib/form-field/shared/disabled.mixin.mjs +0 -15
- package/esm2022/lib/form-field/shared/error-state.mixin.mjs +0 -24
- package/esm2022/lib/form-field/shared/form-field-control.mjs +0 -10
- package/esm2022/lib/form-field/shared/index.mjs +0 -5
- package/esm2022/lib/form-field/shared/tab-index.mixin.mjs +0 -19
- package/esm2022/lib/icon/icon.component.mjs +0 -83
- package/esm2022/lib/icon/icon.module.mjs +0 -19
- package/esm2022/lib/icon/index.mjs +0 -3
- package/esm2022/lib/index.mjs +0 -29
- package/esm2022/lib/modal/index.mjs +0 -4
- package/esm2022/lib/modal/modal.component.mjs +0 -266
- package/esm2022/lib/modal/modal.module.mjs +0 -37
- package/esm2022/lib/modal/types/index.mjs +0 -3
- package/esm2022/lib/modal/types/modal-component-sizes.mjs +0 -9
- package/esm2022/lib/modal/types/modal-theme.mjs +0 -12
- package/esm2022/lib/pagination/index.mjs +0 -3
- package/esm2022/lib/pagination/pagination.component.mjs +0 -176
- package/esm2022/lib/pagination/pagination.module.mjs +0 -41
- package/esm2022/lib/progress-bar/index.mjs +0 -3
- package/esm2022/lib/progress-bar/progress-bar.component.mjs +0 -51
- package/esm2022/lib/progress-bar/progress-bar.module.mjs +0 -18
- package/esm2022/lib/scrollable/index.mjs +0 -3
- package/esm2022/lib/scrollable/scrollable.component.mjs +0 -187
- package/esm2022/lib/scrollable/scrollable.module.mjs +0 -22
- package/esm2022/lib/select-icon/index.mjs +0 -3
- package/esm2022/lib/select-icon/select-icon.component.mjs +0 -308
- package/esm2022/lib/select-icon/select-icon.module.mjs +0 -39
- package/esm2022/lib/size-detection/directive/element-size.interface.mjs +0 -2
- package/esm2022/lib/size-detection/directive/index.mjs +0 -3
- package/esm2022/lib/size-detection/directive/size-detector.directive.mjs +0 -43
- package/esm2022/lib/size-detection/index.mjs +0 -3
- package/esm2022/lib/size-detection/size-detection.module.mjs +0 -18
- package/esm2022/lib/spinner/index.mjs +0 -3
- package/esm2022/lib/spinner/spinner.component.mjs +0 -24
- package/esm2022/lib/spinner/spinner.module.mjs +0 -18
- package/esm2022/lib/table/components/bulk-actions/bulk-actions.component.mjs +0 -16
- package/esm2022/lib/table/components/column-heading/column-heading.component.mjs +0 -38
- package/esm2022/lib/table/components/index.mjs +0 -4
- package/esm2022/lib/table/components/row-actions/row-actions.component.mjs +0 -61
- package/esm2022/lib/table/constants/index.mjs +0 -3
- package/esm2022/lib/table/constants/public-table.constants.mjs +0 -2
- package/esm2022/lib/table/constants/table.constants.mjs +0 -23
- package/esm2022/lib/table/containers/index.mjs +0 -2
- package/esm2022/lib/table/containers/table.component.mjs +0 -474
- package/esm2022/lib/table/directives/collapse-monitor.directive.mjs +0 -42
- package/esm2022/lib/table/directives/index.mjs +0 -4
- package/esm2022/lib/table/directives/table-inject-component.directive.mjs +0 -46
- package/esm2022/lib/table/directives/table.directive.mjs +0 -55
- package/esm2022/lib/table/enumerations/index.mjs +0 -2
- package/esm2022/lib/table/enumerations/table-column-type.mjs +0 -21
- package/esm2022/lib/table/helpers/index.mjs +0 -2
- package/esm2022/lib/table/helpers/table-theme.helper.mjs +0 -31
- package/esm2022/lib/table/index.mjs +0 -8
- package/esm2022/lib/table/interfaces/cell-renderer.interface.mjs +0 -2
- package/esm2022/lib/table/interfaces/collapsible-row-content-context.interface.mjs +0 -2
- package/esm2022/lib/table/interfaces/custom-cell-renderer-components.type.mjs +0 -2
- package/esm2022/lib/table/interfaces/index.mjs +0 -13
- package/esm2022/lib/table/interfaces/sort-by-payload.interface.mjs +0 -2
- package/esm2022/lib/table/interfaces/table-cell-option.interface.mjs +0 -2
- package/esm2022/lib/table/interfaces/table-column-defs.type.mjs +0 -2
- package/esm2022/lib/table/interfaces/table-event-payload.interface.mjs +0 -2
- package/esm2022/lib/table/interfaces/table-row-action-payload.interface.mjs +0 -2
- package/esm2022/lib/table/interfaces/table-row-action.interface.mjs +0 -2
- package/esm2022/lib/table/interfaces/table-row-collapse-change.interface.mjs +0 -2
- package/esm2022/lib/table/interfaces/table-row-item.interface.mjs +0 -2
- package/esm2022/lib/table/table.module.mjs +0 -101
- package/esm2022/lib/tag/index.mjs +0 -2
- package/esm2022/lib/tag/tag.component.mjs +0 -104
- package/esm2022/lib/text-highlight/index.mjs +0 -3
- package/esm2022/lib/text-highlight/text-highlight.component.mjs +0 -101
- package/esm2022/lib/text-highlight/text-highlight.module.mjs +0 -17
- package/esm2022/public-api.mjs +0 -9
- package/esm2022/services/index.mjs +0 -2
- package/esm2022/services/interaction.service.mjs +0 -88
- package/esm2022/types/component-size.mjs +0 -12
- package/esm2022/types/component-theme.mjs +0 -22
- package/esm2022/types/index.mjs +0 -3
- package/esm2022/utilities/boolean-props.mjs +0 -7
- package/esm2022/utilities/dc.mjs +0 -9
- package/esm2022/utilities/index.mjs +0 -6
- package/esm2022/utilities/lc.mjs +0 -9
- package/esm2022/utilities/number-props.mjs +0 -18
- package/esm2022/utilities/sanitize.mjs +0 -7
- package/lib/alert/alert.component.d.ts +0 -50
- package/lib/alert/alert.module.d.ts +0 -9
- package/lib/alert/index.d.ts +0 -3
- package/lib/alert/theme/alert-theme.d.ts +0 -1
- package/lib/alert/theme/index.d.ts +0 -1
- package/lib/avatar/avatar.component.d.ts +0 -28
- package/lib/avatar/avatar.module.d.ts +0 -9
- package/lib/avatar/index.d.ts +0 -2
- package/lib/avatar-group/avatar-group.component.d.ts +0 -10
- package/lib/avatar-group/avatar-group.module.d.ts +0 -9
- package/lib/avatar-group/index.d.ts +0 -2
- package/lib/backdrop/backdrop.component.d.ts +0 -24
- package/lib/backdrop/backdrop.module.d.ts +0 -9
- package/lib/backdrop/index.d.ts +0 -2
- package/lib/badge/badge.component.d.ts +0 -63
- package/lib/badge/badge.module.d.ts +0 -10
- package/lib/badge/index.d.ts +0 -3
- package/lib/badge/types/badge-icon.d.ts +0 -1
- package/lib/badge/types/badge-size.d.ts +0 -6
- package/lib/badge/types/index.d.ts +0 -2
- package/lib/branding/branded.directive.d.ts +0 -6
- package/lib/branding/branding.module.d.ts +0 -9
- package/lib/branding/index.d.ts +0 -2
- package/lib/breadcrumb/breadcrumb-item.component.d.ts +0 -7
- package/lib/breadcrumb/breadcrumb.component.d.ts +0 -21
- package/lib/breadcrumb/breadcrumb.module.d.ts +0 -9
- package/lib/breadcrumb/index.d.ts +0 -3
- package/lib/button/button.component.d.ts +0 -47
- package/lib/button/button.module.d.ts +0 -11
- package/lib/button/index.d.ts +0 -3
- package/lib/button/themes/button-theme.d.ts +0 -1
- package/lib/button/themes/index.d.ts +0 -1
- package/lib/button-group/button-group.component.d.ts +0 -22
- package/lib/button-group/button-group.module.d.ts +0 -10
- package/lib/button-group/index.d.ts +0 -2
- package/lib/card-heading/card-heading.component.d.ts +0 -18
- package/lib/card-heading/card-heading.module.d.ts +0 -9
- package/lib/card-heading/index.d.ts +0 -2
- package/lib/data-card/data-card.component.d.ts +0 -68
- package/lib/data-card/data-card.module.d.ts +0 -11
- package/lib/data-card/index.d.ts +0 -2
- package/lib/datetime-picker/components/datepicker-nav/datepicker-nav.component.d.ts +0 -31
- package/lib/datetime-picker/components/datepicker-nav/index.d.ts +0 -1
- package/lib/datetime-picker/components/datepicker-template-host/datepicker-template-host.component.d.ts +0 -15
- package/lib/datetime-picker/components/datepicker-template-host/index.d.ts +0 -1
- package/lib/datetime-picker/components/datetime-picker/datetime-picker.component.d.ts +0 -155
- package/lib/datetime-picker/components/datetime-picker/index.d.ts +0 -1
- package/lib/datetime-picker/components/datetime-picker-input/datetime-picker-input.component.d.ts +0 -160
- package/lib/datetime-picker/components/datetime-picker-input/index.d.ts +0 -1
- package/lib/datetime-picker/components/datetime-picker-input-footer/datetime-picker-input-footer.component.d.ts +0 -24
- package/lib/datetime-picker/components/datetime-picker-input-footer/index.d.ts +0 -1
- package/lib/datetime-picker/components/index.d.ts +0 -5
- package/lib/datetime-picker/constants/datetime-picker-defaults.d.ts +0 -4
- package/lib/datetime-picker/constants/index.d.ts +0 -1
- package/lib/datetime-picker/datetime-picker.module.d.ts +0 -8
- package/lib/datetime-picker/index.d.ts +0 -4
- package/lib/datetime-picker/services/datetime-formatter/datetime-formatter.service.d.ts +0 -20
- package/lib/datetime-picker/services/datetime-formatter/index.d.ts +0 -1
- package/lib/datetime-picker/services/index.d.ts +0 -1
- package/lib/datetime-picker/types/datetime-picker-value.interface.d.ts +0 -5
- package/lib/datetime-picker/types/index.d.ts +0 -1
- package/lib/design-components.module.d.ts +0 -24
- package/lib/dropdown/components/dropdown-item/dropdown-item.component.d.ts +0 -11
- package/lib/dropdown/components/index.d.ts +0 -1
- package/lib/dropdown/dropdown.component.d.ts +0 -67
- package/lib/dropdown/dropdown.module.d.ts +0 -11
- package/lib/dropdown/index.d.ts +0 -4
- package/lib/dropdown/types/dropdown-position.d.ts +0 -1
- package/lib/dropdown/types/index.d.ts +0 -1
- package/lib/file-upload/directives/file-drop.directive.d.ts +0 -11
- package/lib/file-upload/directives/index.d.ts +0 -1
- package/lib/file-upload/file-upload.component.d.ts +0 -105
- package/lib/file-upload/file-upload.module.d.ts +0 -14
- package/lib/file-upload/index.d.ts +0 -4
- package/lib/file-upload/pipes/human-readable-byte-size.pipe.d.ts +0 -7
- package/lib/file-upload/pipes/index.d.ts +0 -1
- package/lib/form-field/component/directives/corner-hint.directive.d.ts +0 -5
- package/lib/form-field/component/directives/error.directive.d.ts +0 -8
- package/lib/form-field/component/directives/form-root.directive.d.ts +0 -26
- package/lib/form-field/component/directives/hint.directive.d.ts +0 -6
- package/lib/form-field/component/directives/index.d.ts +0 -15
- package/lib/form-field/component/directives/label.directive.d.ts +0 -5
- package/lib/form-field/component/directives/prefix.directive.d.ts +0 -9
- package/lib/form-field/component/directives/suffix.directive.d.ts +0 -9
- package/lib/form-field/component/form-field.component.d.ts +0 -37
- package/lib/form-field/component/form-field.module.d.ts +0 -14
- package/lib/form-field/component/index.d.ts +0 -3
- package/lib/form-field/controls/checkbox/checkbox.component.d.ts +0 -137
- package/lib/form-field/controls/checkbox/checkbox.module.d.ts +0 -7
- package/lib/form-field/controls/checkbox/index.d.ts +0 -2
- package/lib/form-field/controls/index.d.ts +0 -5
- package/lib/form-field/controls/input/index.d.ts +0 -1
- package/lib/form-field/controls/input/input.directive.d.ts +0 -84
- package/lib/form-field/controls/radio/index.d.ts +0 -5
- package/lib/form-field/controls/radio/injection-tokens.d.ts +0 -4
- package/lib/form-field/controls/radio/interfaces/index.d.ts +0 -3
- package/lib/form-field/controls/radio/interfaces/radio-button.interface.d.ts +0 -6
- package/lib/form-field/controls/radio/interfaces/radio-change-event.interface.d.ts +0 -12
- package/lib/form-field/controls/radio/interfaces/radio-group.interface.d.ts +0 -13
- package/lib/form-field/controls/radio/radio-button/radio-button.component.d.ts +0 -98
- package/lib/form-field/controls/radio/radio-group/radio-group.directive.d.ts +0 -104
- package/lib/form-field/controls/radio/radio.module.d.ts +0 -8
- package/lib/form-field/controls/select/index.d.ts +0 -9
- package/lib/form-field/controls/select/interfaces/index.d.ts +0 -1
- package/lib/form-field/controls/select/interfaces/select-option.interface.d.ts +0 -6
- package/lib/form-field/controls/select/option/index.d.ts +0 -1
- package/lib/form-field/controls/select/option/select-option.component.d.ts +0 -21
- package/lib/form-field/controls/select/option-display/index.d.ts +0 -1
- package/lib/form-field/controls/select/option-display/select-option-display.component.d.ts +0 -64
- package/lib/form-field/controls/select/option-group/index.d.ts +0 -1
- package/lib/form-field/controls/select/option-group/select-option-group.component.d.ts +0 -11
- package/lib/form-field/controls/select/option-parent.d.ts +0 -16
- package/lib/form-field/controls/select/select-model.d.ts +0 -36
- package/lib/form-field/controls/select/select.component.d.ts +0 -232
- package/lib/form-field/controls/select/select.module.d.ts +0 -10
- package/lib/form-field/controls/select/value-tags-display/index.d.ts +0 -1
- package/lib/form-field/controls/select/value-tags-display/select-value-tags-display.component.d.ts +0 -46
- package/lib/form-field/controls/shared/index.d.ts +0 -1
- package/lib/form-field/controls/shared/toggle/components/index.d.ts +0 -1
- package/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.d.ts +0 -6
- package/lib/form-field/controls/shared/toggle/index.d.ts +0 -3
- package/lib/form-field/controls/shared/toggle/toggle.component.d.ts +0 -29
- package/lib/form-field/controls/shared/toggle/toggle.module.d.ts +0 -9
- package/lib/form-field/controls/tag-select/index.d.ts +0 -1
- package/lib/form-field/controls/tag-select/tag-select.component.d.ts +0 -43
- package/lib/form-field/form-field-errors.d.ts +0 -2
- package/lib/form-field/impdc-forms.d.ts +0 -6
- package/lib/form-field/impdc-forms.module.d.ts +0 -13
- package/lib/form-field/index.d.ts +0 -1
- package/lib/form-field/services/error-state-matcher.service.d.ts +0 -12
- package/lib/form-field/services/index.d.ts +0 -2
- package/lib/form-field/services/unique-selection-dispatcher.service.d.ts +0 -29
- package/lib/form-field/shared/constructors.type.d.ts +0 -7
- package/lib/form-field/shared/disabled.mixin.d.ts +0 -10
- package/lib/form-field/shared/error-state.mixin.d.ts +0 -31
- package/lib/form-field/shared/form-field-control.d.ts +0 -24
- package/lib/form-field/shared/index.d.ts +0 -5
- package/lib/form-field/shared/tab-index.mixin.d.ts +0 -13
- package/lib/icon/icon.component.d.ts +0 -36
- package/lib/icon/icon.module.d.ts +0 -9
- package/lib/icon/index.d.ts +0 -2
- package/lib/index.d.ts +0 -28
- package/lib/modal/index.d.ts +0 -3
- package/lib/modal/modal.component.d.ts +0 -116
- package/lib/modal/modal.module.d.ts +0 -13
- package/lib/modal/types/index.d.ts +0 -2
- package/lib/modal/types/modal-component-sizes.d.ts +0 -3
- package/lib/modal/types/modal-theme.d.ts +0 -7
- package/lib/pagination/index.d.ts +0 -2
- package/lib/pagination/pagination.component.d.ts +0 -58
- package/lib/pagination/pagination.module.d.ts +0 -14
- package/lib/progress-bar/index.d.ts +0 -2
- package/lib/progress-bar/progress-bar.component.d.ts +0 -31
- package/lib/progress-bar/progress-bar.module.d.ts +0 -8
- package/lib/scrollable/index.d.ts +0 -2
- package/lib/scrollable/scrollable.component.d.ts +0 -41
- package/lib/scrollable/scrollable.module.d.ts +0 -12
- package/lib/select-icon/index.d.ts +0 -2
- package/lib/select-icon/select-icon.component.d.ts +0 -123
- package/lib/select-icon/select-icon.module.d.ts +0 -12
- package/lib/size-detection/directive/element-size.interface.d.ts +0 -4
- package/lib/size-detection/directive/index.d.ts +0 -2
- package/lib/size-detection/directive/size-detector.directive.d.ts +0 -14
- package/lib/size-detection/index.d.ts +0 -3
- package/lib/size-detection/size-detection.module.d.ts +0 -8
- package/lib/spinner/index.d.ts +0 -2
- package/lib/spinner/spinner.component.d.ts +0 -13
- package/lib/spinner/spinner.module.d.ts +0 -8
- package/lib/table/components/bulk-actions/bulk-actions.component.d.ts +0 -10
- package/lib/table/components/column-heading/column-heading.component.d.ts +0 -14
- package/lib/table/components/index.d.ts +0 -3
- package/lib/table/components/row-actions/row-actions.component.d.ts +0 -21
- package/lib/table/constants/index.d.ts +0 -2
- package/lib/table/constants/public-table.constants.d.ts +0 -1
- package/lib/table/constants/table.constants.d.ts +0 -9
- package/lib/table/containers/index.d.ts +0 -1
- package/lib/table/containers/table.component.d.ts +0 -178
- package/lib/table/directives/collapse-monitor.directive.d.ts +0 -12
- package/lib/table/directives/index.d.ts +0 -3
- package/lib/table/directives/table-inject-component.directive.d.ts +0 -16
- package/lib/table/directives/table.directive.d.ts +0 -23
- package/lib/table/enumerations/index.d.ts +0 -1
- package/lib/table/enumerations/table-column-type.d.ts +0 -19
- package/lib/table/helpers/index.d.ts +0 -1
- package/lib/table/helpers/table-theme.helper.d.ts +0 -7
- package/lib/table/index.d.ts +0 -7
- package/lib/table/interfaces/cell-renderer.interface.d.ts +0 -13
- package/lib/table/interfaces/collapsible-row-content-context.interface.d.ts +0 -39
- package/lib/table/interfaces/custom-cell-renderer-components.type.d.ts +0 -3
- package/lib/table/interfaces/index.d.ts +0 -12
- package/lib/table/interfaces/sort-by-payload.interface.d.ts +0 -11
- package/lib/table/interfaces/table-cell-option.interface.d.ts +0 -4
- package/lib/table/interfaces/table-column-defs.type.d.ts +0 -53
- package/lib/table/interfaces/table-event-payload.interface.d.ts +0 -13
- package/lib/table/interfaces/table-row-action-payload.interface.d.ts +0 -13
- package/lib/table/interfaces/table-row-action.interface.d.ts +0 -17
- package/lib/table/interfaces/table-row-collapse-change.interface.d.ts +0 -11
- package/lib/table/interfaces/table-row-item.interface.d.ts +0 -8
- package/lib/table/table.module.d.ts +0 -24
- package/lib/tag/index.d.ts +0 -1
- package/lib/tag/tag.component.d.ts +0 -54
- package/lib/text-highlight/index.d.ts +0 -2
- package/lib/text-highlight/text-highlight.component.d.ts +0 -37
- package/lib/text-highlight/text-highlight.module.d.ts +0 -8
- package/public-api.d.ts +0 -4
- package/services/index.d.ts +0 -1
- package/services/interaction.service.d.ts +0 -28
- package/types/component-size.d.ts +0 -12
- package/types/component-theme.d.ts +0 -12
- package/types/index.d.ts +0 -2
- package/utilities/boolean-props.d.ts +0 -8
- package/utilities/dc.d.ts +0 -6
- package/utilities/index.d.ts +0 -5
- package/utilities/lc.d.ts +0 -6
- package/utilities/number-props.d.ts +0 -15
- package/utilities/sanitize.d.ts +0 -1
|
@@ -1,474 +0,0 @@
|
|
|
1
|
-
import { Component, ContentChild, EventEmitter, Host, Input, Optional, Output } from '@angular/core';
|
|
2
|
-
import { get as getNestedValue, set as setNestedValue } from 'lodash';
|
|
3
|
-
import { debounceTime } from 'rxjs/operators';
|
|
4
|
-
import { DEBOUNCE_TIME } from '../constants/index';
|
|
5
|
-
import { TableColumnType } from '../enumerations/index';
|
|
6
|
-
import { TableThemeHelper } from '../helpers';
|
|
7
|
-
import { ComponentTheme } from '../../../types';
|
|
8
|
-
import { PaginationComponent } from '../../pagination';
|
|
9
|
-
import { TableBulkActionsComponent } from '../components';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "@angular/common";
|
|
12
|
-
import * as i2 from "../../branding";
|
|
13
|
-
import * as i3 from "../../branding/branded.directive";
|
|
14
|
-
import * as i4 from "../../icon/icon.component";
|
|
15
|
-
import * as i5 from "../../form-field/controls/checkbox/checkbox.component";
|
|
16
|
-
import * as i6 from "../../form-field/controls/select/option/select-option.component";
|
|
17
|
-
import * as i7 from "../../form-field/controls/select/select.component";
|
|
18
|
-
import * as i8 from "../../form-field/controls/input/input.directive";
|
|
19
|
-
import * as i9 from "@angular/forms";
|
|
20
|
-
import * as i10 from "../../spinner/spinner.component";
|
|
21
|
-
import * as i11 from "../../badge/badge.component";
|
|
22
|
-
import * as i12 from "../directives/collapse-monitor.directive";
|
|
23
|
-
import * as i13 from "../directives/table.directive";
|
|
24
|
-
import * as i14 from "../components/column-heading/column-heading.component";
|
|
25
|
-
import * as i15 from "../directives/table-inject-component.directive";
|
|
26
|
-
import * as i16 from "../components/row-actions/row-actions.component";
|
|
27
|
-
/**
|
|
28
|
-
* The `TableComponent` (`<impdc-table`) is a data table component.
|
|
29
|
-
* To use, import `TableModule` from `@impartner/design-components`.
|
|
30
|
-
*/
|
|
31
|
-
export class TableComponent {
|
|
32
|
-
/**
|
|
33
|
-
* Whether individual rows can be selected. Will be `true` if explicitly set to `true` or `canSelectAllRows` is `true`.
|
|
34
|
-
*/
|
|
35
|
-
set canSelectRows(value) {
|
|
36
|
-
this._canSelectRows = value;
|
|
37
|
-
}
|
|
38
|
-
get canSelectRows() {
|
|
39
|
-
return this.canSelectAllRows || this._canSelectRows || !!this.bulkActions;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Whether all rows can be selected at once. Will be `true` if explicitly set to `true` or if `TableBulkActionsComponent` is content projected.
|
|
43
|
-
*/
|
|
44
|
-
set canSelectAllRows(value) {
|
|
45
|
-
this._canSelectAllRows = value;
|
|
46
|
-
}
|
|
47
|
-
get canSelectAllRows() {
|
|
48
|
-
return this._canSelectAllRows || !!this.bulkActions;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* An array of currently selected IDs from the `tableData` input. Array must be of type `(string | number)[]`.
|
|
52
|
-
*/
|
|
53
|
-
set selectedRowIds(value) {
|
|
54
|
-
this._selectedRowIds = [...value];
|
|
55
|
-
}
|
|
56
|
-
get selectedRowIds() {
|
|
57
|
-
return [...this._selectedRowIds];
|
|
58
|
-
}
|
|
59
|
-
/** @ignore */
|
|
60
|
-
get someSelected() {
|
|
61
|
-
return (!!this._selectedRowIds &&
|
|
62
|
-
this._selectedRowIds.length > 0 &&
|
|
63
|
-
!!this.tableData &&
|
|
64
|
-
this.tableData.length > 0 &&
|
|
65
|
-
this._selectedRowIds.length < this.tableData.length);
|
|
66
|
-
}
|
|
67
|
-
/** @ignore */
|
|
68
|
-
get tableSpan() {
|
|
69
|
-
let cols = this.columnDefs.length;
|
|
70
|
-
if (this.canSelectRows) {
|
|
71
|
-
cols++;
|
|
72
|
-
}
|
|
73
|
-
if (this.collapsibleTemplate) {
|
|
74
|
-
cols++;
|
|
75
|
-
}
|
|
76
|
-
return cols;
|
|
77
|
-
}
|
|
78
|
-
constructor(_datePipe, _percentPipe, _decmialPipe, _changeDetectorRef, _branded) {
|
|
79
|
-
this._datePipe = _datePipe;
|
|
80
|
-
this._percentPipe = _percentPipe;
|
|
81
|
-
this._decmialPipe = _decmialPipe;
|
|
82
|
-
this._changeDetectorRef = _changeDetectorRef;
|
|
83
|
-
this._branded = _branded;
|
|
84
|
-
/**
|
|
85
|
-
* Whether the table data is currently being loaded. The `<impdc-spinner>` will show if data is loading.
|
|
86
|
-
*/
|
|
87
|
-
this.loading = false;
|
|
88
|
-
/**
|
|
89
|
-
* The visible columns of the table. Each `ITableColumnDef` defines properties regarding the display, formatting and interaction of the column's cells.
|
|
90
|
-
* Column/cell color precedence is:
|
|
91
|
-
* 1) `fieldColor` - allows an `ITableColumnDef` to delegate the responsibility of cell color to an `ITableRowItem` property.
|
|
92
|
-
* 2) `colorGetter`- allows an `ITableColumnDef` to delegate the responsibility of cell color to a function of the `ITableRowItem` determined by the developer.
|
|
93
|
-
* 3) `color` - a property of an `ITableColumnDef`.
|
|
94
|
-
*/
|
|
95
|
-
this.columnDefs = [];
|
|
96
|
-
/**
|
|
97
|
-
* Whether the table is striped.
|
|
98
|
-
*/
|
|
99
|
-
this.striped = true;
|
|
100
|
-
/**
|
|
101
|
-
* Whether table rows should apply hover styles when hovered over via cursor.
|
|
102
|
-
*/
|
|
103
|
-
this.hover = true;
|
|
104
|
-
/**
|
|
105
|
-
* The layout algorithm to be used when rendering the table.
|
|
106
|
-
*/
|
|
107
|
-
this.layout = 'auto';
|
|
108
|
-
/**
|
|
109
|
-
* The placeholder text and empty value display text for `<impdc-select>` instances in cells with a `ITableColumnDef` `columnType` = `SingleSelect` or `MultiSelect`.
|
|
110
|
-
*/
|
|
111
|
-
this.selectPlaceholder = '';
|
|
112
|
-
/**
|
|
113
|
-
* The `columnDefs` index of the currently sorted column.
|
|
114
|
-
*/
|
|
115
|
-
this.sortColumnIndex = 0;
|
|
116
|
-
/**
|
|
117
|
-
* The direction of the currently sorted column.
|
|
118
|
-
*/
|
|
119
|
-
this.sortDirection = 'asc';
|
|
120
|
-
/**
|
|
121
|
-
* The table row data as an array of `ITableRowItem`.
|
|
122
|
-
*/
|
|
123
|
-
this.tableData = [];
|
|
124
|
-
/**
|
|
125
|
-
* An optional template for content that may be rendered below a row in an collapsible view. Value can either be an Angular template or a function that can evaluated
|
|
126
|
-
* to resolve to a template. The template will be rendered with a provided `ICollapsibleRowContentContext` object as template context, with the current `ITableRowData`
|
|
127
|
-
* implicitly available as a default template key.
|
|
128
|
-
*/
|
|
129
|
-
this.collapsibleTemplate = null;
|
|
130
|
-
/**
|
|
131
|
-
* The clickable control that will trigger expansion and collapse of content when using `collapsibleTemplate` functionality.
|
|
132
|
-
* When set to `button`, the collapsible content's state can only be toggled from a clickable button at the start of the row.
|
|
133
|
-
* When set to `row`, the entire row will become a clickable trigger.
|
|
134
|
-
*/
|
|
135
|
-
this.collapsibleTrigger = 'button';
|
|
136
|
-
/**
|
|
137
|
-
* Event emitted when one or multiple rows are selected. Emits `(string | number)[]` payload.
|
|
138
|
-
*/
|
|
139
|
-
this.rowSelect = new EventEmitter();
|
|
140
|
-
/**
|
|
141
|
-
* Event emitted when a column is sorted. Emits `ISortByPayload` payload.
|
|
142
|
-
*/
|
|
143
|
-
this.sortBy = new EventEmitter();
|
|
144
|
-
/**
|
|
145
|
-
* Event emitted when a row link is clicked. Emits `ITableEventPayload` payload.
|
|
146
|
-
*/
|
|
147
|
-
this.linkClick = new EventEmitter();
|
|
148
|
-
/**
|
|
149
|
-
* Event emitted when a row action is clicked. Emits an `ITableRowActionPayload` payload.
|
|
150
|
-
*/
|
|
151
|
-
this.rowActionClick = new EventEmitter();
|
|
152
|
-
/**
|
|
153
|
-
* Event emitted when a row input value is changed. Emitted cells of `columnType` `SingleSelect`, `MultiSelect`, `Input`, `Boolean` or `Icon`.
|
|
154
|
-
* Not emitted if column definition property `disabled` = `true`. Emits `ITableEventPayload` payload.
|
|
155
|
-
*/
|
|
156
|
-
this.inputChange = new EventEmitter();
|
|
157
|
-
/**
|
|
158
|
-
* Event emitted when a row with collapsible content has its collapse state changed.
|
|
159
|
-
*/
|
|
160
|
-
this.rowCollapseChange = new EventEmitter();
|
|
161
|
-
/** @ignore */
|
|
162
|
-
this.paginationComponent = undefined;
|
|
163
|
-
/** @ignore */
|
|
164
|
-
this.bulkActions = undefined;
|
|
165
|
-
/** @ignore */
|
|
166
|
-
this.cellType = TableColumnType;
|
|
167
|
-
/** @ignore */
|
|
168
|
-
this.allSelected = true;
|
|
169
|
-
/** @ignore */
|
|
170
|
-
this.branded = false;
|
|
171
|
-
this._canSelectRows = false;
|
|
172
|
-
this._canSelectAllRows = false;
|
|
173
|
-
this._selectedRowIds = [];
|
|
174
|
-
this._inputChange = new EventEmitter();
|
|
175
|
-
this.branded = _branded ? true : false;
|
|
176
|
-
this._inputChange
|
|
177
|
-
.pipe(debounceTime(DEBOUNCE_TIME))
|
|
178
|
-
.subscribe(this.inputChange);
|
|
179
|
-
}
|
|
180
|
-
ngOnChanges(changes) {
|
|
181
|
-
if (changes['selectedRowIds'] || changes['tableData']) {
|
|
182
|
-
if (!this.tableData ||
|
|
183
|
-
!this.tableData.length ||
|
|
184
|
-
!this.selectedRowIds ||
|
|
185
|
-
!this.selectedRowIds.length) {
|
|
186
|
-
this.allSelected = false;
|
|
187
|
-
}
|
|
188
|
-
else {
|
|
189
|
-
this.allSelected = this.selectedRowIds.length >= this.tableData.length;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
/** @ignore */
|
|
194
|
-
getMailToValue(columnIndex, currentRow) {
|
|
195
|
-
const { columnType, truncated: truncated } = this._getColumnDefByIndex(columnIndex);
|
|
196
|
-
let value = this._getValue(columnIndex, currentRow);
|
|
197
|
-
if (columnType !== TableColumnType.Email) {
|
|
198
|
-
return String(value);
|
|
199
|
-
}
|
|
200
|
-
value = value ? `mailto:${value}` : value;
|
|
201
|
-
return String(value);
|
|
202
|
-
}
|
|
203
|
-
/** @ignore */
|
|
204
|
-
getStringValue(columnIndex, currentRow) {
|
|
205
|
-
const value = this.getValue(columnIndex, currentRow);
|
|
206
|
-
if (Array.isArray(value)) {
|
|
207
|
-
return value.join(';');
|
|
208
|
-
}
|
|
209
|
-
return String(value);
|
|
210
|
-
}
|
|
211
|
-
/** @ignore */
|
|
212
|
-
getValue(columnIndex, currentRow) {
|
|
213
|
-
const { columnType, truncated: truncated } = this._getColumnDefByIndex(columnIndex);
|
|
214
|
-
let value = this._getValue(columnIndex, currentRow);
|
|
215
|
-
switch (columnType) {
|
|
216
|
-
case TableColumnType.Decimal: {
|
|
217
|
-
value = this._decmialPipe.transform(Number(value) || 0) || '';
|
|
218
|
-
break;
|
|
219
|
-
}
|
|
220
|
-
case TableColumnType.Date: {
|
|
221
|
-
const date = new Date(String(value));
|
|
222
|
-
const validDate = date instanceof Date && !isNaN(date.getTime());
|
|
223
|
-
value = validDate
|
|
224
|
-
? this._datePipe.transform(date, 'MM/dd/yyyy') || ''
|
|
225
|
-
: String(value);
|
|
226
|
-
break;
|
|
227
|
-
}
|
|
228
|
-
case TableColumnType.DateTime: {
|
|
229
|
-
const dateTime = new Date(String(value));
|
|
230
|
-
const validDateTime = dateTime instanceof Date && !isNaN(dateTime.getTime());
|
|
231
|
-
value = validDateTime
|
|
232
|
-
? this._datePipe.transform(dateTime, 'MM/dd/yyyy h:mm:ss a') || ''
|
|
233
|
-
: String(value);
|
|
234
|
-
break;
|
|
235
|
-
}
|
|
236
|
-
case TableColumnType.Link: {
|
|
237
|
-
value = String(value).replace(/(^\w+:|^)\/\//, '');
|
|
238
|
-
break;
|
|
239
|
-
}
|
|
240
|
-
case TableColumnType.Percentage: {
|
|
241
|
-
value = this._percentPipe.transform(Number(value) || 0) || '';
|
|
242
|
-
break;
|
|
243
|
-
}
|
|
244
|
-
case TableColumnType.Url: {
|
|
245
|
-
if (!/(http(s?)):\/\//i.test(String(value))) {
|
|
246
|
-
value = `https://${value}`;
|
|
247
|
-
}
|
|
248
|
-
break;
|
|
249
|
-
}
|
|
250
|
-
case TableColumnType.Text: {
|
|
251
|
-
if (Array.isArray(value)) {
|
|
252
|
-
value = value.join('; ');
|
|
253
|
-
}
|
|
254
|
-
if (!truncated) {
|
|
255
|
-
return value;
|
|
256
|
-
}
|
|
257
|
-
const truncateString = (string = '', maxLength = truncated) => string.length > maxLength
|
|
258
|
-
? `${string.substring(0, maxLength)}…`
|
|
259
|
-
: string;
|
|
260
|
-
!!truncated
|
|
261
|
-
? (value = truncateString(String(value), truncated))
|
|
262
|
-
: value;
|
|
263
|
-
break;
|
|
264
|
-
}
|
|
265
|
-
case TableColumnType.MultiSelect:
|
|
266
|
-
if (typeof value === 'string') {
|
|
267
|
-
value = value.split(';')?.map(v => v.trim()) || [];
|
|
268
|
-
}
|
|
269
|
-
return value;
|
|
270
|
-
}
|
|
271
|
-
return String(value);
|
|
272
|
-
}
|
|
273
|
-
/** @ignore */
|
|
274
|
-
getRawValue(columnIndex, currentRow) {
|
|
275
|
-
const { field } = this._getColumnDefByIndex(columnIndex);
|
|
276
|
-
if (!field) {
|
|
277
|
-
return '';
|
|
278
|
-
}
|
|
279
|
-
return currentRow[field] || '';
|
|
280
|
-
}
|
|
281
|
-
/** @ignore */
|
|
282
|
-
getCellColor(columnDefinition, item) {
|
|
283
|
-
return TableThemeHelper.getCellColor(columnDefinition, item);
|
|
284
|
-
}
|
|
285
|
-
/** @ignore */
|
|
286
|
-
getTheme(columnDefinition, item) {
|
|
287
|
-
return (TableThemeHelper.getTheme(columnDefinition, item) ||
|
|
288
|
-
ComponentTheme.Primary);
|
|
289
|
-
}
|
|
290
|
-
/** @ignore */
|
|
291
|
-
isSortedColumn(columnIndex) {
|
|
292
|
-
return columnIndex === this.sortColumnIndex;
|
|
293
|
-
}
|
|
294
|
-
/** @ignore */
|
|
295
|
-
isRowSelected(id) {
|
|
296
|
-
return this.selectedRowIds.includes(id);
|
|
297
|
-
}
|
|
298
|
-
/** @ignore */
|
|
299
|
-
handleSelectAll(event) {
|
|
300
|
-
if (!this.canSelectAllRows || !this.tableData) {
|
|
301
|
-
return;
|
|
302
|
-
}
|
|
303
|
-
if (event.checked) {
|
|
304
|
-
this._selectedRowIds = this.tableData?.map(row => row.id) || [];
|
|
305
|
-
}
|
|
306
|
-
else {
|
|
307
|
-
this._selectedRowIds = [];
|
|
308
|
-
}
|
|
309
|
-
this._selectedRowIds.sort();
|
|
310
|
-
this.allSelected = this.selectedRowIds.length >= this.tableData.length;
|
|
311
|
-
this.rowSelect.emit(this.selectedRowIds);
|
|
312
|
-
}
|
|
313
|
-
/** @ignore */
|
|
314
|
-
handleSort(columnIndex) {
|
|
315
|
-
if (columnIndex === this.sortColumnIndex) {
|
|
316
|
-
this.sortDirection = this.sortDirection === 'asc' ? 'desc' : 'asc';
|
|
317
|
-
}
|
|
318
|
-
else {
|
|
319
|
-
this.sortColumnIndex = columnIndex;
|
|
320
|
-
this.sortDirection = 'asc';
|
|
321
|
-
}
|
|
322
|
-
const field = this._getColumnDefByIndex(columnIndex).field || '';
|
|
323
|
-
this.sortBy.emit({
|
|
324
|
-
columnIndex,
|
|
325
|
-
field,
|
|
326
|
-
direction: this.sortDirection
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
/** @ignore */
|
|
330
|
-
handleRowSelect(event, rowId) {
|
|
331
|
-
if (!this.canSelectRows) {
|
|
332
|
-
return;
|
|
333
|
-
}
|
|
334
|
-
if (event.checked && !this._selectedRowIds.includes(rowId)) {
|
|
335
|
-
this._selectedRowIds.push(rowId);
|
|
336
|
-
}
|
|
337
|
-
else if (!event.checked && this._selectedRowIds.includes(rowId)) {
|
|
338
|
-
const idx = this._selectedRowIds.indexOf(rowId);
|
|
339
|
-
if (idx > -1) {
|
|
340
|
-
this._selectedRowIds.splice(idx, 1);
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
if (this._selectedRowIds.length) {
|
|
344
|
-
this._selectedRowIds.sort();
|
|
345
|
-
}
|
|
346
|
-
this.allSelected = this.selectedRowIds.length >= this.tableData.length;
|
|
347
|
-
this.rowSelect.emit(this.selectedRowIds);
|
|
348
|
-
}
|
|
349
|
-
/** @ignore */
|
|
350
|
-
handleCellValueChange(columnIndex, rowIndex, value) {
|
|
351
|
-
const { field, columnType } = this._getColumnDefByIndex(columnIndex);
|
|
352
|
-
let currentValue = value;
|
|
353
|
-
if (columnType !== TableColumnType.Boolean && !Array.isArray(value)) {
|
|
354
|
-
currentValue = isNaN(Number(value)) ? value : Number(value);
|
|
355
|
-
}
|
|
356
|
-
const item = this.tableData[rowIndex];
|
|
357
|
-
setNestedValue(item, String(field), currentValue);
|
|
358
|
-
this._inputChange.emit({
|
|
359
|
-
columnIndex,
|
|
360
|
-
item,
|
|
361
|
-
value: currentValue
|
|
362
|
-
});
|
|
363
|
-
this._changeDetectorRef.detectChanges();
|
|
364
|
-
}
|
|
365
|
-
/** @ignore */
|
|
366
|
-
handleLinkClick(columnIndex, item, event) {
|
|
367
|
-
event.preventDefault();
|
|
368
|
-
event.stopPropagation();
|
|
369
|
-
this.linkClick.emit({
|
|
370
|
-
item,
|
|
371
|
-
columnIndex
|
|
372
|
-
});
|
|
373
|
-
}
|
|
374
|
-
/** @ignore */
|
|
375
|
-
handleActionClick(columnIndex, item, actionApiName) {
|
|
376
|
-
this.rowActionClick.emit({
|
|
377
|
-
item,
|
|
378
|
-
columnIndex,
|
|
379
|
-
actionApiName
|
|
380
|
-
});
|
|
381
|
-
}
|
|
382
|
-
columnDefIsActions(columnDef) {
|
|
383
|
-
return columnDef.columnType === TableColumnType.Actions;
|
|
384
|
-
}
|
|
385
|
-
tryToggleCollapse(collapsibleForRowResult, ngbCollapse, event, source) {
|
|
386
|
-
if (collapsibleForRowResult.template &&
|
|
387
|
-
(this.collapsibleTrigger === 'row' || this.collapsibleTrigger === source)) {
|
|
388
|
-
ngbCollapse.toggle();
|
|
389
|
-
event.stopPropagation();
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
getCollapsibleTemplateForRow(row) {
|
|
393
|
-
return {
|
|
394
|
-
template: this.collapsibleTemplate &&
|
|
395
|
-
typeof this.collapsibleTemplate === 'function'
|
|
396
|
-
? this.collapsibleTemplate(row)
|
|
397
|
-
: this.collapsibleTemplate
|
|
398
|
-
};
|
|
399
|
-
}
|
|
400
|
-
_getColumnDefByIndex(columnIndex) {
|
|
401
|
-
return this.columnDefs[columnIndex];
|
|
402
|
-
}
|
|
403
|
-
_getValue(columnIndex, currentRow) {
|
|
404
|
-
try {
|
|
405
|
-
const { field, valueGetter } = this._getColumnDefByIndex(columnIndex);
|
|
406
|
-
const value = valueGetter
|
|
407
|
-
? valueGetter(currentRow)
|
|
408
|
-
: getNestedValue(currentRow, String(field), '');
|
|
409
|
-
return value || '';
|
|
410
|
-
}
|
|
411
|
-
catch (e) {
|
|
412
|
-
return '';
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: TableComponent, deps: [{ token: i1.DatePipe }, { token: i1.PercentPipe }, { token: i1.DecimalPipe }, { token: i0.ChangeDetectorRef }, { token: i2.BrandedDirective, host: true, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
416
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: TableComponent, selector: "impdc-table", inputs: { loading: "loading", columnDefs: "columnDefs", striped: "striped", hover: "hover", layout: "layout", canSelectRows: "canSelectRows", canSelectAllRows: "canSelectAllRows", selectPlaceholder: "selectPlaceholder", sortColumnIndex: "sortColumnIndex", sortDirection: "sortDirection", tableData: "tableData", selectedRowIds: "selectedRowIds", customCellComponents: "customCellComponents", collapsibleTemplate: "collapsibleTemplate", collapsibleTrigger: "collapsibleTrigger" }, outputs: { rowSelect: "rowSelect", sortBy: "sortBy", linkClick: "linkClick", rowActionClick: "rowActionClick", inputChange: "inputChange", rowCollapseChange: "rowCollapseChange" }, queries: [{ propertyName: "paginationComponent", first: true, predicate: PaginationComponent, descendants: true }, { propertyName: "bulkActions", first: true, predicate: TableBulkActionsComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (tableData) {\n <table\n impdcTable\n [striped]=\"striped && !collapsibleTemplate\"\n [layout]=\"layout\"\n [hover]=\"hover\">\n <thead>\n @if (!!bulkActions) {\n <tr>\n <th [attr.colspan]=\"tableSpan\" scope=\"col\" class=\"bulk-action-column\">\n <ng-content select=\"impdc-table-bulk-actions\"></ng-content>\n <ng-content select=\"[impdcTableBulkActions]\"></ng-content>\n </th>\n </tr>\n }\n <tr>\n @if (collapsibleTemplate) {\n <th\n scope=\"col\"\n [class.heading-below-bulk-actions]=\"!!bulkActions\"\n class=\"impdc-table-collapsible-content-row-button-container\"></th>\n }\n @if (canSelectRows) {\n <th\n scope=\"col\"\n class=\"impdc-table-selectable-row-toggle-container\"\n [ngClass]=\"{\n 'heading-below-bulk-actions': !!bulkActions\n }\">\n @if (canSelectAllRows) {\n <div>\n <impdc-checkbox\n ngModel\n [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\"\n (change)=\"handleSelectAll($event)\"></impdc-checkbox>\n </div>\n }\n </th>\n }\n @for (\n columnDef of columnDefs;\n track columnDef;\n let columnIndex = $index\n ) {\n <th\n scope=\"col\"\n [ngClass]=\"{\n 'sorted-column': isSortedColumn(columnIndex),\n 'sortable-column': columnDef.sorted,\n 'heading-below-bulk-actions': !!bulkActions\n }\"\n (click)=\"handleSort(columnIndex)\">\n <impdc-column-heading\n [isSortable]=\"columnDef.sorted || false\"\n [columnIndex]=\"columnIndex\"\n [sortColumnIndex]=\"sortColumnIndex\"\n [direction]=\"sortDirection\"\n [text]=\"columnDef.title\"\n (sort)=\"handleSort($event)\">\n </impdc-column-heading>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (loading) {\n <tr>\n <td [attr.colspan]=\"tableSpan\" class=\"data-loading\">\n <impdc-spinner></impdc-spinner>\n </td>\n </tr>\n } @else {\n @for (\n row of tableData;\n track row.id;\n let rowIndex = $index;\n let rowFirst = $first;\n let rowLast = $last;\n let rowEven = $even;\n let rowOdd = $odd\n ) {\n @if (\n getCollapsibleTemplateForRow(row);\n as collapsibleTemplateForRow\n ) {\n <tr\n [class.impdc-table-collapsible-row-trigger]=\"\n collapsibleTrigger === 'row'\n \"\n [class.table-active]=\"isRowSelected(row.id)\"\n (click)=\"\n tryToggleCollapse(\n collapsibleTemplateForRow,\n ngbCollapse,\n $event,\n 'row'\n )\n \">\n @if (collapsibleTemplate) {\n <td\n class=\"impdc-table-collapsible-content-row-button-container\"\n [class.opened]=\"!collapseMonitor.ngbCollapsing()\">\n @if (collapsibleTemplateForRow.template) {\n <div>\n <button\n type=\"button\"\n (click)=\"\n tryToggleCollapse(\n collapsibleTemplateForRow,\n ngbCollapse,\n $event,\n 'button'\n )\n \"\n class=\"impdc-table-collapsible-content-row-button btn btn-link\">\n <span\n class=\"far fa-chevron-right\"\n [class.fa-rotate-90]=\"\n !collapseMonitor.ngbCollapsing()\n \"></span>\n </button>\n </div>\n }\n </td>\n }\n @if (canSelectRows) {\n <td class=\"impdc-table-selectable-row-toggle-container\">\n <div class=\"select-column\">\n <impdc-checkbox\n [ngModel]=\"isRowSelected(row.id)\"\n (change)=\"handleRowSelect($event, row.id)\"\n (click)=\"$event.stopPropagation()\"></impdc-checkbox>\n </div>\n </td>\n }\n <td\n *ngFor=\"\n let columnDef of columnDefs;\n index as colIndex;\n last as isLast\n \"\n [ngClass]=\"{\n 'col-no-padding': !!columnDef.noPadding,\n 'actions-column': columnDef.columnType === cellType.Actions\n }\">\n <div>\n @switch (columnDef.columnType) {\n @case (cellType.Badge) {\n <span>\n <impdc-badge\n [text]=\"getStringValue(colIndex, row)\"\n [theme]=\"getTheme(columnDef, row)\">\n </impdc-badge>\n </span>\n }\n @case (cellType.Link) {\n <span (click)=\"handleLinkClick(colIndex, row, $event)\">\n @if (!branded) {\n <a class=\"link-primary\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a impdcBranded>\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n }\n @case (cellType.Url) {\n <span>\n @if (!branded) {\n <a\n target=\"_blank\"\n [attr.href]=\"getValue(colIndex, row)\"\n (click)=\"$event.stopPropagation()\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a\n impdcBranded\n target=\"_blank\"\n [attr.href]=\"getValue(colIndex, row)\"\n (click)=\"$event.stopPropagation()\">\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n }\n @case (cellType.Email) {\n <span>\n @if (!branded) {\n <a\n target=\"_blank\"\n [attr.href]=\"'mailto:' + getValue(colIndex, row)\"\n (click)=\"$event.stopPropagation()\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a\n impdcBranded\n [attr.href]=\"getMailToValue(colIndex, row)\"\n (click)=\"$event.stopPropagation()\">\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n }\n @case (cellType.Input) {\n <span>\n <input\n impdcInput\n type=\"text\"\n class=\"{{ getCellColor(columnDef, row) }}\"\n [ngModel]=\"getValue(colIndex, row)\"\n (ngModelChange)=\"\n handleCellValueChange(colIndex, rowIndex, $event)\n \"\n (click)=\"$event.stopPropagation()\" />\n </span>\n }\n @case (cellType.Boolean) {\n <span>\n @if (\n columnDef.disabled &&\n getValue(colIndex, row) === 'true'\n ) {\n <span\n impdc-icon\n name=\"check\"\n class=\"{{ getCellColor(columnDef, row) }}\"></span>\n } @else if (!columnDef.disabled) {\n <impdc-checkbox\n [checked]=\"getValue(colIndex, row) === 'true'\"\n [isSwitch]=\"true\"\n (change)=\"\n handleCellValueChange(\n colIndex,\n rowIndex,\n $event.checked\n )\n \"\n (click)=\"$event.stopPropagation()\"></impdc-checkbox>\n }\n </span>\n }\n @case (cellType.SingleSelect) {\n <span>\n <impdc-select\n [ngModel]=\"getValue(colIndex, row)\"\n [disabled]=\"columnDef.disabled || false\"\n [placeholder]=\"selectPlaceholder\"\n allowClear=\"true\"\n (selectionChange)=\"\n handleCellValueChange(\n colIndex,\n rowIndex,\n $event.value\n )\n \"\n (click)=\"$event.stopPropagation()\">\n @for (value of columnDef.values || []; track value) {\n <impdc-select-option\n [value]=\"value.value\"\n [label]=\"value.label\"></impdc-select-option>\n }\n </impdc-select>\n </span>\n }\n @case (cellType.MultiSelect) {\n <span>\n <impdc-select\n [ngModel]=\"getValue(colIndex, row)\"\n [disabled]=\"columnDef.disabled || false\"\n [placeholder]=\"selectPlaceholder\"\n multiple=\"true\"\n (selectionChange)=\"\n handleCellValueChange(\n colIndex,\n rowIndex,\n $event.value\n )\n \"\n (click)=\"$event.stopPropagation()\">\n @for (value of columnDef.values || []; track value) {\n <impdc-select-option\n [value]=\"value.value\"\n [label]=\"value.label\"></impdc-select-option>\n }\n </impdc-select>\n </span>\n }\n @case (cellType.CellRender) {\n <span class=\"{{ getCellColor(columnDef, row) }}\">\n <ng-template\n impdcTableInjectComponent\n [columnDef]=\"columnDef\"\n [rowItem]=\"row\"\n [customCellComponents]=\"customCellComponents || {}\"\n [value]=\"getRawValue(colIndex, row)\"></ng-template>\n </span>\n }\n @case (cellType.Icon) {\n <span>\n <span\n impdc-icon\n [name]=\"columnDef.iconName\"\n class=\"{{ getCellColor(columnDef, row) }}\"></span>\n </span>\n }\n @case (cellType.Actions) {\n <span>\n <!-- will always return 'true', but needed to satisfy the type engine -->\n @if (columnDefIsActions(columnDef)) {\n <impdc-row-actions\n [columnDef]=\"columnDef\"\n [rowItem]=\"row\"\n [lastColumn]=\"isLast\"\n (actionClick)=\"\n handleActionClick(colIndex, row, $event)\n \"\n (click)=\"\n $event.stopPropagation()\n \"></impdc-row-actions>\n }\n </span>\n }\n @default {\n <span class=\"{{ getCellColor(columnDef, row) }}\">\n {{ getValue(colIndex, row) }}\n </span>\n }\n }\n </div>\n </td>\n </tr>\n <tr\n class=\"impdc-table-collapsible-content-row\"\n [class.opened]=\"!collapseMonitor.ngbCollapsing()\">\n <td class=\"w-100 p-0\" [attr.colspan]=\"tableSpan\">\n <div\n class=\"impdc-table-collapsible-content-container\"\n #ngbCollapse=\"ngbCollapse\"\n #collapseMonitor=\"impdcCollapseMonitor\"\n [impdcCollapseMonitor]=\"true\"\n (collapseChange)=\"\n rowCollapseChange.emit({ row, collapsed: $event })\n \">\n @if (collapsibleTemplateForRow.template) {\n <div>\n <ng-container\n *ngTemplateOutlet=\"\n collapsibleTemplateForRow.template;\n context: {\n $implicit: row,\n collapsed: collapseMonitor.collapsed(),\n selected: isRowSelected(row.id),\n index: rowIndex,\n first: !!rowFirst,\n last: !!rowLast,\n even: !!rowEven,\n odd: !!rowOdd\n }\n \"></ng-container>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n } @empty {\n <tr>\n <td [attr.colspan]=\"tableSpan\" class=\"no-data\">\n <ng-content select=\"[noData]\"></ng-content>\n </td>\n </tr>\n }\n }\n </tbody>\n <tfoot>\n @if (paginationComponent) {\n <tr>\n <td [attr.colspan]=\"tableSpan\">\n <ng-content\n select=\"impdc-pagination, div[impdc-pagination]\"></ng-content>\n </td>\n </tr>\n }\n </tfoot>\n </table>\n}\n", styles: [".bulk-action-container{display:flex;flex-direction:row;border:1px solid var(--impd-color-gray-200);border-top-left-radius:.6rem;border-top-right-radius:.6rem;border-bottom:0px}.bulk-action-container .bulk-action-checkbox{padding:1.6rem 2rem}.bulk-action-container .bulk-actions{display:flex;flex-direction:row;gap:.4rem}.col-no-padding{padding:0!important}.data-loading{height:var(--impd-size-80);vertical-align:middle;text-align:center}.no-data{vertical-align:middle;text-align:center}.select-row{display:flex;height:var(--impd-size-4);align-items:center;justify-items:end;border-radius:var(--impd-border-radius-default)}.heading-with-checkbox{padding-left:5px;padding-right:10px}.actions-column{width:.1%;white-space:nowrap}tr.impdc-table-collapsible-content-row:has(>td>div.impdc-table-collapsible-content-container.collapse:not(.show)){display:none}tr:has(td.impdc-table-collapsible-content-row-button-container),tr.impdc-table-collapsible-content-row{transition:background-color .35s ease-in-out}tr:has(td.impdc-table-collapsible-content-row-button-container.opened),tr.impdc-table-collapsible-content-row.opened{background-color:var(--impd-color-gray-50)}tr.impdc-table-collapsible-row-trigger{cursor:pointer}table ::ng-deep tbody>tr>td.impdc-table-selectable-row-toggle-container,table ::ng-deep tr>td.impdc-table-selectable-row-toggle-container,table ::ng-deep thead>tr>th.impdc-table-selectable-row-toggle-container,table ::ng-deep tr>th.impdc-table-selectable-row-toggle-container{padding-left:var(--impd-size-5);padding-right:var(--impd-size-1);width:var(--impd-size-10)}table ::ng-deep tbody>tr>td.impdc-table-collapsible-content-row-button-container,table ::ng-deep tr>td.impdc-table-collapsible-content-row-button-container,table ::ng-deep thead>tr>th.impdc-table-collapsible-content-row-button-container,table ::ng-deep tr>th.impdc-table-collapsible-content-row-button-container{padding-left:var(--impd-size-5);padding-right:0;width:var(--impd-size-10)}table ::ng-deep tbody>tr>td.impdc-table-collapsible-content-row-button-container:empty,table ::ng-deep tr>td.impdc-table-collapsible-content-row-button-container:empty,table ::ng-deep thead>tr>th.impdc-table-collapsible-content-row-button-container:empty,table ::ng-deep tr>th.impdc-table-collapsible-content-row-button-container:empty{padding:0}table ::ng-deep tbody>tr>td.impdc-table-collapsible-content-row-button-container+.impdc-table-selectable-row-toggle-container,table ::ng-deep tr>td.impdc-table-collapsible-content-row-button-container+.impdc-table-selectable-row-toggle-container,table ::ng-deep thead>tr>th.impdc-table-collapsible-content-row-button-container+.impdc-table-selectable-row-toggle-container,table ::ng-deep tr>th.impdc-table-collapsible-content-row-button-container+.impdc-table-selectable-row-toggle-container{padding-left:var(--impd-size-3);width:var(--impd-size-8)}.impdc-table-collapsible-content-row-button{align-items:center;border-radius:var(--impd-border-radius-2xl);color:var(--impd-color-gray-700)!important;display:flex;height:var(--impd-size-5);justify-content:center;padding:0;width:var(--impd-size-5);box-shadow:none}.impdc-table-collapsible-content-row-button:hover,.impdc-table-collapsible-content-row-button:focus,.impdc-table-collapsible-content-row-button:active{background-color:var(--impd-color-gray-100)}.impdc-table-collapsible-content-row-button impdc-icon{line-height:1}.impdc-table-collapsible-content-row-button>span.fa-chevron-right{font-size:1.6rem;transition:transform .35s}table.table-striped>tbody>tr:nth-of-type(4n+3)>*{--impartner-hex-table-bg-type: var(--impd-color-gray-50)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.BrandedDirective, selector: "[impdcBranded]" }, { kind: "component", type: i4.IconComponent, selector: "impdc-icon, [impdc-icon]", inputs: ["name", "theme", "size"] }, { kind: "component", type: i5.CheckboxComponent, selector: "impdc-checkbox", inputs: ["tabIndex", "id", "label", "description", "isSwitch", "switchIcons", "inline", "layout", "checked", "indeterminate", "disabled", "errorStateMatcher", "required"], outputs: ["change", "indeterminateChange"], exportAs: ["impdcCheckControl"] }, { kind: "component", type: i6.SelectOptionComponent, selector: "impdc-select-option", inputs: ["value", "label", "disabled"] }, { kind: "component", type: i7.SelectComponent, selector: "impdc-select", inputs: ["disabled", "tabIndex", "search", "placeholder", "required", "compareWith", "dropdownContainer", "errorStateMatcher", "allowClear", "multiple", "multipleDisplay"], outputs: ["selectionChange", "valueChange", "searchTextChanges"], exportAs: ["impdcSelect"] }, { kind: "directive", type: i8.InputDirective, selector: "input[impdcInput], textarea[impdcInput], select[impdcNativeSelect]", inputs: ["disabled", "id", "type", "required", "readonly", "errorStateMatcher", "value"], exportAs: ["impdcInput"] }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i10.SpinnerComponent, selector: "impdc-spinner, div[impdc-spinner]", inputs: ["accessibilityText"] }, { kind: "component", type: i11.BadgeComponent, selector: "impdc-badge, [impdc-badge]", inputs: ["text", "icon", "theme", "size", "hideBg", "rounded", "dismissable"], outputs: ["dismiss"] }, { kind: "directive", type: i12.CollapseMonitorDirective, selector: "[impdcCollapseMonitor]", outputs: ["collapseChange"], exportAs: ["impdcCollapseMonitor"] }, { kind: "directive", type: i13.TableDirective, selector: "table[impdcTable]", inputs: ["striped", "hover", "layout"] }, { kind: "component", type: i14.ColumnHeadingComponent, selector: "impdc-column-heading", inputs: ["isSortable", "columnIndex", "sortColumnIndex", "direction", "text"], outputs: ["sort"] }, { kind: "directive", type: i15.TableInjectComponentDirective, selector: "[impdcTableInjectComponent]", inputs: ["columnDef", "value", "rowItem", "customCellComponents"] }, { kind: "component", type: i16.RowActionsComponent, selector: "impdc-row-actions", inputs: ["columnDef", "rowItem", "lastColumn"], outputs: ["actionClick"] }] }); }
|
|
417
|
-
}
|
|
418
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: TableComponent, decorators: [{
|
|
419
|
-
type: Component,
|
|
420
|
-
args: [{ selector: 'impdc-table', template: "@if (tableData) {\n <table\n impdcTable\n [striped]=\"striped && !collapsibleTemplate\"\n [layout]=\"layout\"\n [hover]=\"hover\">\n <thead>\n @if (!!bulkActions) {\n <tr>\n <th [attr.colspan]=\"tableSpan\" scope=\"col\" class=\"bulk-action-column\">\n <ng-content select=\"impdc-table-bulk-actions\"></ng-content>\n <ng-content select=\"[impdcTableBulkActions]\"></ng-content>\n </th>\n </tr>\n }\n <tr>\n @if (collapsibleTemplate) {\n <th\n scope=\"col\"\n [class.heading-below-bulk-actions]=\"!!bulkActions\"\n class=\"impdc-table-collapsible-content-row-button-container\"></th>\n }\n @if (canSelectRows) {\n <th\n scope=\"col\"\n class=\"impdc-table-selectable-row-toggle-container\"\n [ngClass]=\"{\n 'heading-below-bulk-actions': !!bulkActions\n }\">\n @if (canSelectAllRows) {\n <div>\n <impdc-checkbox\n ngModel\n [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\"\n (change)=\"handleSelectAll($event)\"></impdc-checkbox>\n </div>\n }\n </th>\n }\n @for (\n columnDef of columnDefs;\n track columnDef;\n let columnIndex = $index\n ) {\n <th\n scope=\"col\"\n [ngClass]=\"{\n 'sorted-column': isSortedColumn(columnIndex),\n 'sortable-column': columnDef.sorted,\n 'heading-below-bulk-actions': !!bulkActions\n }\"\n (click)=\"handleSort(columnIndex)\">\n <impdc-column-heading\n [isSortable]=\"columnDef.sorted || false\"\n [columnIndex]=\"columnIndex\"\n [sortColumnIndex]=\"sortColumnIndex\"\n [direction]=\"sortDirection\"\n [text]=\"columnDef.title\"\n (sort)=\"handleSort($event)\">\n </impdc-column-heading>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (loading) {\n <tr>\n <td [attr.colspan]=\"tableSpan\" class=\"data-loading\">\n <impdc-spinner></impdc-spinner>\n </td>\n </tr>\n } @else {\n @for (\n row of tableData;\n track row.id;\n let rowIndex = $index;\n let rowFirst = $first;\n let rowLast = $last;\n let rowEven = $even;\n let rowOdd = $odd\n ) {\n @if (\n getCollapsibleTemplateForRow(row);\n as collapsibleTemplateForRow\n ) {\n <tr\n [class.impdc-table-collapsible-row-trigger]=\"\n collapsibleTrigger === 'row'\n \"\n [class.table-active]=\"isRowSelected(row.id)\"\n (click)=\"\n tryToggleCollapse(\n collapsibleTemplateForRow,\n ngbCollapse,\n $event,\n 'row'\n )\n \">\n @if (collapsibleTemplate) {\n <td\n class=\"impdc-table-collapsible-content-row-button-container\"\n [class.opened]=\"!collapseMonitor.ngbCollapsing()\">\n @if (collapsibleTemplateForRow.template) {\n <div>\n <button\n type=\"button\"\n (click)=\"\n tryToggleCollapse(\n collapsibleTemplateForRow,\n ngbCollapse,\n $event,\n 'button'\n )\n \"\n class=\"impdc-table-collapsible-content-row-button btn btn-link\">\n <span\n class=\"far fa-chevron-right\"\n [class.fa-rotate-90]=\"\n !collapseMonitor.ngbCollapsing()\n \"></span>\n </button>\n </div>\n }\n </td>\n }\n @if (canSelectRows) {\n <td class=\"impdc-table-selectable-row-toggle-container\">\n <div class=\"select-column\">\n <impdc-checkbox\n [ngModel]=\"isRowSelected(row.id)\"\n (change)=\"handleRowSelect($event, row.id)\"\n (click)=\"$event.stopPropagation()\"></impdc-checkbox>\n </div>\n </td>\n }\n <td\n *ngFor=\"\n let columnDef of columnDefs;\n index as colIndex;\n last as isLast\n \"\n [ngClass]=\"{\n 'col-no-padding': !!columnDef.noPadding,\n 'actions-column': columnDef.columnType === cellType.Actions\n }\">\n <div>\n @switch (columnDef.columnType) {\n @case (cellType.Badge) {\n <span>\n <impdc-badge\n [text]=\"getStringValue(colIndex, row)\"\n [theme]=\"getTheme(columnDef, row)\">\n </impdc-badge>\n </span>\n }\n @case (cellType.Link) {\n <span (click)=\"handleLinkClick(colIndex, row, $event)\">\n @if (!branded) {\n <a class=\"link-primary\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a impdcBranded>\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n }\n @case (cellType.Url) {\n <span>\n @if (!branded) {\n <a\n target=\"_blank\"\n [attr.href]=\"getValue(colIndex, row)\"\n (click)=\"$event.stopPropagation()\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a\n impdcBranded\n target=\"_blank\"\n [attr.href]=\"getValue(colIndex, row)\"\n (click)=\"$event.stopPropagation()\">\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n }\n @case (cellType.Email) {\n <span>\n @if (!branded) {\n <a\n target=\"_blank\"\n [attr.href]=\"'mailto:' + getValue(colIndex, row)\"\n (click)=\"$event.stopPropagation()\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a\n impdcBranded\n [attr.href]=\"getMailToValue(colIndex, row)\"\n (click)=\"$event.stopPropagation()\">\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n }\n @case (cellType.Input) {\n <span>\n <input\n impdcInput\n type=\"text\"\n class=\"{{ getCellColor(columnDef, row) }}\"\n [ngModel]=\"getValue(colIndex, row)\"\n (ngModelChange)=\"\n handleCellValueChange(colIndex, rowIndex, $event)\n \"\n (click)=\"$event.stopPropagation()\" />\n </span>\n }\n @case (cellType.Boolean) {\n <span>\n @if (\n columnDef.disabled &&\n getValue(colIndex, row) === 'true'\n ) {\n <span\n impdc-icon\n name=\"check\"\n class=\"{{ getCellColor(columnDef, row) }}\"></span>\n } @else if (!columnDef.disabled) {\n <impdc-checkbox\n [checked]=\"getValue(colIndex, row) === 'true'\"\n [isSwitch]=\"true\"\n (change)=\"\n handleCellValueChange(\n colIndex,\n rowIndex,\n $event.checked\n )\n \"\n (click)=\"$event.stopPropagation()\"></impdc-checkbox>\n }\n </span>\n }\n @case (cellType.SingleSelect) {\n <span>\n <impdc-select\n [ngModel]=\"getValue(colIndex, row)\"\n [disabled]=\"columnDef.disabled || false\"\n [placeholder]=\"selectPlaceholder\"\n allowClear=\"true\"\n (selectionChange)=\"\n handleCellValueChange(\n colIndex,\n rowIndex,\n $event.value\n )\n \"\n (click)=\"$event.stopPropagation()\">\n @for (value of columnDef.values || []; track value) {\n <impdc-select-option\n [value]=\"value.value\"\n [label]=\"value.label\"></impdc-select-option>\n }\n </impdc-select>\n </span>\n }\n @case (cellType.MultiSelect) {\n <span>\n <impdc-select\n [ngModel]=\"getValue(colIndex, row)\"\n [disabled]=\"columnDef.disabled || false\"\n [placeholder]=\"selectPlaceholder\"\n multiple=\"true\"\n (selectionChange)=\"\n handleCellValueChange(\n colIndex,\n rowIndex,\n $event.value\n )\n \"\n (click)=\"$event.stopPropagation()\">\n @for (value of columnDef.values || []; track value) {\n <impdc-select-option\n [value]=\"value.value\"\n [label]=\"value.label\"></impdc-select-option>\n }\n </impdc-select>\n </span>\n }\n @case (cellType.CellRender) {\n <span class=\"{{ getCellColor(columnDef, row) }}\">\n <ng-template\n impdcTableInjectComponent\n [columnDef]=\"columnDef\"\n [rowItem]=\"row\"\n [customCellComponents]=\"customCellComponents || {}\"\n [value]=\"getRawValue(colIndex, row)\"></ng-template>\n </span>\n }\n @case (cellType.Icon) {\n <span>\n <span\n impdc-icon\n [name]=\"columnDef.iconName\"\n class=\"{{ getCellColor(columnDef, row) }}\"></span>\n </span>\n }\n @case (cellType.Actions) {\n <span>\n <!-- will always return 'true', but needed to satisfy the type engine -->\n @if (columnDefIsActions(columnDef)) {\n <impdc-row-actions\n [columnDef]=\"columnDef\"\n [rowItem]=\"row\"\n [lastColumn]=\"isLast\"\n (actionClick)=\"\n handleActionClick(colIndex, row, $event)\n \"\n (click)=\"\n $event.stopPropagation()\n \"></impdc-row-actions>\n }\n </span>\n }\n @default {\n <span class=\"{{ getCellColor(columnDef, row) }}\">\n {{ getValue(colIndex, row) }}\n </span>\n }\n }\n </div>\n </td>\n </tr>\n <tr\n class=\"impdc-table-collapsible-content-row\"\n [class.opened]=\"!collapseMonitor.ngbCollapsing()\">\n <td class=\"w-100 p-0\" [attr.colspan]=\"tableSpan\">\n <div\n class=\"impdc-table-collapsible-content-container\"\n #ngbCollapse=\"ngbCollapse\"\n #collapseMonitor=\"impdcCollapseMonitor\"\n [impdcCollapseMonitor]=\"true\"\n (collapseChange)=\"\n rowCollapseChange.emit({ row, collapsed: $event })\n \">\n @if (collapsibleTemplateForRow.template) {\n <div>\n <ng-container\n *ngTemplateOutlet=\"\n collapsibleTemplateForRow.template;\n context: {\n $implicit: row,\n collapsed: collapseMonitor.collapsed(),\n selected: isRowSelected(row.id),\n index: rowIndex,\n first: !!rowFirst,\n last: !!rowLast,\n even: !!rowEven,\n odd: !!rowOdd\n }\n \"></ng-container>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n } @empty {\n <tr>\n <td [attr.colspan]=\"tableSpan\" class=\"no-data\">\n <ng-content select=\"[noData]\"></ng-content>\n </td>\n </tr>\n }\n }\n </tbody>\n <tfoot>\n @if (paginationComponent) {\n <tr>\n <td [attr.colspan]=\"tableSpan\">\n <ng-content\n select=\"impdc-pagination, div[impdc-pagination]\"></ng-content>\n </td>\n </tr>\n }\n </tfoot>\n </table>\n}\n", styles: [".bulk-action-container{display:flex;flex-direction:row;border:1px solid var(--impd-color-gray-200);border-top-left-radius:.6rem;border-top-right-radius:.6rem;border-bottom:0px}.bulk-action-container .bulk-action-checkbox{padding:1.6rem 2rem}.bulk-action-container .bulk-actions{display:flex;flex-direction:row;gap:.4rem}.col-no-padding{padding:0!important}.data-loading{height:var(--impd-size-80);vertical-align:middle;text-align:center}.no-data{vertical-align:middle;text-align:center}.select-row{display:flex;height:var(--impd-size-4);align-items:center;justify-items:end;border-radius:var(--impd-border-radius-default)}.heading-with-checkbox{padding-left:5px;padding-right:10px}.actions-column{width:.1%;white-space:nowrap}tr.impdc-table-collapsible-content-row:has(>td>div.impdc-table-collapsible-content-container.collapse:not(.show)){display:none}tr:has(td.impdc-table-collapsible-content-row-button-container),tr.impdc-table-collapsible-content-row{transition:background-color .35s ease-in-out}tr:has(td.impdc-table-collapsible-content-row-button-container.opened),tr.impdc-table-collapsible-content-row.opened{background-color:var(--impd-color-gray-50)}tr.impdc-table-collapsible-row-trigger{cursor:pointer}table ::ng-deep tbody>tr>td.impdc-table-selectable-row-toggle-container,table ::ng-deep tr>td.impdc-table-selectable-row-toggle-container,table ::ng-deep thead>tr>th.impdc-table-selectable-row-toggle-container,table ::ng-deep tr>th.impdc-table-selectable-row-toggle-container{padding-left:var(--impd-size-5);padding-right:var(--impd-size-1);width:var(--impd-size-10)}table ::ng-deep tbody>tr>td.impdc-table-collapsible-content-row-button-container,table ::ng-deep tr>td.impdc-table-collapsible-content-row-button-container,table ::ng-deep thead>tr>th.impdc-table-collapsible-content-row-button-container,table ::ng-deep tr>th.impdc-table-collapsible-content-row-button-container{padding-left:var(--impd-size-5);padding-right:0;width:var(--impd-size-10)}table ::ng-deep tbody>tr>td.impdc-table-collapsible-content-row-button-container:empty,table ::ng-deep tr>td.impdc-table-collapsible-content-row-button-container:empty,table ::ng-deep thead>tr>th.impdc-table-collapsible-content-row-button-container:empty,table ::ng-deep tr>th.impdc-table-collapsible-content-row-button-container:empty{padding:0}table ::ng-deep tbody>tr>td.impdc-table-collapsible-content-row-button-container+.impdc-table-selectable-row-toggle-container,table ::ng-deep tr>td.impdc-table-collapsible-content-row-button-container+.impdc-table-selectable-row-toggle-container,table ::ng-deep thead>tr>th.impdc-table-collapsible-content-row-button-container+.impdc-table-selectable-row-toggle-container,table ::ng-deep tr>th.impdc-table-collapsible-content-row-button-container+.impdc-table-selectable-row-toggle-container{padding-left:var(--impd-size-3);width:var(--impd-size-8)}.impdc-table-collapsible-content-row-button{align-items:center;border-radius:var(--impd-border-radius-2xl);color:var(--impd-color-gray-700)!important;display:flex;height:var(--impd-size-5);justify-content:center;padding:0;width:var(--impd-size-5);box-shadow:none}.impdc-table-collapsible-content-row-button:hover,.impdc-table-collapsible-content-row-button:focus,.impdc-table-collapsible-content-row-button:active{background-color:var(--impd-color-gray-100)}.impdc-table-collapsible-content-row-button impdc-icon{line-height:1}.impdc-table-collapsible-content-row-button>span.fa-chevron-right{font-size:1.6rem;transition:transform .35s}table.table-striped>tbody>tr:nth-of-type(4n+3)>*{--impartner-hex-table-bg-type: var(--impd-color-gray-50)}\n"] }]
|
|
421
|
-
}], ctorParameters: () => [{ type: i1.DatePipe }, { type: i1.PercentPipe }, { type: i1.DecimalPipe }, { type: i0.ChangeDetectorRef }, { type: i2.BrandedDirective, decorators: [{
|
|
422
|
-
type: Optional
|
|
423
|
-
}, {
|
|
424
|
-
type: Host
|
|
425
|
-
}] }], propDecorators: { loading: [{
|
|
426
|
-
type: Input
|
|
427
|
-
}], columnDefs: [{
|
|
428
|
-
type: Input
|
|
429
|
-
}], striped: [{
|
|
430
|
-
type: Input
|
|
431
|
-
}], hover: [{
|
|
432
|
-
type: Input
|
|
433
|
-
}], layout: [{
|
|
434
|
-
type: Input
|
|
435
|
-
}], canSelectRows: [{
|
|
436
|
-
type: Input
|
|
437
|
-
}], canSelectAllRows: [{
|
|
438
|
-
type: Input
|
|
439
|
-
}], selectPlaceholder: [{
|
|
440
|
-
type: Input
|
|
441
|
-
}], sortColumnIndex: [{
|
|
442
|
-
type: Input
|
|
443
|
-
}], sortDirection: [{
|
|
444
|
-
type: Input
|
|
445
|
-
}], tableData: [{
|
|
446
|
-
type: Input
|
|
447
|
-
}], selectedRowIds: [{
|
|
448
|
-
type: Input
|
|
449
|
-
}], customCellComponents: [{
|
|
450
|
-
type: Input
|
|
451
|
-
}], collapsibleTemplate: [{
|
|
452
|
-
type: Input
|
|
453
|
-
}], collapsibleTrigger: [{
|
|
454
|
-
type: Input
|
|
455
|
-
}], rowSelect: [{
|
|
456
|
-
type: Output
|
|
457
|
-
}], sortBy: [{
|
|
458
|
-
type: Output
|
|
459
|
-
}], linkClick: [{
|
|
460
|
-
type: Output
|
|
461
|
-
}], rowActionClick: [{
|
|
462
|
-
type: Output
|
|
463
|
-
}], inputChange: [{
|
|
464
|
-
type: Output
|
|
465
|
-
}], rowCollapseChange: [{
|
|
466
|
-
type: Output
|
|
467
|
-
}], paginationComponent: [{
|
|
468
|
-
type: ContentChild,
|
|
469
|
-
args: [PaginationComponent]
|
|
470
|
-
}], bulkActions: [{
|
|
471
|
-
type: ContentChild,
|
|
472
|
-
args: [TableBulkActionsComponent]
|
|
473
|
-
}] } });
|
|
474
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWNvbXBvbmVudHMvc3JjL2xpYi90YWJsZS9jb250YWluZXJzL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1jb21wb25lbnRzL3NyYy9saWIvdGFibGUvY29udGFpbmVycy90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osSUFBSSxFQUNKLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUdQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxHQUFHLElBQUksY0FBYyxFQUFFLEdBQUcsSUFBSSxjQUFjLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFjeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUcxRDs7O0dBR0c7QUFNSCxNQUFNLE9BQU8sY0FBYztJQThCekI7O09BRUc7SUFDSCxJQUFvQixhQUFhLENBQUMsS0FBYztRQUM5QyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBQ0QsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFDVyxnQkFBZ0IsQ0FBQyxLQUFjO1FBQ3hDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDakMsQ0FBQztJQUVELElBQVcsZ0JBQWdCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3RELENBQUM7SUFzQkQ7O09BRUc7SUFDSCxJQUNXLGNBQWMsQ0FBQyxLQUEwQjtRQUNsRCxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBZ0ZELGNBQWM7SUFDZCxJQUFXLFlBQVk7UUFDckIsT0FBTyxDQUNMLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZTtZQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQy9CLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUztZQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUNwRCxDQUFDO0lBQ0osQ0FBQztJQUlELGNBQWM7SUFDZCxJQUFXLFNBQVM7UUFDbEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFFbEMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxFQUFFLENBQUM7UUFDVCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM3QixJQUFJLEVBQUUsQ0FBQztRQUNULENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFPRCxZQUNtQixTQUFtQixFQUNuQixZQUF5QixFQUN6QixZQUF5QixFQUN6QixrQkFBcUMsRUFDMUIsUUFBMEI7UUFKckMsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNuQixpQkFBWSxHQUFaLFlBQVksQ0FBYTtRQUN6QixpQkFBWSxHQUFaLFlBQVksQ0FBYTtRQUN6Qix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW1CO1FBQzFCLGFBQVEsR0FBUixRQUFRLENBQWtCO1FBdE14RDs7V0FFRztRQUNhLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFaEM7Ozs7OztXQU1HO1FBQ2EsZUFBVSxHQUEwQixFQUFFLENBQUM7UUFFdkQ7O1dBRUc7UUFDYSxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBRS9COztXQUVHO1FBQ2EsVUFBSyxHQUFHLElBQUksQ0FBQztRQUU3Qjs7V0FFRztRQUNhLFdBQU0sR0FBcUIsTUFBTSxDQUFDO1FBd0JsRDs7V0FFRztRQUNhLHNCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUV2Qzs7V0FFRztRQUNhLG9CQUFlLEdBQVcsQ0FBQyxDQUFDO1FBRTVDOztXQUVHO1FBQ2Esa0JBQWEsR0FBbUIsS0FBSyxDQUFDO1FBRXREOztXQUVHO1FBQ2EsY0FBUyxHQUFvQixFQUFFLENBQUM7UUFtQmhEOzs7O1dBSUc7UUFDYSx3QkFBbUIsR0FJakMsSUFBSSxDQUFDO1FBRVA7Ozs7V0FJRztRQUVJLHVCQUFrQixHQUFxQixRQUFRLENBQUM7UUFFdkQ7O1dBRUc7UUFDdUIsY0FBUyxHQUNqQyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUUxQzs7V0FFRztRQUN1QixXQUFNLEdBQzlCLElBQUksWUFBWSxFQUFrQixDQUFDO1FBRXJDOztXQUVHO1FBQ3VCLGNBQVMsR0FDakMsSUFBSSxZQUFZLEVBQTJCLENBQUM7UUFFOUM7O1dBRUc7UUFFYSxtQkFBYyxHQUM1QixJQUFJLFlBQVksRUFBK0IsQ0FBQztRQUVsRDs7O1dBR0c7UUFFYSxnQkFBVyxHQUN6QixJQUFJLFlBQVksRUFBMkIsQ0FBQztRQUU5Qzs7V0FFRztRQUVhLHNCQUFpQixHQUU3QixJQUFJLFlBQVksRUFBZ0MsQ0FBQztRQUVyRCxjQUFjO1FBRVAsd0JBQW1CLEdBQXlCLFNBQVMsQ0FBQztRQUU3RCxjQUFjO1FBRVAsZ0JBQVcsR0FBK0IsU0FBUyxDQUFDO1FBRTNELGNBQWM7UUFDRSxhQUFRLEdBQUcsZUFBZSxDQUFDO1FBQzNDLGNBQWM7UUFDUCxnQkFBVyxHQUFHLElBQUksQ0FBQztRQVcxQixjQUFjO1FBQ0UsWUFBTyxHQUFZLEtBQUssQ0FBQztRQWlCakMsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQzFCLG9CQUFlLEdBQXdCLEVBQUUsQ0FBQztRQUNqQyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBU3JFLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN2QyxJQUFJLENBQUMsWUFBWTthQUNkLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDakMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDdEQsSUFDRSxDQUFDLElBQUksQ0FBQyxTQUFTO2dCQUNmLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNO2dCQUN0QixDQUFDLElBQUksQ0FBQyxjQUFjO2dCQUNwQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUMzQixDQUFDO2dCQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQzNCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1lBQ3pFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELGNBQWM7SUFDUCxjQUFjLENBQ25CLFdBQW1CLEVBQ25CLFVBQXlCO1FBRXpCLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUN4QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDekMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFcEQsSUFBSSxVQUFVLEtBQUssZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3pDLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFMUMsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELGNBQWM7SUFDUCxjQUFjLENBQ25CLFdBQW1CLEVBQ25CLFVBQXlCO1FBRXpCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXJELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELGNBQWM7SUFDUCxRQUFRLENBQ2IsV0FBbUIsRUFDbkIsVUFBeUI7UUFFekIsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQ3hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVwRCxRQUFRLFVBQVUsRUFBRSxDQUFDO1lBQ25CLEtBQUssZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM5RCxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQzFCLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxNQUFNLFNBQVMsR0FBRyxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxLQUFLLEdBQUcsU0FBUztvQkFDZixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJLEVBQUU7b0JBQ3BELENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xCLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLE1BQU0sYUFBYSxHQUNqQixRQUFRLFlBQVksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxLQUFLLEdBQUcsYUFBYTtvQkFDbkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxzQkFBc0IsQ0FBQyxJQUFJLEVBQUU7b0JBQ2xFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xCLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDMUIsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRCxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM5RCxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDNUMsS0FBSyxHQUFHLFdBQVcsS0FBSyxFQUFFLENBQUM7Z0JBQzdCLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUMxQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDekIsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzNCLENBQUM7Z0JBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNmLE9BQU8sS0FBSyxDQUFDO2dCQUNmLENBQUM7Z0JBRUQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLFNBQVMsR0FBRyxTQUFTLEVBQUUsRUFBRSxDQUM1RCxNQUFNLENBQUMsTUFBTSxHQUFHLFNBQVM7b0JBQ3ZCLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxHQUFHO29CQUN0QyxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUViLENBQUMsQ0FBQyxTQUFTO29CQUNULENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUNwRCxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUNWLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxlQUFlLENBQUMsV0FBVztnQkFDOUIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDOUIsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNyRCxDQUFDO2dCQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsY0FBYztJQUNQLFdBQVcsQ0FDaEIsV0FBbUIsRUFDbkIsVUFBeUI7UUFFekIsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV6RCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELGNBQWM7SUFDUCxZQUFZLENBQ2pCLGdCQUFnQyxFQUNoQyxJQUFtQjtRQUVuQixPQUFPLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsY0FBYztJQUNQLFFBQVEsQ0FDYixnQkFBZ0MsRUFDaEMsSUFBbUI7UUFFbkIsT0FBTyxDQUNMLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUM7WUFDakQsY0FBYyxDQUFDLE9BQU8sQ0FDdkIsQ0FBQztJQUNKLENBQUM7SUFFRCxjQUFjO0lBQ1AsY0FBYyxDQUFDLFdBQW1CO1FBQ3ZDLE9BQU8sV0FBVyxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUMsQ0FBQztJQUVELGNBQWM7SUFDUCxhQUFhLENBQUMsRUFBbUI7UUFDdEMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsY0FBYztJQUNQLGVBQWUsQ0FBQyxLQUEwQjtRQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzlDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBRXZFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsY0FBYztJQUNQLFVBQVUsQ0FBQyxXQUFtQjtRQUNuQyxJQUFJLFdBQVcsS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDckUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQztZQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUM3QixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7UUFFakUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDZixXQUFXO1lBQ1gsS0FBSztZQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYTtTQUM5QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYztJQUNQLGVBQWUsQ0FDcEIsS0FBMEIsRUFDMUIsS0FBc0I7UUFFdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQzthQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEQsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEMsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUN2RSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELGNBQWM7SUFDUCxxQkFBcUIsQ0FDMUIsV0FBbUIsRUFDbkIsUUFBZ0IsRUFDaEIsS0FBMkM7UUFFM0MsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckUsSUFBSSxZQUFZLEdBQXlDLEtBQUssQ0FBQztRQUUvRCxJQUFJLFVBQVUsS0FBSyxlQUFlLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BFLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXRDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRWxELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQ3JCLFdBQVc7WUFDWCxJQUFJO1lBQ0osS0FBSyxFQUFFLFlBQVk7U0FDcEIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFRCxjQUFjO0lBQ1AsZUFBZSxDQUNwQixXQUFtQixFQUNuQixJQUFtQixFQUNuQixLQUFZO1FBRVosS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNsQixJQUFJO1lBQ0osV0FBVztTQUNaLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxjQUFjO0lBQ1AsaUJBQWlCLENBQ3RCLFdBQW1CLEVBQ25CLElBQW1CLEVBQ25CLGFBQXFCO1FBRXJCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLElBQUk7WUFDSixXQUFXO1lBQ1gsYUFBYTtTQUNkLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxrQkFBa0IsQ0FDMUIsU0FBOEI7UUFFOUIsT0FBTyxTQUFTLENBQUMsVUFBVSxLQUFLLGVBQWUsQ0FBQyxPQUFPLENBQUM7SUFDMUQsQ0FBQztJQUVTLGlCQUFpQixDQUN6Qix1QkFFQyxFQUNELFdBQXdCLEVBQ3hCLEtBQVksRUFDWixNQUF3QjtRQUV4QixJQUNFLHVCQUF1QixDQUFDLFFBQVE7WUFDaEMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxNQUFNLENBQUMsRUFDekUsQ0FBQztZQUNELFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFUyw0QkFBNEIsQ0FBQyxHQUFrQjtRQUd2RCxPQUFPO1lBQ0wsUUFBUSxFQUNOLElBQUksQ0FBQyxtQkFBbUI7Z0JBQ3hCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixLQUFLLFVBQVU7Z0JBQzVDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDO2dCQUMvQixDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQjtTQUMvQixDQUFDO0lBQ0osQ0FBQztJQUVPLG9CQUFvQixDQUFDLFdBQW1CO1FBQzlDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU8sU0FBUyxDQUNmLFdBQW1CLEVBQ25CLFVBQXlCO1FBRXpCLElBQUksQ0FBQztZQUNILE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXRFLE1BQU0sS0FBSyxHQUFzQixXQUFXO2dCQUMxQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztnQkFDekIsQ0FBQyxDQUFFLGNBQWMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBdUIsQ0FBQztZQUV6RSxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDOzhHQTNoQlUsY0FBYztrR0FBZCxjQUFjLHl2QkFzSlgsbUJBQW1CLDhFQUluQix5QkFBeUIscUVDMU16QywyOWVBdVlBOzsyRkR2VmEsY0FBYztrQkFMMUIsU0FBUzsrQkFDRSxhQUFhOzswQkEyTXBCLFFBQVE7OzBCQUFJLElBQUk7eUNBbk1ILE9BQU87c0JBQXRCLEtBQUs7Z0JBU1UsVUFBVTtzQkFBekIsS0FBSztnQkFLVSxPQUFPO3NCQUF0QixLQUFLO2dCQUtVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBS1UsTUFBTTtzQkFBckIsS0FBSztnQkFLYyxhQUFhO3NCQUFoQyxLQUFLO2dCQVdLLGdCQUFnQjtzQkFEMUIsS0FBSztnQkFZVSxpQkFBaUI7c0JBQWhDLEtBQUs7Z0JBS1UsZUFBZTtzQkFBOUIsS0FBSztnQkFLVSxhQUFhO3NCQUE1QixLQUFLO2dCQUtVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBTUssY0FBYztzQkFEeEIsS0FBSztnQkFZVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBT1UsbUJBQW1CO3NCQUFsQyxLQUFLO2dCQVlDLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFNb0IsU0FBUztzQkFBbEMsTUFBTTtnQkFNbUIsTUFBTTtzQkFBL0IsTUFBTTtnQkFNbUIsU0FBUztzQkFBbEMsTUFBTTtnQkFPUyxjQUFjO3NCQUQ3QixNQUFNO2dCQVNTLFdBQVc7c0JBRDFCLE1BQU07Z0JBUVMsaUJBQWlCO3NCQURoQyxNQUFNO2dCQU9BLG1CQUFtQjtzQkFEekIsWUFBWTt1QkFBQyxtQkFBbUI7Z0JBSzFCLFdBQVc7c0JBRGpCLFlBQVk7dUJBQUMseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVBpcGUsIERlY2ltYWxQaXBlLCBQZXJjZW50UGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBnZXQgYXMgZ2V0TmVzdGVkVmFsdWUsIHNldCBhcyBzZXROZXN0ZWRWYWx1ZSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IERFQk9VTkNFX1RJTUUgfSBmcm9tICcuLi9jb25zdGFudHMvaW5kZXgnO1xuaW1wb3J0IHsgVGFibGVDb2x1bW5UeXBlIH0gZnJvbSAnLi4vZW51bWVyYXRpb25zL2luZGV4JztcbmltcG9ydCB7XG4gIElDb2xsYXBzaWJsZVJvd0NvbnRlbnRDb250ZXh0LFxuICBJQ3VzdG9tQ2VsbFJlbmRlcmVyQ29tcG9uZW50cyxcbiAgSVNvcnRCeVBheWxvYWQsXG4gIElUYWJsZUFjdGlvbnNDb2x1bW5EZWYsXG4gIElUYWJsZUV2ZW50UGF5bG9hZCxcbiAgSVRhYmxlUm93QWN0aW9uUGF5bG9hZCxcbiAgSVRhYmxlUm93Q29sbGFwc2VDaGFuZ2UsXG4gIElUYWJsZVJvd0l0ZW0sXG4gIElUYWJsZVJvd0l0ZW1WYWx1ZVR5cGVzLFxuICBUYWJsZUNvbHVtbkRlZlxufSBmcm9tICcuLi9pbnRlcmZhY2VzL2luZGV4JztcbmltcG9ydCB7IENoZWNrYm94Q2hhbmdlRXZlbnQgfSBmcm9tICcuLi8uLi9mb3JtLWZpZWxkJztcbmltcG9ydCB7IFRhYmxlVGhlbWVIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJzJztcbmltcG9ydCB7IENvbXBvbmVudFRoZW1lIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQnJhbmRlZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2JyYW5kaW5nJztcbmltcG9ydCB7IFBhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9wYWdpbmF0aW9uJztcbmltcG9ydCB7IFRhYmxlQnVsa0FjdGlvbnNDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzJztcbmltcG9ydCB7IE5nYkNvbGxhcHNlIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuXG4vKipcbiAqIFRoZSBgVGFibGVDb21wb25lbnRgIChgPGltcGRjLXRhYmxlYCkgaXMgYSBkYXRhIHRhYmxlIGNvbXBvbmVudC5cbiAqIFRvIHVzZSwgaW1wb3J0IGBUYWJsZU1vZHVsZWAgZnJvbSBgQGltcGFydG5lci9kZXNpZ24tY29tcG9uZW50c2AuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ltcGRjLXRhYmxlJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0YWJsZSBkYXRhIGlzIGN1cnJlbnRseSBiZWluZyBsb2FkZWQuIFRoZSBgPGltcGRjLXNwaW5uZXI+YCB3aWxsIHNob3cgaWYgZGF0YSBpcyBsb2FkaW5nLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIHZpc2libGUgY29sdW1ucyBvZiB0aGUgdGFibGUuICBFYWNoIGBJVGFibGVDb2x1bW5EZWZgIGRlZmluZXMgcHJvcGVydGllcyByZWdhcmRpbmcgdGhlIGRpc3BsYXksIGZvcm1hdHRpbmcgYW5kIGludGVyYWN0aW9uIG9mIHRoZSBjb2x1bW4ncyBjZWxscy5cbiAgICogQ29sdW1uL2NlbGwgY29sb3IgcHJlY2VkZW5jZSBpczpcbiAgICogMSkgYGZpZWxkQ29sb3JgIC0gYWxsb3dzIGFuIGBJVGFibGVDb2x1bW5EZWZgIHRvIGRlbGVnYXRlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBjZWxsIGNvbG9yIHRvIGFuIGBJVGFibGVSb3dJdGVtYCBwcm9wZXJ0eS5cbiAgICogMikgYGNvbG9yR2V0dGVyYC0gYWxsb3dzIGFuIGBJVGFibGVDb2x1bW5EZWZgIHRvIGRlbGVnYXRlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBjZWxsIGNvbG9yIHRvIGEgZnVuY3Rpb24gb2YgdGhlIGBJVGFibGVSb3dJdGVtYCBkZXRlcm1pbmVkIGJ5IHRoZSBkZXZlbG9wZXIuXG4gICAqIDMpIGBjb2xvcmAgLSBhIHByb3BlcnR5IG9mIGFuIGBJVGFibGVDb2x1bW5EZWZgLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGNvbHVtbkRlZnM6IFRhYmxlQ29sdW1uRGVmPGFueT5bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0YWJsZSBpcyBzdHJpcGVkLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIHN0cmlwZWQgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRhYmxlIHJvd3Mgc2hvdWxkIGFwcGx5IGhvdmVyIHN0eWxlcyB3aGVuIGhvdmVyZWQgb3ZlciB2aWEgY3Vyc29yLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGhvdmVyID0gdHJ1ZTtcblxuICAvKipcbiAgICogVGhlIGxheW91dCBhbGdvcml0aG0gdG8gYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0aGUgdGFibGUuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgbGF5b3V0OiAnYXV0bycgfCAnZml4ZWQnID0gJ2F1dG8nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGluZGl2aWR1YWwgcm93cyBjYW4gYmUgc2VsZWN0ZWQuIFdpbGwgYmUgYHRydWVgIGlmIGV4cGxpY2l0bHkgc2V0IHRvIGB0cnVlYCBvciBgY2FuU2VsZWN0QWxsUm93c2AgaXMgYHRydWVgLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIHNldCBjYW5TZWxlY3RSb3dzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fY2FuU2VsZWN0Um93cyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgY2FuU2VsZWN0Um93cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jYW5TZWxlY3RBbGxSb3dzIHx8IHRoaXMuX2NhblNlbGVjdFJvd3MgfHwgISF0aGlzLmJ1bGtBY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYWxsIHJvd3MgY2FuIGJlIHNlbGVjdGVkIGF0IG9uY2UuIFdpbGwgYmUgYHRydWVgIGlmIGV4cGxpY2l0bHkgc2V0IHRvIGB0cnVlYCBvciBpZiBgVGFibGVCdWxrQWN0aW9uc0NvbXBvbmVudGAgaXMgY29udGVudCBwcm9qZWN0ZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGNhblNlbGVjdEFsbFJvd3ModmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9jYW5TZWxlY3RBbGxSb3dzID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNhblNlbGVjdEFsbFJvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NhblNlbGVjdEFsbFJvd3MgfHwgISF0aGlzLmJ1bGtBY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGFjZWhvbGRlciB0ZXh0IGFuZCBlbXB0eSB2YWx1ZSBkaXNwbGF5IHRleHQgZm9yIGA8aW1wZGMtc2VsZWN0PmAgaW5zdGFuY2VzIGluIGNlbGxzIHdpdGggYSBgSVRhYmxlQ29sdW1uRGVmYCBgY29sdW1uVHlwZWAgPSBgU2luZ2xlU2VsZWN0YCBvciBgTXVsdGlTZWxlY3RgLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIHNlbGVjdFBsYWNlaG9sZGVyID0gJyc7XG5cbiAgLyoqXG4gICAqIFRoZSBgY29sdW1uRGVmc2AgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBzb3J0ZWQgY29sdW1uLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIHNvcnRDb2x1bW5JbmRleDogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgY3VycmVudGx5IHNvcnRlZCBjb2x1bW4uXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgc29ydERpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgPSAnYXNjJztcblxuICAvKipcbiAgICogVGhlIHRhYmxlIHJvdyBkYXRhIGFzIGFuIGFycmF5IG9mIGBJVGFibGVSb3dJdGVtYC5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyB0YWJsZURhdGE6IElUYWJsZVJvd0l0ZW1bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgSURzIGZyb20gdGhlIGB0YWJsZURhdGFgIGlucHV0LiAgQXJyYXkgbXVzdCBiZSBvZiB0eXBlIGAoc3RyaW5nIHwgbnVtYmVyKVtdYC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRSb3dJZHModmFsdWU6IChzdHJpbmcgfCBudW1iZXIpW10pIHtcbiAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcyA9IFsuLi52YWx1ZV07XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZFJvd0lkcygpOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX3NlbGVjdGVkUm93SWRzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gY2VsbCByZW5kZXJlciBjb21wb25lbnRzIGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIHRoZSB0YWJsZSBpbnN0YW5jZS5cbiAgICogRm9yIGEgZ2l2ZW4gYElUYWJsZUNvbHVtbkRlZmAgaW4gdGhlIGBjb2x1bW5EZWZzYCBpbnB1dCwgdGhlIGBjZWxsUmVuZGVyZXJDb21wb25lbnRgIHByb3BlcnR5IHNob3VsZCBiZSBzZXQgdG8gdGhlIGtleSBvZiB0aGUgcmVnaXN0ZXJlZCBjb21wb25lbnQgaW4gdGhpcyBpbnB1dC5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21DZWxsQ29tcG9uZW50cz86IElDdXN0b21DZWxsUmVuZGVyZXJDb21wb25lbnRzO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB0ZW1wbGF0ZSBmb3IgY29udGVudCB0aGF0IG1heSBiZSByZW5kZXJlZCBiZWxvdyBhIHJvdyBpbiBhbiBjb2xsYXBzaWJsZSB2aWV3LiBWYWx1ZSBjYW4gZWl0aGVyIGJlIGFuIEFuZ3VsYXIgdGVtcGxhdGUgb3IgYSBmdW5jdGlvbiB0aGF0IGNhbiBldmFsdWF0ZWRcbiAgICogdG8gcmVzb2x2ZSB0byBhIHRlbXBsYXRlLiBUaGUgdGVtcGxhdGUgd2lsbCBiZSByZW5kZXJlZCB3aXRoIGEgcHJvdmlkZWQgYElDb2xsYXBzaWJsZVJvd0NvbnRlbnRDb250ZXh0YCBvYmplY3QgYXMgdGVtcGxhdGUgY29udGV4dCwgd2l0aCB0aGUgY3VycmVudCBgSVRhYmxlUm93RGF0YWBcbiAgICogaW1wbGljaXRseSBhdmFpbGFibGUgYXMgYSBkZWZhdWx0IHRlbXBsYXRlIGtleS5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjb2xsYXBzaWJsZVRlbXBsYXRlOlxuICAgIHwgVGVtcGxhdGVSZWY8SUNvbGxhcHNpYmxlUm93Q29udGVudENvbnRleHQ8YW55Pj5cbiAgICB8IG51bGxcbiAgICB8ICgocm93OiBhbnkpID0+IFRlbXBsYXRlUmVmPElDb2xsYXBzaWJsZVJvd0NvbnRlbnRDb250ZXh0PGFueT4+IHwgbnVsbCkgPVxuICAgIG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBjbGlja2FibGUgY29udHJvbCB0aGF0IHdpbGwgdHJpZ2dlciBleHBhbnNpb24gYW5kIGNvbGxhcHNlIG9mIGNvbnRlbnQgd2hlbiB1c2luZyBgY29sbGFwc2libGVUZW1wbGF0ZWAgZnVuY3Rpb25hbGl0eS5cbiAgICogV2hlbiBzZXQgdG8gYGJ1dHRvbmAsIHRoZSBjb2xsYXBzaWJsZSBjb250ZW50J3Mgc3RhdGUgY2FuIG9ubHkgYmUgdG9nZ2xlZCBmcm9tIGEgY2xpY2thYmxlIGJ1dHRvbiBhdCB0aGUgc3RhcnQgb2YgdGhlIHJvdy5cbiAgICogV2hlbiBzZXQgdG8gYHJvd2AsIHRoZSBlbnRpcmUgcm93IHdpbGwgYmVjb21lIGEgY2xpY2thYmxlIHRyaWdnZXIuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgY29sbGFwc2libGVUcmlnZ2VyOiAnYnV0dG9uJyB8ICdyb3cnID0gJ2J1dHRvbic7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBvbmUgb3IgbXVsdGlwbGUgcm93cyBhcmUgc2VsZWN0ZWQuIEVtaXRzIGAoc3RyaW5nIHwgbnVtYmVyKVtdYCBwYXlsb2FkLlxuICAgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSByb3dTZWxlY3Q6IEV2ZW50RW1pdHRlcjwoc3RyaW5nIHwgbnVtYmVyKVtdPiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjwoc3RyaW5nIHwgbnVtYmVyKVtdPigpO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSBjb2x1bW4gaXMgc29ydGVkLiBFbWl0cyBgSVNvcnRCeVBheWxvYWRgIHBheWxvYWQuXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IHNvcnRCeTogRXZlbnRFbWl0dGVyPElTb3J0QnlQYXlsb2FkPiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxJU29ydEJ5UGF5bG9hZD4oKTtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGEgcm93IGxpbmsgaXMgY2xpY2tlZC4gRW1pdHMgYElUYWJsZUV2ZW50UGF5bG9hZGAgcGF5bG9hZC5cbiAgICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgcmVhZG9ubHkgbGlua0NsaWNrOiBFdmVudEVtaXR0ZXI8SVRhYmxlRXZlbnRQYXlsb2FkPGFueT4+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPElUYWJsZUV2ZW50UGF5bG9hZDxhbnk+PigpO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSByb3cgYWN0aW9uIGlzIGNsaWNrZWQuIEVtaXRzIGFuIGBJVGFibGVSb3dBY3Rpb25QYXlsb2FkYCBwYXlsb2FkLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZWFkb25seSByb3dBY3Rpb25DbGljazogRXZlbnRFbWl0dGVyPElUYWJsZVJvd0FjdGlvblBheWxvYWQ8YW55Pj4gPVxuICAgIG5ldyBFdmVudEVtaXR0ZXI8SVRhYmxlUm93QWN0aW9uUGF5bG9hZDxhbnk+PigpO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSByb3cgaW5wdXQgdmFsdWUgaXMgY2hhbmdlZC4gRW1pdHRlZCBjZWxscyBvZiBgY29sdW1uVHlwZWAgYFNpbmdsZVNlbGVjdGAsIGBNdWx0aVNlbGVjdGAsIGBJbnB1dGAsIGBCb29sZWFuYCBvciBgSWNvbmAuXG4gICAqIE5vdCBlbWl0dGVkIGlmIGNvbHVtbiBkZWZpbml0aW9uIHByb3BlcnR5IGBkaXNhYmxlZGAgPSBgdHJ1ZWAuIEVtaXRzIGBJVGFibGVFdmVudFBheWxvYWRgIHBheWxvYWQuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHJlYWRvbmx5IGlucHV0Q2hhbmdlOiBFdmVudEVtaXR0ZXI8SVRhYmxlRXZlbnRQYXlsb2FkPGFueT4+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPElUYWJsZUV2ZW50UGF5bG9hZDxhbnk+PigpO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSByb3cgd2l0aCBjb2xsYXBzaWJsZSBjb250ZW50IGhhcyBpdHMgY29sbGFwc2Ugc3RhdGUgY2hhbmdlZC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcmVhZG9ubHkgcm93Q29sbGFwc2VDaGFuZ2U6IEV2ZW50RW1pdHRlcjxcbiAgICBJVGFibGVSb3dDb2xsYXBzZUNoYW5nZTxhbnk+XG4gID4gPSBuZXcgRXZlbnRFbWl0dGVyPElUYWJsZVJvd0NvbGxhcHNlQ2hhbmdlPGFueT4+KCk7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgQENvbnRlbnRDaGlsZChQYWdpbmF0aW9uQ29tcG9uZW50KVxuICBwdWJsaWMgcGFnaW5hdGlvbkNvbXBvbmVudD86IFBhZ2luYXRpb25Db21wb25lbnQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgQENvbnRlbnRDaGlsZChUYWJsZUJ1bGtBY3Rpb25zQ29tcG9uZW50KVxuICBwdWJsaWMgYnVsa0FjdGlvbnM/OiBUYWJsZUJ1bGtBY3Rpb25zQ29tcG9uZW50ID0gdW5kZWZpbmVkO1xuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyByZWFkb25seSBjZWxsVHlwZSA9IFRhYmxlQ29sdW1uVHlwZTtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGFsbFNlbGVjdGVkID0gdHJ1ZTtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGdldCBzb21lU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdGhpcy5fc2VsZWN0ZWRSb3dJZHMgJiZcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICEhdGhpcy50YWJsZURhdGEgJiZcbiAgICAgIHRoaXMudGFibGVEYXRhLmxlbmd0aCA+IDAgJiZcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLmxlbmd0aCA8IHRoaXMudGFibGVEYXRhLmxlbmd0aFxuICAgICk7XG4gIH1cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJyYW5kZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgZ2V0IHRhYmxlU3BhbigpOiBudW1iZXIge1xuICAgIGxldCBjb2xzID0gdGhpcy5jb2x1bW5EZWZzLmxlbmd0aDtcblxuICAgIGlmICh0aGlzLmNhblNlbGVjdFJvd3MpIHtcbiAgICAgIGNvbHMrKztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb2xsYXBzaWJsZVRlbXBsYXRlKSB7XG4gICAgICBjb2xzKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHM7XG4gIH1cblxuICBwcml2YXRlIF9jYW5TZWxlY3RSb3dzID0gZmFsc2U7XG4gIHByaXZhdGUgX2NhblNlbGVjdEFsbFJvd3MgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSb3dJZHM6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5wdXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElUYWJsZUV2ZW50UGF5bG9hZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kYXRlUGlwZTogRGF0ZVBpcGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcGVyY2VudFBpcGU6IFBlcmNlbnRQaXBlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RlY21pYWxQaXBlOiBEZWNpbWFsUGlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgQEhvc3QoKSBwcml2YXRlIF9icmFuZGVkOiBCcmFuZGVkRGlyZWN0aXZlXG4gICkge1xuICAgIHRoaXMuYnJhbmRlZCA9IF9icmFuZGVkID8gdHJ1ZSA6IGZhbHNlO1xuICAgIHRoaXMuX2lucHV0Q2hhbmdlXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoREVCT1VOQ0VfVElNRSkpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMuaW5wdXRDaGFuZ2UpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZFJvd0lkcyddIHx8IGNoYW5nZXNbJ3RhYmxlRGF0YSddKSB7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLnRhYmxlRGF0YSB8fFxuICAgICAgICAhdGhpcy50YWJsZURhdGEubGVuZ3RoIHx8XG4gICAgICAgICF0aGlzLnNlbGVjdGVkUm93SWRzIHx8XG4gICAgICAgICF0aGlzLnNlbGVjdGVkUm93SWRzLmxlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkUm93SWRzLmxlbmd0aCA+PSB0aGlzLnRhYmxlRGF0YS5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGdldE1haWxUb1ZhbHVlKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgY3VycmVudFJvdzogSVRhYmxlUm93SXRlbVxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgY29sdW1uVHlwZSwgdHJ1bmNhdGVkOiB0cnVuY2F0ZWQgfSA9XG4gICAgICB0aGlzLl9nZXRDb2x1bW5EZWZCeUluZGV4KGNvbHVtbkluZGV4KTtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLl9nZXRWYWx1ZShjb2x1bW5JbmRleCwgY3VycmVudFJvdyk7XG5cbiAgICBpZiAoY29sdW1uVHlwZSAhPT0gVGFibGVDb2x1bW5UeXBlLkVtYWlsKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgdmFsdWUgPSB2YWx1ZSA/IGBtYWlsdG86JHt2YWx1ZX1gIDogdmFsdWU7XG5cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBnZXRTdHJpbmdWYWx1ZShcbiAgICBjb2x1bW5JbmRleDogbnVtYmVyLFxuICAgIGN1cnJlbnRSb3c6IElUYWJsZVJvd0l0ZW1cbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoY29sdW1uSW5kZXgsIGN1cnJlbnRSb3cpO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuam9pbignOycpO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGdldFZhbHVlKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgY3VycmVudFJvdzogSVRhYmxlUm93SXRlbVxuICApOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgY29uc3QgeyBjb2x1bW5UeXBlLCB0cnVuY2F0ZWQ6IHRydW5jYXRlZCB9ID1cbiAgICAgIHRoaXMuX2dldENvbHVtbkRlZkJ5SW5kZXgoY29sdW1uSW5kZXgpO1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuX2dldFZhbHVlKGNvbHVtbkluZGV4LCBjdXJyZW50Um93KTtcblxuICAgIHN3aXRjaCAoY29sdW1uVHlwZSkge1xuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuRGVjaW1hbDoge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuX2RlY21pYWxQaXBlLnRyYW5zZm9ybShOdW1iZXIodmFsdWUpIHx8IDApIHx8ICcnO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgVGFibGVDb2x1bW5UeXBlLkRhdGU6IHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICBjb25zdCB2YWxpZERhdGUgPSBkYXRlIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4oZGF0ZS5nZXRUaW1lKCkpO1xuICAgICAgICB2YWx1ZSA9IHZhbGlkRGF0ZVxuICAgICAgICAgID8gdGhpcy5fZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGUsICdNTS9kZC95eXl5JykgfHwgJydcbiAgICAgICAgICA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuRGF0ZVRpbWU6IHtcbiAgICAgICAgY29uc3QgZGF0ZVRpbWUgPSBuZXcgRGF0ZShTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgY29uc3QgdmFsaWREYXRlVGltZSA9XG4gICAgICAgICAgZGF0ZVRpbWUgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTihkYXRlVGltZS5nZXRUaW1lKCkpO1xuICAgICAgICB2YWx1ZSA9IHZhbGlkRGF0ZVRpbWVcbiAgICAgICAgICA/IHRoaXMuX2RhdGVQaXBlLnRyYW5zZm9ybShkYXRlVGltZSwgJ01NL2RkL3l5eXkgaDptbTpzcyBhJykgfHwgJydcbiAgICAgICAgICA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuTGluazoge1xuICAgICAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSkucmVwbGFjZSgvKF5cXHcrOnxeKVxcL1xcLy8sICcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFRhYmxlQ29sdW1uVHlwZS5QZXJjZW50YWdlOiB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5fcGVyY2VudFBpcGUudHJhbnNmb3JtKE51bWJlcih2YWx1ZSkgfHwgMCkgfHwgJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuVXJsOiB7XG4gICAgICAgIGlmICghLyhodHRwKHM/KSk6XFwvXFwvL2kudGVzdChTdHJpbmcodmFsdWUpKSkge1xuICAgICAgICAgIHZhbHVlID0gYGh0dHBzOi8vJHt2YWx1ZX1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuVGV4dDoge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmpvaW4oJzsgJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRydW5jYXRlZCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRydW5jYXRlU3RyaW5nID0gKHN0cmluZyA9ICcnLCBtYXhMZW5ndGggPSB0cnVuY2F0ZWQpID0+XG4gICAgICAgICAgc3RyaW5nLmxlbmd0aCA+IG1heExlbmd0aFxuICAgICAgICAgICAgPyBgJHtzdHJpbmcuc3Vic3RyaW5nKDAsIG1heExlbmd0aCl94oCmYFxuICAgICAgICAgICAgOiBzdHJpbmc7XG5cbiAgICAgICAgISF0cnVuY2F0ZWRcbiAgICAgICAgICA/ICh2YWx1ZSA9IHRydW5jYXRlU3RyaW5nKFN0cmluZyh2YWx1ZSksIHRydW5jYXRlZCkpXG4gICAgICAgICAgOiB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFRhYmxlQ29sdW1uVHlwZS5NdWx0aVNlbGVjdDpcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0KCc7Jyk/Lm1hcCh2ID0+IHYudHJpbSgpKSB8fCBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgZ2V0UmF3VmFsdWUoXG4gICAgY29sdW1uSW5kZXg6IG51bWJlcixcbiAgICBjdXJyZW50Um93OiBJVGFibGVSb3dJdGVtXG4gICk6IElUYWJsZVJvd0l0ZW1WYWx1ZVR5cGVzIHtcbiAgICBjb25zdCB7IGZpZWxkIH0gPSB0aGlzLl9nZXRDb2x1bW5EZWZCeUluZGV4KGNvbHVtbkluZGV4KTtcblxuICAgIGlmICghZmllbGQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFJvd1tmaWVsZF0gfHwgJyc7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgZ2V0Q2VsbENvbG9yKFxuICAgIGNvbHVtbkRlZmluaXRpb246IFRhYmxlQ29sdW1uRGVmLFxuICAgIGl0ZW06IElUYWJsZVJvd0l0ZW1cbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gVGFibGVUaGVtZUhlbHBlci5nZXRDZWxsQ29sb3IoY29sdW1uRGVmaW5pdGlvbiwgaXRlbSk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgZ2V0VGhlbWUoXG4gICAgY29sdW1uRGVmaW5pdGlvbjogVGFibGVDb2x1bW5EZWYsXG4gICAgaXRlbTogSVRhYmxlUm93SXRlbVxuICApOiBDb21wb25lbnRUaGVtZSB7XG4gICAgcmV0dXJuIChcbiAgICAgIFRhYmxlVGhlbWVIZWxwZXIuZ2V0VGhlbWUoY29sdW1uRGVmaW5pdGlvbiwgaXRlbSkgfHxcbiAgICAgIENvbXBvbmVudFRoZW1lLlByaW1hcnlcbiAgICApO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGlzU29ydGVkQ29sdW1uKGNvbHVtbkluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY29sdW1uSW5kZXggPT09IHRoaXMuc29ydENvbHVtbkluZGV4O1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGlzUm93U2VsZWN0ZWQoaWQ6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUm93SWRzLmluY2x1ZGVzKGlkKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBoYW5kbGVTZWxlY3RBbGwoZXZlbnQ6IENoZWNrYm94Q2hhbmdlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuU2VsZWN0QWxsUm93cyB8fCAhdGhpcy50YWJsZURhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuY2hlY2tlZCkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dJZHMgPSB0aGlzLnRhYmxlRGF0YT8ubWFwKHJvdyA9PiByb3cuaWQpIHx8IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcyA9IFtdO1xuICAgIH1cblxuICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLnNvcnQoKTtcbiAgICB0aGlzLmFsbFNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZFJvd0lkcy5sZW5ndGggPj0gdGhpcy50YWJsZURhdGEubGVuZ3RoO1xuXG4gICAgdGhpcy5yb3dTZWxlY3QuZW1pdCh0aGlzLnNlbGVjdGVkUm93SWRzKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBoYW5kbGVTb3J0KGNvbHVtbkluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoY29sdW1uSW5kZXggPT09IHRoaXMuc29ydENvbHVtbkluZGV4KSB7XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSB0aGlzLnNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc29ydENvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb24gPSAnYXNjJztcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2dldENvbHVtbkRlZkJ5SW5kZXgoY29sdW1uSW5kZXgpLmZpZWxkIHx8ICcnO1xuXG4gICAgdGhpcy5zb3J0QnkuZW1pdCh7XG4gICAgICBjb2x1bW5JbmRleCxcbiAgICAgIGZpZWxkLFxuICAgICAgZGlyZWN0aW9uOiB0aGlzLnNvcnREaXJlY3Rpb25cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBoYW5kbGVSb3dTZWxlY3QoXG4gICAgZXZlbnQ6IENoZWNrYm94Q2hhbmdlRXZlbnQsXG4gICAgcm93SWQ6IG51bWJlciB8IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuU2VsZWN0Um93cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5jaGVja2VkICYmICF0aGlzLl9zZWxlY3RlZFJvd0lkcy5pbmNsdWRlcyhyb3dJZCkpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLnB1c2gocm93SWQpO1xuICAgIH0gZWxzZSBpZiAoIWV2ZW50LmNoZWNrZWQgJiYgdGhpcy5fc2VsZWN0ZWRSb3dJZHMuaW5jbHVkZXMocm93SWQpKSB7XG4gICAgICBjb25zdCBpZHggPSB0aGlzLl9zZWxlY3RlZFJvd0lkcy5pbmRleE9mKHJvd0lkKTtcbiAgICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2VsZWN0ZWRSb3dJZHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5zb3J0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5hbGxTZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRSb3dJZHMubGVuZ3RoID49IHRoaXMudGFibGVEYXRhLmxlbmd0aDtcbiAgICB0aGlzLnJvd1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRSb3dJZHMpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGhhbmRsZUNlbGxWYWx1ZUNoYW5nZShcbiAgICBjb2x1bW5JbmRleDogbnVtYmVyLFxuICAgIHJvd0luZGV4OiBudW1iZXIsXG4gICAgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBzdHJpbmdbXVxuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IGZpZWxkLCBjb2x1bW5UeXBlIH0gPSB0aGlzLl9nZXRDb2x1bW5EZWZCeUluZGV4KGNvbHVtbkluZGV4KTtcbiAgICBsZXQgY3VycmVudFZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgc3RyaW5nW10gPSB2YWx1ZTtcblxuICAgIGlmIChjb2x1bW5UeXBlICE9PSBUYWJsZUNvbHVtblR5cGUuQm9vbGVhbiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9IGlzTmFOKE51bWJlcih2YWx1ZSkpID8gdmFsdWUgOiBOdW1iZXIodmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBpdGVtID0gdGhpcy50YWJsZURhdGFbcm93SW5kZXhdO1xuXG4gICAgc2V0TmVzdGVkVmFsdWUoaXRlbSwgU3RyaW5nKGZpZWxkKSwgY3VycmVudFZhbHVlKTtcblxuICAgIHRoaXMuX2lucHV0Q2hhbmdlLmVtaXQoe1xuICAgICAgY29sdW1uSW5kZXgsXG4gICAgICBpdGVtLFxuICAgICAgdmFsdWU6IGN1cnJlbnRWYWx1ZVxuICAgIH0pO1xuXG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGhhbmRsZUxpbmtDbGljayhcbiAgICBjb2x1bW5JbmRleDogbnVtYmVyLFxuICAgIGl0ZW06IElUYWJsZVJvd0l0ZW0sXG4gICAgZXZlbnQ6IEV2ZW50XG4gICk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLmxpbmtDbGljay5lbWl0KHtcbiAgICAgIGl0ZW0sXG4gICAgICBjb2x1bW5JbmRleFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGhhbmRsZUFjdGlvbkNsaWNrKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgaXRlbTogSVRhYmxlUm93SXRlbSxcbiAgICBhY3Rpb25BcGlOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgdGhpcy5yb3dBY3Rpb25DbGljay5lbWl0KHtcbiAgICAgIGl0ZW0sXG4gICAgICBjb2x1bW5JbmRleCxcbiAgICAgIGFjdGlvbkFwaU5hbWVcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2x1bW5EZWZJc0FjdGlvbnMoXG4gICAgY29sdW1uRGVmOiBUYWJsZUNvbHVtbkRlZjxhbnk+XG4gICk6IGNvbHVtbkRlZiBpcyBJVGFibGVBY3Rpb25zQ29sdW1uRGVmPGFueT4ge1xuICAgIHJldHVybiBjb2x1bW5EZWYuY29sdW1uVHlwZSA9PT0gVGFibGVDb2x1bW5UeXBlLkFjdGlvbnM7XG4gIH1cblxuICBwcm90ZWN0ZWQgdHJ5VG9nZ2xlQ29sbGFwc2UoXG4gICAgY29sbGFwc2libGVGb3JSb3dSZXN1bHQ6IHtcbiAgICAgIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJQ29sbGFwc2libGVSb3dDb250ZW50Q29udGV4dD4gfCBudWxsO1xuICAgIH0sXG4gICAgbmdiQ29sbGFwc2U6IE5nYkNvbGxhcHNlLFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBzb3VyY2U6ICdidXR0b24nIHwgJ3JvdydcbiAgKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgY29sbGFwc2libGVGb3JSb3dSZXN1bHQudGVtcGxhdGUgJiZcbiAgICAgICh0aGlzLmNvbGxhcHNpYmxlVHJpZ2dlciA9PT0gJ3JvdycgfHwgdGhpcy5jb2xsYXBzaWJsZVRyaWdnZXIgPT09IHNvdXJjZSlcbiAgICApIHtcbiAgICAgIG5nYkNvbGxhcHNlLnRvZ2dsZSgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldENvbGxhcHNpYmxlVGVtcGxhdGVGb3JSb3cocm93OiBJVGFibGVSb3dJdGVtKToge1xuICAgIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJQ29sbGFwc2libGVSb3dDb250ZW50Q29udGV4dD4gfCBudWxsO1xuICB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGVtcGxhdGU6XG4gICAgICAgIHRoaXMuY29sbGFwc2libGVUZW1wbGF0ZSAmJlxuICAgICAgICB0eXBlb2YgdGhpcy5jb2xsYXBzaWJsZVRlbXBsYXRlID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyB0aGlzLmNvbGxhcHNpYmxlVGVtcGxhdGUocm93KVxuICAgICAgICAgIDogdGhpcy5jb2xsYXBzaWJsZVRlbXBsYXRlXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbHVtbkRlZkJ5SW5kZXgoY29sdW1uSW5kZXg6IG51bWJlcik6IFRhYmxlQ29sdW1uRGVmIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5EZWZzW2NvbHVtbkluZGV4XTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFZhbHVlKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgY3VycmVudFJvdzogSVRhYmxlUm93SXRlbVxuICApOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgZmllbGQsIHZhbHVlR2V0dGVyIH0gPSB0aGlzLl9nZXRDb2x1bW5EZWZCeUluZGV4KGNvbHVtbkluZGV4KTtcblxuICAgICAgY29uc3QgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdID0gdmFsdWVHZXR0ZXJcbiAgICAgICAgPyB2YWx1ZUdldHRlcihjdXJyZW50Um93KVxuICAgICAgICA6IChnZXROZXN0ZWRWYWx1ZShjdXJyZW50Um93LCBTdHJpbmcoZmllbGQpLCAnJykgYXMgc3RyaW5nIHwgc3RyaW5nW10pO1xuXG4gICAgICByZXR1cm4gdmFsdWUgfHwgJyc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxufVxuIiwiQGlmICh0YWJsZURhdGEpIHtcbiAgPHRhYmxlXG4gICAgaW1wZGNUYWJsZVxuICAgIFtzdHJpcGVkXT1cInN0cmlwZWQgJiYgIWNvbGxhcHNpYmxlVGVtcGxhdGVcIlxuICAgIFtsYXlvdXRdPVwibGF5b3V0XCJcbiAgICBbaG92ZXJdPVwiaG92ZXJcIj5cbiAgICA8dGhlYWQ+XG4gICAgICBAaWYgKCEhYnVsa0FjdGlvbnMpIHtcbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aCBbYXR0ci5jb2xzcGFuXT1cInRhYmxlU3BhblwiIHNjb3BlPVwiY29sXCIgY2xhc3M9XCJidWxrLWFjdGlvbi1jb2x1bW5cIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImltcGRjLXRhYmxlLWJ1bGstYWN0aW9uc1wiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltpbXBkY1RhYmxlQnVsa0FjdGlvbnNdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICB9XG4gICAgICA8dHI+XG4gICAgICAgIEBpZiAoY29sbGFwc2libGVUZW1wbGF0ZSkge1xuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgW2NsYXNzLmhlYWRpbmctYmVsb3ctYnVsay1hY3Rpb25zXT1cIiEhYnVsa0FjdGlvbnNcIlxuICAgICAgICAgICAgY2xhc3M9XCJpbXBkYy10YWJsZS1jb2xsYXBzaWJsZS1jb250ZW50LXJvdy1idXR0b24tY29udGFpbmVyXCI+PC90aD5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGNhblNlbGVjdFJvd3MpIHtcbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaW1wZGMtdGFibGUtc2VsZWN0YWJsZS1yb3ctdG9nZ2xlLWNvbnRhaW5lclwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICdoZWFkaW5nLWJlbG93LWJ1bGstYWN0aW9ucyc6ICEhYnVsa0FjdGlvbnNcbiAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgIEBpZiAoY2FuU2VsZWN0QWxsUm93cykge1xuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxpbXBkYy1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgbmdNb2RlbFxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic29tZVNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlU2VsZWN0QWxsKCRldmVudClcIj48L2ltcGRjLWNoZWNrYm94PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICB9XG4gICAgICAgIEBmb3IgKFxuICAgICAgICAgIGNvbHVtbkRlZiBvZiBjb2x1bW5EZWZzO1xuICAgICAgICAgIHRyYWNrIGNvbHVtbkRlZjtcbiAgICAgICAgICBsZXQgY29sdW1uSW5kZXggPSAkaW5kZXhcbiAgICAgICAgKSB7XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICdzb3J0ZWQtY29sdW1uJzogaXNTb3J0ZWRDb2x1bW4oY29sdW1uSW5kZXgpLFxuICAgICAgICAgICAgICAnc29ydGFibGUtY29sdW1uJzogY29sdW1uRGVmLnNvcnRlZCxcbiAgICAgICAgICAgICAgJ2hlYWRpbmctYmVsb3ctYnVsay1hY3Rpb25zJzogISFidWxrQWN0aW9uc1xuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlU29ydChjb2x1bW5JbmRleClcIj5cbiAgICAgICAgICAgIDxpbXBkYy1jb2x1bW4taGVhZGluZ1xuICAgICAgICAgICAgICBbaXNTb3J0YWJsZV09XCJjb2x1bW5EZWYuc29ydGVkIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgW2NvbHVtbkluZGV4XT1cImNvbHVtbkluZGV4XCJcbiAgICAgICAgICAgICAgW3NvcnRDb2x1bW5JbmRleF09XCJzb3J0Q29sdW1uSW5kZXhcIlxuICAgICAgICAgICAgICBbZGlyZWN0aW9uXT1cInNvcnREaXJlY3Rpb25cIlxuICAgICAgICAgICAgICBbdGV4dF09XCJjb2x1bW5EZWYudGl0bGVcIlxuICAgICAgICAgICAgICAoc29ydCk9XCJoYW5kbGVTb3J0KCRldmVudClcIj5cbiAgICAgICAgICAgIDwvaW1wZGMtY29sdW1uLWhlYWRpbmc+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgfVxuICAgICAgPC90cj5cbiAgICA8L3RoZWFkPlxuICAgIDx0Ym9keT5cbiAgICAgIEBpZiAobG9hZGluZykge1xuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwidGFibGVTcGFuXCIgY2xhc3M9XCJkYXRhLWxvYWRpbmdcIj5cbiAgICAgICAgICAgIDxpbXBkYy1zcGlubmVyPjwvaW1wZGMtc3Bpbm5lcj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIEBmb3IgKFxuICAgICAgICAgIHJvdyBvZiB0YWJsZURhdGE7XG4gICAgICAgICAgdHJhY2sgcm93LmlkO1xuICAgICAgICAgIGxldCByb3dJbmRleCA9ICRpbmRleDtcbiAgICAgICAgICBsZXQgcm93Rmlyc3QgPSAkZmlyc3Q7XG4gICAgICAgICAgbGV0IHJvd0xhc3QgPSAkbGFzdDtcbiAgICAgICAgICBsZXQgcm93RXZlbiA9ICRldmVuO1xuICAgICAgICAgIGxldCByb3dPZGQgPSAkb2RkXG4gICAgICAgICkge1xuICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICBnZXRDb2xsYXBzaWJsZVRlbXBsYXRlRm9yUm93KHJvdyk7XG4gICAgICAgICAgICBhcyBjb2xsYXBzaWJsZVRlbXBsYXRlRm9yUm93XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgW2NsYXNzLmltcGRjLXRhYmxlLWNvbGxhcHNpYmxlLXJvdy10cmlnZ2VyXT1cIlxuICAgICAgICAgICAgICAgIGNvbGxhcHNpYmxlVHJpZ2dlciA9PT0gJ3JvdydcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnRhYmxlLWFjdGl2ZV09XCJpc1Jvd1NlbGVjdGVkKHJvdy5pZClcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgdHJ5VG9nZ2xlQ29sbGFwc2UoXG4gICAgICAgICAgICAgICAgICBjb2xsYXBzaWJsZVRlbXBsYXRlRm9yUm93LFxuICAgICAgICAgICAgICAgICAgbmdiQ29sbGFwc2UsXG4gICAgICAgICAgICAgICAgICAkZXZlbnQsXG4gICAgICAgICAgICAgICAgICAncm93J1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgIEBpZiAoY29sbGFwc2libGVUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbXBkYy10YWJsZS1jb2xsYXBzaWJsZS1jb250ZW50LXJvdy1idXR0b24tY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5vcGVuZWRdPVwiIWNvbGxhcHNlTW9uaXRvci5uZ2JDb2xsYXBzaW5nKClcIj5cbiAgICAgICAgICAgICAgICAgIEBpZiAoY29sbGFwc2libGVUZW1wbGF0ZUZvclJvdy50ZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlUb2dnbGVDb2xsYXBzZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzaWJsZVRlbXBsYXRlRm9yUm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nYkNvbGxhcHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnV0dG9uJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbXBkYy10YWJsZS1jb2xsYXBzaWJsZS1jb250ZW50LXJvdy1idXR0b24gYnRuIGJ0bi1saW5rXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhciBmYS1jaGV2cm9uLXJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmZhLXJvdGF0ZS05MF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY29sbGFwc2VNb25pdG9yLm5nYkNvbGxhcHNpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChjYW5TZWxlY3RSb3dzKSB7XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiaW1wZGMtdGFibGUtc2VsZWN0YWJsZS1yb3ctdG9nZ2xlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGltcGRjLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiaXNSb3dTZWxlY3RlZChyb3cuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZVJvd1NlbGVjdCgkZXZlbnQsIHJvdy5pZClcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj48L2ltcGRjLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgIGxldCBjb2x1bW5EZWYgb2YgY29sdW1uRGVmcztcbiAgICAgICAgICAgICAgICAgIGluZGV4IGFzIGNvbEluZGV4O1xuICAgICAgICAgICAgICAgICAgbGFzdCBhcyBpc0xhc3RcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICdjb2wtbm8tcGFkZGluZyc6ICEhY29sdW1uRGVmLm5vUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgICdhY3Rpb25zLWNvbHVtbic6IGNvbHVtbkRlZi5jb2x1bW5UeXBlID09PSBjZWxsVHlwZS5BY3Rpb25zXG4gICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICBAc3dpdGNoIChjb2x1bW5EZWYuY29sdW1uVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBAY2FzZSAoY2VsbFR5cGUuQmFkZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbXBkYy1iYWRnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCJnZXRTdHJpbmdWYWx1ZShjb2xJbmRleCwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGVtZV09XCJnZXRUaGVtZShjb2x1bW5EZWYsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaW1wZGMtYmFkZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5MaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cImhhbmRsZUxpbmtDbGljayhjb2xJbmRleCwgcm93LCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKCFicmFuZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGluay1wcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0VmFsdWUoY29sSW5kZXgsIHJvdykgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGltcGRjQnJhbmRlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5VcmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWJyYW5kZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmhyZWZdPVwiZ2V0VmFsdWUoY29sSW5kZXgsIHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBkY0JyYW5kZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmhyZWZdPVwiZ2V0VmFsdWUoY29sSW5kZXgsIHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5FbWFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghYnJhbmRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaHJlZl09XCInbWFpbHRvOicgKyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldFZhbHVlKGNvbEluZGV4LCByb3cpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGRjQnJhbmRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmhyZWZdPVwiZ2V0TWFpbFRvVmFsdWUoY29sSW5kZXgsIHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5JbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGltcGRjSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7IGdldENlbGxDb2xvcihjb2x1bW5EZWYsIHJvdykgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJnZXRWYWx1ZShjb2xJbmRleCwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNlbGxWYWx1ZUNoYW5nZShjb2xJbmRleCwgcm93SW5kZXgsICRldmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5Cb29sZWFuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWYuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoY29sSW5kZXgsIHJvdykgPT09ICd0cnVlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wZGMtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJjaGVja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7eyBnZXRDZWxsQ29sb3IoY29sdW1uRGVmLCByb3cpIH19XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoIWNvbHVtbkRlZi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1wZGMtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJnZXRWYWx1ZShjb2xJbmRleCwgcm93KSA9PT0gJ3RydWUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNTd2l0Y2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNlbGxWYWx1ZUNoYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQuY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPjwvaW1wZGMtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5TaW5nbGVTZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbXBkYy1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiZ2V0VmFsdWUoY29sSW5kZXgsIHJvdylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uRGVmLmRpc2FibGVkIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlbGVjdFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dDbGVhcj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNlbGxWYWx1ZUNoYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAodmFsdWUgb2YgY29sdW1uRGVmLnZhbHVlcyB8fCBbXTsgdHJhY2sgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1wZGMtc2VsZWN0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJ2YWx1ZS5sYWJlbFwiPjwvaW1wZGMtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9pbXBkYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5NdWx0aVNlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltcGRjLXNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJnZXRWYWx1ZShjb2xJbmRleCwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW5EZWYuZGlzYWJsZWQgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VsZWN0UGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNlbGxWYWx1ZUNoYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAodmFsdWUgb2YgY29sdW1uRGVmLnZhbHVlcyB8fCBbXTsgdHJhY2sgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1wZGMtc2VsZWN0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJ2YWx1ZS5sYWJlbFwiPjwvaW1wZGMtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9pbXBkYy1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5DZWxsUmVuZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ7eyBnZXRDZWxsQ29sb3IoY29sdW1uRGVmLCByb3cpIH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wZGNUYWJsZUluamVjdENvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uRGVmXT1cImNvbHVtbkRlZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dJdGVtXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXN0b21DZWxsQ29tcG9uZW50c109XCJjdXN0b21DZWxsQ29tcG9uZW50cyB8fCB7fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRSYXdWYWx1ZShjb2xJbmRleCwgcm93KVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChjZWxsVHlwZS5JY29uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBkYy1pY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImNvbHVtbkRlZi5pY29uTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3sgZ2V0Q2VsbENvbG9yKGNvbHVtbkRlZiwgcm93KSB9fVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKGNlbGxUeXBlLkFjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gd2lsbCBhbHdheXMgcmV0dXJuICd0cnVlJywgYnV0IG5lZWRlZCB0byBzYXRpc2Z5IHRoZSB0eXBlIGVuZ2luZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY29sdW1uRGVmSXNBY3Rpb25zKGNvbHVtbkRlZikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGltcGRjLXJvdy1hY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbkRlZl09XCJjb2x1bW5EZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dJdGVtXT1cInJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhc3RDb2x1bW5dPVwiaXNMYXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWN0aW9uQ2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVBY3Rpb25DbGljayhjb2xJbmRleCwgcm93LCAkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj48L2ltcGRjLXJvdy1hY3Rpb25zPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ7eyBnZXRDZWxsQ29sb3IoY29sdW1uRGVmLCByb3cpIH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICBjbGFzcz1cImltcGRjLXRhYmxlLWNvbGxhcHNpYmxlLWNvbnRlbnQtcm93XCJcbiAgICAgICAgICAgICAgW2NsYXNzLm9wZW5lZF09XCIhY29sbGFwc2VNb25pdG9yLm5nYkNvbGxhcHNpbmcoKVwiPlxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3LTEwMCBwLTBcIiBbYXR0ci5jb2xzcGFuXT1cInRhYmxlU3BhblwiPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW1wZGMtdGFibGUtY29sbGFwc2libGUtY29udGVudC1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgI25nYkNvbGxhcHNlPVwibmdiQ29sbGFwc2VcIlxuICAgICAgICAgICAgICAgICAgI2NvbGxhcHNlTW9uaXRvcj1cImltcGRjQ29sbGFwc2VNb25pdG9yXCJcbiAgICAgICAgICAgICAgICAgIFtpbXBkY0NvbGxhcHNlTW9uaXRvcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIChjb2xsYXBzZUNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgcm93Q29sbGFwc2VDaGFuZ2UuZW1pdCh7IHJvdywgY29sbGFwc2VkOiAkZXZlbnQgfSlcbiAgICAgICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICAgICAgQGlmIChjb2xsYXBzaWJsZVRlbXBsYXRlRm9yUm93LnRlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2libGVUZW1wbGF0ZUZvclJvdy50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogcm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZDogY29sbGFwc2VNb25pdG9yLmNvbGxhcHNlZCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBpc1Jvd1NlbGVjdGVkKHJvdy5pZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHJvd0luZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0OiAhIXJvd0ZpcnN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Q6ICEhcm93TGFzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVuOiAhIXJvd0V2ZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2RkOiAhIXJvd09kZFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIH1cbiAgICAgICAgfSBAZW1wdHkge1xuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cInRhYmxlU3BhblwiIGNsYXNzPVwibm8tZGF0YVwiPlxuICAgICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbm9EYXRhXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvdGJvZHk+XG4gICAgPHRmb290PlxuICAgICAgQGlmIChwYWdpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJ0YWJsZVNwYW5cIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50XG4gICAgICAgICAgICAgIHNlbGVjdD1cImltcGRjLXBhZ2luYXRpb24sIGRpdltpbXBkYy1wYWdpbmF0aW9uXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgfVxuICAgIDwvdGZvb3Q+XG4gIDwvdGFibGU+XG59XG4iXX0=
|