@matthewbonig/rds-tools
Version:
A construct for working with RDS SQL servers
131 lines • 20.7 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DatabaseScript = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const child_process_1 = require("child_process");
const os = require("os");
const path = require("path");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const constructs_1 = require("constructs");
class DatabaseScript extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
const secret = props.secret || props.databaseInstance?.secret;
if (!secret) {
throw new Error('You must either provide a secret or there must be one available on the databaseInstance');
}
const vpc = props.vpc || props.databaseInstance?.vpc;
if (!vpc) {
throw new Error('Please provide a VPC to use, either on the `vpc` prop or via the `databaseInstance` prop.');
}
const assetPath = path.join(__dirname, 'layer');
this.providerLayer = new aws_cdk_lib_1.aws_lambda.LayerVersion(this, `${id}-deps-layer`, {
code: aws_cdk_lib_1.aws_lambda.Code.fromAsset(assetPath, {
bundling: {
image: aws_cdk_lib_1.aws_lambda.Runtime.NODEJS_16_X.bundlingImage,
command: [
'bash', '-c',
'echo npm i && cp -r /asset-input/* /asset-output',
],
environment: {
npm_config_cache: 'npm-cache',
},
user: 'root',
workingDirectory: '/asset-input/nodejs',
local: {
tryBundle(outputDir) {
console.log('Going to try local bundling...');
if (os.platform() !== 'linux') {
console.warn('When using local bundling on another OS besides linux, you may end up building dependencies that will not run on AWS Lambda. Please build on a linux OS if you run into issues.');
}
const execOptions = { stdio: ['ignore', process.stderr, 'inherit'] };
try {
const layerDir = path.join(__dirname, 'layer');
(0, child_process_1.execSync)('npm install', {
...execOptions,
cwd: path.join(layerDir, 'nodejs'),
});
(0, child_process_1.execSync)(`mkdir -p ${outputDir}/nodejs/node_modules`, { ...execOptions });
(0, child_process_1.execSync)(`cp -r ${layerDir}/nodejs/node_modules/* ${outputDir}/nodejs/node_modules`, { ...execOptions });
}
catch {
return false;
}
return true;
},
},
},
}),
});
const handler = this.handler = this.createLambda('cr', props, vpc, secret);
new aws_cdk_lib_1.CustomResource(this, `${id}-customResource`, {
serviceToken: handler.functionArn,
properties: {
script: props.script,
databaseName: props.databaseName,
},
});
if (props.enableAdhoc) {
this.adhocHandler = this.createLambda('adhoc', props, vpc, secret, 'adhocHandler');
}
}
get connections() {
return this.handler.connections;
}
get adhocConnections() {
if (!this.adhocHandler) {
throw new Error('Please enable the adhoc handler using the enableAdhoc prop.');
}
return this.adhocHandler?.connections;
}
/**
* Grants access to the Lambda Function to the given SecurityGroup.
* Adds an ingress rule to the given security group and for the given port.
* @deprecated Do not use, pass this construct as an IConnectable
* @param securityGroup
* @param port
*/
bind(securityGroup, port) {
securityGroup.addIngressRule(this.handler.connections.securityGroups[0], port, 'access from Lambda ' + this.handler.node.id);
return this;
}
slugify(x) {
return x.replace(/[^a-zA-Z0-9]/g, '');
}
createLambda(id, props, vpc, secret, handler) {
const handlerFunction = this.ensureLambda(`${props.databaseInstance?.node.id ?? props.secret?.node.id}-${id}`, {
entry: path.join(__dirname, 'handlers', 'index.ts'),
depsLockFilePath: path.join(__dirname, 'handlers', 'package-lock.json'),
handler: handler ?? 'handler',
runtime: aws_cdk_lib_1.aws_lambda.Runtime.NODEJS_16_X,
vpc: vpc,
environment: {
SECRET_ARN: secret.secretArn,
},
bundling: {
externalModules: ['aws-sdk', 'mssql', 'promise-mysql', 'pg'],
},
timeout: aws_cdk_lib_1.Duration.seconds(15),
logRetention: aws_cdk_lib_1.aws_logs.RetentionDays.ONE_DAY,
});
handlerFunction.addLayers(this.providerLayer);
secret.grantRead(handlerFunction);
return handlerFunction;
}
ensureLambda(id, props) {
// TODO: Copy-pasted from CDK codebase until
// https://github.com/aws/aws-cdk/issues/6261 is fixed and we can
// use a proper SingletonFunction
const constructName = this.slugify(id) + 'singl';
const existing = aws_cdk_lib_1.Stack.of(this).node.tryFindChild(constructName);
if (existing) {
return existing;
}
return new aws_cdk_lib_1.aws_lambda_nodejs.NodejsFunction(aws_cdk_lib_1.Stack.of(this), constructName, props);
}
}
exports.DatabaseScript = DatabaseScript;
_a = JSII_RTTI_SYMBOL_1;
DatabaseScript[_a] = { fqn: "@matthewbonig/rds-tools.DatabaseScript", version: "2.0.19" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YWJhc2VTY3JpcHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvRGF0YWJhc2VTY3JpcHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpREFBMEQ7QUFDMUQseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qiw2Q0FVcUI7QUFHckIsMkNBQXVDO0FBNEN2QyxNQUFhLGNBQWUsU0FBUSxzQkFBUztJQVUzQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTBCO1FBQ2xFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDO1FBQzlELElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLHlGQUF5RixDQUFDLENBQUM7U0FDNUc7UUFFRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUM7UUFDckQsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNSLE1BQU0sSUFBSSxLQUFLLENBQUMsMkZBQTJGLENBQUMsQ0FBQztTQUM5RztRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSx3QkFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRTtZQUN6RSxJQUFJLEVBQUUsd0JBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRTtnQkFDekMsUUFBUSxFQUFFO29CQUNSLEtBQUssRUFBRSx3QkFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsYUFBYTtvQkFDbkQsT0FBTyxFQUFFO3dCQUNQLE1BQU0sRUFBRSxJQUFJO3dC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QU0sYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBQ2pELE1BQU0sUUFBUSxHQUFHLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakUsSUFBSSxRQUFRLEVBQUU7WUFDWixPQUFPLFFBQTRDLENBQUM7U0FDckQ7UUFDRCxPQUFPLElBQUksK0JBQWlCLENBQUMsY0FBYyxDQUFDLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRixDQUFDOztBQTFJSCx3Q0EySUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjU3luYywgRXhlY1N5bmNPcHRpb25zIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtcbiAgYXdzX2VjMiBhcyBlYzIsXG4gIGF3c19sYW1iZGEsXG4gIGF3c19sYW1iZGFfbm9kZWpzLFxuICBhd3NfbG9ncyxcbiAgYXdzX3JkcyxcbiAgYXdzX3NlY3JldHNtYW5hZ2VyLFxuICBDdXN0b21SZXNvdXJjZSxcbiAgRHVyYXRpb24sXG4gIFN0YWNrLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25uZWN0aW9ucywgSUNvbm5lY3RhYmxlLCBJVnBjIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgeyBJU2VjcmV0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlU2NyaXB0UHJvcHMge1xuXG4gIC8qKlxuICAgKiBUaGUgVlBDIGZvciB0aGUgTGFtYmRhIEZ1bmN0aW9uIHRvIGF0dGFjaCB0by4gSWYgb25lIGlzIG5vdCBwcm92aWRlLCBpdCdzIGFzc3VtZWQgZnJvbSB0aGUgZGF0YWJhc2UgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBlYzIuSVZwYztcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgZGF0YWJhc2VOYW1lLiBJZiBub25lIGlzIHByb3ZpZGVkIHRoZW4gaXQgd2lsbCBiZSB0aGUgZGVmYXVsdCBmb3IgdGhlIHJkcyBpbnN0YW5jZSwgYXMgZGVmaW5lZCBieSB0aGUgQVdTIGRvY3MuXG4gICAqXG4gICAqIG15c3FsIC0gbXlzcWxcbiAgICogbXNzcWwgLSBtYXN0ZXJcbiAgICogcG9zdGdyZXMgLSBwb3N0Z3Jlc1xuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0YWJhc2UgaW5zdGFuY2UgdG8gcnVuIHRoZSBzY3JpcHQgYWdhaW5zdFxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2VJbnN0YW5jZT86IGF3c19yZHMuRGF0YWJhc2VJbnN0YW5jZTtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgc2VjcmV0IHRoYXQgcHJvdmlkZXMgY3JlZGVudGlhbHMgZm9yIHRoZSBkYXRhYmFzZS4gTXVzdCBoYXZlIGZpZWxkcyAndXNlcm5hbWUnIGFuZCAncGFzc3dvcmQnXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSByb290IHNlY3JldCBmcm9tIHRoZSBkYXRhYmFzZSBpbnN0YW5jZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0PzogYXdzX3NlY3JldHNtYW5hZ2VyLklTZWNyZXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzY3JpcHQgdG8gZXhlY3V0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHNjcmlwdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXBsb3kgYSBzZWNvbmQgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgYWxsb3dzIGZvciBhZGhvYyBzcWwgYWdhaW5zdCB0aGUgZGF0YWJhc2U/XG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVBZGhvYz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZVNjcmlwdCBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElDb25uZWN0YWJsZSB7XG5cbiAgLyoqXG4gICAqIFRoZSB1bmRlcmx5aW5nIExhbWJkYSBoYW5kbGVyIGZ1bmN0aW9uIGZvciBtYWtpbmcgYWRob2MgY29tbWFuZHMgYWdhaW5zdCB0aGUgZGF0YWJhc2UuXG4gICAqIFVuZGVmaW5lZCB1bmxlc3MgJ2VuYWJsZUFkaG9jJyBpcyB0cnVlXG4gICAqL1xuICBhZGhvY0hhbmRsZXI/OiBhd3NfbGFtYmRhLklGdW5jdGlvbjtcbiAgcmVhZG9ubHkgaGFuZGxlcjogYXdzX2xhbWJkYS5JRnVuY3Rpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvdmlkZXJMYXllcjogYXdzX2xhbWJkYS5MYXllclZlcnNpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERhdGFiYXNlU2NyaXB0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3Qgc2VjcmV0ID0gcHJvcHMuc2VjcmV0IHx8IHByb3BzLmRhdGFiYXNlSW5zdGFuY2U/LnNlY3JldDtcbiAgICBpZiAoIXNlY3JldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBlaXRoZXIgcHJvdmlkZSBhIHNlY3JldCBvciB0aGVyZSBtdXN0IGJlIG9uZSBhdmFpbGFibGUgb24gdGhlIGRhdGFiYXNlSW5zdGFuY2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCB2cGMgPSBwcm9wcy52cGMgfHwgcHJvcHMuZGF0YWJhc2VJbnN0YW5jZT8udnBjO1xuICAgIGlmICghdnBjKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwcm92aWRlIGEgVlBDIHRvIHVzZSwgZWl0aGVyIG9uIHRoZSBgdnBjYCBwcm9wIG9yIHZpYSB0aGUgYGRhdGFiYXNlSW5zdGFuY2VgIHByb3AuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYXNzZXRQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ2xheWVyJyk7XG4gICAgdGhpcy5wcm92aWRlckxheWVyID0gbmV3IGF3c19sYW1iZGEuTGF5ZXJWZXJzaW9uKHRoaXMsIGAke2lkfS1kZXBzLWxheWVyYCwge1xuICAgICAgY29kZTogYXdzX2xhbWJkYS5Db2RlLmZyb21Bc3NldChhc3NldFBhdGgsIHtcbiAgICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgICBpbWFnZTogYXdzX2xhbWJkYS5SdW50aW1lLk5PREVKU18xNl9YLmJ1bmRsaW5nSW1hZ2UsXG4gICAgICAgICAgY29tbWFuZDogW1xuICAgICAgICAgICAgJ2Jhc2gnLCAnLWMnLFxuICAgICAgICAgICAgJ2VjaG8gbnBtIGkgJiYgY3AgLXIgL2Fzc2V0LWlucHV0LyogL2Fzc2V0LW91dHB1dCcsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgbnBtX2NvbmZpZ19jYWNoZTogJ25wbS1jYWNoZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VyOiAncm9vdCcsXG4gICAgICAgICAgd29ya2luZ0RpcmVjdG9yeTogJy9hc3NldC1pbnB1dC9ub2RlanMnLFxuICAgICAgICAgIGxvY2FsOiB7XG4gICAgICAgICAgICB0cnlCdW5kbGUob3V0cHV0RGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0dvaW5nIHRvIHRyeSBsb2NhbCBidW5kbGluZy4uLicpO1xuICAgICAgICAgICAgICBpZiAob3MucGxhdGZvcm0oKSAhPT0gJ2xpbnV4Jykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignV2hlbiB1c2luZyBsb2NhbCBidW5kbGluZyBvbiBhbm90aGVyIE9TIGJlc2lkZXMgbGludXgsIHlvdSBtYXkgZW5kIHVwIGJ1aWxkaW5nIGRlcGVuZGVuY2llcyB0aGF0IHdpbGwgbm90IHJ1biBvbiBBV1MgTGFtYmRhLiBQbGVhc2UgYnVpbGQgb24gYSBsaW51eCBPUyBpZiB5b3UgcnVuIGludG8gaXNzdWVzLicpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGV4ZWNPcHRpb25zOiBFeGVjU3luY09wdGlvbnMgPSB7IHN0ZGlvOiBbJ2lnbm9yZScsIHByb2Nlc3Muc3RkZXJyLCAnaW5oZXJpdCddIH07XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGF5ZXJEaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnbGF5ZXInKTtcbiAgICAgICAgICAgICAgICBleGVjU3luYygnbnBtIGluc3RhbGwnLCB7XG4gICAgICAgICAgICAgICAgICAuLi5leGVjT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgIGN3ZDogcGF0aC5qb2luKGxheWVyRGlyLCAnbm9kZWpzJyksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZXhlY1N5bmMoYG1rZGlyIC1wICR7b3V0cHV0RGlyfS9ub2RlanMvbm9kZV9tb2R1bGVzYCwgeyAuLi5leGVjT3B0aW9ucyB9KTtcbiAgICAgICAgICAgICAgICBleGVjU3luYyhgY3AgLXIgJHtsYXllckRpcn0vbm9kZWpzL25vZGVfbW9kdWxlcy8qICR7b3V0cHV0RGlyfS9ub2RlanMvbm9kZV9tb2R1bGVzYCwgeyAuLi5leGVjT3B0aW9ucyB9KTtcblxuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXIgPSB0aGlzLmNyZWF0ZUxhbWJkYSgnY3InLCBwcm9wcywgdnBjLCBzZWNyZXQpO1xuICAgIG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCBgJHtpZH0tY3VzdG9tUmVzb3VyY2VgLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IGhhbmRsZXIuZnVuY3Rpb25Bcm4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHNjcmlwdDogcHJvcHMuc2NyaXB0LFxuICAgICAgICBkYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMuZW5hYmxlQWRob2MpIHtcbiAgICAgIHRoaXMuYWRob2NIYW5kbGVyID0gdGhpcy5jcmVhdGVMYW1iZGEoJ2FkaG9jJywgcHJvcHMsIHZwYywgc2VjcmV0LCAnYWRob2NIYW5kbGVyJyk7XG4gICAgfVxuXG4gIH1cblxuICBnZXQgY29ubmVjdGlvbnMoKTogQ29ubmVjdGlvbnMge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXIuY29ubmVjdGlvbnM7XG4gIH1cblxuICBnZXQgYWRob2NDb25uZWN0aW9ucygpOiBDb25uZWN0aW9ucyB7XG4gICAgaWYgKCF0aGlzLmFkaG9jSGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgZW5hYmxlIHRoZSBhZGhvYyBoYW5kbGVyIHVzaW5nIHRoZSBlbmFibGVBZGhvYyBwcm9wLicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hZGhvY0hhbmRsZXI/LmNvbm5lY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBhY2Nlc3MgdG8gdGhlIExhbWJkYSBGdW5jdGlvbiB0byB0aGUgZ2l2ZW4gU2VjdXJpdHlHcm91cC5cbiAgICogQWRkcyBhbiBpbmdyZXNzIHJ1bGUgdG8gdGhlIGdpdmVuIHNlY3VyaXR5IGdyb3VwIGFuZCBmb3IgdGhlIGdpdmVuIHBvcnQuXG4gICAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UsIHBhc3MgdGhpcyBjb25zdHJ1Y3QgYXMgYW4gSUNvbm5lY3RhYmxlXG4gICAqIEBwYXJhbSBzZWN1cml0eUdyb3VwXG4gICAqIEBwYXJhbSBwb3J0XG4gICAqL1xuICBiaW5kKHNlY3VyaXR5R3JvdXA6IGVjMi5TZWN1cml0eUdyb3VwLCBwb3J0OiBlYzIuUG9ydCk6IERhdGFiYXNlU2NyaXB0IHtcbiAgICBzZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKHRoaXMuaGFuZGxlci5jb25uZWN0aW9ucy5zZWN1cml0eUdyb3Vwc1swXSwgcG9ydCwgJ2FjY2VzcyBmcm9tIExhbWJkYSAnICsgdGhpcy5oYW5kbGVyLm5vZGUuaWQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2x1Z2lmeSh4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB4LnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCAnJyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUxhbWJkYShpZDogc3RyaW5nLCBwcm9wczogRGF0YWJhc2VTY3JpcHRQcm9wcywgdnBjOiBJVnBjLCBzZWNyZXQ6IElTZWNyZXQsIGhhbmRsZXI/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBoYW5kbGVyRnVuY3Rpb24gPSB0aGlzLmVuc3VyZUxhbWJkYShgJHtwcm9wcy5kYXRhYmFzZUluc3RhbmNlPy5ub2RlLmlkID8/IHByb3BzLnNlY3JldD8ubm9kZS5pZH0tJHtpZH1gLCB7XG4gICAgICBlbnRyeTogcGF0aC5qb2luKF9fZGlybmFtZSwgJ2hhbmRsZXJzJywgJ2luZGV4LnRzJyksXG4gICAgICBkZXBzTG9ja0ZpbGVQYXRoOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnaGFuZGxlcnMnLCAncGFja2FnZS1sb2NrLmpzb24nKSxcbiAgICAgIGhhbmRsZXI6IGhhbmRsZXIgPz8gJ2hhbmRsZXInLFxuICAgICAgcnVudGltZTogYXdzX2xhbWJkYS5SdW50aW1lLk5PREVKU18xNl9YLFxuICAgICAgdnBjOiB2cGMsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBTRUNSRVRfQVJOOiBzZWNyZXQuc2VjcmV0QXJuLFxuICAgICAgfSxcbiAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgIGV4dGVybmFsTW9kdWxlczogWydhd3Mtc2RrJywgJ21zc3FsJywgJ3Byb21pc2UtbXlzcWwnLCAncGcnXSxcbiAgICAgIH0sXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDE1KSwgLy8gVE9ETzogc2hvdWxkIGJlIG92ZXJyaWRhYmxlXG4gICAgICBsb2dSZXRlbnRpb246IGF3c19sb2dzLlJldGVudGlvbkRheXMuT05FX0RBWSxcbiAgICB9KTtcblxuICAgIGhhbmRsZXJGdW5jdGlvbi5hZGRMYXllcnModGhpcy5wcm92aWRlckxheWVyKTtcblxuICAgIHNlY3JldC5ncmFudFJlYWQoaGFuZGxlckZ1bmN0aW9uKTtcbiAgICByZXR1cm4gaGFuZGxlckZ1bmN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVMYW1iZGEoaWQ6IHN0cmluZywgcHJvcHM6IGF3c19sYW1iZGFfbm9kZWpzLk5vZGVqc0Z1bmN0aW9uUHJvcHMpOiBhd3NfbGFtYmRhX25vZGVqcy5Ob2RlanNGdW5jdGlvbiB7XG4gICAgLy8gVE9ETzogQ29weS1wYXN0ZWQgZnJvbSBDREsgY29kZWJhc2UgdW50aWxcbiAgICAvLyAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzYyNjEgaXMgZml4ZWQgYW5kIHdlIGNhblxuICAgIC8vICAgICAgIHVzZSBhIHByb3BlciBTaW5nbGV0b25GdW5jdGlvblxuICAgIGNvbnN0IGNvbnN0cnVjdE5hbWUgPSB0aGlzLnNsdWdpZnkoaWQpICsgJ3NpbmdsJztcbiAgICBjb25zdCBleGlzdGluZyA9IFN0YWNrLm9mKHRoaXMpLm5vZGUudHJ5RmluZENoaWxkKGNvbnN0cnVjdE5hbWUpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nIGFzIGF3c19sYW1iZGFfbm9kZWpzLk5vZGVqc0Z1bmN0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IGF3c19sYW1iZGFfbm9kZWpzLk5vZGVqc0Z1bmN0aW9uKFN0YWNrLm9mKHRoaXMpLCBjb25zdHJ1Y3ROYW1lLCBwcm9wcyk7XG4gIH1cbn1cbiJdfQ==