@aws-cdk/integ-tests-alpha
Version:
CDK Integration Testing Constructs
155 lines • 18.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.WaiterStateMachine = void 0;
const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
/* eslint-disable @cdklabs/no-throw-default-error */
const core_1 = require("aws-cdk-lib/core");
const constructs_1 = require("constructs");
const providers_1 = require("./providers");
/**
* A very simple StateMachine construct highly customized to the provider framework.
* This is so that this package does not need to depend on aws-stepfunctions module.
*
* The state machine continuously calls the isCompleteHandler, until it succeeds or times out.
* The handler is called `maxAttempts` times with an `interval` duration and a `backoffRate` rate.
*
* For example with:
* - maxAttempts = 360 (30 minutes)
* - interval = 5
* - backoffRate = 1 (no backoff)
*
* it will make the API Call every 5 seconds and fail after 360 failures.
*
* If the backoff rate is changed to 2 (for example), it will
* - make the first call
* - wait 5 seconds
* - make the second call
* - wait 15 seconds
* - etc.
*/
class WaiterStateMachine extends constructs_1.Construct {
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/integ-tests-alpha.WaiterStateMachine", version: "2.257.0-alpha.0" };
/**
* The ARN of the statemachine
*/
stateMachineArn;
/**
* The IAM Role ARN of the role used by the state machine
*/
roleArn;
/**
* The AssertionsProvide that handles async requests
*/
isCompleteProvider;
constructor(scope, id, props = {}) {
super(scope, id);
try {
jsiiDeprecationWarnings._aws_cdk_integ_tests_alpha_WaiterStateMachineProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, WaiterStateMachine);
}
throw error;
}
const interval = props.interval || core_1.Duration.seconds(5);
const totalTimeout = props.totalTimeout || core_1.Duration.minutes(30);
const maxAttempts = calculateMaxRetries(totalTimeout.toSeconds(), interval.toSeconds(), props.backoffRate ?? 1);
if (Math.round(maxAttempts) !== maxAttempts) {
throw new Error(`Cannot determine retry count since totalTimeout=${totalTimeout.toSeconds()}s is not integrally dividable by queryInterval=${interval.toSeconds()}s`);
}
this.isCompleteProvider = new providers_1.AssertionsProvider(this, 'IsCompleteProvider', {
handler: 'index.isComplete',
uuid: '76b3e830-a873-425f-8453-eddd85c86925',
});
const timeoutProvider = new providers_1.AssertionsProvider(this, 'TimeoutProvider', {
handler: 'index.onTimeout',
uuid: '5c1898e0-96fb-4e3e-95d5-f6c67f3ce41a',
});
const role = new core_1.CfnResource(this, 'Role', {
type: 'AWS::IAM::Role',
properties: {
AssumeRolePolicyDocument: {
Version: '2012-10-17',
Statement: [{ Action: 'sts:AssumeRole', Effect: 'Allow', Principal: { Service: 'states.amazonaws.com' } }],
},
Policies: [
{
PolicyName: 'InlineInvokeFunctions',
PolicyDocument: {
Version: '2012-10-17',
Statement: [{
Action: 'lambda:InvokeFunction',
Effect: 'Allow',
Resource: [
this.isCompleteProvider.serviceToken,
timeoutProvider.serviceToken,
],
}],
},
},
],
},
});
const definition = core_1.Stack.of(this).toJsonString({
StartAt: 'framework-isComplete-task',
States: {
'framework-isComplete-task': {
End: true,
Retry: [{
ErrorEquals: ['States.ALL'],
IntervalSeconds: interval.toSeconds(),
MaxAttempts: maxAttempts,
BackoffRate: props.backoffRate ?? 1,
}],
Catch: [{
ErrorEquals: ['States.ALL'],
Next: 'framework-onTimeout-task',
}],
Type: 'Task',
Resource: this.isCompleteProvider.serviceToken,
},
'framework-onTimeout-task': {
End: true,
Type: 'Task',
Resource: timeoutProvider.serviceToken,
},
},
});
const resource = new core_1.CfnResource(this, 'Resource', {
type: 'AWS::StepFunctions::StateMachine',
properties: {
DefinitionString: definition,
RoleArn: role.getAtt('Arn'),
},
});
resource.node.addDependency(role);
this.stateMachineArn = resource.ref;
this.roleArn = role.getAtt('Arn').toString();
this.isCompleteProvider.grantInvoke(this.roleArn);
timeoutProvider.grantInvoke(this.roleArn);
}
}
exports.WaiterStateMachine = WaiterStateMachine;
/**
* Calculate the max number of retries
*/
function calculateMaxRetries(maxSeconds, intervalSeconds, backoff) {
// if backoff === 1 then we aren't really using backoff
if (backoff === 1) {
return Math.floor(maxSeconds / intervalSeconds);
}
let retries = 1;
let nextInterval = intervalSeconds;
let i = 0;
while (i < maxSeconds) {
nextInterval = nextInterval + nextInterval * backoff;
i += nextInterval;
if (i >= maxSeconds)
break;
retries++;
}
return retries;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdGVyLXN0YXRlLW1hY2hpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3YWl0ZXItc3RhdGUtbWFjaGluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9EQUFvRDtBQUNwRCwyQ0FBZ0U7QUFDaEUsMkNBQXVDO0FBQ3ZDLDJDQUFpRDtBQXdDakQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxzQkFBUzs7SUFDL0M7O09BRUc7SUFDYSxlQUFlLENBQVM7SUFFeEM7O09BRUc7SUFDYSxPQUFPLENBQVM7SUFFaEM7O09BRUc7SUFDYSxrQkFBa0IsQ0FBcUI7SUFFdkQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxRQUFpQyxFQUFFO1FBQzNFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7Ozs7OzsrQ0FqQlIsa0JBQWtCOzs7O1FBa0IzQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxJQUFJLGVBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkQsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSxlQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sV0FBVyxHQUFHLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsS0FBSyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVoSCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsWUFBWSxDQUFDLFNBQVMsRUFBRSxrREFBa0QsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4SyxDQUFDO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUks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LENBQUMsQ0FBQztLQUMzQzs7QUFyR0gsZ0RBc0dDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLFVBQWtCLEVBQUUsZUFBdUIsRUFBRSxPQUFlO0lBQ3ZGLHVEQUF1RDtJQUN2RCxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNsQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLGVBQWUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDaEIsSUFBSSxZQUFZLEdBQUcsZUFBZSxDQUFDO0lBQ25DLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLE9BQU8sQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQ3RCLFlBQVksR0FBRyxZQUFZLEdBQUMsWUFBWSxHQUFDLE9BQU8sQ0FBQztRQUNqRCxDQUFDLElBQUUsWUFBWSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxJQUFJLFVBQVU7WUFBRSxNQUFNO1FBQzNCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAY2RrbGFicy9uby10aHJvdy1kZWZhdWx0LWVycm9yICovXG5pbXBvcnQgeyBDZm5SZXNvdXJjZSwgRHVyYXRpb24sIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEFzc2VydGlvbnNQcm92aWRlciB9IGZyb20gJy4vcHJvdmlkZXJzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjcmVhdGluZyBhIFdhaXRlclN0YXRlTWFjaGluZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhaXRlclN0YXRlTWFjaGluZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHRvdGFsIHRpbWUgdGhhdCB0aGUgc3RhdGUgbWFjaGluZSB3aWxsIHdhaXRcbiAgICogZm9yIGEgc3VjY2Vzc2Z1bCByZXNwb25zZVxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDMwKVxuICAgKi9cbiAgcmVhZG9ubHkgdG90YWxUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcnZhbCAobnVtYmVyIG9mIHNlY29uZHMpIHRvIHdhaXQgYmV0d2VlbiBhdHRlbXB0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcyg1KVxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogQmFja29mZiBiZXR3ZWVuIGF0dGVtcHRzLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBtdWx0aXBsaWVyIGJ5IHdoaWNoIHRoZSByZXRyeSBpbnRlcnZhbCBpbmNyZWFzZXNcbiAgICogYWZ0ZXIgZWFjaCByZXRyeSBhdHRlbXB0LlxuICAgKlxuICAgKiBCeSBkZWZhdWx0IHRoZXJlIGlzIG5vIGJhY2tvZmYuIEVhY2ggcmV0cnkgd2lsbCB3YWl0IHRoZSBhbW91bnQgb2YgdGltZVxuICAgKiBzcGVjaWZpZWQgYnkgYGludGVydmFsYC5cbiAgICpcbiAgICogQGRlZmF1bHQgMSAobm8gYmFja29mZilcbiAgICovXG4gIHJlYWRvbmx5IGJhY2tvZmZSYXRlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciBjcmVhdGluZyBhIFdhaXRlclN0YXRlTWFjaGluZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhaXRlclN0YXRlTWFjaGluZVByb3BzIGV4dGVuZHMgV2FpdGVyU3RhdGVNYWNoaW5lT3B0aW9ucyB7fVxuXG4vKipcbiAqIEEgdmVyeSBzaW1wbGUgU3RhdGVNYWNoaW5lIGNvbnN0cnVjdCBoaWdobHkgY3VzdG9taXplZCB0byB0aGUgcHJvdmlkZXIgZnJhbWV3b3JrLlxuICogVGhpcyBpcyBzbyB0aGF0IHRoaXMgcGFja2FnZSBkb2VzIG5vdCBuZWVkIHRvIGRlcGVuZCBvbiBhd3Mtc3RlcGZ1bmN0aW9ucyBtb2R1bGUuXG4gKlxuICogVGhlIHN0YXRlIG1hY2hpbmUgY29udGludW91c2x5IGNhbGxzIHRoZSBpc0NvbXBsZXRlSGFuZGxlciwgdW50aWwgaXQgc3VjY2VlZHMgb3IgdGltZXMgb3V0LlxuICogVGhlIGhhbmRsZXIgaXMgY2FsbGVkIGBtYXhBdHRlbXB0c2AgdGltZXMgd2l0aCBhbiBgaW50ZXJ2YWxgIGR1cmF0aW9uIGFuZCBhIGBiYWNrb2ZmUmF0ZWAgcmF0ZS5cbiAqXG4gKiBGb3IgZXhhbXBsZSB3aXRoOlxuICogLSBtYXhBdHRlbXB0cyA9IDM2MCAoMzAgbWludXRlcylcbiAqIC0gaW50ZXJ2YWwgPSA1XG4gKiAtIGJhY2tvZmZSYXRlID0gMSAobm8gYmFja29mZilcbiAqXG4gKiBpdCB3aWxsIG1ha2UgdGhlIEFQSSBDYWxsIGV2ZXJ5IDUgc2Vjb25kcyBhbmQgZmFpbCBhZnRlciAzNjAgZmFpbHVyZXMuXG4gKlxuICogSWYgdGhlIGJhY2tvZmYgcmF0ZSBpcyBjaGFuZ2VkIHRvIDIgKGZvciBleGFtcGxlKSwgaXQgd2lsbFxuICogLSBtYWtlIHRoZSBmaXJzdCBjYWxsXG4gKiAtIHdhaXQgNSBzZWNvbmRzXG4gKiAtIG1ha2UgdGhlIHNlY29uZCBjYWxsXG4gKiAtIHdhaXQgMTUgc2Vjb25kc1xuICogLSBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXYWl0ZXJTdGF0ZU1hY2hpbmUgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgc3RhdGVtYWNoaW5lXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdGVNYWNoaW5lQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gUm9sZSBBUk4gb2YgdGhlIHJvbGUgdXNlZCBieSB0aGUgc3RhdGUgbWFjaGluZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvbGVBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFzc2VydGlvbnNQcm92aWRlIHRoYXQgaGFuZGxlcyBhc3luYyByZXF1ZXN0c1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzQ29tcGxldGVQcm92aWRlcjogQXNzZXJ0aW9uc1Byb3ZpZGVyO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXYWl0ZXJTdGF0ZU1hY2hpbmVQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICBjb25zdCBpbnRlcnZhbCA9IHByb3BzLmludGVydmFsIHx8IER1cmF0aW9uLnNlY29uZHMoNSk7XG4gICAgY29uc3QgdG90YWxUaW1lb3V0ID0gcHJvcHMudG90YWxUaW1lb3V0IHx8IER1cmF0aW9uLm1pbnV0ZXMoMzApO1xuICAgIGNvbnN0IG1heEF0dGVtcHRzID0gY2FsY3VsYXRlTWF4UmV0cmllcyh0b3RhbFRpbWVvdXQudG9TZWNvbmRzKCksIGludGVydmFsLnRvU2Vjb25kcygpLCBwcm9wcy5iYWNrb2ZmUmF0ZSA/PyAxKTtcblxuICAgIGlmIChNYXRoLnJvdW5kKG1heEF0dGVtcHRzKSAhPT0gbWF4QXR0ZW1wdHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRldGVybWluZSByZXRyeSBjb3VudCBzaW5jZSB0b3RhbFRpbWVvdXQ9JHt0b3RhbFRpbWVvdXQudG9TZWNvbmRzKCl9cyBpcyBub3QgaW50ZWdyYWxseSBkaXZpZGFibGUgYnkgcXVlcnlJbnRlcnZhbD0ke2ludGVydmFsLnRvU2Vjb25kcygpfXNgKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzQ29tcGxldGVQcm92aWRlciA9IG5ldyBBc3NlcnRpb25zUHJvdmlkZXIodGhpcywgJ0lzQ29tcGxldGVQcm92aWRlcicsIHtcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5pc0NvbXBsZXRlJyxcbiAgICAgIHV1aWQ6ICc3NmIzZTgzMC1hODczLTQyNWYtODQ1My1lZGRkODVjODY5MjUnLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGltZW91dFByb3ZpZGVyID0gbmV3IEFzc2VydGlvbnNQcm92aWRlcih0aGlzLCAnVGltZW91dFByb3ZpZGVyJywge1xuICAgICAgaGFuZGxlcjogJ2luZGV4Lm9uVGltZW91dCcsXG4gICAgICB1dWlkOiAnNWMxODk4ZTAtOTZmYi00ZTNlLTk1ZDUtZjZjNjdmM2NlNDFhJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJvbGUgPSBuZXcgQ2ZuUmVzb3VyY2UodGhpcywgJ1JvbGUnLCB7XG4gICAgICB0eXBlOiAnQVdTOjpJQU06OlJvbGUnLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNycsXG4gICAgICAgICAgU3RhdGVtZW50OiBbeyBBY3Rpb246ICdzdHM6QXNzdW1lUm9sZScsIEVmZmVjdDogJ0FsbG93JywgUHJpbmNpcGFsOiB7IFNlcnZpY2U6ICdzdGF0ZXMuYW1hem9uYXdzLmNvbScgfSB9XSxcbiAgICAgICAgfSxcbiAgICAgICAgUG9saWNpZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBQb2xpY3lOYW1lOiAnSW5saW5lSW52b2tlRnVuY3Rpb25zJyxcbiAgICAgICAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3JyxcbiAgICAgICAgICAgICAgU3RhdGVtZW50OiBbe1xuICAgICAgICAgICAgICAgIEFjdGlvbjogJ2xhbWJkYTpJbnZva2VGdW5jdGlvbicsXG4gICAgICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgICAgICAgIFJlc291cmNlOiBbXG4gICAgICAgICAgICAgICAgICB0aGlzLmlzQ29tcGxldGVQcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICAgICAgICAgICAgICB0aW1lb3V0UHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGRlZmluaXRpb24gPSBTdGFjay5vZih0aGlzKS50b0pzb25TdHJpbmcoe1xuICAgICAgU3RhcnRBdDogJ2ZyYW1ld29yay1pc0NvbXBsZXRlLXRhc2snLFxuICAgICAgU3RhdGVzOiB7XG4gICAgICAgICdmcmFtZXdvcmstaXNDb21wbGV0ZS10YXNrJzoge1xuICAgICAgICAgIEVuZDogdHJ1ZSxcbiAgICAgICAgICBSZXRyeTogW3tcbiAgICAgICAgICAgIEVycm9yRXF1YWxzOiBbJ1N0YXRlcy5BTEwnXSxcbiAgICAgICAgICAgIEludGVydmFsU2Vjb25kczogaW50ZXJ2YWwudG9TZWNvbmRzKCksXG4gICAgICAgICAgICBNYXhBdHRlbXB0czogbWF4QXR0ZW1wdHMsXG4gICAgICAgICAgICBCYWNrb2ZmUmF0ZTogcHJvcHMuYmFja29mZlJhdGUgPz8gMSxcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBDYXRjaDogW3tcbiAgICAgICAgICAgIEVycm9yRXF1YWxzOiBbJ1N0YXRlcy5BTEwnXSxcbiAgICAgICAgICAgIE5leHQ6ICdmcmFtZXdvcmstb25UaW1lb3V0LXRhc2snLFxuICAgICAgICAgIH1dLFxuICAgICAgICAgIFR5cGU6ICdUYXNrJyxcbiAgICAgICAgICBSZXNvdXJjZTogdGhpcy5pc0NvbXBsZXRlUHJvdmlkZXIuc2VydmljZVRva2VuLFxuICAgICAgICB9LFxuICAgICAgICAnZnJhbWV3b3JrLW9uVGltZW91dC10YXNrJzoge1xuICAgICAgICAgIEVuZDogdHJ1ZSxcbiAgICAgICAgICBUeXBlOiAnVGFzaycsXG4gICAgICAgICAgUmVzb3VyY2U6IHRpbWVvdXRQcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgQ2ZuUmVzb3VyY2UodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgdHlwZTogJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJyxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgRGVmaW5pdGlvblN0cmluZzogZGVmaW5pdGlvbixcbiAgICAgICAgUm9sZUFybjogcm9sZS5nZXRBdHQoJ0FybicpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3kocm9sZSk7XG5cbiAgICB0aGlzLnN0YXRlTWFjaGluZUFybiA9IHJlc291cmNlLnJlZjtcbiAgICB0aGlzLnJvbGVBcm4gPSByb2xlLmdldEF0dCgnQXJuJykudG9TdHJpbmcoKTtcbiAgICB0aGlzLmlzQ29tcGxldGVQcm92aWRlci5ncmFudEludm9rZSh0aGlzLnJvbGVBcm4pO1xuICAgIHRpbWVvdXRQcm92aWRlci5ncmFudEludm9rZSh0aGlzLnJvbGVBcm4pO1xuICB9XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBtYXggbnVtYmVyIG9mIHJldHJpZXNcbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlTWF4UmV0cmllcyhtYXhTZWNvbmRzOiBudW1iZXIsIGludGVydmFsU2Vjb25kczogbnVtYmVyLCBiYWNrb2ZmOiBudW1iZXIpOiBudW1iZXIge1xuICAvLyBpZiBiYWNrb2ZmID09PSAxIHRoZW4gd2UgYXJlbid0IHJlYWxseSB1c2luZyBiYWNrb2ZmXG4gIGlmIChiYWNrb2ZmID09PSAxKSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IobWF4U2Vjb25kcyAvIGludGVydmFsU2Vjb25kcyk7XG4gIH1cbiAgbGV0IHJldHJpZXMgPSAxO1xuICBsZXQgbmV4dEludGVydmFsID0gaW50ZXJ2YWxTZWNvbmRzO1xuICBsZXQgaSA9IDA7XG4gIHdoaWxlIChpIDwgbWF4U2Vjb25kcykge1xuICAgIG5leHRJbnRlcnZhbCA9IG5leHRJbnRlcnZhbCtuZXh0SW50ZXJ2YWwqYmFja29mZjtcbiAgICBpKz1uZXh0SW50ZXJ2YWw7XG4gICAgaWYgKGkgPj0gbWF4U2Vjb25kcykgYnJlYWs7XG4gICAgcmV0cmllcysrO1xuICB9XG4gIHJldHVybiByZXRyaWVzO1xufVxuIl19