stimulsoft-forms
Version:
Stimulsoft PDF Forms
284 lines • 28.4 kB
JavaScript
import { Component, EventEmitter, Input, Output } from "@angular/core";
import * as i0 from "@angular/core";
import * as i1 from "../../services/model.service";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
import * as i4 from "../sti-editable-content.component";
import * as i5 from "../sti-tooltip/sti-tooltip.directive";
export class StiSvgRadiobuttonComponent {
constructor(model) {
this.model = model;
this.useCustomOption = false;
this.buttonClick = new EventEmitter();
this.isCurrentOption = false;
}
get selected() {
return this.model.selectedComponent?.element == this.element;
}
get isMozila() {
return this.model.getBrowserType() == "firefox" ? true : false;
}
get isSafari() {
return this.model.getBrowserType() == "safari" ? true : false;
}
get backColor() {
return this.element.backgroundColor.toHtmlColor();
}
get checkColor() {
return this.element.checkColor.toHtmlColor();
}
get borderColor() {
return this.element.borderColor.toHtmlColor();
}
get textStyle() {
return this.element?.htmlStyle();
}
disableDrag(event) {
this.model.canDrag = false;
}
changeState() {
this.buttonClick.emit();
}
get needToFill() {
return this.element.required && !this.element.value && this.model.hasEmptyReuiredFields;
}
getContent(innerText) {
if (this.isCurrentOption) {
this.element.selectedOption = innerText;
}
this.element["customOptionText"] = innerText;
this.model.formEvents.next({ name: "ValueChanged" });
}
getCharCode(event) {
return null === event.which ? event.keyCode : !(0 === event.which || 0 === event.charCode) ? event.which : -1;
}
checkOption() {
if (this.element.selectedOption == this.element.customOptionText) {
this.isCurrentOption = true;
}
}
disableEnter(event) {
if (13 === this.getCharCode(event))
event.preventDefault();
}
ngOnInit() { }
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiSvgRadiobuttonComponent, deps: [{ token: i1.StiModelService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: StiSvgRadiobuttonComponent, selector: "sti-svg-radiobutton-component", inputs: { element: "element", id: "id", text: "text", state: "state", useCustomOption: "useCustomOption", tabIndex: "tabIndex" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: `
<div
class="custom-radio"
*ngIf="!useCustomOption"
(mousedown)="disableDrag($event)"
(mouseup)="this.model.canDrag = true"
>
<input
type="radio"
name="radio +{{ element.name }}"
id="{{ id }}"
value=""
[]="tabIndex"
[]="element?.readOnly ? true : false"
[]="element?.required"
[]="element?.tooltip"
(click)="changeState()"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none">
<circle
class="box"
cx="6"
cy="6"
r="5.5"
[]="backColor"
[]="needToFill ? 'red' : borderColor"
/>
<circle *ngIf="state" class="check" cx="6" cy="6" r="2.5" [attr.fill]="checkColor" />
</svg>
<sti-editable-content-component
[]="'flex'"
[]="'5px'"
[]="'hidden'"
[]="'calc(100% - 17px)'"
[]="element"
[]="text"
[]="false"
[]="selected"
></sti-editable-content-component>
</div>
<div
class="custom-radio other"
*ngIf="useCustomOption"
[]="'100%'"
[]="'center'"
(mousedown)="disableDrag($event)"
(mouseup)="this.model.canDrag = true"
>
<input
type="radio"
name="radio +{{ element.name }}"
id="{{ id }}"
value=""
[]="element?.readOnly ? true : false"
[]="element?.required"
[]="element?.tooltip"
(mousedown)="changeState()"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none">
<circle class="box" cx="6" cy="6" r="5.5" [attr.fill]="backColor" [attr.stroke]="borderColor" />
<circle *ngIf="state" class="check" cx="6" cy="6" r="2.5" [attr.fill]="checkColor" />
</svg>
<div class="other-option-container" [style.maxWidth]="'calc(100% - 17px)'" [style]="textStyle">
<span *ngIf="element?.prefix?.length > 0">
{{ element?.prefix }}
</span>
<input
type="text"
[]="backColor"
[]="borderColor"
[]="'100%'"
[]="text"
[]="-1"
(input)="getContent($event.target.value)"
[]="textStyle"
(focus)="checkOption()"
(blur)="isCurrentOption = false"
/>
<span *ngIf="element?.suffix?.length > 0" [style.margin-left.px]="3">
{{ element?.suffix }}
</span>
</div>
<!-- <span
for="{{ id }}"
[]="true"
[]="1"
class="custom-option"
[]="text"
[]="backColor"
[]="borderColor"
[]="isSafari ? 'text' : ''"
(input)="!isMozila && !isSafari ? getContent($event.target.textContent) : ''"
(blur)="isMozila || isSafari ? getContent($event.target.textContent) : ''"
(keyup.enter)="isMozila || isSafari ? getContent($event.target.textContent) : ''"
(keypress)="disableEnter($event)"
[]="textStyle"
>{{ text }}</span
> -->
</div>
`, isInline: true, styles: [".other-option-container{display:flex}.other-option-container span{align-self:center}input[type=radio]:hover+svg .box{stroke:#a3bde3!important;fill:#f3f9ff!important}input[type=radio]:active+svg .box{stroke:#3c77dd!important;fill:#d9ecff!important}input[type=radio]:disabled+svg .box{stroke:#bcbcbc!important;fill:#e6e6e6!important}input[type=text]{margin-left:5px;width:100%;outline:none;border:1px solid lightgray;padding:3px 5px}label,span{margin-left:5px}.box:hover:{stroke:#a3bde3!important}.custom-radio{width:100%;position:relative;align-items:center;display:flex}.custom-radio input[type=radio],.other input[type=radio]{position:absolute;width:14px;z-index:10;opacity:0;margin:0}.custom-option{border:1px solid lightgray;padding:3px 5px;z-index:11;white-space:nowrap;outline:none;overflow:hidden;scroll-behavior:smooth}.custom-option:hover{border-color:#a3bde3;cursor:text}.custom-option:focus{border-color:#a3bde3}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.StiEditableContentComponent, selector: "sti-editable-content-component", inputs: ["editableContent", "displayContent", "required", "eParent", "hideEmpty", "active", "alignment", "isTableTotalHeader", "disablePadding", "fromButton", "parentCursor", "isTableHeader"] }, { kind: "directive", type: i5.StiTooltipDirective, selector: "[stiTooltip]", inputs: ["tooltipPosition", "stiTooltip", "showDelay"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiSvgRadiobuttonComponent, decorators: [{
type: Component,
args: [{ selector: "sti-svg-radiobutton-component", template: `
<div
class="custom-radio"
*ngIf="!useCustomOption"
(mousedown)="disableDrag($event)"
(mouseup)="this.model.canDrag = true"
>
<input
type="radio"
name="radio +{{ element.name }}"
id="{{ id }}"
value=""
[]="tabIndex"
[]="element?.readOnly ? true : false"
[]="element?.required"
[]="element?.tooltip"
(click)="changeState()"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none">
<circle
class="box"
cx="6"
cy="6"
r="5.5"
[]="backColor"
[]="needToFill ? 'red' : borderColor"
/>
<circle *ngIf="state" class="check" cx="6" cy="6" r="2.5" [attr.fill]="checkColor" />
</svg>
<sti-editable-content-component
[]="'flex'"
[]="'5px'"
[]="'hidden'"
[]="'calc(100% - 17px)'"
[]="element"
[]="text"
[]="false"
[]="selected"
></sti-editable-content-component>
</div>
<div
class="custom-radio other"
*ngIf="useCustomOption"
[]="'100%'"
[]="'center'"
(mousedown)="disableDrag($event)"
(mouseup)="this.model.canDrag = true"
>
<input
type="radio"
name="radio +{{ element.name }}"
id="{{ id }}"
value=""
[]="element?.readOnly ? true : false"
[]="element?.required"
[]="element?.tooltip"
(mousedown)="changeState()"
/>
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none">
<circle class="box" cx="6" cy="6" r="5.5" [attr.fill]="backColor" [attr.stroke]="borderColor" />
<circle *ngIf="state" class="check" cx="6" cy="6" r="2.5" [attr.fill]="checkColor" />
</svg>
<div class="other-option-container" [style.maxWidth]="'calc(100% - 17px)'" [style]="textStyle">
<span *ngIf="element?.prefix?.length > 0">
{{ element?.prefix }}
</span>
<input
type="text"
[]="backColor"
[]="borderColor"
[]="'100%'"
[]="text"
[]="-1"
(input)="getContent($event.target.value)"
[]="textStyle"
(focus)="checkOption()"
(blur)="isCurrentOption = false"
/>
<span *ngIf="element?.suffix?.length > 0" [style.margin-left.px]="3">
{{ element?.suffix }}
</span>
</div>
<!-- <span
for="{{ id }}"
[]="true"
[]="1"
class="custom-option"
[]="text"
[]="backColor"
[]="borderColor"
[]="isSafari ? 'text' : ''"
(input)="!isMozila && !isSafari ? getContent($event.target.textContent) : ''"
(blur)="isMozila || isSafari ? getContent($event.target.textContent) : ''"
(keyup.enter)="isMozila || isSafari ? getContent($event.target.textContent) : ''"
(keypress)="disableEnter($event)"
[]="textStyle"
>{{ text }}</span
> -->
</div>
`, styles: [".other-option-container{display:flex}.other-option-container span{align-self:center}input[type=radio]:hover+svg .box{stroke:#a3bde3!important;fill:#f3f9ff!important}input[type=radio]:active+svg .box{stroke:#3c77dd!important;fill:#d9ecff!important}input[type=radio]:disabled+svg .box{stroke:#bcbcbc!important;fill:#e6e6e6!important}input[type=text]{margin-left:5px;width:100%;outline:none;border:1px solid lightgray;padding:3px 5px}label,span{margin-left:5px}.box:hover:{stroke:#a3bde3!important}.custom-radio{width:100%;position:relative;align-items:center;display:flex}.custom-radio input[type=radio],.other input[type=radio]{position:absolute;width:14px;z-index:10;opacity:0;margin:0}.custom-option{border:1px solid lightgray;padding:3px 5px;z-index:11;white-space:nowrap;outline:none;overflow:hidden;scroll-behavior:smooth}.custom-option:hover{border-color:#a3bde3;cursor:text}.custom-option:focus{border-color:#a3bde3}\n"] }]
}], ctorParameters: () => [{ type: i1.StiModelService }], propDecorators: { element: [{
type: Input
}], id: [{
type: Input
}], text: [{
type: Input
}], state: [{
type: Input
}], useCustomOption: [{
type: Input
}], buttonClick: [{
type: Output
}], tabIndex: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ZnLnJhZGlvYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0aW11bHNvZnQtZm9ybXMvc3JjL2xpYi9jb21wb25lbnRzL3N2Zy5jb21wb25lbnRzL3N2Zy5yYWRpb2J1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQXVML0UsTUFBTSxPQUFPLDBCQUEwQjtJQVNyQyxZQUFtQixLQUFzQjtRQUF0QixVQUFLLEdBQUwsS0FBSyxDQUFpQjtRQUpoQyxvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNoQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFcEMsb0JBQWUsR0FBWSxLQUFLLENBQUM7SUFDSSxDQUFDO0lBRTdDLElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDL0QsQ0FBQztJQUNELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ2pFLENBQUM7SUFDRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNoRSxDQUFDO0lBQ0QsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBQ0QsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFDRCxXQUFXLENBQUMsS0FBSztRQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQztJQUMxRixDQUFDO0lBQ0QsVUFBVSxDQUFDLFNBQVM7UUFDbEIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsU0FBUyxDQUFDO1FBQzdDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFDRCxXQUFXLENBQUMsS0FBSztRQUNmLE9BQU8sSUFBSSxLQUFLLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoSCxDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2pFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBQ0QsWUFBWSxDQUFDLEtBQUs7UUFDaEIsSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFBRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDN0QsQ0FBQztJQUNELFFBQVEsS0FBVSxDQUFDOytHQTNEUiwwQkFBMEI7bUdBQTFCLDBCQUEwQixnUEFoTDNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtR1Q7OzRGQTZFVSwwQkFBMEI7a0JBbEx0QyxTQUFTOytCQUNFLCtCQUErQixZQUMvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUdUO29GQThFUSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNFLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgU3RpTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL21vZGVsLnNlcnZpY2VcIjtcclxuXHJcbmltcG9ydCB7IFN0aVNpbmdsZVNlbGVjdGlvbkVsZW1lbnQgfSBmcm9tIFwiLi4vLi4vZWxlbWVudHMvU3RpU2luZ2xlU2VsZWN0aW9uRWxlbWVudFwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwic3RpLXN2Zy1yYWRpb2J1dHRvbi1jb21wb25lbnRcIixcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImN1c3RvbS1yYWRpb1wiXHJcbiAgICAgICpuZ0lmPVwiIXVzZUN1c3RvbU9wdGlvblwiXHJcbiAgICAgIChtb3VzZWRvd24pPVwiZGlzYWJsZURyYWcoJGV2ZW50KVwiXHJcbiAgICAgIChtb3VzZXVwKT1cInRoaXMubW9kZWwuY2FuRHJhZyA9IHRydWVcIlxyXG4gICAgPlxyXG4gICAgICA8aW5wdXRcclxuICAgICAgICB0eXBlPVwicmFkaW9cIlxyXG4gICAgICAgIG5hbWU9XCJyYWRpbyAre3sgZWxlbWVudC5uYW1lIH19XCJcclxuICAgICAgICBpZD1cInt7IGlkIH19XCJcclxuICAgICAgICB2YWx1ZT1cIlwiXHJcbiAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4XCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiZWxlbWVudD8ucmVhZE9ubHkgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICAgIFtyZXF1aXJlZF09XCJlbGVtZW50Py5yZXF1aXJlZFwiXHJcbiAgICAgICAgW3N0aVRvb2x0aXBdPVwiZWxlbWVudD8udG9vbHRpcFwiXHJcbiAgICAgICAgKGNsaWNrKT1cImNoYW5nZVN0YXRlKClcIlxyXG4gICAgICAvPlxyXG4gICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICA8Y2lyY2xlXHJcbiAgICAgICAgICBjbGFzcz1cImJveFwiXHJcbiAgICAgICAgICBjeD1cIjZcIlxyXG4gICAgICAgICAgY3k9XCI2XCJcclxuICAgICAgICAgIHI9XCI1LjVcIlxyXG4gICAgICAgICAgW2F0dHIuZmlsbF09XCJiYWNrQ29sb3JcIlxyXG4gICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cIm5lZWRUb0ZpbGwgPyAncmVkJyA6IGJvcmRlckNvbG9yXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxjaXJjbGUgKm5nSWY9XCJzdGF0ZVwiIGNsYXNzPVwiY2hlY2tcIiBjeD1cIjZcIiBjeT1cIjZcIiByPVwiMi41XCIgW2F0dHIuZmlsbF09XCJjaGVja0NvbG9yXCIgLz5cclxuICAgICAgPC9zdmc+XHJcbiAgICAgIDxzdGktZWRpdGFibGUtY29udGVudC1jb21wb25lbnRcclxuICAgICAgICBbc3R5bGUuZGlzcGxheV09XCInZmxleCdcIlxyXG4gICAgICAgIFtzdHlsZS5tYXJnaW4tbGVmdF09XCInNXB4J1wiXHJcbiAgICAgICAgW3N0eWxlLm92ZXJmbG93XT1cIidoaWRkZW4nXCJcclxuICAgICAgICBbc3R5bGUubWF4V2lkdGhdPVwiJ2NhbGMoMTAwJSAtIDE3cHgpJ1wiXHJcbiAgICAgICAgW2VQYXJlbnRdPVwiZWxlbWVudFwiXHJcbiAgICAgICAgW2VkaXRhYmxlQ29udGVudF09XCJ0ZXh0XCJcclxuICAgICAgICBbaGlkZUVtcHR5XT1cImZhbHNlXCJcclxuICAgICAgICBbYWN0aXZlXT1cInNlbGVjdGVkXCJcclxuICAgICAgPjwvc3RpLWVkaXRhYmxlLWNvbnRlbnQtY29tcG9uZW50PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiY3VzdG9tLXJhZGlvIG90aGVyXCJcclxuICAgICAgKm5nSWY9XCJ1c2VDdXN0b21PcHRpb25cIlxyXG4gICAgICBbc3R5bGUud2lkdGhdPVwiJzEwMCUnXCJcclxuICAgICAgW3N0eWxlLmFsaWduLWl0ZW1zXT1cIidjZW50ZXInXCJcclxuICAgICAgKG1vdXNlZG93bik9XCJkaXNhYmxlRHJhZygkZXZlbnQpXCJcclxuICAgICAgKG1vdXNldXApPVwidGhpcy5tb2RlbC5jYW5EcmFnID0gdHJ1ZVwiXHJcbiAgICA+XHJcbiAgICAgIDxpbnB1dFxyXG4gICAgICAgIHR5cGU9XCJyYWRpb1wiXHJcbiAgICAgICAgbmFtZT1cInJhZGlvICt7eyBlbGVtZW50Lm5hbWUgfX1cIlxyXG4gICAgICAgIGlkPVwie3sgaWQgfX1cIlxyXG4gICAgICAgIHZhbHVlPVwiXCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwiZWxlbWVudD8ucmVhZE9ubHkgPyB0cnVlIDogZmFsc2VcIlxyXG4gICAgICAgIFtyZXF1aXJlZF09XCJlbGVtZW50Py5yZXF1aXJlZFwiXHJcbiAgICAgICAgW3N0aVRvb2x0aXBdPVwiZWxlbWVudD8udG9vbHRpcFwiXHJcbiAgICAgICAgKG1vdXNlZG93bik9XCJjaGFuZ2VTdGF0ZSgpXCJcclxuICAgICAgLz5cclxuICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgPGNpcmNsZSBjbGFzcz1cImJveFwiIGN4PVwiNlwiIGN5PVwiNlwiIHI9XCI1LjVcIiBbYXR0ci5maWxsXT1cImJhY2tDb2xvclwiIFthdHRyLnN0cm9rZV09XCJib3JkZXJDb2xvclwiIC8+XHJcbiAgICAgICAgPGNpcmNsZSAqbmdJZj1cInN0YXRlXCIgY2xhc3M9XCJjaGVja1wiIGN4PVwiNlwiIGN5PVwiNlwiIHI9XCIyLjVcIiBbYXR0ci5maWxsXT1cImNoZWNrQ29sb3JcIiAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgICAgPGRpdiBjbGFzcz1cIm90aGVyLW9wdGlvbi1jb250YWluZXJcIiBbc3R5bGUubWF4V2lkdGhdPVwiJ2NhbGMoMTAwJSAtIDE3cHgpJ1wiIFtzdHlsZV09XCJ0ZXh0U3R5bGVcIj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImVsZW1lbnQ/LnByZWZpeD8ubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAge3sgZWxlbWVudD8ucHJlZml4IH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYmFja0NvbG9yXCJcclxuICAgICAgICAgIFtzdHlsZS5ib3JkZXItY29sb3JdPVwiYm9yZGVyQ29sb3JcIlxyXG4gICAgICAgICAgW3N0eWxlLm1heFdpZHRoXT1cIicxMDAlJ1wiXHJcbiAgICAgICAgICBbbmdNb2RlbF09XCJ0ZXh0XCJcclxuICAgICAgICAgIFt0YWJJbmRleF09XCItMVwiXHJcbiAgICAgICAgICAoaW5wdXQpPVwiZ2V0Q29udGVudCgkZXZlbnQudGFyZ2V0LnZhbHVlKVwiXHJcbiAgICAgICAgICBbc3R5bGVdPVwidGV4dFN0eWxlXCJcclxuICAgICAgICAgIChmb2N1cyk9XCJjaGVja09wdGlvbigpXCJcclxuICAgICAgICAgIChibHVyKT1cImlzQ3VycmVudE9wdGlvbiA9IGZhbHNlXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiZWxlbWVudD8uc3VmZml4Py5sZW5ndGggPiAwXCIgW3N0eWxlLm1hcmdpbi1sZWZ0LnB4XT1cIjNcIj5cclxuICAgICAgICAgIHt7IGVsZW1lbnQ/LnN1ZmZpeCB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwhLS0gPHNwYW5cclxuICAgICAgICBmb3I9XCJ7eyBpZCB9fVwiXHJcbiAgICAgICAgW2F0dHIuY29udGVudGVkaXRhYmxlXT1cInRydWVcIlxyXG4gICAgICAgIFtzdHlsZS5mbGV4XT1cIjFcIlxyXG4gICAgICAgIGNsYXNzPVwiY3VzdG9tLW9wdGlvblwiXHJcbiAgICAgICAgW3RleHRDb250ZW50XT1cInRleHRcIlxyXG4gICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImJhY2tDb2xvclwiXHJcbiAgICAgICAgW3N0eWxlLmJvcmRlci1jb2xvcl09XCJib3JkZXJDb2xvclwiXHJcbiAgICAgICAgW3N0eWxlLi13ZWJraXQtdXNlci1zZWxlY3RdPVwiaXNTYWZhcmkgPyAndGV4dCcgOiAnJ1wiXHJcbiAgICAgICAgKGlucHV0KT1cIiFpc01vemlsYSAmJiAhaXNTYWZhcmkgPyBnZXRDb250ZW50KCRldmVudC50YXJnZXQudGV4dENvbnRlbnQpIDogJydcIlxyXG4gICAgICAgIChibHVyKT1cImlzTW96aWxhIHx8IGlzU2FmYXJpID8gZ2V0Q29udGVudCgkZXZlbnQudGFyZ2V0LnRleHRDb250ZW50KSA6ICcnXCJcclxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwiaXNNb3ppbGEgfHwgaXNTYWZhcmkgPyBnZXRDb250ZW50KCRldmVudC50YXJnZXQudGV4dENvbnRlbnQpIDogJydcIlxyXG4gICAgICAgIChrZXlwcmVzcyk9XCJkaXNhYmxlRW50ZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgW3N0eWxlXT1cInRleHRTdHlsZVwiXHJcbiAgICAgICAgPnt7IHRleHQgfX08L3NwYW5cclxuICAgICAgPiAtLT5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbXHJcbiAgICBgXHJcbiAgICAgIC5vdGhlci1vcHRpb24tY29udGFpbmVyIHtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICB9XHJcbiAgICAgIC5vdGhlci1vcHRpb24tY29udGFpbmVyIHNwYW4ge1xyXG4gICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjtcclxuICAgICAgfVxyXG4gICAgICBpbnB1dFt0eXBlPVwicmFkaW9cIl06aG92ZXIgKyBzdmcgLmJveCB7XHJcbiAgICAgICAgc3Ryb2tlOiByZ2IoMTYzLCAxODksIDIyNykgIWltcG9ydGFudDtcclxuICAgICAgICBmaWxsOiByZ2IoMjQzLCAyNDksIDI1NSkgIWltcG9ydGFudDtcclxuICAgICAgfVxyXG4gICAgICBpbnB1dFt0eXBlPVwicmFkaW9cIl06YWN0aXZlICsgc3ZnIC5ib3gge1xyXG4gICAgICAgIHN0cm9rZTogcmdiKDYwLCAxMTksIDIyMSkgIWltcG9ydGFudDtcclxuICAgICAgICBmaWxsOiByZ2IoMjE3LCAyMzYsIDI1NSkgIWltcG9ydGFudDtcclxuICAgICAgfVxyXG4gICAgICBpbnB1dFt0eXBlPVwicmFkaW9cIl06ZGlzYWJsZWQgKyBzdmcgLmJveCB7XHJcbiAgICAgICAgc3Ryb2tlOiByZ2IoMTg4LCAxODgsIDE4OCkgIWltcG9ydGFudDtcclxuICAgICAgICBmaWxsOiByZ2IoMjMwLCAyMzAsIDIzMCkgIWltcG9ydGFudDtcclxuICAgICAgfVxyXG4gICAgICBpbnB1dFt0eXBlPVwidGV4dFwiXSB7XHJcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBvdXRsaW5lOiBub25lO1xyXG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JheTtcclxuICAgICAgICBwYWRkaW5nOiAzcHggNXB4O1xyXG4gICAgICB9XHJcbiAgICAgIGxhYmVsIHtcclxuICAgICAgICBtYXJnaW4tbGVmdDogNXB4O1xyXG4gICAgICB9XHJcbiAgICAgIHNwYW4ge1xyXG4gICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC5ib3g6aG92ZXI6IHtcclxuICAgICAgICBzdHJva2U6IHJnYigxNjMsIDE4OSwgMjI3KSAhaW1wb3J0YW50O1xyXG4gICAgICB9XHJcbiAgICAgIC5jdXN0b20tcmFkaW8ge1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIH1cclxuICAgICAgLmN1c3RvbS1yYWRpbyBpbnB1dFt0eXBlPVwicmFkaW9cIl0ge1xyXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgICB3aWR0aDogMTRweDtcclxuICAgICAgICB6LWluZGV4OiAxMDtcclxuICAgICAgICBvcGFjaXR5OiAwO1xyXG4gICAgICAgIG1hcmdpbjogMDtcclxuICAgICAgfVxyXG4gICAgICAub3RoZXIgaW5wdXRbdHlwZT1cInJhZGlvXCJdIHtcclxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgICAgd2lkdGg6IDE0cHg7XHJcbiAgICAgICAgei1pbmRleDogMTA7XHJcbiAgICAgICAgb3BhY2l0eTogMDtcclxuICAgICAgICBtYXJnaW46IDA7XHJcbiAgICAgIH1cclxuICAgICAgLmN1c3RvbS1vcHRpb24ge1xyXG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JheTtcclxuICAgICAgICBwYWRkaW5nOiAzcHggNXB4O1xyXG4gICAgICAgIHotaW5kZXg6IDExO1xyXG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgICAgICAgb3V0bGluZTogbm9uZTtcclxuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgICAgIHNjcm9sbC1iZWhhdmlvcjogc21vb3RoO1xyXG4gICAgICB9XHJcbiAgICAgIC5jdXN0b20tb3B0aW9uOmhvdmVyIHtcclxuICAgICAgICBib3JkZXItY29sb3I6IHJnYigxNjMsIDE4OSwgMjI3KTtcclxuICAgICAgICBjdXJzb3I6IHRleHQ7XHJcbiAgICAgIH1cclxuICAgICAgLmN1c3RvbS1vcHRpb246Zm9jdXMge1xyXG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiKDE2MywgMTg5LCAyMjcpO1xyXG4gICAgICB9XHJcbiAgICBgLFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdGlTdmdSYWRpb2J1dHRvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgZWxlbWVudDogU3RpU2luZ2xlU2VsZWN0aW9uRWxlbWVudDtcclxuICBASW5wdXQoKSBpZDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHRleHQ6IHN0cmluZztcclxuICBASW5wdXQoKSBzdGF0ZTogYm9vbGVhbjtcclxuICBASW5wdXQoKSB1c2VDdXN0b21PcHRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAT3V0cHV0KCkgYnV0dG9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQElucHV0KCkgdGFiSW5kZXg6IG51bWJlcjtcclxuICBwdWJsaWMgaXNDdXJyZW50T3B0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY29uc3RydWN0b3IocHVibGljIG1vZGVsOiBTdGlNb2RlbFNlcnZpY2UpIHt9XHJcblxyXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5zZWxlY3RlZENvbXBvbmVudD8uZWxlbWVudCA9PSB0aGlzLmVsZW1lbnQ7XHJcbiAgfVxyXG4gIGdldCBpc01vemlsYSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGVsLmdldEJyb3dzZXJUeXBlKCkgPT0gXCJmaXJlZm94XCIgPyB0cnVlIDogZmFsc2U7XHJcbiAgfVxyXG4gIGdldCBpc1NhZmFyaSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGVsLmdldEJyb3dzZXJUeXBlKCkgPT0gXCJzYWZhcmlcIiA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcbiAgZ2V0IGJhY2tDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLmVsZW1lbnQuYmFja2dyb3VuZENvbG9yLnRvSHRtbENvbG9yKCk7XHJcbiAgfVxyXG4gIGdldCBjaGVja0NvbG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudC5jaGVja0NvbG9yLnRvSHRtbENvbG9yKCk7XHJcbiAgfVxyXG4gIGdldCBib3JkZXJDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLmVsZW1lbnQuYm9yZGVyQ29sb3IudG9IdG1sQ29sb3IoKTtcclxuICB9XHJcbiAgZ2V0IHRleHRTdHlsZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmVsZW1lbnQ/Lmh0bWxTdHlsZSgpO1xyXG4gIH1cclxuICBkaXNhYmxlRHJhZyhldmVudCkge1xyXG4gICAgdGhpcy5tb2RlbC5jYW5EcmFnID0gZmFsc2U7XHJcbiAgfVxyXG4gIGNoYW5nZVN0YXRlKCkge1xyXG4gICAgdGhpcy5idXR0b25DbGljay5lbWl0KCk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgbmVlZFRvRmlsbCgpIHtcclxuICAgIHJldHVybiB0aGlzLmVsZW1lbnQucmVxdWlyZWQgJiYgIXRoaXMuZWxlbWVudC52YWx1ZSAmJiB0aGlzLm1vZGVsLmhhc0VtcHR5UmV1aXJlZEZpZWxkcztcclxuICB9XHJcbiAgZ2V0Q29udGVudChpbm5lclRleHQpIHtcclxuICAgIGlmICh0aGlzLmlzQ3VycmVudE9wdGlvbikge1xyXG4gICAgICB0aGlzLmVsZW1lbnQuc2VsZWN0ZWRPcHRpb24gPSBpbm5lclRleHQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLmVsZW1lbnRbXCJjdXN0b21PcHRpb25UZXh0XCJdID0gaW5uZXJUZXh0O1xyXG4gICAgdGhpcy5tb2RlbC5mb3JtRXZlbnRzLm5leHQoeyBuYW1lOiBcIlZhbHVlQ2hhbmdlZFwiIH0pO1xyXG4gIH1cclxuICBnZXRDaGFyQ29kZShldmVudCkge1xyXG4gICAgcmV0dXJuIG51bGwgPT09IGV2ZW50LndoaWNoID8gZXZlbnQua2V5Q29kZSA6ICEoMCA9PT0gZXZlbnQud2hpY2ggfHwgMCA9PT0gZXZlbnQuY2hhckNvZGUpID8gZXZlbnQud2hpY2ggOiAtMTtcclxuICB9XHJcbiAgY2hlY2tPcHRpb24oKSB7XHJcbiAgICBpZiAodGhpcy5lbGVtZW50LnNlbGVjdGVkT3B0aW9uID09IHRoaXMuZWxlbWVudC5jdXN0b21PcHRpb25UZXh0KSB7XHJcbiAgICAgIHRoaXMuaXNDdXJyZW50T3B0aW9uID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbiAgZGlzYWJsZUVudGVyKGV2ZW50KSB7XHJcbiAgICBpZiAoMTMgPT09IHRoaXMuZ2V0Q2hhckNvZGUoZXZlbnQpKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIH1cclxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XHJcbn1cclxuIl19