go-captcha-angular
Version:
GoCaptcha for Angular, which implements click mode, slider mode, drag-drop mode and rotation mode.
112 lines • 22.6 kB
JavaScript
import { Component, Input, ViewEncapsulation } from '@angular/core';
import { defaultClickConfig, defaultData } from "./click-instance";
import { getDomXY, mergeTo } from "../../helper/helper";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../../icons/close-icon.component";
import * as i3 from "../../icons/refresh-icon.component";
import * as i4 from "../../icons/loading-icon.component";
export class ClickComponent {
constructor() {
this.localConfig = defaultClickConfig();
this.localData = defaultData();
this.localEvents = {};
this.dots = [];
}
set config(config) {
mergeTo(this.localConfig, config);
this.localConfig = config;
}
set data(data) {
mergeTo(this.localData, data);
this.localData = data;
}
set events(events) {
mergeTo(this.localEvents, events);
this.localEvents = events;
}
get hasDisplayWrapperState() {
return (this.localConfig.width || 0) > 0 || (this.localConfig.height || 0) > 0;
}
get hasDisplayImageState() {
return (this.localData.image && this.localData.image.length > 0) || (this.localData.thumb && this.localData.thumb.length > 0);
}
clickEvent(e) {
const dom = e.currentTarget;
const xy = getDomXY(dom);
const mouseX = e.pageX || e.clientX;
const mouseY = e.pageY || e.clientY;
const domX = xy.domX;
const domY = xy.domY;
const xPos = mouseX - domX;
const yPos = mouseY - domY;
const xx = parseInt(xPos.toString());
const yy = parseInt(yPos.toString());
const date = new Date();
const index = this.dots.length;
this.dots.push({ key: date.getTime(), index: index + 1, x: xx, y: yy });
this.localEvents.click && this.localEvents.click(xx, yy);
e.cancelBubble = true;
e.preventDefault();
return false;
}
confirmEvent(e) {
const dotsStr = JSON.stringify(this.dots);
let dots = [];
try {
dots = JSON.parse(dotsStr);
}
catch (e) {
console.warn("parse dots error", e);
}
this.localEvents.confirm && this.localEvents.confirm(dots, () => {
this.dots = [];
});
e.cancelBubble = true;
e.preventDefault();
return false;
}
closeEvent(e) {
this.close();
e.cancelBubble = true;
e.preventDefault();
return false;
}
refreshEvent(e) {
this.refresh();
e.cancelBubble = true;
e.preventDefault();
return false;
}
reset() {
this.dots = [];
}
clear() {
this.reset();
setTimeout(() => {
this.localData.image = '';
this.localData.thumb = '';
}, 0);
}
close() {
this.localEvents.close && this.localEvents.close();
this.reset();
}
refresh() {
this.localEvents.refresh && this.localEvents.refresh();
this.reset();
}
}
ClickComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ClickComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
ClickComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ClickComponent, selector: "go-captcha-click", inputs: { config: "config", data: "data", events: "events" }, ngImport: i0, template: "<div\n class=\"go-captcha gc-wrapper\"\n [class]=\"{'gc-theme': localConfig.showTheme}\"\n [style]=\"{\n width: (localConfig.width || 0) + ( localConfig.horizontalPadding * 2) + (localConfig.showTheme ? 2 : 0) + 'px',\n paddingLeft: localConfig.horizontalPadding + 'px',\n paddingRight: localConfig.horizontalPadding + 'px',\n paddingTop: localConfig.verticalPadding + 'px',\n paddingBottom: localConfig.verticalPadding + 'px',\n display: hasDisplayWrapperState ? 'block' : 'none'\n }\"\n >\n <div class=\"gc-header\">\n <span>{{ localConfig.title }}</span>\n <img\n [class]=\"{'gc-hide': localData.thumb == ''}\"\n [style]=\"{\n width: localConfig.thumbWidth + 'px',\n height: localConfig.thumbHeight + 'px'\n }\"\n [attr.src]=\"localData.thumb\"\n alt=\"\"\n />\n </div>\n <div\n class=\"gc-body\"\n [style]=\"{\n width: localConfig.width + 'px',\n height: localConfig.height + 'px',\n }\"\n >\n <div class=\"gc-loading\">\n <loading-icon></loading-icon>\n </div>\n <img\n class=\"gc-picture\"\n [class]=\"{'gc-hide': localData.image == ''}\"\n [style]=\"{\n width: localConfig.width + 'px',\n height: localConfig.height + 'px',\n display: hasDisplayImageState ? 'block' : 'none'\n }\"\n [attr.src]=\"localData.image\"\n alt=\"\"\n (click)=\"clickEvent($event)\"\n />\n <div class=\"gc-dots\">\n <div\n class=\"gc-dot\"\n *ngFor=\"let dot of dots;\"\n [style]=\"{\n top: (dot.y - 11) + 'px',\n left: (dot.x - 11) + 'px',\n }\"\n >{{dot.index}}</div>\n </div>\n </div>\n <div class=\"gc-footer\">\n <div class=\"gc-icon-block gc-icon-block2\">\n <close-icon\n [width]=\"localConfig.iconSize\"\n [height]=\"localConfig.iconSize\"\n (click)=\"closeEvent($event)\"\n ></close-icon>\n <refresh-icon\n [width]=\"localConfig.iconSize\"\n [height]=\"localConfig.iconSize\"\n (click)=\"refreshEvent($event)\"\n ></refresh-icon>\n </div>\n <div class=\"gc-button-block\">\n <button\n [class]=\"{'disabled': !hasDisplayImageState}\"\n (click)=\"confirmEvent($event)\"\n >{{ localConfig.buttonText }}</button>\n </div>\n </div>\n</div>", styles: [".gc-icon-block2{flex:1}.gc-dots{position:absolute;inset:0}.gc-dots .gc-dot{position:absolute;z-index:2;width:22px;height:22px;color:var(--go-captcha-theme-dot-color);background:var(--go-captcha-theme-dot-bg-color);border:3px solid #f7f9fb;border-color:var(--go-captcha-theme-dot-border-color);display:flex;align-items:center;justify-content:center;border-radius:20px;cursor:default}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i2.CloseIconComponent, selector: "close-icon", inputs: ["width", "height"] }, { kind: "component", type: i3.RefreshIconComponent, selector: "refresh-icon", inputs: ["width", "height"] }, { kind: "component", type: i4.LoadingIconComponent, selector: "loading-icon", inputs: ["width", "height"] }], encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ClickComponent, decorators: [{
type: Component,
args: [{ selector: 'go-captcha-click', encapsulation: ViewEncapsulation.None, template: "<div\n class=\"go-captcha gc-wrapper\"\n [class]=\"{'gc-theme': localConfig.showTheme}\"\n [style]=\"{\n width: (localConfig.width || 0) + ( localConfig.horizontalPadding * 2) + (localConfig.showTheme ? 2 : 0) + 'px',\n paddingLeft: localConfig.horizontalPadding + 'px',\n paddingRight: localConfig.horizontalPadding + 'px',\n paddingTop: localConfig.verticalPadding + 'px',\n paddingBottom: localConfig.verticalPadding + 'px',\n display: hasDisplayWrapperState ? 'block' : 'none'\n }\"\n >\n <div class=\"gc-header\">\n <span>{{ localConfig.title }}</span>\n <img\n [class]=\"{'gc-hide': localData.thumb == ''}\"\n [style]=\"{\n width: localConfig.thumbWidth + 'px',\n height: localConfig.thumbHeight + 'px'\n }\"\n [attr.src]=\"localData.thumb\"\n alt=\"\"\n />\n </div>\n <div\n class=\"gc-body\"\n [style]=\"{\n width: localConfig.width + 'px',\n height: localConfig.height + 'px',\n }\"\n >\n <div class=\"gc-loading\">\n <loading-icon></loading-icon>\n </div>\n <img\n class=\"gc-picture\"\n [class]=\"{'gc-hide': localData.image == ''}\"\n [style]=\"{\n width: localConfig.width + 'px',\n height: localConfig.height + 'px',\n display: hasDisplayImageState ? 'block' : 'none'\n }\"\n [attr.src]=\"localData.image\"\n alt=\"\"\n (click)=\"clickEvent($event)\"\n />\n <div class=\"gc-dots\">\n <div\n class=\"gc-dot\"\n *ngFor=\"let dot of dots;\"\n [style]=\"{\n top: (dot.y - 11) + 'px',\n left: (dot.x - 11) + 'px',\n }\"\n >{{dot.index}}</div>\n </div>\n </div>\n <div class=\"gc-footer\">\n <div class=\"gc-icon-block gc-icon-block2\">\n <close-icon\n [width]=\"localConfig.iconSize\"\n [height]=\"localConfig.iconSize\"\n (click)=\"closeEvent($event)\"\n ></close-icon>\n <refresh-icon\n [width]=\"localConfig.iconSize\"\n [height]=\"localConfig.iconSize\"\n (click)=\"refreshEvent($event)\"\n ></refresh-icon>\n </div>\n <div class=\"gc-button-block\">\n <button\n [class]=\"{'disabled': !hasDisplayImageState}\"\n (click)=\"confirmEvent($event)\"\n >{{ localConfig.buttonText }}</button>\n </div>\n </div>\n</div>", styles: [".gc-icon-block2{flex:1}.gc-dots{position:absolute;inset:0}.gc-dots .gc-dot{position:absolute;z-index:2;width:22px;height:22px;color:var(--go-captcha-theme-dot-color);background:var(--go-captcha-theme-dot-bg-color);border:3px solid #f7f9fb;border-color:var(--go-captcha-theme-dot-border-color);display:flex;align-items:center;justify-content:center;border-radius:20px;cursor:default}\n"] }]
}], propDecorators: { config: [{
type: Input
}], data: [{
type: Input
}], events: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpY2suY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ28tY2FwdGNoYS1hbmd1bGFyL3NyYy9saWIvbW9kdWxlcy9jbGljay9jbGljay5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nby1jYXB0Y2hhLWFuZ3VsYXIvc3JjL2xpYi9tb2R1bGVzL2NsaWNrL2NsaWNrLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZUFBZSxDQUFBO0FBQ2pFLE9BQU8sRUFBK0Msa0JBQWtCLEVBQUUsV0FBVyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0csT0FBTyxFQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7O0FBUXRELE1BQU0sT0FBTyxjQUFjO0lBTjNCO1FBT0ksZ0JBQVcsR0FBaUIsa0JBQWtCLEVBQUUsQ0FBQTtRQUNoRCxjQUFTLEdBQWMsV0FBVyxFQUFlLENBQUE7UUFDakQsZ0JBQVcsR0FBZ0IsRUFBRSxDQUFBO1FBRTdCLFNBQUksR0FBb0IsRUFBRSxDQUFBO0tBMEc3QjtJQXhHRyxJQUNJLE1BQU0sQ0FBQyxNQUFtQjtRQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQTtJQUM3QixDQUFDO0lBRUQsSUFDSSxJQUFJLENBQUMsSUFBZTtRQUNwQixPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQTtJQUN6QixDQUFDO0lBRUQsSUFDSSxNQUFNLENBQUMsTUFBa0I7UUFDekIsT0FBTyxDQUFDLElBQUksQ0FB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QUM7OzRHQTlHUSxjQUFjO2dHQUFkLGNBQWMsc0hDVjNCLHN6RUE2RU07NEZEbkVPLGNBQWM7a0JBTjFCLFNBQVM7K0JBQ0ksa0JBQWtCLGlCQUdiLGlCQUFpQixDQUFDLElBQUk7OEJBVWpDLE1BQU07c0JBRFQsS0FBSztnQkFPRixJQUFJO3NCQURQLEtBQUs7Z0JBT0YsTUFBTTtzQkFEVCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIElucHV0LCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7Q2xpY2tDb25maWcsIENsaWNrRGF0YSwgQ2xpY2tEb3QsIENsaWNrRXZlbnQsIGRlZmF1bHRDbGlja0NvbmZpZywgZGVmYXVsdERhdGF9IGZyb20gXCIuL2NsaWNrLWluc3RhbmNlXCI7XG5pbXBvcnQge2dldERvbVhZLCBtZXJnZVRvfSBmcm9tIFwiLi4vLi4vaGVscGVyL2hlbHBlclwiO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2dvLWNhcHRjaGEtY2xpY2snLFxuICAgIHRlbXBsYXRlVXJsOiAnY2xpY2suY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydjbGljay5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIENsaWNrQ29tcG9uZW50IHtcbiAgICBsb2NhbENvbmZpZz86IENsaWNrQ29uZmlnID0gZGVmYXVsdENsaWNrQ29uZmlnKClcbiAgICBsb2NhbERhdGE6IENsaWNrRGF0YSA9IGRlZmF1bHREYXRhKCkgYXMgQ2xpY2tEYXRhXG4gICAgbG9jYWxFdmVudHM/OiBDbGlja0V2ZW50ID0ge31cblxuICAgIGRvdHM6IEFycmF5PENsaWNrRG90PiA9IFtdXG5cbiAgICBASW5wdXQoKVxuICAgIHNldCBjb25maWcoY29uZmlnOiBDbGlja0NvbmZpZykge1xuICAgICAgICBtZXJnZVRvKHRoaXMubG9jYWxDb25maWcsIGNvbmZpZylcbiAgICAgICAgdGhpcy5sb2NhbENvbmZpZyA9IGNvbmZpZ1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgc2V0IGRhdGEoZGF0YTogQ2xpY2tEYXRhKSB7XG4gICAgICAgIG1lcmdlVG8odGhpcy5sb2NhbERhdGEsIGRhdGEpXG4gICAgICAgIHRoaXMubG9jYWxEYXRhID0gZGF0YVxuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgc2V0IGV2ZW50cyhldmVudHM6IENsaWNrRXZlbnQpIHtcbiAgICAgICAgbWVyZ2VUbyh0aGlzLmxvY2FsRXZlbnRzLCBldmVudHMpXG4gICAgICAgIHRoaXMubG9jYWxFdmVudHMgPSBldmVudHNcbiAgICB9XG5cbiAgICBnZXQgaGFzRGlzcGxheVdyYXBwZXJTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmxvY2FsQ29uZmlnLndpZHRoIHx8IDApID4gMCB8fCAodGhpcy5sb2NhbENvbmZpZy5oZWlnaHQgfHwgMCkgPiAwXG4gICAgfVxuXG4gICAgZ2V0IGhhc0Rpc3BsYXlJbWFnZVN0YXRlKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMubG9jYWxEYXRhLmltYWdlICYmIHRoaXMubG9jYWxEYXRhLmltYWdlLmxlbmd0aCA+IDApIHx8ICh0aGlzLmxvY2FsRGF0YS50aHVtYiAmJiB0aGlzLmxvY2FsRGF0YS50aHVtYi5sZW5ndGggPiAwKVxuICAgIH1cblxuICAgIGNsaWNrRXZlbnQoZTogRXZlbnR8YW55KXtcbiAgICAgICAgY29uc3QgZG9tID0gZS5jdXJyZW50VGFyZ2V0XG4gICAgICAgIGNvbnN0IHh5ID0gZ2V0RG9tWFkoZG9tKVxuXG4gICAgICAgIGNvbnN0IG1vdXNlWCA9IGUucGFnZVggfHwgZS5jbGllbnRYXG4gICAgICAgIGNvbnN0IG1vdXNlWSA9IGUucGFnZVkgfHwgZS5jbGllbnRZXG5cbiAgICAgICAgY29uc3QgZG9tWCA9IHh5LmRvbVhcbiAgICAgICAgY29uc3QgZG9tWSA9IHh5LmRvbVlcblxuICAgICAgICBjb25zdCB4UG9zID0gbW91c2VYIC0gZG9tWDtcbiAgICAgICAgY29uc3QgeVBvcyA9IG1vdXNlWSAtIGRvbVk7XG5cbiAgICAgICAgY29uc3QgeHggPSBwYXJzZUludCh4UG9zLnRvU3RyaW5nKCkpXG4gICAgICAgIGNvbnN0IHl5ID0gcGFyc2VJbnQoeVBvcy50b1N0cmluZygpKVxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKVxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZG90cy5sZW5ndGhcblxuICAgICAgICB0aGlzLmRvdHMucHVzaCh7a2V5OiBkYXRlLmdldFRpbWUoKSwgaW5kZXg6IGluZGV4ICsgMSwgeDogeHgsIHk6IHl5fSlcblxuICAgICAgICB0aGlzLmxvY2FsRXZlbnRzLmNsaWNrICYmIHRoaXMubG9jYWxFdmVudHMuY2xpY2soeHgsIHl5KVxuICAgICAgICBlLmNhbmNlbEJ1YmJsZSA9IHRydWVcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNvbmZpcm1FdmVudChlOiBFdmVudHxhbnkpIHtcbiAgICAgICAgY29uc3QgZG90c1N0ciA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZG90cylcbiAgICAgICAgbGV0IGRvdHM6IEFycmF5PENsaWNrRG90PiA9IFtdXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkb3RzID0gSlNPTi5wYXJzZShkb3RzU3RyKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJwYXJzZSBkb3RzIGVycm9yXCIsIGUpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvY2FsRXZlbnRzLmNvbmZpcm0gJiYgdGhpcy5sb2NhbEV2ZW50cy5jb25maXJtKGRvdHMsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZG90cyA9IFtdXG4gICAgICAgIH0pXG4gICAgICAgIGUuY2FuY2VsQnViYmxlID0gdHJ1ZVxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgY2xvc2VFdmVudChlOiBFdmVudHxhbnkpe1xuICAgICAgICB0aGlzLmNsb3NlKClcbiAgICAgICAgZS5jYW5jZWxCdWJibGUgPSB0cnVlXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZWZyZXNoRXZlbnQoZTogRXZlbnR8YW55KSB7XG4gICAgICAgIHRoaXMucmVmcmVzaCgpXG4gICAgICAgIGUuY2FuY2VsQnViYmxlID0gdHJ1ZVxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmVzZXQoKXtcbiAgICAgICAgdGhpcy5kb3RzID0gW11cbiAgICB9XG5cbiAgICBjbGVhcigpe1xuICAgICAgICB0aGlzLnJlc2V0KClcbiAgICAgICAgc2V0VGltZW91dCgoKT0+IHtcbiAgICAgICAgICAgIHRoaXMubG9jYWxEYXRhLmltYWdlID0gJydcbiAgICAgICAgICAgIHRoaXMubG9jYWxEYXRhLnRodW1iID0gJydcbiAgICAgICAgfSwgMClcbiAgICB9XG5cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5sb2NhbEV2ZW50cy5jbG9zZSAmJiB0aGlzLmxvY2FsRXZlbnRzLmNsb3NlKClcbiAgICAgICAgdGhpcy5yZXNldCgpXG4gICAgfVxuXG4gICAgcmVmcmVzaCgpIHtcbiAgICAgICAgdGhpcy5sb2NhbEV2ZW50cy5yZWZyZXNoICYmIHRoaXMubG9jYWxFdmVudHMucmVmcmVzaCgpXG4gICAgICAgIHRoaXMucmVzZXQoKVxuICAgIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJnby1jYXB0Y2hhIGdjLXdyYXBwZXJcIlxuICBbY2xhc3NdPVwieydnYy10aGVtZSc6IGxvY2FsQ29uZmlnLnNob3dUaGVtZX1cIlxuICBbc3R5bGVdPVwie1xuICAgIHdpZHRoOiAgKGxvY2FsQ29uZmlnLndpZHRoIHx8IDApICsgKCBsb2NhbENvbmZpZy5ob3Jpem9udGFsUGFkZGluZyAqIDIpICsgKGxvY2FsQ29uZmlnLnNob3dUaGVtZSA/IDIgOiAwKSArICdweCcsXG4gICAgcGFkZGluZ0xlZnQ6IGxvY2FsQ29uZmlnLmhvcml6b250YWxQYWRkaW5nICsgJ3B4JyxcbiAgICBwYWRkaW5nUmlnaHQ6IGxvY2FsQ29uZmlnLmhvcml6b250YWxQYWRkaW5nICsgJ3B4JyxcbiAgICBwYWRkaW5nVG9wOiBsb2NhbENvbmZpZy52ZXJ0aWNhbFBhZGRpbmcgKyAncHgnLFxuICAgIHBhZGRpbmdCb3R0b206IGxvY2FsQ29uZmlnLnZlcnRpY2FsUGFkZGluZyArICdweCcsXG4gICAgZGlzcGxheTogaGFzRGlzcGxheVdyYXBwZXJTdGF0ZSA/ICdibG9jaycgOiAnbm9uZSdcbiAgfVwiXG4gID5cbiAgPGRpdiBjbGFzcz1cImdjLWhlYWRlclwiPlxuICAgIDxzcGFuPnt7IGxvY2FsQ29uZmlnLnRpdGxlIH19PC9zcGFuPlxuICAgIDxpbWdcbiAgICAgIFtjbGFzc109XCJ7J2djLWhpZGUnOiBsb2NhbERhdGEudGh1bWIgPT0gJyd9XCJcbiAgICAgIFtzdHlsZV09XCJ7XG4gICAgICAgIHdpZHRoOiBsb2NhbENvbmZpZy50aHVtYldpZHRoICsgJ3B4JyxcbiAgICAgICAgaGVpZ2h0OiBsb2NhbENvbmZpZy50aHVtYkhlaWdodCArICdweCdcbiAgICAgIH1cIlxuICAgICAgW2F0dHIuc3JjXT1cImxvY2FsRGF0YS50aHVtYlwiXG4gICAgICBhbHQ9XCJcIlxuICAgIC8+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJnYy1ib2R5XCJcbiAgICBbc3R5bGVdPVwie1xuICAgICAgd2lkdGg6IGxvY2FsQ29uZmlnLndpZHRoICsgJ3B4JyxcbiAgICAgIGhlaWdodDogbG9jYWxDb25maWcuaGVpZ2h0ICsgJ3B4JyxcbiAgICB9XCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJnYy1sb2FkaW5nXCI+XG4gICAgICA8bG9hZGluZy1pY29uPjwvbG9hZGluZy1pY29uPlxuICAgIDwvZGl2PlxuICAgIDxpbWdcbiAgICAgIGNsYXNzPVwiZ2MtcGljdHVyZVwiXG4gICAgICBbY2xhc3NdPVwieydnYy1oaWRlJzogbG9jYWxEYXRhLmltYWdlID09ICcnfVwiXG4gICAgICBbc3R5bGVdPVwie1xuICAgICAgICB3aWR0aDogbG9jYWxDb25maWcud2lkdGggKyAncHgnLFxuICAgICAgICBoZWlnaHQ6IGxvY2FsQ29uZmlnLmhlaWdodCArICdweCcsXG4gICAgICAgIGRpc3BsYXk6IGhhc0Rpc3BsYXlJbWFnZVN0YXRlID8gJ2Jsb2NrJyA6ICdub25lJ1xuICAgICAgfVwiXG4gICAgICBbYXR0ci5zcmNdPVwibG9jYWxEYXRhLmltYWdlXCJcbiAgICAgIGFsdD1cIlwiXG4gICAgICAoY2xpY2spPVwiY2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAvPlxuICAgIDxkaXYgY2xhc3M9XCJnYy1kb3RzXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZ2MtZG90XCJcbiAgICAgICAgKm5nRm9yPVwibGV0IGRvdCBvZiBkb3RzO1wiXG4gICAgICAgIFtzdHlsZV09XCJ7XG4gICAgICAgICAgdG9wOiAoZG90LnkgLSAxMSkgKyAncHgnLFxuICAgICAgICAgIGxlZnQ6IChkb3QueCAtIDExKSArICdweCcsXG4gICAgICAgIH1cIlxuICAgICAgPnt7ZG90LmluZGV4fX08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJnYy1mb290ZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZ2MtaWNvbi1ibG9jayBnYy1pY29uLWJsb2NrMlwiPlxuICAgICAgPGNsb3NlLWljb25cbiAgICAgICAgW3dpZHRoXT1cImxvY2FsQ29uZmlnLmljb25TaXplXCJcbiAgICAgICAgW2hlaWdodF09XCJsb2NhbENvbmZpZy5pY29uU2l6ZVwiXG4gICAgICAgIChjbGljayk9XCJjbG9zZUV2ZW50KCRldmVudClcIlxuICAgICAgPjwvY2xvc2UtaWNvbj5cbiAgICAgIDxyZWZyZXNoLWljb25cbiAgICAgICAgW3dpZHRoXT1cImxvY2FsQ29uZmlnLmljb25TaXplXCJcbiAgICAgICAgW2hlaWdodF09XCJsb2NhbENvbmZpZy5pY29uU2l6ZVwiXG4gICAgICAgIChjbGljayk9XCJyZWZyZXNoRXZlbnQoJGV2ZW50KVwiXG4gICAgICA+PC9yZWZyZXNoLWljb24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImdjLWJ1dHRvbi1ibG9ja1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBbY2xhc3NdPVwieydkaXNhYmxlZCc6ICFoYXNEaXNwbGF5SW1hZ2VTdGF0ZX1cIlxuICAgICAgICAoY2xpY2spPVwiY29uZmlybUV2ZW50KCRldmVudClcIlxuICAgICAgPnt7IGxvY2FsQ29uZmlnLmJ1dHRvblRleHQgfX08L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=