UNPKG

aws-cdk

Version:

AWS CDK CLI, the command line tool for CDK apps

174 lines 21.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TelemetrySession = void 0; const crypto_1 = require("crypto"); const toolkit_lib_1 = require("@aws-cdk/toolkit-lib"); const installation_id_1 = require("./installation-id"); const library_version_1 = require("./library-version"); const sanitation_1 = require("./sanitation"); const ci_systems_1 = require("../ci-systems"); const messages_1 = require("../telemetry/messages"); const ci_1 = require("../util/ci"); const version_1 = require("../version"); const error_1 = require("./error"); const ABORTED_ERROR_MESSAGE = '__CDK-Toolkit__Aborted'; class TelemetrySession { constructor(props) { this.props = props; this.count = 0; this.ioHost = props.ioHost; this.client = props.client; } async begin() { // sanitize the raw cli input const { path, parameters } = (0, sanitation_1.sanitizeCommandLineArguments)(this.props.arguments); this._sessionInfo = { identifiers: { installationId: await (0, installation_id_1.getOrCreateInstallationId)(this.ioHost.asIoHelper()), sessionId: (0, crypto_1.randomUUID)(), telemetryVersion: '2.0', cdkCliVersion: (0, version_1.versionNumber)(), cdkLibraryVersion: await (0, library_version_1.getLibraryVersion)(this.ioHost.asIoHelper()), }, event: { command: { path, parameters, config: { context: (0, sanitation_1.sanitizeContext)(this.props.context), }, }, }, environment: { ci: (0, ci_1.isCI)() || Boolean((0, ci_systems_1.detectCiSystem)()), os: { platform: process.platform, release: process.release.name, }, nodeVersion: process.version, }, project: {}, }; // If SIGINT has a listener installed, its default behavior will be removed (Node.js will no longer exit). // This ensures that on SIGINT we process safely close the telemetry session before exiting. process.on('SIGINT', async () => { try { await this.end({ name: error_1.USER_INTERRUPTED_CODE, message: ABORTED_ERROR_MESSAGE, }); } catch (e) { await this.ioHost.defaults.trace(`Ending Telemetry failed: ${e.message}`); } process.exit(1); }); // Begin the session span this.span = await this.ioHost.asIoHelper().span(messages_1.CLI_PRIVATE_SPAN.COMMAND).begin({}); } async attachRegion(region) { this.sessionInfo.identifiers = { ...this.sessionInfo.identifiers, region, }; } /** * Attach a language guess */ attachLanguage(language) { // Don't want to crash accidentally if (!this._sessionInfo) { return; } if (language) { mutable(this.sessionInfo.project).language = language; } } /** * Attach our best guess at running under an agent or not */ attachAgent(isAgent) { // Don't want to crash accidentally if (!this._sessionInfo) { return; } mutable(this.sessionInfo.environment).agent = isAgent; } /** * Attach the CDK library version * * By default the telemetry will guess at the CDK library version if it so * happens that the CDK project is an NPM project and the CDK CLI is executed * in the root of NPM project with `aws-cdk-lib` available in `node_modules`. * This may succeed or may fail. * * Once we have produced and loaded the cloud assembly more accurate * information becomes available that we can add in. */ attachCdkLibVersion(libVersion) { // Don't want to crash accidentally if (!this._sessionInfo) { return; } mutable(this.sessionInfo.identifiers).cdkLibraryVersion = libVersion; } /** * When the command is complete, so is the CliIoHost. Ends the span of the entire CliIoHost * and notifies with an optional error message in the data. */ async end(error) { await this.span?.end({ error }); // Ideally span.end() should no-op if called twice, but that is not the case right now this.span = undefined; await this.client.flush(); } async emit(event) { this.count += 1; return this.client.emit({ event: { command: this.sessionInfo.event.command, state: getState(event.error), eventType: event.eventType, }, identifiers: { ...this.sessionInfo.identifiers, eventId: `${this.sessionInfo.identifiers.sessionId}:${this.count}`, timestamp: new Date().toISOString(), }, environment: this.sessionInfo.environment, project: this.sessionInfo.project, duration: { total: event.duration, }, ...(event.error ? { error: { name: event.error.name, }, } : {}), ...(event.counters && Object.keys(event.counters).length > 0 ? { counters: event.counters } : {}), }); } get sessionInfo() { if (!this._sessionInfo) { throw new toolkit_lib_1.ToolkitError('SessionNotInitialized', 'Session Info not initialized. Call begin() first.'); } return this._sessionInfo; } } exports.TelemetrySession = TelemetrySession; function getState(error) { if (error) { return isAbortedError(error) ? 'ABORTED' : 'FAILED'; } return 'SUCCEEDED'; } function isAbortedError(error) { if (error?.name === 'ToolkitError' && error?.message?.includes(ABORTED_ERROR_MESSAGE)) { return true; } return false; } function mutable(x) { return x; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW9DO0FBQ3BDLHNEQUFvRDtBQUNwRCx1REFBOEQ7QUFDOUQsdURBQXNEO0FBQ3RELDZDQUE2RTtBQUs3RSw4Q0FBK0M7QUFHL0Msb0RBQXlEO0FBQ3pELG1DQUFrQztBQUNsQyx3Q0FBMkM7QUFDM0MsbUNBQWdEO0FBRWhELE1BQU0scUJBQXFCLEdBQUcsd0JBQXdCLENBQUM7QUErQnZELE1BQWEsZ0JBQWdCO0lBTzNCLFlBQTZCLEtBQTRCO1FBQTVCLFVBQUssR0FBTCxLQUFLLENBQXVCO1FBRmpELFVBQUssR0FBRyxDQUFDLENBQUM7UUFHaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUM3QixDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUs7UUFDaEIsNkJBQTZCO1FBQzdCLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBQSx5Q0FBNEIsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxZQUFZLEdBQUc7WUFDbEIsV0FBVyxFQUFFO2dCQUNYLGNBQWMsRUFBRSxNQUFNLElBQUEsMkNBQXlCLEVBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDekUsU0FBUyxFQUFFLElBQUEsbUJBQVUsR0FBRTtnQkFDdkIsZ0JBQWdCLEVBQUUsS0FBSztnQkFDdkIsYUFBYSxFQUFFLElBQUEsdUJBQWEsR0FBRTtnQkFDOUIsaUJBQWlCLEVBQUUsTUFBTSxJQUFBLG1DQUFpQixFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDckU7WUFDRCxLQUFLLEVBQUU7Z0JBQ0wsT0FBTyxFQUFF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QUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDbEcsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQVksV0FBVztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSwwQkFBWSxDQUFDLHVCQUF1QixFQUFFLG1EQUFtRCxDQUFDLENBQUM7UUFDdkcsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0NBQ0Y7QUEvSkQsNENBK0pDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBb0I7SUFDcEMsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEtBQW9CO0lBQzFDLElBQUksS0FBSyxFQUFFLElBQUksS0FBSyxjQUFjLElBQUksS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDO1FBQ3RGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsT0FBTyxDQUFtQixDQUFJO0lBQ3JDLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0IHsgZ2V0T3JDcmVhdGVJbnN0YWxsYXRpb25JZCB9IGZyb20gJy4vaW5zdGFsbGF0aW9uLWlkJztcbmltcG9ydCB7IGdldExpYnJhcnlWZXJzaW9uIH0gZnJvbSAnLi9saWJyYXJ5LXZlcnNpb24nO1xuaW1wb3J0IHsgc2FuaXRpemVDb21tYW5kTGluZUFyZ3VtZW50cywgc2FuaXRpemVDb250ZXh0IH0gZnJvbSAnLi9zYW5pdGF0aW9uJztcbmltcG9ydCB7IHR5cGUgRXZlbnRUeXBlLCB0eXBlIFNlc3Npb25TY2hlbWEsIHR5cGUgU3RhdGUsIHR5cGUgRXJyb3JEZXRhaWxzIH0gZnJvbSAnLi9zY2hlbWEnO1xuaW1wb3J0IHR5cGUgeyBJVGVsZW1ldHJ5U2luayB9IGZyb20gJy4vc2luay9zaW5rLWludGVyZmFjZSc7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tICcuLi8uLi9hcGkvY29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IElNZXNzYWdlU3BhbiB9IGZyb20gJy4uLy4uL2FwaS1wcml2YXRlJztcbmltcG9ydCB7IGRldGVjdENpU3lzdGVtIH0gZnJvbSAnLi4vY2ktc3lzdGVtcyc7XG5pbXBvcnQgdHlwZSB7IENsaUlvSG9zdCB9IGZyb20gJy4uL2lvLWhvc3QvY2xpLWlvLWhvc3QnO1xuaW1wb3J0IHR5cGUgeyBFdmVudFJlc3VsdCB9IGZyb20gJy4uL3RlbGVtZXRyeS9tZXNzYWdlcyc7XG5pbXBvcnQgeyBDTElfUFJJVkFURV9TUEFOIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L21lc3NhZ2VzJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlsL2NpJztcbmltcG9ydCB7IHZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi92ZXJzaW9uJztcbmltcG9ydCB7IFVTRVJfSU5URVJSVVBURURfQ09ERSB9IGZyb20gJy4vZXJyb3InO1xuXG5jb25zdCBBQk9SVEVEX0VSUk9SX01FU1NBR0UgPSAnX19DREstVG9vbGtpdF9fQWJvcnRlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVsZW1ldHJ5U2Vzc2lvblByb3BzIHtcbiAgcmVhZG9ubHkgaW9Ib3N0OiBDbGlJb0hvc3Q7XG4gIHJlYWRvbmx5IGNsaWVudDogSVRlbGVtZXRyeVNpbms7XG4gIHJlYWRvbmx5IGFyZ3VtZW50czogYW55O1xuICByZWFkb25seSBjb250ZXh0OiBDb250ZXh0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbGVtZXRyeUV2ZW50IHtcbiAgcmVhZG9ubHkgZXZlbnRUeXBlOiBFdmVudFR5cGU7XG4gIHJlYWRvbmx5IGR1cmF0aW9uOiBudW1iZXI7XG4gIHJlYWRvbmx5IGVycm9yPzogRXJyb3JEZXRhaWxzO1xuICByZWFkb25seSBjb3VudGVycz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG59XG5cbi8qKlxuICogVGltZXIgb2YgYSBzaW5nbGUgZXZlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1pbmcge1xuICAvKipcbiAgICogVG90YWwgdGltZSBzcGVudCBpbiB0aGlzIG9wZXJhdGlvblxuICAgKi9cbiAgdG90YWxNczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDb3VudCBvZiBvcGVyYXRpb25zIHRoYXQgdG9nZXRoZXIgdG9vayBgdG90YWxNc2AuXG4gICAqL1xuICBjb3VudDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgVGVsZW1ldHJ5U2Vzc2lvbiB7XG4gIHByaXZhdGUgaW9Ib3N0OiBDbGlJb0hvc3Q7XG4gIHByaXZhdGUgY2xpZW50OiBJVGVsZW1ldHJ5U2luaztcbiAgcHJpdmF0ZSBfc2Vzc2lvbkluZm8/OiBTZXNzaW9uU2NoZW1hO1xuICBwcml2YXRlIHNwYW4/OiBJTWVzc2FnZVNwYW48RXZlbnRSZXN1bHQ+O1xuICBwcml2YXRlIGNvdW50ID0gMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBUZWxlbWV0cnlTZXNzaW9uUHJvcHMpIHtcbiAgICB0aGlzLmlvSG9zdCA9IHByb3BzLmlvSG9zdDtcbiAgICB0aGlzLmNsaWVudCA9IHByb3BzLmNsaWVudDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBiZWdpbigpIHtcbiAgICAvLyBzYW5pdGl6ZSB0aGUgcmF3IGNsaSBpbnB1dFxuICAgIGNvbnN0IHsgcGF0aCwgcGFyYW1ldGVycyB9ID0gc2FuaXRpemVDb21tYW5kTGluZUFyZ3VtZW50cyh0aGlzLnByb3BzLmFyZ3VtZW50cyk7XG4gICAgdGhpcy5fc2Vzc2lvbkluZm8gPSB7XG4gICAgICBpZGVudGlmaWVyczoge1xuICAgICAgICBpbnN0YWxsYXRpb25JZDogYXdhaXQgZ2V0T3JDcmVhdGVJbnN0YWxsYXRpb25JZCh0aGlzLmlvSG9zdC5hc0lvSGVscGVyKCkpLFxuICAgICAgICBzZXNzaW9uSWQ6IHJhbmRvbVVVSUQoKSxcbiAgICAgICAgdGVsZW1ldHJ5VmVyc2lvbjogJzIuMCcsXG4gICAgICAgIGNka0NsaVZlcnNpb246IHZlcnNpb25OdW1iZXIoKSxcbiAgICAgICAgY2RrTGlicmFyeVZlcnNpb246IGF3YWl0IGdldExpYnJhcnlWZXJzaW9uKHRoaXMuaW9Ib3N0LmFzSW9IZWxwZXIoKSksXG4gICAgICB9LFxuICAgICAgZXZlbnQ6IHtcbiAgICAgICAgY29tbWFuZDoge1xuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgIGNvbnRleHQ6IHNhbml0aXplQ29udGV4dCh0aGlzLnByb3BzLmNvbnRleHQpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgY2k6IGlzQ0koKSB8fCBCb29sZWFuKGRldGVjdENpU3lzdGVtKCkpLFxuICAgICAgICBvczoge1xuICAgICAgICAgIHBsYXRmb3JtOiBwcm9jZXNzLnBsYXRmb3JtLFxuICAgICAgICAgIHJlbGVhc2U6IHByb2Nlc3MucmVsZWFzZS5uYW1lLFxuICAgICAgICB9LFxuICAgICAgICBub2RlVmVyc2lvbjogcHJvY2Vzcy52ZXJzaW9uLFxuICAgICAgfSxcbiAgICAgIHByb2plY3Q6IHt9LFxuICAgIH07XG5cbiAgICAvLyBJZiBTSUdJTlQgaGFzIGEgbGlzdGVuZXIgaW5zdGFsbGVkLCBpdHMgZGVmYXVsdCBiZWhhdmlvciB3aWxsIGJlIHJlbW92ZWQgKE5vZGUuanMgd2lsbCBubyBsb25nZXIgZXhpdCkuXG4gICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgb24gU0lHSU5UIHdlIHByb2Nlc3Mgc2FmZWx5IGNsb3NlIHRoZSB0ZWxlbWV0cnkgc2Vzc2lvbiBiZWZvcmUgZXhpdGluZy5cbiAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmVuZCh7XG4gICAgICAgICAgbmFtZTogVVNFUl9JTlRFUlJVUFRFRF9DT0RFLFxuICAgICAgICAgIG1lc3NhZ2U6IEFCT1JURURfRVJST1JfTUVTU0FHRSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3QuZGVmYXVsdHMudHJhY2UoYEVuZGluZyBUZWxlbWV0cnkgZmFpbGVkOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9KTtcblxuICAgIC8vIEJlZ2luIHRoZSBzZXNzaW9uIHNwYW5cbiAgICB0aGlzLnNwYW4gPSBhd2FpdCB0aGlzLmlvSG9zdC5hc0lvSGVscGVyKCkuc3BhbihDTElfUFJJVkFURV9TUEFOLkNPTU1BTkQpLmJlZ2luKHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhdHRhY2hSZWdpb24ocmVnaW9uOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNlc3Npb25JbmZvLmlkZW50aWZpZXJzID0ge1xuICAgICAgLi4udGhpcy5zZXNzaW9uSW5mby5pZGVudGlmaWVycyxcbiAgICAgIHJlZ2lvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIGxhbmd1YWdlIGd1ZXNzXG4gICAqL1xuICBwdWJsaWMgYXR0YWNoTGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIC8vIERvbid0IHdhbnQgdG8gY3Jhc2ggYWNjaWRlbnRhbGx5XG4gICAgaWYgKCF0aGlzLl9zZXNzaW9uSW5mbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChsYW5ndWFnZSkge1xuICAgICAgbXV0YWJsZSh0aGlzLnNlc3Npb25JbmZvLnByb2plY3QpLmxhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBvdXIgYmVzdCBndWVzcyBhdCBydW5uaW5nIHVuZGVyIGFuIGFnZW50IG9yIG5vdFxuICAgKi9cbiAgcHVibGljIGF0dGFjaEFnZW50KGlzQWdlbnQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICAvLyBEb24ndCB3YW50IHRvIGNyYXNoIGFjY2lkZW50YWxseVxuICAgIGlmICghdGhpcy5fc2Vzc2lvbkluZm8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBtdXRhYmxlKHRoaXMuc2Vzc2lvbkluZm8uZW52aXJvbm1lbnQpLmFnZW50ID0gaXNBZ2VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggdGhlIENESyBsaWJyYXJ5IHZlcnNpb25cbiAgICpcbiAgICogQnkgZGVmYXVsdCB0aGUgdGVsZW1ldHJ5IHdpbGwgZ3Vlc3MgYXQgdGhlIENESyBsaWJyYXJ5IHZlcnNpb24gaWYgaXQgc29cbiAgICogaGFwcGVucyB0aGF0IHRoZSBDREsgcHJvamVjdCBpcyBhbiBOUE0gcHJvamVjdCBhbmQgdGhlIENESyBDTEkgaXMgZXhlY3V0ZWRcbiAgICogaW4gdGhlIHJvb3Qgb2YgTlBNIHByb2plY3Qgd2l0aCBgYXdzLWNkay1saWJgIGF2YWlsYWJsZSBpbiBgbm9kZV9tb2R1bGVzYC5cbiAgICogVGhpcyBtYXkgc3VjY2VlZCBvciBtYXkgZmFpbC5cbiAgICpcbiAgICogT25jZSB3ZSBoYXZlIHByb2R1Y2VkIGFuZCBsb2FkZWQgdGhlIGNsb3VkIGFzc2VtYmx5IG1vcmUgYWNjdXJhdGVcbiAgICogaW5mb3JtYXRpb24gYmVjb21lcyBhdmFpbGFibGUgdGhhdCB3ZSBjYW4gYWRkIGluLlxuICAgKi9cbiAgcHVibGljIGF0dGFjaENka0xpYlZlcnNpb24obGliVmVyc2lvbjogc3RyaW5nKSB7XG4gICAgLy8gRG9uJ3Qgd2FudCB0byBjcmFzaCBhY2NpZGVudGFsbHlcbiAgICBpZiAoIXRoaXMuX3Nlc3Npb25JbmZvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbXV0YWJsZSh0aGlzLnNlc3Npb25JbmZvLmlkZW50aWZpZXJzKS5jZGtMaWJyYXJ5VmVyc2lvbiA9IGxpYlZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogV2hlbiB0aGUgY29tbWFuZCBpcyBjb21wbGV0ZSwgc28gaXMgdGhlIENsaUlvSG9zdC4gRW5kcyB0aGUgc3BhbiBvZiB0aGUgZW50aXJlIENsaUlvSG9zdFxuICAgKiBhbmQgbm90aWZpZXMgd2l0aCBhbiBvcHRpb25hbCBlcnJvciBtZXNzYWdlIGluIHRoZSBkYXRhLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuZChlcnJvcj86IEVycm9yRGV0YWlscykge1xuICAgIGF3YWl0IHRoaXMuc3Bhbj8uZW5kKHsgZXJyb3IgfSk7XG4gICAgLy8gSWRlYWxseSBzcGFuLmVuZCgpIHNob3VsZCBuby1vcCBpZiBjYWxsZWQgdHdpY2UsIGJ1dCB0aGF0IGlzIG5vdCB0aGUgY2FzZSByaWdodCBub3dcbiAgICB0aGlzLnNwYW4gPSB1bmRlZmluZWQ7XG4gICAgYXdhaXQgdGhpcy5jbGllbnQuZmx1c2goKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBlbWl0KGV2ZW50OiBUZWxlbWV0cnlFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY291bnQgKz0gMTtcblxuICAgIHJldHVybiB0aGlzLmNsaWVudC5lbWl0KHtcbiAgICAgIGV2ZW50OiB7XG4gICAgICAgIGNvbW1hbmQ6IHRoaXMuc2Vzc2lvbkluZm8uZXZlbnQuY29tbWFuZCxcbiAgICAgICAgc3RhdGU6IGdldFN0YXRlKGV2ZW50LmVycm9yKSxcbiAgICAgICAgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGUsXG4gICAgICB9LFxuICAgICAgaWRlbnRpZmllcnM6IHtcbiAgICAgICAgLi4udGhpcy5zZXNzaW9uSW5mby5pZGVudGlmaWVycyxcbiAgICAgICAgZXZlbnRJZDogYCR7dGhpcy5zZXNzaW9uSW5mby5pZGVudGlmaWVycy5zZXNzaW9uSWR9OiR7dGhpcy5jb3VudH1gLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIH0sXG4gICAgICBlbnZpcm9ubWVudDogdGhpcy5zZXNzaW9uSW5mby5lbnZpcm9ubWVudCxcbiAgICAgIHByb2plY3Q6IHRoaXMuc2Vzc2lvbkluZm8ucHJvamVjdCxcbiAgICAgIGR1cmF0aW9uOiB7XG4gICAgICAgIHRvdGFsOiBldmVudC5kdXJhdGlvbixcbiAgICAgIH0sXG4gICAgICAuLi4oZXZlbnQuZXJyb3IgPyB7XG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgbmFtZTogZXZlbnQuZXJyb3IubmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH0gOiB7fSksXG4gICAgICAuLi4oZXZlbnQuY291bnRlcnMgJiYgT2JqZWN0LmtleXMoZXZlbnQuY291bnRlcnMpLmxlbmd0aCA+IDAgPyB7IGNvdW50ZXJzOiBldmVudC5jb3VudGVycyB9IDoge30pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgc2Vzc2lvbkluZm8oKTogU2Vzc2lvblNjaGVtYSB7XG4gICAgaWYgKCF0aGlzLl9zZXNzaW9uSW5mbykge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignU2Vzc2lvbk5vdEluaXRpYWxpemVkJywgJ1Nlc3Npb24gSW5mbyBub3QgaW5pdGlhbGl6ZWQuIENhbGwgYmVnaW4oKSBmaXJzdC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25JbmZvO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0YXRlKGVycm9yPzogRXJyb3JEZXRhaWxzKTogU3RhdGUge1xuICBpZiAoZXJyb3IpIHtcbiAgICByZXR1cm4gaXNBYm9ydGVkRXJyb3IoZXJyb3IpID8gJ0FCT1JURUQnIDogJ0ZBSUxFRCc7XG4gIH1cbiAgcmV0dXJuICdTVUNDRUVERUQnO1xufVxuXG5mdW5jdGlvbiBpc0Fib3J0ZWRFcnJvcihlcnJvcj86IEVycm9yRGV0YWlscykge1xuICBpZiAoZXJyb3I/Lm5hbWUgPT09ICdUb29sa2l0RXJyb3InICYmIGVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcyhBQk9SVEVEX0VSUk9SX01FU1NBR0UpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBtdXRhYmxlPEEgZXh0ZW5kcyBvYmplY3Q+KHg6IEEpOiB7IC1yZWFkb25seSBbayBpbiBrZXlvZiBBXTogQVtrXSB9IHtcbiAgcmV0dXJuIHg7XG59XG4iXX0=