@asoftwareworld/form-builder
Version:
ASW Form Builder 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 befor
313 lines • 64.7 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 { Component, EventEmitter, Inject, Input, Output, } from '@angular/core';
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
import { fabric } from 'fabric';
import * as i0 from "@angular/core";
import * as i1 from "@angular/material/dialog";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
import * as i4 from "@angular/material/divider";
import * as i5 from "@angular/material/button-toggle";
export class AswImageDrawing {
dialogRef;
control;
src;
width = 680;
height = 250;
forceSizeCanvas = true;
forceSizeExport = true;
enableRemoveImage = true;
enableLoadAnotherImage = true;
enableTooltip = true;
showCancelButton = true;
/* @deprecated Use i18n.saveBtn */
saveBtnText = 'Save';
/* @deprecated Use i18n.cancelBtn */
cancelBtnText = 'Cancel';
/* @deprecated Use i18n.loading */
loadingText = 'Loading…';
loadingTemplate;
errorTemplate;
outputMimeType = 'image/jpeg';
outputQuality = 0.8;
// @Input() public borderCss = 'none';
drawingSizes = {
small: 3, medium: 10, large: 25, extra: 50
};
colors = {
black: '#000',
white: '#fff',
yellow: '#ffeb3b',
red: '#f44336',
blue: '#2196f3',
green: '#4caf50',
purple: '#7a08af',
};
save = new EventEmitter();
cancel = new EventEmitter();
currentTool = 'brush';
currentSize = 3;
currentColor = 'black';
// public i18n: I18nInterface = I18nEn;
canUndo = false;
canRedo = false;
isLoading = false;
hasError = false;
errorMessage = '';
canvas;
stack = [];
colorsName = [];
drawingSizesName = [];
imageUsed;
constructor(dialogRef, control) {
this.dialogRef = dialogRef;
this.control = control;
}
ngOnInit() {
if (this.control.controlType === 'signature') {
this.enableLoadAnotherImage = false;
}
this.src = this.control.imageUrl;
this.colorsName = Object.keys(this.colors);
this.drawingSizesName = Object.keys(this.drawingSizes);
this.canvas = new fabric.Canvas('aswCanvas', {
hoverCursor: 'pointer',
isDrawingMode: true
});
this.canvas.backgroundColor = 'white';
if (this.src) {
this.importPhotoFromSrc(this.src);
}
else {
if (!this.width || !this.height) {
throw new Error('No width or hight given !');
}
this.canvas.setWidth(this.width);
this.canvas.setHeight(this.height);
}
this.canvas.on('path:created', () => {
this.stack = [];
this.setUndoRedo();
});
this.selectTool(this.currentTool);
this.selectColor(this.currentColor);
this.selectDrawingSize(this.currentSize);
}
// Tools
selectTool(tool) {
this.currentTool = tool;
}
selectDrawingSize(size) {
this.currentSize = size;
if (this.canvas) {
this.canvas.freeDrawingBrush.width = size;
}
}
selectColor(color) {
this.currentColor = color;
if (this.canvas) {
this.canvas.freeDrawingBrush.color = this.colors[color];
}
}
// Actions
undo() {
if (this.canUndo) {
const lastId = this.canvas.getObjects().length - 1;
const lastObj = this.canvas.getObjects()[lastId];
this.stack.push(lastObj);
this.canvas.remove(lastObj);
this.setUndoRedo();
}
}
redo() {
if (this.canRedo) {
const firstInStack = this.stack.splice(-1, 1)[0];
if (firstInStack) {
this.canvas.insertAt(firstInStack, this.canvas.getObjects().length - 1, false);
}
this.setUndoRedo();
}
}
clearCanvas() {
if (this.canvas) {
this.canvas.remove(...this.canvas.getObjects());
this.setUndoRedo();
}
}
saveImage() {
this.canvas.getElement().toBlob((data) => {
const reader = new FileReader();
reader.readAsDataURL(data);
reader.onloadend = () => {
const base64data = reader.result;
this.control.imageUrl = base64data;
};
}, this.outputMimeType, this.outputQuality);
}
setUndoRedo() {
this.canUndo = this.canvas.getObjects().length > 0;
this.canRedo = this.stack.length > 0;
// this.canvas.renderAll();
}
importPhotoFromFile(event) {
if (event.target.files && event.target.files.length > 0) {
const file = event.target.files[0];
if (file.type.match('image.*')) {
this.importPhotoFromBlob(file);
}
else {
throw new Error('Not an image !');
}
}
}
removeImage() {
if (this.imageUsed) {
this.imageUsed.dispose();
this.imageUsed = null;
}
this.canvas.backgroundImage = null;
if (this.width && this.height) {
this.canvas.setWidth(this.width);
this.canvas.setHeight(this.height);
}
this.canvas.renderAll();
}
get hasImage() {
return !!this.canvas.backgroundImage;
}
importPhotoFromSrc(src) {
this.isLoading = true;
let isFirstTry = true;
const imgEl = new Image();
imgEl.setAttribute('crossOrigin', 'anonymous');
imgEl.src = src;
imgEl.onerror = () => {
// Retry with cors proxy
if (isFirstTry) {
imgEl.src = 'https://cors-anywhere.herokuapp.com/' + this.src;
isFirstTry = false;
}
else {
this.isLoading = false;
this.hasError = true;
// this.errorMessage = this.getTextTranslated('loadError').replace('%@', this.src as string);
}
};
imgEl.onload = () => {
this.isLoading = false;
this.imageUsed = new fabric.Image(imgEl);
this.imageUsed.cloneAsImage((image) => {
let width = imgEl.width;
let height = imgEl.height;
const ratio = (640 / width < 480 / height
? 640 / width
: 480 / width);
width = width * ratio;
height = height * ratio;
image.scaleToWidth(width, false);
image.scaleToHeight(height, false);
this.canvas.setBackgroundImage(image, ((img) => {
if (img) {
if (this.forceSizeCanvas) {
this.canvas.setWidth(width);
this.canvas.setHeight(height);
}
else {
this.canvas.setWidth(image.getScaledWidth());
this.canvas.setHeight(image.getScaledHeight());
}
}
}), {
crossOrigin: 'anonymous',
originX: 'left',
originY: 'top'
});
});
};
}
importPhotoFromBlob(file) {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = (evtReader) => {
if (evtReader.target.readyState === FileReader.DONE) {
this.importPhotoFromSrc(evtReader.target.result);
}
};
}
ngOnChanges(changes) {
if (changes.src && !changes.src.firstChange && changes.src.currentValue) {
if (typeof changes.src.currentValue === 'string') {
this.importPhotoFromSrc(changes.src.currentValue);
}
else if (changes.src.currentValue instanceof Blob) {
this.importPhotoFromBlob(changes.src.currentValue);
}
}
}
onNoClick() {
this.dialogRef.close();
}
onSubmit(aswEditPropertyForm) {
if (aswEditPropertyForm.invalid) {
return;
}
this.saveImage();
this.dialogRef.close(this.control);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: AswImageDrawing, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.11", type: AswImageDrawing, selector: "asw-image-drawing", inputs: { src: "src", width: "width", height: "height", forceSizeCanvas: "forceSizeCanvas", forceSizeExport: "forceSizeExport", enableRemoveImage: "enableRemoveImage", enableLoadAnotherImage: "enableLoadAnotherImage", enableTooltip: "enableTooltip", showCancelButton: "showCancelButton", saveBtnText: "saveBtnText", cancelBtnText: "cancelBtnText", loadingText: "loadingText", loadingTemplate: "loadingTemplate", errorTemplate: "errorTemplate", outputMimeType: "outputMimeType", outputQuality: "outputQuality", drawingSizes: "drawingSizes", colors: "colors" }, outputs: { save: "save", cancel: "cancel" }, usesOnChanges: true, ngImport: i0, template: "<h4 mat-dialog-title>Edit Property</h4>\r\n<mat-divider></mat-divider>\r\n<form #aswEditPropertyForm=\"ngForm\" (ngSubmit)=\"onSubmit(aswEditPropertyForm)\" novalidate>\r\n <mat-dialog-content class=\"mat-typography\">\r\n <div class=\"asw-drawing-card\">\r\n <div class=\"loading\" *ngIf=\"isLoading\">\r\n <ng-container *ngTemplateOutlet=\"loadingTemplate ? loadingTemplate : defaultLoading\"></ng-container>\r\n </div>\r\n <div class=\"error\" *ngIf=\"hasError\">\r\n <ng-container *ngTemplateOutlet=\"errorTemplate ? errorTemplate : defaultError\"></ng-container>\r\n </div>\r\n \r\n <ng-template #defaultLoading><p>{{ loadingText }}</p></ng-template>\r\n <ng-template #defaultError> <p>{{ errorMessage }}</p> </ng-template>\r\n \r\n <div class=\"asw-drawing\">\r\n <canvas #aswCanvas id=\"aswCanvas\" class=\"asw-drawing-canvas\"></canvas>\r\n </div>\r\n </div>\r\n <div class=\"row asw-pt-10\" *ngIf=\"!isLoading\">\r\n <div class=\"col-md-12\">\r\n <div class=\"asw-buttons\">\r\n <button class=\"asw-image-load-btn\" type=\"button\"\r\n *ngIf=\"enableLoadAnotherImage && !hasImage\" \r\n (click)=\"fileInput.click();\"\r\n matTooltip=\"Load image\">\r\n <input style=\"display: none\" \r\n type=\"file\" \r\n #fileInput \r\n (change)=\"importPhotoFromFile($event)\"\r\n accept=\"image/*\"/>\r\n Load image\r\n </button>\r\n <button class=\"asw-image-load-btn\" type=\"button\"\r\n *ngIf=\"enableRemoveImage && hasImage\" \r\n (click)=\"removeImage()\"\r\n matTooltip=\"Remove image\">\r\n Remove image\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <ul class=\"asw-options\">\r\n <li class=\"option tool\" style=\"display: none\"\r\n [class.selected]=\"currentTool == 'brush'\" \r\n (click)=\"selectTool('brush')\"\r\n id=\"brush\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14.445\" height=\"14.462\" viewBox=\"0 0 14.445 14.462\">\r\n <path id=\"Path_153\" data-name=\"Path 153\" d=\"M8.319,8.378l6.014-6.535a.4.4,0,0,0-.024-.577L13.155.111a.4.4,0,0,0-.553,0L6.066,6.125a.4.4,0,0,0,0,.577L7.742,8.378a.4.4,0,0,0,.577,0Zm-3.44-.89,2.093,2.1a.8.8,0,0,1,.249.457v.393a3.208,3.208,0,0,1-.938,2.277,6.223,6.223,0,0,1-4.739,1.732,2.326,2.326,0,0,1-1.427-.481.4.4,0,0,1-.048-.505,4.772,4.772,0,0,0,.714-2.609A3.626,3.626,0,0,1,1.744,8.17a3.208,3.208,0,0,1,2.269-.938,3.134,3.134,0,0,1,.393,0A.874.874,0,0,1,4.879,7.488Z\" fill=\"#5a6168\" fill-rule=\"evenodd\"/>\r\n </svg>\r\n <span>Brush</span>\r\n </li>\r\n <li class=\"option\">\r\n <input type=\"range\" \r\n [(ngModel)]=\"currentSize\"\r\n #input=\"ngModel\"\r\n name=\"sliders\"\r\n id=\"size-slider\"\r\n min=\"1\"\r\n (change)=\"selectDrawingSize(currentSize)\"\r\n max=\"30\">\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <div class=\"asw-pb-10\">\r\n <mat-button-toggle-group class=\"asw-width\">\r\n <mat-button-toggle matTooltip=\"Undo\"\r\n [disabled]=\"!canUndo\"\r\n class=\"asw-width\"\r\n (change)=\"undo()\">\r\n Undo\r\n </mat-button-toggle>\r\n <mat-button-toggle matTooltip=\"Redo\"\r\n [disabled]=\"!canRedo\"\r\n class=\"asw-width\"\r\n (change)=\"redo()\">\r\n Redo\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <div class=\"asw-color-picker\">\r\n <div *ngFor=\"let colorName of colorsName\" \r\n [class.selected]=\"currentColor == colorName\" \r\n class=\"color\"\r\n [ngClass]=\"colorName\"\r\n [style.background]=\"colors[colorName]\" \r\n title=\"{{colorName}}\"\r\n (click)=\"selectColor(colorName)\">\r\n </div>\r\n </div> \r\n </div>\r\n <div class=\"col-md-6 asw-buttons\">\r\n <button class=\"asw-clear-canvas\" type=\"button\"\r\n (click)=\"clearCanvas()\">Clear Canvas</button>\r\n </div>\r\n </div>\r\n </mat-dialog-content>\r\n <mat-dialog-actions align=\"end\">\r\n <button type=\"button\"\r\n class=\"btn btn-danger mr-2 me-2 mb-1\"\r\n (click)=\"onNoClick()\">\r\n No\r\n </button>\r\n <button type=\"submit\"\r\n class=\"btn btn-primary mb-1\"\r\n cdkFocusInitial>\r\n Yes\r\n </button>\r\n </mat-dialog-actions>\r\n</form>\r\n", styles: [":host .asw-drawing-card{display:flex;flex-flow:column;align-items:center}:host .size{background-color:#000;display:inline-block;margin:.2rem}:host .size.selected{background-color:#bdbdbd}:host .btn{cursor:pointer}:host .btn.selected{color:#bdbdbd}:host .btn.disabled{cursor:initial;color:#bdbdbd}:host .asw-color-picker{position:relative;display:flex;align-items:center;justify-content:center}:host .asw-color-picker .color{width:28px;height:28px;border-radius:14px;cursor:pointer;display:flex;align-items:center;justify-content:center;margin:.2rem}:host .asw-color-picker .color.selected:after{content:\"\";width:10px;height:10px;background:#000;display:flex;border-radius:5px}:host .asw-color-picker .color.black{background-color:#000}:host .asw-color-picker .color.black.selected:after{background:#fff}:host .asw-color-picker .color.white{border:1px solid #a7a7a7}:host .asw-buttons button{width:100%;color:#fff;border:none;outline:none;padding:11px 0;font-size:.9rem;background:none;border-radius:4px;margin-bottom:10px;cursor:pointer;transition:all .3s ease}:host .asw-buttons .asw-clear-canvas{color:#000000de;border:solid 1px rgba(0,0,0,.12)}:host .asw-buttons .asw-clear-canvas:hover{background:#f5f5f5}:host .asw-buttons .asw-clear-canvas:disabled{background:#fff;color:#00000042}:host .asw-buttons .asw-image-load-btn{margin-bottom:8px;background:#4a98f7;border:1px solid #4A98F7}:host .asw-buttons .asw-image-load-btn:hover{background:#2382f6}:host .asw-drawing{flex:1;margin:1em auto auto}:host .asw-drawing-canvas{border:1.5px #d6d6d6 dashed;border-radius:7px}:host .row .asw-options{list-style:none;margin:0}:host .row .asw-options .option{display:flex;-webkit-user-select:none;user-select:none;cursor:pointer;align-items:center;margin-bottom:10px}:host .row .asw-options .option img{width:17px}:host .option:is(:hover,.active) img{filter:invert(17%) sepia(90%) saturate(3000%) hue-rotate(900deg) brightness(100%) contrast(100%)}:host .option :where(span,label){color:#5a6168;cursor:pointer;padding-left:10px}:host .option:is(:hover,.active) :where(span,label){color:#4a98f7}:host .option #fill-color{height:15px;width:15px;cursor:pointer}:host #fill-color:checked~label{color:#4a98f7}:host .option #size-slider{width:100%;height:5px;margin-top:10px}:host .asw-width{width:100%}:host .asw-pb-10{padding-bottom:10px}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i4.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i5.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i5.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: AswImageDrawing, decorators: [{
type: Component,
args: [{ selector: 'asw-image-drawing', template: "<h4 mat-dialog-title>Edit Property</h4>\r\n<mat-divider></mat-divider>\r\n<form #aswEditPropertyForm=\"ngForm\" (ngSubmit)=\"onSubmit(aswEditPropertyForm)\" novalidate>\r\n <mat-dialog-content class=\"mat-typography\">\r\n <div class=\"asw-drawing-card\">\r\n <div class=\"loading\" *ngIf=\"isLoading\">\r\n <ng-container *ngTemplateOutlet=\"loadingTemplate ? loadingTemplate : defaultLoading\"></ng-container>\r\n </div>\r\n <div class=\"error\" *ngIf=\"hasError\">\r\n <ng-container *ngTemplateOutlet=\"errorTemplate ? errorTemplate : defaultError\"></ng-container>\r\n </div>\r\n \r\n <ng-template #defaultLoading><p>{{ loadingText }}</p></ng-template>\r\n <ng-template #defaultError> <p>{{ errorMessage }}</p> </ng-template>\r\n \r\n <div class=\"asw-drawing\">\r\n <canvas #aswCanvas id=\"aswCanvas\" class=\"asw-drawing-canvas\"></canvas>\r\n </div>\r\n </div>\r\n <div class=\"row asw-pt-10\" *ngIf=\"!isLoading\">\r\n <div class=\"col-md-12\">\r\n <div class=\"asw-buttons\">\r\n <button class=\"asw-image-load-btn\" type=\"button\"\r\n *ngIf=\"enableLoadAnotherImage && !hasImage\" \r\n (click)=\"fileInput.click();\"\r\n matTooltip=\"Load image\">\r\n <input style=\"display: none\" \r\n type=\"file\" \r\n #fileInput \r\n (change)=\"importPhotoFromFile($event)\"\r\n accept=\"image/*\"/>\r\n Load image\r\n </button>\r\n <button class=\"asw-image-load-btn\" type=\"button\"\r\n *ngIf=\"enableRemoveImage && hasImage\" \r\n (click)=\"removeImage()\"\r\n matTooltip=\"Remove image\">\r\n Remove image\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <ul class=\"asw-options\">\r\n <li class=\"option tool\" style=\"display: none\"\r\n [class.selected]=\"currentTool == 'brush'\" \r\n (click)=\"selectTool('brush')\"\r\n id=\"brush\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14.445\" height=\"14.462\" viewBox=\"0 0 14.445 14.462\">\r\n <path id=\"Path_153\" data-name=\"Path 153\" d=\"M8.319,8.378l6.014-6.535a.4.4,0,0,0-.024-.577L13.155.111a.4.4,0,0,0-.553,0L6.066,6.125a.4.4,0,0,0,0,.577L7.742,8.378a.4.4,0,0,0,.577,0Zm-3.44-.89,2.093,2.1a.8.8,0,0,1,.249.457v.393a3.208,3.208,0,0,1-.938,2.277,6.223,6.223,0,0,1-4.739,1.732,2.326,2.326,0,0,1-1.427-.481.4.4,0,0,1-.048-.505,4.772,4.772,0,0,0,.714-2.609A3.626,3.626,0,0,1,1.744,8.17a3.208,3.208,0,0,1,2.269-.938,3.134,3.134,0,0,1,.393,0A.874.874,0,0,1,4.879,7.488Z\" fill=\"#5a6168\" fill-rule=\"evenodd\"/>\r\n </svg>\r\n <span>Brush</span>\r\n </li>\r\n <li class=\"option\">\r\n <input type=\"range\" \r\n [(ngModel)]=\"currentSize\"\r\n #input=\"ngModel\"\r\n name=\"sliders\"\r\n id=\"size-slider\"\r\n min=\"1\"\r\n (change)=\"selectDrawingSize(currentSize)\"\r\n max=\"30\">\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <div class=\"asw-pb-10\">\r\n <mat-button-toggle-group class=\"asw-width\">\r\n <mat-button-toggle matTooltip=\"Undo\"\r\n [disabled]=\"!canUndo\"\r\n class=\"asw-width\"\r\n (change)=\"undo()\">\r\n Undo\r\n </mat-button-toggle>\r\n <mat-button-toggle matTooltip=\"Redo\"\r\n [disabled]=\"!canRedo\"\r\n class=\"asw-width\"\r\n (change)=\"redo()\">\r\n Redo\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <div class=\"asw-color-picker\">\r\n <div *ngFor=\"let colorName of colorsName\" \r\n [class.selected]=\"currentColor == colorName\" \r\n class=\"color\"\r\n [ngClass]=\"colorName\"\r\n [style.background]=\"colors[colorName]\" \r\n title=\"{{colorName}}\"\r\n (click)=\"selectColor(colorName)\">\r\n </div>\r\n </div> \r\n </div>\r\n <div class=\"col-md-6 asw-buttons\">\r\n <button class=\"asw-clear-canvas\" type=\"button\"\r\n (click)=\"clearCanvas()\">Clear Canvas</button>\r\n </div>\r\n </div>\r\n </mat-dialog-content>\r\n <mat-dialog-actions align=\"end\">\r\n <button type=\"button\"\r\n class=\"btn btn-danger mr-2 me-2 mb-1\"\r\n (click)=\"onNoClick()\">\r\n No\r\n </button>\r\n <button type=\"submit\"\r\n class=\"btn btn-primary mb-1\"\r\n cdkFocusInitial>\r\n Yes\r\n </button>\r\n </mat-dialog-actions>\r\n</form>\r\n", styles: [":host .asw-drawing-card{display:flex;flex-flow:column;align-items:center}:host .size{background-color:#000;display:inline-block;margin:.2rem}:host .size.selected{background-color:#bdbdbd}:host .btn{cursor:pointer}:host .btn.selected{color:#bdbdbd}:host .btn.disabled{cursor:initial;color:#bdbdbd}:host .asw-color-picker{position:relative;display:flex;align-items:center;justify-content:center}:host .asw-color-picker .color{width:28px;height:28px;border-radius:14px;cursor:pointer;display:flex;align-items:center;justify-content:center;margin:.2rem}:host .asw-color-picker .color.selected:after{content:\"\";width:10px;height:10px;background:#000;display:flex;border-radius:5px}:host .asw-color-picker .color.black{background-color:#000}:host .asw-color-picker .color.black.selected:after{background:#fff}:host .asw-color-picker .color.white{border:1px solid #a7a7a7}:host .asw-buttons button{width:100%;color:#fff;border:none;outline:none;padding:11px 0;font-size:.9rem;background:none;border-radius:4px;margin-bottom:10px;cursor:pointer;transition:all .3s ease}:host .asw-buttons .asw-clear-canvas{color:#000000de;border:solid 1px rgba(0,0,0,.12)}:host .asw-buttons .asw-clear-canvas:hover{background:#f5f5f5}:host .asw-buttons .asw-clear-canvas:disabled{background:#fff;color:#00000042}:host .asw-buttons .asw-image-load-btn{margin-bottom:8px;background:#4a98f7;border:1px solid #4A98F7}:host .asw-buttons .asw-image-load-btn:hover{background:#2382f6}:host .asw-drawing{flex:1;margin:1em auto auto}:host .asw-drawing-canvas{border:1.5px #d6d6d6 dashed;border-radius:7px}:host .row .asw-options{list-style:none;margin:0}:host .row .asw-options .option{display:flex;-webkit-user-select:none;user-select:none;cursor:pointer;align-items:center;margin-bottom:10px}:host .row .asw-options .option img{width:17px}:host .option:is(:hover,.active) img{filter:invert(17%) sepia(90%) saturate(3000%) hue-rotate(900deg) brightness(100%) contrast(100%)}:host .option :where(span,label){color:#5a6168;cursor:pointer;padding-left:10px}:host .option:is(:hover,.active) :where(span,label){color:#4a98f7}:host .option #fill-color{height:15px;width:15px;cursor:pointer}:host #fill-color:checked~label{color:#4a98f7}:host .option #size-slider{width:100%;height:5px;margin-top:10px}:host .asw-width{width:100%}:host .asw-pb-10{padding-bottom:10px}\n"] }]
}], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
type: Inject,
args: [MAT_DIALOG_DATA]
}] }], propDecorators: { src: [{
type: Input
}], width: [{
type: Input
}], height: [{
type: Input
}], forceSizeCanvas: [{
type: Input
}], forceSizeExport: [{
type: Input
}], enableRemoveImage: [{
type: Input
}], enableLoadAnotherImage: [{
type: Input
}], enableTooltip: [{
type: Input
}], showCancelButton: [{
type: Input
}], saveBtnText: [{
type: Input
}], cancelBtnText: [{
type: Input
}], loadingText: [{
type: Input
}], loadingTemplate: [{
type: Input
}], errorTemplate: [{
type: Input
}], outputMimeType: [{
type: Input
}], outputQuality: [{
type: Input
}], drawingSizes: [{
type: Input
}], colors: [{
type: Input
}], save: [{
type: Output
}], cancel: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZHJhd2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2ltYWdlLWRyYXdpbmcvaW1hZ2UtZHJhd2luZy50cyIsIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2ltYWdlLWRyYXdpbmcvaW1hZ2UtZHJhd2luZy5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE9BQU8sRUFDSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxHQUdULE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBZ0IsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQzs7Ozs7OztBQU9oQyxNQUFNLE9BQU8sZUFBZTtJQWlFYjtJQUN5QjtJQWhFcEIsR0FBRyxDQUFVO0lBQ2IsS0FBSyxHQUFHLEdBQUcsQ0FBQztJQUNaLE1BQU0sR0FBRyxHQUFHLENBQUM7SUFFYixlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDdkIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLHNCQUFzQixHQUFHLElBQUksQ0FBQztJQUM5QixhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUV4QyxrQ0FBa0M7SUFDbEIsV0FBVyxHQUFHLE1BQU0sQ0FBQztJQUNyQyxvQ0FBb0M7SUFDcEIsYUFBYSxHQUFHLFFBQVEsQ0FBQztJQUN6QyxrQ0FBa0M7SUFDbEIsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUV6QixlQUFlLENBQW9CO0lBQ25DLGFBQWEsQ0FBb0I7SUFFakMsY0FBYyxHQUFHLFlBQVksQ0FBQztJQUM5QixhQUFhLEdBQUcsR0FBRyxDQUFDO0lBRXBDLHNDQUFzQztJQUV0QixZQUFZLEdBQStCO1FBQ3ZELEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFO0tBQzdDLENBQUM7SUFFYyxNQUFNLEdBQStCO1FBQ2pELEtBQUssRUFBRSxNQUFNO1FBQ2IsS0FBSyxFQUFFLE1BQU07UUFDYixNQUFNLEVBQUUsU0FBUztRQUNqQixHQUFHLEVBQUUsU0FBUztRQUNkLElBQUksRUFBRSxTQUFTO1FBQ2YsS0FBSyxFQUFFLFNBQVM7UUFDaEIsTUFBTSxFQUFFLFNBQVM7S0FDcEIsQ0FBQztJQUVlLElBQUksR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUNwRCxNQUFNLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7SUFFaEUsV0FBVyxHQUFHLE9BQU8sQ0FBQztJQUN0QixXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLFlBQVksR0FBRyxPQUFPLENBQUM7SUFDOUIsdUNBQXVDO0lBQ2hDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDaEIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUVoQixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUVqQixNQUFNLENBQWlCO0lBQ3ZCLEtBQUssR0FBb0IsRUFBRSxDQUFDO0lBRTdCLFVBQVUsR0FBYSxFQUFFLENBQUM7SUFDMUIsZ0JBQWdCLEdBQWEsRUFBRSxDQUFDO0lBRS9CLFNBQVMsQ0FBZ0I7SUFFakMsWUFDVyxTQUF3QyxFQUNmLE9BQVk7UUFEckMsY0FBUyxHQUFULFNBQVMsQ0FBK0I7UUFDZixZQUFPLEdBQVAsT0FBTyxDQUFLO0lBRWhELENBQUM7SUFFTSxRQUFRO1FBQ1gsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtZQUN6QyxXQUFXLEVBQUUsU0FBUztZQUN0QixhQUFhLEVBQUUsSUFBSTtTQUN0QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUM7UUFFdEMsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUNqRCxDQUFDO1lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtZQUNoQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxRQUFRO0lBQ0QsVUFBVSxDQUFDLElBQVk7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDNUIsQ0FBQztJQUVNLGlCQUFpQixDQUFDLElBQVk7UUFDakMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDOUMsQ0FBQztJQUNMLENBQUM7SUFFTSxXQUFXLENBQUMsS0FBYTtRQUM1QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUQsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVO0lBRUgsSUFBSTtRQUNQLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDTCxDQUFDO0lBRU0sSUFBSTtRQUNQLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ25GLENBQUM7WUFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkIsQ0FBQztJQUNMLENBQUM7SUFFTSxXQUFXO1FBQ2QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkIsQ0FBQztJQUNMLENBQUM7SUFFTSxTQUFTO1FBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQzNCLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDVixNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLFNBQVMsR0FBRyxHQUFHLEVBQUU7Z0JBQ3BCLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztZQUN2QyxDQUFDLENBQUM7UUFDTixDQUFDLEVBQ0QsSUFBSSxDQUFDLGNBQWMsRUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FDckIsQ0FBQztJQUNOLENBQUM7SUFFTyxXQUFXO1FBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDckMsMkJBQTJCO0lBQy9CLENBQUM7SUFFTSxtQkFBbUIsQ0FBQyxLQUFrQjtRQUN6QyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0RCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVNLFdBQVc7UUFDZCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBVyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsR0FBRyxJQUFXLENBQUM7UUFFMUMsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDZixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQztJQUN6QyxDQUFDO0lBRU8sa0JBQWtCLENBQUMsR0FBVztRQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUMxQixLQUFLLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMvQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNoQixLQUFLLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRTtZQUNqQix3QkFBd0I7WUFDeEIsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDYixLQUFLLENBQUMsR0FBRyxHQUFHLHNDQUFzQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQzlELFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDdkIsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDckIsNkZBQTZGO1lBQ2pHLENBQUM7UUFDTCxDQUFDLENBQUM7UUFDRixLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtZQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV6QyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO2dCQUN2QyxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO2dCQUN4QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUMxQixNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLE1BQU07b0JBQ3JDLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSztvQkFDYixDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FDaEIsQ0FBQztnQkFDRixLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDdEIsTUFBTSxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBRXhCLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNqQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQXFCLEVBQUUsRUFBRTtvQkFDN0QsSUFBSSxHQUFHLEVBQUUsQ0FBQzt3QkFDTixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs0QkFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNsQyxDQUFDOzZCQUFNLENBQUM7NEJBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7NEJBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO3dCQUNuRCxDQUFDO29CQUNMLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLEVBQUU7b0JBQ0EsV0FBVyxFQUFFLFdBQVc7b0JBQ3hCLE9BQU8sRUFBRSxNQUFNO29CQUNmLE9BQU8sRUFBRSxLQUFLO2lCQUNqQixDQUFDLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxJQUFpQjtRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLFNBQWMsRUFBRSxFQUFFO1lBQy9CLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNsRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyRCxDQUFDO1FBQ0wsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUM5QixJQUFJLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RFLElBQUksT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdEQsQ0FBQztpQkFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxZQUFZLElBQUksRUFBRSxDQUFDO2dCQUNsRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2RCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCxTQUFTO1FBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsUUFBUSxDQUFDLG1CQUEyQjtRQUNoQyxJQUFJLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzlCLE9BQU87UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDO3dHQTlSUSxlQUFlLDhDQWtFWixlQUFlOzRGQWxFbEIsZUFBZSwycUJDM0I1QixpNkxBaUhBOzs0RkR0RmEsZUFBZTtrQkFMM0IsU0FBUzsrQkFDSSxtQkFBbUI7OzBCQXNFeEIsTUFBTTsyQkFBQyxlQUFlO3lDQWhFWCxHQUFHO3NCQUFsQixLQUFLO2dCQUNVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsTUFBTTtzQkFBckIsS0FBSztnQkFFVSxlQUFlO3NCQUE5QixLQUFLO2dCQUNVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBQ1UsaUJBQWlCO3NCQUFoQyxLQUFLO2dCQUNVLHNCQUFzQjtzQkFBckMsS0FBSztnQkFDVSxhQUFhO3NCQUE1QixLQUFLO2dCQUNVLGdCQUFnQjtzQkFBL0IsS0FBSztnQkFHVSxXQUFXO3NCQUExQixLQUFLO2dCQUVVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBRVUsV0FBVztzQkFBMUIsS0FBSztnQkFFVSxlQUFlO3NCQUE5QixLQUFLO2dCQUNVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBRVUsY0FBYztzQkFBN0IsS0FBSztnQkFDVSxhQUFhO3NCQUE1QixLQUFLO2dCQUlVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBSVUsTUFBTTtzQkFBckIsS0FBSztnQkFVVyxJQUFJO3NCQUFwQixNQUFNO2dCQUNVLE1BQU07c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IEFTVyAoQSBTb2Z0d2FyZSBXb3JsZCkgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICpcclxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcclxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZVxyXG4gKi9cclxuaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCxcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEluamVjdCxcclxuICAgIElucHV0LFxyXG4gICAgT25DaGFuZ2VzLFxyXG4gICAgT25Jbml0LFxyXG4gICAgT3V0cHV0LFxyXG4gICAgU2ltcGxlQ2hhbmdlcyxcclxuICAgIFRlbXBsYXRlUmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgZmFicmljIH0gZnJvbSAnZmFicmljJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdhc3ctaW1hZ2UtZHJhd2luZycsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9pbWFnZS1kcmF3aW5nLnNjc3MnXSxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9pbWFnZS1kcmF3aW5nLmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc3dJbWFnZURyYXdpbmcgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIHNyYz86IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyB3aWR0aCA9IDY4MDtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWlnaHQgPSAyNTA7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGZvcmNlU2l6ZUNhbnZhcyA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZm9yY2VTaXplRXhwb3J0ID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBlbmFibGVSZW1vdmVJbWFnZSA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlTG9hZEFub3RoZXJJbWFnZSA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlVG9vbHRpcCA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd0NhbmNlbEJ1dHRvbiA9IHRydWU7XHJcblxyXG4gICAgLyogQGRlcHJlY2F0ZWQgVXNlIGkxOG4uc2F2ZUJ0biAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHNhdmVCdG5UZXh0ID0gJ1NhdmUnO1xyXG4gICAgLyogQGRlcHJlY2F0ZWQgVXNlIGkxOG4uY2FuY2VsQnRuICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgY2FuY2VsQnRuVGV4dCA9ICdDYW5jZWwnO1xyXG4gICAgLyogQGRlcHJlY2F0ZWQgVXNlIGkxOG4ubG9hZGluZyAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGxvYWRpbmdUZXh0ID0gJ0xvYWRpbmfigKYnO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBsb2FkaW5nVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgQElucHV0KCkgcHVibGljIGVycm9yVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBvdXRwdXRNaW1lVHlwZSA9ICdpbWFnZS9qcGVnJztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBvdXRwdXRRdWFsaXR5ID0gMC44O1xyXG5cclxuICAgIC8vIEBJbnB1dCgpIHB1YmxpYyBib3JkZXJDc3MgPSAnbm9uZSc7XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGRyYXdpbmdTaXplczogeyBbbmFtZTogc3RyaW5nXTogbnVtYmVyIH0gPSB7XHJcbiAgICAgICAgc21hbGw6IDMsIG1lZGl1bTogMTAsIGxhcmdlOiAyNSwgZXh0cmE6IDUwXHJcbiAgICB9O1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjb2xvcnM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge1xyXG4gICAgICAgIGJsYWNrOiAnIzAwMCcsXHJcbiAgICAgICAgd2hpdGU6ICcjZmZmJyxcclxuICAgICAgICB5ZWxsb3c6ICcjZmZlYjNiJyxcclxuICAgICAgICByZWQ6ICcjZjQ0MzM2JyxcclxuICAgICAgICBibHVlOiAnIzIxOTZmMycsXHJcbiAgICAgICAgZ3JlZW46ICcjNGNhZjUwJyxcclxuICAgICAgICBwdXJwbGU6ICcjN2EwOGFmJyxcclxuICAgIH07XHJcblxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBzYXZlOiBFdmVudEVtaXR0ZXI8QmxvYj4gPSBuZXcgRXZlbnRFbWl0dGVyPEJsb2I+KCk7XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGNhbmNlbDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgIHB1YmxpYyBjdXJyZW50VG9vbCA9ICdicnVzaCc7XHJcbiAgICBwdWJsaWMgY3VycmVudFNpemUgPSAzO1xyXG4gICAgcHVibGljIGN1cnJlbnRDb2xvciA9ICdibGFjayc7XHJcbiAgICAvLyBwdWJsaWMgaTE4bjogSTE4bkludGVyZmFjZSA9IEkxOG5FbjtcclxuICAgIHB1YmxpYyBjYW5VbmRvID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgY2FuUmVkbyA9IGZhbHNlO1xyXG5cclxuICAgIHB1YmxpYyBpc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgIHB1YmxpYyBoYXNFcnJvciA9IGZhbHNlO1xyXG4gICAgcHVibGljIGVycm9yTWVzc2FnZSA9ICcnO1xyXG5cclxuICAgIHByaXZhdGUgY2FudmFzITogZmFicmljLkNhbnZhcztcclxuICAgIHByaXZhdGUgc3RhY2s6IGZhYnJpYy5PYmplY3RbXSA9IFtdO1xyXG5cclxuICAgIHB1YmxpYyBjb2xvcnNOYW1lOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgcHVibGljIGRyYXdpbmdTaXplc05hbWU6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSBpbWFnZVVzZWQ/OiBmYWJyaWMuSW1hZ2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEFzd0ltYWdlRHJhd2luZz4sXHJcbiAgICAgICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBjb250cm9sOiBhbnlcclxuICAgICkge1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5jb250cm9sLmNvbnRyb2xUeXBlID09PSAnc2lnbmF0dXJlJykge1xyXG4gICAgICAgICAgICB0aGlzLmVuYWJsZUxvYWRBbm90aGVySW1hZ2UgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zcmMgPSB0aGlzLmNvbnRyb2wuaW1hZ2VVcmw7XHJcbiAgICAgICAgdGhpcy5jb2xvcnNOYW1lID0gT2JqZWN0LmtleXModGhpcy5jb2xvcnMpO1xyXG4gICAgICAgIHRoaXMuZHJhd2luZ1NpemVzTmFtZSA9IE9iamVjdC5rZXlzKHRoaXMuZHJhd2luZ1NpemVzKTtcclxuICAgICAgICB0aGlzLmNhbnZhcyA9IG5ldyBmYWJyaWMuQ2FudmFzKCdhc3dDYW52YXMnLCB7XHJcbiAgICAgICAgICAgIGhvdmVyQ3Vyc29yOiAncG9pbnRlcicsXHJcbiAgICAgICAgICAgIGlzRHJhd2luZ01vZGU6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmNhbnZhcy5iYWNrZ3JvdW5kQ29sb3IgPSAnd2hpdGUnO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zcmMpIHtcclxuICAgICAgICAgICAgdGhpcy5pbXBvcnRQaG90b0Zyb21TcmModGhpcy5zcmMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy53aWR0aCB8fCAhdGhpcy5oZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gd2lkdGggb3IgaGlnaHQgZ2l2ZW4gIScpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5zZXRXaWR0aCh0aGlzLndpZHRoKTtcclxuICAgICAgICAgICAgdGhpcy5jYW52YXMuc2V0SGVpZ2h0KHRoaXMuaGVpZ2h0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2FudmFzLm9uKCdwYXRoOmNyZWF0ZWQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5zZXRVbmRvUmVkbygpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdFRvb2wodGhpcy5jdXJyZW50VG9vbCk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RDb2xvcih0aGlzLmN1cnJlbnRDb2xvcik7XHJcbiAgICAgICAgdGhpcy5zZWxlY3REcmF3aW5nU2l6ZSh0aGlzLmN1cnJlbnRTaXplKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUb29sc1xyXG4gICAgcHVibGljIHNlbGVjdFRvb2wodG9vbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VG9vbCA9IHRvb2w7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlbGVjdERyYXdpbmdTaXplKHNpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY3VycmVudFNpemUgPSBzaXplO1xyXG4gICAgICAgIGlmICh0aGlzLmNhbnZhcykge1xyXG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5mcmVlRHJhd2luZ0JydXNoLndpZHRoID0gc2l6ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNlbGVjdENvbG9yKGNvbG9yOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRDb2xvciA9IGNvbG9yO1xyXG4gICAgICAgIGlmICh0aGlzLmNhbnZhcykge1xyXG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5mcmVlRHJhd2luZ0JydXNoLmNvbG9yID0gdGhpcy5jb2xvcnNbY29sb3JdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBBY3Rpb25zXHJcblxyXG4gICAgcHVibGljIHVuZG8oKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuVW5kbykge1xyXG4gICAgICAgICAgICBjb25zdCBsYXN0SWQgPSB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCkubGVuZ3RoIC0gMTtcclxuICAgICAgICAgICAgY29uc3QgbGFzdE9iaiA9IHRoaXMuY2FudmFzLmdldE9iamVjdHMoKVtsYXN0SWRdO1xyXG4gICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2gobGFzdE9iaik7XHJcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnJlbW92ZShsYXN0T2JqKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRVbmRvUmVkbygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVkbygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5SZWRvKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0SW5TdGFjayA9IHRoaXMuc3RhY2suc3BsaWNlKC0xLCAxKVswXTtcclxuICAgICAgICAgICAgaWYgKGZpcnN0SW5TdGFjaykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYW52YXMuaW5zZXJ0QXQoZmlyc3RJblN0YWNrLCB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCkubGVuZ3RoIC0gMSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VW5kb1JlZG8oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNsZWFyQ2FudmFzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmNhbnZhcykge1xyXG4gICAgICAgICAgICB0aGlzLmNhbnZhcy5yZW1vdmUoLi4udGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRVbmRvUmVkbygpO1xyXG4gICAgICAgIH1cclxuI