@arsedizioni/ars-utils 18.2.235 → 18.2.236

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.
@@ -182,12 +182,12 @@ export class FileInputComponent {
182
182
  let f = e.target.files[0];
183
183
  this.fileName = f.name;
184
184
  this.fileSize = Math.round(f.size / (1024 * 1024));
185
- let fi = new FileInfo();
186
- fi.file = f;
187
- fi.valid =
185
+ let fileInfo = new FileInfo();
186
+ fileInfo.file = f;
187
+ fileInfo.valid =
188
188
  (!this.maxSizeMb || this.fileSize <= this.maxSizeMb()) &&
189
189
  (!this.minSizeMb || this.fileSize >= this.minSizeMb());
190
- this.writeValue(fi);
190
+ this.writeValue(fileInfo);
191
191
  }
192
192
  }
193
193
  /**
@@ -214,23 +214,23 @@ export class FileInputComponent {
214
214
  * Download
215
215
  */
216
216
  downloadFile() {
217
- if (!this.isNew)
217
+ if (!this.isNew())
218
218
  this.download.emit();
219
219
  }
220
220
  /**
221
221
  * Preview
222
222
  */
223
223
  previewFile() {
224
- if (!this.isNew && this.canPreview())
224
+ if (!this.isNew() && this.canPreview())
225
225
  this.preview.emit();
226
226
  }
227
227
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: FileInputComponent, deps: [{ token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
228
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.1", type: FileInputComponent, isStandalone: true, selector: "file-input", inputs: { required: { classPropertyName: "required", publicName: "required", isSignal: false, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: false, isRequired: false, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: false, isRequired: false, transformFunction: null }, maxSizeMb: { classPropertyName: "maxSizeMb", publicName: "maxSizeMb", isSignal: true, isRequired: false, transformFunction: null }, minSizeMb: { classPropertyName: "minSizeMb", publicName: "minSizeMb", isSignal: true, isRequired: false, transformFunction: null }, isNew: { classPropertyName: "isNew", publicName: "isNew", isSignal: true, isRequired: false, transformFunction: null }, canPreview: { classPropertyName: "canPreview", publicName: "canPreview", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { changed: "changed", download: "download", preview: "preview" }, host: { properties: { "id": "this.id", "class.floating": "this.shouldLabelFloat", "attr.aria-describedBy": "this.describedBy" } }, providers: [{ provide: MatFormFieldControl, useExisting: FileInputComponent }], viewQueries: [{ propertyName: "__file", first: true, predicate: ["__file"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-form-field style=\"width:100%\" [appearance]=\"appearance()\">\r\n <mat-label>{{placeholder}}</mat-label>\r\n <input type=\"file\" [hidden]=\"true\" [accept]=\"accept()\" (change)=\"selectFile($event)\" #__file />\r\n <input name=\"_fileName\" #_fileName=\"ngModel\" [(ngModel)]=\"fileName\" [id]=\"id\" matInput readonly [required]=\"required\"\r\n fileSize [size]=\"fileSize\" [maxSizeMb]=\"maxSizeMb()\" [minSizeMb]=\"minSizeMb()\" [disabled]=\"disabled\" />\r\n @if (hasFile()) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\" (click)=\"clearFile()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (!disabled) {\r\n <button type=\"button\" type=\"button\" mat-icon-button matSuffix (click)=\"__file.click()\" aria-label=\"Seleziona file\"\r\n matTooltip=\"Seleziona\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n @if (!isNew() && canPreview()) {\r\n <button type=\"button\" mat-icon-button matSuffix (click)=\"previewFile()\" aria-label=\"Anteprima\" matTooltip=\"Anteprima\">\r\n <mat-icon>preview</mat-icon>\r\n </button>\r\n }\r\n @if (!isNew) {\r\n<button type=\"button\" mat-icon-button matSuffix (click)=\"downloadFile()\" aria-label=\"Scarica file\"\r\n matTooltip=\"Scarica\">\r\n <mat-icon>save_alt</mat-icon>\r\n</button>\r\n}\r\n @if (hasFile() && fileSize > 0) {\r\n<mat-hint align=\"left\">{{fileSize}} MB</mat-hint>\r\n}\r\n @if (hasFile() && fileSize == 0) {\r\n<mat-hint align=\"left\">\r\n < 1 MB</mat-hint>\r\n} @if (maxSizeMb()) {\r\n<mat-hint align=\"end\">Massimo {{maxSizeMb()}} MB\r\n </mat-hint>\r\n}\r\n @if (_fileName.invalid && !hasFile()) {\r\n<mat-error>Obbligatorio.</mat-error>\r\n}\r\n @if (_fileName.invalid && hasFile()) {\r\n<mat-error>Dimensione non consentita.</mat-error>\r\n}\r\n</mat-form-field>", styles: [""], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: FileSizeValidatorDirective, selector: "[fileSize]", inputs: ["maxSizeMb", "minSizeMb", "size"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
228
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.1", type: FileInputComponent, isStandalone: true, selector: "file-input", inputs: { required: { classPropertyName: "required", publicName: "required", isSignal: false, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: false, isRequired: false, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: false, isRequired: false, transformFunction: null }, maxSizeMb: { classPropertyName: "maxSizeMb", publicName: "maxSizeMb", isSignal: true, isRequired: false, transformFunction: null }, minSizeMb: { classPropertyName: "minSizeMb", publicName: "minSizeMb", isSignal: true, isRequired: false, transformFunction: null }, isNew: { classPropertyName: "isNew", publicName: "isNew", isSignal: true, isRequired: false, transformFunction: null }, canPreview: { classPropertyName: "canPreview", publicName: "canPreview", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { changed: "changed", download: "download", preview: "preview" }, host: { properties: { "id": "this.id", "class.floating": "this.shouldLabelFloat", "attr.aria-describedBy": "this.describedBy" } }, providers: [{ provide: MatFormFieldControl, useExisting: FileInputComponent }], viewQueries: [{ propertyName: "__file", first: true, predicate: ["__file"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-form-field style=\"width:100%\" [appearance]=\"appearance()\">\r\n <mat-label>{{placeholder}}</mat-label>\r\n <input type=\"file\" [hidden]=\"true\" [accept]=\"accept()\" (change)=\"selectFile($event)\" #__file />\r\n <input name=\"_fileName\" #_fileName=\"ngModel\" [(ngModel)]=\"fileName\" [id]=\"id\" matInput readonly [required]=\"required\"\r\n fileSize [size]=\"fileSize\" [maxSizeMb]=\"maxSizeMb()\" [minSizeMb]=\"minSizeMb()\" [disabled]=\"disabled\" />\r\n @if (hasFile()) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\" (click)=\"clearFile()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (!disabled) {\r\n <button type=\"button\" type=\"button\" mat-icon-button matSuffix (click)=\"__file.click()\" aria-label=\"Seleziona file\"\r\n matTooltip=\"Seleziona\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n @if (!isNew() && canPreview()) {\r\n <button type=\"button\" mat-icon-button matSuffix (click)=\"previewFile()\" aria-label=\"Anteprima\" matTooltip=\"Anteprima\">\r\n <mat-icon>preview</mat-icon>\r\n </button>\r\n }\r\n @if (!isNew()) {\r\n<button type=\"button\" mat-icon-button matSuffix (click)=\"downloadFile()\" aria-label=\"Scarica file\"\r\n matTooltip=\"Scarica\">\r\n <mat-icon>save_alt</mat-icon>\r\n</button>\r\n}\r\n @if (hasFile() && fileSize > 0) {\r\n<mat-hint align=\"left\">{{fileSize}} MB</mat-hint>\r\n}\r\n @if (hasFile() && fileSize == 0) {\r\n<mat-hint align=\"left\">\r\n < 1 MB</mat-hint>\r\n} @if (maxSizeMb()) {\r\n<mat-hint align=\"end\">Massimo {{maxSizeMb()}} MB\r\n </mat-hint>\r\n}\r\n @if (_fileName.invalid && !hasFile()) {\r\n<mat-error>Obbligatorio.</mat-error>\r\n}\r\n @if (_fileName.invalid && hasFile()) {\r\n<mat-error>Dimensione non consentita.</mat-error>\r\n}\r\n</mat-form-field>", styles: [""], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: FileSizeValidatorDirective, selector: "[fileSize]", inputs: ["maxSizeMb", "minSizeMb", "size"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
229
229
  }
230
230
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: FileInputComponent, decorators: [{
231
231
  type: Component,
232
232
  args: [{ selector: 'file-input', providers: [{ provide: MatFormFieldControl, useExisting: FileInputComponent }], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatFormFieldModule, MatInputModule, FormsModule, FileSizeValidatorDirective, MatButtonModule,
233
- MatIconModule, MatTooltipModule], template: "<mat-form-field style=\"width:100%\" [appearance]=\"appearance()\">\r\n <mat-label>{{placeholder}}</mat-label>\r\n <input type=\"file\" [hidden]=\"true\" [accept]=\"accept()\" (change)=\"selectFile($event)\" #__file />\r\n <input name=\"_fileName\" #_fileName=\"ngModel\" [(ngModel)]=\"fileName\" [id]=\"id\" matInput readonly [required]=\"required\"\r\n fileSize [size]=\"fileSize\" [maxSizeMb]=\"maxSizeMb()\" [minSizeMb]=\"minSizeMb()\" [disabled]=\"disabled\" />\r\n @if (hasFile()) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\" (click)=\"clearFile()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (!disabled) {\r\n <button type=\"button\" type=\"button\" mat-icon-button matSuffix (click)=\"__file.click()\" aria-label=\"Seleziona file\"\r\n matTooltip=\"Seleziona\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n @if (!isNew() && canPreview()) {\r\n <button type=\"button\" mat-icon-button matSuffix (click)=\"previewFile()\" aria-label=\"Anteprima\" matTooltip=\"Anteprima\">\r\n <mat-icon>preview</mat-icon>\r\n </button>\r\n }\r\n @if (!isNew) {\r\n<button type=\"button\" mat-icon-button matSuffix (click)=\"downloadFile()\" aria-label=\"Scarica file\"\r\n matTooltip=\"Scarica\">\r\n <mat-icon>save_alt</mat-icon>\r\n</button>\r\n}\r\n @if (hasFile() && fileSize > 0) {\r\n<mat-hint align=\"left\">{{fileSize}} MB</mat-hint>\r\n}\r\n @if (hasFile() && fileSize == 0) {\r\n<mat-hint align=\"left\">\r\n < 1 MB</mat-hint>\r\n} @if (maxSizeMb()) {\r\n<mat-hint align=\"end\">Massimo {{maxSizeMb()}} MB\r\n </mat-hint>\r\n}\r\n @if (_fileName.invalid && !hasFile()) {\r\n<mat-error>Obbligatorio.</mat-error>\r\n}\r\n @if (_fileName.invalid && hasFile()) {\r\n<mat-error>Dimensione non consentita.</mat-error>\r\n}\r\n</mat-form-field>" }]
233
+ MatIconModule, MatTooltipModule], template: "<mat-form-field style=\"width:100%\" [appearance]=\"appearance()\">\r\n <mat-label>{{placeholder}}</mat-label>\r\n <input type=\"file\" [hidden]=\"true\" [accept]=\"accept()\" (change)=\"selectFile($event)\" #__file />\r\n <input name=\"_fileName\" #_fileName=\"ngModel\" [(ngModel)]=\"fileName\" [id]=\"id\" matInput readonly [required]=\"required\"\r\n fileSize [size]=\"fileSize\" [maxSizeMb]=\"maxSizeMb()\" [minSizeMb]=\"minSizeMb()\" [disabled]=\"disabled\" />\r\n @if (hasFile()) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\" (click)=\"clearFile()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (!disabled) {\r\n <button type=\"button\" type=\"button\" mat-icon-button matSuffix (click)=\"__file.click()\" aria-label=\"Seleziona file\"\r\n matTooltip=\"Seleziona\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n @if (!isNew() && canPreview()) {\r\n <button type=\"button\" mat-icon-button matSuffix (click)=\"previewFile()\" aria-label=\"Anteprima\" matTooltip=\"Anteprima\">\r\n <mat-icon>preview</mat-icon>\r\n </button>\r\n }\r\n @if (!isNew()) {\r\n<button type=\"button\" mat-icon-button matSuffix (click)=\"downloadFile()\" aria-label=\"Scarica file\"\r\n matTooltip=\"Scarica\">\r\n <mat-icon>save_alt</mat-icon>\r\n</button>\r\n}\r\n @if (hasFile() && fileSize > 0) {\r\n<mat-hint align=\"left\">{{fileSize}} MB</mat-hint>\r\n}\r\n @if (hasFile() && fileSize == 0) {\r\n<mat-hint align=\"left\">\r\n < 1 MB</mat-hint>\r\n} @if (maxSizeMb()) {\r\n<mat-hint align=\"end\">Massimo {{maxSizeMb()}} MB\r\n </mat-hint>\r\n}\r\n @if (_fileName.invalid && !hasFile()) {\r\n<mat-error>Obbligatorio.</mat-error>\r\n}\r\n @if (_fileName.invalid && hasFile()) {\r\n<mat-error>Dimensione non consentita.</mat-error>\r\n}\r\n</mat-form-field>" }]
234
234
  }], ctorParameters: () => [{ type: i1.NgControl, decorators: [{
235
235
  type: Optional
236
236
  }, {
@@ -261,4 +261,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImpor
261
261
  }], preview: [{
262
262
  type: Output
263
263
  }] } });
