@asoftwareworld/form-builder-pro
Version:
ASW Form Builder Pro helps you with rapid development and designed web forms which includes several controls. The key feature of Form Builder is to make your content attractive and effective. We can customize our control at run time and preview the same b
152 lines • 27.8 kB
JavaScript
/**
* @license
* Copyright ASW (A Software World) All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file
*/
import { Injectable } from '@angular/core';
import { percentage, resizeCanvas } from '@asoftwareworld/form-builder-pro/utils';
import * as i0 from "@angular/core";
export class CropService {
crop(loadedImage, cropper, settings, output, maxSize) {
const imagePosition = this.getImagePosition(loadedImage, cropper, settings, maxSize);
const width = imagePosition.x2 - imagePosition.x1;
const height = imagePosition.y2 - imagePosition.y1;
const cropCanvas = document.createElement('canvas');
cropCanvas.width = width;
cropCanvas.height = height;
const ctx = cropCanvas.getContext('2d');
if (!ctx) {
return null;
}
if (settings.backgroundColor != null) {
ctx.fillStyle = settings.backgroundColor;
ctx.fillRect(0, 0, width, height);
}
const scaleX = (settings.transform.scale || 1) * (settings.transform.flipH ? -1 : 1);
const scaleY = (settings.transform.scale || 1) * (settings.transform.flipV ? -1 : 1);
const { translateH, translateV } = this.getCanvasTranslate(loadedImage, settings, maxSize);
const transformedImage = loadedImage.transformed;
ctx.setTransform(scaleX, 0, 0, scaleY, transformedImage.size.width / 2 + translateH, transformedImage.size.height / 2 + translateV);
ctx.translate(-imagePosition.x1 / scaleX, -imagePosition.y1 / scaleY);
ctx.rotate(((settings.transform.rotate || 0) * Math.PI) / 180);
ctx.drawImage(transformedImage.image, -transformedImage.size.width / 2, -transformedImage.size.height / 2);
const result = {
width,
height,
imagePosition,
cropperPosition: { ...cropper }
};
if (settings.containWithinAspectRatio) {
result.offsetImagePosition = this.getOffsetImagePosition(loadedImage, cropper, settings, maxSize);
}
const resizeRatio = this.getResizeRatio(width, height, settings);
if (resizeRatio !== 1) {
result.width = Math.round(width * resizeRatio);
result.height = settings.maintainAspectRatio ? Math.round(result.width / settings.aspectRatio) : Math.round(height * resizeRatio);
resizeCanvas(cropCanvas, result.width, result.height);
}
if (output === 'blob') {
return this.cropToBlob(result, cropCanvas, settings);
}
else {
result.base64 = cropCanvas.toDataURL('image/' + settings.format, this.getQuality(settings));
return result;
}
}
async cropToBlob(output, cropCanvas, settings) {
output.blob = await new Promise((resolve) => cropCanvas.toBlob(resolve, 'image/' + settings.format, this.getQuality(settings)));
if (output.blob) {
output.objectUrl = URL.createObjectURL(output.blob);
}
return output;
}
getCanvasTranslate(loadedImage, settings, maxSize) {
if (settings.transform.translateUnit === 'px') {
const ratio = this.getRatio(loadedImage, maxSize);
return {
translateH: (settings.transform.translateH || 0) * ratio,
translateV: (settings.transform.translateV || 0) * ratio
};
}
else {
return {
translateH: settings.transform.translateH ? percentage(settings.transform.translateH, loadedImage.transformed.size.width) : 0,
translateV: settings.transform.translateV ? percentage(settings.transform.translateV, loadedImage.transformed.size.height) : 0
};
}
}
getRatio(loadedImage, maxSize) {
return loadedImage.transformed.size.width / maxSize.width;
}
getImagePosition(loadedImage, cropper, settings, maxSize) {
const ratio = this.getRatio(loadedImage, maxSize);
const out = {
x1: Math.round(cropper.x1 * ratio),
y1: Math.round(cropper.y1 * ratio),
x2: Math.round(cropper.x2 * ratio),
y2: Math.round(cropper.y2 * ratio)
};
if (!settings.containWithinAspectRatio) {
out.x1 = Math.max(out.x1, 0);
out.y1 = Math.max(out.y1, 0);
out.x2 = Math.min(out.x2, loadedImage.transformed.size.width);
out.y2 = Math.min(out.y2, loadedImage.transformed.size.height);
}
return out;
}
getOffsetImagePosition(loadedImage, cropper, settings, maxSize) {
const canvasRotation = settings.canvasRotation + loadedImage.exifTransform.rotate;
const ratio = this.getRatio(loadedImage, maxSize);
let offsetX;
let offsetY;
if (canvasRotation % 2) {
offsetX = (loadedImage.transformed.size.width - loadedImage.original.size.height) / 2;
offsetY = (loadedImage.transformed.size.height - loadedImage.original.size.width) / 2;
}
else {
offsetX = (loadedImage.transformed.size.width - loadedImage.original.size.width) / 2;
offsetY = (loadedImage.transformed.size.height - loadedImage.original.size.height) / 2;
}
const out = {
x1: Math.round(cropper.x1 * ratio) - offsetX,
y1: Math.round(cropper.y1 * ratio) - offsetY,
x2: Math.round(cropper.x2 * ratio) - offsetX,
y2: Math.round(cropper.y2 * ratio) - offsetY
};
if (!settings.containWithinAspectRatio) {
out.x1 = Math.max(out.x1, 0);
out.y1 = Math.max(out.y1, 0);
out.x2 = Math.min(out.x2, loadedImage.transformed.size.width);
out.y2 = Math.min(out.y2, loadedImage.transformed.size.height);
}
return out;
}
getResizeRatio(width, height, settings) {
const ratioWidth = settings.resizeToWidth / width;
const ratioHeight = settings.resizeToHeight / height;
const ratios = new Array();
if (settings.resizeToWidth > 0) {
ratios.push(ratioWidth);
}
if (settings.resizeToHeight > 0) {
ratios.push(ratioHeight);
}
const result = ratios.length === 0 ? 1 : Math.min(...ratios);
if (result > 1 && !settings.onlyScaleDown) {
return result;
}
return Math.min(result, 1);
}
getQuality(settings) {
return Math.min(1, Math.max(0, settings.imageQuality / 100));
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CropService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CropService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CropService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvaW1hZ2UtY3JvcC9zZXJ2aWNlcy9jcm9wLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLHdDQUF3QyxDQUFDOztBQUdsRixNQUFNLE9BQU8sV0FBVztJQUdwQixJQUFJLENBQUMsV0FBd0IsRUFBRSxPQUF3QixFQUFFLFFBQXlCLEVBQUUsTUFBa0IsRUFBRSxPQUFtQjtRQUN2SCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckYsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBc0IsQ0FBQztRQUN6RSxVQUFVLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN6QixVQUFVLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUUzQixNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNQLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxJQUFJLFFBQVEsQ0FBQyxlQUFlLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbkMsR0FBRyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDO1lB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QUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsVUFBVSxDQUFDLFFBQXlCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7dUdBekpRLFdBQVc7MkdBQVgsV0FBVyxjQURFLE1BQU07OzJGQUNuQixXQUFXO2tCQUR2QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBU1cgKEEgU29mdHdhcmUgV29ybGQpIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGVcbiAqL1xuXG5pbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDcm9wcGVyUG9zaXRpb24sIERpbWVuc2lvbnMsIENyb3BwZXJTZXR0aW5ncywgSW1hZ2VDcm9wcGVkRXZlbnQsIExvYWRlZEltYWdlLCBPdXRwdXRUeXBlIH0gZnJvbSAnQGFzb2Z0d2FyZXdvcmxkL2Zvcm0tYnVpbGRlci1wcm8vYXBpJztcbmltcG9ydCB7IHBlcmNlbnRhZ2UsIHJlc2l6ZUNhbnZhcyB9IGZyb20gJ0Bhc29mdHdhcmV3b3JsZC9mb3JtLWJ1aWxkZXItcHJvL3V0aWxzJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBDcm9wU2VydmljZSB7XG4gICAgY3JvcChsb2FkZWRJbWFnZTogTG9hZGVkSW1hZ2UsIGNyb3BwZXI6IENyb3BwZXJQb3NpdGlvbiwgc2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncywgb3V0cHV0OiAnYmxvYicsIG1heFNpemU6IERpbWVuc2lvbnMpOiBQcm9taXNlPEltYWdlQ3JvcHBlZEV2ZW50PiB8IG51bGw7XG4gICAgY3JvcChsb2FkZWRJbWFnZTogTG9hZGVkSW1hZ2UsIGNyb3BwZXI6IENyb3BwZXJQb3NpdGlvbiwgc2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncywgb3V0cHV0OiAnYmFzZTY0JywgbWF4U2l6ZTogRGltZW5zaW9ucyk6IEltYWdlQ3JvcHBlZEV2ZW50IHwgbnVsbDtcbiAgICBjcm9wKGxvYWRlZEltYWdlOiBMb2FkZWRJbWFnZSwgY3JvcHBlcjogQ3JvcHBlclBvc2l0aW9uLCBzZXR0aW5nczogQ3JvcHBlclNldHRpbmdzLCBvdXRwdXQ6IE91dHB1dFR5cGUsIG1heFNpemU6IERpbWVuc2lvbnMpOiBQcm9taXNlPEltYWdlQ3JvcHBlZEV2ZW50PiB8IEltYWdlQ3JvcHBlZEV2ZW50IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGltYWdlUG9zaXRpb24gPSB0aGlzLmdldEltYWdlUG9zaXRpb24obG9hZGVkSW1hZ2UsIGNyb3BwZXIsIHNldHRpbmdzLCBtYXhTaXplKTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBpbWFnZVBvc2l0aW9uLngyIC0gaW1hZ2VQb3NpdGlvbi54MTtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gaW1hZ2VQb3NpdGlvbi55MiAtIGltYWdlUG9zaXRpb24ueTE7XG4gICAgICAgIGNvbnN0IGNyb3BDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKSBhcyBIVE1MQ2FudmFzRWxlbWVudDtcbiAgICAgICAgY3JvcENhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICBjcm9wQ2FudmFzLmhlaWdodCA9IGhlaWdodDtcblxuICAgICAgICBjb25zdCBjdHggPSBjcm9wQ2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGlmICghY3R4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2V0dGluZ3MuYmFja2dyb3VuZENvbG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBzZXR0aW5ncy5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgICAgICBjdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzY2FsZVggPSAoc2V0dGluZ3MudHJhbnNmb3JtLnNjYWxlIHx8IDEpICogKHNldHRpbmdzLnRyYW5zZm9ybS5mbGlwSCA/IC0xIDogMSk7XG4gICAgICAgIGNvbnN0IHNjYWxlWSA9IChzZXR0aW5ncy50cmFuc2Zvcm0uc2NhbGUgfHwgMSkgKiAoc2V0dGluZ3MudHJhbnNmb3JtLmZsaXBWID8gLTEgOiAxKTtcbiAgICAgICAgY29uc3QgeyB0cmFuc2xhdGVILCB0cmFuc2xhdGVWIH0gPSB0aGlzLmdldENhbnZhc1RyYW5zbGF0ZShsb2FkZWRJbWFnZSwgc2V0dGluZ3MsIG1heFNpemUpO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkSW1hZ2UgPSBsb2FkZWRJbWFnZS50cmFuc2Zvcm1lZDtcbiAgICAgICAgY3R4LnNldFRyYW5zZm9ybShzY2FsZVgsIDAsIDAsIHNjYWxlWSwgdHJhbnNmb3JtZWRJbWFnZS5zaXplLndpZHRoIC8gMiArIHRyYW5zbGF0ZUgsIHRyYW5zZm9ybWVkSW1hZ2Uuc2l6ZS5oZWlnaHQgLyAyICsgdHJhbnNsYXRlVik7XG4gICAgICAgIGN0eC50cmFuc2xhdGUoLWltYWdlUG9zaXRpb24ueDEgLyBzY2FsZVgsIC1pbWFnZVBvc2l0aW9uLnkxIC8gc2NhbGVZKTtcbiAgICAgICAgY3R4LnJvdGF0ZSgoKHNldHRpbmdzLnRyYW5zZm9ybS5yb3RhdGUgfHwgMCkgKiBNYXRoLlBJKSAvIDE4MCk7XG5cbiAgICAgICAgY3R4LmRyYXdJbWFnZSh0cmFuc2Zvcm1lZEltYWdlLmltYWdlLCAtdHJhbnNmb3JtZWRJbWFnZS5zaXplLndpZHRoIC8gMiwgLXRyYW5zZm9ybWVkSW1hZ2Uuc2l6ZS5oZWlnaHQgLyAyKTtcblxuICAgICAgICBjb25zdCByZXN1bHQ6IEltYWdlQ3JvcHBlZEV2ZW50ID0ge1xuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICBpbWFnZVBvc2l0aW9uLFxuICAgICAgICAgICAgY3JvcHBlclBvc2l0aW9uOiB7IC4uLmNyb3BwZXIgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc2V0dGluZ3MuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICByZXN1bHQub2Zmc2V0SW1hZ2VQb3NpdGlvbiA9IHRoaXMuZ2V0T2Zmc2V0SW1hZ2VQb3NpdGlvbihsb2FkZWRJbWFnZSwgY3JvcHBlciwgc2V0dGluZ3MsIG1heFNpemUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc2l6ZVJhdGlvID0gdGhpcy5nZXRSZXNpemVSYXRpbyh3aWR0aCwgaGVpZ2h0LCBzZXR0aW5ncyk7XG4gICAgICAgIGlmIChyZXNpemVSYXRpbyAhPT0gMSkge1xuICAgICAgICAgICAgcmVzdWx0LndpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCAqIHJlc2l6ZVJhdGlvKTtcbiAgICAgICAgICAgIHJlc3VsdC5oZWlnaHQgPSBzZXR0aW5ncy5tYWludGFpbkFzcGVjdFJhdGlvID8gTWF0aC5yb3VuZChyZXN1bHQud2lkdGggLyBzZXR0aW5ncy5hc3BlY3RSYXRpbykgOiBNYXRoLnJvdW5kKGhlaWdodCAqIHJlc2l6ZVJhdGlvKTtcbiAgICAgICAgICAgIHJlc2l6ZUNhbnZhcyhjcm9wQ2FudmFzLCByZXN1bHQud2lkdGgsIHJlc3VsdC5oZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdXRwdXQgPT09ICdibG9iJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JvcFRvQmxvYihyZXN1bHQsIGNyb3BDYW52YXMsIHNldHRpbmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5iYXNlNjQgPSBjcm9wQ2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvJyArIHNldHRpbmdzLmZvcm1hdCwgdGhpcy5nZXRRdWFsaXR5KHNldHRpbmdzKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBjcm9wVG9CbG9iKG91dHB1dDogSW1hZ2VDcm9wcGVkRXZlbnQsIGNyb3BDYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LCBzZXR0aW5nczogQ3JvcHBlclNldHRpbmdzKTogUHJvbWlzZTxJbWFnZUNyb3BwZWRFdmVudD4ge1xuICAgICAgICBvdXRwdXQuYmxvYiA9IGF3YWl0IG5ldyBQcm9taXNlPEJsb2IgfCBudWxsPigocmVzb2x2ZSkgPT4gY3JvcENhbnZhcy50b0Jsb2IocmVzb2x2ZSwgJ2ltYWdlLycgKyBzZXR0aW5ncy5mb3JtYXQsIHRoaXMuZ2V0UXVhbGl0eShzZXR0aW5ncykpKTtcbiAgICAgICAgaWYgKG91dHB1dC5ibG9iKSB7XG4gICAgICAgICAgICBvdXRwdXQub2JqZWN0VXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChvdXRwdXQuYmxvYik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENhbnZhc1RyYW5zbGF0ZShsb2FkZWRJbWFnZTogTG9hZGVkSW1hZ2UsIHNldHRpbmdzOiBDcm9wcGVyU2V0dGluZ3MsIG1heFNpemU6IERpbWVuc2lvbnMpOiB7IHRyYW5zbGF0ZUg6IG51bWJlcjsgdHJhbnNsYXRlVjogbnVtYmVyIH0ge1xuICAgICAgICBpZiAoc2V0dGluZ3MudHJhbnNmb3JtLnRyYW5zbGF0ZVVuaXQgPT09ICdweCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHJhdGlvID0gdGhpcy5nZXRSYXRpbyhsb2FkZWRJbWFnZSwgbWF4U2l6ZSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUg6IChzZXR0aW5ncy50cmFuc2Zvcm0udHJhbnNsYXRlSCB8fCAwKSAqIHJhdGlvLFxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVY6IChzZXR0aW5ncy50cmFuc2Zvcm0udHJhbnNsYXRlViB8fCAwKSAqIHJhdGlvXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVIOiBzZXR0aW5ncy50cmFuc2Zvcm0udHJhbnNsYXRlSCA/IHBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJhbnNmb3JtLnRyYW5zbGF0ZUgsIGxvYWRlZEltYWdlLnRyYW5zZm9ybWVkLnNpemUud2lkdGgpIDogMCxcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVWOiBzZXR0aW5ncy50cmFuc2Zvcm0udHJhbnNsYXRlViA/IHBlcmNlbnRhZ2Uoc2V0dGluZ3MudHJhbnNmb3JtLnRyYW5zbGF0ZVYsIGxvYWRlZEltYWdlLnRyYW5zZm9ybWVkLnNpemUuaGVpZ2h0KSA6IDBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJhdGlvKGxvYWRlZEltYWdlOiBMb2FkZWRJbWFnZSwgbWF4U2l6ZTogRGltZW5zaW9ucyk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBsb2FkZWRJbWFnZS50cmFuc2Zvcm1lZC5zaXplLndpZHRoIC8gbWF4U2l6ZS53aWR0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEltYWdlUG9zaXRpb24obG9hZGVkSW1hZ2U6IExvYWRlZEltYWdlLCBjcm9wcGVyOiBDcm9wcGVyUG9zaXRpb24sIHNldHRpbmdzOiBDcm9wcGVyU2V0dGluZ3MsIG1heFNpemU6IERpbWVuc2lvbnMpOiBDcm9wcGVyUG9zaXRpb24ge1xuICAgICAgICBjb25zdCByYXRpbyA9IHRoaXMuZ2V0UmF0aW8obG9hZGVkSW1hZ2UsIG1heFNpemUpO1xuICAgICAgICBjb25zdCBvdXQ6IENyb3BwZXJQb3NpdGlvbiA9IHtcbiAgICAgICAgICAgIHgxOiBNYXRoLnJvdW5kKGNyb3BwZXIueDEgKiByYXRpbyksXG4gICAgICAgICAgICB5MTogTWF0aC5yb3VuZChjcm9wcGVyLnkxICogcmF0aW8pLFxuICAgICAgICAgICAgeDI6IE1hdGgucm91bmQoY3JvcHBlci54MiAqIHJhdGlvKSxcbiAgICAgICAgICAgIHkyOiBNYXRoLnJvdW5kKGNyb3BwZXIueTIgKiByYXRpbylcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoIXNldHRpbmdzLmNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgb3V0LngxID0gTWF0aC5tYXgob3V0LngxLCAwKTtcbiAgICAgICAgICAgIG91dC55MSA9IE1hdGgubWF4KG91dC55MSwgMCk7XG4gICAgICAgICAgICBvdXQueDIgPSBNYXRoLm1pbihvdXQueDIsIGxvYWRlZEltYWdlLnRyYW5zZm9ybWVkLnNpemUud2lkdGgpO1xuICAgICAgICAgICAgb3V0LnkyID0gTWF0aC5taW4ob3V0LnkyLCBsb2FkZWRJbWFnZS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T2Zmc2V0SW1hZ2VQb3NpdGlvbihsb2FkZWRJbWFnZTogTG9hZGVkSW1hZ2UsIGNyb3BwZXI6IENyb3BwZXJQb3NpdGlvbiwgc2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncywgbWF4U2l6ZTogRGltZW5zaW9ucyk6IENyb3BwZXJQb3NpdGlvbiB7XG4gICAgICAgIGNvbnN0IGNhbnZhc1JvdGF0aW9uID0gc2V0dGluZ3MuY2FudmFzUm90YXRpb24gKyBsb2FkZWRJbWFnZS5leGlmVHJhbnNmb3JtLnJvdGF0ZTtcbiAgICAgICAgY29uc3QgcmF0aW8gPSB0aGlzLmdldFJhdGlvKGxvYWRlZEltYWdlLCBtYXhTaXplKTtcbiAgICAgICAgbGV0IG9mZnNldFg6IG51bWJlcjtcbiAgICAgICAgbGV0IG9mZnNldFk6IG51bWJlcjtcblxuICAgICAgICBpZiAoY2FudmFzUm90YXRpb24gJSAyKSB7XG4gICAgICAgICAgICBvZmZzZXRYID0gKGxvYWRlZEltYWdlLnRyYW5zZm9ybWVkLnNpemUud2lkdGggLSBsb2FkZWRJbWFnZS5vcmlnaW5hbC5zaXplLmhlaWdodCkgLyAyO1xuICAgICAgICAgICAgb2Zmc2V0WSA9IChsb2FkZWRJbWFnZS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCAtIGxvYWRlZEltYWdlLm9yaWdpbmFsLnNpemUud2lkdGgpIC8gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9mZnNldFggPSAobG9hZGVkSW1hZ2UudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCAtIGxvYWRlZEltYWdlLm9yaWdpbmFsLnNpemUud2lkdGgpIC8gMjtcbiAgICAgICAgICAgIG9mZnNldFkgPSAobG9hZGVkSW1hZ2UudHJhbnNmb3JtZWQuc2l6ZS5oZWlnaHQgLSBsb2FkZWRJbWFnZS5vcmlnaW5hbC5zaXplLmhlaWdodCkgLyAyO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3V0OiBDcm9wcGVyUG9zaXRpb24gPSB7XG4gICAgICAgICAgICB4MTogTWF0aC5yb3VuZChjcm9wcGVyLngxICogcmF0aW8pIC0gb2Zmc2V0WCxcbiAgICAgICAgICAgIHkxOiBNYXRoLnJvdW5kKGNyb3BwZXIueTEgKiByYXRpbykgLSBvZmZzZXRZLFxuICAgICAgICAgICAgeDI6IE1hdGgucm91bmQoY3JvcHBlci54MiAqIHJhdGlvKSAtIG9mZnNldFgsXG4gICAgICAgICAgICB5MjogTWF0aC5yb3VuZChjcm9wcGVyLnkyICogcmF0aW8pIC0gb2Zmc2V0WVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICghc2V0dGluZ3MuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICBvdXQueDEgPSBNYXRoLm1heChvdXQueDEsIDApO1xuICAgICAgICAgICAgb3V0LnkxID0gTWF0aC5tYXgob3V0LnkxLCAwKTtcbiAgICAgICAgICAgIG91dC54MiA9IE1hdGgubWluKG91dC54MiwgbG9hZGVkSW1hZ2UudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCk7XG4gICAgICAgICAgICBvdXQueTIgPSBNYXRoLm1pbihvdXQueTIsIGxvYWRlZEltYWdlLnRyYW5zZm9ybWVkLnNpemUuaGVpZ2h0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgZ2V0UmVzaXplUmF0aW8od2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHNldHRpbmdzOiBDcm9wcGVyU2V0dGluZ3MpOiBudW1iZXIge1xuICAgICAgICBjb25zdCByYXRpb1dpZHRoID0gc2V0dGluZ3MucmVzaXplVG9XaWR0aCAvIHdpZHRoO1xuICAgICAgICBjb25zdCByYXRpb0hlaWdodCA9IHNldHRpbmdzLnJlc2l6ZVRvSGVpZ2h0IC8gaGVpZ2h0O1xuICAgICAgICBjb25zdCByYXRpb3MgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuXG4gICAgICAgIGlmIChzZXR0aW5ncy5yZXNpemVUb1dpZHRoID4gMCkge1xuICAgICAgICAgICAgcmF0aW9zLnB1c2gocmF0aW9XaWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHRpbmdzLnJlc2l6ZVRvSGVpZ2h0ID4gMCkge1xuICAgICAgICAgICAgcmF0aW9zLnB1c2gocmF0aW9IZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmF0aW9zLmxlbmd0aCA9PT0gMCA/IDEgOiBNYXRoLm1pbiguLi5yYXRpb3MpO1xuXG4gICAgICAgIGlmIChyZXN1bHQgPiAxICYmICFzZXR0aW5ncy5vbmx5U2NhbGVEb3duKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLm1pbihyZXN1bHQsIDEpO1xuICAgIH1cblxuICAgIGdldFF1YWxpdHkoc2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncyk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBzZXR0aW5ncy5pbWFnZVF1YWxpdHkgLyAxMDApKTtcbiAgICB9XG59XG4iXX0=