@formql/core
Version:
FormQL - A framework for building dynamic forms
167 lines • 23.8 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, Input, ViewChild, ViewContainerRef } from '@angular/core';
import { FormGroup } from '@angular/forms';
import { InternalEventHandlerService } from '../services/internal-event-handler.service';
import { InternalEventType } from '../models/internal-event.model';
import { ComponentResolverService } from '../services/component-resolver.service';
import { FormQLMode, ContainerType } from '../models/type.model';
import { GridPositionType } from '../models/style.model';
import { DndService } from '../services/dnd.service';
import { StoreService } from '../services/store.service';
let SectionWrapperComponent = class SectionWrapperComponent {
constructor(internalEventHandlerService, componentResolverService, viewContainerRef, dndService, storeService) {
this.internalEventHandlerService = internalEventHandlerService;
this.componentResolverService = componentResolverService;
this.viewContainerRef = viewContainerRef;
this.dndService = dndService;
this.storeService = storeService;
this.FormQLMode = FormQLMode;
this.ContainerType = ContainerType;
this.ComponentPositionType = GridPositionType;
}
ngOnInit() {
this.components = this.createComponents(this.section);
if (this.mode === FormQLMode.Edit) {
const tooltip = this.viewContainerRef.createComponent(this.componentResolverService.resolveComponent('TooltipComponent'));
tooltip.instance.wrapper = this.wrapper;
tooltip.instance.type = ContainerType.Section;
tooltip.instance.object = this.section;
this.tooltip.insert(tooltip.hostView);
}
}
editField() {
if (this.mode === FormQLMode.Edit)
this.internalEventHandlerService.send(InternalEventType.EditingSection, this.section);
}
synchroniseModel($event, positionId, positionType) {
const dndEvent = {
sourceObjectId: $event.sourceObjectId,
sourceWrapperId: $event.sourceWrapperId,
targetPositionId: positionId,
targetWrapperId: this.section.sectionId,
targetIndexId: $event.targetIndexId,
positionType: positionType
};
this.page = this.dndService.synchroniseSectionModel(this.page, dndEvent);
this.storeService.reSetForm(InternalEventType.DndFormChanged, this.page);
}
trackByFn(index, item) {
return item.id;
}
createComponents(section) {
const components = {};
if (section && section.components)
section.components.sort((left, right) => {
return left.position.index - right.position.index;
});
section.components.forEach(component => {
if (components && components[component.position.type + '_' + component.position.id])
components[component.position.type + '_' + component.position.id].push(component);
else
components[component.position.type + '_' + component.position.id] = [component];
});
return components;
}
};
__decorate([
ViewChild('wrapper', { read: ViewContainerRef, static: true }),
__metadata("design:type", ViewContainerRef)
], SectionWrapperComponent.prototype, "wrapper", void 0);
__decorate([
ViewChild('tooltip', { read: ViewContainerRef, static: true }),
__metadata("design:type", ViewContainerRef)
], SectionWrapperComponent.prototype, "tooltip", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], SectionWrapperComponent.prototype, "section", void 0);
__decorate([
Input(),
__metadata("design:type", FormGroup)
], SectionWrapperComponent.prototype, "reactiveSection", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], SectionWrapperComponent.prototype, "page", void 0);
__decorate([
Input(),
__metadata("design:type", Number)
], SectionWrapperComponent.prototype, "mode", void 0);
SectionWrapperComponent = __decorate([
Component({
// tslint:disable-next-line: component-selector
selector: '[formql-section-wrapper]',
template: `
<div #wrapper formqlDnd
[sourceObjectId]="section.sectionId"
[attr.sectionId]="section.sectionId"
[sourceWrapperId]="page.pageId"
[type]="ContainerType.Section"
[mode]="mode"
[ngClass]="[(mode === FormQLMode.Edit) ? 'fql-section-wrapper-edit' : 'fql-section-wrapper']">
<div class="fql-section-tooltip">
<ng-container #tooltip></ng-container>
</div>
<div *ngIf="section.template && !section.template.header.hidden" class="fql-section-header">
<ng-template formqlGdConfig
[formqlGdConfigOf]="section.template.header" let-headeritem let-i="index">
<ng-container *ngTemplateOutlet="templateRef;
context: {
templateitem: headeritem,
positionType: ComponentPositionType.Header
}">
</ng-container>
</ng-template>
</div>
<div *ngIf="section.template && !section.template.body.hidden" class="fql-section-body">
<ng-template formqlGdConfig
[formqlGdConfigOf]="section.template.body" let-bodyitem let-i="index">
<ng-container *ngTemplateOutlet="templateRef;
context: {
templateitem: bodyitem,
positionType: ComponentPositionType.Body
}">
</ng-container>
</ng-template>
</div>
</div>
<ng-template #templateRef let-templateitem="templateitem" let-positionType="positionType">
<div [ngStyle]="templateitem.style">
<div formqlDndDrop
*ngIf="(mode === FormQLMode.Edit)"
[type]="ContainerType.Component"
class="fql-section-container"
(synchronise)="synchroniseModel($event, templateitem.id, positionType)">
<ng-container *ngFor="let component of components[positionType + '_' + templateitem.id]; trackBy: trackByFn">
<div formql-component-container
[ngClass]="{'fql-component-container-hidden': component.rules?.hidden?.value}"
[component]="component"
[sectionId]="section.sectionId"
[value]="component.value"
[reactiveSection]="reactiveSection"
[mode]="mode"></div>
</ng-container>
</div>
<div *ngIf="mode !== FormQLMode.Edit">
<ng-container *ngFor="let component of components[positionType + '_' + templateitem.id]; trackBy: trackByFn">
<div formql-component-container *ngIf="!component.rules?.hidden?.value"
[component]="component"
[sectionId]="section.sectionId"
[value]="component.value"
[reactiveSection]="reactiveSection"
[mode]="mode"></div>
</ng-container>
</div>
</div>
</ng-template>
`,
styles: [".fql-bundle-field-input{width:100%;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.fql-bundle-checkbox-input{cursor:pointer;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.fql-bundle-label-required:after{content:\" *\";color:red}.fql-bundle-field-radio{cursor:pointer}.fql-error-message{text-align:center;padding:20px}.fql-dnd-container-separator{box-shadow:0 -2px 0 #00f}.fql-dnd-container-drop-area{outline:dashed 3px}.fql-section-wrapper,.fql-section-wrapper-edit{display:-ms-grid;display:grid;padding:1px;-ms-grid-columns:100%;grid-template-columns:100%;-ms-grid-rows:auto auto;grid-template-rows:auto auto;position:relative}.fql-section-wrapper-edit:hover .fql-section-tooltip{opacity:1}.fql-section-tooltip{opacity:0;display:block;position:absolute;right:0;z-index:1;transition:opacity .3s}.fql-section-header{display:-ms-grid;display:grid;min-height:30px;-ms-grid-row:1;-ms-grid-column:1}.fql-section-body{display:-ms-grid;display:grid;min-height:30px;-ms-grid-row:2;-ms-grid-column:1}.fql-section-container{display:table;height:100%;width:100%;min-height:15px}.fql-section-container:hover{outline:solid 1px}.fql-component-container-hidden{background-color:#ffecf2}"]
}),
__metadata("design:paramtypes", [InternalEventHandlerService,
ComponentResolverService,
ViewContainerRef,
DndService,
StoreService])
], SectionWrapperComponent);
export { SectionWrapperComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdGlvbi13cmFwcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bmb3JtcWwvY29yZS8iLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvc2VjdGlvbi13cmFwcGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN6RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUduRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXpELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUF3RXpELElBQWEsdUJBQXVCLEdBQXBDLE1BQWEsdUJBQXVCO0lBaUJsQyxZQUNZLDJCQUF3RCxFQUN4RCx3QkFBa0QsRUFDbEQsZ0JBQWtDLEVBQ2xDLFVBQXNCLEVBQ3RCLFlBQTBCO1FBSjFCLGdDQUEyQixHQUEzQiwyQkFBMkIsQ0FBNkI7UUFDeEQsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFUL0IsZUFBVSxHQUFHLFVBQVUsQ0FBQztRQUN4QixrQkFBYSxHQUFHLGFBQWEsQ0FBQztRQUM5QiwwQkFBcUIsR0FBRyxnQkFBZ0IsQ0FBQztJQVE1QyxDQUFDO0lBRUwsUUFBUTtRQUVOLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV0RCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLElBQUksRUFBRTtZQUNqQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7WUFDcEgsT0FBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN6QyxPQUFRLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQy9DLE9BQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3ZDO0lBQ0gsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLElBQUk7WUFDL0IsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxNQUFtQixFQUFFLFVBQWtCLEVBQUUsWUFBOEI7UUFDdEYsTUFBTSxRQUFRLEdBQWE7WUFDekIsY0FBYyxFQUFFLE1BQU0sQ0FBQyxjQUFjO1lBQ3JDLGVBQWUsRUFBRSxNQUFNLENBQUMsZUFBZTtZQUN2QyxnQkFBZ0IsRUFBRSxVQUFVO1lBQzVCLGVBQWUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVM7WUFDdkMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhO1lBQ25DLFlBQVksRUFBRSxZQUFZO1NBQzNCLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUk7UUFDbkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxPQUFvQjtRQUMzQyxNQUFNLFVBQVUsR0FBbUIsRUFBRSxDQUFDO1FBQ3RDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFVO1lBQy9CLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBd0IsRUFBRSxLQUF5QixFQUFFLEVBQUU7Z0JBQzVFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNyQyxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNqRixVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDOztnQkFFbEYsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFDLENBQUM7UUFFTCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0NBRUYsQ0FBQTtBQTNFaUU7SUFBL0QsU0FBUyxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7OEJBQVUsZ0JBQWdCO3dEQUFDO0FBQzFCO0lBQS9ELFNBQVMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDOzhCQUFVLGdCQUFnQjt3REFBQztBQUVqRjtJQUFSLEtBQUssRUFBRTs7d0RBQXNCO0FBQ3JCO0lBQVIsS0FBSyxFQUFFOzhCQUFrQixTQUFTO2dFQUFDO0FBQzNCO0lBQVIsS0FBSyxFQUFFOztxREFBZ0I7QUFDZjtJQUFSLEtBQUssRUFBRTs7cURBQWtCO0FBUmYsdUJBQXVCO0lBckVuQyxTQUFTLENBQUM7UUFDVCwrQ0FBK0M7UUFDL0MsUUFBUSxFQUFFLDBCQUEwQjtRQUNwQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztTQStESDs7S0FFUixDQUFDO3FDQW1CeUMsMkJBQTJCO1FBQzlCLHdCQUF3QjtRQUNoQyxnQkFBZ0I7UUFDdEIsVUFBVTtRQUNSLFlBQVk7R0F0QjNCLHVCQUF1QixDQTZFbkM7U0E3RVksdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBGb3JtU2VjdGlvbiB9IGZyb20gJy4uL21vZGVscy9mb3JtLXNlY3Rpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBJbnRlcm5hbEV2ZW50SGFuZGxlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9pbnRlcm5hbC1ldmVudC1oYW5kbGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJbnRlcm5hbEV2ZW50VHlwZSB9IGZyb20gJy4uL21vZGVscy9pbnRlcm5hbC1ldmVudC5tb2RlbCc7XHJcbmltcG9ydCB7IEZvcm1QYWdlIH0gZnJvbSAnLi4vbW9kZWxzL2Zvcm0tcGFnZS5tb2RlbCc7XHJcbmltcG9ydCB7IEhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9oZWxwZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFJlc29sdmVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbXBvbmVudC1yZXNvbHZlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRm9ybVFMTW9kZSwgQ29udGFpbmVyVHlwZSB9IGZyb20gJy4uL21vZGVscy90eXBlLm1vZGVsJztcclxuaW1wb3J0IHsgR3JpZFBvc2l0aW9uVHlwZSB9IGZyb20gJy4uL21vZGVscy9zdHlsZS5tb2RlbCc7XHJcbmltcG9ydCB7IERuZFRyYW5zZmVyLCBEbmRFdmVudCB9IGZyb20gJy4uL21vZGVscy9kbmQubW9kZWwnO1xyXG5pbXBvcnQgeyBEbmRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZG5kLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdG9yZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zdG9yZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50R3JvdXAsIEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9tb2RlbHMvZm9ybS1jb21wb25lbnQubW9kZWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ1tmb3JtcWwtc2VjdGlvbi13cmFwcGVyXScsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgICAgICA8ZGl2ICN3cmFwcGVyIGZvcm1xbERuZFxyXG4gICAgICAgICAgICBbc291cmNlT2JqZWN0SWRdPVwic2VjdGlvbi5zZWN0aW9uSWRcIlxyXG4gICAgICAgICAgICBbYXR0ci5zZWN0aW9uSWRdPVwic2VjdGlvbi5zZWN0aW9uSWRcIlxyXG4gICAgICAgICAgICBbc291cmNlV3JhcHBlcklkXT1cInBhZ2UucGFnZUlkXCJcclxuICAgICAgICAgICAgW3R5cGVdPVwiQ29udGFpbmVyVHlwZS5TZWN0aW9uXCJcclxuICAgICAgICAgICAgW21vZGVdPVwibW9kZVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsobW9kZSA9PT0gRm9ybVFMTW9kZS5FZGl0KSA/ICdmcWwtc2VjdGlvbi13cmFwcGVyLWVkaXQnIDogJ2ZxbC1zZWN0aW9uLXdyYXBwZXInXVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnFsLXNlY3Rpb24tdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAjdG9vbHRpcD48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWN0aW9uLnRlbXBsYXRlICYmICFzZWN0aW9uLnRlbXBsYXRlLmhlYWRlci5oaWRkZW5cIiBjbGFzcz1cImZxbC1zZWN0aW9uLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGZvcm1xbEdkQ29uZmlnXHJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1xbEdkQ29uZmlnT2ZdPVwic2VjdGlvbi50ZW1wbGF0ZS5oZWFkZXJcIiBsZXQtaGVhZGVyaXRlbSBsZXQtaT1cImluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlUmVmO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZWl0ZW06IGhlYWRlcml0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVHlwZTogQ29tcG9uZW50UG9zaXRpb25UeXBlLkhlYWRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWN0aW9uLnRlbXBsYXRlICYmICFzZWN0aW9uLnRlbXBsYXRlLmJvZHkuaGlkZGVuXCIgY2xhc3M9XCJmcWwtc2VjdGlvbi1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgZm9ybXFsR2RDb25maWdcclxuICAgICAgICAgICAgICAgICAgICBbZm9ybXFsR2RDb25maWdPZl09XCJzZWN0aW9uLnRlbXBsYXRlLmJvZHlcIiBsZXQtYm9keWl0ZW0gbGV0LWk9XCJpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVJlZjtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVpdGVtOiBib2R5aXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25UeXBlOiBDb21wb25lbnRQb3NpdGlvblR5cGUuQm9keVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZVJlZiBsZXQtdGVtcGxhdGVpdGVtPVwidGVtcGxhdGVpdGVtXCIgbGV0LXBvc2l0aW9uVHlwZT1cInBvc2l0aW9uVHlwZVwiPlxyXG4gICAgICAgICAgPGRpdiBbbmdTdHlsZV09XCJ0ZW1wbGF0ZWl0ZW0uc3R5bGVcIj5cclxuICAgICAgICAgICAgPGRpdiBmb3JtcWxEbmREcm9wXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIobW9kZSA9PT0gRm9ybVFMTW9kZS5FZGl0KVwiXHJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiQ29udGFpbmVyVHlwZS5Db21wb25lbnRcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZnFsLXNlY3Rpb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAoc3luY2hyb25pc2UpPVwic3luY2hyb25pc2VNb2RlbCgkZXZlbnQsIHRlbXBsYXRlaXRlbS5pZCwgcG9zaXRpb25UeXBlKVwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzW3Bvc2l0aW9uVHlwZSArICdfJyArIHRlbXBsYXRlaXRlbS5pZF07IHRyYWNrQnk6IHRyYWNrQnlGblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1xbC1jb21wb25lbnQtY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ZxbC1jb21wb25lbnQtY29udGFpbmVyLWhpZGRlbic6IGNvbXBvbmVudC5ydWxlcz8uaGlkZGVuPy52YWx1ZX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudF09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3NlY3Rpb25JZF09XCJzZWN0aW9uLnNlY3Rpb25JZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY29tcG9uZW50LnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtyZWFjdGl2ZVNlY3Rpb25dPVwicmVhY3RpdmVTZWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFttb2RlXT1cIm1vZGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJtb2RlICE9PSBGb3JtUUxNb2RlLkVkaXRcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb21wb25lbnQgb2YgY29tcG9uZW50c1twb3NpdGlvblR5cGUgKyAnXycgKyB0ZW1wbGF0ZWl0ZW0uaWRdOyB0cmFja0J5OiB0cmFja0J5Rm5cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZm9ybXFsLWNvbXBvbmVudC1jb250YWluZXIgKm5nSWY9XCIhY29tcG9uZW50LnJ1bGVzPy5oaWRkZW4/LnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50XT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NlY3Rpb25JZF09XCJzZWN0aW9uLnNlY3Rpb25JZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvbXBvbmVudC52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3JlYWN0aXZlU2VjdGlvbl09XCJyZWFjdGl2ZVNlY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgIFttb2RlXT1cIm1vZGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIGAsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc2VjdGlvbi13cmFwcGVyLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFNlY3Rpb25XcmFwcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQFZpZXdDaGlsZCgnd3JhcHBlcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pIHdyYXBwZXI6IFZpZXdDb250YWluZXJSZWY7XHJcbiAgQFZpZXdDaGlsZCgndG9vbHRpcCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pIHRvb2x0aXA6IFZpZXdDb250YWluZXJSZWY7XHJcblxyXG4gIEBJbnB1dCgpIHNlY3Rpb246IEZvcm1TZWN0aW9uO1xyXG4gIEBJbnB1dCgpIHJlYWN0aXZlU2VjdGlvbjogRm9ybUdyb3VwO1xyXG4gIEBJbnB1dCgpIHBhZ2U6IEZvcm1QYWdlO1xyXG4gIEBJbnB1dCgpIG1vZGU6IEZvcm1RTE1vZGU7XHJcblxyXG4gIGVycm9yOiBzdHJpbmc7XHJcbiAgY29tcG9uZW50czogQ29tcG9uZW50R3JvdXA7XHJcblxyXG4gIHB1YmxpYyBGb3JtUUxNb2RlID0gRm9ybVFMTW9kZTtcclxuICBwdWJsaWMgQ29udGFpbmVyVHlwZSA9IENvbnRhaW5lclR5cGU7XHJcbiAgcHVibGljIENvbXBvbmVudFBvc2l0aW9uVHlwZSA9IEdyaWRQb3NpdGlvblR5cGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgICBwcml2YXRlIGludGVybmFsRXZlbnRIYW5kbGVyU2VydmljZTogSW50ZXJuYWxFdmVudEhhbmRsZXJTZXJ2aWNlLFxyXG4gICAgICBwcml2YXRlIGNvbXBvbmVudFJlc29sdmVyU2VydmljZTogQ29tcG9uZW50UmVzb2x2ZXJTZXJ2aWNlLFxyXG4gICAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgIHByaXZhdGUgZG5kU2VydmljZTogRG5kU2VydmljZSxcclxuICAgICAgcHJpdmF0ZSBzdG9yZVNlcnZpY2U6IFN0b3JlU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICAgIHRoaXMuY29tcG9uZW50cyA9IHRoaXMuY3JlYXRlQ29tcG9uZW50cyh0aGlzLnNlY3Rpb24pO1xyXG5cclxuICAgIGlmICh0aGlzLm1vZGUgPT09IEZvcm1RTE1vZGUuRWRpdCkge1xyXG4gICAgICBjb25zdCB0b29sdGlwID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudCh0aGlzLmNvbXBvbmVudFJlc29sdmVyU2VydmljZS5yZXNvbHZlQ29tcG9uZW50KCdUb29sdGlwQ29tcG9uZW50JykpO1xyXG4gICAgICAoPGFueT50b29sdGlwKS5pbnN0YW5jZS53cmFwcGVyID0gdGhpcy53cmFwcGVyO1xyXG4gICAgICAoPGFueT50b29sdGlwKS5pbnN0YW5jZS50eXBlID0gQ29udGFpbmVyVHlwZS5TZWN0aW9uO1xyXG4gICAgICAoPGFueT50b29sdGlwKS5pbnN0YW5jZS5vYmplY3QgPSB0aGlzLnNlY3Rpb247XHJcbiAgICAgIHRoaXMudG9vbHRpcC5pbnNlcnQodG9vbHRpcC5ob3N0Vmlldyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBlZGl0RmllbGQoKSB7XHJcbiAgICBpZiAodGhpcy5tb2RlID09PSBGb3JtUUxNb2RlLkVkaXQpXHJcbiAgICAgIHRoaXMuaW50ZXJuYWxFdmVudEhhbmRsZXJTZXJ2aWNlLnNlbmQoSW50ZXJuYWxFdmVudFR5cGUuRWRpdGluZ1NlY3Rpb24sIHRoaXMuc2VjdGlvbik7XHJcbiAgfVxyXG5cclxuICBzeW5jaHJvbmlzZU1vZGVsKCRldmVudDogRG5kVHJhbnNmZXIsIHBvc2l0aW9uSWQ6IHN0cmluZywgcG9zaXRpb25UeXBlOiBHcmlkUG9zaXRpb25UeXBlKSB7XHJcbiAgICBjb25zdCBkbmRFdmVudCA9IDxEbmRFdmVudD57XHJcbiAgICAgIHNvdXJjZU9iamVjdElkOiAkZXZlbnQuc291cmNlT2JqZWN0SWQsXHJcbiAgICAgIHNvdXJjZVdyYXBwZXJJZDogJGV2ZW50LnNvdXJjZVdyYXBwZXJJZCxcclxuICAgICAgdGFyZ2V0UG9zaXRpb25JZDogcG9zaXRpb25JZCxcclxuICAgICAgdGFyZ2V0V3JhcHBlcklkOiB0aGlzLnNlY3Rpb24uc2VjdGlvbklkLFxyXG4gICAgICB0YXJnZXRJbmRleElkOiAkZXZlbnQudGFyZ2V0SW5kZXhJZCxcclxuICAgICAgcG9zaXRpb25UeXBlOiBwb3NpdGlvblR5cGVcclxuICAgIH07XHJcbiAgICB0aGlzLnBhZ2UgPSB0aGlzLmRuZFNlcnZpY2Uuc3luY2hyb25pc2VTZWN0aW9uTW9kZWwodGhpcy5wYWdlLCBkbmRFdmVudCk7XHJcbiAgICB0aGlzLnN0b3JlU2VydmljZS5yZVNldEZvcm0oSW50ZXJuYWxFdmVudFR5cGUuRG5kRm9ybUNoYW5nZWQsIHRoaXMucGFnZSk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5Rm4oaW5kZXgsIGl0ZW0pIHtcclxuICAgIHJldHVybiBpdGVtLmlkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDb21wb25lbnRzKHNlY3Rpb246IEZvcm1TZWN0aW9uKTogQ29tcG9uZW50R3JvdXAge1xyXG4gICAgY29uc3QgY29tcG9uZW50cyA9IDxDb21wb25lbnRHcm91cD57fTtcclxuICAgIGlmIChzZWN0aW9uICYmIHNlY3Rpb24uY29tcG9uZW50cylcclxuICAgICAgc2VjdGlvbi5jb21wb25lbnRzLnNvcnQoKGxlZnQ6IEZvcm1Db21wb25lbnQ8YW55PiwgcmlnaHQ6IEZvcm1Db21wb25lbnQ8YW55PikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGxlZnQucG9zaXRpb24uaW5kZXggLSByaWdodC5wb3NpdGlvbi5pbmRleDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBzZWN0aW9uLmNvbXBvbmVudHMuZm9yRWFjaChjb21wb25lbnQgPT4ge1xyXG4gICAgICAgIGlmIChjb21wb25lbnRzICYmIGNvbXBvbmVudHNbY29tcG9uZW50LnBvc2l0aW9uLnR5cGUgKyAnXycgKyBjb21wb25lbnQucG9zaXRpb24uaWRdKVxyXG4gICAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnQucG9zaXRpb24udHlwZSArICdfJyArIGNvbXBvbmVudC5wb3NpdGlvbi5pZF0ucHVzaChjb21wb25lbnQpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50LnBvc2l0aW9uLnR5cGUgKyAnXycgKyBjb21wb25lbnQucG9zaXRpb24uaWRdID0gW2NvbXBvbmVudF07XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBjb21wb25lbnRzO1xyXG4gIH1cclxuXHJcbn1cclxuIl19