@sapphire-ion/framework 0.30.6 → 0.30.7

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.
@@ -80,7 +80,9 @@ export class InputFileComponent extends CustomInput {
80
80
  try {
81
81
  return imageTypes.includes(v.split('.')[v.split('.').length - 1]);
82
82
  }
83
- catch { }
83
+ catch {
84
+ return false;
85
+ }
84
86
  }
85
87
  get src() {
86
88
  return this.apiUrl + this._model;
@@ -99,11 +101,11 @@ export class InputFileComponent extends CustomInput {
99
101
  return this.lstLoading.indexOf(path) != -1;
100
102
  }
101
103
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InputFileComponent, deps: [{ token: i1.ControlContainer, host: true, optional: true, skipSelf: true }, { token: i0.ElementRef }, { token: i2.UtilsService }, { token: i3.ApiUrlProviderService }, { token: i4.StorageService }], target: i0.ɵɵFactoryTarget.Component }); }
102
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: InputFileComponent, selector: "input-file", inputs: { configuration: "configuration" }, providers: InputProviderFactory.GetProvider(InputFileComponent), usesInheritance: true, ngImport: i0, template: "<div class=\"flex relative overflow-hidden\">\r\n <ion-card [disabled]=\"loading || disabled\"\r\n class=\"!border-r-0 !rounded-r-none focus-within:on-focus ion-card-input\"\r\n [ngClass]=\"{\r\n 'invalid' : invalid,\r\n 'submitted': submitted,\r\n 'disabled': disabled,\r\n }\"\r\n >\r\n <ion-card-content>\r\n <ion-item lines=\"none\">\r\n <ion-input [readonly]=\"true\" class=\"!opacity-100\" labelPlacement=\"stacked\" [(ngModel)]=\"model\">\r\n <ion-text id=\"label\" [ngClass]=\"{'required': required}\" slot=\"label\"> {{label}} </ion-text>\r\n </ion-input>\r\n </ion-item>\r\n <div class=\"absolute h-full right-2 top-0 z-50 flex items-center justify-center\">\r\n <ion-button [id]=\"guid\" [disabled]=\"!(lstFiles.length > 1)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': lstFiles.length > 1 }\" \r\n size=\"small\" fill=\"outline\" color=\"medium\"\r\n >\r\n <ion-icon name=\"ellipsis-vertical\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n <div class=\"absolute h-full right-12 top-0 z-50 flex items-center justify-center\" [ngClass]=\"{'!z-0': !(_model && lstFiles.length == 1 && PopoverImg)}\" >\r\n <ion-button [id]=\"guid + 'image'\" [disabled]=\"!(_model && lstFiles.length == 1 && PopoverImg)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': _model && lstFiles.length == 1 && PopoverImg }\" \r\n size=\"small\" fill=\"outline\" color=\"medium\"\r\n >\r\n <ion-icon name=\"image\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n <div class=\"absolute h-full right-2 top-0 z-50 flex items-center justify-center\" [ngClass]=\"{'!z-0': !(_model && lstFiles.length == 1 && PopoverImg)}\" >\r\n <ion-button (click)=\"Download(_model.toString())\" [disabled]=\"!(_model && lstFiles.length == 1)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': _model && lstFiles.length == 1 }\" \r\n size=\"small\" fill=\"outline\"\r\n >\r\n <ion-icon name=\"cloud-download\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n @if (model) {\r\n <ion-progress-bar *ngVar=\"storageService.GetProgress(_model.toString()) as val\" [value]=\"val\" class=\"absolute bottom-0 left-0 w-full h-1 default-transition\" [ngClass]=\"{'!h-0': !val}\"></ion-progress-bar>\r\n }\r\n </ion-card-content>\r\n </ion-card>\r\n <div class=\"w-12\"> \r\n <ion-button (click)=\"Upload()\" class=\"m-0 h-full w-full rou on-hover rounded-r-2xl\" [disabled]=\"loading || disabled\" style=\"--border-width: 1px 1px 2px 1px; --border-radius: 0rem 1rem 1rem 0rem;\" size=\"small\" color=\"secondary\" fill=\"outline\"> \r\n <ion-icon slot=\"icon-only\" name=\"cloud-upload\"></ion-icon> \r\n </ion-button>\r\n </div>\r\n <input-loading [loading]=\"loading\"></input-loading>\r\n\r\n</div>\r\n\r\n@if (PopoverImg) {\r\n <ion-popover [trigger]=\"guid + 'image'\" [keepContentsMounted]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <image [src]=\"src\"></image> \r\n </ng-template>\r\n </ion-popover>\r\n}\r\n@if(configuration.multiple){\r\n <ion-popover [trigger]=\"guid\" [keepContentsMounted]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content class=\"p-0 bg-transparent\">\r\n <ion-list>\r\n @for (item of lstFiles; track item; let i = $index; let l = $last) {\r\n <section *ngVar=\"storageService.GetProgress(item) as val\">\r\n <ion-item style=\"--background: transparent\" lines=\"{{l ? 'none' : 'full'}}\" button [detail]=\"false\">\r\n\r\n <ion-icon name=\"download\" (click)=\"Download(item)\" slot=\"start\"></ion-icon> \r\n @if (ExtensionIsImage(item)) {\r\n <ion-icon [id]=\"guid + '-' + i + '-nested-popover'\" name=\"image\" slot=\"start\"></ion-icon> \r\n }\r\n\r\n <ion-label>{{Sanitize(item)}}</ion-label>\r\n <ion-text *ngIf=\"val != 0\" slot=\"end\" class=\"text-sm\"><b>{{val * 100 | number : '1.2-2'}}%</b></ion-text>\r\n </ion-item>\r\n <ion-progress-bar class=\"h-0 default-transition\" [ngClass]=\"{'h-1': val != 0 }\" [value]=\"val\"></ion-progress-bar>\r\n <ion-popover *ngIf=\"ExtensionIsImage(item)\" side=\"end\" alignment=\"center\" [trigger]=\"guid + '-' + i + '-nested-popover'\" [dismissOnSelect]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content *ngVar=\"isLoading(item) as isLoading\">\r\n @if(isLoading){\r\n <loading [loading]=\"isLoading\"></loading>\r\n }\r\n <image [hidden]=\"isLoading\" [src]=\"apiUrl + item\"></image>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n </section>\r\n }\r\n </ion-list>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n}\r\n", styles: ["ion-popover{--width: 30rem }\n", ".on-hover{background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%)}.on-hover:hover{transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input{margin:0;display:flex;height:100%;width:100%;align-items:center;justify-content:center;overflow:hidden;border-radius:1rem;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%);border-bottom-color:var(--ion-color-medium);border-right-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-top-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-left-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-width:1px 1px 2px 1px;min-height:58px;max-height:58px;height:58px}ion-card.ion-card-input:hover{background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input.submitted.invalid{border-color:color-mix(in srgb,var(--ion-color-danger) 75%,transparent 25%)!important}ion-card.ion-card-input.disabled{background-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%)!important}ion-card.ion-card-input ion-card-content{width:100%;height:100%;background-color:transparent;padding:0}ion-item{--background: transparent}ion-text#label.required:after{content:\"*\";color:var(--ion-color-danger);vertical-align:text-bottom;font-size:small}ion-text#label:not(.required):after{content:var(--input-opcional-label, \"(Opcional)\");color:var(--ion-color-medium);vertical-align:text-bottom;font-size:small}.on-focus{border-bottom-color:var(--ion-color-primary)}.focus-within\\:on-focus:focus-within{border-bottom-color:var(--ion-color-primary)}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i6.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i6.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i6.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i6.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i6.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearInputIcon", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i6.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i6.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i6.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i6.IonProgressBar, selector: "ion-progress-bar", inputs: ["buffer", "color", "mode", "reversed", "type", "value"] }, { kind: "component", type: i6.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i6.IonPopover, selector: "ion-popover" }, { kind: "directive", type: i6.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.NgVarDirective, selector: "[ngVar]", inputs: ["ngVar"] }, { kind: "component", type: i8.LoadingComponent, selector: "loading", inputs: ["text", "type", "loading"] }, { kind: "component", type: i9.ImageComponent, selector: "image", inputs: ["fill", "object", "src"] }, { kind: "component", type: i10.InputLoadingComponent, selector: "input-loading", inputs: ["loading"] }, { kind: "pipe", type: i5.DecimalPipe, name: "number" }] }); }
104
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: InputFileComponent, selector: "input-file", inputs: { configuration: "configuration" }, providers: InputProviderFactory.GetProvider(InputFileComponent), usesInheritance: true, ngImport: i0, template: "<div class=\"flex relative overflow-hidden\">\r\n <ion-card [disabled]=\"loading || disabled\"\r\n class=\"!border-r-0 !rounded-r-none focus-within:on-focus ion-card-input\"\r\n [ngClass]=\"{\r\n 'invalid' : invalid,\r\n 'submitted': submitted,\r\n 'disabled': disabled,\r\n }\"\r\n >\r\n <ion-card-content>\r\n <ion-item lines=\"none\">\r\n <ion-input [readonly]=\"true\" class=\"!opacity-100\" labelPlacement=\"stacked\" [(ngModel)]=\"model\">\r\n <ion-text id=\"label\" [ngClass]=\"{'required': required}\" slot=\"label\"> {{label}} </ion-text>\r\n </ion-input>\r\n </ion-item>\r\n <div class=\"absolute h-full right-2 top-0 z-50 flex items-center justify-center\">\r\n <ion-button [id]=\"guid\" [disabled]=\"!(lstFiles.length > 1)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': lstFiles.length > 1 }\" \r\n size=\"small\" fill=\"outline\" color=\"medium\"\r\n >\r\n <ion-icon name=\"ellipsis-vertical\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n <div class=\"absolute h-full right-12 top-0 z-50 flex items-center justify-center\" [ngClass]=\"{'!z-0': !(_model && lstFiles.length == 1 && PopoverImg)}\" >\r\n <ion-button [id]=\"guid + 'image'\" [disabled]=\"!(_model && lstFiles.length == 1 && PopoverImg)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': _model && lstFiles.length == 1 && PopoverImg }\" \r\n size=\"small\" fill=\"outline\" color=\"medium\"\r\n >\r\n <ion-icon name=\"image\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n <div class=\"absolute h-full right-2 top-0 z-50 flex items-center justify-center\" [ngClass]=\"{'!z-0': !(_model && lstFiles.length == 1 && PopoverImg)}\" >\r\n <ion-button (click)=\"Download(_model.toString())\" [disabled]=\"!(_model && lstFiles.length == 1)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': _model && lstFiles.length == 1 }\" \r\n size=\"small\" fill=\"outline\"\r\n >\r\n <ion-icon name=\"cloud-download\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n @if (model) {\r\n <ion-progress-bar *ngVar=\"storageService.GetProgress(_model.toString()) as val\" [value]=\"val\" class=\"absolute bottom-0 left-0 w-full h-1 default-transition\" [ngClass]=\"{'!h-0': !val}\"></ion-progress-bar>\r\n }\r\n </ion-card-content>\r\n </ion-card>\r\n <div class=\"w-12\"> \r\n <ion-button (click)=\"Upload()\" class=\"m-0 h-full w-full rou on-hover rounded-r-2xl\" [disabled]=\"loading || disabled\" style=\"--border-width: 1px 1px 2px 1px; --border-radius: 0rem 1rem 1rem 0rem;\" size=\"small\" color=\"secondary\" fill=\"outline\"> \r\n <ion-icon slot=\"icon-only\" name=\"cloud-upload\"></ion-icon> \r\n </ion-button>\r\n </div>\r\n <input-loading [loading]=\"loading\"></input-loading>\r\n\r\n</div>\r\n\r\n@if (PopoverImg && ExtensionIsImage(src)) {\r\n <ion-popover [trigger]=\"guid + 'image'\" [keepContentsMounted]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <image [src]=\"src\"></image> \r\n </ng-template>\r\n </ion-popover>\r\n}\r\n@if(configuration.multiple){\r\n <ion-popover [trigger]=\"guid\" [keepContentsMounted]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content class=\"p-0 bg-transparent\">\r\n <ion-list>\r\n @for (item of lstFiles; track item; let i = $index; let l = $last) {\r\n <section *ngVar=\"storageService.GetProgress(item) as val\">\r\n <ion-item style=\"--background: transparent\" lines=\"{{l ? 'none' : 'full'}}\" button [detail]=\"false\">\r\n\r\n <ion-icon name=\"download\" (click)=\"Download(item)\" slot=\"start\"></ion-icon> \r\n @if (ExtensionIsImage(item)) {\r\n <ion-icon [id]=\"guid + '-' + i + '-nested-popover'\" name=\"image\" slot=\"start\"></ion-icon> \r\n }\r\n\r\n <ion-label>{{Sanitize(item)}}</ion-label>\r\n <ion-text *ngIf=\"val != 0\" slot=\"end\" class=\"text-sm\"><b>{{val * 100 | number : '1.2-2'}}%</b></ion-text>\r\n </ion-item>\r\n <ion-progress-bar class=\"h-0 default-transition\" [ngClass]=\"{'h-1': val != 0 }\" [value]=\"val\"></ion-progress-bar>\r\n <ion-popover *ngIf=\"ExtensionIsImage(item)\" side=\"end\" alignment=\"center\" [trigger]=\"guid + '-' + i + '-nested-popover'\" [dismissOnSelect]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content *ngVar=\"isLoading(item) as isLoading\">\r\n @if(isLoading){\r\n <loading [loading]=\"isLoading\"></loading>\r\n }\r\n <image [hidden]=\"isLoading\" [src]=\"apiUrl + item\"></image>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n </section>\r\n }\r\n </ion-list>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n}\r\n", styles: ["ion-popover{--width: 30rem }\n", ".on-hover{background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%)}.on-hover:hover{transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input{margin:0;display:flex;height:100%;width:100%;align-items:center;justify-content:center;overflow:hidden;border-radius:1rem;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%);border-bottom-color:var(--ion-color-medium);border-right-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-top-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-left-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-width:1px 1px 2px 1px;min-height:58px;max-height:58px;height:58px}ion-card.ion-card-input:hover{background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input.submitted.invalid{border-color:color-mix(in srgb,var(--ion-color-danger) 75%,transparent 25%)!important}ion-card.ion-card-input.disabled{background-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%)!important}ion-card.ion-card-input ion-card-content{width:100%;height:100%;background-color:transparent;padding:0}ion-item{--background: transparent}ion-text#label.required:after{content:\"*\";color:var(--ion-color-danger);vertical-align:text-bottom;font-size:small}ion-text#label:not(.required):after{content:var(--input-opcional-label, \"(Opcional)\");color:var(--ion-color-medium);vertical-align:text-bottom;font-size:small}.on-focus{border-bottom-color:var(--ion-color-primary)}.focus-within\\:on-focus:focus-within{border-bottom-color:var(--ion-color-primary)}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i6.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i6.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i6.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i6.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i6.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearInputIcon", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i6.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i6.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i6.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i6.IonProgressBar, selector: "ion-progress-bar", inputs: ["buffer", "color", "mode", "reversed", "type", "value"] }, { kind: "component", type: i6.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i6.IonPopover, selector: "ion-popover" }, { kind: "directive", type: i6.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.NgVarDirective, selector: "[ngVar]", inputs: ["ngVar"] }, { kind: "component", type: i8.LoadingComponent, selector: "loading", inputs: ["text", "type", "loading"] }, { kind: "component", type: i9.ImageComponent, selector: "image", inputs: ["fill", "object", "src"] }, { kind: "component", type: i10.InputLoadingComponent, selector: "input-loading", inputs: ["loading"] }, { kind: "pipe", type: i5.DecimalPipe, name: "number" }] }); }
103
105
  }
