@esfaenza/forms-and-validations 16.2.31 → 17.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/esm2022/esfaenza-forms-and-validations.mjs +4 -4
  2. package/esm2022/lib/forms/base-form-control.mjs +558 -558
  3. package/esm2022/lib/forms/form-adaptive/form-adaptive.component.loc.mjs +21 -21
  4. package/esm2022/lib/forms/form-adaptive/form-adaptive.component.mjs +420 -420
  5. package/esm2022/lib/forms/form-autocomplete/form-autocomplete.component.loc.mjs +20 -20
  6. package/esm2022/lib/forms/form-autocomplete/form-autocomplete.component.mjs +289 -289
  7. package/esm2022/lib/forms/form-checkbox/form-checkbox.component.mjs +74 -74
  8. package/esm2022/lib/forms/form-date/form-date.component.mjs +69 -69
  9. package/esm2022/lib/forms/form-datetime/form-datetime.component.mjs +67 -67
  10. package/esm2022/lib/forms/form-empty/form-empty.component.mjs +29 -29
  11. package/esm2022/lib/forms/form-error/form-error.component.mjs +41 -41
  12. package/esm2022/lib/forms/form-file/form-file.component.loc.mjs +21 -21
  13. package/esm2022/lib/forms/form-file/form-file.component.mjs +175 -175
  14. package/esm2022/lib/forms/form-info/form-info.component.mjs +41 -41
  15. package/esm2022/lib/forms/form-input/form-input.component.mjs +83 -83
  16. package/esm2022/lib/forms/form-multiselect/form-multiselect.component.loc.mjs +22 -22
  17. package/esm2022/lib/forms/form-multiselect/form-multiselect.component.mjs +163 -163
  18. package/esm2022/lib/forms/form-select/form-select.component.loc.mjs +20 -20
  19. package/esm2022/lib/forms/form-select/form-select.component.mjs +165 -165
  20. package/esm2022/lib/forms/form-template/form-template.component.mjs +76 -76
  21. package/esm2022/lib/forms/form-textarea/form-textarea.component.mjs +57 -57
  22. package/esm2022/lib/forms/form-time/form-time.component.mjs +115 -115
  23. package/esm2022/lib/forms-and-validations.module.mjs +199 -199
  24. package/esm2022/lib/models/AppFile.mjs +13 -13
  25. package/esm2022/lib/models/ChangeEvent.mjs +6 -6
  26. package/esm2022/lib/models/FormsAndValidationsModuleConfig.mjs +5 -5
  27. package/esm2022/lib/models/dayjs-adapter/dayjs-date-adapter.mjs +89 -89
  28. package/esm2022/lib/tokens.mjs +7 -7
  29. package/esm2022/lib/validations/base-validation.loc.mjs +22 -22
  30. package/esm2022/lib/validations/base-validation.mjs +328 -328
  31. package/esm2022/lib/validations/customValidators/CustomRequiredDirective.mjs +40 -40
  32. package/esm2022/lib/validations/validation-autocomplete/validation-autocomplete.component.mjs +147 -147
  33. package/esm2022/lib/validations/validation-autocomplete-multi/validation-autocomplete-multi.component.mjs +240 -240
  34. package/esm2022/lib/validations/validation-currency/validation-currency.component.mjs +75 -75
  35. package/esm2022/lib/validations/validation-date/validation-date.component.mjs +183 -183
  36. package/esm2022/lib/validations/validation-datetime/validation-datetime.component.mjs +212 -212
  37. package/esm2022/lib/validations/validation-input/validation-input.component.mjs +222 -222
  38. package/esm2022/lib/validations/validation-select/validation-select.component.mjs +183 -183
  39. package/esm2022/lib/validations/validation-text-area/validation-text-area.component.mjs +78 -78
  40. package/esm2022/public-api.mjs +39 -39
  41. package/fesm2022/esfaenza-forms-and-validations.mjs +4152 -4152
  42. package/fesm2022/esfaenza-forms-and-validations.mjs.map +1 -1
  43. package/index.d.ts +5 -5
  44. package/lib/forms/base-form-control.d.ts +276 -276
  45. package/lib/forms/form-adaptive/form-adaptive.component.d.ts +126 -126
  46. package/lib/forms/form-adaptive/form-adaptive.component.loc.d.ts +14 -14
  47. package/lib/forms/form-autocomplete/form-autocomplete.component.d.ts +84 -84
  48. package/lib/forms/form-autocomplete/form-autocomplete.component.loc.d.ts +14 -14
  49. package/lib/forms/form-checkbox/form-checkbox.component.d.ts +23 -23
  50. package/lib/forms/form-date/form-date.component.d.ts +21 -21
  51. package/lib/forms/form-datetime/form-datetime.component.d.ts +23 -23
  52. package/lib/forms/form-empty/form-empty.component.d.ts +15 -15
  53. package/lib/forms/form-error/form-error.component.d.ts +19 -19
  54. package/lib/forms/form-file/form-file.component.d.ts +46 -46
  55. package/lib/forms/form-file/form-file.component.loc.d.ts +14 -14
  56. package/lib/forms/form-info/form-info.component.d.ts +19 -19
  57. package/lib/forms/form-input/form-input.component.d.ts +33 -33
  58. package/lib/forms/form-multiselect/form-multiselect.component.d.ts +67 -67
  59. package/lib/forms/form-multiselect/form-multiselect.component.loc.d.ts +14 -14
  60. package/lib/forms/form-select/form-select.component.d.ts +43 -43
  61. package/lib/forms/form-select/form-select.component.loc.d.ts +14 -14
  62. package/lib/forms/form-template/form-template.component.d.ts +38 -38
  63. package/lib/forms/form-textarea/form-textarea.component.d.ts +18 -18
  64. package/lib/forms/form-time/form-time.component.d.ts +40 -40
  65. package/lib/forms-and-validations.module.d.ts +47 -47
  66. package/lib/models/AppFile.d.ts +21 -21
  67. package/lib/models/ChangeEvent.d.ts +5 -5
  68. package/lib/models/FormsAndValidationsModuleConfig.d.ts +11 -11
  69. package/lib/models/dayjs-adapter/dayjs-date-adapter.d.ts +49 -49
  70. package/lib/tokens.d.ts +7 -7
  71. package/lib/validations/base-validation.d.ts +219 -219
  72. package/lib/validations/base-validation.loc.d.ts +14 -14
  73. package/lib/validations/customValidators/CustomRequiredDirective.d.ts +24 -24
  74. package/lib/validations/validation-autocomplete/validation-autocomplete.component.d.ts +58 -58
  75. package/lib/validations/validation-autocomplete-multi/validation-autocomplete-multi.component.d.ts +88 -88
  76. package/lib/validations/validation-currency/validation-currency.component.d.ts +28 -28
  77. package/lib/validations/validation-date/validation-date.component.d.ts +79 -79
  78. package/lib/validations/validation-datetime/validation-datetime.component.d.ts +109 -109
  79. package/lib/validations/validation-input/validation-input.component.d.ts +134 -134
  80. package/lib/validations/validation-select/validation-select.component.d.ts +95 -95
  81. package/lib/validations/validation-text-area/validation-text-area.component.d.ts +28 -28
  82. package/package.json +13 -13
  83. package/public-api.d.ts +31 -31
