UNPKG

@formql/core

Version:

FormQL - A framework for building dynamic forms

167 lines 23.8 kB
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdGlvbi13cmFwcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bmb3JtcWwvY29yZS8iLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvc2VjdGlvbi13cmFwcGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN6RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUduRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXpELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUF3RXpELElBQWEsdUJBQXVCLEdBQXBDLE1BQWEsdUJBQXVCO0lBaUJsQyxZQUNZLDJCQUF3RCxFQUN4RCx3QkFBa0QsRUFDbEQsZ0JBQWtDLEVBQ2xDLFVBQXNCLEVBQ3RCLFlBQTBCO1FBSjFCLGdDQUEyQixHQUEzQiwyQkFBMkIsQ0FBNkI7UUFDeEQsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFUL0IsZUFBVSxHQUFHLFVBQVUsQ0FBQztRQUN4QixrQkFBYSxHQUFHLGFBQWEs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Q0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFDLENBQUM7UUFFTCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0NBRUYsQ0FBQTtBQTNFaUU7SUFBL0QsU0FBUyxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7OEJBQVUsZ0JBQWdCO3dEQUFDO0FBQzFCO0lBQS9ELFNBQVMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDOzhCQUFVLGdCQUFnQjt3REFBQztBQUVqRjtJQUFSLEtBQUssRUFBRTs7d0RBQXNCO0FBQ3JCO0lBQVIsS0FBSyxFQUFFOzhCQUFrQixTQUFTO2dFQUFDO0FBQzNCO0lBQVIsS0FBSyxFQUFFOztxREFBZ0I7QUFDZjtJQUFSLEtBQUssRUFBRTs7cURBQWtCO0FBUmYsdUJBQXVCO0lBckVuQyxTQUFTLENBQUM7UUFDVCwrQ0FBK0M7UUFDL0MsUUFBUSxFQUFFLDBCQUEwQjtRQUNwQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztTQStESDs7S0FFUixDQUFDO3FDQW1CeUMsMkJBQTJCO1FBQzlCLHdCQUF3QjtRQUNoQyxnQkFBZ0I7UUFDdEIsVUFBVTtRQUNSLFlBQVk7R0F0QjNCLHVCQUF1QixDQTZFbkM7U0E3RVksdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBGb3JtU2VjdGlvbiB9IGZyb20gJy4uL21vZGVscy9mb3JtLXNlY3Rpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBJbnRlcm5hbEV2ZW50SGFuZGxlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9pbnRlcm5hbC1ldmVudC1oYW5kbGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJbnRlcm5hbEV2ZW50VHlwZSB9IGZyb20gJy4uL21vZGVscy9pbnRlcm5hbC1ldmVudC5tb2RlbCc7XHJcbmltcG9ydCB7IEZvcm1QYWdlIH0gZnJvbSAnLi4vbW9kZWxzL2Zvcm0tcGFnZS5tb2RlbCc7XHJcbmltcG9ydCB7IEhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9oZWxwZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFJlc29sdmVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbXBvbmVudC1yZXNvbHZlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRm9ybVFMTW9kZSwgQ29udGFpbmVyVHlwZSB9IGZyb20gJy4uL21vZGVscy90eXBlLm1vZGVsJztcclxuaW1wb3J0IHsgR3JpZFBvc2l0aW9uVHlwZSB9IGZyb20gJy4uL21vZGVscy9zdHlsZS5tb2RlbCc7XHJcbmltcG9ydCB7IERuZFRyYW5zZmVyLCBEbmRFdmVudCB9IGZyb20gJy4uL21vZGVscy9kbmQubW9kZWwnO1xyXG5pbXBvcnQgeyBEbmRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvZG5kLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdG9yZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zdG9yZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50R3JvdXAsIEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9tb2RlbHMvZm9ybS1jb21wb25lbnQubW9kZWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ1tmb3JtcWwtc2VjdGlvbi13cmFwcGVyXScsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgICAgICA8ZGl2ICN3cmFwcGVyIGZvcm1xbERuZFxyXG4gICAgICAgICAgICBbc291cmNlT2JqZWN0SWRdPVwic2VjdGlvbi5zZWN0aW9uSWRcIlxyXG4gICAgICAgICAgICBbYXR0ci5zZWN0aW9uSWRdPVwic2VjdGlvbi5zZWN0aW9uSWRcIlxyXG4gICAgICAgICAgICBbc291cmNlV3JhcHBlcklkXT1cInBhZ2UucGFnZUlkXCJcclxuICAgICAgICAgICAgW3R5cGVdPVwiQ29udGFpbmVyVHlwZS5TZWN0aW9uXCJcclxuICAgICAgICAgICAgW21vZGVdPVwibW9kZVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsobW9kZSA9PT0gRm9ybVFMTW9kZS5FZGl0KSA/ICdmcWwtc2VjdGlvbi13cmFwcGVyLWVkaXQnIDogJ2ZxbC1zZWN0aW9uLXdyYXBwZXInXVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnFsLXNlY3Rpb24tdG9vbHRpcFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAjdG9vbHRpcD48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWN0aW9uLnRlbXBsYXRlICYmICFzZWN0aW9uLnRlbXBsYXRlLmhlYWRlci5oaWRkZW5cIiBjbGFzcz1cImZxbC1zZWN0aW9uLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGZvcm1xbEdkQ29uZmlnXHJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1xbEdkQ29uZmlnT2ZdPVwic2VjdGlvbi50ZW1wbGF0ZS5oZWFkZXJcIiBsZXQtaGVhZGVyaXRlbSBsZXQtaT1cImluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlUmVmO1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZWl0ZW06IGhlYWRlcml0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVHlwZTogQ29tcG9uZW50UG9zaXRpb25UeXBlLkhlYWRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWN0aW9uLnRlbXBsYXRlICYmICFzZWN0aW9uLnRlbXBsYXRlLmJvZHkuaGlkZGVuXCIgY2xhc3M9XCJmcWwtc2VjdGlvbi1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgZm9ybXFsR2RDb25maWdcclxuICAgICAgICAgICAgICAgICAgICBbZm9ybXFsR2RDb25maWdPZl09XCJzZWN0aW9uLnRlbXBsYXRlLmJvZHlcIiBsZXQtYm9keWl0ZW0gbGV0LWk9XCJpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVJlZjtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVpdGVtOiBib2R5aXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25UeXBlOiBDb21wb25lbnRQb3NpdGlvblR5cGUuQm9keVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZVJlZiBsZXQtdGVtcGxhdGVpdGVtPVwidGVtcGxhdGVpdGVtXCIgbGV0LXBvc2l0aW9uVHlwZT1cInBvc2l0aW9uVHlwZVwiPlxyXG4gICAgICAgICAgPGRpdiBbbmdTdHlsZV09XCJ0ZW1wbGF0ZWl0ZW0uc3R5bGVcIj5cclxuICAgICAgICAgICAgPGRpdiBmb3JtcWxEbmREcm9wXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIobW9kZSA9PT0gRm9ybVFMTW9kZS5FZGl0KVwiXHJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiQ29udGFpbmVyVHlwZS5Db21wb25lbnRcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZnFsLXNlY3Rpb24tY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAoc3luY2hyb25pc2UpPVwic3luY2hyb25pc2VNb2RlbCgkZXZlbnQsIHRlbXBsYXRlaXRlbS5pZCwgcG9zaXRpb25UeXBlKVwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzW3Bvc2l0aW9uVHlwZSArICdfJyArIHRlbXBsYXRlaXRlbS5pZF07IHRyYWNrQnk6IHRyYWNrQnlGblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGZvcm1xbC1jb21wb25lbnQtY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ZxbC1jb21wb25lbnQtY29udGFpbmVyLWhpZGRlbic6IGNvbXBvbmVudC5ydWxlcz8uaGlkZGVuPy52YWx1ZX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2NvbXBvbmVudF09XCJjb21wb25lbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3NlY3Rpb25JZF09XCJzZWN0aW9uLnNlY3Rpb25JZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY29tcG9uZW50LnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtyZWFjdGl2ZVNlY3Rpb25dPVwicmVhY3RpdmVTZWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFttb2RlXT1cIm1vZGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJtb2RlICE9PSBGb3JtUUxNb2RlLkVkaXRcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb21wb25lbnQgb2YgY29tcG9uZW50c1twb3NpdGlvblR5cGUgKyAnXycgKyB0ZW1wbGF0ZWl0ZW0uaWRdOyB0cmFja0J5OiB0cmFja0J5Rm5cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZm9ybXFsLWNvbXBvbmVudC1jb250YWluZXIgKm5nSWY9XCIhY29tcG9uZW50LnJ1bGVzPy5oaWRkZW4/LnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50XT1cImNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NlY3Rpb25JZF09XCJzZWN0aW9uLnNlY3Rpb25JZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvbXBvbmVudC52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3JlYWN0aXZlU2VjdGlvbl09XCJyZWFjdGl2ZVNlY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgIFttb2RlXT1cIm1vZGVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIGAsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc2VjdGlvbi13cmFwcGVyLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFNlY3Rpb25XcmFwcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQFZpZXdDaGlsZCgnd3JhcHBlcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pIHdyYXBwZXI6IFZpZXdDb250YWluZXJSZWY7XHJcbiAgQFZpZXdDaGlsZCgndG9vbHRpcCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pIHRvb2x0aXA6IFZpZXdDb250YWluZXJSZWY7XHJcblxyXG4gIEBJbnB1dCgpIHNlY3Rpb246IEZvcm1TZWN0aW9uO1xyXG4gIEBJbnB1dCgpIHJlYWN0aXZlU2VjdGlvbjogRm9ybUdyb3VwO1xyXG4gIEBJbnB1dCgpIHBhZ2U6IEZvcm1QYWdlO1xyXG4gIEBJbnB1dCgpIG1vZGU6IEZvcm1RTE1vZGU7XHJcblxyXG4gIGVycm9yOiBzdHJpbmc7XHJcbiAgY29tcG9uZW50czogQ29tcG9uZW50R3JvdXA7XHJcblxyXG4gIHB1YmxpYyBGb3JtUUxNb2RlID0gRm9ybVFMTW9kZTtcclxuICBwdWJsaWMgQ29udGFpbmVyVHlwZSA9IENvbnRhaW5lclR5cGU7XHJcbiAgcHVibGljIENvbXBvbmVudFBvc2l0aW9uVHlwZSA9IEdyaWRQb3NpdGlvblR5cGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgICBwcml2YXRlIGludGVybmFsRXZlbnRIYW5kbGVyU2VydmljZTogSW50ZXJuYWxFdmVudEhhbmRsZXJTZXJ2aWNlLFxyXG4gICAgICBwcml2YXRlIGNvbXBvbmVudFJlc29sdmVyU2VydmljZTogQ29tcG9uZW50UmVzb2x2ZXJTZXJ2aWNlLFxyXG4gICAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICAgIHByaXZhdGUgZG5kU2VydmljZTogRG5kU2VydmljZSxcclxuICAgICAgcHJpdmF0ZSBzdG9yZVNlcnZpY2U6IFN0b3JlU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICAgIHRoaXMuY29tcG9uZW50cyA9IHRoaXMuY3JlYXRlQ29tcG9uZW50cyh0aGlzLnNlY3Rpb24pO1xyXG5cclxuICAgIGlmICh0aGlzLm1vZGUgPT09IEZvcm1RTE1vZGUuRWRpdCkge1xyXG4gICAgICBjb25zdCB0b29sdGlwID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudCh0aGlzLmNvbXBvbmVudFJlc29sdmVyU2VydmljZS5yZXNvbHZlQ29tcG9uZW50KCdUb29sdGlwQ29tcG9uZW50JykpO1xyXG4gICAgICAoPGFueT50b29sdGlwKS5pbnN0YW5jZS53cmFwcGVyID0gdGhpcy53cmFwcGVyO1xyXG4gICAgICAoPGFueT50b29sdGlwKS5pbnN0YW5jZS50eXBlID0gQ29udGFpbmVyVHlwZS5TZWN0aW9uO1xyXG4gICAgICAoPGFueT50b29sdGlwKS5pbnN0YW5jZS5vYmplY3QgPSB0aGlzLnNlY3Rpb247XHJcbiAgICAgIHRoaXMudG9vbHRpcC5pbnNlcnQodG9vbHRpcC5ob3N0Vmlldyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBlZGl0RmllbGQoKSB7XHJcbiAgICBpZiAodGhpcy5tb2RlID09PSBGb3JtUUxNb2RlLkVkaXQpXHJcbiAgICAgIHRoaXMuaW50ZXJuYWxFdmVudEhhbmRsZXJTZXJ2aWNlLnNlbmQoSW50ZXJuYWxFdmVudFR5cGUuRWRpdGluZ1NlY3Rpb24sIHRoaXMuc2VjdGlvbik7XHJcbiAgfVxyXG5cclxuICBzeW5jaHJvbmlzZU1vZGVsKCRldmVudDogRG5kVHJhbnNmZXIsIHBvc2l0aW9uSWQ6IHN0cmluZywgcG9zaXRpb25UeXBlOiBHcmlkUG9zaXRpb25UeXBlKSB7XHJcbiAgICBjb25zdCBkbmRFdmVudCA9IDxEbmRFdmVudD57XHJcbiAgICAgIHNvdXJjZU9iamVjdElkOiAkZXZlbnQuc291cmNlT2JqZWN0SWQsXHJcbiAgICAgIHNvdXJjZVdyYXBwZXJJZDogJGV2ZW50LnNvdXJjZVdyYXBwZXJJZCxcclxuICAgICAgdGFyZ2V0UG9zaXRpb25JZDogcG9zaXRpb25JZCxcclxuICAgICAgdGFyZ2V0V3JhcHBlcklkOiB0aGlzLnNlY3Rpb24uc2VjdGlvbklkLFxyXG4gICAgICB0YXJnZXRJbmRleElkOiAkZXZlbnQudGFyZ2V0SW5kZXhJZCxcclxuICAgICAgcG9zaXRpb25UeXBlOiBwb3NpdGlvblR5cGVcclxuICAgIH07XHJcbiAgICB0aGlzLnBhZ2UgPSB0aGlzLmRuZFNlcnZpY2Uuc3luY2hyb25pc2VTZWN0aW9uTW9kZWwodGhpcy5wYWdlLCBkbmRFdmVudCk7XHJcbiAgICB0aGlzLnN0b3JlU2VydmljZS5yZVNldEZvcm0oSW50ZXJuYWxFdmVudFR5cGUuRG5kRm9ybUNoYW5nZWQsIHRoaXMucGFnZSk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5Rm4oaW5kZXgsIGl0ZW0pIHtcclxuICAgIHJldHVybiBpdGVtLmlkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVDb21wb25lbnRzKHNlY3Rpb246IEZvcm1TZWN0aW9uKTogQ29tcG9uZW50R3JvdXAge1xyXG4gICAgY29uc3QgY29tcG9uZW50cyA9IDxDb21wb25lbnRHcm91cD57fTtcclxuICAgIGlmIChzZWN0aW9uICYmIHNlY3Rpb24uY29tcG9uZW50cylcclxuICAgICAgc2VjdGlvbi5jb21wb25lbnRzLnNvcnQoKGxlZnQ6IEZvcm1Db21wb25lbnQ8YW55PiwgcmlnaHQ6IEZvcm1Db21wb25lbnQ8YW55PikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGxlZnQucG9zaXRpb24uaW5kZXggLSByaWdodC5wb3NpdGlvbi5pbmRleDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBzZWN0aW9uLmNvbXBvbmVudHMuZm9yRWFjaChjb21wb25lbnQgPT4ge1xyXG4gICAgICAgIGlmIChjb21wb25lbnRzICYmIGNvbXBvbmVudHNbY29tcG9uZW50LnBvc2l0aW9uLnR5cGUgKyAnXycgKyBjb21wb25lbnQucG9zaXRpb24uaWRdKVxyXG4gICAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnQucG9zaXRpb24udHlwZSArICdfJyArIGNvbXBvbmVudC5wb3NpdGlvbi5pZF0ucHVzaChjb21wb25lbnQpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50LnBvc2l0aW9uLnR5cGUgKyAnXycgKyBjb21wb25lbnQucG9zaXRpb24uaWRdID0gW2NvbXBvbmVudF07XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBjb21wb25lbnRzO1xyXG4gIH1cclxuXHJcbn1cclxuIl19