104
106
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InputFileComponent, decorators: [{
105
107
  type: Component,
106
- args: [{ selector: 'input-file', providers: InputProviderFactory.GetProvider(InputFileComponent), template: "<div class=\"flex relative overflow-hidden\">\r\n <ion-card [disabled]=\"loading || disabled\"\r\n class=\"!border-r-0 !rounded-r-none focus-within:on-focus ion-card-input\"\r\n [ngClass]=\"{\r\n 'invalid' : invalid,\r\n 'submitted': submitted,\r\n 'disabled': disabled,\r\n }\"\r\n >\r\n <ion-card-content>\r\n <ion-item lines=\"none\">\r\n <ion-input [readonly]=\"true\" class=\"!opacity-100\" labelPlacement=\"stacked\" [(ngModel)]=\"model\">\r\n <ion-text id=\"label\" [ngClass]=\"{'required': required}\" slot=\"label\"> {{label}} </ion-text>\r\n </ion-input>\r\n </ion-item>\r\n <div class=\"absolute h-full right-2 top-0 z-50 flex items-center justify-center\">\r\n <ion-button [id]=\"guid\" [disabled]=\"!(lstFiles.length > 1)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': lstFiles.length > 1 }\" \r\n size=\"small\" fill=\"outline\" color=\"medium\"\r\n >\r\n <ion-icon name=\"ellipsis-vertical\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n <div class=\"absolute h-full right-12 top-0 z-50 flex items-center justify-center\" [ngClass]=\"{'!z-0': !(_model && lstFiles.length == 1 && PopoverImg)}\" >\r\n <ion-button [id]=\"guid + 'image'\" [disabled]=\"!(_model && lstFiles.length == 1 && PopoverImg)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': _model && lstFiles.length == 1 && PopoverImg }\" \r\n size=\"small\" fill=\"outline\" color=\"medium\"\r\n >\r\n <ion-icon name=\"image\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n <div class=\"absolute h-full right-2 top-0 z-50 flex items-center justify-center\" [ngClass]=\"{'!z-0': !(_model && lstFiles.length == 1 && PopoverImg)}\" >\r\n <ion-button (click)=\"Download(_model.toString())\" [disabled]=\"!(_model && lstFiles.length == 1)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': _model && lstFiles.length == 1 }\" \r\n size=\"small\" fill=\"outline\"\r\n >\r\n <ion-icon name=\"cloud-download\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n @if (model) {\r\n <ion-progress-bar *ngVar=\"storageService.GetProgress(_model.toString()) as val\" [value]=\"val\" class=\"absolute bottom-0 left-0 w-full h-1 default-transition\" [ngClass]=\"{'!h-0': !val}\"></ion-progress-bar>\r\n }\r\n </ion-card-content>\r\n </ion-card>\r\n <div class=\"w-12\"> \r\n <ion-button (click)=\"Upload()\" class=\"m-0 h-full w-full rou on-hover rounded-r-2xl\" [disabled]=\"loading || disabled\" style=\"--border-width: 1px 1px 2px 1px; --border-radius: 0rem 1rem 1rem 0rem;\" size=\"small\" color=\"secondary\" fill=\"outline\"> \r\n <ion-icon slot=\"icon-only\" name=\"cloud-upload\"></ion-icon> \r\n </ion-button>\r\n </div>\r\n <input-loading [loading]=\"loading\"></input-loading>\r\n\r\n</div>\r\n\r\n@if (PopoverImg) {\r\n <ion-popover [trigger]=\"guid + 'image'\" [keepContentsMounted]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <image [src]=\"src\"></image> \r\n </ng-template>\r\n </ion-popover>\r\n}\r\n@if(configuration.multiple){\r\n <ion-popover [trigger]=\"guid\" [keepContentsMounted]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content class=\"p-0 bg-transparent\">\r\n <ion-list>\r\n @for (item of lstFiles; track item; let i = $index; let l = $last) {\r\n <section *ngVar=\"storageService.GetProgress(item) as val\">\r\n <ion-item style=\"--background: transparent\" lines=\"{{l ? 'none' : 'full'}}\" button [detail]=\"false\">\r\n\r\n <ion-icon name=\"download\" (click)=\"Download(item)\" slot=\"start\"></ion-icon> \r\n @if (ExtensionIsImage(item)) {\r\n <ion-icon [id]=\"guid + '-' + i + '-nested-popover'\" name=\"image\" slot=\"start\"></ion-icon> \r\n }\r\n\r\n <ion-label>{{Sanitize(item)}}</ion-label>\r\n <ion-text *ngIf=\"val != 0\" slot=\"end\" class=\"text-sm\"><b>{{val * 100 | number : '1.2-2'}}%</b></ion-text>\r\n </ion-item>\r\n <ion-progress-bar class=\"h-0 default-transition\" [ngClass]=\"{'h-1': val != 0 }\" [value]=\"val\"></ion-progress-bar>\r\n <ion-popover *ngIf=\"ExtensionIsImage(item)\" side=\"end\" alignment=\"center\" [trigger]=\"guid + '-' + i + '-nested-popover'\" [dismissOnSelect]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content *ngVar=\"isLoading(item) as isLoading\">\r\n @if(isLoading){\r\n <loading [loading]=\"isLoading\"></loading>\r\n }\r\n <image [hidden]=\"isLoading\" [src]=\"apiUrl + item\"></image>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n </section>\r\n }\r\n </ion-list>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n}\r\n", styles: ["ion-popover{--width: 30rem }\n", ".on-hover{background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%)}.on-hover:hover{transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input{margin:0;display:flex;height:100%;width:100%;align-items:center;justify-content:center;overflow:hidden;border-radius:1rem;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%);border-bottom-color:var(--ion-color-medium);border-right-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-top-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-left-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-width:1px 1px 2px 1px;min-height:58px;max-height:58px;height:58px}ion-card.ion-card-input:hover{background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input.submitted.invalid{border-color:color-mix(in srgb,var(--ion-color-danger) 75%,transparent 25%)!important}ion-card.ion-card-input.disabled{background-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%)!important}ion-card.ion-card-input ion-card-content{width:100%;height:100%;background-color:transparent;padding:0}ion-item{--background: transparent}ion-text#label.required:after{content:\"*\";color:var(--ion-color-danger);vertical-align:text-bottom;font-size:small}ion-text#label:not(.required):after{content:var(--input-opcional-label, \"(Opcional)\");color:var(--ion-color-medium);vertical-align:text-bottom;font-size:small}.on-focus{border-bottom-color:var(--ion-color-primary)}.focus-within\\:on-focus:focus-within{border-bottom-color:var(--ion-color-primary)}\n"] }]
108
+ args: [{ selector: 'input-file', providers: InputProviderFactory.GetProvider(InputFileComponent), template: "<div class=\"flex relative overflow-hidden\">\r\n <ion-card [disabled]=\"loading || disabled\"\r\n class=\"!border-r-0 !rounded-r-none focus-within:on-focus ion-card-input\"\r\n [ngClass]=\"{\r\n 'invalid' : invalid,\r\n 'submitted': submitted,\r\n 'disabled': disabled,\r\n }\"\r\n >\r\n <ion-card-content>\r\n <ion-item lines=\"none\">\r\n <ion-input [readonly]=\"true\" class=\"!opacity-100\" labelPlacement=\"stacked\" [(ngModel)]=\"model\">\r\n <ion-text id=\"label\" [ngClass]=\"{'required': required}\" slot=\"label\"> {{label}} </ion-text>\r\n </ion-input>\r\n </ion-item>\r\n <div class=\"absolute h-full right-2 top-0 z-50 flex items-center justify-center\">\r\n <ion-button [id]=\"guid\" [disabled]=\"!(lstFiles.length > 1)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': lstFiles.length > 1 }\" \r\n size=\"small\" fill=\"outline\" color=\"medium\"\r\n >\r\n <ion-icon name=\"ellipsis-vertical\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n <div class=\"absolute h-full right-12 top-0 z-50 flex items-center justify-center\" [ngClass]=\"{'!z-0': !(_model && lstFiles.length == 1 && PopoverImg)}\" >\r\n <ion-button [id]=\"guid + 'image'\" [disabled]=\"!(_model && lstFiles.length == 1 && PopoverImg)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': _model && lstFiles.length == 1 && PopoverImg }\" \r\n size=\"small\" fill=\"outline\" color=\"medium\"\r\n >\r\n <ion-icon name=\"image\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n <div class=\"absolute h-full right-2 top-0 z-50 flex items-center justify-center\" [ngClass]=\"{'!z-0': !(_model && lstFiles.length == 1 && PopoverImg)}\" >\r\n <ion-button (click)=\"Download(_model.toString())\" [disabled]=\"!(_model && lstFiles.length == 1)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': _model && lstFiles.length == 1 }\" \r\n size=\"small\" fill=\"outline\"\r\n >\r\n <ion-icon name=\"cloud-download\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n @if (model) {\r\n <ion-progress-bar *ngVar=\"storageService.GetProgress(_model.toString()) as val\" [value]=\"val\" class=\"absolute bottom-0 left-0 w-full h-1 default-transition\" [ngClass]=\"{'!h-0': !val}\"></ion-progress-bar>\r\n }\r\n </ion-card-content>\r\n </ion-card>\r\n <div class=\"w-12\"> \r\n <ion-button (click)=\"Upload()\" class=\"m-0 h-full w-full rou on-hover rounded-r-2xl\" [disabled]=\"loading || disabled\" style=\"--border-width: 1px 1px 2px 1px; --border-radius: 0rem 1rem 1rem 0rem;\" size=\"small\" color=\"secondary\" fill=\"outline\"> \r\n <ion-icon slot=\"icon-only\" name=\"cloud-upload\"></ion-icon> \r\n </ion-button>\r\n </div>\r\n <input-loading [loading]=\"loading\"></input-loading>\r\n\r\n</div>\r\n\r\n@if (PopoverImg && ExtensionIsImage(src)) {\r\n <ion-popover [trigger]=\"guid + 'image'\" [keepContentsMounted]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <image [src]=\"src\"></image> \r\n </ng-template>\r\n </ion-popover>\r\n}\r\n@if(configuration.multiple){\r\n <ion-popover [trigger]=\"guid\" [keepContentsMounted]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content class=\"p-0 bg-transparent\">\r\n <ion-list>\r\n @for (item of lstFiles; track item; let i = $index; let l = $last) {\r\n <section *ngVar=\"storageService.GetProgress(item) as val\">\r\n <ion-item style=\"--background: transparent\" lines=\"{{l ? 'none' : 'full'}}\" button [detail]=\"false\">\r\n\r\n <ion-icon name=\"download\" (click)=\"Download(item)\" slot=\"start\"></ion-icon> \r\n @if (ExtensionIsImage(item)) {\r\n <ion-icon [id]=\"guid + '-' + i + '-nested-popover'\" name=\"image\" slot=\"start\"></ion-icon> \r\n }\r\n\r\n <ion-label>{{Sanitize(item)}}</ion-label>\r\n <ion-text *ngIf=\"val != 0\" slot=\"end\" class=\"text-sm\"><b>{{val * 100 | number : '1.2-2'}}%</b></ion-text>\r\n </ion-item>\r\n <ion-progress-bar class=\"h-0 default-transition\" [ngClass]=\"{'h-1': val != 0 }\" [value]=\"val\"></ion-progress-bar>\r\n <ion-popover *ngIf=\"ExtensionIsImage(item)\" side=\"end\" alignment=\"center\" [trigger]=\"guid + '-' + i + '-nested-popover'\" [dismissOnSelect]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content *ngVar=\"isLoading(item) as isLoading\">\r\n @if(isLoading){\r\n <loading [loading]=\"isLoading\"></loading>\r\n }\r\n <image [hidden]=\"isLoading\" [src]=\"apiUrl + item\"></image>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n </section>\r\n }\r\n </ion-list>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n}\r\n", styles: ["ion-popover{--width: 30rem }\n", ".on-hover{background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%)}.on-hover:hover{transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input{margin:0;display:flex;height:100%;width:100%;align-items:center;justify-content:center;overflow:hidden;border-radius:1rem;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%);border-bottom-color:var(--ion-color-medium);border-right-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-top-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-left-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-width:1px 1px 2px 1px;min-height:58px;max-height:58px;height:58px}ion-card.ion-card-input:hover{background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input.submitted.invalid{border-color:color-mix(in srgb,var(--ion-color-danger) 75%,transparent 25%)!important}ion-card.ion-card-input.disabled{background-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%)!important}ion-card.ion-card-input ion-card-content{width:100%;height:100%;background-color:transparent;padding:0}ion-item{--background: transparent}ion-text#label.required:after{content:\"*\";color:var(--ion-color-danger);vertical-align:text-bottom;font-size:small}ion-text#label:not(.required):after{content:var(--input-opcional-label, \"(Opcional)\");color:var(--ion-color-medium);vertical-align:text-bottom;font-size:small}.on-focus{border-bottom-color:var(--ion-color-primary)}.focus-within\\:on-focus:focus-within{border-bottom-color:var(--ion-color-primary)}\n"] }]
107
109
  }], ctorParameters: () => [{ type: i1.ControlContainer, decorators: [{
108
110
  type: Optional
109
111
  }, {
@@ -126,4 +128,4 @@ export const imageTypes = [
126
128
  'tif',
127
129
  'tiff',
128
130
  ];
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtZmlsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXRzL2lucHV0LWZpbGUvaW5wdXQtZmlsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXRzL2lucHV0LWZpbGUvaW5wdXQtZmlsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDdkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7Ozs7Ozs7Ozs7QUFRdkUsTUFBTSxPQUFPLGtCQUFtQixTQUFRLFdBQTRCO0lBSWxFLFlBRVcsZ0JBQWtDLEVBQ2xDLFVBQXNCLEVBQ3ZCLFlBQTBCLEVBQzFCLHFCQUE0QyxFQUM3QyxjQUE4QjtRQUNuQyxLQUFLLEVBQUUsQ0FBQTtRQUxBLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN2QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQiwwQkFBcUIs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QUFrQixpRkFGbEIsb0JBQW9CLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLGlEQ2RqRSxrM0tBcUdBOzs0RkRyRmEsa0JBQWtCO2tCQU45QixTQUFTOytCQUNFLFlBQVksYUFHWCxvQkFBb0IsQ0FBQyxXQUFXLG9CQUFvQjs7MEJBTzVELFFBQVE7OzBCQUFJLElBQUk7OzBCQUFJLFFBQVE7OEpBSHRCLGFBQWE7c0JBQXJCLEtBQUs7O0FBdUZSLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBYTtJQUNsQyxLQUFLO0lBQ0wsS0FBSztJQUNMLE1BQU07SUFDTixLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLE1BQU07SUFDTixLQUFLO0lBQ0wsTUFBTTtDQUNQLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3QsIElucHV0LCBPcHRpb25hbCwgU2tpcFNlbGYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbENvbnRhaW5lciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmltcG9ydCB7IElucHV0RmlsZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2lucHV0LWZpbGUuY29uZmlndXJhdGlvbic7XHJcbmltcG9ydCB7IEFwaVVybFByb3ZpZGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3dlYi9hcGktdXJsLXByb3ZpZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJbnB1dFByb3ZpZGVyRmFjdG9yeSB9IGZyb20gJy4uL2lucHV0LXByb3ZpZGVyLWZhY3RvcnknO1xyXG5pbXBvcnQgeyBVdGlscywgVXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbHMuc2VydmljZSc7XHJcbmltcG9ydCB7IEN1c3RvbUlucHV0IH0gZnJvbSAnLi4vY3VzdG9tLWlucHV0JztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy93ZWIvc3RvcmFnZS5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaW5wdXQtZmlsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LWZpbGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2lucHV0LWZpbGUuY29tcG9uZW50LnNjc3MnLCAnLi4vaW5wdXRzLnNjc3MnXSxcclxuICBwcm92aWRlcnM6IElucHV0UHJvdmlkZXJGYWN0b3J5LkdldFByb3ZpZGVyKElucHV0RmlsZUNvbXBvbmVudClcclxufSlcclxuZXhwb3J0IGNsYXNzIElucHV0RmlsZUNvbXBvbmVudCBleHRlbmRzIEN1c3RvbUlucHV0PEZpbGVbXSB8IHN0cmluZz4ge1xyXG5cclxuICBASW5wdXQoKSBjb25maWd1cmF0aW9uOiBJbnB1dEZpbGVDb25maWd1cmF0aW9uID0gbmV3IElucHV0RmlsZUNvbmZpZ3VyYXRpb24oKVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBPcHRpb25hbCgpIEBIb3N0KCkgQFNraXBTZWxmKClcclxuICAgIG92ZXJyaWRlIGNvbnRyb2xDb250YWluZXI6IENvbnRyb2xDb250YWluZXIsXHJcbiAgICBvdmVycmlkZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSB1dGlsc1NlcnZpY2U6IFV0aWxzU2VydmljZSxcclxuICAgIHByaXZhdGUgYXBpVXJsUHJvdmlkZXJTZXJ2aWNlOiBBcGlVcmxQcm92aWRlclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlXHJcbiAgKSB7IHN1cGVyKCkgfVxyXG5cclxuICBndWlkOiBzdHJpbmc7XHJcbiAgYXBpVXJsOiBzdHJpbmc7XHJcblxyXG4gIG92ZXJyaWRlIGFzeW5jIG5nT25Jbml0KCkge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgIHRoaXMuYXBpVXJsID0gdGhpcy5hcGlVcmxQcm92aWRlclNlcnZpY2UuYXBpVXJsO1xyXG4gICAgdGhpcy5ndWlkID0gYCR7dGhpcy5mb3JtQ29udHJvbE5hbWV9JHt0aGlzLmlkfSR7VXRpbHMuR2VuZXJhdGVHVUlEKCl9JHt0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCl9YFxyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogRmlsZVtdIHwgc3RyaW5nKTogdm9pZCB7IHRoaXMuc2V0TW9kZWwodmFsdWUpOyB9XHJcbiAgXHJcbiAgb3ZlcnJpZGUgZ2V0IG1vZGVsKCl7XHJcbiAgICBpZighdGhpcy5fbW9kZWwpeyByZXR1cm4gXCJcIjsgfVxyXG4gICAgXHJcbiAgICBpZih0eXBlb2YodGhpcy5fbW9kZWwpID09IFwic3RyaW5nXCIpIHsgXHJcbiAgICAgIGNvbnN0IHQgPSB0aGlzLl9tb2RlbC5zcGxpdCgnOycpLmxlbmd0aDtcclxuICAgICAgcmV0dXJuIHQgPT0gMSA/IFN0b3JhZ2VTZXJ2aWNlLlNhbml0aXplRmlsZU5hbWUodGhpcy5fbW9kZWwpIDogYCR7dH0gQXJxdWl2b3MgQXJtYXplbmFkb3NgOyBcclxuICAgIH0gZWxzZSB7IFxyXG4gICAgICBpZih0aGlzLl9tb2RlbC5sZW5ndGggPiAxKXsgcmV0dXJuIGAke3RoaXMuX21vZGVsLmxlbmd0aH0gQXJxdWl2b3MgU2VsZWNpb25hZG9zYCB9XHJcbiAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gdGhpcy5fbW9kZWxbMF0ubmFtZSB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuICBvdmVycmlkZSBzZXQgbW9kZWwodmFsdWU6IEZpbGVbXSB8IHN0cmluZykgeyBcclxuICAgIHRoaXMuc2V0TW9kZWwodmFsdWUpO1xyXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5fbW9kZWwpOyBcclxuICB9XHJcbiAgc2V0TW9kZWwodmFsdWU6IEZpbGVbXSB8IHN0cmluZykgeyBcclxuICAgIHRoaXMuX21vZGVsID0gdmFsdWU7XHJcbiAgICBcclxuICAgIGlmKHR5cGVvZih0aGlzLl9tb2RlbCkgPT0gXCJzdHJpbmdcIil7XHJcbiAgICAgIHRoaXMubHN0RmlsZXMgPSB0aGlzLl9tb2RlbC5zcGxpdCgnOycpO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMubHN0RmlsZXMgPSBbXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxzdEZpbGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBVcGxvYWQoKTogdm9pZHtcclxuICAgIHRoaXMudXRpbHNTZXJ2aWNlLlNlbGVjdEZpbGUodGhpcy5jb25maWd1cmF0aW9uKS50aGVuKChyZXMpID0+IHsgaWYocmVzKXsgdGhpcy5tb2RlbCA9IHJlczsgfSB9KTtcclxuICB9XHJcbiAgRG93bmxvYWQodmFsdWU6IHN0cmluZyk6IHZvaWR7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLlN0YXJ0RG93bmxvYWQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgUG9wb3ZlckltZygpe1xyXG4gICAgcmV0dXJuICF0aGlzLmNvbmZpZ3VyYXRpb24ubXVsdGlwbGUgJiYgdHlwZW9mKHRoaXMuX21vZGVsKSA9PSBcInN0cmluZ1wiICYmIHRoaXMuRXh0ZW5zaW9uSXNJbWFnZSh0aGlzLl9tb2RlbCk7XHJcbiAgfVxyXG4gIEV4dGVuc2lvbklzSW1hZ2Uodil7XHJcbiAgICB0cnl7XHJcbiAgICAgIHJldHVybiBpbWFnZVR5cGVzLmluY2x1ZGVzKHYuc3BsaXQoJy4nKVt2LnNwbGl0KCcuJykubGVuZ3RoIC0gMV0pXHJcbiAgICB9Y2F0Y2h7fVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNyYygpe1xyXG4gICAgcmV0dXJuIHRoaXMuYXBpVXJsICsgdGhpcy5fbW9kZWxcclxuICB9XHJcbiAgZ2V0IGlzQ2xvdWQoKXtcclxuICAgIHJldHVybiB0eXBlb2YodGhpcy5fbW9kZWwpID09IFwic3RyaW5nXCJcclxuICB9XHJcblxyXG4gIFNhbml0aXplKHYpOiBzdHJpbmcgeyByZXR1cm4gU3RvcmFnZVNlcnZpY2UuU2FuaXRpemVGaWxlTmFtZSh2KTsgfVxyXG5cclxuICBsc3RMb2FkaW5nOiBzdHJpbmdbXSA9IFtdO1xyXG4gIFNldExvYWRpbmcocGF0aDogc3RyaW5nKXtcclxuICAgIHRoaXMubHN0TG9hZGluZy5wdXNoKHBhdGgpO1xyXG4gIH1cclxuICBTZXROb3RMb2FkaW5nKHBhdGg6IHN0cmluZyl7XHJcbiAgICB0aGlzLmxzdExvYWRpbmcuc3BsaWNlKHRoaXMubHN0TG9hZGluZy5pbmRleE9mKHBhdGgpLCAxKTtcclxuICB9XHJcbiAgaXNMb2FkaW5nKHBhdGg6IHN0cmluZyl7XHJcbiAgICByZXR1cm4gdGhpcy5sc3RMb2FkaW5nLmluZGV4T2YocGF0aCkgIT0gLTE7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaW1hZ2VUeXBlczogc3RyaW5nW10gPSBbXHJcbiAgJ2pwZScsXHJcbiAgJ2pwZycsXHJcbiAgJ2pwZWcnLFxyXG4gICdnaWYnLFxyXG4gICdwbmcnLFxyXG4gICdibXAnLFxyXG4gICdpY28nLFxyXG4gICdzdmcnLFxyXG4gICdzdmd6JyxcclxuICAndGlmJyxcclxuICAndGlmZicsXHJcbl0gIiwiPGRpdiBjbGFzcz1cImZsZXggcmVsYXRpdmUgb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgPGlvbi1jYXJkIFtkaXNhYmxlZF09XCJsb2FkaW5nIHx8IGRpc2FibGVkXCJcclxuICAgIGNsYXNzPVwiIWJvcmRlci1yLTAgIXJvdW5kZWQtci1ub25lIGZvY3VzLXdpdGhpbjpvbi1mb2N1cyBpb24tY2FyZC1pbnB1dFwiXHJcbiAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICdpbnZhbGlkJyAgOiBpbnZhbGlkLFxyXG4gICAgICAnc3VibWl0dGVkJzogc3VibWl0dGVkLFxyXG4gICAgICAnZGlzYWJsZWQnOiBkaXNhYmxlZCxcclxuICAgIH1cIlxyXG4gID5cclxuICAgIDxpb24tY2FyZC1jb250ZW50PlxyXG4gICAgICA8aW9uLWl0ZW0gbGluZXM9XCJub25lXCI+XHJcbiAgICAgICAgPGlvbi1pbnB1dCBbcmVhZG9ubHldPVwidHJ1ZVwiIGNsYXNzPVwiIW9wYWNpdHktMTAwXCIgbGFiZWxQbGFjZW1lbnQ9XCJzdGFja2VkXCIgWyhuZ01vZGVsKV09XCJtb2RlbFwiPlxyXG4gICAgICAgICAgPGlvbi10ZXh0IGlkPVwibGFiZWxcIiBbbmdDbGFzc109XCJ7J3JlcXVpcmVkJzogcmVxdWlyZWR9XCIgc2xvdD1cImxhYmVsXCI+IHt7bGFiZWx9fSA8L2lvbi10ZXh0PlxyXG4gICAgICAgIDwvaW9uLWlucHV0PlxyXG4gICAgICA8L2lvbi1pdGVtPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSBoLWZ1bGwgcmlnaHQtMiB0b3AtMCB6LTUwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XHJcbiAgICAgICAgICA8aW9uLWJ1dHRvbiBbaWRdPVwiZ3VpZFwiICBbZGlzYWJsZWRdPVwiIShsc3RGaWxlcy5sZW5ndGggPiAxKVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYXNwZWN0LXNxdWFyZSBkZWZhdWx0LXRyYW5zaXRpb24gb3BhY2l0eS0wIHRyYW5zbGF0ZS14LTEyXCIgXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnb3BhY2l0eS0xMDAgIXRyYW5zbGF0ZS14LTAgc2l6ZS04JzogIGxzdEZpbGVzLmxlbmd0aCA+IDEgfVwiIFxyXG4gICAgICAgICAgICBzaXplPVwic21hbGxcIiBmaWxsPVwib3V0bGluZVwiIGNvbG9yPVwibWVkaXVtXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJlbGxpcHNpcy12ZXJ0aWNhbFwiIHNsb3Q9XCJpY29uLW9ubHlcIj48L2lvbi1pY29uPlxyXG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgaC1mdWxsIHJpZ2h0LTEyIHRvcC0wIHotNTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIiBbbmdDbGFzc109XCJ7JyF6LTAnOiAhKF9tb2RlbCAmJiBsc3RGaWxlcy5sZW5ndGggPT0gMSAmJiBQb3BvdmVySW1nKX1cIiA+XHJcbiAgICAgICAgICA8aW9uLWJ1dHRvbiBbaWRdPVwiZ3VpZCArICdpbWFnZSdcIiBbZGlzYWJsZWRdPVwiIShfbW9kZWwgJiYgbHN0RmlsZXMubGVuZ3RoID09IDEgJiYgUG9wb3ZlckltZylcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImFzcGVjdC1zcXVhcmUgZGVmYXVsdC10cmFuc2l0aW9uIG9wYWNpdHktMCB0cmFuc2xhdGUteC0xMlwiIFxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J29wYWNpdHktMTAwICF0cmFuc2xhdGUteC0wIHNpemUtOCc6IF9tb2RlbCAmJiBsc3RGaWxlcy5sZW5ndGggPT0gMSAmJiBQb3BvdmVySW1nIH1cIiBcclxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCIgZmlsbD1cIm91dGxpbmVcIiBjb2xvcj1cIm1lZGl1bVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiaW1hZ2VcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cclxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIGgtZnVsbCByaWdodC0yIHRvcC0wIHotNTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIiBbbmdDbGFzc109XCJ7JyF6LTAnOiAhKF9tb2RlbCAmJiBsc3RGaWxlcy5sZW5ndGggPT0gMSAmJiBQb3BvdmVySW1nKX1cIiA+XHJcbiAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiRG93bmxvYWQoX21vZGVsLnRvU3RyaW5nKCkpXCIgW2Rpc2FibGVkXT1cIiEoX21vZGVsICYmIGxzdEZpbGVzLmxlbmd0aCA9PSAxKVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYXNwZWN0LXNxdWFyZSBkZWZhdWx0LXRyYW5zaXRpb24gb3BhY2l0eS0wIHRyYW5zbGF0ZS14LTEyXCIgXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnb3BhY2l0eS0xMDAgIXRyYW5zbGF0ZS14LTAgc2l6ZS04JzogX21vZGVsICYmIGxzdEZpbGVzLmxlbmd0aCA9PSAxIH1cIiBcclxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCIgZmlsbD1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNsb3VkLWRvd25sb2FkXCIgc2xvdD1cImljb24tb25seVwiPjwvaW9uLWljb24+XHJcbiAgICAgICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIEBpZiAobW9kZWwpIHtcclxuICAgICAgICAgIDxpb24tcHJvZ3Jlc3MtYmFyICpuZ1Zhcj1cInN0b3JhZ2VTZXJ2aWNlLkdldFByb2dyZXNzKF9tb2RlbC50b1N0cmluZygpKSBhcyB2YWxcIiBbdmFsdWVdPVwidmFsXCIgY2xhc3M9XCJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgdy1mdWxsIGgtMSBkZWZhdWx0LXRyYW5zaXRpb25cIiBbbmdDbGFzc109XCJ7JyFoLTAnOiAhdmFsfVwiPjwvaW9uLXByb2dyZXNzLWJhcj5cclxuICAgICAgICB9XHJcbiAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XHJcbiAgPC9pb24tY2FyZD5cclxuICA8ZGl2IGNsYXNzPVwidy0xMlwiPiBcclxuICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJVcGxvYWQoKVwiIGNsYXNzPVwibS0wIGgtZnVsbCB3LWZ1bGwgcm91IG9uLWhvdmVyIHJvdW5kZWQtci0yeGxcIiAgW2Rpc2FibGVkXT1cImxvYWRpbmcgfHwgZGlzYWJsZWRcIiAgc3R5bGU9XCItLWJvcmRlci13aWR0aDogMXB4IDFweCAycHggMXB4OyAtLWJvcmRlci1yYWRpdXM6IDByZW0gMXJlbSAxcmVtIDByZW07XCIgc2l6ZT1cInNtYWxsXCIgY29sb3I9XCJzZWNvbmRhcnlcIiBmaWxsPVwib3V0bGluZVwiPiBcclxuICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiY2xvdWQtdXBsb2FkXCI+PC9pb24taWNvbj4gXHJcbiAgICA8L2lvbi1idXR0b24+XHJcbiAgPC9kaXY+XHJcbiAgPGlucHV0LWxvYWRpbmcgW2xvYWRpbmddPVwibG9hZGluZ1wiPjwvaW5wdXQtbG9hZGluZz5cclxuXHJcbjwvZGl2PlxyXG5cclxuQGlmIChQb3BvdmVySW1nKSB7XHJcbiAgPGlvbi1wb3BvdmVyIFt0cmlnZ2VyXT1cImd1aWQgKyAnaW1hZ2UnXCIgW2tlZXBDb250ZW50c01vdW50ZWRdPVwidHJ1ZVwiIHRyaWdnZXJBY3Rpb249XCJjbGlja1wiPlxyXG4gICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICA8aW1hZ2UgW3NyY109XCJzcmNcIj48L2ltYWdlPiAgICAgIFxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2lvbi1wb3BvdmVyPlxyXG59XHJcbkBpZihjb25maWd1cmF0aW9uLm11bHRpcGxlKXtcclxuICA8aW9uLXBvcG92ZXIgW3RyaWdnZXJdPVwiZ3VpZFwiIFtrZWVwQ29udGVudHNNb3VudGVkXT1cInRydWVcIiB0cmlnZ2VyQWN0aW9uPVwiY2xpY2tcIj5cclxuICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgPGlvbi1jb250ZW50IGNsYXNzPVwicC0wIGJnLXRyYW5zcGFyZW50XCI+XHJcbiAgICAgICAgPGlvbi1saXN0PlxyXG4gICAgICAgICAgQGZvciAoaXRlbSBvZiBsc3RGaWxlczsgdHJhY2sgaXRlbTsgbGV0IGkgPSAkaW5kZXg7IGxldCBsID0gJGxhc3QpIHtcclxuICAgICAgICAgICAgPHNlY3Rpb24gKm5nVmFyPVwic3RvcmFnZVNlcnZpY2UuR2V0UHJvZ3Jlc3MoaXRlbSkgYXMgdmFsXCI+XHJcbiAgICAgICAgICAgICAgPGlvbi1pdGVtIHN0eWxlPVwiLS1iYWNrZ3JvdW5kOiB0cmFuc3BhcmVudFwiIGxpbmVzPVwie3tsID8gJ25vbmUnIDogJ2Z1bGwnfX1cIiBidXR0b24gW2RldGFpbF09XCJmYWxzZVwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiZG93bmxvYWRcIiAoY2xpY2spPVwiRG93bmxvYWQoaXRlbSlcIiBzbG90PVwic3RhcnRcIj48L2lvbi1pY29uPiBcclxuICAgICAgICAgICAgICAgIEBpZiAoRXh0ZW5zaW9uSXNJbWFnZShpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gW2lkXT1cImd1aWQgKyAnLScgKyBpICsgJy1uZXN0ZWQtcG9wb3ZlcidcIiBuYW1lPVwiaW1hZ2VcIiBzbG90PVwic3RhcnRcIj48L2lvbi1pY29uPiBcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPnt7U2FuaXRpemUoaXRlbSl9fTwvaW9uLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlvbi10ZXh0ICpuZ0lmPVwidmFsICE9IDBcIiBzbG90PVwiZW5kXCIgY2xhc3M9XCJ0ZXh0LXNtXCI+PGI+e3t2YWwgKiAxMDAgfCBudW1iZXIgOiAnMS4yLTInfX0lPC9iPjwvaW9uLXRleHQ+XHJcbiAgICAgICAgICAgICAgPC9pb24taXRlbT5cclxuICAgICAgICAgICAgICA8aW9uLXByb2dyZXNzLWJhciBjbGFzcz1cImgtMCBkZWZhdWx0LXRyYW5zaXRpb25cIiBbbmdDbGFzc109XCJ7J2gtMSc6IHZhbCAhPSAwIH1cIiBbdmFsdWVdPVwidmFsXCI+PC9pb24tcHJvZ3Jlc3MtYmFyPlxyXG4gICAgICAgICAgICAgIDxpb24tcG9wb3ZlciAqbmdJZj1cIkV4dGVuc2lvbklzSW1hZ2UoaXRlbSlcIiBzaWRlPVwiZW5kXCIgYWxpZ25tZW50PVwiY2VudGVyXCIgW3RyaWdnZXJdPVwiZ3VpZCArICctJyArIGkgKyAnLW5lc3RlZC1wb3BvdmVyJ1wiIFtkaXNtaXNzT25TZWxlY3RdPVwidHJ1ZVwiIHRyaWdnZXJBY3Rpb249XCJjbGlja1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICA8aW9uLWNvbnRlbnQgKm5nVmFyPVwiaXNMb2FkaW5nKGl0ZW0pIGFzIGlzTG9hZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIEBpZihpc0xvYWRpbmcpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgPGxvYWRpbmcgW2xvYWRpbmddPVwiaXNMb2FkaW5nXCI+PC9sb2FkaW5nPlxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICA8aW1hZ2UgW2hpZGRlbl09XCJpc0xvYWRpbmdcIiBbc3JjXT1cImFwaVVybCArIGl0ZW1cIj48L2ltYWdlPlxyXG4gICAgICAgICAgICAgICAgICA8L2lvbi1jb250ZW50PlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICA8L2lvbi1wb3BvdmVyPlxyXG4gICAgICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICA8L2lvbi1saXN0PlxyXG4gICAgICA8L2lvbi1jb250ZW50PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2lvbi1wb3BvdmVyPlxyXG59XHJcbiJdfQ==
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtZmlsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXRzL2lucHV0LWZpbGUvaW5wdXQtZmlsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXRzL2lucHV0LWZpbGUvaW5wdXQtZmlsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDdkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7Ozs7Ozs7Ozs7QUFRdkUsTUFBTSxPQUFPLGtCQUFtQixTQUFRLFdBQTRCO0lBSWxFLFlBRVcsZ0JBQWtDLEVBQ2xDLFVBQXNCLEVBQ3ZCLFlBQTBCLEVBQzFCLHFCQUE0QyxFQUM3QyxjQUE4QjtRQUNuQyxLQUFLLEVBQUUsQ0FBQTtRQUxBLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN2QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQiwwQkFBcUIs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eEZVLGtCQUFrQjttR0FBbEIsa0JBQWtCLGlGQUZsQixvQkFBb0IsQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsaURDZGpFLDI0S0FxR0E7OzRGRHJGYSxrQkFBa0I7a0JBTjlCLFNBQVM7K0JBQ0UsWUFBWSxhQUdYLG9CQUFvQixDQUFDLFdBQVcsb0JBQW9COzswQkFPNUQsUUFBUTs7MEJBQUksSUFBSTs7MEJBQUksUUFBUTs4SkFIdEIsYUFBYTtzQkFBckIsS0FBSzs7QUF5RlIsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFhO0lBQ2xDLEtBQUs7SUFDTCxLQUFLO0lBQ0wsTUFBTTtJQUNOLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0NBQ1AsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdCwgSW5wdXQsIE9wdGlvbmFsLCBTa2lwU2VsZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sQ29udGFpbmVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuaW1wb3J0IHsgSW5wdXRGaWxlQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vaW5wdXQtZmlsZS5jb25maWd1cmF0aW9uJztcclxuaW1wb3J0IHsgQXBpVXJsUHJvdmlkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvd2ViL2FwaS11cmwtcHJvdmlkZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IElucHV0UHJvdmlkZXJGYWN0b3J5IH0gZnJvbSAnLi4vaW5wdXQtcHJvdmlkZXItZmFjdG9yeSc7XHJcbmltcG9ydCB7IFV0aWxzLCBVdGlsc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy91dGlscy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ3VzdG9tSW5wdXQgfSBmcm9tICcuLi9jdXN0b20taW5wdXQnO1xyXG5pbXBvcnQgeyBTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3dlYi9zdG9yYWdlLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdpbnB1dC1maWxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vaW5wdXQtZmlsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vaW5wdXQtZmlsZS5jb21wb25lbnQuc2NzcycsICcuLi9pbnB1dHMuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogSW5wdXRQcm92aWRlckZhY3RvcnkuR2V0UHJvdmlkZXIoSW5wdXRGaWxlQ29tcG9uZW50KVxyXG59KVxyXG5leHBvcnQgY2xhc3MgSW5wdXRGaWxlQ29tcG9uZW50IGV4dGVuZHMgQ3VzdG9tSW5wdXQ8RmlsZVtdIHwgc3RyaW5nPiB7XHJcblxyXG4gIEBJbnB1dCgpIGNvbmZpZ3VyYXRpb246IElucHV0RmlsZUNvbmZpZ3VyYXRpb24gPSBuZXcgSW5wdXRGaWxlQ29uZmlndXJhdGlvbigpXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQE9wdGlvbmFsKCkgQEhvc3QoKSBAU2tpcFNlbGYoKVxyXG4gICAgb3ZlcnJpZGUgY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcclxuICAgIG92ZXJyaWRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIHV0aWxzU2VydmljZTogVXRpbHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhcGlVcmxQcm92aWRlclNlcnZpY2U6IEFwaVVybFByb3ZpZGVyU2VydmljZSxcclxuICAgIHB1YmxpYyBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2VcclxuICApIHsgc3VwZXIoKSB9XHJcblxyXG4gIGd1aWQ6IHN0cmluZztcclxuICBhcGlVcmw6IHN0cmluZztcclxuXHJcbiAgb3ZlcnJpZGUgYXN5bmMgbmdPbkluaXQoKSB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gICAgdGhpcy5hcGlVcmwgPSB0aGlzLmFwaVVybFByb3ZpZGVyU2VydmljZS5hcGlVcmw7XHJcbiAgICB0aGlzLmd1aWQgPSBgJHt0aGlzLmZvcm1Db250cm9sTmFtZX0ke3RoaXMuaWR9JHtVdGlscy5HZW5lcmF0ZUdVSUQoKX0ke3RoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKX1gXHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSB3cml0ZVZhbHVlKHZhbHVlOiBGaWxlW10gfCBzdHJpbmcpOiB2b2lkIHsgdGhpcy5zZXRNb2RlbCh2YWx1ZSk7IH1cclxuICBcclxuICBvdmVycmlkZSBnZXQgbW9kZWwoKXtcclxuICAgIGlmKCF0aGlzLl9tb2RlbCl7IHJldHVybiBcIlwiOyB9XHJcbiAgICBcclxuICAgIGlmKHR5cGVvZih0aGlzLl9tb2RlbCkgPT0gXCJzdHJpbmdcIikgeyBcclxuICAgICAgY29uc3QgdCA9IHRoaXMuX21vZGVsLnNwbGl0KCc7JykubGVuZ3RoO1xyXG4gICAgICByZXR1cm4gdCA9PSAxID8gU3RvcmFnZVNlcnZpY2UuU2FuaXRpemVGaWxlTmFtZSh0aGlzLl9tb2RlbCkgOiBgJHt0fSBBcnF1aXZvcyBBcm1hemVuYWRvc2A7IFxyXG4gICAgfSBlbHNlIHsgXHJcbiAgICAgIGlmKHRoaXMuX21vZGVsLmxlbmd0aCA+IDEpeyByZXR1cm4gYCR7dGhpcy5fbW9kZWwubGVuZ3RofSBBcnF1aXZvcyBTZWxlY2lvbmFkb3NgIH1cclxuICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB0aGlzLl9tb2RlbFswXS5uYW1lIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG4gIG92ZXJyaWRlIHNldCBtb2RlbCh2YWx1ZTogRmlsZVtdIHwgc3RyaW5nKSB7IFxyXG4gICAgdGhpcy5zZXRNb2RlbCh2YWx1ZSk7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLl9tb2RlbCk7IFxyXG4gIH1cclxuICBzZXRNb2RlbCh2YWx1ZTogRmlsZVtdIHwgc3RyaW5nKSB7IFxyXG4gICAgdGhpcy5fbW9kZWwgPSB2YWx1ZTtcclxuICAgIFxyXG4gICAgaWYodHlwZW9mKHRoaXMuX21vZGVsKSA9PSBcInN0cmluZ1wiKXtcclxuICAgICAgdGhpcy5sc3RGaWxlcyA9IHRoaXMuX21vZGVsLnNwbGl0KCc7Jyk7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5sc3RGaWxlcyA9IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbHN0RmlsZXM6IGFueVtdID0gW107XHJcblxyXG4gIFVwbG9hZCgpOiB2b2lke1xyXG4gICAgdGhpcy51dGlsc1NlcnZpY2UuU2VsZWN0RmlsZSh0aGlzLmNvbmZpZ3VyYXRpb24pLnRoZW4oKHJlcykgPT4geyBpZihyZXMpeyB0aGlzLm1vZGVsID0gcmVzOyB9IH0pO1xyXG4gIH1cclxuICBEb3dubG9hZCh2YWx1ZTogc3RyaW5nKTogdm9pZHtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2UuU3RhcnREb3dubG9hZCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBQb3BvdmVySW1nKCl7XHJcbiAgICByZXR1cm4gIXRoaXMuY29uZmlndXJhdGlvbi5tdWx0aXBsZSAmJiB0eXBlb2YodGhpcy5fbW9kZWwpID09IFwic3RyaW5nXCIgJiYgdGhpcy5FeHRlbnNpb25Jc0ltYWdlKHRoaXMuX21vZGVsKTtcclxuICB9XHJcbiAgRXh0ZW5zaW9uSXNJbWFnZSh2OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHRyeXtcclxuICAgICAgcmV0dXJuIGltYWdlVHlwZXMuaW5jbHVkZXModi5zcGxpdCgnLicpW3Yuc3BsaXQoJy4nKS5sZW5ndGggLSAxXSlcclxuICAgIH1jYXRjaHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNyYygpe1xyXG4gICAgcmV0dXJuIHRoaXMuYXBpVXJsICsgdGhpcy5fbW9kZWxcclxuICB9XHJcbiAgZ2V0IGlzQ2xvdWQoKXtcclxuICAgIHJldHVybiB0eXBlb2YodGhpcy5fbW9kZWwpID09IFwic3RyaW5nXCJcclxuICB9XHJcblxyXG4gIFNhbml0aXplKHYpOiBzdHJpbmcgeyByZXR1cm4gU3RvcmFnZVNlcnZpY2UuU2FuaXRpemVGaWxlTmFtZSh2KTsgfVxyXG5cclxuICBsc3RMb2FkaW5nOiBzdHJpbmdbXSA9IFtdO1xyXG4gIFNldExvYWRpbmcocGF0aDogc3RyaW5nKXtcclxuICAgIHRoaXMubHN0TG9hZGluZy5wdXNoKHBhdGgpO1xyXG4gIH1cclxuICBTZXROb3RMb2FkaW5nKHBhdGg6IHN0cmluZyl7XHJcbiAgICB0aGlzLmxzdExvYWRpbmcuc3BsaWNlKHRoaXMubHN0TG9hZGluZy5pbmRleE9mKHBhdGgpLCAxKTtcclxuICB9XHJcbiAgaXNMb2FkaW5nKHBhdGg6IHN0cmluZyl7XHJcbiAgICByZXR1cm4gdGhpcy5sc3RMb2FkaW5nLmluZGV4T2YocGF0aCkgIT0gLTE7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaW1hZ2VUeXBlczogc3RyaW5nW10gPSBbXHJcbiAgJ2pwZScsXHJcbiAgJ2pwZycsXHJcbiAgJ2pwZWcnLFxyXG4gICdnaWYnLFxyXG4gICdwbmcnLFxyXG4gICdibXAnLFxyXG4gICdpY28nLFxyXG4gICdzdmcnLFxyXG4gICdzdmd6JyxcclxuICAndGlmJyxcclxuICAndGlmZicsXHJcbl0gIiwiPGRpdiBjbGFzcz1cImZsZXggcmVsYXRpdmUgb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgPGlvbi1jYXJkIFtkaXNhYmxlZF09XCJsb2FkaW5nIHx8IGRpc2FibGVkXCJcclxuICAgIGNsYXNzPVwiIWJvcmRlci1yLTAgIXJvdW5kZWQtci1ub25lIGZvY3VzLXdpdGhpbjpvbi1mb2N1cyBpb24tY2FyZC1pbnB1dFwiXHJcbiAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICdpbnZhbGlkJyAgOiBpbnZhbGlkLFxyXG4gICAgICAnc3VibWl0dGVkJzogc3VibWl0dGVkLFxyXG4gICAgICAnZGlzYWJsZWQnOiBkaXNhYmxlZCxcclxuICAgIH1cIlxyXG4gID5cclxuICAgIDxpb24tY2FyZC1jb250ZW50PlxyXG4gICAgICA8aW9uLWl0ZW0gbGluZXM9XCJub25lXCI+XHJcbiAgICAgICAgPGlvbi1pbnB1dCBbcmVhZG9ubHldPVwidHJ1ZVwiIGNsYXNzPVwiIW9wYWNpdHktMTAwXCIgbGFiZWxQbGFjZW1lbnQ9XCJzdGFja2VkXCIgWyhuZ01vZGVsKV09XCJtb2RlbFwiPlxyXG4gICAgICAgICAgPGlvbi10ZXh0IGlkPVwibGFiZWxcIiBbbmdDbGFzc109XCJ7J3JlcXVpcmVkJzogcmVxdWlyZWR9XCIgc2xvdD1cImxhYmVsXCI+IHt7bGFiZWx9fSA8L2lvbi10ZXh0PlxyXG4gICAgICAgIDwvaW9uLWlucHV0PlxyXG4gICAgICA8L2lvbi1pdGVtPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhYnNvbHV0ZSBoLWZ1bGwgcmlnaHQtMiB0b3AtMCB6LTUwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XHJcbiAgICAgICAgICA8aW9uLWJ1dHRvbiBbaWRdPVwiZ3VpZFwiICBbZGlzYWJsZWRdPVwiIShsc3RGaWxlcy5sZW5ndGggPiAxKVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYXNwZWN0LXNxdWFyZSBkZWZhdWx0LXRyYW5zaXRpb24gb3BhY2l0eS0wIHRyYW5zbGF0ZS14LTEyXCIgXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnb3BhY2l0eS0xMDAgIXRyYW5zbGF0ZS14LTAgc2l6ZS04JzogIGxzdEZpbGVzLmxlbmd0aCA+IDEgfVwiIFxyXG4gICAgICAgICAgICBzaXplPVwic21hbGxcIiBmaWxsPVwib3V0bGluZVwiIGNvbG9yPVwibWVkaXVtXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJlbGxpcHNpcy12ZXJ0aWNhbFwiIHNsb3Q9XCJpY29uLW9ubHlcIj48L2lvbi1pY29uPlxyXG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgaC1mdWxsIHJpZ2h0LTEyIHRvcC0wIHotNTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIiBbbmdDbGFzc109XCJ7JyF6LTAnOiAhKF9tb2RlbCAmJiBsc3RGaWxlcy5sZW5ndGggPT0gMSAmJiBQb3BvdmVySW1nKX1cIiA+XHJcbiAgICAgICAgICA8aW9uLWJ1dHRvbiBbaWRdPVwiZ3VpZCArICdpbWFnZSdcIiBbZGlzYWJsZWRdPVwiIShfbW9kZWwgJiYgbHN0RmlsZXMubGVuZ3RoID09IDEgJiYgUG9wb3ZlckltZylcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImFzcGVjdC1zcXVhcmUgZGVmYXVsdC10cmFuc2l0aW9uIG9wYWNpdHktMCB0cmFuc2xhdGUteC0xMlwiIFxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J29wYWNpdHktMTAwICF0cmFuc2xhdGUteC0wIHNpemUtOCc6IF9tb2RlbCAmJiBsc3RGaWxlcy5sZW5ndGggPT0gMSAmJiBQb3BvdmVySW1nIH1cIiBcclxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCIgZmlsbD1cIm91dGxpbmVcIiBjb2xvcj1cIm1lZGl1bVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiaW1hZ2VcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cclxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFic29sdXRlIGgtZnVsbCByaWdodC0yIHRvcC0wIHotNTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIiBbbmdDbGFzc109XCJ7JyF6LTAnOiAhKF9tb2RlbCAmJiBsc3RGaWxlcy5sZW5ndGggPT0gMSAmJiBQb3BvdmVySW1nKX1cIiA+XHJcbiAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiRG93bmxvYWQoX21vZGVsLnRvU3RyaW5nKCkpXCIgW2Rpc2FibGVkXT1cIiEoX21vZGVsICYmIGxzdEZpbGVzLmxlbmd0aCA9PSAxKVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYXNwZWN0LXNxdWFyZSBkZWZhdWx0LXRyYW5zaXRpb24gb3BhY2l0eS0wIHRyYW5zbGF0ZS14LTEyXCIgXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnb3BhY2l0eS0xMDAgIXRyYW5zbGF0ZS14LTAgc2l6ZS04JzogX21vZGVsICYmIGxzdEZpbGVzLmxlbmd0aCA9PSAxIH1cIiBcclxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCIgZmlsbD1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNsb3VkLWRvd25sb2FkXCIgc2xvdD1cImljb24tb25seVwiPjwvaW9uLWljb24+XHJcbiAgICAgICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIEBpZiAobW9kZWwpIHtcclxuICAgICAgICAgIDxpb24tcHJvZ3Jlc3MtYmFyICpuZ1Zhcj1cInN0b3JhZ2VTZXJ2aWNlLkdldFByb2dyZXNzKF9tb2RlbC50b1N0cmluZygpKSBhcyB2YWxcIiBbdmFsdWVdPVwidmFsXCIgY2xhc3M9XCJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgdy1mdWxsIGgtMSBkZWZhdWx0LXRyYW5zaXRpb25cIiBbbmdDbGFzc109XCJ7JyFoLTAnOiAhdmFsfVwiPjwvaW9uLXByb2dyZXNzLWJhcj5cclxuICAgICAgICB9XHJcbiAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XHJcbiAgPC9pb24tY2FyZD5cclxuICA8ZGl2IGNsYXNzPVwidy0xMlwiPiBcclxuICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJVcGxvYWQoKVwiIGNsYXNzPVwibS0wIGgtZnVsbCB3LWZ1bGwgcm91IG9uLWhvdmVyIHJvdW5kZWQtci0yeGxcIiAgW2Rpc2FibGVkXT1cImxvYWRpbmcgfHwgZGlzYWJsZWRcIiAgc3R5bGU9XCItLWJvcmRlci13aWR0aDogMXB4IDFweCAycHggMXB4OyAtLWJvcmRlci1yYWRpdXM6IDByZW0gMXJlbSAxcmVtIDByZW07XCIgc2l6ZT1cInNtYWxsXCIgY29sb3I9XCJzZWNvbmRhcnlcIiBmaWxsPVwib3V0bGluZVwiPiBcclxuICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiY2xvdWQtdXBsb2FkXCI+PC9pb24taWNvbj4gXHJcbiAgICA8L2lvbi1idXR0b24+XHJcbiAgPC9kaXY+XHJcbiAgPGlucHV0LWxvYWRpbmcgW2xvYWRpbmddPVwibG9hZGluZ1wiPjwvaW5wdXQtbG9hZGluZz5cclxuXHJcbjwvZGl2PlxyXG5cclxuQGlmIChQb3BvdmVySW1nICYmIEV4dGVuc2lvbklzSW1hZ2Uoc3JjKSkge1xyXG4gIDxpb24tcG9wb3ZlciBbdHJpZ2dlcl09XCJndWlkICsgJ2ltYWdlJ1wiIFtrZWVwQ29udGVudHNNb3VudGVkXT1cInRydWVcIiB0cmlnZ2VyQWN0aW9uPVwiY2xpY2tcIj5cclxuICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgPGltYWdlIFtzcmNdPVwic3JjXCI+PC9pbWFnZT4gICAgICBcclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9pb24tcG9wb3Zlcj5cclxufVxyXG5AaWYoY29uZmlndXJhdGlvbi5tdWx0aXBsZSl7XHJcbiAgPGlvbi1wb3BvdmVyIFt0cmlnZ2VyXT1cImd1aWRcIiBba2VlcENvbnRlbnRzTW91bnRlZF09XCJ0cnVlXCIgdHJpZ2dlckFjdGlvbj1cImNsaWNrXCI+XHJcbiAgICA8bmctdGVtcGxhdGU+XHJcbiAgICAgIDxpb24tY29udGVudCBjbGFzcz1cInAtMCBiZy10cmFuc3BhcmVudFwiPlxyXG4gICAgICAgIDxpb24tbGlzdD5cclxuICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgbHN0RmlsZXM7IHRyYWNrIGl0ZW07IGxldCBpID0gJGluZGV4OyBsZXQgbCA9ICRsYXN0KSB7XHJcbiAgICAgICAgICAgIDxzZWN0aW9uICpuZ1Zhcj1cInN0b3JhZ2VTZXJ2aWNlLkdldFByb2dyZXNzKGl0ZW0pIGFzIHZhbFwiPlxyXG4gICAgICAgICAgICAgIDxpb24taXRlbSBzdHlsZT1cIi0tYmFja2dyb3VuZDogdHJhbnNwYXJlbnRcIiBsaW5lcz1cInt7bCA/ICdub25lJyA6ICdmdWxsJ319XCIgYnV0dG9uIFtkZXRhaWxdPVwiZmFsc2VcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImRvd25sb2FkXCIgKGNsaWNrKT1cIkRvd25sb2FkKGl0ZW0pXCIgc2xvdD1cInN0YXJ0XCI+PC9pb24taWNvbj4gXHJcbiAgICAgICAgICAgICAgICBAaWYgKEV4dGVuc2lvbklzSW1hZ2UoaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIFtpZF09XCJndWlkICsgJy0nICsgaSArICctbmVzdGVkLXBvcG92ZXInXCIgbmFtZT1cImltYWdlXCIgc2xvdD1cInN0YXJ0XCI+PC9pb24taWNvbj4gXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgPGlvbi1sYWJlbD57e1Nhbml0aXplKGl0ZW0pfX08L2lvbi1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpb24tdGV4dCAqbmdJZj1cInZhbCAhPSAwXCIgc2xvdD1cImVuZFwiIGNsYXNzPVwidGV4dC1zbVwiPjxiPnt7dmFsICogMTAwIHwgbnVtYmVyIDogJzEuMi0yJ319JTwvYj48L2lvbi10ZXh0PlxyXG4gICAgICAgICAgICAgIDwvaW9uLWl0ZW0+XHJcbiAgICAgICAgICAgICAgPGlvbi1wcm9ncmVzcy1iYXIgY2xhc3M9XCJoLTAgZGVmYXVsdC10cmFuc2l0aW9uXCIgW25nQ2xhc3NdPVwieydoLTEnOiB2YWwgIT0gMCB9XCIgW3ZhbHVlXT1cInZhbFwiPjwvaW9uLXByb2dyZXNzLWJhcj5cclxuICAgICAgICAgICAgICA8aW9uLXBvcG92ZXIgKm5nSWY9XCJFeHRlbnNpb25Jc0ltYWdlKGl0ZW0pXCIgc2lkZT1cImVuZFwiIGFsaWdubWVudD1cImNlbnRlclwiIFt0cmlnZ2VyXT1cImd1aWQgKyAnLScgKyBpICsgJy1uZXN0ZWQtcG9wb3ZlcidcIiBbZGlzbWlzc09uU2VsZWN0XT1cInRydWVcIiB0cmlnZ2VyQWN0aW9uPVwiY2xpY2tcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPGlvbi1jb250ZW50ICpuZ1Zhcj1cImlzTG9hZGluZyhpdGVtKSBhcyBpc0xvYWRpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICBAaWYoaXNMb2FkaW5nKXtcclxuICAgICAgICAgICAgICAgICAgICAgIDxsb2FkaW5nIFtsb2FkaW5nXT1cImlzTG9hZGluZ1wiPjwvbG9hZGluZz5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPGltYWdlIFtoaWRkZW5dPVwiaXNMb2FkaW5nXCIgW3NyY109XCJhcGlVcmwgKyBpdGVtXCI+PC9pbWFnZT5cclxuICAgICAgICAgICAgICAgICAgPC9pb24tY29udGVudD5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9pb24tcG9wb3Zlcj5cclxuICAgICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgPC9pb24tbGlzdD5cclxuICAgICAgPC9pb24tY29udGVudD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9pb24tcG9wb3Zlcj5cclxufVxyXG4iXX0=
@@ -2260,7 +2260,9 @@ class InputFileComponent extends CustomInput {
2260
2260
  try {
2261
2261
  return imageTypes.includes(v.split('.')[v.split('.').length - 1]);
2262
2262
  }
2263
- catch { }
2263
+ catch {
2264
+ return false;
2265
+ }
2264
2266
  }
2265
2267
  get src() {
2266
2268
  return this.apiUrl + this._model;
@@ -2279,11 +2281,11 @@ class InputFileComponent extends CustomInput {
2279
2281
  return this.lstLoading.indexOf(path) != -1;
2280
2282
  }
2281
2283
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InputFileComponent, deps: [{ token: i1$1.ControlContainer, host: true, optional: true, skipSelf: true }, { token: i0.ElementRef }, { token: UtilsService }, { token: ApiUrlProviderService }, { token: StorageService }], target: i0.ɵɵFactoryTarget.Component }); }
2282
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: InputFileComponent, selector: "input-file", inputs: { configuration: "configuration" }, providers: InputProviderFactory.GetProvider(InputFileComponent), usesInheritance: true, ngImport: i0, template: "<div class=\"flex relative overflow-hidden\">\r\n <ion-card [disabled]=\"loading || disabled\"\r\n class=\"!border-r-0 !rounded-r-none focus-within:on-focus ion-card-input\"\r\n [ngClass]=\"{\r\n 'invalid' : invalid,\r\n 'submitted': submitted,\r\n 'disabled': disabled,\r\n }\"\r\n >\r\n <ion-card-content>\r\n <ion-item lines=\"none\">\r\n <ion-input [readonly]=\"true\" class=\"!opacity-100\" labelPlacement=\"stacked\" [(ngModel)]=\"model\">\r\n <ion-text id=\"label\" [ngClass]=\"{'required': required}\" slot=\"label\"> {{label}} </ion-text>\r\n </ion-input>\r\n </ion-item>\r\n <div class=\"absolute h-full right-2 top-0 z-50 flex items-center justify-center\">\r\n <ion-button [id]=\"guid\" [disabled]=\"!(lstFiles.length > 1)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': lstFiles.length > 1 }\" \r\n size=\"small\" fill=\"outline\" color=\"medium\"\r\n >\r\n <ion-icon name=\"ellipsis-vertical\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n <div class=\"absolute h-full right-12 top-0 z-50 flex items-center justify-center\" [ngClass]=\"{'!z-0': !(_model && lstFiles.length == 1 && PopoverImg)}\" >\r\n <ion-button [id]=\"guid + 'image'\" [disabled]=\"!(_model && lstFiles.length == 1 && PopoverImg)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': _model && lstFiles.length == 1 && PopoverImg }\" \r\n size=\"small\" fill=\"outline\" color=\"medium\"\r\n >\r\n <ion-icon name=\"image\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n <div class=\"absolute h-full right-2 top-0 z-50 flex items-center justify-center\" [ngClass]=\"{'!z-0': !(_model && lstFiles.length == 1 && PopoverImg)}\" >\r\n <ion-button (click)=\"Download(_model.toString())\" [disabled]=\"!(_model && lstFiles.length == 1)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': _model && lstFiles.length == 1 }\" \r\n size=\"small\" fill=\"outline\"\r\n >\r\n <ion-icon name=\"cloud-download\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n @if (model) {\r\n <ion-progress-bar *ngVar=\"storageService.GetProgress(_model.toString()) as val\" [value]=\"val\" class=\"absolute bottom-0 left-0 w-full h-1 default-transition\" [ngClass]=\"{'!h-0': !val}\"></ion-progress-bar>\r\n }\r\n </ion-card-content>\r\n </ion-card>\r\n <div class=\"w-12\"> \r\n <ion-button (click)=\"Upload()\" class=\"m-0 h-full w-full rou on-hover rounded-r-2xl\" [disabled]=\"loading || disabled\" style=\"--border-width: 1px 1px 2px 1px; --border-radius: 0rem 1rem 1rem 0rem;\" size=\"small\" color=\"secondary\" fill=\"outline\"> \r\n <ion-icon slot=\"icon-only\" name=\"cloud-upload\"></ion-icon> \r\n </ion-button>\r\n </div>\r\n <input-loading [loading]=\"loading\"></input-loading>\r\n\r\n</div>\r\n\r\n@if (PopoverImg) {\r\n <ion-popover [trigger]=\"guid + 'image'\" [keepContentsMounted]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <image [src]=\"src\"></image> \r\n </ng-template>\r\n </ion-popover>\r\n}\r\n@if(configuration.multiple){\r\n <ion-popover [trigger]=\"guid\" [keepContentsMounted]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content class=\"p-0 bg-transparent\">\r\n <ion-list>\r\n @for (item of lstFiles; track item; let i = $index; let l = $last) {\r\n <section *ngVar=\"storageService.GetProgress(item) as val\">\r\n <ion-item style=\"--background: transparent\" lines=\"{{l ? 'none' : 'full'}}\" button [detail]=\"false\">\r\n\r\n <ion-icon name=\"download\" (click)=\"Download(item)\" slot=\"start\"></ion-icon> \r\n @if (ExtensionIsImage(item)) {\r\n <ion-icon [id]=\"guid + '-' + i + '-nested-popover'\" name=\"image\" slot=\"start\"></ion-icon> \r\n }\r\n\r\n <ion-label>{{Sanitize(item)}}</ion-label>\r\n <ion-text *ngIf=\"val != 0\" slot=\"end\" class=\"text-sm\"><b>{{val * 100 | number : '1.2-2'}}%</b></ion-text>\r\n </ion-item>\r\n <ion-progress-bar class=\"h-0 default-transition\" [ngClass]=\"{'h-1': val != 0 }\" [value]=\"val\"></ion-progress-bar>\r\n <ion-popover *ngIf=\"ExtensionIsImage(item)\" side=\"end\" alignment=\"center\" [trigger]=\"guid + '-' + i + '-nested-popover'\" [dismissOnSelect]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content *ngVar=\"isLoading(item) as isLoading\">\r\n @if(isLoading){\r\n <loading [loading]=\"isLoading\"></loading>\r\n }\r\n <image [hidden]=\"isLoading\" [src]=\"apiUrl + item\"></image>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n </section>\r\n }\r\n </ion-list>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n}\r\n", styles: ["ion-popover{--width: 30rem }\n", ".on-hover{background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%)}.on-hover:hover{transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input{margin:0;display:flex;height:100%;width:100%;align-items:center;justify-content:center;overflow:hidden;border-radius:1rem;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%);border-bottom-color:var(--ion-color-medium);border-right-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-top-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-left-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-width:1px 1px 2px 1px;min-height:58px;max-height:58px;height:58px}ion-card.ion-card-input:hover{background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input.submitted.invalid{border-color:color-mix(in srgb,var(--ion-color-danger) 75%,transparent 25%)!important}ion-card.ion-card-input.disabled{background-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%)!important}ion-card.ion-card-input ion-card-content{width:100%;height:100%;background-color:transparent;padding:0}ion-item{--background: transparent}ion-text#label.required:after{content:\"*\";color:var(--ion-color-danger);vertical-align:text-bottom;font-size:small}ion-text#label:not(.required):after{content:var(--input-opcional-label, \"(Opcional)\");color:var(--ion-color-medium);vertical-align:text-bottom;font-size:small}.on-focus{border-bottom-color:var(--ion-color-primary)}.focus-within\\:on-focus:focus-within{border-bottom-color:var(--ion-color-primary)}\n"], dependencies: [{ kind: "directive", type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i3.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i3.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i3.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearInputIcon", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i3.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i3.IonProgressBar, selector: "ion-progress-bar", inputs: ["buffer", "color", "mode", "reversed", "type", "value"] }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i3.IonPopover, selector: "ion-popover" }, { kind: "directive", type: i3.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgVarDirective, selector: "[ngVar]", inputs: ["ngVar"] }, { kind: "component", type: LoadingComponent, selector: "loading", inputs: ["text", "type", "loading"] }, { kind: "component", type: ImageComponent, selector: "image", inputs: ["fill", "object", "src"] }, { kind: "component", type: InputLoadingComponent, selector: "input-loading", inputs: ["loading"] }, { kind: "pipe", type: i2$1.DecimalPipe, name: "number" }] }); }
2284
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: InputFileComponent, selector: "input-file", inputs: { configuration: "configuration" }, providers: InputProviderFactory.GetProvider(InputFileComponent), usesInheritance: true, ngImport: i0, template: "<div class=\"flex relative overflow-hidden\">\r\n <ion-card [disabled]=\"loading || disabled\"\r\n class=\"!border-r-0 !rounded-r-none focus-within:on-focus ion-card-input\"\r\n [ngClass]=\"{\r\n 'invalid' : invalid,\r\n 'submitted': submitted,\r\n 'disabled': disabled,\r\n }\"\r\n >\r\n <ion-card-content>\r\n <ion-item lines=\"none\">\r\n <ion-input [readonly]=\"true\" class=\"!opacity-100\" labelPlacement=\"stacked\" [(ngModel)]=\"model\">\r\n <ion-text id=\"label\" [ngClass]=\"{'required': required}\" slot=\"label\"> {{label}} </ion-text>\r\n </ion-input>\r\n </ion-item>\r\n <div class=\"absolute h-full right-2 top-0 z-50 flex items-center justify-center\">\r\n <ion-button [id]=\"guid\" [disabled]=\"!(lstFiles.length > 1)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': lstFiles.length > 1 }\" \r\n size=\"small\" fill=\"outline\" color=\"medium\"\r\n >\r\n <ion-icon name=\"ellipsis-vertical\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n <div class=\"absolute h-full right-12 top-0 z-50 flex items-center justify-center\" [ngClass]=\"{'!z-0': !(_model && lstFiles.length == 1 && PopoverImg)}\" >\r\n <ion-button [id]=\"guid + 'image'\" [disabled]=\"!(_model && lstFiles.length == 1 && PopoverImg)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': _model && lstFiles.length == 1 && PopoverImg }\" \r\n size=\"small\" fill=\"outline\" color=\"medium\"\r\n >\r\n <ion-icon name=\"image\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n <div class=\"absolute h-full right-2 top-0 z-50 flex items-center justify-center\" [ngClass]=\"{'!z-0': !(_model && lstFiles.length == 1 && PopoverImg)}\" >\r\n <ion-button (click)=\"Download(_model.toString())\" [disabled]=\"!(_model && lstFiles.length == 1)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': _model && lstFiles.length == 1 }\" \r\n size=\"small\" fill=\"outline\"\r\n >\r\n <ion-icon name=\"cloud-download\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n @if (model) {\r\n <ion-progress-bar *ngVar=\"storageService.GetProgress(_model.toString()) as val\" [value]=\"val\" class=\"absolute bottom-0 left-0 w-full h-1 default-transition\" [ngClass]=\"{'!h-0': !val}\"></ion-progress-bar>\r\n }\r\n </ion-card-content>\r\n </ion-card>\r\n <div class=\"w-12\"> \r\n <ion-button (click)=\"Upload()\" class=\"m-0 h-full w-full rou on-hover rounded-r-2xl\" [disabled]=\"loading || disabled\" style=\"--border-width: 1px 1px 2px 1px; --border-radius: 0rem 1rem 1rem 0rem;\" size=\"small\" color=\"secondary\" fill=\"outline\"> \r\n <ion-icon slot=\"icon-only\" name=\"cloud-upload\"></ion-icon> \r\n </ion-button>\r\n </div>\r\n <input-loading [loading]=\"loading\"></input-loading>\r\n\r\n</div>\r\n\r\n@if (PopoverImg && ExtensionIsImage(src)) {\r\n <ion-popover [trigger]=\"guid + 'image'\" [keepContentsMounted]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <image [src]=\"src\"></image> \r\n </ng-template>\r\n </ion-popover>\r\n}\r\n@if(configuration.multiple){\r\n <ion-popover [trigger]=\"guid\" [keepContentsMounted]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content class=\"p-0 bg-transparent\">\r\n <ion-list>\r\n @for (item of lstFiles; track item; let i = $index; let l = $last) {\r\n <section *ngVar=\"storageService.GetProgress(item) as val\">\r\n <ion-item style=\"--background: transparent\" lines=\"{{l ? 'none' : 'full'}}\" button [detail]=\"false\">\r\n\r\n <ion-icon name=\"download\" (click)=\"Download(item)\" slot=\"start\"></ion-icon> \r\n @if (ExtensionIsImage(item)) {\r\n <ion-icon [id]=\"guid + '-' + i + '-nested-popover'\" name=\"image\" slot=\"start\"></ion-icon> \r\n }\r\n\r\n <ion-label>{{Sanitize(item)}}</ion-label>\r\n <ion-text *ngIf=\"val != 0\" slot=\"end\" class=\"text-sm\"><b>{{val * 100 | number : '1.2-2'}}%</b></ion-text>\r\n </ion-item>\r\n <ion-progress-bar class=\"h-0 default-transition\" [ngClass]=\"{'h-1': val != 0 }\" [value]=\"val\"></ion-progress-bar>\r\n <ion-popover *ngIf=\"ExtensionIsImage(item)\" side=\"end\" alignment=\"center\" [trigger]=\"guid + '-' + i + '-nested-popover'\" [dismissOnSelect]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content *ngVar=\"isLoading(item) as isLoading\">\r\n @if(isLoading){\r\n <loading [loading]=\"isLoading\"></loading>\r\n }\r\n <image [hidden]=\"isLoading\" [src]=\"apiUrl + item\"></image>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n </section>\r\n }\r\n </ion-list>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n}\r\n", styles: ["ion-popover{--width: 30rem }\n", ".on-hover{background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%)}.on-hover:hover{transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input{margin:0;display:flex;height:100%;width:100%;align-items:center;justify-content:center;overflow:hidden;border-radius:1rem;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%);border-bottom-color:var(--ion-color-medium);border-right-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-top-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-left-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-width:1px 1px 2px 1px;min-height:58px;max-height:58px;height:58px}ion-card.ion-card-input:hover{background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input.submitted.invalid{border-color:color-mix(in srgb,var(--ion-color-danger) 75%,transparent 25%)!important}ion-card.ion-card-input.disabled{background-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%)!important}ion-card.ion-card-input ion-card-content{width:100%;height:100%;background-color:transparent;padding:0}ion-item{--background: transparent}ion-text#label.required:after{content:\"*\";color:var(--ion-color-danger);vertical-align:text-bottom;font-size:small}ion-text#label:not(.required):after{content:var(--input-opcional-label, \"(Opcional)\");color:var(--ion-color-medium);vertical-align:text-bottom;font-size:small}.on-focus{border-bottom-color:var(--ion-color-primary)}.focus-within\\:on-focus:focus-within{border-bottom-color:var(--ion-color-primary)}\n"], dependencies: [{ kind: "directive", type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i3.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i3.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i3.IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonInput, selector: "ion-input", inputs: ["autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearInputIcon", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i3.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i3.IonProgressBar, selector: "ion-progress-bar", inputs: ["buffer", "color", "mode", "reversed", "type", "value"] }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i3.IonPopover, selector: "ion-popover" }, { kind: "directive", type: i3.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgVarDirective, selector: "[ngVar]", inputs: ["ngVar"] }, { kind: "component", type: LoadingComponent, selector: "loading", inputs: ["text", "type", "loading"] }, { kind: "component", type: ImageComponent, selector: "image", inputs: ["fill", "object", "src"] }, { kind: "component", type: InputLoadingComponent, selector: "input-loading", inputs: ["loading"] }, { kind: "pipe", type: i2$1.DecimalPipe, name: "number" }] }); }
2283
2285
  }
