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

219 lines (218 loc) 22 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { isBlank } from './utils'; /** * @param {?} message * @param {?} path * @return {?} */ function formatMessage(message, path) { return `Parsing error on ${path}: ${message}`; } /** * @param {?} message * @param {?} path * @return {?} */ function schemaError(message, path) { /** @type {?} */ const mesg = formatMessage(message, path); throw new Error(mesg); } /** * @param {?} message * @param {?} path * @return {?} */ function schemaWarning(message, path) { /** @type {?} */ const mesg = formatMessage(message, path); throw new Error(mesg); } export class SchemaPreprocessor { /** * @param {?} jsonSchema * @param {?=} path * @return {?} */ static preprocess(jsonSchema, path = '/') { jsonSchema = jsonSchema || {}; if (jsonSchema.type === 'object') { SchemaPreprocessor.checkProperties(jsonSchema, path); SchemaPreprocessor.checkAndCreateFieldsets(jsonSchema, path); } else if (jsonSchema.type === 'array') { SchemaPreprocessor.checkItems(jsonSchema, path); } SchemaPreprocessor.normalizeWidget(jsonSchema); SchemaPreprocessor.recursiveCheck(jsonSchema, path); } /** * @param {?} jsonSchema * @param {?} path * @return {?} */ static checkProperties(jsonSchema, path) { if (isBlank(jsonSchema.properties)) { jsonSchema.properties = {}; schemaWarning('Provided json schema does not contain a \'properties\' entry. Output schema will be empty', path); } } /** * @param {?} jsonSchema * @param {?} path * @return {?} */ static checkAndCreateFieldsets(jsonSchema, path) { if (jsonSchema.fieldsets === undefined) { if (jsonSchema.order !== undefined) { SchemaPreprocessor.replaceOrderByFieldsets(jsonSchema); } else { SchemaPreprocessor.createFieldsets(jsonSchema); } } SchemaPreprocessor.checkFieldsUsage(jsonSchema, path); } /** * @param {?} jsonSchema * @param {?} path * @return {?} */ static checkFieldsUsage(jsonSchema, path) { /** @type {?} */ const fieldsId = Object.keys(jsonSchema.properties); /** @type {?} */ const usedFields = {}; for (const fieldset of jsonSchema.fieldsets) { for (const fieldId of fieldset.fields) { if (usedFields[fieldId] === undefined) { usedFields[fieldId] = []; } usedFields[fieldId].push(fieldset.id); } } for (const fieldId of fieldsId) { if (usedFields.hasOwnProperty(fieldId)) { if (usedFields[fieldId].length > 1) { schemaError(`${fieldId} is referenced by more than one fieldset: ${usedFields[fieldId]}`, path); } delete usedFields[fieldId]; } else if (jsonSchema.required.indexOf(fieldId) > -1) { schemaError(`${fieldId} is a required field but it is not referenced as part of a 'order' or a 'fieldset' property`, path); } else { delete jsonSchema[fieldId]; schemaWarning(`Removing unreferenced field ${fieldId}`, path); } } for (const remainingfieldsId in usedFields) { if (usedFields.hasOwnProperty(remainingfieldsId)) { schemaWarning(`Referencing non-existent field ${remainingfieldsId} in one or more fieldsets`, path); } } } /** * @param {?} jsonSchema * @return {?} */ static createFieldsets(jsonSchema) { jsonSchema.order = Object.keys(jsonSchema.properties); SchemaPreprocessor.replaceOrderByFieldsets(jsonSchema); } /** * @param {?} jsonSchema * @return {?} */ static replaceOrderByFieldsets(jsonSchema) { jsonSchema.fieldsets = [{ id: 'fieldset-default', title: jsonSchema.title || '', description: jsonSchema.description || '', name: jsonSchema.name || '', fields: jsonSchema.order }]; delete jsonSchema.order; } /** * @param {?} fieldSchema * @return {?} */ static normalizeWidget(fieldSchema) { /** @type {?} */ let widget = fieldSchema.widget; if (widget === undefined) { widget = { 'id': fieldSchema.type }; } else if (typeof widget === 'string') { widget = { 'id': widget }; } fieldSchema.widget = widget; } /** * @param {?} jsonSchema * @param {?} path * @return {?} */ static checkItems(jsonSchema, path) { if (jsonSchema.items === undefined) { schemaError('No \'items\' property in array', path); } } /** * @param {?} jsonSchema * @param {?} path * @return {?} */ static recursiveCheck(jsonSchema, path) { if (jsonSchema.type === 'object') { /* for (const fieldId in jsonSchema.properties) { if (jsonSchema.properties.hasOwnProperty(fieldId)) { const fieldSchema = jsonSchema.properties[fieldId]; SchemaPreprocessor.preprocess(fieldSchema, path + fieldId + '/'); } } */ if (jsonSchema.hasOwnProperty('definitions')) { for (const fieldId in jsonSchema.definitions) { if (jsonSchema.definitions.hasOwnProperty(fieldId)) { /** @type {?} */ const fieldSchema = jsonSchema.definitions[fieldId]; SchemaPreprocessor.removeRecursiveRefProperties(fieldSchema, `#/definitions/${fieldId}`); // formPropertyFactory recursive is used instead // SchemaPreprocessor.preprocess(fieldSchema, path + fieldId + '/'); } } } } // else if (jsonSchema.type === 'array') { // formPropertyFactory recursive is used instead // SchemaPreprocessor.preprocess(jsonSchema.items, path + '*/'); // } } /** * @param {?} jsonSchema * @param {?} definitionPath * @return {?} */ static removeRecursiveRefProperties(jsonSchema, definitionPath) { // to avoid infinite loop if (jsonSchema.type === 'object') { for (const fieldId in jsonSchema.properties) { if (jsonSchema.properties.hasOwnProperty(fieldId)) { if (jsonSchema.properties[fieldId].$ref && jsonSchema.properties[fieldId].$ref === definitionPath) { delete jsonSchema.properties[fieldId]; } else if (jsonSchema.properties[fieldId].type === 'object') { SchemaPreprocessor.removeRecursiveRefProperties(jsonSchema.properties[fieldId], definitionPath); } } } } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcHJlcHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNjaGVtYS1mb3Jtcy8iLCJzb3VyY2VzIjpbImxpYi9tb2RlbC9zY2hlbWFwcmVwcm9jZXNzb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxTQUFTLENBQUM7Ozs7OztBQUVoQyx1QkFBdUIsT0FBTyxFQUFFLElBQUk7SUFDbEMsTUFBTSxDQUFDLG9CQUFvQixJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7Q0FDL0M7Ozs7OztBQUVELHFCQUFxQixPQUFPLEVBQUUsSUFBSTs7SUFDaEMsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3ZCOzs7Ozs7QUFFRCx1QkFBdUIsT0FBTyxFQUFFLElBQUk7O0lBQ2xDLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUN2QjtBQUdELE1BQU07Ozs7OztJQUVKLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBZSxFQUFFLElBQUksR0FBRyxHQUFHO1FBQzNDLFVBQVUsR0FBRyxVQUFVLElBQUksRUFBRSxDQUFDO1FBRTlCLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNqQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3JELGtCQUFrQixDQUFDLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM5RDtRQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUM7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QyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDbEQsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJOzJCQUNsQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxjQUFjLENBQUMsQ0FBQyxDQUFDO3dCQUM1RCxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7cUJBQ3ZDO29CQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO3dCQUM1RCxrQkFBa0IsQ0FBQyw0QkFBNEIsQ0FDN0MsVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFDOUIsY0FBYyxDQUNmLENBQUM7cUJBQ0g7aUJBQ0Y7YUFDRjtTQUNGOztDQUVKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc0JsYW5rfSBmcm9tICcuL3V0aWxzJztcblxuZnVuY3Rpb24gZm9ybWF0TWVzc2FnZShtZXNzYWdlLCBwYXRoKSB7XG4gIHJldHVybiBgUGFyc2luZyBlcnJvciBvbiAke3BhdGh9OiAke21lc3NhZ2V9YDtcbn1cblxuZnVuY3Rpb24gc2NoZW1hRXJyb3IobWVzc2FnZSwgcGF0aCk6IHZvaWQge1xuICBjb25zdCBtZXNnID0gZm9ybWF0TWVzc2FnZShtZXNzYWdlLCBwYXRoKTtcbiAgdGhyb3cgbmV3IEVycm9yKG1lc2cpO1xufVxuXG5mdW5jdGlvbiBzY2hlbWFXYXJuaW5nKG1lc3NhZ2UsIHBhdGgpOiB2b2lkIHtcbiAgY29uc3QgbWVzZyA9IGZvcm1hdE1lc3NhZ2UobWVzc2FnZSwgcGF0aCk7XG4gIHRocm93IG5ldyBFcnJvcihtZXNnKTtcbn1cblxuLy8gVE9ETyBjcmVhdGUgZXJyb3IgY2xhc3Nlc1xuZXhwb3J0IGNsYXNzIFNjaGVtYVByZXByb2Nlc3NvciB7XG5cbiAgc3RhdGljIHByZXByb2Nlc3MoanNvblNjaGVtYTogYW55LCBwYXRoID0gJy8nKTogYW55IHtcbiAgICBqc29uU2NoZW1hID0ganNvblNjaGVtYSB8fCB7fTtcblxuICAgIGlmIChqc29uU2NoZW1hLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICBTY2hlbWFQcmVwcm9jZXNzb3IuY2hlY2tQcm9wZXJ0aWVzKGpzb25TY2hlbWEsIHBhdGgpO1xuICAgICAgU2NoZW1hUHJlcHJvY2Vzc29yLmNoZWNrQW5kQ3JlYXRlRmllbGRzZXRzKGpzb25TY2hlbWEsIHBhdGgpO1xuICAgIH0gZWxzZSBpZiAoanNvblNjaGVtYS50eXBlID09PSAnYXJyYXknKSB7XG4gICAgICBTY2hlbWFQcmVwcm9jZXNzb3IuY2hlY2tJdGVtcyhqc29uU2NoZW1hLCBwYXRoKTtcbiAgICB9XG4gICAgU2NoZW1hUHJlcHJvY2Vzc29yLm5vcm1hbGl6ZVdpZGdldChqc29uU2NoZW1hKTtcbiAgICBTY2hlbWFQcmVwcm9jZXNzb3IucmVjdXJzaXZlQ2hlY2soanNvblNjaGVtYSwgcGF0aCk7XG5cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNoZWNrUHJvcGVydGllcyhqc29uU2NoZW1hLCBwYXRoOiBzdHJpbmcpIHtcbiAgICBpZiAoaXNCbGFuayhqc29uU2NoZW1hLnByb3BlcnRpZXMpKSB7XG4gICAgICBqc29uU2NoZW1hLnByb3BlcnRpZXMgPSB7fTtcbiAgICAgIHNjaGVtYVdhcm5pbmcoJ1Byb3ZpZGVkIGpzb24gc2NoZW1hIGRvZXMgbm90IGNvbnRhaW4gYSBcXCdwcm9wZXJ0aWVzXFwnIGVudHJ5LiBPdXRwdXQgc2NoZW1hIHdpbGwgYmUgZW1wdHknLCBwYXRoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjaGVja0FuZENyZWF0ZUZpZWxkc2V0cyhqc29uU2NoZW1hOiBhbnksIHBhdGg6IHN0cmluZykge1xuICAgIGlmIChqc29uU2NoZW1hLmZpZWxkc2V0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoanNvblNjaGVtYS5vcmRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIFNjaGVtYVByZXByb2Nlc3Nvci5yZXBsYWNlT3JkZXJCeUZpZWxkc2V0cyhqc29uU2NoZW1hKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFNjaGVtYVByZXByb2Nlc3Nvci5jcmVhdGVGaWVsZHNldHMoanNvblNjaGVtYSk7XG4gICAgICB9XG4gICAgfVxuICAgIFNjaGVtYVByZXByb2Nlc3Nvci5jaGVja0ZpZWxkc1VzYWdlKGpzb25TY2hlbWEsIHBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY2hlY2tGaWVsZHNVc2FnZShqc29uU2NoZW1hLCBwYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCBmaWVsZHNJZDogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhqc29uU2NoZW1hLnByb3BlcnRpZXMpO1xuICAgIGNvbnN0IHVzZWRGaWVsZHMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkc2V0IG9mIGpzb25TY2hlbWEuZmllbGRzZXRzKSB7XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkSWQgb2YgZmllbGRzZXQuZmllbGRzKSB7XG4gICAgICAgIGlmICh1c2VkRmllbGRzW2ZpZWxkSWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB1c2VkRmllbGRzW2ZpZWxkSWRdID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdXNlZEZpZWxkc1tmaWVsZElkXS5wdXNoKGZpZWxkc2V0LmlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkSWQgb2YgZmllbGRzSWQpIHtcbiAgICAgIGlmICh1c2VkRmllbGRzLmhhc093blByb3BlcnR5KGZpZWxkSWQpKSB7XG4gICAgICAgIGlmICh1c2VkRmllbGRzW2ZpZWxkSWRdLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBzY2hlbWFFcnJvcihgJHtmaWVsZElkfSBpcyByZWZlcmVuY2VkIGJ5IG1vcmUgdGhhbiBvbmUgZmllbGRzZXQ6ICR7dXNlZEZpZWxkc1tmaWVsZElkXX1gLCBwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgdXNlZEZpZWxkc1tmaWVsZElkXTtcbiAgICAgIH0gZWxzZSBpZiAoanNvblNjaGVtYS5yZXF1aXJlZC5pbmRleE9mKGZpZWxkSWQpID4gLTEpIHtcbiAgICAgICAgc2NoZW1hRXJyb3IoYCR7ZmllbGRJZH0gaXMgYSByZXF1aXJlZCBmaWVsZCBidXQgaXQgaXMgbm90IHJlZmVyZW5jZWQgYXMgcGFydCBvZiBhICdvcmRlcicgb3IgYSAnZmllbGRzZXQnIHByb3BlcnR5YCwgcGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUganNvblNjaGVtYVtmaWVsZElkXTtcbiAgICAgICAgc2NoZW1hV2FybmluZyhgUmVtb3ZpbmcgdW5yZWZlcmVuY2VkIGZpZWxkICR7ZmllbGRJZH1gLCBwYXRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHJlbWFpbmluZ2ZpZWxkc0lkIGluIHVzZWRGaWVsZHMpIHtcbiAgICAgIGlmICh1c2VkRmllbGRzLmhhc093blByb3BlcnR5KHJlbWFpbmluZ2ZpZWxkc0lkKSkge1xuICAgICAgICBzY2hlbWFXYXJuaW5nKGBSZWZlcmVuY2luZyBub24tZXhpc3RlbnQgZmllbGQgJHtyZW1haW5pbmdmaWVsZHNJZH0gaW4gb25lIG9yIG1vcmUgZmllbGRzZXRzYCwgcGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlRmllbGRzZXRzKGpzb25TY2hlbWEpIHtcbiAgICBqc29uU2NoZW1hLm9yZGVyID0gT2JqZWN0LmtleXMoanNvblNjaGVtYS5wcm9wZXJ0aWVzKTtcbiAgICBTY2hlbWFQcmVwcm9jZXNzb3IucmVwbGFjZU9yZGVyQnlGaWVsZHNldHMoanNvblNjaGVtYSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByZXBsYWNlT3JkZXJCeUZpZWxkc2V0cyhqc29uU2NoZW1hKSB7XG4gICAganNvblNjaGVtYS5maWVsZHNldHMgPSBbe1xuICAgICAgaWQ6ICdmaWVsZHNldC1kZWZhdWx0JyxcbiAgICAgIHRpdGxlOiBqc29uU2NoZW1hLnRpdGxlIHx8ICcnLFxuICAgICAgZGVzY3JpcHRpb246IGpzb25TY2hlbWEuZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICBuYW1lOiBqc29uU2NoZW1hLm5hbWUgfHwgJycsXG4gICAgICBmaWVsZHM6IGpzb25TY2hlbWEub3JkZXJcbiAgICB9XTtcbiAgICBkZWxldGUganNvblNjaGVtYS5vcmRlcjtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG5vcm1hbGl6ZVdpZGdldChmaWVsZFNjaGVtYTogYW55KSB7XG4gICAgbGV0IHdpZGdldCA9IGZpZWxkU2NoZW1hLndpZGdldDtcbiAgICBpZiAod2lkZ2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHdpZGdldCA9IHsnaWQnOiBmaWVsZFNjaGVtYS50eXBlfTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB3aWRnZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB3aWRnZXQgPSB7J2lkJzogd2lkZ2V0fTtcbiAgICB9XG4gICAgZmllbGRTY2hlbWEud2lkZ2V0ID0gd2lkZ2V0O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY2hlY2tJdGVtcyhqc29uU2NoZW1hLCBwYXRoKSB7XG4gICAgaWYgKGpzb25TY2hlbWEuaXRlbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hRXJyb3IoJ05vIFxcJ2l0ZW1zXFwnIHByb3BlcnR5IGluIGFycmF5JywgcGF0aCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETyByZW5hbWUgYW5kIHJlbW92ZSB1bm5lY2Vzc2FyeSBjb2RlIGFjY29yZGluZyB0byBjaGFuZ2VcbiAgLy8gVE9ETyB0ZXN0LCB0byBtYWtlIHN1cmUgcmVtb3ZhbCBvZiByZWN1cnNpb24gY2hlY2tzIGRvZXMgbm90IGJyZWFrIGFueXRoaW5nXG4gIHByaXZhdGUgc3RhdGljIHJlY3Vyc2l2ZUNoZWNrKGpzb25TY2hlbWEsIHBhdGg6IHN0cmluZykge1xuICAgIGlmIChqc29uU2NoZW1hLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAvKlxuICAgICAgZm9yIChjb25zdCBmaWVsZElkIGluIGpzb25TY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICBpZiAoanNvblNjaGVtYS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGZpZWxkSWQpKSB7XG4gICAgICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSBqc29uU2NoZW1hLnByb3BlcnRpZXNbZmllbGRJZF07XG4gICAgICAgICAgU2NoZW1hUHJlcHJvY2Vzc29yLnByZXByb2Nlc3MoZmllbGRTY2hlbWEsIHBhdGggKyBmaWVsZElkICsgJy8nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKi9cbiAgICAgIGlmIChqc29uU2NoZW1hLmhhc093blByb3BlcnR5KCdkZWZpbml0aW9ucycpKSB7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGRJZCBpbiBqc29uU2NoZW1hLmRlZmluaXRpb25zKSB7XG4gICAgICAgICAgaWYgKGpzb25TY2hlbWEuZGVmaW5pdGlvbnMuaGFzT3duUHJvcGVydHkoZmllbGRJZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkU2NoZW1hID0ganNvblNjaGVtYS5kZWZpbml0aW9uc1tmaWVsZElkXTtcbiAgICAgICAgICAgIFNjaGVtYVByZXByb2Nlc3Nvci5yZW1vdmVSZWN1cnNpdmVSZWZQcm9wZXJ0aWVzKFxuICAgICAgICAgICAgICBmaWVsZFNjaGVtYSxcbiAgICAgICAgICAgICAgYCMvZGVmaW5pdGlvbnMvJHtmaWVsZElkfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBmb3JtUHJvcGVydHlGYWN0b3J5IHJlY3Vyc2l2ZSBpcyB1c2VkIGluc3RlYWRcbiAgICAgICAgICAgIC8vIFNjaGVtYVByZXByb2Nlc3Nvci5wcmVwcm9jZXNzKGZpZWxkU2NoZW1hLCBwYXRoICsgZmllbGRJZCArICcvJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfS8vIGVsc2UgaWYgKGpzb25TY2hlbWEudHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgLy8gZm9ybVByb3BlcnR5RmFjdG9yeSByZWN1cnNpdmUgaXMgdXNlZCBpbnN0ZWFkXG4gICAgICAvLyBTY2hlbWFQcmVwcm9jZXNzb3IucHJlcHJvY2Vzcyhqc29uU2NoZW1hLml0ZW1zLCBwYXRoICsgJyovJyk7XG4gICAgLy8gfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVtb3ZlUmVjdXJzaXZlUmVmUHJvcGVydGllcyhqc29uU2NoZW1hLCBkZWZpbml0aW9uUGF0aCkge1xuICAgIC8vIHRvIGF2b2lkIGluZmluaXRlIGxvb3BcbiAgICBpZiAoanNvblNjaGVtYS50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9yIChjb25zdCBmaWVsZElkIGluIGpzb25TY2hlbWEucHJvcGVydGllcykge1xuICAgICAgICBpZiAoanNvblNjaGVtYS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGZpZWxkSWQpKSB7XG4gICAgICAgICAgaWYgKGpzb25TY2hlbWEucHJvcGVydGllc1tmaWVsZElkXS4kcmVmXG4gICAgICAgICAgICAmJiBqc29uU2NoZW1hLnByb3BlcnRpZXNbZmllbGRJZF0uJHJlZiA9PT0gZGVmaW5pdGlvblBhdGgpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBqc29uU2NoZW1hLnByb3BlcnRpZXNbZmllbGRJZF07XG4gICAgICAgICAgfSBlbHNlIGlmIChqc29uU2NoZW1hLnByb3BlcnRpZXNbZmllbGRJZF0udHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIFNjaGVtYVByZXByb2Nlc3Nvci5yZW1vdmVSZWN1cnNpdmVSZWZQcm9wZXJ0aWVzKFxuICAgICAgICAgICAgICBqc29uU2NoZW1hLnByb3BlcnRpZXNbZmllbGRJZF0sXG4gICAgICAgICAgICAgIGRlZmluaXRpb25QYXRoXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4iXX0=