mzinga
Version:
Node, React and MongoDB Headless CMS and Application Framework
277 lines (276 loc) • 37.3 kB
JavaScript
/* eslint-disable no-use-before-define */ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
default: function() {
return _default;
},
getCollectionIDType: function() {
return getCollectionIDType;
}
});
const _graphql = require("graphql");
const _graphqltypejson = require("graphql-type-json");
const _types = require("../../fields/config/types");
const _flattenTopLevelFields = /*#__PURE__*/ _interop_require_default(require("../../utilities/flattenTopLevelFields"));
const _formatLabels = require("../../utilities/formatLabels");
const _groupOrTabHasRequiredSubfield = require("../../utilities/groupOrTabHasRequiredSubfield");
const _combineParentName = /*#__PURE__*/ _interop_require_default(require("../utilities/combineParentName"));
const _formatName = /*#__PURE__*/ _interop_require_default(require("../utilities/formatName"));
const _withNullableType = /*#__PURE__*/ _interop_require_default(require("./withNullableType"));
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const idFieldTypes = {
number: _graphql.GraphQLInt,
text: _graphql.GraphQLString
};
const getCollectionIDType = (payload, collection)=>{
const idField = (0, _flattenTopLevelFields.default)(collection.fields).find((field)=>(0, _types.fieldAffectsData)(field) && field.name === 'id');
if (!idField) {
return idFieldTypes[payload.db.defaultIDType];
}
return idFieldTypes[idField.type];
};
function buildMutationInputType(payload, name, fields, parentName, forceNullable = false) {
const fieldToSchemaMap = {
array: (inputObjectTypeConfig, field)=>{
const fullName = (0, _combineParentName.default)(parentName, (0, _formatLabels.toWords)(field.name, true));
let type = buildMutationInputType(payload, fullName, field.fields, fullName);
if (!type) return inputObjectTypeConfig;
type = new _graphql.GraphQLList((0, _withNullableType.default)(field, type, forceNullable));
return {
...inputObjectTypeConfig,
[field.name]: {
type
}
};
},
blocks: (inputObjectTypeConfig, field)=>({
...inputObjectTypeConfig,
[field.name]: {
type: _graphqltypejson.GraphQLJSON
}
}),
checkbox: (inputObjectTypeConfig, field)=>({
...inputObjectTypeConfig,
[field.name]: {
type: _graphql.GraphQLBoolean
}
}),
code: (inputObjectTypeConfig, field)=>({
...inputObjectTypeConfig,
[field.name]: {
type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable)
}
}),
collapsible: (inputObjectTypeConfig, field)=>field.fields.reduce((acc, subField)=>{
const addSubField = fieldToSchemaMap[subField.type];
if (addSubField) return addSubField(acc, subField);
return acc;
}, inputObjectTypeConfig),
date: (inputObjectTypeConfig, field)=>({
...inputObjectTypeConfig,
[field.name]: {
type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable)
}
}),
email: (inputObjectTypeConfig, field)=>({
...inputObjectTypeConfig,
[field.name]: {
type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable)
}
}),
group: (inputObjectTypeConfig, field)=>{
const requiresAtLeastOneField = (0, _groupOrTabHasRequiredSubfield.groupOrTabHasRequiredSubfield)(field);
const fullName = (0, _combineParentName.default)(parentName, (0, _formatLabels.toWords)(field.name, true));
let type = buildMutationInputType(payload, fullName, field.fields, fullName);
if (!type) return inputObjectTypeConfig;
if (requiresAtLeastOneField) type = new _graphql.GraphQLNonNull(type);
return {
...inputObjectTypeConfig,
[field.name]: {
type
}
};
},
json: (inputObjectTypeConfig, field)=>({
...inputObjectTypeConfig,
[field.name]: {
type: (0, _withNullableType.default)(field, _graphqltypejson.GraphQLJSON, forceNullable)
}
}),
number: (inputObjectTypeConfig, field)=>{
const type = field.name === 'id' ? _graphql.GraphQLInt : _graphql.GraphQLFloat;
return {
...inputObjectTypeConfig,
[field.name]: {
type: (0, _withNullableType.default)(field, field.hasMany === true ? new _graphql.GraphQLList(type) : type, forceNullable)
}
};
},
point: (inputObjectTypeConfig, field)=>({
...inputObjectTypeConfig,
[field.name]: {
type: (0, _withNullableType.default)(field, new _graphql.GraphQLList(_graphql.GraphQLFloat), forceNullable)
}
}),
radio: (inputObjectTypeConfig, field)=>({
...inputObjectTypeConfig,
[field.name]: {
type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable)
}
}),
relationship: (inputObjectTypeConfig, field)=>{
const { relationTo } = field;
let type;
if (Array.isArray(relationTo)) {
const fullName = `${(0, _combineParentName.default)(parentName, (0, _formatLabels.toWords)(field.name, true))}RelationshipInput`;
type = new _graphql.GraphQLInputObjectType({
name: fullName,
fields: {
relationTo: {
type: new _graphql.GraphQLEnumType({
name: `${fullName}RelationTo`,
values: relationTo.reduce((values, option)=>({
...values,
[(0, _formatName.default)(option)]: {
value: option
}
}), {})
})
},
value: {
type: _graphqltypejson.GraphQLJSON
}
}
});
} else {
type = getCollectionIDType(payload, payload.collections[relationTo].config);
}
return {
...inputObjectTypeConfig,
[field.name]: {
type: field.hasMany ? new _graphql.GraphQLList(type) : type
}
};
},
richText: (inputObjectTypeConfig, field)=>({
...inputObjectTypeConfig,
[field.name]: {
type: (0, _withNullableType.default)(field, _graphqltypejson.GraphQLJSON, forceNullable)
}
}),
row: (inputObjectTypeConfig, field)=>field.fields.reduce((acc, subField)=>{
const addSubField = fieldToSchemaMap[subField.type];
if (addSubField) return addSubField(acc, subField);
return acc;
}, inputObjectTypeConfig),
select: (inputObjectTypeConfig, field)=>{
const formattedName = `${(0, _combineParentName.default)(parentName, field.name)}_MutationInput`;
let type = new _graphql.GraphQLEnumType({
name: formattedName,
values: field.options.reduce((values, option)=>{
if ((0, _types.optionIsObject)(option)) {
return {
...values,
[(0, _formatName.default)(option.value)]: {
value: option.value
}
};
}
return {
...values,
[(0, _formatName.default)(option)]: {
value: option
}
};
}, {})
});
type = field.hasMany ? new _graphql.GraphQLList(type) : type;
type = (0, _withNullableType.default)(field, type, forceNullable);
return {
...inputObjectTypeConfig,
[field.name]: {
type
}
};
},
tabs: (inputObjectTypeConfig, field)=>{
return field.tabs.reduce((acc, tab)=>{
if ((0, _types.tabHasName)(tab)) {
const fullName = (0, _combineParentName.default)(parentName, (0, _formatLabels.toWords)(tab.name, true));
const requiresAtLeastOneField = (0, _groupOrTabHasRequiredSubfield.groupOrTabHasRequiredSubfield)(field);
let type = buildMutationInputType(payload, fullName, tab.fields, fullName);
if (!type) return acc;
if (requiresAtLeastOneField) type = new _graphql.GraphQLNonNull(type);
return {
...acc,
[tab.name]: {
type
}
};
}
return {
...acc,
...tab.fields.reduce((subFieldSchema, subField)=>{
const addSubField = fieldToSchemaMap[subField.type];
if (addSubField) return addSubField(subFieldSchema, subField);
return subFieldSchema;
}, acc)
};
}, inputObjectTypeConfig);
},
text: (inputObjectTypeConfig, field)=>({
...inputObjectTypeConfig,
[field.name]: {
type: (0, _withNullableType.default)(field, field.hasMany === true ? new _graphql.GraphQLList(_graphql.GraphQLString) : _graphql.GraphQLString, forceNullable)
}
}),
textarea: (inputObjectTypeConfig, field)=>({
...inputObjectTypeConfig,
[field.name]: {
type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable)
}
}),
upload: (inputObjectTypeConfig, field)=>({
...inputObjectTypeConfig,
[field.name]: {
type: (0, _withNullableType.default)(field, _graphql.GraphQLString, forceNullable)
}
})
};
const fieldName = (0, _formatName.default)(name);
const fieldSchemas = fields.reduce((inputObjectTypeConfig, field)=>{
const fieldSchema = fieldToSchemaMap[field.type];
if (typeof fieldSchema !== 'function') {
return inputObjectTypeConfig;
}
const schema = fieldSchema(inputObjectTypeConfig, field);
if (Object.keys(schema).length === 0) {
return inputObjectTypeConfig;
}
return {
...inputObjectTypeConfig,
...fieldSchema(inputObjectTypeConfig, field)
};
}, {});
if (Object.keys(fieldSchemas).length === 0) {
return null;
}
return new _graphql.GraphQLInputObjectType({
name: `mutation${fieldName}Input`,
fields: fieldSchemas
});
}
const _default = buildMutationInputType;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ncmFwaHFsL3NjaGVtYS9idWlsZE11dGF0aW9uSW5wdXRUeXBlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG5pbXBvcnQgdHlwZSB7IEdyYXBoUUxJbnB1dEZpZWxkQ29uZmlnLCBHcmFwaFFMU2NhbGFyVHlwZSwgR3JhcGhRTFR5cGUgfSBmcm9tICdncmFwaHFsJ1xuXG5pbXBvcnQge1xuICBHcmFwaFFMQm9vbGVhbixcbiAgR3JhcGhRTEVudW1UeXBlLFxuICBHcmFwaFFMRmxvYXQsXG4gIEdyYXBoUUxJbnB1dE9iamVjdFR5cGUsXG4gIEdyYXBoUUxJbnQsXG4gIEdyYXBoUUxMaXN0LFxuICBHcmFwaFFMTm9uTnVsbCxcbiAgR3JhcGhRTFN0cmluZyxcbn0gZnJvbSAnZ3JhcGhxbCdcbmltcG9ydCB7IEdyYXBoUUxKU09OIH0gZnJvbSAnZ3JhcGhxbC10eXBlLWpzb24nXG5cbmltcG9ydCB0eXBlIHsgU2FuaXRpemVkQ29sbGVjdGlvbkNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbGxlY3Rpb25zL2NvbmZpZy90eXBlcydcbmltcG9ydCB0eXBlIHtcbiAgQXJyYXlGaWVsZCxcbiAgQmxvY2tGaWVsZCxcbiAgQ2hlY2tib3hGaWVsZCxcbiAgQ29kZUZpZWxkLFxuICBDb2xsYXBzaWJsZUZpZWxkLFxuICBEYXRlRmllbGQsXG4gIEVtYWlsRmllbGQsXG4gIEZpZWxkLFxuICBHcm91cEZpZWxkLFxuICBKU09ORmllbGQsXG4gIE51bWJlckZpZWxkLFxuICBQb2ludEZpZWxkLFxuICBSYWRpb0ZpZWxkLFxuICBSZWxhdGlvbnNoaXBGaWVsZCxcbiAgUmljaFRleHRGaWVsZCxcbiAgUm93RmllbGQsXG4gIFNlbGVjdEZpZWxkLFxuICBUYWJzRmllbGQsXG4gIFRleHRGaWVsZCxcbiAgVGV4dGFyZWFGaWVsZCxcbiAgVXBsb2FkRmllbGQsXG59IGZyb20gJy4uLy4uL2ZpZWxkcy9jb25maWcvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFBheWxvYWQgfSBmcm9tICcuLi8uLi9temluZ2EnXG5cbmltcG9ydCB7IGZpZWxkQWZmZWN0c0RhdGEsIG9wdGlvbklzT2JqZWN0LCB0YWJIYXNOYW1lIH0gZnJvbSAnLi4vLi4vZmllbGRzL2NvbmZpZy90eXBlcydcbmltcG9ydCBmbGF0dGVuRmllbGRzIGZyb20gJy4uLy4uL3V0aWxpdGllcy9mbGF0dGVuVG9wTGV2ZWxGaWVsZHMnXG5pbXBvcnQgeyB0b1dvcmRzIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2Zvcm1hdExhYmVscydcbmltcG9ydCB7IGdyb3VwT3JUYWJIYXNSZXF1aXJlZFN1YmZpZWxkIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2dyb3VwT3JUYWJIYXNSZXF1aXJlZFN1YmZpZWxkJ1xuaW1wb3J0IGNvbWJpbmVQYXJlbnROYW1lIGZyb20gJy4uL3V0aWxpdGllcy9jb21iaW5lUGFyZW50TmFtZSdcbmltcG9ydCBmb3JtYXROYW1lIGZyb20gJy4uL3V0aWxpdGllcy9mb3JtYXROYW1lJ1xuaW1wb3J0IHdpdGhOdWxsYWJsZVR5cGUgZnJvbSAnLi93aXRoTnVsbGFibGVUeXBlJ1xuXG5jb25zdCBpZEZpZWxkVHlwZXMgPSB7XG4gIG51bWJlcjogR3JhcGhRTEludCxcbiAgdGV4dDogR3JhcGhRTFN0cmluZyxcbn1cblxuZXhwb3J0IGNvbnN0IGdldENvbGxlY3Rpb25JRFR5cGUgPSAoXG4gIHBheWxvYWQ6IFBheWxvYWQsXG4gIGNvbGxlY3Rpb246IFNhbml0aXplZENvbGxlY3Rpb25Db25maWcsXG4pOiBHcmFwaFFMU2NhbGFyVHlwZSA9PiB7XG4gIGNvbnN0IGlkRmllbGQgPSBmbGF0dGVuRmllbGRzKGNvbGxlY3Rpb24uZmllbGRzKS5maW5kKFxuICAgIChmaWVsZCkgPT4gZmllbGRBZmZlY3RzRGF0YShmaWVsZCkgJiYgZmllbGQubmFtZSA9PT0gJ2lkJyxcbiAgKVxuXG4gIGlmICghaWRGaWVsZCkge1xuICAgIHJldHVybiBpZEZpZWxkVHlwZXNbcGF5bG9hZC5kYi5kZWZhdWx0SURUeXBlXVxuICB9XG5cbiAgcmV0dXJuIGlkRmllbGRUeXBlc1tpZEZpZWxkLnR5cGVdXG59XG5cbmV4cG9ydCB0eXBlIElucHV0T2JqZWN0VHlwZUNvbmZpZyA9IHtcbiAgW3BhdGg6IHN0cmluZ106IEdyYXBoUUxJbnB1dEZpZWxkQ29uZmlnXG59XG5cbmZ1bmN0aW9uIGJ1aWxkTXV0YXRpb25JbnB1dFR5cGUoXG4gIHBheWxvYWQ6IFBheWxvYWQsXG4gIG5hbWU6IHN0cmluZyxcbiAgZmllbGRzOiBGaWVsZFtdLFxuICBwYXJlbnROYW1lOiBzdHJpbmcsXG4gIGZvcmNlTnVsbGFibGUgPSBmYWxzZSxcbik6IEdyYXBoUUxJbnB1dE9iamVjdFR5cGUgfCBudWxsIHtcbiAgY29uc3QgZmllbGRUb1NjaGVtYU1hcCA9IHtcbiAgICBhcnJheTogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogQXJyYXlGaWVsZCkgPT4ge1xuICAgICAgY29uc3QgZnVsbE5hbWUgPSBjb21iaW5lUGFyZW50TmFtZShwYXJlbnROYW1lLCB0b1dvcmRzKGZpZWxkLm5hbWUsIHRydWUpKVxuICAgICAgbGV0IHR5cGU6IEdyYXBoUUxMaXN0PEdyYXBoUUxUeXBlPiB8IEdyYXBoUUxUeXBlID0gYnVpbGRNdXRhdGlvbklucHV0VHlwZShcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgZnVsbE5hbWUsXG4gICAgICAgIGZpZWxkLmZpZWxkcyxcbiAgICAgICAgZnVsbE5hbWUsXG4gICAgICApXG5cbiAgICAgIGlmICghdHlwZSkgcmV0dXJuIGlucHV0T2JqZWN0VHlwZUNvbmZpZ1xuXG4gICAgICB0eXBlID0gbmV3IEdyYXBoUUxMaXN0KHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIHR5cGUsIGZvcmNlTnVsbGFibGUpKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgICBbZmllbGQubmFtZV06IHsgdHlwZSB9LFxuICAgICAgfVxuICAgIH0sXG4gICAgYmxvY2tzOiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBCbG9ja0ZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IEdyYXBoUUxKU09OIH0sXG4gICAgfSksXG4gICAgY2hlY2tib3g6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IENoZWNrYm94RmllbGQpID0+ICh7XG4gICAgICAuLi5pbnB1dE9iamVjdFR5cGVDb25maWcsXG4gICAgICBbZmllbGQubmFtZV06IHsgdHlwZTogR3JhcGhRTEJvb2xlYW4gfSxcbiAgICB9KSxcbiAgICBjb2RlOiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBDb2RlRmllbGQpID0+ICh7XG4gICAgICAuLi5pbnB1dE9iamVjdFR5cGVDb25maWcsXG4gICAgICBbZmllbGQubmFtZV06IHsgdHlwZTogd2l0aE51bGxhYmxlVHlwZShmaWVsZCwgR3JhcGhRTFN0cmluZywgZm9yY2VOdWxsYWJsZSkgfSxcbiAgICB9KSxcbiAgICBjb2xsYXBzaWJsZTogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogQ29sbGFwc2libGVGaWVsZCkgPT5cbiAgICAgIGZpZWxkLmZpZWxkcy5yZWR1Y2UoKGFjYywgc3ViRmllbGQ6IENvbGxhcHNpYmxlRmllbGQpID0+IHtcbiAgICAgICAgY29uc3QgYWRkU3ViRmllbGQgPSBmaWVsZFRvU2NoZW1hTWFwW3N1YkZpZWxkLnR5cGVdXG4gICAgICAgIGlmIChhZGRTdWJGaWVsZCkgcmV0dXJuIGFkZFN1YkZpZWxkKGFjYywgc3ViRmllbGQpXG4gICAgICAgIHJldHVybiBhY2NcbiAgICAgIH0sIGlucHV0T2JqZWN0VHlwZUNvbmZpZyksXG4gICAgZGF0ZTogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogRGF0ZUZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIEdyYXBoUUxTdHJpbmcsIGZvcmNlTnVsbGFibGUpIH0sXG4gICAgfSksXG4gICAgZW1haWw6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IEVtYWlsRmllbGQpID0+ICh7XG4gICAgICAuLi5pbnB1dE9iamVjdFR5cGVDb25maWcsXG4gICAgICBbZmllbGQubmFtZV06IHsgdHlwZTogd2l0aE51bGxhYmxlVHlwZShmaWVsZCwgR3JhcGhRTFN0cmluZywgZm9yY2VOdWxsYWJsZSkgfSxcbiAgICB9KSxcbiAgICBncm91cDogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogR3JvdXBGaWVsZCkgPT4ge1xuICAgICAgY29uc3QgcmVxdWlyZXNBdExlYXN0T25lRmllbGQgPSBncm91cE9yVGFiSGFzUmVxdWlyZWRTdWJmaWVsZChmaWVsZClcbiAgICAgIGNvbnN0IGZ1bGxOYW1lID0gY29tYmluZVBhcmVudE5hbWUocGFyZW50TmFtZSwgdG9Xb3JkcyhmaWVsZC5uYW1lLCB0cnVlKSlcbiAgICAgIGxldCB0eXBlOiBHcmFwaFFMVHlwZSA9IGJ1aWxkTXV0YXRpb25JbnB1dFR5cGUocGF5bG9hZCwgZnVsbE5hbWUsIGZpZWxkLmZpZWxkcywgZnVsbE5hbWUpXG5cbiAgICAgIGlmICghdHlwZSkgcmV0dXJuIGlucHV0T2JqZWN0VHlwZUNvbmZpZ1xuXG4gICAgICBpZiAocmVxdWlyZXNBdExlYXN0T25lRmllbGQpIHR5cGUgPSBuZXcgR3JhcGhRTE5vbk51bGwodHlwZSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGUgfSxcbiAgICAgIH1cbiAgICB9LFxuICAgIGpzb246IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IEpTT05GaWVsZCkgPT4gKHtcbiAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgIFtmaWVsZC5uYW1lXTogeyB0eXBlOiB3aXRoTnVsbGFibGVUeXBlKGZpZWxkLCBHcmFwaFFMSlNPTiwgZm9yY2VOdWxsYWJsZSkgfSxcbiAgICB9KSxcbiAgICBudW1iZXI6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IE51bWJlckZpZWxkKSA9PiB7XG4gICAgICBjb25zdCB0eXBlID0gZmllbGQubmFtZSA9PT0gJ2lkJyA/IEdyYXBoUUxJbnQgOiBHcmFwaFFMRmxvYXRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgICAgW2ZpZWxkLm5hbWVdOiB7XG4gICAgICAgICAgdHlwZTogd2l0aE51bGxhYmxlVHlwZShcbiAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgZmllbGQuaGFzTWFueSA9PT0gdHJ1ZSA/IG5ldyBHcmFwaFFMTGlzdCh0eXBlKSA6IHR5cGUsXG4gICAgICAgICAgICBmb3JjZU51bGxhYmxlLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfSxcbiAgICBwb2ludDogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogUG9pbnRGaWVsZCkgPT4gKHtcbiAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgIFtmaWVsZC5uYW1lXTogeyB0eXBlOiB3aXRoTnVsbGFibGVUeXBlKGZpZWxkLCBuZXcgR3JhcGhRTExpc3QoR3JhcGhRTEZsb2F0KSwgZm9yY2VOdWxsYWJsZSkgfSxcbiAgICB9KSxcbiAgICByYWRpbzogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogUmFkaW9GaWVsZCkgPT4gKHtcbiAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgIFtmaWVsZC5uYW1lXTogeyB0eXBlOiB3aXRoTnVsbGFibGVUeXBlKGZpZWxkLCBHcmFwaFFMU3RyaW5nLCBmb3JjZU51bGxhYmxlKSB9LFxuICAgIH0pLFxuICAgIHJlbGF0aW9uc2hpcDogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogUmVsYXRpb25zaGlwRmllbGQpID0+IHtcbiAgICAgIGNvbnN0IHsgcmVsYXRpb25UbyB9ID0gZmllbGRcbiAgICAgIHR5cGUgUGF5bG9hZEdyYXBoUUxSZWxhdGlvbnNoaXBUeXBlID1cbiAgICAgICAgfCBHcmFwaFFMSW5wdXRPYmplY3RUeXBlXG4gICAgICAgIHwgR3JhcGhRTExpc3Q8R3JhcGhRTFNjYWxhclR5cGU+XG4gICAgICAgIHwgR3JhcGhRTFNjYWxhclR5cGVcbiAgICAgIGxldCB0eXBlOiBQYXlsb2FkR3JhcGhRTFJlbGF0aW9uc2hpcFR5cGVcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVsYXRpb25UbykpIHtcbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSBgJHtjb21iaW5lUGFyZW50TmFtZShcbiAgICAgICAgICBwYXJlbnROYW1lLFxuICAgICAgICAgIHRvV29yZHMoZmllbGQubmFtZSwgdHJ1ZSksXG4gICAgICAgICl9UmVsYXRpb25zaGlwSW5wdXRgXG4gICAgICAgIHR5cGUgPSBuZXcgR3JhcGhRTElucHV0T2JqZWN0VHlwZSh7XG4gICAgICAgICAgbmFtZTogZnVsbE5hbWUsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICByZWxhdGlvblRvOiB7XG4gICAgICAgICAgICAgIHR5cGU6IG5ldyBHcmFwaFFMRW51bVR5cGUoe1xuICAgICAgICAgICAgICAgIG5hbWU6IGAke2Z1bGxOYW1lfVJlbGF0aW9uVG9gLFxuICAgICAgICAgICAgICAgIHZhbHVlczogcmVsYXRpb25Uby5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAodmFsdWVzLCBvcHRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1hdE5hbWUob3B0aW9uKV06IHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb3B0aW9uLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2YWx1ZTogeyB0eXBlOiBHcmFwaFFMSlNPTiB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlID0gZ2V0Q29sbGVjdGlvbklEVHlwZShwYXlsb2FkLCBwYXlsb2FkLmNvbGxlY3Rpb25zW3JlbGF0aW9uVG9dLmNvbmZpZylcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgICBbZmllbGQubmFtZV06IHsgdHlwZTogZmllbGQuaGFzTWFueSA/IG5ldyBHcmFwaFFMTGlzdCh0eXBlKSA6IHR5cGUgfSxcbiAgICAgIH1cbiAgICB9LFxuICAgIHJpY2hUZXh0OiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBSaWNoVGV4dEZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIEdyYXBoUUxKU09OLCBmb3JjZU51bGxhYmxlKSB9LFxuICAgIH0pLFxuICAgIHJvdzogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogUm93RmllbGQpID0+XG4gICAgICBmaWVsZC5maWVsZHMucmVkdWNlKChhY2MsIHN1YkZpZWxkOiBGaWVsZCkgPT4ge1xuICAgICAgICBjb25zdCBhZGRTdWJGaWVsZCA9IGZpZWxkVG9TY2hlbWFNYXBbc3ViRmllbGQudHlwZV1cbiAgICAgICAgaWYgKGFkZFN1YkZpZWxkKSByZXR1cm4gYWRkU3ViRmllbGQoYWNjLCBzdWJGaWVsZClcbiAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgfSwgaW5wdXRPYmplY3RUeXBlQ29uZmlnKSxcbiAgICBzZWxlY3Q6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IFNlbGVjdEZpZWxkKSA9PiB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWROYW1lID0gYCR7Y29tYmluZVBhcmVudE5hbWUocGFyZW50TmFtZSwgZmllbGQubmFtZSl9X011dGF0aW9uSW5wdXRgXG4gICAgICBsZXQgdHlwZTogR3JhcGhRTFR5cGUgPSBuZXcgR3JhcGhRTEVudW1UeXBlKHtcbiAgICAgICAgbmFtZTogZm9ybWF0dGVkTmFtZSxcbiAgICAgICAgdmFsdWVzOiBmaWVsZC5vcHRpb25zLnJlZHVjZSgodmFsdWVzLCBvcHRpb24pID0+IHtcbiAgICAgICAgICBpZiAob3B0aW9uSXNPYmplY3Qob3B0aW9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4udmFsdWVzLFxuICAgICAgICAgICAgICBbZm9ybWF0TmFtZShvcHRpb24udmFsdWUpXToge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb24udmFsdWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnZhbHVlcyxcbiAgICAgICAgICAgIFtmb3JtYXROYW1lKG9wdGlvbildOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBvcHRpb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgfSwge30pLFxuICAgICAgfSlcblxuICAgICAgdHlwZSA9IGZpZWxkLmhhc01hbnkgPyBuZXcgR3JhcGhRTExpc3QodHlwZSkgOiB0eXBlXG4gICAgICB0eXBlID0gd2l0aE51bGxhYmxlVHlwZShmaWVsZCwgdHlwZSwgZm9yY2VOdWxsYWJsZSlcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgICBbZmllbGQubmFtZV06IHsgdHlwZSB9LFxuICAgICAgfVxuICAgIH0sXG4gICAgdGFiczogKGlucHV0T2JqZWN0VHlwZUNvbmZpZzogSW5wdXRPYmplY3RUeXBlQ29uZmlnLCBmaWVsZDogVGFic0ZpZWxkKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGQudGFicy5yZWR1Y2UoKGFjYywgdGFiKSA9PiB7XG4gICAgICAgIGlmICh0YWJIYXNOYW1lKHRhYikpIHtcbiAgICAgICAgICBjb25zdCBmdWxsTmFtZSA9IGNvbWJpbmVQYXJlbnROYW1lKHBhcmVudE5hbWUsIHRvV29yZHModGFiLm5hbWUsIHRydWUpKVxuICAgICAgICAgIGNvbnN0IHJlcXVpcmVzQXRMZWFzdE9uZUZpZWxkID0gZ3JvdXBPclRhYkhhc1JlcXVpcmVkU3ViZmllbGQoZmllbGQpXG4gICAgICAgICAgbGV0IHR5cGU6IEdyYXBoUUxUeXBlID0gYnVpbGRNdXRhdGlvbklucHV0VHlwZShwYXlsb2FkLCBmdWxsTmFtZSwgdGFiLmZpZWxkcywgZnVsbE5hbWUpXG5cbiAgICAgICAgICBpZiAoIXR5cGUpIHJldHVybiBhY2NcblxuICAgICAgICAgIGlmIChyZXF1aXJlc0F0TGVhc3RPbmVGaWVsZCkgdHlwZSA9IG5ldyBHcmFwaFFMTm9uTnVsbCh0eXBlKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgICBbdGFiLm5hbWVdOiB7IHR5cGUgfSxcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICAuLi50YWIuZmllbGRzLnJlZHVjZSgoc3ViRmllbGRTY2hlbWEsIHN1YkZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhZGRTdWJGaWVsZCA9IGZpZWxkVG9TY2hlbWFNYXBbc3ViRmllbGQudHlwZV1cbiAgICAgICAgICAgIGlmIChhZGRTdWJGaWVsZCkgcmV0dXJuIGFkZFN1YkZpZWxkKHN1YkZpZWxkU2NoZW1hLCBzdWJGaWVsZClcbiAgICAgICAgICAgIHJldHVybiBzdWJGaWVsZFNjaGVtYVxuICAgICAgICAgIH0sIGFjYyksXG4gICAgICAgIH1cbiAgICAgIH0sIGlucHV0T2JqZWN0VHlwZUNvbmZpZylcbiAgICB9LFxuICAgIHRleHQ6IChpbnB1dE9iamVjdFR5cGVDb25maWc6IElucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQ6IFRleHRGaWVsZCkgPT4gKHtcbiAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgIFtmaWVsZC5uYW1lXToge1xuICAgICAgICB0eXBlOiB3aXRoTnVsbGFibGVUeXBlKFxuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIGZpZWxkLmhhc01hbnkgPT09IHRydWUgPyBuZXcgR3JhcGhRTExpc3QoR3JhcGhRTFN0cmluZykgOiBHcmFwaFFMU3RyaW5nLFxuICAgICAgICAgIGZvcmNlTnVsbGFibGUsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgIH0pLFxuICAgIHRleHRhcmVhOiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBUZXh0YXJlYUZpZWxkKSA9PiAoe1xuICAgICAgLi4uaW5wdXRPYmplY3RUeXBlQ29uZmlnLFxuICAgICAgW2ZpZWxkLm5hbWVdOiB7IHR5cGU6IHdpdGhOdWxsYWJsZVR5cGUoZmllbGQsIEdyYXBoUUxTdHJpbmcsIGZvcmNlTnVsbGFibGUpIH0sXG4gICAgfSksXG4gICAgdXBsb2FkOiAoaW5wdXRPYmplY3RUeXBlQ29uZmlnOiBJbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkOiBVcGxvYWRGaWVsZCkgPT4gKHtcbiAgICAgIC4uLmlucHV0T2JqZWN0VHlwZUNvbmZpZyxcbiAgICAgIFtmaWVsZC5uYW1lXTogeyB0eXBlOiB3aXRoTnVsbGFibGVUeXBlKGZpZWxkLCBHcmFwaFFMU3RyaW5nLCBmb3JjZU51bGxhYmxlKSB9LFxuICAgIH0pLFxuICB9XG5cbiAgY29uc3QgZmllbGROYW1lID0gZm9ybWF0TmFtZShuYW1lKVxuXG4gIGNvbnN0IGZpZWxkU2NoZW1hcyA9IGZpZWxkcy5yZWR1Y2UoKGlucHV0T2JqZWN0VHlwZUNvbmZpZywgZmllbGQpID0+IHtcbiAgICBjb25zdCBmaWVsZFNjaGVtYSA9IGZpZWxkVG9TY2hlbWFNYXBbZmllbGQudHlwZV1cblxuICAgIGlmICh0eXBlb2YgZmllbGRTY2hlbWEgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpbnB1dE9iamVjdFR5cGVDb25maWdcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWEgPSBmaWVsZFNjaGVtYShpbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkKVxuICAgIGlmIChPYmplY3Qua2V5cyhzY2hlbWEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGlucHV0T2JqZWN0VHlwZUNvbmZpZ1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5pbnB1dE9iamVjdFR5cGVDb25maWcsXG4gICAgICAuLi5maWVsZFNjaGVtYShpbnB1dE9iamVjdFR5cGVDb25maWcsIGZpZWxkKSxcbiAgICB9XG4gIH0sIHt9KVxuXG4gIGlmIChPYmplY3Qua2V5cyhmaWVsZFNjaGVtYXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gbmV3IEdyYXBoUUxJbnB1dE9iamVjdFR5cGUoe1xuICAgIG5hbWU6IGBtdXRhdGlvbiR7ZmllbGROYW1lfUlucHV0YCxcbiAgICBmaWVsZHM6IGZpZWxkU2NoZW1hcyxcbiAgfSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgYnVpbGRNdXRhdGlvbklucHV0VHlwZVxuIl0sIm5hbWVzIjpbImdldENvbGxlY3Rpb25JRFR5cGUiLCJpZEZpZWxkVHlwZXMiLCJudW1iZXIiLCJHcmFwaFFMSW50IiwidGV4dCIsIkdyYXBoUUxTdHJpbmciLCJwYXlsb2FkIiwiY29sbGVjdGlvbiIsImlkRmllbGQiLCJmbGF0dGVuRmllbGRzIiwiZmllbGRzIiwiZmluZCIsImZpZWxkIiwiZmllbGRBZmZlY3RzRGF0YSIsIm5hbWUiLCJkYiIsImRlZmF1bHRJRFR5cGUiLCJ0eXBlIiwiYnVpbGRNdXRhdGlvbklucHV0VHlwZSIsInBhcmVudE5hbWUiLCJmb3JjZU51bGxhYmxlIiwiZmllbGRUb1NjaGVtYU1hcCIsImFycmF5IiwiaW5wdXRPYmplY3RUeXBlQ29uZmlnIiwiZnVsbE5hbWUiLCJjb21iaW5lUGFyZW50TmFtZSIsInRvV29yZHMiLCJHcmFwaFFMTGlzdCIsIndpdGhOdWxsYWJsZVR5cGUiLCJibG9ja3MiLCJHcmFwaFFMSlNPTiIsImNoZWNrYm94IiwiR3JhcGhRTEJvb2xlYW4iLCJjb2RlIiwiY29sbGFwc2libGUiLCJyZWR1Y2UiLCJhY2MiLCJzdWJGaWVsZCIsImFkZFN1YkZpZWxkIiwiZGF0ZSIsImVtYWlsIiwiZ3JvdXAiLCJyZXF1aXJlc0F0TGVhc3RPbmVGaWVsZCIsImdyb3VwT3JUYWJIYXNSZXF1aXJlZFN1YmZpZWxkIiwiR3JhcGhRTE5vbk51bGwiLCJqc29uIiwiR3JhcGhRTEZsb2F0IiwiaGFzTWFueSIsInBvaW50IiwicmFkaW8iLCJyZWxhdGlvbnNoaXAiLCJyZWxhdGlvblRvIiwiQXJyYXkiLCJpc0FycmF5IiwiR3JhcGhRTElucHV0T2JqZWN0VHlwZSIsIkdyYXBoUUxFbnVtVHlwZSIsInZhbHVlcyIsIm9wdGlvbiIsImZvcm1hdE5hbWUiLCJ2YWx1ZSIsImNvbGxlY3Rpb25zIiwiY29uZmlnIiwicmljaFRleHQiLCJyb3ciLCJzZWxlY3QiLCJmb3JtYXR0ZWROYW1lIiwib3B0aW9ucyIsIm9wdGlvbklzT2JqZWN0IiwidGFicyIsInRhYiIsInRhYkhhc05hbWUiLCJzdWJGaWVsZFNjaGVtYSIsInRleHRhcmVhIiwidXBsb2FkIiwiZmllbGROYW1lIiwiZmllbGRTY2hlbWFzIiwiZmllbGRTY2hlbWEiLCJzY2hlbWEiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIl0sInJhbmdlTWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7IiwibWFwcGluZ3MiOiJBQUFBLHVDQUF1Qzs7Ozs7Ozs7Ozs7SUFpVXZDLE9BQXFDO2VBQXJDOztJQTNRYUEsbUJBQW1CO2VBQW5CQTs7O3lCQTFDTjtpQ0FDcUI7dUJBNEJpQzs4RUFDbkM7OEJBQ0Y7K0NBQ3NCOzBFQUNoQjttRUFDUDt5RUFDTTs7Ozs7O0FBRTdCLE1BQU1DLGVBQWU7SUFDbkJDLFFBQVFDLG1CQUFVO0lBQ2xCQyxNQUFNQyxzQkFBYTtBQUNyQjtBQUVPLE1BQU1MLHNCQUFzQixDQUNqQ00sU0FDQUM7SUFFQSxNQUFNQyxVQUFVQyxJ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