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
178 lines (177 loc) • 19.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { startWith } from 'rxjs/operators';
import { SchemaPropertyType } from '../schema';
import { GenericProperty } from './generic-property';
import { NumberProperty } from './number-property';
import { BooleanProperty } from './boolean-property';
import { StringProperty } from './string-property';
import { ArrayProperty } from './array-property';
import { ObjectProperty } from './object-property';
import { SchemaPreprocessor } from './schemapreprocessor';
/** @typedef {?} */
var PropertyParent;
export { PropertyParent };
export class FormPropertyFactory {
/**
* @param {?} schemaValidatorFactory
* @param {?} validatorRegistry
*/
constructor(schemaValidatorFactory, validatorRegistry) {
this.schemaValidatorFactory = schemaValidatorFactory;
this.validatorRegistry = validatorRegistry;
}
/**
* @param {?} schema
* @param {?=} propertyParent
* @param {?=} propertyKey
* @return {?}
*/
createProperty(schema, propertyParent, propertyKey) {
/** @type {?} */
let property;
/** @type {?} */
const path = this.generatePath(propertyParent, propertyKey);
SchemaPreprocessor.preprocess(schema, path);
// TODO test for parsing for reference schema
if (schema["$ref"]) {
/** @type {?} */
const refSchema = this.schemaValidatorFactory.getSchema((/** @type {?} */ (propertyParent.root)).schema, schema["$ref"]);
property = this.createProperty(refSchema, propertyParent, propertyKey || path);
}
else {
switch (schema["type"]) {
case SchemaPropertyType.Integer:
case SchemaPropertyType.Number:
property = new NumberProperty(path, schema);
break;
case SchemaPropertyType.String:
property = new StringProperty(path, schema);
break;
case SchemaPropertyType.Boolean:
property = new BooleanProperty(path, schema);
break;
case SchemaPropertyType.Object:
property = new ObjectProperty(path, schema);
break;
case SchemaPropertyType.Array:
if (schema["widget"].id === 'array') {
property = new ArrayProperty(this, path, schema);
}
else {
schema["default"] = [];
property = new GenericProperty(path, schema);
}
break;
default:
throw new TypeError(`Undefined type ${schema["type"]}`);
}
}
this.initializeFormProperty(property, propertyParent);
return property;
}
/**
* @param {?} property
* @param {?=} propertyParent
* @return {?}
*/
initializeFormProperty(property, propertyParent) {
if (propertyParent) {
property.setParent(propertyParent);
}
this.bindCustomValidator(property);
if (property instanceof ObjectProperty) {
for (const key in property.schema["properties"]) {
if (property.schema["properties"].hasOwnProperty(key)) {
/** @type {?} */
const _schema = property.schema["properties"][key];
/** @type {?} */
const _property = this.createProperty(_schema, property, key);
property.addControl(key, _property);
}
}
}
if (property.isRoot) {
this.bindSchemaValidator(property);
// needs to run after entire property tree is built
property.bindVisibility();
}
}
/**
* @param {?} property
* @return {?}
*/
bindSchemaValidator(property) {
/** @type {?} */
const validate = this.schemaValidatorFactory.createValidatorFn(property.schema);
// TODO use pipe startWith to do initial run
property.valueChanges
.pipe(startWith(null))
.subscribe(() => {
/** @type {?} */
const value = property.nonEmptyValue;
property.nonEmptyValueChanges.emit(value);
/** @type {?} */
const errors = validate(value);
if (!errors) {
return;
}
Object.keys(errors).forEach((path) => {
/** @type {?} */
const control = property.get(path);
if (control) {
// set error to specific control
control.setErrors(errors[path], { emitEvent: true });
}
});
});
}
/**
* @param {?} property
* @return {?}
*/
bindCustomValidator(property) {
/** @type {?} */
const validators = this.validatorRegistry.get(property.path);
if (validators) {
property.setValidators(validators);
}
}
/**
* @param {?=} propertyParent
* @param {?=} propertyKey
* @return {?}
*/
generatePath(propertyParent, propertyKey) {
if (!propertyParent) {
return '/';
}
/** @type {?} */
let path = '';
path += propertyParent.path;
if (propertyParent.parent !== undefined) {
path += '/';
}
switch (propertyParent.schema["type"]) {
case SchemaPropertyType.Object:
path += propertyKey;
break;
case SchemaPropertyType.Array:
path += (/** @type {?} */ (propertyParent)).controls.length;
break;
default:
// TODO move to class
throw new Error('Instantiation of a FormProperty with an unknown parent type: ' + propertyParent.schema["type"]);
}
return path;
}
}
if (false) {
/** @type {?} */
FormPropertyFactory.prototype.schemaValidatorFactory;
/** @type {?} */
FormPropertyFactory.prototype.validatorRegistry;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1wcm9wZXJ0eS1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNjaGVtYS1mb3Jtcy8iLCJzb3VyY2VzIjpbImxpYi9tb2RlbC9mb3JtLXByb3BlcnR5LWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQVFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU0zQyxPQUFPLEVBQVUsa0JBQWtCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFNMUQsTUFBTTs7Ozs7SUFFSixZQUNVLHdCQUNBO1FBREEsMkJBQXNCLEdBQXRCLHNCQUFzQjtRQUN0QixzQkFBaUIsR0FBakIsaUJBQWlCO0tBQ3RCOzs7Ozs7O0lBRUwsY0FBYyxDQUNaLE1BQWMsRUFDZCxjQUErQixFQUMvQixXQUFvQjs7UUFJcEIsSUFBSSxRQUFRLENBQWU7O1FBQzNCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRTVELGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7O1FBRzVDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sVUFBTyxDQUFDOztZQUNoQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMs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O1NBQ3BDOzs7Ozs7O0lBR0ssWUFBWSxDQUNsQixjQUErQixFQUMvQixXQUFvQjtRQUdwQixFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsTUFBTSxDQUFDLEdBQUcsQ0FBQztTQUNaOztRQUVELElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDO1FBRzVCLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN4QyxJQUFJLElBQUksR0FBRyxDQUFDO1NBQ2I7UUFFRCxNQUFNLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxVQUFPLENBQUM7WUFDbkMsS0FBSyxrQkFBa0IsQ0FBQyxNQUFNO2dCQUM1QixJQUFJLElBQUksV0FBVyxDQUFDO2dCQUNwQixLQUFLLENBQUM7WUFFUixLQUFLLGtCQUFrQixDQUFDLEtBQUs7Z0JBQzNCLElBQUksSUFBSSxtQkFBZ0IsY0FBYyxFQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDeEQsS0FBSyxDQUFDO1lBRVI7O2dCQUVFLE1BQU0sSUFBSSxLQUFLLENBQ2IsK0RBQStELEdBQzdELGNBQWMsQ0FBQyxNQUFNLFFBQUssQ0FDN0IsQ0FBQztTQUNMO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQzs7Q0FFZiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUdyb3VwLFxuICBGb3JtQXJyYXksXG4gIFZhbGlkYXRvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5cblxuaW1wb3J0IHsgU2NoZW1hVmFsaWRhdG9yRmFjdG9yeSB9IGZyb20gJy4uL3NjaGVtYXZhbGlkYXRvcmZhY3RvcnknO1xuaW1wb3J0IHsgVmFsaWRhdG9yUmVnaXN0cnkgfSBmcm9tICcuLi9tb2RlbC92YWxpZGF0b3JyZWdpc3RyeSc7XG5pbXBvcnQgeyBTY2hlbWEsIFNjaGVtYVByb3BlcnR5VHlwZSB9IGZyb20gJy4uL3NjaGVtYSc7XG5cbmltcG9ydCB7IEZvcm1Qcm9wZXJ0eSB9IGZyb20gJy4vZm9ybS1wcm9wZXJ0eSc7XG5pbXBvcnQgeyBHZW5lcmljUHJvcGVydHkgfSBmcm9tICcuL2dlbmVyaWMtcHJvcGVydHknO1xuaW1wb3J0IHsgTnVtYmVyUHJvcGVydHkgfSBmcm9tICcuL251bWJlci1wcm9wZXJ0eSc7XG5pbXBvcnQgeyBCb29sZWFuUHJvcGVydHkgfSBmcm9tICcuL2Jvb2xlYW4tcHJvcGVydHknO1xuaW1wb3J0IHsgU3RyaW5nUHJvcGVydHkgfSBmcm9tICcuL3N0cmluZy1wcm9wZXJ0eSc7XG5pbXBvcnQgeyBBcnJheVByb3BlcnR5IH0gZnJvbSAnLi9hcnJheS1wcm9wZXJ0eSc7XG5pbXBvcnQgeyBPYmplY3RQcm9wZXJ0eSB9IGZyb20gJy4vb2JqZWN0LXByb3BlcnR5JztcbmltcG9ydCB7IFNjaGVtYVByZXByb2Nlc3NvciB9IGZyb20gJy4vc2NoZW1hcHJlcHJvY2Vzc29yJztcblxuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eVBhcmVudCA9IE9iamVjdFByb3BlcnR5IHwgQXJyYXlQcm9wZXJ0eTtcblxuXG5leHBvcnQgY2xhc3MgRm9ybVByb3BlcnR5RmFjdG9yeSB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzY2hlbWFWYWxpZGF0b3JGYWN0b3J5OiBTY2hlbWFWYWxpZGF0b3JGYWN0b3J5LFxuICAgIHByaXZhdGUgdmFsaWRhdG9yUmVnaXN0cnk6IFZhbGlkYXRvclJlZ2lzdHJ5XG4gICkgeyB9XG5cbiAgY3JlYXRlUHJvcGVydHkoXG4gICAgc2NoZW1hOiBTY2hlbWEsXG4gICAgcHJvcGVydHlQYXJlbnQ/OiBQcm9wZXJ0eVBhcmVudCxcbiAgICBwcm9wZXJ0eUtleT86IHN0cmluZ1xuICApOiBGb3JtUHJvcGVydHkge1xuXG5cbiAgICBsZXQgcHJvcGVydHk6IEZvcm1Qcm9wZXJ0eTtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5nZW5lcmF0ZVBhdGgocHJvcGVydHlQYXJlbnQsIHByb3BlcnR5S2V5KTtcblxuICAgIFNjaGVtYVByZXByb2Nlc3Nvci5wcmVwcm9jZXNzKHNjaGVtYSwgcGF0aCk7XG5cbiAgICAvLyBUT0RPIHRlc3QgZm9yIHBhcnNpbmcgZm9yIHJlZmVyZW5jZSBzY2hlbWFcbiAgICBpZiAoc2NoZW1hLiRyZWYpIHtcbiAgICAgIGNvbnN0IHJlZlNjaGVtYSA9IHRoaXMuc2NoZW1hVmFsaWRhdG9yRmFjdG9yeS5nZXRTY2hlbWEoXG4gICAgICAgICg8Rm9ybVByb3BlcnR5PnByb3BlcnR5UGFyZW50LnJvb3QpLnNjaGVtYSxcbiAgICAgICAgc2NoZW1hLiRyZWZcbiAgICAgICk7XG5cbiAgICAgIHByb3BlcnR5ID0gdGhpcy5jcmVhdGVQcm9wZXJ0eShcbiAgICAgICAgcmVmU2NoZW1hLFxuICAgICAgICBwcm9wZXJ0eVBhcmVudCxcbiAgICAgICAgcHJvcGVydHlLZXkgfHwgcGF0aFxuICAgICAgKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKHNjaGVtYS50eXBlKSB7XG4gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHlUeXBlLkludGVnZXI6XG4gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHlUeXBlLk51bWJlcjpcbiAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBOdW1iZXJQcm9wZXJ0eShwYXRoLCBzY2hlbWEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5VHlwZS5TdHJpbmc6XG4gICAgICAgICAgcHJvcGVydHkgPSBuZXcgU3RyaW5nUHJvcGVydHkocGF0aCwgc2NoZW1hKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eVR5cGUuQm9vbGVhbjpcbiAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBCb29sZWFuUHJvcGVydHkocGF0aCwgc2NoZW1hKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eVR5cGUuT2JqZWN0OlxuICAgICAgICAgIHByb3BlcnR5ID0gbmV3IE9iamVjdFByb3BlcnR5KHBhdGgsIHNjaGVtYSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHlUeXBlLkFycmF5OlxuICAgICAgICAgIGlmIChzY2hlbWEud2lkZ2V0LmlkID09PSAnYXJyYXknKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBBcnJheVByb3BlcnR5KHRoaXMsIHBhdGgsIHNjaGVtYSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNjaGVtYS5kZWZhdWx0ID0gW107XG4gICAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBHZW5lcmljUHJvcGVydHkocGF0aCwgc2NoZW1hKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5kZWZpbmVkIHR5cGUgJHtzY2hlbWEudHlwZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm1Qcm9wZXJ0eShwcm9wZXJ0eSwgcHJvcGVydHlQYXJlbnQpO1xuXG5cbiAgICByZXR1cm4gcHJvcGVydHk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVGb3JtUHJvcGVydHkoXG4gICAgcHJvcGVydHk6IEZvcm1Qcm9wZXJ0eSxcbiAgICBwcm9wZXJ0eVBhcmVudD86IFByb3BlcnR5UGFyZW50LFxuICApIHtcblxuICAgIGlmIChwcm9wZXJ0eVBhcmVudCkge1xuICAgICAgcHJvcGVydHkuc2V0UGFyZW50KHByb3BlcnR5UGFyZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmJpbmRDdXN0b21WYWxpZGF0b3IocHJvcGVydHkpO1xuXG4gICAgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgT2JqZWN0UHJvcGVydHkpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BlcnR5LnNjaGVtYS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGlmIChwcm9wZXJ0eS5zY2hlbWEucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgY29uc3QgX3NjaGVtYSA9IHByb3BlcnR5LnNjaGVtYS5wcm9wZXJ0aWVzW2tleV07XG4gICAgICAgICAgY29uc3QgX3Byb3BlcnR5ID0gdGhpcy5jcmVhdGVQcm9wZXJ0eShfc2NoZW1hLCBwcm9wZXJ0eSwga2V5KTtcbiAgICAgICAgICBwcm9wZXJ0eS5hZGRDb250cm9sKGtleSwgX3Byb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9wZXJ0eS5pc1Jvb3QpIHtcbiAgICAgIHRoaXMuYmluZFNjaGVtYVZhbGlkYXRvcihwcm9wZXJ0eSk7XG4gICAgICAvLyBuZWVkcyB0byBydW4gYWZ0ZXIgZW50aXJlIHByb3BlcnR5IHRyZWUgaXMgYnVpbHRcbiAgICAgIHByb3BlcnR5LmJpbmRWaXNpYmlsaXR5KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBiaW5kU2NoZW1hVmFsaWRhdG9yKHByb3BlcnR5OiBGb3JtUHJvcGVydHkpIHtcblxuICAgIGNvbnN0IHZhbGlkYXRlID0gdGhpcy5zY2hlbWFWYWxpZGF0b3JGYWN0b3J5LmNyZWF0ZVZhbGlkYXRvckZuKFxuICAgICAgcHJvcGVydHkuc2NoZW1hXG4gICAgKTtcblxuICAgIC8vIFRPRE8gdXNlIHBpcGUgc3RhcnRXaXRoIHRvIGRvIGluaXRpYWwgcnVuXG4gICAgcHJvcGVydHkudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShzdGFydFdpdGgobnVsbCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcm9wZXJ0eS5ub25FbXB0eVZhbHVlO1xuICAgICAgICBwcm9wZXJ0eS5ub25FbXB0eVZhbHVlQ2hhbmdlcy5lbWl0KHZhbHVlKTtcblxuICAgICAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZSh2YWx1ZSk7XG4gICAgICAgIGlmICghZXJyb3JzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmtleXMoZXJyb3JzKS5mb3JFYWNoKChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBjb25zdCBjb250cm9sID0gcHJvcGVydHkuZ2V0KHBhdGgpO1xuICAgICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgICAvLyBzZXQgZXJyb3IgdG8gc3BlY2lmaWMgY29udHJvbFxuICAgICAgICAgICAgY29udHJvbC5zZXRFcnJvcnMoZXJyb3JzW3BhdGhdLCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJpbmRDdXN0b21WYWxpZGF0b3IocHJvcGVydHk6IEZvcm1Qcm9wZXJ0eSkge1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSB0aGlzLnZhbGlkYXRvclJlZ2lzdHJ5LmdldChwcm9wZXJ0eS5wYXRoKTtcbiAgICBpZiAodmFsaWRhdG9ycykge1xuICAgICAgcHJvcGVydHkuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlUGF0aChcbiAgICBwcm9wZXJ0eVBhcmVudD86IFByb3BlcnR5UGFyZW50LFxuICAgIHByb3BlcnR5S2V5Pzogc3RyaW5nXG4gICk6IHN0cmluZyB7XG5cbiAgICBpZiAoIXByb3BlcnR5UGFyZW50KSB7XG4gICAgICByZXR1cm4gJy8nO1xuICAgIH1cblxuICAgIGxldCBwYXRoID0gJyc7XG4gICAgcGF0aCArPSBwcm9wZXJ0eVBhcmVudC5wYXRoO1xuXG5cbiAgICBpZiAocHJvcGVydHlQYXJlbnQucGFyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhdGggKz0gJy8nO1xuICAgIH1cblxuICAgIHN3aXRjaCAocHJvcGVydHlQYXJlbnQuc2NoZW1hLnR5cGUpIHtcbiAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHlUeXBlLk9iamVjdDpcbiAgICAgICAgcGF0aCArPSBwcm9wZXJ0eUtleTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHlUeXBlLkFycmF5OlxuICAgICAgICBwYXRoICs9ICg8QXJyYXlQcm9wZXJ0eT5wcm9wZXJ0eVBhcmVudCkuY29udHJvbHMubGVuZ3RoO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gVE9ETyBtb3ZlIHRvIGNsYXNzXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnSW5zdGFudGlhdGlvbiBvZiBhIEZvcm1Qcm9wZXJ0eSB3aXRoIGFuIHVua25vd24gcGFyZW50IHR5cGU6ICcgK1xuICAgICAgICAgICAgcHJvcGVydHlQYXJlbnQuc2NoZW1hLnR5cGVcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aDtcbiAgfVxufVxuIl19