2284
2286
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InputFileComponent, decorators: [{
2285
2287
  type: Component,
2286
- args: [{ selector: 'input-file', providers: InputProviderFactory.GetProvider(InputFileComponent), template: "<div class=\"flex relative overflow-hidden\">\r\n <ion-card [disabled]=\"loading || disabled\"\r\n class=\"!border-r-0 !rounded-r-none focus-within:on-focus ion-card-input\"\r\n [ngClass]=\"{\r\n 'invalid' : invalid,\r\n 'submitted': submitted,\r\n 'disabled': disabled,\r\n }\"\r\n >\r\n <ion-card-content>\r\n <ion-item lines=\"none\">\r\n <ion-input [readonly]=\"true\" class=\"!opacity-100\" labelPlacement=\"stacked\" [(ngModel)]=\"model\">\r\n <ion-text id=\"label\" [ngClass]=\"{'required': required}\" slot=\"label\"> {{label}} </ion-text>\r\n </ion-input>\r\n </ion-item>\r\n <div class=\"absolute h-full right-2 top-0 z-50 flex items-center justify-center\">\r\n <ion-button [id]=\"guid\" [disabled]=\"!(lstFiles.length > 1)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': lstFiles.length > 1 }\" \r\n size=\"small\" fill=\"outline\" color=\"medium\"\r\n >\r\n <ion-icon name=\"ellipsis-vertical\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n <div class=\"absolute h-full right-12 top-0 z-50 flex items-center justify-center\" [ngClass]=\"{'!z-0': !(_model && lstFiles.length == 1 && PopoverImg)}\" >\r\n <ion-button [id]=\"guid + 'image'\" [disabled]=\"!(_model && lstFiles.length == 1 && PopoverImg)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': _model && lstFiles.length == 1 && PopoverImg }\" \r\n size=\"small\" fill=\"outline\" color=\"medium\"\r\n >\r\n <ion-icon name=\"image\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n <div class=\"absolute h-full right-2 top-0 z-50 flex items-center justify-center\" [ngClass]=\"{'!z-0': !(_model && lstFiles.length == 1 && PopoverImg)}\" >\r\n <ion-button (click)=\"Download(_model.toString())\" [disabled]=\"!(_model && lstFiles.length == 1)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': _model && lstFiles.length == 1 }\" \r\n size=\"small\" fill=\"outline\"\r\n >\r\n <ion-icon name=\"cloud-download\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n @if (model) {\r\n <ion-progress-bar *ngVar=\"storageService.GetProgress(_model.toString()) as val\" [value]=\"val\" class=\"absolute bottom-0 left-0 w-full h-1 default-transition\" [ngClass]=\"{'!h-0': !val}\"></ion-progress-bar>\r\n }\r\n </ion-card-content>\r\n </ion-card>\r\n <div class=\"w-12\"> \r\n <ion-button (click)=\"Upload()\" class=\"m-0 h-full w-full rou on-hover rounded-r-2xl\" [disabled]=\"loading || disabled\" style=\"--border-width: 1px 1px 2px 1px; --border-radius: 0rem 1rem 1rem 0rem;\" size=\"small\" color=\"secondary\" fill=\"outline\"> \r\n <ion-icon slot=\"icon-only\" name=\"cloud-upload\"></ion-icon> \r\n </ion-button>\r\n </div>\r\n <input-loading [loading]=\"loading\"></input-loading>\r\n\r\n</div>\r\n\r\n@if (PopoverImg) {\r\n <ion-popover [trigger]=\"guid + 'image'\" [keepContentsMounted]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <image [src]=\"src\"></image> \r\n </ng-template>\r\n </ion-popover>\r\n}\r\n@if(configuration.multiple){\r\n <ion-popover [trigger]=\"guid\" [keepContentsMounted]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content class=\"p-0 bg-transparent\">\r\n <ion-list>\r\n @for (item of lstFiles; track item; let i = $index; let l = $last) {\r\n <section *ngVar=\"storageService.GetProgress(item) as val\">\r\n <ion-item style=\"--background: transparent\" lines=\"{{l ? 'none' : 'full'}}\" button [detail]=\"false\">\r\n\r\n <ion-icon name=\"download\" (click)=\"Download(item)\" slot=\"start\"></ion-icon> \r\n @if (ExtensionIsImage(item)) {\r\n <ion-icon [id]=\"guid + '-' + i + '-nested-popover'\" name=\"image\" slot=\"start\"></ion-icon> \r\n }\r\n\r\n <ion-label>{{Sanitize(item)}}</ion-label>\r\n <ion-text *ngIf=\"val != 0\" slot=\"end\" class=\"text-sm\"><b>{{val * 100 | number : '1.2-2'}}%</b></ion-text>\r\n </ion-item>\r\n <ion-progress-bar class=\"h-0 default-transition\" [ngClass]=\"{'h-1': val != 0 }\" [value]=\"val\"></ion-progress-bar>\r\n <ion-popover *ngIf=\"ExtensionIsImage(item)\" side=\"end\" alignment=\"center\" [trigger]=\"guid + '-' + i + '-nested-popover'\" [dismissOnSelect]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content *ngVar=\"isLoading(item) as isLoading\">\r\n @if(isLoading){\r\n <loading [loading]=\"isLoading\"></loading>\r\n }\r\n <image [hidden]=\"isLoading\" [src]=\"apiUrl + item\"></image>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n </section>\r\n }\r\n </ion-list>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n}\r\n", styles: ["ion-popover{--width: 30rem }\n", ".on-hover{background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%)}.on-hover:hover{transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input{margin:0;display:flex;height:100%;width:100%;align-items:center;justify-content:center;overflow:hidden;border-radius:1rem;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%);border-bottom-color:var(--ion-color-medium);border-right-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-top-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-left-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-width:1px 1px 2px 1px;min-height:58px;max-height:58px;height:58px}ion-card.ion-card-input:hover{background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input.submitted.invalid{border-color:color-mix(in srgb,var(--ion-color-danger) 75%,transparent 25%)!important}ion-card.ion-card-input.disabled{background-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%)!important}ion-card.ion-card-input ion-card-content{width:100%;height:100%;background-color:transparent;padding:0}ion-item{--background: transparent}ion-text#label.required:after{content:\"*\";color:var(--ion-color-danger);vertical-align:text-bottom;font-size:small}ion-text#label:not(.required):after{content:var(--input-opcional-label, \"(Opcional)\");color:var(--ion-color-medium);vertical-align:text-bottom;font-size:small}.on-focus{border-bottom-color:var(--ion-color-primary)}.focus-within\\:on-focus:focus-within{border-bottom-color:var(--ion-color-primary)}\n"] }]
2288
+ args: [{ selector: 'input-file', providers: InputProviderFactory.GetProvider(InputFileComponent), template: "<div class=\"flex relative overflow-hidden\">\r\n <ion-card [disabled]=\"loading || disabled\"\r\n class=\"!border-r-0 !rounded-r-none focus-within:on-focus ion-card-input\"\r\n [ngClass]=\"{\r\n 'invalid' : invalid,\r\n 'submitted': submitted,\r\n 'disabled': disabled,\r\n }\"\r\n >\r\n <ion-card-content>\r\n <ion-item lines=\"none\">\r\n <ion-input [readonly]=\"true\" class=\"!opacity-100\" labelPlacement=\"stacked\" [(ngModel)]=\"model\">\r\n <ion-text id=\"label\" [ngClass]=\"{'required': required}\" slot=\"label\"> {{label}} </ion-text>\r\n </ion-input>\r\n </ion-item>\r\n <div class=\"absolute h-full right-2 top-0 z-50 flex items-center justify-center\">\r\n <ion-button [id]=\"guid\" [disabled]=\"!(lstFiles.length > 1)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': lstFiles.length > 1 }\" \r\n size=\"small\" fill=\"outline\" color=\"medium\"\r\n >\r\n <ion-icon name=\"ellipsis-vertical\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n <div class=\"absolute h-full right-12 top-0 z-50 flex items-center justify-center\" [ngClass]=\"{'!z-0': !(_model && lstFiles.length == 1 && PopoverImg)}\" >\r\n <ion-button [id]=\"guid + 'image'\" [disabled]=\"!(_model && lstFiles.length == 1 && PopoverImg)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': _model && lstFiles.length == 1 && PopoverImg }\" \r\n size=\"small\" fill=\"outline\" color=\"medium\"\r\n >\r\n <ion-icon name=\"image\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n <div class=\"absolute h-full right-2 top-0 z-50 flex items-center justify-center\" [ngClass]=\"{'!z-0': !(_model && lstFiles.length == 1 && PopoverImg)}\" >\r\n <ion-button (click)=\"Download(_model.toString())\" [disabled]=\"!(_model && lstFiles.length == 1)\"\r\n class=\"aspect-square default-transition opacity-0 translate-x-12\" \r\n [ngClass]=\"{'opacity-100 !translate-x-0 size-8': _model && lstFiles.length == 1 }\" \r\n size=\"small\" fill=\"outline\"\r\n >\r\n <ion-icon name=\"cloud-download\" slot=\"icon-only\"></ion-icon>\r\n </ion-button>\r\n </div>\r\n\r\n @if (model) {\r\n <ion-progress-bar *ngVar=\"storageService.GetProgress(_model.toString()) as val\" [value]=\"val\" class=\"absolute bottom-0 left-0 w-full h-1 default-transition\" [ngClass]=\"{'!h-0': !val}\"></ion-progress-bar>\r\n }\r\n </ion-card-content>\r\n </ion-card>\r\n <div class=\"w-12\"> \r\n <ion-button (click)=\"Upload()\" class=\"m-0 h-full w-full rou on-hover rounded-r-2xl\" [disabled]=\"loading || disabled\" style=\"--border-width: 1px 1px 2px 1px; --border-radius: 0rem 1rem 1rem 0rem;\" size=\"small\" color=\"secondary\" fill=\"outline\"> \r\n <ion-icon slot=\"icon-only\" name=\"cloud-upload\"></ion-icon> \r\n </ion-button>\r\n </div>\r\n <input-loading [loading]=\"loading\"></input-loading>\r\n\r\n</div>\r\n\r\n@if (PopoverImg && ExtensionIsImage(src)) {\r\n <ion-popover [trigger]=\"guid + 'image'\" [keepContentsMounted]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <image [src]=\"src\"></image> \r\n </ng-template>\r\n </ion-popover>\r\n}\r\n@if(configuration.multiple){\r\n <ion-popover [trigger]=\"guid\" [keepContentsMounted]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content class=\"p-0 bg-transparent\">\r\n <ion-list>\r\n @for (item of lstFiles; track item; let i = $index; let l = $last) {\r\n <section *ngVar=\"storageService.GetProgress(item) as val\">\r\n <ion-item style=\"--background: transparent\" lines=\"{{l ? 'none' : 'full'}}\" button [detail]=\"false\">\r\n\r\n <ion-icon name=\"download\" (click)=\"Download(item)\" slot=\"start\"></ion-icon> \r\n @if (ExtensionIsImage(item)) {\r\n <ion-icon [id]=\"guid + '-' + i + '-nested-popover'\" name=\"image\" slot=\"start\"></ion-icon> \r\n }\r\n\r\n <ion-label>{{Sanitize(item)}}</ion-label>\r\n <ion-text *ngIf=\"val != 0\" slot=\"end\" class=\"text-sm\"><b>{{val * 100 | number : '1.2-2'}}%</b></ion-text>\r\n </ion-item>\r\n <ion-progress-bar class=\"h-0 default-transition\" [ngClass]=\"{'h-1': val != 0 }\" [value]=\"val\"></ion-progress-bar>\r\n <ion-popover *ngIf=\"ExtensionIsImage(item)\" side=\"end\" alignment=\"center\" [trigger]=\"guid + '-' + i + '-nested-popover'\" [dismissOnSelect]=\"true\" triggerAction=\"click\">\r\n <ng-template>\r\n <ion-content *ngVar=\"isLoading(item) as isLoading\">\r\n @if(isLoading){\r\n <loading [loading]=\"isLoading\"></loading>\r\n }\r\n <image [hidden]=\"isLoading\" [src]=\"apiUrl + item\"></image>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n </section>\r\n }\r\n </ion-list>\r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n}\r\n", styles: ["ion-popover{--width: 30rem }\n", ".on-hover{background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%)}.on-hover:hover{transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input{margin:0;display:flex;height:100%;width:100%;align-items:center;justify-content:center;overflow:hidden;border-radius:1rem;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);transition-property:all;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);background:color-mix(in srgb,var(--ion-color-light) 97%,transparent 3%);border-bottom-color:var(--ion-color-medium);border-right-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-top-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-left-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%);border-width:1px 1px 2px 1px;min-height:58px;max-height:58px;height:58px}ion-card.ion-card-input:hover{background:color-mix(in srgb,var(--ion-color-dark) 15%,transparent 93%)}ion-card.ion-card-input.submitted.invalid{border-color:color-mix(in srgb,var(--ion-color-danger) 75%,transparent 25%)!important}ion-card.ion-card-input.disabled{background-color:color-mix(in srgb,var(--ion-color-medium) 30%,transparent 70%)!important}ion-card.ion-card-input ion-card-content{width:100%;height:100%;background-color:transparent;padding:0}ion-item{--background: transparent}ion-text#label.required:after{content:\"*\";color:var(--ion-color-danger);vertical-align:text-bottom;font-size:small}ion-text#label:not(.required):after{content:var(--input-opcional-label, \"(Opcional)\");color:var(--ion-color-medium);vertical-align:text-bottom;font-size:small}.on-focus{border-bottom-color:var(--ion-color-primary)}.focus-within\\:on-focus:focus-within{border-bottom-color:var(--ion-color-primary)}\n"] }]
2287
2289
  }], ctorParameters: () => [{ type: i1$1.ControlContainer, decorators: [{
2288
2290
  type: Optional
2289
2291
  }, {