@esfaenza/forms-and-validations 12.2.29 → 13.1.4

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 (118) hide show
  1. package/esfaenza-forms-and-validations.d.ts +1 -12
  2. package/esm2020/esfaenza-forms-and-validations.mjs +5 -0
  3. package/esm2020/lib/forms/base-form-control.mjs +482 -0
  4. package/esm2020/lib/forms/form-adaptive/form-adaptive.component.loc.mjs +28 -0
  5. package/esm2020/lib/forms/form-adaptive/form-adaptive.component.mjs +294 -0
  6. package/esm2020/lib/forms/form-autocomplete/form-autocomplete.component.loc.mjs +26 -0
  7. package/esm2020/lib/forms/form-autocomplete/form-autocomplete.component.mjs +200 -0
  8. package/esm2020/lib/forms/form-checkbox/form-checkbox.component.mjs +52 -0
  9. package/esm2020/lib/forms/form-date/form-date.component.mjs +59 -0
  10. package/esm2020/lib/forms/form-datetime/form-datetime.component.mjs +59 -0
  11. package/esm2020/lib/forms/form-empty/form-empty.component.mjs +36 -0
  12. package/esm2020/lib/forms/form-error/form-error.component.mjs +52 -0
  13. package/esm2020/lib/forms/form-file/form-file.component.loc.mjs +28 -0
  14. package/esm2020/lib/forms/form-file/form-file.component.mjs +119 -0
  15. package/esm2020/lib/forms/form-info/form-info.component.mjs +52 -0
  16. package/esm2020/lib/forms/form-input/form-input.component.mjs +93 -0
  17. package/esm2020/lib/forms/form-multiselect/form-multiselect.component.loc.mjs +29 -0
  18. package/esm2020/lib/forms/form-multiselect/form-multiselect.component.mjs +159 -0
  19. package/esm2020/lib/forms/form-select/form-select.component.loc.mjs +26 -0
  20. package/esm2020/lib/forms/form-select/form-select.component.mjs +129 -0
  21. package/esm2020/lib/forms/form-template/form-template.component.mjs +71 -0
  22. package/esm2020/lib/forms/form-textarea/form-textarea.component.mjs +54 -0
  23. package/esm2020/lib/forms/form-time/form-time.component.mjs +131 -0
  24. package/esm2020/lib/forms-and-validations.module.mjs +203 -0
  25. package/{esm2015/lib/models/AppFile.js → esm2020/lib/models/AppFile.mjs} +0 -0
  26. package/{esm2015/lib/models/FormsAndValidationsModuleConfig.js → esm2020/lib/models/FormsAndValidationsModuleConfig.mjs} +0 -0
  27. package/esm2020/lib/models/dayjs-adapter/dayjs-date-adapter.mjs +89 -0
  28. package/{esm2015/lib/tokens.js → esm2020/lib/tokens.mjs} +0 -0
  29. package/esm2020/lib/validations/base-validation.loc.mjs +28 -0
  30. package/esm2020/lib/validations/base-validation.mjs +238 -0
  31. package/esm2020/lib/validations/customValidators/CustomRequiredDirective.mjs +41 -0
  32. package/esm2020/lib/validations/validation-autocomplete/validation-autocomplete.component.mjs +168 -0
  33. package/esm2020/lib/validations/validation-currency/validation-currency.component.mjs +61 -0
  34. package/esm2020/lib/validations/validation-date/validation-date.component.mjs +177 -0
  35. package/esm2020/lib/validations/validation-datetime/validation-datetime.component.mjs +206 -0
  36. package/esm2020/lib/validations/validation-input/validation-input.component.mjs +207 -0
  37. package/esm2020/lib/validations/validation-select/validation-select.component.mjs +184 -0
  38. package/esm2020/lib/validations/validation-text-area/validation-text-area.component.mjs +64 -0
  39. package/esm2020/public-api.mjs +35 -0
  40. package/fesm2015/esfaenza-forms-and-validations.mjs +3626 -0
  41. package/fesm2015/esfaenza-forms-and-validations.mjs.map +1 -0
  42. package/fesm2020/esfaenza-forms-and-validations.mjs +3568 -0
  43. package/fesm2020/esfaenza-forms-and-validations.mjs.map +1 -0
  44. package/lib/forms/base-form-control.d.ts +3 -0
  45. package/lib/forms/form-adaptive/form-adaptive.component.d.ts +3 -0
  46. package/lib/forms/form-adaptive/form-adaptive.component.loc.d.ts +3 -0
  47. package/lib/forms/form-autocomplete/form-autocomplete.component.d.ts +3 -0
  48. package/lib/forms/form-autocomplete/form-autocomplete.component.loc.d.ts +3 -0
  49. package/lib/forms/form-checkbox/form-checkbox.component.d.ts +3 -0
  50. package/lib/forms/form-date/form-date.component.d.ts +3 -0
  51. package/lib/forms/form-datetime/form-datetime.component.d.ts +3 -0
  52. package/lib/forms/form-empty/form-empty.component.d.ts +3 -0
  53. package/lib/forms/form-error/form-error.component.d.ts +3 -0
  54. package/lib/forms/form-file/form-file.component.d.ts +3 -0
  55. package/lib/forms/form-file/form-file.component.loc.d.ts +3 -0
  56. package/lib/forms/form-info/form-info.component.d.ts +3 -0
  57. package/lib/forms/form-input/form-input.component.d.ts +3 -0
  58. package/lib/forms/form-multiselect/form-multiselect.component.d.ts +3 -0
  59. package/lib/forms/form-multiselect/form-multiselect.component.loc.d.ts +3 -0
  60. package/lib/forms/form-select/form-select.component.d.ts +3 -0
  61. package/lib/forms/form-select/form-select.component.loc.d.ts +3 -0
  62. package/lib/forms/form-template/form-template.component.d.ts +3 -0
  63. package/lib/forms/form-textarea/form-textarea.component.d.ts +3 -0
  64. package/lib/forms/form-time/form-time.component.d.ts +3 -0
  65. package/lib/forms-and-validations.module.d.ts +38 -0
  66. package/lib/models/dayjs-adapter/dayjs-date-adapter.d.ts +3 -0
  67. package/lib/validations/base-validation.d.ts +7 -0
  68. package/lib/validations/base-validation.loc.d.ts +3 -0
  69. package/lib/validations/customValidators/CustomRequiredDirective.d.ts +3 -0
  70. package/lib/validations/validation-autocomplete/validation-autocomplete.component.d.ts +3 -0
  71. package/lib/validations/validation-currency/validation-currency.component.d.ts +3 -0
  72. package/lib/validations/validation-date/validation-date.component.d.ts +3 -0
  73. package/lib/validations/validation-datetime/validation-datetime.component.d.ts +3 -0
  74. package/lib/validations/validation-input/validation-input.component.d.ts +3 -0
  75. package/lib/validations/validation-select/validation-select.component.d.ts +3 -0
  76. package/lib/validations/validation-text-area/validation-text-area.component.d.ts +3 -0
  77. package/package.json +31 -19
  78. package/public-api.d.ts +2 -0
  79. package/bundles/esfaenza-forms-and-validations.umd.js +0 -3754
  80. package/bundles/esfaenza-forms-and-validations.umd.js.map +0 -1
  81. package/esfaenza-forms-and-validations.metadata.json +0 -1
  82. package/esm2015/esfaenza-forms-and-validations.js +0 -17
  83. package/esm2015/lib/forms/base-form-control.js +0 -460
  84. package/esm2015/lib/forms/form-adaptive/form-adaptive.component.js +0 -277
  85. package/esm2015/lib/forms/form-adaptive/form-adaptive.component.loc.js +0 -23
  86. package/esm2015/lib/forms/form-autocomplete/form-autocomplete.component.js +0 -187
  87. package/esm2015/lib/forms/form-autocomplete/form-autocomplete.component.loc.js +0 -21
  88. package/esm2015/lib/forms/form-checkbox/form-checkbox.component.js +0 -41
  89. package/esm2015/lib/forms/form-date/form-date.component.js +0 -49
  90. package/esm2015/lib/forms/form-datetime/form-datetime.component.js +0 -49
  91. package/esm2015/lib/forms/form-empty/form-empty.component.js +0 -34
  92. package/esm2015/lib/forms/form-error/form-error.component.js +0 -49
  93. package/esm2015/lib/forms/form-file/form-file.component.js +0 -109
  94. package/esm2015/lib/forms/form-file/form-file.component.loc.js +0 -23
  95. package/esm2015/lib/forms/form-info/form-info.component.js +0 -49
  96. package/esm2015/lib/forms/form-input/form-input.component.js +0 -76
  97. package/esm2015/lib/forms/form-multiselect/form-multiselect.component.js +0 -154
  98. package/esm2015/lib/forms/form-multiselect/form-multiselect.component.loc.js +0 -24
  99. package/esm2015/lib/forms/form-select/form-select.component.js +0 -114
  100. package/esm2015/lib/forms/form-select/form-select.component.loc.js +0 -21
  101. package/esm2015/lib/forms/form-template/form-template.component.js +0 -64
  102. package/esm2015/lib/forms/form-textarea/form-textarea.component.js +0 -44
  103. package/esm2015/lib/forms/form-time/form-time.component.js +0 -117
  104. package/esm2015/lib/forms-and-validations.module.js +0 -144
  105. package/esm2015/lib/models/dayjs-adapter/dayjs-date-adapter.js +0 -86
  106. package/esm2015/lib/validations/base-validation.js +0 -208
  107. package/esm2015/lib/validations/base-validation.loc.js +0 -23
  108. package/esm2015/lib/validations/customValidators/CustomRequiredDirective.js +0 -35
  109. package/esm2015/lib/validations/validation-autocomplete/validation-autocomplete.component.js +0 -151
  110. package/esm2015/lib/validations/validation-currency/validation-currency.component.js +0 -48
  111. package/esm2015/lib/validations/validation-date/validation-date.component.js +0 -165
  112. package/esm2015/lib/validations/validation-datetime/validation-datetime.component.js +0 -193
  113. package/esm2015/lib/validations/validation-input/validation-input.component.js +0 -186
  114. package/esm2015/lib/validations/validation-select/validation-select.component.js +0 -166
  115. package/esm2015/lib/validations/validation-text-area/validation-text-area.component.js +0 -52
  116. package/esm2015/public-api.js +0 -32
  117. package/fesm2015/esfaenza-forms-and-validations.js +0 -3262
  118. package/fesm2015/esfaenza-forms-and-validations.js.map +0 -1
