UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

454 lines (453 loc) • 49.2 kB
/* eslint-disable no-param-reassign */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "promise", { enumerable: true, get: function() { return promise; } }); const _types = require("../../config/types"); const _getDefaultValue = /*#__PURE__*/ _interop_require_default(require("../../getDefaultValue")); const _relationshipPopulationPromise = /*#__PURE__*/ _interop_require_default(require("./relationshipPopulationPromise")); const _traverseFields = require("./traverseFields"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const promise = async ({ collection, context, currentDepth, depth, doc, fallbackLocale, field, fieldPromises, findMany, flattenLocales, global, locale, overrideAccess, populationPromises, req, showHiddenFields, siblingDoc, triggerAccessControl = true, triggerHooks = true })=>{ if ((0, _types.fieldAffectsData)(field) && field.hidden && typeof siblingDoc[field.name] !== 'undefined' && !showHiddenFields) { delete siblingDoc[field.name]; } const shouldHoistLocalizedValue = flattenLocales && (0, _types.fieldAffectsData)(field) && typeof siblingDoc[field.name] === 'object' && siblingDoc[field.name] !== null && field.localized && locale !== 'all' && req.payload.config.localization; if (shouldHoistLocalizedValue) { // replace actual value with localized value before sanitizing // { [locale]: fields } -> fields const value = siblingDoc[field.name][locale]; let hoistedValue = value; if (fallbackLocale && fallbackLocale !== locale) { const fallbackValue = siblingDoc[field.name][fallbackLocale]; const isNullOrUndefined = typeof value === 'undefined' || value === null; if (fallbackValue) { switch(field.type){ case 'text': case 'textarea': { if (value === '' || isNullOrUndefined) { hoistedValue = fallbackValue; } break; } default: { if (isNullOrUndefined) { hoistedValue = fallbackValue; } break; } } } } siblingDoc[field.name] = hoistedValue; } // Sanitize outgoing field value switch(field.type){ case 'group': { // Fill groups with empty objects so fields with hooks within groups can populate // themselves virtually as necessary if (typeof siblingDoc[field.name] === 'undefined') { siblingDoc[field.name] = {}; } break; } case 'tabs': { field.tabs.forEach((tab)=>{ if ((0, _types.tabHasName)(tab) && (typeof siblingDoc[tab.name] === 'undefined' || siblingDoc[tab.name] === null)) { siblingDoc[tab.name] = {}; } }); break; } case 'richText': { const editor = field?.editor; // This is run here AND in the GraphQL Resolver if (editor?.populationPromise) { const populationPromise = editor.populationPromise({ context, currentDepth, depth, field, findMany, flattenLocales, overrideAccess, populationPromises, req, showHiddenFields, siblingDoc }); if (populationPromise) { populationPromises.push(populationPromise); } } // This is only run here, independent of depth if (editor?.afterReadPromise) { const afterReadPromise = editor?.afterReadPromise({ field, incomingEditorState: siblingDoc[field.name], siblingDoc }); if (afterReadPromise) { populationPromises.push(afterReadPromise); } } break; } case 'point': { const pointDoc = siblingDoc[field.name]; if (Array.isArray(pointDoc?.coordinates) && pointDoc.coordinates.length === 2) { siblingDoc[field.name] = pointDoc.coordinates; } else { siblingDoc[field.name] = undefined; } break; } default: { break; } } if ((0, _types.fieldAffectsData)(field)) { // Execute hooks if (triggerHooks && field.hooks?.afterRead) { await field.hooks.afterRead.reduce(async (priorHook, currentHook)=>{ await priorHook; const shouldRunHookOnAllLocales = field.localized && (locale === 'all' || !flattenLocales) && typeof siblingDoc[field.name] === 'object'; if (shouldRunHookOnAllLocales) { const hookPromises = Object.entries(siblingDoc[field.name]).map(([locale, value])=>(async ()=>{ const hookedValue = await currentHook({ collection, context, data: doc, field, global, operation: 'read', originalDoc: doc, req, siblingData: siblingDoc, value }); if (hookedValue !== undefined) { siblingDoc[field.name][locale] = hookedValue; } })()); await Promise.all(hookPromises); } else { const hookedValue = await currentHook({ collection, context, data: doc, field, findMany, global, operation: 'read', originalDoc: doc, req, siblingData: siblingDoc, value: siblingDoc[field.name] }); if (hookedValue !== undefined) { siblingDoc[field.name] = hookedValue; } } }, Promise.resolve()); } // Execute access control let allowDefaultValue = true; if (triggerAccessControl && field.access && field.access.read) { const result = overrideAccess ? true : await field.access.read({ id: doc.id, data: doc, doc, req, siblingData: siblingDoc }); if (!result) { allowDefaultValue = false; delete siblingDoc[field.name]; } } // Set defaultValue on the field for globals being returned without being first created // or collection documents created prior to having a default if (allowDefaultValue && typeof siblingDoc[field.name] === 'undefined' && typeof field.defaultValue !== 'undefined') { siblingDoc[field.name] = await (0, _getDefaultValue.default)({ defaultValue: field.defaultValue, locale, user: req.user, value: siblingDoc[field.name] }); } if (field.type === 'relationship' || field.type === 'upload') { populationPromises.push((0, _relationshipPopulationPromise.default)({ currentDepth, depth, fallbackLocale, field, locale, overrideAccess, req, showHiddenFields, siblingDoc })); } } switch(field.type){ case 'group': { let groupDoc = siblingDoc[field.name]; if (typeof siblingDoc[field.name] !== 'object') groupDoc = {}; (0, _traverseFields.traverseFields)({ collection, context, currentDepth, depth, doc, fallbackLocale, fieldPromises, fields: field.fields, findMany, flattenLocales, global, locale, overrideAccess, populationPromises, req, showHiddenFields, siblingDoc: groupDoc, triggerAccessControl, triggerHooks }); break; } case 'array': { const rows = siblingDoc[field.name]; if (Array.isArray(rows)) { rows.forEach((row)=>{ (0, _traverseFields.traverseFields)({ collection, context, currentDepth, depth, doc, fallbackLocale, fieldPromises, fields: field.fields, findMany, flattenLocales, global, locale, overrideAccess, populationPromises, req, showHiddenFields, siblingDoc: row || {}, triggerAccessControl, triggerHooks }); }); } else if (!shouldHoistLocalizedValue && typeof rows === 'object' && rows !== null) { Object.values(rows).forEach((localeRows)=>{ if (Array.isArray(localeRows)) { localeRows.forEach((row)=>{ (0, _traverseFields.traverseFields)({ collection, context, currentDepth, depth, doc, fallbackLocale, fieldPromises, fields: field.fields, findMany, flattenLocales, global, locale, overrideAccess, populationPromises, req, showHiddenFields, siblingDoc: row || {}, triggerAccessControl, triggerHooks }); }); } }); } else { siblingDoc[field.name] = []; } break; } case 'blocks': { const rows = siblingDoc[field.name]; if (Array.isArray(rows)) { rows.forEach((row)=>{ const block = field.blocks.find((blockType)=>blockType.slug === row.blockType); if (block) { (0, _traverseFields.traverseFields)({ collection, context, currentDepth, depth, doc, fallbackLocale, fieldPromises, fields: block.fields, findMany, flattenLocales, global, locale, overrideAccess, populationPromises, req, showHiddenFields, siblingDoc: row || {}, triggerAccessControl, triggerHooks }); } }); } else if (!shouldHoistLocalizedValue && typeof rows === 'object' && rows !== null) { Object.values(rows).forEach((localeRows)=>{ if (Array.isArray(localeRows)) { localeRows.forEach((row)=>{ const block = field.blocks.find((blockType)=>blockType.slug === row.blockType); if (block) { (0, _traverseFields.traverseFields)({ collection, context, currentDepth, depth, doc, fallbackLocale, fieldPromises, fields: block.fields, findMany, flattenLocales, global, locale, overrideAccess, populationPromises, req, showHiddenFields, siblingDoc: row || {}, triggerAccessControl, triggerHooks }); } }); } }); } else { siblingDoc[field.name] = []; } break; } case 'row': case 'collapsible': { (0, _traverseFields.traverseFields)({ collection, context, currentDepth, depth, doc, fallbackLocale, fieldPromises, fields: field.fields, findMany, flattenLocales, global, locale, overrideAccess, populationPromises, req, showHiddenFields, siblingDoc, triggerAccessControl, triggerHooks }); break; } case 'tab': { let tabDoc = siblingDoc; if ((0, _types.tabHasName)(field)) { tabDoc = siblingDoc[field.name]; if (typeof siblingDoc[field.name] !== 'object') tabDoc = {}; } (0, _traverseFields.traverseFields)({ collection, context, currentDepth, depth, doc, fallbackLocale, fieldPromises, fields: field.fields, findMany, flattenLocales, global, locale, overrideAccess, populationPromises, req, showHiddenFields, siblingDoc: tabDoc, triggerAccessControl, triggerHooks }); break; } case 'tabs': { (0, _traverseFields.traverseFields)({ collection, context, currentDepth, depth, doc, fallbackLocale, fieldPromises, fields: field.tabs.map((tab)=>({ ...tab, type: 'tab' })), findMany, flattenLocales, global, locale, overrideAccess, populationPromises, req, showHiddenFields, siblingDoc, triggerAccessControl, triggerHooks }); break; } default: { break; } } }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9maWVsZHMvaG9va3MvYWZ0ZXJSZWFkL3Byb21pc2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbmltcG9ydCB0eXBlIHsgUmljaFRleHRBZGFwdGVyIH0gZnJvbSAnLi4vLi4vLi4vYWRtaW4vY29tcG9uZW50cy9mb3Jtcy9maWVsZC10eXBlcy9SaWNoVGV4dC90eXBlcydcbmltcG9ydCB0eXBlIHsgU2FuaXRpemVkQ29sbGVjdGlvbkNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL2NvbGxlY3Rpb25zL2NvbmZpZy90eXBlcydcbmltcG9ydCB0eXBlIHsgUGF5bG9hZFJlcXVlc3QsIFJlcXVlc3RDb250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vZXhwcmVzcy90eXBlcydcbmltcG9ydCB0eXBlIHsgU2FuaXRpemVkR2xvYmFsQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vZ2xvYmFscy9jb25maWcvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IEZpZWxkLCBUYWJBc0ZpZWxkIH0gZnJvbSAnLi4vLi4vY29uZmlnL3R5cGVzJ1xuXG5pbXBvcnQgeyBmaWVsZEFmZmVjdHNEYXRhLCB0YWJIYXNOYW1lIH0gZnJvbSAnLi4vLi4vY29uZmlnL3R5cGVzJ1xuaW1wb3J0IGdldFZhbHVlV2l0aERlZmF1bHQgZnJvbSAnLi4vLi4vZ2V0RGVmYXVsdFZhbHVlJ1xuaW1wb3J0IHJlbGF0aW9uc2hpcFBvcHVsYXRpb25Qcm9taXNlIGZyb20gJy4vcmVsYXRpb25zaGlwUG9wdWxhdGlvblByb21pc2UnXG5pbXBvcnQgeyB0cmF2ZXJzZUZpZWxkcyB9IGZyb20gJy4vdHJhdmVyc2VGaWVsZHMnXG5cbnR5cGUgQXJncyA9IHtcbiAgY29sbGVjdGlvbjogU2FuaXRpemVkQ29sbGVjdGlvbkNvbmZpZyB8IG51bGxcbiAgY29udGV4dDogUmVxdWVzdENvbnRleHRcbiAgY3VycmVudERlcHRoOiBudW1iZXJcbiAgZGVwdGg6IG51bWJlclxuICBkb2M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIGZhbGxiYWNrTG9jYWxlOiBudWxsIHwgc3RyaW5nXG4gIGZpZWxkOiBGaWVsZCB8IFRhYkFzRmllbGRcbiAgZmllbGRQcm9taXNlczogUHJvbWlzZTx2b2lkPltdXG4gIGZpbmRNYW55OiBib29sZWFuXG4gIGZsYXR0ZW5Mb2NhbGVzOiBib29sZWFuXG4gIGdsb2JhbDogU2FuaXRpemVkR2xvYmFsQ29uZmlnIHwgbnVsbFxuICBsb2NhbGU6IG51bGwgfCBzdHJpbmdcbiAgb3ZlcnJpZGVBY2Nlc3M6IGJvb2xlYW5cbiAgcG9wdWxhdGlvblByb21pc2VzOiBQcm9taXNlPHZvaWQ+W11cbiAgcmVxOiBQYXlsb2FkUmVxdWVzdFxuICBzaG93SGlkZGVuRmllbGRzOiBib29sZWFuXG4gIHNpYmxpbmdEb2M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHRyaWdnZXJBY2Nlc3NDb250cm9sPzogYm9vbGVhblxuICB0cmlnZ2VySG9va3M/OiBib29sZWFuXG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHRoZSBmb2xsb3dpbmcgYWN0aW9ucywgaW4gb3JkZXI6XG4vLyAtIFJlbW92ZSBoaWRkZW4gZmllbGRzIGZyb20gcmVzcG9uc2Vcbi8vIC0gRmxhdHRlbiBsb2NhbGVzIGludG8gcmVxdWVzdGVkIGxvY2FsZVxuLy8gLSBTYW5pdGl6ZSBvdXRnb2luZyBkYXRhIChwb2ludCBmaWVsZCwgZXRjLilcbi8vIC0gRXhlY3V0ZSBmaWVsZCBob29rc1xuLy8gLSBFeGVjdXRlIHJlYWQgYWNjZXNzIGNvbnRyb2xcbi8vIC0gUG9wdWxhdGUgcmVsYXRpb25zaGlwc1xuXG5leHBvcnQgY29uc3QgcHJvbWlzZSA9IGFzeW5jICh7XG4gIGNvbGxlY3Rpb24sXG4gIGNvbnRleHQsXG4gIGN1cnJlbnREZXB0aCxcbiAgZGVwdGgsXG4gIGRvYyxcbiAgZmFsbGJhY2tMb2NhbGUsXG4gIGZpZWxkLFxuICBmaWVsZFByb21pc2VzLFxuICBmaW5kTWFueSxcbiAgZmxhdHRlbkxvY2FsZXMsXG4gIGdsb2JhbCxcbiAgbG9jYWxlLFxuICBvdmVycmlkZUFjY2VzcyxcbiAgcG9wdWxhdGlvblByb21pc2VzLFxuICByZXEsXG4gIHNob3dIaWRkZW5GaWVsZHMsXG4gIHNpYmxpbmdEb2MsXG4gIHRyaWdnZXJBY2Nlc3NDb250cm9sID0gdHJ1ZSxcbiAgdHJpZ2dlckhvb2tzID0gdHJ1ZSxcbn06IEFyZ3MpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgaWYgKFxuICAgIGZpZWxkQWZmZWN0c0RhdGEoZmllbGQpICYmXG4gICAgZmllbGQuaGlkZGVuICYmXG4gICAgdHlwZW9mIHNpYmxpbmdEb2NbZmllbGQubmFtZV0gIT09ICd1bmRlZmluZWQnICYmXG4gICAgIXNob3dIaWRkZW5GaWVsZHNcbiAgKSB7XG4gICAgZGVsZXRlIHNpYmxpbmdEb2NbZmllbGQubmFtZV1cbiAgfVxuXG4gIGNvbnN0IHNob3VsZEhvaXN0TG9jYWxpemVkVmFsdWUgPVxuICAgIGZsYXR0ZW5Mb2NhbGVzICYmXG4gICAgZmllbGRBZmZlY3RzRGF0YShmaWVsZCkgJiZcbiAgICB0eXBlb2Ygc2libGluZ0RvY1tmaWVsZC5uYW1lXSA9PT0gJ29iamVjdCcgJiZcbiAgICBzaWJsaW5nRG9jW2ZpZWxkLm5hbWVdICE9PSBudWxsICYmXG4gICAgZmllbGQubG9jYWxpemVkICYmXG4gICAgbG9jYWxlICE9PSAnYWxsJyAmJlxuICAgIHJlcS5wYXlsb2FkLmNvbmZpZy5sb2NhbGl6YXRpb25cblxuICBpZiAoc2hvdWxkSG9pc3RMb2NhbGl6ZWRWYWx1ZSkge1xuICAgIC8vIHJlcGxhY2UgYWN0dWFsIHZhbHVlIHdpdGggbG9jYWxpemVkIHZhbHVlIGJlZm9yZSBzYW5pdGl6aW5nXG4gICAgLy8geyBbbG9jYWxlXTogZmllbGRzIH0gLT4gZmllbGRzXG4gICAgY29uc3QgdmFsdWUgPSBzaWJsaW5nRG9jW2ZpZWxkLm5hbWVdW2xvY2FsZV1cblxuICAgIGxldCBob2lzdGVkVmFsdWUgPSB2YWx1ZVxuXG4gICAgaWYgKGZhbGxiYWNrTG9jYWxlICYmIGZhbGxiYWNrTG9jYWxlICE9PSBsb2NhbGUpIHtcbiAgICAgIGNvbnN0IGZhbGxiYWNrVmFsdWUgPSBzaWJsaW5nRG9jW2ZpZWxkLm5hbWVdW2ZhbGxiYWNrTG9jYWxlXVxuICAgICAgY29uc3QgaXNOdWxsT3JVbmRlZmluZWQgPSB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHZhbHVlID09PSBudWxsXG5cbiAgICAgIGlmIChmYWxsYmFja1ZhbHVlKSB7XG4gICAgICAgIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICAgIGNhc2UgJ3RleHRhcmVhJzoge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnJyB8fCBpc051bGxPclVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBob2lzdGVkVmFsdWUgPSBmYWxsYmFja1ZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGlmIChpc051bGxPclVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBob2lzdGVkVmFsdWUgPSBmYWxsYmFja1ZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNpYmxpbmdEb2NbZmllbGQubmFtZV0gPSBob2lzdGVkVmFsdWVcbiAgfVxuXG4gIC8vIFNhbml0aXplIG91dGdvaW5nIGZpZWxkIHZhbHVlXG4gIHN3aXRjaCAoZmllbGQudHlwZSkge1xuICAgIGNhc2UgJ2dyb3VwJzoge1xuICAgICAgLy8gRmlsbCBncm91cHMgd2l0aCBlbXB0eSBvYmplY3RzIHNvIGZpZWxkcyB3aXRoIGhvb2tzIHdpdGhpbiBncm91cHMgY2FuIHBvcHVsYXRlXG4gICAgICAvLyB0aGVtc2VsdmVzIHZpcnR1YWxseSBhcyBuZWNlc3NhcnlcbiAgICAgIGlmICh0eXBlb2Ygc2libGluZ0RvY1tmaWVsZC5uYW1lXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2libGluZ0RvY1tmaWVsZC5uYW1lXSA9IHt9XG4gICAgICB9XG5cbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNhc2UgJ3RhYnMnOiB7XG4gICAgICBmaWVsZC50YWJzLmZvckVhY2goKHRhYikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGFiSGFzTmFtZSh0YWIpICYmXG4gICAgICAgICAgKHR5cGVvZiBzaWJsaW5nRG9jW3RhYi5uYW1lXSA9PT0gJ3VuZGVmaW5lZCcgfHwgc2libGluZ0RvY1t0YWIubmFtZV0gPT09IG51bGwpXG4gICAgICAgICkge1xuICAgICAgICAgIHNpYmxpbmdEb2NbdGFiLm5hbWVdID0ge31cbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBjYXNlICdyaWNoVGV4dCc6IHtcbiAgICAgIGNvbnN0IGVkaXRvcjogUmljaFRleHRBZGFwdGVyID0gZmllbGQ/LmVkaXRvclxuICAgICAgLy8gVGhpcyBpcyBydW4gaGVyZSBBTkQgaW4gdGhlIEdyYXBoUUwgUmVzb2x2ZXJcbiAgICAgIGlmIChlZGl0b3I/LnBvcHVsYXRpb25Qcm9taXNlKSB7XG4gICAgICAgIGNvbnN0IHBvcHVsYXRpb25Qcm9taXNlID0gZWRpdG9yLnBvcHVsYXRpb25Qcm9taXNlKHtcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIGN1cnJlbnREZXB0aCxcbiAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICBmaW5kTWFueSxcbiAgICAgICAgICBmbGF0dGVuTG9jYWxlcyxcbiAgICAgICAgICBvdmVycmlkZUFjY2VzcyxcbiAgICAgICAgICBwb3B1bGF0aW9uUHJvbWlzZXMsXG4gICAgICAgICAgcmVxLFxuICAgICAgICAgIHNob3dIaWRkZW5GaWVsZHMsXG4gICAgICAgICAgc2libGluZ0RvYyxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAocG9wdWxhdGlvblByb21pc2UpIHtcbiAgICAgICAgICBwb3B1bGF0aW9uUHJvbWlzZXMucHVzaChwb3B1bGF0aW9uUHJvbWlzZSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIGlzIG9ubHkgcnVuIGhlcmUsIGluZGVwZW5kZW50IG9mIGRlcHRoXG4gICAgICBpZiAoZWRpdG9yPy5hZnRlclJlYWRQcm9taXNlKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyUmVhZFByb21pc2UgPSBlZGl0b3I/LmFmdGVyUmVhZFByb21pc2Uoe1xuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIGluY29taW5nRWRpdG9yU3RhdGU6IHNpYmxpbmdEb2NbZmllbGQubmFtZV0gYXMgb2JqZWN0LFxuICAgICAgICAgIHNpYmxpbmdEb2MsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGFmdGVyUmVhZFByb21pc2UpIHtcbiAgICAgICAgICBwb3B1bGF0aW9uUHJvbWlzZXMucHVzaChhZnRlclJlYWRQcm9taXNlKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgY2FzZSAncG9pbnQnOiB7XG4gICAgICBjb25zdCBwb2ludERvYyA9IHNpYmxpbmdEb2NbZmllbGQubmFtZV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBvaW50RG9jPy5jb29yZGluYXRlcykgJiYgcG9pbnREb2MuY29vcmRpbmF0ZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHNpYmxpbmdEb2NbZmllbGQubmFtZV0gPSBwb2ludERvYy5jb29yZGluYXRlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2libGluZ0RvY1tmaWVsZC5uYW1lXSA9IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKGZpZWxkQWZmZWN0c0RhdGEoZmllbGQpKSB7XG4gICAgLy8gRXhlY3V0ZSBob29rc1xuICAgIGlmICh0cmlnZ2VySG9va3MgJiYgZmllbGQuaG9va3M/LmFmdGVyUmVhZCkge1xuICAgICAgYXdhaXQgZmllbGQuaG9va3MuYWZ0ZXJSZWFkLnJlZHVjZShhc3luYyAocHJpb3JIb29rLCBjdXJyZW50SG9vaykgPT4ge1xuICAgICAgICBhd2FpdCBwcmlvckhvb2tcblxuICAgICAgICBjb25zdCBzaG91bGRSdW5Ib29rT25BbGxMb2NhbGVzID1cbiAgICAgICAgICBmaWVsZC5sb2NhbGl6ZWQgJiZcbiAgICAgICAgICAobG9jYWxlID09PSAnYWxsJyB8fCAhZmxhdHRlbkxvY2FsZXMpICYmXG4gICAgICAgICAgdHlwZW9mIHNpYmxpbmdEb2NbZmllbGQubmFtZV0gPT09ICdvYmplY3QnXG5cbiAgICAgICAgaWYgKHNob3VsZFJ1bkhvb2tPbkFsbExvY2FsZXMpIHtcbiAgICAgICAgICBjb25zdCBob29rUHJvbWlzZXMgPSBPYmplY3QuZW50cmllcyhzaWJsaW5nRG9jW2ZpZWxkLm5hbWVdKS5tYXAoKFtsb2NhbGUsIHZhbHVlXSkgPT5cbiAgICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGhvb2tlZFZhbHVlID0gYXdhaXQgY3VycmVudEhvb2soe1xuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICBkYXRhOiBkb2MsXG4gICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ3JlYWQnLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRG9jOiBkb2MsXG4gICAgICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgICAgIHNpYmxpbmdEYXRhOiBzaWJsaW5nRG9jLFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIGlmIChob29rZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc2libGluZ0RvY1tmaWVsZC5uYW1lXVtsb2NhbGVdID0gaG9va2VkVmFsdWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChob29rUHJvbWlzZXMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaG9va2VkVmFsdWUgPSBhd2FpdCBjdXJyZW50SG9vayh7XG4gICAgICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIGRhdGE6IGRvYyxcbiAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgZmluZE1hbnksXG4gICAgICAgICAgICBnbG9iYWwsXG4gICAgICAgICAgICBvcGVyYXRpb246ICdyZWFkJyxcbiAgICAgICAgICAgIG9yaWdpbmFsRG9jOiBkb2MsXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICBzaWJsaW5nRGF0YTogc2libGluZ0RvYyxcbiAgICAgICAgICAgIHZhbHVlOiBzaWJsaW5nRG9jW2ZpZWxkLm5hbWVdLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAoaG9va2VkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2libGluZ0RvY1tmaWVsZC5uYW1lXSA9IGhvb2tlZFZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSlcbiAgICB9XG5cbiAgICAvLyBFeGVjdXRlIGFjY2VzcyBjb250cm9sXG4gICAgbGV0IGFsbG93RGVmYXVsdFZhbHVlID0gdHJ1ZVxuICAgIGlmICh0cmlnZ2VyQWNjZXNzQ29udHJvbCAmJiBmaWVsZC5hY2Nlc3MgJiYgZmllbGQuYWNjZXNzLnJlYWQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IG92ZXJyaWRlQWNjZXNzXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IGF3YWl0IGZpZWxkLmFjY2Vzcy5yZWFkKHtcbiAgICAgICAgICAgIGlkOiBkb2MuaWQgYXMgbnVtYmVyIHwgc3RyaW5nLFxuICAgICAgICAgICAgZGF0YTogZG9jLFxuICAgICAgICAgICAgZG9jLFxuICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgc2libGluZ0RhdGE6IHNpYmxpbmdEb2MsXG4gICAgICAgICAgfSlcblxuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgYWxsb3dEZWZhdWx0VmFsdWUgPSBmYWxzZVxuICAgICAgICBkZWxldGUgc2libGluZ0RvY1tmaWVsZC5uYW1lXVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBkZWZhdWx0VmFsdWUgb24gdGhlIGZpZWxkIGZvciBnbG9iYWxzIGJlaW5nIHJldHVybmVkIHdpdGhvdXQgYmVpbmcgZmlyc3QgY3JlYXRlZFxuICAgIC8vIG9yIGNvbGxlY3Rpb24gZG9jdW1lbnRzIGNyZWF0ZWQgcHJpb3IgdG8gaGF2aW5nIGEgZGVmYXVsdFxuICAgIGlmIChcbiAgICAgIGFsbG93RGVmYXVsdFZhbHVlICYmXG4gICAgICB0eXBlb2Ygc2libGluZ0RvY1tmaWVsZC5uYW1lXSA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHR5cGVvZiBmaWVsZC5kZWZhdWx0VmFsdWUgIT09ICd1bmRlZmluZWQnXG4gICAgKSB7XG4gICAgICBzaWJsaW5nRG9jW2ZpZWxkLm5hbWVdID0gYXdhaXQgZ2V0VmFsdWVXaXRoRGVmYXVsdCh7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZmllbGQuZGVmYXVsdFZhbHVlLFxuICAgICAgICBsb2NhbGUsXG4gICAgICAgIHVzZXI6IHJlcS51c2VyLFxuICAgICAgICB2YWx1ZTogc2libGluZ0RvY1tmaWVsZC5uYW1lXSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGZpZWxkLnR5cGUgPT09ICdyZWxhdGlvbnNoaXAnIHx8IGZpZWxkLnR5cGUgPT09ICd1cGxvYWQnKSB7XG4gICAgICBwb3B1bGF0aW9uUHJvbWlzZXMucHVzaChcbiAgICAgICAgcmVsYXRpb25zaGlwUG9wdWxhdGlvblByb21pc2Uoe1xuICAgICAgICAgIGN1cnJlbnREZXB0aCxcbiAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICBmYWxsYmFja0xvY2FsZSxcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgb3ZlcnJpZGVBY2Nlc3MsXG4gICAgICAgICAgcmVxLFxuICAgICAgICAgIHNob3dIaWRkZW5GaWVsZHMsXG4gICAgICAgICAgc2libGluZ0RvYyxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgY2FzZSAnZ3JvdXAnOiB7XG4gICAgICBsZXQgZ3JvdXBEb2MgPSBzaWJsaW5nRG9jW2ZpZWxkLm5hbWVdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICBpZiAodHlwZW9mIHNpYmxpbmdEb2NbZmllbGQubmFtZV0gIT09ICdvYmplY3QnKSBncm91cERvYyA9IHt9XG5cbiAgICAgIHRyYXZlcnNlRmllbGRzKHtcbiAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgY3VycmVudERlcHRoLFxuICAgICAgICBkZXB0aCxcbiAgICAgICAgZG9jLFxuICAgICAgICBmYWxsYmFja0xvY2FsZSxcbiAgICAgICAgZmllbGRQcm9taXNlcyxcbiAgICAgICAgZmllbGRzOiBmaWVsZC5maWVsZHMsXG4gICAgICAgIGZpbmRNYW55LFxuICAgICAgICBmbGF0dGVuTG9jYWxlcyxcbiAgICAgICAgZ2xvYmFsLFxuICAgICAgICBsb2NhbGUsXG4gICAgICAgIG92ZXJyaWRlQWNjZXNzLFxuICAgICAgICBwb3B1bGF0aW9uUHJvbWlzZXMsXG4gICAgICAgIHJlcSxcbiAgICAgICAgc2hvd0hpZGRlbkZpZWxkcyxcbiAgICAgICAgc2libGluZ0RvYzogZ3JvdXBEb2MsXG4gICAgICAgIHRyaWdnZXJBY2Nlc3NDb250cm9sLFxuICAgICAgICB0cmlnZ2VySG9va3MsXG4gICAgICB9KVxuXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGNhc2UgJ2FycmF5Jzoge1xuICAgICAgY29uc3Qgcm93cyA9IHNpYmxpbmdEb2NbZmllbGQubmFtZV1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocm93cykpIHtcbiAgICAgICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICB0cmF2ZXJzZUZpZWxkcyh7XG4gICAgICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIGN1cnJlbnREZXB0aCxcbiAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgZG9jLFxuICAgICAgICAgICAgZmFsbGJhY2tMb2NhbGUsXG4gICAgICAgICAgICBmaWVsZFByb21pc2VzLFxuICAgICAgICAgICAgZmllbGRzOiBmaWVsZC5maWVsZHMsXG4gICAgICAgICAgICBmaW5kTWFueSxcbiAgICAgICAgICAgIGZsYXR0ZW5Mb2NhbGVzLFxuICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgb3ZlcnJpZGVBY2Nlc3MsXG4gICAgICAgICAgICBwb3B1bGF0aW9uUHJvbWlzZXMsXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgICBzaG93SGlkZGVuRmllbGRzLFxuICAgICAgICAgICAgc2libGluZ0RvYzogcm93IHx8IHt9LFxuICAgICAgICAgICAgdHJpZ2dlckFjY2Vzc0NvbnRyb2wsXG4gICAgICAgICAgICB0cmlnZ2VySG9va3MsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoIXNob3VsZEhvaXN0TG9jYWxpemVkVmFsdWUgJiYgdHlwZW9mIHJvd3MgPT09ICdvYmplY3QnICYmIHJvd3MgIT09IG51bGwpIHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhyb3dzKS5mb3JFYWNoKChsb2NhbGVSb3dzKSA9PiB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobG9jYWxlUm93cykpIHtcbiAgICAgICAgICAgIGxvY2FsZVJvd3MuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICAgIHRyYXZlcnNlRmllbGRzKHtcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLFxuICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgY3VycmVudERlcHRoLFxuICAgICAgICAgICAgICAgIGRlcHRoLFxuICAgICAgICAgICAgICAgIGRvYyxcbiAgICAgICAgICAgICAgICBmYWxsYmFja0xvY2FsZSxcbiAgICAgICAgICAgICAgICBmaWVsZFByb21pc2VzLFxuICAgICAgICAgICAgICAgIGZpZWxkczogZmllbGQuZmllbGRzLFxuICAgICAgICAgICAgICAgIGZpbmRNYW55LFxuICAgICAgICAgICAgICAgIGZsYXR0ZW5Mb2NhbGVzLFxuICAgICAgICAgICAgICAgIGdsb2JhbCxcbiAgICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgICAgb3ZlcnJpZGVBY2Nlc3MsXG4gICAgICAgICAgICAgICAgcG9wdWxhdGlvblByb21pc2VzLFxuICAgICAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgICAgICBzaG93SGlkZGVuRmllbGRzLFxuICAgICAgICAgICAgICAgIHNpYmxpbmdEb2M6IHJvdyB8fCB7fSxcbiAgICAgICAgICAgICAgICB0cmlnZ2VyQWNjZXNzQ29udHJvbCxcbiAgICAgICAgICAgICAgICB0cmlnZ2VySG9va3MsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpYmxpbmdEb2NbZmllbGQubmFtZV0gPSBbXVxuICAgICAgfVxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBjYXNlICdibG9ja3MnOiB7XG4gICAgICBjb25zdCByb3dzID0gc2libGluZ0RvY1tmaWVsZC5uYW1lXVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dzKSkge1xuICAgICAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0IGJsb2NrID0gZmllbGQuYmxvY2tzLmZpbmQoKGJsb2NrVHlwZSkgPT4gYmxvY2tUeXBlLnNsdWcgPT09IHJvdy5ibG9ja1R5cGUpXG5cbiAgICAgICAgICBpZiAoYmxvY2spIHtcbiAgICAgICAgICAgIHRyYXZlcnNlRmllbGRzKHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgY3VycmVudERlcHRoLFxuICAgICAgICAgICAgICBkZXB0aCxcbiAgICAgICAgICAgICAgZG9jLFxuICAgICAgICAgICAgICBmYWxsYmFja0xvY2FsZSxcbiAgICAgICAgICAgICAgZmllbGRQcm9taXNlcyxcbiAgICAgICAgICAgICAgZmllbGRzOiBibG9jay5maWVsZHMsXG4gICAgICAgICAgICAgIGZpbmRNYW55LFxuICAgICAgICAgICAgICBmbGF0dGVuTG9jYWxlcyxcbiAgICAgICAgICAgICAgZ2xvYmFsLFxuICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgIG92ZXJyaWRlQWNjZXNzLFxuICAgICAgICAgICAgICBwb3B1bGF0aW9uUHJvbWlzZXMsXG4gICAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgICAgc2hvd0hpZGRlbkZpZWxkcyxcbiAgICAgICAgICAgICAgc2libGluZ0RvYzogcm93IHx8IHt9LFxuICAgICAgICAgICAgICB0cmlnZ2VyQWNjZXNzQ29udHJvbCxcbiAgICAgICAgICAgICAgdHJpZ2dlckhvb2tzLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKCFzaG91bGRIb2lzdExvY2FsaXplZFZhbHVlICYmIHR5cGVvZiByb3dzID09PSAnb2JqZWN0JyAmJiByb3dzICE9PSBudWxsKSB7XG4gICAgICAgIE9iamVjdC52YWx1ZXMocm93cykuZm9yRWFjaCgobG9jYWxlUm93cykgPT4ge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxvY2FsZVJvd3MpKSB7XG4gICAgICAgICAgICBsb2NhbGVSb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBibG9jayA9IGZpZWxkLmJsb2Nrcy5maW5kKChibG9ja1R5cGUpID0+IGJsb2NrVHlwZS5zbHVnID09PSByb3cuYmxvY2tUeXBlKVxuXG4gICAgICAgICAgICAgIGlmIChibG9jaykge1xuICAgICAgICAgICAgICAgIHRyYXZlcnNlRmllbGRzKHtcbiAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgY3VycmVudERlcHRoLFxuICAgICAgICAgICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgICAgICAgICBkb2MsXG4gICAgICAgICAgICAgICAgICBmYWxsYmFja0xvY2FsZSxcbiAgICAgICAgICAgICAgICAgIGZpZWxkUHJvbWlzZXMsXG4gICAgICAgICAgICAgICAgICBmaWVsZHM6IGJsb2NrLmZpZWxkcyxcbiAgICAgICAgICAgICAgICAgIGZpbmRNYW55LFxuICAgICAgICAgICAgICAgICAgZmxhdHRlbkxvY2FsZXMsXG4gICAgICAgICAgICAgICAgICBnbG9iYWwsXG4gICAgICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgICAgICBvdmVycmlkZUFjY2VzcyxcbiAgICAgICAgICAgICAgICAgIHBvcHVsYXRpb25Qcm9taXNlcyxcbiAgICAgICAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgICAgICAgIHNob3dIaWRkZW5GaWVsZHMsXG4gICAgICAgICAgICAgICAgICBzaWJsaW5nRG9jOiByb3cgfHwge30sXG4gICAgICAgICAgICAgICAgICB0cmlnZ2VyQWNjZXNzQ29udHJvbCxcbiAgICAgICAgICAgICAgICAgIHRyaWdnZXJIb29rcyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpYmxpbmdEb2NbZmllbGQubmFtZV0gPSBbXVxuICAgICAgfVxuXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGNhc2UgJ3Jvdyc6XG4gICAgY2FzZSAnY29sbGFwc2libGUnOiB7XG4gICAgICB0cmF2ZXJzZUZpZWxkcyh7XG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGN1cnJlbnREZXB0aCxcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIGRvYyxcbiAgICAgICAgZmFsbGJhY2tMb2NhbGUsXG4gICAgICAgIGZpZWxkUHJvbWlzZXMsXG4gICAgICAgIGZpZWxkczogZmllbGQuZmllbGRzLFxuICAgICAgICBmaW5kTWFueSxcbiAgICAgICAgZmxhdHRlbkxvY2FsZXMsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgbG9jYWxlLFxuICAgICAgICBvdmVycmlkZUFjY2VzcyxcbiAgICAgICAgcG9wdWxhdGlvblByb21pc2VzLFxuICAgICAgICByZXEsXG4gICAgICAgIHNob3dIaWRkZW5GaWVsZHMsXG4gICAgICAgIHNpYmxpbmdEb2MsXG4gICAgICAgIHRyaWdnZXJBY2Nlc3NDb250cm9sLFxuICAgICAgICB0cmlnZ2VySG9va3MsXG4gICAgICB9KVxuXG4gICAgICBicmVha1xuICAgIH1cblxuICAgIGNhc2UgJ3RhYic6IHtcbiAgICAgIGxldCB0YWJEb2MgPSBzaWJsaW5nRG9jXG4gICAgICBpZiAodGFiSGFzTmFtZShmaWVsZCkpIHtcbiAgICAgICAgdGFiRG9jID0gc2libGluZ0RvY1tmaWVsZC5uYW1lXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICBpZiAodHlwZW9mIHNpYmxpbmdEb2NbZmllbGQubmFtZV0gIT09ICdvYmplY3QnKSB0YWJEb2MgPSB7fVxuICAgICAgfVxuXG4gICAgICB0cmF2ZXJzZUZpZWxkcyh7XG4gICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGN1cnJlbnREZXB0aCxcbiAgICAgICAgZGVwdGgsXG4gICAgICAgIGRvYyxcbiAgICAgICAgZmFsbGJhY2tMb2NhbGUsXG4gICAgICAgIGZpZWxkUHJvbWlzZXMsXG4gICAgICAgIGZpZWxkczogZmllbGQuZmllbGRzLFxuICAgICAgICBmaW5kTWFueSxcbiAgICAgICAgZmxhdHRlbkxvY2FsZXMsXG4gICAgICAgIGdsb2JhbCxcbiAgICAgICAgbG9jYWxlLFxuICAgICAgICBvdmVycmlkZUFjY2VzcyxcbiAgICAgICAgcG9wdWxhdGlvblByb21pc2VzLFxuICAgICAgICByZXEsXG4gICAgICAgIHNob3dIaWRkZW5GaWVsZHMsXG4gICAgICAgIHNpYmxpbmdEb2M6IHRhYkRvYyxcbiAgICAgICAgdHJpZ2dlckFjY2Vzc0NvbnRyb2wsXG4gICAgICAgIHRyaWdnZXJIb29rcyxcbiAgICAgIH0pXG5cbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgY2FzZSAndGFicyc6IHtcbiAgICAgIHRyYXZlcnNlRmllbGRzKHtcbiAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgY3VycmVudERlcHRoLFxuICAgICAgICBkZXB0aCxcbiAgICAgICAgZG9jLFxuICAgICAgICBmYWxsYmFja0xvY2FsZSxcbiAgICAgICAgZmllbGRQcm9taXNlcyxcbiAgICAgICAgZmllbGRzOiBmaWVsZC50YWJzLm1hcCgodGFiKSA9PiAoeyAuLi50YWIsIHR5cGU6ICd0YWInIH0pKSxcbiAgICAgICAgZmluZE1hbnksXG4gICAgICAgIGZsYXR0ZW5Mb2NhbGVzLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIGxvY2FsZSxcbiAgICAgICAgb3ZlcnJpZGVBY2Nlc3MsXG4gICAgICAgIHBvcHVsYXRpb25Qcm9taXNlcyxcbiAgICAgICAgcmVxLFxuICAgICAgICBzaG93SGlkZGVuRmllbGRzLFxuICAgICAgICBzaWJsaW5nRG9jLFxuICAgICAgICB0cmlnZ2VyQWNjZXNzQ29udHJvbCxcbiAgICAgICAgdHJpZ2dlckhvb2tzLFxuICAgICAgfSlcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgZGVmYXVsdDoge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJwcm9taXNlIiwiY29sbGVjdGlvbiIsImNvbnRleHQiLCJjdXJyZW50RGVwdGgiLCJkZXB0aCIsImRvYyIsImZhbGxiYWNrTG9jYWxlIiwiZmllbGQiLCJmaWVsZFByb21pc2VzIiwiZmluZE1hbnkiLCJmbGF0dGVuTG9jYWxlcyIsImdsb2JhbCIsImxvY2FsZSIsIm92ZXJyaWRlQWNjZXNzIiwicG9wdWxhdGlvblByb21pc2VzIiwicmVxIiwic2hvd0hpZGRlbkZpZWxkcyIsInNpYmxpbmdEb2MiLCJ0cmlnZ2VyQWNjZXNzQ29udHJvbCIsInRyaWdnZXJIb29rcyIsImZpZWxkQWZmZWN0c0RhdGEiLCJoaWRkZW4iLCJuYW1lIiwic2hvdWxkSG9pc3RMb2NhbGl6ZWRWYWx1ZSIsImxvY2FsaXplZCIsInBheWxvYWQiLCJjb25maWciLCJsb2NhbGl6YXRpb24iLCJ2YWx1ZSIsImhvaXN0ZWRWYWx1ZSIsImZhbGxiYWNrVmFsdWUiLCJpc051bGxPclVuZGVmaW5lZCIsInR5cGUiLCJ0YWJzIiwiZm9yRWFjaCIsInRhYiIsInRhYkhhc05hbWUiLCJlZGl0b3IiLCJwb3B1bGF0aW9uUHJvbWlzZSIsInB1c2giLCJhZnRlclJlYWRQcm9taXNlIiwiaW5jb21pbmdFZGl0b3JTdGF0ZSIsInBvaW50RG9jIiwiQXJyYXkiLCJpc0FycmF5IiwiY29vcmRpbmF0ZXMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJob29rcyIsImFmdGVyUmVhZCIsInJlZHVjZSIsInByaW9ySG9vayIsImN1cnJlbnRIb29rIiwic2hvdWxkUnVuSG9va09uQWxsTG9jYWxlcyIsImhvb2tQcm9taXNlcyIsIk9iamVjdCIsImVudHJpZXMiLCJtYXAiLCJob29rZWRWYWx1ZSIsImRhdGEiLCJvcGVyYXRpb24iLCJvcmlnaW5hbERvYyIsInNpYmxpbmdEYXRhIiwiUHJvbWlzZSIsImFsbCIsInJlc29sdmUiLCJhbGxvd0RlZmF1bHRWYWx1ZSIsImFjY2VzcyIsInJlYWQiLCJyZXN1bHQiLCJpZCIsImRlZmF1bHRWYWx1ZSIsImdldFZhbHVlV2l0aERlZmF1bHQiLCJ1c2VyIiwicmVsYXRpb25zaGlwUG9wdWxhdGlvblByb21pc2UiLCJncm91cERvYyIsInRyYXZlcnNlRmllbGRzIiwiZmllbGRzIiwicm93cyIsInJvdyIsInZhbHVlcyIsImxvY2FsZVJvd3MiLCJibG9jayIsImJsb2NrcyIsImZpbmQiLCJibG9ja1R5cGUiLCJzbHVnIiwidGFiRG9jIl0sIm1hcHBpbmdzIjoiQUFBQSxvQ0FBb0M7Ozs7K0JBMEN2QkE7OztlQUFBQTs7O3VCQW5DZ0M7d0VBQ2I7c0ZBQ1U7Z0NBQ1g7Ozs7OztBQWdDeEIsTUFBTUEsVUFBVSxPQUFPLEVBQzVCQyxVQUFVLEVBQ1ZDLE9BQU8sRUFDUEMsWUFBWSxFQUNaQyxLQUFLLEVBQ0xDLEdBQUcsRUFDSEMsY0FBYyxFQUNkQyxLQUFLLEVBQ0xDLGFBQWEsRUFDYkMsUUFBUSxFQUNSQyxjQUFjLEVBQ2RDLE1BQU0sRUFDTkMsTUFBTSxFQUNOQyxjQUFjLEVBQ2RDLGtCQUFrQixFQUNsQkMsR0FBRyxFQUNIQyxnQkFBZ0IsRUFDaEJDLFVBQVUsRUFDVkMsdUJBQXVCLElBQUksRUFDM0JDLGVBQWUsSUFBSSxFQUNkO0lBQ0wsSUFDRUMsSUFBQUEsdUJBQWdCLEVBQUNiLFVBQ2pCQSxNQUFN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