@messaia/cdk 0.0.0-CDK
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/esm2020/lib/base/base.module.mjs +66 -0
- package/esm2020/lib/base/components/base.component.mjs +441 -0
- package/esm2020/lib/base/components/generic-form-base.component.mjs +602 -0
- package/esm2020/lib/base/components/generic-form.component.mjs +31 -0
- package/esm2020/lib/base/components/generic-list.component.mjs +539 -0
- package/esm2020/lib/base/components/generic-reactive-form.component.mjs +54 -0
- package/esm2020/lib/base/constants/common.mjs +24 -0
- package/esm2020/lib/base/enums/message-type.mjs +7 -0
- package/esm2020/lib/base/helpers/auth-helper.mjs +46 -0
- package/esm2020/lib/base/interceptors/base.interceptor.mjs +138 -0
- package/esm2020/lib/base/interceptors/caching-interceptor.mjs +68 -0
- package/esm2020/lib/base/interceptors/loading.interceptor.mjs +63 -0
- package/esm2020/lib/base/models/auth-user.mjs +3 -0
- package/esm2020/lib/base/public_api.mjs +2 -0
- package/esm2020/lib/base/services/file.service.mjs +18 -0
- package/esm2020/lib/base/services/loading-screen.service.mjs +47 -0
- package/esm2020/lib/base/services/print.service.mjs +40 -0
- package/esm2020/lib/chips/chips.module.mjs +63 -0
- package/esm2020/lib/chips/components/chips.component.mjs +419 -0
- package/esm2020/lib/chips/public_api.mjs +3 -0
- package/esm2020/lib/common/animations/collapse/collapse.animation.mjs +44 -0
- package/esm2020/lib/common/animations/common/interfaces.mjs +2 -0
- package/esm2020/lib/common/behaviors/constructor.mjs +2 -0
- package/esm2020/lib/common/behaviors/control-value-accesor.mixin.mjs +39 -0
- package/esm2020/lib/common/behaviors/disabled.mixin.mjs +24 -0
- package/esm2020/lib/common/common.module.mjs +121 -0
- package/esm2020/lib/common/constants/constants.mjs +2 -0
- package/esm2020/lib/common/directives/disable-control.directive.mjs +34 -0
- package/esm2020/lib/common/enums/salutation.mjs +7 -0
- package/esm2020/lib/common/functions/decorators.mjs +22 -0
- package/esm2020/lib/common/functions/functions.mjs +9 -0
- package/esm2020/lib/common/functions/utils.mjs +161 -0
- package/esm2020/lib/common/helpers/app-storage.mjs +53 -0
- package/esm2020/lib/common/helpers/dynamic-builder.mjs +49 -0
- package/esm2020/lib/common/models/action-menu-item.mjs +12 -0
- package/esm2020/lib/common/models/app-setting.mjs +10 -0
- package/esm2020/lib/common/models/audit-entity.mjs +18 -0
- package/esm2020/lib/common/models/audit-user.mjs +3 -0
- package/esm2020/lib/common/models/base-entity.mjs +18 -0
- package/esm2020/lib/common/models/entity.mjs +2 -0
- package/esm2020/lib/common/models/enum-item.mjs +2 -0
- package/esm2020/lib/common/models/key-value.mjs +3 -0
- package/esm2020/lib/common/models/save-action.mjs +7 -0
- package/esm2020/lib/common/pipes/data-source.pipe.mjs +15 -0
- package/esm2020/lib/common/pipes/enum.pipe.mjs +23 -0
- package/esm2020/lib/common/pipes/file-size.pipe.mjs +37 -0
- package/esm2020/lib/common/pipes/filter.pipe.mjs +23 -0
- package/esm2020/lib/common/pipes/first-letter.mjs +24 -0
- package/esm2020/lib/common/pipes/keys.mjs +18 -0
- package/esm2020/lib/common/pipes/month-name.pipe.mjs +27 -0
- package/esm2020/lib/common/pipes/only-number.mjs +53 -0
- package/esm2020/lib/common/pipes/order.pipe.mjs +183 -0
- package/esm2020/lib/common/pipes/placeholder.pipe.mjs +26 -0
- package/esm2020/lib/common/pipes/safe-html.pipe.mjs +31 -0
- package/esm2020/lib/common/pipes/time.pipe.mjs +20 -0
- package/esm2020/lib/common/pipes/titlecase.pipe.mjs +14 -0
- package/esm2020/lib/common/pipes/truncate.pipe.mjs +15 -0
- package/esm2020/lib/common/pipes/values.mjs +14 -0
- package/esm2020/lib/common/public_api.mjs +18 -0
- package/esm2020/lib/common/services/base.service.mjs +19 -0
- package/esm2020/lib/common/services/context-helper.mjs +4 -0
- package/esm2020/lib/common/services/enum.service.mjs +44 -0
- package/esm2020/lib/common/services/service-locator.mjs +24 -0
- package/esm2020/lib/dialogs/alert-dialog/alert-dialog.component.mjs +31 -0
- package/esm2020/lib/dialogs/confirm-dialog/confirm-dialog.component.mjs +37 -0
- package/esm2020/lib/dialogs/dialog.component.mjs +56 -0
- package/esm2020/lib/dialogs/dialogs.module.mjs +82 -0
- package/esm2020/lib/dialogs/prompt-dialog/prompt-dialog.component.mjs +40 -0
- package/esm2020/lib/dialogs/public_api.mjs +2 -0
- package/esm2020/lib/dialogs/services/dialog.service.mjs +136 -0
- package/esm2020/lib/file/file-input.component.mjs +327 -0
- package/esm2020/lib/file/file.module.mjs +39 -0
- package/esm2020/lib/file/public_api.mjs +2 -0
- package/esm2020/lib/form-validators/abstract/typed-form.mjs +3 -0
- package/esm2020/lib/form-validators/algorithm/luhn-algorithm.mjs +15 -0
- package/esm2020/lib/form-validators/const/app-validators.const.mjs +68 -0
- package/esm2020/lib/form-validators/const/app.const.mjs +17 -0
- package/esm2020/lib/form-validators/const/config-names.const.mjs +9 -0
- package/esm2020/lib/form-validators/const/config-required-fields.const.mjs +11 -0
- package/esm2020/lib/form-validators/const/decorators.const.mjs +23 -0
- package/esm2020/lib/form-validators/const/events.const.mjs +14 -0
- package/esm2020/lib/form-validators/const/html-elements.const.mjs +7 -0
- package/esm2020/lib/form-validators/const/iban-country-wise-regex.const.mjs +80 -0
- package/esm2020/lib/form-validators/const/index.mjs +6 -0
- package/esm2020/lib/form-validators/const/operators.const.mjs +7 -0
- package/esm2020/lib/form-validators/const/validation-alphabet-locale.const.mjs +9 -0
- package/esm2020/lib/form-validators/const/validator.const.mjs +8 -0
- package/esm2020/lib/form-validators/core/defaultContainer.mjs +243 -0
- package/esm2020/lib/form-validators/core/validator.interface.mjs +2 -0
- package/esm2020/lib/form-validators/core/validator.static.mjs +74 -0
- package/esm2020/lib/form-validators/decorators/allOf.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/alpha.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/alphaNumeric.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/and.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/ascii.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/async.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/base-decorator.function.mjs +7 -0
- package/esm2020/lib/form-validators/decorators/choice.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/compare.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/compose.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/contains.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/credit-card.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/cusip.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/custom.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/dataUri.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/date.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/different.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/digit.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/email.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/endsWith.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/even.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/extension.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/factor.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/file.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/fileSize.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/greater-than-equal-to.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/greater-than.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/grid.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/hexColor.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/image.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/index.mjs +91 -0
- package/esm2020/lib/form-validators/decorators/json.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/latLong.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/latitude.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/leapYear.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/less-than-equal-to.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/less-than.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/longitude.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/lowercase.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/mac.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/mask.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/maxDate.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/maxLength.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/maxNumber.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/maxTime.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/minDate.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/minLength.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/minNumber.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/minTime.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/model.decorator.mjs +7 -0
- package/esm2020/lib/form-validators/decorators/non-validation-decorators/disable.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/non-validation-decorators/elementClass.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/non-validation-decorators/error.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/noneOf.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/not.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/notEmpty.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/numeric.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/odd.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/oneOf.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/or.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/password.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/pattern.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/port.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/primeNumber.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/prop-array.decorator.mjs +18 -0
- package/esm2020/lib/form-validators/decorators/prop-object.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/prop.decorator.mjs +16 -0
- package/esm2020/lib/form-validators/decorators/range.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/required.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/requiredTrue.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/rule.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/sanitize/blacklist.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/sanitize/escape.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/sanitize/ltrim.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/sanitize/prefix.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/sanitize/rtrim.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/sanitize/sanitize.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/sanitize/stripLow.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/sanitize/suffix.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/sanitize/toBoolean.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/sanitize/toDate.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/sanitize/toDouble.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/sanitize/toFloat.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/sanitize/toInt.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/sanitize/toString.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/sanitize/trim.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/sanitize/whitelist.decorator.mjs +8 -0
- package/esm2020/lib/form-validators/decorators/startsWith.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/time.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/decorators/unique.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/uppercase.decorator.mjs +6 -0
- package/esm2020/lib/form-validators/decorators/url.decorator.mjs +10 -0
- package/esm2020/lib/form-validators/directives/base-directive.mjs +43 -0
- package/esm2020/lib/form-validators/directives/control-host.directive.mjs +34 -0
- package/esm2020/lib/form-validators/directives/html-control-template.directive.mjs +20 -0
- package/esm2020/lib/form-validators/directives/rx-form.directive.mjs +134 -0
- package/esm2020/lib/form-validators/directives/template-validations/async-validation.directive.mjs +31 -0
- package/esm2020/lib/form-validators/directives/template-validations/base-validator.directive.mjs +42 -0
- package/esm2020/lib/form-validators/directives/template-validations/control-expression-process.mjs +26 -0
- package/esm2020/lib/form-validators/directives/template-validations/file-control.directive.mjs +91 -0
- package/esm2020/lib/form-validators/directives/template-validations/image-file-control.directive.mjs +50 -0
- package/esm2020/lib/form-validators/directives/template-validations/rxformcontrol.directive.mjs +277 -0
- package/esm2020/lib/form-validators/domain/disable-provider.mjs +93 -0
- package/esm2020/lib/form-validators/domain/element-processor/decimal.provider.mjs +59 -0
- package/esm2020/lib/form-validators/domain/element-processor/mask.provider.mjs +430 -0
- package/esm2020/lib/form-validators/domain/form-data.mjs +47 -0
- package/esm2020/lib/form-validators/enums/error-message-binding-strategy.mjs +11 -0
- package/esm2020/lib/form-validators/enums/index.mjs +5 -0
- package/esm2020/lib/form-validators/enums/ip-version.mjs +7 -0
- package/esm2020/lib/form-validators/enums/numeric-value-type.mjs +7 -0
- package/esm2020/lib/form-validators/enums/reset-type.mjs +10 -0
- package/esm2020/lib/form-validators/enums/url-validation-type.mjs +7 -0
- package/esm2020/lib/form-validators/models/config/alpha-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/array-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/base-config-fn.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/base-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/base-date-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/choice-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/compare-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/component-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/compose-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/contains-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/credit-card-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/custom-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/date-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/default-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/digit-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/disable-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/element-class-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/email-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/error-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/extension-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/factor-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/field-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/file-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/hex-color-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/iban-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/image-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/index.mjs +35 -0
- package/esm2020/lib/form-validators/models/config/ip-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/logical-operator-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/mask-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/max-date-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/message-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/min-date-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/model-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/number-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/numeric-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/password-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/pattern-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/prop-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/props-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/range-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/relational-operator-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/required-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/rule-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/sanitize-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/size-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/string-comparison-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/time-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/todate-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/unique-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/config/url-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/form-builder-configuration.mjs +8 -0
- package/esm2020/lib/form-validators/models/index.mjs +3 -0
- package/esm2020/lib/form-validators/models/interface/array-prop-instance-config.interface.mjs +2 -0
- package/esm2020/lib/form-validators/models/interface/auto-instance-config.interface.mjs +2 -0
- package/esm2020/lib/form-validators/models/interface/form-data-config.mjs +2 -0
- package/esm2020/lib/form-validators/models/interface/i-abstract-control.mjs +4 -0
- package/esm2020/lib/form-validators/models/interface/i-form-group.mjs +2 -0
- package/esm2020/lib/form-validators/models/interface/instance-argument.interface.mjs +2 -0
- package/esm2020/lib/form-validators/models/interface/object-prop-instance-config.interface.mjs +2 -0
- package/esm2020/lib/form-validators/models/interface/options.mjs +2 -0
- package/esm2020/lib/form-validators/models/password-validation.model.mjs +2 -0
- package/esm2020/lib/form-validators/models/prop-validation-config.mjs +2 -0
- package/esm2020/lib/form-validators/public_api.mjs +25 -0
- package/esm2020/lib/form-validators/reactive-form-validators/allOf.validator.mjs +22 -0
- package/esm2020/lib/form-validators/reactive-form-validators/alpha.validator.mjs +9 -0
- package/esm2020/lib/form-validators/reactive-form-validators/alphaNumeric.validator.mjs +9 -0
- package/esm2020/lib/form-validators/reactive-form-validators/and.validator.mjs +23 -0
- package/esm2020/lib/form-validators/reactive-form-validators/ascii.validator.mjs +9 -0
- package/esm2020/lib/form-validators/reactive-form-validators/async/base.async.validator.mjs +24 -0
- package/esm2020/lib/form-validators/reactive-form-validators/choice.validator.mjs +19 -0
- package/esm2020/lib/form-validators/reactive-form-validators/compare.validator.mjs +20 -0
- package/esm2020/lib/form-validators/reactive-form-validators/compose.validator.mjs +23 -0
- package/esm2020/lib/form-validators/reactive-form-validators/conditional-change.validator.mjs +63 -0
- package/esm2020/lib/form-validators/reactive-form-validators/contains.validator.mjs +15 -0
- package/esm2020/lib/form-validators/reactive-form-validators/credit-card.validator.mjs +48 -0
- package/esm2020/lib/form-validators/reactive-form-validators/cusip.validator.mjs +38 -0
- package/esm2020/lib/form-validators/reactive-form-validators/custom.validator.mjs +23 -0
- package/esm2020/lib/form-validators/reactive-form-validators/dataUri.validator.mjs +9 -0
- package/esm2020/lib/form-validators/reactive-form-validators/date.validator.mjs +8 -0
- package/esm2020/lib/form-validators/reactive-form-validators/different.validator.mjs +19 -0
- package/esm2020/lib/form-validators/reactive-form-validators/digit.validator.mjs +9 -0
- package/esm2020/lib/form-validators/reactive-form-validators/email.validator.mjs +9 -0
- package/esm2020/lib/form-validators/reactive-form-validators/endsWith.validator.mjs +16 -0
- package/esm2020/lib/form-validators/reactive-form-validators/even.validator.mjs +15 -0
- package/esm2020/lib/form-validators/reactive-form-validators/extension.validator.mjs +40 -0
- package/esm2020/lib/form-validators/reactive-form-validators/factor.validator.mjs +37 -0
- package/esm2020/lib/form-validators/reactive-form-validators/file.validator.mjs +26 -0
- package/esm2020/lib/form-validators/reactive-form-validators/fileSize.validator.mjs +32 -0
- package/esm2020/lib/form-validators/reactive-form-validators/greater-than-equal-to.validator.mjs +8 -0
- package/esm2020/lib/form-validators/reactive-form-validators/greater-than.validator.mjs +8 -0
- package/esm2020/lib/form-validators/reactive-form-validators/grid.validator.mjs +31 -0
- package/esm2020/lib/form-validators/reactive-form-validators/hexcolor.validator.mjs +9 -0
- package/esm2020/lib/form-validators/reactive-form-validators/iban.validator.mjs +30 -0
- package/esm2020/lib/form-validators/reactive-form-validators/image.validator.mjs +48 -0
- package/esm2020/lib/form-validators/reactive-form-validators/index.mjs +66 -0
- package/esm2020/lib/form-validators/reactive-form-validators/ip.validator.mjs +35 -0
- package/esm2020/lib/form-validators/reactive-form-validators/json.validator.mjs +26 -0
- package/esm2020/lib/form-validators/reactive-form-validators/latLong.validator.mjs +18 -0
- package/esm2020/lib/form-validators/reactive-form-validators/latitude.validator.mjs +9 -0
- package/esm2020/lib/form-validators/reactive-form-validators/leapYear.validator.mjs +16 -0
- package/esm2020/lib/form-validators/reactive-form-validators/less-than-equal-to.validator.mjs +8 -0
- package/esm2020/lib/form-validators/reactive-form-validators/less-than.validator.mjs +8 -0
- package/esm2020/lib/form-validators/reactive-form-validators/longitude.validator.mjs +9 -0
- package/esm2020/lib/form-validators/reactive-form-validators/lowercase.validator.mjs +15 -0
- package/esm2020/lib/form-validators/reactive-form-validators/mac.validator.mjs +9 -0
- package/esm2020/lib/form-validators/reactive-form-validators/mask.validator.mjs +13 -0
- package/esm2020/lib/form-validators/reactive-form-validators/maxDate.validator.mjs +8 -0
- package/esm2020/lib/form-validators/reactive-form-validators/maxLength.validator.mjs +16 -0
- package/esm2020/lib/form-validators/reactive-form-validators/maxNumber.validator.mjs +16 -0
- package/esm2020/lib/form-validators/reactive-form-validators/maxTime.validator.mjs +8 -0
- package/esm2020/lib/form-validators/reactive-form-validators/minDate.validator.mjs +8 -0
- package/esm2020/lib/form-validators/reactive-form-validators/minLength.validator.mjs +16 -0
- package/esm2020/lib/form-validators/reactive-form-validators/minNumber.validator.mjs +16 -0
- package/esm2020/lib/form-validators/reactive-form-validators/minTime.validator.mjs +8 -0
- package/esm2020/lib/form-validators/reactive-form-validators/noneOf.validator.mjs +24 -0
- package/esm2020/lib/form-validators/reactive-form-validators/not.validator.mjs +23 -0
- package/esm2020/lib/form-validators/reactive-form-validators/notEmpty.validator.mjs +17 -0
- package/esm2020/lib/form-validators/reactive-form-validators/numeric.validator.mjs +20 -0
- package/esm2020/lib/form-validators/reactive-form-validators/odd.validator.mjs +16 -0
- package/esm2020/lib/form-validators/reactive-form-validators/oneOf.validator.mjs +22 -0
- package/esm2020/lib/form-validators/reactive-form-validators/or.validator.mjs +23 -0
- package/esm2020/lib/form-validators/reactive-form-validators/password.validator.mjs +33 -0
- package/esm2020/lib/form-validators/reactive-form-validators/pattern.validator.mjs +17 -0
- package/esm2020/lib/form-validators/reactive-form-validators/port.validator.mjs +18 -0
- package/esm2020/lib/form-validators/reactive-form-validators/primeNumber.validator.mjs +26 -0
- package/esm2020/lib/form-validators/reactive-form-validators/range.validator.mjs +16 -0
- package/esm2020/lib/form-validators/reactive-form-validators/required.validator.mjs +17 -0
- package/esm2020/lib/form-validators/reactive-form-validators/requiredTrue.validator.mjs +16 -0
- package/esm2020/lib/form-validators/reactive-form-validators/rule.validator.mjs +20 -0
- package/esm2020/lib/form-validators/reactive-form-validators/startsWith.validator.mjs +16 -0
- package/esm2020/lib/form-validators/reactive-form-validators/time.validator.mjs +18 -0
- package/esm2020/lib/form-validators/reactive-form-validators/unique.validator.mjs +70 -0
- package/esm2020/lib/form-validators/reactive-form-validators/uppercase.validator.mjs +15 -0
- package/esm2020/lib/form-validators/reactive-form-validators/url.validator.mjs +28 -0
- package/esm2020/lib/form-validators/services/base-form-builder.mjs +115 -0
- package/esm2020/lib/form-validators/services/entity.service.mjs +64 -0
- package/esm2020/lib/form-validators/services/form-control.mjs +349 -0
- package/esm2020/lib/form-validators/services/form-group.mjs +2 -0
- package/esm2020/lib/form-validators/services/reactive-form.module.mjs +52 -0
- package/esm2020/lib/form-validators/services/rx-form-array.mjs +100 -0
- package/esm2020/lib/form-validators/services/rx-form-builder.mjs +559 -0
- package/esm2020/lib/form-validators/services/rx-form-group.mjs +299 -0
- package/esm2020/lib/form-validators/services/typed-form-builder.mjs +23 -0
- package/esm2020/lib/form-validators/util/alphabet-regex.locale.mjs +29 -0
- package/esm2020/lib/form-validators/util/app-util.mjs +141 -0
- package/esm2020/lib/form-validators/util/check-length.mjs +10 -0
- package/esm2020/lib/form-validators/util/config-provider.mjs +35 -0
- package/esm2020/lib/form-validators/util/date-checker.function.mjs +52 -0
- package/esm2020/lib/form-validators/util/date-provider.mjs +97 -0
- package/esm2020/lib/form-validators/util/form-const.mjs +3 -0
- package/esm2020/lib/form-validators/util/form-provider.mjs +37 -0
- package/esm2020/lib/form-validators/util/index.mjs +7 -0
- package/esm2020/lib/form-validators/util/instance-provider.function.mjs +30 -0
- package/esm2020/lib/form-validators/util/ip-checker.mjs +18 -0
- package/esm2020/lib/form-validators/util/linq.mjs +147 -0
- package/esm2020/lib/form-validators/util/object-maker.mjs +38 -0
- package/esm2020/lib/form-validators/util/reactive-form-config.mjs +23 -0
- package/esm2020/lib/form-validators/util/regex-rules.mjs +37 -0
- package/esm2020/lib/form-validators/util/regex-validator.mjs +74 -0
- package/esm2020/lib/form-validators/util/relational-checker.function.mjs +85 -0
- package/esm2020/lib/form-validators/util/reset-form.mjs +56 -0
- package/esm2020/lib/form-validators/util/sanitizers.mjs +131 -0
- package/esm2020/lib/form-validators/util/time-checker.function.mjs +48 -0
- package/esm2020/lib/form-validators/util/type.mjs +2 -0
- package/esm2020/lib/form-validators/util/validator-value-checker.mjs +17 -0
- package/esm2020/lib/form-validators/validators-extension/allOf-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/alpha-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/alphaNumeric-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/and-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/ascii-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/base-validator.function.mjs +33 -0
- package/esm2020/lib/form-validators/validators-extension/choice-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/compare-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/compose-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/contains-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/credit-card-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/cusip-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/custom-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/dataUri-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/date-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/different-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/digit-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/email-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/endsWith-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/even-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/extension-validator.extension.mjs +10 -0
- package/esm2020/lib/form-validators/validators-extension/factor-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/file-validator.extension.mjs +10 -0
- package/esm2020/lib/form-validators/validators-extension/fileSize-validator.extension.mjs +10 -0
- package/esm2020/lib/form-validators/validators-extension/greater-than-equal-to-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/greater-than-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/grid-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/hexcolor-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/iban-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/image-validator.extension.mjs +10 -0
- package/esm2020/lib/form-validators/validators-extension/index.mjs +68 -0
- package/esm2020/lib/form-validators/validators-extension/ip-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/json-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/latLong-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/latitude-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/leapYear-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/less-than-equal-to-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/less-than-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/longitude-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/lowercase-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/mac-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/mask-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/maxDate-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/maxLength-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/maxNumber-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/maxTime-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/minDate-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/minLength-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/minNumber-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/minTime-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/noneOf-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/not-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/notEmpty-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/numeric-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/odd-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/oneOf-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/or-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/password-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/pattern-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/port-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/primeNumber-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/range-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/required-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/requiredTrue-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/rxweb-validators.mjs +108 -0
- package/esm2020/lib/form-validators/validators-extension/startsWith-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/time-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-extension/unique-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/uppercase-validator.extension.mjs +7 -0
- package/esm2020/lib/form-validators/validators-extension/url-validator.extension.mjs +11 -0
- package/esm2020/lib/form-validators/validators-function/alpha-validation.function.mjs +37 -0
- package/esm2020/lib/form-validators/validators-function/regex-validation.function.mjs +16 -0
- package/esm2020/lib/forms/components/generic-form/generic-form.component.mjs +131 -0
- package/esm2020/lib/forms/constants/constants.mjs +2 -0
- package/esm2020/lib/forms/directives/mat-form-field-editor.directive.mjs +162 -0
- package/esm2020/lib/forms/directives/mat-form-field-readonly.directive.mjs +33 -0
- package/esm2020/lib/forms/enums/form-field-type.mjs +19 -0
- package/esm2020/lib/forms/forms.module.mjs +125 -0
- package/esm2020/lib/forms/functions/decorators.mjs +127 -0
- package/esm2020/lib/forms/functions/functions.mjs +10 -0
- package/esm2020/lib/forms/helpers/abstract-mat-form-field.mjs +251 -0
- package/esm2020/lib/forms/helpers/value-accessor-base.mjs +141 -0
- package/esm2020/lib/forms/models/form-field-definition.mjs +18 -0
- package/esm2020/lib/forms/models/form-field-group.mjs +11 -0
- package/esm2020/lib/forms/public_api.mjs +4 -0
- package/esm2020/lib/forms/validators/equal-validator.directive.mjs +79 -0
- package/esm2020/lib/forms/validators/native-element-injector.directive.mjs +32 -0
- package/esm2020/lib/forms/validators/unique-validator-directive.mjs +75 -0
- package/esm2020/lib/http/http.module.mjs +20 -0
- package/esm2020/lib/http/public_api.mjs +2 -0
- package/esm2020/lib/http/services/generic.service.mjs +319 -0
- package/esm2020/lib/layout/form-toolbar/form-toolbar.component.mjs +30 -0
- package/esm2020/lib/layout/form-toolbar-menu/form-toolbar-menu.component.mjs +17 -0
- package/esm2020/lib/layout/layout-card-over/layout-card-over.component.mjs +43 -0
- package/esm2020/lib/layout/layout-footer/layout-footer.component.mjs +34 -0
- package/esm2020/lib/layout/layout-manage-list/layout-manage-list.component.mjs +130 -0
- package/esm2020/lib/layout/layout-manage-list/layout-manage-list.directives.mjs +108 -0
- package/esm2020/lib/layout/layout-nav/layout-nav.component.mjs +95 -0
- package/esm2020/lib/layout/layout-nav-list/layout-nav-list.component.mjs +123 -0
- package/esm2020/lib/layout/layout-nav-list/layout-nav-list.directives.mjs +81 -0
- package/esm2020/lib/layout/layout-toggle.class.mjs +71 -0
- package/esm2020/lib/layout/layout.component.mjs +82 -0
- package/esm2020/lib/layout/layout.directives.mjs +81 -0
- package/esm2020/lib/layout/layout.module.mjs +146 -0
- package/esm2020/lib/layout/list-toolbar/list-toolbar.component.mjs +23 -0
- package/esm2020/lib/layout/list-toolbar-menu/list-toolbar-menu.component.mjs +17 -0
- package/esm2020/lib/layout/navigation-drawer/navigation-drawer.component.mjs +167 -0
- package/esm2020/lib/layout/public_api.mjs +2 -0
- package/esm2020/lib/media/directives/media-toggle.directive.mjs +115 -0
- package/esm2020/lib/media/media.module.mjs +37 -0
- package/esm2020/lib/media/public_api.mjs +2 -0
- package/esm2020/lib/media/services/media.service.mjs +108 -0
- package/esm2020/lib/menu/components/menu.component.mjs +52 -0
- package/esm2020/lib/menu/enums/menu-scope.mjs +6 -0
- package/esm2020/lib/menu/menu.module.mjs +50 -0
- package/esm2020/lib/menu/models/menu-item.mjs +3 -0
- package/esm2020/lib/menu/models/menu.mjs +3 -0
- package/esm2020/lib/menu/public_api.mjs +2 -0
- package/esm2020/lib/menu/services/menu-items.service.mjs +19 -0
- package/esm2020/lib/menu/services/menu.resolve.mjs +62 -0
- package/esm2020/lib/menu/services/menu.service.mjs +19 -0
- package/esm2020/lib/search/public_api.mjs +2 -0
- package/esm2020/lib/search/search.module.mjs +47 -0
- package/esm2020/lib/search/vd-search-box/vd-search-box.component.mjs +143 -0
- package/esm2020/lib/search/vd-search-input/vd-search-input.component.mjs +148 -0
- package/esm2020/lib/select/public_api.mjs +3 -0
- package/esm2020/lib/select/select.component.mjs +407 -0
- package/esm2020/lib/select/select.module.mjs +45 -0
- package/esm2020/lib/table/components/dynamic-table/dynamic-table.component.mjs +349 -0
- package/esm2020/lib/table/components/filter-clear.component.mjs +44 -0
- package/esm2020/lib/table/components/filter-date.component.mjs +151 -0
- package/esm2020/lib/table/components/filter-input.component.mjs +198 -0
- package/esm2020/lib/table/components/filter-select.component.mjs +334 -0
- package/esm2020/lib/table/directives/data-source-filter.directive.mjs +45 -0
- package/esm2020/lib/table/enums/table-column-type.mjs +14 -0
- package/esm2020/lib/table/functions/decorators.mjs +135 -0
- package/esm2020/lib/table/functions/functions.mjs +15 -0
- package/esm2020/lib/table/models/pagination.mjs +3 -0
- package/esm2020/lib/table/models/table-column.mjs +10 -0
- package/esm2020/lib/table/models/table-definition.mjs +17 -0
- package/esm2020/lib/table/models/table-menu-item.mjs +12 -0
- package/esm2020/lib/table/paginator-intl.mjs +44 -0
- package/esm2020/lib/table/public_api.mjs +3 -0
- package/esm2020/lib/table/table.data-source.mjs +212 -0
- package/esm2020/lib/table/table.module.mjs +139 -0
- package/esm2020/lib/table/table.static-data-source.mjs +131 -0
- package/esm2020/messaia-cdk.mjs +5 -0
- package/esm2020/public_api.mjs +18 -0
- package/fesm2015/messaia-cdk.mjs +16621 -0
- package/fesm2015/messaia-cdk.mjs.map +1 -0
- package/fesm2020/messaia-cdk.mjs +16538 -0
- package/fesm2020/messaia-cdk.mjs.map +1 -0
- package/lib/base/base.module.d.ts +25 -0
- package/lib/base/components/base.component.d.ts +258 -0
- package/lib/base/components/generic-form-base.component.d.ts +310 -0
- package/lib/base/components/generic-form.component.d.ts +32 -0
- package/lib/base/components/generic-list.component.d.ts +273 -0
- package/lib/base/components/generic-reactive-form.component.d.ts +47 -0
- package/lib/base/constants/common.d.ts +9 -0
- package/lib/base/enums/message-type.d.ts +5 -0
- package/lib/base/helpers/auth-helper.d.ts +26 -0
- package/lib/base/interceptors/base.interceptor.d.ts +40 -0
- package/lib/base/interceptors/caching-interceptor.d.ts +35 -0
- package/lib/base/interceptors/loading.interceptor.d.ts +30 -0
- package/lib/base/models/auth-user.d.ts +15 -0
- package/lib/base/public_api.d.ts +1 -0
- package/lib/base/services/file.service.d.ts +10 -0
- package/lib/base/services/loading-screen.service.d.ts +30 -0
- package/lib/base/services/print.service.d.ts +23 -0
- package/lib/chips/chips.module.d.ts +15 -0
- package/lib/chips/components/chips.component.d.ts +223 -0
- package/lib/chips/public_api.d.ts +2 -0
- package/lib/common/animations/collapse/collapse.animation.d.ts +21 -0
- package/lib/common/animations/common/interfaces.d.ts +5 -0
- package/lib/common/behaviors/constructor.d.ts +1 -0
- package/lib/common/behaviors/control-value-accesor.mixin.d.ts +16 -0
- package/lib/common/behaviors/disabled.mixin.d.ts +8 -0
- package/lib/common/common.module.d.ts +53 -0
- package/lib/common/constants/constants.d.ts +1 -0
- package/lib/common/directives/disable-control.directive.d.ts +16 -0
- package/lib/common/enums/salutation.d.ts +5 -0
- package/lib/common/functions/decorators.d.ts +12 -0
- package/lib/common/functions/functions.d.ts +6 -0
- package/lib/common/functions/utils.d.ts +73 -0
- package/lib/common/helpers/app-storage.d.ts +32 -0
- package/lib/common/helpers/dynamic-builder.d.ts +19 -0
- package/lib/common/models/action-menu-item.d.ts +15 -0
- package/lib/common/models/app-setting.d.ts +17 -0
- package/lib/common/models/audit-entity.d.ts +12 -0
- package/lib/common/models/audit-user.d.ts +5 -0
- package/lib/common/models/base-entity.d.ts +10 -0
- package/lib/common/models/entity.d.ts +3 -0
- package/lib/common/models/enum-item.d.ts +4 -0
- package/lib/common/models/key-value.d.ts +4 -0
- package/lib/common/models/save-action.d.ts +5 -0
- package/lib/common/pipes/data-source.pipe.d.ts +7 -0
- package/lib/common/pipes/enum.pipe.d.ts +12 -0
- package/lib/common/pipes/file-size.pipe.d.ts +13 -0
- package/lib/common/pipes/filter.pipe.d.ts +13 -0
- package/lib/common/pipes/first-letter.d.ts +12 -0
- package/lib/common/pipes/keys.d.ts +7 -0
- package/lib/common/pipes/month-name.pipe.d.ts +15 -0
- package/lib/common/pipes/only-number.d.ts +21 -0
- package/lib/common/pipes/order.pipe.d.ts +77 -0
- package/lib/common/pipes/placeholder.pipe.d.ts +13 -0
- package/lib/common/pipes/safe-html.pipe.d.ts +22 -0
- package/lib/common/pipes/time.pipe.d.ts +7 -0
- package/lib/common/pipes/titlecase.pipe.d.ts +7 -0
- package/lib/common/pipes/truncate.pipe.d.ts +7 -0
- package/lib/common/pipes/values.d.ts +7 -0
- package/lib/common/public_api.d.ts +17 -0
- package/lib/common/services/base.service.d.ts +10 -0
- package/lib/common/services/context-helper.d.ts +17 -0
- package/lib/common/services/enum.service.d.ts +23 -0
- package/lib/common/services/service-locator.d.ts +19 -0
- package/lib/common/styles/_common-theme.scss +27 -0
- package/lib/common/styles/_elevation.scss +147 -0
- package/lib/common/styles/_layout.scss +588 -0
- package/lib/common/styles/_rtl.scss +28 -0
- package/lib/common/styles/_styles.scss +12 -0
- package/lib/common/styles/_theme-functions.scss +27 -0
- package/lib/common/styles/_typography-functions.scss +35 -0
- package/lib/common/styles/_typography.scss +76 -0
- package/lib/common/styles/_variables.scss +98 -0
- package/lib/common/styles/colors/_colors-dark.scss +388 -0
- package/lib/common/styles/colors/_colors-light.scss +904 -0
- package/lib/common/styles/colors/_colors.scss +7 -0
- package/lib/common/styles/core/_button.scss +59 -0
- package/lib/common/styles/core/_card.scss +160 -0
- package/lib/common/styles/core/_content.scss +42 -0
- package/lib/common/styles/core/_core.scss +23 -0
- package/lib/common/styles/core/_divider.scss +14 -0
- package/lib/common/styles/core/_icons.scss +26 -0
- package/lib/common/styles/core/_list.scss +8 -0
- package/lib/common/styles/core/_sidenav.scss +20 -0
- package/lib/common/styles/core/_structure.scss +126 -0
- package/lib/common/styles/core/_toolbar.scss +31 -0
- package/lib/common/styles/core/_whiteframe.scss +111 -0
- package/lib/common/styles/font/_font.scss +92 -0
- package/lib/common/styles/material-icons.scss +3 -0
- package/lib/common/styles/platform.scss +11 -0
- package/lib/common/styles/utilities/_general.scss +81 -0
- package/lib/common/styles/utilities/_pad.scss +36 -0
- package/lib/common/styles/utilities/_pull.scss +36 -0
- package/lib/common/styles/utilities/_push.scss +36 -0
- package/lib/common/styles/utilities/_size.scss +24 -0
- package/lib/common/styles/utilities/_text.scss +87 -0
- package/lib/common/styles/utilities/_utilities.scss +15 -0
- package/lib/common/theming/_all-theme.scss +14 -0
- package/lib/common/typography/_all-typography.scss +33 -0
- package/lib/dialogs/alert-dialog/alert-dialog.component.d.ts +20 -0
- package/lib/dialogs/confirm-dialog/confirm-dialog.component.d.ts +24 -0
- package/lib/dialogs/dialog.component.d.ts +23 -0
- package/lib/dialogs/dialogs.module.d.ts +21 -0
- package/lib/dialogs/prompt-dialog/prompt-dialog.component.d.ts +25 -0
- package/lib/dialogs/public_api.d.ts +1 -0
- package/lib/dialogs/services/dialog.service.d.ts +96 -0
- package/lib/file/file-input.component.d.ts +191 -0
- package/lib/file/file.module.d.ts +13 -0
- package/lib/file/public_api.d.ts +1 -0
- package/lib/form-validators/abstract/typed-form.d.ts +4 -0
- package/lib/form-validators/algorithm/luhn-algorithm.d.ts +1 -0
- package/lib/form-validators/const/app-validators.const.d.ts +3 -0
- package/lib/form-validators/const/app.const.d.ts +16 -0
- package/lib/form-validators/const/config-names.const.d.ts +8 -0
- package/lib/form-validators/const/config-required-fields.const.d.ts +3 -0
- package/lib/form-validators/const/decorators.const.d.ts +3 -0
- package/lib/form-validators/const/events.const.d.ts +13 -0
- package/lib/form-validators/const/html-elements.const.d.ts +6 -0
- package/lib/form-validators/const/iban-country-wise-regex.const.d.ts +79 -0
- package/lib/form-validators/const/index.d.ts +5 -0
- package/lib/form-validators/const/operators.const.d.ts +3 -0
- package/lib/form-validators/const/validation-alphabet-locale.const.d.ts +3 -0
- package/lib/form-validators/const/validator.const.d.ts +7 -0
- package/lib/form-validators/core/defaultContainer.d.ts +19 -0
- package/lib/form-validators/core/validator.interface.d.ts +61 -0
- package/lib/form-validators/core/validator.static.d.ts +3 -0
- package/lib/form-validators/decorators/allOf.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/alpha.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/alphaNumeric.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/and.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/ascii.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/async.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/base-decorator.function.d.ts +1 -0
- package/lib/form-validators/decorators/choice.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/compare.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/compose.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/contains.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/credit-card.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/cusip.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/custom.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/dataUri.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/date.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/different.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/digit.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/email.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/endsWith.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/even.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/extension.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/factor.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/file.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/fileSize.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/greater-than-equal-to.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/greater-than.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/grid.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/hexColor.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/image.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/index.d.ts +90 -0
- package/lib/form-validators/decorators/json.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/latLong.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/latitude.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/leapYear.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/less-than-equal-to.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/less-than.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/longitude.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/lowercase.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/mac.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/mask.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/maxDate.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/maxLength.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/maxNumber.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/maxTime.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/minDate.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/minLength.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/minNumber.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/minTime.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/model.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/non-validation-decorators/disable.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/non-validation-decorators/elementClass.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/non-validation-decorators/error.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/noneOf.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/not.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/notEmpty.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/numeric.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/odd.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/oneOf.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/or.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/password.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/pattern.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/port.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/primeNumber.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/prop-array.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/prop-object.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/prop.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/range.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/required.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/requiredTrue.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/rule.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/sanitize/blacklist.decorator.d.ts +1 -0
- package/lib/form-validators/decorators/sanitize/escape.decorator.d.ts +1 -0
- package/lib/form-validators/decorators/sanitize/ltrim.decorator.d.ts +1 -0
- package/lib/form-validators/decorators/sanitize/prefix.decorator.d.ts +1 -0
- package/lib/form-validators/decorators/sanitize/rtrim.decorator.d.ts +1 -0
- package/lib/form-validators/decorators/sanitize/sanitize.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/sanitize/stripLow.decorator.d.ts +1 -0
- package/lib/form-validators/decorators/sanitize/suffix.decorator.d.ts +1 -0
- package/lib/form-validators/decorators/sanitize/toBoolean.decorator.d.ts +1 -0
- package/lib/form-validators/decorators/sanitize/toDate.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/sanitize/toDouble.decorator.d.ts +1 -0
- package/lib/form-validators/decorators/sanitize/toFloat.decorator.d.ts +1 -0
- package/lib/form-validators/decorators/sanitize/toInt.decorator.d.ts +1 -0
- package/lib/form-validators/decorators/sanitize/toString.decorator.d.ts +1 -0
- package/lib/form-validators/decorators/sanitize/trim.decorator.d.ts +1 -0
- package/lib/form-validators/decorators/sanitize/whitelist.decorator.d.ts +1 -0
- package/lib/form-validators/decorators/startsWith.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/time.decorator.d.ts +3 -0
- package/lib/form-validators/decorators/unique.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/uppercase.decorator.d.ts +2 -0
- package/lib/form-validators/decorators/url.decorator.d.ts +3 -0
- package/lib/form-validators/directives/base-directive.d.ts +8 -0
- package/lib/form-validators/directives/control-host.directive.d.ts +11 -0
- package/lib/form-validators/directives/html-control-template.directive.d.ts +9 -0
- package/lib/form-validators/directives/rx-form.directive.d.ts +18 -0
- package/lib/form-validators/directives/template-validations/async-validation.directive.d.ts +9 -0
- package/lib/form-validators/directives/template-validations/base-validator.directive.d.ts +17 -0
- package/lib/form-validators/directives/template-validations/control-expression-process.d.ts +18 -0
- package/lib/form-validators/directives/template-validations/file-control.directive.d.ts +29 -0
- package/lib/form-validators/directives/template-validations/image-file-control.directive.d.ts +17 -0
- package/lib/form-validators/directives/template-validations/rxformcontrol.directive.d.ts +89 -0
- package/lib/form-validators/domain/disable-provider.d.ts +15 -0
- package/lib/form-validators/domain/element-processor/decimal.provider.d.ts +17 -0
- package/lib/form-validators/domain/element-processor/mask.provider.d.ts +63 -0
- package/lib/form-validators/domain/form-data.d.ts +10 -0
- package/lib/form-validators/enums/error-message-binding-strategy.d.ts +9 -0
- package/lib/form-validators/enums/index.d.ts +4 -0
- package/lib/form-validators/enums/ip-version.d.ts +5 -0
- package/lib/form-validators/enums/numeric-value-type.d.ts +5 -0
- package/lib/form-validators/enums/reset-type.d.ts +8 -0
- package/lib/form-validators/enums/url-validation-type.d.ts +5 -0
- package/lib/form-validators/models/config/alpha-config.d.ts +5 -0
- package/lib/form-validators/models/config/array-config.d.ts +4 -0
- package/lib/form-validators/models/config/base-config-fn.d.ts +10 -0
- package/lib/form-validators/models/config/base-config.d.ts +7 -0
- package/lib/form-validators/models/config/base-date-config.d.ts +4 -0
- package/lib/form-validators/models/config/choice-config.d.ts +5 -0
- package/lib/form-validators/models/config/compare-config.d.ts +5 -0
- package/lib/form-validators/models/config/component-config.d.ts +3 -0
- package/lib/form-validators/models/config/compose-config.d.ts +5 -0
- package/lib/form-validators/models/config/contains-config.d.ts +4 -0
- package/lib/form-validators/models/config/credit-card-config.d.ts +5 -0
- package/lib/form-validators/models/config/custom-config.d.ts +5 -0
- package/lib/form-validators/models/config/date-config.d.ts +6 -0
- package/lib/form-validators/models/config/default-config.d.ts +4 -0
- package/lib/form-validators/models/config/digit-config.d.ts +3 -0
- package/lib/form-validators/models/config/disable-config.d.ts +3 -0
- package/lib/form-validators/models/config/element-class-config.d.ts +3 -0
- package/lib/form-validators/models/config/email-config.d.ts +3 -0
- package/lib/form-validators/models/config/error-config.d.ts +3 -0
- package/lib/form-validators/models/config/extension-config.d.ts +5 -0
- package/lib/form-validators/models/config/factor-config.d.ts +5 -0
- package/lib/form-validators/models/config/field-config.d.ts +4 -0
- package/lib/form-validators/models/config/file-config.d.ts +5 -0
- package/lib/form-validators/models/config/hex-color-config.d.ts +4 -0
- package/lib/form-validators/models/config/iban-config.d.ts +4 -0
- package/lib/form-validators/models/config/image-config.d.ts +7 -0
- package/lib/form-validators/models/config/index.d.ts +34 -0
- package/lib/form-validators/models/config/ip-config.d.ts +6 -0
- package/lib/form-validators/models/config/logical-operator-config.d.ts +5 -0
- package/lib/form-validators/models/config/mask-config.d.ts +6 -0
- package/lib/form-validators/models/config/max-date-config.d.ts +4 -0
- package/lib/form-validators/models/config/message-config.d.ts +3 -0
- package/lib/form-validators/models/config/min-date-config.d.ts +4 -0
- package/lib/form-validators/models/config/model-config.d.ts +4 -0
- package/lib/form-validators/models/config/number-config.d.ts +4 -0
- package/lib/form-validators/models/config/numeric-config.d.ts +8 -0
- package/lib/form-validators/models/config/password-config.d.ts +13 -0
- package/lib/form-validators/models/config/pattern-config.d.ts +6 -0
- package/lib/form-validators/models/config/prop-config.d.ts +14 -0
- package/lib/form-validators/models/config/props-config.d.ts +12 -0
- package/lib/form-validators/models/config/range-config.d.ts +5 -0
- package/lib/form-validators/models/config/relational-operator-config.d.ts +6 -0
- package/lib/form-validators/models/config/required-config.d.ts +3 -0
- package/lib/form-validators/models/config/rule-config.d.ts +4 -0
- package/lib/form-validators/models/config/sanitize-config.d.ts +3 -0
- package/lib/form-validators/models/config/size-config.d.ts +5 -0
- package/lib/form-validators/models/config/string-comparison-config.d.ts +4 -0
- package/lib/form-validators/models/config/time-config.d.ts +15 -0
- package/lib/form-validators/models/config/todate-config.d.ts +3 -0
- package/lib/form-validators/models/config/unique-config.d.ts +4 -0
- package/lib/form-validators/models/config/url-config.d.ts +5 -0
- package/lib/form-validators/models/form-builder-configuration.d.ts +28 -0
- package/lib/form-validators/models/index.d.ts +2 -0
- package/lib/form-validators/models/interface/array-prop-instance-config.interface.d.ts +5 -0
- package/lib/form-validators/models/interface/auto-instance-config.interface.d.ts +7 -0
- package/lib/form-validators/models/interface/form-data-config.d.ts +3 -0
- package/lib/form-validators/models/interface/i-abstract-control.d.ts +15 -0
- package/lib/form-validators/models/interface/i-form-group.d.ts +37 -0
- package/lib/form-validators/models/interface/instance-argument.interface.d.ts +3 -0
- package/lib/form-validators/models/interface/object-prop-instance-config.interface.d.ts +4 -0
- package/lib/form-validators/models/interface/options.d.ts +9 -0
- package/lib/form-validators/models/password-validation.model.d.ts +20 -0
- package/lib/form-validators/models/prop-validation-config.d.ts +78 -0
- package/lib/form-validators/public_api.d.ts +24 -0
- package/lib/form-validators/reactive-form-validators/allOf.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/alpha.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/alphaNumeric.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/and.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/ascii.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/async/base.async.validator.d.ts +2 -0
- package/lib/form-validators/reactive-form-validators/choice.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/compare.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/compose.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/conditional-change.validator.d.ts +2 -0
- package/lib/form-validators/reactive-form-validators/contains.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/credit-card.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/cusip.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/custom.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/dataUri.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/date.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/different.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/digit.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/email.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/endsWith.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/even.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/extension.validator.d.ts +2 -0
- package/lib/form-validators/reactive-form-validators/factor.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/file.validator.d.ts +2 -0
- package/lib/form-validators/reactive-form-validators/fileSize.validator.d.ts +2 -0
- package/lib/form-validators/reactive-form-validators/greater-than-equal-to.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/greater-than.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/grid.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/hexcolor.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/iban.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/image.validator.d.ts +2 -0
- package/lib/form-validators/reactive-form-validators/index.d.ts +65 -0
- package/lib/form-validators/reactive-form-validators/ip.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/json.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/latLong.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/latitude.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/leapYear.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/less-than-equal-to.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/less-than.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/longitude.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/lowercase.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/mac.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/mask.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/maxDate.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/maxLength.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/maxNumber.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/maxTime.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/minDate.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/minLength.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/minNumber.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/minTime.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/noneOf.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/not.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/notEmpty.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/numeric.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/odd.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/oneOf.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/or.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/password.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/pattern.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/port.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/primeNumber.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/range.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/required.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/requiredTrue.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/rule.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/startsWith.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/time.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/unique.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/uppercase.validator.d.ts +3 -0
- package/lib/form-validators/reactive-form-validators/url.validator.d.ts +3 -0
- package/lib/form-validators/services/base-form-builder.d.ts +13 -0
- package/lib/form-validators/services/entity.service.d.ts +15 -0
- package/lib/form-validators/services/form-control.d.ts +99 -0
- package/lib/form-validators/services/form-group.d.ts +9 -0
- package/lib/form-validators/services/reactive-form.module.d.ts +24 -0
- package/lib/form-validators/services/rx-form-array.d.ts +38 -0
- package/lib/form-validators/services/rx-form-builder.d.ts +54 -0
- package/lib/form-validators/services/rx-form-group.d.ts +66 -0
- package/lib/form-validators/services/typed-form-builder.d.ts +14 -0
- package/lib/form-validators/util/alphabet-regex.locale.d.ts +28 -0
- package/lib/form-validators/util/app-util.d.ts +28 -0
- package/lib/form-validators/util/check-length.d.ts +1 -0
- package/lib/form-validators/util/config-provider.d.ts +1 -0
- package/lib/form-validators/util/date-checker.function.d.ts +7 -0
- package/lib/form-validators/util/date-provider.d.ts +9 -0
- package/lib/form-validators/util/form-const.d.ts +2 -0
- package/lib/form-validators/util/form-provider.d.ts +8 -0
- package/lib/form-validators/util/index.d.ts +6 -0
- package/lib/form-validators/util/instance-provider.function.d.ts +3 -0
- package/lib/form-validators/util/ip-checker.d.ts +2 -0
- package/lib/form-validators/util/linq.d.ts +15 -0
- package/lib/form-validators/util/object-maker.d.ts +7 -0
- package/lib/form-validators/util/reactive-form-config.d.ts +17 -0
- package/lib/form-validators/util/regex-rules.d.ts +3 -0
- package/lib/form-validators/util/regex-validator.d.ts +11 -0
- package/lib/form-validators/util/relational-checker.function.d.ts +2 -0
- package/lib/form-validators/util/reset-form.d.ts +21 -0
- package/lib/form-validators/util/sanitizers.d.ts +3 -0
- package/lib/form-validators/util/time-checker.function.d.ts +4 -0
- package/lib/form-validators/util/type.d.ts +3 -0
- package/lib/form-validators/util/validator-value-checker.d.ts +5 -0
- package/lib/form-validators/validators-extension/allOf-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/alpha-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/alphaNumeric-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/and-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/ascii-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/base-validator.function.d.ts +3 -0
- package/lib/form-validators/validators-extension/choice-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/compare-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/compose-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/contains-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/credit-card-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/cusip-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/custom-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/dataUri-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/date-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/different-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/digit-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/email-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/endsWith-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/even-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/extension-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/factor-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/file-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/fileSize-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/greater-than-equal-to-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/greater-than-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/grid-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/hexcolor-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/iban-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/image-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/index.d.ts +67 -0
- package/lib/form-validators/validators-extension/ip-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/json-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/latLong-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/latitude-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/leapYear-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/less-than-equal-to-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/less-than-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/longitude-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/lowercase-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/mac-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/mask-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/maxDate-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/maxLength-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/maxNumber-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/maxTime-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/minDate-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/minLength-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/minNumber-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/minTime-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/noneOf-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/not-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/notEmpty-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/numeric-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/odd-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/oneOf-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/or-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/password-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/pattern-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/port-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/primeNumber-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/range-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/required-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/requiredTrue-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/rxweb-validators.d.ts +107 -0
- package/lib/form-validators/validators-extension/startsWith-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/time-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-extension/unique-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/uppercase-validator.extension.d.ts +3 -0
- package/lib/form-validators/validators-extension/url-validator.extension.d.ts +4 -0
- package/lib/form-validators/validators-function/alpha-validation.function.d.ts +3 -0
- package/lib/form-validators/validators-function/regex-validation.function.d.ts +4 -0
- package/lib/forms/components/generic-form/generic-form.component.d.ts +91 -0
- package/lib/forms/constants/constants.d.ts +1 -0
- package/lib/forms/directives/mat-form-field-editor.directive.d.ts +82 -0
- package/lib/forms/directives/mat-form-field-readonly.directive.d.ts +16 -0
- package/lib/forms/enums/form-field-type.d.ts +17 -0
- package/lib/forms/forms.module.d.ts +39 -0
- package/lib/forms/functions/decorators.d.ts +14 -0
- package/lib/forms/functions/functions.d.ts +7 -0
- package/lib/forms/helpers/abstract-mat-form-field.d.ts +182 -0
- package/lib/forms/helpers/value-accessor-base.d.ts +92 -0
- package/lib/forms/models/form-field-definition.d.ts +39 -0
- package/lib/forms/models/form-field-group.d.ts +12 -0
- package/lib/forms/public_api.d.ts +3 -0
- package/lib/forms/validators/equal-validator.directive.d.ts +20 -0
- package/lib/forms/validators/native-element-injector.directive.d.ts +17 -0
- package/lib/forms/validators/unique-validator-directive.d.ts +36 -0
- package/lib/http/http.module.d.ts +8 -0
- package/lib/http/public_api.d.ts +1 -0
- package/lib/http/services/generic.service.d.ts +166 -0
- package/lib/layout/_layout-theme.scss +89 -0
- package/lib/layout/form-toolbar/form-toolbar.component.d.ts +23 -0
- package/lib/layout/form-toolbar-menu/form-toolbar-menu.component.d.ts +10 -0
- package/lib/layout/layout-card-over/layout-card-over.component.d.ts +31 -0
- package/lib/layout/layout-footer/layout-footer.component.d.ts +17 -0
- package/lib/layout/layout-manage-list/layout-manage-list.component.d.ts +100 -0
- package/lib/layout/layout-manage-list/layout-manage-list.directives.d.ts +61 -0
- package/lib/layout/layout-nav/layout-nav.component.d.ts +85 -0
- package/lib/layout/layout-nav-list/layout-nav-list.component.d.ts +94 -0
- package/lib/layout/layout-nav-list/layout-nav-list.directives.d.ts +25 -0
- package/lib/layout/layout-toggle.class.d.ts +37 -0
- package/lib/layout/layout.component.d.ts +56 -0
- package/lib/layout/layout.directives.d.ts +25 -0
- package/lib/layout/layout.module.d.ts +46 -0
- package/lib/layout/list-toolbar/list-toolbar.component.d.ts +19 -0
- package/lib/layout/list-toolbar-menu/list-toolbar-menu.component.d.ts +10 -0
- package/lib/layout/navigation-drawer/navigation-drawer.component.d.ts +114 -0
- package/lib/layout/public_api.d.ts +1 -0
- package/lib/media/directives/media-toggle.directive.d.ts +44 -0
- package/lib/media/media.module.d.ts +11 -0
- package/lib/media/public_api.d.ts +1 -0
- package/lib/media/services/media.service.d.ts +37 -0
- package/lib/menu/components/menu.component.d.ts +28 -0
- package/lib/menu/enums/menu-scope.d.ts +4 -0
- package/lib/menu/menu.module.d.ts +19 -0
- package/lib/menu/models/menu-item.d.ts +17 -0
- package/lib/menu/models/menu.d.ts +14 -0
- package/lib/menu/public_api.d.ts +1 -0
- package/lib/menu/services/menu-items.service.d.ts +12 -0
- package/lib/menu/services/menu.resolve.d.ts +39 -0
- package/lib/menu/services/menu.service.d.ts +12 -0
- package/lib/search/public_api.d.ts +1 -0
- package/lib/search/search.module.d.ts +15 -0
- package/lib/search/vd-search-box/vd-search-box.component.d.ts +60 -0
- package/lib/search/vd-search-input/vd-search-input.component.d.ts +57 -0
- package/lib/select/public_api.d.ts +2 -0
- package/lib/select/select.component.d.ts +233 -0
- package/lib/select/select.module.d.ts +13 -0
- package/lib/table/components/dynamic-table/dynamic-table.component.d.ts +202 -0
- package/lib/table/components/filter-clear.component.d.ts +16 -0
- package/lib/table/components/filter-date.component.d.ts +70 -0
- package/lib/table/components/filter-input.component.d.ts +94 -0
- package/lib/table/components/filter-select.component.d.ts +178 -0
- package/lib/table/directives/data-source-filter.directive.d.ts +28 -0
- package/lib/table/enums/table-column-type.d.ts +12 -0
- package/lib/table/functions/decorators.d.ts +17 -0
- package/lib/table/functions/functions.d.ts +8 -0
- package/lib/table/models/pagination.d.ts +7 -0
- package/lib/table/models/table-column.d.ts +59 -0
- package/lib/table/models/table-definition.d.ts +24 -0
- package/lib/table/models/table-menu-item.d.ts +8 -0
- package/lib/table/paginator-intl.d.ts +27 -0
- package/lib/table/public_api.d.ts +2 -0
- package/lib/table/table.data-source.d.ts +140 -0
- package/lib/table/table.module.d.ts +46 -0
- package/lib/table/table.static-data-source.d.ts +88 -0
- package/messaia-cdk.d.ts +5 -0
- package/package.json +31 -0
- package/public_api.d.ts +14 -0
- package/src/lib/layout/README.md +119 -0
- package/src/lib/layout/layout-card-over/README.md +36 -0
- package/src/lib/layout/layout-manage-list/README.md +76 -0
- package/src/lib/layout/layout-nav/README.md +40 -0
- package/src/lib/layout/layout-nav-list/README.md +85 -0
|
@@ -0,0 +1,559 @@
|
|
|
1
|
+
import { Injectable } from "@angular/core";
|
|
2
|
+
import { FormGroup, FormArray, FormControl, FormBuilder } from "@angular/forms";
|
|
3
|
+
import { BaseFormBuilder } from './base-form-builder';
|
|
4
|
+
import { ReactiveFormConfig } from '../util/reactive-form-config';
|
|
5
|
+
import { defaultContainer } from '../core/defaultContainer';
|
|
6
|
+
import { FormBuilderConfiguration } from "../models";
|
|
7
|
+
import { ARRAY_PROPERTY, OBJECT_PROPERTY, PROPERTY, FUNCTION_STRING, OBJECT_STRING, RX_WEB_VALIDATOR, NUMBER, BOOLEAN, STRING, MODEL } from "../const";
|
|
8
|
+
import { AnnotationTypes } from "../core/validator.static";
|
|
9
|
+
import { conditionalChangeValidator } from "../reactive-form-validators/conditional-change.validator";
|
|
10
|
+
import { Linq } from '../util/linq';
|
|
11
|
+
import { APP_VALIDATORS } from '../const/app-validators.const';
|
|
12
|
+
import { RxFormControl } from './form-control';
|
|
13
|
+
import { RxFormGroup } from './rx-form-group';
|
|
14
|
+
import { RxFormArray } from './rx-form-array';
|
|
15
|
+
import { andValidator } from '../reactive-form-validators/and.validator';
|
|
16
|
+
import { orValidator } from '../reactive-form-validators/or.validator';
|
|
17
|
+
import { notValidator } from '../reactive-form-validators/not.validator';
|
|
18
|
+
import { RegexValidator } from "../util/regex-validator";
|
|
19
|
+
import * as i0 from "@angular/core";
|
|
20
|
+
const LOGICAL_VALIDATORS = { and: andValidator, or: orValidator, not: notValidator };
|
|
21
|
+
const ASYNC = "async";
|
|
22
|
+
const ENTITY_OBJECT = "entityObject";
|
|
23
|
+
export class RxFormBuilder extends BaseFormBuilder {
|
|
24
|
+
constructor() {
|
|
25
|
+
super();
|
|
26
|
+
this.conditionalObjectProps = [];
|
|
27
|
+
this.conditionalValidationInstance = {};
|
|
28
|
+
this.builderConfigurationConditionalObjectProps = [];
|
|
29
|
+
this.formGroupPropOtherValidator = {};
|
|
30
|
+
this.currentFormGroupPropOtherValidator = {};
|
|
31
|
+
this.isNested = false;
|
|
32
|
+
this.isGroupCalled = false;
|
|
33
|
+
this.isNestedBinding = false;
|
|
34
|
+
}
|
|
35
|
+
getInstanceContainer(instanceFunc, entityObject) {
|
|
36
|
+
return this.instaceProvider(instanceFunc, entityObject);
|
|
37
|
+
}
|
|
38
|
+
setValue(formGroup, object) {
|
|
39
|
+
for (var col in object) {
|
|
40
|
+
var control = formGroup.get([col]);
|
|
41
|
+
control.setValue(object[col]);
|
|
42
|
+
control.updateValueAndValidity();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
extractExpressions(fomrBuilderConfiguration) {
|
|
46
|
+
if (fomrBuilderConfiguration && fomrBuilderConfiguration.dynamicValidation) {
|
|
47
|
+
for (var property in fomrBuilderConfiguration.dynamicValidation) {
|
|
48
|
+
for (var decorator in fomrBuilderConfiguration.dynamicValidation[property]) {
|
|
49
|
+
if (fomrBuilderConfiguration.dynamicValidation[property][decorator].conditionalExpression) {
|
|
50
|
+
let columns = Linq.expressionColumns(fomrBuilderConfiguration.dynamicValidation[property][decorator].conditionalExpression);
|
|
51
|
+
defaultContainer.addChangeValidation(this.conditionalValidationInstance, property, columns);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
addAsyncValidation(property, propertyValidators, propValidationConfig) {
|
|
59
|
+
let asyncValidators = [];
|
|
60
|
+
if (propertyValidators) {
|
|
61
|
+
for (let propertyValidator of propertyValidators) {
|
|
62
|
+
if (propertyValidator.isAsync)
|
|
63
|
+
propertyValidator.config.forEach(t => { asyncValidators.push(t); });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (propValidationConfig && propValidationConfig[ASYNC]) {
|
|
67
|
+
propValidationConfig[ASYNC].forEach(t => { asyncValidators.push(t); });
|
|
68
|
+
}
|
|
69
|
+
return asyncValidators;
|
|
70
|
+
}
|
|
71
|
+
addFormControl(property, propertyValidators, propValidationConfig, instance, entity) {
|
|
72
|
+
let validators = [];
|
|
73
|
+
let columns = [];
|
|
74
|
+
if ((instance.conditionalValidationProps && instance.conditionalValidationProps[property.name]) || (this.conditionalValidationInstance.conditionalValidationProps && this.conditionalValidationInstance.conditionalValidationProps[property.name])) {
|
|
75
|
+
let props = [];
|
|
76
|
+
if ((instance.conditionalValidationProps && instance.conditionalValidationProps[property.name]))
|
|
77
|
+
instance.conditionalValidationProps[property.name].forEach(t => props.push(t));
|
|
78
|
+
if (this.conditionalValidationInstance.conditionalValidationProps && this.conditionalValidationInstance.conditionalValidationProps[property.name])
|
|
79
|
+
this.conditionalValidationInstance.conditionalValidationProps[property.name].forEach(t => props.push(t));
|
|
80
|
+
validators.push(conditionalChangeValidator(props));
|
|
81
|
+
}
|
|
82
|
+
if (this.conditionalObjectProps.length > 0 || this.builderConfigurationConditionalObjectProps.length > 0) {
|
|
83
|
+
let propConditions = [];
|
|
84
|
+
if (this.conditionalObjectProps)
|
|
85
|
+
propConditions = this.conditionalObjectProps.filter(t => t.propName == property.name);
|
|
86
|
+
if (this.builderConfigurationConditionalObjectProps)
|
|
87
|
+
this.builderConfigurationConditionalObjectProps.filter(t => t.propName == property.name).forEach(t => propConditions.push(t));
|
|
88
|
+
propConditions.forEach(t => {
|
|
89
|
+
if (t.referencePropName && columns.indexOf(t.referencePropName) == -1)
|
|
90
|
+
columns.push(t.referencePropName);
|
|
91
|
+
});
|
|
92
|
+
if (columns.length > 0)
|
|
93
|
+
validators.push(conditionalChangeValidator(columns));
|
|
94
|
+
}
|
|
95
|
+
for (let propertyValidator of propertyValidators) {
|
|
96
|
+
if (!propertyValidator.isAsync)
|
|
97
|
+
switch (propertyValidator.annotationType) {
|
|
98
|
+
case AnnotationTypes.rule:
|
|
99
|
+
validators.push(APP_VALIDATORS[propertyValidator.annotationType](propertyValidator.config, entity));
|
|
100
|
+
break;
|
|
101
|
+
case AnnotationTypes.and:
|
|
102
|
+
case AnnotationTypes.or:
|
|
103
|
+
case AnnotationTypes.not:
|
|
104
|
+
validators.push(LOGICAL_VALIDATORS[propertyValidator.annotationType](propertyValidator.config));
|
|
105
|
+
break;
|
|
106
|
+
default:
|
|
107
|
+
validators.push(APP_VALIDATORS[propertyValidator.annotationType](propertyValidator.config));
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (propValidationConfig)
|
|
112
|
+
this.additionalValidation(validators, propValidationConfig);
|
|
113
|
+
if (this.currentFormGroupPropOtherValidator[property.name])
|
|
114
|
+
this.currentFormGroupPropOtherValidator[property.name].forEach(t => { validators.push(t); });
|
|
115
|
+
return validators;
|
|
116
|
+
}
|
|
117
|
+
additionalValidation(validations, propValidationConfig) {
|
|
118
|
+
for (var col in AnnotationTypes) {
|
|
119
|
+
if (propValidationConfig[AnnotationTypes[col]] && col != "custom") {
|
|
120
|
+
validations.push(APP_VALIDATORS[AnnotationTypes[col]](propValidationConfig[AnnotationTypes[col]]));
|
|
121
|
+
}
|
|
122
|
+
else if (col == AnnotationTypes.custom && propValidationConfig[AnnotationTypes[col]])
|
|
123
|
+
validations.push(propValidationConfig[col]);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
getEntity(object, formBuilderConfiguration, propertyName, isSameObjectConstructor = false) {
|
|
127
|
+
if (formBuilderConfiguration && formBuilderConfiguration.genericEntities && formBuilderConfiguration.genericEntities[propertyName])
|
|
128
|
+
return formBuilderConfiguration.genericEntities[propertyName];
|
|
129
|
+
return isSameObjectConstructor ? object.constructor : undefined;
|
|
130
|
+
}
|
|
131
|
+
getObjectPropertyInstance(object, propertyInfo, formBuilderConfiguration) {
|
|
132
|
+
if (propertyInfo.propertyType == OBJECT_PROPERTY && object[propertyInfo.name])
|
|
133
|
+
return object[propertyInfo.name].constructor;
|
|
134
|
+
else if (propertyInfo.propertyType == ARRAY_PROPERTY && object[propertyInfo.name] && object[propertyInfo.name].length > 0)
|
|
135
|
+
return object[propertyInfo.name][0].constructor;
|
|
136
|
+
return this.getEntity(object, formBuilderConfiguration, propertyInfo.name);
|
|
137
|
+
}
|
|
138
|
+
checkObjectPropAdditionalValidation(instanceContainer, object, formBuilderConfiguration) {
|
|
139
|
+
var props = instanceContainer.properties.filter(t => t.propertyType == OBJECT_PROPERTY || t.propertyType == ARRAY_PROPERTY);
|
|
140
|
+
props.forEach(t => {
|
|
141
|
+
let entity = t.entity;
|
|
142
|
+
if (!t.entity)
|
|
143
|
+
entity = this.getObjectPropertyInstance(object, t, formBuilderConfiguration);
|
|
144
|
+
if (entity) {
|
|
145
|
+
let instance = this.getInstanceContainer(entity, null);
|
|
146
|
+
if (instance && instance.conditionalValidationProps) {
|
|
147
|
+
for (var key in instance.conditionalValidationProps) {
|
|
148
|
+
var prop = instanceContainer.properties.filter(t => t.name == key)[0];
|
|
149
|
+
if (prop) {
|
|
150
|
+
if (!instanceContainer.conditionalValidationProps)
|
|
151
|
+
instanceContainer.conditionalValidationProps = {};
|
|
152
|
+
if (!instanceContainer.conditionalValidationProps[key])
|
|
153
|
+
instanceContainer.conditionalValidationProps[key] = [];
|
|
154
|
+
instance.conditionalValidationProps[key].forEach(x => {
|
|
155
|
+
if (t.propertyType != ARRAY_PROPERTY)
|
|
156
|
+
instanceContainer.conditionalValidationProps[key].push([t.name, x].join('.'));
|
|
157
|
+
else
|
|
158
|
+
instanceContainer.conditionalValidationProps[key].push([t.name, x].join('[]'));
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
getObject(model, entityObject, formBuilderConfiguration) {
|
|
167
|
+
let json = {};
|
|
168
|
+
if (typeof model == FUNCTION_STRING)
|
|
169
|
+
json.model = model;
|
|
170
|
+
if (typeof model == FUNCTION_STRING && (entityObject instanceof FormBuilderConfiguration)) {
|
|
171
|
+
json.entityObject = this.createClassObject(json.model, entityObject);
|
|
172
|
+
}
|
|
173
|
+
if (entityObject && !(entityObject instanceof FormBuilderConfiguration))
|
|
174
|
+
json.entityObject = entityObject;
|
|
175
|
+
if (entityObject instanceof FormBuilderConfiguration && !formBuilderConfiguration)
|
|
176
|
+
json.formBuilderConfiguration = entityObject;
|
|
177
|
+
else if (!(entityObject instanceof FormBuilderConfiguration) && formBuilderConfiguration) {
|
|
178
|
+
json.formBuilderConfiguration = formBuilderConfiguration;
|
|
179
|
+
json.entityObject = this.createClassObject(json.model, json.formBuilderConfiguration, json.entityObject);
|
|
180
|
+
}
|
|
181
|
+
if (!entityObject) {
|
|
182
|
+
if (typeof model == OBJECT_STRING)
|
|
183
|
+
json.model = model.constructor;
|
|
184
|
+
json.entityObject = this.createClassObject(json.model, json.formBuilderConfiguration, model);
|
|
185
|
+
}
|
|
186
|
+
else if (model && (entityObject instanceof FormBuilderConfiguration) && (typeof model == OBJECT_STRING)) {
|
|
187
|
+
json[MODEL] = model.constructor;
|
|
188
|
+
json[ENTITY_OBJECT] = this.createClassObject(json.model, json.formBuilderConfiguration, model);
|
|
189
|
+
}
|
|
190
|
+
return json;
|
|
191
|
+
}
|
|
192
|
+
control(value, validators, asyncValidators) {
|
|
193
|
+
return new RxFormControl(value, validators, asyncValidators, {}, {}, '', []);
|
|
194
|
+
}
|
|
195
|
+
array(values, validatorConfig) {
|
|
196
|
+
let formArray = this.group({ temp: values }, validatorConfig).get("temp");
|
|
197
|
+
var formBuilder = new FormBuilder();
|
|
198
|
+
return formBuilder.array(formArray.controls);
|
|
199
|
+
}
|
|
200
|
+
group(groupObject, validatorConfig) {
|
|
201
|
+
let modelInstance = super.createInstance();
|
|
202
|
+
let entityObject = {};
|
|
203
|
+
this.formGroupPropOtherValidator = {};
|
|
204
|
+
this.currentFormGroupPropOtherValidator = this.formGroupPropOtherValidator;
|
|
205
|
+
this.createValidatorFormGroup(groupObject, entityObject, modelInstance, validatorConfig);
|
|
206
|
+
this.currentFormGroupPropOtherValidator = this.formGroupPropOtherValidator;
|
|
207
|
+
this.isGroupCalled = true;
|
|
208
|
+
let formGroup = this.formGroup(modelInstance.constructor, entityObject, validatorConfig);
|
|
209
|
+
this.isGroupCalled = false;
|
|
210
|
+
this.formGroupPropOtherValidator = {};
|
|
211
|
+
this.currentFormGroupPropOtherValidator = this.formGroupPropOtherValidator;
|
|
212
|
+
this.formGroupPropOtherValidator = {};
|
|
213
|
+
return formGroup;
|
|
214
|
+
}
|
|
215
|
+
applyAllPropValidator(propName, validatorConfig, modelInstance) {
|
|
216
|
+
if (validatorConfig && validatorConfig.applyAllProps) {
|
|
217
|
+
if (!(validatorConfig.excludeProps && validatorConfig.excludeProps.length > 0 && validatorConfig.excludeProps.indexOf(propName) == -1)) {
|
|
218
|
+
validatorConfig.applyAllProps.forEach((t) => {
|
|
219
|
+
if (t.name == RX_WEB_VALIDATOR) {
|
|
220
|
+
t(propName, modelInstance);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
if (!this.currentFormGroupPropOtherValidator[propName])
|
|
224
|
+
this.currentFormGroupPropOtherValidator[propName] = [];
|
|
225
|
+
this.currentFormGroupPropOtherValidator[propName].push(t);
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
dynamicValidationPropCheck(propName, validatorConfig) {
|
|
232
|
+
return (validatorConfig == undefined) ? true : (!validatorConfig.dynamicValidationConfigurationPropertyName) ? true : validatorConfig.dynamicValidationConfigurationPropertyName == propName ? false : true;
|
|
233
|
+
}
|
|
234
|
+
isNotObject(value) {
|
|
235
|
+
return value instanceof Date || value === null || typeof value != OBJECT_STRING;
|
|
236
|
+
}
|
|
237
|
+
createValidatorFormGroup(groupObject, entityObject, modelInstance, validatorConfig) {
|
|
238
|
+
for (var propName in groupObject) {
|
|
239
|
+
var prop = groupObject[propName];
|
|
240
|
+
if (prop instanceof Array && prop.length > 0 && this.isNotObject(prop[0])) {
|
|
241
|
+
let propValidators = (prop.length > 1 && prop[1] instanceof Array) ? prop[1] : (prop.length == 2) ? [prop[1]] : [];
|
|
242
|
+
let propertyAdded = false;
|
|
243
|
+
for (var i = 0; i < propValidators.length; i++) {
|
|
244
|
+
if (propValidators[i].name == RX_WEB_VALIDATOR) {
|
|
245
|
+
propValidators[i](propName, modelInstance);
|
|
246
|
+
propertyAdded = true;
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
if (!this.currentFormGroupPropOtherValidator[propName])
|
|
250
|
+
this.currentFormGroupPropOtherValidator[propName] = [];
|
|
251
|
+
this.currentFormGroupPropOtherValidator[propName].push(propValidators[i]);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (!propertyAdded)
|
|
255
|
+
defaultContainer.initPropertyObject(propName, PROPERTY, undefined, typeof modelInstance == OBJECT_STRING ? modelInstance : { constructor: modelInstance });
|
|
256
|
+
this.applyAllPropValidator(propName, validatorConfig, modelInstance);
|
|
257
|
+
}
|
|
258
|
+
else if (prop === null || prop === undefined || typeof prop == STRING || typeof prop == NUMBER || typeof prop == BOOLEAN || prop instanceof Date) {
|
|
259
|
+
defaultContainer.initPropertyObject(propName, PROPERTY, undefined, typeof modelInstance == OBJECT_STRING ? modelInstance : { constructor: modelInstance });
|
|
260
|
+
this.applyAllPropValidator(propName, validatorConfig, modelInstance);
|
|
261
|
+
}
|
|
262
|
+
else if (prop instanceof Array) {
|
|
263
|
+
if (prop instanceof FormArray) {
|
|
264
|
+
entityObject[propName] = prop;
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
let propModelInstance = super.createInstance();
|
|
268
|
+
if (typeof modelInstance == "function")
|
|
269
|
+
modelInstance.constructor = modelInstance;
|
|
270
|
+
defaultContainer.initPropertyObject(propName, ARRAY_PROPERTY, propModelInstance.constructor, modelInstance);
|
|
271
|
+
entityObject[propName] = [];
|
|
272
|
+
for (let row of prop) {
|
|
273
|
+
let jObject = {};
|
|
274
|
+
entityObject[propName].push(jObject);
|
|
275
|
+
this.createValidatorFormGroup(row, jObject, propModelInstance.constructor, validatorConfig);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
else if (typeof prop == OBJECT_STRING && !(prop instanceof FormControl || prop instanceof RxFormControl)) {
|
|
280
|
+
let formGroup = (prop instanceof FormArray) ? prop.controls[0] : prop;
|
|
281
|
+
if (!formGroup.model && (prop instanceof FormGroup || prop instanceof RxFormGroup)) {
|
|
282
|
+
formGroup = this.group(formGroup.controls);
|
|
283
|
+
}
|
|
284
|
+
if (prop instanceof FormGroup || prop instanceof RxFormGroup) {
|
|
285
|
+
entityObject[propName] = prop;
|
|
286
|
+
defaultContainer.initPropertyObject(propName, OBJECT_PROPERTY, formGroup.model, modelInstance);
|
|
287
|
+
}
|
|
288
|
+
else if (prop instanceof FormArray) {
|
|
289
|
+
entityObject[propName] = prop;
|
|
290
|
+
defaultContainer.initPropertyObject(propName, ARRAY_PROPERTY, formGroup.model, modelInstance);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
if (this.dynamicValidationPropCheck(propName, validatorConfig)) {
|
|
294
|
+
this.formGroupPropOtherValidator[propName] = {};
|
|
295
|
+
this.currentFormGroupPropOtherValidator = this.formGroupPropOtherValidator[propName];
|
|
296
|
+
let propModelInstance = super.createInstance();
|
|
297
|
+
entityObject[propName] = {};
|
|
298
|
+
entityObject[propName].constructor = propModelInstance.constructor;
|
|
299
|
+
defaultContainer.initPropertyObject(propName, OBJECT_PROPERTY, entityObject[propName].constructor, modelInstance.constructor == Function ? { constructor: modelInstance } : modelInstance);
|
|
300
|
+
let objectValidationConfig = this.getValidatorConfig(validatorConfig, groupObject, propName + ".");
|
|
301
|
+
this.createValidatorFormGroup(groupObject[propName], entityObject[propName], entityObject[propName].constructor, objectValidationConfig);
|
|
302
|
+
}
|
|
303
|
+
else
|
|
304
|
+
entityObject[propName] = groupObject[propName];
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (typeof prop == STRING || typeof prop == NUMBER || typeof prop == BOOLEAN || prop instanceof Date) {
|
|
308
|
+
entityObject[propName] = prop;
|
|
309
|
+
}
|
|
310
|
+
else if ((prop && prop.length > 0 && this.isNotObject(prop[0]) && !(prop instanceof FormControl || prop instanceof RxFormControl) && !(prop instanceof FormArray))) {
|
|
311
|
+
entityObject[propName] = prop[0];
|
|
312
|
+
}
|
|
313
|
+
else if (prop instanceof FormArray) {
|
|
314
|
+
entityObject[propName] = prop;
|
|
315
|
+
}
|
|
316
|
+
else if (prop instanceof FormControl || prop instanceof RxFormControl) {
|
|
317
|
+
entityObject[propName] = prop;
|
|
318
|
+
defaultContainer.initPropertyObject(propName, PROPERTY, undefined, modelInstance.constructor ? modelInstance : { constructor: modelInstance });
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
getValidatorConfig(validatorConfig, entityObject, rootPropertyName, arrayPropertyName) {
|
|
323
|
+
let excludeProps = [];
|
|
324
|
+
let includeProps = [];
|
|
325
|
+
let ignoreUndefinedProps = [];
|
|
326
|
+
if (!validatorConfig)
|
|
327
|
+
return {};
|
|
328
|
+
const validationProps = this.getObjectForProperty(validatorConfig.dynamicValidation, rootPropertyName, arrayPropertyName);
|
|
329
|
+
const abstractControlOptions = this.getObjectForProperty(validatorConfig.abstractControlOptions, rootPropertyName, arrayPropertyName);
|
|
330
|
+
if (validatorConfig.excludeProps)
|
|
331
|
+
excludeProps = this.getProps(validatorConfig.excludeProps, rootPropertyName);
|
|
332
|
+
if (validatorConfig.includeProps)
|
|
333
|
+
includeProps = this.getProps(validatorConfig.includeProps, rootPropertyName);
|
|
334
|
+
if (validatorConfig.ignoreUndefinedProps)
|
|
335
|
+
ignoreUndefinedProps = this.getProps(validatorConfig.ignoreUndefinedProps, rootPropertyName, true);
|
|
336
|
+
if (!Object.keys(abstractControlOptions).length && rootPropertyName.endsWith('.') && validatorConfig.abstractControlOptions && validatorConfig.abstractControlOptions[rootPropertyName.substring(0, rootPropertyName.length - 1)])
|
|
337
|
+
abstractControlOptions['global'] = validatorConfig.abstractControlOptions[rootPropertyName.substring(0, rootPropertyName.length - 1)];
|
|
338
|
+
const dynamicValidation = (validatorConfig.dynamicValidationConfigurationPropertyName && entityObject[validatorConfig.dynamicValidationConfigurationPropertyName]) ? entityObject[validatorConfig.dynamicValidationConfigurationPropertyName] : validationProps;
|
|
339
|
+
return { ignoreUndefinedProps: ignoreUndefinedProps, includeProps: includeProps, dynamicValidation: dynamicValidation, excludeProps: excludeProps, abstractControlOptions: abstractControlOptions };
|
|
340
|
+
}
|
|
341
|
+
getObjectForProperty(rootObject, rootPropertyName, arrayPropertyName) {
|
|
342
|
+
const result = {};
|
|
343
|
+
for (let propName in rootObject) {
|
|
344
|
+
if (!propName.startsWith(rootPropertyName) && (!arrayPropertyName || !propName.startsWith(arrayPropertyName)))
|
|
345
|
+
continue;
|
|
346
|
+
let splitProp = propName.split(".", 2)[1];
|
|
347
|
+
if (!splitProp)
|
|
348
|
+
continue;
|
|
349
|
+
result[splitProp] = rootObject[propName];
|
|
350
|
+
}
|
|
351
|
+
return result;
|
|
352
|
+
}
|
|
353
|
+
getProps(properties, rootPropertyName, isIgnoreProp = false) {
|
|
354
|
+
let props = [];
|
|
355
|
+
for (let prop of properties) {
|
|
356
|
+
if (prop.indexOf(rootPropertyName) != -1) {
|
|
357
|
+
let splitProps = prop.split(".");
|
|
358
|
+
if (splitProps.length == 2) {
|
|
359
|
+
props.push(splitProps[1]);
|
|
360
|
+
}
|
|
361
|
+
else if (splitProps.length > 2) {
|
|
362
|
+
splitProps.splice(0, 1);
|
|
363
|
+
props.push(splitProps.join("."));
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
if (isIgnoreProp && properties.filter(x => x == rootPropertyName.replace('.', '')).length == 1)
|
|
368
|
+
props.push(':self:');
|
|
369
|
+
return props;
|
|
370
|
+
}
|
|
371
|
+
formGroup(model, entityObject, formBuilderConfiguration) {
|
|
372
|
+
let json = this.getObject(model, entityObject, formBuilderConfiguration);
|
|
373
|
+
model = json.model;
|
|
374
|
+
entityObject = json.entityObject;
|
|
375
|
+
if (entityObject.constructor != model && !this.isGroupCalled) {
|
|
376
|
+
entityObject = json.entityObject = this.updateObject(model, json.entityObject, formBuilderConfiguration);
|
|
377
|
+
}
|
|
378
|
+
formBuilderConfiguration = json.formBuilderConfiguration;
|
|
379
|
+
if (formBuilderConfiguration)
|
|
380
|
+
this.extractExpressions(formBuilderConfiguration);
|
|
381
|
+
let instanceContainer = this.getInstanceContainer(model, entityObject);
|
|
382
|
+
this.checkObjectPropAdditionalValidation(instanceContainer, entityObject, formBuilderConfiguration);
|
|
383
|
+
let formGroupObject = {};
|
|
384
|
+
let extendedProperties = {};
|
|
385
|
+
let formChildGroup = undefined;
|
|
386
|
+
let formArrayGroup = undefined;
|
|
387
|
+
var additionalValidations = {};
|
|
388
|
+
instanceContainer.properties.forEach(property => {
|
|
389
|
+
let isIncludeProp = true;
|
|
390
|
+
if (formBuilderConfiguration) {
|
|
391
|
+
if (formBuilderConfiguration.excludeProps && formBuilderConfiguration.excludeProps.length > 0)
|
|
392
|
+
isIncludeProp = formBuilderConfiguration.excludeProps.indexOf(property.name) == -1;
|
|
393
|
+
if (formBuilderConfiguration.dynamicValidation)
|
|
394
|
+
additionalValidations = formBuilderConfiguration.dynamicValidation;
|
|
395
|
+
if (formBuilderConfiguration.includeProps && formBuilderConfiguration.includeProps.length > 0)
|
|
396
|
+
isIncludeProp = formBuilderConfiguration.includeProps.indexOf(property.name) != -1;
|
|
397
|
+
if (formBuilderConfiguration.ignoreUndefinedProps && formBuilderConfiguration.ignoreUndefinedProps.length > 0) {
|
|
398
|
+
isIncludeProp = !(property.propertyType == PROPERTY && !RegexValidator.isNotBlank(json.entityObject[property.name]) && (formBuilderConfiguration.ignoreUndefinedProps.indexOf(property.name) !== -1 || formBuilderConfiguration.ignoreUndefinedProps.indexOf(":self:") !== -1));
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
if (property.ignore)
|
|
402
|
+
isIncludeProp = !property.ignore.call(json.entityObject, json.entityObject);
|
|
403
|
+
if (isIncludeProp) {
|
|
404
|
+
switch (property.propertyType) {
|
|
405
|
+
case PROPERTY:
|
|
406
|
+
if (!(entityObject[property.name] instanceof FormControl || entityObject[property.name] instanceof RxFormControl)) {
|
|
407
|
+
let propertyValidators = instanceContainer.propertyAnnotations.filter(t => t.propertyName == property.name);
|
|
408
|
+
let sanitizeValue = super.sanitizeValue(instanceContainer, property.name, super.getDefaultValue(property, entityObject[property.name], formBuilderConfiguration), json.entityObject, Object.assign({}, json.entityObject));
|
|
409
|
+
if (entityObject[property.name] === undefined && sanitizeValue)
|
|
410
|
+
entityObject[property.name] = sanitizeValue;
|
|
411
|
+
let validators = this.addFormControl(property, propertyValidators, additionalValidations[property.name], instanceContainer, entityObject);
|
|
412
|
+
let abstractControlOptions = { validators: validators, asyncValidators: this.addAsyncValidation(property, propertyValidators, additionalValidations[property.name]) };
|
|
413
|
+
abstractControlOptions = this.getAbstractControlOptions(property.name, formBuilderConfiguration, abstractControlOptions);
|
|
414
|
+
if (property.updateOn && !abstractControlOptions.updateOn)
|
|
415
|
+
abstractControlOptions.updateOn = property.updateOn;
|
|
416
|
+
formGroupObject[property.name] = new RxFormControl(sanitizeValue, abstractControlOptions, [], json.entityObject, Object.assign({}, json.entityObject), property.name, instanceContainer.sanitizers[property.name]);
|
|
417
|
+
this.isNested = false;
|
|
418
|
+
}
|
|
419
|
+
else
|
|
420
|
+
formGroupObject[property.name] = super.getDefaultValue(property, entityObject[property.name], formBuilderConfiguration);
|
|
421
|
+
extendedProperties[property.name] = true;
|
|
422
|
+
break;
|
|
423
|
+
case OBJECT_PROPERTY:
|
|
424
|
+
let objectValue = entityObject[property.name];
|
|
425
|
+
if (objectValue && objectValue instanceof Object && !(objectValue instanceof FormGroup || objectValue instanceof RxFormGroup)) {
|
|
426
|
+
this.isNestedBinding = this.isNested = true;
|
|
427
|
+
if (instanceContainer && instanceContainer.conditionalObjectProps)
|
|
428
|
+
this.conditionalObjectProps = instanceContainer.conditionalObjectProps.filter(t => t.objectPropName == property.name);
|
|
429
|
+
if (this.conditionalValidationInstance && this.conditionalValidationInstance.conditionalObjectProps)
|
|
430
|
+
this.builderConfigurationConditionalObjectProps = this.conditionalValidationInstance.conditionalObjectProps.filter(t => t.objectPropName == property.name);
|
|
431
|
+
if (this.formGroupPropOtherValidator[property.name])
|
|
432
|
+
this.currentFormGroupPropOtherValidator = this.formGroupPropOtherValidator[property.name];
|
|
433
|
+
let objectValidationConfig = this.getValidatorConfig(formBuilderConfiguration, objectValue, `${property.name}.`);
|
|
434
|
+
let entity = property.entityProvider ? property.entityProvider.call(entityObject) : undefined;
|
|
435
|
+
formGroupObject[property.name] = this.formGroup(entity || property.entity || this.getEntity(objectValue, formBuilderConfiguration, property.name, true), objectValue, objectValidationConfig);
|
|
436
|
+
this.conditionalObjectProps = [];
|
|
437
|
+
this.builderConfigurationConditionalObjectProps = [];
|
|
438
|
+
this.isNestedBinding = this.isNested = false;
|
|
439
|
+
}
|
|
440
|
+
else if (objectValue instanceof FormGroup || objectValue instanceof RxFormGroup)
|
|
441
|
+
formGroupObject[property.name] = objectValue;
|
|
442
|
+
break;
|
|
443
|
+
case ARRAY_PROPERTY:
|
|
444
|
+
let arrayObjectValue = entityObject[property.name];
|
|
445
|
+
if (arrayObjectValue && arrayObjectValue instanceof Array && !(arrayObjectValue instanceof FormArray)) {
|
|
446
|
+
this.isNestedBinding = this.isNested = true;
|
|
447
|
+
var formArrayGroup = [];
|
|
448
|
+
let index = 0;
|
|
449
|
+
let entity = property.entityProvider ? property.entityProvider.call(entityObject) : undefined;
|
|
450
|
+
let objectValidationConfig = null;
|
|
451
|
+
for (let subObject of arrayObjectValue) {
|
|
452
|
+
if (instanceContainer && instanceContainer.conditionalObjectProps)
|
|
453
|
+
this.conditionalObjectProps = instanceContainer.conditionalObjectProps.filter(t => t.objectPropName == property.name && t.arrayIndex == index);
|
|
454
|
+
if (this.conditionalValidationInstance && this.conditionalValidationInstance.conditionalObjectProps)
|
|
455
|
+
this.builderConfigurationConditionalObjectProps = this.conditionalValidationInstance.conditionalObjectProps.filter(t => t.objectPropName == property.name && t.arrayIndex == index);
|
|
456
|
+
if (this.formGroupPropOtherValidator[property.name])
|
|
457
|
+
this.currentFormGroupPropOtherValidator = this.formGroupPropOtherValidator[property.name];
|
|
458
|
+
objectValidationConfig = this.getValidatorConfig(formBuilderConfiguration, subObject, `${property.name}.`, `${property.name}[${index}].`);
|
|
459
|
+
formArrayGroup.push(this.formGroup(entity || property.entity || this.getEntity(subObject, formBuilderConfiguration, property.name, true), subObject, objectValidationConfig));
|
|
460
|
+
index++;
|
|
461
|
+
this.conditionalObjectProps = [];
|
|
462
|
+
this.builderConfigurationConditionalObjectProps = [];
|
|
463
|
+
}
|
|
464
|
+
let abstractControlOptions = this.getAbstractControlOptions(property.name, formBuilderConfiguration, {});
|
|
465
|
+
formGroupObject[property.name] = new RxFormArray(arrayObjectValue, formArrayGroup, abstractControlOptions, null, property.arrayConfig);
|
|
466
|
+
if (ReactiveFormConfig.autoInstancePush) {
|
|
467
|
+
arrayObjectValue.push = (instance) => { let formGroup = this.formGroup(instance.constructor, instance, objectValidationConfig); formGroupObject[property.name].push(formGroup, { isAddedInstance: true }); return 0; };
|
|
468
|
+
arrayObjectValue.splice = (start, deleteCount) => {
|
|
469
|
+
let end = (start + deleteCount) - 1;
|
|
470
|
+
for (var i = start; i <= end; i++) {
|
|
471
|
+
formGroupObject[property.name].removeAt(i, { isRemovedInstance: true });
|
|
472
|
+
}
|
|
473
|
+
return [];
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
this.isNestedBinding = this.isNested = false;
|
|
477
|
+
}
|
|
478
|
+
else if (arrayObjectValue instanceof FormArray)
|
|
479
|
+
formGroupObject[property.name] = arrayObjectValue;
|
|
480
|
+
else if (property.arrayConfig && property.arrayConfig.createBlank)
|
|
481
|
+
formGroupObject[property.name] = new RxFormArray([], [], null, null, property.arrayConfig);
|
|
482
|
+
break;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
});
|
|
486
|
+
if (!this.isNested) {
|
|
487
|
+
this.conditionalValidationInstance = {};
|
|
488
|
+
this.builderConfigurationConditionalObjectProps = [];
|
|
489
|
+
}
|
|
490
|
+
let abstractControlOptions = {
|
|
491
|
+
validators: [],
|
|
492
|
+
asyncValidators: [],
|
|
493
|
+
updateOn: formBuilderConfiguration && formBuilderConfiguration.abstractControlOptions && formBuilderConfiguration.abstractControlOptions['global']
|
|
494
|
+
? formBuilderConfiguration.abstractControlOptions['global']
|
|
495
|
+
: undefined
|
|
496
|
+
};
|
|
497
|
+
abstractControlOptions = this.getAbstractControlOptions("global", formBuilderConfiguration, abstractControlOptions);
|
|
498
|
+
let formGroup = new RxFormGroup(json.model, json.entityObject, formGroupObject, abstractControlOptions);
|
|
499
|
+
if (defaultContainer.isExperimental) {
|
|
500
|
+
json.entityObject["formGroup"] = formGroup;
|
|
501
|
+
this.overrideProperties(formGroup, json.entityObject, extendedProperties);
|
|
502
|
+
}
|
|
503
|
+
if (!this.isNestedBinding && !this.isGroupCalled)
|
|
504
|
+
formGroup.refreshDisable();
|
|
505
|
+
return formGroup;
|
|
506
|
+
}
|
|
507
|
+
overrideProperties(formGroup, entityObject, properties) {
|
|
508
|
+
Object.keys(properties).forEach(t => {
|
|
509
|
+
this.overrideProp(entityObject, t, formGroup);
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
getAbstractControlOptions(name, formBuilderConfiguration, abstractControlOptions) {
|
|
513
|
+
if (formBuilderConfiguration && formBuilderConfiguration.abstractControlOptions && formBuilderConfiguration.abstractControlOptions[name])
|
|
514
|
+
abstractControlOptions.updateOn = formBuilderConfiguration.abstractControlOptions[name];
|
|
515
|
+
const controlOptions = formBuilderConfiguration ? formBuilderConfiguration.baseAbstractControlOptions : null;
|
|
516
|
+
if (controlOptions && controlOptions[name]) {
|
|
517
|
+
if (controlOptions[name].updateOn)
|
|
518
|
+
abstractControlOptions.updateOn = controlOptions[name].updateOn;
|
|
519
|
+
if (controlOptions[name].validators) {
|
|
520
|
+
if (Array.isArray(controlOptions[name].validators))
|
|
521
|
+
controlOptions[name].validators.forEach(validator => abstractControlOptions.validators.push(validator));
|
|
522
|
+
else
|
|
523
|
+
abstractControlOptions.validators.push(controlOptions[name].validators);
|
|
524
|
+
}
|
|
525
|
+
if (controlOptions[name].asyncValidators) {
|
|
526
|
+
if (Array.isArray(controlOptions[name].asyncValidators))
|
|
527
|
+
controlOptions[name].asyncValidators.forEach(validator => abstractControlOptions.asyncValidators.push(validator));
|
|
528
|
+
else
|
|
529
|
+
abstractControlOptions.asyncValidators.push(controlOptions[name].validators);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
return abstractControlOptions;
|
|
533
|
+
}
|
|
534
|
+
overrideProp(entityObject, propName, formGroup) {
|
|
535
|
+
let descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(entityObject), propName);
|
|
536
|
+
let value = entityObject[propName];
|
|
537
|
+
let oldValue = null;
|
|
538
|
+
Object.defineProperty(entityObject, propName, {
|
|
539
|
+
get: () => { return descriptor ? descriptor.get.call(entityObject) : value; },
|
|
540
|
+
set: (v) => {
|
|
541
|
+
value = v;
|
|
542
|
+
if (oldValue != v) {
|
|
543
|
+
if (descriptor)
|
|
544
|
+
descriptor.set.call(entityObject, v);
|
|
545
|
+
if (!formGroup.changing && formGroup.controls[propName]) {
|
|
546
|
+
formGroup.controls[propName].setValue(v);
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
oldValue = v;
|
|
550
|
+
}
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
/** @nocollapse */ /** @nocollapse */ RxFormBuilder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: RxFormBuilder, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
555
|
+
/** @nocollapse */ /** @nocollapse */ RxFormBuilder.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: RxFormBuilder });
|
|
556
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: RxFormBuilder, decorators: [{
|
|
557
|
+
type: Injectable
|
|
558
|
+
}], ctorParameters: function () { return []; } });
|
|
559
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicngtZm9ybS1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvZm9ybS12YWxpZGF0b3JzL3NlcnZpY2VzL3J4LWZvcm0tYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBaUMsV0FBVyxFQUEwQixNQUFNLGdCQUFnQixDQUFBO0FBRXRJLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUc1RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBR3RKLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUN0RyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ25DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQTtBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FB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QUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQSxDQUFDLENBQUM7WUFDNUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ1AsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDVixJQUFJLFFBQVEsSUFBSSxDQUFDLEVBQUU7b0JBQ2YsSUFBSSxVQUFVO3dCQUNWLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTt3QkFDckQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQzVDO2lCQUNKO2dCQUNELFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDakIsQ0FBQztTQUNKLENBQUMsQ0FBQTtJQUNOLENBQUM7O2dKQXJqQlEsYUFBYTtvSkFBYixhQUFhOzJGQUFiLGFBQWE7a0JBRHpCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxyXG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIFZhbGlkYXRvckZuLCBBc3luY1ZhbGlkYXRvckZuLCBGb3JtQnVpbGRlciwgQWJzdHJhY3RDb250cm9sT3B0aW9ucyB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiXHJcbmltcG9ydCB7IFR5cGUgfSBmcm9tIFwiLi4vdXRpbFwiXHJcbmltcG9ydCB7IEJhc2VGb3JtQnVpbGRlciB9IGZyb20gJy4vYmFzZS1mb3JtLWJ1aWxkZXInO1xyXG5cclxuaW1wb3J0IHsgUmVhY3RpdmVGb3JtQ29uZmlnIH0gZnJvbSAnLi4vdXRpbC9yZWFjdGl2ZS1mb3JtLWNvbmZpZydcclxuaW1wb3J0IHsgZGVmYXVsdENvbnRhaW5lciB9IGZyb20gJy4uL2NvcmUvZGVmYXVsdENvbnRhaW5lcic7XHJcbmltcG9ydCB7IERlY29yYXRvckNvbmZpZ3VyYXRpb24sIEluc3RhbmNlQ29udGFpbmVyLCBQcm9wZXJ0eUluZm8gfSBmcm9tICcuLi9jb3JlL3ZhbGlkYXRvci5pbnRlcmZhY2UnO1xyXG5cclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4uL21vZGVsc1wiXHJcbmltcG9ydCB7IEFSUkFZX1BST1BFUlRZLCBPQkpFQ1RfUFJPUEVSVFksIFBST1BFUlRZLCBGVU5DVElPTl9TVFJJTkcsIE9CSkVDVF9TVFJJTkcsIFJYX1dFQl9WQUxJREFUT1IsIE5VTUJFUiwgQk9PTEVBTiwgU1RSSU5HLCBNT0RFTCB9IGZyb20gXCIuLi9jb25zdFwiXHJcbmltcG9ydCB7IFByb3BWYWxpZGF0aW9uQ29uZmlnIH0gZnJvbSBcIi4uL21vZGVscy9wcm9wLXZhbGlkYXRpb24tY29uZmlnXCI7XHJcblxyXG5pbXBvcnQgeyBBbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiLi4vY29yZS92YWxpZGF0b3Iuc3RhdGljXCI7XHJcbmltcG9ydCB7IGNvbmRpdGlvbmFsQ2hhbmdlVmFsaWRhdG9yIH0gZnJvbSBcIi4uL3JlYWN0aXZlLWZvcm0tdmFsaWRhdG9ycy9jb25kaXRpb25hbC1jaGFuZ2UudmFsaWRhdG9yXCI7XHJcbmltcG9ydCB7IExpbnEgfSBmcm9tICcuLi91dGlsL2xpbnEnXHJcbmltcG9ydCB7IEFQUF9WQUxJREFUT1JTIH0gZnJvbSAnLi4vY29uc3QvYXBwLXZhbGlkYXRvcnMuY29uc3QnXHJcbmltcG9ydCB7IFJ4Rm9ybUNvbnRyb2wgfSBmcm9tICcuL2Zvcm0tY29udHJvbCc7XHJcbmltcG9ydCB7IFJ4Rm9ybUdyb3VwIH0gZnJvbSAnLi9yeC1mb3JtLWdyb3VwJ1xyXG5pbXBvcnQgeyBSeEZvcm1BcnJheSB9IGZyb20gJy4vcngtZm9ybS1hcnJheSc7XHJcbmltcG9ydCB7IGFuZFZhbGlkYXRvciB9IGZyb20gJy4uL3JlYWN0aXZlLWZvcm0tdmFsaWRhdG9ycy9hbmQudmFsaWRhdG9yJ1xyXG5pbXBvcnQgeyBvclZhbGlkYXRvciB9IGZyb20gJy4uL3JlYWN0aXZlLWZvcm0tdmFsaWRhdG9ycy9vci52YWxpZGF0b3InXHJcbmltcG9ydCB7IG5vdFZhbGlkYXRvciB9IGZyb20gJy4uL3JlYWN0aXZlLWZvcm0tdmFsaWRhdG9ycy9ub3QudmFsaWRhdG9yJ1xyXG5pbXBvcnQgeyBBcHBGb3JtR3JvdXAgfSBmcm9tICcuLi9tb2RlbHMvaW50ZXJmYWNlL2ktZm9ybS1ncm91cCdcclxuaW1wb3J0IHsgUmVnZXhWYWxpZGF0b3IgfSBmcm9tIFwiLi4vdXRpbC9yZWdleC12YWxpZGF0b3JcIjtcclxuaW1wb3J0IHsgZ2V0SW5zdGFuY2UgfSBmcm9tIFwiLi4vdXRpbC9pbnN0YW5jZS1wcm92aWRlci5mdW5jdGlvblwiO1xyXG5pbXBvcnQgeyBJQWJzdHJhY3RDb250cm9sIH0gZnJvbSBcIi4uL21vZGVscy9pbnRlcmZhY2UvaS1hYnN0cmFjdC1jb250cm9sXCJcclxuY29uc3QgTE9HSUNBTF9WQUxJREFUT1JTOiB7IFtrZXk6IHN0cmluZ106IEZ1bmN0aW9uIH0gPSB7IGFuZDogYW5kVmFsaWRhdG9yLCBvcjogb3JWYWxpZGF0b3IsIG5vdDogbm90VmFsaWRhdG9yIH1cclxuY29uc3QgQVNZTkM6IHN0cmluZyA9IFwiYXN5bmNcIlxyXG5jb25zdCBFTlRJVFlfT0JKRUNUOiBzdHJpbmcgPSBcImVudGl0eU9iamVjdFwiO1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBSeEZvcm1CdWlsZGVyIGV4dGVuZHMgQmFzZUZvcm1CdWlsZGVyIHtcclxuICAgIHByaXZhdGUgbmVzdGVkUHJvcDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBjb25kaXRpb25hbE9iamVjdFByb3BzOiBhbnlbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBjb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZTogYW55ID0ge307XHJcbiAgICBwcml2YXRlIGJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wczogYW55W10gPSBbXTtcclxuICAgIHByaXZhdGUgZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcbiAgICBwcml2YXRlIGN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3I6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuICAgIHByaXZhdGUgaXNOZXN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgaXNHcm91cENhbGxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBpc05lc3RlZEJpbmRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBnZXRJbnN0YW5jZUNvbnRhaW5lcihpbnN0YW5jZUZ1bmM6IGFueSwgZW50aXR5T2JqZWN0OiBhbnkpOiBJbnN0YW5jZUNvbnRhaW5lciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFjZVByb3ZpZGVyKGluc3RhbmNlRnVuYywgZW50aXR5T2JqZWN0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldFZhbHVlKGZvcm1Hcm91cDogRm9ybUdyb3VwLCBvYmplY3Q6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGZvciAodmFyIGNvbCBpbiBvYmplY3QpIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KFtjb2xdKTtcclxuICAgICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShvYmplY3RbY29sXSk7XHJcbiAgICAgICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGV4dHJhY3RFeHByZXNzaW9ucyhmb21yQnVpbGRlckNvbmZpZ3VyYXRpb246IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbik6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSB7XHJcbiAgICAgICAgaWYgKGZvbXJCdWlsZGVyQ29uZmlndXJhdGlvbiAmJiBmb21yQnVpbGRlckNvbmZpZ3VyYXRpb24uZHluYW1pY1ZhbGlkYXRpb24pIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZm9tckJ1aWxkZXJDb25maWd1cmF0aW9uLmR5bmFtaWNWYWxpZGF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBkZWNvcmF0b3IgaW4gZm9tckJ1aWxkZXJDb25maWd1cmF0aW9uLmR5bmFtaWNWYWxpZGF0aW9uW3Byb3BlcnR5XSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb21yQnVpbGRlckNvbmZpZ3VyYXRpb24uZHluYW1pY1ZhbGlkYXRpb25bcHJvcGVydHldW2RlY29yYXRvcl0uY29uZGl0aW9uYWxFeHByZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2x1bW5zID0gTGlucS5leHByZXNzaW9uQ29sdW1ucyhmb21yQnVpbGRlckNvbmZpZ3VyYXRpb24uZHluYW1pY1ZhbGlkYXRpb25bcHJvcGVydHldW2RlY29yYXRvcl0uY29uZGl0aW9uYWxFeHByZXNzaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbnRhaW5lci5hZGRDaGFuZ2VWYWxpZGF0aW9uKHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UsIHByb3BlcnR5LCBjb2x1bW5zKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRBc3luY1ZhbGlkYXRpb24ocHJvcGVydHk6IFByb3BlcnR5SW5mbywgcHJvcGVydHlWYWxpZGF0b3JzOiBEZWNvcmF0b3JDb25maWd1cmF0aW9uW10sIHByb3BWYWxpZGF0aW9uQ29uZmlnOiBQcm9wVmFsaWRhdGlvbkNvbmZpZykge1xyXG4gICAgICAgIGxldCBhc3luY1ZhbGlkYXRvcnMgPSBbXTtcclxuICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0b3JzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHByb3BlcnR5VmFsaWRhdG9yIG9mIHByb3BlcnR5VmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5VmFsaWRhdG9yLmlzQXN5bmMpXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWxpZGF0b3IuY29uZmlnLmZvckVhY2godCA9PiB7IGFzeW5jVmFsaWRhdG9ycy5wdXNoKHQpIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9wVmFsaWRhdGlvbkNvbmZpZyAmJiBwcm9wVmFsaWRhdGlvbkNvbmZpZ1tBU1lOQ10pIHtcclxuICAgICAgICAgICAgcHJvcFZhbGlkYXRpb25Db25maWdbQVNZTkNdLmZvckVhY2godCA9PiB7IGFzeW5jVmFsaWRhdG9ycy5wdXNoKHQpIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhc3luY1ZhbGlkYXRvcnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRGb3JtQ29udHJvbChwcm9wZXJ0eTogUHJvcGVydHlJbmZvLCBwcm9wZXJ0eVZhbGlkYXRvcnM6IERlY29yYXRvckNvbmZpZ3VyYXRpb25bXSwgcHJvcFZhbGlkYXRpb25Db25maWc6IFByb3BWYWxpZGF0aW9uQ29uZmlnLCBpbnN0YW5jZTogSW5zdGFuY2VDb250YWluZXIsIGVudGl0eTogYW55KSB7XHJcbiAgICAgICAgbGV0IHZhbGlkYXRvcnMgPSBbXTtcclxuICAgICAgICBsZXQgY29sdW1ucyA9IFtdO1xyXG4gICAgICAgIGlmICgoaW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHMgJiYgaW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHNbcHJvcGVydHkubmFtZV0pIHx8ICh0aGlzLmNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzICYmIHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHNbcHJvcGVydHkubmFtZV0pKSB7XHJcbiAgICAgICAgICAgIGxldCBwcm9wcyA9IFtdO1xyXG4gICAgICAgICAgICBpZiAoKGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzICYmIGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzW3Byb3BlcnR5Lm5hbWVdKSlcclxuICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzW3Byb3BlcnR5Lm5hbWVdLmZvckVhY2godCA9PiBwcm9wcy5wdXNoKHQpKVxyXG4gICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wcyAmJiB0aGlzLmNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzW3Byb3BlcnR5Lm5hbWVdKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1twcm9wZXJ0eS5uYW1lXS5mb3JFYWNoKHQgPT4gcHJvcHMucHVzaCh0KSk7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChjb25kaXRpb25hbENoYW5nZVZhbGlkYXRvcihwcm9wcykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jb25kaXRpb25hbE9iamVjdFByb3BzLmxlbmd0aCA+IDAgfHwgdGhpcy5idWlsZGVyQ29uZmlndXJhdGlvbkNvbmRpdGlvbmFsT2JqZWN0UHJvcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgcHJvcENvbmRpdGlvbnMgPSBbXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uYWxPYmplY3RQcm9wcylcclxuICAgICAgICAgICAgICAgIHByb3BDb25kaXRpb25zID0gdGhpcy5jb25kaXRpb25hbE9iamVjdFByb3BzLmZpbHRlcih0ID0+IHQucHJvcE5hbWUgPT0gcHJvcGVydHkubmFtZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkZXJDb25maWd1cmF0aW9uQ29uZGl0aW9uYWxPYmplY3RQcm9wcylcclxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzLmZpbHRlcih0ID0+IHQucHJvcE5hbWUgPT0gcHJvcGVydHkubmFtZSkuZm9yRWFjaCh0ID0+IHByb3BDb25kaXRpb25zLnB1c2godCkpO1xyXG4gICAgICAgICAgICBwcm9wQ29uZGl0aW9ucy5mb3JFYWNoKHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHQucmVmZXJlbmNlUHJvcE5hbWUgJiYgY29sdW1ucy5pbmRleE9mKHQucmVmZXJlbmNlUHJvcE5hbWUpID09IC0xKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaCh0LnJlZmVyZW5jZVByb3BOYW1lKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgaWYgKGNvbHVtbnMubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChjb25kaXRpb25hbENoYW5nZVZhbGlkYXRvcihjb2x1bW5zKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IHByb3BlcnR5VmFsaWRhdG9yIG9mIHByb3BlcnR5VmFsaWRhdG9ycykge1xyXG4gICAgICAgICAgICBpZiAoIXByb3BlcnR5VmFsaWRhdG9yLmlzQXN5bmMpXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHByb3BlcnR5VmFsaWRhdG9yLmFubm90YXRpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBBbm5vdGF0aW9uVHlwZXMucnVsZTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEFQUF9WQUxJREFUT1JTW3Byb3BlcnR5VmFsaWRhdG9yLmFubm90YXRpb25UeXBlXShwcm9wZXJ0eVZhbGlkYXRvci5jb25maWcsIGVudGl0eSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQW5ub3RhdGlvblR5cGVzLmFuZDpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEFubm90YXRpb25UeXBlcy5vcjpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEFubm90YXRpb25UeXBlcy5ub3Q6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChMT0dJQ0FMX1ZBTElEQVRPUlNbcHJvcGVydHlWYWxpZGF0b3IuYW5ub3RhdGlvblR5cGVdKHByb3BlcnR5VmFsaWRhdG9yLmNvbmZpZykpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChBUFBfVkFMSURBVE9SU1twcm9wZXJ0eVZhbGlkYXRvci5hbm5vdGF0aW9uVHlwZV0ocHJvcGVydHlWYWxpZGF0b3IuY29uZmlnKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwcm9wVmFsaWRhdGlvbkNvbmZpZylcclxuICAgICAgICAgICAgdGhpcy5hZGRpdGlvbmFsVmFsaWRhdGlvbih2YWxpZGF0b3JzLCBwcm9wVmFsaWRhdGlvbkNvbmZpZyk7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wZXJ0eS5uYW1lXSlcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BlcnR5Lm5hbWVdLmZvckVhY2godCA9PiB7IHZhbGlkYXRvcnMucHVzaCh0KTsgfSlcclxuICAgICAgICByZXR1cm4gdmFsaWRhdG9ycztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZGl0aW9uYWxWYWxpZGF0aW9uKHZhbGlkYXRpb25zOiBhbnlbXSwgcHJvcFZhbGlkYXRpb25Db25maWc6IFByb3BWYWxpZGF0aW9uQ29uZmlnIHwgYW55KSB7XHJcbiAgICAgICAgZm9yICh2YXIgY29sIGluIEFubm90YXRpb25UeXBlcykge1xyXG4gICAgICAgICAgICBpZiAocHJvcFZhbGlkYXRpb25Db25maWdbQW5ub3RhdGlvblR5cGVzW2NvbF1dICYmIGNvbCAhPSBcImN1c3RvbVwiKSB7XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9ucy5wdXNoKEFQUF9WQUxJREFUT1JTW0Fubm90YXRpb25UeXBlc1tjb2xdXShwcm9wVmFsaWRhdGlvbkNvbmZpZ1tBbm5vdGF0aW9uVHlwZXNbY29sXV0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChjb2wgPT0gQW5ub3RhdGlvblR5cGVzLmN1c3RvbSAmJiBwcm9wVmFsaWRhdGlvbkNvbmZpZ1tBbm5vdGF0aW9uVHlwZXNbY29sXV0pXHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9ucy5wdXNoKHByb3BWYWxpZGF0aW9uQ29uZmlnW2NvbF0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEVudGl0eTxUPihvYmplY3Q6IFQsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbjogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgaXNTYW1lT2JqZWN0Q29uc3RydWN0b3I6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGlmIChmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmdlbmVyaWNFbnRpdGllcyAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZ2VuZXJpY0VudGl0aWVzW3Byb3BlcnR5TmFtZV0pXHJcbiAgICAgICAgICAgIHJldHVybiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZ2VuZXJpY0VudGl0aWVzW3Byb3BlcnR5TmFtZV07XHJcbiAgICAgICAgcmV0dXJuIGlzU2FtZU9iamVjdENvbnN0cnVjdG9yID8gb2JqZWN0LmNvbnN0cnVjdG9yIDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0T2JqZWN0UHJvcGVydHlJbnN0YW5jZShvYmplY3Q6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIHByb3BlcnR5SW5mbzogUHJvcGVydHlJbmZvLCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb246IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8ucHJvcGVydHlUeXBlID09IE9CSkVDVF9QUk9QRVJUWSAmJiBvYmplY3RbcHJvcGVydHlJbmZvLm5hbWVdKVxyXG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0W3Byb3BlcnR5SW5mby5uYW1lXS5jb25zdHJ1Y3RvcjtcclxuICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eUluZm8ucHJvcGVydHlUeXBlID09IEFSUkFZX1BST1BFUlRZICYmIG9iamVjdFtwcm9wZXJ0eUluZm8ubmFtZV0gJiYgb2JqZWN0W3Byb3BlcnR5SW5mby5uYW1lXS5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0W3Byb3BlcnR5SW5mby5uYW1lXVswXS5jb25zdHJ1Y3RvcjtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRFbnRpdHkob2JqZWN0LCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIHByb3BlcnR5SW5mby5uYW1lKVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrT2JqZWN0UHJvcEFkZGl0aW9uYWxWYWxpZGF0aW9uPFQ+KGluc3RhbmNlQ29udGFpbmVyOiBJbnN0YW5jZUNvbnRhaW5lciwgb2JqZWN0OiBULCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb246IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIHZhciBwcm9wcyA9IGluc3RhbmNlQ29udGFpbmVyLnByb3BlcnRpZXMuZmlsdGVyKHQgPT4gdC5wcm9wZXJ0eVR5cGUgPT0gT0JKRUNUX1BST1BFUlRZIHx8IHQucHJvcGVydHlUeXBlID09IEFSUkFZX1BST1BFUlRZKVxyXG4gICAgICAgIHByb3BzLmZvckVhY2godCA9PiB7XHJcbiAgICAgICAgICAgIGxldCBlbnRpdHkgPSB0LmVudGl0eTtcclxuICAgICAgICAgICAgaWYgKCF0LmVudGl0eSlcclxuICAgICAgICAgICAgICAgIGVudGl0eSA9IHRoaXMuZ2V0T2JqZWN0UHJvcGVydHlJbnN0YW5jZShvYmplY3QsIHQsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbilcclxuICAgICAgICAgICAgaWYgKGVudGl0eSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5nZXRJbnN0YW5jZUNvbnRhaW5lcihlbnRpdHksIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGluc3RhbmNlLmNvbmRpdGlvbmFsVmFsaWRhdGlvblByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wID0gaW5zdGFuY2VDb250YWluZXIucHJvcGVydGllcy5maWx0ZXIodCA9PiB0Lm5hbWUgPT0ga2V5KVswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5zdGFuY2VDb250YWluZXIuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb250YWluZXIuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHMgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5zdGFuY2VDb250YWluZXIuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHNba2V5XSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1trZXldID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1trZXldLmZvckVhY2goeCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQucHJvcGVydHlUeXBlICE9IEFSUkFZX1BST1BFUlRZKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbFZhbGlkYXRpb25Qcm9wc1trZXldLnB1c2goW3QubmFtZSwgeF0uam9pbignLicpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb250YWluZXIuY29uZGl0aW9uYWxWYWxpZGF0aW9uUHJvcHNba2V5XS5wdXNoKFt0Lm5hbWUsIHhdLmpvaW4oJ1tdJykpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRPYmplY3QobW9kZWw6IGFueSB8IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGVudGl0eU9iamVjdD86IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbj86IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbik6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xyXG4gICAgICAgIGxldCBqc29uOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT0gRlVOQ1RJT05fU1RSSU5HKVxyXG4gICAgICAgICAgICBqc29uLm1vZGVsID0gbW9kZWw7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT0gRlVOQ1RJT05fU1RSSU5HICYmIChlbnRpdHlPYmplY3QgaW5zdGFuY2VvZiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pKSB7XHJcbiAgICAgICAgICAgIGpzb24uZW50aXR5T2JqZWN0ID0gdGhpcy5jcmVhdGVDbGFzc09iamVjdChqc29uLm1vZGVsLCBlbnRpdHlPYmplY3QpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlbnRpdHlPYmplY3QgJiYgIShlbnRpdHlPYmplY3QgaW5zdGFuY2VvZiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pKVxyXG4gICAgICAgICAgICBqc29uLmVudGl0eU9iamVjdCA9IGVudGl0eU9iamVjdDtcclxuXHJcbiAgICAgICAgaWYgKGVudGl0eU9iamVjdCBpbnN0YW5jZW9mIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiAmJiAhZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKVxyXG4gICAgICAgICAgICBqc29uLmZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiA9IGVudGl0eU9iamVjdDtcclxuICAgICAgICBlbHNlIGlmICghKGVudGl0eU9iamVjdCBpbnN0YW5jZW9mIEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbikgJiYgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgIGpzb24uZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uID0gZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uO1xyXG4gICAgICAgICAgICBqc29uLmVudGl0eU9iamVjdCA9IHRoaXMuY3JlYXRlQ2xhc3NPYmplY3QoanNvbi5tb2RlbCwganNvbi5mb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIGpzb24uZW50aXR5T2JqZWN0KVxyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmICghZW50aXR5T2JqZWN0KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT0gT0JKRUNUX1NUUklORylcclxuICAgICAgICAgICAgICAgIGpzb24ubW9kZWwgPSBtb2RlbC5jb25zdHJ1Y3RvcjtcclxuICAgICAgICAgICAganNvbi5lbnRpdHlPYmplY3QgPSB0aGlzLmNyZWF0ZUNsYXNzT2JqZWN0KGpzb24ubW9kZWwsIGpzb24uZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBtb2RlbClcclxuICAgICAgICB9IGVsc2UgaWYgKG1vZGVsICYmIChlbnRpdHlPYmplY3QgaW5zdGFuY2VvZiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pICYmICh0eXBlb2YgbW9kZWwgPT0gT0JKRUNUX1NUUklORykpIHtcclxuICAgICAgICAgICAganNvbltNT0RFTF0gPSBtb2RlbC5jb25zdHJ1Y3RvcjtcclxuICAgICAgICAgICAganNvbltFTlRJVFlfT0JKRUNUXSA9IHRoaXMuY3JlYXRlQ2xhc3NPYmplY3QoanNvbi5tb2RlbCwganNvbi5mb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIG1vZGVsKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4ganNvbjtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIGNvbnRyb2wodmFsdWU/OiBhbnksIHZhbGlkYXRvcnM/OiBWYWxpZGF0b3JGbltdLCBhc3luY1ZhbGlkYXRvcnM/OiBBc3luY1ZhbGlkYXRvckZuW10pOiBJQWJzdHJhY3RDb250cm9sIHtcclxuICAgICAgICByZXR1cm4gbmV3IFJ4Rm9ybUNvbnRyb2wodmFsdWUsIHZhbGlkYXRvcnMsIGFzeW5jVmFsaWRhdG9ycywge30sIHt9LCAnJywgW10pO1xyXG4gICAgfVxyXG5cclxuICAgIGFycmF5KHZhbHVlczogW3sgW2tleTogc3RyaW5nXTogYW55IH1dLCB2YWxpZGF0b3JDb25maWc/OiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgICBsZXQgZm9ybUFycmF5ID0gdGhpcy5ncm91cCh7IHRlbXA6IHZhbHVlcyB9LCB2YWxpZGF0b3JDb25maWcpLmdldChcInRlbXBcIikgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgIHZhciBmb3JtQnVpbGRlciA9IG5ldyBGb3JtQnVpbGRlcigpO1xyXG4gICAgICAgIHJldHVybiBmb3JtQnVpbGRlci5hcnJheShmb3JtQXJyYXkuY29udHJvbHMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdyb3VwKGdyb3VwT2JqZWN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCB2YWxpZGF0b3JDb25maWc/OiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pOiBGb3JtR3JvdXAge1xyXG4gICAgICAgIGxldCBtb2RlbEluc3RhbmNlID0gc3VwZXIuY3JlYXRlSW5zdGFuY2UoKTtcclxuICAgICAgICBsZXQgZW50aXR5T2JqZWN0ID0ge307XHJcbiAgICAgICAgdGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgPSB7fTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgPSB0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcjtcclxuICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckZvcm1Hcm91cChncm91cE9iamVjdCwgZW50aXR5T2JqZWN0LCBtb2RlbEluc3RhbmNlLCB2YWxpZGF0b3JDb25maWcpO1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciA9IHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yO1xyXG4gICAgICAgIHRoaXMuaXNHcm91cENhbGxlZCA9IHRydWU7XHJcbiAgICAgICAgbGV0IGZvcm1Hcm91cCA9IHRoaXMuZm9ybUdyb3VwKG1vZGVsSW5zdGFuY2UuY29uc3RydWN0b3IsIGVudGl0eU9iamVjdCwgdmFsaWRhdG9yQ29uZmlnKTtcclxuICAgICAgICB0aGlzLmlzR3JvdXBDYWxsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciA9IHt9O1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvciA9IHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yO1xyXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0ge307XHJcbiAgICAgICAgcmV0dXJuIGZvcm1Hcm91cDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFwcGx5QWxsUHJvcFZhbGlkYXRvcihwcm9wTmFtZTogc3RyaW5nLCB2YWxpZGF0b3JDb25maWc6IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgbW9kZWxJbnN0YW5jZTogYW55KSB7XHJcbiAgICAgICAgaWYgKHZhbGlkYXRvckNvbmZpZyAmJiB2YWxpZGF0b3JDb25maWcuYXBwbHlBbGxQcm9wcykge1xyXG4gICAgICAgICAgICBpZiAoISh2YWxpZGF0b3JDb25maWcuZXhjbHVkZVByb3BzICYmIHZhbGlkYXRvckNvbmZpZy5leGNsdWRlUHJvcHMubGVuZ3RoID4gMCAmJiB2YWxpZGF0b3JDb25maWcuZXhjbHVkZVByb3BzLmluZGV4T2YocHJvcE5hbWUpID09IC0xKSkge1xyXG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yQ29uZmlnLmFwcGx5QWxsUHJvcHMuZm9yRWFjaCgodDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQubmFtZSA9PSBSWF9XRUJfVkFMSURBVE9SKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHQocHJvcE5hbWUsIG1vZGVsSW5zdGFuY2UpXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BOYW1lXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcE5hbWVdLnB1c2godClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZHluYW1pY1ZhbGlkYXRpb25Qcm9wQ2hlY2socHJvcE5hbWU6IHN0cmluZywgdmFsaWRhdG9yQ29uZmlnOiBGb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgICByZXR1cm4gKHZhbGlkYXRvckNvbmZpZyA9PSB1bmRlZmluZWQpID8gdHJ1ZSA6ICghdmFsaWRhdG9yQ29uZmlnLmR5bmFtaWNWYWxpZGF0aW9uQ29uZmlndXJhdGlvblByb3BlcnR5TmFtZSkgPyB0cnVlIDogdmFsaWRhdG9yQ29uZmlnLmR5bmFtaWNWYWxpZGF0aW9uQ29uZmlndXJhdGlvblByb3BlcnR5TmFtZSA9PSBwcm9wTmFtZSA/IGZhbHNlIDogdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzTm90T2JqZWN0KHZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT0gT0JKRUNUX1NUUklORztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZVZhbGlkYXRvckZvcm1Hcm91cChncm91cE9iamVjdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgZW50aXR5T2JqZWN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBtb2RlbEluc3RhbmNlOiBhbnksIHZhbGlkYXRvckNvbmZpZzogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gZ3JvdXBPYmplY3QpIHtcclxuXHJcbiAgICAgICAgICAgIHZhciBwcm9wID0gZ3JvdXBPYmplY3RbcHJvcE5hbWVdO1xyXG4gICAgICAgICAgICBpZiAocHJvcCBpbnN0YW5jZW9mIEFycmF5ICYmIHByb3AubGVuZ3RoID4gMCAmJiB0aGlzLmlzTm90T2JqZWN0KHByb3BbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcFZhbGlkYXRvcnMgPSAocHJvcC5sZW5ndGggPiAxICYmIHByb3BbMV0gaW5zdGFuY2VvZiBBcnJheSkgPyBwcm9wWzFdIDogKHByb3AubGVuZ3RoID09IDIpID8gW3Byb3BbMV1dIDogW107XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcGVydHlBZGRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wVmFsaWRhdG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wVmFsaWRhdG9yc1tpXS5uYW1lID09IFJYX1dFQl9WQUxJREFUT1IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcFZhbGlkYXRvcnNbaV0ocHJvcE5hbWUsIG1vZGVsSW5zdGFuY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUFkZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BOYW1lXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wTmFtZV0gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BOYW1lXS5wdXNoKHByb3BWYWxpZGF0b3JzW2ldKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghcHJvcGVydHlBZGRlZClcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgUFJPUEVSVFksIHVuZGVmaW5lZCwgdHlwZW9mIG1vZGVsSW5zdGFuY2UgPT0gT0JKRUNUX1NUUklORyA/IG1vZGVsSW5zdGFuY2UgOiB7IGNvbnN0cnVjdG9yOiBtb2RlbEluc3RhbmNlIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseUFsbFByb3BWYWxpZGF0b3IocHJvcE5hbWUsIHZhbGlkYXRvckNvbmZpZywgbW9kZWxJbnN0YW5jZSlcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wID09PSBudWxsIHx8IHByb3AgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgcHJvcCA9PSBTVFJJTkcgfHwgdHlwZW9mIHByb3AgPT0gTlVNQkVSIHx8IHR5cGVvZiBwcm9wID09IEJPT0xFQU4gfHwgcHJvcCBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRDb250YWluZXIuaW5pdFByb3BlcnR5T2JqZWN0KHByb3BOYW1lLCBQUk9QRVJUWSwgdW5kZWZpbmVkLCB0eXBlb2YgbW9kZWxJbnN0YW5jZSA9PSBPQkpFQ1RfU1RSSU5HID8gbW9kZWxJbnN0YW5jZSA6IHsgY29uc3RydWN0b3I6IG1vZGVsSW5zdGFuY2UgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5QWxsUHJvcFZhbGlkYXRvcihwcm9wTmFtZSwgdmFsaWRhdG9yQ29uZmlnLCBtb2RlbEluc3RhbmNlKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3AgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb3AgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gcHJvcDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BNb2RlbEluc3RhbmNlID0gc3VwZXIuY3JlYXRlSW5zdGFuY2UoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1vZGVsSW5zdGFuY2UgPT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID0gbW9kZWxJbnN0YW5jZTtcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgQVJSQVlfUFJPUEVSVFksIHByb3BNb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yLCBtb2RlbEluc3RhbmNlKTtcclxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcm93IG9mIHByb3ApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGpPYmplY3QgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXS5wdXNoKGpPYmplY3QpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yRm9ybUdyb3VwKHJvdywgak9iamVjdCwgcHJvcE1vZGVsSW5zdGFuY2UuY29uc3RydWN0b3IsIHZhbGlkYXRvckNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb3AgPT0gT0JKRUNUX1NUUklORyAmJiAhKHByb3AgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCB8fCBwcm9wIGluc3RhbmNlb2YgUnhGb3JtQ29udHJvbCkpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZm9ybUdyb3VwOiBhbnkgPSAocHJvcCBpbnN0YW5jZW9mIEZvcm1BcnJheSkgPyBwcm9wLmNvbnRyb2xzWzBdIDogcHJvcFxyXG4gICAgICAgICAgICAgICAgaWYgKCFmb3JtR3JvdXAubW9kZWwgJiYgKHByb3AgaW5zdGFuY2VvZiBGb3JtR3JvdXAgfHwgcHJvcCBpbnN0YW5jZW9mIFJ4Rm9ybUdyb3VwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cCA9IHRoaXMuZ3JvdXAoZm9ybUdyb3VwLmNvbnRyb2xzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChwcm9wIGluc3RhbmNlb2YgRm9ybUdyb3VwIHx8IHByb3AgaW5zdGFuY2VvZiBSeEZvcm1Hcm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVudGl0eU9iamVjdFtwcm9wTmFtZV0gPSBwcm9wO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb250YWluZXIuaW5pdFByb3BlcnR5T2JqZWN0KHByb3BOYW1lLCBPQkpFQ1RfUFJPUEVSVFksIGZvcm1Hcm91cC5tb2RlbCwgbW9kZWxJbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3AgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgICAgICBlbnRpdHlPYmplY3RbcHJvcE5hbWVdID0gcHJvcDtcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgQVJSQVlfUFJPUEVSVFksIGZvcm1Hcm91cC5tb2RlbCwgbW9kZWxJbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmR5bmFtaWNWYWxpZGF0aW9uUHJvcENoZWNrKHByb3BOYW1lLCB2YWxpZGF0b3JDb25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yW3Byb3BOYW1lXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRGb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3IgPSB0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wTmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9wTW9kZWxJbnN0YW5jZSA9IHN1cGVyLmNyZWF0ZUluc3RhbmNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eU9iamVjdFtwcm9wTmFtZV0gPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXS5jb25zdHJ1Y3RvciA9IHByb3BNb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgT0JKRUNUX1BST1BFUlRZLCBlbnRpdHlPYmplY3RbcHJvcE5hbWVdLmNvbnN0cnVjdG9yLCBtb2RlbEluc3RhbmNlLmNvbnN0cnVjdG9yID09IEZ1bmN0aW9uID8geyBjb25zdHJ1Y3RvcjogbW9kZWxJbnN0YW5jZSB9IDogbW9kZWxJbnN0YW5jZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvYmplY3RWYWxpZGF0aW9uQ29uZmlnID0gdGhpcy5nZXRWYWxpZGF0b3JDb25maWcodmFsaWRhdG9yQ29uZmlnLCBncm91cE9iamVjdCwgcHJvcE5hbWUgKyBcIi5cIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JGb3JtR3JvdXAoZ3JvdXBPYmplY3RbcHJvcE5hbWVdLCBlbnRpdHlPYmplY3RbcHJvcE5hbWVdLCBlbnRpdHlPYmplY3RbcHJvcE5hbWVdLmNvbnN0cnVjdG9yLCBvYmplY3RWYWxpZGF0aW9uQ29uZmlnKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgZW50aXR5T2JqZWN0W3Byb3BOYW1lXSA9IGdyb3VwT2JqZWN0W3Byb3BOYW1lXTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09IFNUUklORyB8fCB0eXBlb2YgcHJvcCA9PSBOVU1CRVIgfHwgdHlwZW9mIHByb3AgPT0gQk9PTEVBTiB8fCBwcm9wIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXSA9IHByb3BcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICgocHJvcCAmJiBwcm9wLmxlbmd0aCA+IDAgJiYgdGhpcy5pc05vdE9iamVjdChwcm9wWzBdKSAmJiAhKHByb3AgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCB8fCBwcm9wIGluc3RhbmNlb2YgUnhGb3JtQ29udHJvbCkgJiYgIShwcm9wIGluc3RhbmNlb2YgRm9ybUFycmF5KSkpIHtcclxuICAgICAgICAgICAgICAgIGVudGl0eU9iamVjdFtwcm9wTmFtZV0gPSBwcm9wWzBdXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xyXG4gICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BOYW1lXSA9IHByb3BcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wgfHwgcHJvcCBpbnN0YW5jZW9mIFJ4Rm9ybUNvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgIGVudGl0eU9iamVjdFtwcm9wTmFtZV0gPSBwcm9wXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0Q29udGFpbmVyLmluaXRQcm9wZXJ0eU9iamVjdChwcm9wTmFtZSwgUFJPUEVSVFksIHVuZGVmaW5lZCwgbW9kZWxJbnN0YW5jZS5jb25zdHJ1Y3RvciA/IG1vZGVsSW5zdGFuY2UgOiB7IGNvbnN0cnVjdG9yOiBtb2RlbEluc3RhbmNlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VmFsaWRhdG9yQ29uZmlnKHZhbGlkYXRvckNvbmZpZzogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBlbnRpdHlPYmplY3Q6IGFueSwgcm9vdFByb3BlcnR5TmFtZTogc3RyaW5nLCBhcnJheVByb3BlcnR5TmFtZT86IHN0cmluZyk6IGFueSB7XHJcbiAgICAgICAgbGV0IGV4Y2x1ZGVQcm9wcyA9IFtdO1xyXG4gICAgICAgIGxldCBpbmNsdWRlUHJvcHMgPSBbXTtcclxuICAgICAgICBsZXQgaWdub3JlVW5kZWZpbmVkUHJvcHMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKCF2YWxpZGF0b3JDb25maWcpIHJldHVybiB7fTtcclxuXHJcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvblByb3BzID0gdGhpcy5nZXRPYmplY3RGb3JQcm9wZXJ0eSh2YWxpZGF0b3JDb25maWcuZHluYW1pY1ZhbGlkYXRpb24sIHJvb3RQcm9wZXJ0eU5hbWUsIGFycmF5UHJvcGVydHlOYW1lKTtcclxuICAgICAgICBjb25zdCBhYnN0cmFjdENvbnRyb2xPcHRpb25zID0gdGhpcy5nZXRPYmplY3RGb3JQcm9wZXJ0eSh2YWxpZGF0b3JDb25maWcuYWJzdHJhY3RDb250cm9sT3B0aW9ucywgcm9vdFByb3BlcnR5TmFtZSwgYXJyYXlQcm9wZXJ0eU5hbWUpO1xyXG5cclxuICAgICAgICBpZiAodmFsaWRhdG9yQ29uZmlnLmV4Y2x1ZGVQcm9wcylcclxuICAgICAgICAgICAgZXhjbHVkZVByb3BzID0gdGhpcy5nZXRQcm9wcyh2YWxpZGF0b3JDb25maWcuZXhjbHVkZVByb3BzLCByb290UHJvcGVydHlOYW1lKTtcclxuICAgICAgICBpZiAodmFsaWRhdG9yQ29uZmlnLmluY2x1ZGVQcm9wcylcclxuICAgICAgICAgICAgaW5jbHVkZVByb3BzID0gdGhpcy5nZXRQcm9wcyh2YWxpZGF0b3JDb25maWcuaW5jbHVkZVByb3BzLCByb290UHJvcGVydHlOYW1lKTtcclxuICAgICAgICBpZiAodmFsaWRhdG9yQ29uZmlnLmlnbm9yZVVuZGVmaW5lZFByb3BzKVxyXG4gICAgICAgICAgICBpZ25vcmVVbmRlZmluZWRQcm9wcyA9IHRoaXMuZ2V0UHJvcHModmFsaWRhdG9yQ29uZmlnLmlnbm9yZVVuZGVmaW5lZFByb3BzLCByb290UHJvcGVydHlOYW1lLCB0cnVlKTtcclxuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKGFic3RyYWN0Q29udHJvbE9wdGlvbnMpLmxlbmd0aCAmJiByb290UHJvcGVydHlOYW1lLmVuZHNXaXRoKCcuJykgJiYgdmFsaWRhdG9yQ29uZmlnLmFic3RyYWN0Q29udHJvbE9wdGlvbnMgJiYgdmFsaWRhdG9yQ29uZmlnLmFic3RyYWN0Q29udHJvbE9wdGlvbnNbcm9vdFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgcm9vdFByb3BlcnR5TmFtZS5sZW5ndGggLSAxKV0pXHJcbiAgICAgICAgICAgIGFic3RyYWN0Q29udHJvbE9wdGlvbnNbJ2dsb2JhbCddID0gdmFsaWRhdG9yQ29uZmlnLmFic3RyYWN0Q29udHJvbE9wdGlvbnNbcm9vdFByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgcm9vdFByb3BlcnR5TmFtZS5sZW5ndGggLSAxKV07XHJcblxyXG4gICAgICAgIGNvbnN0IGR5bmFtaWNWYWxpZGF0aW9uID0gKHZhbGlkYXRvckNvbmZpZy5keW5hbWljVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eU5hbWUgJiYgZW50aXR5T2JqZWN0W3ZhbGlkYXRvckNvbmZpZy5keW5hbWljVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Qcm9wZXJ0eU5hbWVdKSA/IGVudGl0eU9iamVjdFt2YWxpZGF0b3JDb25maWcuZHluYW1pY1ZhbGlkYXRpb25Db25maWd1cmF0aW9uUHJvcGVydHlOYW1lXSA6IHZhbGlkYXRpb25Qcm9wcztcclxuICAgICAgICByZXR1cm4geyBpZ25vcmVVbmRlZmluZWRQcm9wczogaWdub3JlVW5kZWZpbmVkUHJvcHMsIGluY2x1ZGVQcm9wczogaW5jbHVkZVByb3BzLCBkeW5hbWljVmFsaWRhdGlvbjogZHluYW1pY1ZhbGlkYXRpb24sIGV4Y2x1ZGVQcm9wczogZXhjbHVkZVByb3BzLCBhYnN0cmFjdENvbnRyb2xPcHRpb25zOiBhYnN0cmFjdENvbnRyb2xPcHRpb25zIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE9iamVjdEZvclByb3BlcnR5PFQ+KHJvb3RPYmplY3Q6IHsgW2tleTogc3RyaW5nXTogVCB9LCByb290UHJvcGVydHlOYW1lOiBzdHJpbmcsIGFycmF5UHJvcGVydHlOYW1lPzogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBUIH0ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmddOiBUIH0gPSB7fTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgcHJvcE5hbWUgaW4gcm9vdE9iamVjdCkge1xyXG4gICAgICAgICAgICBpZiAoIXByb3BOYW1lLnN0YXJ0c1dpdGgocm9vdFByb3BlcnR5TmFtZSkgJiYgKCFhcnJheVByb3BlcnR5TmFtZSB8fCAhcHJvcE5hbWUuc3RhcnRzV2l0aChhcnJheVByb3BlcnR5TmFtZSkpKVxyXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBsZXQgc3BsaXRQcm9wID0gcHJvcE5hbWUuc3BsaXQoXCIuXCIsIDIpWzFdO1xyXG4gICAgICAgICAgICBpZiAoIXNwbGl0UHJvcClcclxuICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgcmVzdWx0W3NwbGl0UHJvcF0gPSByb290T2JqZWN0W3Byb3BOYW1lXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRQcm9wcyhwcm9wZXJ0aWVzOiBzdHJpbmdbXSwgcm9vdFByb3BlcnR5TmFtZTogc3RyaW5nLCBpc0lnbm9yZVByb3A6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGxldCBwcm9wczogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBwcm9wIG9mIHByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgaWYgKHByb3AuaW5kZXhPZihyb290UHJvcGVydHlOYW1lKSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNwbGl0UHJvcHMgPSBwcm9wLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChzcGxpdFByb3BzLmxlbmd0aCA9PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMucHVzaChzcGxpdFByb3BzWzFdKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3BsaXRQcm9wcy5sZW5ndGggPiAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3BsaXRQcm9wcy5zcGxpY2UoMCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMucHVzaChzcGxpdFByb3BzLmpvaW4oXCIuXCIpKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc0lnbm9yZVByb3AgJiYgcHJvcGVydGllcy5maWx0ZXIoeCA9PiB4ID09IHJvb3RQcm9wZXJ0eU5hbWUucmVwbGFjZSgnLicsICcnKSkubGVuZ3RoID09IDEpXHJcbiAgICAgICAgICAgIHByb3BzLnB1c2goJzpzZWxmOicpO1xyXG5cclxuICAgICAgICByZXR1cm4gcHJvcHM7XHJcbiAgICB9XHJcblxyXG4gICAgZm9ybUdyb3VwPFQ+KG1vZGVsOiBUeXBlPFQ+IHwgeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgZW50aXR5T2JqZWN0PzogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IEZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uPzogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKTogUnhGb3JtR3JvdXAgfCBGb3JtR3JvdXAgfCBBcHBGb3JtR3JvdXA8VD4ge1xyXG4gICAgICAgIGxldCBqc29uID0gdGhpcy5nZXRPYmplY3QobW9kZWwsIGVudGl0eU9iamVjdCwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKTtcclxuICAgICAgICBtb2RlbCA9IGpzb24ubW9kZWw7XHJcbiAgICAgICAgZW50aXR5T2JqZWN0ID0ganNvbi5lbnRpdHlPYmplY3Q7XHJcbiAgICAgICAgaWYgKGVudGl0eU9iamVjdC5jb25zdHJ1Y3RvciAhPSBtb2RlbCAmJiAhdGhpcy5pc0dyb3VwQ2FsbGVkKSB7XHJcbiAgICAgICAgICAgIGVudGl0eU9iamVjdCA9IGpzb24uZW50aXR5T2JqZWN0ID0gdGhpcy51cGRhdGVPYmplY3QobW9kZWwsIGpzb24uZW50aXR5T2JqZWN0LCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gPSBqc29uLmZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbjtcclxuICAgICAgICBpZiAoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLmV4dHJhY3RFeHByZXNzaW9ucyhmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICAgIGxldCBpbnN0YW5jZUNvbnRhaW5lcjogSW5zdGFuY2VDb250YWluZXIgPSB0aGlzLmdldEluc3RhbmNlQ29udGFpbmVyKG1vZGVsLCBlbnRpdHlPYmplY3QpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tPYmplY3RQcm9wQWRkaXRpb25hbFZhbGlkYXRpb24oaW5zdGFuY2VDb250YWluZXIsIGVudGl0eU9iamVjdCwgZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKTtcclxuICAgICAgICBsZXQgZm9ybUdyb3VwT2JqZWN0ID0ge307XHJcbiAgICAgICAgbGV0IGV4dGVuZGVkUHJvcGVydGllcyA9IHt9O1xyXG4gICAgICAgIGxldCBmb3JtQ2hpbGRHcm91cCA9IHVuZGVmaW5lZDtcclxuICAgICAgICBsZXQgZm9ybUFycmF5R3JvdXAgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdmFyIGFkZGl0aW9uYWxWYWxpZGF0aW9uczogeyBba2V5OiBzdHJpbmddOiBQcm9wVmFsaWRhdGlvbkNvbmZpZyB9ID0ge307XHJcbiAgICAgICAgaW5zdGFuY2VDb250YWluZXIucHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcclxuICAgICAgICAgICAgbGV0IGlzSW5jbHVkZVByb3AgPSB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmV4Y2x1ZGVQcm9wcyAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZXhjbHVkZVByb3BzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgICAgICAgICAgaXNJbmNsdWRlUHJvcCA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5leGNsdWRlUHJvcHMuaW5kZXhPZihwcm9wZXJ0eS5uYW1lKSA9PSAtMVxyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5keW5hbWljVmFsaWRhdGlvbilcclxuICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVmFsaWRhdGlvbnMgPSBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uZHluYW1pY1ZhbGlkYXRpb247XHJcbiAgICAgICAgICAgICAgICBpZiAoZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLmluY2x1ZGVQcm9wcyAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uaW5jbHVkZVByb3BzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgICAgICAgICAgaXNJbmNsdWRlUHJvcCA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5pbmNsdWRlUHJvcHMuaW5kZXhPZihwcm9wZXJ0eS5uYW1lKSAhPSAtMVxyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5pZ25vcmVVbmRlZmluZWRQcm9wcyAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uaWdub3JlVW5kZWZpbmVkUHJvcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlzSW5jbHVkZVByb3AgPSAhKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PSBQUk9QRVJUWSAmJiAhUmVnZXhWYWxpZGF0b3IuaXNOb3RCbGFuayhqc29uLmVudGl0eU9iamVjdFtwcm9wZXJ0eS5uYW1lXSkgJiYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5pZ25vcmVVbmRlZmluZWRQcm9wcy5pbmRleE9mKHByb3BlcnR5Lm5hbWUpICE9PSAtMSB8fCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uaWdub3JlVW5kZWZpbmVkUHJvcHMuaW5kZXhPZihcIjpzZWxmOlwiKSAhPT0gLTEpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5pZ25vcmUpXHJcbiAgICAgICAgICAgICAgICBpc0luY2x1ZGVQcm9wID0gIXByb3BlcnR5Lmlnbm9yZS5jYWxsKGpzb24uZW50aXR5T2JqZWN0LCBqc29uLmVudGl0eU9iamVjdCk7XHJcbiAgICAgICAgICAgIGlmIChpc0luY2x1ZGVQcm9wKSB7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHByb3BlcnR5LnByb3BlcnR5VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgUFJPUEVSVFk6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGVudGl0eU9iamVjdFtwcm9wZXJ0eS5uYW1lXSBpbnN0YW5jZW9mIEZvcm1Db250cm9sIHx8IGVudGl0eU9iamVjdFtwcm9wZXJ0eS5uYW1lXSBpbnN0YW5jZW9mIFJ4Rm9ybUNvbnRyb2wpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcGVydHlWYWxpZGF0b3JzID0gaW5zdGFuY2VDb250YWluZXIucHJvcGVydHlBbm5vdGF0aW9ucy5maWx0ZXIodCA9PiB0LnByb3BlcnR5TmFtZSA9PSBwcm9wZXJ0eS5uYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzYW5pdGl6ZVZhbHVlID0gc3VwZXIuc2FuaXRpemVWYWx1ZShpbnN0YW5jZUNvbnRhaW5lciwgcHJvcGVydHkubmFtZSwgc3VwZXIuZ2V0RGVmYXVsdFZhbHVlKHByb3BlcnR5LCBlbnRpdHlPYmplY3RbcHJvcGVydHkubmFtZV0sIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiksIGpzb24uZW50aXR5T2JqZWN0LCBPYmplY3QuYXNzaWduKHt9LCBqc29uLmVudGl0eU9iamVjdCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudGl0eU9iamVjdFtwcm9wZXJ0eS5uYW1lXSA9PT0gdW5kZWZpbmVkICYmIHNhbml0aXplVmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5T2JqZWN0W3Byb3BlcnR5Lm5hbWVdID0gc2FuaXRpemVWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWxpZGF0b3JzID0gdGhpcy5hZGRGb3JtQ29udHJvbChwcm9wZXJ0eSwgcHJvcGVydHlWYWxpZGF0b3JzLCBhZGRpdGlvbmFsVmFsaWRhdGlvbnNbcHJvcGVydHkubmFtZV0sIGluc3RhbmNlQ29udGFpbmVyLCBlbnRpdHlPYmplY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFic3RyYWN0Q29udHJvbE9wdGlvbnM6IEFic3RyYWN0Q29udHJvbE9wdGlvbnMgPSB7IHZhbGlkYXRvcnM6IHZhbGlkYXRvcnMsIGFzeW5jVmFsaWRhdG9yczogdGhpcy5hZGRBc3luY1ZhbGlkYXRpb24ocHJvcGVydHksIHByb3BlcnR5VmFsaWRhdG9ycywgYWRkaXRpb25hbFZhbGlkYXRpb25zW3Byb3BlcnR5Lm5hbWVdKSB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9ucyA9IHRoaXMuZ2V0QWJzdHJhY3RDb250cm9sT3B0aW9ucyhwcm9wZXJ0eS5uYW1lLCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIGFic3RyYWN0Q29udHJvbE9wdGlvbnMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkudXBkYXRlT24gJiYgIWFic3RyYWN0Q29udHJvbE9wdGlvbnMudXBkYXRlT24pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9ucy51cGRhdGVPbiA9IHByb3BlcnR5LnVwZGF0ZU9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwT2JqZWN0W3Byb3BlcnR5Lm5hbWVdID0gbmV3IFJ4Rm9ybUNvbnRyb2woc2FuaXRpemVWYWx1ZSwgYWJzdHJhY3RDb250cm9sT3B0aW9ucywgW10sIGpzb24uZW50aXR5T2JqZWN0LCBPYmplY3QuYXNzaWduKHt9LCBqc29uLmVudGl0eU9iamVjdCksIHByb3BlcnR5Lm5hbWUsIGluc3RhbmNlQ29udGFpbmVyLnNhbml0aXplcnNbcHJvcGVydHkubmFtZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc05lc3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cE9iamVjdFtwcm9wZXJ0eS5uYW1lXSA9IHN1cGVyLmdldERlZmF1bHRWYWx1ZShwcm9wZXJ0eSwgZW50aXR5T2JqZWN0W3Byb3BlcnR5Lm5hbWVdLCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZFByb3BlcnRpZXNbcHJvcGVydHkubmFtZV0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIE9CSkVDVF9QUk9QRVJUWTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9iamVjdFZhbHVlID0gZW50aXR5T2JqZWN0W3Byb3BlcnR5Lm5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0VmFsdWUgJiYgb2JqZWN0VmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgIShvYmplY3RWYWx1ZSBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fCBvYmplY3RWYWx1ZSBpbnN0YW5jZW9mIFJ4Rm9ybUdyb3VwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc05lc3RlZEJpbmRpbmcgPSB0aGlzLmlzTmVzdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZUNvbnRhaW5lciAmJiBpbnN0YW5jZUNvbnRhaW5lci5jb25kaXRpb25hbE9iamVjdFByb3BzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uYWxPYmplY3RQcm9wcyA9IGluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMuZmlsdGVyKHQgPT4gdC5vYmplY3RQcm9wTmFtZSA9PSBwcm9wZXJ0eS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UgJiYgdGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbE9iamVjdFByb3BzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzID0gdGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbE9iamVjdFByb3BzLmZpbHRlcih0ID0+IHQub2JqZWN0UHJvcE5hbWUgPT0gcHJvcGVydHkubmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcGVydHkubmFtZV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0gdGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcGVydHkubmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2JqZWN0VmFsaWRhdGlvbkNvbmZpZyA9IHRoaXMuZ2V0VmFsaWRhdG9yQ29uZmlnKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgb2JqZWN0VmFsdWUsIGAke3Byb3BlcnR5Lm5hbWV9LmApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW50aXR5ID0gcHJvcGVydHkuZW50aXR5UHJvdmlkZXIgPyBwcm9wZXJ0eS5lbnRpdHlQcm92aWRlci5jYWxsKGVudGl0eU9iamVjdCkgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtR3JvdXBPYmplY3RbcHJvcGVydHkubmFtZV0gPSB0aGlzLmZvcm1Hcm91cChlbnRpdHkgfHwgcHJvcGVydHkuZW50aXR5IHx8IHRoaXMuZ2V0RW50aXR5KG9iamVjdFZhbHVlLCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIHByb3BlcnR5Lm5hbWUsIHRydWUpLCBvYmplY3RWYWx1ZSwgb2JqZWN0VmFsaWRhdGlvbkNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTmVzdGVkQmluZGluZyA9IHRoaXMuaXNOZXN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmplY3RWYWx1ZSBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fCBvYmplY3RWYWx1ZSBpbnN0YW5jZW9mIFJ4Rm9ybUdyb3VwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwT2JqZWN0W3Byb3BlcnR5Lm5hbWVdID0gb2JqZWN0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgQVJSQVlfUFJPUEVSVFk6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcnJheU9iamVjdFZhbHVlID0gZW50aXR5T2JqZWN0W3Byb3BlcnR5Lm5hbWVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlPYmplY3RWYWx1ZSAmJiBhcnJheU9iamVjdFZhbHVlIGluc3RhbmNlb2YgQXJyYXkgJiYgIShhcnJheU9iamVjdFZhbHVlIGluc3RhbmNlb2YgRm9ybUFycmF5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc05lc3RlZEJpbmRpbmcgPSB0aGlzLmlzTmVzdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmb3JtQXJyYXlHcm91cCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbnRpdHkgPSBwcm9wZXJ0eS5lbnRpdHlQcm92aWRlciA/IHByb3BlcnR5LmVudGl0eVByb3ZpZGVyLmNhbGwoZW50aXR5T2JqZWN0KSA6IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvYmplY3RWYWxpZGF0aW9uQ29uZmlnID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN1Yk9iamVjdCBvZiBhcnJheU9iamVjdFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlQ29udGFpbmVyICYmIGluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uYWxPYmplY3RQcm9wcyA9IGluc3RhbmNlQ29udGFpbmVyLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMuZmlsdGVyKHQgPT4gdC5vYmplY3RQcm9wTmFtZSA9PSBwcm9wZXJ0eS5uYW1lICYmIHQuYXJyYXlJbmRleCA9PSBpbmRleClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZSAmJiB0aGlzLmNvbmRpdGlvbmFsVmFsaWRhdGlvbkluc3RhbmNlLmNvbmRpdGlvbmFsT2JqZWN0UHJvcHMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzID0gdGhpcy5jb25kaXRpb25hbFZhbGlkYXRpb25JbnN0YW5jZS5jb25kaXRpb25hbE9iamVjdFByb3BzLmZpbHRlcih0ID0+IHQub2JqZWN0UHJvcE5hbWUgPT0gcHJvcGVydHkubmFtZSAmJiB0LmFycmF5SW5kZXggPT0gaW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvcm1Hcm91cFByb3BPdGhlclZhbGlkYXRvcltwcm9wZXJ0eS5uYW1lXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rm9ybUdyb3VwUHJvcE90aGVyVmFsaWRhdG9yID0gdGhpcy5mb3JtR3JvdXBQcm9wT3RoZXJWYWxpZGF0b3JbcHJvcGVydHkubmFtZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VmFsaWRhdGlvbkNvbmZpZyA9IHRoaXMuZ2V0VmFsaWRhdG9yQ29uZmlnKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgc3ViT2JqZWN0LCBgJHtwcm9wZXJ0eS5uYW1lfS5gLCBgJHtwcm9wZXJ0eS5uYW1lfVske2luZGV4fV0uYClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQXJyYXlHcm91cC5wdXNoKHRoaXMuZm9ybUdyb3VwKGVudGl0eSB8fCBwcm9wZXJ0eS5lbnRpdHkgfHwgdGhpcy5nZXRFbnRpdHkoc3ViT2JqZWN0LCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24sIHByb3BlcnR5Lm5hbWUsIHRydWUpLCBzdWJPYmplY3QsIG9iamVjdFZhbGlkYXRpb25Db25maWcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uYWxPYmplY3RQcm9wcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlckNvbmZpZ3VyYXRpb25Db25kaXRpb25hbE9iamVjdFByb3BzID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWJzdHJhY3RDb250cm9sT3B0aW9ucyA9IHRoaXMuZ2V0QWJzdHJhY3RDb250cm9sT3B0aW9ucyhwcm9wZXJ0eS5uYW1lLCBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24gLCB7IH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtR3JvdXBPYmplY3RbcHJvcGVydHkubmFtZV0gPSBuZXcgUnhGb3JtQXJyYXkoYXJyYXlPYmplY3RWYWx1ZSwgZm9ybUFycmF5R3JvdXAsIGFic3RyYWN0Q29udHJvbE9wdGlvbnMsIG51bGwsIHByb3BlcnR5LmFycmF5Q29uZmlnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWFjdGl2ZUZvcm1Db25maWcuYXV0b0luc3RhbmNlUHVzaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5T2JqZWN0VmFsdWUucHVzaCA9IChpbnN0YW5jZTogYW55W10pOiBudW1iZXIgPT4geyBsZXQgZm9ybUdyb3VwID0gdGhpcy5mb3JtR3JvdXAoaW5zdGFuY2UuY29uc3RydWN0b3IsIGluc3RhbmNlLCBvYmplY3RWYWxpZGF0aW9uQ29uZmlnKTsgZm9ybUdyb3VwT2JqZWN0W3Byb3BlcnR5Lm5hbWVdLnB1c2goZm9ybUdyb3VwLCB7IGlzQWRkZWRJbnN0YW5jZTogdHJ1ZSB9KTsgcmV0dXJuIDA7IH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlPYmplY3RWYWx1ZS5zcGxpY2UgPSAoc3RhcnQsIGRlbGV0ZUNvdW50KTogYW55W10gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kID0gKHN0YXJ0ICsgZGVsZXRlQ291bnQpIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtR3JvdXBPYmplY3RbcHJvcGVydHkubmFtZV0ucmVtb3ZlQXQoaSwgeyBpc1JlbW92ZWRJbnN0YW5jZTogdHJ1ZSB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc05lc3RlZEJpbmRpbmcgPSB0aGlzLmlzTmVzdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJyYXlPYmplY3RWYWx1ZSBpbnN0YW5jZW9mIEZvcm1BcnJheSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cE9iamVjdFtwcm9wZXJ0eS5uYW1lXSA9IGFycmF5T2JqZWN0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmFycmF5Q29uZmlnICYmIHByb3BlcnR5LmFycmF5Q29uZmlnLmNyZWF0ZUJsYW5rKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwT2JqZWN0W3Byb3BlcnR5Lm5hbWVdID0gbmV3IFJ4Rm9ybUFycmF5KFtdLCBbXSwgbnVsbCwgbnVsbCwgcHJvcGVydHkuYXJyYXlDb25maWcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTmVzdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZGl0aW9uYWxWYWxpZGF0aW9uSW5zdGFuY2UgPSB7fTtcclxuICAgICAgICAgICAgdGhpcy5idWlsZGVyQ29uZmlndXJhdGlvbkNvbmRpdGlvbmFsT2JqZWN0UHJvcHMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGFic3RyYWN0Q29udHJvbE9wdGlvbnM6IEFic3RyYWN0Q29udHJvbE9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtdLFxyXG4gICAgICAgICAgICBhc3luY1ZhbGlkYXRvcnM6IFtdLFxyXG4gICAgICAgICAgICB1cGRhdGVPbjogZm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uICYmIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5hYnN0cmFjdENvbnRyb2xPcHRpb25zICYmIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5hYnN0cmFjdENvbnRyb2xPcHRpb25zWydnbG9iYWwnXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5hYnN0cmFjdENvbnRyb2xPcHRpb25zWydnbG9iYWwnXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICBhYnN0cmFjdENvbnRyb2xPcHRpb25zID0gdGhpcy5nZXRBYnN0cmFjdENvbnRyb2xPcHRpb25zKFwiZ2xvYmFsXCIsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiwgYWJzdHJhY3RDb250cm9sT3B0aW9ucyk7XHJcbiAgICAgICAgbGV0IGZvcm1Hcm91cCA9IG5ldyBSeEZvcm1Hcm91cChqc29uLm1vZGVsLCBqc29uLmVudGl0eU9iamVjdCwgZm9ybUdyb3VwT2JqZWN0LCBhYnN0cmFjdENvbnRyb2xPcHRpb25zKTtcclxuICAgICAgICBpZiAoZGVmYXVsdENvbnRhaW5lci5pc0V4cGVyaW1lbnRhbCkge1xyXG4gICAgICAgICAgICBqc29uLmVudGl0eU9iamVjdFtcImZvcm1Hcm91cFwiXSA9IGZvcm1Hcm91cDtcclxuICAgICAgICAgICAgdGhpcy5vdmVycmlkZVByb3BlcnRpZXMoZm9ybUdyb3VwLCBqc29uLmVudGl0eU9iamVjdCwgZXh0ZW5kZWRQcm9wZXJ0aWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTmVzdGVkQmluZGluZyAmJiAhdGhpcy5pc0dyb3VwQ2FsbGVkKVxyXG4gICAgICAgICAgICBmb3JtR3JvdXAucmVmcmVzaERpc2FibGUoKTtcclxuICAgICAgICByZXR1cm4gZm9ybUdyb3VwO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG92ZXJyaWRlUHJvcGVydGllcyhmb3JtR3JvdXA6IFJ4Rm9ybUdyb3VwLCBlbnRpdHlPYmplY3Q6IGFueSwgcHJvcGVydGllczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0pIHtcclxuICAgICAgICBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5mb3JFYWNoKHQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm92ZXJyaWRlUHJvcChlbnRpdHlPYmplY3QsIHQsIGZvcm1Hcm91cCk7XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIHByaXZhdGUgZ2V0QWJzdHJhY3RDb250cm9sT3B0aW9ucyhuYW1lOiBzdHJpbmcsIGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbjogRm9ybUJ1aWxkZXJDb25maWd1cmF0aW9uLCBhYnN0cmFjdENvbnRyb2xPcHRpb25zOiBBYnN0cmFjdENvbnRyb2xPcHRpb25zKSB7XHJcbiAgICAgICAgaWYgKGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uYWJzdHJhY3RDb250cm9sT3B0aW9ucyAmJiBmb3JtQnVpbGRlckNvbmZpZ3VyYXRpb24uYWJzdHJhY3RDb250cm9sT3B0aW9uc1tuYW1lXSlcclxuICAgICAgICAgICAgYWJzdHJhY3RDb250cm9sT3B0aW9ucy51cGRhdGVPbiA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5hYnN0cmFjdENvbnRyb2xPcHRpb25zW25hbWVdO1xyXG5cclxuICAgICAgICBjb25zdCBjb250cm9sT3B0aW9ucyA9IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbiA/IGZvcm1CdWlsZGVyQ29uZmlndXJhdGlvbi5iYXNlQWJzdHJhY3RDb250cm9sT3B0aW9ucyA6IG51bGw7XHJcbiAgICAgICAgaWYgKGNvbnRyb2xPcHRpb25zICYmIGNvbnRyb2xPcHRpb25zW25hbWVdKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sT3B0aW9uc1tuYW1lXS51cGRhdGVPbilcclxuICAgICAgICAgICAgICAgIGFic3RyYWN0Q29udHJvbE9wdGlvbnMudXBkYXRlT24gPSBjb250cm9sT3B0aW9uc1tuYW1lXS51cGRhdGVPbjtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2xPcHRpb25zW25hbWVdLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRyb2xPcHRpb25zW25hbWVdLnZhbGlkYXRvcnMpKVxyXG4gICAgICAgICAgICAgICAgICAgICg8VmFsaWRhdG9yRm5bXT5jb250cm9sT3B0aW9uc1tuYW1lXS52YWxpZGF0b3JzKS5mb3JFYWNoKHZhbGlkYXRvciA9PiAoPFZhbGlkYXRvckZuW10+YWJzdHJhY3RDb250cm9sT3B0aW9ucy52YWxpZGF0b3JzKS5wdXNoKHZhbGlkYXRvcikpXHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgKDxWYWxpZGF0b3JGbltdPmFic3RyYWN0Q29udHJvbE9wdGlvbnMudmFsaWRhdG9ycykucHVzaCg8VmFsaWRhdG9yRm4+Y29udHJvbE9wdGlvbnNbbmFtZV0udmFsaWRhdG9ycyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb250cm9sT3B0aW9uc1tuYW1lXS5hc3luY1ZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbnRyb2xPcHRpb25zW25hbWVdLmFzeW5jVmFsaWRhdG9ycykpXHJcbiAgICAgICAgICAgICAgICAgICAgKDxWYWxpZGF0b3JGbltdPmNvbnRyb2xPcHRpb25zW25hbWVdLmFzeW5jVmFsaWRhdG9ycykuZm9yRWFjaCh2YWxpZGF0b3IgPT4gKDxWYWxpZGF0b3JGbltdPmFic3RyYWN0Q29udHJvbE9wdGlvbnMuYXN5bmNWYWxpZGF0b3JzKS5wdXNoKHZhbGlkYXRvcikpXHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgKDxWYWxpZGF0b3JGbltdPmFic3RyYWN0Q29udHJvbE9wdGlvbnMuYXN5bmNWYWxpZGF0b3JzKS5wdXNoKDxWYWxpZGF0b3JGbj5jb250cm9sT3B0aW9uc1tuYW1lXS52YWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYWJzdHJhY3RDb250cm9sT3B0aW9ucztcclxuICAgIH1cclxuICAgIHByaXZhdGUgb3ZlcnJpZGVQcm9wKGVudGl0eU9iamVjdDogYW55LCBwcm9wTmFtZTogc3RyaW5nLCBmb3JtR3JvdXA6IFJ4Rm9ybUdyb3VwKSB7XHJcbiAgICAgICAgbGV0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5nZXRQcm90b3R5cGVPZihlbnRpdHlPYmplY3QpLCBwcm9wTmFtZSk7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gZW50aXR5T2JqZWN0W3Byb3BOYW1lXTtcclxuICAgICAgICBsZXQgb2xkVmFsdWUgPSBudWxsO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbnRpdHlPYmplY3QsIHByb3BOYW1lLCB7XHJcbiAgICAgICAgICAgIGdldDogKCkgPT4geyByZXR1cm4gZGVzY3JpcHRvciA/IGRlc2NyaXB0b3IuZ2V0LmNhbGwoZW50aXR5T2JqZWN0KSA6IHZhbHVlIH0sXHJcbiAgICAgICAgICAgIHNldDogKHYpID0+IHtcclxuICAgICAgICAgICAgICAgIHZhbHVlID0gdjtcclxuICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSB2KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0LmNhbGwoZW50aXR5T2JqZWN0LCB2KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvcm1Hcm91cC5jaGFuZ2luZyAmJiBmb3JtR3JvdXAuY29udHJvbHNbcHJvcE5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cC5jb250cm9sc1twcm9wTmFtZV0uc2V0VmFsdWUodik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgb2xkVmFsdWUgPSB2O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxufVxyXG4iXX0=
|