stimulsoft-forms
Version:
Stimulsoft PDF Forms
437 lines • 33.4 kB
JavaScript
import { Component, Input } from "@angular/core";
import { UsedFont } from "../../../../services/objects";
import * as i0 from "@angular/core";
import * as i1 from "../../../../services/model.service";
import * as i2 from "../../../../services/sti-helper.service";
import * as i3 from "../../../../services/theme.service";
import * as i4 from "../../../../services/sti-localization.service";
import * as i5 from "../../../../services/sti-color-dialog.service";
import * as i6 from "@angular/common";
import * as i7 from "../sti-dropdown-editor/sti-dropdown-editor.component";
import * as i8 from "../../../sti-tooltip/sti-tooltip.directive";
import * as i9 from "../../../sti-select-button/sti-select-button.component";
export class StiFontEditorComponent {
constructor(model, helper, theme, loc, colorService) {
this.model = model;
this.helper = helper;
this.theme = theme;
this.loc = loc;
this.colorService = colorService;
}
ngOnInit() { }
showColorPicker(element, object) {
this.colorService.openDialog(element, object);
}
isSettings() {
return !this.model.selectedComponent && !this.model.selectedPage;
}
get content() {
return this.helper.getProperty(this.object ?? this.model.form.settings, this.property.property);
}
changeEvent() {
if (this.content.eFont) {
let currentChangableFont = new UsedFont(this.content.eFont.family, this.model.arrayOfStylesToString(this.content.eFont.style), this.content.eFont.size);
this.model.form.formEvents.next({ name: "UpdateFonts", value: currentChangableFont });
}
else {
let currentChangableFont = new UsedFont(this.content.family ? this.content.family : this.content.font.family, this.model.arrayOfStylesToString(this.content.style ? this.content.style : this.content.font.style), this.content.size ? this.content.size : this.content.font.size);
this.model.form.formEvents.next({ name: "UpdateFonts", value: currentChangableFont });
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiFontEditorComponent, deps: [{ token: i1.StiModelService }, { token: i2.StiHelperService }, { token: i3.StiThemeService }, { token: i4.StiLocalizationService }, { token: i5.StiColorDialogService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: StiFontEditorComponent, selector: "sti-font-editor", inputs: { property: "property", object: "object" }, ngImport: i0, template: `<table class="sti-clear" [style]="{ width: '100%' }">
<tr *ngIf="property.property === 'this' || content.eValue?.length > 0 || isSettings()">
<td colspan="5">
<sti-dropdown-editor
[options]="model.fontFamilies"
[(value)]="content.font.family"
optionLabel="name"
optionValue="name"
class="p-inputtext-sm"
[style]="{ width: '100%' }"
[stiTooltip]="fontFamilyTooltip"
tooltipPosition="bottom"
showDelay="500"
(valueChange)="changeEvent()"
></sti-dropdown-editor>
</td>
<td colspan="2">
<sti-dropdown-editor
[options]="helper.fontSizes"
[(value)]="content.font.size"
class="p-inputtext-sm"
[style]="{ width: '100%' }"
[stiTooltip]="fontSizeTooltip"
tooltipPosition="bottom"
showDelay="500"
(valueChange)="changeEvent()"
></sti-dropdown-editor>
</td>
</tr>
<tr *ngIf="property.property === 'this' || content.eValue?.length > 0 || isSettings()">
<td colspan="2" style="padding-top: 5px;">
<sti-selectButton
[options]="helper.styleOptions"
[(value)]="content.font.style"
[multiple]="true"
optionValue="value"
[style]="{ height: '24px', minWidth: '90px' }"
(onChange)="changeEvent()"
>
<ng-template let-item>
<img
[src]="model.getImage(item.image)"
[stiTooltip]="loc.getP(item.value)"
tooltipPosition="bottom"
showDelay="500"
[style]="{ height: '16px', width: '16px' }"
/>
</ng-template>
</sti-selectButton>
</td>
</tr>
<tr
*ngIf="
property.property === 'font' ||
property.property === 'descriptionFont' ||
property.property === 'insertedText.font'
"
>
<td colspan="5">
<sti-dropdown-editor
[options]="model.fontFamilies"
[(value)]="content.family"
optionLabel="name"
optionValue="name"
class="p-inputtext-sm"
[style]="{ width: '100%' }"
[stiTooltip]="loc.get2('HelpDesigner', 'FontName')"
tooltipPosition="bottom"
showDelay="500"
(valueChange)="changeEvent()"
></sti-dropdown-editor>
</td>
<td colspan="2">
<sti-dropdown-editor
[options]="helper.fontSizes"
[(value)]="content.size"
class="p-inputtext-sm"
[style]="{ width: '100%' }"
[stiTooltip]="loc.getP('FontSize')"
tooltipPosition="bottom"
showDelay="500"
(valueChange)="changeEvent()"
></sti-dropdown-editor>
</td>
</tr>
<tr
*ngIf="
property.property === 'font' ||
property.property === 'descriptionFont' ||
property.property === 'insertedText.font'
"
>
<td colspan="2" style="padding-top: 5px;">
<sti-selectButton
[options]="helper.styleOptions"
[(value)]="content.style"
[multiple]="true"
optionValue="value"
[style]="{ height: '24px', minWidth: '90px' }"
(onChange)="changeEvent()"
>
<ng-template let-item>
<img
[src]="model.getImage(item.image)"
[stiTooltip]="loc.getP(item.value)"
tooltipPosition="bottom"
showDelay="500"
[style]="{ height: '16px', width: '16px' }"
/>
</ng-template>
</sti-selectButton>
</td>
</tr>
<tr *ngIf="property.property == 'innerText' && (content.eValue?.length > 0 || isSettings())">
<td colspan="7">
<div
class="custom-color-picker"
[stiTooltip]="loc.getP('Color')"
tooltipPosition="bottom"
(click)="showColorPicker(colorEditor, content.color)"
showDelay="500"
#colorEditor
>
<div class="preview">
<span class="custom-color-preview" [style.background-color]="content.color.toHtmlColor()"></span>
<span class="color-value">{{ content.color.getStringName() }}</span>
<span class="select-button"><i class="pi pi-chevron-down"></i></span>
</div>
</div>
</td>
</tr>
</table>
<style>
td {
padding: 0;
}
.custom-color-picker {
width: 100%;
background-color: var(--input-color);
height: 24px;
border: 1px solid var(--inputBorder-color);
position: relative;
border-radius: 3px;
}
.custom-color-picker:hover {
background-color: var(--hover-color);
}
.custom-color-picker:focus {
background-color: var(--input-color);
}
.preview {
display: flex;
position: relative;
width: 100%;
height: 100%;
}
.pick {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 22px;
}
.color-value {
font-weight: 500;
font-size: 12px;
align-self: center;
color: var(--text-color);
-webkit-touch-callout: none;
-webkit-user-select: none;
}
.custom-color-preview {
width: 24px;
height: 14px;
margin: 4px;
background-color: black;
border: 1px solid var(--inputBorder-color);
}
.select-button {
float: right;
margin-left: auto;
margin-right: 5px;
color: rgb(186, 185, 184);
display: flex;
align-items: center;
}
.i {
height: 12px;
width: 12px;
right: 3px;
}
</style>`, isInline: true, styles: ["\n td {\n padding: 0;\n }\n .custom-color-picker {\n width: 100%;\n background-color: var(--input-color);\n height: 24px;\n border: 1px solid var(--inputBorder-color);\n position: relative;\n border-radius: 3px;\n }\n .custom-color-picker:hover {\n background-color: var(--hover-color);\n }\n .custom-color-picker:focus {\n background-color: var(--input-color);\n }\n .preview {\n display: flex;\n position: relative;\n width: 100%;\n height: 100%;\n }\n .pick {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 22px;\n }\n .color-value {\n font-weight: 500;\n font-size: 12px;\n align-self: center;\n color: var(--text-color);\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n }\n .custom-color-preview {\n width: 24px;\n height: 14px;\n margin: 4px;\n background-color: black;\n border: 1px solid var(--inputBorder-color);\n }\n .select-button {\n float: right;\n margin-left: auto;\n margin-right: 5px;\n color: rgb(186, 185, 184);\n display: flex;\n align-items: center;\n }\n .i {\n height: 12px;\n width: 12px;\n right: 3px;\n }\n "], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.StiDropdownEditorComponent, selector: "sti-dropdown-editor", inputs: ["value", "options", "optionLabel", "optionValue", "editable"], outputs: ["valueChange"] }, { kind: "directive", type: i8.StiTooltipDirective, selector: "[stiTooltip]", inputs: ["tooltipPosition", "stiTooltip", "showDelay"] }, { kind: "component", type: i9.StiSelectButtonComponent, selector: "sti-selectButton", inputs: ["options", "value", "optionLabel", "optionValue", "multiple", "disabled"], outputs: ["onOptionClick", "onChange", "valueChange"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StiFontEditorComponent, decorators: [{
type: Component,
args: [{
selector: "sti-font-editor",
template: `<table class="sti-clear" [style]="{ width: '100%' }">
<tr *ngIf="property.property === 'this' || content.eValue?.length > 0 || isSettings()">
<td colspan="5">
<sti-dropdown-editor
[options]="model.fontFamilies"
[(value)]="content.font.family"
optionLabel="name"
optionValue="name"
class="p-inputtext-sm"
[style]="{ width: '100%' }"
[stiTooltip]="fontFamilyTooltip"
tooltipPosition="bottom"
showDelay="500"
(valueChange)="changeEvent()"
></sti-dropdown-editor>
</td>
<td colspan="2">
<sti-dropdown-editor
[options]="helper.fontSizes"
[(value)]="content.font.size"
class="p-inputtext-sm"
[style]="{ width: '100%' }"
[stiTooltip]="fontSizeTooltip"
tooltipPosition="bottom"
showDelay="500"
(valueChange)="changeEvent()"
></sti-dropdown-editor>
</td>
</tr>
<tr *ngIf="property.property === 'this' || content.eValue?.length > 0 || isSettings()">
<td colspan="2" style="padding-top: 5px;">
<sti-selectButton
[options]="helper.styleOptions"
[(value)]="content.font.style"
[multiple]="true"
optionValue="value"
[style]="{ height: '24px', minWidth: '90px' }"
(onChange)="changeEvent()"
>
<ng-template let-item>
<img
[src]="model.getImage(item.image)"
[stiTooltip]="loc.getP(item.value)"
tooltipPosition="bottom"
showDelay="500"
[style]="{ height: '16px', width: '16px' }"
/>
</ng-template>
</sti-selectButton>
</td>
</tr>
<tr
*ngIf="
property.property === 'font' ||
property.property === 'descriptionFont' ||
property.property === 'insertedText.font'
"
>
<td colspan="5">
<sti-dropdown-editor
[options]="model.fontFamilies"
[(value)]="content.family"
optionLabel="name"
optionValue="name"
class="p-inputtext-sm"
[style]="{ width: '100%' }"
[stiTooltip]="loc.get2('HelpDesigner', 'FontName')"
tooltipPosition="bottom"
showDelay="500"
(valueChange)="changeEvent()"
></sti-dropdown-editor>
</td>
<td colspan="2">
<sti-dropdown-editor
[options]="helper.fontSizes"
[(value)]="content.size"
class="p-inputtext-sm"
[style]="{ width: '100%' }"
[stiTooltip]="loc.getP('FontSize')"
tooltipPosition="bottom"
showDelay="500"
(valueChange)="changeEvent()"
></sti-dropdown-editor>
</td>
</tr>
<tr
*ngIf="
property.property === 'font' ||
property.property === 'descriptionFont' ||
property.property === 'insertedText.font'
"
>
<td colspan="2" style="padding-top: 5px;">
<sti-selectButton
[options]="helper.styleOptions"
[(value)]="content.style"
[multiple]="true"
optionValue="value"
[style]="{ height: '24px', minWidth: '90px' }"
(onChange)="changeEvent()"
>
<ng-template let-item>
<img
[src]="model.getImage(item.image)"
[stiTooltip]="loc.getP(item.value)"
tooltipPosition="bottom"
showDelay="500"
[style]="{ height: '16px', width: '16px' }"
/>
</ng-template>
</sti-selectButton>
</td>
</tr>
<tr *ngIf="property.property == 'innerText' && (content.eValue?.length > 0 || isSettings())">
<td colspan="7">
<div
class="custom-color-picker"
[stiTooltip]="loc.getP('Color')"
tooltipPosition="bottom"
(click)="showColorPicker(colorEditor, content.color)"
showDelay="500"
#colorEditor
>
<div class="preview">
<span class="custom-color-preview" [style.background-color]="content.color.toHtmlColor()"></span>
<span class="color-value">{{ content.color.getStringName() }}</span>
<span class="select-button"><i class="pi pi-chevron-down"></i></span>
</div>
</div>
</td>
</tr>
</table>
<style>
td {
padding: 0;
}
.custom-color-picker {
width: 100%;
background-color: var(--input-color);
height: 24px;
border: 1px solid var(--inputBorder-color);
position: relative;
border-radius: 3px;
}
.custom-color-picker:hover {
background-color: var(--hover-color);
}
.custom-color-picker:focus {
background-color: var(--input-color);
}
.preview {
display: flex;
position: relative;
width: 100%;
height: 100%;
}
.pick {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 22px;
}
.color-value {
font-weight: 500;
font-size: 12px;
align-self: center;
color: var(--text-color);
-webkit-touch-callout: none;
-webkit-user-select: none;
}
.custom-color-preview {
width: 24px;
height: 14px;
margin: 4px;
background-color: black;
border: 1px solid var(--inputBorder-color);
}
.select-button {
float: right;
margin-left: auto;
margin-right: 5px;
color: rgb(186, 185, 184);
display: flex;
align-items: center;
}
.i {
height: 12px;
width: 12px;
right: 3px;
}
</style>`,
}]
}], ctorParameters: () => [{ type: i1.StiModelService }, { type: i2.StiHelperService }, { type: i3.StiThemeService }, { type: i4.StiLocalizationService }, { type: i5.StiColorDialogService }], propDecorators: { property: [{
type: Input
}], object: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpLWZvbnQtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0aW11bHNvZnQtZm9ybXMvc3JjL2xpYi9jb21wb25lbnRzL3Byb3BlcnR5R3JpZC9lZGl0b3JzL3N0aS1mb250LWVkaXRvci9zdGktZm9udC1lZGl0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRXpELE9BQU8sRUFBcUIsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7Ozs7O0FBeU0zRSxNQUFNLE9BQU8sc0JBQXNCO0lBR2pDLFlBQ1MsS0FBc0IsRUFDdEIsTUFBd0IsRUFDeEIsS0FBc0IsRUFDdEIsR0FBMkIsRUFDM0IsWUFBbUM7UUFKbkMsVUFBSyxHQUFMLEtBQUssQ0FBaUI7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBa0I7UUFDeEIsVUFBSyxHQUFMLEtBQUssQ0FBaUI7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBd0I7UUFDM0IsaUJBQVksR0FBWixZQUFZLENBQXVCO0lBQ3pDLENBQUM7SUFFSixRQUFRLEtBQVUsQ0FBQztJQUVuQixlQUFlLENBQUMsT0FBTyxFQUFFLE1BQU07UUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDTSxVQUFVO1FBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztJQUNuRSxDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QixJQUFJLG9CQUFvQixHQUFhLElBQUksUUFBUSxDQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQzFELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDeEIsQ0FBQztZQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDeEYsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLG9CQUFvQixHQUFhLElBQUksUUFBUSxDQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFDcEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUNuRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDL0QsQ0FBQztZQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDeEYsQ0FBQztJQUNILENBQUM7K0dBdkNVLHNCQUFzQjttR0FBdEIsc0JBQXNCLDJHQWpNdkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2FBK0xDOzs0RkFFQSxzQkFBc0I7a0JBbk1sQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7YUErTEM7aUJBQ1o7ME5BRVUsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBTdGlNb2RlbFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZXMvbW9kZWwuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTdGlFZGl0b3JQcm9wZXJ0eSwgVXNlZEZvbnQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZXMvb2JqZWN0c1wiO1xyXG5pbXBvcnQgeyBTdGlDb2xvckRpYWxvZ1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZXMvc3RpLWNvbG9yLWRpYWxvZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFN0aUhlbHBlclNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZXMvc3RpLWhlbHBlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFN0aUxvY2FsaXphdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZXMvc3RpLWxvY2FsaXphdGlvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFN0aVRoZW1lU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi8uLi9zZXJ2aWNlcy90aGVtZS5zZXJ2aWNlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJzdGktZm9udC1lZGl0b3JcIixcclxuICB0ZW1wbGF0ZTogYDx0YWJsZSBjbGFzcz1cInN0aS1jbGVhclwiIFtzdHlsZV09XCJ7IHdpZHRoOiAnMTAwJScgfVwiPlxyXG4gICAgICA8dHIgKm5nSWY9XCJwcm9wZXJ0eS5wcm9wZXJ0eSA9PT0gJ3RoaXMnIHx8IGNvbnRlbnQuZVZhbHVlPy5sZW5ndGggPiAwIHx8IGlzU2V0dGluZ3MoKVwiPlxyXG4gICAgICAgIDx0ZCBjb2xzcGFuPVwiNVwiPlxyXG4gICAgICAgICAgPHN0aS1kcm9wZG93bi1lZGl0b3JcclxuICAgICAgICAgICAgW29wdGlvbnNdPVwibW9kZWwuZm9udEZhbWlsaWVzXCJcclxuICAgICAgICAgICAgWyh2YWx1ZSldPVwiY29udGVudC5mb250LmZhbWlseVwiXHJcbiAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibmFtZVwiXHJcbiAgICAgICAgICAgIG9wdGlvblZhbHVlPVwibmFtZVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dHRleHQtc21cIlxyXG4gICAgICAgICAgICBbc3R5bGVdPVwieyB3aWR0aDogJzEwMCUnIH1cIlxyXG4gICAgICAgICAgICBbc3RpVG9vbHRpcF09XCJmb250RmFtaWx5VG9vbHRpcFwiXHJcbiAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgIHNob3dEZWxheT1cIjUwMFwiXHJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJjaGFuZ2VFdmVudCgpXCJcclxuICAgICAgICAgID48L3N0aS1kcm9wZG93bi1lZGl0b3I+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj5cclxuICAgICAgICAgIDxzdGktZHJvcGRvd24tZWRpdG9yXHJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cImhlbHBlci5mb250U2l6ZXNcIlxyXG4gICAgICAgICAgICBbKHZhbHVlKV09XCJjb250ZW50LmZvbnQuc2l6ZVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dHRleHQtc21cIlxyXG4gICAgICAgICAgICBbc3R5bGVdPVwieyB3aWR0aDogJzEwMCUnIH1cIlxyXG4gICAgICAgICAgICBbc3RpVG9vbHRpcF09XCJmb250U2l6ZVRvb2x0aXBcIlxyXG4gICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxyXG4gICAgICAgICAgICBzaG93RGVsYXk9XCI1MDBcIlxyXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiY2hhbmdlRXZlbnQoKVwiXHJcbiAgICAgICAgICA+PC9zdGktZHJvcGRvd24tZWRpdG9yPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvdHI+XHJcbiAgICAgIDx0ciAqbmdJZj1cInByb3BlcnR5LnByb3BlcnR5ID09PSAndGhpcycgfHwgY29udGVudC5lVmFsdWU/Lmxlbmd0aCA+IDAgfHwgaXNTZXR0aW5ncygpXCI+XHJcbiAgICAgICAgPHRkIGNvbHNwYW49XCIyXCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogNXB4O1wiPlxyXG4gICAgICAgICAgPHN0aS1zZWxlY3RCdXR0b25cclxuICAgICAgICAgICAgW29wdGlvbnNdPVwiaGVscGVyLnN0eWxlT3B0aW9uc1wiXHJcbiAgICAgICAgICAgIFsodmFsdWUpXT1cImNvbnRlbnQuZm9udC5zdHlsZVwiXHJcbiAgICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgIFtzdHlsZV09XCJ7IGhlaWdodDogJzI0cHgnLCBtaW5XaWR0aDogJzkwcHgnIH1cIlxyXG4gICAgICAgICAgICAob25DaGFuZ2UpPVwiY2hhbmdlRXZlbnQoKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbT5cclxuICAgICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgICBbc3JjXT1cIm1vZGVsLmdldEltYWdlKGl0ZW0uaW1hZ2UpXCJcclxuICAgICAgICAgICAgICAgIFtzdGlUb29sdGlwXT1cImxvYy5nZXRQKGl0ZW0udmFsdWUpXCJcclxuICAgICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgICAgICBzaG93RGVsYXk9XCI1MDBcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlXT1cInsgaGVpZ2h0OiAnMTZweCcsIHdpZHRoOiAnMTZweCcgfVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvc3RpLXNlbGVjdEJ1dHRvbj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L3RyPlxyXG4gICAgICA8dHJcclxuICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgcHJvcGVydHkucHJvcGVydHkgPT09ICdmb250JyB8fFxyXG4gICAgICAgICAgcHJvcGVydHkucHJvcGVydHkgPT09ICdkZXNjcmlwdGlvbkZvbnQnIHx8XHJcbiAgICAgICAgICBwcm9wZXJ0eS5wcm9wZXJ0eSA9PT0gJ2luc2VydGVkVGV4dC5mb250J1xyXG4gICAgICAgIFwiXHJcbiAgICAgID5cclxuICAgICAgICA8dGQgY29sc3Bhbj1cIjVcIj5cclxuICAgICAgICAgIDxzdGktZHJvcGRvd24tZWRpdG9yXHJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cIm1vZGVsLmZvbnRGYW1pbGllc1wiXHJcbiAgICAgICAgICAgIFsodmFsdWUpXT1cImNvbnRlbnQuZmFtaWx5XCJcclxuICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJuYW1lXCJcclxuICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJuYW1lXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0dGV4dC1zbVwiXHJcbiAgICAgICAgICAgIFtzdHlsZV09XCJ7IHdpZHRoOiAnMTAwJScgfVwiXHJcbiAgICAgICAgICAgIFtzdGlUb29sdGlwXT1cImxvYy5nZXQyKCdIZWxwRGVzaWduZXInLCAnRm9udE5hbWUnKVwiXHJcbiAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXHJcbiAgICAgICAgICAgIHNob3dEZWxheT1cIjUwMFwiXHJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJjaGFuZ2VFdmVudCgpXCJcclxuICAgICAgICAgID48L3N0aS1kcm9wZG93bi1lZGl0b3I+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj5cclxuICAgICAgICAgIDxzdGktZHJvcGRvd24tZWRpdG9yXHJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cImhlbHBlci5mb250U2l6ZXNcIlxyXG4gICAgICAgICAgICBbKHZhbHVlKV09XCJjb250ZW50LnNpemVcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXR0ZXh0LXNtXCJcclxuICAgICAgICAgICAgW3N0eWxlXT1cInsgd2lkdGg6ICcxMDAlJyB9XCJcclxuICAgICAgICAgICAgW3N0aVRvb2x0aXBdPVwibG9jLmdldFAoJ0ZvbnRTaXplJylcIlxyXG4gICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxyXG4gICAgICAgICAgICBzaG93RGVsYXk9XCI1MDBcIlxyXG4gICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiY2hhbmdlRXZlbnQoKVwiXHJcbiAgICAgICAgICA+PC9zdGktZHJvcGRvd24tZWRpdG9yPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvdHI+XHJcbiAgICAgIDx0clxyXG4gICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICBwcm9wZXJ0eS5wcm9wZXJ0eSA9PT0gJ2ZvbnQnIHx8XHJcbiAgICAgICAgICBwcm9wZXJ0eS5wcm9wZXJ0eSA9PT0gJ2Rlc2NyaXB0aW9uRm9udCcgfHxcclxuICAgICAgICAgIHByb3BlcnR5LnByb3BlcnR5ID09PSAnaW5zZXJ0ZWRUZXh0LmZvbnQnXHJcbiAgICAgICAgXCJcclxuICAgICAgPlxyXG4gICAgICAgIDx0ZCBjb2xzcGFuPVwiMlwiIHN0eWxlPVwicGFkZGluZy10b3A6IDVweDtcIj5cclxuICAgICAgICAgIDxzdGktc2VsZWN0QnV0dG9uXHJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cImhlbHBlci5zdHlsZU9wdGlvbnNcIlxyXG4gICAgICAgICAgICBbKHZhbHVlKV09XCJjb250ZW50LnN0eWxlXCJcclxuICAgICAgICAgICAgW211bHRpcGxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcclxuICAgICAgICAgICAgW3N0eWxlXT1cInsgaGVpZ2h0OiAnMjRweCcsIG1pbldpZHRoOiAnOTBweCcgfVwiXHJcbiAgICAgICAgICAgIChvbkNoYW5nZSk9XCJjaGFuZ2VFdmVudCgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1pdGVtPlxyXG4gICAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICAgIFtzcmNdPVwibW9kZWwuZ2V0SW1hZ2UoaXRlbS5pbWFnZSlcIlxyXG4gICAgICAgICAgICAgICAgW3N0aVRvb2x0aXBdPVwibG9jLmdldFAoaXRlbS52YWx1ZSlcIlxyXG4gICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgICAgIHNob3dEZWxheT1cIjUwMFwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGVdPVwieyBoZWlnaHQ6ICcxNnB4Jywgd2lkdGg6ICcxNnB4JyB9XCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9zdGktc2VsZWN0QnV0dG9uPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvdHI+XHJcbiAgICAgIDx0ciAqbmdJZj1cInByb3BlcnR5LnByb3BlcnR5ID09ICdpbm5lclRleHQnICYmIChjb250ZW50LmVWYWx1ZT8ubGVuZ3RoID4gMCB8fCBpc1NldHRpbmdzKCkpXCI+XHJcbiAgICAgICAgPHRkIGNvbHNwYW49XCI3XCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLWNvbG9yLXBpY2tlclwiXHJcbiAgICAgICAgICAgIFtzdGlUb29sdGlwXT1cImxvYy5nZXRQKCdDb2xvcicpXCJcclxuICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInNob3dDb2xvclBpY2tlcihjb2xvckVkaXRvciwgY29udGVudC5jb2xvcilcIlxyXG4gICAgICAgICAgICBzaG93RGVsYXk9XCI1MDBcIlxyXG4gICAgICAgICAgICAjY29sb3JFZGl0b3JcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXdcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1c3RvbS1jb2xvci1wcmV2aWV3XCIgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiY29udGVudC5jb2xvci50b0h0bWxDb2xvcigpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29sb3ItdmFsdWVcIj57eyBjb250ZW50LmNvbG9yLmdldFN0cmluZ05hbWUoKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdC1idXR0b25cIj48aSBjbGFzcz1cInBpIHBpLWNoZXZyb24tZG93blwiPjwvaT48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgPC90cj5cclxuICAgIDwvdGFibGU+XHJcbiAgICA8c3R5bGU+XHJcbiAgICAgIHRkIHtcclxuICAgICAgICBwYWRkaW5nOiAwO1xyXG4gICAgICB9XHJcbiAgICAgIC5jdXN0b20tY29sb3ItcGlja2VyIHtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pbnB1dC1jb2xvcik7XHJcbiAgICAgICAgaGVpZ2h0OiAyNHB4O1xyXG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlucHV0Qm9yZGVyLWNvbG9yKTtcclxuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xyXG4gICAgICB9XHJcbiAgICAgIC5jdXN0b20tY29sb3ItcGlja2VyOmhvdmVyIHtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ob3Zlci1jb2xvcik7XHJcbiAgICAgIH1cclxuICAgICAgLmN1c3RvbS1jb2xvci1waWNrZXI6Zm9jdXMge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlucHV0LWNvbG9yKTtcclxuICAgICAgfVxyXG4gICAgICAucHJldmlldyB7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICB9XHJcbiAgICAgIC5waWNrIHtcclxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgICAgdG9wOiAwO1xyXG4gICAgICAgIGxlZnQ6IDA7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgaGVpZ2h0OiAyMnB4O1xyXG4gICAgICB9XHJcbiAgICAgIC5jb2xvci12YWx1ZSB7XHJcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcclxuICAgICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyO1xyXG4gICAgICAgIGNvbG9yOiB2YXIoLS10ZXh0LWNvbG9yKTtcclxuICAgICAgICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmU7XHJcbiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcclxuICAgICAgfVxyXG4gICAgICAuY3VzdG9tLWNvbG9yLXByZXZpZXcge1xyXG4gICAgICAgIHdpZHRoOiAyNHB4O1xyXG4gICAgICAgIGhlaWdodDogMTRweDtcclxuICAgICAgICBtYXJnaW46IDRweDtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjaztcclxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1pbnB1dEJvcmRlci1jb2xvcik7XHJcbiAgICAgIH1cclxuICAgICAgLnNlbGVjdC1idXR0b24ge1xyXG4gICAgICAgIGZsb2F0OiByaWdodDtcclxuICAgICAgICBtYXJnaW4tbGVmdDogYXV0bztcclxuICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDtcclxuICAgICAgICBjb2xvcjogcmdiKDE4NiwgMTg1LCAxODQpO1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgfVxyXG4gICAgICAuaSB7XHJcbiAgICAgICAgaGVpZ2h0OiAxMnB4O1xyXG4gICAgICAgIHdpZHRoOiAxMnB4O1xyXG4gICAgICAgIHJpZ2h0OiAzcHg7XHJcbiAgICAgIH1cclxuICAgIDwvc3R5bGU+YCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFN0aUZvbnRFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIHByb3BlcnR5OiBTdGlFZGl0b3JQcm9wZXJ0eTtcclxuICBASW5wdXQoKSBvYmplY3Q/OiBhbnk7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgbW9kZWw6IFN0aU1vZGVsU2VydmljZSxcclxuICAgIHB1YmxpYyBoZWxwZXI6IFN0aUhlbHBlclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgdGhlbWU6IFN0aVRoZW1lU2VydmljZSxcclxuICAgIHB1YmxpYyBsb2M6IFN0aUxvY2FsaXphdGlvblNlcnZpY2UsXHJcbiAgICBwdWJsaWMgY29sb3JTZXJ2aWNlOiBTdGlDb2xvckRpYWxvZ1NlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge31cclxuXHJcbiAgc2hvd0NvbG9yUGlja2VyKGVsZW1lbnQsIG9iamVjdCkge1xyXG4gICAgdGhpcy5jb2xvclNlcnZpY2Uub3BlbkRpYWxvZyhlbGVtZW50LCBvYmplY3QpO1xyXG4gIH1cclxuICBwdWJsaWMgaXNTZXR0aW5ncygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5tb2RlbC5zZWxlY3RlZENvbXBvbmVudCAmJiAhdGhpcy5tb2RlbC5zZWxlY3RlZFBhZ2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGNvbnRlbnQoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmhlbHBlci5nZXRQcm9wZXJ0eSh0aGlzLm9iamVjdCA/PyB0aGlzLm1vZGVsLmZvcm0uc2V0dGluZ3MsIHRoaXMucHJvcGVydHkucHJvcGVydHkpO1xyXG4gIH1cclxuICBjaGFuZ2VFdmVudCgpIHtcclxuICAgIGlmICh0aGlzLmNvbnRlbnQuZUZvbnQpIHtcclxuICAgICAgbGV0IGN1cnJlbnRDaGFuZ2FibGVGb250OiBVc2VkRm9udCA9IG5ldyBVc2VkRm9udChcclxuICAgICAgICB0aGlzLmNvbnRlbnQuZUZvbnQuZmFtaWx5LFxyXG4gICAgICAgIHRoaXMubW9kZWwuYXJyYXlPZlN0eWxlc1RvU3RyaW5nKHRoaXMuY29udGVudC5lRm9udC5zdHlsZSksXHJcbiAgICAgICAgdGhpcy5jb250ZW50LmVGb250LnNpemVcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5tb2RlbC5mb3JtLmZvcm1FdmVudHMubmV4dCh7IG5hbWU6IFwiVXBkYXRlRm9udHNcIiwgdmFsdWU6IGN1cnJlbnRDaGFuZ2FibGVGb250IH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGN1cnJlbnRDaGFuZ2FibGVGb250OiBVc2VkRm9udCA9IG5ldyBVc2VkRm9udChcclxuICAgICAgICB0aGlzLmNvbnRlbnQuZmFtaWx5ID8gdGhpcy5jb250ZW50LmZhbWlseSA6IHRoaXMuY29udGVudC5mb250LmZhbWlseSxcclxuICAgICAgICB0aGlzLm1vZGVsLmFycmF5T2ZTdHlsZXNUb1N0cmluZyh0aGlzLmNvbnRlbnQuc3R5bGUgPyB0aGlzLmNvbnRlbnQuc3R5bGUgOiB0aGlzLmNvbnRlbnQuZm9udC5zdHlsZSksXHJcbiAgICAgICAgdGhpcy5jb250ZW50LnNpemUgPyB0aGlzLmNvbnRlbnQuc2l6ZSA6IHRoaXMuY29udGVudC5mb250LnNpemVcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5tb2RlbC5mb3JtLmZvcm1FdmVudHMubmV4dCh7IG5hbWU6IFwiVXBkYXRlRm9udHNcIiwgdmFsdWU6IGN1cnJlbnRDaGFuZ2FibGVGb250IH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=