UNPKG

ngx-schema-forms

Version:

New features: - Ajv schema validator. - Angular forms compatible: Property tree is created using FormGroup, FormArray and FormControl classes. - Array now properly loads initial data from model. - WidgetTyep: WidgetRegistry now supports WidgetType, now wo

231 lines (230 loc) 19.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, Input, forwardRef, ChangeDetectorRef, ViewEncapsulation } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { ActionRegistry } from '../model/actionregistry'; import { ValidatorRegistry } from '../model/validatorregistry'; import { SchemaPropertyType } from '../schema'; import { SchemaValidatorFactory } from '../schemavalidatorfactory'; import { WidgetFactory } from '../widgetfactory'; import { FormPropertyFactory } from '../model/form-property-factory'; import { TemplateSchemaElementRegistry } from '../template-schema/template-schema-element-registry'; /** * @param {?} schemaValidatorFactory * @param {?} validatorRegistry * @return {?} */ export function useFactory(schemaValidatorFactory, validatorRegistry) { return new FormPropertyFactory(schemaValidatorFactory, validatorRegistry); } var FormComponent = /** @class */ (function () { function FormComponent(changeDetectorRef, formPropertyFactory, actionRegistry, validatorRegistry) { this.changeDetectorRef = changeDetectorRef; this.formPropertyFactory = formPropertyFactory; this.actionRegistry = actionRegistry; this.validatorRegistry = validatorRegistry; this.schema = null; this.actions = {}; this.validators = {}; this.rootFormProperty = null; } /** * @param {?} value * @return {?} */ FormComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { // value should be object if (this.rootFormProperty && value) { this.rootFormProperty.patchValue(value); } }; /** * @param {?} fn * @return {?} */ FormComponent.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.onChangeCallback = fn; if (this.rootFormProperty) { this.rootFormProperty.nonEmptyValueChanges.subscribe(fn); } }; // TODO implement /** * @param {?} fn * @return {?} */ FormComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { }; /** * @param {?} isDisabled * @return {?} */ FormComponent.prototype.setDisabledState = /** * @param {?} isDisabled * @return {?} */ function (isDisabled) { if (!this.rootFormProperty) { return; } if (isDisabled) { this.rootFormProperty.disable(); } else { this.rootFormProperty.enable(); } }; /** * @param {?} changes * @return {?} */ FormComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { if (changes["validators"]) { this.registerValidators(); } if (changes["actions"]) { this.registerActions(); } if (this.schema && !this.schema.type) { this.schema.type = SchemaPropertyType.Object; } if (this.schema && changes["schema"]) { /** @type {?} */ var value = void 0; if (this.rootFormProperty) { // TODO validate model against schema value = this.rootFormProperty.nonEmptyValue; } // force component destruction this.rootFormProperty = null; this.changeDetectorRef.detectChanges(); /** @type {?} */ var rootFormProperty = this.formPropertyFactory.createProperty(this.schema); // registerOnChange for changes after init if (this.onChangeCallback) { rootFormProperty.nonEmptyValueChanges.subscribe(this.onChangeCallback); if (value) { rootFormProperty.patchValue(value); } } this.rootFormProperty = rootFormProperty; } }; /** * @return {?} */ FormComponent.prototype.ngOnInit = /** * @return {?} */ function () { }; /** * @return {?} */ FormComponent.prototype.registerValidators = /** * @return {?} */ function () { this.validatorRegistry.clear(); if (!this.validators) { return; } for (var propertyPath in this.validators) { if (this.validators.hasOwnProperty(propertyPath)) { this.validatorRegistry.register(propertyPath, this.validators[propertyPath]); } } }; /** * @return {?} */ FormComponent.prototype.registerActions = /** * @return {?} */ function () { this.actionRegistry.clear(); if (!this.actions) { return; } for (var actionId in this.actions) { if (this.actions.hasOwnProperty(actionId)) { this.actionRegistry.register(actionId, this.actions[actionId]); } } }; FormComponent.decorators = [ { type: Component, args: [{ selector: 'sf-form', template: "\n <form #form=\"ngForm\">\n <sf-form-element *ngIf=\"rootFormProperty; else noSchema\" [formProperty]=\"rootFormProperty\">\n </sf-form-element>\n <ng-template #noSchema>\n You need to provide a json or a template schema!\n </ng-template>\n </form>\n ", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return FormComponent; }), multi: true }, ActionRegistry, ValidatorRegistry, WidgetFactory, { provide: FormPropertyFactory, useFactory: useFactory, deps: [SchemaValidatorFactory, ValidatorRegistry] }, TemplateSchemaElementRegistry ], encapsulation: ViewEncapsulation.None }] } ]; /** @nocollapse */ FormComponent.ctorParameters = function () { return [ { type: ChangeDetectorRef }, { type: FormPropertyFactory }, { type: ActionRegistry }, { type: ValidatorRegistry } ]; }; FormComponent.propDecorators = { schema: [{ type: Input }], actions: [{ type: Input }], validators: [{ type: Input }] }; return FormComponent; }()); export { FormComponent }; if (false) { /** @type {?} */ FormComponent.prototype.schema; /** @type {?} */ FormComponent.prototype.actions; /** @type {?} */ FormComponent.prototype.validators; /** @type {?} */ FormComponent.prototype.rootFormProperty; /** @type {?} */ FormComponent.prototype.onChangeCallback; /** @type {?} */ FormComponent.prototype.changeDetectorRef; /** @type {?} */ FormComponent.prototype.formPropertyFactory; /** @type {?} */ FormComponent.prototype.actionRegistry; /** @type {?} */ FormComponent.prototype.validatorRegistry; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc2NoZW1hLWZvcm1zLyIsInNvdXJjZXMiOlsibGliL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUVMLFVBQVUsRUFDVixpQkFBaUIsRUFJakIsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFTCxpQkFBaUIsRUFHbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVyRSxPQUFPLEVBQ0wsNkJBQTZCLEVBQzlCLE1BQU0scURBQXFELENBQUM7Ozs7OztBQUU3RCxNQUFNLHFCQUFxQixzQkFBc0IsRUFBRSxpQkFBaUI7SUFDbEUsTUFBTSxDQUFDLElBQUksbUJBQW1CLENBQUMsc0JBQXNCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztDQUMzRTs7SUErQ0MsdUJBQ1UsbUJBQ0EscUJBQ0EsZ0JBQ0E7UUFIQSxzQkFBaUIsR0FBakIsaUJBQWlCO1FBQ2pCLHdCQUFtQixHQUFuQixtQkFBbUI7UUFDbkIsbUJBQWMsR0FBZCxjQUFjO1FBQ2Qsc0JBQWlCLEdBQWpCLGlCQUFpQjtzQkFoQmIsSUFBSTt1QkFHd0IsRUFBRTswQkFHa0IsRUFBRTtnQ0FFL0IsSUFBSTtLQVNqQzs7Ozs7SUFFSixrQ0FBVTs7OztJ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dEIsSUFBSSxFQUFFLENBQUMsc0JBQXNCLEVBQUUsaUJBQWlCLENBQUM7eUJBQ2xEO3dCQUNELDZCQUE2QjtxQkFDOUI7b0JBQ0QsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7aUJBQ3RDOzs7O2dCQTFEQyxpQkFBaUI7Z0JBbUJWLG1CQUFtQjtnQkFMbkIsY0FBYztnQkFDZCxpQkFBaUI7Ozt5QkE4Q3ZCLEtBQUs7MEJBR0wsS0FBSzs2QkFHTCxLQUFLOzt3QkF6RVI7O1NBaUVhLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uQ2hhbmdlcyxcbiAgSW5wdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIGZvcndhcmRSZWYsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIE9uSW5pdCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFZhbGlkYXRvckZuLFxuICBOZ0Zvcm1cbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tICcuLi9tb2RlbC9hY3Rpb24nO1xuaW1wb3J0IHsgQWN0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi9tb2RlbC9hY3Rpb25yZWdpc3RyeSc7XG5pbXBvcnQgeyBWYWxpZGF0b3JSZWdpc3RyeSB9IGZyb20gJy4uL21vZGVsL3ZhbGlkYXRvcnJlZ2lzdHJ5JztcbmltcG9ydCB7IFNjaGVtYVByb3BlcnR5VHlwZSB9IGZyb20gJy4uL3NjaGVtYSc7XG5pbXBvcnQgeyBTY2hlbWFWYWxpZGF0b3JGYWN0b3J5IH0gZnJvbSAnLi4vc2NoZW1hdmFsaWRhdG9yZmFjdG9yeSc7XG5pbXBvcnQgeyBXaWRnZXRGYWN0b3J5IH0gZnJvbSAnLi4vd2lkZ2V0ZmFjdG9yeSc7XG5pbXBvcnQgeyBGb3JtUHJvcGVydHlGYWN0b3J5IH0gZnJvbSAnLi4vbW9kZWwvZm9ybS1wcm9wZXJ0eS1mYWN0b3J5JztcbmltcG9ydCB7IEZvcm1Qcm9wZXJ0eSB9IGZyb20gJy4uL21vZGVsL2Zvcm0tcHJvcGVydHknO1xuaW1wb3J0IHtcbiAgVGVtcGxhdGVTY2hlbWFFbGVtZW50UmVnaXN0cnlcbn0gZnJvbSAnLi4vdGVtcGxhdGUtc2NoZW1hL3RlbXBsYXRlLXNjaGVtYS1lbGVtZW50LXJlZ2lzdHJ5JztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUZhY3Rvcnkoc2NoZW1hVmFsaWRhdG9yRmFjdG9yeSwgdmFsaWRhdG9yUmVnaXN0cnkpIHtcbiAgcmV0dXJuIG5ldyBGb3JtUHJvcGVydHlGYWN0b3J5KHNjaGVtYVZhbGlkYXRvckZhY3RvcnksIHZhbGlkYXRvclJlZ2lzdHJ5KTtcbn1cblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZi1mb3JtJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8Zm9ybSAjZm9ybT1cIm5nRm9ybVwiPlxuICAgICAgPHNmLWZvcm0tZWxlbWVudCAqbmdJZj1cInJvb3RGb3JtUHJvcGVydHk7IGVsc2Ugbm9TY2hlbWFcIiBbZm9ybVByb3BlcnR5XT1cInJvb3RGb3JtUHJvcGVydHlcIj5cbiAgICAgIDwvc2YtZm9ybS1lbGVtZW50PlxuICAgICAgPG5nLXRlbXBsYXRlICNub1NjaGVtYT5cbiAgICAgICAgWW91IG5lZWQgdG8gcHJvdmlkZSBhIGpzb24gb3IgYSB0ZW1wbGF0ZSBzY2hlbWEhXG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZm9ybT5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGb3JtQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICBBY3Rpb25SZWdpc3RyeSxcbiAgICBWYWxpZGF0b3JSZWdpc3RyeSxcbiAgICBXaWRnZXRGYWN0b3J5LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IEZvcm1Qcm9wZXJ0eUZhY3RvcnksXG4gICAgICB1c2VGYWN0b3J5OiB1c2VGYWN0b3J5LFxuICAgICAgZGVwczogW1NjaGVtYVZhbGlkYXRvckZhY3RvcnksIFZhbGlkYXRvclJlZ2lzdHJ5XVxuICAgIH0sXG4gICAgVGVtcGxhdGVTY2hlbWFFbGVtZW50UmVnaXN0cnlcbiAgXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICBASW5wdXQoKVxuICBzY2hlbWE6IGFueSA9IG51bGw7XG5cbiAgQElucHV0KClcbiAgYWN0aW9uczogeyBbYWN0aW9uSWQ6IHN0cmluZ106IEFjdGlvbiB9ID0ge307XG5cbiAgQElucHV0KClcbiAgdmFsaWRhdG9yczogeyBbcGF0aDogc3RyaW5nXTogVmFsaWRhdG9yRm4gfCBWYWxpZGF0b3JGbltdIH0gPSB7fTtcblxuICByb290Rm9ybVByb3BlcnR5OiBGb3JtUHJvcGVydHkgPSBudWxsO1xuXG4gIHByaXZhdGUgb25DaGFuZ2VDYWxsYmFjazogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZm9ybVByb3BlcnR5RmFjdG9yeTogRm9ybVByb3BlcnR5RmFjdG9yeSxcbiAgICBwcml2YXRlIGFjdGlvblJlZ2lzdHJ5OiBBY3Rpb25SZWdpc3RyeSxcbiAgICBwcml2YXRlIHZhbGlkYXRvclJlZ2lzdHJ5OiBWYWxpZGF0b3JSZWdpc3RyeSxcbiAgKSB7fVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIC8vIHZhbHVlIHNob3VsZCBiZSBvYmplY3RcbiAgICBpZiAodGhpcy5yb290Rm9ybVByb3BlcnR5ICYmIHZhbHVlKSB7XG4gICAgICB0aGlzLnJvb3RGb3JtUHJvcGVydHkucGF0Y2hWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gICAgaWYgKHRoaXMucm9vdEZvcm1Qcm9wZXJ0eSkge1xuICAgICAgdGhpcy5yb290Rm9ybVByb3BlcnR5Lm5vbkVtcHR5VmFsdWVDaGFuZ2VzLnN1YnNjcmliZShmbik7XG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETyBpbXBsZW1lbnRcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge31cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMucm9vdEZvcm1Qcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc2FibGVkKSB7XG4gICAgICB0aGlzLnJvb3RGb3JtUHJvcGVydHkuZGlzYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvb3RGb3JtUHJvcGVydHkuZW5hYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLnZhbGlkYXRvcnMpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJWYWxpZGF0b3JzKCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMuYWN0aW9ucykge1xuICAgICAgdGhpcy5yZWdpc3RlckFjdGlvbnMoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zY2hlbWEgJiYgIXRoaXMuc2NoZW1hLnR5cGUpIHtcbiAgICAgIHRoaXMuc2NoZW1hLnR5cGUgPSBTY2hlbWFQcm9wZXJ0eVR5cGUuT2JqZWN0O1xuICAgIH1cblxuXG4gICAgaWYgKHRoaXMuc2NoZW1hICYmIGNoYW5nZXMuc2NoZW1hKSB7XG4gICAgICBsZXQgdmFsdWU6IGFueTtcbiAgICAgIGlmICh0aGlzLnJvb3RGb3JtUHJvcGVydHkpIHtcbiAgICAgICAgLy8gVE9ETyB2YWxpZGF0ZSBtb2RlbCBhZ2FpbnN0IHNjaGVtYVxuICAgICAgICB2YWx1ZSA9IHRoaXMucm9vdEZvcm1Qcm9wZXJ0eS5ub25FbXB0eVZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyBmb3JjZSBjb21wb25lbnQgZGVzdHJ1Y3Rpb25cbiAgICAgIHRoaXMucm9vdEZvcm1Qcm9wZXJ0eSA9IG51bGw7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgLy8gU2NoZW1hUHJlcHJvY2Vzc29yIGlzIG5vdyBkb25lIGluIGZvcm1Qcm9wZXJ0eUZhY3RvcnkgdXNpbmcgcHJvcGVydHlcbiAgICAgIC8vIGNyZWF0aW9uIHJlY3Vyc2lvbiwgdGhpcyByZW1vdmVzIHRoZSBuZWVkIHRvIHRyYXZlcnNlIHRoZSB0cmVlIHR3aWNlLlxuICAgICAgLy8gVE9ETyB0ZXN0IHNjaGVtYSBwcmVwcm9jZXNzaW5nIG1vdmVcbiAgICAgIGNvbnN0IHJvb3RGb3JtUHJvcGVydHkgPSB0aGlzLmZvcm1Qcm9wZXJ0eUZhY3RvcnkuY3JlYXRlUHJvcGVydHkoXG4gICAgICAgIHRoaXMuc2NoZW1hXG4gICAgICApO1xuXG4gICAgICAvLyByZWdpc3Rlck9uQ2hhbmdlIGZvciBjaGFuZ2VzIGFmdGVyIGluaXRcbiAgICAgIGlmICh0aGlzLm9uQ2hhbmdlQ2FsbGJhY2spIHtcbiAgICAgICAgcm9vdEZvcm1Qcm9wZXJ0eS5ub25FbXB0eVZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoXG4gICAgICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrXG4gICAgICAgICk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHJvb3RGb3JtUHJvcGVydHkucGF0Y2hWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5yb290Rm9ybVByb3BlcnR5ID0gcm9vdEZvcm1Qcm9wZXJ0eTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcblxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclZhbGlkYXRvcnMoKSB7XG4gICAgdGhpcy52YWxpZGF0b3JSZWdpc3RyeS5jbGVhcigpO1xuICAgIGlmICghdGhpcy52YWxpZGF0b3JzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eVBhdGggaW4gdGhpcy52YWxpZGF0b3JzKSB7XG4gICAgICBpZiAodGhpcy52YWxpZGF0b3JzLmhhc093blByb3BlcnR5KHByb3BlcnR5UGF0aCkpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0b3JSZWdpc3RyeS5yZWdpc3RlcihcbiAgICAgICAgICBwcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgdGhpcy52YWxpZGF0b3JzW3Byb3BlcnR5UGF0aF1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyQWN0aW9ucygpIHtcbiAgICB0aGlzLmFjdGlvblJlZ2lzdHJ5LmNsZWFyKCk7XG4gICAgaWYgKCF0aGlzLmFjdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFjdGlvbklkIGluIHRoaXMuYWN0aW9ucykge1xuICAgICAgaWYgKHRoaXMuYWN0aW9ucy5oYXNPd25Qcm9wZXJ0eShhY3Rpb25JZCkpIHtcbiAgICAgICAgdGhpcy5hY3Rpb25SZWdpc3RyeS5yZWdpc3RlcihhY3Rpb25JZCwgdGhpcy5hY3Rpb25zW2FjdGlvbklkXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=