UNPKG

@tsclean/core

Version:

Plugin for API Rest Full development, based on Clean Architecture, IoC and Dependency Injection.

163 lines 25.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GraphInspector = void 0; const deterministic_uuid_registry_1 = require("./deterministic-uuid-registry"); const unknown_dependencies_1 = require("../errors/exceptions/unknown-dependencies"); const partial_graph_host_1 = require("./partial-graph.host"); class GraphInspector { constructor(container) { this.container = container; this.enhancersMetadataCache = new Array(); this.graph = container.serializedGraph; } inspectModules(modules = this.container.getModules()) { for (const moduleRef of modules.values()) { this.insertModuleNode(moduleRef); this.insertClassNodes(moduleRef); this.insertModuleToModuleEdges(moduleRef); } this.enhancersMetadataCache.forEach(entry => this.insertEnhancerEdge(entry)); deterministic_uuid_registry_1.DeterministicUuidRegistry.clear(); } registerPartial(error) { var _a, _b; this.graph.status = 'partial'; if (error instanceof unknown_dependencies_1.UnknownDependenciesException) { this.graph.metadata = { cause: { type: 'unknown-dependencies', context: error.context, moduleId: (_a = error.moduleRef) === null || _a === void 0 ? void 0 : _a.id, nodeId: (_b = error.metadata) === null || _b === void 0 ? void 0 : _b.id, }, }; } else { this.graph.metadata = { cause: { type: 'unknown', error, }, }; } partial_graph_host_1.PartialGraphHost.register(this.graph); } inspectInstanceWrapper(source, moduleRef) { const ctorMetadata = source.getCtorMetadata(); ctorMetadata === null || ctorMetadata === void 0 ? void 0 : ctorMetadata.forEach((target, index) => this.insertClassToClassEdge(source, target, moduleRef, index, 'constructor')); const propertiesMetadata = source.getPropertiesMetadata(); propertiesMetadata === null || propertiesMetadata === void 0 ? void 0 : propertiesMetadata.forEach(({ key, wrapper: target }) => this.insertClassToClassEdge(source, target, moduleRef, key, 'property')); } insertEnhancerMetadataCache(entry) { this.enhancersMetadataCache.push(entry); } insertOrphanedEnhancer(entry) { var _a, _b, _c; this.graph.insertOrphanedEnhancer(Object.assign(Object.assign({}, entry), { ref: (_c = (_b = (_a = entry.ref) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : 'Object' })); } insertAttachedEnhancer(wrapper) { const existingNode = this.graph.getNodeById(wrapper.id); existingNode.metadata.global = true; this.graph.insertAttachedEnhancer(existingNode.id); } insertEntrypointDefinition(definition, parentId) { definition = Object.assign(Object.assign({}, definition), { id: `${definition.classNodeId}_${definition.methodName}` }); this.graph.insertEntrypoint(definition, parentId); } insertClassNode(moduleRef, wrapper, type) { this.graph.insertNode({ id: wrapper.id, label: wrapper.name, parent: moduleRef.id, metadata: { type, internal: wrapper.metaType === moduleRef.metaType, sourceModuleName: moduleRef.name, durable: wrapper.isDependencyTreeDurable(), static: wrapper.isDependencyTreeStatic(), scope: wrapper.scope, transient: wrapper.isTransient, exported: moduleRef.exports.has(wrapper.token), token: wrapper.token, subtype: wrapper.subtype, initTime: wrapper.initTime, }, }); } insertModuleNode(moduleRef) { const dynamicMetadata = this.container.getDynamicMetadataByToken(moduleRef.token); const node = { id: moduleRef.id, label: moduleRef.name, metadata: { type: 'module', global: moduleRef.isGlobal, dynamic: !!dynamicMetadata, internal: moduleRef.name === 'InternalCoreModule', }, }; this.graph.insertNode(node); } insertModuleToModuleEdges(moduleRef) { for (const targetModuleRef of moduleRef.imports) { this.graph.insertEdge({ source: moduleRef.id, target: targetModuleRef.id, metadata: { type: 'module-to-module', sourceModuleName: moduleRef.name, targetModuleName: targetModuleRef.name, }, }); } } insertEnhancerEdge(entry) { var _a, _b, _c, _d; const moduleRef = this.container.getModuleByKey(entry.moduleToken); const sourceInstanceWrapper = (_a = moduleRef.controllers.get(entry.classRef)) !== null && _a !== void 0 ? _a : moduleRef.providers.get(entry.classRef); const existingSourceNode = this.graph.getNodeById(sourceInstanceWrapper.id); const enhancers = (_b = existingSourceNode.metadata.enhancers) !== null && _b !== void 0 ? _b : []; if (entry.enhancerInstanceWrapper) { this.insertClassToClassEdge(sourceInstanceWrapper, entry.enhancerInstanceWrapper, moduleRef, undefined, 'decorator'); enhancers.push({ id: entry.enhancerInstanceWrapper.id, methodKey: entry.methodKey, subtype: entry.subtype, }); } else { const name = (_d = (_c = entry.enhancerRef.constructor) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : entry.enhancerRef.name; enhancers.push({ name, methodKey: entry.methodKey, subtype: entry.subtype, }); } existingSourceNode.metadata.enhancers = enhancers; } insertClassToClassEdge(source, target, moduleRef, keyOrIndex, injectionType) { var _a; this.graph.insertEdge({ source: source.id, target: target.id, metadata: { type: 'class-to-class', sourceModuleName: moduleRef.name, sourceClassName: source.name, targetClassName: target.name, sourceClassToken: source.token, targetClassToken: target.token, targetModuleName: (_a = target.host) === null || _a === void 0 ? void 0 : _a.name, keyOrIndex, injectionType, }, }); } insertClassNodes(moduleRef) { moduleRef.providers.forEach(value => this.insertClassNode(moduleRef, value, 'provider')); moduleRef.injectables.forEach(value => this.insertClassNode(moduleRef, value, 'service')); moduleRef.controllers.forEach(value => this.insertClassNode(moduleRef, value, 'controller')); } } exports.GraphInspector = GraphInspector; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGgtaW5zcGVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2luc3BlY3Rvci9ncmFwaC1pbnNwZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsK0VBQTBFO0FBQzFFLG9GQUF5RjtBQUt6Riw2REFBd0Q7QUFFeEQsTUFBYSxjQUFjO0lBS3ZCLFlBQTZCLFNBQXVCO1FBQXZCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFIbkMsMkJBQXNCLEdBQ3JDLElBQUksS0FBSyxFQUE4QixDQUFDO1FBR3hDLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLGVBQWUsQ0FBQztJQUN6QyxDQUFDO0lBRU0sY0FBYyxDQUNuQixVQUErQixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRTtRQUUxRCxLQUFLLE1BQU0sU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQzFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FDL0IsQ0FBQztRQUVGLHVEQUF5QixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFTSxlQUFlLENBQUMsS0FBYzs7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBRTlCLElBQUksS0FBSyxZQUFZLG1EQUE0QixFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUc7Z0JBQ3BCLEtBQUssRUFBRTtvQkFDTCxJQUFJLEVBQUUsc0JB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T0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FDbEQsQ0FBQztRQUNGLFNBQVMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FDckQsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQW5PSCx3Q0FtT0ciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250YWluZXJJb0MsIEluc3RhbmNlV3JhcHBlciwgTW9kdWxlIH0gZnJvbSBcIi4uL2NvcmVcIjtcbmltcG9ydCB7IEVuaGFuY2VyTWV0YWRhdGFDYWNoZUVudHJ5IH0gZnJvbSBcIi4vY29udHJhY3RzL2VuaGFuY2VyLW1ldGFkYXRhLWNhY2hlLWVudHJ5XCI7XG5pbXBvcnQgeyBEZXRlcm1pbmlzdGljVXVpZFJlZ2lzdHJ5IH0gZnJvbSBcIi4vZGV0ZXJtaW5pc3RpYy11dWlkLXJlZ2lzdHJ5XCI7XG5pbXBvcnQgeyBVbmtub3duRGVwZW5kZW5jaWVzRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2Vycm9ycy9leGNlcHRpb25zL3Vua25vd24tZGVwZW5kZW5jaWVzXCI7XG5pbXBvcnQgeyBPcnBoYW5lZEVuaGFuY2VyRGVmaW5pdGlvbiB9IGZyb20gXCIuL2NvbnRyYWN0cy9leHRyYXNcIjtcbmltcG9ydCB7IEVudHJ5cG9pbnQgfSBmcm9tIFwiLi9jb250cmFjdHMvZW50cnlwb2ludFwiO1xuaW1wb3J0IHsgQ2xhc3NOb2RlLCBOb2RlIH0gZnJvbSBcIi4vY29udHJhY3RzL25vZGVcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZWRHcmFwaCB9IGZyb20gXCIuL3NlcmlhbGl6ZWQtZ3JhcGhcIjtcbmltcG9ydCB7IFBhcnRpYWxHcmFwaEhvc3QgfSBmcm9tIFwiLi9wYXJ0aWFsLWdyYXBoLmhvc3RcIjtcblxuZXhwb3J0IGNsYXNzIEdyYXBoSW5zcGVjdG9yIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGdyYXBoOiBTZXJpYWxpemVkR3JhcGg7XG4gICAgcHJpdmF0ZSByZWFkb25seSBlbmhhbmNlcnNNZXRhZGF0YUNhY2hlID1cbiAgICAgIG5ldyBBcnJheTxFbmhhbmNlck1ldGFkYXRhQ2FjaGVFbnRyeT4oKTtcbiAgXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IENvbnRhaW5lcklvQykge1xuICAgICAgdGhpcy5ncmFwaCA9IGNvbnRhaW5lci5zZXJpYWxpemVkR3JhcGg7XG4gICAgfVxuICBcbiAgICBwdWJsaWMgaW5zcGVjdE1vZHVsZXMoXG4gICAgICBtb2R1bGVzOiBNYXA8c3RyaW5nLCBNb2R1bGU+ID0gdGhpcy5jb250YWluZXIuZ2V0TW9kdWxlcygpLFxuICAgICkge1xuICAgICAgZm9yIChjb25zdCBtb2R1bGVSZWYgb2YgbW9kdWxlcy52YWx1ZXMoKSkge1xuICAgICAgICB0aGlzLmluc2VydE1vZHVsZU5vZGUobW9kdWxlUmVmKTtcbiAgICAgICAgdGhpcy5pbnNlcnRDbGFzc05vZGVzKG1vZHVsZVJlZik7XG4gICAgICAgIHRoaXMuaW5zZXJ0TW9kdWxlVG9Nb2R1bGVFZGdlcyhtb2R1bGVSZWYpO1xuICAgICAgfVxuICBcbiAgICAgIHRoaXMuZW5oYW5jZXJzTWV0YWRhdGFDYWNoZS5mb3JFYWNoKGVudHJ5ID0+XG4gICAgICAgIHRoaXMuaW5zZXJ0RW5oYW5jZXJFZGdlKGVudHJ5KSxcbiAgICAgICk7XG4gIFxuICAgICAgRGV0ZXJtaW5pc3RpY1V1aWRSZWdpc3RyeS5jbGVhcigpO1xuICAgIH1cbiAgXG4gICAgcHVibGljIHJlZ2lzdGVyUGFydGlhbChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5ncmFwaC5zdGF0dXMgPSAncGFydGlhbCc7XG4gIFxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVW5rbm93bkRlcGVuZGVuY2llc0V4Y2VwdGlvbikge1xuICAgICAgICB0aGlzLmdyYXBoLm1ldGFkYXRhID0ge1xuICAgICAgICAgIGNhdXNlOiB7XG4gICAgICAgICAgICB0eXBlOiAndW5rbm93bi1kZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgY29udGV4dDogZXJyb3IuY29udGV4dCxcbiAgICAgICAgICAgIG1vZHVsZUlkOiBlcnJvci5tb2R1bGVSZWY/LmlkLFxuICAgICAgICAgICAgbm9kZUlkOiBlcnJvci5tZXRhZGF0YT8uaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ3JhcGgubWV0YWRhdGEgPSB7XG4gICAgICAgICAgY2F1c2U6IHtcbiAgICAgICAgICAgIHR5cGU6ICd1bmtub3duJyxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBQYXJ0aWFsR3JhcGhIb3N0LnJlZ2lzdGVyKHRoaXMuZ3JhcGgpO1xuICAgIH1cbiAgXG4gICAgcHVibGljIGluc3BlY3RJbnN0YW5jZVdyYXBwZXI8VCA9IGFueT4oXG4gICAgICBzb3VyY2U6IEluc3RhbmNlV3JhcHBlcjxUPixcbiAgICAgIG1vZHVsZVJlZjogTW9kdWxlLFxuICAgICkge1xuICAgICAgY29uc3QgY3Rvck1ldGFkYXRhID0gc291cmNlLmdldEN0b3JNZXRhZGF0YSgpO1xuICAgICAgY3Rvck1ldGFkYXRhPy5mb3JFYWNoKCh0YXJnZXQsIGluZGV4KSA9PlxuICAgICAgICB0aGlzLmluc2VydENsYXNzVG9DbGFzc0VkZ2UoXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBtb2R1bGVSZWYsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgJ2NvbnN0cnVjdG9yJyxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gIFxuICAgICAgY29uc3QgcHJvcGVydGllc01ldGFkYXRhID0gc291cmNlLmdldFByb3BlcnRpZXNNZXRhZGF0YSgpO1xuICAgICAgcHJvcGVydGllc01ldGFkYXRhPy5mb3JFYWNoKCh7IGtleSwgd3JhcHBlcjogdGFyZ2V0IH0pID0+XG4gICAgICAgIHRoaXMuaW5zZXJ0Q2xhc3NUb0NsYXNzRWRnZShzb3VyY2UsIHRhcmdldCwgbW9kdWxlUmVmLCBrZXksICdwcm9wZXJ0eScpLFxuICAgICAgKTtcbiAgICB9XG4gIFxuICAgIHB1YmxpYyBpbnNlcnRFbmhhbmNlck1ldGFkYXRhQ2FjaGUoZW50cnk6IEVuaGFuY2VyTWV0YWRhdGFDYWNoZUVudHJ5KSB7XG4gICAgICB0aGlzLmVuaGFuY2Vyc01ldGFkYXRhQ2FjaGUucHVzaChlbnRyeSk7XG4gICAgfVxuICBcbiAgICBwdWJsaWMgaW5zZXJ0T3JwaGFuZWRFbmhhbmNlcihlbnRyeTogT3JwaGFuZWRFbmhhbmNlckRlZmluaXRpb24pIHtcbiAgICAgIHRoaXMuZ3JhcGguaW5zZXJ0T3JwaGFuZWRFbmhhbmNlcih7XG4gICAgICAgIC4uLmVudHJ5LFxuICAgICAgICByZWY6IGVudHJ5LnJlZj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gJ09iamVjdCcsXG4gICAgICB9KTtcbiAgICB9XG4gIFxuICAgIHB1YmxpYyBpbnNlcnRBdHRhY2hlZEVuaGFuY2VyKHdyYXBwZXI6IEluc3RhbmNlV3JhcHBlcikge1xuICAgICAgY29uc3QgZXhpc3RpbmdOb2RlID0gdGhpcy5ncmFwaC5nZXROb2RlQnlJZCh3cmFwcGVyLmlkKTtcbiAgICAgIGV4aXN0aW5nTm9kZS5tZXRhZGF0YS5nbG9iYWwgPSB0cnVlO1xuICBcbiAgICAgIHRoaXMuZ3JhcGguaW5zZXJ0QXR0YWNoZWRFbmhhbmNlcihleGlzdGluZ05vZGUuaWQpO1xuICAgIH1cbiAgXG4gICAgcHVibGljIGluc2VydEVudHJ5cG9pbnREZWZpbml0aW9uPFQ+KFxuICAgICAgZGVmaW5pdGlvbjogRW50cnlwb2ludDxUPixcbiAgICAgIHBhcmVudElkOiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICBkZWZpbml0aW9uID0ge1xuICAgICAgICAuLi5kZWZpbml0aW9uLFxuICAgICAgICBpZDogYCR7ZGVmaW5pdGlvbi5jbGFzc05vZGVJZH1fJHtkZWZpbml0aW9uLm1ldGhvZE5hbWV9YCxcbiAgICAgIH07XG4gICAgICB0aGlzLmdyYXBoLmluc2VydEVudHJ5cG9pbnQoZGVmaW5pdGlvbiwgcGFyZW50SWQpO1xuICAgIH1cbiAgXG4gICAgcHVibGljIGluc2VydENsYXNzTm9kZShcbiAgICAgIG1vZHVsZVJlZjogTW9kdWxlLFxuICAgICAgd3JhcHBlcjogSW5zdGFuY2VXcmFwcGVyLFxuICAgICAgdHlwZTogRXhjbHVkZTxOb2RlWydtZXRhZGF0YSddWyd0eXBlJ10sICdtb2R1bGUnPixcbiAgICApIHtcbiAgICAgIHRoaXMuZ3JhcGguaW5zZXJ0Tm9kZSh7XG4gICAgICAgIGlkOiB3cmFwcGVyLmlkLFxuICAgICAgICBsYWJlbDogd3JhcHBlci5uYW1lLFxuICAgICAgICBwYXJlbnQ6IG1vZHVsZVJlZi5pZCxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIGludGVybmFsOiB3cmFwcGVyLm1ldGFUeXBlID09PSBtb2R1bGVSZWYubWV0YVR5cGUsXG4gICAgICAgICAgc291cmNlTW9kdWxlTmFtZTogbW9kdWxlUmVmLm5hbWUsXG4gICAgICAgICAgZHVyYWJsZTogd3JhcHBlci5pc0RlcGVuZGVuY3lUcmVlRHVyYWJsZSgpLFxuICAgICAgICAgIHN0YXRpYzogd3JhcHBlci5pc0RlcGVuZGVuY3lUcmVlU3RhdGljKCksXG4gICAgICAgICAgc2NvcGU6IHdyYXBwZXIuc2NvcGUsXG4gICAgICAgICAgdHJhbnNpZW50OiB3cmFwcGVyLmlzVHJhbnNpZW50LFxuICAgICAgICAgIGV4cG9ydGVkOiBtb2R1bGVSZWYuZXhwb3J0cy5oYXMod3JhcHBlci50b2tlbiksXG4gICAgICAgICAgdG9rZW46IHdyYXBwZXIudG9rZW4sXG4gICAgICAgICAgc3VidHlwZTogd3JhcHBlci5zdWJ0eXBlLFxuICAgICAgICAgIGluaXRUaW1lOiB3cmFwcGVyLmluaXRUaW1lLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICBcbiAgICBwcml2YXRlIGluc2VydE1vZHVsZU5vZGUobW9kdWxlUmVmOiBNb2R1bGUpIHtcbiAgICAgIGNvbnN0IGR5bmFtaWNNZXRhZGF0YSA9IHRoaXMuY29udGFpbmVyLmdldER5bmFtaWNNZXRhZGF0YUJ5VG9rZW4oXG4gICAgICAgIG1vZHVsZVJlZi50b2tlbixcbiAgICAgICk7XG4gICAgICBjb25zdCBub2RlOiBOb2RlID0ge1xuICAgICAgICBpZDogbW9kdWxlUmVmLmlkLFxuICAgICAgICBsYWJlbDogbW9kdWxlUmVmLm5hbWUsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgdHlwZTogJ21vZHVsZScsXG4gICAgICAgICAgZ2xvYmFsOiBtb2R1bGVSZWYuaXNHbG9iYWwsXG4gICAgICAgICAgZHluYW1pYzogISFkeW5hbWljTWV0YWRhdGEsXG4gICAgICAgICAgaW50ZXJuYWw6IG1vZHVsZVJlZi5uYW1lID09PSAnSW50ZXJuYWxDb3JlTW9kdWxlJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICB0aGlzLmdyYXBoLmluc2VydE5vZGUobm9kZSk7XG4gICAgfVxuICBcbiAgICBwcml2YXRlIGluc2VydE1vZHVsZVRvTW9kdWxlRWRnZXMobW9kdWxlUmVmOiBNb2R1bGUpIHtcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0TW9kdWxlUmVmIG9mIG1vZHVsZVJlZi5pbXBvcnRzKSB7XG4gICAgICAgIHRoaXMuZ3JhcGguaW5zZXJ0RWRnZSh7XG4gICAgICAgICAgc291cmNlOiBtb2R1bGVSZWYuaWQsXG4gICAgICAgICAgdGFyZ2V0OiB0YXJnZXRNb2R1bGVSZWYuaWQsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIHR5cGU6ICdtb2R1bGUtdG8tbW9kdWxlJyxcbiAgICAgICAgICAgIHNvdXJjZU1vZHVsZU5hbWU6IG1vZHVsZVJlZi5uYW1lLFxuICAgICAgICAgICAgdGFyZ2V0TW9kdWxlTmFtZTogdGFyZ2V0TW9kdWxlUmVmLm5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICBcbiAgICBwcml2YXRlIGluc2VydEVuaGFuY2VyRWRnZShlbnRyeTogRW5oYW5jZXJNZXRhZGF0YUNhY2hlRW50cnkpIHtcbiAgICAgIGNvbnN0IG1vZHVsZVJlZiA9IHRoaXMuY29udGFpbmVyLmdldE1vZHVsZUJ5S2V5KGVudHJ5Lm1vZHVsZVRva2VuKTtcbiAgICAgIGNvbnN0IHNvdXJjZUluc3RhbmNlV3JhcHBlciA9XG4gICAgICAgIG1vZHVsZVJlZi5jb250cm9sbGVycy5nZXQoZW50cnkuY2xhc3NSZWYpID8/XG4gICAgICAgIG1vZHVsZVJlZi5wcm92aWRlcnMuZ2V0KGVudHJ5LmNsYXNzUmVmKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nU291cmNlTm9kZSA9IHRoaXMuZ3JhcGguZ2V0Tm9kZUJ5SWQoXG4gICAgICAgIHNvdXJjZUluc3RhbmNlV3JhcHBlci5pZCxcbiAgICAgICkgYXMgQ2xhc3NOb2RlO1xuICAgICAgY29uc3QgZW5oYW5jZXJzID0gZXhpc3RpbmdTb3VyY2VOb2RlLm1ldGFkYXRhLmVuaGFuY2VycyA/PyBbXTtcbiAgXG4gICAgICBpZiAoZW50cnkuZW5oYW5jZXJJbnN0YW5jZVdyYXBwZXIpIHtcbiAgICAgICAgdGhpcy5pbnNlcnRDbGFzc1RvQ2xhc3NFZGdlKFxuICAgICAgICAgIHNvdXJjZUluc3RhbmNlV3JhcHBlcixcbiAgICAgICAgICBlbnRyeS5lbmhhbmNlckluc3RhbmNlV3JhcHBlcixcbiAgICAgICAgICBtb2R1bGVSZWYsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICdkZWNvcmF0b3InLFxuICAgICAgICApO1xuICBcbiAgICAgICAgZW5oYW5jZXJzLnB1c2goe1xuICAgICAgICAgIGlkOiBlbnRyeS5lbmhhbmNlckluc3RhbmNlV3JhcHBlci5pZCxcbiAgICAgICAgICBtZXRob2RLZXk6IGVudHJ5Lm1ldGhvZEtleSxcbiAgICAgICAgICBzdWJ0eXBlOiBlbnRyeS5zdWJ0eXBlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPVxuICAgICAgICAgIGVudHJ5LmVuaGFuY2VyUmVmLmNvbnN0cnVjdG9yPy5uYW1lID8/XG4gICAgICAgICAgKGVudHJ5LmVuaGFuY2VyUmVmIGFzIEZ1bmN0aW9uKS5uYW1lO1xuICBcbiAgICAgICAgZW5oYW5jZXJzLnB1c2goe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgbWV0aG9kS2V5OiBlbnRyeS5tZXRob2RLZXksXG4gICAgICAgICAgc3VidHlwZTogZW50cnkuc3VidHlwZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBleGlzdGluZ1NvdXJjZU5vZGUubWV0YWRhdGEuZW5oYW5jZXJzID0gZW5oYW5jZXJzO1xuICAgIH1cbiAgXG4gICAgcHJpdmF0ZSBpbnNlcnRDbGFzc1RvQ2xhc3NFZGdlPFQ+KFxuICAgICAgc291cmNlOiBJbnN0YW5jZVdyYXBwZXI8VD4sXG4gICAgICB0YXJnZXQ6IEluc3RhbmNlV3JhcHBlcixcbiAgICAgIG1vZHVsZVJlZjogTW9kdWxlLFxuICAgICAga2V5T3JJbmRleDogbnVtYmVyIHwgc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkLFxuICAgICAgaW5qZWN0aW9uVHlwZTogJ2NvbnN0cnVjdG9yJyB8ICdwcm9wZXJ0eScgfCAnZGVjb3JhdG9yJyxcbiAgICApIHtcbiAgICAgIHRoaXMuZ3JhcGguaW5zZXJ0RWRnZSh7XG4gICAgICAgIHNvdXJjZTogc291cmNlLmlkLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldC5pZCxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB0eXBlOiAnY2xhc3MtdG8tY2xhc3MnLFxuICAgICAgICAgIHNvdXJjZU1vZHVsZU5hbWU6IG1vZHVsZVJlZi5uYW1lLFxuICAgICAgICAgIHNvdXJjZUNsYXNzTmFtZTogc291cmNlLm5hbWUsXG4gICAgICAgICAgdGFyZ2V0Q2xhc3NOYW1lOiB0YXJnZXQubmFtZSxcbiAgICAgICAgICBzb3VyY2VDbGFzc1Rva2VuOiBzb3VyY2UudG9rZW4sXG4gICAgICAgICAgdGFyZ2V0Q2xhc3NUb2tlbjogdGFyZ2V0LnRva2VuLFxuICAgICAgICAgIHRhcmdldE1vZHVsZU5hbWU6IHRhcmdldC5ob3N0Py5uYW1lLFxuICAgICAgICAgIGtleU9ySW5kZXgsXG4gICAgICAgICAgaW5qZWN0aW9uVHlwZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgXG4gICAgcHJpdmF0ZSBpbnNlcnRDbGFzc05vZGVzKG1vZHVsZVJlZjogTW9kdWxlKSB7XG4gICAgICBtb2R1bGVSZWYucHJvdmlkZXJzLmZvckVhY2godmFsdWUgPT5cbiAgICAgICAgdGhpcy5pbnNlcnRDbGFzc05vZGUobW9kdWxlUmVmLCB2YWx1ZSwgJ3Byb3ZpZGVyJyksXG4gICAgICApO1xuICAgICAgbW9kdWxlUmVmLmluamVjdGFibGVzLmZvckVhY2godmFsdWUgPT5cbiAgICAgICAgdGhpcy5pbnNlcnRDbGFzc05vZGUobW9kdWxlUmVmLCB2YWx1ZSwgJ3NlcnZpY2UnKSxcbiAgICAgICk7XG4gICAgICBtb2R1bGVSZWYuY29udHJvbGxlcnMuZm9yRWFjaCh2YWx1ZSA9PlxuICAgICAgICB0aGlzLmluc2VydENsYXNzTm9kZShtb2R1bGVSZWYsIHZhbHVlLCAnY29udHJvbGxlcicpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgIl19