ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
181 lines • 20.7 kB
JavaScript
/**
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { __decorate } from "tslib";
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, ViewChild, ViewEncapsulation } from '@angular/core';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { NzConfigService, WithConfig } from 'ng-zorro-antd/core/config';
import { warn } from 'ng-zorro-antd/core/logger';
import { ImagePreloadService } from 'ng-zorro-antd/core/services';
import { InputBoolean } from 'ng-zorro-antd/core/util';
import { defaultImageSrcLoader } from './image-loader';
import { isFixedSize } from './utils';
export const NZ_CONFIG_MODULE_NAME = 'imageExperimental';
const sizeBreakpoints = [16, 32, 48, 64, 96, 128, 256, 384, 640, 750, 828, 1080, 1200, 1920, 2048, 3840];
export class NzImageViewComponent {
constructor(cdr, nzConfigService, imagePreloadService) {
this.cdr = cdr;
this.nzConfigService = nzConfigService;
this.imagePreloadService = imagePreloadService;
this._nzModuleName = NZ_CONFIG_MODULE_NAME;
this.nzSrc = '';
this.nzAlt = '';
this.nzWidth = 'auto';
this.nzHeight = 'auto';
this.nzSrcLoader = defaultImageSrcLoader;
this.nzAutoSrcset = false;
this.nzPriority = false;
this.nzFallback = null;
this.nzPlaceholder = null;
this.nzDisablePreview = false;
this.src = '';
this.width = 'auto';
this.height = 'auto';
this.srcset = '';
this.destroy$ = new Subject();
this.reloadDisposeHandler = () => void 0;
this.nzConfigService
.getConfigChangeEventForComponent(NZ_CONFIG_MODULE_NAME)
.pipe(takeUntil(this.destroy$))
.subscribe(() => {
this.composeImageAttrs();
this.cdr.markForCheck();
});
}
ngOnInit() {
if (this.nzPriority) {
this.preload();
}
}
ngOnChanges(changes) {
const { nzLoader, nzSrc, nzOptimize } = changes;
if (nzSrc || nzLoader || nzOptimize) {
this.composeImageAttrs();
}
}
ngOnDestroy() {
this.reloadDisposeHandler();
this.destroy$.next();
this.destroy$.complete();
}
preload() {
this.reloadDisposeHandler = this.imagePreloadService.addPreload({
src: this.src,
srcset: this.srcset
});
}
optimizable() {
if (this.nzAutoSrcset) {
if (!isFixedSize(this.nzWidth) || !isFixedSize(this.nzHeight)) {
warn(`When using "nzAutoSrcset" you should use a fixed size width and height, for more information please refer to CLS (https://web.dev/cls/) performance metrics`);
return false;
}
if (this.nzSrc.endsWith('.svg')) {
warn(`SVG does not need to be optimized`);
return false;
}
if (this.nzSrc.startsWith('data:')) {
warn(`Data URLs cannot be optimized`);
return false;
}
return true;
}
return false;
}
composeImageAttrs() {
const loader = this.getLoader();
if (!this.optimizable()) {
this.src = loader({ src: this.nzSrc });
this.width = this.nzWidth;
this.height = this.nzHeight;
return;
}
this.width = typeof this.nzWidth === 'number' ? this.nzWidth : parseInt(this.nzWidth, 10);
this.height = typeof this.nzHeight === 'number' ? this.nzHeight : parseInt(this.nzHeight, 10);
const widths = this.convertWidths(this.width, sizeBreakpoints);
this.src = loader({ src: this.nzSrc, width: widths[0] });
this.srcset = widths
.map((w, i) => `${loader({
src: this.nzSrc,
width: w
})} ${i + 1}x`)
.join(', ');
}
getLoader() {
return this.nzSrcLoader || defaultImageSrcLoader;
}
convertWidths(width, optimizeSizes) {
const allSizes = [...optimizeSizes].sort((a, b) => a - b);
return [
...new Set(
// 2x scale is sufficient
// https://blog.twitter.com/engineering/en_us/topics/infrastructure/2019/capping-image-fidelity-on-ultra-high-resolution-devices.html
[width, width * 2].map(w => allSizes.find(p => p >= w) || w))
];
}
}
NzImageViewComponent.decorators = [
{ type: Component, args: [{
selector: 'nz-image',
exportAs: 'nzImage',
template: `
<img
#imageRef
nz-image
[nzSrc]="src"
[nzSrcset]="srcset"
[nzDisablePreview]="nzDisablePreview"
[nzFallback]="nzFallback"
[nzPlaceholder]="nzPlaceholder"
[attr.width]="width"
[attr.height]="height"
[attr.srcset]="srcset"
[attr.alt]="nzAlt || null"
/>
`,
preserveWhitespaces: false,
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None
},] }
];
NzImageViewComponent.ctorParameters = () => [
{ type: ChangeDetectorRef },
{ type: NzConfigService },
{ type: ImagePreloadService }
];
NzImageViewComponent.propDecorators = {
nzSrc: [{ type: Input }],
nzAlt: [{ type: Input }],
nzWidth: [{ type: Input }],
nzHeight: [{ type: Input }],
nzSrcLoader: [{ type: Input }],
nzAutoSrcset: [{ type: Input }],
nzPriority: [{ type: Input }],
nzFallback: [{ type: Input }],
nzPlaceholder: [{ type: Input }],
nzDisablePreview: [{ type: Input }],
imageRef: [{ type: ViewChild, args: ['imageRef',] }]
};
__decorate([
WithConfig()
], NzImageViewComponent.prototype, "nzSrcLoader", void 0);
__decorate([
InputBoolean(),
WithConfig()
], NzImageViewComponent.prototype, "nzAutoSrcset", void 0);
__decorate([
InputBoolean()
], NzImageViewComponent.prototype, "nzPriority", void 0);
__decorate([
WithConfig()
], NzImageViewComponent.prototype, "nzFallback", void 0);
__decorate([
WithConfig()
], NzImageViewComponent.prototype, "nzPlaceholder", void 0);
__decorate([
InputBoolean(),
WithConfig()
], NzImageViewComponent.prototype, "nzDisablePreview", void 0);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29tcG9uZW50cy9leHBlcmltZW50YWwvaW1hZ2UvaW1hZ2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRzs7QUFFSCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsS0FBSyxFQUtMLFNBQVMsRUFDVCxpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFlLGVBQWUsRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakQsT0FBTyxFQUFFLG1CQUFtQixFQUF3QixNQUFNLDZCQUE2QixDQUFDO0FBRXhGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV2RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFnQixtQkFBbUIsQ0FBQztBQUN0RSxNQUFNLGVBQWUsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBd0J6RyxNQUFNLE9BQU8sb0JBQW9CO0lBNEIvQixZQUNVLEdBQXNC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MkJBQ0wsS0FBSzt5QkFDTCxLQUFLO3lCQUNMLEtBQUs7NEJBQ0wsS0FBSzsrQkFDTCxLQUFLO3VCQUNMLFNBQVMsU0FBQyxVQUFVOztBQU5FO0lBQWIsVUFBVSxFQUFFO3lEQUF1RDtBQUN0QztJQUE3QixZQUFZLEVBQUU7SUFBRSxVQUFVLEVBQUU7MERBQStCO0FBQzVDO0lBQWYsWUFBWSxFQUFFO3dEQUE2QjtBQUM5QjtJQUFiLFVBQVUsRUFBRTt3REFBa0M7QUFDakM7SUFBYixVQUFVLEVBQUU7MkRBQXFDO0FBQ3BCO0lBQTdCLFlBQVksRUFBRTtJQUFFLFVBQVUsRUFBRTs4REFBbUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE56Q29uZmlnS2V5LCBOekNvbmZpZ1NlcnZpY2UsIFdpdGhDb25maWcgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvY29uZmlnJztcbmltcG9ydCB7IHdhcm4gfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvbG9nZ2VyJztcbmltcG9ydCB7IEltYWdlUHJlbG9hZFNlcnZpY2UsIFByZWxvYWREaXNwb3NlSGFuZGxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3NlcnZpY2VzJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5pbXBvcnQgeyBJbnB1dEJvb2xlYW4gfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdXRpbCc7XG5cbmltcG9ydCB7IGRlZmF1bHRJbWFnZVNyY0xvYWRlciB9IGZyb20gJy4vaW1hZ2UtbG9hZGVyJztcbmltcG9ydCB7IE56SW1hZ2VTcmNMb2FkZXIgfSBmcm9tICcuL3R5cGluZ3MnO1xuaW1wb3J0IHsgaXNGaXhlZFNpemUgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IE5aX0NPTkZJR19NT0RVTEVfTkFNRTogTnpDb25maWdLZXkgPSAnaW1hZ2VFeHBlcmltZW50YWwnO1xuY29uc3Qgc2l6ZUJyZWFrcG9pbnRzID0gWzE2LCAzMiwgNDgsIDY0LCA5NiwgMTI4LCAyNTYsIDM4NCwgNjQwLCA3NTAsIDgyOCwgMTA4MCwgMTIwMCwgMTkyMCwgMjA0OCwgMzg0MF07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ256LWltYWdlJyxcbiAgZXhwb3J0QXM6ICduekltYWdlJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8aW1nXG4gICAgICAjaW1hZ2VSZWZcbiAgICAgIG56LWltYWdlXG4gICAgICBbbnpTcmNdPVwic3JjXCJcbiAgICAgIFtuelNyY3NldF09XCJzcmNzZXRcIlxuICAgICAgW256RGlzYWJsZVByZXZpZXddPVwibnpEaXNhYmxlUHJldmlld1wiXG4gICAgICBbbnpGYWxsYmFja109XCJuekZhbGxiYWNrXCJcbiAgICAgIFtuelBsYWNlaG9sZGVyXT1cIm56UGxhY2Vob2xkZXJcIlxuICAgICAgW2F0dHIud2lkdGhdPVwid2lkdGhcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cImhlaWdodFwiXG4gICAgICBbYXR0ci5zcmNzZXRdPVwic3Jjc2V0XCJcbiAgICAgIFthdHRyLmFsdF09XCJuekFsdCB8fCBudWxsXCJcbiAgICAvPlxuICBgLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgTnpJbWFnZVZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgcmVhZG9ubHkgX256TW9kdWxlTmFtZTogTnpDb25maWdLZXkgPSBOWl9DT05GSUdfTU9EVUxFX05BTUU7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekF1dG9TcmNzZXQ6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256UHJpb3JpdHk6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256RGlzYWJsZVByZXZpZXc6IEJvb2xlYW5JbnB1dDtcblxuICBASW5wdXQoKSBuelNyYzogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIG56QWx0OiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgbnpXaWR0aDogc3RyaW5nIHwgbnVtYmVyID0gJ2F1dG8nO1xuICBASW5wdXQoKSBuekhlaWdodDogc3RyaW5nIHwgbnVtYmVyID0gJ2F1dG8nO1xuICBASW5wdXQoKSBAV2l0aENvbmZpZygpIG56U3JjTG9hZGVyOiBOekltYWdlU3JjTG9hZGVyID0gZGVmYXVsdEltYWdlU3JjTG9hZGVyO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgQFdpdGhDb25maWcoKSBuekF1dG9TcmNzZXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56UHJpb3JpdHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgQFdpdGhDb25maWcoKSBuekZhbGxiYWNrOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgQFdpdGhDb25maWcoKSBuelBsYWNlaG9sZGVyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIEBXaXRoQ29uZmlnKCkgbnpEaXNhYmxlUHJldmlldzogYm9vbGVhbiA9IGZhbHNlO1xuICBAVmlld0NoaWxkKCdpbWFnZVJlZicpIGltYWdlUmVmITogRWxlbWVudFJlZjxIVE1MSW1hZ2VFbGVtZW50PjtcblxuICBzcmMgPSAnJztcblxuICB3aWR0aDogc3RyaW5nIHwgbnVtYmVyID0gJ2F1dG8nO1xuICBoZWlnaHQ6IHN0cmluZyB8IG51bWJlciA9ICdhdXRvJztcbiAgc3Jjc2V0ID0gJyc7XG4gIGludGVybmFsSW1hZ2UhOiBIVE1MSW1hZ2VFbGVtZW50O1xuXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHJlbG9hZERpc3Bvc2VIYW5kbGVyOiBQcmVsb2FkRGlzcG9zZUhhbmRsZSA9ICgpID0+IHZvaWQgMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHVibGljIG56Q29uZmlnU2VydmljZTogTnpDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW1hZ2VQcmVsb2FkU2VydmljZTogSW1hZ2VQcmVsb2FkU2VydmljZVxuICApIHtcbiAgICB0aGlzLm56Q29uZmlnU2VydmljZVxuICAgICAgLmdldENvbmZpZ0NoYW5nZUV2ZW50Rm9yQ29tcG9uZW50KE5aX0NPTkZJR19NT0RVTEVfTkFNRSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBvc2VJbWFnZUF0dHJzKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5uelByaW9yaXR5KSB7XG4gICAgICB0aGlzLnByZWxvYWQoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgeyBuekxvYWRlciwgbnpTcmMsIG56T3B0aW1pemUgfSA9IGNoYW5nZXM7XG5cbiAgICBpZiAobnpTcmMgfHwgbnpMb2FkZXIgfHwgbnpPcHRpbWl6ZSkge1xuICAgICAgdGhpcy5jb21wb3NlSW1hZ2VBdHRycygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmVsb2FkRGlzcG9zZUhhbmRsZXIoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwcml2YXRlIHByZWxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWxvYWREaXNwb3NlSGFuZGxlciA9IHRoaXMuaW1hZ2VQcmVsb2FkU2VydmljZS5hZGRQcmVsb2FkKHtcbiAgICAgIHNyYzogdGhpcy5zcmMsXG4gICAgICBzcmNzZXQ6IHRoaXMuc3Jjc2V0XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9wdGltaXphYmxlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm56QXV0b1NyY3NldCkge1xuICAgICAgaWYgKCFpc0ZpeGVkU2l6ZSh0aGlzLm56V2lkdGgpIHx8ICFpc0ZpeGVkU2l6ZSh0aGlzLm56SGVpZ2h0KSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGBXaGVuIHVzaW5nIFwibnpBdXRvU3Jjc2V0XCIgeW91IHNob3VsZCB1c2UgYSBmaXhlZCBzaXplIHdpZHRoIGFuZCBoZWlnaHQsIGZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byBDTFMgKGh0dHBzOi8vd2ViLmRldi9jbHMvKSBwZXJmb3JtYW5jZSBtZXRyaWNzYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5uelNyYy5lbmRzV2l0aCgnLnN2ZycpKSB7XG4gICAgICAgIHdhcm4oYFNWRyBkb2VzIG5vdCBuZWVkIHRvIGJlIG9wdGltaXplZGApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5uelNyYy5zdGFydHNXaXRoKCdkYXRhOicpKSB7XG4gICAgICAgIHdhcm4oYERhdGEgVVJMcyBjYW5ub3QgYmUgb3B0aW1pemVkYCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGNvbXBvc2VJbWFnZUF0dHJzKCk6IHZvaWQge1xuICAgIGNvbnN0IGxvYWRlciA9IHRoaXMuZ2V0TG9hZGVyKCk7XG4gICAgaWYgKCF0aGlzLm9wdGltaXphYmxlKCkpIHtcbiAgICAgIHRoaXMuc3JjID0gbG9hZGVyKHsgc3JjOiB0aGlzLm56U3JjIH0pO1xuICAgICAgdGhpcy53aWR0aCA9IHRoaXMubnpXaWR0aDtcbiAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5uekhlaWdodDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy53aWR0aCA9IHR5cGVvZiB0aGlzLm56V2lkdGggPT09ICdudW1iZXInID8gdGhpcy5ueldpZHRoIDogcGFyc2VJbnQodGhpcy5ueldpZHRoLCAxMCk7XG4gICAgdGhpcy5oZWlnaHQgPSB0eXBlb2YgdGhpcy5uekhlaWdodCA9PT0gJ251bWJlcicgPyB0aGlzLm56SGVpZ2h0IDogcGFyc2VJbnQodGhpcy5uekhlaWdodCwgMTApO1xuICAgIGNvbnN0IHdpZHRocyA9IHRoaXMuY29udmVydFdpZHRocyh0aGlzLndpZHRoLCBzaXplQnJlYWtwb2ludHMpO1xuICAgIHRoaXMuc3JjID0gbG9hZGVyKHsgc3JjOiB0aGlzLm56U3JjLCB3aWR0aDogd2lkdGhzWzBdIH0pO1xuICAgIHRoaXMuc3Jjc2V0ID0gd2lkdGhzXG4gICAgICAubWFwKFxuICAgICAgICAodywgaSkgPT5cbiAgICAgICAgICBgJHtsb2FkZXIoe1xuICAgICAgICAgICAgc3JjOiB0aGlzLm56U3JjLFxuICAgICAgICAgICAgd2lkdGg6IHdcbiAgICAgICAgICB9KX0gJHtpICsgMX14YFxuICAgICAgKVxuICAgICAgLmpvaW4oJywgJyk7XG4gIH1cblxuICBwcml2YXRlIGdldExvYWRlcigpOiBOekltYWdlU3JjTG9hZGVyIHtcbiAgICByZXR1cm4gdGhpcy5uelNyY0xvYWRlciB8fCBkZWZhdWx0SW1hZ2VTcmNMb2FkZXI7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRXaWR0aHMod2lkdGg6IG51bWJlciwgb3B0aW1pemVTaXplczogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gICAgY29uc3QgYWxsU2l6ZXMgPSBbLi4ub3B0aW1pemVTaXplc10uc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgIHJldHVybiBbXG4gICAgICAuLi5uZXcgU2V0KFxuICAgICAgICAvLyAyeCBzY2FsZSBpcyBzdWZmaWNpZW50XG4gICAgICAgIC8vIGh0dHBzOi8vYmxvZy50d2l0dGVyLmNvbS9lbmdpbmVlcmluZy9lbl91cy90b3BpY3MvaW5mcmFzdHJ1Y3R1cmUvMjAxOS9jYXBwaW5nLWltYWdlLWZpZGVsaXR5LW9uLXVsdHJhLWhpZ2gtcmVzb2x1dGlvbi1kZXZpY2VzLmh0bWxcbiAgICAgICAgW3dpZHRoLCB3aWR0aCAqIDJdLm1hcCh3ID0+IGFsbFNpemVzLmZpbmQocCA9PiBwID49IHcpIHx8IHcpXG4gICAgICApXG4gICAgXTtcbiAgfVxufVxuIl19