UNPKG

@decorators/di

Version:

node decorators - decorators for dependency injection

146 lines 20 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Container = void 0; const errors_1 = require("./errors"); const constants_1 = require("./constants"); const helpers_1 = require("./helpers"); const injection_token_1 = require("./injection-token"); class Container { constructor() { this.providers = new Map(); } setParent(container) { this.parentContainer = container; } /** * Registers new or replaces providers */ provide(providers) { this.registerSingleProviders(providers.filter(provider => !provider.multi)); this.registerMultiProviders(providers.filter(provider => provider.multi)); } /** * Gets or instantiates an injectable */ async get(injectable) { return this.resolve(injectable); } /** * Verifies that injectable is provided within the scope */ has(injectable) { var _a; return this.providers.has(injectable) || ((_a = this.parentContainer) === null || _a === void 0 ? void 0 : _a.has(injectable)); } /** * Resolves the provider, following deps are resolved recursively */ async resolve(injectable, optional = false, sequenceDeps = []) { var _a, _b, _c, _d, _e; let provider = this.providers.get(injectable); if (!provider && ((_a = this.parentContainer) === null || _a === void 0 ? void 0 : _a.has(injectable))) { return this.parentContainer.get(injectable); } if (!provider && !optional) { throw new errors_1.MissingProviderError(injectable); } provider = provider !== null && provider !== void 0 ? provider : {}; if (provider.value) { return provider.value; } const resolvedDeps = []; for (const [index, dep] of provider.deps.entries()) { if (!dep.id) { throw new errors_1.InvalidDependencyError((_b = provider.type) !== null && _b !== void 0 ? _b : injectable, provider.deps, index); } if (sequenceDeps.find(seqDep => seqDep === dep)) { throw new errors_1.RecursiveDependencyError((_c = provider.type) !== null && _c !== void 0 ? _c : injectable, provider.deps, index); } const depProvider = this.providers.get(dep.id); if (depProvider) { resolvedDeps.push(await this.resolve(dep.id, dep.optional, [...sequenceDeps, ...provider.deps])); continue; } if ((_d = this.parentContainer) === null || _d === void 0 ? void 0 : _d.has(dep.id)) { resolvedDeps.push(await this.parentContainer.get(dep.id)); continue; } if (!dep.optional) { throw new errors_1.MissingDependencyError((_e = provider.type) !== null && _e !== void 0 ? _e : injectable, provider.deps, index); } resolvedDeps.push(undefined); } let value; if (provider.factory) { value = await provider.factory(...resolvedDeps); } if (provider.type) { value = new provider.type(...resolvedDeps); } this.providers.set(injectable, Object.assign(Object.assign({}, provider), { value })); return value; } registerMultiProviders(providers) { providers.forEach(provider => { const injectableId = new injection_token_1.InjectionToken((0, helpers_1.injectableToString)(provider.provide)); // creates dependency provider for the main provider this.registerSingleProviders([Object.assign(Object.assign({}, provider), { provide: injectableId })]); const containerProvider = this.providers.get(provider.provide); if (containerProvider) { return containerProvider.deps.push({ id: injectableId }); } // creates main provider that will hold all other providers as deps this.registerSingleProviders([{ provide: provider.provide, useFactory: (...deps) => deps, deps: [injectableId], }]); }); } registerSingleProviders(providers) { providers.forEach(provider => { if (provider.useClass) { return this.registerClassProvider(provider); } if (provider.useFactory) { return this.registerFactoryProvider(provider); } if (provider.useValue) { return this.registerValueProvider(provider); } if (provider.useExisting) { return this.registerExistingProvider(provider); } }); } registerClassProvider(provider) { var _a, _b; const ids = (_a = Reflect.getMetadata(constants_1.DEP_IDS_METADATA, provider.useClass)) !== null && _a !== void 0 ? _a : []; const optionals = (_b = Reflect.getMetadata(constants_1.OPTIONAL_DEPS_METADATA, provider.useClass)) !== null && _b !== void 0 ? _b : []; this.providers.set(provider.provide, { type: provider.useClass, deps: ids.map((id, index) => ({ id, optional: optionals[index] })), }); } registerFactoryProvider(provider) { var _a, _b; this.providers.set(provider.provide, { deps: (_b = (_a = provider.deps) === null || _a === void 0 ? void 0 : _a.map(id => ({ id }))) !== null && _b !== void 0 ? _b : [], factory: provider.useFactory, }); } registerValueProvider(provider) { this.providers.set(provider.provide, { value: provider.useValue, }); } registerExistingProvider(provider) { this.registerFactoryProvider({ provide: provider.provide, deps: [provider.useExisting], useFactory: (existing) => existing, }); } } exports.Container = Container; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFVQSxxQ0FBMEg7QUFDMUgsMkNBQXVFO0FBQ3ZFLHVDQUErQztBQUMvQyx1REFBbUQ7QUFFbkQsTUFBYSxTQUFTO0lBQXRCO1FBRUUsY0FBUyxHQUFHLElBQUksR0FBRyxFQUFpQyxDQUFDO0lBa0x2RCxDQUFDO0lBaExDLFNBQVMsQ0FBQyxTQUFvQjtRQUM1QixJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxPQUFPLENBQUMsU0FBcUI7UUFDM0IsSUFBSSxDQUFDLHVCQUF1QixDQUMxQixTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQzlDLENBQUM7UUFFRixJQUFJLENBQUMsc0JBQXNCLENBQ3pCLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQzdDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFJLFVBQXNCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxHQUFHLENBQUMsVUFBc0I7O1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUksTUFBQSxJQUFJLENBQUMsZUFBZSwwQ0FBRSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUEsQ0FBQztJQUNqRixDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsT0FBTyxDQUNuQixVQUFzQixFQUN0QixRQUFRLEdBQUcsS0FBSyxFQUNoQixlQUE2QixFQUFFOztRQUUvQixJQUFJLFFB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LFFBQXVCO1FBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFDbkMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxRQUFRO1NBQ3pCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxRQUEwQjtRQUN6RCxJQUFJLENBQUMsdUJBQXVCLENBQUM7WUFDM0IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO1lBQ3pCLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7WUFDNUIsVUFBVSxFQUFFLENBQUMsUUFBaUIsRUFBRSxFQUFFLENBQUMsUUFBUTtTQUM1QyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFwTEQsOEJBb0xDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgUHJvdmlkZXIsXG4gIENvbnRhaW5lclByb3ZpZGVyLFxuICBDbGFzc1Byb3ZpZGVyLFxuICBGYWN0b3J5UHJvdmlkZXIsXG4gIFZhbHVlUHJvdmlkZXIsXG4gIERlcGVuZGVuY3ksXG4gIEluamVjdGFibGUsXG4gIEV4aXN0aW5nUHJvdmlkZXIsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgSW52YWxpZERlcGVuZGVuY3lFcnJvciwgTWlzc2luZ0RlcGVuZGVuY3lFcnJvciwgTWlzc2luZ1Byb3ZpZGVyRXJyb3IsIFJlY3Vyc2l2ZURlcGVuZGVuY3lFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IERFUF9JRFNfTUVUQURBVEEsIE9QVElPTkFMX0RFUFNfTUVUQURBVEEgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpbmplY3RhYmxlVG9TdHJpbmcgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICcuL2luamVjdGlvbi10b2tlbic7XG5cbmV4cG9ydCBjbGFzcyBDb250YWluZXIge1xuICBwYXJlbnRDb250YWluZXI/OiBDb250YWluZXI7XG4gIHByb3ZpZGVycyA9IG5ldyBNYXA8SW5qZWN0YWJsZSwgQ29udGFpbmVyUHJvdmlkZXI+KCk7XG5cbiAgc2V0UGFyZW50KGNvbnRhaW5lcjogQ29udGFpbmVyKSB7XG4gICAgdGhpcy5wYXJlbnRDb250YWluZXIgPSBjb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIG5ldyBvciByZXBsYWNlcyBwcm92aWRlcnNcbiAgICovXG4gIHByb3ZpZGUocHJvdmlkZXJzOiBQcm92aWRlcltdKSB7XG4gICAgdGhpcy5yZWdpc3RlclNpbmdsZVByb3ZpZGVycyhcbiAgICAgIHByb3ZpZGVycy5maWx0ZXIocHJvdmlkZXIgPT4gIXByb3ZpZGVyLm11bHRpKSxcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3Rlck11bHRpUHJvdmlkZXJzKFxuICAgICAgcHJvdmlkZXJzLmZpbHRlcihwcm92aWRlciA9PiBwcm92aWRlci5tdWx0aSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIGluc3RhbnRpYXRlcyBhbiBpbmplY3RhYmxlXG4gICAqL1xuICBhc3luYyBnZXQ8VD4oaW5qZWN0YWJsZTogSW5qZWN0YWJsZSk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmUoaW5qZWN0YWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCBpbmplY3RhYmxlIGlzIHByb3ZpZGVkIHdpdGhpbiB0aGUgc2NvcGVcbiAgICovXG4gIGhhcyhpbmplY3RhYmxlOiBJbmplY3RhYmxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvdmlkZXJzLmhhcyhpbmplY3RhYmxlKSB8fCB0aGlzLnBhcmVudENvbnRhaW5lcj8uaGFzKGluamVjdGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBwcm92aWRlciwgZm9sbG93aW5nIGRlcHMgYXJlIHJlc29sdmVkIHJlY3Vyc2l2ZWx5XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmUoXG4gICAgaW5qZWN0YWJsZTogSW5qZWN0YWJsZSxcbiAgICBvcHRpb25hbCA9IGZhbHNlLFxuICAgIHNlcXVlbmNlRGVwczogRGVwZW5kZW5jeVtdID0gW10sXG4gICkge1xuICAgIGxldCBwcm92aWRlciA9IHRoaXMucHJvdmlkZXJzLmdldChpbmplY3RhYmxlKTtcblxuICAgIGlmICghcHJvdmlkZXIgJiYgdGhpcy5wYXJlbnRDb250YWluZXI/LmhhcyhpbmplY3RhYmxlKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50Q29udGFpbmVyLmdldChpbmplY3RhYmxlKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb3ZpZGVyICYmICFvcHRpb25hbCkge1xuICAgICAgdGhyb3cgbmV3IE1pc3NpbmdQcm92aWRlckVycm9yKGluamVjdGFibGUpO1xuICAgIH1cblxuICAgIHByb3ZpZGVyID0gcHJvdmlkZXIgPz8ge307XG5cbiAgICBpZiAocHJvdmlkZXIudmFsdWUpIHtcbiAgICAgIHJldHVybiBwcm92aWRlci52YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZERlcHMgPSBbXSBhcyB1bmtub3duW107XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgZGVwXSBvZiBwcm92aWRlci5kZXBzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKCFkZXAuaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWREZXBlbmRlbmN5RXJyb3IocHJvdmlkZXIudHlwZSA/PyBpbmplY3RhYmxlLCBwcm92aWRlci5kZXBzLCBpbmRleCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZXF1ZW5jZURlcHMuZmluZChzZXFEZXAgPT4gc2VxRGVwID09PSBkZXApKSB7XG4gICAgICAgIHRocm93IG5ldyBSZWN1cnNpdmVEZXBlbmRlbmN5RXJyb3IocHJvdmlkZXIudHlwZSA/PyBpbmplY3RhYmxlLCBwcm92aWRlci5kZXBzLCBpbmRleCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlcFByb3ZpZGVyID0gdGhpcy5wcm92aWRlcnMuZ2V0KGRlcC5pZCk7XG5cbiAgICAgIGlmIChkZXBQcm92aWRlcikge1xuICAgICAgICByZXNvbHZlZERlcHMucHVzaChhd2FpdCB0aGlzLnJlc29sdmUoZGVwLmlkLCBkZXAub3B0aW9uYWwsIFsuLi5zZXF1ZW5jZURlcHMsIC4uLnByb3ZpZGVyLmRlcHNdKSk7XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnBhcmVudENvbnRhaW5lcj8uaGFzKGRlcC5pZCkpIHtcbiAgICAgICAgcmVzb2x2ZWREZXBzLnB1c2goYXdhaXQgdGhpcy5wYXJlbnRDb250YWluZXIuZ2V0KGRlcC5pZCkpO1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRlcC5vcHRpb25hbCkge1xuICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0RlcGVuZGVuY3lFcnJvcihwcm92aWRlci50eXBlID8/IGluamVjdGFibGUsIHByb3ZpZGVyLmRlcHMsIGluZGV4KTtcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZWREZXBzLnB1c2godW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBsZXQgdmFsdWU6IHVua25vd247XG5cbiAgICBpZiAocHJvdmlkZXIuZmFjdG9yeSkge1xuICAgICAgdmFsdWUgPSBhd2FpdCBwcm92aWRlci5mYWN0b3J5KC4uLnJlc29sdmVkRGVwcyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3ZpZGVyLnR5cGUpIHtcbiAgICAgIHZhbHVlID0gbmV3IHByb3ZpZGVyLnR5cGUoLi4ucmVzb2x2ZWREZXBzKTtcbiAgICB9XG5cbiAgICB0aGlzLnByb3ZpZGVycy5zZXQoaW5qZWN0YWJsZSwgeyAuLi5wcm92aWRlciwgdmFsdWUgfSk7XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyTXVsdGlQcm92aWRlcnMocHJvdmlkZXJzOiBQcm92aWRlcltdKSB7XG4gICAgcHJvdmlkZXJzLmZvckVhY2gocHJvdmlkZXIgPT4ge1xuICAgICAgY29uc3QgaW5qZWN0YWJsZUlkID0gbmV3IEluamVjdGlvblRva2VuKGluamVjdGFibGVUb1N0cmluZyhwcm92aWRlci5wcm92aWRlKSk7XG5cbiAgICAgIC8vIGNyZWF0ZXMgZGVwZW5kZW5jeSBwcm92aWRlciBmb3IgdGhlIG1haW4gcHJvdmlkZXJcbiAgICAgIHRoaXMucmVnaXN0ZXJTaW5nbGVQcm92aWRlcnMoW3sgLi4ucHJvdmlkZXIsIHByb3ZpZGU6IGluamVjdGFibGVJZCB9XSk7XG5cbiAgICAgIGNvbnN0IGNvbnRhaW5lclByb3ZpZGVyID0gdGhpcy5wcm92aWRlcnMuZ2V0KHByb3ZpZGVyLnByb3ZpZGUpO1xuXG4gICAgICBpZiAoY29udGFpbmVyUHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lclByb3ZpZGVyLmRlcHMucHVzaCh7IGlkOiBpbmplY3RhYmxlSWQgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGNyZWF0ZXMgbWFpbiBwcm92aWRlciB0aGF0IHdpbGwgaG9sZCBhbGwgb3RoZXIgcHJvdmlkZXJzIGFzIGRlcHNcbiAgICAgIHRoaXMucmVnaXN0ZXJTaW5nbGVQcm92aWRlcnMoW3tcbiAgICAgICAgcHJvdmlkZTogcHJvdmlkZXIucHJvdmlkZSxcbiAgICAgICAgdXNlRmFjdG9yeTogKC4uLmRlcHMpID0+IGRlcHMsXG4gICAgICAgIGRlcHM6IFtpbmplY3RhYmxlSWRdLFxuICAgICAgfV0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclNpbmdsZVByb3ZpZGVycyhwcm92aWRlcnM6IFByb3ZpZGVyW10pIHtcbiAgICBwcm92aWRlcnMuZm9yRWFjaChwcm92aWRlciA9PiB7XG4gICAgICBpZiAoKHByb3ZpZGVyIGFzIENsYXNzUHJvdmlkZXIpLnVzZUNsYXNzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyQ2xhc3NQcm92aWRlcihwcm92aWRlciBhcyBDbGFzc1Byb3ZpZGVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKChwcm92aWRlciBhcyBGYWN0b3J5UHJvdmlkZXIpLnVzZUZhY3RvcnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJGYWN0b3J5UHJvdmlkZXIocHJvdmlkZXIgYXMgRmFjdG9yeVByb3ZpZGVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKChwcm92aWRlciBhcyBWYWx1ZVByb3ZpZGVyKS51c2VWYWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlclZhbHVlUHJvdmlkZXIocHJvdmlkZXIgYXMgVmFsdWVQcm92aWRlcik7XG4gICAgICB9XG5cbiAgICAgIGlmICgocHJvdmlkZXIgYXMgRXhpc3RpbmdQcm92aWRlcikudXNlRXhpc3RpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJFeGlzdGluZ1Byb3ZpZGVyKHByb3ZpZGVyIGFzIEV4aXN0aW5nUHJvdmlkZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckNsYXNzUHJvdmlkZXIocHJvdmlkZXI6IENsYXNzUHJvdmlkZXIpIHtcbiAgICBjb25zdCBpZHMgPSBSZWZsZWN0LmdldE1ldGFkYXRhKERFUF9JRFNfTUVUQURBVEEsIHByb3ZpZGVyLnVzZUNsYXNzKSA/PyBbXTtcbiAgICBjb25zdCBvcHRpb25hbHMgPSBSZWZsZWN0LmdldE1ldGFkYXRhKE9QVElPTkFMX0RFUFNfTUVUQURBVEEsIHByb3ZpZGVyLnVzZUNsYXNzKSA/PyBbXTtcblxuICAgIHRoaXMucHJvdmlkZXJzLnNldChwcm92aWRlci5wcm92aWRlLCB7XG4gICAgICB0eXBlOiBwcm92aWRlci51c2VDbGFzcyxcbiAgICAgIGRlcHM6IGlkcy5tYXAoKGlkOiBJbmplY3RhYmxlLCBpbmRleDogbnVtYmVyKSA9PlxuICAgICAgICAoeyBpZCwgb3B0aW9uYWw6IG9wdGlvbmFsc1tpbmRleF0gfSksXG4gICAgICApLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckZhY3RvcnlQcm92aWRlcihwcm92aWRlcjogRmFjdG9yeVByb3ZpZGVyKSB7XG4gICAgdGhpcy5wcm92aWRlcnMuc2V0KHByb3ZpZGVyLnByb3ZpZGUsIHtcbiAgICAgIGRlcHM6IHByb3ZpZGVyLmRlcHM/Lm1hcChpZCA9PiAoeyBpZCB9KSkgPz8gW10sXG4gICAgICBmYWN0b3J5OiBwcm92aWRlci51c2VGYWN0b3J5LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclZhbHVlUHJvdmlkZXIocHJvdmlkZXI6IFZhbHVlUHJvdmlkZXIpIHtcbiAgICB0aGlzLnByb3ZpZGVycy5zZXQocHJvdmlkZXIucHJvdmlkZSwge1xuICAgICAgdmFsdWU6IHByb3ZpZGVyLnVzZVZhbHVlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckV4aXN0aW5nUHJvdmlkZXIocHJvdmlkZXI6IEV4aXN0aW5nUHJvdmlkZXIpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRmFjdG9yeVByb3ZpZGVyKHtcbiAgICAgIHByb3ZpZGU6IHByb3ZpZGVyLnByb3ZpZGUsXG4gICAgICBkZXBzOiBbcHJvdmlkZXIudXNlRXhpc3RpbmddLFxuICAgICAgdXNlRmFjdG9yeTogKGV4aXN0aW5nOiB1bmtub3duKSA9PiBleGlzdGluZyxcbiAgICB9KTtcbiAgfVxufVxuIl19