@@ -0,0 +1,294 @@
1
+ // Angular
2
+ import { ChangeDetectionStrategy, Component, Inject, Input, Optional, Self, ViewChild } from "@angular/core";
3
+ import { NG_VALIDATORS } from "@angular/forms";
4
+ // ES / Configurazioni
5
+ import { LocalizationService } from "@esfaenza/localizations";
6
+ // Applicazione
7
+ import { BaseFormControl } from "../base-form-control";
8
+ import { FormAdaptiveComponentLoc } from "./form-adaptive.component.loc";
9
+ // Modelli
10
+ import { ACO_CUSTOMKEY } from '../../tokens';
11
+ import { AppFile } from "../../models/AppFile";
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@esfaenza/extensions";
14
+ import * as i2 from "@angular-material-components/datetime-picker";
15
+ import * as i3 from "@esfaenza/localizations";
16
+ import * as i4 from "@angular/forms";
17
+ import * as i5 from "@esfaenza/access-control";
18
+ import * as i6 from "../../validations/validation-currency/validation-currency.component";
19
+ import * as i7 from "../../validations/validation-date/validation-date.component";
20
+ import * as i8 from "../../validations/validation-input/validation-input.component";
21
+ import * as i9 from "../../validations/validation-select/validation-select.component";
22
+ import * as i10 from "../../validations/validation-autocomplete/validation-autocomplete.component";
23
+ import * as i11 from "../../validations/validation-datetime/validation-datetime.component";
24
+ import * as i12 from "@angular/common";
25
+ /**
26
+ * Componente in grado di assumere la forma di un qualsiasi altro componente form in base al tipo specificato. Utile per la creazione di form dinamici
27
+ */
28
+ export class FormAdaptiveComponent extends BaseFormControl {
29
+ /**
30
+ * Costruttore
31
+ *
32
+ * @ignore
33
+ */
34
+ constructor(cdr, utiExts, dateAdapter, lc, ngControl, _validators, ac, AppContext, ACO_CUSTOMKEY) {
35
+ super(cdr, ngControl, _validators, ac, AppContext, ACO_CUSTOMKEY);
36
+ this.utiExts = utiExts;
37
+ this.dateAdapter = dateAdapter;
38
+ this.lc = lc;
39
+ /**
40
+ * Permette di scaricare l'eventuale file presente qualora il **Type** di questo componente fosse **file**
41
+ */
42
+ this.AllowDownload = true;
43
+ /**
44
+ * Utilizzata nel form-adapter per specificare la precisione degli input currencymap (Type: currency)
45
+ */
46
+ this.Precision = 2;
47
+ /**
48
+ * Allineamento della currency mask
49
+ */
50
+ this.Alignment = 'right';
51
+ /**
52
+ * Funzione di ricerca che verrà chiamata dal componente
53
+ */
54
+ this.SearchFunction = null;
55
+ /**
56
+ * Numero minimo di caratteri con cui cercare
57
+ */
58
+ this.MinChars = 3;
59
+ /**
60
+ * Indica se i controlli devono essere effettuati tenendo conto del Case o meno. Vale solo qualora la **Source** fosse fornita
61
+ */
62
+ this.CaseSensitive = false;
63
+ /**
64
+ * Variabile interna che gestisce se effettuare il riallineamento dei dati o meno
65
+ */
66
+ this.alignValues = false;
67
+ /**
68
+ * Indica se ignorare il prossimo evento writeValue che normalmente dovrebbe richiedere la nuova source. Serve per quando l'utente seleziona un elemento:
69
+ * Subito dopo partirebbe un altro evento modelChange che ricaricherebbe nuovamente la source
70
+ */
71
+ this.ignoreNextWriteValue = false;
72
+ /**
73
+ * Cache della sorgente originale POST binding, in modo da poter fare filtri in locale qualora la **SearchFunction** non fosse definita e la **Source** fosse assegnata
74
+ */
75
+ this.FilteredBoundSource = [];
76
+ //******************** Funzione di throttling per non spammare richieste in caso di animazioni attivate
77
+ //TODO: spostarla in un metodo di utilità (esfaenza/extensions)
78
+ /** @ignore */
79
+ this.executionTimers = {};
80
+ this.ModelFile = new AppFile();
81
+ }
82
+ /**
83
+ * @ignore
84
+ */
85
+ async ngOnChanges(changes) {
86
+ const newSource = changes["Source"];
87
+ const newType = changes["Type"];
88
+ if (newSource) {
89
+ this.tryBindSourceDisplay();
90
+ // Prima assegnazione se cambia la source sotto (quindi se viene bindata direttamente da HTML)
91
+ if (this.Type == "autocomplete" && (this.Model?.length || 0) >= this.MinChars && !this.SearchFunction)
92
+ this.FilteredBoundSource = this.BoundSource;
93
+ else
94
+ this.FilteredBoundSource = [];
95
+ this.cdr.markForCheck();
96
+ }
97
+ if (newType && this.Model)
98
+ this.writeValue(this.Model);
99
+ }
100
+ /**
101
+ * @ignore
102
+ */
103
+ writeValue(obj) {
104
+ this.alignValues = false;
105
+ if (!this.Type)
106
+ this.Type = "string";
107
+ if ((this.Type == "float" || this.Type == "number") && obj)
108
+ obj = obj.toString().replace(".", ",");
109
+ // Per sicurezza riallineo i valori
110
+ if (this.Type == "boolean") {
111
+ obj = obj ? (obj === true || obj.toLowerCase() == "true") : false;
112
+ this.alignValues = true;
113
+ }
114
+ if (this.Type == "time") {
115
+ const [hours, minutes, seconds] = (obj || "0:0:0").split(":");
116
+ obj = dayjs().hour(hours ?? 0).minute(minutes ?? 0).second(seconds ?? 0);
117
+ }
118
+ if (this.Type == "file")
119
+ obj = this.ModelFile;
120
+ if (this.Type == "autocomplete") {
121
+ if (this.SearchFunction) {
122
+ this.SearchFunction(obj, true).subscribe(t => {
123
+ this.Source = t;
124
+ this.tryBindSourceDisplay();
125
+ setTimeout(() => { this.finalizeValue(obj); });
126
+ });
127
+ return;
128
+ }
129
+ else
130
+ this.finalizeValue(obj);
131
+ }
132
+ super.writeValue(obj);
133
+ if (this.alignValues) {
134
+ this.changed();
135
+ this.cdr.markForCheck();
136
+ }
137
+ }
138
+ /**
139
+ * Dato un valore verifica se può restituire le informazioni trovate in **Source** con id uguale a **value** o se deve restituire il valore in se
140
+ *
141
+ * @param {any} value Valore scritto nell'input di testo
142
+ */
143
+ finalizeValue(value) {
144
+ var val = this.Source.find(t => t.id == value);
145
+ this.propagateChange(val ? val.id : value);
146
+ this.Model = val ? val.description : value;
147
+ }
148
+ /**
149
+ * Evento di filtro della sorgente dati in base all'input utente
150
+ *
151
+ * @param {string} event Input utente
152
+ */
153
+ filterSource(event) {
154
+ if (this.ignoreNextWriteValue) {
155
+ this.ignoreNextWriteValue = false;
156
+ return;
157
+ }
158
+ // Quando filtro la source, se non devo ignorare l'evento devo comunque assicurarmi di impostare il valore selezionato a null
159
+ super.changed("");
160
+ if (!event && this.MinChars == 0 && !this.SearchFunction) {
161
+ this.FilteredBoundSource = this.BoundSource;
162
+ return;
163
+ }
164
+ if (!event || event.length < this.MinChars) {
165
+ this.FilteredBoundSource = [];
166
+ return;
167
+ }
168
+ if (!this.SearchFunction && (!this.Source || this.Source.length == 0))
169
+ throw "Impossibile filtrare gli elementi senza una funzione di ricerca che restituisca una lista di { id: string, description: string }";
170
+ if (this.SearchFunction) {
171
+ this.throttla("filtersource", () => {
172
+ this.SearchFunction(event, false).subscribe(t => {
173
+ this.Source = t;
174
+ this.tryBindSourceDisplay();
175
+ // In questo caso è già filtrata dalla SearchFunction
176
+ this.FilteredBoundSource = this.BoundSource;
177
+ this.cdr.markForCheck();
178
+ });
179
+ }, 400);
180
+ }
181
+ else {
182
+ this.throttla("filtersource", () => {
183
+ // In questo caso devo filtrare io in memoria
184
+ this.FilteredBoundSource = this.BoundSource.filter(t => (this.CaseSensitive && t.description.includes(event)) || (!this.CaseSensitive && t.description.toLowerCase().includes(event.toLowerCase())));
185
+ this.cdr.markForCheck();
186
+ }, 100);
187
+ }
188
+ }
189
+ /**
190
+ * Metodo richiamato quando viene modificato il modello del campo di input
191
+ */
192
+ changed() {
193
+ var toEmit = this.Model ? JSON.parse(JSON.stringify(this.Model)) : null;
194
+ if ((this.Type == "float" || this.Type == "number") && toEmit)
195
+ toEmit = toEmit.replace(".", "").replace(",", ".");
196
+ if (this.Type == "boolean")
197
+ toEmit = toEmit ? true : false;
198
+ if (this.Type == "time") {
199
+ var toEmit = this.dateAdapter.clone(this.Model);
200
+ toEmit = toEmit.format("HH:mm:ss");
201
+ }
202
+ if (this.Type == "autocomplete")
203
+ this.ignoreNextWriteValue = true;
204
+ super.changed(toEmit);
205
+ }
206
+ /**
207
+ * Helper per gestire la modifica del file attualmente bindato. Ovviamente funziona solo qualora il **Type** fosse **file**
208
+ *
209
+ * @param {boolean} clear Indica se bisogna svuotare l'input o meno
210
+ */
211
+ fileChange(clear = false) {
212
+ let files = [];
213
+ let model = this.Model;
214
+ let ne = this.inputEl.nativeElement;
215
+ if (clear) {
216
+ model.filename = "";
217
+ ne.value = "";
218
+ }
219
+ else {
220
+ for (let i = 0; i < ne.files.length; i++)
221
+ files.push(ne.files.item(i));
222
+ if (ne.files.length == 1)
223
+ model.filename = ne.files[0].name;
224
+ if (ne.files.length > 1)
225
+ model.filename = ne.files.length + " " + this.lc.loc("Files Selected");
226
+ model.nativefiles = files;
227
+ model.fileb64 = null;
228
+ }
229
+ this.changed();
230
+ }
231
+ /**
232
+ * Permette di scaricare il file collegato all'evetnuale file input rappresentato da questo componente
233
+ */
234
+ downloadAttachment() {
235
+ let model = this.Model;
236
+ this.utiExts.saveFile(model.fileb64, model.filename);
237
+ }
238
+ /**
239
+ * @ignore
240
+ */
241
+ onNotNullValueSet() { }
242
+ /** @ignore */
243
+ throttla(id, func, throttleTime) {
244
+ //Se ho la funzione che vuole eseguire ripulisco quel timeout
245
+ if (this.executionTimers[id])
246
+ clearTimeout(this.executionTimers[id]);
247
+ //Ricreo il timeout per eseguire quella funzione dopo throttleTime millisecondi
248
+ this.executionTimers[id] = setTimeout(() => { func(); this.executionTimers[id] = null; }, throttleTime);
249
+ }
250
+ }
251
+ FormAdaptiveComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: FormAdaptiveComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.UtilityService }, { token: i2.NgxMatDateAdapter }, { token: i3.LocalizationService }, { token: i4.NgControl, optional: true, self: true }, { token: NG_VALIDATORS, optional: true }, { token: i5.AccessControlService }, { token: i5.ComponentContext, optional: true }, { token: ACO_CUSTOMKEY, optional: true }], target: i0.ɵɵFactoryTarget.Component });
252
+ FormAdaptiveComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: FormAdaptiveComponent, selector: "form-adaptive", inputs: { Type: "Type", TypeMissingMessage: "TypeMissingMessage", Pattern: "Pattern", AllowDownload: "AllowDownload", Precision: "Precision", Alignment: "Alignment", SearchFunction: "SearchFunction", MinChars: "MinChars", CaseSensitive: "CaseSensitive" }, providers: [{ provide: LocalizationService, useClass: FormAdaptiveComponentLoc }], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["fileInput"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"!FormLayout\">\r\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\r\n</ng-container>\r\n\r\n<div *ngIf=\"FormLayout\" class=\"form-group row {{FormGroupClass}}\" [class.app-margin-bottom-0]=\"Last\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\">{{Label}}{{Required ? '*' : ''}}:</label>\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n\r\n<ng-template #controlTemplate>\r\n <div *ngIf=\"!Type\" class=\"app-margin-top-5\">\r\n <em>{{TypeMissingMessage}}</em>\r\n </div>\r\n \r\n <!--Se currency-->\r\n <div *ngIf=\"Type == 'currency'\">\r\n <val-currency [forceInvalid]=\"ForcedError\"\r\n [CurrencyOptions]=\"{ prefix: '', thousands: '.', decimal: ',', precision: Precision, align: Alignment }\" [noValidate]=\"!Validation\"\r\n #validationControl=\"ngModel\" type=\"text\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [required]=\"Required\" [(ngModel)]=\"Model\" [id]=\"GeneratedName\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-currency>\r\n </div>\r\n <!--Se data-->\r\n <div *ngIf=\"Type == 'date'\">\r\n <val-date #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [required]=\"Required\" [(ngModel)]=\"Model\" [id]=\"GeneratedName\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div *ngIf=\"Type == 'string'\">\r\n <val-input #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" type=\"text\" pattern=\"{{Pattern || ''}}\" [required]=\"Required\" [(ngModel)]=\"Model\" [id]=\"GeneratedName\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-input>\r\n </div>\r\n <!--Se numero-->\r\n <div *ngIf=\"Type == 'float' || Type == 'number'\">\r\n <val-input #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" type=\"text\" pattern=\"{{Pattern || '^([0-9]*[,])?[0-9]+$'}}\" [required]=\"Required\" [(ngModel)]=\"Model\" [id]=\"GeneratedName\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-input>\r\n </div>\r\n <!--Se numero intero-->\r\n <div *ngIf=\"Type == 'int'\">\r\n <val-input #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" type=\"text\" pattern=\"{{Pattern || '^[0-9]\\\\d*$'}}\" [required]=\"Required\" [(ngModel)]=\"Model\" [id]=\"GeneratedName\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"m-t-5\" *ngIf=\"Type == 'boolean'\">\r\n <input #validationControl=\"ngModel\" [readonly]=\"Readonly\" type=\"checkbox\" class=\"app-pointer\" [(ngModel)]=\"Model\" id=\"{{GeneratedName}}\" name=\"{{GeneratedName}}\" (ngModelChange)=\"changed();\" />\r\n </div>\r\n <!--Se enum-->\r\n <div *ngIf=\"Type == 'enum'\">\r\n <val-select #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [placeHolderValue]=\"''\" [placeholder]=\"Required ? ('Select' | localize : lc) + '...' : Placeholder\" [required]=\"Required\" [(ngModel)]=\"Model\" (inputChange)=\"changed();\" [id]=\"GeneratedName\" name=\"{{GeneratedName}}\">\r\n <option *ngFor=\"let val of BoundSource\" [value]=\"val.id\">{{val.description}}</option>\r\n </val-select>\r\n </div>\r\n <!--Se autocomplete-->\r\n <div *ngIf=\"Type == 'autocomplete'\">\r\n <val-autocomplete #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [required]=\"Required\" [placeholder]=\"Required ? ('Select' | localize : lc) + '...' : Placeholder\" [(ngModel)]=\"Model\" [id]=\"GeneratedName\" name=\"{{GeneratedName}}\" [FilteredSource]=\"FilteredBoundSource\" (inputChange)=\"filterSource($event); changed();\"></val-autocomplete>\r\n </div>\r\n <!--Se date time-->\r\n <div *ngIf=\"Type == 'datetime'\">\r\n <val-datetime #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [required]=\"Required\" [(ngModel)]=\"Model\" [id]=\"GeneratedName\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-datetime>\r\n </div>\r\n <!--Se time-->\r\n <div *ngIf=\"Type == 'time'\">\r\n <ngx-mat-timepicker name=\"val-time\" #elementRef #baseInput=\"ngModel\" [(ngModel)]=\"Model\" [disabled]=\"Readonly\"\r\n [showSpinners]=\"false\" [stepHour]=\"2\" [stepMinute]=\"5\" [stepSecond]=\"30\"\r\n [showSeconds]=\"true\" (ngModelChange)=\"changed()\" #validationControl=\"ngModel\">\r\n </ngx-mat-timepicker>\r\n </div>\r\n <!--Se file-->\r\n <div *ngIf=\"Type == 'file'\">\r\n <div class=\"input-group file-upload\">\r\n <input type=\"file\" (change)=\"fileChange()\" #fileInput id=\"{{GeneratedName}}\" class=\"file-upload-btn app-pointer\" [multiple]=\"null\"/>\r\n <input type=\"text\" [class.frm-padding-left-22]=\"AllowDownload && ModelFile.filename && ModelFile.fileb64\" class=\"form-control checking-field\" placeholder=\"{{'Select a file' | localize : lc}}...\" [(ngModel)]=\"ModelFile.filename\" name=\"dsfile\" #validationControl=\"ngModel\" [required]=\"Required\"/>\r\n \r\n <a class=\"fa fa-download app-pointer app-input-icon\" *ngIf=\"AllowDownload && ModelFile.filename && ModelFile.fileb64\" (click)=\"downloadAttachment()\"></a>\r\n <i class=\"fa fa-times delete-file\" (click)=\"fileChange(true)\" *ngIf=\"ModelFile.filename\"></i>\r\n <span class=\"input-group-btn\">\r\n <button class=\"btn btn-primary btn-file-upload\" type=\"button\"><i class=\"fa fa-upload\"></i></button>\r\n </span>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".frm-padding-left-22{padding-left:22px}\n"], components: [{ type: i6.ValidationCurrencyComponent, selector: "val-currency", inputs: ["CurrencyOptions"] }, { type: i7.ValidationDateComponent, selector: "val-date", inputs: ["useJsDates"] }, { type: i8.ValidationInputComponent, selector: "val-input", inputs: ["Password", "showWarning", "warningTitle", "warningClass", "value"] }, { type: i9.ValidationSelectComponent, selector: "val-select", inputs: ["emptyFieldValue", "placeHolderValue", "emptyValue", "showValidationSymbol", "label"], outputs: ["onBlur"] }, { type: i10.ValidationAutocompleteComponent, selector: "val-autocomplete", inputs: ["FilteredSource", "value", "label"], outputs: ["optionChange"] }, { type: i11.ValidationDateTimeComponent, selector: "val-datetime", inputs: ["useJsDates"] }, { type: i2.NgxMatTimepickerComponent, selector: "ngx-mat-timepicker", inputs: ["disabled", "showSpinners", "stepHour", "stepMinute", "stepSecond", "showSeconds", "disableMinute", "enableMeridian", "defaultTime", "color"], exportAs: ["ngxMatTimepicker"] }], directives: [{ type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i12.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i4.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i12.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }], pipes: { "localize": i3.LocalizePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
253
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: FormAdaptiveComponent, decorators: [{
254
+ type: Component,
255
+ args: [{ selector: "form-adaptive", providers: [{ provide: LocalizationService, useClass: FormAdaptiveComponentLoc }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"!FormLayout\">\r\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\r\n</ng-container>\r\n\r\n<div *ngIf=\"FormLayout\" class=\"form-group row {{FormGroupClass}}\" [class.app-margin-bottom-0]=\"Last\">\r\n <label class=\"col-md-{{LabelColWidth}} m-t-5\">{{Label}}{{Required ? '*' : ''}}:</label>\r\n <div class=\"col-md-{{InputColWidth}}\">\r\n <ng-container *ngTemplateOutlet=\"controlTemplate\"></ng-container>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n\r\n<ng-template #controlTemplate>\r\n <div *ngIf=\"!Type\" class=\"app-margin-top-5\">\r\n <em>{{TypeMissingMessage}}</em>\r\n </div>\r\n \r\n <!--Se currency-->\r\n <div *ngIf=\"Type == 'currency'\">\r\n <val-currency [forceInvalid]=\"ForcedError\"\r\n [CurrencyOptions]=\"{ prefix: '', thousands: '.', decimal: ',', precision: Precision, align: Alignment }\" [noValidate]=\"!Validation\"\r\n #validationControl=\"ngModel\" type=\"text\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [required]=\"Required\" [(ngModel)]=\"Model\" [id]=\"GeneratedName\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-currency>\r\n </div>\r\n <!--Se data-->\r\n <div *ngIf=\"Type == 'date'\">\r\n <val-date #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [required]=\"Required\" [(ngModel)]=\"Model\" [id]=\"GeneratedName\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-date>\r\n </div>\r\n <!--Se stringa-->\r\n <div *ngIf=\"Type == 'string'\">\r\n <val-input #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" type=\"text\" pattern=\"{{Pattern || ''}}\" [required]=\"Required\" [(ngModel)]=\"Model\" [id]=\"GeneratedName\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-input>\r\n </div>\r\n <!--Se numero-->\r\n <div *ngIf=\"Type == 'float' || Type == 'number'\">\r\n <val-input #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" type=\"text\" pattern=\"{{Pattern || '^([0-9]*[,])?[0-9]+$'}}\" [required]=\"Required\" [(ngModel)]=\"Model\" [id]=\"GeneratedName\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-input>\r\n </div>\r\n <!--Se numero intero-->\r\n <div *ngIf=\"Type == 'int'\">\r\n <val-input #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" type=\"text\" pattern=\"{{Pattern || '^[0-9]\\\\d*$'}}\" [required]=\"Required\" [(ngModel)]=\"Model\" [id]=\"GeneratedName\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-input>\r\n </div>\r\n <!--Se boolean-->\r\n <div class=\"m-t-5\" *ngIf=\"Type == 'boolean'\">\r\n <input #validationControl=\"ngModel\" [readonly]=\"Readonly\" type=\"checkbox\" class=\"app-pointer\" [(ngModel)]=\"Model\" id=\"{{GeneratedName}}\" name=\"{{GeneratedName}}\" (ngModelChange)=\"changed();\" />\r\n </div>\r\n <!--Se enum-->\r\n <div *ngIf=\"Type == 'enum'\">\r\n <val-select #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [placeHolderValue]=\"''\" [placeholder]=\"Required ? ('Select' | localize : lc) + '...' : Placeholder\" [required]=\"Required\" [(ngModel)]=\"Model\" (inputChange)=\"changed();\" [id]=\"GeneratedName\" name=\"{{GeneratedName}}\">\r\n <option *ngFor=\"let val of BoundSource\" [value]=\"val.id\">{{val.description}}</option>\r\n </val-select>\r\n </div>\r\n <!--Se autocomplete-->\r\n <div *ngIf=\"Type == 'autocomplete'\">\r\n <val-autocomplete #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [required]=\"Required\" [placeholder]=\"Required ? ('Select' | localize : lc) + '...' : Placeholder\" [(ngModel)]=\"Model\" [id]=\"GeneratedName\" name=\"{{GeneratedName}}\" [FilteredSource]=\"FilteredBoundSource\" (inputChange)=\"filterSource($event); changed();\"></val-autocomplete>\r\n </div>\r\n <!--Se date time-->\r\n <div *ngIf=\"Type == 'datetime'\">\r\n <val-datetime #validationControl=\"ngModel\" [forceInvalid]=\"ForcedError\" [noValidate]=\"!Validation\" [readonly]=\"Readonly\" [submitted]=\"Form?.submitted\" [required]=\"Required\" [(ngModel)]=\"Model\" [id]=\"GeneratedName\" name=\"{{GeneratedName}}\" autocomplete=\"off\" (inputChange)=\"changed();\"></val-datetime>\r\n </div>\r\n <!--Se time-->\r\n <div *ngIf=\"Type == 'time'\">\r\n <ngx-mat-timepicker name=\"val-time\" #elementRef #baseInput=\"ngModel\" [(ngModel)]=\"Model\" [disabled]=\"Readonly\"\r\n [showSpinners]=\"false\" [stepHour]=\"2\" [stepMinute]=\"5\" [stepSecond]=\"30\"\r\n [showSeconds]=\"true\" (ngModelChange)=\"changed()\" #validationControl=\"ngModel\">\r\n </ngx-mat-timepicker>\r\n </div>\r\n <!--Se file-->\r\n <div *ngIf=\"Type == 'file'\">\r\n <div class=\"input-group file-upload\">\r\n <input type=\"file\" (change)=\"fileChange()\" #fileInput id=\"{{GeneratedName}}\" class=\"file-upload-btn app-pointer\" [multiple]=\"null\"/>\r\n <input type=\"text\" [class.frm-padding-left-22]=\"AllowDownload && ModelFile.filename && ModelFile.fileb64\" class=\"form-control checking-field\" placeholder=\"{{'Select a file' | localize : lc}}...\" [(ngModel)]=\"ModelFile.filename\" name=\"dsfile\" #validationControl=\"ngModel\" [required]=\"Required\"/>\r\n \r\n <a class=\"fa fa-download app-pointer app-input-icon\" *ngIf=\"AllowDownload && ModelFile.filename && ModelFile.fileb64\" (click)=\"downloadAttachment()\"></a>\r\n <i class=\"fa fa-times delete-file\" (click)=\"fileChange(true)\" *ngIf=\"ModelFile.filename\"></i>\r\n <span class=\"input-group-btn\">\r\n <button class=\"btn btn-primary btn-file-upload\" type=\"button\"><i class=\"fa fa-upload\"></i></button>\r\n </span>\r\n </div>\r\n </div>\r\n</ng-template>", styles: [".frm-padding-left-22{padding-left:22px}\n"] }]
256
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.UtilityService }, { type: i2.NgxMatDateAdapter }, { type: i3.LocalizationService }, { type: i4.NgControl, decorators: [{
257
+ type: Optional
258
+ }, {
259
+ type: Self
260
+ }] }, { type: Array, decorators: [{
261
+ type: Optional
262
+ }, {
263
+ type: Inject,
264
+ args: [NG_VALIDATORS]
265
+ }] }, { type: i5.AccessControlService }, { type: i5.ComponentContext, decorators: [{
266
+ type: Optional
267
+ }] }, { type: undefined, decorators: [{
268
+ type: Optional
269
+ }, {
270
+ type: Inject,
271
+ args: [ACO_CUSTOMKEY]
272
+ }] }]; }, propDecorators: { Type: [{
273
+ type: Input
274
+ }], TypeMissingMessage: [{
275
+ type: Input
276
+ }], Pattern: [{
277
+ type: Input
278
+ }], inputEl: [{
279
+ type: ViewChild,
280
+ args: ["fileInput", { static: false }]
281
+ }], AllowDownload: [{
282
+ type: Input
283
+ }], Precision: [{
284
+ type: Input
285
+ }], Alignment: [{
286
+ type: Input
287
+ }], SearchFunction: [{
288
+ type: Input
289
+ }], MinChars: [{
290
+ type: Input
291
+ }], CaseSensitive: [{
292
+ type: Input
293
+ }] } });
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1hZGFwdGl2ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3Jtcy1hbmQtdmFsaWRhdGlvbnMvc3JjL2xpYi9mb3Jtcy9mb3JtLWFkYXB0aXZlL2Zvcm0tYWRhcHRpdmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybXMtYW5kLXZhbGlkYXRpb25zL3NyYy9saWIvZm9ybXMvZm9ybS1hZGFwdGl2ZS9mb3JtLWFkYXB0aXZlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVU7QUFDVixPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzSixPQUFPLEVBQXdCLGFBQWEsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBRWhGLHNCQUFzQjtBQUN0QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUs5RCxlQUFlO0FBQ2YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRXpFLFVBQVU7QUFDVixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFVL0M7O0dBRUc7QUFRSCxNQUFNLE9BQU8scUJBQXNCLFNBQVEsZUFBZTtJQXlFdEQ7Ozs7T0FJRztJQUNILFlBQVksR0FBc0IsRUFBVSxPQUF1QixFQUFVLFdBQW1DLEVBQVMsRUFBdUIsRUFBc0IsU0FBb0IsRUFBcUMsV0FBdUIsRUFBRSxFQUF3QixFQUFjLFVBQTRCLEVBQXFDLGFBQXNC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QUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzVHLENBQUM7O2tIQWhTUSxxQkFBcUIsME1BOEVrTCxhQUFhLGlIQUFtSCxhQUFhO3NHQTlFcFYscUJBQXFCLHdTQUxuQixDQUFDLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSx3QkFBd0IsRUFBRSxDQUFDLDRLQy9CckYsaTNNQTZFYzsyRkR6Q0QscUJBQXFCO2tCQVBqQyxTQUFTOytCQUNJLGVBQWUsYUFDZCxDQUFDLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSx3QkFBd0IsRUFBRSxDQUFDLG1CQUdoRSx1QkFBdUIsQ0FBQyxNQUFNOzswQkFnRm9HLFFBQVE7OzBCQUFJLElBQUk7OEJBQXlFLEtBQUs7MEJBQXBELFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsYUFBYTs7MEJBQXNELFFBQVE7OzBCQUFrQyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGFBQWE7NENBekVwVixJQUFJO3NCQUFaLEtBQUs7Z0JBS0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUtHLE9BQU87c0JBQWYsS0FBSztnQkFLcUMsT0FBTztzQkFBakQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUtoQyxhQUFhO3NCQUFyQixLQUFLO2dCQVVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBS0csU0FBUztzQkFBakIsS0FBSztnQkFLRyxjQUFjO3NCQUF0QixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csYUFBYTtzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdCwgSW5wdXQsIE9wdGlvbmFsLCBTZWxmLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMSURBVE9SUywgTmdDb250cm9sIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG4vLyBFUyAvIENvbmZpZ3VyYXppb25pXHJcbmltcG9ydCB7IExvY2FsaXphdGlvblNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2xvY2FsaXphdGlvbnNcIjtcclxuaW1wb3J0IHsgVXRpbGl0eVNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2V4dGVuc2lvbnNcIjtcclxuaW1wb3J0IHsgQWNjZXNzQ29udHJvbFNlcnZpY2UsIENvbXBvbmVudENvbnRleHQgfSBmcm9tICdAZXNmYWVuemEvYWNjZXNzLWNvbnRyb2wnO1xyXG5pbXBvcnQgeyBOZ3hNYXREYXRlQWRhcHRlciB9IGZyb20gXCJAYW5ndWxhci1tYXRlcmlhbC1jb21wb25lbnRzL2RhdGV0aW1lLXBpY2tlclwiO1xyXG5cclxuLy8gQXBwbGljYXppb25lXHJcbmltcG9ydCB7IEJhc2VGb3JtQ29udHJvbCB9IGZyb20gXCIuLi9iYXNlLWZvcm0tY29udHJvbFwiO1xyXG5pbXBvcnQgeyBGb3JtQWRhcHRpdmVDb21wb25lbnRMb2MgfSBmcm9tIFwiLi9mb3JtLWFkYXB0aXZlLmNvbXBvbmVudC5sb2NcIjtcclxuXHJcbi8vIE1vZGVsbGlcclxuaW1wb3J0IHsgQUNPX0NVU1RPTUtFWSB9IGZyb20gJy4uLy4uL3Rva2Vucyc7XHJcbmltcG9ydCB7IEFwcEZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL0FwcEZpbGVcIjtcclxuXHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuLyoqXHJcbiAqIERpY2hpYXJhemlvbmUgZGVsbGEgdmFyaWFiaWxlIGdsb2JhbGUgZGF5anMuIEwnb25lcmUgZGkgXCJjcmVhcmxhXCIgw6ggYWZmaWRhdG8gYWxsJ2FwcGxpY2F6aW9uZSBjaGUgdXRpbGl6emEgcXVlc3RhIGxpYnJlcmlhLCBcclxuICogY2hlIGRvdnLDoCBpbXBvcnRhcmUgbG8gc2NyaXB0IGdsb2JhbGUgZGkgZGF5anMgbmVsbGEgQ0xJXHJcbiAqL1xyXG5kZWNsYXJlIHZhciBkYXlqczogYW55O1xyXG5cclxuLyoqXHJcbiAqIENvbXBvbmVudGUgaW4gZ3JhZG8gZGkgYXNzdW1lcmUgbGEgZm9ybWEgZGkgdW4gcXVhbHNpYXNpIGFsdHJvIGNvbXBvbmVudGUgZm9ybSBpbiBiYXNlIGFsIHRpcG8gc3BlY2lmaWNhdG8uIFV0aWxlICBwZXIgbGEgY3JlYXppb25lIGRpIGZvcm0gZGluYW1pY2lcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6IFwiZm9ybS1hZGFwdGl2ZVwiLFxyXG4gICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBMb2NhbGl6YXRpb25TZXJ2aWNlLCB1c2VDbGFzczogRm9ybUFkYXB0aXZlQ29tcG9uZW50TG9jIH1dLFxyXG4gICAgdGVtcGxhdGVVcmw6IFwiZm9ybS1hZGFwdGl2ZS5jb21wb25lbnQuaHRtbFwiLFxyXG4gICAgc3R5bGVVcmxzOiBbXCIuLi9mb3JtLWZpbGUvZm9ybS1maWxlLmNvbXBvbmVudC5jc3NcIl0sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybUFkYXB0aXZlQ29tcG9uZW50IGV4dGVuZHMgQmFzZUZvcm1Db250cm9sIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGlwb2xvZ2lhIGNoZSBkZWNpZGUgY2hlIGNvbXBvbmVudGUgbW9zdHJhcmVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgVHlwZTogJ3N0cmluZycgfCAnZmxvYXQnIHwgJ2RhdGUnIHwgJ251bWJlcicgfCAnaW50JyB8ICdib29sZWFuJyB8ICdlbnVtJyB8ICdhdXRvY29tcGxldGUnIHwgJ2RhdGV0aW1lJyB8ICd0aW1lJyB8ICdmaWxlJyB8ICdjdXJyZW5jeSc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXNzYWdnaW8gcGVyIHF1YW5kbyBzaSBiaW5kYSB1biBmb3JtLWFkYXB0aXZlIHNlbnphIHRpcG9cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgVHlwZU1pc3NpbmdNZXNzYWdlOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXR0ZXJuIGRpIHZhbGlkYXppb25lXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIFBhdHRlcm46IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJpZmVyaW1lbnRvIGFsbCdlbGVtZW50byBpbnB1dCBkaSB0aXBvIGZpbGUgcXVhbG9yYSBpbCAqKlR5cGUqKiBkaSBxdWVzdG8gY29tcG9uZW50ZSBmb3NzZSAqKmZpbGUqKlxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKFwiZmlsZUlucHV0XCIsIHsgc3RhdGljOiBmYWxzZSB9KSBpbnB1dEVsOiBFbGVtZW50UmVmO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVybWV0dGUgZGkgc2NhcmljYXJlIGwnZXZlbnR1YWxlIGZpbGUgcHJlc2VudGUgcXVhbG9yYSBpbCAqKlR5cGUqKiBkaSBxdWVzdG8gY29tcG9uZW50ZSBmb3NzZSAqKmZpbGUqKlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBBbGxvd0Rvd25sb2FkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vZGVsbG8gdHlwZXNjcmlwdCBkaSBiaW5kIGRlaSBmaWxlXHJcbiAgICAgKi9cclxuICAgIE1vZGVsRmlsZTogQXBwRmlsZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFV0aWxpenphdGEgbmVsIGZvcm0tYWRhcHRlciBwZXIgc3BlY2lmaWNhcmUgbGEgcHJlY2lzaW9uZSBkZWdsaSBpbnB1dCBjdXJyZW5jeW1hcCAoVHlwZTogY3VycmVuY3kpXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIFByZWNpc2lvbjogbnVtYmVyID0gMjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsbGluZWFtZW50byBkZWxsYSBjdXJyZW5jeSBtYXNrXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIEFsaWdubWVudDogJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdyaWdodCc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW56aW9uZSBkaSByaWNlcmNhIGNoZSB2ZXJyw6AgY2hpYW1hdGEgZGFsIGNvbXBvbmVudGVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgU2VhcmNoRnVuY3Rpb246IChzZWFyY2g6IHN0cmluZywgYnlpZDogYm9vbGVhbikgPT4gT2JzZXJ2YWJsZTx7IGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfVtdPiA9IG51bGw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOdW1lcm8gbWluaW1vIGRpIGNhcmF0dGVyaSBjb24gY3VpIGNlcmNhcmVcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgTWluQ2hhcnM6IG51bWJlciA9IDM7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2Egc2UgaSBjb250cm9sbGkgZGV2b25vIGVzc2VyZSBlZmZldHR1YXRpIHRlbmVuZG8gY29udG8gZGVsIENhc2UgbyBtZW5vLiBWYWxlIHNvbG8gcXVhbG9yYSBsYSAqKlNvdXJjZSoqIGZvc3NlIGZvcm5pdGFcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgQ2FzZVNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFyaWFiaWxlIGludGVybmEgY2hlIGdlc3Rpc2NlIHNlIGVmZmV0dHVhcmUgaWwgcmlhbGxpbmVhbWVudG8gZGVpIGRhdGkgbyBtZW5vXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWxpZ25WYWx1ZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYSBzZSBpZ25vcmFyZSBpbCBwcm9zc2ltbyBldmVudG8gd3JpdGVWYWx1ZSBjaGUgbm9ybWFsbWVudGUgZG92cmViYmUgcmljaGllZGVyZSBsYSBudW92YSBzb3VyY2UuIFNlcnZlIHBlciBxdWFuZG8gbCd1dGVudGUgc2VsZXppb25hIHVuIGVsZW1lbnRvOlxyXG4gICAgICogU3ViaXRvIGRvcG8gcGFydGlyZWJiZSB1biBhbHRybyBldmVudG8gbW9kZWxDaGFuZ2UgY2hlIHJpY2FyaWNoZXJlYmJlIG51b3ZhbWVudGUgbGEgc291cmNlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaWdub3JlTmV4dFdyaXRlVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENhY2hlIGRlbGxhIHNvcmdlbnRlIG9yaWdpbmFsZSBQT1NUIGJpbmRpbmcsIGluIG1vZG8gZGEgcG90ZXIgZmFyZSBmaWx0cmkgaW4gbG9jYWxlIHF1YWxvcmEgbGEgKipTZWFyY2hGdW5jdGlvbioqIG5vbiBmb3NzZSBkZWZpbml0YSBlIGxhICoqU291cmNlKiogZm9zc2UgYXNzZWduYXRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGaWx0ZXJlZEJvdW5kU291cmNlOiB7IGlkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3N0cnV0dG9yZSBcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIHV0aUV4dHM6IFV0aWxpdHlTZXJ2aWNlLCBwcml2YXRlIGRhdGVBZGFwdGVyOiBOZ3hNYXREYXRlQWRhcHRlcjxhbnk+LCBwdWJsaWMgbGM6IExvY2FsaXphdGlvblNlcnZpY2UsIEBPcHRpb25hbCgpIEBTZWxmKCkgbmdDb250cm9sOiBOZ0NvbnRyb2wsIEBPcHRpb25hbCgpIEBJbmplY3QoTkdfVkFMSURBVE9SUykgX3ZhbGlkYXRvcnM6IEFycmF5PGFueT4sIGFjOiBBY2Nlc3NDb250cm9sU2VydmljZSwgQE9wdGlvbmFsKCkgQXBwQ29udGV4dDogQ29tcG9uZW50Q29udGV4dCwgQE9wdGlvbmFsKCkgQEluamVjdChBQ09fQ1VTVE9NS0VZKSBBQ09fQ1VTVE9NS0VZIDogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoY2RyLCBuZ0NvbnRyb2wsIF92YWxpZGF0b3JzLCBhYywgQXBwQ29udGV4dCxBQ09fQ1VTVE9NS0VZKTtcclxuXHJcbiAgICAgICAgdGhpcy5Nb2RlbEZpbGUgPSBuZXcgQXBwRmlsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIGNvbnN0IG5ld1NvdXJjZSA9IGNoYW5nZXNbXCJTb3VyY2VcIl07XHJcbiAgICAgICAgY29uc3QgbmV3VHlwZSA9IGNoYW5nZXNbXCJUeXBlXCJdO1xyXG5cclxuICAgICAgICBpZiAobmV3U291cmNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJ5QmluZFNvdXJjZURpc3BsYXkoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFByaW1hIGFzc2VnbmF6aW9uZSBzZSBjYW1iaWEgbGEgc291cmNlIHNvdHRvIChxdWluZGkgc2UgdmllbmUgYmluZGF0YSBkaXJldHRhbWVudGUgZGEgSFRNTClcclxuICAgICAgICAgICAgaWYgKHRoaXMuVHlwZSA9PSBcImF1dG9jb21wbGV0ZVwiICYmICh0aGlzLk1vZGVsPy5sZW5ndGggfHwgMCkgPj0gdGhpcy5NaW5DaGFycyAmJiAhdGhpcy5TZWFyY2hGdW5jdGlvbilcclxuICAgICAgICAgICAgICAgIHRoaXMuRmlsdGVyZWRCb3VuZFNvdXJjZSA9IHRoaXMuQm91bmRTb3VyY2U7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuRmlsdGVyZWRCb3VuZFNvdXJjZSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobmV3VHlwZSAmJiB0aGlzLk1vZGVsKVxyXG4gICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5Nb2RlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmFsaWduVmFsdWVzID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5UeXBlKVxyXG4gICAgICAgICAgICB0aGlzLlR5cGUgPSBcInN0cmluZ1wiO1xyXG5cclxuICAgICAgICBpZiAoKHRoaXMuVHlwZSA9PSBcImZsb2F0XCIgfHwgdGhpcy5UeXBlID09IFwibnVtYmVyXCIpICYmIG9iailcclxuICAgICAgICAgICAgb2JqID0gb2JqLnRvU3RyaW5nKCkucmVwbGFjZShcIi5cIiwgXCIsXCIpO1xyXG5cclxuICAgICAgICAvLyBQZXIgc2ljdXJlenphIHJpYWxsaW5lbyBpIHZhbG9yaVxyXG4gICAgICAgIGlmICh0aGlzLlR5cGUgPT0gXCJib29sZWFuXCIpIHtcclxuICAgICAgICAgICAgb2JqID0gb2JqID8gKG9iaiA9PT0gdHJ1ZSB8fCBvYmoudG9Mb3dlckNhc2UoKSA9PSBcInRydWVcIikgOiBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5hbGlnblZhbHVlcyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5UeXBlID09IFwidGltZVwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IFtob3VycywgbWludXRlcywgc2Vjb25kc10gPSAob2JqIHx8IFwiMDowOjBcIikuc3BsaXQoXCI6XCIpO1xyXG4gICAgICAgICAgICBvYmogPSBkYXlqcygpLmhvdXIoaG91cnMgPz8gMCkubWludXRlKG1pbnV0ZXMgPz8gMCkuc2Vjb25kKHNlY29uZHMgPz8gMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5UeXBlID09IFwiZmlsZVwiKVxyXG4gICAgICAgICAgICBvYmogPSB0aGlzLk1vZGVsRmlsZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuVHlwZSA9PSBcImF1dG9jb21wbGV0ZVwiKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLlNlYXJjaEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlNlYXJjaEZ1bmN0aW9uKG9iaiwgdHJ1ZSkuc3Vic2NyaWJlKHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuU291cmNlID0gdDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUJpbmRTb3VyY2VEaXNwbGF5KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMuZmluYWxpemVWYWx1ZShvYmopOyB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuZmluYWxpemVWYWx1ZShvYmopO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIud3JpdGVWYWx1ZShvYmopO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hbGlnblZhbHVlcykge1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQoKTtcclxuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGF0byB1biB2YWxvcmUgdmVyaWZpY2Egc2UgcHXDsiByZXN0aXR1aXJlIGxlIGluZm9ybWF6aW9uaSB0cm92YXRlIGluICoqU291cmNlKiogY29uIGlkIHVndWFsZSBhICoqdmFsdWUqKiBvIHNlIGRldmUgcmVzdGl0dWlyZSBpbCB2YWxvcmUgaW4gc2VcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IHZhbHVlIFZhbG9yZSBzY3JpdHRvIG5lbGwnaW5wdXQgZGkgdGVzdG9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmaW5hbGl6ZVZhbHVlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB2YXIgdmFsID0gdGhpcy5Tb3VyY2UuZmluZCh0ID0+IHQuaWQgPT0gdmFsdWUpO1xyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHZhbCA/IHZhbC5pZCA6IHZhbHVlKTtcclxuICAgICAgICB0aGlzLk1vZGVsID0gdmFsID8gdmFsLmRlc2NyaXB0aW9uIDogdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmVudG8gZGkgZmlsdHJvIGRlbGxhIHNvcmdlbnRlIGRhdGkgaW4gYmFzZSBhbGwnaW5wdXQgdXRlbnRlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCBJbnB1dCB1dGVudGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGZpbHRlclNvdXJjZShldmVudDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaWdub3JlTmV4dFdyaXRlVmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5pZ25vcmVOZXh0V3JpdGVWYWx1ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBRdWFuZG8gZmlsdHJvIGxhIHNvdXJjZSwgc2Ugbm9uIGRldm8gaWdub3JhcmUgbCdldmVudG8gZGV2byBjb211bnF1ZSBhc3NpY3VyYXJtaSBkaSBpbXBvc3RhcmUgaWwgdmFsb3JlIHNlbGV6aW9uYXRvIGEgbnVsbFxyXG4gICAgICAgIHN1cGVyLmNoYW5nZWQoXCJcIik7XHJcblxyXG4gICAgICAgIGlmICghZXZlbnQgJiYgdGhpcy5NaW5DaGFycyA9PSAwICYmICF0aGlzLlNlYXJjaEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuRmlsdGVyZWRCb3VuZFNvdXJjZSA9IHRoaXMuQm91bmRTb3VyY2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghZXZlbnQgfHwgZXZlbnQubGVuZ3RoIDwgdGhpcy5NaW5DaGFycykge1xyXG4gICAgICAgICAgICB0aGlzLkZpbHRlcmVkQm91bmRTb3VyY2UgPSBbXTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLlNlYXJjaEZ1bmN0aW9uICYmICghdGhpcy5Tb3VyY2UgfHwgdGhpcy5Tb3VyY2UubGVuZ3RoID09IDApKVxyXG4gICAgICAgICAgICB0aHJvdyBcIkltcG9zc2liaWxlIGZpbHRyYXJlIGdsaSBlbGVtZW50aSBzZW56YSB1bmEgZnVuemlvbmUgZGkgcmljZXJjYSBjaGUgcmVzdGl0dWlzY2EgdW5hIGxpc3RhIGRpIHsgaWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyB9XCI7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlNlYXJjaEZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGhyb3R0bGEoXCJmaWx0ZXJzb3VyY2VcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5TZWFyY2hGdW5jdGlvbihldmVudCwgZmFsc2UpLnN1YnNjcmliZSh0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLlNvdXJjZSA9IHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlCaW5kU291cmNlRGlzcGxheSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEluIHF1ZXN0byBjYXNvIMOoIGdpw6AgZmlsdHJhdGEgZGFsbGEgU2VhcmNoRnVuY3Rpb25cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkZpbHRlcmVkQm91bmRTb3VyY2UgPSB0aGlzLkJvdW5kU291cmNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0sIDQwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRocm90dGxhKFwiZmlsdGVyc291cmNlXCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEluIHF1ZXN0byBjYXNvIGRldm8gZmlsdHJhcmUgaW8gaW4gbWVtb3JpYVxyXG4gICAgICAgICAgICAgICAgdGhpcy5GaWx0ZXJlZEJvdW5kU291cmNlID0gdGhpcy5Cb3VuZFNvdXJjZS5maWx0ZXIodCA9PiAodGhpcy5DYXNlU2Vuc2l0aXZlICYmIHQuZGVzY3JpcHRpb24uaW5jbHVkZXMoZXZlbnQpKSB8fCAoIXRoaXMuQ2FzZVNlbnNpdGl2ZSAmJiB0LmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZXZlbnQudG9Mb3dlckNhc2UoKSkpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyByaWNoaWFtYXRvIHF1YW5kbyB2aWVuZSBtb2RpZmljYXRvIGlsIG1vZGVsbG8gZGVsIGNhbXBvIGRpIGlucHV0XHJcbiAgICAgKi9cclxuICAgIGNoYW5nZWQoKSB7XHJcbiAgICAgICAgdmFyIHRvRW1pdCA9IHRoaXMuTW9kZWwgPyBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuTW9kZWwpKSA6IG51bGw7XHJcblxyXG4gICAgICAgIGlmICgodGhpcy5UeXBlID09IFwiZmxvYXRcIiB8fCB0aGlzLlR5cGUgPT0gXCJudW1iZXJcIikgJiYgdG9FbWl0KVxyXG4gICAgICAgICAgICB0b0VtaXQgPSB0b0VtaXQucmVwbGFjZShcIi5cIiwgXCJcIikucmVwbGFjZShcIixcIiwgXCIuXCIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5UeXBlID09IFwiYm9vbGVhblwiKVxyXG4gICAgICAgICAgICB0b0VtaXQgPSB0b0VtaXQgPyB0cnVlIDogZmFsc2U7XHJcblxyXG4gICAgICAgIGlmKHRoaXMuVHlwZSA9PSBcInRpbWVcIil7XHJcbiAgICAgICAgICAgIHZhciB0b0VtaXQgPSB0aGlzLmRhdGVBZGFwdGVyLmNsb25lKHRoaXMuTW9kZWwpO1xyXG4gICAgICAgICAgICB0b0VtaXQgPSB0b0VtaXQuZm9ybWF0KFwiSEg6bW06c3NcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5UeXBlID09IFwiYXV0b2NvbXBsZXRlXCIpXHJcbiAgICAgICAgICAgIHRoaXMuaWdub3JlTmV4dFdyaXRlVmFsdWUgPSB0cnVlO1xyXG5cclxuICAgICAgICBzdXBlci5jaGFuZ2VkKHRvRW1pdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgcGVyIGdlc3RpcmUgbGEgbW9kaWZpY2EgZGVsIGZpbGUgYXR0dWFsbWVudGUgYmluZGF0by4gT3Z2aWFtZW50ZSBmdW56aW9uYSBzb2xvIHF1YWxvcmEgaWwgKipUeXBlKiogZm9zc2UgKipmaWxlKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBjbGVhciBJbmRpY2Egc2UgYmlzb2duYSBzdnVvdGFyZSBsJ2lucHV0IG8gbWVubyBcclxuICAgICAqL1xyXG4gICAgZmlsZUNoYW5nZShjbGVhcjogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgbGV0IGZpbGVzOiBGaWxlW10gPSBbXTtcclxuICAgICAgICBsZXQgbW9kZWwgPSAoPEFwcEZpbGU+dGhpcy5Nb2RlbCk7XHJcbiAgICAgICAgbGV0IG5lOiBIVE1MSW5wdXRFbGVtZW50ID0gdGhpcy5pbnB1dEVsLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjbGVhcikge1xyXG4gICAgICAgICAgICBtb2RlbC5maWxlbmFtZSA9IFwiXCI7XHJcbiAgICAgICAgICAgIG5lLnZhbHVlID0gXCJcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmUuZmlsZXMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKG5lLmZpbGVzLml0ZW0oaSkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG5lLmZpbGVzLmxlbmd0aCA9PSAxKVxyXG4gICAgICAgICAgICAgICAgbW9kZWwuZmlsZW5hbWUgPSBuZS5maWxlc1swXS5uYW1lO1xyXG4gICAgICAgICAgICBpZiAobmUuZmlsZXMubGVuZ3RoID4gMSlcclxuICAgICAgICAgICAgICAgIG1vZGVsLmZpbGVuYW1lID0gbmUuZmlsZXMubGVuZ3RoICsgXCIgXCIgKyB0aGlzLmxjLmxvYyhcIkZpbGVzIFNlbGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBtb2RlbC5uYXRpdmVmaWxlcyA9IGZpbGVzO1xyXG4gICAgICAgICAgICBtb2RlbC5maWxlYjY0ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJtZXR0ZSBkaSBzY2FyaWNhcmUgaWwgZmlsZSBjb2xsZWdhdG8gYWxsJ2V2ZXRudWFsZSBmaWxlIGlucHV0IHJhcHByZXNlbnRhdG8gZGEgcXVlc3RvIGNvbXBvbmVudGVcclxuICAgICAqL1xyXG4gICAgZG93bmxvYWRBdHRhY2htZW50KCkge1xyXG4gICAgICAgIGxldCBtb2RlbCA9ICg8QXBwRmlsZT50aGlzLk1vZGVsKTtcclxuICAgICAgICB0aGlzLnV0aUV4dHMuc2F2ZUZpbGUobW9kZWwuZmlsZWI2NCwgbW9kZWwuZmlsZW5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBvbk5vdE51bGxWYWx1ZVNldCgpOiB2b2lkIHsgfVxyXG5cclxuICAgIC8vKioqKioqKioqKioqKioqKioqKiogRnVuemlvbmUgZGkgdGhyb3R0bGluZyBwZXIgbm9uIHNwYW1tYXJlIHJpY2hpZXN0ZSBpbiBjYXNvIGRpIGFuaW1hemlvbmkgYXR0aXZhdGVcclxuICAgIC8vVE9ETzogc3Bvc3RhcmxhIGluIHVuIG1ldG9kbyBkaSB1dGlsaXTDoCAoZXNmYWVuemEvZXh0ZW5zaW9ucylcclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcml2YXRlIGV4ZWN1dGlvblRpbWVyczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJpdmF0ZSB0aHJvdHRsYShpZDogc3RyaW5nLCBmdW5jOiBGdW5jdGlvbiwgdGhyb3R0bGVUaW1lOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICAvL1NlIGhvIGxhIGZ1bnppb25lIGNoZSB2dW9sZSBlc2VndWlyZSByaXB1bGlzY28gcXVlbCB0aW1lb3V0XHJcbiAgICAgICAgaWYgKHRoaXMuZXhlY3V0aW9uVGltZXJzW2lkXSlcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZXhlY3V0aW9uVGltZXJzW2lkXSk7XHJcblxyXG4gICAgICAgIC8vUmljcmVvIGlsIHRpbWVvdXQgcGVyIGVzZWd1aXJlIHF1ZWxsYSBmdW56aW9uZSBkb3BvIHRocm90dGxlVGltZSBtaWxsaXNlY29uZGlcclxuICAgICAgICB0aGlzLmV4ZWN1dGlvblRpbWVyc1tpZF0gPSBzZXRUaW1lb3V0KCgpID0+IHsgZnVuYygpOyB0aGlzLmV4ZWN1dGlvblRpbWVyc1tpZF0gPSBudWxsOyB9LCB0aHJvdHRsZVRpbWUpO1xyXG4gICAgfVxyXG4gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqXHJcbn0iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiIUZvcm1MYXlvdXRcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250cm9sVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuPC9uZy1jb250YWluZXI+XHJcblxyXG48ZGl2ICpuZ0lmPVwiRm9ybUxheW91dFwiIGNsYXNzPVwiZm9ybS1ncm91cCByb3cge3tGb3JtR3JvdXBDbGFzc319XCIgW2NsYXNzLmFwcC1tYXJnaW4tYm90dG9tLTBdPVwiTGFzdFwiPlxyXG4gICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLXt7TGFiZWxDb2xXaWR0aH19IG0tdC01XCI+e3tMYWJlbH19e3tSZXF1aXJlZCA/ICcqJyA6ICcnfX06PC9sYWJlbD5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQte3tJbnB1dENvbFdpZHRofX1cIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udHJvbFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjbGVhcmZpeFwiPjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjY29udHJvbFRlbXBsYXRlPlxyXG4gICAgPGRpdiAqbmdJZj1cIiFUeXBlXCIgY2xhc3M9XCJhcHAtbWFyZ2luLXRvcC01XCI+XHJcbiAgICAgICAgPGVtPnt7VHlwZU1pc3NpbmdNZXNzYWdlfX08L2VtPlxyXG4gICAgPC9kaXY+XHJcbiAgIFxyXG4gICAgIDwhLS1TZSBjdXJyZW5jeS0tPlxyXG4gICAgIDxkaXYgKm5nSWY9XCJUeXBlID09ICdjdXJyZW5jeSdcIj5cclxuICAgICAgICA8dmFsLWN1cnJlbmN5IFtmb3JjZUludmFsaWRdPVwiRm9yY2VkRXJyb3JcIlxyXG4gICAgICAgIFtDdXJyZW5jeU9wdGlvbnNdPVwieyBwcmVmaXg6ICcnLCB0aG91c2FuZHM6ICcuJywgZGVjaW1hbDogJywnLCBwcmVjaXNpb246IFByZWNpc2lvbiwgYWxpZ246IEFsaWdubWVudCB9XCIgW25vVmFsaWRhdGVdPVwiIVZhbGlkYXRpb25cIlxyXG4gICAgICAgICN2YWxpZGF0aW9uQ29udHJvbD1cIm5nTW9kZWxcIiB0eXBlPVwidGV4dFwiIFtyZWFkb25seV09XCJSZWFkb25seVwiIFtzdWJtaXR0ZWRdPVwiRm9ybT8uc3VibWl0dGVkXCIgW3JlcXVpcmVkXT1cIlJlcXVpcmVkXCIgWyhuZ01vZGVsKV09XCJNb2RlbFwiIFtpZF09XCJHZW5lcmF0ZWROYW1lXCIgbmFtZT1cInt7R2VuZXJhdGVkTmFtZX19XCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKGlucHV0Q2hhbmdlKT1cImNoYW5nZWQoKTtcIj48L3ZhbC1jdXJyZW5jeT5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLVNlIGRhdGEtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJUeXBlID09ICdkYXRlJ1wiPlxyXG4gICAgICAgIDx2YWwtZGF0ZSAjdmFsaWRhdGlvbkNvbnRyb2w9XCJuZ01vZGVsXCIgW2ZvcmNlSW52YWxpZF09XCJGb3JjZWRFcnJvclwiIFtub1ZhbGlkYXRlXT1cIiFWYWxpZGF0aW9uXCIgW3JlYWRvbmx5XT1cIlJlYWRvbmx5XCIgW3N1Ym1pdHRlZF09XCJGb3JtPy5zdWJtaXR0ZWRcIiBbcmVxdWlyZWRdPVwiUmVxdWlyZWRcIiBbKG5nTW9kZWwpXT1cIk1vZGVsXCIgW2lkXT1cIkdlbmVyYXRlZE5hbWVcIiBuYW1lPVwie3tHZW5lcmF0ZWROYW1lfX1cIiBhdXRvY29tcGxldGU9XCJvZmZcIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiPjwvdmFsLWRhdGU+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS1TZSBzdHJpbmdhLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiVHlwZSA9PSAnc3RyaW5nJ1wiPlxyXG4gICAgICAgIDx2YWwtaW5wdXQgI3ZhbGlkYXRpb25Db250cm9sPVwibmdNb2RlbFwiIFtmb3JjZUludmFsaWRdPVwiRm9yY2VkRXJyb3JcIiBbbm9WYWxpZGF0ZV09XCIhVmFsaWRhdGlvblwiIFtyZWFkb25seV09XCJSZWFkb25seVwiIFtzdWJtaXR0ZWRdPVwiRm9ybT8uc3VibWl0dGVkXCIgdHlwZT1cInRleHRcIiBwYXR0ZXJuPVwie3tQYXR0ZXJuIHx8ICcnfX1cIiBbcmVxdWlyZWRdPVwiUmVxdWlyZWRcIiBbKG5nTW9kZWwpXT1cIk1vZGVsXCIgW2lkXT1cIkdlbmVyYXRlZE5hbWVcIiBuYW1lPVwie3tHZW5lcmF0ZWROYW1lfX1cIiBhdXRvY29tcGxldGU9XCJvZmZcIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiPjwvdmFsLWlucHV0PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tU2UgbnVtZXJvLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiVHlwZSA9PSAnZmxvYXQnIHx8IFR5cGUgPT0gJ251bWJlcidcIj5cclxuICAgICAgICA8dmFsLWlucHV0ICN2YWxpZGF0aW9uQ29udHJvbD1cIm5nTW9kZWxcIiBbZm9yY2VJbnZhbGlkXT1cIkZvcmNlZEVycm9yXCIgW25vVmFsaWRhdGVdPVwiIVZhbGlkYXRpb25cIiBbcmVhZG9ubHldPVwiUmVhZG9ubHlcIiBbc3VibWl0dGVkXT1cIkZvcm0/LnN1Ym1pdHRlZFwiIHR5cGU9XCJ0ZXh0XCIgcGF0dGVybj1cInt7UGF0dGVybiB8fCAnXihbMC05XSpbLF0pP1swLTldKyQnfX1cIiBbcmVxdWlyZWRdPVwiUmVxdWlyZWRcIiBbKG5nTW9kZWwpXT1cIk1vZGVsXCIgW2lkXT1cIkdlbmVyYXRlZE5hbWVcIiBuYW1lPVwie3tHZW5lcmF0ZWROYW1lfX1cIiBhdXRvY29tcGxldGU9XCJvZmZcIiAoaW5wdXRDaGFuZ2UpPVwiY2hhbmdlZCgpO1wiPjwvdmFsLWlucHV0PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tU2UgbnVtZXJvIGludGVyby0tPlxyXG4gICAgPGRpdiAqbmdJZj1cIlR5cGUgPT0gJ2ludCdcIj5cclxuICAgICAgICA8dmFsLWlucHV0ICN2YWxpZGF0aW9uQ29udHJvbD1cIm5nTW9kZWxcIiBbZm9yY2VJbnZhbGlkXT1cIkZvcmNlZEVycm9yXCIgW25vVmFsaWRhdGVdPVwiIVZhbGlkYXRpb25cIiBbcmVhZG9ubHldPVwiUmVhZG9ubHlcIiBbc3VibWl0dGVkXT1cIkZvcm0/LnN1Ym1pdHRlZFwiIHR5cGU9XCJ0ZXh0XCIgcGF0dGVybj1cInt7UGF0dGVybiB8fCAnXlswLTldXFxcXGQqJCd9fVwiIFtyZXF1aXJlZF09XCJSZXF1aXJlZFwiIFsobmdNb2RlbCldPVwiTW9kZWxcIiBbaWRdPVwiR2VuZXJhdGVkTmFtZVwiIG5hbWU9XCJ7e0dlbmVyYXRlZE5hbWV9fVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCI+PC92YWwtaW5wdXQ+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS1TZSBib29sZWFuLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwibS10LTVcIiAqbmdJZj1cIlR5cGUgPT0gJ2Jvb2xlYW4nXCI+XHJcbiAgICAgICAgPGlucHV0ICN2YWxpZGF0aW9uQ29udHJvbD1cIm5nTW9kZWxcIiBbcmVhZG9ubHldPVwiUmVhZG9ubHlcIiB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImFwcC1wb2ludGVyXCIgWyhuZ01vZGVsKV09XCJNb2RlbFwiIGlkPVwie3tHZW5lcmF0ZWROYW1lfX1cIiBuYW1lPVwie3tHZW5lcmF0ZWROYW1lfX1cIiAobmdNb2RlbENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLVNlIGVudW0tLT5cclxuICAgIDxkaXYgKm5nSWY9XCJUeXBlID09ICdlbnVtJ1wiPlxyXG4gICAgICAgIDx2YWwtc2VsZWN0ICN2YWxpZGF0aW9uQ29udHJvbD1cIm5nTW9kZWxcIiBbZm9yY2VJbnZhbGlkXT1cIkZvcmNlZEVycm9yXCIgW25vVmFsaWRhdGVdPVwiIVZhbGlkYXRpb25cIiBbcmVhZG9ubHldPVwiUmVhZG9ubHlcIiBbc3VibWl0dGVkXT1cIkZvcm0/LnN1Ym1pdHRlZFwiIFtwbGFjZUhvbGRlclZhbHVlXT1cIicnXCIgW3BsYWNlaG9sZGVyXT1cIlJlcXVpcmVkID8gKCdTZWxlY3QnIHwgbG9jYWxpemUgOiBsYykgKyAnLi4uJyA6IFBsYWNlaG9sZGVyXCIgW3JlcXVpcmVkXT1cIlJlcXVpcmVkXCIgWyhuZ01vZGVsKV09XCJNb2RlbFwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCIgW2lkXT1cIkdlbmVyYXRlZE5hbWVcIiBuYW1lPVwie3tHZW5lcmF0ZWROYW1lfX1cIj5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdmFsIG9mIEJvdW5kU291cmNlXCIgW3ZhbHVlXT1cInZhbC5pZFwiPnt7dmFsLmRlc2NyaXB0aW9ufX08L29wdGlvbj5cclxuICAgICAgICA8L3ZhbC1zZWxlY3Q+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS1TZSBhdXRvY29tcGxldGUtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJUeXBlID09ICdhdXRvY29tcGxldGUnXCI+XHJcbiAgICAgICAgPHZhbC1hdXRvY29tcGxldGUgI3ZhbGlkYXRpb25Db250cm9sPVwibmdNb2RlbFwiIFtmb3JjZUludmFsaWRdPVwiRm9yY2VkRXJyb3JcIiBbbm9WYWxpZGF0ZV09XCIhVmFsaWRhdGlvblwiIFtyZWFkb25seV09XCJSZWFkb25seVwiIFtzdWJtaXR0ZWRdPVwiRm9ybT8uc3VibWl0dGVkXCIgW3JlcXVpcmVkXT1cIlJlcXVpcmVkXCIgW3BsYWNlaG9sZGVyXT1cIlJlcXVpcmVkID8gKCdTZWxlY3QnIHwgbG9jYWxpemUgOiBsYykgKyAnLi4uJyA6IFBsYWNlaG9sZGVyXCIgWyhuZ01vZGVsKV09XCJNb2RlbFwiIFtpZF09XCJHZW5lcmF0ZWROYW1lXCIgbmFtZT1cInt7R2VuZXJhdGVkTmFtZX19XCIgW0ZpbHRlcmVkU291cmNlXT1cIkZpbHRlcmVkQm91bmRTb3VyY2VcIiAoaW5wdXRDaGFuZ2UpPVwiZmlsdGVyU291cmNlKCRldmVudCk7IGNoYW5nZWQoKTtcIj48L3ZhbC1hdXRvY29tcGxldGU+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS1TZSBkYXRlIHRpbWUtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJUeXBlID09ICdkYXRldGltZSdcIj5cclxuICAgICAgICA8dmFsLWRhdGV0aW1lICN2YWxpZGF0aW9uQ29udHJvbD1cIm5nTW9kZWxcIiBbZm9yY2VJbnZhbGlkXT1cIkZvcmNlZEVycm9yXCIgW25vVmFsaWRhdGVdPVwiIVZhbGlkYXRpb25cIiBbcmVhZG9ubHldPVwiUmVhZG9ubHlcIiBbc3VibWl0dGVkXT1cIkZvcm0/LnN1Ym1pdHRlZFwiIFtyZXF1aXJlZF09XCJSZXF1aXJlZFwiIFsobmdNb2RlbCldPVwiTW9kZWxcIiBbaWRdPVwiR2VuZXJhdGVkTmFtZVwiIG5hbWU9XCJ7e0dlbmVyYXRlZE5hbWV9fVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIChpbnB1dENoYW5nZSk9XCJjaGFuZ2VkKCk7XCI+PC92YWwtZGF0ZXRpbWU+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS1TZSB0aW1lLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiVHlwZSA9PSAndGltZSdcIj5cclxuICAgICAgICA8bmd4LW1hdC10aW1lcGlja2VyIG5hbWU9XCJ2YWwtdGltZVwiICNlbGVtZW50UmVmICNiYXNlSW5wdXQ9XCJuZ01vZGVsXCIgWyhuZ01vZGVsKV09XCJNb2RlbFwiIFtkaXNhYmxlZF09XCJSZWFkb25seVwiXHJcbiAgICAgICAgW3Nob3dTcGlubmVyc109XCJmYWxzZVwiIFtzdGVwSG91cl09XCIyXCIgW3N0ZXBNaW51dGVdPVwiNVwiIFtzdGVwU2Vjb25kXT1cIjMwXCJcclxuICAgICAgICBbc2hvd1NlY29uZHNdPVwidHJ1ZVwiIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZWQoKVwiICN2YWxpZGF0aW9uQ29udHJvbD1cIm5nTW9kZWxcIj5cclxuICAgICAgICA8L25neC1tYXQtdGltZXBpY2tlcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLVNlIGZpbGUtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJUeXBlID09ICdmaWxlJ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBmaWxlLXVwbG9hZFwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiAoY2hhbmdlKT1cImZpbGVDaGFuZ2UoKVwiICNmaWxlSW5wdXQgaWQ9XCJ7e0dlbmVyYXRlZE5hbWV9fVwiIGNsYXNzPVwiZmlsZS11cGxvYWQtYnRuIGFwcC1wb2ludGVyXCIgW211bHRpcGxlXT1cIm51bGxcIi8+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtjbGFzcy5mcm0tcGFkZGluZy1sZWZ0LTIyXT1cIkFsbG93RG93bmxvYWQgJiYgTW9kZWxGaWxlLmZpbGVuYW1lICYmIE1vZGVsRmlsZS5maWxlYjY0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgY2hlY2tpbmctZmllbGRcIiBwbGFjZWhvbGRlcj1cInt7J1NlbGVjdCBhIGZpbGUnIHwgbG9jYWxpemUgOiBsY319Li4uXCIgWyhuZ01vZGVsKV09XCJNb2RlbEZpbGUuZmlsZW5hbWVcIiBuYW1lPVwiZHNmaWxlXCIgI3ZhbGlkYXRpb25Db250cm9sPVwibmdNb2RlbFwiIFtyZXF1aXJlZF09XCJSZXF1aXJlZFwiLz5cclxuICAgIFxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImZhIGZhLWRvd25sb2FkIGFwcC1wb2ludGVyIGFwcC1pbnB1dC1pY29uXCIgKm5nSWY9XCJBbGxvd0Rvd25sb2FkICYmIE1vZGVsRmlsZS5maWxlbmFtZSAmJiBNb2RlbEZpbGUuZmlsZWI2NFwiIChjbGljayk9XCJkb3dubG9hZEF0dGFjaG1lbnQoKVwiPjwvYT5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10aW1lcyBkZWxldGUtZmlsZVwiIChjbGljayk9XCJmaWxlQ2hhbmdlKHRydWUpXCIgKm5nSWY9XCJNb2RlbEZpbGUuZmlsZW5hbWVcIj48L2k+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1maWxlLXVwbG9hZFwiIHR5cGU9XCJidXR0b25cIj48aSBjbGFzcz1cImZhIGZhLXVwbG9hZFwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19
@@ -0,0 +1,26 @@
1
+ import { Injectable, Inject, Optional } from "@angular/core";
2
+ import { LocalizationService } from "@esfaenza/localizations";
3
+ import { FAV_LOCALE } from '../../tokens';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Classe di localizzazione per il componente **FormAutocompleteComponent**
7
+ */
8
+ export class FormAutocompleteComponentLoc extends LocalizationService {
9
+ /**
10
+ * @ignore
11
+ */
12
+ constructor(LOC_LOCALE) {
13
+ super(LOC_LOCALE ?? 'it-IT');
14
+ }
15
+ }
16
+ FormAutocompleteComponentLoc.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: FormAutocompleteComponentLoc, deps: [{ token: FAV_LOCALE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
17
+ FormAutocompleteComponentLoc.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: FormAutocompleteComponentLoc });
18
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: FormAutocompleteComponentLoc, decorators: [{
19
+ type: Injectable
20
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
21
+ type: Optional
22
+ }, {
23
+ type: Inject,
24
+ args: [FAV_LOCALE]
25
+ }] }]; } });
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1hdXRvY29tcGxldGUuY29tcG9uZW50LmxvYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm1zLWFuZC12YWxpZGF0aW9ucy9zcmMvbGliL2Zvcm1zL2Zvcm0tYXV0b2NvbXBsZXRlL2Zvcm0tYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5sb2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBRTFDOztHQUVHO0FBRUgsTUFBTSxPQUFPLDRCQUE2QixTQUFRLG1CQUFtQjtJQUVqRTs7T0FFRztJQUNILFlBQTRDLFVBQWtCO1FBQzFELEtBQUssQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQzs7eUhBUFEsNEJBQTRCLGtCQUtMLFVBQVU7NkhBTGpDLDRCQUE0QjsyRkFBNUIsNEJBQTRCO2tCQUR4QyxVQUFVOzswQkFNTSxRQUFROzswQkFBSSxNQUFNOzJCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uU2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvbG9jYWxpemF0aW9uc1wiO1xyXG5pbXBvcnQgeyBGQVZfTE9DQUxFIH0gZnJvbSAnLi4vLi4vdG9rZW5zJztcclxuXHJcbi8qKlxyXG4gKiBDbGFzc2UgZGkgbG9jYWxpenphemlvbmUgcGVyIGlsIGNvbXBvbmVudGUgKipGb3JtQXV0b2NvbXBsZXRlQ29tcG9uZW50KipcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEZvcm1BdXRvY29tcGxldGVDb21wb25lbnRMb2MgZXh0ZW5kcyBMb2NhbGl6YXRpb25TZXJ2aWNlIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpZ25vcmVcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChGQVZfTE9DQUxFKSBMT0NfTE9DQUxFOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihMT0NfTE9DQUxFID8/ICdpdC1JVCcpO1xyXG4gICAgfVxyXG59Il19