@@ -1,183 +1,183 @@
1
- // Angular
2
- import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Inject, Input, Optional, Output, ViewEncapsulation } from "@angular/core";
3
- import { NG_ASYNC_VALIDATORS, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgControl } from "@angular/forms";
4
- // Configurazioni
5
- import { LocalizationService } from "@esfaenza/localizations";
6
- // Direttive, Componenti, Librerie
7
- import { BaseValidation } from '../base-validation';
8
- import { BaseValidationLoc } from '../base-validation.loc';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "@esfaenza/localizations";
11
- import * as i2 from "@angular/common";
12
- import * as i3 from "@angular/forms";
13
- import * as i4 from "@angular/material/legacy-form-field";
14
- import * as i5 from "@angular/material/legacy-input";
15
- import * as i6 from "ngx-bootstrap/tooltip";
16
- import * as i7 from "../customValidators/CustomRequiredDirective";
17
- /**
18
- * Componente di validaizone per gli input a selezione singola
19
- */
20
- export class ValidationSelectComponent extends BaseValidation {
21
- /**
22
- * @ignore
23
- */
24
- constructor(_validators, _asyncValidators, injector, cdr, lc) {
25
- super(cdr);
26
- this._validators = _validators;
27
- this._asyncValidators = _asyncValidators;
28
- this.injector = injector;
29
- this.lc = lc;
30
- /**
31
- * valore del campo vuoto della select
32
- */
33
- this.emptyFieldValue = "-2000";
34
- /**
35
- * Valore del placeholder
36
- */
37
- this.placeHolderValue = "-1000";
38
- /**
39
- * Per i componenti non obbligatori indica se fornire un "valore vuoto"
40
- */
41
- this.emptyValue = true;
42
- /**
43
- * Indica se mostrare o nascondere il simboletto di validazione (Tic verde o Croce rossa)
44
- */
45
- this.showValidationSymbol = true;
46
- /**
47
- * Contenuto della label Floattante Material-Style
48
- */
49
- this.label = "";
50
- /**
51
- * Evento richiamato quando si perde il focus sull'input di inserimento
52
- */
53
- this.onBlur = new EventEmitter();
54
- /**
55
- * @ignore
56
- */
57
- this.onTouched = () => { }; //placeholder on touched function
58
- }
59
- /**
60
- * @ignore
61
- */
62
- ngOnInit() {
63
- super.ngOnInit();
64
- this.registerFocusRequest();
65
- this.checkRequiredness(this._validators);
66
- }
67
- /**
68
- * @ignore
69
- */
70
- ngOnDestroy() {
71
- super.ngOnDestroy();
72
- this.deregisterFocusRequest();
73
- if (this.tooltipSubscription)
74
- this.tooltipSubscription.unsubscribe();
75
- }
76
- /**
77
- * @ignore
78
- */
79
- ngAfterViewInit() {
80
- this.postBinding();
81
- }
82
- /**
83
- * Metodo che si occupa di collegare i validatori e la funzione di reset dal **ControlValueAccessor** rappresentato
84
- * da questo componente al **ControlValueAccessor** rappresentato dall'effettivo elemento di Input presente lato HTML
85
- */
86
- postBinding() {
87
- // Eredito i validatori
88
- if (!this.noValidate) {
89
- this.baseInput.control.setAsyncValidators(this._asyncValidators);
90
- this.baseInput.control.setValidators(this._validators);
91
- }
92
- this.CheckValidity();
93
- const ngControl = this.injector.get(NgControl, null);
94
- if (ngControl) {
95
- this.parentControl = ngControl.control;
96
- // se la variabile novalidate è true, elimino tutti i validatori eventualmente inseriti
97
- if (this.noValidate) {
98
- this.parentControl.clearValidators();
99
- this.parentControl.clearAsyncValidators();
100
- }
101
- // faccio in modo che se chiamo il reset del controllo (o della form) dall'esterno si resetti anche il controllo nativo
102
- const origFunc = this.parentControl.reset;
103
- this.parentControl.reset = () => {
104
- origFunc.apply(this.parentControl);
105
- this.baseInput.control.reset();
106
- this.tooltip.hide();
107
- };
108
- }
109
- }
110
- /**
111
- * @ignore
112
- */
113
- writeValue(value) {
114
- this.value = value;
115
- this.propagateChange(value);
116
- this.cdr.markForCheck();
117
- }
118
- /**
119
- * L'emit della modifica al valore viene gestito su un evento custom (**inputChange**) come workaround al malfunzionamento dell'**ngModelChange** nativo
120
- *
121
- * @param {any} toEmit valore da propagare all'esterno
122
- */
123
- onModelChange(toEmit) {
124
- this.writeValue(toEmit);
125
- this.inputChange.emit(toEmit);
126
- this.onTouched();
127
- }
128
- /**
129
- * @ignore
130
- */
131
- registerOnChange(fn) {
132
- this.propagateChange = fn;
133
- }
134
- /**
135
- * @ignore
136
- */
137
- registerOnTouched(fn) {
138
- this.onTouched = fn;
139
- }
140
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ValidationSelectComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component }); }
141
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ValidationSelectComponent, selector: "val-select", inputs: { emptyFieldValue: "emptyFieldValue", placeHolderValue: "placeHolderValue", emptyValue: "emptyValue", showValidationSymbol: "showValidationSymbol", label: "label" }, outputs: { onBlur: "onBlur" }, providers: [
142
- { provide: LocalizationService, useClass: BaseValidationLoc },
143
- {
144
- provide: NG_VALUE_ACCESSOR,
145
- useExisting: forwardRef(() => ValidationSelectComponent),
146
- multi: true
147
- }
148
- ], usesInheritance: true, ngImport: i0, template: "<mat-form-field appearance=\"{{FieldAppearence}}\" class=\"mat-full-width mat-no-border-top mat-height-fixed\" [style.width.px]=\"widthPx\">\r\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\r\n <select matNativeControl\r\n #baseInput=\"ngModel\"\r\n #htmlInput\r\n name=\"val-select\"\r\n class=\"form-control\"\r\n triggers=\"\"\r\n placement=\"top\"\r\n id=\"{{id}}\"\r\n [customRequired]=\"required\"\r\n [CustomNullValues]=\"[placeHolderValue, emptyFieldValue]\"\r\n [(ngModel)]=\"value\"\r\n [tooltip]=\"tolTemplate\"\r\n [class.checking-combo]=\"!noValidate\"\r\n [class.app-option-placeholder]=\"baseInput.value === placeHolderValue\"\r\n [class.no-bg-img]=\"!showValidationSymbol\"\r\n [disabled]=\"Readonly\"\r\n (click)=\"onFocus($event)\"\r\n (focus)=\"checkTooltip();\"\r\n (blur)=\"closeTooltip(); onBlur.emit(true);\"\r\n (ngModelChange)=\"onModelChange($event); onFinalize()\">\r\n\r\n <option *ngIf=\"placeholder\" [value]=\"placeHolderValue\" disabled selected hidden>{{placeholder}}</option>\r\n <option *ngIf=\"required == false && emptyValue\" [value]=\"emptyFieldValue\"></option>\r\n <ng-content></ng-content>\r\n </select>\r\n</mat-form-field>\r\n\r\n<ng-template #tolTemplate>\r\n <div (click)=\"closeTooltip()\">\r\n <span>{{validationFailedBind}}</span>\r\n </div>\r\n</ng-template>", styles: [".tooltip-inner{background-color:#842a30;color:#fff;font-size:12px;width:max-content}.tooltip{margin:auto auto auto 20%!important}.tooltip-inner{background-color:#842a30!important;color:#fff}.tooltip.top .tooltip-arrow:before,.tooltip.top .tooltip-arrow{border-top-color:#842a30}.close-button{position:absolute;right:0;top:-.2em;float:right;font-size:16px;font-weight:700;color:inherit;text-shadow:0 1px 0 #fff;opacity:.5}.close-button:hover,.close-button:focus{text-decoration:none;cursor:pointer;opacity:.75}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i6.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i7.CustomRequiredDirective, selector: "[customRequired]", inputs: ["CustomNullValues", "customRequired"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
149
- }
150
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ValidationSelectComponent, decorators: [{
151
- type: Component,
152
- args: [{ selector: "val-select", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
153
- { provide: LocalizationService, useClass: BaseValidationLoc },
154
- {
155
- provide: NG_VALUE_ACCESSOR,
156
- useExisting: forwardRef(() => ValidationSelectComponent),
157
- multi: true
158
- }
159
- ], template: "<mat-form-field appearance=\"{{FieldAppearence}}\" class=\"mat-full-width mat-no-border-top mat-height-fixed\" [style.width.px]=\"widthPx\">\r\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\r\n <select matNativeControl\r\n #baseInput=\"ngModel\"\r\n #htmlInput\r\n name=\"val-select\"\r\n class=\"form-control\"\r\n triggers=\"\"\r\n placement=\"top\"\r\n id=\"{{id}}\"\r\n [customRequired]=\"required\"\r\n [CustomNullValues]=\"[placeHolderValue, emptyFieldValue]\"\r\n [(ngModel)]=\"value\"\r\n [tooltip]=\"tolTemplate\"\r\n [class.checking-combo]=\"!noValidate\"\r\n [class.app-option-placeholder]=\"baseInput.value === placeHolderValue\"\r\n [class.no-bg-img]=\"!showValidationSymbol\"\r\n [disabled]=\"Readonly\"\r\n (click)=\"onFocus($event)\"\r\n (focus)=\"checkTooltip();\"\r\n (blur)=\"closeTooltip(); onBlur.emit(true);\"\r\n (ngModelChange)=\"onModelChange($event); onFinalize()\">\r\n\r\n <option *ngIf=\"placeholder\" [value]=\"placeHolderValue\" disabled selected hidden>{{placeholder}}</option>\r\n <option *ngIf=\"required == false && emptyValue\" [value]=\"emptyFieldValue\"></option>\r\n <ng-content></ng-content>\r\n </select>\r\n</mat-form-field>\r\n\r\n<ng-template #tolTemplate>\r\n <div (click)=\"closeTooltip()\">\r\n <span>{{validationFailedBind}}</span>\r\n </div>\r\n</ng-template>", styles: [".tooltip-inner{background-color:#842a30;color:#fff;font-size:12px;width:max-content}.tooltip{margin:auto auto auto 20%!important}.tooltip-inner{background-color:#842a30!important;color:#fff}.tooltip.top .tooltip-arrow:before,.tooltip.top .tooltip-arrow{border-top-color:#842a30}.close-button{position:absolute;right:0;top:-.2em;float:right;font-size:16px;font-weight:700;color:inherit;text-shadow:0 1px 0 #fff;opacity:.5}.close-button:hover,.close-button:focus{text-decoration:none;cursor:pointer;opacity:.75}\n"] }]
160
- }], ctorParameters: function () { return [{ type: Array, decorators: [{
161
- type: Optional
162
- }, {
163
- type: Inject,
164
- args: [NG_VALIDATORS]
165
- }] }, { type: Array, decorators: [{
166
- type: Optional
167
- }, {
168
- type: Inject,
169
- args: [NG_ASYNC_VALIDATORS]
170
- }] }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }, { type: i1.LocalizationService }]; }, propDecorators: { emptyFieldValue: [{
171
- type: Input
172
- }], placeHolderValue: [{
173
- type: Input
174
- }], emptyValue: [{
175
- type: Input
176
- }], showValidationSymbol: [{
177
- type: Input
178
- }], label: [{
179
- type: Input
180
- }], onBlur: [{
181
- type: Output
182
- }] } });
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1zZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9saWIvdmFsaWRhdGlvbnMvdmFsaWRhdGlvbi1zZWxlY3QvdmFsaWRhdGlvbi1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9saWIvdmFsaWRhdGlvbnMvdmFsaWRhdGlvbi1zZWxlY3QvdmFsaWRhdGlvbi1zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFjLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFZLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFhLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JNLE9BQU8sRUFBNEMsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvSixpQkFBaUI7QUFDakIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFOUQsa0NBQWtDO0FBQ2xDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7O0FBSXpEOztHQUVHO0FBZ0JILE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxjQUFjO0lBK0N6RDs7T0FFRztJQUNILFlBQXVELFdBQXVCLEVBQW1ELGdCQUE0QixFQUFVLFFBQWtCLEVBQUUsR0FBc0IsRUFBWSxFQUF1QjtRQUNoUCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFEd0MsZ0JBQVcsR0FBWCxXQUFX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c0JBQS9CLEtBQUs7Z0JBS1UsVUFBVTtzQkFBekIsS0FBSztnQkFLVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBS1UsS0FBSztzQkFBcEIsS0FBSztnQkFLVyxNQUFNO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBJbmplY3QsIEluamVjdG9yLCBJbnB1dCwgT3B0aW9uYWwsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBVbnR5cGVkRm9ybUNvbnRyb2wsIE5HX0FTWU5DX1ZBTElEQVRPUlMsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBOZ0NvbnRyb2wsIFJlcXVpcmVkVmFsaWRhdG9yIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG4vLyBDb25maWd1cmF6aW9uaVxyXG5pbXBvcnQgeyBMb2NhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9sb2NhbGl6YXRpb25zXCI7XHJcblxyXG4vLyBEaXJldHRpdmUsIENvbXBvbmVudGksIExpYnJlcmllXHJcbmltcG9ydCB7QmFzZVZhbGlkYXRpb259IGZyb20gJy4uL2Jhc2UtdmFsaWRhdGlvbic7XHJcbmltcG9ydCB7QmFzZVZhbGlkYXRpb25Mb2N9IGZyb20gJy4uL2Jhc2UtdmFsaWRhdGlvbi5sb2MnO1xyXG5cclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbi8qKlxyXG4gKiBDb21wb25lbnRlIGRpIHZhbGlkYWl6b25lIHBlciBnbGkgaW5wdXQgYSBzZWxlemlvbmUgc2luZ29sYVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogXCJ2YWwtc2VsZWN0XCIsXHJcbiAgICB0ZW1wbGF0ZVVybDogXCJ2YWxpZGF0aW9uLXNlbGVjdC5jb21wb25lbnQuaHRtbFwiLFxyXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICAgIHN0eWxlVXJsczogW1wiLi4vdmFsaWRhdGlvbi1zdHlsZS5zY3NzXCJdLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICB7IHByb3ZpZGU6IExvY2FsaXphdGlvblNlcnZpY2UsIHVzZUNsYXNzOiBCYXNlVmFsaWRhdGlvbkxvYyB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFZhbGlkYXRpb25TZWxlY3RDb21wb25lbnQpLFxyXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25TZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBCYXNlVmFsaWRhdGlvbiBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiB2YWxvcmUgZGVsIGNhbXBvIHZ1b3RvIGRlbGxhIHNlbGVjdFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZW1wdHlGaWVsZFZhbHVlID0gXCItMjAwMFwiO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFZhbG9yZSBkZWwgcGxhY2Vob2xkZXJcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlSG9sZGVyVmFsdWUgPSBcIi0xMDAwXCI7XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogUGVyIGkgY29tcG9uZW50aSBub24gb2JibGlnYXRvcmkgaW5kaWNhIHNlIGZvcm5pcmUgdW4gXCJ2YWxvcmUgdnVvdG9cIlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZW1wdHlWYWx1ZSA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgbW9zdHJhcmUgbyBuYXNjb25kZXJlIGlsIHNpbWJvbGV0dG8gZGkgdmFsaWRhemlvbmUgKFRpYyB2ZXJkZSBvIENyb2NlIHJvc3NhKVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd1ZhbGlkYXRpb25TeW1ib2w6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udGVudXRvIGRlbGxhIGxhYmVsIEZsb2F0dGFudGUgTWF0ZXJpYWwtU3R5bGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGxhYmVsOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnRvIHJpY2hpYW1hdG8gcXVhbmRvIHNpIHBlcmRlIGlsIGZvY3VzIHN1bGwnaW5wdXQgZGkgaW5zZXJpbWVudG9cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkJsdXI6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRyb2xsbyBlc3Bvc3RvIG90dGVudXRvIHRyYW1pdGUgaW5qZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBhcmVudENvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbG9yZSBkZWwgbW9kZWxsbyByYXBwcmVzZW50YXRvIGRhbCBjb21wb25lbnRlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWx1ZTogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Vic2NyaXB0aW9uIGRlbCB0b290bHRpcCBkYSByaXB1bGlyZSBhbGxhIGRpc3RydXppb25lIGRlbCBjb21wb25lbnRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdG9vbHRpcFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZSBcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChOR19WQUxJREFUT1JTKSBwcml2YXRlIF92YWxpZGF0b3JzOiBBcnJheTxhbnk+LCBAT3B0aW9uYWwoKSBASW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMpIHByaXZhdGUgX2FzeW5jVmFsaWRhdG9yczogQXJyYXk8YW55PiwgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByb3RlY3RlZCBsYzogTG9jYWxpemF0aW9uU2VydmljZSkge1xyXG4gICAgICAgIHN1cGVyKGNkcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlIFxyXG4gICAgICovXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgICAgICB0aGlzLnJlZ2lzdGVyRm9jdXNSZXF1ZXN0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZG5lc3ModGhpcy5fdmFsaWRhdG9ycyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlIFxyXG4gICAgICovXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG5cclxuICAgICAgICB0aGlzLmRlcmVnaXN0ZXJGb2N1c1JlcXVlc3QoKTtcclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU3Vic2NyaXB0aW9uKSB0aGlzLnRvb2x0aXBTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmUgXHJcbiAgICAgKi9cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICB0aGlzLnBvc3RCaW5kaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gY2hlIHNpIG9jY3VwYSBkaSBjb2xsZWdhcmUgaSB2YWxpZGF0b3JpIGUgbGEgZnVuemlvbmUgZGkgcmVzZXQgZGFsICoqQ29udHJvbFZhbHVlQWNjZXNzb3IqKiByYXBwcmVzZW50YXRvIFxyXG4gICAgICogZGEgcXVlc3RvIGNvbXBvbmVudGUgYWwgKipDb250cm9sVmFsdWVBY2Nlc3NvcioqIHJhcHByZXNlbnRhdG8gZGFsbCdlZmZldHRpdm8gZWxlbWVudG8gZGkgSW5wdXQgcHJlc2VudGUgbGF0byBIVE1MXHJcbiAgICAgKi9cclxuICAgIHBvc3RCaW5kaW5nKCkge1xyXG4gICAgICAgIC8vIEVyZWRpdG8gaSB2YWxpZGF0b3JpXHJcbiAgICAgICAgaWYgKCF0aGlzLm5vVmFsaWRhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5iYXNlSW5wdXQuY29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5fYXN5bmNWYWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgdGhpcy5iYXNlSW5wdXQuY29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5DaGVja1ZhbGlkaXR5KCk7XHJcbiAgICAgICAgY29uc3QgbmdDb250cm9sOiBOZ0NvbnRyb2wgPSB0aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wsIG51bGwpO1xyXG4gICAgICAgIGlmIChuZ0NvbnRyb2wpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnRDb250cm9sID0gbmdDb250cm9sLmNvbnRyb2wgYXMgVW50eXBlZEZvcm1Db250cm9sO1xyXG5cclxuICAgICAgICAgICAgLy8gc2UgbGEgdmFyaWFiaWxlIG5vdmFsaWRhdGUgw6ggdHJ1ZSwgZWxpbWlubyB0dXR0aSBpIHZhbGlkYXRvcmkgZXZlbnR1YWxtZW50ZSBpbnNlcml0aVxyXG4gICAgICAgICAgICBpZiAodGhpcy5ub1ZhbGlkYXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENvbnRyb2wuY2xlYXJBc3luY1ZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gZmFjY2lvIGluIG1vZG8gY2hlIHNlIGNoaWFtbyBpbCByZXNldCBkZWwgY29udHJvbGxvIChvIGRlbGxhIGZvcm0pIGRhbGwnZXN0ZXJubyBzaSByZXNldHRpIGFuY2hlIGlsIGNvbnRyb2xsbyBuYXRpdm9cclxuICAgICAgICAgICAgY29uc3Qgb3JpZ0Z1bmMgPSB0aGlzLnBhcmVudENvbnRyb2wucmVzZXQ7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50Q29udHJvbC5yZXNldCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9yaWdGdW5jLmFwcGx5KHRoaXMucGFyZW50Q29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhc2VJbnB1dC5jb250cm9sLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmUgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25Ub3VjaGVkID0gKCkgPT4geyB9OyAvL3BsYWNlaG9sZGVyIG9uIHRvdWNoZWQgZnVuY3Rpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmUgXHJcbiAgICAgKi9cclxuICAgIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMJ2VtaXQgZGVsbGEgbW9kaWZpY2EgYWwgdmFsb3JlIHZpZW5lIGdlc3RpdG8gc3UgdW4gZXZlbnRvIGN1c3RvbSAoKippbnB1dENoYW5nZSoqKSBjb21lIHdvcmthcm91bmQgYWwgbWFsZnVuemlvbmFtZW50byBkZWxsJyoqbmdNb2RlbENoYW5nZSoqIG5hdGl2b1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gdG9FbWl0IHZhbG9yZSBkYSBwcm9wYWdhcmUgYWxsJ2VzdGVybm9cclxuICAgICAqL1xyXG4gICAgb25Nb2RlbENoYW5nZSh0b0VtaXQpIHtcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWUodG9FbWl0KTtcclxuICAgICAgICB0aGlzLmlucHV0Q2hhbmdlLmVtaXQodG9FbWl0KTtcclxuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZSBcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmUgXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gICAgfVxyXG59IiwiPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJ7e0ZpZWxkQXBwZWFyZW5jZX19XCIgY2xhc3M9XCJtYXQtZnVsbC13aWR0aCBtYXQtbm8tYm9yZGVyLXRvcCBtYXQtaGVpZ2h0LWZpeGVkXCIgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoUHhcIj5cclxuICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJsYWJlbFwiPnt7bGFiZWx9fTwvbWF0LWxhYmVsPlxyXG4gICAgPHNlbGVjdCBtYXROYXRpdmVDb250cm9sXHJcbiAgICAgICAgICAgICNiYXNlSW5wdXQ9XCJuZ01vZGVsXCJcclxuICAgICAgICAgICAgI2h0bWxJbnB1dFxyXG4gICAgICAgICAgICBuYW1lPVwidmFsLXNlbGVjdFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgdHJpZ2dlcnM9XCJcIlxyXG4gICAgICAgICAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxyXG4gICAgICAgICAgICBpZD1cInt7aWR9fVwiXHJcbiAgICAgICAgICAgIFtjdXN0b21SZXF1aXJlZF09XCJyZXF1aXJlZFwiXHJcbiAgICAgICAgICAgIFtDdXN0b21OdWxsVmFsdWVzXT1cIltwbGFjZUhvbGRlclZhbHVlLCBlbXB0eUZpZWxkVmFsdWVdXCJcclxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgIFt0b29sdGlwXT1cInRvbFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgW2NsYXNzLmNoZWNraW5nLWNvbWJvXT1cIiFub1ZhbGlkYXRlXCJcclxuICAgICAgICAgICAgW2NsYXNzLmFwcC1vcHRpb24tcGxhY2Vob2xkZXJdPVwiYmFzZUlucHV0LnZhbHVlID09PSBwbGFjZUhvbGRlclZhbHVlXCJcclxuICAgICAgICAgICAgW2NsYXNzLm5vLWJnLWltZ109XCIhc2hvd1ZhbGlkYXRpb25TeW1ib2xcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiUmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25Gb2N1cygkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGZvY3VzKT1cImNoZWNrVG9vbHRpcCgpO1wiXHJcbiAgICAgICAgICAgIChibHVyKT1cImNsb3NlVG9vbHRpcCgpOyBvbkJsdXIuZW1pdCh0cnVlKTtcIlxyXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk1vZGVsQ2hhbmdlKCRldmVudCk7IG9uRmluYWxpemUoKVwiPlxyXG5cclxuICAgICAgICA8b3B0aW9uICpuZ0lmPVwicGxhY2Vob2xkZXJcIiBbdmFsdWVdPVwicGxhY2VIb2xkZXJWYWx1ZVwiIGRpc2FibGVkIHNlbGVjdGVkIGhpZGRlbj57e3BsYWNlaG9sZGVyfX08L29wdGlvbj5cclxuICAgICAgICA8b3B0aW9uICpuZ0lmPVwicmVxdWlyZWQgPT0gZmFsc2UgJiYgZW1wdHlWYWx1ZVwiIFt2YWx1ZV09XCJlbXB0eUZpZWxkVmFsdWVcIj48L29wdGlvbj5cclxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICA8L3NlbGVjdD5cclxuPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdG9sVGVtcGxhdGU+XHJcbiAgICA8ZGl2IChjbGljayk9XCJjbG9zZVRvb2x0aXAoKVwiPlxyXG4gICAgICAgIDxzcGFuPnt7dmFsaWRhdGlvbkZhaWxlZEJpbmR9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
1
+ // Angular
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Inject, Input, Optional, Output, ViewEncapsulation } from "@angular/core";
3
+ import { NG_ASYNC_VALIDATORS, NG_VALIDATORS, NG_VALUE_ACCESSOR, NgControl } from "@angular/forms";
4
+ // Configurazioni
5
+ import { LocalizationService } from "@esfaenza/localizations";
6
+ // Direttive, Componenti, Librerie
7
+ import { BaseValidation } from '../base-validation';
8
+ import { BaseValidationLoc } from '../base-validation.loc';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@esfaenza/localizations";
11
+ import * as i2 from "@angular/common";
12
+ import * as i3 from "@angular/forms";
13
+ import * as i4 from "@angular/material/legacy-form-field";
14
+ import * as i5 from "@angular/material/legacy-input";
15
+ import * as i6 from "ngx-bootstrap/tooltip";
16
+ import * as i7 from "../customValidators/CustomRequiredDirective";
17
+ /**
18
+ * Componente di validaizone per gli input a selezione singola
19
+ */
20
+ export class ValidationSelectComponent extends BaseValidation {
21
+ /**
22
+ * @ignore
23
+ */
24
+ constructor(_validators, _asyncValidators, injector, cdr, lc) {
25
+ super(cdr);
26
+ this._validators = _validators;
27
+ this._asyncValidators = _asyncValidators;
28
+ this.injector = injector;
29
+ this.lc = lc;
30
+ /**
31
+ * valore del campo vuoto della select
32
+ */
33
+ this.emptyFieldValue = "-2000";
34
+ /**
35
+ * Valore del placeholder
36
+ */
37
+ this.placeHolderValue = "-1000";
38
+ /**
39
+ * Per i componenti non obbligatori indica se fornire un "valore vuoto"
40
+ */
41
+ this.emptyValue = true;
42
+ /**
43
+ * Indica se mostrare o nascondere il simboletto di validazione (Tic verde o Croce rossa)
44
+ */
45
+ this.showValidationSymbol = true;
46
+ /**
47
+ * Contenuto della label Floattante Material-Style
48
+ */
49
+ this.label = "";
50
+ /**
51
+ * Evento richiamato quando si perde il focus sull'input di inserimento
52
+ */
53
+ this.onBlur = new EventEmitter();
54
+ /**
55
+ * @ignore
56
+ */
57
+ this.onTouched = () => { }; //placeholder on touched function
58
+ }
59
+ /**
60
+ * @ignore
61
+ */
62
+ ngOnInit() {
63
+ super.ngOnInit();
64
+ this.registerFocusRequest();
65
+ this.checkRequiredness(this._validators);
66
+ }
67
+ /**
68
+ * @ignore
69
+ */
70
+ ngOnDestroy() {
71
+ super.ngOnDestroy();
72
+ this.deregisterFocusRequest();
73
+ if (this.tooltipSubscription)
74
+ this.tooltipSubscription.unsubscribe();
75
+ }
76
+ /**
77
+ * @ignore
78
+ */
79
+ ngAfterViewInit() {
80
+ this.postBinding();
81
+ }
82
+ /**
83
+ * Metodo che si occupa di collegare i validatori e la funzione di reset dal **ControlValueAccessor** rappresentato
84
+ * da questo componente al **ControlValueAccessor** rappresentato dall'effettivo elemento di Input presente lato HTML
85
+ */
86
+ postBinding() {
87
+ // Eredito i validatori
88
+ if (!this.noValidate) {
89
+ this.baseInput.control.setAsyncValidators(this._asyncValidators);
90
+ this.baseInput.control.setValidators(this._validators);
91
+ }
92
+ this.CheckValidity();
93
+ const ngControl = this.injector.get(NgControl, null);
94
+ if (ngControl) {
95
+ this.parentControl = ngControl.control;
96
+ // se la variabile novalidate è true, elimino tutti i validatori eventualmente inseriti
97
+ if (this.noValidate) {
98
+ this.parentControl.clearValidators();
99
+ this.parentControl.clearAsyncValidators();
100
+ }
101
+ // faccio in modo che se chiamo il reset del controllo (o della form) dall'esterno si resetti anche il controllo nativo
102
+ const origFunc = this.parentControl.reset;
103
+ this.parentControl.reset = () => {
104
+ origFunc.apply(this.parentControl);
105
+ this.baseInput.control.reset();
106
+ this.tooltip.hide();
107
+ };
108
+ }
109
+ }
110
+ /**
111
+ * @ignore
112
+ */
113
+ writeValue(value) {
114
+ this.value = value;
115
+ this.propagateChange(value);
116
+ this.cdr.markForCheck();
117
+ }
118
+ /**
119
+ * L'emit della modifica al valore viene gestito su un evento custom (**inputChange**) come workaround al malfunzionamento dell'**ngModelChange** nativo
120
+ *
121
+ * @param {any} toEmit valore da propagare all'esterno
122
+ */
123
+ onModelChange(toEmit) {
124
+ this.writeValue(toEmit);
125
+ this.inputChange.emit(toEmit);
126
+ this.onTouched();
127
+ }
128
+ /**
129
+ * @ignore
130
+ */
131
+ registerOnChange(fn) {
132
+ this.propagateChange = fn;
133
+ }
134
+ /**
135
+ * @ignore
136
+ */
137
+ registerOnTouched(fn) {
138
+ this.onTouched = fn;
139
+ }
140
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ValidationSelectComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component }); }
141
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ValidationSelectComponent, selector: "val-select", inputs: { emptyFieldValue: "emptyFieldValue", placeHolderValue: "placeHolderValue", emptyValue: "emptyValue", showValidationSymbol: "showValidationSymbol", label: "label" }, outputs: { onBlur: "onBlur" }, providers: [
142
+ { provide: LocalizationService, useClass: BaseValidationLoc },
143
+ {
144
+ provide: NG_VALUE_ACCESSOR,
145
+ useExisting: forwardRef(() => ValidationSelectComponent),
146
+ multi: true
147
+ }
148
+ ], usesInheritance: true, ngImport: i0, template: "<mat-form-field appearance=\"{{FieldAppearence}}\" class=\"mat-full-width mat-no-border-top mat-height-fixed\" [style.width.px]=\"widthPx\">\r\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\r\n <select matNativeControl\r\n #baseInput=\"ngModel\"\r\n #htmlInput\r\n name=\"val-select\"\r\n class=\"form-control\"\r\n triggers=\"\"\r\n placement=\"top\"\r\n id=\"{{id}}\"\r\n [customRequired]=\"required\"\r\n [CustomNullValues]=\"[placeHolderValue, emptyFieldValue]\"\r\n [(ngModel)]=\"value\"\r\n [tooltip]=\"tolTemplate\"\r\n [class.checking-combo]=\"!noValidate\"\r\n [class.app-option-placeholder]=\"baseInput.value === placeHolderValue\"\r\n [class.no-bg-img]=\"!showValidationSymbol\"\r\n [disabled]=\"Readonly\"\r\n (click)=\"onFocus($event)\"\r\n (focus)=\"checkTooltip();\"\r\n (blur)=\"closeTooltip(); onBlur.emit(true);\"\r\n (ngModelChange)=\"onModelChange($event); onFinalize()\">\r\n\r\n <option *ngIf=\"placeholder\" [value]=\"placeHolderValue\" disabled selected hidden>{{placeholder}}</option>\r\n <option *ngIf=\"required == false && emptyValue\" [value]=\"emptyFieldValue\"></option>\r\n <ng-content></ng-content>\r\n </select>\r\n</mat-form-field>\r\n\r\n<ng-template #tolTemplate>\r\n <div (click)=\"closeTooltip()\">\r\n <span>{{validationFailedBind}}</span>\r\n </div>\r\n</ng-template>", styles: [".tooltip-inner{background-color:#842a30;color:#fff;font-size:12px;width:max-content}.tooltip{margin:auto auto auto 20%!important}.tooltip-inner{background-color:#842a30!important;color:#fff}.tooltip.top .tooltip-arrow:before,.tooltip.top .tooltip-arrow{border-top-color:#842a30}.close-button{position:absolute;right:0;top:-.2em;float:right;font-size:16px;font-weight:700;color:inherit;text-shadow:0 1px 0 #fff;opacity:.5}.close-button:hover,.close-button:focus{text-decoration:none;cursor:pointer;opacity:.75}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i6.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i7.CustomRequiredDirective, selector: "[customRequired]", inputs: ["CustomNullValues", "customRequired"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
149
+ }
150
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ValidationSelectComponent, decorators: [{
151
+ type: Component,
152
+ args: [{ selector: "val-select", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
153
+ { provide: LocalizationService, useClass: BaseValidationLoc },
154
+ {
155
+ provide: NG_VALUE_ACCESSOR,
156
+ useExisting: forwardRef(() => ValidationSelectComponent),
157
+ multi: true
158
+ }
159
+ ], template: "<mat-form-field appearance=\"{{FieldAppearence}}\" class=\"mat-full-width mat-no-border-top mat-height-fixed\" [style.width.px]=\"widthPx\">\r\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\r\n <select matNativeControl\r\n #baseInput=\"ngModel\"\r\n #htmlInput\r\n name=\"val-select\"\r\n class=\"form-control\"\r\n triggers=\"\"\r\n placement=\"top\"\r\n id=\"{{id}}\"\r\n [customRequired]=\"required\"\r\n [CustomNullValues]=\"[placeHolderValue, emptyFieldValue]\"\r\n [(ngModel)]=\"value\"\r\n [tooltip]=\"tolTemplate\"\r\n [class.checking-combo]=\"!noValidate\"\r\n [class.app-option-placeholder]=\"baseInput.value === placeHolderValue\"\r\n [class.no-bg-img]=\"!showValidationSymbol\"\r\n [disabled]=\"Readonly\"\r\n (click)=\"onFocus($event)\"\r\n (focus)=\"checkTooltip();\"\r\n (blur)=\"closeTooltip(); onBlur.emit(true);\"\r\n (ngModelChange)=\"onModelChange($event); onFinalize()\">\r\n\r\n <option *ngIf=\"placeholder\" [value]=\"placeHolderValue\" disabled selected hidden>{{placeholder}}</option>\r\n <option *ngIf=\"required == false && emptyValue\" [value]=\"emptyFieldValue\"></option>\r\n <ng-content></ng-content>\r\n </select>\r\n</mat-form-field>\r\n\r\n<ng-template #tolTemplate>\r\n <div (click)=\"closeTooltip()\">\r\n <span>{{validationFailedBind}}</span>\r\n </div>\r\n</ng-template>", styles: [".tooltip-inner{background-color:#842a30;color:#fff;font-size:12px;width:max-content}.tooltip{margin:auto auto auto 20%!important}.tooltip-inner{background-color:#842a30!important;color:#fff}.tooltip.top .tooltip-arrow:before,.tooltip.top .tooltip-arrow{border-top-color:#842a30}.close-button{position:absolute;right:0;top:-.2em;float:right;font-size:16px;font-weight:700;color:inherit;text-shadow:0 1px 0 #fff;opacity:.5}.close-button:hover,.close-button:focus{text-decoration:none;cursor:pointer;opacity:.75}\n"] }]
160
+ }], ctorParameters: () => [{ type: Array, decorators: [{
161
+ type: Optional
162
+ }, {
163
+ type: Inject,
164
+ args: [NG_VALIDATORS]
165
+ }] }, { type: Array, decorators: [{
166
+ type: Optional
167
+ }, {
168
+ type: Inject,
169
+ args: [NG_ASYNC_VALIDATORS]
170
+ }] }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }, { type: i1.LocalizationService }], propDecorators: { emptyFieldValue: [{
171
+ type: Input
172
+ }], placeHolderValue: [{
173
+ type: Input
174
+ }], emptyValue: [{
175
+ type: Input
176
+ }], showValidationSymbol: [{
177
+ type: Input
178
+ }], label: [{
179
+ type: Input
180
+ }], onBlur: [{
181
+ type: Output
182
+ }] } });
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1zZWxlY3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9saWIvdmFsaWRhdGlvbnMvdmFsaWRhdGlvbi1zZWxlY3QvdmFsaWRhdGlvbi1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9saWIvdmFsaWRhdGlvbnMvdmFsaWRhdGlvbi1zZWxlY3QvdmFsaWRhdGlvbi1zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFjLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFZLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFhLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JNLE9BQU8sRUFBNEMsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvSixpQkFBaUI7QUFDakIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFOUQsa0NBQWtDO0FBQ2xDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7O0FBSXpEOztHQUVHO0FBZ0JILE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxjQUFjO0lBK0N6RDs7T0FFRztJQUNILFlBQXVELFdBQXVCLEVBQW1ELGdCQUE0QixFQUFVLFFBQWtCLEVBQUUsR0FBc0IsRUFBWSxFQUF1QjtRQUNoUCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFEd0MsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFBbUQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFZO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFvQyxPQUFFLEdBQUYsRUFBRSxDQUFxQjtRQWhEcFA7O1dBRUc7UUFDYSxvQkFBZSxHQUFHLE9BQU8sQ0FBQztRQUUxQzs7V0FFRztRQUNhLHFCQUFnQixHQUFHLE9BQU8sQ0FBQztRQUUzQzs7V0FFRztRQUNhLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFFbEM7O1dBRUc7UUFDYSx5QkFBb0IsR0FBWSxJQUFJLENBQUM7UUFFckQ7O1dBRUc7UUFDYSxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBRW5DOztXQUVHO1FBQ2MsV0FBTSxHQUEwQixJQUFJLFlBQVksRUFBVyxDQUFDO1FBb0Y3RTs7V0FFRztRQUNLLGNBQVMsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7SUFqRWhFLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVE7UUFDSixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFakIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFNUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1AsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRXBCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLG1CQUFtQjtZQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ1gsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXO1FBQ1AsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sU0FBUyxHQUFjLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoRSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUMsT0FBNkIsQ0FBQztZQUU3RCx1RkFBdUY7WUFDdkYsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM5QyxDQUFDO1lBRUQsdUhBQXVIO1lBQ3ZILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1lBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEdBQUcsRUFBRTtnQkFDNUIsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hCLENBQUMsQ0FBQztRQUNOLENBQUM7SUFDTCxDQUFDO0lBT0Q7O09BRUc7SUFDSCxVQUFVLENBQUMsS0FBVTtRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxhQUFhLENBQUMsTUFBTTtRQUNoQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3BCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNILGlCQUFpQixDQUFDLEVBQU87UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDeEIsQ0FBQzsrR0F2SlEseUJBQXlCLGtCQWtERixhQUFhLDZCQUF1RCxtQkFBbUI7bUdBbEQ5Ryx5QkFBeUIsa1BBVHZCO1lBQ1AsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFO1lBQzdEO2dCQUNJLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMseUJBQXlCLENBQUM7Z0JBQ3hELEtBQUssRUFBRSxJQUFJO2FBQ2Q7U0FDSixpREM3QkwsOGhEQWlDYzs7NEZERkQseUJBQXlCO2tCQWZyQyxTQUFTOytCQUNJLFlBQVksaUJBRVAsaUJBQWlCLENBQUMsSUFBSSxtQkFFcEIsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDUCxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUU7d0JBQzdEOzRCQUNJLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDBCQUEwQixDQUFDOzRCQUN4RCxLQUFLLEVBQUUsSUFBSTt5QkFDZDtxQkFDSjs7MEJBb0RZLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsYUFBYTs7MEJBQW9DLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsbUJBQW1CO2tJQTdDdkcsZUFBZTtzQkFBOUIsS0FBSztnQkFLVSxnQkFBZ0I7c0JBQS9CLEtBQUs7Z0JBS1UsVUFBVTtzQkFBekIsS0FBSztnQkFLVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBS1UsS0FBSztzQkFBcEIsS0FBSztnQkFLVyxNQUFNO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBJbmplY3QsIEluamVjdG9yLCBJbnB1dCwgT3B0aW9uYWwsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBVbnR5cGVkRm9ybUNvbnRyb2wsIE5HX0FTWU5DX1ZBTElEQVRPUlMsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBOZ0NvbnRyb2wsIFJlcXVpcmVkVmFsaWRhdG9yIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG4vLyBDb25maWd1cmF6aW9uaVxyXG5pbXBvcnQgeyBMb2NhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9sb2NhbGl6YXRpb25zXCI7XHJcblxyXG4vLyBEaXJldHRpdmUsIENvbXBvbmVudGksIExpYnJlcmllXHJcbmltcG9ydCB7QmFzZVZhbGlkYXRpb259IGZyb20gJy4uL2Jhc2UtdmFsaWRhdGlvbic7XHJcbmltcG9ydCB7QmFzZVZhbGlkYXRpb25Mb2N9IGZyb20gJy4uL2Jhc2UtdmFsaWRhdGlvbi5sb2MnO1xyXG5cclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbi8qKlxyXG4gKiBDb21wb25lbnRlIGRpIHZhbGlkYWl6b25lIHBlciBnbGkgaW5wdXQgYSBzZWxlemlvbmUgc2luZ29sYVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogXCJ2YWwtc2VsZWN0XCIsXHJcbiAgICB0ZW1wbGF0ZVVybDogXCJ2YWxpZGF0aW9uLXNlbGVjdC5jb21wb25lbnQuaHRtbFwiLFxyXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICAgIHN0eWxlVXJsczogW1wiLi4vdmFsaWRhdGlvbi1zdHlsZS5zY3NzXCJdLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICB7IHByb3ZpZGU6IExvY2FsaXphdGlvblNlcnZpY2UsIHVzZUNsYXNzOiBCYXNlVmFsaWRhdGlvbkxvYyB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFZhbGlkYXRpb25TZWxlY3RDb21wb25lbnQpLFxyXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25TZWxlY3RDb21wb25lbnQgZXh0ZW5kcyBCYXNlVmFsaWRhdGlvbiBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiB2YWxvcmUgZGVsIGNhbXBvIHZ1b3RvIGRlbGxhIHNlbGVjdFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZW1wdHlGaWVsZFZhbHVlID0gXCItMjAwMFwiO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFZhbG9yZSBkZWwgcGxhY2Vob2xkZXJcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlSG9sZGVyVmFsdWUgPSBcIi0xMDAwXCI7XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogUGVyIGkgY29tcG9uZW50aSBub24gb2JibGlnYXRvcmkgaW5kaWNhIHNlIGZvcm5pcmUgdW4gXCJ2YWxvcmUgdnVvdG9cIlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZW1wdHlWYWx1ZSA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgbW9zdHJhcmUgbyBuYXNjb25kZXJlIGlsIHNpbWJvbGV0dG8gZGkgdmFsaWRhemlvbmUgKFRpYyB2ZXJkZSBvIENyb2NlIHJvc3NhKVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd1ZhbGlkYXRpb25TeW1ib2w6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29udGVudXRvIGRlbGxhIGxhYmVsIEZsb2F0dGFudGUgTWF0ZXJpYWwtU3R5bGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGxhYmVsOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnRvIHJpY2hpYW1hdG8gcXVhbmRvIHNpIHBlcmRlIGlsIGZvY3VzIHN1bGwnaW5wdXQgZGkgaW5zZXJpbWVudG9cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkJsdXI6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRyb2xsbyBlc3Bvc3RvIG90dGVudXRvIHRyYW1pdGUgaW5qZWN0b3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBhcmVudENvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbG9yZSBkZWwgbW9kZWxsbyByYXBwcmVzZW50YXRvIGRhbCBjb21wb25lbnRlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB2YWx1ZTogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Vic2NyaXB0aW9uIGRlbCB0b290bHRpcCBkYSByaXB1bGlyZSBhbGxhIGRpc3RydXppb25lIGRlbCBjb21wb25lbnRlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdG9vbHRpcFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZSBcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChOR19WQUxJREFUT1JTKSBwcml2YXRlIF92YWxpZGF0b3JzOiBBcnJheTxhbnk+LCBAT3B0aW9uYWwoKSBASW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMpIHByaXZhdGUgX2FzeW5jVmFsaWRhdG9yczogQXJyYXk8YW55PiwgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByb3RlY3RlZCBsYzogTG9jYWxpemF0aW9uU2VydmljZSkge1xyXG4gICAgICAgIHN1cGVyKGNkcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlIFxyXG4gICAgICovXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgICAgICB0aGlzLnJlZ2lzdGVyRm9jdXNSZXF1ZXN0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZG5lc3ModGhpcy5fdmFsaWRhdG9ycyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlIFxyXG4gICAgICovXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG5cclxuICAgICAgICB0aGlzLmRlcmVnaXN0ZXJGb2N1c1JlcXVlc3QoKTtcclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU3Vic2NyaXB0aW9uKSB0aGlzLnRvb2x0aXBTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmUgXHJcbiAgICAgKi9cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICB0aGlzLnBvc3RCaW5kaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gY2hlIHNpIG9jY3VwYSBkaSBjb2xsZWdhcmUgaSB2YWxpZGF0b3JpIGUgbGEgZnVuemlvbmUgZGkgcmVzZXQgZGFsICoqQ29udHJvbFZhbHVlQWNjZXNzb3IqKiByYXBwcmVzZW50YXRvIFxyXG4gICAgICogZGEgcXVlc3RvIGNvbXBvbmVudGUgYWwgKipDb250cm9sVmFsdWVBY2Nlc3NvcioqIHJhcHByZXNlbnRhdG8gZGFsbCdlZmZldHRpdm8gZWxlbWVudG8gZGkgSW5wdXQgcHJlc2VudGUgbGF0byBIVE1MXHJcbiAgICAgKi9cclxuICAgIHBvc3RCaW5kaW5nKCkge1xyXG4gICAgICAgIC8vIEVyZWRpdG8gaSB2YWxpZGF0b3JpXHJcbiAgICAgICAgaWYgKCF0aGlzLm5vVmFsaWRhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5iYXNlSW5wdXQuY29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5fYXN5bmNWYWxpZGF0b3JzKTtcclxuICAgICAgICAgICAgdGhpcy5iYXNlSW5wdXQuY29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5DaGVja1ZhbGlkaXR5KCk7XHJcbiAgICAgICAgY29uc3QgbmdDb250cm9sOiBOZ0NvbnRyb2wgPSB0aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wsIG51bGwpO1xyXG4gICAgICAgIGlmIChuZ0NvbnRyb2wpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnRDb250cm9sID0gbmdDb250cm9sLmNvbnRyb2wgYXMgVW50eXBlZEZvcm1Db250cm9sO1xyXG5cclxuICAgICAgICAgICAgLy8gc2UgbGEgdmFyaWFiaWxlIG5vdmFsaWRhdGUgw6ggdHJ1ZSwgZWxpbWlubyB0dXR0aSBpIHZhbGlkYXRvcmkgZXZlbnR1YWxtZW50ZSBpbnNlcml0aVxyXG4gICAgICAgICAgICBpZiAodGhpcy5ub1ZhbGlkYXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENvbnRyb2wuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENvbnRyb2wuY2xlYXJBc3luY1ZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gZmFjY2lvIGluIG1vZG8gY2hlIHNlIGNoaWFtbyBpbCByZXNldCBkZWwgY29udHJvbGxvIChvIGRlbGxhIGZvcm0pIGRhbGwnZXN0ZXJubyBzaSByZXNldHRpIGFuY2hlIGlsIGNvbnRyb2xsbyBuYXRpdm9cclxuICAgICAgICAgICAgY29uc3Qgb3JpZ0Z1bmMgPSB0aGlzLnBhcmVudENvbnRyb2wucmVzZXQ7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50Q29udHJvbC5yZXNldCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIG9yaWdGdW5jLmFwcGx5KHRoaXMucGFyZW50Q29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhc2VJbnB1dC5jb250cm9sLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmUgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25Ub3VjaGVkID0gKCkgPT4geyB9OyAvL3BsYWNlaG9sZGVyIG9uIHRvdWNoZWQgZnVuY3Rpb25cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmUgXHJcbiAgICAgKi9cclxuICAgIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh2YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMJ2VtaXQgZGVsbGEgbW9kaWZpY2EgYWwgdmFsb3JlIHZpZW5lIGdlc3RpdG8gc3UgdW4gZXZlbnRvIGN1c3RvbSAoKippbnB1dENoYW5nZSoqKSBjb21lIHdvcmthcm91bmQgYWwgbWFsZnVuemlvbmFtZW50byBkZWxsJyoqbmdNb2RlbENoYW5nZSoqIG5hdGl2b1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gdG9FbWl0IHZhbG9yZSBkYSBwcm9wYWdhcmUgYWxsJ2VzdGVybm9cclxuICAgICAqL1xyXG4gICAgb25Nb2RlbENoYW5nZSh0b0VtaXQpIHtcclxuICAgICAgICB0aGlzLndyaXRlVmFsdWUodG9FbWl0KTtcclxuICAgICAgICB0aGlzLmlucHV0Q2hhbmdlLmVtaXQodG9FbWl0KTtcclxuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZSBcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmUgXHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gICAgfVxyXG59IiwiPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJ7e0ZpZWxkQXBwZWFyZW5jZX19XCIgY2xhc3M9XCJtYXQtZnVsbC13aWR0aCBtYXQtbm8tYm9yZGVyLXRvcCBtYXQtaGVpZ2h0LWZpeGVkXCIgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoUHhcIj5cclxuICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJsYWJlbFwiPnt7bGFiZWx9fTwvbWF0LWxhYmVsPlxyXG4gICAgPHNlbGVjdCBtYXROYXRpdmVDb250cm9sXHJcbiAgICAgICAgICAgICNiYXNlSW5wdXQ9XCJuZ01vZGVsXCJcclxuICAgICAgICAgICAgI2h0bWxJbnB1dFxyXG4gICAgICAgICAgICBuYW1lPVwidmFsLXNlbGVjdFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgdHJpZ2dlcnM9XCJcIlxyXG4gICAgICAgICAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxyXG4gICAgICAgICAgICBpZD1cInt7aWR9fVwiXHJcbiAgICAgICAgICAgIFtjdXN0b21SZXF1aXJlZF09XCJyZXF1aXJlZFwiXHJcbiAgICAgICAgICAgIFtDdXN0b21OdWxsVmFsdWVzXT1cIltwbGFjZUhvbGRlclZhbHVlLCBlbXB0eUZpZWxkVmFsdWVdXCJcclxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgIFt0b29sdGlwXT1cInRvbFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgW2NsYXNzLmNoZWNraW5nLWNvbWJvXT1cIiFub1ZhbGlkYXRlXCJcclxuICAgICAgICAgICAgW2NsYXNzLmFwcC1vcHRpb24tcGxhY2Vob2xkZXJdPVwiYmFzZUlucHV0LnZhbHVlID09PSBwbGFjZUhvbGRlclZhbHVlXCJcclxuICAgICAgICAgICAgW2NsYXNzLm5vLWJnLWltZ109XCIhc2hvd1ZhbGlkYXRpb25TeW1ib2xcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiUmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25Gb2N1cygkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGZvY3VzKT1cImNoZWNrVG9vbHRpcCgpO1wiXHJcbiAgICAgICAgICAgIChibHVyKT1cImNsb3NlVG9vbHRpcCgpOyBvbkJsdXIuZW1pdCh0cnVlKTtcIlxyXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk1vZGVsQ2hhbmdlKCRldmVudCk7IG9uRmluYWxpemUoKVwiPlxyXG5cclxuICAgICAgICA8b3B0aW9uICpuZ0lmPVwicGxhY2Vob2xkZXJcIiBbdmFsdWVdPVwicGxhY2VIb2xkZXJWYWx1ZVwiIGRpc2FibGVkIHNlbGVjdGVkIGhpZGRlbj57e3BsYWNlaG9sZGVyfX08L29wdGlvbj5cclxuICAgICAgICA8b3B0aW9uICpuZ0lmPVwicmVxdWlyZWQgPT0gZmFsc2UgJiYgZW1wdHlWYWx1ZVwiIFt2YWx1ZV09XCJlbXB0eUZpZWxkVmFsdWVcIj48L29wdGlvbj5cclxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICA8L3NlbGVjdD5cclxuPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdG9sVGVtcGxhdGU+XHJcbiAgICA8ZGl2IChjbGljayk9XCJjbG9zZVRvb2x0aXAoKVwiPlxyXG4gICAgICAgIDxzcGFuPnt7dmFsaWRhdGlvbkZhaWxlZEJpbmR9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPiJdfQ==