raindancers-network
Version:
Extensions to the ec2.Vpc Constructs
92 lines • 13.8 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.AwsManagedDNSFirewallRuleGroup = exports.DNSFirewallBlockResponse = exports.DNSFirewallActions = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const path = require("path");
const cdk = require("aws-cdk-lib");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const constructs = require("constructs");
var DNSFirewallActions;
(function (DNSFirewallActions) {
DNSFirewallActions["ALLOW"] = "ALLOW";
DNSFirewallActions["BLOCK"] = "BLOCK";
DNSFirewallActions["ALERT"] = "ALERT";
})(DNSFirewallActions = exports.DNSFirewallActions || (exports.DNSFirewallActions = {}));
var DNSFirewallBlockResponse;
(function (DNSFirewallBlockResponse) {
DNSFirewallBlockResponse["NODATA"] = "NODATA";
DNSFirewallBlockResponse["NXDOMAIN"] = "NXDOMAIN";
DNSFirewallBlockResponse["OVERRIDE"] = "OVERRIDE";
})(DNSFirewallBlockResponse = exports.DNSFirewallBlockResponse || (exports.DNSFirewallBlockResponse = {}));
class AwsManagedDNSFirewallRuleGroup extends constructs.Construct {
constructor(scope, id) {
super(scope, id);
// this lambda will make a api-call to find the ids of the managed aws dns firewalls
// aws route53resolver list-firewall-domain-lists
// because this api call does not have a filter parameter and needs sorting it
// is not a good candidate for a awscustomresource/sdk call.
// the ids for the rule groups are different in every region.
const lookupFunction = new aws_cdk_lib_1.aws_lambda.Function(this, 'FindRules', {
runtime: aws_cdk_lib_1.aws_lambda.Runtime.PYTHON_3_9,
logRetention: aws_cdk_lib_1.aws_logs.RetentionDays.ONE_MONTH,
handler: 'managedAWSRules.on_event',
code: aws_cdk_lib_1.aws_lambda.Code.fromAsset(path.join(__dirname, '../../lambda/dns')),
timeout: cdk.Duration.seconds(300),
});
// give the lambda's role addtional permissions so it can make the required calls.
// the addToRolePolicy method will add this as inline policy to the lambdas role.
lookupFunction.addToRolePolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
actions: ['route53resolver:ListFirewallDomainLists'],
effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW,
resources: ['*'],
}));
// create a lambda backed cloudformation custom resource.
// the lambda function will interact with cloudformaton events ( create, delete, update )
// this provides a way to plug coverage gaps in cloudformation, or perform logic that woudl
// be difficult or impossible to do otherwise.
const awsManagedRules = [
'AWSManagedDomainsMalwareDomainList',
'AWSManagedDomainsAggregateThreatList',
'AWSManagedDomainsBotnetCommandandControl',
];
const lookupCr = new cdk.CustomResource(this, 'lookupCr', {
resourceType: 'Custom::Lookup',
properties: {
// propertys are sent to the lambda as part of the event information
// in this case a list of rule names that we want to find.
awsManagedRules: awsManagedRules,
},
//the service token, and provider are the mechamism of how the lambda is connected
//to the custom resource
serviceToken: new aws_cdk_lib_1.custom_resources.Provider(this, 'associateProvider', {
onEventHandler: lookupFunction,
}).serviceToken,
});
//aws route53resolver list-firewall-domain-lists --profile network
// the .getAtt() method, provides a way to get the result of the function that was called back.
// in this case we are expecting a list, so, we the Token.asList method to convert that as a list.
const firewallDomainListsIds = cdk.Token.asList(lookupCr.getAtt('ManagedRuleIds'));
// interate over the list of Ids that where returned. We will get one id, for each item that we requested
// from the lookup. we can not directly iterate over the list, as the list does not exisit until deployment.
const firewallRules = [];
for (let index = 0; index < awsManagedRules.length; index++) {
firewallRules.push({
action: DNSFirewallActions.BLOCK,
firewallDomainListId: cdk.Fn.select(index, firewallDomainListsIds),
priority: 100 + index,
blockResponse: DNSFirewallBlockResponse.NODATA,
});
}
;
const FirewallRuleGroup = new aws_cdk_lib_1.aws_route53resolver.CfnFirewallRuleGroup(this, 'AwsManagedDNSFirewallRules', {
firewallRules: firewallRules,
name: 'AWS Managed Rules',
});
this.resolverRuleId = FirewallRuleGroup.attrId;
}
}
exports.AwsManagedDNSFirewallRuleGroup = AwsManagedDNSFirewallRuleGroup;
_a = JSII_RTTI_SYMBOL_1;
AwsManagedDNSFirewallRuleGroup[_a] = { fqn: "raindancers-network.dns.AwsManagedDNSFirewallRuleGroup", version: "1.29.3" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5zZmlyZXdhbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZG5zL2Ruc2ZpcmV3YWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkJBQTZCO0FBRTdCLG1DQUFtQztBQUVuQyw2Q0FNcUI7QUFFckIseUNBQXlDO0FBRXpDLElBQVksa0JBSVg7QUFKRCxXQUFZLGtCQUFrQjtJQUM1QixxQ0FBZSxDQUFBO0lBQ2YscUNBQWUsQ0FBQTtJQUNmLHFDQUFlLENBQUE7QUFDakIsQ0FBQyxFQUpXLGtCQUFrQixHQUFsQiwwQkFBa0IsS0FBbEIsMEJBQWtCLFFBSTdCO0FBRUQsSUFBWSx3QkFJWDtBQUpELFdBQVksd0JBQXdCO0lBQ2xDLDZDQUFpQixDQUFBO0lBQ2pCLGlEQUFxQixDQUFBO0lBQ3JCLGlEQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFKVyx3QkFBd0IsR0FBeEIsZ0NBQXdCLEtBQXhCLGdDQUF3QixRQUluQztBQUVELE1BQWEsOEJBQStCLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFJdEUsWUFBWSxLQUEyQixFQUFFLEVBQVU7UUFDakQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixvRkFBb0Y7UUFDcEYsaURBQWlEO1FBQ2pELDhFQUE4RTtRQUM5RSw0REFBNEQ7UUFDNUQsNkRBQTZEO1FBRTdELE1BQU0sY0FBYyxHQUFHLElBQUksd0JBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUNoRSxPQUFPLEVBQUUsd0JBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVTtZQUN0QyxZQUFZLEVBQUUsc0JBQUksQ0FBQyxhQUFhLENBQUMsU0FBUztZQUMxQyxPQUFPLEVBQUUsMEJBQTBCO1lBQ25DLElBQUksRUFBRSx3QkFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUN6RSxPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1NBQ25DLENBQUMsQ0FBQztRQUVILGtGQUFrRjtRQUNsRixpRkFBaUY7UUFDakYsY0FBYyxDQUFDLGVBQWUsQ0FDNUIsSUFBSSxxQkFBRyxDQUFDLGVBQWUsQ0FBQztZQUN0QixPQUFPLEVBQUUsQ0FBQyx5Q0FBeUMsQ0FBQztZQUNwRCxNQUFNLEVBQUUscUJBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztZQUN4QixTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7U0FDakIsQ0FBQyxDQUNILENBQUM7UUFFRix5REFBeUQ7UUFDekQseUZBQXlGO1FBQ3pGLDJGQUEyRjtRQUMzRiw4Q0FBOEM7UUFFOUMsTUFBTSxlQUFlLEdBQUc7WUFDdEIsb0NBQW9DO1lBQ3BDLHNDQUFzQztZQUN0QywwQ0FBMEM7U0FDM0MsQ0FBQztRQUVGLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3hELFlBQVksRUFBRSxnQkFBZ0I7WUFDOUIsVUFBVSxFQUFFO2dCQUNWLG9FQUFvRTtnQkFDcEUsMERBQTBEO2dCQUMxRCxlQUFlLEVBQUUsZUFBZTthQUNqQztZQUNELGtGQUFrRjtZQUNsRix3QkFBd0I7WUFDeEIsWUFBWSxFQUFFLElBQUksOEJBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO2dCQUN2RCxjQUFjLEVBQUUsY0FBYzthQUMvQixDQUFDLENBQUMsWUFBWTtTQUNoQixDQUFDLENBQUM7UUFFSCxrRUFBa0U7UUFFbEUsK0ZBQStGO1FBQy9GLGtHQUFrRztRQUVsRyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1FBRW5GLHlHQUF5RztRQUN6Ryw0R0FBNEc7UUFHNUcsTUFBTSxhQUFhLEdBQXFELEVBQUUsQ0FBQztRQUMzRSxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUMzRCxhQUFhLENBQUMsSUFBSSxDQUFDO2dCQUNqQixNQUFNLEVBQUUsa0JBQWtCLENBQUMsS0FBSztnQkFDaEMsb0JBQW9CLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLHNCQUFzQixDQUFDO2dCQUNsRSxRQUFRLEVBQUUsR0FBRyxHQUFHLEtBQUs7Z0JBQ3JCLGFBQWEsRUFBRSx3QkFBd0IsQ0FBQyxNQUFNO2FBQy9DLENBQUMsQ0FBQztTQUNKO1FBQUEsQ0FBQztRQUVGLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxpQ0FBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSw0QkFBNEIsRUFBRTtZQUMxRixhQUFhLEVBQUUsYUFBYTtZQUM1QixJQUFJLEVBQUUsbUJBQW1CO1NBQzFCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxjQUFjLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDO0lBRWpELENBQUM7O0FBcEZILHdFQXFGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5cbmltcG9ydCB7XG4gIGF3c19yb3V0ZTUzcmVzb2x2ZXIgYXMgcjUzcixcbiAgY3VzdG9tX3Jlc291cmNlcyBhcyBjcixcbiAgYXdzX2xvZ3MgYXMgbG9ncyxcbiAgYXdzX2lhbSBhcyBpYW0sXG4gIGF3c19sYW1iZGEsXG59IGZyb20gJ2F3cy1jZGstbGliJztcblxuaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tICdjb25zdHJ1Y3RzJztcblxuZXhwb3J0IGVudW0gRE5TRmlyZXdhbGxBY3Rpb25zIHtcbiAgQUxMT1cgPSAnQUxMT1cnLFxuICBCTE9DSyA9ICdCTE9DSycsXG4gIEFMRVJUID0gJ0FMRVJUJ1xufVxuXG5leHBvcnQgZW51bSBETlNGaXJld2FsbEJsb2NrUmVzcG9uc2Uge1xuICBOT0RBVEEgPSAnTk9EQVRBJyxcbiAgTlhET01BSU4gPSAnTlhET01BSU4nLFxuICBPVkVSUklERSA9ICdPVkVSUklERSdcbn1cblxuZXhwb3J0IGNsYXNzIEF3c01hbmFnZWRETlNGaXJld2FsbFJ1bGVHcm91cCBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcblxuICByZXNvbHZlclJ1bGVJZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyB0aGlzIGxhbWJkYSB3aWxsIG1ha2UgYSBhcGktY2FsbCB0byBmaW5kIHRoZSBpZHMgb2YgdGhlIG1hbmFnZWQgYXdzIGRucyBmaXJld2FsbHNcbiAgICAvLyBhd3Mgcm91dGU1M3Jlc29sdmVyIGxpc3QtZmlyZXdhbGwtZG9tYWluLWxpc3RzXG4gICAgLy8gYmVjYXVzZSB0aGlzIGFwaSBjYWxsIGRvZXMgbm90IGhhdmUgYSBmaWx0ZXIgcGFyYW1ldGVyIGFuZCBuZWVkcyBzb3J0aW5nIGl0XG4gICAgLy8gaXMgbm90IGEgZ29vZCBjYW5kaWRhdGUgZm9yIGEgYXdzY3VzdG9tcmVzb3VyY2Uvc2RrIGNhbGwuXG4gICAgLy8gdGhlIGlkcyBmb3IgdGhlIHJ1bGUgZ3JvdXBzIGFyZSBkaWZmZXJlbnQgaW4gZXZlcnkgcmVnaW9uLlxuXG4gICAgY29uc3QgbG9va3VwRnVuY3Rpb24gPSBuZXcgYXdzX2xhbWJkYS5GdW5jdGlvbih0aGlzLCAnRmluZFJ1bGVzJywge1xuICAgICAgcnVudGltZTogYXdzX2xhbWJkYS5SdW50aW1lLlBZVEhPTl8zXzksXG4gICAgICBsb2dSZXRlbnRpb246IGxvZ3MuUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgICBoYW5kbGVyOiAnbWFuYWdlZEFXU1J1bGVzLm9uX2V2ZW50JyxcbiAgICAgIGNvZGU6IGF3c19sYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2xhbWJkYS9kbnMnKSksXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygzMDApLFxuICAgIH0pO1xuXG4gICAgLy8gZ2l2ZSB0aGUgbGFtYmRhJ3Mgcm9sZSBhZGR0aW9uYWwgcGVybWlzc2lvbnMgc28gaXQgY2FuIG1ha2UgdGhlIHJlcXVpcmVkIGNhbGxzLlxuICAgIC8vIHRoZSBhZGRUb1JvbGVQb2xpY3kgbWV0aG9kIHdpbGwgYWRkIHRoaXMgYXMgaW5saW5lIHBvbGljeSB0byB0aGUgbGFtYmRhcyByb2xlLlxuICAgIGxvb2t1cEZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogWydyb3V0ZTUzcmVzb2x2ZXI6TGlzdEZpcmV3YWxsRG9tYWluTGlzdHMnXSxcbiAgICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIGNyZWF0ZSBhIGxhbWJkYSBiYWNrZWQgY2xvdWRmb3JtYXRpb24gY3VzdG9tIHJlc291cmNlLlxuICAgIC8vIHRoZSBsYW1iZGEgZnVuY3Rpb24gd2lsbCBpbnRlcmFjdCB3aXRoIGNsb3VkZm9ybWF0b24gZXZlbnRzICggY3JlYXRlLCBkZWxldGUsIHVwZGF0ZSApXG4gICAgLy8gdGhpcyBwcm92aWRlcyBhIHdheSB0byBwbHVnIGNvdmVyYWdlIGdhcHMgaW4gY2xvdWRmb3JtYXRpb24sIG9yIHBlcmZvcm0gbG9naWMgdGhhdCB3b3VkbFxuICAgIC8vIGJlIGRpZmZpY3VsdCBvciBpbXBvc3NpYmxlIHRvIGRvIG90aGVyd2lzZS5cblxuICAgIGNvbnN0IGF3c01hbmFnZWRSdWxlcyA9IFtcbiAgICAgICdBV1NNYW5hZ2VkRG9tYWluc01hbHdhcmVEb21haW5MaXN0JyxcbiAgICAgICdBV1NNYW5hZ2VkRG9tYWluc0FnZ3JlZ2F0ZVRocmVhdExpc3QnLFxuICAgICAgJ0FXU01hbmFnZWREb21haW5zQm90bmV0Q29tbWFuZGFuZENvbnRyb2wnLFxuICAgIF07XG5cbiAgICBjb25zdCBsb29rdXBDciA9IG5ldyBjZGsuQ3VzdG9tUmVzb3VyY2UodGhpcywgJ2xvb2t1cENyJywge1xuICAgICAgcmVzb3VyY2VUeXBlOiAnQ3VzdG9tOjpMb29rdXAnLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAvLyBwcm9wZXJ0eXMgYXJlIHNlbnQgdG8gdGhlIGxhbWJkYSBhcyBwYXJ0IG9mIHRoZSBldmVudCBpbmZvcm1hdGlvblxuICAgICAgICAvLyBpbiB0aGlzIGNhc2UgYSBsaXN0IG9mIHJ1bGUgbmFtZXMgdGhhdCB3ZSB3YW50IHRvIGZpbmQuXG4gICAgICAgIGF3c01hbmFnZWRSdWxlczogYXdzTWFuYWdlZFJ1bGVzLFxuICAgICAgfSxcbiAgICAgIC8vdGhlIHNlcnZpY2UgdG9rZW4sIGFuZCBwcm92aWRlciBhcmUgdGhlIG1lY2hhbWlzbSBvZiBob3cgdGhlIGxhbWJkYSBpcyBjb25uZWN0ZWRcbiAgICAgIC8vdG8gdGhlIGN1c3RvbSByZXNvdXJjZVxuICAgICAgc2VydmljZVRva2VuOiBuZXcgY3IuUHJvdmlkZXIodGhpcywgJ2Fzc29jaWF0ZVByb3ZpZGVyJywge1xuICAgICAgICBvbkV2ZW50SGFuZGxlcjogbG9va3VwRnVuY3Rpb24sXG4gICAgICB9KS5zZXJ2aWNlVG9rZW4sXG4gICAgfSk7XG5cbiAgICAvL2F3cyByb3V0ZTUzcmVzb2x2ZXIgbGlzdC1maXJld2FsbC1kb21haW4tbGlzdHMgLS1wcm9maWxlIG5ldHdvcmtcblxuICAgIC8vIHRoZSAuZ2V0QXR0KCkgbWV0aG9kLCBwcm92aWRlcyBhIHdheSB0byBnZXQgdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gdGhhdCB3YXMgY2FsbGVkIGJhY2suXG4gICAgLy8gaW4gdGhpcyBjYXNlIHdlIGFyZSBleHBlY3RpbmcgYSBsaXN0LCBzbywgd2UgdGhlIFRva2VuLmFzTGlzdCBtZXRob2QgdG8gY29udmVydCB0aGF0IGFzIGEgbGlzdC5cblxuICAgIGNvbnN0IGZpcmV3YWxsRG9tYWluTGlzdHNJZHMgPSBjZGsuVG9rZW4uYXNMaXN0KGxvb2t1cENyLmdldEF0dCgnTWFuYWdlZFJ1bGVJZHMnKSk7XG5cbiAgICAvLyBpbnRlcmF0ZSBvdmVyIHRoZSBsaXN0IG9mIElkcyB0aGF0IHdoZXJlIHJldHVybmVkLiBXZSB3aWxsIGdldCBvbmUgaWQsIGZvciBlYWNoIGl0ZW0gdGhhdCB3ZSByZXF1ZXN0ZWRcbiAgICAvLyBmcm9tIHRoZSBsb29rdXAuIHdlIGNhbiBub3QgZGlyZWN0bHkgaXRlcmF0ZSBvdmVyIHRoZSBsaXN0LCBhcyB0aGUgbGlzdCBkb2VzIG5vdCBleGlzaXQgdW50aWwgZGVwbG95bWVudC5cblxuXG4gICAgY29uc3QgZmlyZXdhbGxSdWxlczogcjUzci5DZm5GaXJld2FsbFJ1bGVHcm91cC5GaXJld2FsbFJ1bGVQcm9wZXJ0eVtdID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGF3c01hbmFnZWRSdWxlcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGZpcmV3YWxsUnVsZXMucHVzaCh7XG4gICAgICAgIGFjdGlvbjogRE5TRmlyZXdhbGxBY3Rpb25zLkJMT0NLLFxuICAgICAgICBmaXJld2FsbERvbWFpbkxpc3RJZDogY2RrLkZuLnNlbGVjdChpbmRleCwgZmlyZXdhbGxEb21haW5MaXN0c0lkcyksXG4gICAgICAgIHByaW9yaXR5OiAxMDAgKyBpbmRleCxcbiAgICAgICAgYmxvY2tSZXNwb25zZTogRE5TRmlyZXdhbGxCbG9ja1Jlc3BvbnNlLk5PREFUQSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBGaXJld2FsbFJ1bGVHcm91cCA9IG5ldyByNTNyLkNmbkZpcmV3YWxsUnVsZUdyb3VwKHRoaXMsICdBd3NNYW5hZ2VkRE5TRmlyZXdhbGxSdWxlcycsIHtcbiAgICAgIGZpcmV3YWxsUnVsZXM6IGZpcmV3YWxsUnVsZXMsXG4gICAgICBuYW1lOiAnQVdTIE1hbmFnZWQgUnVsZXMnLFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZXNvbHZlclJ1bGVJZCA9IEZpcmV3YWxsUnVsZUdyb3VwLmF0dHJJZDtcblxuICB9XG59Il19