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
282 lines (281 loc) • 25.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Input, ContentChildren, QueryList, ElementRef, EventEmitter } from '@angular/core';
import { merge } from 'rxjs';
import { filter } from 'rxjs/operators';
import { ActionRegistry } from '../../model/actionregistry';
import { SchemaPropertyType } from '../../schema';
import { TemplateSchemaService } from '../template-schema.service';
import { ButtonComponent } from '../button/button.component';
import { FieldParent } from './field-parent';
import { ItemComponent } from './item/item.component';
import { TemplateSchemaElementRegistry } from '../template-schema-element-registry';
export class FieldComponent extends FieldParent {
/**
* @param {?} elementRef
* @param {?} templateSchemaService
* @param {?} templateRegistry
* @param {?} actionRegistry
*/
constructor(elementRef, templateSchemaService, templateRegistry, actionRegistry) {
super();
this.elementRef = elementRef;
this.templateSchemaService = templateSchemaService;
this.templateRegistry = templateRegistry;
this.actionRegistry = actionRegistry;
this.schema = {};
// changes that can be reflected in the widget components without rebuild
this.changes = new EventEmitter();
}
/**
* @return {?}
*/
getSchema() {
const { properties, items, required } = this.getFieldsSchema(this.childFields.filter(field => field !== this));
/** @type {?} */
const oneOf = this.getOneOf();
/** @type {?} */
let type;
if (!this.type && properties) {
type = SchemaPropertyType.Object;
}
else if (!this.type) {
type = SchemaPropertyType.String;
}
else {
type = this.type;
}
/** @type {?} */
const schema = /** @type {?} */ ({
type
});
if (this.title !== undefined) {
schema.title = this.title;
}
if (properties !== undefined) {
schema.properties = properties;
}
if (items !== undefined) {
schema.items = items;
}
// requried child fields
if (required !== undefined) {
schema.required = required;
}
if (oneOf !== undefined) {
schema.oneOf = oneOf;
}
if (this.description !== undefined) {
schema.description = this.description;
}
if (this.placeholder !== undefined) {
schema.placeholder = this.placeholder;
}
if (this.format !== undefined) {
schema.format = this.format;
}
if (this.widget !== undefined) {
schema.widget = this.widget;
}
if (this.readOnly !== undefined) {
schema.readOnly = this.readOnly;
}
/** @type {?} */
const buttons = this.getButtons();
if (buttons.length > 0) {
schema.buttons = buttons;
}
// @Input schema takes precedence
return Object.assign(schema, this.schema);
}
/**
* @return {?}
*/
getValidators() {
/** @type {?} */
const childValidators = this.getFieldsValidators(/** @type {?} */ (this.childFields.filter(field => field !== this)));
/** @type {?} */
const _validators = childValidators.map(({ path, validators }) => {
return {
path: this.path + path,
validators
};
});
if (!this.validators) {
return _validators;
}
_validators.push({ path: this.path, validators: this.validators });
return _validators;
}
/**
* @param {?=} parentFieldPath
* @return {?}
*/
register(parentFieldPath = '') {
/** @type {?} */
const path = parentFieldPath + this.path;
this.templateRegistry.register(path, this);
if (this.childFields.length) {
this.childFields.forEach((field) => {
if (field === this) {
return;
}
field.register(path);
});
}
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
// TODO check for particular properties change (widget.id, validator, etc.)
if (changes["type"] || changes["name"] || changes["format"] || changes["validators"]) {
this.templateSchemaService.changed();
}
else {
// changes that dont need to rebuild the schema
if (this.childFields) {
/** @type {?} */
const schema = this.getSchema();
delete schema.name;
delete schema.format;
if (typeof schema.widget === 'string') {
delete schema.widget;
}
else if (schema.widget && schema.width.id) {
delete schema.widget.id;
}
this.changes.emit(schema);
}
}
/*
// this is old way to update controls on field input changes,
// now we have the to types, changes that need rebuild of schema and the
// ones that not rebuilding schema
const keys = Object.keys(changes);
for (const key of keys) {
if (!changes[key].isFirstChange()) {
// on any input change, force schema change generation
this.templateSchemaService.changed();
break;
}
}
*/
}
/**
* @return {?}
*/
getOneOf() {
if (this.childItems.length === 0) {
return;
}
/** @type {?} */
const items = this.childItems.map(({ value, description }) => {
if (!Array.isArray(value)) {
return { enum: [value], description };
}
return { enum: value, description };
});
if (items.length === 0) {
return;
}
return items;
}
/**
* @return {?}
*/
setTitleFromContent() {
/** @type {?} */
const textContent = this.getTextContent(this.elementRef);
// title as @Input takes priority over content text
if (textContent && !this.title) {
this.title = textContent;
}
}
/**
* @return {?}
*/
ngAfterContentInit() {
// cache it
this.setTitleFromContent();
merge(this.childFields.changes, this.childItems.changes, this.childButtons.changes)
.pipe(filter((value) => Boolean(value)))
.subscribe(() => {
this.templateSchemaService.changed();
});
}
}
FieldComponent.decorators = [
{ type: Component, args: [{
selector: 'sf-field',
template: `<ng-content ></ng-content>
`
}] }
];
/** @nocollapse */
FieldComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: TemplateSchemaService },
{ type: TemplateSchemaElementRegistry },
{ type: ActionRegistry }
];
FieldComponent.propDecorators = {
childFields: [{ type: ContentChildren, args: [FieldComponent,] }],
childItems: [{ type: ContentChildren, args: [ItemComponent,] }],
childButtons: [{ type: ContentChildren, args: [ButtonComponent,] }],
name: [{ type: Input }],
type: [{ type: Input }],
format: [{ type: Input }],
required: [{ type: Input }],
readOnly: [{ type: Input }],
title: [{ type: Input }],
description: [{ type: Input }],
placeholder: [{ type: Input }],
widget: [{ type: Input }],
validators: [{ type: Input }],
schema: [{ type: Input }]
};
if (false) {
/** @type {?} */
FieldComponent.prototype.childFields;
/** @type {?} */
FieldComponent.prototype.childItems;
/** @type {?} */
FieldComponent.prototype.childButtons;
/** @type {?} */
FieldComponent.prototype.name;
/** @type {?} */
FieldComponent.prototype.type;
/** @type {?} */
FieldComponent.prototype.format;
/** @type {?} */
FieldComponent.prototype.required;
/** @type {?} */
FieldComponent.prototype.readOnly;
/** @type {?} */
FieldComponent.prototype.title;
/** @type {?} */
FieldComponent.prototype.description;
/** @type {?} */
FieldComponent.prototype.placeholder;
/** @type {?} */
FieldComponent.prototype.widget;
/** @type {?} */
FieldComponent.prototype.validators;
/** @type {?} */
FieldComponent.prototype.schema;
/** @type {?} */
FieldComponent.prototype.changes;
/** @type {?} */
FieldComponent.prototype.elementRef;
/** @type {?} */
FieldComponent.prototype.templateSchemaService;
/** @type {?} */
FieldComponent.prototype.templateRegistry;
/** @type {?} */
FieldComponent.prototype.actionRegistry;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNjaGVtYS1mb3Jtcy8iLCJzb3VyY2VzIjpbImxpYi90ZW1wbGF0ZS1zY2hlbWEvZmllbGQvZmllbGQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFJTCxlQUFlLEVBRWYsU0FBUyxFQUNULFVBQVUsRUFLVixZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFjLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUdsRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsNkJBQTZCLEVBQzlCLE1BQU0scUNBQXFDLENBQUM7QUFTN0MsTUFBTSxxQkFBc0IsU0FBUSxXQUFXOzs7Ozs7O0lBZ0Q3QyxZQUNVLFlBQ0EsdUJBQ0UsZ0JBQStDLEVBQy9DLGNBQThCO1FBRXhDLEtBQUssRUFBRSxDQUFDO1FBTEEsZUFBVSxHQUFWLFVBQVU7UUFDViwwQkFBcUIsR0FBckIscUJBQXFCO1FBQ25CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBK0I7UUFDL0MsbUJBQWMsR0FBZCxjQUFjLENBQWdCO3NCQVQ1QixFQUFHOzt1QkFHUCxJQUFJLFlBQVksRUFBRTtLQVMzQjs7OztJQUVELFNBQVM7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Q3BCLFFBQVEsRUFBRTtDQUNYO2FBQ0E7Ozs7WUFoQ0MsVUFBVTtZQWdCSCxxQkFBcUI7WUFPNUIsNkJBQTZCO1lBWHRCLGNBQWM7OzswQkF3QnBCLGVBQWUsU0FBQyxjQUFjO3lCQUc5QixlQUFlLFNBQUMsYUFBYTsyQkFHN0IsZUFBZSxTQUFDLGVBQWU7bUJBRy9CLEtBQUs7bUJBR0wsS0FBSztxQkFHTCxLQUFLO3VCQUdMLEtBQUs7dUJBR0wsS0FBSztvQkFHTCxLQUFLOzBCQUdMLEtBQUs7MEJBR0wsS0FBSztxQkFHTCxLQUFLO3lCQUdMLEtBQUs7cUJBR0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgT25Jbml0LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIFZpZXdDaGlsZCxcbiAgUXVlcnlMaXN0LFxuICBFbGVtZW50UmVmLFxuICBmb3J3YXJkUmVmLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2UsXG4gIE9uQ2hhbmdlcyxcbiAgRXZlbnRFbWl0dGVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2RlbC9hY3Rpb24nO1xuaW1wb3J0IHsgQWN0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi8uLi9tb2RlbC9hY3Rpb25yZWdpc3RyeSc7XG5pbXBvcnQgeyBTY2hlbWFQcm9wZXJ0eVR5cGUgfSBmcm9tICcuLi8uLi9zY2hlbWEnO1xuXG5pbXBvcnQgeyBUZW1wbGF0ZVNjaGVtYUVsZW1lbnQgfSBmcm9tICcuLi90ZW1wbGF0ZS1zY2hlbWEtZWxlbWVudCc7XG5pbXBvcnQgeyBUZW1wbGF0ZVNjaGVtYVNlcnZpY2UgfSBmcm9tICcuLi90ZW1wbGF0ZS1zY2hlbWEuc2VydmljZSc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IEZpZWxkUGFyZW50IH0gZnJvbSAnLi9maWVsZC1wYXJlbnQnO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tICcuL2ZpZWxkJztcbmltcG9ydCB7IEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2l0ZW0vaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgVGVtcGxhdGVTY2hlbWFFbGVtZW50UmVnaXN0cnlcbn0gZnJvbSAnLi4vdGVtcGxhdGUtc2NoZW1hLWVsZW1lbnQtcmVnaXN0cnknO1xuXG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2YtZmllbGQnLFxuICB0ZW1wbGF0ZTogYDxuZy1jb250ZW50ID48L25nLWNvbnRlbnQ+XG5gXG59KVxuZXhwb3J0IGNsYXNzIEZpZWxkQ29tcG9uZW50IGV4dGVuZHMgRmllbGRQYXJlbnRcbmltcGxlbWVudHMgRmllbGQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCB7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihGaWVsZENvbXBvbmVudClcbiAgY2hpbGRGaWVsZHM6IFF1ZXJ5TGlzdDxGaWVsZENvbXBvbmVudD47XG5cbiAgQENvbnRlbnRDaGlsZHJlbihJdGVtQ29tcG9uZW50KVxuICBjaGlsZEl0ZW1zOiBRdWVyeUxpc3Q8SXRlbUNvbXBvbmVudD47XG5cbiAgQENvbnRlbnRDaGlsZHJlbihCdXR0b25Db21wb25lbnQpXG4gIGNoaWxkQnV0dG9uczogUXVlcnlMaXN0PEJ1dHRvbkNvbXBvbmVudD47XG5cbiAgQElucHV0KClcbiAgbmFtZTogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHR5cGU6IFNjaGVtYVByb3BlcnR5VHlwZTtcblxuICBASW5wdXQoKVxuICBmb3JtYXQ6IHN0cmluZztcblxuICBASW5wdXQoKVxuICByZXF1aXJlZDogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICByZWFkT25seTogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICB0aXRsZTogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcGxhY2Vob2xkZXI6IHN0cmluZztcblxuICBASW5wdXQoKVxuICB3aWRnZXQ6IHN0cmluZyB8IG9iamVjdDtcblxuICBASW5wdXQoKVxuICB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbiB8IFZhbGlkYXRvckZuW107XG5cbiAgQElucHV0KClcbiAgc2NoZW1hOiBhbnkgPSB7IH07XG5cbiAgLy8gY2hhbmdlcyB0aGF0IGNhbiBiZSByZWZsZWN0ZWQgaW4gdGhlIHdpZGdldCBjb21wb25lbnRzIHdpdGhvdXQgcmVidWlsZFxuICBjaGFuZ2VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHRlbXBsYXRlU2NoZW1hU2VydmljZTogVGVtcGxhdGVTY2hlbWFTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCB0ZW1wbGF0ZVJlZ2lzdHJ5OiBUZW1wbGF0ZVNjaGVtYUVsZW1lbnRSZWdpc3RyeSxcbiAgICBwcm90ZWN0ZWQgYWN0aW9uUmVnaXN0cnk6IEFjdGlvblJlZ2lzdHJ5LFxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgZ2V0U2NoZW1hKCk6IGFueSB7XG5cbiAgICBjb25zdCB7IHByb3BlcnRpZXMsIGl0ZW1zLCByZXF1aXJlZCB9ID0gdGhpcy5nZXRGaWVsZHNTY2hlbWEoXG4gICAgICB0aGlzLmNoaWxkRmllbGRzLmZpbHRlcihmaWVsZCA9PiBmaWVsZCAhPT0gdGhpcylcbiAgICApO1xuXG4gICAgY29uc3Qgb25lT2YgPSB0aGlzLmdldE9uZU9mKCk7XG5cbiAgICBsZXQgdHlwZTogc3RyaW5nO1xuICAgIGlmICghdGhpcy50eXBlICYmIHByb3BlcnRpZXMpIHtcbiAgICAgIHR5cGUgPSBTY2hlbWFQcm9wZXJ0eVR5cGUuT2JqZWN0O1xuICAgIH0gZWxzZSBpZiAoIXRoaXMudHlwZSkge1xuICAgICAgdHlwZSA9IFNjaGVtYVByb3BlcnR5VHlwZS5TdHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGUgPSB0aGlzLnR5cGU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hID0gPGFueT57XG4gICAgICB0eXBlXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS50aXRsZSA9IHRoaXMudGl0bGU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgIH1cblxuICAgIGlmIChpdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzY2hlbWEuaXRlbXMgPSBpdGVtcztcbiAgICB9XG5cbiAgICAvLyByZXF1cmllZCBjaGlsZCBmaWVsZHNcbiAgICBpZiAocmVxdWlyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLnJlcXVpcmVkID0gcmVxdWlyZWQ7XG4gICAgfVxuXG4gICAgaWYgKG9uZU9mICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS5vbmVPZiA9IG9uZU9mO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS5kZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGxhY2Vob2xkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLnBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlcjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mb3JtYXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLmZvcm1hdCA9IHRoaXMuZm9ybWF0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLndpZGdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzY2hlbWEud2lkZ2V0ID0gdGhpcy53aWRnZXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVhZE9ubHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLnJlYWRPbmx5ID0gdGhpcy5yZWFkT25seTtcbiAgICB9XG5cbiAgICBjb25zdCBidXR0b25zID0gdGhpcy5nZXRCdXR0b25zKCk7XG4gICAgaWYgKGJ1dHRvbnMubGVuZ3RoID4gMCkge1xuICAgICAgc2NoZW1hLmJ1dHRvbnMgPSBidXR0b25zO1xuICAgIH1cblxuICAgIC8vIEBJbnB1dCBzY2hlbWEgdGFrZXMgcHJlY2VkZW5jZVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHNjaGVtYSwgdGhpcy5zY2hlbWEpO1xuXG4gIH1cblxuICBnZXRWYWxpZGF0b3JzKCk6IHsgcGF0aDogc3RyaW5nLCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbiB8IFZhbGlkYXRvckZuW10gfVtdIHtcblxuICAgIC8vIHJlZ2lzdGVyaW5nIHZhbGlkYXRvciBoZXJlIGlzIG5vdCBwb3NzaWJsZSBzaW5jZSBwcm9wIGZ1bGwgcGF0aCBpcyBuZWVkZWRcbiAgICBjb25zdCBjaGlsZFZhbGlkYXRvcnMgPSB0aGlzLmdldEZpZWxkc1ZhbGlkYXRvcnMoXG4gICAgICA8RmllbGRbXT50aGlzLmNoaWxkRmllbGRzLmZpbHRlcihmaWVsZCA9PiBmaWVsZCAhPT0gdGhpcylcbiAgICApO1xuICAgIGNvbnN0IF92YWxpZGF0b3JzID0gY2hpbGRWYWxpZGF0b3JzLm1hcCgoeyBwYXRoLCB2YWxpZGF0b3JzIH0pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGg6IHRoaXMucGF0aCArIHBhdGgsXG4gICAgICAgIHZhbGlkYXRvcnNcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBpZiAoIXRoaXMudmFsaWRhdG9ycykge1xuICAgICAgcmV0dXJuIF92YWxpZGF0b3JzO1xuICAgIH1cblxuICAgIF92YWxpZGF0b3JzLnB1c2goeyBwYXRoOiB0aGlzLnBhdGgsIHZhbGlkYXRvcnM6IHRoaXMudmFsaWRhdG9ycyB9KTtcbiAgICByZXR1cm4gX3ZhbGlkYXRvcnM7XG4gIH1cblxuICByZWdpc3RlcihwYXJlbnRGaWVsZFBhdGggPSAnJykge1xuICAgIGNvbnN0IHBhdGggPSBwYXJlbnRGaWVsZFBhdGggKyB0aGlzLnBhdGg7XG4gICAgdGhpcy50ZW1wbGF0ZVJlZ2lzdHJ5LnJlZ2lzdGVyKHBhdGgsIHRoaXMpO1xuICAgIGlmICh0aGlzLmNoaWxkRmllbGRzLmxlbmd0aCkge1xuICAgICAgdGhpcy5jaGlsZEZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICBpZiAoZmllbGQgPT09IHRoaXMpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZC5yZWdpc3RlcihwYXRoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcblxuICAgIC8vIFRPRE8gY2hlY2sgZm9yIHBhcnRpY3VsYXIgcHJvcGVydGllcyBjaGFuZ2UgKHdpZGdldC5pZCwgdmFsaWRhdG9yLCBldGMuKVxuICAgIGlmIChjaGFuZ2VzLnR5cGUgfHwgY2hhbmdlcy5uYW1lIHx8IGNoYW5nZXMuZm9ybWF0IHx8IGNoYW5nZXMudmFsaWRhdG9ycykge1xuICAgICAgdGhpcy50ZW1wbGF0ZVNjaGVtYVNlcnZpY2UuY2hhbmdlZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjaGFuZ2VzIHRoYXQgZG9udCBuZWVkIHRvIHJlYnVpbGQgdGhlIHNjaGVtYVxuICAgICAgaWYgKHRoaXMuY2hpbGRGaWVsZHMpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5nZXRTY2hlbWEoKTtcbiAgICAgICAgZGVsZXRlIHNjaGVtYS5uYW1lO1xuICAgICAgICBkZWxldGUgc2NoZW1hLmZvcm1hdDtcbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWEud2lkZ2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGRlbGV0ZSBzY2hlbWEud2lkZ2V0O1xuICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYS53aWRnZXQgJiYgc2NoZW1hLndpZHRoLmlkKSB7XG4gICAgICAgICAgZGVsZXRlIHNjaGVtYS53aWRnZXQuaWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2VzLmVtaXQoc2NoZW1hKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKlxuICAgIC8vIHRoaXMgaXMgb2xkIHdheSB0byB1cGRhdGUgY29udHJvbHMgb24gZmllbGQgaW5wdXQgY2hhbmdlcyxcbiAgICAvLyBub3cgd2UgaGF2ZSB0aGUgdG8gdHlwZXMsIGNoYW5nZXMgdGhhdCBuZWVkIHJlYnVpbGQgb2Ygc2NoZW1hIGFuZCB0aGVcbiAgICAvLyBvbmVzIHRoYXQgbm90IHJlYnVpbGRpbmcgc2NoZW1hXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNoYW5nZXMpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmICghY2hhbmdlc1trZXldLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgICAvLyBvbiBhbnkgaW5wdXQgY2hhbmdlLCBmb3JjZSBzY2hlbWEgY2hhbmdlIGdlbmVyYXRpb25cbiAgICAgICAgdGhpcy50ZW1wbGF0ZVNjaGVtYVNlcnZpY2UuY2hhbmdlZCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgICovXG5cblxuICB9XG5cblxuICBwcml2YXRlIGdldE9uZU9mKCkge1xuXG4gICAgaWYgKHRoaXMuY2hpbGRJdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuY2hpbGRJdGVtcy5tYXAoKHsgdmFsdWUsIGRlc2NyaXB0aW9uIH0pID0+IHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgZW51bTogW3ZhbHVlXSwgZGVzY3JpcHRpb24gfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgZW51bTogdmFsdWUsIGRlc2NyaXB0aW9uIH07XG4gICAgfSk7XG5cbiAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cblxuICBwcml2YXRlIHNldFRpdGxlRnJvbUNvbnRlbnQoKSB7XG4gICAgY29uc3QgdGV4dENvbnRlbnQgPSB0aGlzLmdldFRleHRDb250ZW50KHRoaXMuZWxlbWVudFJlZik7XG5cbiAgICAvLyAgdGl0bGUgYXMgQElucHV0IHRha2VzIHByaW9yaXR5IG92ZXIgY29udGVudCB0ZXh0XG4gICAgaWYgKHRleHRDb250ZW50ICYmICF0aGlzLnRpdGxlKSB7XG4gICAgICB0aGlzLnRpdGxlID0gdGV4dENvbnRlbnQ7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuXG4gICAgLy8gY2FjaGUgaXRcbiAgICB0aGlzLnNldFRpdGxlRnJvbUNvbnRlbnQoKTtcblxuICAgIG1lcmdlKFxuICAgICAgdGhpcy5jaGlsZEZpZWxkcy5jaGFuZ2VzLFxuICAgICAgdGhpcy5jaGlsZEl0ZW1zLmNoYW5nZXMsXG4gICAgICB0aGlzLmNoaWxkQnV0dG9ucy5jaGFuZ2VzXG4gICAgKVxuICAgIC5waXBlKGZpbHRlcigodmFsdWUpID0+IEJvb2xlYW4odmFsdWUpKSlcbiAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudGVtcGxhdGVTY2hlbWFTZXJ2aWNlLmNoYW5nZWQoKTtcbiAgICB9KTtcbiAgfVxuXG59XG4iXX0=