UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

250 lines 35.7 kB
/** * 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 { DOCUMENT } from '@angular/common'; import { ChangeDetectionStrategy, Component, Inject, Input } from '@angular/core'; import { getPixelRatio, getStyleStr, reRendering, rotateWatermark } from './util'; import * as i0 from "@angular/core"; /** * Base size of the canvas, 1 for parallel layout and 2 for alternate layout * Only alternate layout is currently supported */ const BaseSize = 2; const FontGap = 3; export class NzWaterMarkComponent { constructor(el, document, cdr) { this.el = el; this.document = document; this.cdr = cdr; this.nzWidth = 120; this.nzHeight = 64; this.nzRotate = -22; this.nzZIndex = 9; this.nzImage = ''; this.nzContent = ''; this.nzFont = {}; this.nzGap = [100, 100]; this.nzOffset = [this.nzGap[0] / 2, this.nzGap[1] / 2]; this.waterMarkElement = this.document.createElement('div'); this.stopObservation = false; this.observer = new MutationObserver(mutations => { if (this.stopObservation) { return; } mutations.forEach(mutation => { if (reRendering(mutation, this.waterMarkElement)) { this.destroyWatermark(); this.renderWatermark(); } }); }); } ngOnInit() { this.observer.observe(this.el.nativeElement, { subtree: true, childList: true, attributeFilter: ['style', 'class'] }); } ngAfterViewInit() { this.renderWatermark(); } ngOnChanges(changes) { const { nzRotate, nzZIndex, nzWidth, nzHeight, nzImage, nzContent, nzFont, gapX, gapY, offsetLeft, offsetTop } = changes; if (nzRotate || nzZIndex || nzWidth || nzHeight || nzImage || nzContent || nzFont || gapX || gapY || offsetLeft || offsetTop) { this.renderWatermark(); } } getFont() { const font = { color: 'rgba(0,0,0,.15)', fontSize: 16, fontWeight: 'normal', fontFamily: 'sans-serif', fontStyle: 'normal' }; this.nzFont = { ...font, ...this.nzFont }; this.cdr.markForCheck(); } getMarkStyle() { const markStyle = { zIndex: this.nzZIndex, position: 'absolute', left: 0, top: 0, width: '100%', height: '100%', pointerEvents: 'none', backgroundRepeat: 'repeat' }; /** Calculate the style of the nzOffset */ let positionLeft = (this.nzOffset?.[0] ?? this.nzGap[0] / 2) - this.nzGap[0] / 2; let positionTop = (this.nzOffset?.[1] ?? this.nzGap[1] / 2) - this.nzGap[1] / 2; if (positionLeft > 0) { markStyle.left = `${positionLeft}px`; markStyle.width = `calc(100% - ${positionLeft}px)`; positionLeft = 0; } if (positionTop > 0) { markStyle.top = `${positionTop}px`; markStyle.height = `calc(100% - ${positionTop}px)`; positionTop = 0; } markStyle.backgroundPosition = `${positionLeft}px ${positionTop}px`; return markStyle; } destroyWatermark() { if (this.waterMarkElement) { this.waterMarkElement.remove(); } } appendWatermark(base64Url, markWidth) { this.stopObservation = true; this.waterMarkElement.setAttribute('style', getStyleStr({ ...this.getMarkStyle(), backgroundImage: `url('${base64Url}')`, backgroundSize: `${(this.nzGap[0] + markWidth) * BaseSize}px` })); this.el.nativeElement.append(this.waterMarkElement); this.cdr.markForCheck(); // Delayed execution setTimeout(() => { this.stopObservation = false; this.cdr.markForCheck(); }); } getMarkSize(ctx) { let defaultWidth = 120; let defaultHeight = 64; if (!this.nzImage && ctx.measureText) { ctx.font = `${Number(this.nzFont.fontSize)}px ${this.nzFont.fontFamily}`; const contents = Array.isArray(this.nzContent) ? this.nzContent : [this.nzContent]; const widths = contents.map(item => ctx.measureText(item).width); defaultWidth = Math.ceil(Math.max(...widths)); defaultHeight = Number(this.nzFont.fontSize) * contents.length + (contents.length - 1) * FontGap; } return [this.nzWidth ?? defaultWidth, this.nzHeight ?? defaultHeight]; } fillTexts(ctx, drawX, drawY, drawWidth, drawHeight) { const ratio = getPixelRatio(); const mergedFontSize = Number(this.nzFont.fontSize) * ratio; ctx.font = `${this.nzFont.fontStyle} normal ${this.nzFont.fontWeight} ${mergedFontSize}px/${drawHeight}px ${this.nzFont.fontFamily}`; if (this.nzFont.color) ctx.fillStyle = this.nzFont.color; ctx.textAlign = 'center'; ctx.textBaseline = 'top'; ctx.translate(drawWidth / 2, 0); const contents = Array.isArray(this.nzContent) ? this.nzContent : [this.nzContent]; contents?.forEach((item, index) => { ctx.fillText(item ?? '', drawX, drawY + index * (mergedFontSize + FontGap * ratio)); }); } drawText(canvas, ctx, drawX, drawY, drawWidth, drawHeight, alternateRotateX, alternateRotateY, alternateDrawX, alternateDrawY, markWidth) { this.fillTexts(ctx, drawX, drawY, drawWidth, drawHeight); /** Fill the interleaved text after rotation */ ctx.restore(); rotateWatermark(ctx, alternateRotateX, alternateRotateY, this.nzRotate); this.fillTexts(ctx, alternateDrawX, alternateDrawY, drawWidth, drawHeight); this.appendWatermark(canvas.toDataURL(), markWidth); } renderWatermark() { if (!this.nzContent && !this.nzImage) { return; } const canvas = this.document.createElement('canvas'); const ctx = canvas.getContext('2d'); if (ctx) { if (!this.waterMarkElement) { this.waterMarkElement = this.document.createElement('div'); } this.getFont(); const ratio = getPixelRatio(); const [markWidth, markHeight] = this.getMarkSize(ctx); const canvasWidth = (this.nzGap[0] + markWidth) * ratio; const canvasHeight = (this.nzGap[1] + markHeight) * ratio; canvas.setAttribute('width', `${canvasWidth * BaseSize}px`); canvas.setAttribute('height', `${canvasHeight * BaseSize}px`); const drawX = (this.nzGap[0] * ratio) / 2; const drawY = (this.nzGap[1] * ratio) / 2; const drawWidth = markWidth * ratio; const drawHeight = markHeight * ratio; const rotateX = (drawWidth + this.nzGap[0] * ratio) / 2; const rotateY = (drawHeight + this.nzGap[1] * ratio) / 2; /** Alternate drawing parameters */ const alternateDrawX = drawX + canvasWidth; const alternateDrawY = drawY + canvasHeight; const alternateRotateX = rotateX + canvasWidth; const alternateRotateY = rotateY + canvasHeight; ctx.save(); rotateWatermark(ctx, rotateX, rotateY, this.nzRotate); if (this.nzImage) { const img = new Image(); img.onload = () => { ctx.drawImage(img, drawX, drawY, drawWidth, drawHeight); /** Draw interleaved pictures after rotation */ ctx.restore(); rotateWatermark(ctx, alternateRotateX, alternateRotateY, this.nzRotate); ctx.drawImage(img, alternateDrawX, alternateDrawY, drawWidth, drawHeight); this.appendWatermark(canvas.toDataURL(), markWidth); }; img.onerror = () => this.drawText(canvas, ctx, drawX, drawY, drawWidth, drawHeight, alternateRotateX, alternateRotateY, alternateDrawX, alternateDrawY, markWidth); img.crossOrigin = 'anonymous'; img.referrerPolicy = 'no-referrer'; img.src = this.nzImage; } else { this.drawText(canvas, ctx, drawX, drawY, drawWidth, drawHeight, alternateRotateX, alternateRotateY, alternateDrawX, alternateDrawY, markWidth); } } } ngOnDestroy() { this.observer.disconnect(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: NzWaterMarkComponent, deps: [{ token: i0.ElementRef }, { token: DOCUMENT }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.3", type: NzWaterMarkComponent, selector: "nz-water-mark", inputs: { nzWidth: "nzWidth", nzHeight: "nzHeight", nzRotate: "nzRotate", nzZIndex: "nzZIndex", nzImage: "nzImage", nzContent: "nzContent", nzFont: "nzFont", nzGap: "nzGap", nzOffset: "nzOffset" }, host: { classAttribute: "ant-water-mark" }, exportAs: ["NzWaterMark"], usesOnChanges: true, ngImport: i0, template: ` <ng-content></ng-content> `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: NzWaterMarkComponent, decorators: [{ type: Component, args: [{ selector: 'nz-water-mark', exportAs: 'NzWaterMark', changeDetection: ChangeDetectionStrategy.OnPush, template: ` <ng-content></ng-content> `, host: { class: 'ant-water-mark' } }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: i0.ChangeDetectorRef }], propDecorators: { nzWidth: [{ type: Input }], nzHeight: [{ type: Input }], nzRotate: [{ type: Input }], nzZIndex: [{ type: Input }], nzImage: [{ type: Input }], nzContent: [{ type: Input }], nzFont: [{ type: Input }], nzGap: [{ type: Input }], nzOffset: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0ZXItbWFyay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21wb25lbnRzL3dhdGVyLW1hcmsvd2F0ZXItbWFyay5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULE1BQU0sRUFDTixLQUFLLEVBS04sTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLFFBQVEsQ0FBQzs7QUFFbEY7OztHQUdHO0FBQ0gsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ25CLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztBQVdsQixNQUFNLE9BQU8sb0JBQW9CO0lBMEIvQixZQUFvQixFQUFjLEVBQTRCLFFBQWtCLEVBQVUsR0FBc0I7UUFBNUYsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUE0QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF6QnZHLFlBQU8sR0FBVyxHQUFHLENBQUM7UUFDdEIsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixhQUFRLEdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDdkIsYUFBUSxHQUFXLENBQUMsQ0FBQztRQUNyQixZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQ3JCLGNBQVMsR0FBc0IsRUFBRSxDQUFDO1FBQ2xDLFdBQU0sR0FBYSxFQUFFLENBQUM7UUFDdEIsVUFBSyxHQUFxQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyQyxhQUFRLEdBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENB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QUFDLENBQUM7YUFDNUQ7WUFDRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZixNQUFNLEtBQUssR0FBRyxhQUFhLEVBQUUsQ0FBQztZQUM5QixNQUFNLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUN4RCxNQUFNLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQzFELE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLEdBQUcsV0FBVyxHQUFHLFFBQVEsSUFBSSxDQUFDLENBQUM7WUFDNUQsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxZQUFZLEdBQUcsUUFBUSxJQUFJLENBQUMsQ0FBQztZQUU5RCxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUMsTUFBTSxTQUFTLEdBQUcsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUNwQyxNQUFNLFVBQVUsR0FBRyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3RDLE1BQU0sT0FBTyxHQUFHLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hELE1BQU0sT0FBTyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFD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c0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE1hcmtTdHlsZVR5cGUsIEZvbnRUeXBlIH0gZnJvbSAnLi90eXBpbmdzJztcbmltcG9ydCB7IGdldFBpeGVsUmF0aW8sIGdldFN0eWxlU3RyLCByZVJlbmRlcmluZywgcm90YXRlV2F0ZXJtYXJrIH0gZnJvbSAnLi91dGlsJztcblxuLyoqXG4gKiBCYXNlIHNpemUgb2YgdGhlIGNhbnZhcywgMSBmb3IgcGFyYWxsZWwgbGF5b3V0IGFuZCAyIGZvciBhbHRlcm5hdGUgbGF5b3V0XG4gKiBPbmx5IGFsdGVybmF0ZSBsYXlvdXQgaXMgY3VycmVudGx5IHN1cHBvcnRlZFxuICovXG5jb25zdCBCYXNlU2l6ZSA9IDI7XG5jb25zdCBGb250R2FwID0gMztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnotd2F0ZXItbWFyaycsXG4gIGV4cG9ydEFzOiAnTnpXYXRlck1hcmsnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PiBgLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdhbnQtd2F0ZXItbWFyaydcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBOeldhdGVyTWFya0NvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBueldpZHRoOiBudW1iZXIgPSAxMjA7XG4gIEBJbnB1dCgpIG56SGVpZ2h0OiBudW1iZXIgPSA2NDtcbiAgQElucHV0KCkgbnpSb3RhdGU6IG51bWJlciA9IC0yMjtcbiAgQElucHV0KCkgbnpaSW5kZXg6IG51bWJlciA9IDk7XG4gIEBJbnB1dCgpIG56SW1hZ2U6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBuekNvbnRlbnQ6IHN0cmluZyB8IHN0cmluZ1tdID0gJyc7XG4gIEBJbnB1dCgpIG56Rm9udDogRm9udFR5cGUgPSB7fTtcbiAgQElucHV0KCkgbnpHYXA6IFtudW1iZXIsIG51bWJlcl0gPSBbMTAwLCAxMDBdO1xuICBASW5wdXQoKSBuek9mZnNldDogW251bWJlciwgbnVtYmVyXSA9IFt0aGlzLm56R2FwWzBdIC8gMiwgdGhpcy5uekdhcFsxXSAvIDJdO1xuXG4gIHdhdGVyTWFya0VsZW1lbnQ6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgc3RvcE9ic2VydmF0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgIGlmICh0aGlzLnN0b3BPYnNlcnZhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBtdXRhdGlvbnMuZm9yRWFjaChtdXRhdGlvbiA9PiB7XG4gICAgICBpZiAocmVSZW5kZXJpbmcobXV0YXRpb24sIHRoaXMud2F0ZXJNYXJrRWxlbWVudCkpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95V2F0ZXJtYXJrKCk7XG4gICAgICAgIHRoaXMucmVuZGVyV2F0ZXJtYXJrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50LCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwge1xuICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydzdHlsZScsICdjbGFzcyddXG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJXYXRlcm1hcmsoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IG56Um90YXRlLCBuelpJbmRleCwgbnpXaWR0aCwgbnpIZWlnaHQsIG56SW1hZ2UsIG56Q29udGVudCwgbnpGb250LCBnYXBYLCBnYXBZLCBvZmZzZXRMZWZ0LCBvZmZzZXRUb3AgfSA9XG4gICAgICBjaGFuZ2VzO1xuXG4gICAgaWYgKFxuICAgICAgbnpSb3RhdGUgfHxcbiAgICAgIG56WkluZGV4IHx8XG4gICAgICBueldpZHRoIHx8XG4gICAgICBuekhlaWdodCB8fFxuICAgICAgbnpJbWFnZSB8fFxuICAgICAgbnpDb250ZW50IHx8XG4gICAgICBuekZvbnQgfHxcbiAgICAgIGdhcFggfHxcbiAgICAgIGdhcFkgfHxcbiAgICAgIG9mZnNldExlZnQgfHxcbiAgICAgIG9mZnNldFRvcFxuICAgICkge1xuICAgICAgdGhpcy5yZW5kZXJXYXRlcm1hcmsoKTtcbiAgICB9XG4gIH1cblxuICBnZXRGb250KCk6IHZvaWQge1xuICAgIGNvbnN0IGZvbnQ6IEZvbnRUeXBlID0ge1xuICAgICAgY29sb3I6ICdyZ2JhKDAsMCwwLC4xNSknLFxuICAgICAgZm9udFNpemU6IDE2LFxuICAgICAgZm9udFdlaWdodDogJ25vcm1hbCcsXG4gICAgICBmb250RmFtaWx5OiAnc2Fucy1zZXJpZicsXG4gICAgICBmb250U3R5bGU6ICdub3JtYWwnXG4gICAgfTtcblxuICAgIHRoaXMubnpGb250ID0geyAuLi5mb250LCAuLi50aGlzLm56Rm9udCB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0TWFya1N0eWxlKCk6IE1hcmtTdHlsZVR5cGUge1xuICAgIGNvbnN0IG1hcmtTdHlsZTogTWFya1N0eWxlVHlwZSA9IHtcbiAgICAgIHpJbmRleDogdGhpcy5uelpJbmRleCxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHRvcDogMCxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIGJhY2tncm91bmRSZXBlYXQ6ICdyZXBlYXQnXG4gICAgfTtcblxuICAgIC8qKiBDYWxjdWxhdGUgdGhlIHN0eWxlIG9mIHRoZSBuek9mZnNldCAqL1xuICAgIGxldCBwb3NpdGlvbkxlZnQgPSAodGhpcy5uek9mZnNldD8uWzBdID8/IHRoaXMubnpHYXBbMF0gLyAyKSAtIHRoaXMubnpHYXBbMF0gLyAyO1xuICAgIGxldCBwb3NpdGlvblRvcCA9ICh0aGlzLm56T2Zmc2V0Py5bMV0gPz8gdGhpcy5uekdhcFsxXSAvIDIpIC0gdGhpcy5uekdhcFsxXSAvIDI7XG4gICAgaWYgKHBvc2l0aW9uTGVmdCA+IDApIHtcbiAgICAgIG1hcmtTdHlsZS5sZWZ0ID0gYCR7cG9zaXRpb25MZWZ0fXB4YDtcbiAgICAgIG1hcmtTdHlsZS53aWR0aCA9IGBjYWxjKDEwMCUgLSAke3Bvc2l0aW9uTGVmdH1weClgO1xuICAgICAgcG9zaXRpb25MZWZ0ID0gMDtcbiAgICB9XG4gICAgaWYgKHBvc2l0aW9uVG9wID4gMCkge1xuICAgICAgbWFya1N0eWxlLnRvcCA9IGAke3Bvc2l0aW9uVG9wfXB4YDtcbiAgICAgIG1hcmtTdHlsZS5oZWlnaHQgPSBgY2FsYygxMDAlIC0gJHtwb3NpdGlvblRvcH1weClgO1xuICAgICAgcG9zaXRpb25Ub3AgPSAwO1xuICAgIH1cbiAgICBtYXJrU3R5bGUuYmFja2dyb3VuZFBvc2l0aW9uID0gYCR7cG9zaXRpb25MZWZ0fXB4ICR7cG9zaXRpb25Ub3B9cHhgO1xuXG4gICAgcmV0dXJuIG1hcmtTdHlsZTtcbiAgfVxuXG4gIGRlc3Ryb3lXYXRlcm1hcmsoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud2F0ZXJNYXJrRWxlbWVudCkge1xuICAgICAgdGhpcy53YXRlck1hcmtFbGVtZW50LnJlbW92ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFwcGVuZFdhdGVybWFyayhiYXNlNjRVcmw6IHN0cmluZywgbWFya1dpZHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BPYnNlcnZhdGlvbiA9IHRydWU7XG4gICAgdGhpcy53YXRlck1hcmtFbGVtZW50LnNldEF0dHJpYnV0ZShcbiAgICAgICdzdHlsZScsXG4gICAgICBnZXRTdHlsZVN0cih7XG4gICAgICAgIC4uLnRoaXMuZ2V0TWFya1N0eWxlKCksXG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogYHVybCgnJHtiYXNlNjRVcmx9JylgLFxuICAgICAgICBiYWNrZ3JvdW5kU2l6ZTogYCR7KHRoaXMubnpHYXBbMF0gKyBtYXJrV2lkdGgpICogQmFzZVNpemV9cHhgXG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmFwcGVuZCh0aGlzLndhdGVyTWFya0VsZW1lbnQpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgLy8gRGVsYXllZCBleGVjdXRpb25cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc3RvcE9ic2VydmF0aW9uID0gZmFsc2U7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldE1hcmtTaXplKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgbGV0IGRlZmF1bHRXaWR0aCA9IDEyMDtcbiAgICBsZXQgZGVmYXVsdEhlaWdodCA9IDY0O1xuICAgIGlmICghdGhpcy5uekltYWdlICYmIGN0eC5tZWFzdXJlVGV4dCkge1xuICAgICAgY3R4LmZvbnQgPSBgJHtOdW1iZXIodGhpcy5uekZvbnQuZm9udFNpemUpfXB4ICR7dGhpcy5uekZvbnQuZm9udEZhbWlseX1gO1xuICAgICAgY29uc3QgY29udGVudHMgPSBBcnJheS5pc0FycmF5KHRoaXMubnpDb250ZW50KSA/IHRoaXMubnpDb250ZW50IDogW3RoaXMubnpDb250ZW50XTtcbiAgICAgIGNvbnN0IHdpZHRocyA9IGNvbnRlbnRzLm1hcChpdGVtID0+IGN0eC5tZWFzdXJlVGV4dChpdGVtISkud2lkdGgpO1xuICAgICAgZGVmYXVsdFdpZHRoID0gTWF0aC5jZWlsKE1hdGgubWF4KC4uLndpZHRocykpO1xuICAgICAgZGVmYXVsdEhlaWdodCA9IE51bWJlcih0aGlzLm56Rm9udC5mb250U2l6ZSkgKiBjb250ZW50cy5sZW5ndGggKyAoY29udGVudHMubGVuZ3RoIC0gMSkgKiBGb250R2FwO1xuICAgIH1cbiAgICByZXR1cm4gW3RoaXMubnpXaWR0aCA/PyBkZWZhdWx0V2lkdGgsIHRoaXMubnpIZWlnaHQgPz8gZGVmYXVsdEhlaWdodF07XG4gIH1cblxuICBmaWxsVGV4dHMoY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGRyYXdYOiBudW1iZXIsIGRyYXdZOiBudW1iZXIsIGRyYXdXaWR0aDogbnVtYmVyLCBkcmF3SGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCByYXRpbyA9IGdldFBpeGVsUmF0aW8oKTtcbiAgICBjb25zdCBtZXJnZWRGb250U2l6ZSA9IE51bWJlcih0aGlzLm56Rm9udC5mb250U2l6ZSkgKiByYXRpbztcbiAgICBjdHguZm9udCA9IGAke3RoaXMubnpGb250LmZvbnRTdHlsZX0gbm9ybWFsICR7dGhpcy5uekZvbnQuZm9udFdlaWdodH0gJHttZXJnZWRGb250U2l6ZX1weC8ke2RyYXdIZWlnaHR9cHggJHt0aGlzLm56Rm9udC5mb250RmFtaWx5fWA7XG4gICAgaWYgKHRoaXMubnpGb250LmNvbG9yKSBjdHguZmlsbFN0eWxlID0gdGhpcy5uekZvbnQuY29sb3I7XG4gICAgY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAndG9wJztcbiAgICBjdHgudHJhbnNsYXRlKGRyYXdXaWR0aCAvIDIsIDApO1xuICAgIGNvbnN0IGNvbnRlbnRzID0gQXJyYXkuaXNBcnJheSh0aGlzLm56Q29udGVudCkgPyB0aGlzLm56Q29udGVudCA6IFt0aGlzLm56Q29udGVudF07XG4gICAgY29udGVudHM/LmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBjdHguZmlsbFRleHQoaXRlbSA/PyAnJywgZHJhd1gsIGRyYXdZICsgaW5kZXggKiAobWVyZ2VkRm9udFNpemUgKyBGb250R2FwICogcmF0aW8pKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRyYXdUZXh0KFxuICAgIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsXG4gICAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gICAgZHJhd1g6IG51bWJlcixcbiAgICBkcmF3WTogbnVtYmVyLFxuICAgIGRyYXdXaWR0aDogbnVtYmVyLFxuICAgIGRyYXdIZWlnaHQ6IG51bWJlcixcbiAgICBhbHRlcm5hdGVSb3RhdGVYOiBudW1iZXIsXG4gICAgYWx0ZXJuYXRlUm90YXRlWTogbnVtYmVyLFxuICAgIGFsdGVybmF0ZURyYXdYOiBudW1iZXIsXG4gICAgYWx0ZXJuYXRlRHJhd1k6IG51bWJlcixcbiAgICBtYXJrV2lkdGg6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICB0aGlzLmZpbGxUZXh0cyhjdHgsIGRyYXdYLCBkcmF3WSwgZHJhd1dpZHRoLCBkcmF3SGVpZ2h0KTtcblxuICAgIC8qKiBGaWxsIHRoZSBpbnRlcmxlYXZlZCB0ZXh0IGFmdGVyIHJvdGF0aW9uICovXG4gICAgY3R4LnJlc3RvcmUoKTtcbiAgICByb3RhdGVXYXRlcm1hcmsoY3R4LCBhbHRlcm5hdGVSb3RhdGVYLCBhbHRlcm5hdGVSb3RhdGVZLCB0aGlzLm56Um90YXRlKTtcbiAgICB0aGlzLmZpbGxUZXh0cyhjdHgsIGFsdGVybmF0ZURyYXdYLCBhbHRlcm5hdGVEcmF3WSwgZHJhd1dpZHRoLCBkcmF3SGVpZ2h0KTtcbiAgICB0aGlzLmFwcGVuZFdhdGVybWFyayhjYW52YXMudG9EYXRhVVJMKCksIG1hcmtXaWR0aCk7XG4gIH1cblxuICByZW5kZXJXYXRlcm1hcmsoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm56Q29udGVudCAmJiAhdGhpcy5uekltYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcblxuICAgIGlmIChjdHgpIHtcbiAgICAgIGlmICghdGhpcy53YXRlck1hcmtFbGVtZW50KSB7XG4gICAgICAgIHRoaXMud2F0ZXJNYXJrRWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB9XG4gICAgICB0aGlzLmdldEZvbnQoKTtcbiAgICAgIGNvbnN0IHJhdGlvID0gZ2V0UGl4ZWxSYXRpbygpO1xuICAgICAgY29uc3QgW21hcmtXaWR0aCwgbWFya0hlaWdodF0gPSB0aGlzLmdldE1hcmtTaXplKGN0eCk7XG4gICAgICBjb25zdCBjYW52YXNXaWR0aCA9ICh0aGlzLm56R2FwWzBdICsgbWFya1dpZHRoKSAqIHJhdGlvO1xuICAgICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gKHRoaXMubnpHYXBbMV0gKyBtYXJrSGVpZ2h0KSAqIHJhdGlvO1xuICAgICAgY2FudmFzLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBgJHtjYW52YXNXaWR0aCAqIEJhc2VTaXplfXB4YCk7XG4gICAgICBjYW52YXMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBgJHtjYW52YXNIZWlnaHQgKiBCYXNlU2l6ZX1weGApO1xuXG4gICAgICBjb25zdCBkcmF3WCA9ICh0aGlzLm56R2FwWzBdICogcmF0aW8pIC8gMjtcbiAgICAgIGNvbnN0IGRyYXdZID0gKHRoaXMubnpHYXBbMV0gKiByYXRpbykgLyAyO1xuICAgICAgY29uc3QgZHJhd1dpZHRoID0gbWFya1dpZHRoICogcmF0aW87XG4gICAgICBjb25zdCBkcmF3SGVpZ2h0ID0gbWFya0hlaWdodCAqIHJhdGlvO1xuICAgICAgY29uc3Qgcm90YXRlWCA9IChkcmF3V2lkdGggKyB0aGlzLm56R2FwWzBdICogcmF0aW8pIC8gMjtcbiAgICAgIGNvbnN0IHJvdGF0ZVkgPSAoZHJhd0hlaWdodCArIHRoaXMubnpHYXBbMV0gKiByYXRpbykgLyAyO1xuXG4gICAgICAvKiogQWx0ZXJuYXRlIGRyYXdpbmcgcGFyYW1ldGVycyAqL1xuICAgICAgY29uc3QgYWx0ZXJuYXRlRHJhd1ggPSBkcmF3WCArIGNhbnZhc1dpZHRoO1xuICAgICAgY29uc3QgYWx0ZXJuYXRlRHJhd1kgPSBkcmF3WSArIGNhbnZhc0hlaWdodDtcbiAgICAgIGNvbnN0IGFsdGVybmF0ZVJvdGF0ZVggPSByb3RhdGVYICsgY2FudmFzV2lkdGg7XG4gICAgICBjb25zdCBhbHRlcm5hdGVSb3RhdGVZID0gcm90YXRlWSArIGNhbnZhc0hlaWdodDtcblxuICAgICAgY3R4LnNhdmUoKTtcbiAgICAgIHJvdGF0ZVdhdGVybWFyayhjdHgsIHJvdGF0ZVgsIHJvdGF0ZVksIHRoaXMubnpSb3RhdGUpO1xuXG4gICAgICBpZiAodGhpcy5uekltYWdlKSB7XG4gICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCBkcmF3WCwgZHJhd1ksIGRyYXdXaWR0aCwgZHJhd0hlaWdodCk7XG5cbiAgICAgICAgICAvKiogRHJhdyBpbnRlcmxlYXZlZCBwaWN0dXJlcyBhZnRlciByb3RhdGlvbiAqL1xuICAgICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICAgICAgcm90YXRlV2F0ZXJtYXJrKGN0eCwgYWx0ZXJuYXRlUm90YXRlWCwgYWx0ZXJuYXRlUm90YXRlWSwgdGhpcy5uelJvdGF0ZSk7XG4gICAgICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIGFsdGVybmF0ZURyYXdYLCBhbHRlcm5hdGVEcmF3WSwgZHJhd1dpZHRoLCBkcmF3SGVpZ2h0KTtcbiAgICAgICAgICB0aGlzLmFwcGVuZFdhdGVybWFyayhjYW52YXMudG9EYXRhVVJMKCksIG1hcmtXaWR0aCk7XG4gICAgICAgIH07XG4gICAgICAgIGltZy5vbmVycm9yID0gKCkgPT5cbiAgICAgICAgICB0aGlzLmRyYXdUZXh0KFxuICAgICAgICAgICAgY2FudmFzLFxuICAgICAgICAgICAgY3R4LFxuICAgICAgICAgICAgZHJhd1gsXG4gICAgICAgICAgICBkcmF3WSxcbiAgICAgICAgICAgIGRyYXdXaWR0aCxcbiAgICAgICAgICAgIGRyYXdIZWlnaHQsXG4gICAgICAgICAgICBhbHRlcm5hdGVSb3RhdGVYLFxuICAgICAgICAgICAgYWx0ZXJuYXRlUm90YXRlWSxcbiAgICAgICAgICAgIGFsdGVybmF0ZURyYXdYLFxuICAgICAgICAgICAgYWx0ZXJuYXRlRHJhd1ksXG4gICAgICAgICAgICBtYXJrV2lkdGhcbiAgICAgICAgICApO1xuICAgICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcbiAgICAgICAgaW1nLnJlZmVycmVyUG9saWN5ID0gJ25vLXJlZmVycmVyJztcbiAgICAgICAgaW1nLnNyYyA9IHRoaXMubnpJbWFnZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZHJhd1RleHQoXG4gICAgICAgICAgY2FudmFzLFxuICAgICAgICAgIGN0eCxcbiAgICAgICAgICBkcmF3WCxcbiAgICAgICAgICBkcmF3WSxcbiAgICAgICAgICBkcmF3V2lkdGgsXG4gICAgICAgICAgZHJhd0hlaWdodCxcbiAgICAgICAgICBhbHRlcm5hdGVSb3RhdGVYLFxuICAgICAgICAgIGFsdGVybmF0ZVJvdGF0ZVksXG4gICAgICAgICAgYWx0ZXJuYXRlRHJhd1gsXG4gICAgICAgICAgYWx0ZXJuYXRlRHJhd1ksXG4gICAgICAgICAgbWFya1dpZHRoXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gIH1cbn1cbiJdfQ==