UNPKG

@webdev-tools/ng-nested-reactive-forms

Version:
149 lines 23.7 kB
import { Directive, Input, Optional, Output, TemplateRef, ViewContainerRef } from '@angular/core'; import { FormControl, FormGroup } from '@angular/forms'; import { ReplaySubject } from 'rxjs/internal/ReplaySubject'; import { takeWhile } from 'rxjs/operators'; import { NrfFormDirective } from '../form/form.directive'; import { NrfFormService } from '../form/form.service'; import { NrfNestedControlContext } from './nested-control-context.class'; import { NrfFormHierarchyService } from './services/form-hierarchy.service'; import { NrfModelSetterService } from './services/model-setter.service'; export class NrfNestedControlDirective { constructor(modelSetter, templateRef, viewContainerRef, nrfForm, nrfFormService, formHierarchy) { this.modelSetter = modelSetter; this.templateRef = templateRef; this.viewContainerRef = viewContainerRef; this.formHierarchy = formHierarchy; this.isDestroyed = false; this.ready$ = new ReplaySubject(1); this.formOrService = nrfFormService || nrfForm; } ngOnInit() { this.modelPath = this.getModelPathWithoutFirstPart(); this.modelPieces = this.modelPath && this.modelPath.split('.'); this.controlName = this.getControlName(); this.formControl = this.getFormControl(); this.registerToFormGroup(); this.subscribeToUpdateEntityValue(); this.showViewContent(); this.emitReadyState(); } ngOnDestroy() { this.isDestroyed = true; this.ready$.complete(); if (this.parentFormGroup) { this.removeFromParentFormGroup(); } } removeFromParentFormGroup() { if (this.parentFormGroup instanceof FormGroup) { this.parentFormGroup.removeControl(this.nrfModelName); } else { const index = this.parentFormGroup.controls.findIndex((control) => this.formControl === control); this.parentFormGroup.removeAt(index); } } getModelPathWithoutFirstPart() { const modelName = this.nrfModelName; return modelName && modelName.substr(modelName.indexOf('.') + 1); } getControlName() { const modelPieces = this.modelPieces; return modelPieces && modelPieces[modelPieces.length - 1]; } getNewFormControl() { const disabled = this.controlOptions && this.controlOptions.disabled; const value = this.getInitialValue(); return new FormControl({ value, disabled }, this.controlOptions); } getInitialValue() { if (this.formOrService && this.modelPath) { return this.modelSetter.getValue(this.modelPath, this.formOrService.formData); } return null; } showViewContent() { const context = new NrfNestedControlContext(this.formControl, this.formOrService && this.formOrService.formGroup, this); this.viewContainerRef.createEmbeddedView(this.templateRef, context); } registerToFormGroup() { if (this.parentFormGroup) { return; } this.parentFormGroup = this.getParentFormGroup(); if (this.parentFormGroup) { if (this.parentFormGroup instanceof FormGroup) { this.parentFormGroup.addControl(this.modelPath, this.formControl); } else { const index = this.controlName; this.parentFormGroup.insert(parseInt(index, 10), this.formControl); } } } getParentFormGroup() { const rootFormGroup = this.formOrService && this.formOrService.formGroup; if (!rootFormGroup || !this.modelPath) { return null; } const formGroupPath = Array.from(this.modelPieces); return this.formHierarchy.getNestedControl(rootFormGroup, formGroupPath); } getFormControl() { const formGroup = this.getParentFormGroup(); let formControl = formGroup && this.nrfModelName && ((formGroup.get(this.nrfModelName))); if (!formControl) { formControl = this.getNewFormControl(); } return formControl; } subscribeToUpdateEntityValue() { this.formControl.valueChanges .pipe(takeWhile(() => !this.isDestroyed)) .subscribe((newValue) => this.setModelValue(newValue)); } setModelValue(newValue) { if (this.formOrService && this.modelPath) { return this.modelSetter.setValue(this.modelPath, newValue || '', this.formOrService.formData); } } emitReadyState() { this.ready$.next(this); } } NrfNestedControlDirective.decorators = [ { type: Directive, args: [{ selector: '[nrfNestedControl]', exportAs: 'nrfNestedControl', },] } ]; NrfNestedControlDirective.ctorParameters = () => [ { type: NrfModelSetterService }, { type: TemplateRef }, { type: ViewContainerRef }, { type: NrfFormDirective, decorators: [{ type: Optional }] }, { type: NrfFormService, decorators: [{ type: Optional }] }, { type: NrfFormHierarchyService } ]; NrfNestedControlDirective.propDecorators = { nrfModelName: [{ type: Input, args: ['nrfNestedControl',] }], controlOptions: [{ type: Input, args: ['nrfNestedControlControlOptions',] }], ready$: [{ type: Output }] }; if (false) { NrfNestedControlDirective.prototype.isDestroyed; NrfNestedControlDirective.prototype.parentFormGroup; NrfNestedControlDirective.prototype.formControl; NrfNestedControlDirective.prototype.modelPath; NrfNestedControlDirective.prototype.modelPieces; NrfNestedControlDirective.prototype.controlName; NrfNestedControlDirective.prototype.formOrService; NrfNestedControlDirective.prototype.nrfModelName; NrfNestedControlDirective.prototype.controlOptions; NrfNestedControlDirective.prototype.ready$; NrfNestedControlDirective.prototype.modelSetter; NrfNestedControlDirective.prototype.templateRef; NrfNestedControlDirective.prototype.viewContainerRef; NrfNestedControlDirective.prototype.formHierarchy; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGVkLWNvbnRyb2wuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHdlYmRldi10b29scy9uZy1uZXN0ZWQtcmVhY3RpdmUtZm9ybXMvIiwic291cmNlcyI6WyJsaWIvbmVzdGVkLWNvbnRyb2wvbmVzdGVkLWNvbnRyb2wuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNySCxPQUFPLEVBQWEsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXRELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBa0N4RSxNQUFNLE9BQU8seUJBQXlCO0lBNEJwQyxZQUNtQixXQUFrQyxFQUNsQyxXQUE2QixFQUM3QixnQkFBa0MsRUFDdkMsT0FBeUIsRUFDekIsY0FBOEIsRUFDekIsYUFBc0M7UUFMdEMsZ0JBQVcsR0FBWCxXQUFXLENBQXVCO1FBQ2xDLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUM3QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBR2xDLGtCQUFhLEdBQWIsYUFBYSxDQUF5QjtRQWpDekQsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUF1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QWlCbEUsaURBQWdEO0lBUWhELG1EQUEyRTtJQUszRSwyQ0FBaUQ7SUEzQi9DLGdEQUFtRDtJQUNuRCxnREFBOEM7SUFDOUMscURBQW1EO0lBR25ELGtEQUF1RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcy9pbnRlcm5hbC9SZXBsYXlTdWJqZWN0JztcbmltcG9ydCB7IHRha2VXaGlsZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTnJmRm9ybURpcmVjdGl2ZSB9IGZyb20gJy4uL2Zvcm0vZm9ybS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTnJmRm9ybVNlcnZpY2UgfSBmcm9tICcuLi9mb3JtL2Zvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBOcmZDb250cm9sT3B0aW9ucyB9IGZyb20gJy4vY29udHJvbC1vcHRpb25zLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOcmZOZXN0ZWRDb250cm9sQ29udGV4dCB9IGZyb20gJy4vbmVzdGVkLWNvbnRyb2wtY29udGV4dC5jbGFzcyc7XG5pbXBvcnQgeyBOcmZGb3JtSGllcmFyY2h5U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZm9ybS1oaWVyYXJjaHkuc2VydmljZSc7XG5pbXBvcnQgeyBOcmZNb2RlbFNldHRlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL21vZGVsLXNldHRlci5zZXJ2aWNlJztcblxuLyogdHNsaW50OmRpc2FibGUgdGVyLXBhZGRlZC1ibG9ja3MgKi9cblxuLyoqXG4gKiBUaGlzIGRpcmVjdGl2ZSBjb250cm9sIG5lc3RlZCBpbnB1dHMgYW5kIHNldHMgdmFsdWVzIG9uIHRoZSBPcmlnaW5hbCBNb2RlbCBzZXQgYXQge0BsaW5rIE5yZkZvcm1EaXJlY3RpdmUjbnJmRW50aXR5fVxuICpcbiAqICMjIyMgR2l2ZW4gYW4gbnJmRW50aXR5IG9uIHRoZSBjb250cm9sbGVyOlxuICogYGBgdHlwZXNjcmlwdFxuICogdGhpcy51c2VyTW9kZWwgPSB7XG4gKiAgICBmaXJzdE5hbWU6ICdKb2huJyxcbiAqICAgIGFkZHJlc3M6IHtcbiAqICAgICAgICBzdHJlZXQ6ICdDYXJuYWJ5IFN0cmVldCdcbiAqICAgIH1cbiAqIH07XG4gKiBgYGBcbiAqXG4gKiAjIyMjIFVzZSBpdCBvbiB0aGUgZm9ybVxuICogYGBgaHRtbFxuICogPGZvcm0gW25yZkVudGl0eV09XCJ1c2VyTW9kZWxcIj5cbiAqICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAqICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIj5OYW1lOjwvbGFiZWw+XG4gKlxuICogICAgICA8ZGl2ICpucmZOZXN0ZWRDb250cm9sPVwiJ3VzZXJNb2RlbC5maXJzdE5hbWUnOyBsZXQgY29udHJvbD1mb3JtQ29udHJvbFwiPlxuICogICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiIC8+XG4gKiAgICAgIDwvZGl2PlxuICogICA8L2Rpdj5cbiAqIDwvZm9ybT5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbnJmTmVzdGVkQ29udHJvbF0nLFxuICBleHBvcnRBczogJ25yZk5lc3RlZENvbnRyb2wnLFxufSlcbmV4cG9ydCBjbGFzcyBOcmZOZXN0ZWRDb250cm9sRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICBwYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cCB8IEZvcm1BcnJheTtcbiAgZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHNldCBhbmQgZ2V0IHZhbHVlIG9uIHRoZSBlbnRpdHkgbW9kZWxcbiAgICovXG4gIG1vZGVsUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBcnJheSBmcm9tIG1vZGVsIHBhdGggc3BsaXQgYnkgJy4nXG4gICAqL1xuICBwcml2YXRlIG1vZGVsUGllY2VzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGxhc3QgcGFydCBvZiB0aGUgZG90LW5vdGF0aW9uIHBhdGggcHJvdmlkZWQgb24gW25yZk1vZGVsTmFtZV17QGxpbmsgbnJmTW9kZWxOYW1lfSBwcm9wZXJ0eS5cbiAgICogQ2FuIGJlIHVzZWQgd2l0aCBmb3JtQ29udHJvbE5hbWUgcHJvcGVydHlcbiAgICovXG4gIGNvbnRyb2xOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvbGRzIGFuIGluc3RhbmNlIG9mIGEgTnJmRm9ybSBvciBhIE5yZlNlcnZpY2UuXG4gICAqIElmIHRoZSBmb3JtIGlzIHdyYXBwZWQgaW5zaWRlIGEgZGlyZWN0aXZlIHdpdGggbmctY29udGVudCwgdGhlIE5yZkZvcm1TZXJ2aWNlIE1VU1QgYmUgcHJvdmlkZWQuXG4gICAqIE90aGVyd2lzZSB0aGUgbnJmRm9ybSB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGZvcm1PclNlcnZpY2U6IE5yZkZvcm1EaXJlY3RpdmUgfCBOcmZGb3JtU2VydmljZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGVsU2V0dGVyOiBOcmZNb2RlbFNldHRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgQE9wdGlvbmFsKCkgbnJmRm9ybTogTnJmRm9ybURpcmVjdGl2ZSxcbiAgICBAT3B0aW9uYWwoKSBucmZGb3JtU2VydmljZTogTnJmRm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmb3JtSGllcmFyY2h5OiBOcmZGb3JtSGllcmFyY2h5U2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5mb3JtT3JTZXJ2aWNlID0gbnJmRm9ybVNlcnZpY2UgfHwgbnJmRm9ybTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlIG5vLWlucHV0LXJlbmFtZVxuICAvKipcbiAgICogVGhlIGRvdCBub3RhdGlvbiBmdWxsIG5hbWUgb2YgdGhlIG5yZkVudGl0eVxuICAgKi9cbiAgQElucHV0KCducmZOZXN0ZWRDb250cm9sJykgbnJmTW9kZWxOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFtBYnN0cmFjdENvbnRyb2xPcHRpb25zXXtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0Fic3RyYWN0Q29udHJvbE9wdGlvbnN9XG4gICAqIGNvbnRhaW5pbmcgdGhlIHZhbGlkYXRvcnMgbGlzdCBhbmQgdGhlIHVwZGF0ZS1vbiBzdHJhdGVneVxuICAgKlxuICAgKiBJdCB3aWxsIGJlIHNldCBvbiB0aGUgZm9ybUNvbnRyb2wgd2hpbGUgaW5pdGlhdGluZyBhIG5ldyBvbmUuXG4gICAqL1xuICBASW5wdXQoJ25yZk5lc3RlZENvbnRyb2xDb250cm9sT3B0aW9ucycpIGNvbnRyb2xPcHRpb25zOiBOcmZDb250cm9sT3B0aW9ucztcblxuICAvKipcbiAgICogRW1pdCByaWdodCBhZnRlciB0aGUgdmlldyB3ZXJlIHJlbmRlcmVkIGFuZCB0aGUgY29tcG9uZW50IGFuZCBpdHMgdmFyaWFibGVzIGFyYSBhdmFpbGFibGUuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgcmVhZHkkID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIHRoaXMgaW5wdXQgY29tcG9uZW50IHRvIGl0cyBwYXJlbnQgZm9ybSBbRm9ybUdyb3VwXXtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0Zvcm1Hcm91cH1cbiAgICpcbiAgICogQW5kIHN0YXJ0cyB0byBlbWl0IHRoZSBpbnB1dCdzIHZhbHVlIHdoZW4gaXQgY2hhbmdlcy5cbiAgICovXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubW9kZWxQYXRoID0gdGhpcy5nZXRNb2RlbFBhdGhXaXRob3V0Rmlyc3RQYXJ0KCk7XG4gICAgdGhpcy5tb2RlbFBpZWNlcyA9IHRoaXMubW9kZWxQYXRoICYmIHRoaXMubW9kZWxQYXRoLnNwbGl0KCcuJyk7XG4gICAgdGhpcy5jb250cm9sTmFtZSA9IHRoaXMuZ2V0Q29udHJvbE5hbWUoKTtcbiAgICB0aGlzLmZvcm1Db250cm9sID0gdGhpcy5nZXRGb3JtQ29udHJvbCgpO1xuICAgIHRoaXMucmVnaXN0ZXJUb0Zvcm1Hcm91cCgpO1xuICAgIHRoaXMuc3Vic2NyaWJlVG9VcGRhdGVFbnRpdHlWYWx1ZSgpO1xuICAgIHRoaXMuc2hvd1ZpZXdDb250ZW50KCk7XG4gICAgdGhpcy5lbWl0UmVhZHlTdGF0ZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5yZWFkeSQuY29tcGxldGUoKTtcblxuICAgIGlmICh0aGlzLnBhcmVudEZvcm1Hcm91cCkge1xuICAgICAgdGhpcy5yZW1vdmVGcm9tUGFyZW50Rm9ybUdyb3VwKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVGcm9tUGFyZW50Rm9ybUdyb3VwKCkge1xuICAgIGlmICh0aGlzLnBhcmVudEZvcm1Hcm91cCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgdGhpcy5wYXJlbnRGb3JtR3JvdXAucmVtb3ZlQ29udHJvbCh0aGlzLm5yZk1vZGVsTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5wYXJlbnRGb3JtR3JvdXAuY29udHJvbHMuZmluZEluZGV4KChjb250cm9sOiBhbnkpID0+IHRoaXMuZm9ybUNvbnRyb2wgPT09IGNvbnRyb2wpO1xuICAgICAgdGhpcy5wYXJlbnRGb3JtR3JvdXAucmVtb3ZlQXQoaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRvdCBub3RhdGlvbiBwYXRoIG9mIHRoZSBFbnRpdHksIHdpdGhvdXQgdGhlIGZpcnN0IHBhcnQsXG4gICAqIGJlY2F1c2UgaXQgaXMgdGhlIEVudGl0eSBpdHNlbGYuXG4gICAqL1xuICBwcml2YXRlIGdldE1vZGVsUGF0aFdpdGhvdXRGaXJzdFBhcnQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb2RlbE5hbWUgPSB0aGlzLm5yZk1vZGVsTmFtZTtcbiAgICByZXR1cm4gbW9kZWxOYW1lICYmIG1vZGVsTmFtZS5zdWJzdHIobW9kZWxOYW1lLmluZGV4T2YoJy4nKSArIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxhc3QgcGFydCBvZiB0aGUgZG90LW5vdGF0aW9uIHBhdGgsIHRoYXQgaW5kaWNhdGVzIHRoZSBjb250cm9sIG5hbWUgaXRzZWxmLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb250cm9sTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1vZGVsUGllY2VzID0gdGhpcy5tb2RlbFBpZWNlcztcbiAgICByZXR1cm4gbW9kZWxQaWVjZXMgJiYgbW9kZWxQaWVjZXNbbW9kZWxQaWVjZXMubGVuZ3RoIC0gMV07XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFudGlhdGUgYSBuZXcgW0Zvcm1Db250cm9sXXtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0Zvcm1Db250cm9sfSBhbmQgcmV0dXJuIGl0XG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0TmV3Rm9ybUNvbnRyb2woKTogRm9ybUNvbnRyb2wge1xuICAgIGNvbnN0IGRpc2FibGVkID0gdGhpcy5jb250cm9sT3B0aW9ucyAmJiB0aGlzLmNvbnRyb2xPcHRpb25zLmRpc2FibGVkO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRJbml0aWFsVmFsdWUoKTtcblxuICAgIHJldHVybiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZSwgZGlzYWJsZWQgfSwgdGhpcy5jb250cm9sT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBbbnJmRW50aXR5XXtAbGluayBOcmZGb3JtRGlyZWN0aXZlI25yZkVudGl0eX1cbiAgICovXG4gIHByb3RlY3RlZCBnZXRJbml0aWFsVmFsdWUoKTogYW55IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuZm9ybU9yU2VydmljZSAmJiB0aGlzLm1vZGVsUGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMubW9kZWxTZXR0ZXIuZ2V0VmFsdWUodGhpcy5tb2RlbFBhdGgsIHRoaXMuZm9ybU9yU2VydmljZS5mb3JtRGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHNob3dWaWV3Q29udGVudCgpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gbmV3IE5yZk5lc3RlZENvbnRyb2xDb250ZXh0KFxuICAgICAgdGhpcy5mb3JtQ29udHJvbCxcbiAgICAgIHRoaXMuZm9ybU9yU2VydmljZSAmJiB0aGlzLmZvcm1PclNlcnZpY2UuZm9ybUdyb3VwLFxuICAgICAgdGhpcyxcbiAgICApO1xuXG4gICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLnRlbXBsYXRlUmVmLCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciB0aGlzIGlucHV0IHRvIGl0cyBwYXJlbnQgW0Zvcm1Hcm91cF17QGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy9Gb3JtR3JvdXB9XG4gICAqIHRvIGVuYWJsZSB2YWxpZGF0aW9ucyBhbmQgZGF0YSBtYW5pcHVsYXRpb25cbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJUb0Zvcm1Hcm91cCgpIHtcbiAgICBpZiAodGhpcy5wYXJlbnRGb3JtR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBhcmVudEZvcm1Hcm91cCA9IHRoaXMuZ2V0UGFyZW50Rm9ybUdyb3VwKCk7XG5cbiAgICBpZiAodGhpcy5wYXJlbnRGb3JtR3JvdXApIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudEZvcm1Hcm91cCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICB0aGlzLnBhcmVudEZvcm1Hcm91cC5hZGRDb250cm9sKHRoaXMubW9kZWxQYXRoLCB0aGlzLmZvcm1Db250cm9sKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb250cm9sTmFtZTtcbiAgICAgICAgdGhpcy5wYXJlbnRGb3JtR3JvdXAuaW5zZXJ0KHBhcnNlSW50KGluZGV4LCAxMCksIHRoaXMuZm9ybUNvbnRyb2wpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgaWYgdGhpcyBpbnB1dCBpcyBpbnNpZGUgYSBbTnJmRm9ybURpcmVjdGl2ZV17QGxpbmsgTnJmRm9ybURpcmVjdGl2ZX1cbiAgICogYW5kIHJldHVybiBpdHMgW0Zvcm1Hcm91cF17QGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy9Gb3JtR3JvdXB9XG4gICAqXG4gICAqIE90aGVyd2lzZSBhIG5ldyBlbXB0eSBbRm9ybUdyb3VwXXtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0Zvcm1Hcm91cH1cbiAgICovXG4gIHByaXZhdGUgZ2V0UGFyZW50Rm9ybUdyb3VwKCk6IEZvcm1Hcm91cCB8IEZvcm1BcnJheSB7XG4gICAgY29uc3Qgcm9vdEZvcm1Hcm91cCA9IHRoaXMuZm9ybU9yU2VydmljZSAmJiB0aGlzLmZvcm1PclNlcnZpY2UuZm9ybUdyb3VwO1xuXG4gICAgaWYgKCFyb290Rm9ybUdyb3VwIHx8ICF0aGlzLm1vZGVsUGF0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybUdyb3VwUGF0aCA9IEFycmF5LmZyb20odGhpcy5tb2RlbFBpZWNlcyk7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUhpZXJhcmNoeS5nZXROZXN0ZWRDb250cm9sKHJvb3RGb3JtR3JvdXAsIGZvcm1Hcm91cFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBpZiB0aGUgW0Zvcm1Hcm91cF17QGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy9Gb3JtR3JvdXB9IGhhcyBhbiBjb250cm9sIHdpdGggdGhlIGN1cnJlbnQgbmFtZSBhbmQgcmV0dXJuIGl0LlxuICAgKiBPdGhlcndpc2UgcmV0dXJuIGEgbmV3IFtGb3JtQ29udHJvbF17QGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy9Gb3JtQ29udHJvbH1cbiAgICovXG4gIHByb3RlY3RlZCBnZXRGb3JtQ29udHJvbCgpOiBGb3JtQ29udHJvbCB7XG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5nZXRQYXJlbnRGb3JtR3JvdXAoKTtcbiAgICBsZXQgZm9ybUNvbnRyb2wgPSBmb3JtR3JvdXAgJiYgdGhpcy5ucmZNb2RlbE5hbWUgJiYgPEZvcm1Db250cm9sPmZvcm1Hcm91cC5nZXQodGhpcy5ucmZNb2RlbE5hbWUpO1xuXG4gICAgaWYgKCFmb3JtQ29udHJvbCkge1xuICAgICAgZm9ybUNvbnRyb2wgPSB0aGlzLmdldE5ld0Zvcm1Db250cm9sKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1Db250cm9sO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBbdmFsdWVDaGFuZ2VzXXtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0Fic3RyYWN0Q29udHJvbCN2YWx1ZUNoYW5nZXN9IGFuZCB1cGRhdGUgdGhlIEVudGl0eSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb1VwZGF0ZUVudGl0eVZhbHVlKCkge1xuICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlV2hpbGUoKCkgPT4gIXRoaXMuaXNEZXN0cm95ZWQpKVxuICAgICAgLnN1YnNjcmliZSgobmV3VmFsdWUpID0+IHRoaXMuc2V0TW9kZWxWYWx1ZShuZXdWYWx1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIFtmb3JtRGF0YV17QGxpbmsgTnJmRm9ybURpcmVjdGl2ZSNmb3JtRGF0YX1cbiAgICovXG4gIHNldE1vZGVsVmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmZvcm1PclNlcnZpY2UgJiYgdGhpcy5tb2RlbFBhdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1vZGVsU2V0dGVyLnNldFZhbHVlKHRoaXMubW9kZWxQYXRoLCBuZXdWYWx1ZSB8fCAnJywgdGhpcy5mb3JtT3JTZXJ2aWNlLmZvcm1EYXRhKTtcbiAgICB9XG4gIH1cblxuICBlbWl0UmVhZHlTdGF0ZSgpIHtcbiAgICB0aGlzLnJlYWR5JC5uZXh0KHRoaXMpO1xuICB9XG59XG4iXX0=