@leosprograms/vf-graphql-holochain
Version:
GraphQL schema bindings for the Holochain implementation of ValueFlows
79 lines • 17 kB
JavaScript
/**
* Intent record reference resolvers
*
* @package: HoloREA
* @since: 2019-08-31
*/
import { DEFAULT_VF_MODULES, VfModule } from '../types.js';
import { extractEdges, mapZomeFn } from '../connection.js';
import agentQueries from '../queries/agent.js';
const extractProposedIntent = (data) => data.proposedIntent;
export default (enabledVFModules = DEFAULT_VF_MODULES, dnaConfig, conductorUri) => {
const hasHistory = -1 !== enabledVFModules.indexOf(VfModule.History);
const hasAgent = -1 !== enabledVFModules.indexOf(VfModule.Agent);
const hasSatisfaction = -1 !== enabledVFModules.indexOf(VfModule.Satisfaction);
const hasResourceSpecification = -1 !== enabledVFModules.indexOf(VfModule.ResourceSpecification);
const hasAction = -1 !== enabledVFModules.indexOf(VfModule.Action);
const hasProcess = -1 !== enabledVFModules.indexOf(VfModule.Process);
const hasProposal = -1 !== enabledVFModules.indexOf(VfModule.Proposal);
const hasObservation = -1 !== enabledVFModules.indexOf(VfModule.Observation);
const readRevision = mapZomeFn(dnaConfig, conductorUri, 'combined', 'intent', 'get_revision');
const readSatisfactions = mapZomeFn(dnaConfig, conductorUri, 'combined', 'indexing', 'query_satisfactions');
const readProcesses = mapZomeFn(dnaConfig, conductorUri, 'combined', 'indexing', 'query_processes');
const readProposedIntent = mapZomeFn(dnaConfig, conductorUri, 'combined', 'indexing', 'get_proposed_intent');
const readResourceSpecification = mapZomeFn(dnaConfig, conductorUri, 'combined', 'resource_specification', 'get_resource_specification');
const readAction = mapZomeFn(dnaConfig, conductorUri, 'combined', 'action', 'get_action');
const readAgent = agentQueries(dnaConfig, conductorUri)['agent'];
return Object.assign((hasSatisfaction ? {
satisfiedBy: async (record) => {
const results = await readSatisfactions({ params: { satisfies: record.id } });
return extractEdges(results);
},
} : {}), (hasAgent ? {
providerId: async (record) => {
return record.provider ? record.provider : null;
},
provider: async (record) => {
return record.provider ? readAgent(record, { id: record.provider }) : null;
},
receiverId: async (record) => {
return record.receiver ? record.receiver : null;
},
receiver: async (record) => {
return record.receiver ? readAgent(record, { id: record.receiver }) : null;
},
inScopeOf: async (record) => {
return (await Promise.all((record.inScopeOf || []).map((address) => readAgent(record, { address }))));
},
} : {}), (hasProcess ? {
inputOf: async (record) => {
const results = await readProcesses({ params: { intendedInputs: record.id } });
return results.edges.pop()['node'];
},
outputOf: async (record) => {
const results = await readProcesses({ params: { intendedOutputs: record.id } });
return results.edges.pop()['node'];
},
} : {}), (hasProposal ? {
publishedIn: async (record) => {
return (await Promise.all((record.publishedIn || []).map((address) => readProposedIntent({ address })))).map(extractProposedIntent);
},
} : {}), (hasResourceSpecification ? {
resourceConformsTo: async (record) => {
return (await readResourceSpecification({ address: record.resourceConformsTo })).resourceSpecification;
},
} : {}), (hasAction ? {
action: async (record) => {
return (await readAction({ id: record.action }));
},
} : {}), (hasObservation ? {
resourceInventoriedAs: () => {
throw new Error('resolver unimplemented');
},
} : {}), (hasHistory ? {
revision: async (record, args) => {
return (await readRevision(args)).intent;
},
} : {}));
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vcmVzb2x2ZXJzL2ludGVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBaUIsa0JBQWtCLEVBQUUsUUFBUSxFQUEwSCxNQUFNLGFBQWEsQ0FBQTtBQUNqTSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBbUIxRCxPQUFPLFlBQVksTUFBTSxxQkFBcUIsQ0FBQTtBQUc5QyxNQUFNLHFCQUFxQixHQUFHLENBQUMsSUFBSSxFQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQTtBQUUzRSxlQUFlLENBQUMsbUJBQStCLGtCQUFrQixFQUFFLFNBQXdCLEVBQUUsWUFBb0IsRUFBRSxFQUFFO0lBQ25ILE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDcEUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNoRSxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBQzlFLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxDQUFDLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO0lBQ2hHLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJ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LHFCQUFxQixDQUFDLENBQUE7UUFDakksQ0FBQztLQUNGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUNQLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO1FBQzFCLGtCQUFrQixFQUFFLEtBQUssRUFBRSxNQUE0RCxFQUFrQyxFQUFFO1lBQ3pILE9BQU8sQ0FBQyxNQUFNLHlCQUF5QixDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQTtRQUN4RyxDQUFDO0tBQ0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ1AsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ1gsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUF5QyxFQUFtQixFQUFFO1lBQzNFLE9BQU8sQ0FBQyxNQUFNLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ2xELENBQUM7S0FDRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDUCxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDaEIscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtRQUMzQyxDQUFDO0tBQ0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ1AsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ1osUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFjLEVBQUUsSUFBMkMsRUFBbUIsRUFBRTtZQUMvRixPQUFPLENBQUMsTUFBTSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7UUFDMUMsQ0FBQztLQUNGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUNSLENBQUE7QUFDSCxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEludGVudCByZWNvcmQgcmVmZXJlbmNlIHJlc29sdmVyc1xuICpcbiAqIEBwYWNrYWdlOiBIb2xvUkVBXG4gKiBAc2luY2U6ICAgMjAxOS0wOC0zMVxuICovXG5cbmltcG9ydCB7IEROQUlkTWFwcGluZ3MsIERFRkFVTFRfVkZfTU9EVUxFUywgVmZNb2R1bGUsIFJlYWRQYXJhbXMsIEJ5SWQsIEJ5UmV2aXNpb24sIFByb3Bvc2VkSW50ZW50QWRkcmVzcywgUmVzb3VyY2VTcGVjaWZpY2F0aW9uQWRkcmVzcywgQWRkcmVzc2FibGVJZGVudGlmaWVyLCBBZ2VudEFkZHJlc3MgfSBmcm9tICcuLi90eXBlcy5qcydcbmltcG9ydCB7IGV4dHJhY3RFZGdlcywgbWFwWm9tZUZuIH0gZnJvbSAnLi4vY29ubmVjdGlvbi5qcydcblxuaW1wb3J0IHtcbiAgTWF5YmUsXG4gIEFnZW50LFxuICBJbnRlbnQsXG4gIEludGVudFJlc3BvbnNlLFxuICBTYXRpc2ZhY3Rpb24sXG4gIFByb2Nlc3MsXG4gIFJlc291cmNlU3BlY2lmaWNhdGlvbixcbiAgUHJvcG9zZWRJbnRlbnQsXG4gIEFjdGlvbixcbiAgU2F0aXNmYWN0aW9uQ29ubmVjdGlvbixcbiAgUHJvY2Vzc0Nvbm5lY3Rpb24sXG4gIFByb3Bvc2VkSW50ZW50UmVzcG9uc2UsXG4gIFJlc291cmNlU3BlY2lmaWNhdGlvblJlc3BvbnNlLFxuICBBY2NvdW50aW5nU2NvcGUsXG59IGZyb20gJ0BsZW9zcHJvZ3JhbXMvdmYtZ3JhcGhxbCdcblxuaW1wb3J0IGFnZW50UXVlcmllcyBmcm9tICcuLi9xdWVyaWVzL2FnZW50LmpzJ1xuaW1wb3J0IHsgUHJvY2Vzc1NlYXJjaElucHV0LCBTYXRpc2ZhY3Rpb25TZWFyY2hJbnB1dCB9IGZyb20gJy4vem9tZVNlYXJjaElucHV0VHlwZXMuanMnXG5cbmNvbnN0IGV4dHJhY3RQcm9wb3NlZEludGVudCA9IChkYXRhKTogUHJvcG9zZWRJbnRlbnQgPT4gZGF0YS5wcm9wb3NlZEludGVudFxuXG5leHBvcnQgZGVmYXVsdCAoZW5hYmxlZFZGTW9kdWxlczogVmZNb2R1bGVbXSA9IERFRkFVTFRfVkZfTU9EVUxFUywgZG5hQ29uZmlnOiBETkFJZE1hcHBpbmdzLCBjb25kdWN0b3JVcmk6IHN0cmluZykgPT4ge1xuICBjb25zdCBoYXNIaXN0b3J5ID0gLTEgIT09IGVuYWJsZWRWRk1vZHVsZXMuaW5kZXhPZihWZk1vZHVsZS5IaXN0b3J5KVxuICBjb25zdCBoYXNBZ2VudCA9IC0xICE9PSBlbmFibGVkVkZNb2R1bGVzLmluZGV4T2YoVmZNb2R1bGUuQWdlbnQpXG4gIGNvbnN0IGhhc1NhdGlzZmFjdGlvbiA9IC0xICE9PSBlbmFibGVkVkZNb2R1bGVzLmluZGV4T2YoVmZNb2R1bGUuU2F0aXNmYWN0aW9uKVxuICBjb25zdCBoYXNSZXNvdXJjZVNwZWNpZmljYXRpb24gPSAtMSAhPT0gZW5hYmxlZFZGTW9kdWxlcy5pbmRleE9mKFZmTW9kdWxlLlJlc291cmNlU3BlY2lmaWNhdGlvbilcbiAgY29uc3QgaGFzQWN0aW9uID0gLTEgIT09IGVuYWJsZWRWRk1vZHVsZXMuaW5kZXhPZihWZk1vZHVsZS5BY3Rpb24pXG4gIGNvbnN0IGhhc1Byb2Nlc3MgPSAtMSAhPT0gZW5hYmxlZFZGTW9kdWxlcy5pbmRleE9mKFZmTW9kdWxlLlByb2Nlc3MpXG4gIGNvbnN0IGhhc1Byb3Bvc2FsID0gLTEgIT09IGVuYWJsZWRWRk1vZHVsZXMuaW5kZXhPZihWZk1vZHVsZS5Qcm9wb3NhbClcbiAgY29uc3QgaGFzT2JzZXJ2YXRpb24gPSAtMSAhPT0gZW5hYmxlZFZGTW9kdWxlcy5pbmRleE9mKFZmTW9kdWxlLk9ic2VydmF0aW9uKVxuXG4gIGNvbnN0IHJlYWRSZXZpc2lvbiA9IG1hcFpvbWVGbjxCeVJldmlzaW9uLCBJbnRlbnRSZXNwb25zZT4oZG5hQ29uZmlnLCBjb25kdWN0b3JVcmksICdjb21iaW5lZCcsICdpbnRlbnQnLCAnZ2V0X3JldmlzaW9uJylcbiAgY29uc3QgcmVhZFNhdGlzZmFjdGlvbnMgPSBtYXBab21lRm48U2F0aXNmYWN0aW9uU2VhcmNoSW5wdXQsIFNhdGlzZmFjdGlvbkNvbm5lY3Rpb24+KGRuYUNvbmZpZywgY29uZHVjdG9yVXJpLCAnY29tYmluZWQnLCAnaW5kZXhpbmcnLCAncXVlcnlfc2F0aXNmYWN0aW9ucycpXG4gIGNvbnN0IHJlYWRQcm9jZXNzZXMgPSBtYXBab21lRm48UHJvY2Vzc1NlYXJjaElucHV0LCBQcm9jZXNzQ29ubmVjdGlvbj4oZG5hQ29uZmlnLCBjb25kdWN0b3JVcmksICdjb21iaW5lZCcsICdpbmRleGluZycsICdxdWVyeV9wcm9jZXNzZXMnKVxuICBjb25zdCByZWFkUHJvcG9zZWRJbnRlbnQgPSBtYXBab21lRm48UmVhZFBhcmFtcywgUHJvcG9zZWRJbnRlbnRSZXNwb25zZT4oZG5hQ29uZmlnLCBjb25kdWN0b3JVcmksICdjb21iaW5lZCcsICdpbmRleGluZycsICdnZXRfcHJvcG9zZWRfaW50ZW50JylcbiAgY29uc3QgcmVhZFJlc291cmNlU3BlY2lmaWNhdGlvbiA9IG1hcFpvbWVGbjxSZWFkUGFyYW1zLCBSZXNvdXJjZVNwZWNpZmljYXRpb25SZXNwb25zZT4oZG5hQ29uZmlnLCBjb25kdWN0b3JVcmksICdjb21iaW5lZCcsICdyZXNvdXJjZV9zcGVjaWZpY2F0aW9uJywgJ2dldF9yZXNvdXJjZV9zcGVjaWZpY2F0aW9uJylcbiAgY29uc3QgcmVhZEFjdGlvbiA9IG1hcFpvbWVGbjxCeUlkLCBBY3Rpb24+KGRuYUNvbmZpZywgY29uZHVjdG9yVXJpLCAnY29tYmluZWQnLCAnYWN0aW9uJywgJ2dldF9hY3Rpb24nKVxuICBjb25zdCByZWFkQWdlbnQgPSBhZ2VudFF1ZXJpZXMoZG5hQ29uZmlnLCBjb25kdWN0b3JVcmkpWydhZ2VudCddXG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAgKGhhc1NhdGlzZmFjdGlvbiA/IHtcbiAgICAgIHNhdGlzZmllZEJ5OiBhc3luYyAocmVjb3JkOiBJbnRlbnQpOiBQcm9taXNlPFNhdGlzZmFjdGlvbltdPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCByZWFkU2F0aXNmYWN0aW9ucyh7IHBhcmFtczogeyBzYXRpc2ZpZXM6IHJlY29yZC5pZCB9IH0pXG4gICAgICAgIHJldHVybiBleHRyYWN0RWRnZXMocmVzdWx0cylcbiAgICAgIH0sXG4gICAgfSA6IHt9KSxcbiAgICAoaGFzQWdlbnQgPyB7XG4gICAgICBwcm92aWRlcklkOiBhc3luYyAocmVjb3JkOiBJbnRlbnQpOiBQcm9taXNlPE1heWJlPGFueT4+ID0+IHtcbiAgICAgICAgcmV0dXJuIHJlY29yZC5wcm92aWRlciA/IHJlY29yZC5wcm92aWRlciA6IG51bGxcbiAgICAgIH0sXG5cbiAgICAgIHByb3ZpZGVyOiBhc3luYyAocmVjb3JkOiBJbnRlbnQpOiBQcm9taXNlPE1heWJlPEFnZW50Pj4gPT4ge1xuICAgICAgICByZXR1cm4gcmVjb3JkLnByb3ZpZGVyID8gcmVhZEFnZW50KHJlY29yZCwgeyBpZDogcmVjb3JkLnByb3ZpZGVyIH0pIDogbnVsbFxuICAgICAgfSxcblxuICAgICAgcmVjZWl2ZXJJZDogYXN5bmMgKHJlY29yZDogSW50ZW50KTogUHJvbWlzZTxNYXliZTxhbnk+PiA9PiB7XG4gICAgICAgIHJldHVybiByZWNvcmQucmVjZWl2ZXIgPyByZWNvcmQucmVjZWl2ZXIgOiBudWxsXG4gICAgICB9LFxuXG4gICAgICByZWNlaXZlcjogYXN5bmMgKHJlY29yZDogSW50ZW50KTogUHJvbWlzZTxNYXliZTxBZ2VudD4+ID0+IHtcbiAgICAgICAgcmV0dXJuIHJlY29yZC5yZWNlaXZlciA/IHJlYWRBZ2VudChyZWNvcmQsIHsgaWQ6IHJlY29yZC5yZWNlaXZlciB9KSA6IG51bGxcbiAgICAgIH0sXG4gICAgICBpblNjb3BlT2Y6IGFzeW5jIChyZWNvcmQ6IHsgaW5TY29wZU9mOiBBZ2VudEFkZHJlc3NbXSB9KTogUHJvbWlzZTxBY2NvdW50aW5nU2NvcGVbXT4gPT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IFByb21pc2UuYWxsKChyZWNvcmQuaW5TY29wZU9mIHx8IFtdKS5tYXAoKGFkZHJlc3MpPT5yZWFkQWdlbnQocmVjb3JkLCB7YWRkcmVzc30pKSkpXG4gICAgICB9LFxuICAgIH0gOiB7fSksXG4gICAgKGhhc1Byb2Nlc3MgPyB7XG4gICAgICBpbnB1dE9mOiBhc3luYyAocmVjb3JkOiBJbnRlbnQpOiBQcm9taXNlPFByb2Nlc3M+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHJlYWRQcm9jZXNzZXMoeyBwYXJhbXM6IHsgaW50ZW5kZWRJbnB1dHM6IHJlY29yZC5pZCB9IH0pXG4gICAgICAgIHJldHVybiByZXN1bHRzLmVkZ2VzLnBvcCgpIVsnbm9kZSddXG4gICAgICB9LFxuXG4gICAgICBvdXRwdXRPZjogYXN5bmMgKHJlY29yZDogSW50ZW50KTogUHJvbWlzZTxQcm9jZXNzPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCByZWFkUHJvY2Vzc2VzKHsgcGFyYW1zOiB7IGludGVuZGVkT3V0cHV0czogcmVjb3JkLmlkIH0gfSlcbiAgICAgICAgcmV0dXJuIHJlc3VsdHMuZWRnZXMucG9wKCkhWydub2RlJ11cbiAgICAgIH0sXG4gICAgfSA6IHt9KSxcbiAgICAoaGFzUHJvcG9zYWwgPyB7XG4gICAgICBwdWJsaXNoZWRJbjogYXN5bmMgKHJlY29yZDogeyBwdWJsaXNoZWRJbjogUHJvcG9zZWRJbnRlbnRBZGRyZXNzW10gfSk6IFByb21pc2U8UHJvcG9zZWRJbnRlbnRbXT4gPT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IFByb21pc2UuYWxsKChyZWNvcmQucHVibGlzaGVkSW4gfHwgW10pLm1hcCgoYWRkcmVzcyk9PnJlYWRQcm9wb3NlZEludGVudCh7YWRkcmVzc30pKSkpLm1hcChleHRyYWN0UHJvcG9zZWRJbnRlbnQpXG4gICAgICB9LFxuICAgIH0gOiB7fSksXG4gICAgKGhhc1Jlc291cmNlU3BlY2lmaWNhdGlvbiA/IHtcbiAgICAgIHJlc291cmNlQ29uZm9ybXNUbzogYXN5bmMgKHJlY29yZDogeyByZXNvdXJjZUNvbmZvcm1zVG86IFJlc291cmNlU3BlY2lmaWNhdGlvbkFkZHJlc3MgfSk6IFByb21pc2U8UmVzb3VyY2VTcGVjaWZpY2F0aW9uPiA9PiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgcmVhZFJlc291cmNlU3BlY2lmaWNhdGlvbih7IGFkZHJlc3M6IHJlY29yZC5yZXNvdXJjZUNvbmZvcm1zVG8gfSkpLnJlc291cmNlU3BlY2lmaWNhdGlvblxuICAgICAgfSxcbiAgICB9IDoge30pLFxuICAgIChoYXNBY3Rpb24gPyB7XG4gICAgICBhY3Rpb246IGFzeW5jIChyZWNvcmQ6IHsgYWN0aW9uOiBBZGRyZXNzYWJsZUlkZW50aWZpZXIgfSk6IFByb21pc2U8QWN0aW9uPiA9PiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgcmVhZEFjdGlvbih7IGlkOiByZWNvcmQuYWN0aW9uIH0pKVxuICAgICAgfSxcbiAgICB9IDoge30pLFxuICAgIChoYXNPYnNlcnZhdGlvbiA/IHtcbiAgICAgIHJlc291cmNlSW52ZW50b3JpZWRBczogKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jlc29sdmVyIHVuaW1wbGVtZW50ZWQnKVxuICAgICAgfSxcbiAgICB9IDoge30pLFxuICAgIChoYXNIaXN0b3J5ID8ge1xuICAgICAgcmV2aXNpb246IGFzeW5jIChyZWNvcmQ6IEludGVudCwgYXJnczogeyByZXZpc2lvbklkOiBBZGRyZXNzYWJsZUlkZW50aWZpZXIgfSk6IFByb21pc2U8SW50ZW50PiA9PiB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgcmVhZFJldmlzaW9uKGFyZ3MpKS5pbnRlbnRcbiAgICAgIH0sXG4gICAgfSA6IHt9KSxcbiAgKVxufVxuIl19