@messaia/cdk 18.2.3 → 19.0.0-rc02
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/fesm2022/messaia-cdk.mjs +1592 -1239
- package/fesm2022/messaia-cdk.mjs.map +1 -1
- package/lib/base/base.module.d.ts +14 -13
- package/lib/base/components/base.component.d.ts +1 -1
- package/lib/base/components/generic-embedded-list.component.d.ts +1 -1
- package/lib/base/components/generic-form-base.component.d.ts +3 -2
- package/lib/base/components/generic-form.component.d.ts +1 -1
- package/lib/base/components/generic-list.component.d.ts +23 -3
- package/lib/base/components/generic-reactive-form.component.d.ts +1 -1
- package/lib/base/constants/common.d.ts +2 -0
- package/lib/base/helpers/auth-helper.d.ts +1 -1
- package/lib/chips/components/chips.component.d.ts +5 -16
- package/lib/common/functions/utils.d.ts +1 -1
- package/lib/common/helpers/app-storage.d.ts +1 -1
- package/lib/common/styles/_layout.scss +1 -1
- package/lib/common/styles/_variables.scss +4 -25
- package/lib/common/styles/colors/_colors-dark.scss +2 -0
- package/lib/common/styles/colors/_colors.scss +34 -4
- package/lib/common/styles/core/_button.scss +7 -21
- package/lib/common/styles/core/_card.scss +19 -88
- package/lib/common/styles/core/_core.scss +10 -21
- package/lib/common/styles/core/_overrides.scss +45 -0
- package/lib/common/styles/core/_sidenav.scss +9 -7
- package/lib/common/styles/core/_structure.scss +4 -11
- package/lib/common/styles/font/_font.scss +5 -13
- package/lib/common/styles/m2/_common-theme.scss +10 -10
- package/lib/common/styles/m2/platform.scss +13 -0
- package/lib/common/styles/m3/_common-theme.scss +27 -10
- package/lib/common/styles/m3/platform.scss +13 -0
- package/lib/common/styles/utilities/_general.scss +522 -492
- package/lib/common/styles/utilities/_pull.scss +23 -30
- package/lib/common/styles/utilities/_push.scss +23 -30
- package/lib/common/styles/utilities/_size.scss +3 -3
- package/lib/common/styles/utilities/_utilities.scss +14 -14
- package/lib/common/theming/_m2-all-theme.scss +4 -11
- package/lib/form-validators/directives/base-directive.d.ts +1 -1
- package/lib/form-validators/directives/template-validations/base-validator.directive.d.ts +1 -1
- package/lib/form-validators/directives/template-validations/control-expression-process.d.ts +1 -1
- package/lib/form-validators/services/rx-form-array.d.ts +2 -2
- package/lib/form-validators/util/reset-form.d.ts +3 -3
- package/lib/forms/directives/mat-form-field-editor.directive.d.ts +31 -28
- package/lib/forms/forms.module.d.ts +4 -3
- package/lib/forms/helpers/abstract-mat-form-field.d.ts +147 -91
- package/lib/forms/helpers/abstract-select-form-field.component.d.ts +144 -67
- package/lib/forms/helpers/value-accessor-base.d.ts +1 -1
- package/lib/layout/_m2-layout-theme.scss +14 -50
- package/lib/layout/layout-nav/layout-nav.component.d.ts +7 -1
- package/lib/layout/layout-toggle.class.d.ts +1 -1
- package/lib/list/components/list.component.d.ts +3 -15
- package/lib/menu/components/menu.component.d.ts +16 -1
- package/lib/menu/menu.module.d.ts +3 -2
- package/lib/select/components/select.component.d.ts +3 -16
- package/lib/table/components/dynamic-table/dynamic-table.component.d.ts +5 -1
- package/lib/table/components/filter-select/filter-select.component.d.ts +2 -3
- package/lib/table/models/table-definition.d.ts +69 -20
- package/package.json +3 -5
- package/esm2022/lib/base/base.module.mjs +0 -114
- package/esm2022/lib/base/components/base.component.mjs +0 -904
- package/esm2022/lib/base/components/dynamic-table-config-dialog/dynamic-table-config-dialog.comnponent.mjs +0 -123
- package/esm2022/lib/base/components/generic-embedded-list.component.mjs +0 -197
- package/esm2022/lib/base/components/generic-form-base.component.mjs +0 -891
- package/esm2022/lib/base/components/generic-form.component.mjs +0 -44
- package/esm2022/lib/base/components/generic-list.component.mjs +0 -966
- package/esm2022/lib/base/components/generic-reactive-form.component.mjs +0 -101
- package/esm2022/lib/base/components/task-dialog/task-dialog.component.mjs +0 -147
- package/esm2022/lib/base/constants/common.mjs +0 -92
- package/esm2022/lib/base/constants/global-roles.mjs +0 -9
- package/esm2022/lib/base/enums/message-type.mjs +0 -7
- package/esm2022/lib/base/helpers/auth-helper.mjs +0 -53
- package/esm2022/lib/base/interceptors/base.interceptor.mjs +0 -168
- package/esm2022/lib/base/interceptors/caching-interceptor.mjs +0 -67
- package/esm2022/lib/base/interceptors/loading.interceptor.mjs +0 -64
- package/esm2022/lib/base/interfaces/ibase-component.mjs +0 -2
- package/esm2022/lib/base/interfaces/igeneric-form-base.mjs +0 -2
- package/esm2022/lib/base/interfaces/igeneric-list-component.mjs +0 -2
- package/esm2022/lib/base/interfaces/igeneric-reactive-form-base.mjs +0 -2
- package/esm2022/lib/base/models/auth-user.mjs +0 -18
- package/esm2022/lib/base/models/task-dialog-data.mjs +0 -85
- package/esm2022/lib/base/public_api.mjs +0 -2
- package/esm2022/lib/base/services/file.service.mjs +0 -18
- package/esm2022/lib/base/services/loading-screen.service.mjs +0 -45
- package/esm2022/lib/base/services/print.service.mjs +0 -41
- package/esm2022/lib/chips/chips.module.mjs +0 -77
- package/esm2022/lib/chips/components/chips.component.mjs +0 -702
- package/esm2022/lib/chips/directives/autocomplete-option.directive.mjs +0 -18
- package/esm2022/lib/chips/directives/chip.directive.mjs +0 -18
- package/esm2022/lib/chips/public_api.mjs +0 -3
- package/esm2022/lib/common/animations/collapse/collapse.animation.mjs +0 -33
- package/esm2022/lib/common/animations/common/interfaces.mjs +0 -2
- package/esm2022/lib/common/behaviors/constructor.mjs +0 -2
- package/esm2022/lib/common/behaviors/control-value-accesor.mixin.mjs +0 -41
- package/esm2022/lib/common/behaviors/disabled.mixin.mjs +0 -24
- package/esm2022/lib/common/common.module.mjs +0 -176
- package/esm2022/lib/common/constants/constants.mjs +0 -3
- package/esm2022/lib/common/directives/autofocus.directive.mjs +0 -62
- package/esm2022/lib/common/directives/delayed-hover.directive.mjs +0 -133
- package/esm2022/lib/common/directives/disable-control.directive.mjs +0 -35
- package/esm2022/lib/common/enums/app-event-type.mjs +0 -6
- package/esm2022/lib/common/enums/filter-glue.mjs +0 -16
- package/esm2022/lib/common/enums/filter-operator.mjs +0 -15
- package/esm2022/lib/common/enums/salutation.mjs +0 -7
- package/esm2022/lib/common/functions/decorators.mjs +0 -22
- package/esm2022/lib/common/functions/functions.mjs +0 -22
- package/esm2022/lib/common/functions/utils.mjs +0 -271
- package/esm2022/lib/common/helpers/app-storage.mjs +0 -77
- package/esm2022/lib/common/helpers/delegate.mjs +0 -2
- package/esm2022/lib/common/helpers/dynamic-builder.mjs +0 -52
- package/esm2022/lib/common/helpers/dynamic-component-compiler.mjs +0 -11
- package/esm2022/lib/common/models/action-item.mjs +0 -77
- package/esm2022/lib/common/models/app-event.mjs +0 -21
- package/esm2022/lib/common/models/app-setting.mjs +0 -92
- package/esm2022/lib/common/models/audit-entity.mjs +0 -53
- package/esm2022/lib/common/models/audit-user.mjs +0 -24
- package/esm2022/lib/common/models/base-entity.mjs +0 -40
- package/esm2022/lib/common/models/common-error.mjs +0 -29
- package/esm2022/lib/common/models/common-handler-context.mjs +0 -45
- package/esm2022/lib/common/models/displayname-number-projection.mjs +0 -56
- package/esm2022/lib/common/models/displayname-projection.mjs +0 -38
- package/esm2022/lib/common/models/entity.mjs +0 -2
- package/esm2022/lib/common/models/enum-item.mjs +0 -2
- package/esm2022/lib/common/models/enum-metadata.mjs +0 -44
- package/esm2022/lib/common/models/filter-field.mjs +0 -2
- package/esm2022/lib/common/models/filter.mjs +0 -2
- package/esm2022/lib/common/models/icommon-handler-context.mjs +0 -2
- package/esm2022/lib/common/models/icon.mjs +0 -42
- package/esm2022/lib/common/models/key-value.mjs +0 -11
- package/esm2022/lib/common/models/modifiable-entity.mjs +0 -22
- package/esm2022/lib/common/models/name-number-projection.mjs +0 -35
- package/esm2022/lib/common/models/name-projection.mjs +0 -25
- package/esm2022/lib/common/models/permission.mjs +0 -29
- package/esm2022/lib/common/models/save-action.mjs +0 -7
- package/esm2022/lib/common/models/suffix-button.mjs +0 -15
- package/esm2022/lib/common/models/title-projection.mjs +0 -25
- package/esm2022/lib/common/pipes/bind.mjs +0 -31
- package/esm2022/lib/common/pipes/data-source.pipe.mjs +0 -15
- package/esm2022/lib/common/pipes/enum.pipe.mjs +0 -41
- package/esm2022/lib/common/pipes/file-size.pipe.mjs +0 -35
- package/esm2022/lib/common/pipes/filter.pipe.mjs +0 -54
- package/esm2022/lib/common/pipes/first-letter.mjs +0 -24
- package/esm2022/lib/common/pipes/form-array.pipe.mjs +0 -14
- package/esm2022/lib/common/pipes/form-control.pipe.mjs +0 -14
- package/esm2022/lib/common/pipes/form-group.pipe.mjs +0 -14
- package/esm2022/lib/common/pipes/func.pipe.mjs +0 -14
- package/esm2022/lib/common/pipes/join.pipe.mjs +0 -26
- package/esm2022/lib/common/pipes/keys.mjs +0 -18
- package/esm2022/lib/common/pipes/map.pipe.mjs +0 -48
- package/esm2022/lib/common/pipes/month-name.pipe.mjs +0 -25
- package/esm2022/lib/common/pipes/nested-property.mjs +0 -29
- package/esm2022/lib/common/pipes/only-number.mjs +0 -58
- package/esm2022/lib/common/pipes/order.pipe.mjs +0 -269
- package/esm2022/lib/common/pipes/placeholder.pipe.mjs +0 -26
- package/esm2022/lib/common/pipes/property-join.pipe.mjs +0 -27
- package/esm2022/lib/common/pipes/safe-html.pipe.mjs +0 -32
- package/esm2022/lib/common/pipes/split.pipe.mjs +0 -25
- package/esm2022/lib/common/pipes/time.pipe.mjs +0 -21
- package/esm2022/lib/common/pipes/titlecase.pipe.mjs +0 -14
- package/esm2022/lib/common/pipes/truncate.pipe.mjs +0 -15
- package/esm2022/lib/common/pipes/values.mjs +0 -14
- package/esm2022/lib/common/public_api.mjs +0 -41
- package/esm2022/lib/common/services/base.service.mjs +0 -19
- package/esm2022/lib/common/services/context-helper.mjs +0 -17
- package/esm2022/lib/common/services/enum.service.mjs +0 -81
- package/esm2022/lib/common/services/event-queue.service.mjs +0 -31
- package/esm2022/lib/common/services/service-locator.mjs +0 -25
- package/esm2022/lib/common/templates/templates.mjs +0 -87
- package/esm2022/lib/dialogs/alert-dialog/alert-dialog.component.mjs +0 -46
- package/esm2022/lib/dialogs/confirm-dialog/confirm-dialog.component.mjs +0 -60
- package/esm2022/lib/dialogs/dialog.component.mjs +0 -59
- package/esm2022/lib/dialogs/dialogs.module.mjs +0 -72
- package/esm2022/lib/dialogs/prompt-dialog/prompt-dialog.component.mjs +0 -44
- package/esm2022/lib/dialogs/public_api.mjs +0 -2
- package/esm2022/lib/dialogs/services/dialog.service.mjs +0 -154
- package/esm2022/lib/file/file-input.component.mjs +0 -334
- package/esm2022/lib/file/file.module.mjs +0 -37
- package/esm2022/lib/file/public_api.mjs +0 -2
- package/esm2022/lib/form-validators/abstract/typed-form.mjs +0 -13
- package/esm2022/lib/form-validators/algorithm/luhn-algorithm.mjs +0 -33
- package/esm2022/lib/form-validators/const/app-validators.const.mjs +0 -68
- package/esm2022/lib/form-validators/const/app.const.mjs +0 -65
- package/esm2022/lib/form-validators/const/config-names.const.mjs +0 -33
- package/esm2022/lib/form-validators/const/config-required-fields.const.mjs +0 -35
- package/esm2022/lib/form-validators/const/decorators.const.mjs +0 -23
- package/esm2022/lib/form-validators/const/events.const.mjs +0 -53
- package/esm2022/lib/form-validators/const/html-elements.const.mjs +0 -25
- package/esm2022/lib/form-validators/const/iban-country-wise-regex.const.mjs +0 -80
- package/esm2022/lib/form-validators/const/index.mjs +0 -6
- package/esm2022/lib/form-validators/const/operators.const.mjs +0 -7
- package/esm2022/lib/form-validators/const/validation-alphabet-locale.const.mjs +0 -9
- package/esm2022/lib/form-validators/const/validator.const.mjs +0 -29
- package/esm2022/lib/form-validators/core/annotation-types.mjs +0 -75
- package/esm2022/lib/form-validators/core/default-container.mjs +0 -500
- package/esm2022/lib/form-validators/decorators/allOf.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/alpha.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/alphaNumeric.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/and.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/ascii.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/async.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/base-decorator.function.mjs +0 -7
- package/esm2022/lib/form-validators/decorators/choice.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/compare.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/compose.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/contains.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/credit-card.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/cusip.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/custom.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/dataUri.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/date.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/different.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/digit.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/email.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/endsWith.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/even.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/extension.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/factor.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/file.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/fileSize.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/greater-than-equal-to.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/greater-than.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/grid.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/hexColor.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/image.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/index.mjs +0 -93
- package/esm2022/lib/form-validators/decorators/json.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/latLong.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/latitude.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/leapYear.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/less-than-equal-to.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/less-than.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/longitude.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/lowercase.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/mac.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/mask.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/maxDate.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/maxLength.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/maxNumber.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/maxTime.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/minDate.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/minLength.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/minNumber.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/minTime.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/model.decorator.mjs +0 -7
- package/esm2022/lib/form-validators/decorators/non-validation-decorators/disable.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/non-validation-decorators/elementClass.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/non-validation-decorators/error.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/non-validation-decorators/update-on.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/noneOf.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/not.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/notEmpty.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/numeric.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/odd.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/oneOf.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/or.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/password.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/pattern.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/port.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/primeNumber.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/prop-array.decorator.mjs +0 -18
- package/esm2022/lib/form-validators/decorators/prop-object.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/prop.decorator.mjs +0 -18
- package/esm2022/lib/form-validators/decorators/range.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/required.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/requiredTrue.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/rule.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/sanitize/blacklist.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/escape.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/ltrim.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/prefix.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/rtrim.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/sanitize.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/stripLow.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/suffix.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/toBoolean.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/toDate.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/toDouble.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/toFloat.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/toInt.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/toString.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/trim.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/whitelist.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/startsWith.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/time.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/unique.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/uppercase.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/url.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/directives/base-directive.mjs +0 -75
- package/esm2022/lib/form-validators/directives/control-host.directive.mjs +0 -55
- package/esm2022/lib/form-validators/directives/html-control-template.directive.mjs +0 -36
- package/esm2022/lib/form-validators/directives/rx-form.directive.mjs +0 -234
- package/esm2022/lib/form-validators/directives/template-validations/async-validation.directive.mjs +0 -40
- package/esm2022/lib/form-validators/directives/template-validations/base-validator.directive.mjs +0 -76
- package/esm2022/lib/form-validators/directives/template-validations/control-expression-process.mjs +0 -60
- package/esm2022/lib/form-validators/directives/template-validations/file-control.directive.mjs +0 -122
- package/esm2022/lib/form-validators/directives/template-validations/image-file-control.directive.mjs +0 -74
- package/esm2022/lib/form-validators/directives/template-validations/rxformcontrol.directive.mjs +0 -394
- package/esm2022/lib/form-validators/domain/disable-provider.mjs +0 -198
- package/esm2022/lib/form-validators/domain/element-processor/decimal.provider.mjs +0 -134
- package/esm2022/lib/form-validators/domain/element-processor/mask.provider.mjs +0 -453
- package/esm2022/lib/form-validators/domain/form-data.mjs +0 -93
- package/esm2022/lib/form-validators/enums/error-message-binding-strategy.mjs +0 -11
- package/esm2022/lib/form-validators/enums/index.mjs +0 -5
- package/esm2022/lib/form-validators/enums/ip-version.mjs +0 -7
- package/esm2022/lib/form-validators/enums/numeric-value-type.mjs +0 -7
- package/esm2022/lib/form-validators/enums/reset-type.mjs +0 -10
- package/esm2022/lib/form-validators/enums/url-validation-type.mjs +0 -7
- package/esm2022/lib/form-validators/models/config/alpha-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/array-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/base-config-fn.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/base-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/base-date-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/choice-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/compare-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/component-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/compose-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/contains-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/credit-card-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/custom-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/date-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/default-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/digit-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/disable-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/element-class-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/email-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/error-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/extension-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/factor-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/field-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/file-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/hex-color-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/iban-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/image-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/index.mjs +0 -35
- package/esm2022/lib/form-validators/models/config/ip-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/logical-operator-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/mask-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/max-date-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/message-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/min-date-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/model-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/number-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/numeric-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/password-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/pattern-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/prop-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/props-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/range-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/relational-operator-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/required-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/rule-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/sanitize-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/size-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/string-comparison-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/string-value-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/time-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/todate-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/unique-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/update-on-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/url-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/control-info.mjs +0 -2
- package/esm2022/lib/form-validators/models/data-sanitizer.mjs +0 -2
- package/esm2022/lib/form-validators/models/decorator-configuration.mjs +0 -2
- package/esm2022/lib/form-validators/models/form-builder-configuration.mjs +0 -58
- package/esm2022/lib/form-validators/models/index.mjs +0 -3
- package/esm2022/lib/form-validators/models/instance-container.mjs +0 -2
- package/esm2022/lib/form-validators/models/interface/array-prop-instance-config.interface.mjs +0 -2
- package/esm2022/lib/form-validators/models/interface/auto-instance-config.interface.mjs +0 -2
- package/esm2022/lib/form-validators/models/interface/form-data-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/interface/i-abstract-control.mjs +0 -30
- package/esm2022/lib/form-validators/models/interface/i-form-group.mjs +0 -2
- package/esm2022/lib/form-validators/models/interface/instance-argument.interface.mjs +0 -2
- package/esm2022/lib/form-validators/models/interface/object-prop-instance-config.interface.mjs +0 -2
- package/esm2022/lib/form-validators/models/interface/options.mjs +0 -2
- package/esm2022/lib/form-validators/models/password-validation.model.mjs +0 -2
- package/esm2022/lib/form-validators/models/prop-validation-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/property-info.mjs +0 -2
- package/esm2022/lib/form-validators/public_api.mjs +0 -26
- package/esm2022/lib/form-validators/reactive-form-validators/allOf.validator.mjs +0 -33
- package/esm2022/lib/form-validators/reactive-form-validators/alpha.validator.mjs +0 -15
- package/esm2022/lib/form-validators/reactive-form-validators/alphaNumeric.validator.mjs +0 -15
- package/esm2022/lib/form-validators/reactive-form-validators/and.validator.mjs +0 -38
- package/esm2022/lib/form-validators/reactive-form-validators/ascii.validator.mjs +0 -15
- package/esm2022/lib/form-validators/reactive-form-validators/async/base.async.validator.mjs +0 -45
- package/esm2022/lib/form-validators/reactive-form-validators/choice.validator.mjs +0 -31
- package/esm2022/lib/form-validators/reactive-form-validators/compare.validator.mjs +0 -32
- package/esm2022/lib/form-validators/reactive-form-validators/compose.validator.mjs +0 -34
- package/esm2022/lib/form-validators/reactive-form-validators/conditional-change.validator.mjs +0 -63
- package/esm2022/lib/form-validators/reactive-form-validators/contains.validator.mjs +0 -22
- package/esm2022/lib/form-validators/reactive-form-validators/credit-card.validator.mjs +0 -48
- package/esm2022/lib/form-validators/reactive-form-validators/cusip.validator.mjs +0 -38
- package/esm2022/lib/form-validators/reactive-form-validators/custom.validator.mjs +0 -25
- package/esm2022/lib/form-validators/reactive-form-validators/dataUri.validator.mjs +0 -9
- package/esm2022/lib/form-validators/reactive-form-validators/date.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/different.validator.mjs +0 -19
- package/esm2022/lib/form-validators/reactive-form-validators/digit.validator.mjs +0 -9
- package/esm2022/lib/form-validators/reactive-form-validators/email.validator.mjs +0 -9
- package/esm2022/lib/form-validators/reactive-form-validators/endsWith.validator.mjs +0 -23
- package/esm2022/lib/form-validators/reactive-form-validators/even.validator.mjs +0 -15
- package/esm2022/lib/form-validators/reactive-form-validators/extension.validator.mjs +0 -40
- package/esm2022/lib/form-validators/reactive-form-validators/factor.validator.mjs +0 -37
- package/esm2022/lib/form-validators/reactive-form-validators/file.validator.mjs +0 -26
- package/esm2022/lib/form-validators/reactive-form-validators/fileSize.validator.mjs +0 -34
- package/esm2022/lib/form-validators/reactive-form-validators/greater-than-equal-to.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/greater-than.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/grid.validator.mjs +0 -31
- package/esm2022/lib/form-validators/reactive-form-validators/hexcolor.validator.mjs +0 -9
- package/esm2022/lib/form-validators/reactive-form-validators/iban.validator.mjs +0 -28
- package/esm2022/lib/form-validators/reactive-form-validators/image.validator.mjs +0 -52
- package/esm2022/lib/form-validators/reactive-form-validators/index.mjs +0 -66
- package/esm2022/lib/form-validators/reactive-form-validators/ip.validator.mjs +0 -28
- package/esm2022/lib/form-validators/reactive-form-validators/json.validator.mjs +0 -26
- package/esm2022/lib/form-validators/reactive-form-validators/latLong.validator.mjs +0 -18
- package/esm2022/lib/form-validators/reactive-form-validators/latitude.validator.mjs +0 -9
- package/esm2022/lib/form-validators/reactive-form-validators/leapYear.validator.mjs +0 -16
- package/esm2022/lib/form-validators/reactive-form-validators/less-than-equal-to.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/less-than.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/longitude.validator.mjs +0 -9
- package/esm2022/lib/form-validators/reactive-form-validators/lowercase.validator.mjs +0 -15
- package/esm2022/lib/form-validators/reactive-form-validators/mac.validator.mjs +0 -9
- package/esm2022/lib/form-validators/reactive-form-validators/mask.validator.mjs +0 -14
- package/esm2022/lib/form-validators/reactive-form-validators/maxDate.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/maxLength.validator.mjs +0 -17
- package/esm2022/lib/form-validators/reactive-form-validators/maxNumber.validator.mjs +0 -17
- package/esm2022/lib/form-validators/reactive-form-validators/maxTime.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/minDate.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/minLength.validator.mjs +0 -16
- package/esm2022/lib/form-validators/reactive-form-validators/minNumber.validator.mjs +0 -16
- package/esm2022/lib/form-validators/reactive-form-validators/minTime.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/noneOf.validator.mjs +0 -24
- package/esm2022/lib/form-validators/reactive-form-validators/not.validator.mjs +0 -25
- package/esm2022/lib/form-validators/reactive-form-validators/notEmpty.validator.mjs +0 -17
- package/esm2022/lib/form-validators/reactive-form-validators/numeric.validator.mjs +0 -22
- package/esm2022/lib/form-validators/reactive-form-validators/odd.validator.mjs +0 -17
- package/esm2022/lib/form-validators/reactive-form-validators/oneOf.validator.mjs +0 -26
- package/esm2022/lib/form-validators/reactive-form-validators/or.validator.mjs +0 -25
- package/esm2022/lib/form-validators/reactive-form-validators/password.validator.mjs +0 -35
- package/esm2022/lib/form-validators/reactive-form-validators/pattern.validator.mjs +0 -19
- package/esm2022/lib/form-validators/reactive-form-validators/port.validator.mjs +0 -19
- package/esm2022/lib/form-validators/reactive-form-validators/primeNumber.validator.mjs +0 -27
- package/esm2022/lib/form-validators/reactive-form-validators/range.validator.mjs +0 -17
- package/esm2022/lib/form-validators/reactive-form-validators/required.validator.mjs +0 -17
- package/esm2022/lib/form-validators/reactive-form-validators/requiredTrue.validator.mjs +0 -16
- package/esm2022/lib/form-validators/reactive-form-validators/rule.validator.mjs +0 -22
- package/esm2022/lib/form-validators/reactive-form-validators/startsWith.validator.mjs +0 -25
- package/esm2022/lib/form-validators/reactive-form-validators/time.validator.mjs +0 -19
- package/esm2022/lib/form-validators/reactive-form-validators/unique.validator.mjs +0 -77
- package/esm2022/lib/form-validators/reactive-form-validators/uppercase.validator.mjs +0 -16
- package/esm2022/lib/form-validators/reactive-form-validators/url.validator.mjs +0 -28
- package/esm2022/lib/form-validators/services/base-form-builder.mjs +0 -220
- package/esm2022/lib/form-validators/services/entity.service.mjs +0 -76
- package/esm2022/lib/form-validators/services/form-control.mjs +0 -370
- package/esm2022/lib/form-validators/services/form-group.mjs +0 -2
- package/esm2022/lib/form-validators/services/reactive-form.module.mjs +0 -52
- package/esm2022/lib/form-validators/services/rx-form-array.mjs +0 -114
- package/esm2022/lib/form-validators/services/rx-form-builder.mjs +0 -1035
- package/esm2022/lib/form-validators/services/rx-form-group.mjs +0 -451
- package/esm2022/lib/form-validators/services/typed-form-builder.mjs +0 -25
- package/esm2022/lib/form-validators/util/alphabet-regex.locale.mjs +0 -29
- package/esm2022/lib/form-validators/util/app-util.mjs +0 -161
- package/esm2022/lib/form-validators/util/check-length.mjs +0 -11
- package/esm2022/lib/form-validators/util/config-provider.mjs +0 -37
- package/esm2022/lib/form-validators/util/date-checker.function.mjs +0 -52
- package/esm2022/lib/form-validators/util/date-provider.mjs +0 -108
- package/esm2022/lib/form-validators/util/form-const.mjs +0 -3
- package/esm2022/lib/form-validators/util/form-provider.mjs +0 -87
- package/esm2022/lib/form-validators/util/index.mjs +0 -7
- package/esm2022/lib/form-validators/util/instance-provider.function.mjs +0 -63
- package/esm2022/lib/form-validators/util/ip-checker.mjs +0 -19
- package/esm2022/lib/form-validators/util/linq.mjs +0 -157
- package/esm2022/lib/form-validators/util/object-maker.mjs +0 -68
- package/esm2022/lib/form-validators/util/reactive-form-config.mjs +0 -25
- package/esm2022/lib/form-validators/util/regex-rules.mjs +0 -37
- package/esm2022/lib/form-validators/util/regex-validator.mjs +0 -74
- package/esm2022/lib/form-validators/util/relational-checker.function.mjs +0 -92
- package/esm2022/lib/form-validators/util/reset-form.mjs +0 -57
- package/esm2022/lib/form-validators/util/sanitizers.mjs +0 -140
- package/esm2022/lib/form-validators/util/time-checker.function.mjs +0 -50
- package/esm2022/lib/form-validators/util/type.mjs +0 -2
- package/esm2022/lib/form-validators/util/validator-value-checker.mjs +0 -21
- package/esm2022/lib/form-validators/validators-extension/allOf-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/alpha-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/alphaNumeric-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/and-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/ascii-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/base-validator.function.mjs +0 -34
- package/esm2022/lib/form-validators/validators-extension/choice-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/compare-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/compose-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/contains-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/credit-card-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/cusip-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/custom-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/dataUri-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/date-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/different-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/digit-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/email-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/endsWith-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/even-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/extension-validator.extension.mjs +0 -10
- package/esm2022/lib/form-validators/validators-extension/factor-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/file-validator.extension.mjs +0 -10
- package/esm2022/lib/form-validators/validators-extension/fileSize-validator.extension.mjs +0 -10
- package/esm2022/lib/form-validators/validators-extension/greater-than-equal-to-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/greater-than-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/grid-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/hexcolor-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/iban-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/image-validator.extension.mjs +0 -10
- package/esm2022/lib/form-validators/validators-extension/index.mjs +0 -68
- package/esm2022/lib/form-validators/validators-extension/ip-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/json-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/latLong-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/latitude-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/leapYear-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/less-than-equal-to-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/less-than-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/longitude-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/lowercase-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/mac-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/mask-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/maxDate-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/maxLength-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/maxNumber-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/maxTime-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/minDate-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/minLength-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/minNumber-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/minTime-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/noneOf-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/not-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/notEmpty-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/numeric-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/odd-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/oneOf-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/or-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/password-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/pattern-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/port-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/primeNumber-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/range-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/required-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/requiredTrue-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/rxweb-validators.mjs +0 -108
- package/esm2022/lib/form-validators/validators-extension/startsWith-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/time-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/unique-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/uppercase-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/url-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-function/alpha-validation.function.mjs +0 -71
- package/esm2022/lib/form-validators/validators-function/regex-validation.function.mjs +0 -33
- package/esm2022/lib/forms/components/datepicker/datepicker-header.component.mjs +0 -84
- package/esm2022/lib/forms/components/generic-form/generic-form.component.mjs +0 -602
- package/esm2022/lib/forms/constants/constants.mjs +0 -4
- package/esm2022/lib/forms/directives/mat-form-field-editor.directive.mjs +0 -197
- package/esm2022/lib/forms/directives/mat-form-field-readonly.directive.mjs +0 -34
- package/esm2022/lib/forms/directives/parse-decimal-directive.mjs +0 -87
- package/esm2022/lib/forms/directives/vd-generic-form-custom-field.directive.mjs +0 -35
- package/esm2022/lib/forms/enums/form-field-type.mjs +0 -23
- package/esm2022/lib/forms/forms.module.mjs +0 -168
- package/esm2022/lib/forms/functions/decorators.mjs +0 -136
- package/esm2022/lib/forms/functions/functions.mjs +0 -72
- package/esm2022/lib/forms/helpers/abstract-mat-form-field.mjs +0 -308
- package/esm2022/lib/forms/helpers/abstract-select-form-field.component.mjs +0 -492
- package/esm2022/lib/forms/helpers/value-accessor-base.mjs +0 -146
- package/esm2022/lib/forms/models/form-definition.mjs +0 -63
- package/esm2022/lib/forms/models/form-field-definition.mjs +0 -468
- package/esm2022/lib/forms/models/form-field-group-definition.mjs +0 -55
- package/esm2022/lib/forms/pipes/field-func.pipe.mjs +0 -23
- package/esm2022/lib/forms/pipes/group-filter.pipe.mjs +0 -34
- package/esm2022/lib/forms/public_api.mjs +0 -5
- package/esm2022/lib/forms/validators/empty-string-reset.directive.mjs +0 -25
- package/esm2022/lib/forms/validators/equal-validator.directive.mjs +0 -69
- package/esm2022/lib/forms/validators/native-element-injector.directive.mjs +0 -41
- package/esm2022/lib/forms/validators/unique-validator-directive.mjs +0 -88
- package/esm2022/lib/http/http.module.mjs +0 -15
- package/esm2022/lib/http/models/response.mjs +0 -24
- package/esm2022/lib/http/public_api.mjs +0 -2
- package/esm2022/lib/http/services/generic.service.mjs +0 -331
- package/esm2022/lib/layout/dynamic-menu/dynamic-menu.component.mjs +0 -103
- package/esm2022/lib/layout/layout-card-over/layout-card-over.component.mjs +0 -49
- package/esm2022/lib/layout/layout-compact/layout-compact.component.mjs +0 -193
- package/esm2022/lib/layout/layout-footer/layout-footer.component.mjs +0 -37
- package/esm2022/lib/layout/layout-manage-list/layout-manage-list.component.mjs +0 -150
- package/esm2022/lib/layout/layout-manage-list/layout-manage-list.directives.mjs +0 -108
- package/esm2022/lib/layout/layout-nav/layout-nav.component.mjs +0 -146
- package/esm2022/lib/layout/layout-nav-list/layout-nav-list.component.mjs +0 -141
- package/esm2022/lib/layout/layout-nav-list/layout-nav-list.directives.mjs +0 -105
- package/esm2022/lib/layout/layout-toggle.class.mjs +0 -89
- package/esm2022/lib/layout/layout.component.mjs +0 -230
- package/esm2022/lib/layout/layout.directives.mjs +0 -81
- package/esm2022/lib/layout/layout.module.mjs +0 -144
- package/esm2022/lib/layout/list-toolbar/list-toolbar.component.mjs +0 -47
- package/esm2022/lib/layout/navigation-drawer/navigation-drawer.component.mjs +0 -275
- package/esm2022/lib/layout/public_api.mjs +0 -2
- package/esm2022/lib/list/components/list.component.mjs +0 -78
- package/esm2022/lib/list/directives/vd-list-option.directive.mjs +0 -23
- package/esm2022/lib/list/list.module.mjs +0 -36
- package/esm2022/lib/list/public_api.mjs +0 -3
- package/esm2022/lib/media/directives/media-toggle.directive.mjs +0 -154
- package/esm2022/lib/media/media.module.mjs +0 -35
- package/esm2022/lib/media/public_api.mjs +0 -2
- package/esm2022/lib/media/services/media.service.mjs +0 -110
- package/esm2022/lib/menu/components/menu.component.mjs +0 -95
- package/esm2022/lib/menu/enums/menu-scope.mjs +0 -6
- package/esm2022/lib/menu/menu.module.mjs +0 -64
- package/esm2022/lib/menu/models/menu-client.mjs +0 -39
- package/esm2022/lib/menu/models/menu-department.mjs +0 -39
- package/esm2022/lib/menu/models/menu-item-client.mjs +0 -39
- package/esm2022/lib/menu/models/menu-item-department.mjs +0 -39
- package/esm2022/lib/menu/models/menu-item.mjs +0 -351
- package/esm2022/lib/menu/models/menu-settings.mjs +0 -13
- package/esm2022/lib/menu/models/menu.mjs +0 -224
- package/esm2022/lib/menu/public_api.mjs +0 -3
- package/esm2022/lib/menu/resolvers/menu-form-includes.resolve.mjs +0 -50
- package/esm2022/lib/menu/resolvers/menu-item-form-includes.resolve.mjs +0 -50
- package/esm2022/lib/menu/resolvers/menu-list-projection.resolve.mjs +0 -51
- package/esm2022/lib/menu/resolvers/menu-settings.resolve.mjs +0 -24
- package/esm2022/lib/menu/services/menu-items.service.mjs +0 -19
- package/esm2022/lib/menu/services/menu.resolve.mjs +0 -68
- package/esm2022/lib/menu/services/menu.service.mjs +0 -19
- package/esm2022/lib/search/public_api.mjs +0 -2
- package/esm2022/lib/search/search.module.mjs +0 -33
- package/esm2022/lib/select/components/select.component.mjs +0 -215
- package/esm2022/lib/select/directives/vd-select-option.directive.mjs +0 -23
- package/esm2022/lib/select/directives/vd-select-trigger.directive.mjs +0 -23
- package/esm2022/lib/select/public_api.mjs +0 -4
- package/esm2022/lib/select/select.module.mjs +0 -48
- package/esm2022/lib/table/components/dynamic-table/dynamic-table.component.mjs +0 -810
- package/esm2022/lib/table/components/filter-clear/filter-clear.component.mjs +0 -36
- package/esm2022/lib/table/components/filter-date/filter-date.component.mjs +0 -146
- package/esm2022/lib/table/components/filter-input/filter-input.component.mjs +0 -198
- package/esm2022/lib/table/components/filter-select/filter-select.component.mjs +0 -375
- package/esm2022/lib/table/constants/constants.mjs +0 -3
- package/esm2022/lib/table/directives/data-source-filter.directive.mjs +0 -49
- package/esm2022/lib/table/directives/vd-table-field.directive.mjs +0 -35
- package/esm2022/lib/table/enums/grid.mjs +0 -12
- package/esm2022/lib/table/enums/table-column-type.mjs +0 -17
- package/esm2022/lib/table/functions/decorators.mjs +0 -163
- package/esm2022/lib/table/functions/functions.mjs +0 -28
- package/esm2022/lib/table/models/facet-value.mjs +0 -47
- package/esm2022/lib/table/models/facet.mjs +0 -48
- package/esm2022/lib/table/models/pagination.mjs +0 -27
- package/esm2022/lib/table/models/table-column-config.mjs +0 -128
- package/esm2022/lib/table/models/table-column.mjs +0 -270
- package/esm2022/lib/table/models/table-config.mjs +0 -41
- package/esm2022/lib/table/models/table-definition.mjs +0 -110
- package/esm2022/lib/table/models/table-query-config.mjs +0 -26
- package/esm2022/lib/table/paginator-intl.mjs +0 -41
- package/esm2022/lib/table/public_api.mjs +0 -2
- package/esm2022/lib/table/table.data-source.mjs +0 -326
- package/esm2022/lib/table/table.module.mjs +0 -165
- package/esm2022/lib/table/table.static-data-source.mjs +0 -198
- package/esm2022/messaia-cdk.mjs +0 -5
- package/esm2022/public_api.mjs +0 -19
- package/lib/common/styles/_elevation.scss +0 -147
- package/lib/common/styles/_rtl.scss +0 -28
- package/lib/common/styles/_styles.scss +0 -12
- package/lib/common/styles/_theme-functions.scss +0 -4
- package/lib/common/styles/_typography.scss +0 -76
- package/lib/common/styles/core/_content.scss +0 -42
- package/lib/common/styles/core/_divider.scss +0 -14
- package/lib/common/styles/core/_icons.scss +0 -27
- package/lib/common/styles/core/_list.scss +0 -8
- package/lib/common/styles/core/_toolbar.scss +0 -31
- package/lib/common/styles/core/_whiteframe.scss +0 -111
- package/lib/common/styles/m2/_theme-functions.scss +0 -21
- package/lib/common/styles/m3/_theme-functions.scss +0 -21
- package/lib/common/styles/platform.scss +0 -11
- package/lib/common/theming/_all-theme.scss +0 -27
- package/lib/common/typography/_all-typography.scss +0 -33
|
@@ -1,904 +0,0 @@
|
|
|
1
|
-
import { Location } from '@angular/common';
|
|
2
|
-
import { HttpHeaders } from '@angular/common/http';
|
|
3
|
-
import { ChangeDetectorRef, Directive, ElementRef, EventEmitter, Input, Output, QueryList, ViewChildren } from '@angular/core';
|
|
4
|
-
import { MatDialog } from '@angular/material/dialog';
|
|
5
|
-
import { MatExpansionPanel } from '@angular/material/expansion';
|
|
6
|
-
import { MatSnackBar } from '@angular/material/snack-bar';
|
|
7
|
-
import { Title } from '@angular/platform-browser';
|
|
8
|
-
import { ActivatedRoute, Router } from '@angular/router';
|
|
9
|
-
import { map, of } from 'rxjs';
|
|
10
|
-
import { ContextHelper } from '../../common/common.module';
|
|
11
|
-
import { AppSetting } from '../../common/models/app-setting';
|
|
12
|
-
import { ServiceLocator } from '../../common/services/service-locator';
|
|
13
|
-
import { VdDialogService } from '../../dialogs/services/dialog.service';
|
|
14
|
-
import { VdMediaService } from '../../media/services/media.service';
|
|
15
|
-
import { TaskDialogData } from '../base.module';
|
|
16
|
-
import { Common } from '../constants/common';
|
|
17
|
-
import { GlobalRoles } from '../constants/global-roles';
|
|
18
|
-
import { MessageType } from '../enums/message-type';
|
|
19
|
-
import { AuthHelper } from '../helpers/auth-helper';
|
|
20
|
-
import { VdTaskDialogComponent } from './task-dialog/task-dialog.component';
|
|
21
|
-
import * as i0 from "@angular/core";
|
|
22
|
-
import * as i1 from "@angular/router";
|
|
23
|
-
/**
|
|
24
|
-
* A base list component for components with pagination support.
|
|
25
|
-
*/
|
|
26
|
-
// @dynamic
|
|
27
|
-
export class BaseComponent {
|
|
28
|
-
route;
|
|
29
|
-
changeDetectorRef;
|
|
30
|
-
/**
|
|
31
|
-
* Application settings.
|
|
32
|
-
*/
|
|
33
|
-
appSetting;
|
|
34
|
-
/**
|
|
35
|
-
* General configuration settings, with a flexible type to accommodate different configurations.
|
|
36
|
-
*/
|
|
37
|
-
settings = {};
|
|
38
|
-
/**
|
|
39
|
-
* Menu items for navigation.
|
|
40
|
-
*/
|
|
41
|
-
menu;
|
|
42
|
-
/**
|
|
43
|
-
* Name of the project, used for display or logging purposes.
|
|
44
|
-
*/
|
|
45
|
-
projectName;
|
|
46
|
-
/**
|
|
47
|
-
* Title of the current page, displayed in the page header.
|
|
48
|
-
*/
|
|
49
|
-
title;
|
|
50
|
-
/**
|
|
51
|
-
* Subtitle of the current outlet, used for additional page context.
|
|
52
|
-
*/
|
|
53
|
-
subtitle;
|
|
54
|
-
/**
|
|
55
|
-
* If true, dummy data is used for testing, and debug logs are enabled.
|
|
56
|
-
*/
|
|
57
|
-
debug = false;
|
|
58
|
-
/**
|
|
59
|
-
* Indicates whether a loading process is active, often used to show a loading spinner.
|
|
60
|
-
*/
|
|
61
|
-
isLoading = false;
|
|
62
|
-
/**
|
|
63
|
-
* Determines whether to handle changes in expansion panels.
|
|
64
|
-
*/
|
|
65
|
-
handleExpansionPanelChanges = true;
|
|
66
|
-
/**
|
|
67
|
-
* Indicates whether a save operation is currently in progress.
|
|
68
|
-
*/
|
|
69
|
-
_isSaving = false;
|
|
70
|
-
get isSaving() { return this._isSaving || this.isLoading; }
|
|
71
|
-
set isSaving(isSaving) { this.isLoading = this._isSaving = isSaving; }
|
|
72
|
-
/**
|
|
73
|
-
* Indicates whether the editor has been initialized.
|
|
74
|
-
*/
|
|
75
|
-
isEditorInitialized = false;
|
|
76
|
-
/**
|
|
77
|
-
* Stores any errors encountered during requests or operations.
|
|
78
|
-
*/
|
|
79
|
-
errors = new Array();
|
|
80
|
-
/**
|
|
81
|
-
* Utility to evaluate media queries based on the current screen or window size.
|
|
82
|
-
*/
|
|
83
|
-
media;
|
|
84
|
-
/**
|
|
85
|
-
* List of permitted file extensions for upload or selection.
|
|
86
|
-
*/
|
|
87
|
-
allowedExtensions = Common.allowedExtensions;
|
|
88
|
-
/**
|
|
89
|
-
* Plugins enabled in the TinyMCE editor.
|
|
90
|
-
*/
|
|
91
|
-
editorPlugins = Common.editorPlugins;
|
|
92
|
-
/**
|
|
93
|
-
* Toolbar configuration for TinyMCE editor.
|
|
94
|
-
*/
|
|
95
|
-
editorToolbar = Common.editorToolbar;
|
|
96
|
-
/**
|
|
97
|
-
* Additional configuration settings for the editor.
|
|
98
|
-
*/
|
|
99
|
-
editorConfig = {};
|
|
100
|
-
/**
|
|
101
|
-
* Service for navigation and URL manipulation.
|
|
102
|
-
*/
|
|
103
|
-
router;
|
|
104
|
-
/**
|
|
105
|
-
* Optional hash value appended to URLs for bookmarking or state management.
|
|
106
|
-
*/
|
|
107
|
-
urlHash;
|
|
108
|
-
/**
|
|
109
|
-
* CSS class name(s) applied to the component.
|
|
110
|
-
*/
|
|
111
|
-
className;
|
|
112
|
-
/**
|
|
113
|
-
* Permission flag for creating new entries.
|
|
114
|
-
*/
|
|
115
|
-
canCreate = false;
|
|
116
|
-
/**
|
|
117
|
-
* Permission flag for reading new entries.
|
|
118
|
-
*/
|
|
119
|
-
canRead = false;
|
|
120
|
-
/**
|
|
121
|
-
* Permission flag for updating existing entries.
|
|
122
|
-
*/
|
|
123
|
-
canUpdate = false;
|
|
124
|
-
/**
|
|
125
|
-
* Permission flag for deleting entries.
|
|
126
|
-
*/
|
|
127
|
-
canDelete = false;
|
|
128
|
-
/**
|
|
129
|
-
* Full path of the current route.
|
|
130
|
-
*/
|
|
131
|
-
currentRoute;
|
|
132
|
-
/**
|
|
133
|
-
* Base path of the current route, excluding specific parameters or sub-paths.
|
|
134
|
-
*/
|
|
135
|
-
currentBaseRoute;
|
|
136
|
-
/**
|
|
137
|
-
* URL to navigate back to after saving changes.
|
|
138
|
-
*/
|
|
139
|
-
returnUrl;
|
|
140
|
-
/**
|
|
141
|
-
* Object representing the current authenticated user.
|
|
142
|
-
*/
|
|
143
|
-
currentUser = AuthHelper.user;
|
|
144
|
-
/**
|
|
145
|
-
* Indicates if the current user has admin privileges.
|
|
146
|
-
*/
|
|
147
|
-
isAdmin = AuthHelper.hasRole(GlobalRoles.Administrator);
|
|
148
|
-
/**
|
|
149
|
-
* Indicates if the current user has client admin privileges.
|
|
150
|
-
*/
|
|
151
|
-
isClientAdmin = AuthHelper.hasRole(GlobalRoles.ClientAdministrator);
|
|
152
|
-
/**
|
|
153
|
-
* Indicates if the current user has department admin privileges.
|
|
154
|
-
*/
|
|
155
|
-
isDepartmentAdmin = AuthHelper.hasRole(GlobalRoles.DepartmentAdministrator);
|
|
156
|
-
/**
|
|
157
|
-
* Event emitter for reload actions, useful for refreshing data.
|
|
158
|
-
*/
|
|
159
|
-
reload = new EventEmitter();
|
|
160
|
-
/**
|
|
161
|
-
* Service for setting the document's title.
|
|
162
|
-
*/
|
|
163
|
-
titleService;
|
|
164
|
-
/**
|
|
165
|
-
* Service for displaying snack bar notifications.
|
|
166
|
-
*/
|
|
167
|
-
snackBarService;
|
|
168
|
-
/**
|
|
169
|
-
* Service for displaying confirmation and prompt dialogs.
|
|
170
|
-
*/
|
|
171
|
-
dialogService;
|
|
172
|
-
/**
|
|
173
|
-
* Service for opening modal dialogs.
|
|
174
|
-
*/
|
|
175
|
-
dialog;
|
|
176
|
-
/**
|
|
177
|
-
* Service for managing browser location and history.
|
|
178
|
-
*/
|
|
179
|
-
location;
|
|
180
|
-
/**
|
|
181
|
-
* If true, sets a URL hash for navigation state.
|
|
182
|
-
*/
|
|
183
|
-
setUrlHash = true;
|
|
184
|
-
/**
|
|
185
|
-
* Query list for accessing expansion panel elements as DOM references.
|
|
186
|
-
*/
|
|
187
|
-
matExpansionPanelElementQueryList;
|
|
188
|
-
/**
|
|
189
|
-
* Query list for accessing MatExpansionPanel component references.
|
|
190
|
-
*/
|
|
191
|
-
matExpansionPanelQueryList;
|
|
192
|
-
/**
|
|
193
|
-
* Subscriptions for expansion panel changes, managed to avoid memory leaks.
|
|
194
|
-
*/
|
|
195
|
-
matExpansionPanelSubscriptions = [];
|
|
196
|
-
/**
|
|
197
|
-
* Create a beep audio object and load a sound file from a data URL.
|
|
198
|
-
*/
|
|
199
|
-
beepAudio = new Audio("data:audio/wav;base64,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qJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=");
|
|
200
|
-
/**
|
|
201
|
-
* Create a warn audio object and load a sound file from a data URL.
|
|
202
|
-
*/
|
|
203
|
-
warnAudio = new Audio("data:audio/mp3;base64,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");
|
|
204
|
-
/**
|
|
205
|
-
* Initializes services and application settings, sets up context helpers,
|
|
206
|
-
* and initializes the editor with default configurations.
|
|
207
|
-
*
|
|
208
|
-
* @param route - ActivatedRoute instance for accessing route parameters and data.
|
|
209
|
-
* @param changeDetectorRef - ChangeDetectorRef instance for manually triggering change detection.
|
|
210
|
-
*/
|
|
211
|
-
constructor(route, changeDetectorRef) {
|
|
212
|
-
this.route = route;
|
|
213
|
-
this.changeDetectorRef = changeDetectorRef;
|
|
214
|
-
/* Initialize the Title service */
|
|
215
|
-
this.titleService = this.getService(Title);
|
|
216
|
-
/* Initialize the dialog service for showing modals */
|
|
217
|
-
this.dialogService = this.getService(VdDialogService);
|
|
218
|
-
/* Initialize the Material dialog for managing dialogs */
|
|
219
|
-
this.dialog = this.getService(MatDialog);
|
|
220
|
-
/* Initialize the media service for media queries and broadcast */
|
|
221
|
-
this.media = this.getService(VdMediaService);
|
|
222
|
-
/* Initialize the snackbar service for notifications */
|
|
223
|
-
this.snackBarService = this.getService(MatSnackBar);
|
|
224
|
-
/* Initialize the router service for navigation */
|
|
225
|
-
this.router = this.getService(Router);
|
|
226
|
-
/* Initialize the application settings */
|
|
227
|
-
this.appSetting = this.getService(AppSetting);
|
|
228
|
-
/* Initialize the location service for URL manipulation */
|
|
229
|
-
this.location = this.getService(Location);
|
|
230
|
-
/* Set up context helpers with route and application settings */
|
|
231
|
-
ContextHelper.activatedRoute = route;
|
|
232
|
-
ContextHelper.router = this.router;
|
|
233
|
-
ContextHelper.appSetting = this.appSetting;
|
|
234
|
-
/* Initialize the editor with default configurations */
|
|
235
|
-
this.initEditor();
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* Lifecycle hook that is called after data-bound properties of a directive are initialized
|
|
239
|
-
*/
|
|
240
|
-
ngOnInit() {
|
|
241
|
-
/* Get menu items from route snapshot */
|
|
242
|
-
var mainRoute = this.getMainRoute(this.route.snapshot);
|
|
243
|
-
if (mainRoute) {
|
|
244
|
-
this.menu = mainRoute.data.menu;
|
|
245
|
-
this.setTitles();
|
|
246
|
-
}
|
|
247
|
-
/* Set project name & debug mode */
|
|
248
|
-
this.projectName = this.appSetting.projectName;
|
|
249
|
-
this.debug = this.appSetting.debug ?? false;
|
|
250
|
-
/* Check if the user has permission to create, update, and delete */
|
|
251
|
-
this.canCreate ||= AuthHelper.isPermitted('Create');
|
|
252
|
-
this.canUpdate ||= AuthHelper.isPermitted('Update');
|
|
253
|
-
this.canDelete ||= AuthHelper.isPermitted('Delete');
|
|
254
|
-
/* Get the hash from the URL */
|
|
255
|
-
this.route.fragment.subscribe((fragment) => this.urlHash = fragment);
|
|
256
|
-
/* Check permissions based on the route */
|
|
257
|
-
if (this.route.parent) {
|
|
258
|
-
this.route.parent.url.subscribe((url) => {
|
|
259
|
-
this.className ??= url.length ? url[0].path.replace(/(.*)s$/, '$1').replace(/^./, (url[0].path[0] || '').toUpperCase()) : '';
|
|
260
|
-
this.canCreate = AuthHelper.isPermitted(`Create${this.className}`);
|
|
261
|
-
this.canUpdate = AuthHelper.isPermitted(`Update${this.className}`);
|
|
262
|
-
this.canDelete = AuthHelper.isPermitted(`Delete${this.className}`);
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
/* Set the current route and base route */
|
|
266
|
-
this.currentRoute = window.btoa(this.router.url);
|
|
267
|
-
this.currentBaseRoute = this.router.url?.split('?')[0]?.split(';')[0];
|
|
268
|
-
/**
|
|
269
|
-
* Set the page title based on the navigation end event
|
|
270
|
-
*/
|
|
271
|
-
this.router.events.subscribe(x => {
|
|
272
|
-
let navigationEnd = x?.routerEvent;
|
|
273
|
-
if (navigationEnd) {
|
|
274
|
-
this.setTitles();
|
|
275
|
-
this.currentRoute = window.btoa(navigationEnd.url);
|
|
276
|
-
}
|
|
277
|
-
});
|
|
278
|
-
/* Retrieve the return URL if any from the query parameters */
|
|
279
|
-
this.route.queryParams.subscribe(x => this.setReturnUrl(x.returnUrl));
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* Lifecycle hook that is called after a component's view has been fully initialized
|
|
283
|
-
*/
|
|
284
|
-
ngAfterViewInit() {
|
|
285
|
-
/* Broadcast to all listener observables when loading the page */
|
|
286
|
-
this.media.broadcast();
|
|
287
|
-
/* Set page titles */
|
|
288
|
-
this.setTitles();
|
|
289
|
-
/*
|
|
290
|
-
* Force a new change detection cycle since change detections
|
|
291
|
-
* have finished when `ngAfterViewInit` is executed
|
|
292
|
-
*/
|
|
293
|
-
this.changeDetectorRef.detectChanges();
|
|
294
|
-
/* Listen for expansion panel changes if enabled */
|
|
295
|
-
if (this.handleExpansionPanelChanges) {
|
|
296
|
-
this.onExpansionPanelChanges();
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* Reloads the current page or component.
|
|
301
|
-
*
|
|
302
|
-
* This method navigates temporarily to the root URL and then
|
|
303
|
-
* navigates back to the current URL to effectively refresh the page or component.
|
|
304
|
-
*
|
|
305
|
-
* @param callback - A function to be called after the navigation is successful,
|
|
306
|
-
* receives the current URL as an argument.
|
|
307
|
-
*/
|
|
308
|
-
reloadPage(callback) {
|
|
309
|
-
let currentUrl = this.router.url;
|
|
310
|
-
this.router.navigateByUrl('/', { replaceUrl: true }).then(() => {
|
|
311
|
-
this.router.navigateByUrl(currentUrl, { replaceUrl: true }).then(() => {
|
|
312
|
-
/* Execute the callback if provided */
|
|
313
|
-
if (callback) {
|
|
314
|
-
callback(currentUrl);
|
|
315
|
-
}
|
|
316
|
-
});
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
/**
|
|
320
|
-
* Navigates back to the return URL if it exists.
|
|
321
|
-
*/
|
|
322
|
-
navigateToReturnUrl() {
|
|
323
|
-
if (this.returnUrl) {
|
|
324
|
-
/* Parse the return URL into a UrlTree object */
|
|
325
|
-
let urlTree = this.router.parseUrl(this.returnUrl);
|
|
326
|
-
/* Navigate to the return URL */
|
|
327
|
-
this.router.navigateByUrl(urlTree.toString());
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
/*
|
|
331
|
-
* Forces a new change detection cycle since change detections
|
|
332
|
-
* have finished when `ngAfterViewInit` is executed.
|
|
333
|
-
*/
|
|
334
|
-
detectChanges() {
|
|
335
|
-
/* Trigger change detection */
|
|
336
|
-
this.changeDetectorRef.detectChanges();
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Sets the return URL after decoding it.
|
|
340
|
-
*
|
|
341
|
-
* @param returnUrl - The encoded return URL to set.
|
|
342
|
-
*/
|
|
343
|
-
setReturnUrl(returnUrl) {
|
|
344
|
-
try {
|
|
345
|
-
/* Decode and set the return URL, handling potential errors */
|
|
346
|
-
this.returnUrl = returnUrl ? decodeURIComponent(atob(returnUrl)) : undefined;
|
|
347
|
-
}
|
|
348
|
-
catch (error) {
|
|
349
|
-
/* Handle error silently */
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
/**
|
|
353
|
-
* Listen for expansion panel changes
|
|
354
|
-
*/
|
|
355
|
-
onExpansionPanelChanges() {
|
|
356
|
-
/* Listen for expansion panel changes */
|
|
357
|
-
this.matExpansionPanelQueryList?.changes.subscribe(_ => {
|
|
358
|
-
/* Unsubscribe from old 'opened' and 'closed' subscriptions */
|
|
359
|
-
this.matExpansionPanelSubscriptions.forEach(x => x.unsubscribe());
|
|
360
|
-
/* Detect changes */
|
|
361
|
-
this.changeDetectorRef.detectChanges();
|
|
362
|
-
/* Get the panel ends with the ID 'new' */
|
|
363
|
-
var newExpansionPanelIndex = this.matExpansionPanelElementQueryList?.toArray()?.findIndex(x => x.nativeElement?.id?.endsWith('.new')) ?? -1;
|
|
364
|
-
if (newExpansionPanelIndex >= 0) {
|
|
365
|
-
/* Close all panels */
|
|
366
|
-
this.matExpansionPanelQueryList?.first?.accordion?.closeAll();
|
|
367
|
-
/* Open the new panel */
|
|
368
|
-
this.matExpansionPanelQueryList?.toArray()[newExpansionPanelIndex]?.open();
|
|
369
|
-
/* Detect changes */
|
|
370
|
-
this.changeDetectorRef.detectChanges();
|
|
371
|
-
}
|
|
372
|
-
else {
|
|
373
|
-
/* Find the index of the panel with the specified element ID */
|
|
374
|
-
this.urlHash?.split('.')
|
|
375
|
-
?.reduce((accumulator, currentValue, index) => accumulator.concat((index > 0 ? (accumulator.slice(-1).join('.') + '.') : '') + currentValue), [])
|
|
376
|
-
?.forEach((hash) => {
|
|
377
|
-
var expansionPanelIndex = this.matExpansionPanelElementQueryList?.toArray()?.findIndex(x => x.nativeElement.id == hash) ?? -1;
|
|
378
|
-
if (expansionPanelIndex >= 0) {
|
|
379
|
-
this.matExpansionPanelQueryList?.toArray()[expansionPanelIndex]?.open();
|
|
380
|
-
this.changeDetectorRef.detectChanges();
|
|
381
|
-
}
|
|
382
|
-
});
|
|
383
|
-
}
|
|
384
|
-
/* Detect changes for opened panels */
|
|
385
|
-
this.matExpansionPanelQueryList?.forEach(y => {
|
|
386
|
-
this.matExpansionPanelSubscriptions.push(y.opened.subscribe(_ => {
|
|
387
|
-
if (this.setUrlHash) {
|
|
388
|
-
/* Get the id of the current opened panel */
|
|
389
|
-
var currentPanelId = y['_viewContainerRef']?.element?.nativeElement?.id;
|
|
390
|
-
/* If the panel ID is set, set it as url segment (hash) */
|
|
391
|
-
if (currentPanelId) {
|
|
392
|
-
this.router.navigate([], { fragment: currentPanelId, replaceUrl: true });
|
|
393
|
-
}
|
|
394
|
-
/* Otherwise remove the segment from the url */
|
|
395
|
-
else {
|
|
396
|
-
this.router.navigate([], { replaceUrl: true });
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
/* Detect changes */
|
|
400
|
-
this.changeDetectorRef.detectChanges();
|
|
401
|
-
}));
|
|
402
|
-
/* Detect changes for closed panels */
|
|
403
|
-
this.matExpansionPanelSubscriptions.push(y.closed.subscribe(_ => {
|
|
404
|
-
if (this.setUrlHash) {
|
|
405
|
-
/* Get the id of the current opened panel */
|
|
406
|
-
var currentPanelIdParts = y['_viewContainerRef']?.element?.nativeElement?.id?.split('.');
|
|
407
|
-
/* If the panel ID is set, set it as url segment (hash) */
|
|
408
|
-
if (currentPanelIdParts.length > 1) {
|
|
409
|
-
this.router.navigate([], { fragment: currentPanelIdParts.slice(0, -1).join('.'), replaceUrl: true });
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
/* Detect changes */
|
|
413
|
-
this.changeDetectorRef.detectChanges();
|
|
414
|
-
}));
|
|
415
|
-
});
|
|
416
|
-
});
|
|
417
|
-
/* Notify expansion panel list changes */
|
|
418
|
-
if (this.matExpansionPanelQueryList) {
|
|
419
|
-
this.matExpansionPanelQueryList.notifyOnChanges();
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
/**
|
|
423
|
-
* Retrieves an instance from the injector based on the provided token.
|
|
424
|
-
* If not found:
|
|
425
|
-
* - Throws {@link NoProviderError} if no `notFoundValue` that is not equal to
|
|
426
|
-
* Injector.THROW_IF_NOT_FOUND is given
|
|
427
|
-
* - Returns the `notFoundValue` otherwise
|
|
428
|
-
*/
|
|
429
|
-
getService(token) {
|
|
430
|
-
return ServiceLocator.getService(token);
|
|
431
|
-
}
|
|
432
|
-
/**
|
|
433
|
-
* Gets the main route from the given snapshot by traversing up to the parent routes
|
|
434
|
-
* if the current snapshot does not have a menu defined.
|
|
435
|
-
*
|
|
436
|
-
* @param snapshot - The activated route snapshot to evaluate.
|
|
437
|
-
* @returns The main route snapshot that has a menu defined.
|
|
438
|
-
*/
|
|
439
|
-
getMainRoute(snapshot) {
|
|
440
|
-
if (snapshot && snapshot.parent && !snapshot.data.menu) {
|
|
441
|
-
/* Recursively call to get the main route from the parent snapshot */
|
|
442
|
-
return this.getMainRoute(snapshot.parent);
|
|
443
|
-
}
|
|
444
|
-
return snapshot;
|
|
445
|
-
}
|
|
446
|
-
/**
|
|
447
|
-
* Shows a confirm dialog to delete a single item.
|
|
448
|
-
*
|
|
449
|
-
* @returns An observable that emits the result of the dialog after it is closed.
|
|
450
|
-
*/
|
|
451
|
-
showDeleteItemDialog() {
|
|
452
|
-
return this.dialogService.openConfirm({
|
|
453
|
-
message: $localize `:@@dialog.message.delete.one:Are you sure you want to delete this item?`,
|
|
454
|
-
title: $localize `:@@dialog.title.delete:Confirm Delete`,
|
|
455
|
-
cancelButton: $localize `:@@cancel:Cancel`,
|
|
456
|
-
acceptButton: $localize `:@@delete:Delete`,
|
|
457
|
-
}).afterClosed();
|
|
458
|
-
}
|
|
459
|
-
/**
|
|
460
|
-
* Shows a confirm dialog to delete multiple selected items.
|
|
461
|
-
*
|
|
462
|
-
* @returns An observable that emits the result of the dialog after it is closed.
|
|
463
|
-
*/
|
|
464
|
-
showDeleteItemsDialog() {
|
|
465
|
-
return this.dialogService.openConfirm({
|
|
466
|
-
message: $localize `:@@dialog.message.delete.list:Are you sure you want to delete the selected items?`,
|
|
467
|
-
title: $localize `:@@dialog.title.delete:Confirm Delete`,
|
|
468
|
-
cancelButton: $localize `:@@cancel:Cancel`,
|
|
469
|
-
acceptButton: $localize `:@@delete:Delete`,
|
|
470
|
-
}).afterClosed();
|
|
471
|
-
}
|
|
472
|
-
/**
|
|
473
|
-
* Shows a confirmation dialog to send some data.
|
|
474
|
-
*
|
|
475
|
-
* @param message - The message to display in the dialog.
|
|
476
|
-
* @param observable - The observable instance to handle the data.
|
|
477
|
-
* @param successCallback - Optional callback to be invoked on successful operation.
|
|
478
|
-
* @param errorCallback - Optional callback to be invoked on an error.
|
|
479
|
-
* @param acceptButtonText - Optional text for the accept button.
|
|
480
|
-
* @param cancelButtonText - Optional text for the cancel button.
|
|
481
|
-
*/
|
|
482
|
-
showConfirmationDialog(message, observabe, successCallback, errorCallback, acceptButtonText, cancelButtonText, dialogConfig) {
|
|
483
|
-
this.dialogService
|
|
484
|
-
.openConfirm({
|
|
485
|
-
message: message,
|
|
486
|
-
title: $localize `:@@dialog.title.confirm:Confirm`,
|
|
487
|
-
cancelButton: cancelButtonText ?? $localize `:@@cancel:Cancel`,
|
|
488
|
-
acceptButton: acceptButtonText ?? $localize `:@@yes:Yes`,
|
|
489
|
-
}, dialogConfig ?? { maxWidth: 480 })
|
|
490
|
-
.afterClosed().subscribe((accept) => {
|
|
491
|
-
if (accept) {
|
|
492
|
-
observabe.subscribe({
|
|
493
|
-
next: (x) => {
|
|
494
|
-
this.showMessage($localize `:@@snackbar.send.success:Data sent successfully.`);
|
|
495
|
-
if (successCallback) {
|
|
496
|
-
successCallback(x);
|
|
497
|
-
}
|
|
498
|
-
}, error: (errors) => {
|
|
499
|
-
this.isSaving = false;
|
|
500
|
-
if (errorCallback) {
|
|
501
|
-
errorCallback(errors);
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
});
|
|
505
|
-
}
|
|
506
|
-
});
|
|
507
|
-
}
|
|
508
|
-
/**
|
|
509
|
-
* Opens a task dialog with the specified configuration.
|
|
510
|
-
*
|
|
511
|
-
* @typeparam TResult - The type of the result returned from the dialog.
|
|
512
|
-
* @param {Partial<TaskDialogData<TResult>>} config - Configuration options for the task dialog, including messages, callbacks, and observable tasks.
|
|
513
|
-
*
|
|
514
|
-
* @example
|
|
515
|
-
* // Example of how to call showTaskDialog
|
|
516
|
-
* this.showTaskDialog({
|
|
517
|
-
* title: 'Processing Task',
|
|
518
|
-
* inProgressMessage: 'Your task is currently in progress...',
|
|
519
|
-
* successMessage: 'Task completed successfully!',
|
|
520
|
-
* errorMessage: 'An error occurred while processing your task.',
|
|
521
|
-
* task: this.someObservableTask(), // Your observable task goes here
|
|
522
|
-
* successButtonClick: (result, dr) => {
|
|
523
|
-
* console.log('Success button clicked!', result);
|
|
524
|
-
* // Optionally handle the dialog reference here
|
|
525
|
-
* dr.close(result); // Close the dialog with the result
|
|
526
|
-
* },
|
|
527
|
-
* successCallback: (result) => {
|
|
528
|
-
* console.log('Success!', result);
|
|
529
|
-
* },
|
|
530
|
-
* errorCallback: (errors) => {
|
|
531
|
-
* console.error('Error!', errors);
|
|
532
|
-
* },
|
|
533
|
-
* cancelCallback: () => {
|
|
534
|
-
* console.log('Task was canceled.');
|
|
535
|
-
* },
|
|
536
|
-
* });
|
|
537
|
-
*/
|
|
538
|
-
showTaskDialog(config, dialogConfig) {
|
|
539
|
-
return this.openDialog(VdTaskDialogComponent, Object.assign(dialogConfig ?? {}, {
|
|
540
|
-
data: new TaskDialogData(config),
|
|
541
|
-
disableClose: true
|
|
542
|
-
}));
|
|
543
|
-
}
|
|
544
|
-
/**
|
|
545
|
-
* Opens a dialog of the specified type with the provided configuration.
|
|
546
|
-
*
|
|
547
|
-
* @typeparam T - The type of the component to be opened as a dialog.
|
|
548
|
-
* @typeparam D - The type of the data passed to the dialog (default is any).
|
|
549
|
-
* @param {Type<T>} dialogType - The component type to open as a dialog.
|
|
550
|
-
* @param {MatDialogConfig<D>} config - The configuration options for the dialog, such as data and styles.
|
|
551
|
-
* @param {Function} [callback] - Optional callback function to execute after the dialog is closed.
|
|
552
|
-
*
|
|
553
|
-
* @returns {MatDialogRef<T, D>} A reference to the opened dialog.
|
|
554
|
-
*
|
|
555
|
-
* @example
|
|
556
|
-
* // Example of how to use openDialog
|
|
557
|
-
* const dialogRef = this.openDialog(MyDialogComponent, {
|
|
558
|
-
* data: { dialog data here },
|
|
559
|
-
* width: '800px',
|
|
560
|
-
* panelClass: 'custom-dialog-class'
|
|
561
|
-
* }, () => {
|
|
562
|
-
* console.log('Dialog closed.');
|
|
563
|
-
* });
|
|
564
|
-
*
|
|
565
|
-
* // Handling the result from the dialog
|
|
566
|
-
* dialogRef.afterClosed().subscribe(result => {
|
|
567
|
-
* if (result) {
|
|
568
|
-
* console.log('Dialog result:', result);
|
|
569
|
-
* }
|
|
570
|
-
* });
|
|
571
|
-
*/
|
|
572
|
-
openDialog(dialogType, config, callback) {
|
|
573
|
-
/* Open the dialog with specified type and configuration */
|
|
574
|
-
var dialogRef = this.dialog.open(dialogType, Object.assign({
|
|
575
|
-
width: '650px', /* Default width for the dialog */
|
|
576
|
-
data: {}, /* Default data passed to the dialog */
|
|
577
|
-
panelClass: ['dialog-full-screen'] /* Class for the dialog panel */
|
|
578
|
-
}, config)); /* Merge user-defined config with defaults */
|
|
579
|
-
/* If a callback is provided, subscribe to the dialog's afterClosed event */
|
|
580
|
-
if (callback) {
|
|
581
|
-
/* Execute callback after the dialog is closed */
|
|
582
|
-
dialogRef.afterClosed().subscribe(_ => callback());
|
|
583
|
-
}
|
|
584
|
-
/* Return the reference to the opened dialog */
|
|
585
|
-
return dialogRef;
|
|
586
|
-
}
|
|
587
|
-
/**
|
|
588
|
-
* Displays a message using the snack bar service.
|
|
589
|
-
*
|
|
590
|
-
* @param message The message to display (optional, defaults to a success message if not provided)
|
|
591
|
-
* @param type The type of the message (Success, Warning, or Error). Defaults to Success.
|
|
592
|
-
* @param duration The duration (in milliseconds) to show the message. Defaults to 3000ms.
|
|
593
|
-
* @param actionLabel The label for the action button. Defaults to 'OK'.
|
|
594
|
-
* @param playSound A flag indicating whether to play a warning sound when the message type is Warning. Defaults to false.
|
|
595
|
-
* @returns An observable that emits when the action button is clicked.
|
|
596
|
-
*/
|
|
597
|
-
showMessage(message, type = MessageType.Success, duration = 3000, actionLabel = $localize `:@@ok:OK`, playSound = false) {
|
|
598
|
-
/* Default snack bar class to 'primary' (for success messages) */
|
|
599
|
-
let snackBarClass = 'primary';
|
|
600
|
-
/* Determine the appropriate CSS class based on the message type */
|
|
601
|
-
switch (type) {
|
|
602
|
-
case MessageType.Success:
|
|
603
|
-
snackBarClass = 'primary';
|
|
604
|
-
break;
|
|
605
|
-
case MessageType.Warning:
|
|
606
|
-
snackBarClass = 'warn';
|
|
607
|
-
/* Play the warning sound if the playSound flag is true */
|
|
608
|
-
if (playSound) {
|
|
609
|
-
this.playWarnSound();
|
|
610
|
-
}
|
|
611
|
-
break;
|
|
612
|
-
case MessageType.Error:
|
|
613
|
-
snackBarClass = 'error';
|
|
614
|
-
/* Play the warning sound if the playSound flag is true */
|
|
615
|
-
if (playSound) {
|
|
616
|
-
this.playWarnSound();
|
|
617
|
-
}
|
|
618
|
-
break;
|
|
619
|
-
default:
|
|
620
|
-
break;
|
|
621
|
-
}
|
|
622
|
-
/* Display the message in the snack bar, with specified duration and CSS class */
|
|
623
|
-
const snackBarRef = this.snackBarService.open(message, actionLabel, {
|
|
624
|
-
duration: duration,
|
|
625
|
-
panelClass: [snackBarClass]
|
|
626
|
-
});
|
|
627
|
-
/* Emits when the action button is clicked */
|
|
628
|
-
return snackBarRef.onAction().pipe(map(() => { }));
|
|
629
|
-
}
|
|
630
|
-
/**
|
|
631
|
-
* Initializes the TinyMCE editor with custom configuration.
|
|
632
|
-
*
|
|
633
|
-
* @param editorConfig Optional configuration to override default editor settings
|
|
634
|
-
*/
|
|
635
|
-
initEditor(editorConfig = {}) {
|
|
636
|
-
/* Merge the provided editor configuration with default settings */
|
|
637
|
-
Object.assign(this.editorConfig, {
|
|
638
|
-
/* Disable promotions in the editor */
|
|
639
|
-
promotion: false,
|
|
640
|
-
/* Use the minimized version of TinyMCE */
|
|
641
|
-
suffix: '.min',
|
|
642
|
-
/* Disable default TinyMCE skin */
|
|
643
|
-
skin: false,
|
|
644
|
-
/* Set editor height to 170px */
|
|
645
|
-
height: '170px',
|
|
646
|
-
/* Disable loading external CSS for editor content */
|
|
647
|
-
content_css: false,
|
|
648
|
-
/* Set the plugins to be used in the editor */
|
|
649
|
-
plugins: this.editorPlugins,
|
|
650
|
-
/* Set the toolbar configuration */
|
|
651
|
-
toolbar: this.editorToolbar,
|
|
652
|
-
/* Always paste content as plain text */
|
|
653
|
-
paste_as_text: true,
|
|
654
|
-
/* Set the editor language to German */
|
|
655
|
-
language: 'de',
|
|
656
|
-
/* Specify the URL to load the German language file */
|
|
657
|
-
language_url: '/assets/tinymce/langs/de.js',
|
|
658
|
-
/* Set the base URL for documents/files used in the editor */
|
|
659
|
-
document_base_url: `${this.appSetting.apiUrl}file/`,
|
|
660
|
-
/* Enable automatic uploads for file inputs */
|
|
661
|
-
automatic_uploads: true,
|
|
662
|
-
/* Use relative URLs for links and images */
|
|
663
|
-
relative_urls: true,
|
|
664
|
-
/* Disable automatic conversion of relative URLs to absolute URLs */
|
|
665
|
-
convert_urls: false,
|
|
666
|
-
/* Extend valid HTML elements to allow specific attributes */
|
|
667
|
-
extended_valid_elements: 'span[id|class|style],+@[data-options]',
|
|
668
|
-
/* Allow HTML in named anchors */
|
|
669
|
-
allow_html_in_named_anchor: true
|
|
670
|
-
}, editorConfig);
|
|
671
|
-
/* Mark the editor as initialized */
|
|
672
|
-
this.isEditorInitialized = true;
|
|
673
|
-
}
|
|
674
|
-
/**
|
|
675
|
-
* Sets the title and subtitle based on the current menu and route
|
|
676
|
-
*/
|
|
677
|
-
setTitles() {
|
|
678
|
-
/* Check if the menu object is available */
|
|
679
|
-
if (this.menu) {
|
|
680
|
-
/* Set the browser tab title using the menu title, if available */
|
|
681
|
-
this.titleService.setTitle(this.menu.title ?? '');
|
|
682
|
-
/* Update the local title variable from the title service */
|
|
683
|
-
this.title = this.titleService.getTitle();
|
|
684
|
-
/* If there are no submenu items, exit the method */
|
|
685
|
-
if (!this.menu.items) {
|
|
686
|
-
return;
|
|
687
|
-
}
|
|
688
|
-
/* Try to retrieve the subtitle from the URL parameters */
|
|
689
|
-
var subtitle = this.route?.snapshot?.paramMap?.get('subtitle');
|
|
690
|
-
if (subtitle) {
|
|
691
|
-
/* Attempt to decode the subtitle if it's Base64 encoded */
|
|
692
|
-
try {
|
|
693
|
-
this.subtitle = window.atob(subtitle);
|
|
694
|
-
}
|
|
695
|
-
catch (e) {
|
|
696
|
-
/* If decoding fails, use the raw subtitle */
|
|
697
|
-
this.subtitle = subtitle;
|
|
698
|
-
}
|
|
699
|
-
}
|
|
700
|
-
else {
|
|
701
|
-
/* Get the current route path, excluding query parameters and matrix parameters */
|
|
702
|
-
let currentRoute = this.router.url.split('?')[0]?.split(';')[0];
|
|
703
|
-
/* Ensure the route doesn't have a trailing slash */
|
|
704
|
-
currentRoute = currentRoute.endsWith('/') ? currentRoute.substring(0, -1) : currentRoute;
|
|
705
|
-
/* Find the submenu item that matches the current route */
|
|
706
|
-
var submenu = this.menu.items.filter(x => x.path == currentRoute)[0];
|
|
707
|
-
if (submenu) {
|
|
708
|
-
/* Set the subtitle to the matching submenu's title */
|
|
709
|
-
this.subtitle = submenu.title;
|
|
710
|
-
}
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
/**
|
|
715
|
-
* Navigate based on the provided array of commands and a starting point.
|
|
716
|
-
* @param commands Array of commands representing the route to navigate to
|
|
717
|
-
* @param queryParams Optional query parameters to append to the URL
|
|
718
|
-
* @param fragment Optional fragment (anchor) to append to the URL
|
|
719
|
-
* @param preserveFragment Whether to preserve the current fragment in the URL
|
|
720
|
-
*/
|
|
721
|
-
navigate(commands, queryParams, fragment, preserveFragment) {
|
|
722
|
-
this.router.navigate(commands, {
|
|
723
|
-
/* Merge any additional query parameters with a default returnUrl */
|
|
724
|
-
queryParams: Object.assign({ returnUrl: this.currentRoute }, queryParams || {}),
|
|
725
|
-
/* Set the fragment, if provided */
|
|
726
|
-
fragment: fragment,
|
|
727
|
-
/* Preserve the fragment from the previous URL if specified */
|
|
728
|
-
preserveFragment: preserveFragment,
|
|
729
|
-
/* Make the route relative to the current route if applicable */
|
|
730
|
-
relativeTo: this.route
|
|
731
|
-
});
|
|
732
|
-
}
|
|
733
|
-
/**
|
|
734
|
-
* Plays a short beep sound using an embedded audio file in base64 format.
|
|
735
|
-
* The method loads and plays the audio file immediately upon calling.
|
|
736
|
-
*/
|
|
737
|
-
playBeepSound() {
|
|
738
|
-
try {
|
|
739
|
-
this.beepAudio.play();
|
|
740
|
-
}
|
|
741
|
-
catch (error) { }
|
|
742
|
-
}
|
|
743
|
-
/**
|
|
744
|
-
* Plays a short warning sound using an embedded audio file in base64 format.
|
|
745
|
-
* The method loads and plays the audio file immediately upon calling.
|
|
746
|
-
*/
|
|
747
|
-
playWarnSound() {
|
|
748
|
-
try {
|
|
749
|
-
this.warnAudio.play();
|
|
750
|
-
}
|
|
751
|
-
catch (error) { }
|
|
752
|
-
}
|
|
753
|
-
/**
|
|
754
|
-
* Logs a message to the console if debug mode is enabled
|
|
755
|
-
* @param message The message to log
|
|
756
|
-
* @param optionalParams Optional parameters for the log
|
|
757
|
-
*/
|
|
758
|
-
log(message, ...optionalParams) {
|
|
759
|
-
/* Check if debug mode is enabled */
|
|
760
|
-
if (this.debug) {
|
|
761
|
-
/* Log the message and optional parameters to the console */
|
|
762
|
-
console.log(message, optionalParams);
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
/**
|
|
766
|
-
* Logs a warning message to the console if debug mode is enabled
|
|
767
|
-
* @param message The warning message to log
|
|
768
|
-
* @param optionalParams Optional parameters for the warning
|
|
769
|
-
*/
|
|
770
|
-
warn(message, ...optionalParams) {
|
|
771
|
-
/* Check if debug mode is enabled */
|
|
772
|
-
if (this.debug) {
|
|
773
|
-
/* Log the warning message and optional parameters to the console */
|
|
774
|
-
console.warn(message, optionalParams);
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
/**
|
|
778
|
-
* Convert an object to HttpHeaders.
|
|
779
|
-
*
|
|
780
|
-
* @param body The object whose properties will be converted into headers
|
|
781
|
-
* @returns HttpHeaders object containing the key-value pairs from the body
|
|
782
|
-
*/
|
|
783
|
-
toHttpHeaders(body) {
|
|
784
|
-
/* If the body is null or undefined, return empty headers */
|
|
785
|
-
if (!body) {
|
|
786
|
-
return new HttpHeaders();
|
|
787
|
-
}
|
|
788
|
-
/* Convert the object's properties to HttpHeaders, filtering out null or empty values */
|
|
789
|
-
return Object.getOwnPropertyNames(body)
|
|
790
|
-
.filter(key => body[key] != null && body[key] != '')
|
|
791
|
-
.reduce((p, key) => p.set(key, body[key]), new HttpHeaders());
|
|
792
|
-
}
|
|
793
|
-
/**
|
|
794
|
-
* Parses and formats HTTP response errors.
|
|
795
|
-
* @param errors The error object returned from the HTTP response
|
|
796
|
-
*/
|
|
797
|
-
parseErrors(errors) {
|
|
798
|
-
/* Initialize the errors array and reset loading/saving indicators */
|
|
799
|
-
this.errors = [];
|
|
800
|
-
this.isLoading = false;
|
|
801
|
-
this.isSaving = false;
|
|
802
|
-
/* If there are errors, iterate through them and add them to the errors array */
|
|
803
|
-
if (errors) {
|
|
804
|
-
Object.keys(errors).forEach(el => {
|
|
805
|
-
let error = errors[el];
|
|
806
|
-
/* If the error is an array, iterate over the array and add each error */
|
|
807
|
-
if (Array.isArray(error)) {
|
|
808
|
-
error.forEach(err => {
|
|
809
|
-
this.errors.push(err);
|
|
810
|
-
});
|
|
811
|
-
}
|
|
812
|
-
else if (typeof error === "string") {
|
|
813
|
-
/* If the error is a string, add it directly to the errors array */
|
|
814
|
-
this.errors.push(error);
|
|
815
|
-
}
|
|
816
|
-
});
|
|
817
|
-
}
|
|
818
|
-
}
|
|
819
|
-
/**
|
|
820
|
-
* Handle Http operation that failed.
|
|
821
|
-
* Let the app continue.
|
|
822
|
-
* @param operation - name of the operation that failed
|
|
823
|
-
* @param result - optional value to return as the observable result
|
|
824
|
-
*/
|
|
825
|
-
handleError(operation = 'operation', result) {
|
|
826
|
-
return (error) => {
|
|
827
|
-
/* Parse the error messages */
|
|
828
|
-
this.parseErrors(error);
|
|
829
|
-
/* Log to console */
|
|
830
|
-
this.warn(`${operation} failed: ${error.message}`);
|
|
831
|
-
/* Let the app keep running by returning an empty result */
|
|
832
|
-
return of(result);
|
|
833
|
-
};
|
|
834
|
-
}
|
|
835
|
-
/**
|
|
836
|
-
* Cleans the object by removing properties that are null, undefined, or empty strings
|
|
837
|
-
* @param obj The object to clean
|
|
838
|
-
* @returns The cleaned object
|
|
839
|
-
*/
|
|
840
|
-
clean(obj) {
|
|
841
|
-
try {
|
|
842
|
-
/* Iterate through all properties of the object */
|
|
843
|
-
for (var propName in obj) {
|
|
844
|
-
/* If the property value is null, undefined, or an empty string, delete it */
|
|
845
|
-
if (obj[propName] === null || obj[propName] === undefined || obj[propName] === "") {
|
|
846
|
-
delete obj[propName];
|
|
847
|
-
}
|
|
848
|
-
}
|
|
849
|
-
}
|
|
850
|
-
catch (error) {
|
|
851
|
-
/* Error handling can be done here if necessary */
|
|
852
|
-
}
|
|
853
|
-
/* Return the cleaned object */
|
|
854
|
-
return obj;
|
|
855
|
-
}
|
|
856
|
-
/**
|
|
857
|
-
* Sanitizes the specified object by removing falsy values and converting string numbers to numbers
|
|
858
|
-
* @param obj The object to sanitize
|
|
859
|
-
* @param ignore Properties to ignore during the sanitization
|
|
860
|
-
* @returns The sanitized object
|
|
861
|
-
*/
|
|
862
|
-
sanitizeObject(obj, ...ignore) {
|
|
863
|
-
/* Iterate over object keys and filter out falsy values */
|
|
864
|
-
return Object.keys(obj)
|
|
865
|
-
.filter(x => obj[x])
|
|
866
|
-
/* Ignore properties that are in the ignore list (case insensitive) */
|
|
867
|
-
.filter(x => !(ignore || []).map(x => x.toLowerCase()).includes(x.toLowerCase()))
|
|
868
|
-
/* Convert string numbers to actual numbers */
|
|
869
|
-
.reduce((result, key) => {
|
|
870
|
-
result[key] = isNaN(+obj[key]) ? obj[key] : +obj[key];
|
|
871
|
-
return result;
|
|
872
|
-
}, {});
|
|
873
|
-
}
|
|
874
|
-
/**
|
|
875
|
-
* Checks if the user has selected any text in the document
|
|
876
|
-
* @returns True if text is selected, otherwise false
|
|
877
|
-
*/
|
|
878
|
-
isTextSelected = () =>
|
|
879
|
-
/* Use the window.getSelection API to check if text is selected */
|
|
880
|
-
(window?.getSelection()?.toString()?.length ?? 0) > 0;
|
|
881
|
-
/**
|
|
882
|
-
* A callback used for any custom cleanup that needs to occur when the instance is destroyed
|
|
883
|
-
*/
|
|
884
|
-
ngOnDestroy() {
|
|
885
|
-
/* Unsubscribe from all MatExpansionPanel subscriptions */
|
|
886
|
-
this.matExpansionPanelSubscriptions.forEach(x => x.unsubscribe());
|
|
887
|
-
}
|
|
888
|
-
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: BaseComponent, deps: [{ token: i1.ActivatedRoute }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
889
|
-
/** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: BaseComponent, inputs: { handleExpansionPanelChanges: "handleExpansionPanelChanges" }, outputs: { reload: "reload" }, viewQueries: [{ propertyName: "matExpansionPanelElementQueryList", predicate: MatExpansionPanel, descendants: true, read: ElementRef }, { propertyName: "matExpansionPanelQueryList", predicate: MatExpansionPanel, descendants: true }], ngImport: i0 });
|
|
890
|
-
}
|
|
891
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: BaseComponent, decorators: [{
|
|
892
|
-
type: Directive
|
|
893
|
-
}], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i0.ChangeDetectorRef }], propDecorators: { handleExpansionPanelChanges: [{
|
|
894
|
-
type: Input
|
|
895
|
-
}], reload: [{
|
|
896
|
-
type: Output
|
|
897
|
-
}], matExpansionPanelElementQueryList: [{
|
|
898
|
-
type: ViewChildren,
|
|
899
|
-
args: [MatExpansionPanel, { read: ElementRef }]
|
|
900
|
-
}], matExpansionPanelQueryList: [{
|
|
901
|
-
type: ViewChildren,
|
|
902
|
-
args: [MatExpansionPanel]
|
|
903
|
-
}] } });
|
|
904
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi9iYXNlL2NvbXBvbmVudHMvYmFzZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQWlCLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFRLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1SixPQUFPLEVBQUUsU0FBUyxFQUFpQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBeUMsTUFBTSxFQUErQixNQUFNLGlCQUFpQixDQUFDO0FBQzdILE9BQU8sRUFBNEIsR0FBRyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHcEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUNBQXFDLENBQUM7OztBQUU1RTs7R0FFRztBQUNILFdBQVc7QUFFWCxNQUFNLE9BQWdCLGFBQWE7SUFxT1o7SUFBaUM7SUFwT3ZEOztPQUVHO0lBQ0ksVUFBVSxDQUFhO0lBRTlCOztPQUVHO0lBQ0ksUUFBUSxHQUFRLEVBQUUsQ0FBQztJQUUxQjs7T0FFRztJQUNJLElBQUksQ0FBUTtJQUVuQjs7T0FFRztJQUNJLFdBQVcsQ0FBVTtJQUU1Qjs7T0FFRztJQUNJLEtBQUssQ0FBVTtJQUV0Qjs7T0FFRztJQUNJLFFBQVEsQ0FBVTtJQUV6Qjs7T0FFRztJQUNJLEtBQUssR0FBWSxLQUFLLENBQUM7SUFFOUI7O09BRUc7SUFDSSxTQUFTLEdBQVksS0FBSyxDQUFDO0lBRWxDOztPQUVHO0lBRUksMkJBQTJCLEdBQVksSUFBSSxDQUFDO0lBRW5EOztPQUVHO0lBQ0ksU0FBUyxHQUFZLEtBQUssQ0FBQztJQUNsQyxJQUFXLFFBQVEsS0FBYyxPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDM0UsSUFBVyxRQUFRLENBQUMsUUFBaUIsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUV0Rjs7T0FFRztJQUNJLG1CQUFtQixHQUFZLEtBQUssQ0FBQztJQUU1Qzs7T0FFRztJQUNJLE1BQU0sR0FBa0IsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUVuRDs7T0FFRztJQUNJLEtBQUssQ0FBaUI7SUFFN0I7O09BRUc7SUFDSSxpQkFBaUIsR0FBYSxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFFOUQ7O09BRUc7SUFDSSxhQUFhLEdBQVcsTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUVwRDs7T0FFRztJQUNJLGFBQWEsR0FBVyxNQUFNLENBQUMsYUFBYSxDQUFDO0lBRXBEOztPQUVHO0lBQ0ksWUFBWSxHQUFRLEVBQUUsQ0FBQztJQUU5Qjs7T0FFRztJQUNJLE1BQU0sQ0FBUztJQUV0Qjs7T0FFRztJQUNJLE9BQU8sQ0FBVTtJQUV4Qjs7T0FFRztJQUNJLFNBQVMsQ0FBVTtJQUUxQjs7T0FFRztJQUNJLFNBQVMsR0FBWSxLQUFLLENBQUM7SUFFbEM7O09BRUc7SUFDSSxPQUFPLEdBQVksS0FBSyxDQUFDO0lBRWhDOztPQUVHO0lBQ0ksU0FBUyxHQUFZLEtBQUssQ0FBQztJQUVsQzs7T0FFRztJQUNJLFNBQVMsR0FBWSxLQUFLLENBQUM7SUFFbEM7O09BRUc7SUFDSSxZQUFZLENBQVU7SUFFN0I7O09BRUc7SUFDSSxnQkFBZ0IsQ0FBVTtJQUVqQzs7T0FFRztJQUNJLFNBQVMsQ0FBVTtJQUUxQjs7T0FFRztJQUNJLFdBQVcsR0FBYSxVQUFVLENBQUMsSUFBSSxDQUFDO0lBRS9DOztPQUVHO0lBQ0ksT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRS9EOztPQUVHO0lBQ0ksYUFBYSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFFM0U7O09BRUc7SUFDSSxpQkFBaUIsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBRW5GOztPQUVHO0lBRUksTUFBTSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO0lBRTNEOztPQUVHO0lBQ08sWUFBWSxDQUFRO0lBRTlCOztPQUVHO0lBQ08sZUFBZSxDQUFjO0lBRXZDOztPQUVHO0lBQ08sYUFBYSxDQUFrQjtJQUV6Qzs7T0FFRztJQUNPLE1BQU0sQ0FBWTtJQUU1Qjs7T0FFRztJQUNPLFFBQVEsQ0FBVztJQUU3Qjs7T0FFRztJQUNPLFVBQVUsR0FBWSxJQUFJLENBQUM7SUFFckM7O09BRUc7SUFFTyxpQ0FBaUMsQ0FBeUI7SUFFcEU7O09BRUc7SUFFTywwQkFBMEIsQ0FBZ0M7SUFFcEU7O09BRUc7SUFDTyw4QkFBOEIsR0FBbUIsRUFBRSxDQUFDO0lBRTlEOztPQUVHO0lBQ08sU0FBUyxHQUFHLElBQUksS0FBSyxDQUFDLHcvSEFBdy9ILENBQUMsQ0FBQztJQUUxaEk7O09BRUc7SUFDTyxTQUFTLEdBQUcsSUFBSSxLQUFLLENBQUMsby9HQUFvL0csQ0FBQyxDQUFDO0lBRXRoSDs7Ozs7O09BTUc7SUFDSCxZQUFzQixLQUFxQixFQUFZLGlCQUFvQztRQUFyRSxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUFZLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDMUYsa0NBQWtDO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUzQyxzREFBc0Q7UUFDdEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXRELHlEQUF5RDtRQUN6RCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFekMsa0VBQWtFO1FBQ2xFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUU3Qyx1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXBELGtEQUFrRDtRQUNsRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEMseUNBQXlDO1FBQ3pDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU5QywwREFBMEQ7UUFDMUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTFDLGdFQUFnRTtRQUNoRSxhQUFhLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUNyQyxhQUFhLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDbkMsYUFBYSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRTNDLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNQLHdDQUF3QztRQUN4QyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDaEMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2xCLENBQUM7UUFFRCxtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQztRQUU1QyxvRUFBb0U7UUFDcEUsSUFBSSxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxTQUFTLEtBQUssVUFBVSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFcEQsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQXNCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUM7UUFFbkYsMENBQTBDO1FBQzFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBaUIsRUFBRSxFQUFFO2dCQUNyRCxJQUFJLENBQUMsU0FBUyxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdILElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRSxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDcEUsQ0FBQyxDQUFDLENBQUM7UUFDSixDQUFDO1FBRUQsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRFOztXQUVHO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2hDLElBQUksYUFBYSxHQUFJLENBQVksRUFBRSxXQUE0QixDQUFDO1lBQ2hFLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRCxDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7UUFFSCw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2QsaUVBQWlFO1FBQ2pFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFdkIscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUVqQjs7O1dBR0c7UUFDSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFdkMsbURBQW1EO1FBQ25ELElBQUksSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDaEMsQ0FBQztJQUNGLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLFVBQVUsQ0FBQyxRQUF1QztRQUN4RCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3JFLHNDQUFzQztnQkFDdEMsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDZCxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RCLENBQUM7WUFDRixDQUFDLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ksbUJBQW1CO1FBQ3pCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLGdEQUFnRDtZQUNoRCxJQUFJLE9BQU8sR0FBWSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFNUQsZ0NBQWdDO1lBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDRixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksYUFBYTtRQUNuQiw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ08sWUFBWSxDQUFDLFNBQWlCO1FBQ3ZDLElBQUksQ0FBQztZQUNKLDhEQUE4RDtZQUM5RCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUM5RSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNoQiwyQkFBMkI7UUFDNUIsQ0FBQztJQUNGLENBQUM7SUFFRDs7T0FFRztJQUNPLHVCQUF1QjtRQUNoQyx3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDdEQsOERBQThEO1lBQzlELElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUVsRSxvQkFBb0I7WUFDcEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRXZDLDBDQUEwQztZQUMxQyxJQUFJLHNCQUFzQixHQUFHLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxPQUFPLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM1SSxJQUFJLHNCQUFzQixJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxzQkFBc0I7Z0JBQ3RCLElBQUksQ0FBQywwQkFBMEIsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUU5RCx3QkFBd0I7Z0JBQ3hCLElBQUksQ0FBQywwQkFBMEIsRUFBRSxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUUzRSxvQkFBb0I7Z0JBQ3BCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ1AsK0RBQStEO2dCQUMvRCxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUM7b0JBQ3ZCLEVBQUUsTUFBTSxDQUFDLENBQUMsV0FBZ0IsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ3RKLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUU7b0JBQzFCLElBQUksbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLE9BQU8sRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO29CQUM5SCxJQUFJLG1CQUFtQixJQUFJLENBQUMsRUFBRSxDQUFDO3dCQUM5QixJQUFJLENBQUMsMEJBQTBCLEVBQUUsT0FBTyxFQUFFLENBQUMsbUJBQW1CLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQzt3QkFDeEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUN4QyxDQUFDO2dCQUNGLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELHNDQUFzQztZQUN0QyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUM1QyxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUMvRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzt3QkFDckIsNENBQTRDO3dCQUM1QyxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUMsbUJBQW1CLENBQUMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQzt3QkFFeEUsMERBQTBEO3dCQUMxRCxJQUFJLGNBQWMsRUFBRSxDQUFDOzRCQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3dCQUMxRSxDQUFDO3dCQUVELCtDQUErQzs2QkFDMUMsQ0FBQzs0QkFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzt3QkFDaEQsQ0FBQztvQkFDRixDQUFDO29CQUVELG9CQUFvQjtvQkFDcEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUN4QyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVKLHNDQUFzQztnQkFDdEMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDL0QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7d0JBQ3JCLDRDQUE0Qzt3QkFDNUMsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLENBQUMsbUJBQW1CLENBQUMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBRXpGLDBEQUEwRDt3QkFDMUQsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7NEJBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3dCQUN0RyxDQUFDO29CQUNGLENBQUM7b0JBRUQsb0JBQW9CO29CQUNwQixJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3hDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgseUNBQXlDO1FBQ3pDLElBQUksSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ25ELENBQUM7SUFDRixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ08sVUFBVSxDQUFJLEtBQWM7UUFDckMsT0FBTyxjQUFjLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTyxZQUFZLENBQUMsUUFBZ0M7UUFDdEQsSUFBSSxRQUFRLElBQUksUUFBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekQscUVBQXFFO1lBQ3JFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFTLENBQUMsTUFBTyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ08sb0JBQW9CO1FBQzdCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7WUFDckMsT0FBTyxFQUFFLFNBQVMsQ0FBQSx5RUFBeUU7WUFDM0YsS0FBSyxFQUFFLFNBQVMsQ0FBQSx1Q0FBdUM7WUFDdkQsWUFBWSxFQUFFLFNBQVMsQ0FBQSxrQkFBa0I7WUFDekMsWUFBWSxFQUFFLFNBQVMsQ0FBQSxrQkFBa0I7U0FDekMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7OztPQUlHO0lBQ08scUJBQXFCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7WUFDckMsT0FBTyxFQUFFLFNBQVMsQ0FBQSxtRkFBbUY7WUFDckcsS0FBSyxFQUFFLFNBQVMsQ0FBQSx1Q0FBdUM7WUFDdkQsWUFBWSxFQUFFLFNBQVMsQ0FBQSxrQkFBa0I7WUFDekMsWUFBWSxFQUFFLFNBQVMsQ0FBQSxrQkFBa0I7U0FDekMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxzQkFBc0IsQ0FDNUIsT0FBZSxFQUNmLFNBQTBCLEVBQzFCLGVBQTBCLEVBQzFCLGFBQXdCLEVBQ3hCLGdCQUF5QixFQUN6QixnQkFBeUIsRUFDekIsWUFBOEI7UUFFOUIsSUFBSSxDQUFDLGFBQWE7YUFDaEIsV0FBVyxDQUFDO1lBQ1osT0FBTyxFQUFFLE9BQU87WUFDaEIsS0FBSyxFQUFFLFNBQVMsQ0FBQSxpQ0FBaUM7WUFDakQsWUFBWSxFQUFFLGdCQUFnQixJQUFJLFNBQVMsQ0FBQSxrQkFBa0I7WUFDN0QsWUFBWSxFQUFFLGdCQUFnQixJQUFJLFNBQVMsQ0FBQSxZQUFZO1NBQ3ZELEVBQUUsWUFBWSxJQUFzQixFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUcsQ0FBQzthQUN2RCxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFlLEVBQUUsRUFBRTtZQUM1QyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNaLFNBQVMsQ0FBQyxTQUFTLENBQUM7b0JBQ25CLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUNYLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFBLGtEQUFrRCxDQUFDLENBQUM7d0JBQzlFLElBQUksZUFBZSxFQUFFLENBQUM7NEJBQ3JCLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDcEIsQ0FBQztvQkFDRixDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7d0JBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO3dCQUN0QixJQUFJLGFBQWEsRUFBRSxDQUFDOzRCQUNuQixhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3ZCLENBQUM7b0JBQ0YsQ0FBQztpQkFDRCxDQUFDLENBQUM7WUFDSixDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BNkJHO0lBQ0ksY0FBYyxDQUFnQixNQUF3QyxFQUFFLFlBQXVDO1FBQ3JILE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBd0IscUJBQXFCLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRSxFQUFtQjtZQUN2SCxJQUFJLEVBQUUsSUFBSSxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQ2hDLFlBQVksRUFBRSxJQUFJO1NBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0EyQkc7SUFDSSxVQUFVLENBQWEsVUFBbUIsRUFBRSxNQUEwQixFQUFFLFFBQW1CO1FBQ2pHLDJEQUEyRDtRQUMzRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUMxRCxLQUFLLEVBQUUsT0FBTyxFQUFFLGtDQUFrQztZQUNsRCxJQUFJLEVBQUUsRUFBRSxFQUFFLHVDQUF1QztZQUNqRCxVQUFVLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLGdDQUFnQztTQUNuRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyw2Q0FBNkM7UUFFMUQsNEVBQTRFO1FBQzVFLElBQUksUUFBUSxFQUFFLENBQUM7WUFDZCxpREFBaUQ7WUFDakQsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUVELCtDQUErQztRQUMvQyxPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ08sV0FBVyxDQUNwQixPQUFlLEVBQ2YsT0FBb0IsV0FBVyxDQUFDLE9BQU8sRUFDdkMsV0FBbUIsSUFBSSxFQUN2QixjQUFzQixTQUFTLENBQUEsVUFBVSxFQUN6QyxZQUFxQixLQUFLO1FBRTFCLGlFQUFpRTtRQUNqRSxJQUFJLGFBQWEsR0FBRyxTQUFTLENBQUM7UUFFOUIsbUVBQW1FO1FBQ25FLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDZCxLQUFLLFdBQVcsQ0FBQyxPQUFPO2dCQUN2QixhQUFhLEdBQUcsU0FBUyxDQUFDO2dCQUMxQixNQUFNO1lBRVAsS0FBSyxXQUFXLENBQUMsT0FBTztnQkFDdkIsYUFBYSxHQUFHLE1BQU0sQ0FBQztnQkFFdkIsMERBQTBEO2dCQUMxRCxJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUNmLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDdEIsQ0FBQztnQkFFRCxNQUFNO1lBRVAsS0FBSyxXQUFXLENBQUMsS0FBSztnQkFDckIsYUFBYSxHQUFHLE9BQU8sQ0FBQztnQkFFeEIsMERBQTBEO2dCQUMxRCxJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUNmLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDdEIsQ0FBQztnQkFFRCxNQUFNO1lBRVA7Z0JBQ0MsTUFBTTtRQUNSLENBQUM7UUFFRCxpRkFBaUY7UUFDakYsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQzVDLE9BQU8sRUFDUCxXQUFXLEVBQ1g7WUFDQyxRQUFRLEVBQUUsUUFBUTtZQUNsQixVQUFVLEVBQUUsQ0FBQyxhQUFhLENBQUM7U0FDM0IsQ0FDRCxDQUFDO1FBRUYsNkNBQTZDO1FBQzdDLE9BQU8sV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLFVBQVUsQ0FBQyxlQUFvQixFQUFFO1FBQzFDLG1FQUFtRTtRQUNuRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDaEMsc0NBQXNDO1lBQ3RDLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLDBDQUEwQztZQUMxQyxNQUFNLEVBQUUsTUFBTTtZQUNkLGtDQUFrQztZQUNsQyxJQUFJLEVBQUUsS0FBSztZQUNYLGdDQUFnQztZQUNoQyxNQUFNLEVBQUUsT0FBTztZQUNmLHFEQUFxRDtZQUNyRCxXQUFXLEVBQUUsS0FBSztZQUNsQiw4Q0FBOEM7WUFDOUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQzNCLG1DQUFtQztZQUNuQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDM0Isd0NBQXdDO1lBQ3hDLGFBQWEsRUFBRSxJQUFJO1lBQ25CLHVDQUF1QztZQUN2QyxRQUFRLEVBQUUsSUFBSTtZQUNkLHNEQUFzRDtZQUN0RCxZQUFZLEVBQUUsNkJBQTZCO1lBQzNDLDZEQUE2RDtZQUM3RCxpQkFBaUIsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxPQUFPO1lBQ25ELDhDQUE4QztZQUM5QyxpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLDRDQUE0QztZQUM1QyxhQUFhLEVBQUUsSUFBSTtZQUNuQixvRUFBb0U7WUFDcEUsWUFBWSxFQUFFLEtBQUs7WUFDbkIsNkRBQTZEO1lBQzdELHVCQUF1QixFQUFFLHVDQUF1QztZQUNoRSxpQ0FBaUM7WUFDakMsMEJBQTBCLEVBQUUsSUFBSTtTQUNoQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRWpCLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNPLFNBQVM7UUFDbEIsMkNBQTJDO1FBQzNDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2Ysa0VBQWtFO1lBQ2xFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELDREQUE0RDtZQUM1RCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7WUFFMUMsb0RBQW9EO1lBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUN0QixPQUFPO1lBQ1IsQ0FBQztZQUVELDBEQUEwRDtZQUMxRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9ELElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2QsMkRBQTJEO2dCQUMzRCxJQUFJLENBQUM7b0JBQ0osSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1osNkNBQTZDO29CQUM3QyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztnQkFDMUIsQ0FBQztZQUNGLENBQUM7aUJBQU0sQ0FBQztnQkFDUCxrRkFBa0Y7Z0JBQ2xGLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRWhFLG9EQUFvRDtnQkFDcEQsWUFBWSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztnQkFFekYsMERBQTBEO2dCQUMxRCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRSxJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUNiLHNEQUFzRDtvQkFDdEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUMvQixDQUFDO1lBQ0YsQ0FBQztRQUNGLENBQUM7SUFDRixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksUUFBUSxDQUFDLFFBQWUsRUFBRSxXQUFpQixFQUFFLFFBQWlCLEVBQUUsZ0JBQTBCO1FBQ2hHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRTtZQUM5QixvRUFBb0U7WUFDcEUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDL0UsbUNBQW1DO1lBQ25DLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLDhEQUE4RDtZQUM5RCxnQkFBZ0IsRUFBRSxnQkFBZ0I7WUFDbEMsZ0VBQWdFO1lBQ2hFLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSztTQUN0QixDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksYUFBYTtRQUNuQixJQUFJLENBQUM7WUFDSixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksYUFBYTtRQUNuQixJQUFJLENBQUM7WUFDSixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEdBQUcsQ0FBQyxPQUFZLEVBQUUsR0FBRyxjQUFxQjtRQUNoRCxvQ0FBb0M7UUFDcEMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsNERBQTREO1lBQzVELE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7SUFDRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLElBQUksQ0FBQyxPQUFlLEVBQUUsR0FBRyxjQUFxQjtRQUNwRCxvQ0FBb0M7UUFDcEMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsb0VBQW9FO1lBQ3BFLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7SUFDRixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxhQUFhLENBQUMsSUFBUztRQUNoQyw0REFBNEQ7UUFDNUQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1gsT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFFRCx3RkFBd0Y7UUFDeEYsT0FBTyxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO2FBQ3JDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNuRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVEOzs7T0FHRztJQUNPLFdBQVcsQ0FBQyxNQUFXO1FBQ2hDLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUV0QixnRkFBZ0Y7UUFDaEYsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNoQyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZCLHlFQUF5RTtnQkFDekUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQzFCLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUN2QixDQUFDLENBQUMsQ0FBQztnQkFDSixDQUFDO3FCQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ3RDLG1FQUFtRTtvQkFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3pCLENBQUM7WUFDRixDQUFDLENBQUMsQ0FBQztRQUNKLENBQUM7SUFDRixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxXQUFXLENBQUksU0FBUyxHQUFHLFdBQVcsRUFBRSxNQUFVO1FBQzNELE9BQU8sQ0FBQyxLQUFVLEVBQWlCLEVBQUU7WUFFcEMsOEJBQThCO1lBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFeEIsb0JBQW9CO1lBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLFlBQVksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFFbkQsMkRBQTJEO1lBQzNELE9BQU8sRUFBRSxDQUFDLE1BQVcsQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ08sS0FBSyxDQUFDLEdBQVE7UUFDdkIsSUFBSSxDQUFDO1lBQ0osa0RBQWtEO1lBQ2xELEtBQUssSUFBSSxRQUFRLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQzFCLDZFQUE2RTtnQkFDN0UsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO29CQUNuRixPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdEIsQ0FBQztZQUNGLENBQUM7UUFDRixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNoQixrREFBa0Q7UUFDbkQsQ0FBQztRQUVELCtCQUErQjtRQUMvQixPQUFPLEdBQUcsQ0FBQztJQUNaLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLGNBQWMsQ0FBQyxHQUFRLEVBQUUsR0FBRyxNQUFnQjtRQUNyRCwwREFBMEQ7UUFDMUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQzthQUNyQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsc0VBQXNFO2FBQ3JFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ2pGLDhDQUE4QzthQUM3QyxNQUFNLENBQUMsQ0FBQyxNQUFXLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDNUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELE9BQU8sTUFBTSxDQUFDO1FBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVEOzs7T0FHRztJQUNPLGNBQWMsR0FBRyxHQUFZLEVBQUU7SUFDeEMsa0VBQWtFO0lBQ2xFLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFdkQ7O09BRUc7SUFDSCxXQUFXO1FBQ1YsMERBQTBEO1FBQzFELElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNuRSxDQUFDOzBIQXQrQm9CLGFBQWE7OEdBQWIsYUFBYSx1TEFzTXBCLGlCQUFpQiwyQkFBVSxVQUFVLDZEQU1yQyxpQkFBaUI7OzJGQTVNVixhQUFhO2tCQURsQyxTQUFTO21IQThDRiwyQkFBMkI7c0JBRGpDLEtBQUs7Z0JBdUhDLE1BQU07c0JBRFosTUFBTTtnQkFxQ0csaUNBQWlDO3NCQUQxQyxZQUFZO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFPM0MsMEJBQTBCO3NCQURuQyxZQUFZO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFR5cGUsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ0NvbmZpZywgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWF0RXhwYW5zaW9uUGFuZWwgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9leHBhbnNpb24nO1xyXG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XHJcbmltcG9ydCB7IFRpdGxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIsIFNjcm9sbCwgVXJsU2VnbWVudCwgVXJsVHJlZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgbWFwLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb250ZXh0SGVscGVyIH0gZnJvbSAnLi4vLi4vY29tbW9uL2NvbW1vbi5tb2R1bGUnO1xyXG5pbXBvcnQgeyBBcHBTZXR0aW5nIH0gZnJvbSAnLi4vLi4vY29tbW9uL21vZGVscy9hcHAtc2V0dGluZyc7XHJcbmltcG9ydCB7IFNlcnZpY2VMb2NhdG9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcnZpY2VzL3NlcnZpY2UtbG9jYXRvcic7XHJcbmltcG9ydCB7IFZkRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uL2RpYWxvZ3Mvc2VydmljZXMvZGlhbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBWZE1lZGlhU2VydmljZSB9IGZyb20gJy4uLy4uL21lZGlhL3NlcnZpY2VzL21lZGlhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNZW51IH0gZnJvbSAnLi4vLi4vbWVudS9tb2RlbHMvbWVudSc7XHJcbmltcG9ydCB7IFRhc2tEaWFsb2dEYXRhIH0gZnJvbSAnLi4vYmFzZS5tb2R1bGUnO1xyXG5pbXBvcnQgeyBDb21tb24gfSBmcm9tICcuLi9jb25zdGFudHMvY29tbW9uJztcclxuaW1wb3J0IHsgR2xvYmFsUm9sZXMgfSBmcm9tICcuLi9jb25zdGFudHMvZ2xvYmFsLXJvbGVzJztcclxuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tICcuLi9lbnVtcy9tZXNzYWdlLXR5cGUnO1xyXG5pbXBvcnQgeyBBdXRoSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9hdXRoLWhlbHBlcic7XHJcbmltcG9ydCB7IElCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pYmFzZS1jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBdXRoVXNlciB9IGZyb20gJy4uL21vZGVscy9hdXRoLXVzZXInO1xyXG5pbXBvcnQgeyBWZFRhc2tEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL3Rhc2stZGlhbG9nL3Rhc2stZGlhbG9nLmNvbXBvbmVudCc7XHJcblxyXG4vKipcclxuICogQSBiYXNlIGxpc3QgY29tcG9uZW50IGZvciBjb21wb25lbnRzIHdpdGggcGFnaW5hdGlvbiBzdXBwb3J0LlxyXG4gKi9cclxuLy8gQGR5bmFtaWNcclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgSUJhc2VDb21wb25lbnQsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcblx0LyoqXHJcblx0ICogQXBwbGljYXRpb24gc2V0dGluZ3MuXHJcblx0ICovXHJcblx0cHVibGljIGFwcFNldHRpbmc6IEFwcFNldHRpbmc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdlbmVyYWwgY29uZmlndXJhdGlvbiBzZXR0aW5ncywgd2l0aCBhIGZsZXhpYmxlIHR5cGUgdG8gYWNjb21tb2RhdGUgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZXR0aW5nczogYW55ID0ge307XHJcblxyXG5cdC8qKlxyXG5cdCAqIE1lbnUgaXRlbXMgZm9yIG5hdmlnYXRpb24uXHJcblx0ICovXHJcblx0cHVibGljIG1lbnU/OiBNZW51O1xyXG5cclxuXHQvKipcclxuXHQgKiBOYW1lIG9mIHRoZSBwcm9qZWN0LCB1c2VkIGZvciBkaXNwbGF5IG9yIGxvZ2dpbmcgcHVycG9zZXMuXHJcblx0ICovXHJcblx0cHVibGljIHByb2plY3ROYW1lPzogc3RyaW5nO1xyXG5cclxuXHQvKipcclxuXHQgKiBUaXRsZSBvZiB0aGUgY3VycmVudCBwYWdlLCBkaXNwbGF5ZWQgaW4gdGhlIHBhZ2UgaGVhZGVyLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0aXRsZT86IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogU3VidGl0bGUgb2YgdGhlIGN1cnJlbnQgb3V0bGV0LCB1c2VkIGZvciBhZGRpdGlvbmFsIHBhZ2UgY29udGV4dC5cclxuXHQgKi9cclxuXHRwdWJsaWMgc3VidGl0bGU/OiBzdHJpbmc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRydWUsIGR1bW15IGRhdGEgaXMgdXNlZCBmb3IgdGVzdGluZywgYW5kIGRlYnVnIGxvZ3MgYXJlIGVuYWJsZWQuXHJcblx0ICovXHJcblx0cHVibGljIGRlYnVnOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlx0IFxyXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIGEgbG9hZGluZyBwcm9jZXNzIGlzIGFjdGl2ZSwgb2Z0ZW4gdXNlZCB0byBzaG93IGEgbG9hZGluZyBzcGlubmVyLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGhhbmRsZSBjaGFuZ2VzIGluIGV4cGFuc2lvbiBwYW5lbHMuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgaGFuZGxlRXhwYW5zaW9uUGFuZWxDaGFuZ2VzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgYSBzYXZlIG9wZXJhdGlvbiBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MuXHJcblx0ICovXHJcblx0cHVibGljIF9pc1NhdmluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdHB1YmxpYyBnZXQgaXNTYXZpbmcoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc1NhdmluZyB8fCB0aGlzLmlzTG9hZGluZzsgfVxyXG5cdHB1YmxpYyBzZXQgaXNTYXZpbmcoaXNTYXZpbmc6IGJvb2xlYW4pIHsgdGhpcy5pc0xvYWRpbmcgPSB0aGlzLl9pc1NhdmluZyA9IGlzU2F2aW5nOyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlZGl0b3IgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXHJcblx0ICovXHJcblx0cHVibGljIGlzRWRpdG9ySW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogU3RvcmVzIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgZHVyaW5nIHJlcXVlc3RzIG9yIG9wZXJhdGlvbnMuXHJcblx0ICovXHJcblx0cHVibGljIGVycm9yczogQXJyYXk8c3RyaW5nPiA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFV0aWxpdHkgdG8gZXZhbHVhdGUgbWVkaWEgcXVlcmllcyBiYXNlZCBvbiB0aGUgY3VycmVudCBzY3JlZW4gb3Igd2luZG93IHNpemUuXHJcblx0ICovXHJcblx0cHVibGljIG1lZGlhOiBWZE1lZGlhU2VydmljZTtcclxuXHJcblx0LyoqXHJcblx0ICogTGlzdCBvZiBwZXJtaXR0ZWQgZmlsZSBleHRlbnNpb25zIGZvciB1cGxvYWQgb3Igc2VsZWN0aW9uLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBhbGxvd2VkRXh0ZW5zaW9uczogc3RyaW5nW10gPSBDb21tb24uYWxsb3dlZEV4dGVuc2lvbnM7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBsdWdpbnMgZW5hYmxlZCBpbiB0aGUgVGlueU1DRSBlZGl0b3IuXHJcblx0ICovXHJcblx0cHVibGljIGVkaXRvclBsdWdpbnM6IHN0cmluZyA9IENvbW1vbi5lZGl0b3JQbHVnaW5zO1xyXG5cclxuXHQvKipcclxuXHQgKiBUb29sYmFyIGNvbmZpZ3VyYXRpb24gZm9yIFRpbnlNQ0UgZWRpdG9yLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBlZGl0b3JUb29sYmFyOiBzdHJpbmcgPSBDb21tb24uZWRpdG9yVG9vbGJhcjtcclxuXHJcblx0LyoqXHJcblx0ICogQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUgZWRpdG9yLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBlZGl0b3JDb25maWc6IGFueSA9IHt9O1xyXG5cclxuXHQvKipcclxuXHQgKiBTZXJ2aWNlIGZvciBuYXZpZ2F0aW9uIGFuZCBVUkwgbWFuaXB1bGF0aW9uLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyByb3V0ZXI6IFJvdXRlcjtcclxuXHJcblx0LyoqXHJcblx0ICogT3B0aW9uYWwgaGFzaCB2YWx1ZSBhcHBlbmRlZCB0byBVUkxzIGZvciBib29rbWFya2luZyBvciBzdGF0ZSBtYW5hZ2VtZW50LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyB1cmxIYXNoPzogc3RyaW5nO1xyXG5cclxuXHQvKipcclxuXHQgKiBDU1MgY2xhc3MgbmFtZShzKSBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXHJcblx0ICovXHJcblx0cHVibGljIGNsYXNzTmFtZT86IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogUGVybWlzc2lvbiBmbGFnIGZvciBjcmVhdGluZyBuZXcgZW50cmllcy5cclxuXHQgKi9cclxuXHRwdWJsaWMgY2FuQ3JlYXRlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBlcm1pc3Npb24gZmxhZyBmb3IgcmVhZGluZyBuZXcgZW50cmllcy5cclxuXHQgKi9cclxuXHRwdWJsaWMgY2FuUmVhZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBQZXJtaXNzaW9uIGZsYWcgZm9yIHVwZGF0aW5nIGV4aXN0aW5nIGVudHJpZXMuXHJcblx0ICovXHJcblx0cHVibGljIGNhblVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBQZXJtaXNzaW9uIGZsYWcgZm9yIGRlbGV0aW5nIGVudHJpZXMuXHJcblx0ICovXHJcblx0cHVibGljIGNhbkRlbGV0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBGdWxsIHBhdGggb2YgdGhlIGN1cnJlbnQgcm91dGUuXHJcblx0ICovXHJcblx0cHVibGljIGN1cnJlbnRSb3V0ZT86IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogQmFzZSBwYXRoIG9mIHRoZSBjdXJyZW50IHJvdXRlLCBleGNsdWRpbmcgc3BlY2lmaWMgcGFyYW1ldGVycyBvciBzdWItcGF0aHMuXHJcblx0ICovXHJcblx0cHVibGljIGN1cnJlbnRCYXNlUm91dGU/OiBzdHJpbmc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVSTCB0byBuYXZpZ2F0ZSBiYWNrIHRvIGFmdGVyIHNhdmluZyBjaGFuZ2VzLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyByZXR1cm5Vcmw/OiBzdHJpbmc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgYXV0aGVudGljYXRlZCB1c2VyLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjdXJyZW50VXNlcjogQXV0aFVzZXIgPSBBdXRoSGVscGVyLnVzZXI7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyBpZiB0aGUgY3VycmVudCB1c2VyIGhhcyBhZG1pbiBwcml2aWxlZ2VzLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBpc0FkbWluID0gQXV0aEhlbHBlci5oYXNSb2xlKEdsb2JhbFJvbGVzLkFkbWluaXN0cmF0b3IpO1xyXG5cclxuXHQvKipcclxuXHQgKiBJbmRpY2F0ZXMgaWYgdGhlIGN1cnJlbnQgdXNlciBoYXMgY2xpZW50IGFkbWluIHByaXZpbGVnZXMuXHJcblx0ICovXHJcblx0cHVibGljIGlzQ2xpZW50QWRtaW4gPSBBdXRoSGVscGVyLmhhc1JvbGUoR2xvYmFsUm9sZXMuQ2xpZW50QWRtaW5pc3RyYXRvcik7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGljYXRlcyBpZiB0aGUgY3VycmVudCB1c2VyIGhhcyBkZXBhcnRtZW50IGFkbWluIHByaXZpbGVnZXMuXHJcblx0ICovXHJcblx0cHVibGljIGlzRGVwYXJ0bWVudEFkbWluID0gQXV0aEhlbHBlci5oYXNSb2xlKEdsb2JhbFJvbGVzLkRlcGFydG1lbnRBZG1pbmlzdHJhdG9yKTtcclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlciBmb3IgcmVsb2FkIGFjdGlvbnMsIHVzZWZ1bCBmb3IgcmVmcmVzaGluZyBkYXRhLlxyXG5cdCAqL1xyXG5cdEBPdXRwdXQoKVxyXG5cdHB1YmxpYyByZWxvYWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcnZpY2UgZm9yIHNldHRpbmcgdGhlIGRvY3VtZW50J3MgdGl0bGUuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHRpdGxlU2VydmljZTogVGl0bGU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcnZpY2UgZm9yIGRpc3BsYXlpbmcgc25hY2sgYmFyIG5vdGlmaWNhdGlvbnMuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHNuYWNrQmFyU2VydmljZTogTWF0U25hY2tCYXI7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlcnZpY2UgZm9yIGRpc3BsYXlpbmcgY29uZmlybWF0aW9uIGFuZCBwcm9tcHQgZGlhbG9ncy5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgZGlhbG9nU2VydmljZTogVmREaWFsb2dTZXJ2aWNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBTZXJ2aWNlIGZvciBvcGVuaW5nIG1vZGFsIGRpYWxvZ3MuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGRpYWxvZzogTWF0RGlhbG9nO1xyXG5cclxuXHQvKipcclxuXHQgKiBTZXJ2aWNlIGZvciBtYW5hZ2luZyBicm93c2VyIGxvY2F0aW9uIGFuZCBoaXN0b3J5LlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBsb2NhdGlvbjogTG9jYXRpb247XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRydWUsIHNldHMgYSBVUkwgaGFzaCBmb3IgbmF2aWdhdGlvbiBzdGF0ZS5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgc2V0VXJsSGFzaDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFF1ZXJ5IGxpc3QgZm9yIGFjY2Vzc2luZyBleHBhbnNpb24gcGFuZWwgZWxlbWVudHMgYXMgRE9NIHJlZmVyZW5jZXMuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZHJlbihNYXRFeHBhbnNpb25QYW5lbCwgeyByZWFkOiBFbGVtZW50UmVmIH0pXHJcblx0cHJvdGVjdGVkIG1hdEV4cGFuc2lvblBhbmVsRWxlbWVudFF1ZXJ5TGlzdD86IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcclxuXHJcblx0LyoqXHJcblx0ICogUXVlcnkgbGlzdCBmb3IgYWNjZXNzaW5nIE1hdEV4cGFuc2lvblBhbmVsIGNvbXBvbmVudCByZWZlcmVuY2VzLlxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGRyZW4oTWF0RXhwYW5zaW9uUGFuZWwpXHJcblx0cHJvdGVjdGVkIG1hdEV4cGFuc2lvblBhbmVsUXVlcnlMaXN0PzogUXVlcnlMaXN0PE1hdEV4cGFuc2lvblBhbmVsPjtcclxuXHJcblx0LyoqXHJcblx0ICogU3Vic2NyaXB0aW9ucyBmb3IgZXhwYW5zaW9uIHBhbmVsIGNoYW5nZXMsIG1hbmFnZWQgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBtYXRFeHBhbnNpb25QYW5lbFN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZSBhIGJlZXAgYXVkaW8gb2JqZWN0IGFuZCBsb2FkIGEgc291bmQgZmlsZSBmcm9tIGEgZGF0YSBVUkwuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGJlZXBBdWRpbyA9IG5ldyBBdWRpbyhcImRhdGE6YXVkaW8vd2F2O2Jhc2U2NCwvL3VRUkFBQUFXTVNMd1VJWUFBc1lrWGdvUXdBRWFZTFdma1dnQUkwd1dzL0l0QUFBR0RnWXRBZ0F5TitRV2FBQWlod01XbTRHOFFRUkRpTWNDQmNIM0NjK0NEdi83eEE0VHZoOVJ6L3k4UUFEQndNV2dRQVpHL0lMTkFBUlE0R0xUY0RlSUlJaHhHT0JBdUQ3aE9mQkIzLzk0Z2NKM3crbzUvNWVJQUlBQUFWd1dnUUFWUTJPUmFJUXdFTUFKaURnOTVHNG5RTDdtUVZXSTZHd1JjZnNaQWNzS2tKdnhneEVqekZVZ2ZIb1NROVFxN0tOd3FId3VCMTNNQTRhMXEvRG1CckhnUGNtamlHb2gvL0V3QzVuR1BFbVM0UmNma1ZLT2hKZitXT2dveEpjbEZ6M2tnbi8vZEJBK3lhMUdodXJObjh6Yi8vOU5OdXROdWh6MzFmLy8vLzl2dC8vL3orSWRBRUFBQUs0TFFJQUtvYkhJdEVJWUNHQUV4QndlOGpjVG9GOXpJS3JFZERZSXVQMk1nT1dGU0UzNHdZaVI1aXFRUGowSkllb1ZkbEc0VkQ0WEE2N21BY05hMWZoekExandIdVRSeERVUS8vaVlCY3pqSGlUSmNJdVB5S2xIUWt2L0xIUVVZa3VTaTU3eVFULy91Z2dmWk5halEzVm16K1p0Ly8rbW0zV20zUTU3NnYvLy8vKzMyLy8vNS9FT2dBQUFEVmdoUUFBQUFBLy91UVpBVUFCMVdJMFBadWdBQUFBQW9Rd0FBQUVrM25SZDJxQUFBQUFDaURnQUFBQUFBQUJDcUVFUVJMQ2d3cEJHTWxKa0l6OGpLaEd2ajRrNmp6Um5xYXNOS0llb2g1Z0k3QkphQzFBMUFvTkJqSmdieUFwVlM0SURsWmdEVTVXVUF4RUtETm1tQUxIelpwMEZrejFGTVRtR0ZsMUZNRXlvZElhdmNDQVVIRFdyS0FJQTRhYTJvQ2dJTEVCdXBaZ0h2QWhFQmNaNmpvUUJ4Uzc2QWdjY3JGbGN6QnZLTEMwUUkyY0JvQ0Z2ZlREQW83ZW9PUUlucURQQnR2ckRFWkJOWU41eHdOd3hRUmZ3OFpRNXdRVkx2TzhPWVUrbUh2RkxsRGgwNU1kZzdCVDZZclJQcENCem5NQjJyLy94S0pqeXlPaCtjSW1yMi80ZG9zY3dENm5lWmp1WlI0QWdBQUJZQUFBQUJ5MXhjZFF0eFlCWVlaZGlma1VEZ3p6WGFYbjk4WjBvaTlJTFU1bUJqRkFObVJ3bFZKMy82allEQW14YWlERzMvNnhqUVFDQ0trUmIvNmtnL3dXK2tTSjUvL3JMb2JrTFNpS21xUC8waWtKdURhU2FTZi82SmlMWUxFWW5XLytrWGcxV1JWSkwvOUVtUTFZWklzdi82UXp3eTVxazcvK3RFVTBua2xzMy96SVVNUEtOWC82eVpMZitrRmdBZmdHeUxGQVV3WS8vdVFaQVVBQmNkNVVpTlBWWEFBQUFwQUFBQUFFMFZaUUt3OUlTQUFBQ2dBQUFBQVZRSXlnSUVsVnJGa0JTK0poaStFQXV1K2xLQWtZVUVJc21FQUVvTWVEbUNFVE12ZlNIVEdrRjVSV0g3a3ovRVNIV1BBcS9rY0NSaHFCdE1kb2tQZE03dmlsN1JHOThBMnNjN3pPNlp2VGRNN3BtT1VBWlRuSlcrTlh4cW1kNDFkcUo2bUxUWHhyUHBuVjhhdmFJZjVTdkw3cG5kUHZQcG5kSlI5S3V1OGZlUHZ1aXVob3JnV2pwN01mL1BSanhjRkNQRGtXMzFzcmlvQ0V4aXZ2OWxjd0tFYUhzZi83b3cyRmwxVC85UmtYZ0VoWUVsQW9DTEZ0TUFyeHdpdkRKSitiUjFIVEtKZGxFb1RFTENJcWdFd1ZHU1EraEltME5iSzhXWGNURUkwVVBvYTJOYkc0eTJLMDBKRVdiWmF2SlhrWWFxbzlDUkhTNTVGY1pUaktFazNOS29DWVVuU1Ewcld4clpiRktiS0loT0tQWmUxY0pLelpTYVFySXlVTEhEWm1WNUs0eHlTc0RSS1dPcnVhbkd0akxKWEZFbXdhSWJETFgwaElQQlVRUFZGVmtRa0RvVU5mU29EZ1FHS1Bla294ZUd6QTREVXZubjRieHpjWnJ0SnlpcEtmUE55NXcrOWxuWHdncXNpeUhOZVNWcGVtdzRiV2I5cHNZZXEvL3VRWkJvQUJRdDR5TVZ4WUFJQUFBa1FvQUFBSHZZcEw1bTZBQWdBQUNYREFBQUFENTlqYmxUaXJRZTl1cEZzbVpicE11ZHk3THoxWDFEWXN4T09TV3BmUHFOWDJXcWt0SzBETXZ1R3dsYk5qNDRUbGVMUFErR3NmYitHT1dPS0pvSXJXYjNjSU1lZU9ONmx6MnVtVHFNWFY4TWozMHlXUHBqb1NhOXVqSzhTeWVKUDV5NW1PVzFENmh2TGVwZXZlRUFFRG8wbWdDUkNsT0VnQU52M0I5YTZmaWtnVVN1L0RtQU1BVHJHeDdubmc1cDVpaW1QTlpzZlFMWUIyc0RMSWt6UktaT0hHQWFVeURjcEZCU0xHOU1DUUFMZ0FJZ1FzMll1bk9zekxTQXlRWVBWQzJZZEdHZUhEMmRUZEprMXBBSEdBV0RqbmtjTEtGeW1TM1JRWlRJbnp5U29Cd01HMFF1ZUMzZ01zQ0VZeFVxbHJjeEs2azFMUVFjc215WWVRUGRDMllmdUdQQVNDQmtjVk1RUXFwVkpzaHVpMXRrWFFKUVYwT1hHQVpNWFNPRUVCUmlyWGJWUlFXN3VncTdJTTdyUFdTWnlEbE0zSXVORWt4ekNPSjBueTJUaE5reVJhaTFiNmV2Ly8zZHpOR3pOYi8vNHVBdkhUNXNVUmNaQ0ZjdUtMaE9GczhtTEFBRUF0NFVXQUFJQUJBQUFBQUI0cWJIbzB0SWpWa1VVLy91UVpBd0FCZlNGejNacVFBQUFBQW5nd0FBQUUxSGpNcDJxQUFBQUFDWkRnQUFBRDVVa1RFMVVnWkVVRXhxWXluTjFxWnZxSU9SRUVGbUJjSlFrd2R4aUZ0dzBxRU9rR1lmUkRpZkJ1aTlNUWc0UUFIQXFXdEFXSG9DeHUxWWY0VmZXTFBJTTJtSERGc2JRRVZHd3lxUW9RY3duZkhlSWtOdDlZbmtpYVMxb2l6eWNxSnJ4NEtPUWphaFp4V2JjWmd6dGoyYzQ5bktta0lkNDRTNzFqMGM4ZVY5eURLNnVQUnp4NVgxOGVEdmp2UTZ5S285WlNTNmwvLzhlbGVQSy9MZi8vSUluck9GL0Z2RG9BRFlBR0JNR2I3RnRFcm01TVhNbG1QQUpRVmdXdGE3WngyZ28rOHhKMFVpQ2I4TEhIZGZ0V3lMSkUwUUlBSXNJK1ViWHU2N2RaTWptZ0RHQ0dsMUgrdnBGNE5TRGNrU0lrazdWZCtzeEVoQlFNUlU4ai8xMlVJUmh6U2FVZFErclFVNWtHZUZ4bStoYjFvaDZwV1dtdjN1dm1SZURsMFVudnRhcFZhSXpvMWpaYmYvcEQ2RWxMcVNYK3JVbU9RTnBKRmEvcitzYTRlL3BCbEFBQm9BQUFBQTNDVWdTaExkR0l4c1k3QVVBQlBScmdDQUJkRHVRNUdDN0RxUFFDZ2JiSlVBb1JTVWorTklFaWcwWWZ5V1VobzFWQkJCQS8vdVFaQjRBQlp4NXpmTWFrZUFBQUFtd0FBQUFGNUYzUDB3OUd0QUFBQ2ZBQUFBQXdMaE1EbUFZV01nVkVHMVUwRklHQ0JnWEJYQXRmTUgxMDAwMEVFRUVFRUNVQllsbjAzVFRUZE5CRFpvcG9wWXZyVFRkTmEzMjVtSW1OZzNUVFBWOXEzcG1ZMHhvTzZidjNyMDB5K0lER2lkLzlhYWFaVEdNdWo5bXB1OU1waW8xZFhycjVIRVJUWlNtcVUzNkEzQ3Vtek4vOVJvYnYvWHg0djlpamtTUlNOTFFoQVd1bWFwODJXUlNCVXFYU3RWL1ljUytYVkxuU1MrV0xEcm9xQXJGa01Fc0FTK2VXbXJVenJPMG9FbUU0MFJsTVo1K09ESWtBeUtBR1V3WjNtVkttY2FtY0puTVcyNk1SUGdVdzZqK0xraHlIR1ZHWWpTVVVLTnB1SlVRb09JQXlEdkV5RzhTNXlmSzZkaFpjMFR4MUtJL2d2aUtMNnF2dkZzMStiV3RhejU4dVVObnJ5cTZrdDVSek9Da1BXbFZxVlgyYS9FRUJVZFUxS3JYTGY0MEdvaWlGWEsvLy9xcG9pRFhyT2dxRFIzOEpCMGJ3N1NvTCtaQjlvMVJDa1FqUTJDQllaS2QvK1ZKeFpSUlpscVNrS2l3czBXRnhVeUN3c0tpTXk3aFVWRmhJYUNyTlFzS2tUSXNMaXZ3S0tpZ3NqOFhZbHd0L1dLaTJONGQvL3VRUkNTQUFqVVJOSUhwTVpCR1lpYVFQU1l5QUFBQkxBQUFBQUFBQUNXQUFBQUFwVUYvTWcrMGFvaFNJUm9iQkFzTWxPLy9LazRzb29zeTFKU0ZSWVdhTEM0cVpCWVdGUkdaZHdxS2l3a05CVm1vV0ZTSmtXRnhYNEZGUlFXUitMc1M0Vy9yRlJiLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vVkVGSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFVMjkxYm1SaWIza3VaR1VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1qQXdOR2gwZEhBNkx5OTNkM2N1YzI5MWJtUmliM2t1WkdVQUFBQUFBQUFBQUNVPVwiKTtcclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlIGEgd2FybiBhdWRpbyBvYmplY3QgYW5kIGxvYWQgYSBzb3VuZCBmaWxlIGZyb20gYSBkYXRhIFVSTC5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgd2FybkF1ZGlvID0gbmV3IEF1ZGlvKFwiZGF0YTphdWRpby9tcDM7YmFzZTY0LC8vdVF4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFXR2x1WndBQUFBOEFBQUFIQUFBS1l3QXBLU2twS1NrcEtTa3BLU2twS1UxTlRVMU5UVTFOVFUxTlRVMU5kM2QzZDNkM2QzZDNkM2QzZDNlQ2dvS0Nnb0tDZ29LQ2dvS0Nnb0t5c3JLeXNyS3lzckt5c3JLeXN0YlcxdGJXMXRiVzF0YlcxdGJXLy8vLy8vLy8vLy8vLy8vLy8vOEFBQUE1VEVGTlJUTXVNVEF3QXFVQUFBQUFMbjRBQUJSR0pBTWZRZ0FBUmdBQUNtT0tsdVFiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEvL3VBeEFBQUNWUkxaTlNSZ0FQQ1FpejNNMEFBQUlBQXJBbUNaUHBBQ0FBQVFNVkRQTkdqUnpML2lJZ0dMZit1NGdFSFJBRDRQNE9BZ0dNSHdmQi9VQ0FZNFBoL2dnNzBjUUEvd2NER29Idy9sQVFkeE8vaUIzQjhQNmdRZC96NEFBQUJhTFVrbGVLWUFBQUFBQ1J3Rnd3RVpYQzg1UmkrbytaWEowT3VDWGdvQlVEUVhQQys0WkdCUTBiaVVEd25vQ293TDZqZkFxUkxvZ29CaWtocUpSSlFESkJCT3prOEJrdzZSWUU4Z09HRGhTQk1FQTRDTGxJMDhWd2NhSlJBbVFLRVFiTkRMRE1rQUUrSkpDOExwRGc0RlRCMUMwVG9MQkNlSmtRaUVHTXNuU1hVa1FPa000ZnFITWRSSkZ5WkQyV2tWRWliT2tSZXRaMGQyZElOTkdMQkJEVlJSS2hxc29sdEpJdnJSbGtySUZsQjJKWG1oYmthdEpaTWtna3Nta01uMldpY1NtWlBzbzZsY21YeVpQTFVjYWlWRWxGWlNLaVhaRXNGeEZpaWd0U1JVLy8vL2FvdGYvLy9vcUxMcXFZQVJtQkJESFFBYTYvN0RYSmxJSnpYTEZXY3c4MXFMUDFaZW1uLyszREVEZ0JRWWExcDNaYUFDakUxclBxdzBBRmRFU0FNUmdTNmVxU01wZ0pFVGsxV2dtcGE2eCtDeEtObmRXdEVIa3YwbHV6b0pvQ3FHMlNLQ0wxWGRBUzhsVHkxTDlGUTZIdjZNa1Q2THQxSnFKeGRSLzBCL01mOWxsQkJmN09lUmIrc3lLSnJiNjVXZGR2cm5UUlNtL1RMNkxmN2xoNyt1WXJXZ3dBemNFUUZsZ1prZHR1RGNEb2tKTzc3Ynl1SDRiamNEdnhVWGdYUkVzRG5qalROanRURjhCVW5WdTYxWFRZUWdOc2hwM3V0Und1QW5BWDgyWjEzc2NNUWhqWk5kMTNTY0xhUGRicnF2UUtpUk4xL1ZZYUhSdXU2NlJ3WlpzdjFVcFJMOTEreWxFRk5sMzFXSGNidC9ZNFh6Njc2OWlRVGQyWDJVc2dJLzF5NlozWDlSa2FtNi9xc1ZLYnFBQUFKSUJsTVk0VUFBQUFyQ0I5S2lDc1hYTWU2SHFXSXNLMGh1dHlDQUNNcHdxaGJjd0FzRmdTeEJBMUJzeUxlLy91QXhCZ0FIdklSWTVtcUFBR1JER3Fqbm1BQUZqQUdrVEdJWHpBNG9FTkpFMkFJQWpxSHdMU0JtU0JTUHFBS2FsUWNBM0ErWXRFVkQ4Z1VUa3NjVUxXRGM0cElrRUYrTENSRWk1TkJ2WnFaQzBEYkdjRS9MaUtEYUY4aWZKd1VrUzV4UW5vbUVUZ3llT1dTMlBDQmdMTlBWakxGUlVneDVJcERUTHhqTWhtYzZRS1R6R0l5ekptSXpKdkhVVENKa1E5RlN4OUZ5U2hmeC81ZkxTWlNJa2ZNQjBteG9tUUVxcEdRN3k4b3ZNeVJIaytrbVJ4aGs2ZnlCSlR4TlpZSjgzUklFZlRVT2FpbzRSWFVSSTJNajVoLy8vL25TVy8vLy9RblNSUUNwQUFrU0xhTGFKcVMxWlA0VzROVVhGWVR5SEljcms4Y3gxWURBSkp5SkdlMWVTSkhEaVUvL3NjREFKRmlTUWRMQlFHandLZ3JnclBZTkEwb0dnNlZCYkVvS3ZCWGtsQTFxUEZRM2xRVldDdkJXRFFkNnpzU2dyaVdXRG1vR3A3N3ZMQnkvLzh0ZmwwWmw3LzlmLy8vLy8vLy8zMHk3Y3lacWVGbDF5WVVaUUV3dUdOYUlFLy8vLy8vLy8vLy8vLy8reERFRmdQRVZiRVFBQVIreUtRMFlnS0FJQUgvL3QzcC83cysxV1JPbjlmLy8vL3ZYNlZkamxiYzdUbEtzamhsRWtBb2xZalFjRGdZNWs4RlFRVUFRU0FMdE1BUWNkSUFJRW1PZURCSUZEQUFzd2RBWnNwYlpLeEh5RURBU1pJRmgyQk80TmpoRGYvN2tNUVpnQitxRVZ1NXVwQVN3VFhzTTdNUUFRTWFCRUFZQW9NNEJ3YkRMNHNRR0hqNEIwUXpBTUxZbkNxWGlDRUVGQ0EzZ0tvQVFCQy93R2NVbUF3SFI0SXVvMFRGd0V5Uk5NdmhmRURBUWpBSUVBeDRnRHFRUEptNXVYR0lJWWgrUU1DNUFSY29qSUZnei9JbVN3eTVYSXViR2dmNEc4b0dFZ0FDd0dSSFVCZ2tILzhuR2NxRjgzTDV1d2RrWEtROENBQkx3cElQWkRha2YvdWhOQ2JJbU9lVDdrVFVvZFFXS0RHa0ZERmlpYUhLQzlCRWYvL1FXYm1aZmN2cE0yczNhTlVjU0tJM3lrWGlMaWwyU0tJNUgvLy8vdVgwa1AvLy96WlF2aWRRQWJnQUNFQUJqS2FqdElJanRJQ1dXdXU1REVQUHRLczQ5cFJNSTJGd2tzek9zNHFVQUl3VVJaZzZLUzAyaU1SQVlpeHN0MGw1cTRhT1V6VkEyT3FjMFNMSWFrR05DZ1hqR3RDaXh3UjJUcFZkYXJzcFprSi9ObHBYWlNNekhna2lkcloyclFNUmhGNU83S1d0ak1aVW4wazJwVkp5SEVSS0tGS3BkMkc0WDJkbEx1eXlIRjh2c2t5azZLU3h5REkyWlNyT3RSaVNCYVdxenJVaVlFNGJsYWh1eTFKRHdYVkx2V3AwQ2VLQnFJWHdEVEJrSkNBRGRhMGZhVTFVVnBzTnVQLzdjTVFJZ0ZKZHJXV05QVytLVGJZczhyRFFBT0M4OHRvNVBLcC9TMlM2QjNIMWFMVEVLU3NNR2VmVnE2Kzk0eGhoRGNnNXp2Vk1XMVVlQmp1dm5QMzg1akVUZk9lN21kVUJ5UTYxUkhkekpXSUpySS82cEFVcVdxSStxWVVxSS9mUDB3V1B1N21QcktoL1VqdTVudXg3ZTI3LzRsdzFvUkZWVXp1TTJIdWZxb2hoQ24yUjFYOGtxbDdtZTdpRkRwNjUvKzNrRENuUUNsRVFSMzMzdHVnd0FIdERWdS9BOUM1Ylc2V3pSWU93SlJHSERsa3V0YWFaaW1hQVRVWlp1YnBLdXVnSjRGVlY5U25TQkxJSGtqQkIzVXc3d1I4TmxBNm5aYTF1WkIwUG1qTDlsazhlQ2xLc3ZZNk9NOGgrcEE2Tmh4VjZ1WmxNMWRtWHVwVGtJNnUvWFFKVXUyWmRtWE15V092NjEySkZUdXBkdFJnaWc2cjFYU0swRGQxZTZqQTNQTFhaU3JxTUhOR1ZBQXdRUVlpQUFBQUFBQUFpUWd6Lys0REVCd0FkWmRsZldhbUFBVkVVbzVlWVVBQ0pqbUZ3TUJjQVcxYUNKNEtJRm5uaWJFRG4waEdWS2cwakFVMHNRMFVtUTRkd3FBRHZGNExxdzRZeEJqVVRWYVFMalBsY09qQXRnWk5qRTRPY1dRYUVBMFBITks0ZkFGL0FWRUlTRFBuQ0JGWXlKNFJVYWFUQ25DcUQyeGNTNDRoaUZGRnBpaFdIL0t0WTJTNFJnajArUlF4RXBFMG92RjR5TmxrekxZcHVpSkl4ZU16VVZzY0p3ZlJPbW5SWW1wa1hwSGp1VkYxdU9rbHlLRHBMU0p1THBNd0lJUG9ta2t0R3RqS3FvV2hMRytjbmlCWmtOczBJb1Z6VkV2anlVeXdPUVRKTUdob1JZeVUraXkwVExNbFhrb1MzLy8vNWZNU2VSLy9hQ29Fb0JhTWo2RXhKcXdRZ0pLQkNBa0ZUWkpQWURKZ0dBSURDeWlJZEsvME1hWjFLVkJJUE1KQjR5bFpETVlXTS8vME5US1dZUE1EUThOQTBBZ2EvNEtsZzREU3pvaVVIZitkTEhrM0NLZS93VmNvOXhFcE1RVTFGTXk0eE1EQ3FxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxZz09XCIpO1xyXG5cclxuXHQvKipcclxuXHQgKiBJbml0aWFsaXplcyBzZXJ2aWNlcyBhbmQgYXBwbGljYXRpb24gc2V0dGluZ3MsIHNldHMgdXAgY29udGV4dCBoZWxwZXJzLCBcclxuXHQgKiBhbmQgaW5pdGlhbGl6ZXMgdGhlIGVkaXRvciB3aXRoIGRlZmF1bHQgY29uZmlndXJhdGlvbnMuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gcm91dGUgLSBBY3RpdmF0ZWRSb3V0ZSBpbnN0YW5jZSBmb3IgYWNjZXNzaW5nIHJvdXRlIHBhcmFtZXRlcnMgYW5kIGRhdGEuXHJcblx0ICogQHBhcmFtIGNoYW5nZURldGVjdG9yUmVmIC0gQ2hhbmdlRGV0ZWN0b3JSZWYgaW5zdGFuY2UgZm9yIG1hbnVhbGx5IHRyaWdnZXJpbmcgY2hhbmdlIGRldGVjdGlvbi5cclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcm91dGU6IEFjdGl2YXRlZFJvdXRlLCBwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcblx0XHQvKiBJbml0aWFsaXplIHRoZSBUaXRsZSBzZXJ2aWNlICovXHJcblx0XHR0aGlzLnRpdGxlU2VydmljZSA9IHRoaXMuZ2V0U2VydmljZShUaXRsZSk7XHJcblxyXG5cdFx0LyogSW5pdGlhbGl6ZSB0aGUgZGlhbG9nIHNlcnZpY2UgZm9yIHNob3dpbmcgbW9kYWxzICovXHJcblx0XHR0aGlzLmRpYWxvZ1NlcnZpY2UgPSB0aGlzLmdldFNlcnZpY2UoVmREaWFsb2dTZXJ2aWNlKTtcclxuXHJcblx0XHQvKiBJbml0aWFsaXplIHRoZSBNYXRlcmlhbCBkaWFsb2cgZm9yIG1hbmFnaW5nIGRpYWxvZ3MgKi9cclxuXHRcdHRoaXMuZGlhbG9nID0gdGhpcy5nZXRTZXJ2aWNlKE1hdERpYWxvZyk7XHJcblxyXG5cdFx0LyogSW5pdGlhbGl6ZSB0aGUgbWVkaWEgc2VydmljZSBmb3IgbWVkaWEgcXVlcmllcyBhbmQgYnJvYWRjYXN0ICovXHJcblx0XHR0aGlzLm1lZGlhID0gdGhpcy5nZXRTZXJ2aWNlKFZkTWVkaWFTZXJ2aWNlKTtcclxuXHJcblx0XHQvKiBJbml0aWFsaXplIHRoZSBzbmFja2JhciBzZXJ2aWNlIGZvciBub3RpZmljYXRpb25zICovXHJcblx0XHR0aGlzLnNuYWNrQmFyU2VydmljZSA9IHRoaXMuZ2V0U2VydmljZShNYXRTbmFja0Jhcik7XHJcblxyXG5cdFx0LyogSW5pdGlhbGl6ZSB0aGUgcm91dGVyIHNlcnZpY2UgZm9yIG5hdmlnYXRpb24gKi9cclxuXHRcdHRoaXMucm91dGVyID0gdGhpcy5nZXRTZXJ2aWNlKFJvdXRlcik7XHJcblxyXG5cdFx0LyogSW5pdGlhbGl6ZSB0aGUgYXBwbGljYXRpb24gc2V0dGluZ3MgKi9cclxuXHRcdHRoaXMuYXBwU2V0dGluZyA9IHRoaXMuZ2V0U2VydmljZShBcHBTZXR0aW5nKTtcclxuXHJcblx0XHQvKiBJbml0aWFsaXplIHRoZSBsb2NhdGlvbiBzZXJ2aWNlIGZvciBVUkwgbWFuaXB1bGF0aW9uICovXHJcblx0XHR0aGlzLmxvY2F0aW9uID0gdGhpcy5nZXRTZXJ2aWNlKExvY2F0aW9uKTtcclxuXHJcblx0XHQvKiBTZXQgdXAgY29udGV4dCBoZWxwZXJzIHdpdGggcm91dGUgYW5kIGFwcGxpY2F0aW9uIHNldHRpbmdzICovXHJcblx0XHRDb250ZXh0SGVscGVyLmFjdGl2YXRlZFJvdXRlID0gcm91dGU7XHJcblx0XHRDb250ZXh0SGVscGVyLnJvdXRlciA9IHRoaXMucm91dGVyO1xyXG5cdFx0Q29udGV4dEhlbHBlci5hcHBTZXR0aW5nID0gdGhpcy5hcHBTZXR0aW5nO1xyXG5cclxuXHRcdC8qIEluaXRpYWxpemUgdGhlIGVkaXRvciB3aXRoIGRlZmF1bHQgY29uZmlndXJhdGlvbnMgKi9cclxuXHRcdHRoaXMuaW5pdEVkaXRvcigpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgYWZ0ZXIgZGF0YS1ib3VuZCBwcm9wZXJ0aWVzIG9mIGEgZGlyZWN0aXZlIGFyZSBpbml0aWFsaXplZFxyXG5cdCAqL1xyXG5cdG5nT25Jbml0KCk6IHZvaWQge1xyXG5cdFx0LyogR2V0IG1lbnUgaXRlbXMgZnJvbSByb3V0ZSBzbmFwc2hvdCAqL1xyXG5cdFx0dmFyIG1haW5Sb3V0ZSA9IHRoaXMuZ2V0TWFpblJvdXRlKHRoaXMucm91dGUuc25hcHNob3QpO1xyXG5cdFx0aWYgKG1haW5Sb3V0ZSkge1xyXG5cdFx0XHR0aGlzLm1lbnUgPSBtYWluUm91dGUuZGF0YS5tZW51O1xyXG5cdFx0XHR0aGlzLnNldFRpdGxlcygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIFNldCBwcm9qZWN0IG5hbWUgJiBkZWJ1ZyBtb2RlICovXHJcblx0XHR0aGlzLnByb2plY3ROYW1lID0gdGhpcy5hcHBTZXR0aW5nLnByb2plY3ROYW1lO1xyXG5cdFx0dGhpcy5kZWJ1ZyA9IHRoaXMuYXBwU2V0dGluZy5kZWJ1ZyA/PyBmYWxzZTtcclxuXHJcblx0XHQvKiBDaGVjayBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBjcmVhdGUsIHVwZGF0ZSwgYW5kIGRlbGV0ZSAqL1xyXG5cdFx0dGhpcy5jYW5DcmVhdGUgfHw9IEF1dGhIZWxwZXIuaXNQZXJtaXR0ZWQoJ0NyZWF0ZScpO1xyXG5cdFx0dGhpcy5jYW5VcGRhdGUgfHw9IEF1dGhIZWxwZXIuaXNQZXJtaXR0ZWQoJ1VwZGF0ZScpO1xyXG5cdFx0dGhpcy5jYW5EZWxldGUgfHw9IEF1dGhIZWxwZXIuaXNQZXJtaXR0ZWQoJ0RlbGV0ZScpO1xyXG5cclxuXHRcdC8qIEdldCB0aGUgaGFzaCBmcm9tIHRoZSBVUkwgKi9cclxuXHRcdHRoaXMucm91dGUuZnJhZ21lbnQuc3Vic2NyaWJlKChmcmFnbWVudDogc3RyaW5nIHwgYW55KSA9PiB0aGlzLnVybEhhc2ggPSBmcmFnbWVudCk7XHJcblxyXG5cdFx0LyogQ2hlY2sgcGVybWlzc2lvbnMgYmFzZWQgb24gdGhlIHJvdXRlICovXHJcblx0XHRpZiAodGhpcy5yb3V0ZS5wYXJlbnQpIHtcclxuXHRcdFx0dGhpcy5yb3V0ZS5wYXJlbnQudXJsLnN1YnNjcmliZSgodXJsOiBVcmxTZWdtZW50W10pID0+IHtcclxuXHRcdFx0XHR0aGlzLmNsYXNzTmFtZSA/Pz0gdXJsLmxlbmd0aCA/IHVybFswXS5wYXRoLnJlcGxhY2UoLyguKilzJC8sICckMScpLnJlcGxhY2UoL14uLywgKHVybFswXS5wYXRoWzBdIHx8ICcnKS50b1VwcGVyQ2FzZSgpKSA6ICcnO1xyXG5cdFx0XHRcdHRoaXMuY2FuQ3JlYXRlID0gQXV0aEhlbHBlci5pc1Blcm1pdHRlZChgQ3JlYXRlJHt0aGlzLmNsYXNzTmFtZX1gKTtcclxuXHRcdFx0XHR0aGlzLmNhblVwZGF0ZSA9IEF1dGhIZWxwZXIuaXNQZXJtaXR0ZWQoYFVwZGF0ZSR7dGhpcy5jbGFzc05hbWV9YCk7XHJcblx0XHRcdFx0dGhpcy5jYW5EZWxldGUgPSBBdXRoSGVscGVyLmlzUGVybWl0dGVkKGBEZWxldGUke3RoaXMuY2xhc3NOYW1lfWApO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBTZXQgdGhlIGN1cnJlbnQgcm91dGUgYW5kIGJhc2Ugcm91dGUgKi9cclxuXHRcdHRoaXMuY3VycmVudFJvdXRlID0gd2luZG93LmJ0b2EodGhpcy5yb3V0ZXIudXJsKTtcclxuXHRcdHRoaXMuY3VycmVudEJhc2VSb3V0ZSA9IHRoaXMucm91dGVyLnVybD8uc3BsaXQoJz8nKVswXT8uc3BsaXQoJzsnKVswXTtcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNldCB0aGUgcGFnZSB0aXRsZSBiYXNlZCBvbiB0aGUgbmF2aWdhdGlvbiBlbmQgZXZlbnRcclxuXHRcdCAqL1xyXG5cdFx0dGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSh4ID0+IHtcclxuXHRcdFx0bGV0IG5hdmlnYXRpb25FbmQgPSAoeCBhcyBTY3JvbGwpPy5yb3V0ZXJFdmVudCBhcyBOYXZpZ2F0aW9uRW5kO1xyXG5cdFx0XHRpZiAobmF2aWdhdGlvbkVuZCkge1xyXG5cdFx0XHRcdHRoaXMuc2V0VGl0bGVzKCk7XHJcblx0XHRcdFx0dGhpcy5jdXJyZW50Um91dGUgPSB3aW5kb3cuYnRvYShuYXZpZ2F0aW9uRW5kLnVybCk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdC8qIFJldHJpZXZlIHRoZSByZXR1cm4gVVJMIGlmIGFueSBmcm9tIHRoZSBxdWVyeSBwYXJhbWV0ZXJzICovXHJcblx0XHR0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSh4ID0+IHRoaXMuc2V0UmV0dXJuVXJsKHgucmV0dXJuVXJsKSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCBhZnRlciBhIGNvbXBvbmVudCdzIHZpZXcgaGFzIGJlZW4gZnVsbHkgaW5pdGlhbGl6ZWRcclxuXHQgKi9cclxuXHRuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcblx0XHQvKiBCcm9hZGNhc3QgdG8gYWxsIGxpc3RlbmVyIG9ic2VydmFibGVzIHdoZW4gbG9hZGluZyB0aGUgcGFnZSAqL1xyXG5cdFx0dGhpcy5tZWRpYS5icm9hZGNhc3QoKTtcclxuXHJcblx0XHQvKiBTZXQgcGFnZSB0aXRsZXMgKi9cclxuXHRcdHRoaXMuc2V0VGl0bGVzKCk7XHJcblxyXG5cdFx0LyogXHJcblx0XHQgKiBGb3JjZSBhIG5ldyBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIHNpbmNlIGNoYW5nZSBkZXRlY3Rpb25zIFxyXG5cdFx0ICogaGF2ZSBmaW5pc2hlZCB3aGVuIGBuZ0FmdGVyVmlld0luaXRgIGlzIGV4ZWN1dGVkXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuXHRcdC8qIExpc3RlbiBmb3IgZXhwYW5zaW9uIHBhbmVsIGNoYW5nZXMgaWYgZW5hYmxlZCAqL1xyXG5cdFx0aWYgKHRoaXMuaGFuZGxlRXhwYW5zaW9uUGFuZWxDaGFuZ2VzKSB7XHJcblx0XHRcdHRoaXMub25FeHBhbnNpb25QYW5lbENoYW5nZXMoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbG9hZHMgdGhlIGN1cnJlbnQgcGFnZSBvciBjb21wb25lbnQuXHJcblx0ICogXHJcblx0ICogVGhpcyBtZXRob2QgbmF2aWdhdGVzIHRlbXBvcmFyaWx5IHRvIHRoZSByb290IFVSTCBhbmQgdGhlbiBcclxuXHQgKiBuYXZpZ2F0ZXMgYmFjayB0byB0aGUgY3VycmVudCBVUkwgdG8gZWZmZWN0aXZlbHkgcmVmcmVzaCB0aGUgcGFnZSBvciBjb21wb25lbnQuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhZnRlciB0aGUgbmF2aWdhdGlvbiBpcyBzdWNjZXNzZnVsLFxyXG5cdCAqICAgICAgICAgICAgICAgICAgIHJlY2VpdmVzIHRoZSBjdXJyZW50IFVSTCBhcyBhbiBhcmd1bWVudC5cclxuXHQgKi9cclxuXHRwdWJsaWMgcmVsb2FkUGFnZShjYWxsYmFjaz86IChjdXJyZW50VXJsOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcclxuXHRcdGxldCBjdXJyZW50VXJsID0gdGhpcy5yb3V0ZXIudXJsO1xyXG5cdFx0dGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnLycsIHsgcmVwbGFjZVVybDogdHJ1ZSB9KS50aGVuKCgpID0+IHtcclxuXHRcdFx0dGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChjdXJyZW50VXJsLCB7IHJlcGxhY2VVcmw6IHRydWUgfSkudGhlbigoKSA9PiB7XHJcblx0XHRcdFx0LyogRXhlY3V0ZSB0aGUgY2FsbGJhY2sgaWYgcHJvdmlkZWQgKi9cclxuXHRcdFx0XHRpZiAoY2FsbGJhY2spIHtcclxuXHRcdFx0XHRcdGNhbGxiYWNrKGN1cnJlbnRVcmwpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE5hdmlnYXRlcyBiYWNrIHRvIHRoZSByZXR1cm4gVVJMIGlmIGl0IGV4aXN0cy5cclxuXHQgKi9cclxuXHRwdWJsaWMgbmF2aWdhdGVUb1JldHVyblVybCgpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLnJldHVyblVybCkge1xyXG5cdFx0XHQvKiBQYXJzZSB0aGUgcmV0dXJuIFVSTCBpbnRvIGEgVXJsVHJlZSBvYmplY3QgKi9cclxuXHRcdFx0bGV0IHVybFRyZWU6IFVybFRyZWUgPSB0aGlzLnJvdXRlci5wYXJzZVVybCh0aGlzLnJldHVyblVybCk7XHJcblxyXG5cdFx0XHQvKiBOYXZpZ2F0ZSB0byB0aGUgcmV0dXJuIFVSTCAqL1xyXG5cdFx0XHR0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHVybFRyZWUudG9TdHJpbmcoKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKiBcclxuXHQgKiBGb3JjZXMgYSBuZXcgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSBzaW5jZSBjaGFuZ2UgZGV0ZWN0aW9ucyBcclxuXHQgKiBoYXZlIGZpbmlzaGVkIHdoZW4gYG5nQWZ0ZXJWaWV3SW5pdGAgaXMgZXhlY3V0ZWQuXHJcblx0ICovXHJcblx0cHVibGljIGRldGVjdENoYW5nZXMoKTogdm9pZCB7XHJcblx0XHQvKiBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gKi9cclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgcmV0dXJuIFVSTCBhZnRlciBkZWNvZGluZyBpdC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSByZXR1cm5VcmwgLSBUaGUgZW5jb2RlZCByZXR1cm4gVVJMIHRvIHNldC5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgc2V0UmV0dXJuVXJsKHJldHVyblVybDogc3RyaW5nKTogdm9pZCB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHQvKiBEZWNvZGUgYW5kIHNldCB0aGUgcmV0dXJuIFVSTCwgaGFuZGxpbmcgcG90ZW50aWFsIGVycm9ycyAqL1xyXG5cdFx0XHR0aGlzLnJldHVyblVybCA9IHJldHVyblVybCA/IGRlY29kZVVSSUNvbXBvbmVudChhdG9iKHJldHVyblVybCkpIDogdW5kZWZpbmVkO1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0LyogSGFuZGxlIGVycm9yIHNpbGVudGx5ICovXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMaXN0ZW4gZm9yIGV4cGFuc2lvbiBwYW5lbCBjaGFuZ2VzXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIG9uRXhwYW5zaW9uUGFuZWxDaGFuZ2VzKCk6IHZvaWQge1xyXG5cdFx0LyogTGlzdGVuIGZvciBleHBhbnNpb24gcGFuZWwgY2hhbmdlcyAqL1xyXG5cdFx0dGhpcy5tYXRFeHBhbnNpb25QYW5lbFF1ZXJ5TGlzdD8uY2hhbmdlcy5zdWJzY3JpYmUoXyA9PiB7XHJcblx0XHRcdC8qIFVuc3Vic2NyaWJlIGZyb20gb2xkICdvcGVuZWQnIGFuZCAnY2xvc2VkJyBzdWJzY3JpcHRpb25zICovXHJcblx0XHRcdHRoaXMubWF0RXhwYW5zaW9uUGFuZWxTdWJzY3JpcHRpb25zLmZvckVhY2goeCA9PiB4LnVuc3Vic2NyaWJlKCkpO1xyXG5cclxuXHRcdFx0LyogRGV0ZWN0IGNoYW5nZXMgKi9cclxuXHRcdFx0dGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG5cdFx0XHQvKiBHZXQgdGhlIHBhbmVsIGVuZHMgd2l0aCB0aGUgSUQgJ25ldycgKi9cclxuXHRcdFx0dmFyIG5ld0V4cGFuc2lvblBhbmVsSW5kZXggPSB0aGlzLm1hdEV4cGFuc2lvblBhbmVsRWxlbWVudFF1ZXJ5TGlzdD8udG9BcnJheSgpPy5maW5kSW5kZXgoeCA9PiB4Lm5hdGl2ZUVsZW1lbnQ/LmlkPy5lbmRzV2l0aCgnLm5ldycpKSA/PyAtMTtcclxuXHRcdFx0aWYgKG5ld0V4cGFuc2lvblBhbmVsSW5kZXggPj0gMCkge1xyXG5cdFx0XHRcdC8qIENsb3NlIGFsbCBwYW5lbHMgKi9cclxuXHRcdFx0XHR0aGlzLm1hdEV4cGFuc2lvblBhbmVsUXVlcnlMaXN0Py5maXJzdD8uYWNjb3JkaW9uPy5jbG9zZUFsbCgpO1xyXG5cclxuXHRcdFx0XHQvKiBPcGVuIHRoZSBuZXcgcGFuZWwgKi9cclxuXHRcdFx0XHR0aGlzLm1hdEV4cGFuc2lvblBhbmVsUXVlcnlMaXN0Py50b0FycmF5KClbbmV3RXhwYW5zaW9uUGFuZWxJbmRleF0/Lm9wZW4oKTtcclxuXHJcblx0XHRcdFx0LyogRGV0ZWN0IGNoYW5nZXMgKi9cclxuXHRcdFx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvKiBGaW5kIHRoZSBpbmRleCBvZiB0aGUgcGFuZWwgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgSUQgKi9cclxuXHRcdFx0XHR0aGlzLnVybEhhc2g/LnNwbGl0KCcuJylcclxuXHRcdFx0XHRcdD8ucmVkdWNlKChhY2N1bXVsYXRvcjogYW55LCBjdXJyZW50VmFsdWUsIGluZGV4KSA9PiBhY2N1bXVsYXRvci5jb25jYXQoKGluZGV4ID4gMCA/IChhY2N1bXVsYXRvci5zbGljZSgtMSkuam9pbignLicpICsgJy4nKSA6ICcnKSArIGN1cnJlbnRWYWx1ZSksIFtdKVxyXG5cdFx0XHRcdFx0Py5mb3JFYWNoKChoYXNoOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdFx0dmFyIGV4cGFuc2lvblBhbmVsSW5kZXggPSB0aGlzLm1hdEV4cGFuc2lvblBhbmVsRWxlbWVudFF1ZXJ5TGlzdD8udG9BcnJheSgpPy5maW5kSW5kZXgoeCA9PiB4Lm5hdGl2ZUVsZW1lbnQuaWQgPT0gaGFzaCkgPz8gLTE7XHJcblx0XHRcdFx0XHRcdGlmIChleHBhbnNpb25QYW5lbEluZGV4ID49IDApIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLm1hdEV4cGFuc2lvblBhbmVsUXVlcnlMaXN0Py50b0FycmF5KClbZXhwYW5zaW9uUGFuZWxJbmRleF0/Lm9wZW4oKTtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIERldGVjdCBjaGFuZ2VzIGZvciBvcGVuZWQgcGFuZWxzICovXHJcblx0XHRcdHRoaXMubWF0RXhwYW5zaW9uUGFuZWxRdWVyeUxpc3Q/LmZvckVhY2goeSA9PiB7XHJcblx0XHRcdFx0dGhpcy5tYXRFeHBhbnNpb25QYW5lbFN1YnNjcmlwdGlvbnMucHVzaCh5Lm9wZW5lZC5zdWJzY3JpYmUoXyA9PiB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZXRVcmxIYXNoKSB7XHJcblx0XHRcdFx0XHRcdC8qIEdldCB0aGUgaWQgb2YgdGhlIGN1cnJlbnQgb3BlbmVkIHBhbmVsICovXHJcblx0XHRcdFx0XHRcdHZhciBjdXJyZW50UGFuZWxJZCA9IHlbJ192aWV3Q29udGFpbmVyUmVmJ10/LmVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ/LmlkO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgdGhlIHBhbmVsIElEIGlzIHNldCwgc2V0IGl0IGFzIHVybCBzZWdtZW50IChoYXNoKSAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoY3VycmVudFBhbmVsSWQpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwgeyBmcmFnbWVudDogY3VycmVudFBhbmVsSWQsIHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIE90aGVyd2lzZSByZW1vdmUgdGhlIHNlZ21lbnQgZnJvbSB0aGUgdXJsICovXHJcblx0XHRcdFx0XHRcdGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBEZXRlY3QgY2hhbmdlcyAqL1xyXG5cdFx0XHRcdFx0dGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblx0XHRcdFx0fSkpO1xyXG5cclxuXHRcdFx0XHQvKiBEZXRlY3QgY2hhbmdlcyBmb3IgY2xvc2VkIHBhbmVscyAqL1xyXG5cdFx0XHRcdHRoaXMubWF0RXhwYW5zaW9uUGFuZWxTdWJzY3JpcHRpb25zLnB1c2goeS5jbG9zZWQuc3Vic2NyaWJlKF8gPT4ge1xyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2V0VXJsSGFzaCkge1xyXG5cdFx0XHRcdFx0XHQvKiBHZXQgdGhlIGlkIG9mIHRoZSBjdXJyZW50IG9wZW5lZCBwYW5lbCAqL1xyXG5cdFx0XHRcdFx0XHR2YXIgY3VycmVudFBhbmVsSWRQYXJ0cyA9IHlbJ192aWV3Q29udGFpbmVyUmVmJ10/LmVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ/LmlkPy5zcGxpdCgnLicpO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgdGhlIHBhbmVsIElEIGlzIHNldCwgc2V0IGl0IGFzIHVybCBzZWdtZW50IChoYXNoKSAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoY3VycmVudFBhbmVsSWRQYXJ0cy5sZW5ndGggPiAxKSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHsgZnJhZ21lbnQ6IGN1cnJlbnRQYW5lbElkUGFydHMuc2xpY2UoMCwgLTEpLmpvaW4oJy4nKSwgcmVwbGFjZVVybDogdHJ1ZSB9KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIERldGVjdCBjaGFuZ2VzICovXHJcblx0XHRcdFx0XHR0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuXHRcdFx0XHR9KSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyogTm90aWZ5IGV4cGFuc2lvbiBwYW5lbCBsaXN0IGNoYW5nZXMgKi9cclxuXHRcdGlmICh0aGlzLm1hdEV4cGFuc2lvblBhbmVsUXVlcnlMaXN0KSB7XHJcblx0XHRcdHRoaXMubWF0RXhwYW5zaW9uUGFuZWxRdWVyeUxpc3Qubm90aWZ5T25DaGFuZ2VzKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXRyaWV2ZXMgYW4gaW5zdGFuY2UgZnJvbSB0aGUgaW5qZWN0b3IgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHRva2VuLlxyXG5cdCAqIElmIG5vdCBmb3VuZDpcclxuXHQgKiAtIFRocm93cyB7QGxpbmsgTm9Qcm92aWRlckVycm9yfSBpZiBubyBgbm90Rm91bmRWYWx1ZWAgdGhhdCBpcyBub3QgZXF1YWwgdG9cclxuXHQgKiBJbmplY3Rvci5USFJPV19JRl9OT1RfRk9VTkQgaXMgZ2l2ZW5cclxuXHQgKiAtIFJldHVybnMgdGhlIGBub3RGb3VuZFZhbHVlYCBvdGhlcndpc2VcclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgZ2V0U2VydmljZTxUPih0b2tlbjogVHlwZTxUPik6IFQge1xyXG5cdFx0cmV0dXJuIFNlcnZpY2VMb2NhdG9yLmdldFNlcnZpY2UodG9rZW4pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyB0aGUgbWFpbiByb3V0ZSBmcm9tIHRoZSBnaXZlbiBzbmFwc2hvdCBieSB0cmF2ZXJzaW5nIHVwIHRvIHRoZSBwYXJlbnQgcm91dGVzXHJcblx0ICogaWYgdGhlIGN1cnJlbnQgc25hcHNob3QgZG9lcyBub3QgaGF2ZSBhIG1lbnUgZGVmaW5lZC5cclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBzbmFwc2hvdCAtIFRoZSBhY3RpdmF0ZWQgcm91dGUgc25hcHNob3QgdG8gZXZhbHVhdGUuXHJcblx0ICogQHJldHVybnMgVGhlIG1haW4gcm91dGUgc25hcHNob3QgdGhhdCBoYXMgYSBtZW51IGRlZmluZWQuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGdldE1haW5Sb3V0ZShzbmFwc2hvdDogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IEFjdGl2YXRlZFJvdXRlU25hcHNob3Qge1xyXG5cdFx0aWYgKHNuYXBzaG90ICYmIHNuYXBzaG90IS5wYXJlbnQgJiYgIXNuYXBzaG90LmRhdGEubWVudSkge1xyXG5cdFx0XHQvKiBSZWN1cnNpdmVseSBjYWxsIHRvIGdldCB0aGUgbWFpbiByb3V0ZSBmcm9tIHRoZSBwYXJlbnQgc25hcHNob3QgKi9cclxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0TWFpblJvdXRlKHNuYXBzaG90IS5wYXJlbnQhKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gc25hcHNob3Q7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTaG93cyBhIGNvbmZpcm0gZGlhbG9nIHRvIGRlbGV0ZSBhIHNpbmdsZSBpdGVtLlxyXG5cdCAqXHJcblx0ICogQHJldHVybnMgQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSByZXN1bHQgb2YgdGhlIGRpYWxvZyBhZnRlciBpdCBpcyBjbG9zZWQuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHNob3dEZWxldGVJdGVtRGlhbG9nKCk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW5Db25maXJtKHtcclxuXHRcdFx0bWVzc2FnZTogJGxvY2FsaXplYDpAQGRpYWxvZy5tZXNzYWdlLmRlbGV0ZS5vbmU6QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGl0ZW0/YCxcclxuXHRcdFx0dGl0bGU6ICRsb2NhbGl6ZWA6QEBkaWFsb2cudGl0bGUuZGVsZXRlOkNvbmZpcm0gRGVsZXRlYCxcclxuXHRcdFx0Y2FuY2VsQnV0dG9uOiAkbG9jYWxpemVgOkBAY2FuY2VsOkNhbmNlbGAsXHJcblx0XHRcdGFjY2VwdEJ1dHRvbjogJGxvY2FsaXplYDpAQGRlbGV0ZTpEZWxldGVgLFxyXG5cdFx0fSkuYWZ0ZXJDbG9zZWQoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNob3dzIGEgY29uZmlybSBkaWFsb2cgdG8gZGVsZXRlIG11bHRpcGxlIHNlbGVjdGVkIGl0ZW1zLlxyXG5cdCAqXHJcblx0ICogQHJldHVybnMgQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSByZXN1bHQgb2YgdGhlIGRpYWxvZyBhZnRlciBpdCBpcyBjbG9zZWQuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHNob3dEZWxldGVJdGVtc0RpYWxvZygpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuZGlhbG9nU2VydmljZS5vcGVuQ29uZmlybSh7XHJcblx0XHRcdG1lc3NhZ2U6ICRsb2NhbGl6ZWA6QEBkaWFsb2cubWVzc2FnZS5kZWxldGUubGlzdDpBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBzZWxlY3RlZCBpdGVtcz9gLFxyXG5cdFx0XHR0aXRsZTogJGxvY2FsaXplYDpAQGRpYWxvZy50aXRsZS5kZWxldGU6Q29uZmlybSBEZWxldGVgLFxyXG5cdFx0XHRjYW5jZWxCdXR0b246ICRsb2NhbGl6ZWA6QEBjYW5jZWw6Q2FuY2VsYCxcclxuXHRcdFx0YWNjZXB0QnV0dG9uOiAkbG9jYWxpemVgOkBAZGVsZXRlOkRlbGV0ZWAsXHJcblx0XHR9KS5hZnRlckNsb3NlZCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2hvd3MgYSBjb25maXJtYXRpb24gZGlhbG9nIHRvIHNlbmQgc29tZSBkYXRhLlxyXG5cdCAqIFxyXG5cdCAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBpbiB0aGUgZGlhbG9nLlxyXG5cdCAqIEBwYXJhbSBvYnNlcnZhYmxlIC0gVGhlIG9ic2VydmFibGUgaW5zdGFuY2UgdG8gaGFuZGxlIHRoZSBkYXRhLlxyXG5cdCAqIEBwYXJhbSBzdWNjZXNzQ2FsbGJhY2sgLSBPcHRpb25hbCBjYWxsYmFjayB0byBiZSBpbnZva2VkIG9uIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLlxyXG5cdCAqIEBwYXJhbSBlcnJvckNhbGxiYWNrIC0gT3B0aW9uYWwgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBhbiBlcnJvci5cclxuXHQgKiBAcGFyYW0gYWNjZXB0QnV0dG9uVGV4dCAtIE9wdGlvbmFsIHRleHQgZm9yIHRoZSBhY2NlcHQgYnV0dG9uLlxyXG5cdCAqIEBwYXJhbSBjYW5jZWxCdXR0b25UZXh0IC0gT3B0aW9uYWwgdGV4dCBmb3IgdGhlIGNhbmNlbCBidXR0b24uXHJcblx0ICovXHJcblx0cHVibGljIHNob3dDb25maXJtYXRpb25EaWFsb2coXHJcblx0XHRtZXNzYWdlOiBzdHJpbmcsXHJcblx0XHRvYnNlcnZhYmU6IE9ic2VydmFibGU8YW55PixcclxuXHRcdHN1Y2Nlc3NDYWxsYmFjaz86IEZ1bmN0aW9uLFxyXG5cdFx0ZXJyb3JDYWxsYmFjaz86IEZ1bmN0aW9uLFxyXG5cdFx0YWNjZXB0QnV0dG9uVGV4dD86IHN0cmluZyxcclxuXHRcdGNhbmNlbEJ1dHRvblRleHQ/OiBzdHJpbmcsXHJcblx0XHRkaWFsb2dDb25maWc/OiBNYXREaWFsb2dDb25maWdcclxuXHQpOiB2b2lkIHtcclxuXHRcdHRoaXMuZGlhbG9nU2VydmljZVxyXG5cdFx0XHQub3BlbkNvbmZpcm0oe1xyXG5cdFx0XHRcdG1lc3NhZ2U6IG1lc3NhZ2UsXHJcblx0XHRcdFx0dGl0bGU6ICRsb2NhbGl6ZWA6QEBkaWFsb2cudGl0bGUuY29uZmlybTpDb25maXJtYCxcclxuXHRcdFx0XHRjYW5jZWxCdXR0b246IGNhbmNlbEJ1dHRvblRleHQgPz8gJGxvY2FsaXplYDpAQGNhbmNlbDpDYW5jZWxgLFxyXG5cdFx0XHRcdGFjY2VwdEJ1dHRvbjogYWNjZXB0QnV0dG9uVGV4dCA/PyAkbG9jYWxpemVgOkBAeWVzOlllc2AsXHJcblx0XHRcdH0sIGRpYWxvZ0NvbmZpZyA/PyAoPE1hdERpYWxvZ0NvbmZpZz57IG1heFdpZHRoOiA0ODAgfSkpXHJcblx0XHRcdC5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoYWNjZXB0OiBib29sZWFuKSA9PiB7XHJcblx0XHRcdFx0aWYgKGFjY2VwdCkge1xyXG5cdFx0XHRcdFx0b2JzZXJ2YWJlLnN1YnNjcmliZSh7XHJcblx0XHRcdFx0XHRcdG5leHQ6ICh4KSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5zaG93TWVzc2FnZSgkbG9jYWxpemVgOkBAc25hY2tiYXIuc2VuZC5zdWNjZXNzOkRhdGEgc2VudCBzdWNjZXNzZnVsbHkuYCk7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHN1Y2Nlc3NDYWxsYmFjaykge1xyXG5cdFx0XHRcdFx0XHRcdFx0c3VjY2Vzc0NhbGxiYWNrKHgpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSwgZXJyb3I6IChlcnJvcnMpID0+IHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmlzU2F2aW5nID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0aWYgKGVycm9yQ2FsbGJhY2spIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVycm9yQ2FsbGJhY2soZXJyb3JzKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBPcGVucyBhIHRhc2sgZGlhbG9nIHdpdGggdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uLlxyXG5cdCAqIFxyXG5cdCAqIEB0eXBlcGFyYW0gVFJlc3VsdCAtIFRoZSB0eXBlIG9mIHRoZSByZXN1bHQgcmV0dXJuZWQgZnJvbSB0aGUgZGlhbG9nLlxyXG5cdCAqIEBwYXJhbSB7UGFydGlhbDxUYXNrRGlhbG9nRGF0YTxUUmVzdWx0Pj59IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHRhc2sgZGlhbG9nLCBpbmNsdWRpbmcgbWVzc2FnZXMsIGNhbGxiYWNrcywgYW5kIG9ic2VydmFibGUgdGFza3MuXHJcblx0ICogXHJcblx0ICogQGV4YW1wbGUgXHJcblx0ICogLy8gRXhhbXBsZSBvZiBob3cgdG8gY2FsbCBzaG93VGFza0RpYWxvZ1xyXG5cdCAqIHRoaXMuc2hvd1Rhc2tEaWFsb2coe1xyXG5cdCAqICAgICB0aXRsZTogJ1Byb2Nlc3NpbmcgVGFzaycsXHJcblx0ICogICAgIGluUHJvZ3Jlc3NNZXNzYWdlOiAnWW91ciB0YXNrIGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcy4uLicsXHJcblx0ICogICAgIHN1Y2Nlc3NNZXNzYWdlOiAnVGFzayBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IScsXHJcblx0ICogICAgIGVycm9yTWVzc2FnZTogJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgeW91ciB0YXNrLicsXHJcblx0ICogICAgIHRhc2s6IHRoaXMuc29tZU9ic2VydmFibGVUYXNrKCksIC8vIFlvdXIgb2JzZXJ2YWJsZSB0YXNrIGdvZXMgaGVyZVxyXG5cdCAqICAgICBzdWNjZXNzQnV0dG9uQ2xpY2s6IChyZXN1bHQsIGRyKSA9PiB7XHJcblx0ICogICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzcyBidXR0b24gY2xpY2tlZCEnLCByZXN1bHQpO1xyXG5cdCAqICAgICAgICAgLy8gT3B0aW9uYWxseSBoYW5kbGUgdGhlIGRpYWxvZyByZWZlcmVuY2UgaGVyZVxyXG5cdCAqICAgICAgICAgZHIuY2xvc2UocmVzdWx0KTsgLy8gQ2xvc2UgdGhlIGRpYWxvZyB3aXRoIHRoZSByZXN1bHRcclxuXHQgKiAgICAgfSxcclxuXHQgKiAgICAgc3VjY2Vzc0NhbGxiYWNrOiAocmVzdWx0KSA9PiB7XHJcblx0ICogICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzcyEnLCByZXN1bHQpO1xyXG5cdCAqICAgICB9LFxyXG5cdCAqICAgICBlcnJvckNhbGxiYWNrOiAoZXJyb3JzKSA9PiB7XHJcblx0ICogICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciEnLCBlcnJvcnMpO1xyXG5cdCAqICAgICB9LFxyXG5cdCAqICAgICBjYW5jZWxDYWxsYmFjazogKCkgPT4ge1xyXG5cdCAqICAgICAgICAgY29uc29sZS5sb2coJ1Rhc2sgd2FzIGNhbmNlbGVkLicpO1xyXG5cdCAqICAgICB9LFxyXG5cdCAqIH0pO1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBzaG93VGFza0RpYWxvZzxUUmVzdWx0ID0gYW55Pihjb25maWc6IFBhcnRpYWw8VGFza0RpYWxvZ0RhdGE8VFJlc3VsdD4+LCBkaWFsb2dDb25maWc/OiBNYXREaWFsb2dDb25maWc8VFJlc3VsdD4pOiBNYXREaWFsb2dSZWY8VmRUYXNrRGlhbG9nQ29tcG9uZW50LCBUUmVzdWx0PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5vcGVuRGlhbG9nPFZkVGFza0RpYWxvZ0NvbXBvbmVudD4oVmRUYXNrRGlhbG9nQ29tcG9uZW50LCBPYmplY3QuYXNzaWduKGRpYWxvZ0NvbmZpZyA/PyB7fSwgPE1hdERpYWxvZ0NvbmZpZz57XHJcblx0XHRcdGRhdGE6IG5ldyBUYXNrRGlhbG9nRGF0YShjb25maWcpLFxyXG5cdFx0XHRkaXNhYmxlQ2xvc2U6IHRydWVcclxuXHRcdH0pKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE9wZW5zIGEgZGlhbG9nIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB3aXRoIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uLlxyXG5cdCAqXHJcblx0ICogQHR5cGVwYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBvcGVuZWQgYXMgYSBkaWFsb2cuXHJcblx0ICogQHR5cGVwYXJhbSBEIC0gVGhlIHR5cGUgb2YgdGhlIGRhdGEgcGFzc2VkIHRvIHRoZSBkaWFsb2cgKGRlZmF1bHQgaXMgYW55KS5cclxuXHQgKiBAcGFyYW0ge1R5cGU8VD59IGRpYWxvZ1R5cGUgLSBUaGUgY29tcG9uZW50IHR5cGUgdG8gb3BlbiBhcyBhIGRpYWxvZy5cclxuXHQgKiBAcGFyYW0ge01hdERpYWxvZ0NvbmZpZzxEPn0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGRpYWxvZywgc3VjaCBhcyBkYXRhIGFuZCBzdHlsZXMuXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIE9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIGRpYWxvZyBpcyBjbG9zZWQuXHJcblx0ICogXHJcblx0ICogQHJldHVybnMge01hdERpYWxvZ1JlZjxULCBEPn0gQSByZWZlcmVuY2UgdG8gdGhlIG9wZW5lZCBkaWFsb2cuXHJcblx0ICogXHJcblx0ICogQGV4YW1wbGVcclxuXHQgKiAvLyBFeGFtcGxlIG9mIGhvdyB0byB1c2Ugb3BlbkRpYWxvZ1xyXG5cdCAqIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMub3BlbkRpYWxvZyhNeURpYWxvZ0NvbXBvbmVudCwge1xyXG5cdCAqICAgICBkYXRhOiB7IGRpYWxvZyBkYXRhIGhlcmUgfSxcclxuXHQgKiAgICAgd2lkdGg6ICc4MDBweCcsXHJcblx0ICogICAgIHBhbmVsQ2xhc3M6ICdjdXN0b20tZGlhbG9nLWNsYXNzJ1xyXG5cdCAqIH0sICgpID0+IHtcclxuXHQgKiAgICAgY29uc29sZS5sb2coJ0RpYWxvZyBjbG9zZWQuJyk7XHJcblx0ICogfSk7XHJcblx0ICogXHJcblx0ICogLy8gSGFuZGxpbmcgdGhlIHJlc3VsdCBmcm9tIHRoZSBkaWFsb2dcclxuXHQgKiBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuXHQgKiAgICAgaWYgKHJlc3VsdCkge1xyXG5cdCAqICAgICAgICAgY29uc29sZS5sb2coJ0RpYWxvZyByZXN1bHQ6JywgcmVzdWx0KTtcclxuXHQgKiAgICAgfVxyXG5cdCAqIH0pO1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBvcGVuRGlhbG9nPFQsIEQgPSBhbnk+KGRpYWxvZ1R5cGU6IFR5cGU8VD4sIGNvbmZpZzogTWF0RGlhbG9nQ29uZmlnPEQ+LCBjYWxsYmFjaz86IEZ1bmN0aW9uKTogTWF0RGlhbG9nUmVmPFQsIEQ+IHtcclxuXHRcdC8qIE9wZW4gdGhlIGRpYWxvZyB3aXRoIHNwZWNpZmllZCB0eXBlIGFuZCBjb25maWd1cmF0aW9uICovXHJcblx0XHR2YXIgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihkaWFsb2dUeXBlLCBPYmplY3QuYXNzaWduKHtcclxuXHRcdFx0d2lkdGg6ICc2NTBweCcsIC8qIERlZmF1bHQgd2lkdGggZm9yIHRoZSBkaWFsb2cgKi9cclxuXHRcdFx0ZGF0YToge30sIC8qIERlZmF1bHQgZGF0YSBwYXNzZWQgdG8gdGhlIGRpYWxvZyAqL1xyXG5cdFx0XHRwYW5lbENsYXNzOiBbJ2RpYWxvZy1mdWxsLXNjcmVlbiddIC8qIENsYXNzIGZvciB0aGUgZGlhbG9nIHBhbmVsICovXHJcblx0XHR9LCBjb25maWcpKTsgLyogTWVyZ2UgdXNlci1kZWZpbmVkIGNvbmZpZyB3aXRoIGRlZmF1bHRzICovXHJcblxyXG5cdFx0LyogSWYgYSBjYWxsYmFjayBpcyBwcm92aWRlZCwgc3Vic2NyaWJlIHRvIHRoZSBkaWFsb2cncyBhZnRlckNsb3NlZCBldmVudCAqL1xyXG5cdFx0aWYgKGNhbGxiYWNrKSB7XHJcblx0XHRcdC8qIEV4ZWN1dGUgY2FsbGJhY2sgYWZ0ZXIgdGhlIGRpYWxvZyBpcyBjbG9zZWQgKi9cclxuXHRcdFx0ZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKF8gPT4gY2FsbGJhY2soKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogUmV0dXJuIHRoZSByZWZlcmVuY2UgdG8gdGhlIG9wZW5lZCBkaWFsb2cgKi9cclxuXHRcdHJldHVybiBkaWFsb2dSZWY7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXNwbGF5cyBhIG1lc3NhZ2UgdXNpbmcgdGhlIHNuYWNrIGJhciBzZXJ2aWNlLlxyXG5cdCAqIFxyXG5cdCAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgKG9wdGlvbmFsLCBkZWZhdWx0cyB0byBhIHN1Y2Nlc3MgbWVzc2FnZSBpZiBub3QgcHJvdmlkZWQpXHJcblx0ICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIG1lc3NhZ2UgKFN1Y2Nlc3MsIFdhcm5pbmcsIG9yIEVycm9yKS4gRGVmYXVsdHMgdG8gU3VjY2Vzcy5cclxuXHQgKiBAcGFyYW0gZHVyYXRpb24gVGhlIGR1cmF0aW9uIChpbiBtaWxsaXNlY29uZHMpIHRvIHNob3cgdGhlIG1lc3NhZ2UuIERlZmF1bHRzIHRvIDMwMDBtcy5cclxuXHQgKiBAcGFyYW0gYWN0aW9uTGFiZWwgVGhlIGxhYmVsIGZvciB0aGUgYWN0aW9uIGJ1dHRvbi4gRGVmYXVsdHMgdG8gJ09LJy5cclxuXHQgKiBAcGFyYW0gcGxheVNvdW5kIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gcGxheSBhIHdhcm5pbmcgc291bmQgd2hlbiB0aGUgbWVzc2FnZSB0eXBlIGlzIFdhcm5pbmcuIERlZmF1bHRzIHRvIGZhbHNlLlxyXG5cdCAqIEByZXR1cm5zIEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB3aGVuIHRoZSBhY3Rpb24gYnV0dG9uIGlzIGNsaWNrZWQuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHNob3dNZXNzYWdlKFxyXG5cdFx0bWVzc2FnZTogc3RyaW5nLFxyXG5cdFx0dHlwZTogTWVzc2FnZVR5cGUgPSBNZXNzYWdlVHlwZS5TdWNjZXNzLFxyXG5cdFx0ZHVyYXRpb246IG51bWJlciA9IDMwMDAsXHJcblx0XHRhY3Rpb25MYWJlbDogc3RyaW5nID0gJGxvY2FsaXplYDpAQG9rOk9LYCxcclxuXHRcdHBsYXlTb3VuZDogYm9vbGVhbiA9IGZhbHNlXHJcblx0KTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcblx0XHQvKiBEZWZhdWx0IHNuYWNrIGJhciBjbGFzcyB0byAncHJpbWFyeScgKGZvciBzdWNjZXNzIG1lc3NhZ2VzKSAqL1xyXG5cdFx0bGV0IHNuYWNrQmFyQ2xhc3MgPSAncHJpbWFyeSc7XHJcblxyXG5cdFx0LyogRGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBDU1MgY2xhc3MgYmFzZWQgb24gdGhlIG1lc3NhZ2UgdHlwZSAqL1xyXG5cdFx0c3dpdGNoICh0eXBlKSB7XHJcblx0XHRcdGNhc2UgTWVzc2FnZVR5cGUuU3VjY2VzczpcclxuXHRcdFx0XHRzbmFja0JhckNsYXNzID0gJ3ByaW1hcnknO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBNZXNzYWdlVHlwZS5XYXJuaW5nOlxyXG5cdFx0XHRcdHNuYWNrQmFyQ2xhc3MgPSAnd2Fybic7XHJcblxyXG5cdFx0XHRcdC8qIFBsYXkgdGhlIHdhcm5pbmcgc291bmQgaWYgdGhlIHBsYXlTb3VuZCBmbGFnIGlzIHRydWUgKi9cclxuXHRcdFx0XHRpZiAocGxheVNvdW5kKSB7XHJcblx0XHRcdFx0XHR0aGlzLnBsYXlXYXJuU291bmQoKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBNZXNzYWdlVHlwZS5FcnJvcjpcclxuXHRcdFx0XHRzbmFja0JhckNsYXNzID0gJ2Vycm9yJztcclxuXHJcblx0XHRcdFx0LyogUGxheSB0aGUgd2FybmluZyBzb3VuZCBpZiB0aGUgcGxheVNvdW5kIGZsYWcgaXMgdHJ1ZSAqL1xyXG5cdFx0XHRcdGlmIChwbGF5U291bmQpIHtcclxuXHRcdFx0XHRcdHRoaXMucGxheVdhcm5Tb3VuZCgpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIERpc3BsYXkgdGhlIG1lc3NhZ2UgaW4gdGhlIHNuYWNrIGJhciwgd2l0aCBzcGVjaWZpZWQgZHVyYXRpb24gYW5kIENTUyBjbGFzcyAqL1xyXG5cdFx0Y29uc3Qgc25hY2tCYXJSZWYgPSB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKFxyXG5cdFx0XHRtZXNzYWdlLFxyXG5cdFx0XHRhY3Rpb25MYWJlbCxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdGR1cmF0aW9uOiBkdXJhdGlvbixcclxuXHRcdFx0XHRwYW5lbENsYXNzOiBbc25hY2tCYXJDbGFzc11cclxuXHRcdFx0fVxyXG5cdFx0KTtcclxuXHJcblx0XHQvKiBFbWl0cyB3aGVuIHRoZSBhY3Rpb24gYnV0dG9uIGlzIGNsaWNrZWQgKi9cclxuXHRcdHJldHVybiBzbmFja0JhclJlZi5vbkFjdGlvbigpLnBpcGUobWFwKCgpID0+IHsgfSkpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5pdGlhbGl6ZXMgdGhlIFRpbnlNQ0UgZWRpdG9yIHdpdGggY3VzdG9tIGNvbmZpZ3VyYXRpb24uXHJcblx0ICogXHJcblx0ICogQHBhcmFtIGVkaXRvckNvbmZpZyBPcHRpb25hbCBjb25maWd1cmF0aW9uIHRvIG92ZXJyaWRlIGRlZmF1bHQgZWRpdG9yIHNldHRpbmdzXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGluaXRFZGl0b3IoZWRpdG9yQ29uZmlnOiBhbnkgPSB7fSkge1xyXG5cdFx0LyogTWVyZ2UgdGhlIHByb3ZpZGVkIGVkaXRvciBjb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdCBzZXR0aW5ncyAqL1xyXG5cdFx0T2JqZWN0LmFzc2lnbih0aGlzLmVkaXRvckNvbmZpZywge1xyXG5cdFx0XHQvKiBEaXNhYmxlIHByb21vdGlvbnMgaW4gdGhlIGVkaXRvciAqL1xyXG5cdFx0XHRwcm9tb3Rpb246IGZhbHNlLFxyXG5cdFx0XHQvKiBVc2UgdGhlIG1pbmltaXplZCB2ZXJzaW9uIG9mIFRpbnlNQ0UgKi9cclxuXHRcdFx0c3VmZml4OiAnLm1pbicsXHJcblx0XHRcdC8qIERpc2FibGUgZGVmYXVsdCBUaW55TUNFIHNraW4gKi9cclxuXHRcdFx0c2tpbjogZmFsc2UsXHJcblx0XHRcdC8qIFNldCBlZGl0b3IgaGVpZ2h0IHRvIDE3MHB4ICovXHJcblx0XHRcdGhlaWdodDogJzE3MHB4JyxcclxuXHRcdFx0LyogRGlzYWJsZSBsb2FkaW5nIGV4dGVybmFsIENTUyBmb3IgZWRpdG9yIGNvbnRlbnQgKi9cclxuXHRcdFx0Y29udGVudF9jc3M6IGZhbHNlLFxyXG5cdFx0XHQvKiBTZXQgdGhlIHBsdWdpbnMgdG8gYmUgdXNlZCBpbiB0aGUgZWRpdG9yICovXHJcblx0XHRcdHBsdWdpbnM6IHRoaXMuZWRpdG9yUGx1Z2lucyxcclxuXHRcdFx0LyogU2V0IHRoZSB0b29sYmFyIGNvbmZpZ3VyYXRpb24gKi9cclxuXHRcdFx0dG9vbGJhcjogdGhpcy5lZGl0b3JUb29sYmFyLFxyXG5cdFx0XHQvKiBBbHdheXMgcGFzdGUgY29udGVudCBhcyBwbGFpbiB0ZXh0ICovXHJcblx0XHRcdHBhc3RlX2FzX3RleHQ6IHRydWUsXHJcblx0XHRcdC8qIFNldCB0aGUgZWRpdG9yIGxhbmd1YWdlIHRvIEdlcm1hbiAqL1xyXG5cdFx0XHRsYW5ndWFnZTogJ2RlJyxcclxuXHRcdFx0LyogU3BlY2lmeSB0aGUgVVJMIHRvIGxvYWQgdGhlIEdlcm1hbiBsYW5ndWFnZSBmaWxlICovXHJcblx0XHRcdGxhbmd1YWdlX3VybDogJy9hc3NldHMvdGlueW1jZS9sYW5ncy9kZS5qcycsXHJcblx0XHRcdC8qIFNldCB0aGUgYmFzZSBVUkwgZm9yIGRvY3VtZW50cy9maWxlcyB1c2VkIGluIHRoZSBlZGl0b3IgKi9cclxuXHRcdFx0ZG9jdW1lbnRfYmFzZV91cmw6IGAke3RoaXMuYXBwU2V0dGluZy5hcGlVcmx9ZmlsZS9gLFxyXG5cdFx0XHQvKiBFbmFibGUgYXV0b21hdGljIHVwbG9hZHMgZm9yIGZpbGUgaW5wdXRzICovXHJcblx0XHRcdGF1dG9tYXRpY191cGxvYWRzOiB0cnVlLFxyXG5cdFx0XHQvKiBVc2UgcmVsYXRpdmUgVVJMcyBmb3IgbGlua3MgYW5kIGltYWdlcyAqL1xyXG5cdFx0XHRyZWxhdGl2ZV91cmxzOiB0cnVlLFxyXG5cdFx0XHQvKiBEaXNhYmxlIGF1dG9tYXRpYyBjb252ZXJzaW9uIG9mIHJlbGF0aXZlIFVSTHMgdG8gYWJzb2x1dGUgVVJMcyAqL1xyXG5cdFx0XHRjb252ZXJ0X3VybHM6IGZhbHNlLFxyXG5cdFx0XHQvKiBFeHRlbmQgdmFsaWQgSFRNTCBlbGVtZW50cyB0byBhbGxvdyBzcGVjaWZpYyBhdHRyaWJ1dGVzICovXHJcblx0XHRcdGV4dGVuZGVkX3ZhbGlkX2VsZW1lbnRzOiAnc3BhbltpZHxjbGFzc3xzdHlsZV0sK0BbZGF0YS1vcHRpb25zXScsXHJcblx0XHRcdC8qIEFsbG93IEhUTUwgaW4gbmFtZWQgYW5jaG9ycyAqL1xyXG5cdFx0XHRhbGxvd19odG1sX2luX25hbWVkX2FuY2hvcjogdHJ1ZVxyXG5cdFx0fSwgZWRpdG9yQ29uZmlnKTtcclxuXHJcblx0XHQvKiBNYXJrIHRoZSBlZGl0b3IgYXMgaW5pdGlhbGl6ZWQgKi9cclxuXHRcdHRoaXMuaXNFZGl0b3JJbml0aWFsaXplZCA9IHRydWU7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSB0aXRsZSBhbmQgc3VidGl0bGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgbWVudSBhbmQgcm91dGVcclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgc2V0VGl0bGVzKCk6IHZvaWQge1xyXG5cdFx0LyogQ2hlY2sgaWYgdGhlIG1lbnUgb2JqZWN0IGlzIGF2YWlsYWJsZSAqL1xyXG5cdFx0aWYgKHRoaXMubWVudSkge1xyXG5cdFx0XHQvKiBTZXQgdGhlIGJyb3dzZXIgdGFiIHRpdGxlIHVzaW5nIHRoZSBtZW51IHRpdGxlLCBpZiBhdmFpbGFibGUgKi9cclxuXHRcdFx0dGhpcy50aXRsZVNlcnZpY2Uuc2V0VGl0bGUodGhpcy5tZW51LnRpdGxlID8/ICcnKTtcclxuXHRcdFx0LyogVXBkYXRlIHRoZSBsb2NhbCB0aXRsZSB2YXJpYWJsZSBmcm9tIHRoZSB0aXRsZSBzZXJ2aWNlICovXHJcblx0XHRcdHRoaXMudGl0bGUgPSB0aGlzLnRpdGxlU2VydmljZS5nZXRUaXRsZSgpO1xyXG5cclxuXHRcdFx0LyogSWYgdGhlcmUgYXJlIG5vIHN1Ym1lbnUgaXRlbXMsIGV4aXQgdGhlIG1ldGhvZCAqL1xyXG5cdFx0XHRpZiAoIXRoaXMubWVudS5pdGVtcykge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyogVHJ5IHRvIHJldHJpZXZlIHRoZSBzdWJ0aXRsZSBmcm9tIHRoZSBVUkwgcGFyYW1ldGVycyAqL1xyXG5cdFx0XHR2YXIgc3VidGl0bGUgPSB0aGlzLnJvdXRlPy5zbmFwc2hvdD8ucGFyYW1NYXA/LmdldCgnc3VidGl0bGUnKTtcclxuXHRcdFx0aWYgKHN1YnRpdGxlKSB7XHJcblx0XHRcdFx0LyogQXR0ZW1wdCB0byBkZWNvZGUgdGhlIHN1YnRpdGxlIGlmIGl0J3MgQmFzZTY0IGVuY29kZWQgKi9cclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0dGhpcy5zdWJ0aXRsZSA9IHdpbmRvdy5hdG9iKHN1YnRpdGxlKTtcclxuXHRcdFx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdFx0XHQvKiBJZiBkZWNvZGluZyBmYWlscywgdXNlIHRoZSByYXcgc3VidGl0bGUgKi9cclxuXHRcdFx0XHRcdHRoaXMuc3VidGl0bGUgPSBzdWJ0aXRsZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0LyogR2V0IHRoZSBjdXJyZW50IHJvdXRlIHBhdGgsIGV4Y2x1ZGluZyBxdWVyeSBwYXJhbWV0ZXJzIGFuZCBtYXRyaXggcGFyYW1ldGVycyAqL1xyXG5cdFx0XHRcdGxldCBjdXJyZW50Um91dGUgPSB0aGlzLnJvdXRlci51cmwuc3BsaXQoJz8nKVswXT8uc3BsaXQoJzsnKVswXTtcclxuXHJcblx0XHRcdFx0LyogRW5zdXJlIHRoZSByb3V0ZSBkb2Vzbid0IGhhdmUgYSB0cmFpbGluZyBzbGFzaCAqL1xyXG5cdFx0XHRcdGN1cnJlbnRSb3V0ZSA9IGN1cnJlbnRSb3V0ZS5lbmRzV2l0aCgnLycpID8gY3VycmVudFJvdXRlLnN1YnN0cmluZygwLCAtMSkgOiBjdXJyZW50Um91dGU7XHJcblxyXG5cdFx0XHRcdC8qIEZpbmQgdGhlIHN1Ym1lbnUgaXRlbSB0aGF0IG1hdGNoZXMgdGhlIGN1cnJlbnQgcm91dGUgKi9cclxuXHRcdFx0XHR2YXIgc3VibWVudSA9IHRoaXMubWVudS5pdGVtcy5maWx0ZXIoeCA9PiB4LnBhdGggPT0gY3VycmVudFJvdXRlKVswXTtcclxuXHRcdFx0XHRpZiAoc3VibWVudSkge1xyXG5cdFx0XHRcdFx0LyogU2V0IHRoZSBzdWJ0aXRsZSB0byB0aGUgbWF0Y2hpbmcgc3VibWVudSdzIHRpdGxlICovXHJcblx0XHRcdFx0XHR0aGlzLnN1YnRpdGxlID0gc3VibWVudS50aXRsZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE5hdmlnYXRlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBhcnJheSBvZiBjb21tYW5kcyBhbmQgYSBzdGFydGluZyBwb2ludC5cclxuXHQgKiBAcGFyYW0gY29tbWFuZHMgQXJyYXkgb2YgY29tbWFuZHMgcmVwcmVzZW50aW5nIHRoZSByb3V0ZSB0byBuYXZpZ2F0ZSB0b1xyXG5cdCAqIEBwYXJhbSBxdWVyeVBhcmFtcyBPcHRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzIHRvIGFwcGVuZCB0byB0aGUgVVJMXHJcblx0ICogQHBhcmFtIGZyYWdtZW50IE9wdGlvbmFsIGZyYWdtZW50IChhbmNob3IpIHRvIGFwcGVuZCB0byB0aGUgVVJMXHJcblx0ICogQHBhcmFtIHByZXNlcnZlRnJhZ21lbnQgV2hldGhlciB0byBwcmVzZXJ2ZSB0aGUgY3VycmVudCBmcmFnbWVudCBpbiB0aGUgVVJMXHJcblx0ICovXHJcblx0cHVibGljIG5hdmlnYXRlKGNvbW1hbmRzOiBhbnlbXSwgcXVlcnlQYXJhbXM/OiBhbnksIGZyYWdtZW50Pzogc3RyaW5nLCBwcmVzZXJ2ZUZyYWdtZW50PzogYm9vbGVhbik6IHZvaWQge1xyXG5cdFx0dGhpcy5yb3V0ZXIubmF2aWdhdGUoY29tbWFuZHMsIHtcclxuXHRcdFx0LyogTWVyZ2UgYW55IGFkZGl0aW9uYWwgcXVlcnkgcGFyYW1ldGVycyB3aXRoIGEgZGVmYXVsdCByZXR1cm5VcmwgKi9cclxuXHRcdFx0cXVlcnlQYXJhbXM6IE9iamVjdC5hc3NpZ24oeyByZXR1cm5Vcmw6IHRoaXMuY3VycmVudFJvdXRlIH0sIHF1ZXJ5UGFyYW1zIHx8IHt9KSxcclxuXHRcdFx0LyogU2V0IHRoZSBmcmFnbWVudCwgaWYgcHJvdmlkZWQgKi9cclxuXHRcdFx0ZnJhZ21lbnQ6IGZyYWdtZW50LFxyXG5cdFx0XHQvKiBQcmVzZXJ2ZSB0aGUgZnJhZ21lbnQgZnJvbSB0aGUgcHJldmlvdXMgVVJMIGlmIHNwZWNpZmllZCAqL1xyXG5cdFx0XHRwcmVzZXJ2ZUZyYWdtZW50OiBwcmVzZXJ2ZUZyYWdtZW50LFxyXG5cdFx0XHQvKiBNYWtlIHRoZSByb3V0ZSByZWxhdGl2ZSB0byB0aGUgY3VycmVudCByb3V0ZSBpZiBhcHBsaWNhYmxlICovXHJcblx0XHRcdHJlbGF0aXZlVG86IHRoaXMucm91dGVcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGxheXMgYSBzaG9ydCBiZWVwIHNvdW5kIHVzaW5nIGFuIGVtYmVkZGVkIGF1ZGlvIGZpbGUgaW4gYmFzZTY0IGZvcm1hdC5cclxuXHQgKiBUaGUgbWV0aG9kIGxvYWRzIGFuZCBwbGF5cyB0aGUgYXVkaW8gZmlsZSBpbW1lZGlhdGVseSB1cG9uIGNhbGxpbmcuXHJcblx0ICovXHJcblx0cHVibGljIHBsYXlCZWVwU291bmQoKTogdm9pZCB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHR0aGlzLmJlZXBBdWRpby5wbGF5KCk7XHJcblx0XHR9IGNhdGNoIChlcnJvcikgeyB9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQbGF5cyBhIHNob3J0IHdhcm5pbmcgc291bmQgdXNpbmcgYW4gZW1iZWRkZWQgYXVkaW8gZmlsZSBpbiBiYXNlNjQgZm9ybWF0LlxyXG5cdCAqIFRoZSBtZXRob2QgbG9hZHMgYW5kIHBsYXlzIHRoZSBhdWRpbyBmaWxlIGltbWVkaWF0ZWx5IHVwb24gY2FsbGluZy5cclxuXHQgKi9cclxuXHRwdWJsaWMgcGxheVdhcm5Tb3VuZCgpOiB2b2lkIHtcclxuXHRcdHRyeSB7XHJcblx0XHRcdHRoaXMud2FybkF1ZGlvLnBsYXkoKTtcclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7IH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExvZ3MgYSBtZXNzYWdlIHRvIHRoZSBjb25zb2xlIGlmIGRlYnVnIG1vZGUgaXMgZW5hYmxlZFxyXG5cdCAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvZ1xyXG5cdCAqIEBwYXJhbSBvcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgbG9nXHJcblx0ICovXHJcblx0cHVibGljIGxvZyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xyXG5cdFx0LyogQ2hlY2sgaWYgZGVidWcgbW9kZSBpcyBlbmFibGVkICovXHJcblx0XHRpZiAodGhpcy5kZWJ1Zykge1xyXG5cdFx0XHQvKiBMb2cgdGhlIG1lc3NhZ2UgYW5kIG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gdGhlIGNvbnNvbGUgKi9cclxuXHRcdFx0Y29uc29sZS5sb2cobWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTG9ncyBhIHdhcm5pbmcgbWVzc2FnZSB0byB0aGUgY29uc29sZSBpZiBkZWJ1ZyBtb2RlIGlzIGVuYWJsZWRcclxuXHQgKiBAcGFyYW0gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlIHRvIGxvZ1xyXG5cdCAqIEBwYXJhbSBvcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgd2FybmluZ1xyXG5cdCAqL1xyXG5cdHB1YmxpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XHJcblx0XHQvKiBDaGVjayBpZiBkZWJ1ZyBtb2RlIGlzIGVuYWJsZWQgKi9cclxuXHRcdGlmICh0aGlzLmRlYnVnKSB7XHJcblx0XHRcdC8qIExvZyB0aGUgd2FybmluZyBtZXNzYWdlIGFuZCBvcHRpb25hbCBwYXJhbWV0ZXJzIHRvIHRoZSBjb25zb2xlICovXHJcblx0XHRcdGNvbnNvbGUud2FybihtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0IGFuIG9iamVjdCB0byBIdHRwSGVhZGVycy5cclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gYm9keSBUaGUgb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBoZWFkZXJzXHJcblx0ICogQHJldHVybnMgSHR0cEhlYWRlcnMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGtleS12YWx1ZSBwYWlycyBmcm9tIHRoZSBib2R5XHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHRvSHR0cEhlYWRlcnMoYm9keTogYW55KTogSHR0cEhlYWRlcnMge1xyXG5cdFx0LyogSWYgdGhlIGJvZHkgaXMgbnVsbCBvciB1bmRlZmluZWQsIHJldHVybiBlbXB0eSBoZWFkZXJzICovXHJcblx0XHRpZiAoIWJvZHkpIHtcclxuXHRcdFx0cmV0dXJuIG5ldyBIdHRwSGVhZGVycygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIENvbnZlcnQgdGhlIG9iamVjdCdzIHByb3BlcnRpZXMgdG8gSHR0cEhlYWRlcnMsIGZpbHRlcmluZyBvdXQgbnVsbCBvciBlbXB0eSB2YWx1ZXMgKi9cclxuXHRcdHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhib2R5KVxyXG5cdFx0XHQuZmlsdGVyKGtleSA9PiBib2R5W2tleV0gIT0gbnVsbCAmJiBib2R5W2tleV0gIT0gJycpXHJcblx0XHRcdC5yZWR1Y2UoKHAsIGtleSkgPT4gcC5zZXQoa2V5LCBib2R5W2tleV0pLCBuZXcgSHR0cEhlYWRlcnMoKSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQYXJzZXMgYW5kIGZvcm1hdHMgSFRUUCByZXNwb25zZSBlcnJvcnMuXHJcblx0ICogQHBhcmFtIGVycm9ycyBUaGUgZXJyb3Igb2JqZWN0IHJldHVybmVkIGZyb20gdGhlIEhUVFAgcmVzcG9uc2VcclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgcGFyc2VFcnJvcnMoZXJyb3JzOiBhbnkpOiB2b2lkIHtcclxuXHRcdC8qIEluaXRpYWxpemUgdGhlIGVycm9ycyBhcnJheSBhbmQgcmVzZXQgbG9hZGluZy9zYXZpbmcgaW5kaWNhdG9ycyAqL1xyXG5cdFx0dGhpcy5lcnJvcnMgPSBbXTtcclxuXHRcdHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcblx0XHR0aGlzLmlzU2F2aW5nID0gZmFsc2U7XHJcblxyXG5cdFx0LyogSWYgdGhlcmUgYXJlIGVycm9ycywgaXRlcmF0ZSB0aHJvdWdoIHRoZW0gYW5kIGFkZCB0aGVtIHRvIHRoZSBlcnJvcnMgYXJyYXkgKi9cclxuXHRcdGlmIChlcnJvcnMpIHtcclxuXHRcdFx0T2JqZWN0LmtleXMoZXJyb3JzKS5mb3JFYWNoKGVsID0+IHtcclxuXHRcdFx0XHRsZXQgZXJyb3IgPSBlcnJvcnNbZWxdO1xyXG5cdFx0XHRcdC8qIElmIHRoZSBlcnJvciBpcyBhbiBhcnJheSwgaXRlcmF0ZSBvdmVyIHRoZSBhcnJheSBhbmQgYWRkIGVhY2ggZXJyb3IgKi9cclxuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShlcnJvcikpIHtcclxuXHRcdFx0XHRcdGVycm9yLmZvckVhY2goZXJyID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5lcnJvcnMucHVzaChlcnIpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgZXJyb3IgPT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0XHRcdC8qIElmIHRoZSBlcnJvciBpcyBhIHN0cmluZywgYWRkIGl0IGRpcmVjdGx5IHRvIHRoZSBlcnJvcnMgYXJyYXkgKi9cclxuXHRcdFx0XHRcdHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBIYW5kbGUgSHR0cCBvcGVyYXRpb24gdGhhdCBmYWlsZWQuXHJcblx0ICogTGV0IHRoZSBhcHAgY29udGludWUuXHJcblx0ICogQHBhcmFtIG9wZXJhdGlvbiAtIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiB0aGF0IGZhaWxlZFxyXG5cdCAqIEBwYXJhbSByZXN1bHQgLSBvcHRpb25hbCB2YWx1ZSB0byByZXR1cm4gYXMgdGhlIG9ic2VydmFibGUgcmVzdWx0XHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGhhbmRsZUVycm9yPFQ+KG9wZXJhdGlvbiA9ICdvcGVyYXRpb24nLCByZXN1bHQ/OiBUKSB7XHJcblx0XHRyZXR1cm4gKGVycm9yOiBhbnkpOiBPYnNlcnZhYmxlPFQ+ID0+IHtcclxuXHJcblx0XHRcdC8qIFBhcnNlIHRoZSBlcnJvciBtZXNzYWdlcyAqL1xyXG5cdFx0XHR0aGlzLnBhcnNlRXJyb3JzKGVycm9yKTtcclxuXHJcblx0XHRcdC8qIExvZyB0byBjb25zb2xlICovXHJcblx0XHRcdHRoaXMud2FybihgJHtvcGVyYXRpb259IGZhaWxlZDogJHtlcnJvci5tZXNzYWdlfWApO1xyXG5cclxuXHRcdFx0LyogTGV0IHRoZSBhcHAga2VlcCBydW5uaW5nIGJ5IHJldHVybmluZyBhbiBlbXB0eSByZXN1bHQgKi9cclxuXHRcdFx0cmV0dXJuIG9mKHJlc3VsdCBhcyBUKTtcclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDbGVhbnMgdGhlIG9iamVjdCBieSByZW1vdmluZyBwcm9wZXJ0aWVzIHRoYXQgYXJlIG51bGwsIHVuZGVmaW5lZCwgb3IgZW1wdHkgc3RyaW5nc1xyXG5cdCAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjbGVhblxyXG5cdCAqIEByZXR1cm5zIFRoZSBjbGVhbmVkIG9iamVjdFxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBjbGVhbihvYmo6IGFueSk6IGFueSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggYWxsIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCAqL1xyXG5cdFx0XHRmb3IgKHZhciBwcm9wTmFtZSBpbiBvYmopIHtcclxuXHRcdFx0XHQvKiBJZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgbnVsbCwgdW5kZWZpbmVkLCBvciBhbiBlbXB0eSBzdHJpbmcsIGRlbGV0ZSBpdCAqL1xyXG5cdFx0XHRcdGlmIChvYmpbcHJvcE5hbWVdID09PSBudWxsIHx8IG9ialtwcm9wTmFtZV0gPT09IHVuZGVmaW5lZCB8fCBvYmpbcHJvcE5hbWVdID09PSBcIlwiKSB7XHJcblx0XHRcdFx0XHRkZWxldGUgb2JqW3Byb3BOYW1lXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdC8qIEVycm9yIGhhbmRsaW5nIGNhbiBiZSBkb25lIGhlcmUgaWYgbmVjZXNzYXJ5ICovXHJcblx0XHR9XHJcblxyXG5cdFx0LyogUmV0dXJuIHRoZSBjbGVhbmVkIG9iamVjdCAqL1xyXG5cdFx0cmV0dXJuIG9iajtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNhbml0aXplcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBieSByZW1vdmluZyBmYWxzeSB2YWx1ZXMgYW5kIGNvbnZlcnRpbmcgc3RyaW5nIG51bWJlcnMgdG8gbnVtYmVyc1xyXG5cdCAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBzYW5pdGl6ZVxyXG5cdCAqIEBwYXJhbSBpZ25vcmUgUHJvcGVydGllcyB0byBpZ25vcmUgZHVyaW5nIHRoZSBzYW5pdGl6YXRpb25cclxuXHQgKiBAcmV0dXJucyBUaGUgc2FuaXRpemVkIG9iamVjdFxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBzYW5pdGl6ZU9iamVjdChvYmo6IGFueSwgLi4uaWdub3JlOiBzdHJpbmdbXSk6IGFueSB7XHJcblx0XHQvKiBJdGVyYXRlIG92ZXIgb2JqZWN0IGtleXMgYW5kIGZpbHRlciBvdXQgZmFsc3kgdmFsdWVzICovXHJcblx0XHRyZXR1cm4gT2JqZWN0LmtleXMob2JqKVxyXG5cdFx0XHQuZmlsdGVyKHggPT4gb2JqW3hdKVxyXG5cdFx0XHQvKiBJZ25vcmUgcHJvcGVydGllcyB0aGF0IGFyZSBpbiB0aGUgaWdub3JlIGxpc3QgKGNhc2UgaW5zZW5zaXRpdmUpICovXHJcblx0XHRcdC5maWx0ZXIoeCA9PiAhKGlnbm9yZSB8fCBbXSkubWFwKHggPT4geC50b0xvd2VyQ2FzZSgpKS5pbmNsdWRlcyh4LnRvTG93ZXJDYXNlKCkpKVxyXG5cdFx0XHQvKiBDb252ZXJ0IHN0cmluZyBudW1iZXJzIHRvIGFjdHVhbCBudW1iZXJzICovXHJcblx0XHRcdC5yZWR1Y2UoKHJlc3VsdDogYW55LCBrZXkpID0+IHtcclxuXHRcdFx0XHRyZXN1bHRba2V5XSA9IGlzTmFOKCtvYmpba2V5XSkgPyBvYmpba2V5XSA6ICtvYmpba2V5XTtcclxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0XHR9LCB7fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDaGVja3MgaWYgdGhlIHVzZXIgaGFzIHNlbGVjdGVkIGFueSB0ZXh0IGluIHRoZSBkb2N1bWVudFxyXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGV4dCBpcyBzZWxlY3RlZCwgb3RoZXJ3aXNlIGZhbHNlXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGlzVGV4dFNlbGVjdGVkID0gKCk6IGJvb2xlYW4gPT5cclxuXHRcdC8qIFVzZSB0aGUgd2luZG93LmdldFNlbGVjdGlvbiBBUEkgdG8gY2hlY2sgaWYgdGV4dCBpcyBzZWxlY3RlZCAqL1xyXG5cdFx0KHdpbmRvdz8uZ2V0U2VsZWN0aW9uKCk/LnRvU3RyaW5nKCk/Lmxlbmd0aCA/PyAwKSA+IDA7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgdXNlZCBmb3IgYW55IGN1c3RvbSBjbGVhbnVwIHRoYXQgbmVlZHMgdG8gb2NjdXIgd2hlbiB0aGUgaW5zdGFuY2UgaXMgZGVzdHJveWVkXHJcblx0ICovXHJcblx0bmdPbkRlc3Ryb3koKSB7XHJcblx0XHQvKiBVbnN1YnNjcmliZSBmcm9tIGFsbCBNYXRFeHBhbnNpb25QYW5lbCBzdWJzY3JpcHRpb25zICovXHJcblx0XHR0aGlzLm1hdEV4cGFuc2lvblBhbmVsU3Vic2NyaXB0aW9ucy5mb3JFYWNoKHggPT4geC51bnN1YnNjcmliZSgpKTtcclxuXHR9XHJcbn0iXX0=
|