UNPKG

20.2 kBJavaScriptView Raw
1"use strict";
2var _a;
3Object.defineProperty(exports, "__esModule", { value: true });
4exports.Provider = void 0;
5const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
6const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
7const path = require("path");
8const lambda = require("@aws-cdk/aws-lambda");
9const core_1 = require("@aws-cdk/core");
10const consts = require("./runtime/consts");
11const util_1 = require("./util");
12const waiter_state_machine_1 = require("./waiter-state-machine");
13// keep this import separate from other imports to reduce chance for merge conflicts with v2-main",
14// eslint-disable-next-line
15const core_2 = require("@aws-cdk/core");
16const RUNTIME_HANDLER_PATH = path.join(__dirname, 'runtime');
17const FRAMEWORK_HANDLER_TIMEOUT = core_1.Duration.minutes(15); // keep it simple for now
18/**
19 * Defines an AWS CloudFormation custom resource provider.
20 */
21class Provider extends core_2.Construct {
22 constructor(scope, id, props) {
23 super(scope, id);
24 try {
25 jsiiDeprecationWarnings._aws_cdk_custom_resources_ProviderProps(props);
26 }
27 catch (error) {
28 if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
29 Error.captureStackTrace(error, Provider);
30 }
31 throw error;
32 }
33 if (!props.isCompleteHandler && (props.queryInterval || props.totalTimeout)) {
34 throw new Error('"queryInterval" and "totalTimeout" can only be configured if "isCompleteHandler" is specified. '
35 + 'Otherwise, they have no meaning');
36 }
37 this.onEventHandler = props.onEventHandler;
38 this.isCompleteHandler = props.isCompleteHandler;
39 this.logRetention = props.logRetention;
40 this.vpc = props.vpc;
41 this.vpcSubnets = props.vpcSubnets;
42 this.securityGroups = props.securityGroups;
43 this.role = props.role;
44 const onEventFunction = this.createFunction(consts.FRAMEWORK_ON_EVENT_HANDLER_NAME, props.providerFunctionName);
45 if (this.isCompleteHandler) {
46 const isCompleteFunction = this.createFunction(consts.FRAMEWORK_IS_COMPLETE_HANDLER_NAME);
47 const timeoutFunction = this.createFunction(consts.FRAMEWORK_ON_TIMEOUT_HANDLER_NAME);
48 const retry = util_1.calculateRetryPolicy(props);
49 const waiterStateMachine = new waiter_state_machine_1.WaiterStateMachine(this, 'waiter-state-machine', {
50 isCompleteHandler: isCompleteFunction,
51 timeoutHandler: timeoutFunction,
52 backoffRate: retry.backoffRate,
53 interval: retry.interval,
54 maxAttempts: retry.maxAttempts,
55 });
56 // the on-event entrypoint is going to start the execution of the waiter
57 onEventFunction.addEnvironment(consts.WAITER_STATE_MACHINE_ARN_ENV, waiterStateMachine.stateMachineArn);
58 waiterStateMachine.grantStartExecution(onEventFunction);
59 }
60 this.entrypoint = onEventFunction;
61 this.serviceToken = this.entrypoint.functionArn;
62 }
63 /**
64 * Called by `CustomResource` which uses this provider.
65 * @deprecated use `provider.serviceToken` instead
66 */
67 bind(_scope) {
68 try {
69 jsiiDeprecationWarnings.print("@aws-cdk/custom-resources.Provider#bind", "use `provider.serviceToken` instead");
70 }
71 catch (error) {
72 if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
73 Error.captureStackTrace(error, this.bind);
74 }
75 throw error;
76 }
77 return {
78 serviceToken: this.entrypoint.functionArn,
79 };
80 }
81 createFunction(entrypoint, name) {
82 const fn = new lambda.Function(this, `framework-${entrypoint}`, {
83 code: lambda.Code.fromAsset(RUNTIME_HANDLER_PATH, {
84 exclude: ['*.ts'],
85 }),
86 description: `AWS CDK resource provider framework - ${entrypoint} (${this.node.path})`.slice(0, 256),
87 runtime: lambda.Runtime.NODEJS_14_X,
88 handler: `framework.${entrypoint}`,
89 timeout: FRAMEWORK_HANDLER_TIMEOUT,
90 logRetention: this.logRetention,
91 vpc: this.vpc,
92 vpcSubnets: this.vpcSubnets,
93 securityGroups: this.securityGroups,
94 role: this.role,
95 functionName: name,
96 });
97 fn.addEnvironment(consts.USER_ON_EVENT_FUNCTION_ARN_ENV, this.onEventHandler.functionArn);
98 this.onEventHandler.grantInvoke(fn);
99 if (this.isCompleteHandler) {
100 fn.addEnvironment(consts.USER_IS_COMPLETE_FUNCTION_ARN_ENV, this.isCompleteHandler.functionArn);
101 this.isCompleteHandler.grantInvoke(fn);
102 }
103 return fn;
104 }
105}
106exports.Provider = Provider;
107_a = JSII_RTTI_SYMBOL_1;
108Provider[_a] = { fqn: "@aws-cdk/custom-resources.Provider", version: "1.203.0" };
109//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw2QkFBNkI7QUFHN0IsOENBQThDO0FBRTlDLHdDQUF5QztBQUV6QywyQ0FBMkM7QUFDM0MsaUNBQThDO0FBQzlDLGlFQUE0RDtBQUs1RCxtR0FBbUc7QUFDbkcsMkJBQTJCO0FBQzNCLHdDQUEyRDtBQUUzRCxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzdELE1BQU0seUJBQXlCLEdBQUcsZUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLHlCQUF5QjtBQTZHakY7O0dBRUc7QUFDSCxNQUFhLFFBQVMsU0FBUSxnQkFBYTtJQTJCekMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFvQjtRQUM1RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7K0NBNUJSLFFBQVE7Ozs7UUE4QmpCLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUMzRSxNQUFNLElBQUksS0FBSyxDQUFDLGlHQUFpRztrQkFDN0csaUNBQWlDLENBQUMsQ0FBQztTQUN4QztRQUVELElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztRQUMzQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDO1FBRWpELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUN2QyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ25DLElBQUksQ0FBQyxj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SSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN4QztRQUVELE9BQU8sRUFBRSxDQUFDO0tBQ1g7O0FBeEdILDRCQXlHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnQGF3cy1jZGsvYXdzLWVjMic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnQGF3cy1jZGsvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnQGF3cy1jZGsvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gJ0Bhd3MtY2RrL2F3cy1sb2dzJztcbmltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSAnQGF3cy1jZGsvY29yZSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGNvbnN0cyBmcm9tICcuL3J1bnRpbWUvY29uc3RzJztcbmltcG9ydCB7IGNhbGN1bGF0ZVJldHJ5UG9saWN5IH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IFdhaXRlclN0YXRlTWFjaGluZSB9IGZyb20gJy4vd2FpdGVyLXN0YXRlLW1hY2hpbmUnO1xuXG4vLyBrZWVwIHRoaXMgaW1wb3J0IHNlcGFyYXRlIGZyb20gb3RoZXIgaW1wb3J0cyB0byByZWR1Y2UgY2hhbmNlIGZvciBtZXJnZSBjb25mbGljdHMgd2l0aCB2Mi1tYWluXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZHVwbGljYXRlLWltcG9ydHMsIGltcG9ydC9vcmRlclxuaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2VQcm92aWRlckNvbmZpZywgSUN1c3RvbVJlc291cmNlUHJvdmlkZXIgfSBmcm9tICdAYXdzLWNkay9hd3MtY2xvdWRmb3JtYXRpb24nO1xuLy8ga2VlcCB0aGlzIGltcG9ydCBzZXBhcmF0ZSBmcm9tIG90aGVyIGltcG9ydHMgdG8gcmVkdWNlIGNoYW5jZSBmb3IgbWVyZ2UgY29uZmxpY3RzIHdpdGggdjItbWFpblwiLFxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG5pbXBvcnQgeyBDb25zdHJ1Y3QgYXMgQ29yZUNvbnN0cnVjdCB9IGZyb20gJ0Bhd3MtY2RrL2NvcmUnO1xuXG5jb25zdCBSVU5USU1FX0hBTkRMRVJfUEFUSCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICdydW50aW1lJyk7XG5jb25zdCBGUkFNRVdPUktfSEFORExFUl9USU1FT1VUID0gRHVyYXRpb24ubWludXRlcygxNSk7IC8vIGtlZXAgaXQgc2ltcGxlIGZvciBub3dcblxuLyoqXG4gKiBJbml0aWFsaXphdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgYFByb3ZpZGVyYCBjb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZXJQcm9wcyB7XG5cbiAgLyoqXG4gICAqIFRoZSBBV1MgTGFtYmRhIGZ1bmN0aW9uIHRvIGludm9rZSBmb3IgYWxsIHJlc291cmNlIGxpZmVjeWNsZSBvcGVyYXRpb25zXG4gICAqIChDUkVBVEUvVVBEQVRFL0RFTEVURSkuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgdG8gYmVnaW4gdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBvcGVyYXRpb25cbiAgICogKENSRUFURS9VUERBVEUvREVMRVRFKSBhbmQgcmV0dXJuIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYWRkIHRvIHRoZVxuICAgKiBldmVudCwgd2hpY2ggd2lsbCBsYXRlciBiZSBwYXNzZWQgdG8gYGlzQ29tcGxldGVgLiBUaGUgYFBoeXNpY2FsUmVzb3VyY2VJZGBcbiAgICogcHJvcGVydHkgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzcG9uc2UuXG4gICAqL1xuICByZWFkb25seSBvbkV2ZW50SGFuZGxlcjogbGFtYmRhLklGdW5jdGlvbjtcblxuICAvKipcbiAgICogVGhlIEFXUyBMYW1iZGEgZnVuY3Rpb24gdG8gaW52b2tlIGluIG9yZGVyIHRvIGRldGVybWluZSBpZiB0aGUgb3BlcmF0aW9uIGlzXG4gICAqIGNvbXBsZXRlLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGBvbkV2ZW50YCBhbmQgdGhlblxuICAgKiBwZXJpb2RpY2FsbHkgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgcXVlcnkgaW50ZXJ2YWwgYXMgbG9uZyBhcyBpdCByZXR1cm5zXG4gICAqIGBmYWxzZWAuIElmIHRoZSBmdW5jdGlvbiBzdGlsbCByZXR1cm5zIGBmYWxzZWAgYW5kIHRoZSBhbGxvdGVkIHRpbWVvdXQgaGFzXG4gICAqIHBhc3NlZCwgdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcHJvdmlkZXIgaXMgc3luY2hyb25vdXMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYG9uRXZlbnRgIGhhbmRsZXJcbiAgICogaXMgZXhwZWN0ZWQgdG8gZmluaXNoIGFsbCBsaWZlY3ljbGUgb3BlcmF0aW9ucyB3aXRoaW4gdGhlIGluaXRpYWwgaW52b2NhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ29tcGxldGVIYW5kbGVyPzogbGFtYmRhLklGdW5jdGlvbjtcblxuICAvKipcbiAgICogVGltZSBiZXR3ZWVuIGNhbGxzIHRvIHRoZSBgaXNDb21wbGV0ZWAgaGFuZGxlciB3aGljaCBkZXRlcm1pbmVzIGlmIHRoZVxuICAgKiByZXNvdXJjZSBoYXMgYmVlbiBzdGFiaWxpemVkLlxuICAgKlxuICAgKiBUaGUgZmlyc3QgYGlzQ29tcGxldGVgIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGBoYW5kbGVyYCBhbmQgdGhlblxuICAgKiBldmVyeSBgcXVlcnlJbnRlcnZhbGAgc2Vjb25kcywgYW5kIHVudGlsIGB0aW1lb3V0YCBoYXMgYmVlbiByZWFjaGVkIG9yIHVudGlsXG4gICAqIGBpc0NvbXBsZXRlYCByZXR1cm5zIGB0cnVlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcyg1KVxuICAgKi9cbiAgcmVhZG9ubHkgcXVlcnlJbnRlcnZhbD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUb3RhbCB0aW1lb3V0IGZvciB0aGUgZW50aXJlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogVGhlIG1heGltdW0gdGltZW91dCBpcyAyIGhvdXJzICh5ZXMsIGl0IGNhbiBleGNlZWQgdGhlIEFXUyBMYW1iZGEgMTUgbWludXRlcylcbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24ubWludXRlcygzMClcbiAgICovXG4gIHJlYWRvbmx5IHRvdGFsVGltZW91dD86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgZnJhbWV3b3JrIGxvZyBldmVudHMgYXJlIGtlcHQgaW4gQ2xvdWRXYXRjaCBMb2dzLiBXaGVuXG4gICAqIHVwZGF0aW5nIHRoaXMgcHJvcGVydHksIHVuc2V0dGluZyBpdCBkb2Vzbid0IHJlbW92ZSB0aGUgbG9nIHJldGVudGlvbiBwb2xpY3kuXG4gICAqIFRvIHJlbW92ZSB0aGUgcmV0ZW50aW9uIHBvbGljeSwgc2V0IHRoZSB2YWx1ZSB0byBgSU5GSU5JVEVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBsb2dzLlJldGVudGlvbkRheXMuSU5GSU5JVEVcbiAgICovXG4gIHJlYWRvbmx5IGxvZ1JldGVudGlvbj86IGxvZ3MuUmV0ZW50aW9uRGF5cztcblxuICAvKipcbiAgICogVGhlIHZwYyB0byBwcm92aXNpb24gdGhlIGxhbWJkYSBmdW5jdGlvbnMgaW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZnVuY3Rpb25zIGFyZSBub3QgcHJvdmlzaW9uZWQgaW5zaWRlIGEgdnBjLlxuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogZWMyLklWcGM7XG5cbiAgLyoqXG4gICAqIFdoaWNoIHN1Ym5ldHMgZnJvbSB0aGUgVlBDIHRvIHBsYWNlIHRoZSBsYW1iZGEgZnVuY3Rpb25zIGluLlxuICAgKlxuICAgKiBPbmx5IHVzZWQgaWYgJ3ZwYycgaXMgc3VwcGxpZWQuIE5vdGU6IGludGVybmV0IGFjY2VzcyBmb3IgTGFtYmRhc1xuICAgKiByZXF1aXJlcyBhIE5BVCBnYXRld2F5LCBzbyBwaWNraW5nIFB1YmxpYyBzdWJuZXRzIGlzIG5vdCBhbGxvd2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBWcGMgZGVmYXVsdCBzdHJhdGVneSBpZiBub3Qgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSB2cGNTdWJuZXRzPzogZWMyLlN1Ym5ldFNlbGVjdGlvbjtcblxuICAvKipcbiAgICogU2VjdXJpdHkgZ3JvdXBzIHRvIGF0dGFjaCB0byB0aGUgcHJvdmlkZXIgZnVuY3Rpb25zLlxuICAgKlxuICAgKiBPbmx5IHVzZWQgaWYgJ3ZwYycgaXMgc3VwcGxpZWRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiBgdnBjYCBpcyBub3Qgc3VwcGxpZWQsIG5vIHNlY3VyaXR5IGdyb3VwcyBhcmUgYXR0YWNoZWQuIE90aGVyd2lzZSwgYSBkZWRpY2F0ZWQgc2VjdXJpdHlcbiAgICogZ3JvdXAgaXMgY3JlYXRlZCBmb3IgZWFjaCBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXBzPzogZWMyLklTZWN1cml0eUdyb3VwW107XG5cbiAgLyoqXG4gICAqIEFXUyBMYW1iZGEgZXhlY3V0aW9uIHJvbGUuXG4gICAqXG4gICAqIFRoZSByb2xlIHRoYXQgd2lsbCBiZSBhc3N1bWVkIGJ5IHRoZSBBV1MgTGFtYmRhLlxuICAgKiBNdXN0IGJlIGFzc3VtYWJsZSBieSB0aGUgJ2xhbWJkYS5hbWF6b25hd3MuY29tJyBzZXJ2aWNlIHByaW5jaXBhbC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBBIGRlZmF1bHQgcm9sZSB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlciBMYW1iZGEgbmFtZS5cbiAgICpcbiAgICogVGhlIHByb3ZpZGVyIGxhbWJkYSBmdW5jdGlvbiBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtICBDbG91ZEZvcm1hdGlvbiBkZWZhdWx0IG5hbWUgZnJvbSB1bmlxdWUgcGh5c2ljYWwgSURcbiAgICovXG4gIHJlYWRvbmx5IHByb3ZpZGVyRnVuY3Rpb25OYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIERlZmluZXMgYW4gQVdTIENsb3VkRm9ybWF0aW9uIGN1c3RvbSByZXNvdXJjZSBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFByb3ZpZGVyIGV4dGVuZHMgQ29yZUNvbnN0cnVjdCBpbXBsZW1lbnRzIElDdXN0b21SZXNvdXJjZVByb3ZpZGVyIHtcblxuICAvKipcbiAgICogVGhlIHVzZXItZGVmaW5lZCBBV1MgTGFtYmRhIGZ1bmN0aW9uIHdoaWNoIGlzIGludm9rZWQgZm9yIGFsbCByZXNvdXJjZVxuICAgKiBsaWZlY3ljbGUgb3BlcmF0aW9ucyAoQ1JFQVRFL1VQREFURS9ERUxFVEUpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9uRXZlbnRIYW5kbGVyOiBsYW1iZGEuSUZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgdXNlci1kZWZpbmVkIEFXUyBMYW1iZGEgZnVuY3Rpb24gd2hpY2ggaXMgaW52b2tlZCBhc3luY2hyb25vdXNseSBpblxuICAgKiBvcmRlciB0byBkZXRlcm1pbmUgaWYgdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc0NvbXBsZXRlSGFuZGxlcj86IGxhbWJkYS5JRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlIHRva2VuIHRvIHVzZSBpbiBvcmRlciB0byBkZWZpbmUgY3VzdG9tIHJlc291cmNlcyB0aGF0IGFyZVxuICAgKiBiYWNrZWQgYnkgdGhpcyBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzZXJ2aWNlVG9rZW46IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGVudHJ5cG9pbnQ6IGxhbWJkYS5GdW5jdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dSZXRlbnRpb24/OiBsb2dzLlJldGVudGlvbkRheXM7XG4gIHByaXZhdGUgcmVhZG9ubHkgdnBjPzogZWMyLklWcGM7XG4gIHByaXZhdGUgcmVhZG9ubHkgdnBjU3VibmV0cz86IGVjMi5TdWJuZXRTZWxlY3Rpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdXJpdHlHcm91cHM/OiBlYzIuSVNlY3VyaXR5R3JvdXBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSByb2xlPzogaWFtLklSb2xlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBQcm92aWRlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGlmICghcHJvcHMuaXNDb21wbGV0ZUhhbmRsZXIgJiYgKHByb3BzLnF1ZXJ5SW50ZXJ2YWwgfHwgcHJvcHMudG90YWxUaW1lb3V0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcInF1ZXJ5SW50ZXJ2YWxcIiBhbmQgXCJ0b3RhbFRpbWVvdXRcIiBjYW4gb25seSBiZSBjb25maWd1cmVkIGlmIFwiaXNDb21wbGV0ZUhhbmRsZXJcIiBpcyBzcGVjaWZpZWQuICdcbiAgICAgICAgKyAnT3RoZXJ3aXNlLCB0aGV5IGhhdmUgbm8gbWVhbmluZycpO1xuICAgIH1cblxuICAgIHRoaXMub25FdmVudEhhbmRsZXIgPSBwcm9wcy5vbkV2ZW50SGFuZGxlcjtcbiAgICB0aGlzLmlzQ29tcGxldGVIYW5kbGVyID0gcHJvcHMuaXNDb21wbGV0ZUhhbmRsZXI7XG5cbiAgICB0aGlzLmxvZ1JldGVudGlvbiA9IHByb3BzLmxvZ1JldGVudGlvbjtcbiAgICB0aGlzLnZwYyA9IHByb3BzLnZwYztcbiAgICB0aGlzLnZwY1N1Ym5ldHMgPSBwcm9wcy52cGNTdWJuZXRzO1xuICAgIHRoaXMuc2VjdXJpdHlHcm91cHMgPSBwcm9wcy5zZWN1cml0eUdyb3VwcztcblxuICAgIHRoaXMucm9sZSA9IHByb3BzLnJvbGU7XG5cbiAgICBjb25zdCBvbkV2ZW50RnVuY3Rpb24gPSB0aGlzLmNyZWF0ZUZ1bmN0aW9uKGNvbnN0cy5GUkFNRVdPUktfT05fRVZFTlRfSEFORExFUl9OQU1FLCBwcm9wcy5wcm92aWRlckZ1bmN0aW9uTmFtZSk7XG5cbiAgICBpZiAodGhpcy5pc0NvbXBsZXRlSGFuZGxlcikge1xuICAgICAgY29uc3QgaXNDb21wbGV0ZUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVGdW5jdGlvbihjb25zdHMuRlJBTUVXT1JLX0lTX0NPTVBMRVRFX0hBTkRMRVJfTkFNRSk7XG4gICAgICBjb25zdCB0aW1lb3V0RnVuY3Rpb24gPSB0aGlzLmNyZWF0ZUZ1bmN0aW9uKGNvbnN0cy5GUkFNRVdPUktfT05fVElNRU9VVF9IQU5ETEVSX05BTUUpO1xuXG4gICAgICBjb25zdCByZXRyeSA9IGNhbGN1bGF0ZVJldHJ5UG9saWN5KHByb3BzKTtcbiAgICAgIGNvbnN0IHdhaXRlclN0YXRlTWFjaGluZSA9IG5ldyBXYWl0ZXJTdGF0ZU1hY2hpbmUodGhpcywgJ3dhaXRlci1zdGF0ZS1tYWNoaW5lJywge1xuICAgICAgICBpc0NvbXBsZXRlSGFuZGxlcjogaXNDb21wbGV0ZUZ1bmN0aW9uLFxuICAgICAgICB0aW1lb3V0SGFuZGxlcjogdGltZW91dEZ1bmN0aW9uLFxuICAgICAgICBiYWNrb2ZmUmF0ZTogcmV0cnkuYmFja29mZlJhdGUsXG4gICAgICAgIGludGVydmFsOiByZXRyeS5pbnRlcnZhbCxcbiAgICAgICAgbWF4QXR0ZW1wdHM6IHJldHJ5Lm1heEF0dGVtcHRzLFxuICAgICAgfSk7XG4gICAgICAvLyB0aGUgb24tZXZlbnQgZW50cnlwb2ludCBpcyBnb2luZyB0byBzdGFydCB0aGUgZXhlY3V0aW9uIG9mIHRoZSB3YWl0ZXJcbiAgICAgIG9uRXZlbnRGdW5jdGlvbi5hZGRFbnZpcm9ubWVudChjb25zdHMuV0FJVEVSX1NUQVRFX01BQ0hJTkVfQVJOX0VOViwgd2FpdGVyU3RhdGVNYWNoaW5lLnN0YXRlTWFjaGluZUFybik7XG4gICAgICB3YWl0ZXJTdGF0ZU1hY2hpbmUuZ3JhbnRTdGFydEV4ZWN1dGlvbihvbkV2ZW50RnVuY3Rpb24pO1xuICAgIH1cblxuICAgIHRoaXMuZW50cnlwb2ludCA9IG9uRXZlbnRGdW5jdGlvbjtcbiAgICB0aGlzLnNlcnZpY2VUb2tlbiA9IHRoaXMuZW50cnlwb2ludC5mdW5jdGlvbkFybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgYEN1c3RvbVJlc291cmNlYCB3aGljaCB1c2VzIHRoaXMgcHJvdmlkZXIuXG4gICAqIEBkZXByZWNhdGVkIHVzZSBgcHJvdmlkZXIuc2VydmljZVRva2VuYCBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgYmluZChfc2NvcGU6IENvcmVDb25zdHJ1Y3QpOiBDdXN0b21SZXNvdXJjZVByb3ZpZGVyQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VydmljZVRva2VuOiB0aGlzLmVudHJ5cG9pbnQuZnVuY3Rpb25Bcm4sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRnVuY3Rpb24oZW50cnlwb2ludDogc3RyaW5nLCBuYW1lPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZm4gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsIGBmcmFtZXdvcmstJHtlbnRyeXBvaW50fWAsIHtcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChSVU5USU1FX0hBTkRMRVJfUEFUSCwge1xuICAgICAgICBleGNsdWRlOiBbJyoudHMnXSxcbiAgICAgIH0pLFxuICAgICAgZGVzY3JpcHRpb246IGBBV1MgQ0RLIHJlc291cmNlIHByb3ZpZGVyIGZyYW1ld29yayAtICR7ZW50cnlwb2ludH0gKCR7dGhpcy5ub2RlLnBhdGh9KWAuc2xpY2UoMCwgMjU2KSxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xNF9YLFxuICAgICAgaGFuZGxlcjogYGZyYW1ld29yay4ke2VudHJ5cG9pbnR9YCxcbiAgICAgIHRpbWVvdXQ6IEZSQU1FV09SS19IQU5ETEVSX1RJTUVPVVQsXG4gICAgICBsb2dSZXRlbnRpb246IHRoaXMubG9nUmV0ZW50aW9uLFxuICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHRoaXMudnBjU3VibmV0cyxcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiB0aGlzLnNlY3VyaXR5R3JvdXBzLFxuICAgICAgcm9sZTogdGhpcy5yb2xlLFxuICAgICAgZnVuY3Rpb25OYW1lOiBuYW1lLFxuICAgIH0pO1xuXG4gICAgZm4uYWRkRW52aXJvbm1lbnQoY29uc3RzLlVTRVJfT05fRVZFTlRfRlVOQ1RJT05fQVJOX0VOViwgdGhpcy5vbkV2ZW50SGFuZGxlci5mdW5jdGlvbkFybik7XG4gICAgdGhpcy5vbkV2ZW50SGFuZGxlci5ncmFudEludm9rZShmbik7XG5cbiAgICBpZiAodGhpcy5pc0NvbXBsZXRlSGFuZGxlcikge1xuICAgICAgZm4uYWRkRW52aXJvbm1lbnQoY29uc3RzLlVTRVJfSVNfQ09NUExFVEVfRlVOQ1RJT05fQVJOX0VOViwgdGhpcy5pc0NvbXBsZXRlSGFuZGxlci5mdW5jdGlvbkFybik7XG4gICAgICB0aGlzLmlzQ29tcGxldGVIYW5kbGVyLmdyYW50SW52b2tlKGZuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm47XG4gIH1cbn1cbiJdfQ==
\No newline at end of file