UNPKG

aws-cdk

Version:

CDK Toolkit, the command line tool for CDK apps

125 lines 21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable import/order */ const os = require("os"); const path = require("path"); const fs = require("fs-extra"); const user_configuration_1 = require("../../lib/cli/user-configuration"); const context_1 = require("../../lib/api/context"); const settings_1 = require("../../lib/api/settings"); const state = {}; beforeEach(async () => { state.previousWorkingDir = process.cwd(); state.tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'aws-cdk-test')); // eslint-disable-next-line no-console console.log('Temporary working directory:', state.tempDir); process.chdir(state.tempDir); }); afterEach(async () => { // eslint-disable-next-line no-console console.log('Switching back to', state.previousWorkingDir, 'cleaning up', state.tempDir); process.chdir(state.previousWorkingDir); await fs.remove(state.tempDir); }); test('load context from both files if available', async () => { // GIVEN await fs.writeJSON(user_configuration_1.PROJECT_CONTEXT, { foo: 'bar' }); await fs.writeJSON(user_configuration_1.PROJECT_CONFIG, { context: { boo: 'far' } }); // WHEN const config = await new user_configuration_1.Configuration({ readUserContext: false }).load(); // THEN expect(config.context.get('foo')).toBe('bar'); expect(config.context.get('boo')).toBe('far'); }); test('deleted context disappears from new file', async () => { // GIVEN await fs.writeJSON(user_configuration_1.PROJECT_CONTEXT, { foo: 'bar' }); await fs.writeJSON(user_configuration_1.PROJECT_CONFIG, { context: { foo: 'bar' } }); const config = await new user_configuration_1.Configuration({ readUserContext: false }).load(); // WHEN config.context.unset('foo'); await config.context.save(user_configuration_1.PROJECT_CONTEXT); // THEN expect(await fs.readJSON(user_configuration_1.PROJECT_CONTEXT)).toEqual({}); expect(await fs.readJSON(user_configuration_1.PROJECT_CONFIG)).toEqual({ context: { foo: 'bar' } }); }); test('clear deletes from new file', async () => { // GIVEN await fs.writeJSON(user_configuration_1.PROJECT_CONTEXT, { foo: 'bar' }); await fs.writeJSON(user_configuration_1.PROJECT_CONFIG, { context: { boo: 'far' } }); const config = await new user_configuration_1.Configuration({ readUserContext: false }).load(); // WHEN config.context.clear(); await config.context.save(user_configuration_1.PROJECT_CONTEXT); // THEN expect(await fs.readJSON(user_configuration_1.PROJECT_CONTEXT)).toEqual({}); expect(await fs.readJSON(user_configuration_1.PROJECT_CONFIG)).toEqual({ context: { boo: 'far' } }); }); test('context is preserved in the location from which it is read', async () => { // GIVEN await fs.writeJSON(user_configuration_1.PROJECT_CONFIG, { context: { 'boo:boo': 'far' } }); const config = await new user_configuration_1.Configuration({ readUserContext: false }).load(); // WHEN expect(config.context.all).toEqual({ 'boo:boo': 'far' }); await config.context.save(user_configuration_1.PROJECT_CONTEXT); // THEN expect(await fs.readJSON(user_configuration_1.PROJECT_CONTEXT)).toEqual({}); expect(await fs.readJSON(user_configuration_1.PROJECT_CONFIG)).toEqual({ context: { 'boo:boo': 'far' } }); }); test('save no context in old file', async () => { // GIVEN await fs.writeJSON(user_configuration_1.PROJECT_CONFIG, {}); await fs.writeJSON(user_configuration_1.PROJECT_CONTEXT, { boo: 'far' }); const config = await new user_configuration_1.Configuration({ readUserContext: false }).load(); // WHEN expect(config.context.all).toEqual({ boo: 'far' }); await config.context.save(user_configuration_1.PROJECT_CONTEXT); // THEN expect(await fs.readJSON(user_configuration_1.PROJECT_CONTEXT)).toEqual({ boo: 'far' }); }); test('command line context is merged with stored context', async () => { // GIVEN await fs.writeJSON(user_configuration_1.PROJECT_CONTEXT, { boo: 'far' }); const config = await new user_configuration_1.Configuration({ readUserContext: false, commandLineArguments: { context: ['foo=bar'], _: ['command'], }, }).load(); // WHEN expect(config.context.all).toEqual({ foo: 'bar', boo: 'far' }); }); test('can save and load', async () => { // GIVEN const config1 = await new user_configuration_1.Configuration({ readUserContext: false }).load(); config1.context.set('some_key', 'some_value'); await config1.context.save(user_configuration_1.PROJECT_CONTEXT); expect(config1.context.get('some_key')).toEqual('some_value'); // WHEN const config2 = await new user_configuration_1.Configuration({ readUserContext: false }).load(); // THEN expect(config2.context.get('some_key')).toEqual('some_value'); }); test('transient values arent saved to disk', async () => { // GIVEN const config1 = await new user_configuration_1.Configuration({ readUserContext: false }).load(); config1.context.set('some_key', { [context_1.TRANSIENT_CONTEXT_KEY]: true, value: 'some_value' }); await config1.context.save(user_configuration_1.PROJECT_CONTEXT); expect(config1.context.get('some_key').value).toEqual('some_value'); // WHEN const config2 = await new user_configuration_1.Configuration({ readUserContext: false }).load(); // THEN expect(config2.context.get('some_key')).toEqual(undefined); }); test('cannot save readonly values', async () => { // GIVEN const settings = new settings_1.Settings({ foo: 'bar', boo: 'far' }, true); const context = new context_1.Context({ fileName: user_configuration_1.PROJECT_CONFIG, bag: settings, }); // THEN await expect(context.save(user_configuration_1.PROJECT_CONFIG)).rejects.toThrow(/Context file cdk.json is read only!/); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jb250ZXh0LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1c2VyLWNvbnRleHQudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGlDQUFpQztBQUNqQyx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLCtCQUErQjtBQUMvQix5RUFBa0c7QUFDbEcsbURBQXVFO0FBQ3ZFLHFEQUFrRDtBQUVsRCxNQUFNLEtBQUssR0FHUCxFQUFFLENBQUM7QUFFUCxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7SUFDcEIsS0FBSyxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN6QyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLHNDQUFzQztJQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzRCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUMsQ0FBQztBQUVILFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRTtJQUNuQixzQ0FBc0M7SUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6RixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxrQkFBbUIsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBUSxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsMkNBQTJDLEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFD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LENBQUMsWUFBWSxDQUFDLENBQUM7SUFFcEUsT0FBTztJQUNQLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxrQ0FBYSxDQUFDLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFM0UsT0FBTztJQUNQLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM3RCxDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyw2QkFBNkIsRUFBRSxLQUFLLElBQUksRUFBRTtJQUM3QyxRQUFRO0lBQ1IsTUFBTSxRQUFRLEdBQUcsSUFBSSxtQkFBUSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDO1FBQzFCLFFBQVEsRUFBRSxtQ0FBYztRQUN4QixHQUFHLEVBQUUsUUFBUTtLQUNkLENBQUMsQ0FBQztJQUVILE9BQU87SUFDUCxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG1DQUFjLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMscUNBQXFDLENBQUMsQ0FBQztBQUNwRyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9vcmRlciAqL1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24sIFBST0pFQ1RfQ09ORklHLCBQUk9KRUNUX0NPTlRFWFQgfSBmcm9tICcuLi8uLi9saWIvY2xpL3VzZXItY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBDb250ZXh0LCBUUkFOU0lFTlRfQ09OVEVYVF9LRVkgfSBmcm9tICcuLi8uLi9saWIvYXBpL2NvbnRleHQnO1xuaW1wb3J0IHsgU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9saWIvYXBpL3NldHRpbmdzJztcblxuY29uc3Qgc3RhdGU6IHtcbiAgcHJldmlvdXNXb3JraW5nRGlyPzogc3RyaW5nO1xuICB0ZW1wRGlyPzogc3RyaW5nO1xufSA9IHt9O1xuXG5iZWZvcmVFYWNoKGFzeW5jICgpID0+IHtcbiAgc3RhdGUucHJldmlvdXNXb3JraW5nRGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgc3RhdGUudGVtcERpciA9IGF3YWl0IGZzLm1rZHRlbXAocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnYXdzLWNkay10ZXN0JykpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmxvZygnVGVtcG9yYXJ5IHdvcmtpbmcgZGlyZWN0b3J5OicsIHN0YXRlLnRlbXBEaXIpO1xuICBwcm9jZXNzLmNoZGlyKHN0YXRlLnRlbXBEaXIpO1xufSk7XG5cbmFmdGVyRWFjaChhc3luYyAoKSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gIGNvbnNvbGUubG9nKCdTd2l0Y2hpbmcgYmFjayB0bycsIHN0YXRlLnByZXZpb3VzV29ya2luZ0RpciwgJ2NsZWFuaW5nIHVwJywgc3RhdGUudGVtcERpcik7XG4gIHByb2Nlc3MuY2hkaXIoc3RhdGUucHJldmlvdXNXb3JraW5nRGlyISk7XG4gIGF3YWl0IGZzLnJlbW92ZShzdGF0ZS50ZW1wRGlyISk7XG59KTtcblxudGVzdCgnbG9hZCBjb250ZXh0IGZyb20gYm90aCBmaWxlcyBpZiBhdmFpbGFibGUnLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGF3YWl0IGZzLndyaXRlSlNPTihQUk9KRUNUX0NPTlRFWFQsIHsgZm9vOiAnYmFyJyB9KTtcbiAgYXdhaXQgZnMud3JpdGVKU09OKFBST0pFQ1RfQ09ORklHLCB7IGNvbnRleHQ6IHsgYm9vOiAnZmFyJyB9IH0pO1xuXG4gIC8vIFdIRU5cbiAgY29uc3QgY29uZmlnID0gYXdhaXQgbmV3IENvbmZpZ3VyYXRpb24oeyByZWFkVXNlckNvbnRleHQ6IGZhbHNlIH0pLmxvYWQoKTtcblxuICAvLyBUSEVOXG4gIGV4cGVjdChjb25maWcuY29udGV4dC5nZXQoJ2ZvbycpKS50b0JlKCdiYXInKTtcbiAgZXhwZWN0KGNvbmZpZy5jb250ZXh0LmdldCgnYm9vJykpLnRvQmUoJ2ZhcicpO1xufSk7XG5cbnRlc3QoJ2RlbGV0ZWQgY29udGV4dCBkaXNhcHBlYXJzIGZyb20gbmV3IGZpbGUnLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGF3YWl0IGZzLndyaXRlSlNPTihQUk9KRUNUX0NPTlRFWFQsIHsgZm9vOiAnYmFyJyB9KTtcbiAgYXdhaXQgZnMud3JpdGVKU09OKFBST0pFQ1RfQ09ORklHLCB7IGNvbnRleHQ6IHsgZm9vOiAnYmFyJyB9IH0pO1xuICBjb25zdCBjb25maWcgPSBhd2FpdCBuZXcgQ29uZmlndXJhdGlvbih7IHJlYWRVc2VyQ29udGV4dDogZmFsc2UgfSkubG9hZCgpO1xuXG4gIC8vIFdIRU5cbiAgY29uZmlnLmNvbnRleHQudW5zZXQoJ2ZvbycpO1xuICBhd2FpdCBjb25maWcuY29udGV4dC5zYXZlKFBST0pFQ1RfQ09OVEVYVCk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3QoYXdhaXQgZnMucmVhZEpTT04oUFJPSkVDVF9DT05URVhUKSkudG9FcXVhbCh7fSk7XG4gIGV4cGVjdChhd2FpdCBmcy5yZWFkSlNPTihQUk9KRUNUX0NPTkZJRykpLnRvRXF1YWwoeyBjb250ZXh0OiB7IGZvbzogJ2JhcicgfSB9KTtcbn0pO1xuXG50ZXN0KCdjbGVhciBkZWxldGVzIGZyb20gbmV3IGZpbGUnLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGF3YWl0IGZzLndyaXRlSlNPTihQUk9KRUNUX0NPTlRFWFQsIHsgZm9vOiAnYmFyJyB9KTtcbiAgYXdhaXQgZnMud3JpdGVKU09OKFBST0pFQ1RfQ09ORklHLCB7IGNvbnRleHQ6IHsgYm9vOiAnZmFyJyB9IH0pO1xuICBjb25zdCBjb25maWcgPSBhd2FpdCBuZXcgQ29uZmlndXJhdGlvbih7IHJlYWRVc2VyQ29udGV4dDogZmFsc2UgfSkubG9hZCgpO1xuXG4gIC8vIFdIRU5cbiAgY29uZmlnLmNvbnRleHQuY2xlYXIoKTtcbiAgYXdhaXQgY29uZmlnLmNvbnRleHQuc2F2ZShQUk9KRUNUX0NPTlRFWFQpO1xuXG4gIC8vIFRIRU5cbiAgZXhwZWN0KGF3YWl0IGZzLnJlYWRKU09OKFBST0pFQ1RfQ09OVEVYVCkpLnRvRXF1YWwoe30pO1xuICBleHBlY3QoYXdhaXQgZnMucmVhZEpTT04oUFJPSkVDVF9DT05GSUcpKS50b0VxdWFsKHsgY29udGV4dDogeyBib286ICdmYXInIH0gfSk7XG59KTtcblxudGVzdCgnY29udGV4dCBpcyBwcmVzZXJ2ZWQgaW4gdGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggaXQgaXMgcmVhZCcsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgYXdhaXQgZnMud3JpdGVKU09OKFBST0pFQ1RfQ09ORklHLCB7IGNvbnRleHQ6IHsgJ2Jvbzpib28nOiAnZmFyJyB9IH0pO1xuICBjb25zdCBjb25maWcgPSBhd2FpdCBuZXcgQ29uZmlndXJhdGlvbih7IHJlYWRVc2VyQ29udGV4dDogZmFsc2UgfSkubG9hZCgpO1xuXG4gIC8vIFdIRU5cbiAgZXhwZWN0KGNvbmZpZy5jb250ZXh0LmFsbCkudG9FcXVhbCh7ICdib286Ym9vJzogJ2ZhcicgfSk7XG4gIGF3YWl0IGNvbmZpZy5jb250ZXh0LnNhdmUoUFJPSkVDVF9DT05URVhUKTtcblxuICAvLyBUSEVOXG4gIGV4cGVjdChhd2FpdCBmcy5yZWFkSlNPTihQUk9KRUNUX0NPTlRFWFQpKS50b0VxdWFsKHt9KTtcbiAgZXhwZWN0KGF3YWl0IGZzLnJlYWRKU09OKFBST0pFQ1RfQ09ORklHKSkudG9FcXVhbCh7IGNvbnRleHQ6IHsgJ2Jvbzpib28nOiAnZmFyJyB9IH0pO1xufSk7XG5cbnRlc3QoJ3NhdmUgbm8gY29udGV4dCBpbiBvbGQgZmlsZScsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgYXdhaXQgZnMud3JpdGVKU09OKFBST0pFQ1RfQ09ORklHLCB7fSk7XG4gIGF3YWl0IGZzLndyaXRlSlNPTihQUk9KRUNUX0NPTlRFWFQsIHsgYm9vOiAnZmFyJyB9KTtcbiAgY29uc3QgY29uZmlnID0gYXdhaXQgbmV3IENvbmZpZ3VyYXRpb24oeyByZWFkVXNlckNvbnRleHQ6IGZhbHNlIH0pLmxvYWQoKTtcblxuICAvLyBXSEVOXG4gIGV4cGVjdChjb25maWcuY29udGV4dC5hbGwpLnRvRXF1YWwoeyBib286ICdmYXInIH0pO1xuICBhd2FpdCBjb25maWcuY29udGV4dC5zYXZlKFBST0pFQ1RfQ09OVEVYVCk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3QoYXdhaXQgZnMucmVhZEpTT04oUFJPSkVDVF9DT05URVhUKSkudG9FcXVhbCh7IGJvbzogJ2ZhcicgfSk7XG59KTtcblxudGVzdCgnY29tbWFuZCBsaW5lIGNvbnRleHQgaXMgbWVyZ2VkIHdpdGggc3RvcmVkIGNvbnRleHQnLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGF3YWl0IGZzLndyaXRlSlNPTihQUk9KRUNUX0NPTlRFWFQsIHsgYm9vOiAnZmFyJyB9KTtcbiAgY29uc3QgY29uZmlnID0gYXdhaXQgbmV3IENvbmZpZ3VyYXRpb24oe1xuICAgIHJlYWRVc2VyQ29udGV4dDogZmFsc2UsXG4gICAgY29tbWFuZExpbmVBcmd1bWVudHM6IHtcbiAgICAgIGNvbnRleHQ6IFsnZm9vPWJhciddLFxuICAgICAgXzogWydjb21tYW5kJ10sXG4gICAgfSBhcyBhbnksXG4gIH0pLmxvYWQoKTtcblxuICAvLyBXSEVOXG4gIGV4cGVjdChjb25maWcuY29udGV4dC5hbGwpLnRvRXF1YWwoeyBmb286ICdiYXInLCBib286ICdmYXInIH0pO1xufSk7XG5cbnRlc3QoJ2NhbiBzYXZlIGFuZCBsb2FkJywgYXN5bmMgKCkgPT4ge1xuICAvLyBHSVZFTlxuICBjb25zdCBjb25maWcxID0gYXdhaXQgbmV3IENvbmZpZ3VyYXRpb24oeyByZWFkVXNlckNvbnRleHQ6IGZhbHNlIH0pLmxvYWQoKTtcbiAgY29uZmlnMS5jb250ZXh0LnNldCgnc29tZV9rZXknLCAnc29tZV92YWx1ZScpO1xuICBhd2FpdCBjb25maWcxLmNvbnRleHQuc2F2ZShQUk9KRUNUX0NPTlRFWFQpO1xuICBleHBlY3QoY29uZmlnMS5jb250ZXh0LmdldCgnc29tZV9rZXknKSkudG9FcXVhbCgnc29tZV92YWx1ZScpO1xuXG4gIC8vIFdIRU5cbiAgY29uc3QgY29uZmlnMiA9IGF3YWl0IG5ldyBDb25maWd1cmF0aW9uKHsgcmVhZFVzZXJDb250ZXh0OiBmYWxzZSB9KS5sb2FkKCk7XG5cbiAgLy8gVEhFTlxuICBleHBlY3QoY29uZmlnMi5jb250ZXh0LmdldCgnc29tZV9rZXknKSkudG9FcXVhbCgnc29tZV92YWx1ZScpO1xufSk7XG5cbnRlc3QoJ3RyYW5zaWVudCB2YWx1ZXMgYXJlbnQgc2F2ZWQgdG8gZGlzaycsIGFzeW5jICgpID0+IHtcbiAgLy8gR0lWRU5cbiAgY29uc3QgY29uZmlnMSA9IGF3YWl0IG5ldyBDb25maWd1cmF0aW9uKHsgcmVhZFVzZXJDb250ZXh0OiBmYWxzZSB9KS5sb2FkKCk7XG4gIGNvbmZpZzEuY29udGV4dC5zZXQoJ3NvbWVfa2V5JywgeyBbVFJBTlNJRU5UX0NPTlRFWFRfS0VZXTogdHJ1ZSwgdmFsdWU6ICdzb21lX3ZhbHVlJyB9KTtcbiAgYXdhaXQgY29uZmlnMS5jb250ZXh0LnNhdmUoUFJPSkVDVF9DT05URVhUKTtcbiAgZXhwZWN0KGNvbmZpZzEuY29udGV4dC5nZXQoJ3NvbWVfa2V5JykudmFsdWUpLnRvRXF1YWwoJ3NvbWVfdmFsdWUnKTtcblxuICAvLyBXSEVOXG4gIGNvbnN0IGNvbmZpZzIgPSBhd2FpdCBuZXcgQ29uZmlndXJhdGlvbih7IHJlYWRVc2VyQ29udGV4dDogZmFsc2UgfSkubG9hZCgpO1xuXG4gIC8vIFRIRU5cbiAgZXhwZWN0KGNvbmZpZzIuY29udGV4dC5nZXQoJ3NvbWVfa2V5JykpLnRvRXF1YWwodW5kZWZpbmVkKTtcbn0pO1xuXG50ZXN0KCdjYW5ub3Qgc2F2ZSByZWFkb25seSB2YWx1ZXMnLCBhc3luYyAoKSA9PiB7XG4gIC8vIEdJVkVOXG4gIGNvbnN0IHNldHRpbmdzID0gbmV3IFNldHRpbmdzKHsgZm9vOiAnYmFyJywgYm9vOiAnZmFyJyB9LCB0cnVlKTtcbiAgY29uc3QgY29udGV4dCA9IG5ldyBDb250ZXh0KHtcbiAgICBmaWxlTmFtZTogUFJPSkVDVF9DT05GSUcsXG4gICAgYmFnOiBzZXR0aW5ncyxcbiAgfSk7XG5cbiAgLy8gVEhFTlxuICBhd2FpdCBleHBlY3QoY29udGV4dC5zYXZlKFBST0pFQ1RfQ09ORklHKSkucmVqZWN0cy50b1Rocm93KC9Db250ZXh0IGZpbGUgY2RrLmpzb24gaXMgcmVhZCBvbmx5IS8pO1xufSk7XG4iXX0=