@webdev-tools/ng-nested-reactive-forms
Version:
Implement Nested FormControl for Angular Reactive Forms.
153 lines • 24.9 kB
JavaScript
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';
var NrfNestedControlDirective = (function () {
function NrfNestedControlDirective(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;
}
NrfNestedControlDirective.prototype.ngOnInit = function () {
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();
};
NrfNestedControlDirective.prototype.ngOnDestroy = function () {
this.isDestroyed = true;
this.ready$.complete();
if (this.parentFormGroup) {
this.removeFromParentFormGroup();
}
};
NrfNestedControlDirective.prototype.removeFromParentFormGroup = function () {
var _this = this;
if (this.parentFormGroup instanceof FormGroup) {
this.parentFormGroup.removeControl(this.nrfModelName);
}
else {
var index = this.parentFormGroup.controls.findIndex(function (control) { return _this.formControl === control; });
this.parentFormGroup.removeAt(index);
}
};
NrfNestedControlDirective.prototype.getModelPathWithoutFirstPart = function () {
var modelName = this.nrfModelName;
return modelName && modelName.substr(modelName.indexOf('.') + 1);
};
NrfNestedControlDirective.prototype.getControlName = function () {
var modelPieces = this.modelPieces;
return modelPieces && modelPieces[modelPieces.length - 1];
};
NrfNestedControlDirective.prototype.getNewFormControl = function () {
var disabled = this.controlOptions && this.controlOptions.disabled;
var value = this.getInitialValue();
return new FormControl({ value: value, disabled: disabled }, this.controlOptions);
};
NrfNestedControlDirective.prototype.getInitialValue = function () {
if (this.formOrService && this.modelPath) {
return this.modelSetter.getValue(this.modelPath, this.formOrService.formData);
}
return null;
};
NrfNestedControlDirective.prototype.showViewContent = function () {
var context = new NrfNestedControlContext(this.formControl, this.formOrService && this.formOrService.formGroup, this);
this.viewContainerRef.createEmbeddedView(this.templateRef, context);
};
NrfNestedControlDirective.prototype.registerToFormGroup = function () {
if (this.parentFormGroup) {
return;
}
this.parentFormGroup = this.getParentFormGroup();
if (this.parentFormGroup) {
if (this.parentFormGroup instanceof FormGroup) {
this.parentFormGroup.addControl(this.modelPath, this.formControl);
}
else {
var index = this.controlName;
this.parentFormGroup.insert(parseInt(index, 10), this.formControl);
}
}
};
NrfNestedControlDirective.prototype.getParentFormGroup = function () {
var rootFormGroup = this.formOrService && this.formOrService.formGroup;
if (!rootFormGroup || !this.modelPath) {
return null;
}
var formGroupPath = Array.from(this.modelPieces);
return this.formHierarchy.getNestedControl(rootFormGroup, formGroupPath);
};
NrfNestedControlDirective.prototype.getFormControl = function () {
var formGroup = this.getParentFormGroup();
var formControl = formGroup && this.nrfModelName && ((formGroup.get(this.nrfModelName)));
if (!formControl) {
formControl = this.getNewFormControl();
}
return formControl;
};
NrfNestedControlDirective.prototype.subscribeToUpdateEntityValue = function () {
var _this = this;
this.formControl.valueChanges
.pipe(takeWhile(function () { return !_this.isDestroyed; }))
.subscribe(function (newValue) { return _this.setModelValue(newValue); });
};
NrfNestedControlDirective.prototype.setModelValue = function (newValue) {
if (this.formOrService && this.modelPath) {
return this.modelSetter.setValue(this.modelPath, newValue || '', this.formOrService.formData);
}
};
NrfNestedControlDirective.prototype.emitReadyState = function () {
this.ready$.next(this);
};
NrfNestedControlDirective.decorators = [
{ type: Directive, args: [{
selector: '[nrfNestedControl]',
exportAs: 'nrfNestedControl',
},] }
];
NrfNestedControlDirective.ctorParameters = function () { return [
{ 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 }]
};
return NrfNestedControlDirective;
}());
export { NrfNestedControlDirective };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGVkLWNvbnRyb2wuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHdlYmRldi10b29scy9uZy1uZXN0ZWQtcmVhY3RpdmUtZm9ybXMvIiwic291cmNlcyI6WyJsaWIvbmVzdGVkLWNvbnRyb2wvbmVzdGVkLWNvbnRyb2wuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNySCxPQUFPLEVBQWEsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRXRELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBOEJ4RTtJQWdDRSxtQ0FDbUIsV0FBa0MsRUFDbEMsV0FBNkIsRUFDN0IsZ0JBQWtDLEVBQ3ZDLE9BQXlCLEVBQ3pCLGNBQThCLEVBQ3pCLGFBQXNDO1FBTHRDLGdCQUFXLEdBQVgsV0FBVyxDQUF1QjtRQUNsQyxnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7UUFDN0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUdsQyxrQkFBYSxHQUFiLGFBQWEsQ0FBeUI7UUFqQ3pELGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBdURELFdBQU0sR0FBRyxJQUFJ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S0FBSyxTQUFDLGdDQUFnQzt5QkFLdEMsTUFBTTs7SUE4SlQsZ0NBQUM7Q0FBQSxBQTFORCxJQTBOQztTQXROWSx5QkFBeUI7O0lBQ3BDLGdEQUFvQjtJQUNwQixvREFBdUM7SUFDdkMsZ0RBQXlCO0lBS3pCLDhDQUFrQjtJQUtsQixnREFBOEI7SUFNOUIsZ0RBQW9CO0lBT3BCLGtEQUFrRTtJQWlCbEUsaURBQWdEO0lBUWhELG1EQUEyRTtJQUszRSwyQ0FBaUQ7SUEzQi9DLGdEQUFtRDtJQUNuRCxnREFBOEM7SUFDOUMscURBQW1EO0lBR25ELGtEQUF1RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcy9pbnRlcm5hbC9SZXBsYXlTdWJqZWN0JztcbmltcG9ydCB7IHRha2VXaGlsZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTnJmRm9ybURpcmVjdGl2ZSB9IGZyb20gJy4uL2Zvcm0vZm9ybS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTnJmRm9ybVNlcnZpY2UgfSBmcm9tICcuLi9mb3JtL2Zvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBOcmZDb250cm9sT3B0aW9ucyB9IGZyb20gJy4vY29udHJvbC1vcHRpb25zLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOcmZOZXN0ZWRDb250cm9sQ29udGV4dCB9IGZyb20gJy4vbmVzdGVkLWNvbnRyb2wtY29udGV4dC5jbGFzcyc7XG5pbXBvcnQgeyBOcmZGb3JtSGllcmFyY2h5U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZm9ybS1oaWVyYXJjaHkuc2VydmljZSc7XG5pbXBvcnQgeyBOcmZNb2RlbFNldHRlclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL21vZGVsLXNldHRlci5zZXJ2aWNlJztcblxuLyogdHNsaW50OmRpc2FibGUgdGVyLXBhZGRlZC1ibG9ja3MgKi9cblxuLyoqXG4gKiBUaGlzIGRpcmVjdGl2ZSBjb250cm9sIG5lc3RlZCBpbnB1dHMgYW5kIHNldHMgdmFsdWVzIG9uIHRoZSBPcmlnaW5hbCBNb2RlbCBzZXQgYXQge0BsaW5rIE5yZkZvcm1EaXJlY3RpdmUjbnJmRW50aXR5fVxuICpcbiAqICMjIyMgR2l2ZW4gYW4gbnJmRW50aXR5IG9uIHRoZSBjb250cm9sbGVyOlxuICogYGBgdHlwZXNjcmlwdFxuICogdGhpcy51c2VyTW9kZWwgPSB7XG4gKiAgICBmaXJzdE5hbWU6ICdKb2huJyxcbiAqICAgIGFkZHJlc3M6IHtcbiAqICAgICAgICBzdHJlZXQ6ICdDYXJuYWJ5IFN0cmVldCdcbiAqICAgIH1cbiAqIH07XG4gKiBgYGBcbiAqXG4gKiAjIyMjIFVzZSBpdCBvbiB0aGUgZm9ybVxuICogYGBgaHRtbFxuICogPGZvcm0gW25yZkVudGl0eV09XCJ1c2VyTW9kZWxcIj5cbiAqICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAqICAgICAgPGxhYmVsIGZvcj1cIm5hbWVcIj5OYW1lOjwvbGFiZWw+XG4gKlxuICogICAgICA8ZGl2ICpucmZOZXN0ZWRDb250cm9sPVwiJ3VzZXJNb2RlbC5maXJzdE5hbWUnOyBsZXQgY29udHJvbD1mb3JtQ29udHJvbFwiPlxuICogICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiIC8+XG4gKiAgICAgIDwvZGl2PlxuICogICA8L2Rpdj5cbiAqIDwvZm9ybT5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbnJmTmVzdGVkQ29udHJvbF0nLFxuICBleHBvcnRBczogJ25yZk5lc3RlZENvbnRyb2wnLFxufSlcbmV4cG9ydCBjbGFzcyBOcmZOZXN0ZWRDb250cm9sRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICBwYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cCB8IEZvcm1BcnJheTtcbiAgZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHNldCBhbmQgZ2V0IHZhbHVlIG9uIHRoZSBlbnRpdHkgbW9kZWxcbiAgICovXG4gIG1vZGVsUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBcnJheSBmcm9tIG1vZGVsIHBhdGggc3BsaXQgYnkgJy4nXG4gICAqL1xuICBwcml2YXRlIG1vZGVsUGllY2VzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGxhc3QgcGFydCBvZiB0aGUgZG90LW5vdGF0aW9uIHBhdGggcHJvdmlkZWQgb24gW25yZk1vZGVsTmFtZV17QGxpbmsgbnJmTW9kZWxOYW1lfSBwcm9wZXJ0eS5cbiAgICogQ2FuIGJlIHVzZWQgd2l0aCBmb3JtQ29udHJvbE5hbWUgcHJvcGVydHlcbiAgICovXG4gIGNvbnRyb2xOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvbGRzIGFuIGluc3RhbmNlIG9mIGEgTnJmRm9ybSBvciBhIE5yZlNlcnZpY2UuXG4gICAqIElmIHRoZSBmb3JtIGlzIHdyYXBwZWQgaW5zaWRlIGEgZGlyZWN0aXZlIHdpdGggbmctY29udGVudCwgdGhlIE5yZkZvcm1TZXJ2aWNlIE1VU1QgYmUgcHJvdmlkZWQuXG4gICAqIE90aGVyd2lzZSB0aGUgbnJmRm9ybSB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGZvcm1PclNlcnZpY2U6IE5yZkZvcm1EaXJlY3RpdmUgfCBOcmZGb3JtU2VydmljZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGVsU2V0dGVyOiBOcmZNb2RlbFNldHRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgQE9wdGlvbmFsKCkgbnJmRm9ybTogTnJmRm9ybURpcmVjdGl2ZSxcbiAgICBAT3B0aW9uYWwoKSBucmZGb3JtU2VydmljZTogTnJmRm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmb3JtSGllcmFyY2h5OiBOcmZGb3JtSGllcmFyY2h5U2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5mb3JtT3JTZXJ2aWNlID0gbnJmRm9ybVNlcnZpY2UgfHwgbnJmRm9ybTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlIG5vLWlucHV0LXJlbmFtZVxuICAvKipcbiAgICogVGhlIGRvdCBub3RhdGlvbiBmdWxsIG5hbWUgb2YgdGhlIG5yZkVudGl0eVxuICAgKi9cbiAgQElucHV0KCducmZOZXN0ZWRDb250cm9sJykgbnJmTW9kZWxOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFtBYnN0cmFjdENvbnRyb2xPcHRpb25zXXtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0Fic3RyYWN0Q29udHJvbE9wdGlvbnN9XG4gICAqIGNvbnRhaW5pbmcgdGhlIHZhbGlkYXRvcnMgbGlzdCBhbmQgdGhlIHVwZGF0ZS1vbiBzdHJhdGVneVxuICAgKlxuICAgKiBJdCB3aWxsIGJlIHNldCBvbiB0aGUgZm9ybUNvbnRyb2wgd2hpbGUgaW5pdGlhdGluZyBhIG5ldyBvbmUuXG4gICAqL1xuICBASW5wdXQoJ25yZk5lc3RlZENvbnRyb2xDb250cm9sT3B0aW9ucycpIGNvbnRyb2xPcHRpb25zOiBOcmZDb250cm9sT3B0aW9ucztcblxuICAvKipcbiAgICogRW1pdCByaWdodCBhZnRlciB0aGUgdmlldyB3ZXJlIHJlbmRlcmVkIGFuZCB0aGUgY29tcG9uZW50IGFuZCBpdHMgdmFyaWFibGVzIGFyYSBhdmFpbGFibGUuXG4gICAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgcmVhZHkkID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIHRoaXMgaW5wdXQgY29tcG9uZW50IHRvIGl0cyBwYXJlbnQgZm9ybSBbRm9ybUdyb3VwXXtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0Zvcm1Hcm91cH1cbiAgICpcbiAgICogQW5kIHN0YXJ0cyB0byBlbWl0IHRoZSBpbnB1dCdzIHZhbHVlIHdoZW4gaXQgY2hhbmdlcy5cbiAgICovXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubW9kZWxQYXRoID0gdGhpcy5nZXRNb2RlbFBhdGhXaXRob3V0Rmlyc3RQYXJ0KCk7XG4gICAgdGhpcy5tb2RlbFBpZWNlcyA9IHRoaXMubW9kZWxQYXRoICYmIHRoaXMubW9kZWxQYXRoLnNwbGl0KCcuJyk7XG4gICAgdGhpcy5jb250cm9sTmFtZSA9IHRoaXMuZ2V0Q29udHJvbE5hbWUoKTtcbiAgICB0aGlzLmZvcm1Db250cm9sID0gdGhpcy5nZXRGb3JtQ29udHJvbCgpO1xuICAgIHRoaXMucmVnaXN0ZXJUb0Zvcm1Hcm91cCgpO1xuICAgIHRoaXMuc3Vic2NyaWJlVG9VcGRhdGVFbnRpdHlWYWx1ZSgpO1xuICAgIHRoaXMuc2hvd1ZpZXdDb250ZW50KCk7XG4gICAgdGhpcy5lbWl0UmVhZHlTdGF0ZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5yZWFkeSQuY29tcGxldGUoKTtcblxuICAgIGlmICh0aGlzLnBhcmVudEZvcm1Hcm91cCkge1xuICAgICAgdGhpcy5yZW1vdmVGcm9tUGFyZW50Rm9ybUdyb3VwKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVGcm9tUGFyZW50Rm9ybUdyb3VwKCkge1xuICAgIGlmICh0aGlzLnBhcmVudEZvcm1Hcm91cCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgdGhpcy5wYXJlbnRGb3JtR3JvdXAucmVtb3ZlQ29udHJvbCh0aGlzLm5yZk1vZGVsTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5wYXJlbnRGb3JtR3JvdXAuY29udHJvbHMuZmluZEluZGV4KChjb250cm9sOiBhbnkpID0+IHRoaXMuZm9ybUNvbnRyb2wgPT09IGNvbnRyb2wpO1xuICAgICAgdGhpcy5wYXJlbnRGb3JtR3JvdXAucmVtb3ZlQXQoaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRvdCBub3RhdGlvbiBwYXRoIG9mIHRoZSBFbnRpdHksIHdpdGhvdXQgdGhlIGZpcnN0IHBhcnQsXG4gICAqIGJlY2F1c2UgaXQgaXMgdGhlIEVudGl0eSBpdHNlbGYuXG4gICAqL1xuICBwcml2YXRlIGdldE1vZGVsUGF0aFdpdGhvdXRGaXJzdFBhcnQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBtb2RlbE5hbWUgPSB0aGlzLm5yZk1vZGVsTmFtZTtcbiAgICByZXR1cm4gbW9kZWxOYW1lICYmIG1vZGVsTmFtZS5zdWJzdHIobW9kZWxOYW1lLmluZGV4T2YoJy4nKSArIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxhc3QgcGFydCBvZiB0aGUgZG90LW5vdGF0aW9uIHBhdGgsIHRoYXQgaW5kaWNhdGVzIHRoZSBjb250cm9sIG5hbWUgaXRzZWxmLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb250cm9sTmFtZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1vZGVsUGllY2VzID0gdGhpcy5tb2RlbFBpZWNlcztcbiAgICByZXR1cm4gbW9kZWxQaWVjZXMgJiYgbW9kZWxQaWVjZXNbbW9kZWxQaWVjZXMubGVuZ3RoIC0gMV07XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFudGlhdGUgYSBuZXcgW0Zvcm1Db250cm9sXXtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0Zvcm1Db250cm9sfSBhbmQgcmV0dXJuIGl0XG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0TmV3Rm9ybUNvbnRyb2woKTogRm9ybUNvbnRyb2wge1xuICAgIGNvbnN0IGRpc2FibGVkID0gdGhpcy5jb250cm9sT3B0aW9ucyAmJiB0aGlzLmNvbnRyb2xPcHRpb25zLmRpc2FibGVkO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRJbml0aWFsVmFsdWUoKTtcblxuICAgIHJldHVybiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZSwgZGlzYWJsZWQgfSwgdGhpcy5jb250cm9sT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBbbnJmRW50aXR5XXtAbGluayBOcmZGb3JtRGlyZWN0aXZlI25yZkVudGl0eX1cbiAgICovXG4gIHByb3RlY3RlZCBnZXRJbml0aWFsVmFsdWUoKTogYW55IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuZm9ybU9yU2VydmljZSAmJiB0aGlzLm1vZGVsUGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMubW9kZWxTZXR0ZXIuZ2V0VmFsdWUodGhpcy5tb2RlbFBhdGgsIHRoaXMuZm9ybU9yU2VydmljZS5mb3JtRGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHNob3dWaWV3Q29udGVudCgpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gbmV3IE5yZk5lc3RlZENvbnRyb2xDb250ZXh0KFxuICAgICAgdGhpcy5mb3JtQ29udHJvbCxcbiAgICAgIHRoaXMuZm9ybU9yU2VydmljZSAmJiB0aGlzLmZvcm1PclNlcnZpY2UuZm9ybUdyb3VwLFxuICAgICAgdGhpcyxcbiAgICApO1xuXG4gICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLnRlbXBsYXRlUmVmLCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciB0aGlzIGlucHV0IHRvIGl0cyBwYXJlbnQgW0Zvcm1Hcm91cF17QGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy9Gb3JtR3JvdXB9XG4gICAqIHRvIGVuYWJsZSB2YWxpZGF0aW9ucyBhbmQgZGF0YSBtYW5pcHVsYXRpb25cbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJUb0Zvcm1Hcm91cCgpIHtcbiAgICBpZiAodGhpcy5wYXJlbnRGb3JtR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBhcmVudEZvcm1Hcm91cCA9IHRoaXMuZ2V0UGFyZW50Rm9ybUdyb3VwKCk7XG5cbiAgICBpZiAodGhpcy5wYXJlbnRGb3JtR3JvdXApIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudEZvcm1Hcm91cCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICB0aGlzLnBhcmVudEZvcm1Hcm91cC5hZGRDb250cm9sKHRoaXMubW9kZWxQYXRoLCB0aGlzLmZvcm1Db250cm9sKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb250cm9sTmFtZTtcbiAgICAgICAgdGhpcy5wYXJlbnRGb3JtR3JvdXAuaW5zZXJ0KHBhcnNlSW50KGluZGV4LCAxMCksIHRoaXMuZm9ybUNvbnRyb2wpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgaWYgdGhpcyBpbnB1dCBpcyBpbnNpZGUgYSBbTnJmRm9ybURpcmVjdGl2ZV17QGxpbmsgTnJmRm9ybURpcmVjdGl2ZX1cbiAgICogYW5kIHJldHVybiBpdHMgW0Zvcm1Hcm91cF17QGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy9Gb3JtR3JvdXB9XG4gICAqXG4gICAqIE90aGVyd2lzZSBhIG5ldyBlbXB0eSBbRm9ybUdyb3VwXXtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0Zvcm1Hcm91cH1cbiAgICovXG4gIHByaXZhdGUgZ2V0UGFyZW50Rm9ybUdyb3VwKCk6IEZvcm1Hcm91cCB8IEZvcm1BcnJheSB7XG4gICAgY29uc3Qgcm9vdEZvcm1Hcm91cCA9IHRoaXMuZm9ybU9yU2VydmljZSAmJiB0aGlzLmZvcm1PclNlcnZpY2UuZm9ybUdyb3VwO1xuXG4gICAgaWYgKCFyb290Rm9ybUdyb3VwIHx8ICF0aGlzLm1vZGVsUGF0aCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybUdyb3VwUGF0aCA9IEFycmF5LmZyb20odGhpcy5tb2RlbFBpZWNlcyk7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUhpZXJhcmNoeS5nZXROZXN0ZWRDb250cm9sKHJvb3RGb3JtR3JvdXAsIGZvcm1Hcm91cFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBpZiB0aGUgW0Zvcm1Hcm91cF17QGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy9Gb3JtR3JvdXB9IGhhcyBhbiBjb250cm9sIHdpdGggdGhlIGN1cnJlbnQgbmFtZSBhbmQgcmV0dXJuIGl0LlxuICAgKiBPdGhlcndpc2UgcmV0dXJuIGEgbmV3IFtGb3JtQ29udHJvbF17QGxpbmsgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy9Gb3JtQ29udHJvbH1cbiAgICovXG4gIHByb3RlY3RlZCBnZXRGb3JtQ29udHJvbCgpOiBGb3JtQ29udHJvbCB7XG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5nZXRQYXJlbnRGb3JtR3JvdXAoKTtcbiAgICBsZXQgZm9ybUNvbnRyb2wgPSBmb3JtR3JvdXAgJiYgdGhpcy5ucmZNb2RlbE5hbWUgJiYgPEZvcm1Db250cm9sPmZvcm1Hcm91cC5nZXQodGhpcy5ucmZNb2RlbE5hbWUpO1xuXG4gICAgaWYgKCFmb3JtQ29udHJvbCkge1xuICAgICAgZm9ybUNvbnRyb2wgPSB0aGlzLmdldE5ld0Zvcm1Db250cm9sKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1Db250cm9sO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBbdmFsdWVDaGFuZ2VzXXtAbGluayBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2Zvcm1zL0Fic3RyYWN0Q29udHJvbCN2YWx1ZUNoYW5nZXN9IGFuZCB1cGRhdGUgdGhlIEVudGl0eSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb1VwZGF0ZUVudGl0eVZhbHVlKCkge1xuICAgIHRoaXMuZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlV2hpbGUoKCkgPT4gIXRoaXMuaXNEZXN0cm95ZWQpKVxuICAgICAgLnN1YnNjcmliZSgobmV3VmFsdWUpID0+IHRoaXMuc2V0TW9kZWxWYWx1ZShuZXdWYWx1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIFtmb3JtRGF0YV17QGxpbmsgTnJmRm9ybURpcmVjdGl2ZSNmb3JtRGF0YX1cbiAgICovXG4gIHNldE1vZGVsVmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmZvcm1PclNlcnZpY2UgJiYgdGhpcy5tb2RlbFBhdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1vZGVsU2V0dGVyLnNldFZhbHVlKHRoaXMubW9kZWxQYXRoLCBuZXdWYWx1ZSB8fCAnJywgdGhpcy5mb3JtT3JTZXJ2aWNlLmZvcm1EYXRhKTtcbiAgICB9XG4gIH1cblxuICBlbWl0UmVhZHlTdGF0ZSgpIHtcbiAgICB0aGlzLnJlYWR5JC5uZXh0KHRoaXMpO1xuICB9XG59XG4iXX0=