@valueflows/vf-graphql-holochain
Version:
GraphQL schema bindings for the Holochain implementation of ValueFlows
206 lines • 51.4 kB
JavaScript
import Query from "../queries/index.js";
import Mutation from "../mutations/index.js";
import Agent from "./agent.js";
import { getOne } from "../queries/helpers.js";
import { getCollection, getCollectionLinks, getAction } from "../util.js";
import { encodeHashToBase64 } from "@holochain/client";
import { getLastUpdateTime } from "../store.js";
export const generateResolvers = (cell) => {
const get = async (entryType, id, info) => {
if (!id)
return null;
const isOnlyIdRequested = info.fieldNodes[0].selectionSet?.selections.every(selection => selection.kind === "Field" && selection.name.value === "id");
if (isOnlyIdRequested)
return { id: encodeHashToBase64(id) };
const output = await getOne(cell, entryType, { id: encodeHashToBase64(id) });
return output;
};
const getMany = async (func, fromId, info) => {
if (!fromId)
return null;
const isOnlyIdOrRevisionIdRequested = info.fieldNodes[0].selectionSet?.selections.every(selection => selection.kind === "Field" && (selection.name.value === "id" || selection.name.value === "revisionId"));
if (isOnlyIdOrRevisionIdRequested) {
const links = await getCollectionLinks(cell, func, fromId);
return links.map((link) => {
return {
id: encodeHashToBase64(link.tag),
revisionId: encodeHashToBase64(link.target)
};
});
}
return await getCollection(cell, func, fromId);
};
const getList = async (entryType, list, info) => {
return (await Promise.all((list || [])
.map((address) => get(entryType, address, info))))
.filter((item) => item !== null);
};
const getMeta = async (record) => {
return {
retrievedRevision: {
id: record.id,
time: getLastUpdateTime(record.id),
}
};
};
const res = Object.assign({
Query: Query(cell),
Mutation: Mutation(cell),
Agent: Agent(cell),
Agreement: {
meta: async function (record, args, context, info) { return getMeta(record); },
commitments: async function (record, args, context, info) {
return await getMany('get_rea_commitments_for_rea_agreement', record.id, info);
},
economicEvents: async function (record, args, context, info) {
return await getMany('get_rea_economic_events_for_rea_agreement', record.id, info);
},
},
Commitment: {
meta: async function (record, args, context, info) { return getMeta(record); },
outputOf: async function (record, args, context, info) { return get('process', record.outputOf, info); },
inputOf: async function (record, args, context, info) { return get('process', record.inputOf, info); },
receiver: async function (record, args, context, info) { return get('agent', record.receiver, info); },
provider: async function (record, args, context, info) { return get('agent', record.provider, info); },
clauseOf: async function (record, args, context, info) { return get('agreement', record.clauseOf, info); },
plannedWithin: async function (record, args, context, info) { return get('plan', record.plannedWithin, info); },
independentDemandOf: async function (record, args, context, info) { return get('plan', record.independentDemandOf, info); },
fulfilledBy: async function (record, args, context, info) { return getMany('get_fulfilling_economic_events_for_commitment', record.id, info); },
satisfies: async function (record, args, context, info) { return get('intent', record.satisfies, info); },
action: function (record, args, context, info) { return getAction(record.action); },
},
EconomicEvent: {
meta: async function (record, args, context, info) { return getMeta(record); },
resourceInventoriedAs: async function (record, args, context, info) { return get('economic_resource', record.resourceInventoriedAs, info); },
toResourceInventoriedAs: async function (record, args, context, info) { return get('economic_resource', record.toResourceInventoriedAs, info); },
inputOf: async function (record, args, context, info) { return get('economic_event', record.inputOf, info); },
outputOf: async function (record, args, context, info) { return get('economic_event', record.outputOf, info); },
provider: async function (record, args, context, info) { return get('agent', record.provider, info); },
receiver: async function (record, args, context, info) { return get('agent', record.receiver, info); },
fulfills: async function (record, args, context, info) { return getList('commitment', record.fulfills, info); },
satisfies: async function (record, args, context, info) { return getList('intent', record.satisfies, info); },
resourceConformsTo: async function (record, args, context, info) { return get('resource', record.resourceConformsTo, info); },
action: function (record, args, context, info) { return getAction(record.action); },
realizationOf: async function (record, args, context, info) { return get('agreement', record.realizationOf, info); },
},
EconomicResource: {
meta: async function (record, args, context, info) { return getMeta(record); },
containedIn: async function (record, args, context, info) {
return getMany('get_rea_economic_resources_for_rea_economic_resource', record.contained_in, info);
},
contains: async function (record, args, context, info) {
return getMany('get_rea_economic_resources_for_rea_economic_resource', record.id, info);
},
conformsTo: async function (record, args, context, info) { return get('resource_specification', record.conformsTo, info); },
stage: async function (record, args, context, info) { return get('process_specification', record.stage, info); },
state: function (record, args, context, info) { return getAction(record.state); },
unitOfEffort: async function (record, args, context, info) { return get('unit', record.unitOfEffort, info); },
primaryAccountable: async function (record, args, context, info) { return get('agent', record.primaryAccountable, info); },
},
Intent: {
meta: async function (record, args, context, info) { return getMeta(record); },
satisfiedBy: async function (record, args, context, info) {
return getMany('get_satisfying_comitments_for_rea_intent', record.id, info);
},
observedBy: async function (record, args, context, info) {
return getMany('get_satisfying_economic_events_for_rea_intent', record.id, info);
},
provider: async function (record, args, context, info) { return get('agent', record.provider, info); },
receiver: async function (record, args, context, info) { return get('agent', record.receiver, info); },
inputOf: async function (record, args, context, info) { return get('process', record.inputOf, info); },
outputOf: async function (record, args, context, info) { return get('process', record.outputOf, info); },
// publishedIn: async function (record, args, context, info) { return get('proposed_intent', record.publishedIn, info) },
resourceConformsTo: async function (record, args, context, info) { return get('resource_specification', record.resourceConformsTo, info); },
action: function (record, args, context, info) { return getAction(record.action); },
},
Measure: {
hasUnit: async function (record, args, context, info) {
const unit = await get('unit', record.hasUnit, info);
return unit ? unit : null;
},
},
Plan: {
meta: async function (record, args, context, info) { return getMeta(record); },
processes: async function (record, args, context, info) {
return getMany('get_rea_processes_for_rea_plan', record.id, info);
},
independentDemands: async function (record, args, context, info) {
return getMany('get_independent_demands_for_rea_plan', record.id, info);
},
nonProcessCommitments: async function (record, args, context, info) {
return getMany('get_rea_commitments_for_rea_plan', record.id, info);
},
inScopeOf: async function (record, args, context, info) { return getList('agent', record.inScopeOf, info); },
},
Process: {
meta: async function (record, args, context, info) { return getMeta(record); },
observedInputs: async function (record, args, context, info) {
return getMany('get_rea_economic_event_inputs_for_rea_process', record.id, info);
},
observedOutputs: async function (record, args, context, info) {
return getMany('get_rea_economic_event_outputs_for_rea_process', record.id, info);
},
committedInputs: async function (record, args, context, info) {
return getMany('get_inputs_for_rea_process', record.id, info);
},
committedOutputs: async function (record, args, context, info) {
return getMany('get_outputs_for_rea_process', record.id, info);
},
intendedInputs: async function (record, args, context, info) {
return getMany('get_rea_intents_for_rea_process_inputs', record.id, info);
},
intendedOutputs: async function (record, args, context, info) {
return getMany('get_rea_intents_for_rea_process_outputs', record.id, info);
},
basedOn: async function (record, args, context, info) { return getOne(cell, 'process_specification', { id: record.basedOn }); },
plannedWithin: async function (record, args, context, info) { return get('plan', record.plannedWithin, info); },
inScopeOf: async function (record, args, context, info) { return getList('agent', record.inScopeOf, info); }
},
Proposal: {
meta: async function (record, args, context, info) { return getMeta(record); },
publishes: async function (record, args, context, info) { return getList('intent', record.publishes, info); },
reciprocal: async function (record, args, context, info) { return getList('intent', record.publishes, info); },
proposedTo: async function (record, args, context, info) { return getList('agent', record.proposedTo, info); },
inScopeOf: async function (record, args, context, info) { return getList('agent', record.inScopeOf, info); },
},
RecipeExchange: {
meta: async function (record, args, context, info) { return getMeta(record); },
recipeClauses: async function (record, args, context, info) {
return getMany('get_rea_recipe_clauses_for_rea_recipe_exchange', record.id, info);
},
recipeReciprocalClauses: async function (record, args, context, info) {
return getMany('get_rea_recipe_reciprocal_clauses_for_rea_recipe_exchange', record.id, info);
},
},
RecipeFlow: {
meta: async function (record, args, context, info) { return getMeta(record); },
recipeInputOf: async function (record, args, context, info) { return get('recipe_process', record.recipeInputOf, info); },
recipeOutputOf: async function (record, args, context, info) { return get('recipe_process', record.recipeOutputOf, info); },
recipeClauseOf: async function (record, args, context, info) { return get('recipe_exchange', record.recipeClauseOf, info); },
recipeReciprocalClauseOf: async function (record, args, context, info) { return get('recipe_exchange', record.recipeReciprocalClauseOf, info); },
resourceConformsTo: async function (record, args, context, info) { return get('resource_specification', record.resourceConformsTo, info); },
stage: async function (record, args, context, info) { return get('process_specification', record.stage, info); },
action: function (record, args, context, info) { return getAction(record.action); },
},
RecipeProcess: {
meta: async function (record, args, context, info) { return getMeta(record); },
recipeInputs: async function (record, args, context, info) {
return getMany('get_rea_recipe_flow_inputs_for_rea_recipe_process', record.id, info);
},
recipeOutputs: async function (record, args, context, info) {
return getMany('get_rea_recipe_flow_outputs_for_rea_recipe_process', record.id, info);
},
processConformsTo: async function (record, args, context, info) { return get('process_specification', record.processConformsTo, info); },
},
ResourceSpecification: {
meta: async function (record, args, context, info) { return getMeta(record); },
// conformingResources: async function (record, args, context, info) {
// return getMany('economic_resource', '', record.id, info)
// },
defaultUnitOfResource: async function (record, args, context, info) { return get('unit', record.defaultUnitOfResource, info); },
defaultUnitOfEffort: async function (record, args, context, info) { return get('unit', record.defaultUnitOfEffort, info); },
},
});
return res;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVzb2x2ZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLHFCQUFxQixDQUFBO0FBQ3ZDLE9BQU8sUUFBUSxNQUFNLHVCQUF1QixDQUFBO0FBQzVDLE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQTtBQUM5QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFBO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsSUFBUyxFQUFFLEVBQUU7SUFDM0MsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsSUFBd0IsRUFBRSxFQUFFO1FBQzFELElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDckIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsS0FBSyxDQUN2RSxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FDM0UsQ0FBQztRQUNGLElBQUksaUJBQWlCO1lBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzdELE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUUsa0JB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LFdBQVcsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFJLE9BQU8sR0FBRyxDQUFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsQ0FBQSxDQUFDLENBQUM7WUFDL0ksT0FBTyxFQUFFLEtBQUssV0FBVyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLElBQUksT0FBTyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQSxDQUFDLENBQUM7WUFDNUcsUUFBUSxFQUFFLEtBQUssV0FBVyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLElBQUksT0FBTyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQSxDQUFDLENBQUM7WUFDOUcsUUFBUSxFQUFFLEtBQUssV0FBVyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLElBQUksT0FBTyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUEsQ0FBQyxDQUFDO1lBQ3JHLFFBQVEsRUFBRSxLQUFLLFdBQVcsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFJLE9BQU8sR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBLENBQUMsQ0FBQztZQUNyRyxRQUFRLEVBQUUsS0FBSyxXQUFXLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksSUFBSSxPQUFPLE9BQU8sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQSxDQUFDLENBQUM7WUFDOUcsU0FBUyxFQUFFLEtBQUssV0FBVyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLElBQUksT0FBTyxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0s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SUFBSSxPQUFPLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFBLENBQUMsQ0FBQztTQUM3SDtLQUNKLENBQUMsQ0FBQTtJQUNGLE9BQU8sR0FBRyxDQUFBO0FBQ2QsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFF1ZXJ5IGZyb20gXCIuLi9xdWVyaWVzL2luZGV4LmpzXCJcbmltcG9ydCBNdXRhdGlvbiBmcm9tIFwiLi4vbXV0YXRpb25zL2luZGV4LmpzXCJcbmltcG9ydCBBZ2VudCBmcm9tIFwiLi9hZ2VudC5qc1wiXG5pbXBvcnQgeyBnZXRPbmUgfSBmcm9tIFwiLi4vcXVlcmllcy9oZWxwZXJzLmpzXCJcbmltcG9ydCB7IGdldENvbGxlY3Rpb24sIGdldENvbGxlY3Rpb25MaW5rcywgZ2V0QWN0aW9uIH0gZnJvbSBcIi4uL3V0aWwuanNcIlxuaW1wb3J0IHsgZW5jb2RlSGFzaFRvQmFzZTY0IH0gZnJvbSBcIkBob2xvY2hhaW4vY2xpZW50XCJcbmltcG9ydCB7IEdyYXBoUUxSZXNvbHZlSW5mbyB9IGZyb20gXCJncmFwaHFsXCI7XG5pbXBvcnQgeyBnZXRMYXN0VXBkYXRlVGltZSB9IGZyb20gXCIuLi9zdG9yZS5qc1wiXG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVJlc29sdmVycyA9IChjZWxsOiBhbnkpID0+IHtcbiAgICBjb25zdCBnZXQgPSBhc3luYyAoZW50cnlUeXBlLCBpZCwgaW5mbzogR3JhcGhRTFJlc29sdmVJbmZvKSA9PiB7XG4gICAgICAgIGlmICghaWQpIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBpc09ubHlJZFJlcXVlc3RlZCA9IGluZm8uZmllbGROb2Rlc1swXS5zZWxlY3Rpb25TZXQ/LnNlbGVjdGlvbnMuZXZlcnkoXG4gICAgICAgICAgICBzZWxlY3Rpb24gPT4gc2VsZWN0aW9uLmtpbmQgPT09IFwiRmllbGRcIiAmJiBzZWxlY3Rpb24ubmFtZS52YWx1ZSA9PT0gXCJpZFwiXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpc09ubHlJZFJlcXVlc3RlZCkgcmV0dXJuIHsgaWQ6IGVuY29kZUhhc2hUb0Jhc2U2NChpZCkgfTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZ2V0T25lKGNlbGwsIGVudHJ5VHlwZSwgeyBpZDogZW5jb2RlSGFzaFRvQmFzZTY0KGlkKSB9KTtcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG4gICAgY29uc3QgZ2V0TWFueSA9IGFzeW5jIChmdW5jLCBmcm9tSWQsIGluZm86IEdyYXBoUUxSZXNvbHZlSW5mbykgPT4ge1xuICAgICAgICBpZiAoIWZyb21JZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGlzT25seUlkT3JSZXZpc2lvbklkUmVxdWVzdGVkID0gaW5mby5maWVsZE5vZGVzWzBdLnNlbGVjdGlvblNldD8uc2VsZWN0aW9ucy5ldmVyeShcbiAgICAgICAgICAgIHNlbGVjdGlvbiA9PiBzZWxlY3Rpb24ua2luZCA9PT0gXCJGaWVsZFwiICYmIChzZWxlY3Rpb24ubmFtZS52YWx1ZSA9PT0gXCJpZFwiIHx8IHNlbGVjdGlvbi5uYW1lLnZhbHVlID09PSBcInJldmlzaW9uSWRcIilcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGlzT25seUlkT3JSZXZpc2lvbklkUmVxdWVzdGVkKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5rcyA9IGF3YWl0IGdldENvbGxlY3Rpb25MaW5rcyhjZWxsLCBmdW5jLCBmcm9tSWQpO1xuICAgICAgICAgICAgcmV0dXJuIGxpbmtzLm1hcCgobGluazogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVuY29kZUhhc2hUb0Jhc2U2NChsaW5rLnRhZyksXG4gICAgICAgICAgICAgICAgICAgIHJldmlzaW9uSWQ6IGVuY29kZUhhc2hUb0Jhc2U2NChsaW5rLnRhcmdldClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBnZXRDb2xsZWN0aW9uKGNlbGwsIGZ1bmMsIGZyb21JZCk7XG4gICAgfVxuICAgIGNvbnN0IGdldExpc3QgPSBhc3luYyAoZW50cnlUeXBlLCBsaXN0LCBpbmZvOiBHcmFwaFFMUmVzb2x2ZUluZm8pID0+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBQcm9taXNlLmFsbCgobGlzdCB8fCBbXSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoYWRkcmVzcyk9PmdldChlbnRyeVR5cGUsIGFkZHJlc3MsIGluZm8pKSkpXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IG51bGwpXG4gICAgfVxuXG4gICAgY29uc3QgZ2V0TWV0YSA9IGFzeW5jIChyZWNvcmQpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJldHJpZXZlZFJldmlzaW9uOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHJlY29yZC5pZCxcbiAgICAgICAgICAgICAgICB0aW1lOiBnZXRMYXN0VXBkYXRlVGltZShyZWNvcmQuaWQpLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIFF1ZXJ5OiBRdWVyeShjZWxsKSxcbiAgICAgICAgTXV0YXRpb246IE11dGF0aW9uKGNlbGwpLFxuICAgICAgICBBZ2VudDogQWdlbnQoY2VsbCksXG4gICAgICAgIEFncmVlbWVudDoge1xuICAgICAgICAgICAgbWV0YTogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge3JldHVybiBnZXRNZXRhKHJlY29yZCl9LFxuICAgICAgICAgICAgY29tbWl0bWVudHM6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZ2V0TWFueSgnZ2V0X3JlYV9jb21taXRtZW50c19mb3JfcmVhX2FncmVlbWVudCcsIHJlY29yZC5pZCwgaW5mbylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlY29ub21pY0V2ZW50czogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBnZXRNYW55KCdnZXRfcmVhX2Vjb25vbWljX2V2ZW50c19mb3JfcmVhX2FncmVlbWVudCcsIHJlY29yZC5pZCwgaW5mbylcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIENvbW1pdG1lbnQ6IHtcbiAgICAgICAgICAgIG1ldGE6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtyZXR1cm4gZ2V0TWV0YShyZWNvcmQpfSxcbiAgICAgICAgICAgIG91dHB1dE9mOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ3Byb2Nlc3MnLCByZWNvcmQub3V0cHV0T2YsIGluZm8pIH0sXG4gICAgICAgICAgICBpbnB1dE9mOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ3Byb2Nlc3MnLCByZWNvcmQuaW5wdXRPZiwgaW5mbykgfSxcbiAgICAgICAgICAgIHJlY2VpdmVyOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ2FnZW50JywgcmVjb3JkLnJlY2VpdmVyLCBpbmZvKSB9LFxuICAgICAgICAgICAgcHJvdmlkZXI6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldCgnYWdlbnQnLCByZWNvcmQucHJvdmlkZXIsIGluZm8pIH0sXG4gICAgICAgICAgICBjbGF1c2VPZjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdhZ3JlZW1lbnQnLCByZWNvcmQuY2xhdXNlT2YsIGluZm8pIH0sXG4gICAgICAgICAgICBwbGFubmVkV2l0aGluOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ3BsYW4nLCByZWNvcmQucGxhbm5lZFdpdGhpbiwgaW5mbykgfSxcbiAgICAgICAgICAgIGluZGVwZW5kZW50RGVtYW5kT2Y6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldCgncGxhbicsIHJlY29yZC5pbmRlcGVuZGVudERlbWFuZE9mLCBpbmZvKSB9LFxuICAgICAgICAgICAgZnVsZmlsbGVkQnk6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldE1hbnkoJ2dldF9mdWxmaWxsaW5nX2Vjb25vbWljX2V2ZW50c19mb3JfY29tbWl0bWVudCcsIHJlY29yZC5pZCwgaW5mbykgfSxcbiAgICAgICAgICAgIHNhdGlzZmllczogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdpbnRlbnQnLCByZWNvcmQuc2F0aXNmaWVzLCBpbmZvKSB9LFxuICAgICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXRBY3Rpb24ocmVjb3JkLmFjdGlvbikgfSxcbiAgICAgICAgfSxcbiAgICAgICAgRWNvbm9taWNFdmVudDoge1xuICAgICAgICAgICAgbWV0YTogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge3JldHVybiBnZXRNZXRhKHJlY29yZCl9LFxuICAgICAgICAgICAgcmVzb3VyY2VJbnZlbnRvcmllZEFzOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ2Vjb25vbWljX3Jlc291cmNlJywgcmVjb3JkLnJlc291cmNlSW52ZW50b3JpZWRBcywgaW5mbykgfSxcbiAgICAgICAgICAgIHRvUmVzb3VyY2VJbnZlbnRvcmllZEFzOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ2Vjb25vbWljX3Jlc291cmNlJywgcmVjb3JkLnRvUmVzb3VyY2VJbnZlbnRvcmllZEFzLCBpbmZvKSB9LFxuICAgICAgICAgICAgaW5wdXRPZjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdlY29ub21pY19ldmVudCcsIHJlY29yZC5pbnB1dE9mLCBpbmZvKSB9LFxuICAgICAgICAgICAgb3V0cHV0T2Y6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldCgnZWNvbm9taWNfZXZlbnQnLCByZWNvcmQub3V0cHV0T2YsIGluZm8pIH0sXG4gICAgICAgICAgICBwcm92aWRlcjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdhZ2VudCcsIHJlY29yZC5wcm92aWRlciwgaW5mbykgfSxcbiAgICAgICAgICAgIHJlY2VpdmVyOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ2FnZW50JywgcmVjb3JkLnJlY2VpdmVyLCBpbmZvKSB9LFxuICAgICAgICAgICAgZnVsZmlsbHM6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldExpc3QoJ2NvbW1pdG1lbnQnLCByZWNvcmQuZnVsZmlsbHMsIGluZm8pIH0sXG4gICAgICAgICAgICBzYXRpc2ZpZXM6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldExpc3QoJ2ludGVudCcsIHJlY29yZC5zYXRpc2ZpZXMsIGluZm8pIH0sXG4gICAgICAgICAgICByZXNvdXJjZUNvbmZvcm1zVG86IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldCgncmVzb3VyY2UnLCByZWNvcmQucmVzb3VyY2VDb25mb3Jtc1RvLCBpbmZvKSB9LFxuICAgICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXRBY3Rpb24ocmVjb3JkLmFjdGlvbikgfSxcbiAgICAgICAgICAgIHJlYWxpemF0aW9uT2Y6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldCgnYWdyZWVtZW50JywgcmVjb3JkLnJlYWxpemF0aW9uT2YsIGluZm8pIH0sXG4gICAgICAgIH0sXG4gICAgICAgIEVjb25vbWljUmVzb3VyY2U6IHtcbiAgICAgICAgICAgIG1ldGE6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtyZXR1cm4gZ2V0TWV0YShyZWNvcmQpfSxcbiAgICAgICAgICAgIGNvbnRhaW5lZEluOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldE1hbnkoJ2dldF9yZWFfZWNvbm9taWNfcmVzb3VyY2VzX2Zvcl9yZWFfZWNvbm9taWNfcmVzb3VyY2UnLCByZWNvcmQuY29udGFpbmVkX2luLCBpbmZvKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRhaW5zOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldE1hbnkoJ2dldF9yZWFfZWNvbm9taWNfcmVzb3VyY2VzX2Zvcl9yZWFfZWNvbm9taWNfcmVzb3VyY2UnLCByZWNvcmQuaWQsIGluZm8pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZm9ybXNUbzogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdyZXNvdXJjZV9zcGVjaWZpY2F0aW9uJywgcmVjb3JkLmNvbmZvcm1zVG8sIGluZm8pIH0sXG4gICAgICAgICAgICBzdGFnZTogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdwcm9jZXNzX3NwZWNpZmljYXRpb24nLCByZWNvcmQuc3RhZ2UsIGluZm8pIH0sXG4gICAgICAgICAgICBzdGF0ZTogZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0QWN0aW9uKHJlY29yZC5zdGF0ZSkgfSxcbiAgICAgICAgICAgIHVuaXRPZkVmZm9ydDogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCd1bml0JywgcmVjb3JkLnVuaXRPZkVmZm9ydCwgaW5mbykgfSxcbiAgICAgICAgICAgIHByaW1hcnlBY2NvdW50YWJsZTogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdhZ2VudCcsIHJlY29yZC5wcmltYXJ5QWNjb3VudGFibGUsIGluZm8pIH0sXG4gICAgICAgIH0sXG4gICAgICAgIEludGVudDoge1xuICAgICAgICAgICAgbWV0YTogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge3JldHVybiBnZXRNZXRhKHJlY29yZCl9LFxuICAgICAgICAgICAgc2F0aXNmaWVkQnk6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TWFueSgnZ2V0X3NhdGlzZnlpbmdfY29taXRtZW50c19mb3JfcmVhX2ludGVudCcsIHJlY29yZC5pZCwgaW5mbylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvYnNlcnZlZEJ5OiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldE1hbnkoJ2dldF9zYXRpc2Z5aW5nX2Vjb25vbWljX2V2ZW50c19mb3JfcmVhX2ludGVudCcsIHJlY29yZC5pZCwgaW5mbylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm92aWRlcjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdhZ2VudCcsIHJlY29yZC5wcm92aWRlciwgaW5mbykgfSxcbiAgICAgICAgICAgIHJlY2VpdmVyOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ2FnZW50JywgcmVjb3JkLnJlY2VpdmVyLCBpbmZvKSB9LFxuICAgICAgICAgICAgaW5wdXRPZjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdwcm9jZXNzJywgcmVjb3JkLmlucHV0T2YsIGluZm8pIH0sXG4gICAgICAgICAgICBvdXRwdXRPZjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdwcm9jZXNzJywgcmVjb3JkLm91dHB1dE9mLCBpbmZvKSB9LFxuICAgICAgICAgICAgLy8gcHVibGlzaGVkSW46IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldCgncHJvcG9zZWRfaW50ZW50JywgcmVjb3JkLnB1Ymxpc2hlZEluLCBpbmZvKSB9LFxuICAgICAgICAgICAgcmVzb3VyY2VDb25mb3Jtc1RvOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ3Jlc291cmNlX3NwZWNpZmljYXRpb24nLCByZWNvcmQucmVzb3VyY2VDb25mb3Jtc1RvLCBpbmZvKSB9LFxuICAgICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXRBY3Rpb24ocmVjb3JkLmFjdGlvbikgfSxcbiAgICAgICAgfSxcbiAgICAgICAgTWVhc3VyZToge1xuICAgICAgICAgICAgaGFzVW5pdDogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyBcbiAgICAgICAgICAgICAgICBjb25zdCB1bml0ID0gYXdhaXQgZ2V0KCd1bml0JywgcmVjb3JkLmhhc1VuaXQsIGluZm8pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuaXQgPyB1bml0IDogbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIFBsYW46IHtcbiAgICAgICAgICAgIG1ldGE6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtyZXR1cm4gZ2V0TWV0YShyZWNvcmQpfSxcbiAgICAgICAgICAgIHByb2Nlc3NlczogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyBcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TWFueSgnZ2V0X3JlYV9wcm9jZXNzZXNfZm9yX3JlYV9wbGFuJywgcmVjb3JkLmlkLCBpbmZvKSBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbmRlcGVuZGVudERlbWFuZHM6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TWFueSgnZ2V0X2luZGVwZW5kZW50X2RlbWFuZHNfZm9yX3JlYV9wbGFuJywgcmVjb3JkLmlkLCBpbmZvKSBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBub25Qcm9jZXNzQ29tbWl0bWVudHM6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TWFueSgnZ2V0X3JlYV9jb21taXRtZW50c19mb3JfcmVhX3BsYW4nLCByZWNvcmQuaWQsIGluZm8pIFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluU2NvcGVPZjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0TGlzdCgnYWdlbnQnLCByZWNvcmQuaW5TY29wZU9mLCBpbmZvKSB9LFxuICAgICAgICB9LFxuICAgICAgICBQcm9jZXNzOiB7XG4gICAgICAgICAgICBtZXRhOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7cmV0dXJuIGdldE1ldGEocmVjb3JkKX0sXG4gICAgICAgICAgICBvYnNlcnZlZElucHV0czogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRNYW55KCdnZXRfcmVhX2Vjb25vbWljX2V2ZW50X2lucHV0c19mb3JfcmVhX3Byb2Nlc3MnLCByZWNvcmQuaWQsIGluZm8pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb2JzZXJ2ZWRPdXRwdXRzOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldE1hbnkoJ2dldF9yZWFfZWNvbm9taWNfZXZlbnRfb3V0cHV0c19mb3JfcmVhX3Byb2Nlc3MnLCByZWNvcmQuaWQsIGluZm8pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tbWl0dGVkSW5wdXRzOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldE1hbnkoJ2dldF9pbnB1dHNfZm9yX3JlYV9wcm9jZXNzJywgcmVjb3JkLmlkLCBpbmZvKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbW1pdHRlZE91dHB1dHM6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TWFueSgnZ2V0X291dHB1dHNfZm9yX3JlYV9wcm9jZXNzJywgcmVjb3JkLmlkLCBpbmZvKSBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnRlbmRlZElucHV0czogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRNYW55KCdnZXRfcmVhX2ludGVudHNfZm9yX3JlYV9wcm9jZXNzX2lucHV0cycsIHJlY29yZC5pZCwgaW5mbykgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW50ZW5kZWRPdXRwdXRzOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldE1hbnkoJ2dldF9yZWFfaW50ZW50c19mb3JfcmVhX3Byb2Nlc3Nfb3V0cHV0cycsIHJlY29yZC5pZCwgaW5mbykgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmFzZWRPbjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0T25lKGNlbGwsICdwcm9jZXNzX3NwZWNpZmljYXRpb24nLCB7IGlkOiByZWNvcmQuYmFzZWRPbiB9KSB9LFxuICAgICAgICAgICAgcGxhbm5lZFdpdGhpbjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdwbGFuJywgcmVjb3JkLnBsYW5uZWRXaXRoaW4sIGluZm8pIH0sXG4gICAgICAgICAgICBpblNjb3BlT2Y6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldExpc3QoJ2FnZW50JywgcmVjb3JkLmluU2NvcGVPZiwgaW5mbykgfVxuICAgICAgICB9LFxuICAgICAgICBQcm9wb3NhbDoge1xuICAgICAgICAgICAgbWV0YTogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge3JldHVybiBnZXRNZXRhKHJlY29yZCl9LFxuICAgICAgICAgICAgcHVibGlzaGVzOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXRMaXN0KCdpbnRlbnQnLCByZWNvcmQucHVibGlzaGVzLCBpbmZvKSB9LFxuICAgICAgICAgICAgcmVjaXByb2NhbDogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0TGlzdCgnaW50ZW50JywgcmVjb3JkLnB1Ymxpc2hlcywgaW5mbykgfSxcbiAgICAgICAgICAgIHByb3Bvc2VkVG86IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldExpc3QoJ2FnZW50JywgcmVjb3JkLnByb3Bvc2VkVG8sIGluZm8pIH0sXG4gICAgICAgICAgICBpblNjb3BlT2Y6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldExpc3QoJ2FnZW50JywgcmVjb3JkLmluU2NvcGVPZiwgaW5mbykgfSxcbiAgICAgICAgfSxcbiAgICAgICAgUmVjaXBlRXhjaGFuZ2U6IHtcbiAgICAgICAgICAgIG1ldGE6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtyZXR1cm4gZ2V0TWV0YShyZWNvcmQpfSxcbiAgICAgICAgICAgIHJlY2lwZUNsYXVzZXM6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TWFueSgnZ2V0X3JlYV9yZWNpcGVfY2xhdXNlc19mb3JfcmVhX3JlY2lwZV9leGNoYW5nZScsIHJlY29yZC5pZCwgaW5mbylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWNpcGVSZWNpcHJvY2FsQ2xhdXNlczogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRNYW55KCdnZXRfcmVhX3JlY2lwZV9yZWNpcHJvY2FsX2NsYXVzZXNfZm9yX3JlYV9yZWNpcGVfZXhjaGFuZ2UnLCByZWNvcmQuaWQsIGluZm8pXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBSZWNpcGVGbG93OiB7XG4gICAgICAgICAgICBtZXRhOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7cmV0dXJuIGdldE1ldGEocmVjb3JkKX0sXG4gICAgICAgICAgICByZWNpcGVJbnB1dE9mOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ3JlY2lwZV9wcm9jZXNzJywgcmVjb3JkLnJlY2lwZUlucHV0T2YsIGluZm8pIH0sXG4gICAgICAgICAgICByZWNpcGVPdXRwdXRPZjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdyZWNpcGVfcHJvY2VzcycsIHJlY29yZC5yZWNpcGVPdXRwdXRPZiwgaW5mbykgfSxcbiAgICAgICAgICAgIHJlY2lwZUNsYXVzZU9mOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ3JlY2lwZV9leGNoYW5nZScsIHJlY29yZC5yZWNpcGVDbGF1c2VPZiwgaW5mbykgfSxcbiAgICAgICAgICAgIHJlY2lwZVJlY2lwcm9jYWxDbGF1c2VPZjogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykgeyByZXR1cm4gZ2V0KCdyZWNpcGVfZXhjaGFuZ2UnLCByZWNvcmQucmVjaXBlUmVjaXByb2NhbENsYXVzZU9mLCBpbmZvKSB9LFxuICAgICAgICAgICAgcmVzb3VyY2VDb25mb3Jtc1RvOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXQoJ3Jlc291cmNlX3NwZWNpZmljYXRpb24nLCByZWNvcmQucmVzb3VyY2VDb25mb3Jtc1RvLCBpbmZvKSB9LFxuICAgICAgICAgICAgc3RhZ2U6IGFzeW5jIGZ1bmN0aW9uIChyZWNvcmQsIGFyZ3MsIGNvbnRleHQsIGluZm8pIHsgcmV0dXJuIGdldCgncHJvY2Vzc19zcGVjaWZpY2F0aW9uJywgcmVjb3JkLnN0YWdlLCBpbmZvKSB9LFxuICAgICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7IHJldHVybiBnZXRBY3Rpb24ocmVjb3JkLmFjdGlvbikgfSxcbiAgICAgICAgfSxcbiAgICAgICAgUmVjaXBlUHJvY2Vzczoge1xuICAgICAgICAgICAgbWV0YTogYXN5bmMgZnVuY3Rpb24gKHJlY29yZCwgYXJncywgY29udGV4dCwgaW5mbykge3JldHVybiBnZXRNZXRhKHJlY29yZCl9LFxuICAgICAgICAgICAgcmVjaXBlSW5wdXRzOiBhc3luYyBmdW5jdGlvbiAocmVjb3JkLCBhcmdzLCBjb250ZXh0LCBpbmZvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldE1hbnkoJ2dldF9yZWFfcmVjaXBlX2Zsb3dfaW5wdXRzX2Zvcl9yZWFfcmVjaXBlX3B