@almothafar/angular-signature-pad
Version:
Angular Component wrapper for szimek/signature_pad
230 lines • 28.9 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import SignaturePad from 'signature_pad';
import * as i0 from "@angular/core";
export class SignaturePadComponent {
constructor(_elementRef) {
this._elementRef = _elementRef;
this.options = this.options || {};
this.drawStart = new EventEmitter();
this.drawBeforeUpdate = new EventEmitter();
this.drawAfterUpdate = new EventEmitter();
this.drawEnd = new EventEmitter();
}
ngAfterContentInit() {
const canvas = this.initCanvas(this.options);
this.initSignaturePad(canvas, this.options);
this.redrawCanvas();
}
ngOnDestroy() {
const canvas = this.getCanvas();
canvas.width = 0;
canvas.height = 0;
}
// noinspection JSUnusedGlobalSymbols
getSignaturePad() {
return this.signaturePad;
}
getCanvas() {
return this._elementRef.nativeElement.querySelector('canvas');
}
// noinspection JSUnusedGlobalSymbols
/**
* Redraw or Resize canvas, note this will clear data.
*/
redrawCanvas() {
const canvas = this.getCanvas();
// when zoomed out to less than 100%, for some very strange reason,
// some browsers report devicePixelRatio as less than 1, and only part of the canvas is cleared then.
const ratio = Math.max(window.devicePixelRatio || 1, 1);
canvas.width = this._getWidthFix(canvas) * ratio;
canvas.height = this._getHeightFix(canvas) * ratio;
canvas.getContext('2d').scale(ratio, ratio);
this.changeBackgroundColor(this.signaturePad.backgroundColor);
}
// noinspection JSUnusedGlobalSymbols
/**
* Change the color of the background dynamically.
*/
changeBackgroundColor(color) {
this.signaturePad.backgroundColor = color;
const data = this.signaturePad.toData();
this.signaturePad.clear();
this.signaturePad.fromData(data);
}
// noinspection JSUnusedGlobalSymbols
/**
* Returns signature image as an array of point groups
*/
toData() {
if (this.signaturePad) {
return this.signaturePad.toData();
}
else {
return [];
}
}
// noinspection JSUnusedGlobalSymbols
/**
* Draws signature image from an array of point groups
*/
fromData(points) {
this.signaturePad.fromData(points);
}
// noinspection JSUnusedGlobalSymbols
/**
* Returns signature image as data URL (see https://mdn.io/todataurl for the list of possible parameters)
*/
toDataURL(imageType, quality) {
return this.signaturePad.toDataURL(imageType, quality); // save image as data URL
}
// noinspection JSUnusedGlobalSymbols
/**
* Draws signature image from data URL
*/
fromDataURL(dataURL, options = {}) {
// set default height and width on read data from URL
if (!options.hasOwnProperty('height') && this.options.canvasHeight) {
options.height = this.options.canvasHeight;
}
if (!options.hasOwnProperty('width') && this.options.canvasWidth) {
options.width = this.options.canvasWidth;
}
return this.signaturePad.fromDataURL(dataURL, options);
}
// noinspection JSUnusedGlobalSymbols
/**
* Clears the canvas
*/
clear(redraw = true) {
if (redraw) {
this.signaturePad.clear();
this.redrawCanvas();
}
else {
this.signaturePad.clear();
}
this.endStroke(null);
}
// noinspection JSUnusedGlobalSymbols
/**
* Returns true if canvas is empty, otherwise returns false
*/
isEmpty() {
return this.signaturePad.isEmpty();
}
// noinspection JSUnusedGlobalSymbols
/**
* Unbinds all event handlers
*/
off() {
this.signaturePad.off();
}
/**
* Rebinds all event handlers
*/
on() {
this.signaturePad.on();
}
/**
* set an option on the signaturePad - e.g. set('minWidth', 50);
* @param option one of SignaturePad to set with value, properties of NgSignaturePadOptions
* @param value the value of option
*/
set(option, value) {
if (option === 'canvasHeight' || option === 'canvasWidth') {
const canvas = this.getCanvas();
const canvasOption = option.replace('canvas', '').toLowerCase();
if (canvas[canvasOption] === value) {
// Same value, no need to change and redraw
return;
}
canvas[canvasOption] = value - this.extraWidth;
this.clear();
}
else {
if (this.signaturePad[option] === value) {
// Same value, no need to change and redraw
return;
}
this.signaturePad[option] = value;
}
}
/**
* notify subscribers on signature begin
*/
beginStroke(event) {
this.drawStart.emit(event);
}
beforeUpdateStroke(event) {
this.drawBeforeUpdate.emit(event);
}
afterUpdateStroke(event) {
this.drawAfterUpdate.emit(event);
}
/**
* notify subscribers on signature end
*/
endStroke(event) {
this.drawEnd.emit(event);
}
initCanvas(options) {
const canvas = this.getCanvas();
if (this.options.canvasHeight) {
canvas.height = options.canvasHeight - 2;
}
if (this.options.canvasWidth) {
canvas.width = options.canvasWidth - 2;
}
if (this.options.canvasBackground) {
canvas.style.background = options.canvasBackground;
}
return canvas;
}
initSignaturePad(canvas, options) {
this.signaturePad = new SignaturePad(canvas, options);
this.signaturePad.addEventListener('beginStroke', (event) => this.beginStroke(event.detail));
this.signaturePad.addEventListener('beforeUpdateStroke', (event) => this.beforeUpdateStroke(event.detail));
this.signaturePad.addEventListener('afterUpdateStroke', (event) => this.afterUpdateStroke(event.detail));
this.signaturePad.addEventListener('endStroke', (event) => this.endStroke(event.detail));
}
/**
* To prevent the growing effect when the redrawCanvas is called for the width
* @param canvas
* @private
*/
_getWidthFix(canvas) {
const computedStyle = getComputedStyle(canvas);
const extraPadding = parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight);
const extraBorder = parseFloat(computedStyle.borderLeftWidth) + parseFloat(computedStyle.borderRightWidth);
this.extraWidth = extraPadding + extraBorder;
return canvas.offsetWidth - (extraPadding + extraBorder);
}
/**
* To prevent the growing effect when the redrawCanvas is called for the height
* @param canvas
* @private
*/
_getHeightFix(canvas) {
const computedStyle = getComputedStyle(canvas);
const extraPadding = parseFloat(computedStyle.paddingTop) + parseFloat(computedStyle.paddingBottom);
const extraBorder = parseFloat(computedStyle.borderTopWidth) + parseFloat(computedStyle.borderBottomWidth);
return canvas.offsetHeight - (extraPadding + extraBorder);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: SignaturePadComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.10", type: SignaturePadComponent, selector: "signature-pad", inputs: { options: "options" }, outputs: { drawStart: "drawStart", drawBeforeUpdate: "drawBeforeUpdate", drawAfterUpdate: "drawAfterUpdate", drawEnd: "drawEnd" }, ngImport: i0, template: '<canvas class="signature-pad-canvas"></canvas>', isInline: true, styles: [":host{background:#faebd7;display:flex;align-items:center;justify-content:center}:host .signature-pad-canvas{border:1px solid gray}\n"] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: SignaturePadComponent, decorators: [{
type: Component,
args: [{ template: '<canvas class="signature-pad-canvas"></canvas>', selector: 'signature-pad', styles: [":host{background:#faebd7;display:flex;align-items:center;justify-content:center}:host .signature-pad-canvas{border:1px solid gray}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { options: [{
type: Input
}], drawStart: [{
type: Output
}], drawBeforeUpdate: [{
type: Output
}], drawAfterUpdate: [{
type: Output
}], drawEnd: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1zaWduYXR1cmUtcGFkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItc2lnbmF0dXJlLXBhZC9zcmMvbGliL2FuZ3VsYXItc2lnbmF0dXJlLXBhZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFtQixTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUcsT0FBTyxZQUFtQyxNQUFNLGVBQWUsQ0FBQzs7QUFhaEUsTUFBTSxPQUFPLHFCQUFxQjtJQVdoQyxZQUFvQixXQUF1QjtRQUF2QixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN6QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksRUFBMkIsQ0FBQztRQUMzRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBQ3hELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQUMvRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBQzlELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7SUFDeEQsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixNQUFNLE1BQU0sR0FBc0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxXQUFXO1FBQ2hCLE1BQU0sTUFBTSxHQUFzQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkQsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7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WUFBWSxDQUFDLENBQUM7UUFDcEcsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDM0csSUFBSSxDQUFDLFVBQVUsR0FBRyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQzdDLE9BQU8sTUFBTSxDQUFDLFdBQVcsR0FBRyxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGFBQWEsQ0FBQyxNQUF5QjtRQUM3QyxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUvQyxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEcsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFM0csT0FBTyxNQUFNLENBQUMsWUFBWSxHQUFHLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxDQUFDO0lBQzVELENBQUM7K0dBaFBVLHFCQUFxQjttR0FBckIscUJBQXFCLHdOQUp0QixnREFBZ0Q7OzRGQUkvQyxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UsZ0RBQWdELFlBQ2hELGVBQWU7K0VBSVQsT0FBTztzQkFBdEIsS0FBSztnQkFFVyxTQUFTO3NCQUF6QixNQUFNO2dCQUNVLGdCQUFnQjtzQkFBaEMsTUFBTTtnQkFDVSxlQUFlO3NCQUEvQixNQUFNO2dCQUNVLE9BQU87c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FmdGVyQ29udGVudEluaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IFNpZ25hdHVyZVBhZCwge09wdGlvbnMsIFBvaW50R3JvdXB9IGZyb20gJ3NpZ25hdHVyZV9wYWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5nU2lnbmF0dXJlUGFkT3B0aW9ucyBleHRlbmRzIE9wdGlvbnMge1xuICBjYW52YXNCYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBjYW52YXNIZWlnaHQ/OiBudW1iZXI7XG4gIGNhbnZhc1dpZHRoPzogbnVtYmVyO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGU6ICc8Y2FudmFzIGNsYXNzPVwic2lnbmF0dXJlLXBhZC1jYW52YXNcIj48L2NhbnZhcz4nLFxuICBzZWxlY3RvcjogJ3NpZ25hdHVyZS1wYWQnLFxuICBzdHlsZVVybHM6IFsnLi9hbmd1bGFyLXNpZ25hdHVyZS1wYWQuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgU2lnbmF0dXJlUGFkQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgcHVibGljIG9wdGlvbnM6IE5nU2lnbmF0dXJlUGFkT3B0aW9ucztcblxuICBAT3V0cHV0KCkgcHVibGljIGRyYXdTdGFydDogRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQgfCBUb3VjaD47XG4gIEBPdXRwdXQoKSBwdWJsaWMgZHJhd0JlZm9yZVVwZGF0ZTogRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQgfCBUb3VjaD47XG4gIEBPdXRwdXQoKSBwdWJsaWMgZHJhd0FmdGVyVXBkYXRlOiBFdmVudEVtaXR0ZXI8TW91c2VFdmVudCB8IFRvdWNoPjtcbiAgQE91dHB1dCgpIHB1YmxpYyBkcmF3RW5kOiBFdmVudEVtaXR0ZXI8TW91c2VFdmVudCB8IFRvdWNoPjtcblxuICBwcml2YXRlIHNpZ25hdHVyZVBhZDogU2lnbmF0dXJlUGFkO1xuICBwcml2YXRlIGV4dHJhV2lkdGg6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zIHx8IHt9IGFzIE5nU2lnbmF0dXJlUGFkT3B0aW9ucztcbiAgICB0aGlzLmRyYXdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudCB8IFRvdWNoPigpO1xuICAgIHRoaXMuZHJhd0JlZm9yZVVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudCB8IFRvdWNoPigpO1xuICAgIHRoaXMuZHJhd0FmdGVyVXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50IHwgVG91Y2g+KCk7XG4gICAgdGhpcy5kcmF3RW5kID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50IHwgVG91Y2g+KCk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSB0aGlzLmluaXRDYW52YXModGhpcy5vcHRpb25zKTtcbiAgICB0aGlzLmluaXRTaWduYXR1cmVQYWQoY2FudmFzLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMucmVkcmF3Q2FudmFzKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IHRoaXMuZ2V0Q2FudmFzKCk7XG4gICAgY2FudmFzLndpZHRoID0gMDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gMDtcbiAgfVxuXG4gIC8vIG5vaW5zcGVjdGlvbiBKU1VudXNlZEdsb2JhbFN5bWJvbHNcbiAgcHVibGljIGdldFNpZ25hdHVyZVBhZCgpOiBTaWduYXR1cmVQYWQge1xuICAgIHJldHVybiB0aGlzLnNpZ25hdHVyZVBhZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDYW52YXMoKTogSFRNTENhbnZhc0VsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignY2FudmFzJyk7XG4gIH1cblxuICAvLyBub2luc3BlY3Rpb24gSlNVbnVzZWRHbG9iYWxTeW1ib2xzXG4gIC8qKlxuICAgKiBSZWRyYXcgb3IgUmVzaXplIGNhbnZhcywgbm90ZSB0aGlzIHdpbGwgY2xlYXIgZGF0YS5cbiAgICovXG4gIHB1YmxpYyByZWRyYXdDYW52YXMoKTogdm9pZCB7XG4gICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IHRoaXMuZ2V0Q2FudmFzKCk7XG4gICAgLy8gd2hlbiB6b29tZWQgb3V0IHRvIGxlc3MgdGhhbiAxMDAlLCBmb3Igc29tZSB2ZXJ5IHN0cmFuZ2UgcmVhc29uLFxuICAgIC8vIHNvbWUgYnJvd3NlcnMgcmVwb3J0IGRldmljZVBpeGVsUmF0aW8gYXMgbGVzcyB0aGFuIDEsIGFuZCBvbmx5IHBhcnQgb2YgdGhlIGNhbnZhcyBpcyBjbGVhcmVkIHRoZW4uXG4gICAgY29uc3QgcmF0aW86IG51bWJlciA9IE1hdGgubWF4KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEsIDEpO1xuICAgIGNhbnZhcy53aWR0aCA9IHRoaXMuX2dldFdpZHRoRml4KGNhbnZhcykgKiByYXRpbztcbiAgICBjYW52YXMuaGVpZ2h0ID0gdGhpcy5fZ2V0SGVpZ2h0Rml4KGNhbnZhcykgKiByYXRpbztcbiAgICBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKS5zY2FsZShyYXRpbywgcmF0aW8pO1xuICAgIHRoaXMuY2hhbmdlQmFja2dyb3VuZENvbG9yKHRoaXMuc2lnbmF0dXJlUGFkLmJhY2tncm91bmRDb2xvcik7XG4gIH1cblxuICAvLyBub2luc3BlY3Rpb24gSlNVbnVzZWRHbG9iYWxTeW1ib2xzXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIGNvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kIGR5bmFtaWNhbGx5LlxuICAgKi9cbiAgcHVibGljIGNoYW5nZUJhY2tncm91bmRDb2xvcihjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zaWduYXR1cmVQYWQuYmFja2dyb3VuZENvbG9yID0gY29sb3I7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuc2lnbmF0dXJlUGFkLnRvRGF0YSgpO1xuICAgIHRoaXMuc2lnbmF0dXJlUGFkLmNsZWFyKCk7XG4gICAgdGhpcy5zaWduYXR1cmVQYWQuZnJvbURhdGEoZGF0YSk7XG4gIH1cblxuICAvLyBub2luc3BlY3Rpb24gSlNVbnVzZWRHbG9iYWxTeW1ib2xzXG4gIC8qKlxuICAgKiBSZXR1cm5zIHNpZ25hdHVyZSBpbWFnZSBhcyBhbiBhcnJheSBvZiBwb2ludCBncm91cHNcbiAgICovXG4gIHB1YmxpYyB0b0RhdGEoKTogUG9pbnRHcm91cFtdIHtcbiAgICBpZiAodGhpcy5zaWduYXR1cmVQYWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpZ25hdHVyZVBhZC50b0RhdGEoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8vIG5vaW5zcGVjdGlvbiBKU1VudXNlZEdsb2JhbFN5bWJvbHNcbiAgLyoqXG4gICAqIERyYXdzIHNpZ25hdHVyZSBpbWFnZSBmcm9tIGFuIGFycmF5IG9mIHBvaW50IGdyb3Vwc1xuICAgKi9cbiAgcHVibGljIGZyb21EYXRhKHBvaW50czogQXJyYXk8UG9pbnRHcm91cD4pOiB2b2lkIHtcbiAgICB0aGlzLnNpZ25hdHVyZVBhZC5mcm9tRGF0YShwb2ludHMpO1xuICB9XG5cbiAgLy8gbm9pbnNwZWN0aW9uIEpTVW51c2VkR2xvYmFsU3ltYm9sc1xuICAvKipcbiAgICogUmV0dXJucyBzaWduYXR1cmUgaW1hZ2UgYXMgZGF0YSBVUkwgKHNlZSBodHRwczovL21kbi5pby90b2RhdGF1cmwgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIHBhcmFtZXRlcnMpXG4gICAqL1xuICBwdWJsaWMgdG9EYXRhVVJMKGltYWdlVHlwZT86IHN0cmluZywgcXVhbGl0eT86IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmF0dXJlUGFkLnRvRGF0YVVSTChpbWFnZVR5cGUsIHF1YWxpdHkpOyAvLyBzYXZlIGltYWdlIGFzIGRhdGEgVVJMXG4gIH1cblxuICAvLyBub2luc3BlY3Rpb24gSlNVbnVzZWRHbG9iYWxTeW1ib2xzXG4gIC8qKlxuICAgKiBEcmF3cyBzaWduYXR1cmUgaW1hZ2UgZnJvbSBkYXRhIFVSTFxuICAgKi9cbiAgcHVibGljIGZyb21EYXRhVVJMKGRhdGFVUkw6IHN0cmluZywgb3B0aW9uczogeyByYXRpbz86IG51bWJlcjsgd2lkdGg/OiBudW1iZXI7IGhlaWdodD86IG51bWJlciB9ID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBzZXQgZGVmYXVsdCBoZWlnaHQgYW5kIHdpZHRoIG9uIHJlYWQgZGF0YSBmcm9tIFVSTFxuICAgIGlmICghb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgnaGVpZ2h0JykgJiYgdGhpcy5vcHRpb25zLmNhbnZhc0hlaWdodCkge1xuICAgICAgb3B0aW9ucy5oZWlnaHQgPSB0aGlzLm9wdGlvbnMuY2FudmFzSGVpZ2h0O1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuaGFzT3duUHJvcGVydHkoJ3dpZHRoJykgJiYgdGhpcy5vcHRpb25zLmNhbnZhc1dpZHRoKSB7XG4gICAgICBvcHRpb25zLndpZHRoID0gdGhpcy5vcHRpb25zLmNhbnZhc1dpZHRoO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaWduYXR1cmVQYWQuZnJvbURhdGFVUkwoZGF0YVVSTCwgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBub2luc3BlY3Rpb24gSlNVbnVzZWRHbG9iYWxTeW1ib2xzXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGNhbnZhc1xuICAgKi9cbiAgcHVibGljIGNsZWFyKHJlZHJhdzogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAocmVkcmF3KSB7XG4gICAgICB0aGlzLnNpZ25hdHVyZVBhZC5jbGVhcigpO1xuICAgICAgdGhpcy5yZWRyYXdDYW52YXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaWduYXR1cmVQYWQuY2xlYXIoKTtcbiAgICB9XG4gICAgdGhpcy5lbmRTdHJva2UobnVsbCk7XG4gIH1cblxuICAvLyBub2luc3BlY3Rpb24gSlNVbnVzZWRHbG9iYWxTeW1ib2xzXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgY2FudmFzIGlzIGVtcHR5LCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZVxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmF0dXJlUGFkLmlzRW1wdHkoKTtcbiAgfVxuXG4gIC8vIG5vaW5zcGVjdGlvbiBKU1VudXNlZEdsb2JhbFN5bWJvbHNcbiAgLyoqXG4gICAqIFVuYmluZHMgYWxsIGV2ZW50IGhhbmRsZXJzXG4gICAqL1xuICBwdWJsaWMgb2ZmKCk6IHZvaWQge1xuICAgIHRoaXMuc2lnbmF0dXJlUGFkLm9mZigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYmluZHMgYWxsIGV2ZW50IGhhbmRsZXJzXG4gICAqL1xuICBwdWJsaWMgb24oKTogdm9pZCB7XG4gICAgdGhpcy5zaWduYXR1cmVQYWQub24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgYW4gb3B0aW9uIG9uIHRoZSBzaWduYXR1cmVQYWQgLSBlLmcuIHNldCgnbWluV2lkdGgnLCA1MCk7XG4gICAqIEBwYXJhbSBvcHRpb24gb25lIG9mIFNpZ25hdHVyZVBhZCB0byBzZXQgd2l0aCB2YWx1ZSwgcHJvcGVydGllcyBvZiBOZ1NpZ25hdHVyZVBhZE9wdGlvbnNcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiBvcHRpb25cbiAgICovXG4gIHB1YmxpYyBzZXQob3B0aW9uOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAob3B0aW9uID09PSAnY2FudmFzSGVpZ2h0JyB8fCBvcHRpb24gPT09ICdjYW52YXNXaWR0aCcpIHtcbiAgICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgPSB0aGlzLmdldENhbnZhcygpO1xuICAgICAgY29uc3QgY2FudmFzT3B0aW9uID0gb3B0aW9uLnJlcGxhY2UoJ2NhbnZhcycsICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGNhbnZhc1tjYW52YXNPcHRpb25dID09PSB2YWx1ZSkge1xuICAgICAgICAvLyBTYW1lIHZhbHVlLCBubyBuZWVkIHRvIGNoYW5nZSBhbmQgcmVkcmF3XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhbnZhc1tjYW52YXNPcHRpb25dID0gdmFsdWUgLSB0aGlzLmV4dHJhV2lkdGg7XG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnNpZ25hdHVyZVBhZFtvcHRpb25dID09PSB2YWx1ZSkge1xuICAgICAgICAvLyBTYW1lIHZhbHVlLCBubyBuZWVkIHRvIGNoYW5nZSBhbmQgcmVkcmF3XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2lnbmF0dXJlUGFkW29wdGlvbl0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogbm90aWZ5IHN1YnNjcmliZXJzIG9uIHNpZ25hdHVyZSBiZWdpblxuICAgKi9cbiAgcHVibGljIGJlZ2luU3Ryb2tlKGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2gpOiB2b2lkIHtcbiAgICB0aGlzLmRyYXdTdGFydC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBiZWZvcmVVcGRhdGVTdHJva2UoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaCk6IHZvaWQge1xuICAgIHRoaXMuZHJhd0JlZm9yZVVwZGF0ZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBhZnRlclVwZGF0ZVN0cm9rZShldmVudDogTW91c2VFdmVudCB8IFRvdWNoKTogdm9pZCB7XG4gICAgdGhpcy5kcmF3QWZ0ZXJVcGRhdGUuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogbm90aWZ5IHN1YnNjcmliZXJzIG9uIHNpZ25hdHVyZSBlbmRcbiAgICovXG4gIHB1YmxpYyBlbmRTdHJva2UoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaCk6IHZvaWQge1xuICAgIHRoaXMuZHJhd0VuZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdENhbnZhcyhvcHRpb25zOiBOZ1NpZ25hdHVyZVBhZE9wdGlvbnMpOiBIVE1MQ2FudmFzRWxlbWVudCB7XG4gICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IHRoaXMuZ2V0Q2FudmFzKCk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5jYW52YXNIZWlnaHQpIHtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBvcHRpb25zLmNhbnZhc0hlaWdodCAtIDI7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2FudmFzV2lkdGgpIHtcbiAgICAgIGNhbnZhcy53aWR0aCA9IG9wdGlvbnMuY2FudmFzV2lkdGggLSAyO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcHRpb25zLmNhbnZhc0JhY2tncm91bmQpIHtcbiAgICAgIGNhbnZhcy5zdHlsZS5iYWNrZ3JvdW5kID0gb3B0aW9ucy5jYW52YXNCYWNrZ3JvdW5kO1xuICAgIH1cbiAgICByZXR1cm4gY2FudmFzO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0U2lnbmF0dXJlUGFkKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQsIG9wdGlvbnM/OiBPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5zaWduYXR1cmVQYWQgPSBuZXcgU2lnbmF0dXJlUGFkKGNhbnZhcywgb3B0aW9ucyk7XG4gICAgdGhpcy5zaWduYXR1cmVQYWQuYWRkRXZlbnRMaXN0ZW5lcignYmVnaW5TdHJva2UnLCAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB0aGlzLmJlZ2luU3Ryb2tlKGV2ZW50LmRldGFpbCkpO1xuICAgIHRoaXMuc2lnbmF0dXJlUGFkLmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZVVwZGF0ZVN0cm9rZScsIChldmVudDogQ3VzdG9tRXZlbnQpID0+IHRoaXMuYmVmb3JlVXBkYXRlU3Ryb2tlKGV2ZW50LmRldGFpbCkpO1xuICAgIHRoaXMuc2lnbmF0dXJlUGFkLmFkZEV2ZW50TGlzdGVuZXIoJ2FmdGVyVXBkYXRlU3Ryb2tlJywgKGV2ZW50OiBDdXN0b21FdmVudCkgPT4gdGhpcy5hZnRlclVwZGF0ZVN0cm9rZShldmVudC5kZXRhaWwpKTtcbiAgICB0aGlzLnNpZ25hdHVyZVBhZC5hZGRFdmVudExpc3RlbmVyKCdlbmRTdHJva2UnLCAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB0aGlzLmVuZFN0cm9rZShldmVudC5kZXRhaWwpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBwcmV2ZW50IHRoZSBncm93aW5nIGVmZmVjdCB3aGVuIHRoZSByZWRyYXdDYW52YXMgaXMgY2FsbGVkIGZvciB0aGUgd2lkdGhcbiAgICogQHBhcmFtIGNhbnZhc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0V2lkdGhGaXgoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCkge1xuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGNhbnZhcyk7XG5cbiAgICBjb25zdCBleHRyYVBhZGRpbmcgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUucGFkZGluZ0xlZnQpICsgcGFyc2VGbG9hdChjb21wdXRlZFN0eWxlLnBhZGRpbmdSaWdodCk7XG4gICAgY29uc3QgZXh0cmFCb3JkZXIgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoKSArIHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5ib3JkZXJSaWdodFdpZHRoKTtcbiAgICB0aGlzLmV4dHJhV2lkdGggPSBleHRyYVBhZGRpbmcgKyBleHRyYUJvcmRlcjtcbiAgICByZXR1cm4gY2FudmFzLm9mZnNldFdpZHRoIC0gKGV4dHJhUGFkZGluZyArIGV4dHJhQm9yZGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBwcmV2ZW50IHRoZSBncm93aW5nIGVmZmVjdCB3aGVuIHRoZSByZWRyYXdDYW52YXMgaXMgY2FsbGVkIGZvciB0aGUgaGVpZ2h0XG4gICAqIEBwYXJhbSBjYW52YXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2dldEhlaWdodEZpeChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KSB7XG4gICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoY2FudmFzKTtcblxuICAgIGNvbnN0IGV4dHJhUGFkZGluZyA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nVG9wKSArIHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nQm90dG9tKTtcbiAgICBjb25zdCBleHRyYUJvcmRlciA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCkgKyBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUuYm9yZGVyQm90dG9tV2lkdGgpO1xuXG4gICAgcmV0dXJuIGNhbnZhcy5vZmZzZXRIZWlnaHQgLSAoZXh0cmFQYWRkaW5nICsgZXh0cmFCb3JkZXIpO1xuICB9XG59XG4iXX0=