264
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvdWkuYXBwbGljYXRpb24vdWkvY29tcG9uZW50cy9maWxlLWlucHV0L2ZpbGUtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL3VpLmFwcGxpY2F0aW9uL3VpL2NvbXBvbmVudHMvZmlsZS1pbnB1dC9maWxlLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUF1QixZQUFZLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBd0IsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFpQixTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzTyxPQUFPLEVBQW1DLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxRQUFRLEVBQUUsMEJBQTBCLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxP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UUFBUTtnQkErQmYsUUFBUTtzQkFEWCxLQUFLO2dCQVVGLFFBQVE7c0JBRFgsS0FBSztnQkFnQkYsV0FBVztzQkFEZCxLQUFLO2dCQVNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBYVMsRUFBRTtzQkFBaEIsV0FBVztnQkFFUixnQkFBZ0I7c0JBRG5CLFdBQVc7dUJBQUMsZ0JBQWdCO2dCQUlTLFdBQVc7c0JBQWhELFdBQVc7dUJBQUMsdUJBQXVCO2dCQUUxQixPQUFPO3NCQUFoQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIERvQ2hlY2ssIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT3B0aW9uYWwsIE91dHB1dCwgUmVuZGVyZXIyLCBTZWxmLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIGluamVjdCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbCwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZENvbnRyb2wsIE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBGaWxlSW5mbywgRmlsZVNpemVWYWxpZGF0b3JEaXJlY3RpdmUsIFN5c3RlbVV0aWxzIH0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IFVJU2VydmljZSB9IGZyb20gJ0BhcnNlZGl6aW9uaS9hcnMtdXRpbHMvdWknO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2ZpbGUtaW5wdXQnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ZpbGUtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZmlsZS1pbnB1dC5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBNYXRGb3JtRmllbGRDb250cm9sLCB1c2VFeGlzdGluZzogRmlsZUlucHV0Q29tcG9uZW50IH1dLFxyXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICAgaW1wb3J0czogW01hdEZvcm1GaWVsZE1vZHVsZSwgTWF0SW5wdXRNb2R1bGUsIEZvcm1zTW9kdWxlLCBGaWxlU2l6ZVZhbGlkYXRvckRpcmVjdGl2ZSwgIE1hdEJ1dHRvbk1vZHVsZSwgXHJcbiAgICAgIE1hdEljb25Nb2R1bGUsIE1hdFRvb2x0aXBNb2R1bGVdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWxlSW5wdXRDb21wb25lbnRcclxuICBpbXBsZW1lbnRzXHJcbiAgT25EZXN0cm95LFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgRG9DaGVjayxcclxuICBPbkNoYW5nZXMsXHJcbiAgTWF0Rm9ybUZpZWxkQ29udHJvbDxGaWxlSW5mbz4sXHJcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICBAVmlld0NoaWxkKCdfX2ZpbGUnKSBfX2ZpbGUhOiBFbGVtZW50UmVmO1xyXG5cclxuICBwcml2YXRlIHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XHJcbiAgcHJpdmF0ZSB1aVNlcnZpY2UgPSBpbmplY3QoVUlTZXJ2aWNlKTtcclxuXHJcbiAgLy8gSW5pdGlhbGl6ZVxyXG4gIHN0YXRpYyBuZXh0SWQgPSAwO1xyXG4gIHJlYWRvbmx5IHN0YXRlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHJpdmF0ZSBwcmV2aW91c05hdGl2ZVZhbHVlOiBhbnk7XHJcbiAgY29udHJvbFR5cGU6IHN0cmluZyA9ICdmaWxlLWlucHV0JztcclxuICBmb2N1c2VkID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIGZpbGVTaXplOiBudW1iZXI7XHJcbiAgXHJcbiAgcHJvdGVjdGVkIGNhbkNhcHR1cmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfdmFsdWU6IEZpbGVJbmZvID0gbmV3IEZpbGVJbmZvKCk7XHJcbiAgc2V0IHZhbHVlKHZhbHVlOiBGaWxlSW5mbykge1xyXG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMuX3ZhbHVlKTtcclxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICAgIHRoaXMuY2hhbmdlZC5lbWl0KHRoaXMuX3ZhbHVlKTtcclxuICB9XHJcbiAgZ2V0IHZhbHVlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gIH1cclxuICBnZXQgc2l6ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl92YWx1ZSAmJiB0aGlzLl92YWx1ZS5maWxlLnNpemU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHJlcXVpcmVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xyXG4gIH1cclxuICBzZXQgcmVxdWlyZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3JlcXVpcmVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcclxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKVxyXG4gIGdldCBkaXNhYmxlZCgpIHtcclxuICAgIGlmICh0aGlzLm5nQ29udHJvbCAmJiB0aGlzLm5nQ29udHJvbC5kaXNhYmxlZCAhPSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm5nQ29udHJvbC5kaXNhYmxlZDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcclxuICB9XHJcbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XHJcbiAgICBpZiAodGhpcy5mb2N1c2VkKSB7XHJcbiAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgX3BsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKVxyXG4gIGdldCBwbGFjZWhvbGRlcigpIHtcclxuICAgIHJldHVybiB0aGlzLl9wbGFjZWhvbGRlcjtcclxuICB9XHJcbiAgc2V0IHBsYWNlaG9sZGVyKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdmFsdWU7XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBmaWxlTmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgbWF4U2l6ZU1iID0gaW5wdXQ8bnVtYmVyPig1KTtcclxuICBtaW5TaXplTWIgPSBpbnB1dDxudW1iZXI+KDApO1xyXG4gIGlzTmV3ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIGNhblByZXZpZXcgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XHJcbiAgYXBwZWFyYW5jZSA9IGlucHV0PCdmaWxsJyB8ICdvdXRsaW5lJyB8IG51bGw+KHRoaXMudWlTZXJ2aWNlLmFwcGVhcmFuY2UpO1xyXG4gIGFjY2VwdCA9IGlucHV0PHN0cmluZz4oKTtcclxuICBnZXQgZW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMuX3ZhbHVlIHx8ICF0aGlzLl92YWx1ZS5maWxlO1xyXG4gIH1cclxuICBnZXQgZXJyb3JTdGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm5nQ29udHJvbC5lcnJvcnMgIT0gbnVsbCAmJiB0aGlzLm5nQ29udHJvbC50b3VjaGVkO1xyXG4gIH1cclxuICBASG9zdEJpbmRpbmcoKSBpZCA9IGAke3RoaXMuY29udHJvbFR5cGV9LSR7RmlsZUlucHV0Q29tcG9uZW50Lm5leHRJZCsrfWA7XHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mbG9hdGluZycpXHJcbiAgZ2V0IHNob3VsZExhYmVsRmxvYXQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb2N1c2VkIHx8ICF0aGlzLmVtcHR5O1xyXG4gIH1cclxuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1kZXNjcmliZWRCeScpIGRlc2NyaWJlZEJ5ID0gJyc7XHJcblxyXG4gIEBPdXRwdXQoKSBjaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlSW5mbz4oKTtcclxuICBAT3V0cHV0KCkgZG93bmxvYWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgcHJldmlldyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBwcml2YXRlIHByb3BhZ2F0ZUNoYW5nZTogKF86IGFueSkgPT4gdm9pZCA9IChfOiBhbnkpID0+IHsgfTtcclxuICBwcml2YXRlIHByb3BhZ2F0ZVRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7IH07XHJcblxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sKSB7XHJcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGF3YWl0IHRoaXMuc2V0dXBEZXZpY2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXR1cCBjYXB0dXJlIGRldmljZXMgICBcclxuICAgKi9cclxuICBhc3luYyBzZXR1cERldmljZXMoKSB7XHJcbiAgICB0aGlzLmNhbkNhcHR1cmUgPSBmYWxzZTtcclxuICAgIGlmIChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzICYmIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoe1xyXG4gICAgICAgICAgdmlkZW86IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoc3RyZWFtKSB7XHJcbiAgICAgICAgICB0aGlzLmNhbkNhcHR1cmUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCB7IH1cclxuICAgIH1cclxuICAgIGlmICghdGhpcy5wbGFjZWhvbGRlcikge1xyXG4gICAgICB0aGlzLnBsYWNlaG9sZGVyID1cclxuICAgICAgICB0aGlzLmNhbkNhcHR1cmVcclxuICAgICAgICAgID8gXCJTZWxlemlvbmEgZmlsZSBvIGFjcXVpc2lzY2kgY29uIGZvdG9jYW1lcmFcIlxyXG4gICAgICAgICAgOiBcIlNlbGV6aW9uYSBmaWxlXCJcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIG5nRG9DaGVjaygpIHtcclxuICAgIHRoaXMudXBkYXRlSW5wdXREaXJ0eUNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlcy5jdXJyZW50VmFsdWUgIT0gY2hhbmdlcy5wcmV2aW91c1ZhbHVlKSB7XHJcbiAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKGNoYW5nZXMuY3VycmVudFZhbHVlKTtcclxuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZVRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIHNldERlc2NyaWJlZEJ5SWRzKGlkczogc3RyaW5nW10pIHtcclxuICAgIHRoaXMuZGVzY3JpYmVkQnkgPSBpZHMuam9pbignICcpO1xyXG4gIH1cclxuXHJcbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbikge1xyXG4gICAgaWYgKCFTeXN0ZW1VdGlscy5pc0Jyb3dzZXIoKSkgcmV0dXJuO1xyXG4gICAgbGV0IGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmlkKTtcclxuICAgIGlmIChlbGVtKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoZWxlbSwgJ2Rpc2FibGVkJywgaXNEaXNhYmxlZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNvbnRhaW5lckNsaWNrKCkge1xyXG4gICAgaWYgKCF0aGlzLmZvY3VzZWQpIHtcclxuICAgICAgaWYgKCFTeXN0ZW1VdGlscy5pc0Jyb3dzZXIoKSkgcmV0dXJuO1xyXG4gICAgICBsZXQgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuaWQpO1xyXG4gICAgICBpZiAoZWxlbSkge1xyXG4gICAgICAgIGVsZW0uZm9jdXMoKTtcclxuICAgICAgICB0aGlzLnByb3BhZ2F0ZVRvdWNoZWQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHVwZGF0ZUlucHV0RGlydHlDaGVjaygpIHtcclxuICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5fdmFsdWU7XHJcbiAgICBpZiAodGhpcy5wcmV2aW91c05hdGl2ZVZhbHVlICE9PSBuZXdWYWx1ZSkge1xyXG4gICAgICB0aGlzLnByZXZpb3VzTmF0aXZlVmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VsZWN0IGEgZmlsZVxyXG4gICAqIEBwYXJhbSBlIDogZXZlbnRcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgIHNlbGVjdEZpbGUoZTogYW55KSB7XHJcbiAgICBpZiAoZS50YXJnZXQuZmlsZXMpIHtcclxuICAgICAgbGV0IGYgPSBlLnRhcmdldC5maWxlc1swXTtcclxuICAgICAgdGhpcy5maWxlTmFtZSA9IGYubmFtZTtcclxuICAgICAgdGhpcy5maWxlU2l6ZSA9IE1hdGgucm91bmQoZi5zaXplIC8gKDEwMjQgKiAxMDI0KSk7XHJcbiAgICAgIGxldCBmaSA9IG5ldyBGaWxlSW5mbygpO1xyXG4gICAgICBmaS5maWxlID0gZjtcclxuICAgICAgZmkudmFsaWQgPVxyXG4gICAgICAgICghdGhpcy5tYXhTaXplTWIgfHwgdGhpcy5maWxlU2l6ZSA8PSB0aGlzLm1heFNpemVNYigpKSAmJlxyXG4gICAgICAgICghdGhpcy5taW5TaXplTWIgfHwgdGhpcy5maWxlU2l6ZSA+PSB0aGlzLm1pblNpemVNYigpKTtcclxuICAgICAgdGhpcy53cml0ZVZhbHVlKGZpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGEgZmlsZSBoYXMgYmVlbiBzZWxlY3RlZFxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBoYXNGaWxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlICYmIHRoaXMuX3ZhbHVlLmZpbGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciBmaWxlXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkICBjbGVhckZpbGUoKSB7XHJcbiAgICBpZiAodGhpcy5oYXNGaWxlKCkpIHtcclxuICAgICAgdGhpcy5maWxlTmFtZSA9IG51bGw7XHJcbiAgICAgIHRoaXMuZmlsZVNpemUgPSAwO1xyXG4gICAgICBsZXQgZmkgPSBuZXcgRmlsZUluZm8oKTtcclxuICAgICAgZmkuZmlsZSA9IG51bGw7XHJcbiAgICAgIGZpLnZhbGlkID0gIXRoaXMucmVxdWlyZWRcclxuICAgICAgdGhpcy53cml0ZVZhbHVlKGZpKTtcclxuICAgICAgdGhpcy5fX2ZpbGUubmF0aXZlRWxlbWVudC52YWx1ZSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEb3dubG9hZFxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCAgZG93bmxvYWRGaWxlKCkge1xyXG4gICAgaWYgKCF0aGlzLmlzTmV3KSB0aGlzLmRvd25sb2FkLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBQcmV2aWV3XHJcbiAqL1xyXG4gIHByb3RlY3RlZCBwcmV2aWV3RmlsZSgpIHtcclxuICAgIGlmICghdGhpcy5pc05ldyAmJiB0aGlzLmNhblByZXZpZXcoKSkgdGhpcy5wcmV2aWV3LmVtaXQoKTtcclxuICB9XHJcbn1cclxuIiwiPG1hdC1mb3JtLWZpZWxkIHN0eWxlPVwid2lkdGg6MTAwJVwiIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2UoKVwiPlxyXG4gIDxtYXQtbGFiZWw+e3twbGFjZWhvbGRlcn19PC9tYXQtbGFiZWw+XHJcbiAgPGlucHV0IHR5cGU9XCJmaWxlXCIgW2hpZGRlbl09XCJ0cnVlXCIgW2FjY2VwdF09XCJhY2NlcHQoKVwiIChjaGFuZ2UpPVwic2VsZWN0RmlsZSgkZXZlbnQpXCIgI19fZmlsZSAvPlxyXG4gIDxpbnB1dCBuYW1lPVwiX2ZpbGVOYW1lXCIgI19maWxlTmFtZT1cIm5nTW9kZWxcIiBbKG5nTW9kZWwpXT1cImZpbGVOYW1lXCIgW2lkXT1cImlkXCIgbWF0SW5wdXQgcmVhZG9ubHkgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcclxuICAgIGZpbGVTaXplIFtzaXplXT1cImZpbGVTaXplXCIgW21heFNpemVNYl09XCJtYXhTaXplTWIoKVwiIFttaW5TaXplTWJdPVwibWluU2l6ZU1iKClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAvPlxyXG4gIEBpZiAoaGFzRmlsZSgpKSB7XHJcbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggYXJpYS1sYWJlbD1cIkF6emVyYVwiIChjbGljayk9XCJjbGVhckZpbGUoKVwiPlxyXG4gICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICA8L2J1dHRvbj5cclxuICB9XHJcbiAgQGlmICghZGlzYWJsZWQpIHtcclxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCAoY2xpY2spPVwiX19maWxlLmNsaWNrKClcIiBhcmlhLWxhYmVsPVwiU2VsZXppb25hIGZpbGVcIlxyXG4gICAgbWF0VG9vbHRpcD1cIlNlbGV6aW9uYVwiPlxyXG4gICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XHJcbiAgPC9idXR0b24+XHJcbiAgfVxyXG4gIEBpZiAoIWlzTmV3KCkgJiYgY2FuUHJldmlldygpKSB7XHJcbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCAoY2xpY2spPVwicHJldmlld0ZpbGUoKVwiIGFyaWEtbGFiZWw9XCJBbnRlcHJpbWFcIiBtYXRUb29sdGlwPVwiQW50ZXByaW1hXCI+XHJcbiAgICA8bWF0LWljb24+cHJldmlldzwvbWF0LWljb24+XHJcbiAgPC9idXR0b24+XHJcbiAgfVxyXG4gIEBpZiAoIWlzTmV3KSB7XHJcbjxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggKGNsaWNrKT1cImRvd25sb2FkRmlsZSgpXCIgYXJpYS1sYWJlbD1cIlNjYXJpY2EgZmlsZVwiXHJcbiAgIG1hdFRvb2x0aXA9XCJTY2FyaWNhXCI+XHJcbiAgPG1hdC1pY29uPnNhdmVfYWx0PC9tYXQtaWNvbj5cclxuPC9idXR0b24+XHJcbn1cclxuICBAaWYgKGhhc0ZpbGUoKSAmJiBmaWxlU2l6ZSA+IDApIHtcclxuPG1hdC1oaW50IGFsaWduPVwibGVmdFwiPnt7ZmlsZVNpemV9fSBNQjwvbWF0LWhpbnQ+XHJcbn1cclxuICBAaWYgKGhhc0ZpbGUoKSAmJiBmaWxlU2l6ZSA9PSAwKSB7XHJcbjxtYXQtaGludCBhbGlnbj1cImxlZnRcIj5cclxuICAgIDwgMSBNQjwvbWF0LWhpbnQ+XHJcbn0gQGlmIChtYXhTaXplTWIoKSkge1xyXG48bWF0LWhpbnQgYWxpZ249XCJlbmRcIj5NYXNzaW1vIHt7bWF4U2l6ZU1iKCl9fSBNQlxyXG4gIDwvbWF0LWhpbnQ+XHJcbn1cclxuICBAaWYgKF9maWxlTmFtZS5pbnZhbGlkICYmICFoYXNGaWxlKCkpIHtcclxuPG1hdC1lcnJvcj5PYmJsaWdhdG9yaW8uPC9tYXQtZXJyb3I+XHJcbn1cclxuICBAaWYgKF9maWxlTmFtZS5pbnZhbGlkICYmIGhhc0ZpbGUoKSkge1xyXG48bWF0LWVycm9yPkRpbWVuc2lvbmUgbm9uIGNvbnNlbnRpdGEuPC9tYXQtZXJyb3I+XHJcbn1cclxuPC9tYXQtZm9ybS1maWVsZD4iXX0=
264
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvdWkuYXBwbGljYXRpb24vdWkvY29tcG9uZW50cy9maWxlLWlucHV0L2ZpbGUtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJzLXV0aWxzL3VpLmFwcGxpY2F0aW9uL3VpL2NvbXBvbmVudHMvZmlsZS1pbnB1dC9maWxlLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUF1QixZQUFZLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBd0IsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFpQixTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzTyxPQUFPLEVBQW1DLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxRQUFRLEVBQUUsMEJBQTBCLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxP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U0FBUzt1QkFBQyxRQUFRO2dCQStCZixRQUFRO3NCQURYLEtBQUs7Z0JBVUYsUUFBUTtzQkFEWCxLQUFLO2dCQWdCRixXQUFXO3NCQURkLEtBQUs7Z0JBU0csUUFBUTtzQkFBaEIsS0FBSztnQkFhUyxFQUFFO3NCQUFoQixXQUFXO2dCQUVSLGdCQUFnQjtzQkFEbkIsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBSVMsV0FBVztzQkFBaEQsV0FBVzt1QkFBQyx1QkFBdUI7Z0JBRTFCLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRG9DaGVjaywgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPcHRpb25hbCwgT3V0cHV0LCBSZW5kZXJlcjIsIFNlbGYsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgaW5qZWN0LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sLCBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkQ29udHJvbCwgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IEZpbGVJbmZvLCBGaWxlU2l6ZVZhbGlkYXRvckRpcmVjdGl2ZSwgU3lzdGVtVXRpbHMgfSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy91aSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnZmlsZS1pbnB1dCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1pbnB1dC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9maWxlLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE1hdEZvcm1GaWVsZENvbnRyb2wsIHVzZUV4aXN0aW5nOiBGaWxlSW5wdXRDb21wb25lbnQgfV0sXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBpbXBvcnRzOiBbTWF0Rm9ybUZpZWxkTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgRm9ybXNNb2R1bGUsIEZpbGVTaXplVmFsaWRhdG9yRGlyZWN0aXZlLCAgTWF0QnV0dG9uTW9kdWxlLCBcclxuICAgICAgTWF0SWNvbk1vZHVsZSwgTWF0VG9vbHRpcE1vZHVsZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIEZpbGVJbnB1dENvbXBvbmVudFxyXG4gIGltcGxlbWVudHNcclxuICBPbkRlc3Ryb3ksXHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBEb0NoZWNrLFxyXG4gIE9uQ2hhbmdlcyxcclxuICBNYXRGb3JtRmllbGRDb250cm9sPEZpbGVJbmZvPixcclxuICBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ19fZmlsZScpIF9fZmlsZSE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcclxuICBwcml2YXRlIHVpU2VydmljZSA9IGluamVjdChVSVNlcnZpY2UpO1xyXG5cclxuICAvLyBJbml0aWFsaXplXHJcbiAgc3RhdGljIG5leHRJZCA9IDA7XHJcbiAgcmVhZG9ubHkgc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBwcml2YXRlIHByZXZpb3VzTmF0aXZlVmFsdWU6IGFueTtcclxuICBjb250cm9sVHlwZTogc3RyaW5nID0gJ2ZpbGUtaW5wdXQnO1xyXG4gIGZvY3VzZWQgPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgZmlsZVNpemU6IG51bWJlcjtcclxuICBcclxuICBwcm90ZWN0ZWQgY2FuQ2FwdHVyZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIF92YWx1ZTogRmlsZUluZm8gPSBuZXcgRmlsZUluZm8oKTtcclxuICBzZXQgdmFsdWUodmFsdWU6IEZpbGVJbmZvKSB7XHJcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5fdmFsdWUpO1xyXG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG4gICAgdGhpcy5jaGFuZ2VkLmVtaXQodGhpcy5fdmFsdWUpO1xyXG4gIH1cclxuICBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XHJcbiAgfVxyXG4gIGdldCBzaXplKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlICYmIHRoaXMuX3ZhbHVlLmZpbGUuc2l6ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KClcclxuICBnZXQgcmVxdWlyZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XHJcbiAgfVxyXG4gIHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xyXG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG4gIH1cclxuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGRpc2FibGVkKCkge1xyXG4gICAgaWYgKHRoaXMubmdDb250cm9sICYmIHRoaXMubmdDb250cm9sLmRpc2FibGVkICE9IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubmdDb250cm9sLmRpc2FibGVkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xyXG4gIH1cclxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcclxuICAgIGlmICh0aGlzLmZvY3VzZWQpIHtcclxuICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBfcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHBsYWNlaG9sZGVyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xyXG4gIH1cclxuICBzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZTtcclxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIGZpbGVOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBtYXhTaXplTWIgPSBpbnB1dDxudW1iZXI+KDUpO1xyXG4gIG1pblNpemVNYiA9IGlucHV0PG51bWJlcj4oMCk7XHJcbiAgaXNOZXcgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XHJcbiAgY2FuUHJldmlldyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBhcHBlYXJhbmNlID0gaW5wdXQ8J2ZpbGwnIHwgJ291dGxpbmUnIHwgbnVsbD4odGhpcy51aVNlcnZpY2UuYXBwZWFyYW5jZSk7XHJcbiAgYWNjZXB0ID0gaW5wdXQ8c3RyaW5nPigpO1xyXG4gIGdldCBlbXB0eSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5fdmFsdWUgfHwgIXRoaXMuX3ZhbHVlLmZpbGU7XHJcbiAgfVxyXG4gIGdldCBlcnJvclN0YXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubmdDb250cm9sLmVycm9ycyAhPSBudWxsICYmIHRoaXMubmdDb250cm9sLnRvdWNoZWQ7XHJcbiAgfVxyXG4gIEBIb3N0QmluZGluZygpIGlkID0gYCR7dGhpcy5jb250cm9sVHlwZX0tJHtGaWxlSW5wdXRDb21wb25lbnQubmV4dElkKyt9YDtcclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZsb2F0aW5nJylcclxuICBnZXQgc2hvdWxkTGFiZWxGbG9hdCgpIHtcclxuICAgIHJldHVybiB0aGlzLmZvY3VzZWQgfHwgIXRoaXMuZW1wdHk7XHJcbiAgfVxyXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWRlc2NyaWJlZEJ5JykgZGVzY3JpYmVkQnkgPSAnJztcclxuXHJcbiAgQE91dHB1dCgpIGNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGVJbmZvPigpO1xyXG4gIEBPdXRwdXQoKSBkb3dubG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBwcmV2aWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIHByaXZhdGUgcHJvcGFnYXRlQ2hhbmdlOiAoXzogYW55KSA9PiB2b2lkID0gKF86IGFueSkgPT4geyB9O1xyXG4gIHByaXZhdGUgcHJvcGFnYXRlVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHsgfTtcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBwdWJsaWMgbmdDb250cm9sOiBOZ0NvbnRyb2wpIHtcclxuICAgIGlmICh0aGlzLm5nQ29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgYXdhaXQgdGhpcy5zZXR1cERldmljZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIGNhcHR1cmUgZGV2aWNlcyAgIFxyXG4gICAqL1xyXG4gIGFzeW5jIHNldHVwRGV2aWNlcygpIHtcclxuICAgIHRoaXMuY2FuQ2FwdHVyZSA9IGZhbHNlO1xyXG4gICAgaWYgKG5hdmlnYXRvci5tZWRpYURldmljZXMgJiYgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7XHJcbiAgICAgICAgICB2aWRlbzogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChzdHJlYW0pIHtcclxuICAgICAgICAgIHRoaXMuY2FuQ2FwdHVyZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIHsgfVxyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnBsYWNlaG9sZGVyKSB7XHJcbiAgICAgIHRoaXMucGxhY2Vob2xkZXIgPVxyXG4gICAgICAgIHRoaXMuY2FuQ2FwdHVyZVxyXG4gICAgICAgICAgPyBcIlNlbGV6aW9uYSBmaWxlIG8gYWNxdWlzaXNjaSBjb24gZm90b2NhbWVyYVwiXHJcbiAgICAgICAgICA6IFwiU2VsZXppb25hIGZpbGVcIlxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdEb0NoZWNrKCkge1xyXG4gICAgdGhpcy51cGRhdGVJbnB1dERpcnR5Q2hlY2soKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzLmN1cnJlbnRWYWx1ZSAhPSBjaGFuZ2VzLnByZXZpb3VzVmFsdWUpIHtcclxuICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UoY2hhbmdlcy5jdXJyZW50VmFsdWUpO1xyXG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucHJvcGFnYXRlVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgc2V0RGVzY3JpYmVkQnlJZHMoaWRzOiBzdHJpbmdbXSkge1xyXG4gICAgdGhpcy5kZXNjcmliZWRCeSA9IGlkcy5qb2luKCcgJyk7XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKSB7XHJcbiAgICBpZiAoIVN5c3RlbVV0aWxzLmlzQnJvd3NlcigpKSByZXR1cm47XHJcbiAgICBsZXQgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuaWQpO1xyXG4gICAgaWYgKGVsZW0pIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShlbGVtLCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ29udGFpbmVyQ2xpY2soKSB7XHJcbiAgICBpZiAoIXRoaXMuZm9jdXNlZCkge1xyXG4gICAgICBpZiAoIVN5c3RlbVV0aWxzLmlzQnJvd3NlcigpKSByZXR1cm47XHJcbiAgICAgIGxldCBlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5pZCk7XHJcbiAgICAgIGlmIChlbGVtKSB7XHJcbiAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgIHRoaXMucHJvcGFnYXRlVG91Y2hlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgdXBkYXRlSW5wdXREaXJ0eUNoZWNrKCkge1xyXG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLl92YWx1ZTtcclxuICAgIGlmICh0aGlzLnByZXZpb3VzTmF0aXZlVmFsdWUgIT09IG5ld1ZhbHVlKSB7XHJcbiAgICAgIHRoaXMucHJldmlvdXNOYXRpdmVWYWx1ZSA9IG5ld1ZhbHVlO1xyXG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZWxlY3QgYSBmaWxlXHJcbiAgICogQHBhcmFtIGUgOiBldmVudFxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCAgc2VsZWN0RmlsZShlOiBhbnkpIHtcclxuICAgIGlmIChlLnRhcmdldC5maWxlcykge1xyXG4gICAgICBsZXQgZiA9IGUudGFyZ2V0LmZpbGVzWzBdO1xyXG4gICAgICB0aGlzLmZpbGVOYW1lID0gZi5uYW1lO1xyXG4gICAgICB0aGlzLmZpbGVTaXplID0gTWF0aC5yb3VuZChmLnNpemUgLyAoMTAyNCAqIDEwMjQpKTtcclxuICAgICAgbGV0IGZpbGVJbmZvID0gbmV3IEZpbGVJbmZvKCk7XHJcbiAgICAgIGZpbGVJbmZvLmZpbGUgPSBmO1xyXG4gICAgICBmaWxlSW5mby52YWxpZCA9XHJcbiAgICAgICAgKCF0aGlzLm1heFNpemVNYiB8fCB0aGlzLmZpbGVTaXplIDw9IHRoaXMubWF4U2l6ZU1iKCkpICYmXHJcbiAgICAgICAgKCF0aGlzLm1pblNpemVNYiB8fCB0aGlzLmZpbGVTaXplID49IHRoaXMubWluU2l6ZU1iKCkpO1xyXG4gICAgICB0aGlzLndyaXRlVmFsdWUoZmlsZUluZm8pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgYSBmaWxlIGhhcyBiZWVuIHNlbGVjdGVkXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGhhc0ZpbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgJiYgdGhpcy5fdmFsdWUuZmlsZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIGZpbGVcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgIGNsZWFyRmlsZSgpIHtcclxuICAgIGlmICh0aGlzLmhhc0ZpbGUoKSkge1xyXG4gICAgICB0aGlzLmZpbGVOYW1lID0gbnVsbDtcclxuICAgICAgdGhpcy5maWxlU2l6ZSA9IDA7XHJcbiAgICAgIGxldCBmaSA9IG5ldyBGaWxlSW5mbygpO1xyXG4gICAgICBmaS5maWxlID0gbnVsbDtcclxuICAgICAgZmkudmFsaWQgPSAhdGhpcy5yZXF1aXJlZFxyXG4gICAgICB0aGlzLndyaXRlVmFsdWUoZmkpO1xyXG4gICAgICB0aGlzLl9fZmlsZS5uYXRpdmVFbGVtZW50LnZhbHVlID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERvd25sb2FkXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkICBkb3dubG9hZEZpbGUoKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNOZXcoKSkgdGhpcy5kb3dubG9hZC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogUHJldmlld1xyXG4gKi9cclxuICBwcm90ZWN0ZWQgcHJldmlld0ZpbGUoKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNOZXcoKSAmJiB0aGlzLmNhblByZXZpZXcoKSkgdGhpcy5wcmV2aWV3LmVtaXQoKTtcclxuICB9XHJcbn1cclxuIiwiPG1hdC1mb3JtLWZpZWxkIHN0eWxlPVwid2lkdGg6MTAwJVwiIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2UoKVwiPlxyXG4gIDxtYXQtbGFiZWw+e3twbGFjZWhvbGRlcn19PC9tYXQtbGFiZWw+XHJcbiAgPGlucHV0IHR5cGU9XCJmaWxlXCIgW2hpZGRlbl09XCJ0cnVlXCIgW2FjY2VwdF09XCJhY2NlcHQoKVwiIChjaGFuZ2UpPVwic2VsZWN0RmlsZSgkZXZlbnQpXCIgI19fZmlsZSAvPlxyXG4gIDxpbnB1dCBuYW1lPVwiX2ZpbGVOYW1lXCIgI19maWxlTmFtZT1cIm5nTW9kZWxcIiBbKG5nTW9kZWwpXT1cImZpbGVOYW1lXCIgW2lkXT1cImlkXCIgbWF0SW5wdXQgcmVhZG9ubHkgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcclxuICAgIGZpbGVTaXplIFtzaXplXT1cImZpbGVTaXplXCIgW21heFNpemVNYl09XCJtYXhTaXplTWIoKVwiIFttaW5TaXplTWJdPVwibWluU2l6ZU1iKClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAvPlxyXG4gIEBpZiAoaGFzRmlsZSgpKSB7XHJcbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCItMVwiIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggYXJpYS1sYWJlbD1cIkF6emVyYVwiIChjbGljayk9XCJjbGVhckZpbGUoKVwiPlxyXG4gICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICA8L2J1dHRvbj5cclxuICB9XHJcbiAgQGlmICghZGlzYWJsZWQpIHtcclxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCAoY2xpY2spPVwiX19maWxlLmNsaWNrKClcIiBhcmlhLWxhYmVsPVwiU2VsZXppb25hIGZpbGVcIlxyXG4gICAgbWF0VG9vbHRpcD1cIlNlbGV6aW9uYVwiPlxyXG4gICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XHJcbiAgPC9idXR0b24+XHJcbiAgfVxyXG4gIEBpZiAoIWlzTmV3KCkgJiYgY2FuUHJldmlldygpKSB7XHJcbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCAoY2xpY2spPVwicHJldmlld0ZpbGUoKVwiIGFyaWEtbGFiZWw9XCJBbnRlcHJpbWFcIiBtYXRUb29sdGlwPVwiQW50ZXByaW1hXCI+XHJcbiAgICA8bWF0LWljb24+cHJldmlldzwvbWF0LWljb24+XHJcbiAgPC9idXR0b24+XHJcbiAgfVxyXG4gIEBpZiAoIWlzTmV3KCkpIHtcclxuPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCAoY2xpY2spPVwiZG93bmxvYWRGaWxlKClcIiBhcmlhLWxhYmVsPVwiU2NhcmljYSBmaWxlXCJcclxuICAgbWF0VG9vbHRpcD1cIlNjYXJpY2FcIj5cclxuICA8bWF0LWljb24+c2F2ZV9hbHQ8L21hdC1pY29uPlxyXG48L2J1dHRvbj5cclxufVxyXG4gIEBpZiAoaGFzRmlsZSgpICYmIGZpbGVTaXplID4gMCkge1xyXG48bWF0LWhpbnQgYWxpZ249XCJsZWZ0XCI+e3tmaWxlU2l6ZX19IE1CPC9tYXQtaGludD5cclxufVxyXG4gIEBpZiAoaGFzRmlsZSgpICYmIGZpbGVTaXplID09IDApIHtcclxuPG1hdC1oaW50IGFsaWduPVwibGVmdFwiPlxyXG4gICAgPCAxIE1CPC9tYXQtaGludD5cclxufSBAaWYgKG1heFNpemVNYigpKSB7XHJcbjxtYXQtaGludCBhbGlnbj1cImVuZFwiPk1hc3NpbW8ge3ttYXhTaXplTWIoKX19IE1CXHJcbiAgPC9tYXQtaGludD5cclxufVxyXG4gIEBpZiAoX2ZpbGVOYW1lLmludmFsaWQgJiYgIWhhc0ZpbGUoKSkge1xyXG48bWF0LWVycm9yPk9iYmxpZ2F0b3Jpby48L21hdC1lcnJvcj5cclxufVxyXG4gIEBpZiAoX2ZpbGVOYW1lLmludmFsaWQgJiYgaGFzRmlsZSgpKSB7XHJcbjxtYXQtZXJyb3I+RGltZW5zaW9uZSBub24gY29uc2VudGl0YS48L21hdC1lcnJvcj5cclxufVxyXG48L21hdC1mb3JtLWZpZWxkPiJdfQ==
@@ -1461,12 +1461,12 @@ class FileInputComponent {
1461
1461
  let f = e.target.files[0];
1462
1462
  this.fileName = f.name;
1463
1463
  this.fileSize = Math.round(f.size / (1024 * 1024));
1464
- let fi = new FileInfo();
1465
- fi.file = f;
1466
- fi.valid =
1464
+ let fileInfo = new FileInfo();
1465
+ fileInfo.file = f;
1466
+ fileInfo.valid =
1467
1467
  (!this.maxSizeMb || this.fileSize <= this.maxSizeMb()) &&
1468
1468
  (!this.minSizeMb || this.fileSize >= this.minSizeMb());
1469
- this.writeValue(fi);
1469
+ this.writeValue(fileInfo);
1470
1470
  }
