@xui/components
Version:
xUI Components for Angular
92 lines • 15.7 kB
JavaScript
import { booleanAttribute, ChangeDetectionStrategy, Component, computed, effect, ElementRef, input, model, Optional, Self, signal, ViewChild } from '@angular/core';
import { Dialog } from '@angular/cdk/dialog';
import { NgControl } from '@angular/forms';
import { XuiImageUploadCropper } from './image-upload-cropper';
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/dialog";
import * as i2 from "@angular/forms";
import * as i3 from "@angular/common";
import * as i4 from "../icon/icon";
import * as i5 from "@ngx-translate/core";
export class XuiImageUpload {
constructor(dialog, control) {
this.dialog = dialog;
this.control = control;
this.croppedImage = null;
this._disabled = signal(false);
this.value = model(null);
this.type = input('square');
this.aspectRatio = input(1);
this.hoverLabel = input('xui.image_upload.change_image');
this.disabled = input(undefined, {
transform: booleanAttribute
});
this._borderRadius = computed(() => (this.type() === 'round' ? 50 : 4));
this._backgroundImageUrl = computed(() => (this.value() ? `url(${this.value()})` : null));
this.imageCropped = (event) => {
this.croppedImage = event.base64 ?? null;
};
this.save = () => {
this.onChange?.(this.croppedImage);
this.value.set(this.croppedImage);
this.dialogRef?.close();
};
if (this.control) {
this.control.valueAccessor = this;
}
effect(() => this.disabled() && this._disabled.set(this.disabled()), { allowSignalWrites: true });
}
handleFileInput(event) {
this.dialogRef = this.dialog.open(XuiImageUploadCropper, {
data: {
type: this.type,
aspectRatio: this.aspectRatio,
save: this.save,
imageChangedEvent: event,
imageCropped: this.imageCropped
}
});
}
_keyPress(event) {
event?.preventDefault();
this.inputElm.nativeElement.click();
}
writeValue(source) {
this.croppedImage = source;
this.value.set(source);
}
registerOnChange(onChange) {
this.onChange = onChange;
}
registerOnTouched(onTouched) {
this._onTouched = onTouched;
}
setDisabledState(isDisabled) {
this._disabled.set(isDisabled);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: XuiImageUpload, deps: [{ token: i1.Dialog }, { token: i2.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.0.1", type: XuiImageUpload, selector: "xui-image-upload", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, aspectRatio: { classPropertyName: "aspectRatio", publicName: "aspectRatio", isSignal: true, isRequired: false, transformFunction: null }, hoverLabel: { classPropertyName: "hoverLabel", publicName: "hoverLabel", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { listeners: { "focusout": "_onTouched?.()", "keydown.enter": "_keyPress($event)", "keydown.space": "_keyPress($event)" }, properties: { "class.x-image-upload-disabled": "disabled()", "class.x-image-upload-square": "type() === \"square\"", "style.border-radius.%": "_borderRadius()", "style.aspect-ratio": "aspectRatio()", "style.background-image": "_backgroundImageUrl()", "tabindex": "_disabled() ? -1 : 0" }, classAttribute: "x-image-upload" }, viewQueries: [{ propertyName: "inputElm", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<input #input type=\"file\" [disabled]=\"_disabled()\" (change)=\"handleFileInput($event)\" accept=\"image/*\" tabindex=\"-1\" />\n<div class=\"x-image-upload-hover\" [style.border-radius.%]=\"_borderRadius()\">{{ hoverLabel() | translate }}</div>\n<div *ngIf=\"!_backgroundImageUrl()\" class=\"x-image-upload-no-image\">{{ 'xui.image_upload.no_image' | translate }}</div>\n\n<div class=\"x-image-upload-icon\">\n <xui-icon icon=\"add_photo_alternate\"></xui-icon>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.XuiIcon, selector: "xui-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "icon"], exportAs: ["xuiIcon"] }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: XuiImageUpload, decorators: [{
type: Component,
args: [{ selector: 'xui-image-upload', changeDetection: ChangeDetectionStrategy.OnPush, host: {
class: 'x-image-upload',
'[class.x-image-upload-disabled]': 'disabled()',
'[class.x-image-upload-square]': 'type() === "square"',
'[style.border-radius.%]': '_borderRadius()',
'[style.aspect-ratio]': 'aspectRatio()',
'[style.background-image]': '_backgroundImageUrl()',
'[tabindex]': '_disabled() ? -1 : 0',
'(focusout)': '_onTouched?.()',
'(keydown.enter)': '_keyPress($event)',
'(keydown.space)': '_keyPress($event)'
}, template: "<input #input type=\"file\" [disabled]=\"_disabled()\" (change)=\"handleFileInput($event)\" accept=\"image/*\" tabindex=\"-1\" />\n<div class=\"x-image-upload-hover\" [style.border-radius.%]=\"_borderRadius()\">{{ hoverLabel() | translate }}</div>\n<div *ngIf=\"!_backgroundImageUrl()\" class=\"x-image-upload-no-image\">{{ 'xui.image_upload.no_image' | translate }}</div>\n\n<div class=\"x-image-upload-icon\">\n <xui-icon icon=\"add_photo_alternate\"></xui-icon>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.Dialog }, { type: i2.NgControl, decorators: [{
type: Self
}, {
type: Optional
}] }], propDecorators: { inputElm: [{
type: ViewChild,
args: ['input']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtdXBsb2FkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy94dWkvc3JjL2ltYWdlLXVwbG9hZC9pbWFnZS11cGxvYWQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzL3h1aS9zcmMvaW1hZ2UtdXBsb2FkL2ltYWdlLXVwbG9hZC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFVBQVUsRUFDVixLQUFLLEVBQ0wsS0FBSyxFQUNMLFFBQVEsRUFDUixJQUFJLEVBQ0osTUFBTSxFQUNOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsTUFBTSxFQUFhLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUF3QixTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7OztBQW9CL0QsTUFBTSxPQUFPLGNBQWM7SUFvQnpCLFlBQ1UsTUFBYyxFQUNLLE9BQW1CO1FBRHRDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDSyxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBcEJ4QyxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFHM0MsY0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUxQixVQUFLLEdBQUcsS0FBSyxDQUFnQixJQUFJLENBQUMsQ0FBQztRQUNuQyxTQUFJLEdBQUcsS0FBSyxDQUFrQixRQUFRLENBQUMsQ0FBQztRQUN4QyxnQkFBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixlQUFVLEdBQUcsS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDcEQsYUFBUSxHQUFHLEtBQUssQ0FBd0MsU0FBUyxFQUFFO1lBQ2pFLFNBQVMsRUFBRSxnQkFBZ0I7U0FDNUIsQ0FBQyxDQUFDO1FBRUgsa0JBQWEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkUsd0JBQW1CLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBZ0M3RSxpQkFBWSxHQUFHLENBQUMsS0FBd0IsRUFBRSxFQUFFO1lBQ2xELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUM7UUFDM0MsQ0FBQyxDQUFDO1FBRU0sU0FBSSxHQUFHLEdBQUcsRUFBRTtZQUNsQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQztRQWhDQSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDcEMsQ0FBQztRQUVELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRyxDQUFDLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFFRCxlQUFlLENBQUMsS0FBYztRQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQ3ZELElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM3QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsaUJBQWlCLEVBQUUsS0FBSztnQkFDeEIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO2FBQ2hDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFvQjtRQUM1QixLQUFLLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQVlELFVBQVUsQ0FBQyxNQUFjO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxRQUF5QztRQUN4RCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsU0FBcUI7UUFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDOUIsQ0FBQztJQUVELGdCQUFnQixDQUFDLFVBQW1CO1FBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7OEdBekVVLGNBQWM7a0dBQWQsY0FBYywrd0NDckMzQiw2ZEFPQTs7MkZEOEJhLGNBQWM7a0JBakIxQixTQUFTOytCQUNFLGtCQUFrQixtQkFDWCx1QkFBdUIsQ0FBQyxNQUFNLFFBRXpDO3dCQUNKLEtBQUssRUFBRSxnQkFBZ0I7d0JBQ3ZCLGlDQUFpQyxFQUFFLFlBQVk7d0JBQy9DLCtCQUErQixFQUFFLHFCQUFxQjt3QkFDdEQseUJBQXlCLEVBQUUsaUJBQWlCO3dCQUM1QyxzQkFBc0IsRUFBRSxlQUFlO3dCQUN2QywwQkFBMEIsRUFBRSx1QkFBdUI7d0JBQ25ELFlBQVksRUFBRSxzQkFBc0I7d0JBQ3BDLFlBQVksRUFBRSxnQkFBZ0I7d0JBQzlCLGlCQUFpQixFQUFFLG1CQUFtQjt3QkFDdEMsaUJBQWlCLEVBQUUsbUJBQW1CO3FCQUN2Qzs7MEJBd0JFLElBQUk7OzBCQUFJLFFBQVE7eUNBSlMsUUFBUTtzQkFBbkMsU0FBUzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgRWxlbWVudFJlZixcbiAgaW5wdXQsXG4gIG1vZGVsLFxuICBPcHRpb25hbCxcbiAgU2VsZixcbiAgc2lnbmFsLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbWFnZUNyb3BwZWRFdmVudCB9IGZyb20gJ25neC1pbWFnZS1jcm9wcGVyJztcbmltcG9ydCB7IERpYWxvZywgRGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RpYWxvZyc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgWHVpSW1hZ2VVcGxvYWRDcm9wcGVyIH0gZnJvbSAnLi9pbWFnZS11cGxvYWQtY3JvcHBlcic7XG5pbXBvcnQgeyBJbWFnZVVwbG9hZFR5cGUgfSBmcm9tICcuL2ltYWdlLXVwbG9hZC50eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3h1aS1pbWFnZS11cGxvYWQnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGVVcmw6ICdpbWFnZS11cGxvYWQuaHRtbCcsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ3gtaW1hZ2UtdXBsb2FkJyxcbiAgICAnW2NsYXNzLngtaW1hZ2UtdXBsb2FkLWRpc2FibGVkXSc6ICdkaXNhYmxlZCgpJyxcbiAgICAnW2NsYXNzLngtaW1hZ2UtdXBsb2FkLXNxdWFyZV0nOiAndHlwZSgpID09PSBcInNxdWFyZVwiJyxcbiAgICAnW3N0eWxlLmJvcmRlci1yYWRpdXMuJV0nOiAnX2JvcmRlclJhZGl1cygpJyxcbiAgICAnW3N0eWxlLmFzcGVjdC1yYXRpb10nOiAnYXNwZWN0UmF0aW8oKScsXG4gICAgJ1tzdHlsZS5iYWNrZ3JvdW5kLWltYWdlXSc6ICdfYmFja2dyb3VuZEltYWdlVXJsKCknLFxuICAgICdbdGFiaW5kZXhdJzogJ19kaXNhYmxlZCgpID8gLTEgOiAwJyxcbiAgICAnKGZvY3Vzb3V0KSc6ICdfb25Ub3VjaGVkPy4oKScsXG4gICAgJyhrZXlkb3duLmVudGVyKSc6ICdfa2V5UHJlc3MoJGV2ZW50KScsXG4gICAgJyhrZXlkb3duLnNwYWNlKSc6ICdfa2V5UHJlc3MoJGV2ZW50KSdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBYdWlJbWFnZVVwbG9hZCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgcHJpdmF0ZSBkaWFsb2dSZWY/OiBEaWFsb2dSZWY8dW5rbm93biwgWHVpSW1hZ2VVcGxvYWRDcm9wcGVyPjtcbiAgcHJpdmF0ZSBjcm9wcGVkSW1hZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG9uQ2hhbmdlPzogKHNvdXJjZTogc3RyaW5nIHwgbnVsbCkgPT4gdm9pZDtcbiAgX29uVG91Y2hlZD86ICgpID0+IHZvaWQ7XG4gIF9kaXNhYmxlZCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgdmFsdWUgPSBtb2RlbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgdHlwZSA9IGlucHV0PEltYWdlVXBsb2FkVHlwZT4oJ3NxdWFyZScpO1xuICBhc3BlY3RSYXRpbyA9IGlucHV0KDEpO1xuICBob3ZlckxhYmVsID0gaW5wdXQoJ3h1aS5pbWFnZV91cGxvYWQuY2hhbmdlX2ltYWdlJyk7XG4gIGRpc2FibGVkID0gaW5wdXQ8Ym9vbGVhbiB8IHVuZGVmaW5lZCwgc3RyaW5nIHwgYm9vbGVhbj4odW5kZWZpbmVkLCB7XG4gICAgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlXG4gIH0pO1xuXG4gIF9ib3JkZXJSYWRpdXMgPSBjb21wdXRlZCgoKSA9PiAodGhpcy50eXBlKCkgPT09ICdyb3VuZCcgPyA1MCA6IDQpKTtcbiAgX2JhY2tncm91bmRJbWFnZVVybCA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLnZhbHVlKCkgPyBgdXJsKCR7dGhpcy52YWx1ZSgpfSlgIDogbnVsbCkpO1xuXG4gIEBWaWV3Q2hpbGQoJ2lucHV0JykgcHJpdmF0ZSBpbnB1dEVsbSE6IEVsZW1lbnRSZWY7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkaWFsb2c6IERpYWxvZyxcbiAgICBAU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBjb250cm9sPzogTmdDb250cm9sXG4gICkge1xuICAgIGlmICh0aGlzLmNvbnRyb2wpIHtcbiAgICAgIHRoaXMuY29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG5cbiAgICBlZmZlY3QoKCkgPT4gdGhpcy5kaXNhYmxlZCgpICYmIHRoaXMuX2Rpc2FibGVkLnNldCh0aGlzLmRpc2FibGVkKCkhKSwgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9KTtcbiAgfVxuXG4gIGhhbmRsZUZpbGVJbnB1dChldmVudDogdW5rbm93bikge1xuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihYdWlJbWFnZVVwbG9hZENyb3BwZXIsIHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICBhc3BlY3RSYXRpbzogdGhpcy5hc3BlY3RSYXRpbyxcbiAgICAgICAgc2F2ZTogdGhpcy5zYXZlLFxuICAgICAgICBpbWFnZUNoYW5nZWRFdmVudDogZXZlbnQsXG4gICAgICAgIGltYWdlQ3JvcHBlZDogdGhpcy5pbWFnZUNyb3BwZWRcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9rZXlQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuaW5wdXRFbG0ubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbWFnZUNyb3BwZWQgPSAoZXZlbnQ6IEltYWdlQ3JvcHBlZEV2ZW50KSA9PiB7XG4gICAgdGhpcy5jcm9wcGVkSW1hZ2UgPSBldmVudC5iYXNlNjQgPz8gbnVsbDtcbiAgfTtcblxuICBwcml2YXRlIHNhdmUgPSAoKSA9PiB7XG4gICAgdGhpcy5vbkNoYW5nZT8uKHRoaXMuY3JvcHBlZEltYWdlKTtcbiAgICB0aGlzLnZhbHVlLnNldCh0aGlzLmNyb3BwZWRJbWFnZSk7XG4gICAgdGhpcy5kaWFsb2dSZWY/LmNsb3NlKCk7XG4gIH07XG5cbiAgd3JpdGVWYWx1ZShzb3VyY2U6IHN0cmluZykge1xuICAgIHRoaXMuY3JvcHBlZEltYWdlID0gc291cmNlO1xuICAgIHRoaXMudmFsdWUuc2V0KHNvdXJjZSk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiAoc291cmNlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5fb25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fZGlzYWJsZWQuc2V0KGlzRGlzYWJsZWQpO1xuICB9XG59XG4iLCI8aW5wdXQgI2lucHV0IHR5cGU9XCJmaWxlXCIgW2Rpc2FibGVkXT1cIl9kaXNhYmxlZCgpXCIgKGNoYW5nZSk9XCJoYW5kbGVGaWxlSW5wdXQoJGV2ZW50KVwiIGFjY2VwdD1cImltYWdlLypcIiB0YWJpbmRleD1cIi0xXCIgLz5cbjxkaXYgY2xhc3M9XCJ4LWltYWdlLXVwbG9hZC1ob3ZlclwiIFtzdHlsZS5ib3JkZXItcmFkaXVzLiVdPVwiX2JvcmRlclJhZGl1cygpXCI+e3sgaG92ZXJMYWJlbCgpIHwgdHJhbnNsYXRlIH19PC9kaXY+XG48ZGl2ICpuZ0lmPVwiIV9iYWNrZ3JvdW5kSW1hZ2VVcmwoKVwiIGNsYXNzPVwieC1pbWFnZS11cGxvYWQtbm8taW1hZ2VcIj57eyAneHVpLmltYWdlX3VwbG9hZC5ub19pbWFnZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cblxuPGRpdiBjbGFzcz1cIngtaW1hZ2UtdXBsb2FkLWljb25cIj5cbiAgPHh1aS1pY29uIGljb249XCJhZGRfcGhvdG9fYWx0ZXJuYXRlXCI+PC94dWktaWNvbj5cbjwvZGl2PlxuIl19