@hmcts/media-viewer
Version:
116 lines • 19.4 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "../../../../toolbar/toolbar-event.service";
import * as i2 from "../../annotation-create/highlight-create/highlight-create.service";
import * as i3 from "@angular/common";
import * as i4 from "mutable-div";
export class RectangleComponent {
set annoRect(annoRect) {
this._annoRect = { ...annoRect };
this.height = +(annoRect.height * this.zoom).toFixed(2);
this.width = +(annoRect.width * this.zoom).toFixed(2);
this.left = +(annoRect.x * this.zoom).toFixed(2);
this.top = +(annoRect.y * this.zoom).toFixed(2);
}
get annoRect() {
return this._annoRect;
}
constructor(toolbarEvents, highlightService) {
this.toolbarEvents = toolbarEvents;
this.highlightService = highlightService;
this.selectEvent = new EventEmitter();
this.updateEvent = new EventEmitter();
this.subscriptions = [];
this.enableGrabNDrag = false;
}
ngOnChanges(changes) {
if (changes.rotate) {
this.adjustForRotation(this.rotate);
}
}
ngAfterViewInit() {
this.subscriptions.push(this.toolbarEvents.grabNDrag.subscribe(grabNDrag => this.enableGrabNDrag = grabNDrag));
}
ngOnDestroy() {
this.subscriptions.filter(subscription => !subscription.closed)
.forEach(subscription => subscription.unsubscribe());
}
set selected(selected) {
this._selected = selected;
if (this._selected && this.viewRect) {
this.viewRect.nativeElement.focus();
}
}
get selected() {
return this._selected;
}
onClick() {
this.selectEvent.emit(this.annoRect);
}
onUpdate(viewRect) {
const { offsetHeight, offsetWidth, offsetTop, offsetLeft } = viewRect;
if (this.hasRectangleChanged(viewRect)) {
let rectangle = this.highlightService
.applyRotation(this.pageHeight, this.pageWidth, offsetHeight, offsetWidth, offsetTop, offsetLeft, this.rotate, this.zoom);
rectangle = { ...this.annoRect, ...rectangle };
this.updateEvent.emit({ ...rectangle });
}
}
adjustForRotation(rotation) {
const { top, left, height, width } = this;
switch (rotation) {
case 90:
this.width = height;
this.height = width;
this.left = this.pageWidth - top - height;
this.top = left;
break;
case 180:
this.left = this.pageWidth - left - width;
this.top = this.pageHeight - top - height;
break;
case 270:
this.width = height;
this.height = width;
this.left = top;
this.top = this.pageHeight - left - width;
break;
}
}
hasRectangleChanged(viewRect) {
return Math.round(this.left) !== viewRect.offsetLeft ||
Math.round(this.top) !== viewRect.offsetTop ||
Math.round(this.width) !== viewRect.offsetWidth ||
Math.round(this.height) !== viewRect.offsetHeight;
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RectangleComponent, deps: [{ token: i1.ToolbarEventService }, { token: i2.HighlightCreateService }], target: i0.ɵɵFactoryTarget.Component }); }
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: RectangleComponent, selector: "mv-anno-rectangle", inputs: { color: "color", zoom: "zoom", rotate: "rotate", editable: "editable", pageHeight: "pageHeight", pageWidth: "pageWidth", annoRect: "annoRect", selected: "selected" }, outputs: { selectEvent: "selectEvent", updateEvent: "updateEvent" }, viewQueries: [{ propertyName: "viewRect", first: true, predicate: ["rectElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"editable; else nonEditable\">\n <div #rectElement\n class=\"rectangle\"\n draggable\n resizable\n [tabindex]=\"annoRect.id\"\n [ngClass]=\"{ 'selected': selected, 'grabNDrag': enableGrabNDrag }\"\n [style.backgroundColor]=\"'#' + color\"\n [style.width]=\"width + 'px'\"\n [style.height]=\"height + 'px'\"\n [style.left]=\"left + 'px'\"\n [style.top]=\"top + 'px'\"\n [rotate]=\"0\"\n [selected]=\"selected\"\n (click)=\"onClick()\"\n (stopped)=\"onUpdate(rectElement)\">\n </div>\n</div>\n<ng-template #nonEditable>\n <div #rectElement\n class=\"rectangle\"\n [tabindex]=\"annoRect.id\"\n [ngClass]=\"{ 'selected': selected }\"\n [style.backgroundColor]=\"'#' + color\"\n [style.width]=\"width + 'px'\"\n [style.height]=\"height+ 'px'\"\n [style.left]=\"left + 'px'\"\n [style.top]=\"top + 'px'\"\n (click)=\"onClick()\">\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DraggableElementDirective, selector: "[draggable]", inputs: ["rotate"], outputs: ["coordinates", "stopped"] }, { kind: "directive", type: i4.ResizableElementDirective, selector: "[resizable]", inputs: ["rotate", "selected"], outputs: ["stopped"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RectangleComponent, decorators: [{
type: Component,
args: [{ selector: 'mv-anno-rectangle', template: "<div *ngIf=\"editable; else nonEditable\">\n <div #rectElement\n class=\"rectangle\"\n draggable\n resizable\n [tabindex]=\"annoRect.id\"\n [ngClass]=\"{ 'selected': selected, 'grabNDrag': enableGrabNDrag }\"\n [style.backgroundColor]=\"'#' + color\"\n [style.width]=\"width + 'px'\"\n [style.height]=\"height + 'px'\"\n [style.left]=\"left + 'px'\"\n [style.top]=\"top + 'px'\"\n [rotate]=\"0\"\n [selected]=\"selected\"\n (click)=\"onClick()\"\n (stopped)=\"onUpdate(rectElement)\">\n </div>\n</div>\n<ng-template #nonEditable>\n <div #rectElement\n class=\"rectangle\"\n [tabindex]=\"annoRect.id\"\n [ngClass]=\"{ 'selected': selected }\"\n [style.backgroundColor]=\"'#' + color\"\n [style.width]=\"width + 'px'\"\n [style.height]=\"height+ 'px'\"\n [style.left]=\"left + 'px'\"\n [style.top]=\"top + 'px'\"\n (click)=\"onClick()\">\n </div>\n</ng-template>\n" }]
}], ctorParameters: () => [{ type: i1.ToolbarEventService }, { type: i2.HighlightCreateService }], propDecorators: { color: [{
type: Input
}], zoom: [{
type: Input
}], rotate: [{
type: Input
}], editable: [{
type: Input
}], pageHeight: [{
type: Input
}], pageWidth: [{
type: Input
}], selectEvent: [{
type: Output
}], updateEvent: [{
type: Output
}], viewRect: [{
type: ViewChild,
args: ['rectElement', { static: false }]
}], annoRect: [{
type: Input
}], selected: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjdGFuZ2xlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21lZGlhLXZpZXdlci9zcmMvbGliL2Fubm90YXRpb25zL2Fubm90YXRpb24tc2V0L2Fubm90YXRpb24tdmlldy9yZWN0YW5nbGUvcmVjdGFuZ2xlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21lZGlhLXZpZXdlci9zcmMvbGliL2Fubm90YXRpb25zL2Fubm90YXRpb24tc2V0L2Fubm90YXRpb24tdmlldy9yZWN0YW5nbGUvcmVjdGFuZ2xlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUFVdkIsTUFBTSxPQUFPLGtCQUFrQjtJQXdCN0IsSUFDSSxRQUFRLENBQUMsUUFBbUI7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENB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QkFBa0I7a0JBSjlCLFNBQVM7K0JBQ0UsbUJBQW1COzZIQUtwQixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBRW9DLFFBQVE7c0JBQWxELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztnQkFhckMsUUFBUTtzQkFEWCxLQUFLO2dCQW1DRixRQUFRO3NCQURYLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlY3RhbmdsZSB9IGZyb20gJy4vcmVjdGFuZ2xlLm1vZGVsJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVG9vbGJhckV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3Rvb2xiYXIvdG9vbGJhci1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEhpZ2hsaWdodENyZWF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9hbm5vdGF0aW9uLWNyZWF0ZS9oaWdobGlnaHQtY3JlYXRlL2hpZ2hsaWdodC1jcmVhdGUuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ212LWFubm8tcmVjdGFuZ2xlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlY3RhbmdsZS5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgUmVjdGFuZ2xlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpIGNvbG9yOiBTdHJpbmc7XG4gIEBJbnB1dCgpIHpvb206IG51bWJlcjtcbiAgQElucHV0KCkgcm90YXRlOiBudW1iZXI7XG4gIEBJbnB1dCgpIGVkaXRhYmxlOiBib29sZWFuO1xuICBASW5wdXQoKSBwYWdlSGVpZ2h0OiBudW1iZXI7XG4gIEBJbnB1dCgpIHBhZ2VXaWR0aDogbnVtYmVyO1xuXG4gIEBPdXRwdXQoKSBzZWxlY3RFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjdGFuZ2xlPigpO1xuICBAT3V0cHV0KCkgdXBkYXRlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFJlY3RhbmdsZT4oKTtcblxuICBAVmlld0NoaWxkKCdyZWN0RWxlbWVudCcsIHtzdGF0aWM6IGZhbHNlfSkgdmlld1JlY3Q6IEVsZW1lbnRSZWY7XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBfc2VsZWN0ZWQ6IGJvb2xlYW47XG4gIGVuYWJsZUdyYWJORHJhZyA9IGZhbHNlO1xuXG4gIGhlaWdodDogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICB0b3A6IG51bWJlcjtcbiAgbGVmdDogbnVtYmVyO1xuXG4gIF9hbm5vUmVjdDogUmVjdGFuZ2xlO1xuICBASW5wdXQoKVxuICBzZXQgYW5ub1JlY3QoYW5ub1JlY3Q6IFJlY3RhbmdsZSkge1xuICAgIHRoaXMuX2Fubm9SZWN0ID0geyAuLi5hbm5vUmVjdCB9O1xuICAgIHRoaXMuaGVpZ2h0ID0gKyhhbm5vUmVjdC5oZWlnaHQgKiB0aGlzLnpvb20pLnRvRml4ZWQoMik7XG4gICAgdGhpcy53aWR0aCA9ICsoYW5ub1JlY3Qud2lkdGggKiB0aGlzLnpvb20pLnRvRml4ZWQoMik7XG4gICAgdGhpcy5sZWZ0ID0gKyhhbm5vUmVjdC54ICogdGhpcy56b29tKS50b0ZpeGVkKDIpO1xuICAgIHRoaXMudG9wID0gKyhhbm5vUmVjdC55ICogdGhpcy56b29tKS50b0ZpeGVkKDIpO1xuICB9XG5cbiAgZ2V0IGFubm9SZWN0KCkge1xuICAgIHJldHVybiB0aGlzLl9hbm5vUmVjdDtcbiAgfVxuXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB0b29sYmFyRXZlbnRzOiBUb29sYmFyRXZlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGhpZ2hsaWdodFNlcnZpY2U6IEhpZ2hsaWdodENyZWF0ZVNlcnZpY2UpIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLnJvdGF0ZSkge1xuICAgICAgdGhpcy5hZGp1c3RGb3JSb3RhdGlvbih0aGlzLnJvdGF0ZSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy50b29sYmFyRXZlbnRzLmdyYWJORHJhZy5zdWJzY3JpYmUoZ3JhYk5EcmFnID0+IHRoaXMuZW5hYmxlR3JhYk5EcmFnID0gZ3JhYk5EcmFnKVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZmlsdGVyKHN1YnNjcmlwdGlvbiA9PiAhc3Vic2NyaXB0aW9uLmNsb3NlZClcbiAgICAgIC5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgc2VsZWN0ZWQoc2VsZWN0ZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgIGlmICh0aGlzLl9zZWxlY3RlZCAmJiB0aGlzLnZpZXdSZWN0KSB7XG4gICAgICB0aGlzLnZpZXdSZWN0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2VsZWN0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkO1xuICB9XG5cbiAgb25DbGljaygpIHtcbiAgICB0aGlzLnNlbGVjdEV2ZW50LmVtaXQodGhpcy5hbm5vUmVjdCk7XG4gIH1cblxuICBvblVwZGF0ZSh2aWV3UmVjdDogYW55KSB7XG4gICAgY29uc3QgeyBvZmZzZXRIZWlnaHQsIG9mZnNldFdpZHRoLCBvZmZzZXRUb3AsIG9mZnNldExlZnQgfSA9IHZpZXdSZWN0O1xuICAgIGlmICh0aGlzLmhhc1JlY3RhbmdsZUNoYW5nZWQodmlld1JlY3QpKSB7XG4gICAgICBsZXQgcmVjdGFuZ2xlID0gdGhpcy5oaWdobGlnaHRTZXJ2aWNlXG4gICAgICAgIC5hcHBseVJvdGF0aW9uKHRoaXMucGFnZUhlaWdodCwgdGhpcy5wYWdlV2lkdGgsIG9mZnNldEhlaWdodCwgb2Zmc2V0V2lkdGgsIG9mZnNldFRvcCwgb2Zmc2V0TGVmdCwgdGhpcy5yb3RhdGUsIHRoaXMuem9vbSk7XG4gICAgICByZWN0YW5nbGUgPSB7IC4uLnRoaXMuYW5ub1JlY3QsIC4uLnJlY3RhbmdsZSB9O1xuICAgICAgdGhpcy51cGRhdGVFdmVudC5lbWl0KHsgLi4ucmVjdGFuZ2xlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFkanVzdEZvclJvdGF0aW9uKHJvdGF0aW9uOiBudW1iZXIpIHtcbiAgICBjb25zdCB7IHRvcCwgbGVmdCwgaGVpZ2h0LCB3aWR0aCB9ID0gdGhpcztcbiAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICB0aGlzLndpZHRoID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmhlaWdodCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmxlZnQgPSB0aGlzLnBhZ2VXaWR0aCAgLSB0b3AgLSBoZWlnaHQ7XG4gICAgICAgIHRoaXMudG9wID0gbGVmdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5wYWdlV2lkdGggLSBsZWZ0IC0gd2lkdGg7XG4gICAgICAgIHRoaXMudG9wID0gdGhpcy5wYWdlSGVpZ2h0IC0gdG9wIC0gaGVpZ2h0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICB0aGlzLndpZHRoID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmhlaWdodCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmxlZnQgPSB0b3A7XG4gICAgICAgIHRoaXMudG9wID0gdGhpcy5wYWdlSGVpZ2h0IC0gbGVmdCAtIHdpZHRoO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBoYXNSZWN0YW5nbGVDaGFuZ2VkKHZpZXdSZWN0KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy5sZWZ0KSAhPT0gdmlld1JlY3Qub2Zmc2V0TGVmdCB8fFxuICAgICAgTWF0aC5yb3VuZCh0aGlzLnRvcCkgIT09IHZpZXdSZWN0Lm9mZnNldFRvcCB8fFxuICAgICAgTWF0aC5yb3VuZCh0aGlzLndpZHRoKSAhPT0gdmlld1JlY3Qub2Zmc2V0V2lkdGggfHxcbiAgICAgIE1hdGgucm91bmQodGhpcy5oZWlnaHQpICE9PSB2aWV3UmVjdC5vZmZzZXRIZWlnaHQ7XG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJlZGl0YWJsZTsgZWxzZSBub25FZGl0YWJsZVwiPlxuICA8ZGl2ICNyZWN0RWxlbWVudFxuICAgICAgIGNsYXNzPVwicmVjdGFuZ2xlXCJcbiAgICAgICBkcmFnZ2FibGVcbiAgICAgICByZXNpemFibGVcbiAgICAgICBbdGFiaW5kZXhdPVwiYW5ub1JlY3QuaWRcIlxuICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkJzogc2VsZWN0ZWQsICdncmFiTkRyYWcnOiBlbmFibGVHcmFiTkRyYWcgfVwiXG4gICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCInIycgKyBjb2xvclwiXG4gICAgICAgW3N0eWxlLndpZHRoXT1cIndpZHRoICsgJ3B4J1wiXG4gICAgICAgW3N0eWxlLmhlaWdodF09XCJoZWlnaHQgKyAncHgnXCJcbiAgICAgICBbc3R5bGUubGVmdF09XCJsZWZ0ICsgJ3B4J1wiXG4gICAgICAgW3N0eWxlLnRvcF09XCJ0b3AgKyAncHgnXCJcbiAgICAgICBbcm90YXRlXT1cIjBcIlxuICAgICAgIFtzZWxlY3RlZF09XCJzZWxlY3RlZFwiXG4gICAgICAgKGNsaWNrKT1cIm9uQ2xpY2soKVwiXG4gICAgICAgKHN0b3BwZWQpPVwib25VcGRhdGUocmVjdEVsZW1lbnQpXCI+XG4gIDwvZGl2PlxuPC9kaXY+XG48bmctdGVtcGxhdGUgI25vbkVkaXRhYmxlPlxuICA8ZGl2ICNyZWN0RWxlbWVudFxuICAgICAgIGNsYXNzPVwicmVjdGFuZ2xlXCJcbiAgICAgICBbdGFiaW5kZXhdPVwiYW5ub1JlY3QuaWRcIlxuICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdGVkJzogc2VsZWN0ZWQgfVwiXG4gICAgICAgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09XCInIycgKyBjb2xvclwiXG4gICAgICAgW3N0eWxlLndpZHRoXT1cIndpZHRoICsgJ3B4J1wiXG4gICAgICAgW3N0eWxlLmhlaWdodF09XCJoZWlnaHQrICdweCdcIlxuICAgICAgIFtzdHlsZS5sZWZ0XT1cImxlZnQgKyAncHgnXCJcbiAgICAgICBbc3R5bGUudG9wXT1cInRvcCArICdweCdcIlxuICAgICAgIChjbGljayk9XCJvbkNsaWNrKClcIj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19