ng-devui
Version:
DevUI components based on Angular
220 lines • 42.7 kB
JavaScript
import { Component, ElementRef, EventEmitter, HostBinding, Input, Output, } from '@angular/core';
import { fromEvent } from 'rxjs';
import { tap } from 'rxjs/operators';
import { EditableTip } from '../../../data-table.model';
import { TableTdService } from './td.service';
import * as i0 from "@angular/core";
import * as i1 from "./td.service";
import * as i2 from "@angular/common";
import * as i3 from "ng-devui/utils";
export class TableTdComponent {
get isEditable() {
return this.editable && !this.editing && this.editableTip !== 'btn';
}
constructor(elementRef, tdService) {
this.elementRef = elementRef;
this.tdService = tdService;
this.editableTip = EditableTip.hover;
this.nestedColumn = false;
this.nestedColumnIndent = 16;
this.toggleChildTableEvent = new EventEmitter();
this.editStatusEvent = new EventEmitter();
/**
* 编辑状态调整 @deprecated
*/
this.editingChange = new EventEmitter();
this.currentEditing = false;
}
ngOnChanges(changes) {
const { fixedLeft, fixedRight, editing } = changes;
if (fixedLeft) {
if (this.fixedLeft) {
this.stickyLeftClass = true;
this.stickyLeftStyle = this.fixedLeft;
}
else {
this.stickyLeftClass = false;
this.stickyLeftStyle = null;
}
}
if (fixedRight) {
if (this.fixedRight) {
this.stickyRightClass = true;
this.stickyRightStyle = this.fixedRight;
}
else {
this.stickyRightClass = false;
this.stickyRightStyle = null;
}
}
if (editing?.currentValue && !this.currentEditing) {
this.bindEditClickEvent();
}
}
startEditing(event) {
event.stopPropagation();
event.preventDefault();
let beforePromise = Promise.resolve(true);
if (this.beforeEditStart) {
const result = this.beforeEditStart(this.rowItem, this.field);
if (typeof result !== 'undefined') {
if (result.then) {
beforePromise = result;
}
else if (result.subscribe) {
beforePromise = result.toPromise();
}
else {
beforePromise = Promise.resolve(result);
}
}
}
beforePromise.then((canStart) => {
if (canStart) {
this.editing = true;
this.currentEditing = true;
this.editingChange.emit(true);
this.editStatusEvent.emit(true);
this.tdService.tableCellClickEvent.emit(event);
this.bindEditClickEvent();
}
});
}
bindEditClickEvent() {
this.documentClickSubscription = fromEvent(document, 'click')
.pipe(tap((e) => {
e.stopPropagation();
}))
.subscribe((clickEvent) => {
if (!this.elementRef.nativeElement.contains(clickEvent.target) && !this.clickInTd) {
this.finishCellEdit();
}
this.clickInTd = false;
});
this.tdMousedownSubscription = fromEvent(this.elementRef.nativeElement, 'mousedown').subscribe((event) => {
this.clickInTd = true;
});
this.tdMouseupSubscription = fromEvent(this.elementRef.nativeElement, 'mouseup').subscribe((event) => {
this.clickInTd = false;
});
this.tdClickSubscription = this.tdService.tableCellClickEvent.subscribe((clickEvent) => {
if (!this.elementRef.nativeElement.contains(clickEvent.target)) {
this.finishCellEdit();
}
});
}
removeEditClickEvent() {
if (this.documentClickSubscription) {
this.documentClickSubscription.unsubscribe();
this.documentClickSubscription = null;
}
if (this.tdClickSubscription) {
this.tdClickSubscription.unsubscribe();
this.tdClickSubscription = null;
}
}
finishCellEdit() {
let beforePromise = Promise.resolve(true);
if (this.beforeEditEnd) {
const result = this.beforeEditEnd(this.rowItem, this.field);
if (typeof result !== 'undefined') {
if (result.then) {
beforePromise = result;
}
else if (result.subscribe) {
beforePromise = result.toPromise();
}
else {
beforePromise = Promise.resolve(result);
}
}
}
beforePromise.then((canEnd) => {
if (canEnd) {
this.editing = false;
this.currentEditing = false;
this.editingChange.emit(false);
this.editStatusEvent.emit(false);
this.removeEditClickEvent();
}
});
}
toggleChildTable(rowItem) {
rowItem.$isChildTableOpen = !rowItem.$isChildTableOpen;
this.toggleChildTableEvent.emit(rowItem.$isChildTableOpen);
}
ngOnDestroy() {
if (this.documentClickSubscription) {
this.documentClickSubscription.unsubscribe();
this.documentClickSubscription = null;
}
if (this.tdClickSubscription) {
this.tdClickSubscription.unsubscribe();
this.tdClickSubscription = null;
}
if (this.tdMousedownSubscription) {
this.tdMousedownSubscription.unsubscribe();
this.tdMousedownSubscription = null;
}
if (this.tdMouseupSubscription) {
this.tdMouseupSubscription.unsubscribe();
this.tdMouseupSubscription = null;
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableTdComponent, deps: [{ token: i0.ElementRef }, { token: i1.TableTdService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TableTdComponent, selector: "[dTableCell]", inputs: { editable: "editable", editableTip: "editableTip", nestedColumn: "nestedColumn", nestedLayer: "nestedLayer", field: "field", rowItem: "rowItem", fixedLeft: "fixedLeft", fixedRight: "fixedRight", iconFoldTable: "iconFoldTable", iconUnFoldTable: "iconUnFoldTable", nestedColumnIndent: "nestedColumnIndent", beforeEditStart: "beforeEditStart", beforeEditEnd: "beforeEditEnd", editing: "editing" }, outputs: { toggleChildTableEvent: "toggleChildTableEvent", editStatusEvent: "editStatusEvent", editingChange: "editingChange" }, host: { properties: { "class.devui-sticky-left-cell": "this.stickyLeftClass", "class.devui-sticky-right-cell": "this.stickyRightClass", "style.left": "this.stickyLeftStyle", "style.right": "this.stickyRightStyle", "class.editable-cell": "this.isEditable" } }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"editable && !editing\">\n <div *ngIf=\"editableTip === 'btn'\" class=\"cell-container\">\n <div class=\"cell-container-inner not-break modify-holder\">\n <ng-template\n [ngTemplateOutlet]=\"nestedTmp\"\n [ngTemplateOutletContext]=\"{ nestedColumn: nestedColumn, rowItem: rowItem, nestedLayer: nestedLayer }\"\n ></ng-template>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n <span class=\"cell-modify\" (click)=\"startEditing($event)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" width=\"16px\" height=\"16px\" version=\"1.1\">\n <g fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\n <path\n d=\"M 9.48528 3.41421 L 10.8995 2 L 13.7279 4.82843 L 12.3137 6.24264 L 9.48528 3.41421 Z M 5.24264 13.3137 L 2.41421 13.3137 L 2.41421 10.4853 L 8.77817 4.12132 L 11.6066 6.94975 L 5.24264 13.3137 Z\"\n />\n </g>\n </svg>\n </span>\n </div>\n </div>\n\n <div *ngIf=\"editableTip !== 'btn'\" class=\"cell-editable not-break\" (click)=\"startEditing($event)\">\n <ng-template\n [ngTemplateOutlet]=\"nestedTmp\"\n [ngTemplateOutletContext]=\"{ nestedColumn: nestedColumn, rowItem: rowItem, nestedLayer: nestedLayer }\"\n ></ng-template>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"!editable || editing\">\n <ng-template\n [ngTemplateOutlet]=\"nestedTmp\"\n [ngTemplateOutletContext]=\"{ nestedColumn: nestedColumn, rowItem: rowItem, nestedLayer: nestedLayer }\"\n ></ng-template>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</ng-container>\n\n<ng-template #content><ng-content></ng-content></ng-template>\n\n<ng-template #nestedTmp let-nestedColumn=\"nestedColumn\" let-rowItem=\"rowItem\" let-nestedLayer=\"nestedLayer\">\n <ng-container *ngIf=\"nestedColumn\">\n <span *ngIf=\"nestedLayer > 0\" class=\"cell-placeholder\" [ngStyle]=\"{ width: nestedLayer * nestedColumnIndent + 'px' }\"></span>\n <span [style.visibility]=\"rowItem.children ? 'visible' : 'hidden'\" class=\"childtable-toggler\" (click)=\"toggleChildTable(rowItem)\">\n <ng-container *ngIf=\"rowItem['$isChildTableOpen']\">\n <svg\n *ngIf=\"!iconFoldTable\"\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n class=\"svg-icon svg-icon-close\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"2\"></rect>\n <rect x=\"4\" y=\"7\" width=\"8\" height=\"2\"></rect>\n </g>\n </svg>\n <span *ngIf=\"iconFoldTable\" [innerHTML]=\"iconFoldTable | safe: 'html'\"></span>\n </ng-container>\n <ng-container *ngIf=\"!rowItem['$isChildTableOpen']\">\n <svg\n *ngIf=\"!iconUnFoldTable\"\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n class=\"svg-icon svg-icon-open-folder\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"2\"></rect>\n <path\n d=\"M8.75,4 L8.75,7.25 L12,7.25 L12,8.75 L8.749,8.75 L8.75,12 L7.25,12 L7.249,8.75 L4,8.75 L4,7.25 L7.25,7.25 L7.25,4 L8.75,4 Z\"\n ></path>\n </g>\n </svg>\n <span *ngIf=\"iconUnFoldTable\" [innerHTML]=\"iconUnFoldTable | safe: 'html'\"></span>\n </ng-container>\n </span>\n </ng-container>\n</ng-template>\n", styles: ["svg.svg-icon-arrow>g>polygon{fill:var(--devui-icon-text, #808080)}:host ::ng-deep d-button button.d-btn.d-btn-icon{padding:0!important}:host.editable-cell{position:relative}.cell-modify{position:absolute;right:0;cursor:pointer}.cell-modify>svg{vertical-align:middle}.cell-modify:hover>svg>g>g{fill:var(--devui-icon-text, #808080)}.cell-container{position:relative;height:24px}.cell-container-inner{position:absolute;max-width:100%;width:100%;min-height:24px}.cell-container-inner.modify-holder{padding-right:20px}.cell-container-inner.modify-holder .cell-modify{display:none;cursor:pointer;position:absolute;right:0}.cell-container-inner.modify-holder .cell-modify>svg{vertical-align:middle}.cell-container-inner.modify-holder .cell-modify>svg>g{fill:var(--devui-icon-text, #808080)}.cell-container-inner.modify-holder .cell-modify:hover>svg>g{fill:var(--devui-icon-fill-active-hover, #000000)}.cell-container-inner.modify-holder:hover .cell-modify{display:inline}.not-break{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-spacing:normal;word-wrap:normal}.cell-editable{cursor:pointer;margin-left:-5px;padding-left:5px;min-height:20px}.cell-placeholder{display:inline-block;height:16px}\n"], dependencies: [{ 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: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i3.SafePipe, name: "safe" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableTdComponent, decorators: [{
type: Component,
args: [{ selector: '[dTableCell]', template: "<ng-container *ngIf=\"editable && !editing\">\n <div *ngIf=\"editableTip === 'btn'\" class=\"cell-container\">\n <div class=\"cell-container-inner not-break modify-holder\">\n <ng-template\n [ngTemplateOutlet]=\"nestedTmp\"\n [ngTemplateOutletContext]=\"{ nestedColumn: nestedColumn, rowItem: rowItem, nestedLayer: nestedLayer }\"\n ></ng-template>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n <span class=\"cell-modify\" (click)=\"startEditing($event)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" width=\"16px\" height=\"16px\" version=\"1.1\">\n <g fill=\"none\" fill-rule=\"evenodd\" stroke=\"none\" stroke-width=\"1\">\n <path\n d=\"M 9.48528 3.41421 L 10.8995 2 L 13.7279 4.82843 L 12.3137 6.24264 L 9.48528 3.41421 Z M 5.24264 13.3137 L 2.41421 13.3137 L 2.41421 10.4853 L 8.77817 4.12132 L 11.6066 6.94975 L 5.24264 13.3137 Z\"\n />\n </g>\n </svg>\n </span>\n </div>\n </div>\n\n <div *ngIf=\"editableTip !== 'btn'\" class=\"cell-editable not-break\" (click)=\"startEditing($event)\">\n <ng-template\n [ngTemplateOutlet]=\"nestedTmp\"\n [ngTemplateOutletContext]=\"{ nestedColumn: nestedColumn, rowItem: rowItem, nestedLayer: nestedLayer }\"\n ></ng-template>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"!editable || editing\">\n <ng-template\n [ngTemplateOutlet]=\"nestedTmp\"\n [ngTemplateOutletContext]=\"{ nestedColumn: nestedColumn, rowItem: rowItem, nestedLayer: nestedLayer }\"\n ></ng-template>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</ng-container>\n\n<ng-template #content><ng-content></ng-content></ng-template>\n\n<ng-template #nestedTmp let-nestedColumn=\"nestedColumn\" let-rowItem=\"rowItem\" let-nestedLayer=\"nestedLayer\">\n <ng-container *ngIf=\"nestedColumn\">\n <span *ngIf=\"nestedLayer > 0\" class=\"cell-placeholder\" [ngStyle]=\"{ width: nestedLayer * nestedColumnIndent + 'px' }\"></span>\n <span [style.visibility]=\"rowItem.children ? 'visible' : 'hidden'\" class=\"childtable-toggler\" (click)=\"toggleChildTable(rowItem)\">\n <ng-container *ngIf=\"rowItem['$isChildTableOpen']\">\n <svg\n *ngIf=\"!iconFoldTable\"\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n class=\"svg-icon svg-icon-close\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"2\"></rect>\n <rect x=\"4\" y=\"7\" width=\"8\" height=\"2\"></rect>\n </g>\n </svg>\n <span *ngIf=\"iconFoldTable\" [innerHTML]=\"iconFoldTable | safe: 'html'\"></span>\n </ng-container>\n <ng-container *ngIf=\"!rowItem['$isChildTableOpen']\">\n <svg\n *ngIf=\"!iconUnFoldTable\"\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n class=\"svg-icon svg-icon-open-folder\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect x=\"0.5\" y=\"0.5\" width=\"15\" height=\"15\" rx=\"2\"></rect>\n <path\n d=\"M8.75,4 L8.75,7.25 L12,7.25 L12,8.75 L8.749,8.75 L8.75,12 L7.25,12 L7.249,8.75 L4,8.75 L4,7.25 L7.25,7.25 L7.25,4 L8.75,4 Z\"\n ></path>\n </g>\n </svg>\n <span *ngIf=\"iconUnFoldTable\" [innerHTML]=\"iconUnFoldTable | safe: 'html'\"></span>\n </ng-container>\n </span>\n </ng-container>\n</ng-template>\n", styles: ["svg.svg-icon-arrow>g>polygon{fill:var(--devui-icon-text, #808080)}:host ::ng-deep d-button button.d-btn.d-btn-icon{padding:0!important}:host.editable-cell{position:relative}.cell-modify{position:absolute;right:0;cursor:pointer}.cell-modify>svg{vertical-align:middle}.cell-modify:hover>svg>g>g{fill:var(--devui-icon-text, #808080)}.cell-container{position:relative;height:24px}.cell-container-inner{position:absolute;max-width:100%;width:100%;min-height:24px}.cell-container-inner.modify-holder{padding-right:20px}.cell-container-inner.modify-holder .cell-modify{display:none;cursor:pointer;position:absolute;right:0}.cell-container-inner.modify-holder .cell-modify>svg{vertical-align:middle}.cell-container-inner.modify-holder .cell-modify>svg>g{fill:var(--devui-icon-text, #808080)}.cell-container-inner.modify-holder .cell-modify:hover>svg>g{fill:var(--devui-icon-fill-active-hover, #000000)}.cell-container-inner.modify-holder:hover .cell-modify{display:inline}.not-break{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;word-spacing:normal;word-wrap:normal}.cell-editable{cursor:pointer;margin-left:-5px;padding-left:5px;min-height:20px}.cell-placeholder{display:inline-block;height:16px}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.TableTdService }], propDecorators: { stickyLeftClass: [{
type: HostBinding,
args: ['class.devui-sticky-left-cell']
}], stickyRightClass: [{
type: HostBinding,
args: ['class.devui-sticky-right-cell']
}], stickyLeftStyle: [{
type: HostBinding,
args: ['style.left']
}], stickyRightStyle: [{
type: HostBinding,
args: ['style.right']
}], editable: [{
type: Input
}], editableTip: [{
type: Input
}], nestedColumn: [{
type: Input
}], nestedLayer: [{
type: Input
}], field: [{
type: Input
}], rowItem: [{
type: Input
}], fixedLeft: [{
type: Input
}], fixedRight: [{
type: Input
}], iconFoldTable: [{
type: Input
}], iconUnFoldTable: [{
type: Input
}], nestedColumnIndent: [{
type: Input
}], beforeEditStart: [{
type: Input
}], beforeEditEnd: [{
type: Input
}], toggleChildTableEvent: [{
type: Output
}], editing: [{
type: Input
}], editStatusEvent: [{
type: Output
}], editingChange: [{
type: Output
}], isEditable: [{
type: HostBinding,
args: ['class.editable-cell']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vZGV2dWkvZGF0YS10YWJsZS90YWJsZS9ib2R5L3RkL3RkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2RldnVpL2RhdGEtdGFibGUvdGFibGUvYm9keS90ZC90ZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUNoQixVQUFVLEVBQ1YsWUFBWSxFQUFFLFdBQVcsRUFDekIsS0FBSyxFQUdMLE1BQU0sR0FDVSxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQTRCLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7O0FBUTlDLE1BQU0sT0FBTyxnQkFBZ0I7SUEwQjNCLElBQXdDLFVBQVU7UUFDaEQsT0FBTyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLEtBQUssQ0FBQztJQUN0RSxDQUFDO0lBU0QsWUFBb0IsVUFBc0IsRUFBVSxTQUF5QjtRQUF6RCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7UUEvQnBFLGdCQUFXLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztRQUNoQyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQVFyQix1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUFHdkIsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUVwRCxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFDeEQ7O1dBRUc7UUFDTyxrQkFBYSxH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QyxDQUFDO0lBQ0gsQ0FBQzsrR0F2TFUsZ0JBQWdCO21HQUFoQixnQkFBZ0IsazJCQ25CN0IsKzNIQW9GQTs7NEZEakVhLGdCQUFnQjtrQkFONUIsU0FBUzsrQkFFRSxjQUFjOzRHQUtxQixlQUFlO3NCQUEzRCxXQUFXO3VCQUFDLDhCQUE4QjtnQkFDRyxnQkFBZ0I7c0JBQTdELFdBQVc7dUJBQUMsK0JBQStCO2dCQUNqQixlQUFlO3NCQUF6QyxXQUFXO3VCQUFDLFlBQVk7Z0JBQ0csZ0JBQWdCO3NCQUEzQyxXQUFXO3VCQUFDLGFBQWE7Z0JBQ2pCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0kscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNFLE9BQU87c0JBQWYsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNO2dCQUlHLGFBQWE7c0JBQXRCLE1BQU07Z0JBRWlDLFVBQVU7c0JBQWpELFdBQVc7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZyxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEVkaXRhYmxlVGlwIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS10YWJsZS5tb2RlbCc7XHJcbmltcG9ydCB7IFRhYmxlVGRTZXJ2aWNlIH0gZnJvbSAnLi90ZC5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yKi9cclxuICBzZWxlY3RvcjogJ1tkVGFibGVDZWxsXScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90ZC5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGFibGVUZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRldnVpLXN0aWNreS1sZWZ0LWNlbGwnKSBzdGlja3lMZWZ0Q2xhc3M6IGJvb2xlYW47XHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5kZXZ1aS1zdGlja3ktcmlnaHQtY2VsbCcpIHN0aWNreVJpZ2h0Q2xhc3M6IGJvb2xlYW47XHJcbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5sZWZ0Jykgc3RpY2t5TGVmdFN0eWxlOiBzdHJpbmc7XHJcbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5yaWdodCcpIHN0aWNreVJpZ2h0U3R5bGU6IHN0cmluZztcclxuICBASW5wdXQoKSBlZGl0YWJsZTogYm9vbGVhbjtcclxuICBASW5wdXQoKSBlZGl0YWJsZVRpcCA9IEVkaXRhYmxlVGlwLmhvdmVyO1xyXG4gIEBJbnB1dCgpIG5lc3RlZENvbHVtbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIG5lc3RlZExheWVyOiBudW1iZXI7XHJcbiAgQElucHV0KCkgZmllbGQ6IHN0cmluZztcclxuICBASW5wdXQoKSByb3dJdGVtOiBhbnk7XHJcbiAgQElucHV0KCkgZml4ZWRMZWZ0OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZml4ZWRSaWdodDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGljb25Gb2xkVGFibGU6IHN0cmluZztcclxuICBASW5wdXQoKSBpY29uVW5Gb2xkVGFibGU6IHN0cmluZztcclxuICBASW5wdXQoKSBuZXN0ZWRDb2x1bW5JbmRlbnQgPSAxNjtcclxuICBASW5wdXQoKSBiZWZvcmVFZGl0U3RhcnQ6IChyb3dJdGVtLCBmaWVsZCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gIEBJbnB1dCgpIGJlZm9yZUVkaXRFbmQ6IChyb3dJdGVtLCBmaWVsZCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gIEBPdXRwdXQoKSB0b2dnbGVDaGlsZFRhYmxlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgQElucHV0KCkgZWRpdGluZzogYm9vbGVhbjtcclxuICBAT3V0cHV0KCkgZWRpdFN0YXR1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIC8qKlxyXG4gICAqIOe8lui+keeKtuaAgeiwg+aVtCBAZGVwcmVjYXRlZFxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBlZGl0aW5nQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmVkaXRhYmxlLWNlbGwnKSBnZXQgaXNFZGl0YWJsZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmVkaXRhYmxlICYmICF0aGlzLmVkaXRpbmcgJiYgdGhpcy5lZGl0YWJsZVRpcCAhPT0gJ2J0bic7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRvY3VtZW50Q2xpY2tTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIHRkTW91c2Vkb3duU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSB0ZE1vdXNldXBTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIGNsaWNrSW5UZDogYm9vbGVhbjtcclxuICBwcml2YXRlIHRkQ2xpY2tTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIGN1cnJlbnRFZGl0aW5nID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSB0ZFNlcnZpY2U6IFRhYmxlVGRTZXJ2aWNlKSB7fVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBjb25zdCB7IGZpeGVkTGVmdCwgZml4ZWRSaWdodCwgZWRpdGluZyB9ID0gY2hhbmdlcztcclxuICAgIGlmIChmaXhlZExlZnQpIHtcclxuICAgICAgaWYgKHRoaXMuZml4ZWRMZWZ0KSB7XHJcbiAgICAgICAgdGhpcy5zdGlja3lMZWZ0Q2xhc3MgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc3RpY2t5TGVmdFN0eWxlID0gdGhpcy5maXhlZExlZnQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zdGlja3lMZWZ0Q2xhc3MgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnN0aWNreUxlZnRTdHlsZSA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZml4ZWRSaWdodCkge1xyXG4gICAgICBpZiAodGhpcy5maXhlZFJpZ2h0KSB7XHJcbiAgICAgICAgdGhpcy5zdGlja3lSaWdodENsYXNzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnN0aWNreVJpZ2h0U3R5bGUgPSB0aGlzLmZpeGVkUmlnaHQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zdGlja3lSaWdodENsYXNzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zdGlja3lSaWdodFN0eWxlID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChlZGl0aW5nPy5jdXJyZW50VmFsdWUgJiYgIXRoaXMuY3VycmVudEVkaXRpbmcpIHtcclxuICAgICAgdGhpcy5iaW5kRWRpdENsaWNrRXZlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXJ0RWRpdGluZyhldmVudCkge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgbGV0IGJlZm9yZVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcbiAgICBpZiAodGhpcy5iZWZvcmVFZGl0U3RhcnQpIHtcclxuICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB0aGlzLmJlZm9yZUVkaXRTdGFydCh0aGlzLnJvd0l0ZW0sIHRoaXMuZmllbGQpO1xyXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBpZiAocmVzdWx0LnRoZW4pIHtcclxuICAgICAgICAgIGJlZm9yZVByb21pc2UgPSByZXN1bHQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuc3Vic2NyaWJlKSB7XHJcbiAgICAgICAgICBiZWZvcmVQcm9taXNlID0gKHJlc3VsdCBhcyBPYnNlcnZhYmxlPGJvb2xlYW4+KS50b1Byb21pc2UoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYmVmb3JlUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGJlZm9yZVByb21pc2UudGhlbigoY2FuU3RhcnQpID0+IHtcclxuICAgICAgaWYgKGNhblN0YXJ0KSB7XHJcbiAgICAgICAgdGhpcy5lZGl0aW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRFZGl0aW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmVkaXRpbmdDaGFuZ2UuZW1pdCh0cnVlKTtcclxuICAgICAgICB0aGlzLmVkaXRTdGF0dXNFdmVudC5lbWl0KHRydWUpO1xyXG4gICAgICAgIHRoaXMudGRTZXJ2aWNlLnRhYmxlQ2VsbENsaWNrRXZlbnQuZW1pdChldmVudCk7XHJcbiAgICAgICAgdGhpcy5iaW5kRWRpdENsaWNrRXZlbnQoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBiaW5kRWRpdENsaWNrRXZlbnQoKSB7XHJcbiAgICB0aGlzLmRvY3VtZW50Q2xpY2tTdWJzY3JpcHRpb24gPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdjbGljaycpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICB0YXAoKGU6IEV2ZW50KSA9PiB7XHJcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChjbGlja0V2ZW50KSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoY2xpY2tFdmVudC50YXJnZXQpICYmICF0aGlzLmNsaWNrSW5UZCkge1xyXG4gICAgICAgIHRoaXMuZmluaXNoQ2VsbEVkaXQoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNsaWNrSW5UZCA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRkTW91c2Vkb3duU3Vic2NyaXB0aW9uID0gZnJvbUV2ZW50KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnbW91c2Vkb3duJykuc3Vic2NyaWJlKChldmVudCkgPT4ge1xyXG4gICAgICB0aGlzLmNsaWNrSW5UZCA9IHRydWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnRkTW91c2V1cFN1YnNjcmlwdGlvbiA9IGZyb21FdmVudCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ21vdXNldXAnKS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XHJcbiAgICAgIHRoaXMuY2xpY2tJblRkID0gZmFsc2U7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnRkQ2xpY2tTdWJzY3JpcHRpb24gPSB0aGlzLnRkU2VydmljZS50YWJsZUNlbGxDbGlja0V2ZW50LnN1YnNjcmliZSgoY2xpY2tFdmVudCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGNsaWNrRXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICAgIHRoaXMuZmluaXNoQ2VsbEVkaXQoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVFZGl0Q2xpY2tFdmVudCgpIHtcclxuICAgIGlmICh0aGlzLmRvY3VtZW50Q2xpY2tTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5kb2N1bWVudENsaWNrU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHRoaXMuZG9jdW1lbnRDbGlja1N1YnNjcmlwdGlvbiA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50ZENsaWNrU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMudGRDbGlja1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICB0aGlzLnRkQ2xpY2tTdWJzY3JpcHRpb24gPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmluaXNoQ2VsbEVkaXQoKSB7XHJcbiAgICBsZXQgYmVmb3JlUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh0cnVlKTtcclxuICAgIGlmICh0aGlzLmJlZm9yZUVkaXRFbmQpIHtcclxuICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB0aGlzLmJlZm9yZUVkaXRFbmQodGhpcy5yb3dJdGVtLCB0aGlzLmZpZWxkKTtcclxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC50aGVuKSB7XHJcbiAgICAgICAgICBiZWZvcmVQcm9taXNlID0gcmVzdWx0O1xyXG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnN1YnNjcmliZSkge1xyXG4gICAgICAgICAgYmVmb3JlUHJvbWlzZSA9IChyZXN1bHQgYXMgT2JzZXJ2YWJsZTxib29sZWFuPikudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGJlZm9yZVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGJlZm9yZVByb21pc2UudGhlbigoY2FuRW5kKSA9PiB7XHJcbiAgICAgIGlmIChjYW5FbmQpIHtcclxuICAgICAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRFZGl0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5lZGl0aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZWRpdFN0YXR1c0V2ZW50LmVtaXQoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlRWRpdENsaWNrRXZlbnQoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVDaGlsZFRhYmxlKHJvd0l0ZW0pIHtcclxuICAgIHJvd0l0ZW0uJGlzQ2hpbGRUYWJsZU9wZW4gPSAhcm93SXRlbS4kaXNDaGlsZFRhYmxlT3BlbjtcclxuICAgIHRoaXMudG9nZ2xlQ2hpbGRUYWJsZUV2ZW50LmVtaXQocm93SXRlbS4kaXNDaGlsZFRhYmxlT3Blbik7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRvY3VtZW50Q2xpY2tTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5kb2N1bWVudENsaWNrU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHRoaXMuZG9jdW1lbnRDbGlja1N1YnNjcmlwdGlvbiA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50ZENsaWNrU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMudGRDbGlja1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICB0aGlzLnRkQ2xpY2tTdWJzY3JpcHRpb24gPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnRkTW91c2Vkb3duU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMudGRNb3VzZWRvd25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgdGhpcy50ZE1vdXNlZG93blN1YnNjcmlwdGlvbiA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudGRNb3VzZXVwU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMudGRNb3VzZXVwU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHRoaXMudGRNb3VzZXVwU3Vic2NyaXB0aW9uID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRhYmxlICYmICFlZGl0aW5nXCI+XG4gIDxkaXYgKm5nSWY9XCJlZGl0YWJsZVRpcCA9PT0gJ2J0bidcIiBjbGFzcz1cImNlbGwtY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImNlbGwtY29udGFpbmVyLWlubmVyIG5vdC1icmVhayBtb2RpZnktaG9sZGVyXCI+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkVG1wXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgbmVzdGVkQ29sdW1uOiBuZXN0ZWRDb2x1bW4sIHJvd0l0ZW06IHJvd0l0ZW0sIG5lc3RlZExheWVyOiBuZXN0ZWRMYXllciB9XCJcbiAgICAgID48L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY2VsbC1tb2RpZnlcIiAoY2xpY2spPVwic3RhcnRFZGl0aW5nKCRldmVudClcIj5cbiAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIHdpZHRoPVwiMTZweFwiIGhlaWdodD1cIjE2cHhcIiB2ZXJzaW9uPVwiMS4xXCI+XG4gICAgICAgICAgPGcgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIj5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNIDkuNDg1MjggMy40MTQyMSBMIDEwLjg5OTUgMiBMIDEzLjcyNzkgNC44Mjg0MyBMIDEyLjMxMzcgNi4yNDI2NCBMIDkuNDg1MjggMy40MTQyMSBaIE0gNS4yNDI2NCAxMy4zMTM3IEwgMi40MTQyMSAxMy4zMTM3IEwgMi40MTQyMSAxMC40ODUzIEwgOC43NzgxNyA0LjEyMTMyIEwgMTEuNjA2NiA2Ljk0OTc1IEwgNS4yNDI2NCAxMy4zMTM3IFpcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2c+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwiZWRpdGFibGVUaXAgIT09ICdidG4nXCIgY2xhc3M9XCJjZWxsLWVkaXRhYmxlIG5vdC1icmVha1wiIChjbGljayk9XCJzdGFydEVkaXRpbmcoJGV2ZW50KVwiPlxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkVG1wXCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IG5lc3RlZENvbHVtbjogbmVzdGVkQ29sdW1uLCByb3dJdGVtOiByb3dJdGVtLCBuZXN0ZWRMYXllcjogbmVzdGVkTGF5ZXIgfVwiXG4gICAgPjwvbmctdGVtcGxhdGU+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFlZGl0YWJsZSB8fCBlZGl0aW5nXCI+XG4gIDxuZy10ZW1wbGF0ZVxuICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5lc3RlZFRtcFwiXG4gICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgbmVzdGVkQ29sdW1uOiBuZXN0ZWRDb2x1bW4sIHJvd0l0ZW06IHJvd0l0ZW0sIG5lc3RlZExheWVyOiBuZXN0ZWRMYXllciB9XCJcbiAgPjwvbmctdGVtcGxhdGU+XG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50XCI+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNjb250ZW50PjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI25lc3RlZFRtcCBsZXQtbmVzdGVkQ29sdW1uPVwibmVzdGVkQ29sdW1uXCIgbGV0LXJvd0l0ZW09XCJyb3dJdGVtXCIgbGV0LW5lc3RlZExheWVyPVwibmVzdGVkTGF5ZXJcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5lc3RlZENvbHVtblwiPlxuICAgIDxzcGFuICpuZ0lmPVwibmVzdGVkTGF5ZXIgPiAwXCIgY2xhc3M9XCJjZWxsLXBsYWNlaG9sZGVyXCIgW25nU3R5bGVdPVwieyB3aWR0aDogbmVzdGVkTGF5ZXIgKiBuZXN0ZWRDb2x1bW5JbmRlbnQgKyAncHgnIH1cIj48L3NwYW4+XG4gICAgPHNwYW4gW3N0eWxlLnZpc2liaWxpdHldPVwicm93SXRlbS5jaGlsZHJlbiA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nXCIgY2xhc3M9XCJjaGlsZHRhYmxlLXRvZ2dsZXJcIiAoY2xpY2spPVwidG9nZ2xlQ2hpbGRUYWJsZShyb3dJdGVtKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvd0l0ZW1bJyRpc0NoaWxkVGFibGVPcGVuJ11cIj5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgICpuZ0lmPVwiIWljb25Gb2xkVGFibGVcIlxuICAgICAgICAgIHdpZHRoPVwiMTZweFwiXG4gICAgICAgICAgaGVpZ2h0PVwiMTZweFwiXG4gICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgdmVyc2lvbj1cIjEuMVwiXG4gICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcbiAgICAgICAgICBjbGFzcz1cInN2Zy1pY29uIHN2Zy1pY29uLWNsb3NlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxnIHN0cm9rZT1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCIxXCIgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+XG4gICAgICAgICAgICA8cmVjdCB4PVwiMC41XCIgeT1cIjAuNVwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHJ4PVwiMlwiPjwvcmVjdD5cbiAgICAgICAgICAgIDxyZWN0IHg9XCI0XCIgeT1cIjdcIiB3aWR0aD1cIjhcIiBoZWlnaHQ9XCIyXCI+PC9yZWN0PlxuICAgICAgICAgIDwvZz5cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaWNvbkZvbGRUYWJsZVwiIFtpbm5lckhUTUxdPVwiaWNvbkZvbGRUYWJsZSB8IHNhZmU6ICdodG1sJ1wiPjwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFyb3dJdGVtWyckaXNDaGlsZFRhYmxlT3BlbiddXCI+XG4gICAgICAgIDxzdmdcbiAgICAgICAgICAqbmdJZj1cIiFpY29uVW5Gb2xkVGFibGVcIlxuICAgICAgICAgIHdpZHRoPVwiMTZweFwiXG4gICAgICAgICAgaGVpZ2h0PVwiMTZweFwiXG4gICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgdmVyc2lvbj1cIjEuMVwiXG4gICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcbiAgICAgICAgICBjbGFzcz1cInN2Zy1pY29uIHN2Zy1pY29uLW9wZW4tZm9sZGVyXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxnIHN0cm9rZT1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCIxXCIgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+XG4gICAgICAgICAgICA8cmVjdCB4PVwiMC41XCIgeT1cIjAuNVwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHJ4PVwiMlwiPjwvcmVjdD5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNOC43NSw0IEw4Ljc1LDcuMjUgTDEyLDcuMjUgTDEyLDguNzUgTDguNzQ5LDguNzUgTDguNzUsMTIgTDcuMjUsMTIgTDcuMjQ5LDguNzUgTDQsOC43NSBMNCw3LjI1IEw3LjI1LDcuMjUgTDcuMjUsNCBMOC43NSw0IFpcIlxuICAgICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICA8L2c+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImljb25VbkZvbGRUYWJsZVwiIFtpbm5lckhUTUxdPVwiaWNvblVuRm9sZFRhYmxlIHwgc2FmZTogJ2h0bWwnXCI+PC9zcGFuPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9zcGFuPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=