1471
1471
  }
1472
1472
  /**
@@ -1493,23 +1493,23 @@ class FileInputComponent {
1493
1493
  * Download
1494
1494
  */
1495
1495
  downloadFile() {
1496
- if (!this.isNew)
1496
+ if (!this.isNew())
1497
1497
  this.download.emit();
1498
1498
  }
1499
1499
  /**
1500
1500
  * Preview
1501
1501
  */
1502
1502
  previewFile() {
1503
- if (!this.isNew && this.canPreview())
1503
+ if (!this.isNew() && this.canPreview())
1504
1504
  this.preview.emit();
1505
1505
  }
1506
1506
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: FileInputComponent, deps: [{ token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
1507
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.1", type: FileInputComponent, isStandalone: true, selector: "file-input", inputs: { required: { classPropertyName: "required", publicName: "required", isSignal: false, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: false, isRequired: false, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: false, isRequired: false, transformFunction: null }, maxSizeMb: { classPropertyName: "maxSizeMb", publicName: "maxSizeMb", isSignal: true, isRequired: false, transformFunction: null }, minSizeMb: { classPropertyName: "minSizeMb", publicName: "minSizeMb", isSignal: true, isRequired: false, transformFunction: null }, isNew: { classPropertyName: "isNew", publicName: "isNew", isSignal: true, isRequired: false, transformFunction: null }, canPreview: { classPropertyName: "canPreview", publicName: "canPreview", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { changed: "changed", download: "download", preview: "preview" }, host: { properties: { "id": "this.id", "class.floating": "this.shouldLabelFloat", "attr.aria-describedBy": "this.describedBy" } }, providers: [{ provide: MatFormFieldControl, useExisting: FileInputComponent }], viewQueries: [{ propertyName: "__file", first: true, predicate: ["__file"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-form-field style=\"width:100%\" [appearance]=\"appearance()\">\r\n <mat-label>{{placeholder}}</mat-label>\r\n <input type=\"file\" [hidden]=\"true\" [accept]=\"accept()\" (change)=\"selectFile($event)\" #__file />\r\n <input name=\"_fileName\" #_fileName=\"ngModel\" [(ngModel)]=\"fileName\" [id]=\"id\" matInput readonly [required]=\"required\"\r\n fileSize [size]=\"fileSize\" [maxSizeMb]=\"maxSizeMb()\" [minSizeMb]=\"minSizeMb()\" [disabled]=\"disabled\" />\r\n @if (hasFile()) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\" (click)=\"clearFile()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (!disabled) {\r\n <button type=\"button\" type=\"button\" mat-icon-button matSuffix (click)=\"__file.click()\" aria-label=\"Seleziona file\"\r\n matTooltip=\"Seleziona\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n @if (!isNew() && canPreview()) {\r\n <button type=\"button\" mat-icon-button matSuffix (click)=\"previewFile()\" aria-label=\"Anteprima\" matTooltip=\"Anteprima\">\r\n <mat-icon>preview</mat-icon>\r\n </button>\r\n }\r\n @if (!isNew) {\r\n<button type=\"button\" mat-icon-button matSuffix (click)=\"downloadFile()\" aria-label=\"Scarica file\"\r\n matTooltip=\"Scarica\">\r\n <mat-icon>save_alt</mat-icon>\r\n</button>\r\n}\r\n @if (hasFile() && fileSize > 0) {\r\n<mat-hint align=\"left\">{{fileSize}} MB</mat-hint>\r\n}\r\n @if (hasFile() && fileSize == 0) {\r\n<mat-hint align=\"left\">\r\n < 1 MB</mat-hint>\r\n} @if (maxSizeMb()) {\r\n<mat-hint align=\"end\">Massimo {{maxSizeMb()}} MB\r\n </mat-hint>\r\n}\r\n @if (_fileName.invalid && !hasFile()) {\r\n<mat-error>Obbligatorio.</mat-error>\r\n}\r\n @if (_fileName.invalid && hasFile()) {\r\n<mat-error>Dimensione non consentita.</mat-error>\r\n}\r\n</mat-form-field>", styles: [""], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: FileSizeValidatorDirective, selector: "[fileSize]", inputs: ["maxSizeMb", "minSizeMb", "size"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1507
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.1", type: FileInputComponent, isStandalone: true, selector: "file-input", inputs: { required: { classPropertyName: "required", publicName: "required", isSignal: false, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: false, isRequired: false, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: false, isRequired: false, transformFunction: null }, maxSizeMb: { classPropertyName: "maxSizeMb", publicName: "maxSizeMb", isSignal: true, isRequired: false, transformFunction: null }, minSizeMb: { classPropertyName: "minSizeMb", publicName: "minSizeMb", isSignal: true, isRequired: false, transformFunction: null }, isNew: { classPropertyName: "isNew", publicName: "isNew", isSignal: true, isRequired: false, transformFunction: null }, canPreview: { classPropertyName: "canPreview", publicName: "canPreview", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { changed: "changed", download: "download", preview: "preview" }, host: { properties: { "id": "this.id", "class.floating": "this.shouldLabelFloat", "attr.aria-describedBy": "this.describedBy" } }, providers: [{ provide: MatFormFieldControl, useExisting: FileInputComponent }], viewQueries: [{ propertyName: "__file", first: true, predicate: ["__file"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-form-field style=\"width:100%\" [appearance]=\"appearance()\">\r\n <mat-label>{{placeholder}}</mat-label>\r\n <input type=\"file\" [hidden]=\"true\" [accept]=\"accept()\" (change)=\"selectFile($event)\" #__file />\r\n <input name=\"_fileName\" #_fileName=\"ngModel\" [(ngModel)]=\"fileName\" [id]=\"id\" matInput readonly [required]=\"required\"\r\n fileSize [size]=\"fileSize\" [maxSizeMb]=\"maxSizeMb()\" [minSizeMb]=\"minSizeMb()\" [disabled]=\"disabled\" />\r\n @if (hasFile()) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\" (click)=\"clearFile()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (!disabled) {\r\n <button type=\"button\" type=\"button\" mat-icon-button matSuffix (click)=\"__file.click()\" aria-label=\"Seleziona file\"\r\n matTooltip=\"Seleziona\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n @if (!isNew() && canPreview()) {\r\n <button type=\"button\" mat-icon-button matSuffix (click)=\"previewFile()\" aria-label=\"Anteprima\" matTooltip=\"Anteprima\">\r\n <mat-icon>preview</mat-icon>\r\n </button>\r\n }\r\n @if (!isNew()) {\r\n<button type=\"button\" mat-icon-button matSuffix (click)=\"downloadFile()\" aria-label=\"Scarica file\"\r\n matTooltip=\"Scarica\">\r\n <mat-icon>save_alt</mat-icon>\r\n</button>\r\n}\r\n @if (hasFile() && fileSize > 0) {\r\n<mat-hint align=\"left\">{{fileSize}} MB</mat-hint>\r\n}\r\n @if (hasFile() && fileSize == 0) {\r\n<mat-hint align=\"left\">\r\n < 1 MB</mat-hint>\r\n} @if (maxSizeMb()) {\r\n<mat-hint align=\"end\">Massimo {{maxSizeMb()}} MB\r\n </mat-hint>\r\n}\r\n @if (_fileName.invalid && !hasFile()) {\r\n<mat-error>Obbligatorio.</mat-error>\r\n}\r\n @if (_fileName.invalid && hasFile()) {\r\n<mat-error>Dimensione non consentita.</mat-error>\r\n}\r\n</mat-form-field>", styles: [""], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: FileSizeValidatorDirective, selector: "[fileSize]", inputs: ["maxSizeMb", "minSizeMb", "size"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1508
1508
  }
1509
1509
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: FileInputComponent, decorators: [{
1510
1510
  type: Component,
1511
1511
  args: [{ selector: 'file-input', providers: [{ provide: MatFormFieldControl, useExisting: FileInputComponent }], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatFormFieldModule, MatInputModule, FormsModule, FileSizeValidatorDirective, MatButtonModule,
1512
- MatIconModule, MatTooltipModule], template: "<mat-form-field style=\"width:100%\" [appearance]=\"appearance()\">\r\n <mat-label>{{placeholder}}</mat-label>\r\n <input type=\"file\" [hidden]=\"true\" [accept]=\"accept()\" (change)=\"selectFile($event)\" #__file />\r\n <input name=\"_fileName\" #_fileName=\"ngModel\" [(ngModel)]=\"fileName\" [id]=\"id\" matInput readonly [required]=\"required\"\r\n fileSize [size]=\"fileSize\" [maxSizeMb]=\"maxSizeMb()\" [minSizeMb]=\"minSizeMb()\" [disabled]=\"disabled\" />\r\n @if (hasFile()) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\" (click)=\"clearFile()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (!disabled) {\r\n <button type=\"button\" type=\"button\" mat-icon-button matSuffix (click)=\"__file.click()\" aria-label=\"Seleziona file\"\r\n matTooltip=\"Seleziona\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n @if (!isNew() && canPreview()) {\r\n <button type=\"button\" mat-icon-button matSuffix (click)=\"previewFile()\" aria-label=\"Anteprima\" matTooltip=\"Anteprima\">\r\n <mat-icon>preview</mat-icon>\r\n </button>\r\n }\r\n @if (!isNew) {\r\n<button type=\"button\" mat-icon-button matSuffix (click)=\"downloadFile()\" aria-label=\"Scarica file\"\r\n matTooltip=\"Scarica\">\r\n <mat-icon>save_alt</mat-icon>\r\n</button>\r\n}\r\n @if (hasFile() && fileSize > 0) {\r\n<mat-hint align=\"left\">{{fileSize}} MB</mat-hint>\r\n}\r\n @if (hasFile() && fileSize == 0) {\r\n<mat-hint align=\"left\">\r\n < 1 MB</mat-hint>\r\n} @if (maxSizeMb()) {\r\n<mat-hint align=\"end\">Massimo {{maxSizeMb()}} MB\r\n </mat-hint>\r\n}\r\n @if (_fileName.invalid && !hasFile()) {\r\n<mat-error>Obbligatorio.</mat-error>\r\n}\r\n @if (_fileName.invalid && hasFile()) {\r\n<mat-error>Dimensione non consentita.</mat-error>\r\n}\r\n</mat-form-field>" }]
1512
+ MatIconModule, MatTooltipModule], template: "<mat-form-field style=\"width:100%\" [appearance]=\"appearance()\">\r\n <mat-label>{{placeholder}}</mat-label>\r\n <input type=\"file\" [hidden]=\"true\" [accept]=\"accept()\" (change)=\"selectFile($event)\" #__file />\r\n <input name=\"_fileName\" #_fileName=\"ngModel\" [(ngModel)]=\"fileName\" [id]=\"id\" matInput readonly [required]=\"required\"\r\n fileSize [size]=\"fileSize\" [maxSizeMb]=\"maxSizeMb()\" [minSizeMb]=\"minSizeMb()\" [disabled]=\"disabled\" />\r\n @if (hasFile()) {\r\n <button type=\"button\" tabindex=\"-1\" mat-icon-button matSuffix aria-label=\"Azzera\" (click)=\"clearFile()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if (!disabled) {\r\n <button type=\"button\" type=\"button\" mat-icon-button matSuffix (click)=\"__file.click()\" aria-label=\"Seleziona file\"\r\n matTooltip=\"Seleziona\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n @if (!isNew() && canPreview()) {\r\n <button type=\"button\" mat-icon-button matSuffix (click)=\"previewFile()\" aria-label=\"Anteprima\" matTooltip=\"Anteprima\">\r\n <mat-icon>preview</mat-icon>\r\n </button>\r\n }\r\n @if (!isNew()) {\r\n<button type=\"button\" mat-icon-button matSuffix (click)=\"downloadFile()\" aria-label=\"Scarica file\"\r\n matTooltip=\"Scarica\">\r\n <mat-icon>save_alt</mat-icon>\r\n</button>\r\n}\r\n @if (hasFile() && fileSize > 0) {\r\n<mat-hint align=\"left\">{{fileSize}} MB</mat-hint>\r\n}\r\n @if (hasFile() && fileSize == 0) {\r\n<mat-hint align=\"left\">\r\n < 1 MB</mat-hint>\r\n} @if (maxSizeMb()) {\r\n<mat-hint align=\"end\">Massimo {{maxSizeMb()}} MB\r\n </mat-hint>\r\n}\r\n @if (_fileName.invalid && !hasFile()) {\r\n<mat-error>Obbligatorio.</mat-error>\r\n}\r\n @if (_fileName.invalid && hasFile()) {\r\n<mat-error>Dimensione non consentita.</mat-error>\r\n}\r\n</mat-form-field>" }]
1513
1513
  }], ctorParameters: () => [{ type: i1.NgControl, decorators: [{
1514
1514
  type: Optional
1515
1515
  }, {