@restatedev/restate-cdk 0.7.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,23 +10,27 @@ AWS. This library helps you when deploying Restate services to AWS Lambda as wel
10
10
  deployments on your own infrastructure. For more information on CDK, please
11
11
  see [Getting started with the AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html).
12
12
 
13
+ ## Installation
14
+
15
+ Inside an existing CDK project, add the library from [npm](https://www.npmjs.com/package/@restatedev/restate-cdk):
16
+
17
+ ```shell
18
+ npm i @restatedev/restate-cdk
19
+ ```
20
+
13
21
  ## Available constructs
14
22
 
15
- - [`LambdaServiceRegistry`](./lib/restate-constructs/lambda-service-registry.ts) - A collection of Lambda-deployed
16
- Restate services, this construct automatically registers the latest function version as a new deployment revision in a
17
- Restate instance
18
23
  - [`SingleNodeRestateDeployment`](./lib/restate-constructs/single-node-restate-deployment.ts) - Deploys a self-hosted
19
- Restate instance on EC2; note this is a single-node deployment targeted at development and testing
20
- - [`RestateCloudEnvironment`](./lib/restate-constructs/restate-cloud-environment.ts) - A Restate Cloud instance
24
+ Restate server running on Amazon EC2; this provides a basic single-node deployment targeted at development and testing
25
+ - [`ServiceDeployer`](./lib/restate-constructs/service-deployer.ts) - facilitates registration of Lambda-based service
26
+ handlers with a Restate environment, such as a self-hosted EC2 environment
21
27
 
22
28
  For a more detailed overview, please see
23
- the [Restate CDK documentation](https://docs.restate.dev/services/deployment/cdk).
29
+ the [Restate CDK documentation](https://docs.restate.dev/deploy/lambda/cdk).
24
30
 
25
31
  ### Examples
26
32
 
27
- You can use the following examples as references for your own CDK projects:
33
+ You can use the following templates to bootstrap your own CDK projects:
28
34
 
29
- - [hello-world-lambda-cdk](https://github.com/restatedev/examples/tree/main/kotlin/hello-world-lambda-cdk) - Kotlin
30
- service deployed to AWS Lambda
31
- - [Restate Holiday](https://github.com/restatedev/restate-holiday) - a more complex example of a fictional reservation
32
- service demonstrating the Saga orchestration pattern
35
+ - [typescript-lambda-cdk](https://github.com/restatedev/examples/tree/main/templates/typescript-lambda-cdk)
36
+ - [kotlin-gradle-lambda-cdk](https://github.com/restatedev/examples/tree/main/templates/kotlin-gradle-lambda-cdk)
@@ -0,0 +1,4 @@
1
+ export declare enum TracingMode {
2
+ DISABLED = "DISABLED",
3
+ AWS_XRAY = "AWS_XRAY"
4
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TracingMode = void 0;
4
+ var TracingMode;
5
+ (function (TracingMode) {
6
+ TracingMode["DISABLED"] = "DISABLED";
7
+ TracingMode["AWS_XRAY"] = "AWS_XRAY";
8
+ })(TracingMode || (exports.TracingMode = TracingMode = {}));
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudHMtY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3Jlc3RhdGUtY29uc3RydWN0cy9kZXBsb3ltZW50cy1jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBWSxXQUdYO0FBSEQsV0FBWSxXQUFXO0lBQ3JCLG9DQUFxQixDQUFBO0lBQ3JCLG9DQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFIVyxXQUFXLDJCQUFYLFdBQVcsUUFHdEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZW51bSBUcmFjaW5nTW9kZSB7XG4gIERJU0FCTEVEID0gXCJESVNBQkxFRFwiLFxuICBBV1NfWFJBWSA9IFwiQVdTX1hSQVlcIixcbn1cbiJdfQ==
@@ -0,0 +1,77 @@
1
+ import { Construct } from "constructs";
2
+ import * as cdk from "aws-cdk-lib";
3
+ import * as logs from "aws-cdk-lib/aws-logs";
4
+ import * as ec2 from "aws-cdk-lib/aws-ec2";
5
+ import * as iam from "aws-cdk-lib/aws-iam";
6
+ import * as efs from "aws-cdk-lib/aws-efs";
7
+ import * as elb2 from "aws-cdk-lib/aws-elasticloadbalancingv2";
8
+ import * as r53 from "aws-cdk-lib/aws-route53";
9
+ import { IRestateEnvironment } from "./restate-environment";
10
+ import { TracingMode } from "./deployments-common";
11
+ export interface RestateFargateProps {
12
+ /** The VPC in which to launch the Restate host. */
13
+ vpc?: ec2.IVpc;
14
+ /** Log group for Restate service logs. */
15
+ logGroup?: logs.LogGroup;
16
+ /** Tracing mode for Restate services. Defaults to {@link TracingMode.DISABLED}. */
17
+ tracing?: TracingMode;
18
+ /** Prefix for resources created by this construct that require unique names. */
19
+ prefix?: string;
20
+ /** ECS cluster name. */
21
+ clusterName?: string;
22
+ /** Restate Docker image name. Defaults to `latest`. */
23
+ restateImage?: string;
24
+ /** Restate Docker image tag. Defaults to `latest`. */
25
+ restateTag?: string;
26
+ /** Amazon Distro for Open Telemetry Docker image tag. Defaults to `latest`. */
27
+ adotTag?: string;
28
+ /**
29
+ * Environment for Restate container. Use it to configure logging and other process-level settings.
30
+ */
31
+ environment?: Record<string, string>;
32
+ /**
33
+ * Restate container extra arguments.
34
+ */
35
+ command?: string[];
36
+ /**
37
+ * The full name for the public endpoint.
38
+ */
39
+ dnsName: string;
40
+ /**
41
+ * DNS zone in which to create the public endpoint.
42
+ */
43
+ hostedZone: r53.IHostedZone;
44
+ /**
45
+ * Removal policy for long-lived resources (storage, logs). Default: `cdk.RemovalPolicy.DESTROY`.
46
+ */
47
+ removalPolicy?: cdk.RemovalPolicy;
48
+ /**
49
+ * Load balancer configuration.
50
+ */
51
+ loadBalancer?: {
52
+ /** @see BaseLoadBalancerProps.internetFacing */
53
+ internetFacing?: boolean;
54
+ /**
55
+ * If you set this to false, you can customize the access to the pair of ALB listeners via
56
+ * {@link FargateRestateDeployment.ingressListener} and {@link FargateRestateDeployment.adminListener}.
57
+ *
58
+ * @see BaseApplicationListenerProps.open */
59
+ open?: boolean;
60
+ };
61
+ }
62
+ /**
63
+ * Creates a Restate service deployment running as a Fargate task and backed by EFS.
64
+ *
65
+ * Please note that this construct is still experimental! Use with caution.
66
+ */
67
+ export declare class FargateRestateDeployment extends Construct implements IRestateEnvironment {
68
+ readonly invokerRole: iam.IRole;
69
+ readonly vpc: ec2.IVpc;
70
+ readonly ingressUrl: string;
71
+ readonly adminUrl: string;
72
+ readonly securityGroup: ec2.SecurityGroup;
73
+ readonly dataStore: efs.FileSystem;
74
+ readonly ingressListener: elb2.ApplicationListener;
75
+ readonly adminListener: elb2.ApplicationListener;
76
+ constructor(scope: Construct, id: string, props: RestateFargateProps);
77
+ }
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2023 - Restate Software, Inc., Restate GmbH
4
+ *
5
+ * This file is part of the Restate SDK for Node.js/TypeScript,
6
+ * which is released under the MIT license.
7
+ *
8
+ * You can find a copy of the license in file LICENSE in the root
9
+ * directory of this repository or package, or at
10
+ * https://github.com/restatedev/sdk-typescript/blob/main/LICENSE
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.FargateRestateDeployment = void 0;
37
+ const constructs_1 = require("constructs");
38
+ const cdk = __importStar(require("aws-cdk-lib"));
39
+ const acm = __importStar(require("aws-cdk-lib/aws-certificatemanager"));
40
+ const logs = __importStar(require("aws-cdk-lib/aws-logs"));
41
+ const ec2 = __importStar(require("aws-cdk-lib/aws-ec2"));
42
+ const iam = __importStar(require("aws-cdk-lib/aws-iam"));
43
+ const ecs = __importStar(require("aws-cdk-lib/aws-ecs"));
44
+ const efs = __importStar(require("aws-cdk-lib/aws-efs"));
45
+ const elb2 = __importStar(require("aws-cdk-lib/aws-elasticloadbalancingv2"));
46
+ const r53 = __importStar(require("aws-cdk-lib/aws-route53"));
47
+ const targets = __importStar(require("aws-cdk-lib/aws-route53-targets"));
48
+ const PUBLIC_INGRESS_PORT = 443;
49
+ const PUBLIC_ADMIN_PORT = 9070;
50
+ const RESTATE_INGRESS_PORT = 8080;
51
+ const RESTATE_ADMIN_PORT = 9070;
52
+ const RESTATE_IMAGE_DEFAULT = "docker.io/restatedev/restate";
53
+ const RESTATE_DOCKER_DEFAULT_TAG = "latest";
54
+ const ADOT_DOCKER_DEFAULT_TAG = "latest";
55
+ /**
56
+ * Creates a Restate service deployment running as a Fargate task and backed by EFS.
57
+ *
58
+ * Please note that this construct is still experimental! Use with caution.
59
+ */
60
+ class FargateRestateDeployment extends constructs_1.Construct {
61
+ constructor(scope, id, props) {
62
+ super(scope, id);
63
+ this.vpc = props.vpc ?? ec2.Vpc.fromLookup(this, "Vpc", { isDefault: true });
64
+ const restateImage = props.restateImage ?? RESTATE_IMAGE_DEFAULT;
65
+ const restateTag = props.restateTag ?? RESTATE_DOCKER_DEFAULT_TAG;
66
+ const adotTag = props.adotTag ?? ADOT_DOCKER_DEFAULT_TAG; // TODO: add X-Ray support like we have for EC2
67
+ const fs = new efs.FileSystem(this, "DataStore", {
68
+ vpc: this.vpc,
69
+ lifecyclePolicy: efs.LifecyclePolicy.AFTER_30_DAYS,
70
+ performanceMode: efs.PerformanceMode.GENERAL_PURPOSE,
71
+ throughputMode: efs.ThroughputMode.BURSTING,
72
+ removalPolicy: props.removalPolicy ?? cdk.RemovalPolicy.DESTROY,
73
+ });
74
+ fs.addToResourcePolicy(new iam.PolicyStatement({
75
+ sid: "AllowEfsMount",
76
+ actions: ["elasticfilesystem:ClientMount"],
77
+ // Restricting to the ECS execution role does not work; probably doesn't matter - EFS access is secured by a security group
78
+ principals: [new iam.AnyPrincipal()],
79
+ conditions: {
80
+ Bool: {
81
+ "elasticfilesystem:AccessedViaMountTarget": "true",
82
+ },
83
+ },
84
+ }));
85
+ this.dataStore = fs;
86
+ const cluster = new ecs.Cluster(this, "Cluster", {
87
+ vpc: this.vpc,
88
+ clusterName: props.clusterName,
89
+ });
90
+ const restateTask = new ecs.FargateTaskDefinition(this, "RestateTask", {
91
+ cpu: 4096,
92
+ memoryLimitMiB: 8192,
93
+ runtimePlatform: {
94
+ cpuArchitecture: ecs.CpuArchitecture.ARM64,
95
+ operatingSystemFamily: ecs.OperatingSystemFamily.LINUX,
96
+ },
97
+ volumes: [
98
+ {
99
+ name: "restateStore",
100
+ efsVolumeConfiguration: {
101
+ fileSystemId: fs.fileSystemId,
102
+ authorizationConfig: {},
103
+ },
104
+ },
105
+ ],
106
+ });
107
+ // TODO: Start an ADOT container and hook it up to Restate and AWS X-Ray or another OTel sink
108
+ // if (props.tracing === TracingMode.AWS_XRAY) {
109
+ // restateTask.taskRole.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName("AWSXrayWriteOnlyAccess"));
110
+ // }
111
+ new iam.Policy(this, "TaskPolicy", {
112
+ statements: [
113
+ new iam.PolicyStatement({
114
+ sid: "AllowAssumeAnyRole",
115
+ actions: ["sts:AssumeRole"],
116
+ resources: ["*"], // we don't know upfront what invoker roles we may be asked to assume at runtime
117
+ }),
118
+ ],
119
+ }).attachToRole(restateTask.taskRole);
120
+ const invokerRole = new iam.Role(this, "InvokerRole", {
121
+ assumedBy: new iam.ArnPrincipal(restateTask.taskRole.roleArn),
122
+ description: "Assumed by Restate deployment to invoke Lambda-based services",
123
+ });
124
+ invokerRole.grantAssumeRole(restateTask.taskRole);
125
+ this.invokerRole = invokerRole;
126
+ const logGroup = props.logGroup ??
127
+ new logs.LogGroup(this, "Logs", {
128
+ logGroupName: `/restate/${id}`,
129
+ retention: logs.RetentionDays.ONE_MONTH,
130
+ removalPolicy: props.removalPolicy ?? cdk.RemovalPolicy.DESTROY,
131
+ });
132
+ const restate = restateTask.addContainer("Restate", {
133
+ containerName: "restate-runtime",
134
+ image: ecs.ContainerImage.fromRegistry(`${restateImage}:${restateTag}`),
135
+ portMappings: [{ containerPort: RESTATE_INGRESS_PORT }, { containerPort: RESTATE_ADMIN_PORT }],
136
+ logging: ecs.LogDriver.awsLogs({
137
+ logGroup,
138
+ streamPrefix: "restate",
139
+ }),
140
+ environment: {
141
+ RESTATE_OBSERVABILITY__LOG__FORMAT: "Json",
142
+ // RUST_LOG: "warn,restate=info",
143
+ },
144
+ command: props.command,
145
+ startTimeout: cdk.Duration.seconds(20),
146
+ stopTimeout: cdk.Duration.seconds(20),
147
+ });
148
+ restate.addMountPoints({
149
+ containerPath: "/target",
150
+ readOnly: false,
151
+ sourceVolume: "restateStore",
152
+ });
153
+ const restateSecurityGroup = new ec2.SecurityGroup(this, "SecurityGroup", {
154
+ vpc: this.vpc,
155
+ allowAllOutbound: true,
156
+ });
157
+ this.securityGroup = restateSecurityGroup;
158
+ const restateFargateService = new ecs.FargateService(this, "Service", {
159
+ cluster,
160
+ taskDefinition: restateTask,
161
+ assignPublicIp: true,
162
+ circuitBreaker: {
163
+ enable: true,
164
+ rollback: true,
165
+ },
166
+ minHealthyPercent: 0, // allow scale down to zero during deployments (required for at-most-1 max setting)
167
+ maxHealthyPercent: 100, // don't start more than one copy
168
+ securityGroups: [restateSecurityGroup],
169
+ });
170
+ fs.connections.allowDefaultPortFrom(restateSecurityGroup);
171
+ fs.connections.allowDefaultPortTo(restateSecurityGroup);
172
+ fs.grantRootAccess(restateFargateService.taskDefinition.taskRole.grantPrincipal);
173
+ const alb = new elb2.ApplicationLoadBalancer(this, "Alb", {
174
+ vpc: this.vpc,
175
+ internetFacing: props.loadBalancer?.internetFacing,
176
+ });
177
+ const publicApiCertificate = new acm.Certificate(this, "Certificate", {
178
+ domainName: props.dnsName,
179
+ validation: acm.CertificateValidation.fromDns(props.hostedZone),
180
+ });
181
+ const ingressListener = alb.addListener("IngressListener", {
182
+ port: PUBLIC_INGRESS_PORT,
183
+ protocol: elb2.ApplicationProtocol.HTTPS,
184
+ certificates: [publicApiCertificate],
185
+ open: props.loadBalancer?.open,
186
+ });
187
+ ingressListener.addTargets("FargateIngressTarget", {
188
+ targets: [
189
+ restateFargateService.loadBalancerTarget({
190
+ containerName: restate.containerName,
191
+ containerPort: RESTATE_INGRESS_PORT,
192
+ }),
193
+ ],
194
+ protocol: elb2.ApplicationProtocol.HTTP,
195
+ healthCheck: {
196
+ path: "/grpc.health.v1.Health/Check",
197
+ interval: cdk.Duration.seconds(5),
198
+ healthyThresholdCount: 3,
199
+ unhealthyThresholdCount: 3,
200
+ timeout: cdk.Duration.seconds(2),
201
+ },
202
+ deregistrationDelay: cdk.Duration.seconds(5),
203
+ });
204
+ this.ingressListener = ingressListener;
205
+ const adminListener = alb.addListener("AdminListener", {
206
+ port: PUBLIC_ADMIN_PORT,
207
+ protocol: elb2.ApplicationProtocol.HTTPS,
208
+ certificates: [publicApiCertificate],
209
+ });
210
+ adminListener.addTargets("FargateAdminTarget", {
211
+ targets: [
212
+ restateFargateService.loadBalancerTarget({
213
+ containerName: restate.containerName,
214
+ containerPort: RESTATE_ADMIN_PORT,
215
+ }),
216
+ ],
217
+ protocol: elb2.ApplicationProtocol.HTTP,
218
+ healthCheck: {
219
+ path: "/health",
220
+ interval: cdk.Duration.seconds(5),
221
+ healthyThresholdCount: 3,
222
+ unhealthyThresholdCount: 3,
223
+ timeout: cdk.Duration.seconds(2),
224
+ },
225
+ deregistrationDelay: cdk.Duration.seconds(5),
226
+ });
227
+ this.adminListener = adminListener;
228
+ new r53.ARecord(this, "AlbAlias", {
229
+ zone: props.hostedZone,
230
+ recordName: props.dnsName.split(".")[0],
231
+ target: r53.RecordTarget.fromAlias(new targets.LoadBalancerTarget(alb)),
232
+ // other ARecord configuration...
233
+ });
234
+ this.ingressUrl = `https://${props.dnsName}${PUBLIC_INGRESS_PORT == 443 ? "" : `:${PUBLIC_INGRESS_PORT}`}`;
235
+ this.adminUrl = `https://${props.dnsName}:${PUBLIC_ADMIN_PORT}`;
236
+ }
237
+ }
238
+ exports.FargateRestateDeployment = FargateRestateDeployment;
239
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFyZ2F0ZS1yZXN0YXRlLWRlcGxveW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL2ZhcmdhdGUtcmVzdGF0ZS1kZXBsb3ltZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsMkNBQXVDO0FBQ3ZDLGlEQUFtQztBQUNuQyx3RUFBMEQ7QUFDMUQsMkRBQTZDO0FBQzdDLHlEQUEyQztBQUMzQyx5REFBMkM7QUFDM0MseURBQTJDO0FBQzNDLHlEQUEyQztBQUMzQyw2RUFBK0Q7QUFDL0QsNkRBQStDO0FBQy9DLHlFQUEyRDtBQUkzRCxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUNoQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUMvQixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQztBQUNsQyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQztBQUNoQyxNQUFNLHFCQUFxQixHQUFHLDhCQUE4QixDQUFDO0FBQzdELE1BQU0sMEJBQTBCLEdBQUcsUUFBUSxDQUFDO0FBQzVDLE1BQU0sdUJBQXVCLEdBQUcsUUFBUSxDQUFDO0FBb0V6Qzs7OztHQUlHO0FBQ0gsTUFBYSx3QkFBeUIsU0FBUSxzQkFBUztJQVdyRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTBCO1FBQ2xFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU3RSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLHFCQUFxQixDQUFDO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLElBQUksMEJBQTBCLENBQUM7UUFDbEUsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQyxDQUFDLCtDQUErQztRQUV6RyxNQUFNLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUMvQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixlQUFlLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxhQUFhO1lBQ2xELGVBQWUsRUFBRSxHQUFHLENBQUMsZUFBZSxDQUFDLGVBQWU7WUFDcEQsY0FBYyxFQUFFLEdBQUcsQ0FBQyxjQUFjLENBQUMsUUFBUTtZQUMzQyxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWEsSUFBSSxHQUFHLENBQUMsYUFBYSxDQUFDLE9BQU87U0FDaEUsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLG1CQUFtQixDQUNwQixJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDdEIsR0FBRyxFQUFFLGVBQWU7WUFDcEIsT0FBTyxFQUFFLENBQUMsK0JBQStCLENBQUM7WUFDMUMsMkhBQTJIO1lBQzNILFVBQVUsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BDLFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUU7b0JBQ0osMENBQTBDLEVBQUUsTUFBTTtpQkFDbkQ7YUFDRjtTQUNGLENBQUMsQ0FDSCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFFcEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDL0MsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1NBQy9CLENBQUMsQ0FBQztRQUVILE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7WUFDckUsR0FBRyxFQUFFLElBQUk7WUFDVCxjQUFjLEVBQUUsSUFBSTtZQUNwQixlQUFlLEVBQUU7Z0JBQ2YsZUFBZSxFQUFFLEdBQUcsQ0FBQyxlQUFlLENBQUMsS0FBSztnQkFDMUMscUJBQXFCLEVBQUUsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEtBQUs7YUFDdkQ7WUFDRCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLGNBQWM7b0JBQ3BCLHNCQUFzQixFQUFFO3dCQUN0QixZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVk7d0JBQzdCLG1CQUFtQixFQUFFLEVBQUU7cUJBQ3hCO2lCQUNGO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCw2RkFBNkY7UUFDN0YsZ0RBQWdEO1FBQ2hELGlIQUFpSDtRQUNqSCxJQUFJO1FBRUosSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUU7WUFDakMsVUFBVSxFQUFFO2dCQUNWLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztvQkFDdEIsR0FBRyxFQUFFLG9CQUFvQjtvQkFDekIsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7b0JBQzNCLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLGdGQUFnRjtpQkFDbkcsQ0FBQzthQUNIO1NBQ0YsQ0FBQyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7WUFDcEQsU0FBUyxFQUFFLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUM3RCxXQUFXLEVBQUUsK0RBQStEO1NBQzdFLENBQUMsQ0FBQztRQUNILFdBQVcsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBRS9CLE1BQU0sUUFBUSxHQUNaLEtBQUssQ0FBQyxRQUFRO1lBQ2QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7Z0JBQzlCLFlBQVksRUFBRSxZQUFZLEVBQUUsRUFBRTtnQkFDOUIsU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUztnQkFDdkMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQyxPQUFPO2FBQ2hFLENBQUMsQ0FBQztRQUVMLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFO1lBQ2xELGFBQWEsRUFBRSxpQkFBaUI7WUFDaEMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEdBQUcsWUFBWSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ3ZFLFlBQVksRUFBRSxDQUFDLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztZQUM5RixPQUFPLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7Z0JBQzdCLFFBQVE7Z0JBQ1IsWUFBWSxFQUFFLFNBQVM7YUFDeEIsQ0FBQztZQUNGLFdBQVcsRUFBRTtnQkFDWCxrQ0FBa0MsRUFBRSxNQUFNO2dCQUMxQyxpQ0FBaUM7YUFDbEM7WUFDRCxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDdEIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxXQUFXLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1NBQ3RDLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxjQUFjLENBQUM7WUFDckIsYUFBYSxFQUFFLFNBQVM7WUFDeEIsUUFBUSxFQUFFLEtBQUs7WUFDZixZQUFZLEVBQUUsY0FBYztTQUM3QixDQUFDLENBQUM7UUFFSCxNQUFNLG9CQUFvQixHQUFHLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFO1lBQ3hFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLGdCQUFnQixFQUFFLElBQUk7U0FDdkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsR0FBRyxvQkFBb0IsQ0FBQztRQUUxQyxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQ3BFLE9BQU87WUFDUCxjQUFjLEVBQUUsV0FBVztZQUMzQixjQUFjLEVBQUUsSUFBSTtZQUNwQixjQUFjLEVBQUU7Z0JBQ2QsTUFBTSxFQUFFLElBQUk7Z0JBQ1osUUFBUSxFQUFFLElBQUk7YUFDZjtZQUNELGlCQUFpQixFQUFFLENBQUMsRUFBRSxtRkFBbUY7WUFDekcsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLGlDQUFpQztZQUN6RCxjQUFjLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztTQUN2QyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDMUQsRUFBRSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3hELEVBQUUsQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVqRixNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQ3hELEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLGNBQWMsRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLGNBQWM7U0FDbkQsQ0FBQyxDQUFDO1FBRUgsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRTtZQUNwRSxVQUFVLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDekIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztTQUNoRSxDQUFDLENBQUM7UUFFSCxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFO1lBQ3pELElBQUksRUFBRSxtQkFBbUI7WUFDekIsUUFBUSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLO1lBQ3hDLFlBQVksRUFBRSxDQUFDLG9CQUFvQixDQUFDO1lBQ3BDLElBQUksRUFBRSxLQUFLLENBQUMsWUFBWSxFQUFFLElBQUk7U0FDL0IsQ0FBQyxDQUFDO1FBQ0gsZUFBZSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsRUFBRTtZQUNqRCxPQUFPLEVBQUU7Z0JBQ1AscUJBQXFCLENBQUMsa0JBQWtCLENBQUM7b0JBQ3ZDLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYTtvQkFDcEMsYUFBYSxFQUFFLG9CQUFvQjtpQkFDcEMsQ0FBQzthQUNIO1lBQ0QsUUFBUSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJO1lBQ3ZDLFdBQVcsRUFBRTtnQkFDWCxJQUFJLEVBQUUsOEJBQThCO2dCQUNwQyxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNqQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUN4Qix1QkFBdUIsRUFBRSxDQUFDO2dCQUMxQixPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQ2pDO1lBQ0QsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQzdDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1FBRXZDLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFO1lBQ3JELElBQUksRUFBRSxpQkFBaUI7WUFDdkIsUUFBUSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLO1lBQ3hDLFlBQVksRUFBRSxDQUFDLG9CQUFvQixDQUFDO1NBQ3JDLENBQUMsQ0FBQztRQUNILGFBQWEsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLEVBQUU7WUFDN0MsT0FBTyxFQUFFO2dCQUNQLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDO29CQUN2QyxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7b0JBQ3BDLGFBQWEsRUFBRSxrQkFBa0I7aUJBQ2xDLENBQUM7YUFDSDtZQUNELFFBQVEsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSTtZQUN2QyxXQUFXLEVBQUU7Z0JBQ1gsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDakMscUJBQXFCLEVBQUUsQ0FBQztnQkFDeEIsdUJBQXVCLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzthQUNqQztZQUNELG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUM3QyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUVuQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUNoQyxJQUFJLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDdEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QyxNQUFNLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkUsaUNBQWlDO1NBQ2xDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxLQUFLLENBQUMsT0FBTyxHQUFHLG1CQUFtQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLG1CQUFtQixFQUFFLEVBQUUsQ0FBQztRQUMzRyxJQUFJLENBQUMsUUFBUSxHQUFHLFdBQVcsS0FBSyxDQUFDLE9BQU8sSUFBSSxpQkFBaUIsRUFBRSxDQUFDO0lBQ2xFLENBQUM7Q0FDRjtBQWpORCw0REFpTkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIzIC0gUmVzdGF0ZSBTb2Z0d2FyZSwgSW5jLiwgUmVzdGF0ZSBHbWJIXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFJlc3RhdGUgU0RLIGZvciBOb2RlLmpzL1R5cGVTY3JpcHQsXG4gKiB3aGljaCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogWW91IGNhbiBmaW5kIGEgY29weSBvZiB0aGUgbGljZW5zZSBpbiBmaWxlIExJQ0VOU0UgaW4gdGhlIHJvb3RcbiAqIGRpcmVjdG9yeSBvZiB0aGlzIHJlcG9zaXRvcnkgb3IgcGFja2FnZSwgb3IgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXN0YXRlZGV2L3Nkay10eXBlc2NyaXB0L2Jsb2IvbWFpbi9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGFjbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0ICogYXMgbG9ncyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgKiBhcyBlY3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3NcIjtcbmltcG9ydCAqIGFzIGVmcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVmc1wiO1xuaW1wb3J0ICogYXMgZWxiMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIjtcbmltcG9ydCAqIGFzIHI1MyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCAqIGFzIHRhcmdldHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIjtcbmltcG9ydCB7IElSZXN0YXRlRW52aXJvbm1lbnQgfSBmcm9tIFwiLi9yZXN0YXRlLWVudmlyb25tZW50XCI7XG5pbXBvcnQgeyBUcmFjaW5nTW9kZSB9IGZyb20gXCIuL2RlcGxveW1lbnRzLWNvbW1vblwiO1xuXG5jb25zdCBQVUJMSUNfSU5HUkVTU19QT1JUID0gNDQzO1xuY29uc3QgUFVCTElDX0FETUlOX1BPUlQgPSA5MDcwO1xuY29uc3QgUkVTVEFURV9JTkdSRVNTX1BPUlQgPSA4MDgwO1xuY29uc3QgUkVTVEFURV9BRE1JTl9QT1JUID0gOTA3MDtcbmNvbnN0IFJFU1RBVEVfSU1BR0VfREVGQVVMVCA9IFwiZG9ja2VyLmlvL3Jlc3RhdGVkZXYvcmVzdGF0ZVwiO1xuY29uc3QgUkVTVEFURV9ET0NLRVJfREVGQVVMVF9UQUcgPSBcImxhdGVzdFwiO1xuY29uc3QgQURPVF9ET0NLRVJfREVGQVVMVF9UQUcgPSBcImxhdGVzdFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RhdGVGYXJnYXRlUHJvcHMge1xuICAvKiogVGhlIFZQQyBpbiB3aGljaCB0byBsYXVuY2ggdGhlIFJlc3RhdGUgaG9zdC4gKi9cbiAgdnBjPzogZWMyLklWcGM7XG5cbiAgLyoqIExvZyBncm91cCBmb3IgUmVzdGF0ZSBzZXJ2aWNlIGxvZ3MuICovXG4gIGxvZ0dyb3VwPzogbG9ncy5Mb2dHcm91cDtcblxuICAvKiogVHJhY2luZyBtb2RlIGZvciBSZXN0YXRlIHNlcnZpY2VzLiBEZWZhdWx0cyB0byB7QGxpbmsgVHJhY2luZ01vZGUuRElTQUJMRUR9LiAqL1xuICB0cmFjaW5nPzogVHJhY2luZ01vZGU7XG5cbiAgLyoqIFByZWZpeCBmb3IgcmVzb3VyY2VzIGNyZWF0ZWQgYnkgdGhpcyBjb25zdHJ1Y3QgdGhhdCByZXF1aXJlIHVuaXF1ZSBuYW1lcy4gKi9cbiAgcHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKiBFQ1MgY2x1c3RlciBuYW1lLiAqL1xuICBjbHVzdGVyTmFtZT86IHN0cmluZztcblxuICAvKiogUmVzdGF0ZSBEb2NrZXIgaW1hZ2UgbmFtZS4gRGVmYXVsdHMgdG8gYGxhdGVzdGAuICovXG4gIHJlc3RhdGVJbWFnZT86IHN0cmluZztcblxuICAvKiogUmVzdGF0ZSBEb2NrZXIgaW1hZ2UgdGFnLiBEZWZhdWx0cyB0byBgbGF0ZXN0YC4gKi9cbiAgcmVzdGF0ZVRhZz86IHN0cmluZztcblxuICAvKiogQW1hem9uIERpc3RybyBmb3IgT3BlbiBUZWxlbWV0cnkgRG9ja2VyIGltYWdlIHRhZy4gRGVmYXVsdHMgdG8gYGxhdGVzdGAuICovXG4gIGFkb3RUYWc/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IGZvciBSZXN0YXRlIGNvbnRhaW5lci4gVXNlIGl0IHRvIGNvbmZpZ3VyZSBsb2dnaW5nIGFuZCBvdGhlciBwcm9jZXNzLWxldmVsIHNldHRpbmdzLlxuICAgKi9cbiAgZW52aXJvbm1lbnQ/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSZXN0YXRlIGNvbnRhaW5lciBleHRyYSBhcmd1bWVudHMuXG4gICAqL1xuICBjb21tYW5kPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBmdWxsIG5hbWUgZm9yIHRoZSBwdWJsaWMgZW5kcG9pbnQuXG4gICAqL1xuICBkbnNOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEROUyB6b25lIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgcHVibGljIGVuZHBvaW50LlxuICAgKi9cbiAgaG9zdGVkWm9uZTogcjUzLklIb3N0ZWRab25lO1xuXG4gIC8qKlxuICAgKiBSZW1vdmFsIHBvbGljeSBmb3IgbG9uZy1saXZlZCByZXNvdXJjZXMgKHN0b3JhZ2UsIGxvZ3MpLiBEZWZhdWx0OiBgY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWWAuXG4gICAqL1xuICByZW1vdmFsUG9saWN5PzogY2RrLlJlbW92YWxQb2xpY3k7XG5cbiAgLyoqXG4gICAqIExvYWQgYmFsYW5jZXIgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGxvYWRCYWxhbmNlcj86IHtcbiAgICAvKiogQHNlZSBCYXNlTG9hZEJhbGFuY2VyUHJvcHMuaW50ZXJuZXRGYWNpbmcgKi9cbiAgICBpbnRlcm5ldEZhY2luZz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBJZiB5b3Ugc2V0IHRoaXMgdG8gZmFsc2UsIHlvdSBjYW4gY3VzdG9taXplIHRoZSBhY2Nlc3MgdG8gdGhlIHBhaXIgb2YgQUxCIGxpc3RlbmVycyB2aWFcbiAgICAgKiB7QGxpbmsgRmFyZ2F0ZVJlc3RhdGVEZXBsb3ltZW50LmluZ3Jlc3NMaXN0ZW5lcn0gYW5kIHtAbGluayBGYXJnYXRlUmVzdGF0ZURlcGxveW1lbnQuYWRtaW5MaXN0ZW5lcn0uXG4gICAgICpcbiAgICAgKiBAc2VlIEJhc2VBcHBsaWNhdGlvbkxpc3RlbmVyUHJvcHMub3BlbiAqL1xuICAgIG9wZW4/OiBib29sZWFuO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBSZXN0YXRlIHNlcnZpY2UgZGVwbG95bWVudCBydW5uaW5nIGFzIGEgRmFyZ2F0ZSB0YXNrIGFuZCBiYWNrZWQgYnkgRUZTLlxuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBjb25zdHJ1Y3QgaXMgc3RpbGwgZXhwZXJpbWVudGFsISBVc2Ugd2l0aCBjYXV0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRmFyZ2F0ZVJlc3RhdGVEZXBsb3ltZW50IGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSVJlc3RhdGVFbnZpcm9ubWVudCB7XG4gIHJlYWRvbmx5IGludm9rZXJSb2xlOiBpYW0uSVJvbGU7XG4gIHJlYWRvbmx5IHZwYzogZWMyLklWcGM7XG5cbiAgcmVhZG9ubHkgaW5ncmVzc1VybDogc3RyaW5nO1xuICByZWFkb25seSBhZG1pblVybDogc3RyaW5nO1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwOiBlYzIuU2VjdXJpdHlHcm91cDtcbiAgcmVhZG9ubHkgZGF0YVN0b3JlOiBlZnMuRmlsZVN5c3RlbTtcbiAgcmVhZG9ubHkgaW5ncmVzc0xpc3RlbmVyOiBlbGIyLkFwcGxpY2F0aW9uTGlzdGVuZXI7XG4gIHJlYWRvbmx5IGFkbWluTGlzdGVuZXI6IGVsYjIuQXBwbGljYXRpb25MaXN0ZW5lcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUmVzdGF0ZUZhcmdhdGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLnZwYyA9IHByb3BzLnZwYyA/PyBlYzIuVnBjLmZyb21Mb29rdXAodGhpcywgXCJWcGNcIiwgeyBpc0RlZmF1bHQ6IHRydWUgfSk7XG5cbiAgICBjb25zdCByZXN0YXRlSW1hZ2UgPSBwcm9wcy5yZXN0YXRlSW1hZ2UgPz8gUkVTVEFURV9JTUFHRV9ERUZBVUxUO1xuICAgIGNvbnN0IHJlc3RhdGVUYWcgPSBwcm9wcy5yZXN0YXRlVGFnID8/IFJFU1RBVEVfRE9DS0VSX0RFRkFVTFRfVEFHO1xuICAgIGNvbnN0IGFkb3RUYWcgPSBwcm9wcy5hZG90VGFnID8/IEFET1RfRE9DS0VSX0RFRkFVTFRfVEFHOyAvLyBUT0RPOiBhZGQgWC1SYXkgc3VwcG9ydCBsaWtlIHdlIGhhdmUgZm9yIEVDMlxuXG4gICAgY29uc3QgZnMgPSBuZXcgZWZzLkZpbGVTeXN0ZW0odGhpcywgXCJEYXRhU3RvcmVcIiwge1xuICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgIGxpZmVjeWNsZVBvbGljeTogZWZzLkxpZmVjeWNsZVBvbGljeS5BRlRFUl8zMF9EQVlTLFxuICAgICAgcGVyZm9ybWFuY2VNb2RlOiBlZnMuUGVyZm9ybWFuY2VNb2RlLkdFTkVSQUxfUFVSUE9TRSxcbiAgICAgIHRocm91Z2hwdXRNb2RlOiBlZnMuVGhyb3VnaHB1dE1vZGUuQlVSU1RJTkcsXG4gICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5yZW1vdmFsUG9saWN5ID8/IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgfSk7XG4gICAgZnMuYWRkVG9SZXNvdXJjZVBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgc2lkOiBcIkFsbG93RWZzTW91bnRcIixcbiAgICAgICAgYWN0aW9uczogW1wiZWxhc3RpY2ZpbGVzeXN0ZW06Q2xpZW50TW91bnRcIl0sXG4gICAgICAgIC8vIFJlc3RyaWN0aW5nIHRvIHRoZSBFQ1MgZXhlY3V0aW9uIHJvbGUgZG9lcyBub3Qgd29yazsgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIgLSBFRlMgYWNjZXNzIGlzIHNlY3VyZWQgYnkgYSBzZWN1cml0eSBncm91cFxuICAgICAgICBwcmluY2lwYWxzOiBbbmV3IGlhbS5BbnlQcmluY2lwYWwoKV0sXG4gICAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgICBCb29sOiB7XG4gICAgICAgICAgICBcImVsYXN0aWNmaWxlc3lzdGVtOkFjY2Vzc2VkVmlhTW91bnRUYXJnZXRcIjogXCJ0cnVlXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5kYXRhU3RvcmUgPSBmcztcblxuICAgIGNvbnN0IGNsdXN0ZXIgPSBuZXcgZWNzLkNsdXN0ZXIodGhpcywgXCJDbHVzdGVyXCIsIHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICBjbHVzdGVyTmFtZTogcHJvcHMuY2x1c3Rlck5hbWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN0YXRlVGFzayA9IG5ldyBlY3MuRmFyZ2F0ZVRhc2tEZWZpbml0aW9uKHRoaXMsIFwiUmVzdGF0ZVRhc2tcIiwge1xuICAgICAgY3B1OiA0MDk2LFxuICAgICAgbWVtb3J5TGltaXRNaUI6IDgxOTIsXG4gICAgICBydW50aW1lUGxhdGZvcm06IHtcbiAgICAgICAgY3B1QXJjaGl0ZWN0dXJlOiBlY3MuQ3B1QXJjaGl0ZWN0dXJlLkFSTTY0LFxuICAgICAgICBvcGVyYXRpbmdTeXN0ZW1GYW1pbHk6IGVjcy5PcGVyYXRpbmdTeXN0ZW1GYW1pbHkuTElOVVgsXG4gICAgICB9LFxuICAgICAgdm9sdW1lczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJyZXN0YXRlU3RvcmVcIixcbiAgICAgICAgICBlZnNWb2x1bWVDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICBmaWxlU3lzdGVtSWQ6IGZzLmZpbGVTeXN0ZW1JZCxcbiAgICAgICAgICAgIGF1dGhvcml6YXRpb25Db25maWc6IHt9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgLy8gVE9ETzogU3RhcnQgYW4gQURPVCBjb250YWluZXIgYW5kIGhvb2sgaXQgdXAgdG8gUmVzdGF0ZSBhbmQgQVdTIFgtUmF5IG9yIGFub3RoZXIgT1RlbCBzaW5rXG4gICAgLy8gaWYgKHByb3BzLnRyYWNpbmcgPT09IFRyYWNpbmdNb2RlLkFXU19YUkFZKSB7XG4gICAgLy8gICByZXN0YXRlVGFzay50YXNrUm9sZS5hZGRNYW5hZ2VkUG9saWN5KGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcIkFXU1hyYXlXcml0ZU9ubHlBY2Nlc3NcIikpO1xuICAgIC8vIH1cblxuICAgIG5ldyBpYW0uUG9saWN5KHRoaXMsIFwiVGFza1BvbGljeVwiLCB7XG4gICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBzaWQ6IFwiQWxsb3dBc3N1bWVBbnlSb2xlXCIsXG4gICAgICAgICAgYWN0aW9uczogW1wic3RzOkFzc3VtZVJvbGVcIl0sXG4gICAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLCAvLyB3ZSBkb24ndCBrbm93IHVwZnJvbnQgd2hhdCBpbnZva2VyIHJvbGVzIHdlIG1heSBiZSBhc2tlZCB0byBhc3N1bWUgYXQgcnVudGltZVxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSkuYXR0YWNoVG9Sb2xlKHJlc3RhdGVUYXNrLnRhc2tSb2xlKTtcblxuICAgIGNvbnN0IGludm9rZXJSb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsIFwiSW52b2tlclJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLkFyblByaW5jaXBhbChyZXN0YXRlVGFzay50YXNrUm9sZS5yb2xlQXJuKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkFzc3VtZWQgYnkgUmVzdGF0ZSBkZXBsb3ltZW50IHRvIGludm9rZSBMYW1iZGEtYmFzZWQgc2VydmljZXNcIixcbiAgICB9KTtcbiAgICBpbnZva2VyUm9sZS5ncmFudEFzc3VtZVJvbGUocmVzdGF0ZVRhc2sudGFza1JvbGUpO1xuICAgIHRoaXMuaW52b2tlclJvbGUgPSBpbnZva2VyUm9sZTtcblxuICAgIGNvbnN0IGxvZ0dyb3VwID1cbiAgICAgIHByb3BzLmxvZ0dyb3VwID8/XG4gICAgICBuZXcgbG9ncy5Mb2dHcm91cCh0aGlzLCBcIkxvZ3NcIiwge1xuICAgICAgICBsb2dHcm91cE5hbWU6IGAvcmVzdGF0ZS8ke2lkfWAsXG4gICAgICAgIHJldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHMucmVtb3ZhbFBvbGljeSA/PyBjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgfSk7XG5cbiAgICBjb25zdCByZXN0YXRlID0gcmVzdGF0ZVRhc2suYWRkQ29udGFpbmVyKFwiUmVzdGF0ZVwiLCB7XG4gICAgICBjb250YWluZXJOYW1lOiBcInJlc3RhdGUtcnVudGltZVwiLFxuICAgICAgaW1hZ2U6IGVjcy5Db250YWluZXJJbWFnZS5mcm9tUmVnaXN0cnkoYCR7cmVzdGF0ZUltYWdlfToke3Jlc3RhdGVUYWd9YCksXG4gICAgICBwb3J0TWFwcGluZ3M6IFt7IGNvbnRhaW5lclBvcnQ6IFJFU1RBVEVfSU5HUkVTU19QT1JUIH0sIHsgY29udGFpbmVyUG9ydDogUkVTVEFURV9BRE1JTl9QT1JUIH1dLFxuICAgICAgbG9nZ2luZzogZWNzLkxvZ0RyaXZlci5hd3NMb2dzKHtcbiAgICAgICAgbG9nR3JvdXAsXG4gICAgICAgIHN0cmVhbVByZWZpeDogXCJyZXN0YXRlXCIsXG4gICAgICB9KSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFJFU1RBVEVfT0JTRVJWQUJJTElUWV9fTE9HX19GT1JNQVQ6IFwiSnNvblwiLFxuICAgICAgICAvLyBSVVNUX0xPRzogXCJ3YXJuLHJlc3RhdGU9aW5mb1wiLFxuICAgICAgfSxcbiAgICAgIGNvbW1hbmQ6IHByb3BzLmNvbW1hbmQsXG4gICAgICBzdGFydFRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDIwKSxcbiAgICAgIHN0b3BUaW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygyMCksXG4gICAgfSk7XG4gICAgcmVzdGF0ZS5hZGRNb3VudFBvaW50cyh7XG4gICAgICBjb250YWluZXJQYXRoOiBcIi90YXJnZXRcIixcbiAgICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICAgIHNvdXJjZVZvbHVtZTogXCJyZXN0YXRlU3RvcmVcIixcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3RhdGVTZWN1cml0eUdyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKHRoaXMsIFwiU2VjdXJpdHlHcm91cFwiLCB7XG4gICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgYWxsb3dBbGxPdXRib3VuZDogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLnNlY3VyaXR5R3JvdXAgPSByZXN0YXRlU2VjdXJpdHlHcm91cDtcblxuICAgIGNvbnN0IHJlc3RhdGVGYXJnYXRlU2VydmljZSA9IG5ldyBlY3MuRmFyZ2F0ZVNlcnZpY2UodGhpcywgXCJTZXJ2aWNlXCIsIHtcbiAgICAgIGNsdXN0ZXIsXG4gICAgICB0YXNrRGVmaW5pdGlvbjogcmVzdGF0ZVRhc2ssXG4gICAgICBhc3NpZ25QdWJsaWNJcDogdHJ1ZSxcbiAgICAgIGNpcmN1aXRCcmVha2VyOiB7XG4gICAgICAgIGVuYWJsZTogdHJ1ZSxcbiAgICAgICAgcm9sbGJhY2s6IHRydWUsXG4gICAgICB9LFxuICAgICAgbWluSGVhbHRoeVBlcmNlbnQ6IDAsIC8vIGFsbG93IHNjYWxlIGRvd24gdG8gemVybyBkdXJpbmcgZGVwbG95bWVudHMgKHJlcXVpcmVkIGZvciBhdC1tb3N0LTEgbWF4IHNldHRpbmcpXG4gICAgICBtYXhIZWFsdGh5UGVyY2VudDogMTAwLCAvLyBkb24ndCBzdGFydCBtb3JlIHRoYW4gb25lIGNvcHlcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBbcmVzdGF0ZVNlY3VyaXR5R3JvdXBdLFxuICAgIH0pO1xuXG4gICAgZnMuY29ubmVjdGlvbnMuYWxsb3dEZWZhdWx0UG9ydEZyb20ocmVzdGF0ZVNlY3VyaXR5R3JvdXApO1xuICAgIGZzLmNvbm5lY3Rpb25zLmFsbG93RGVmYXVsdFBvcnRUbyhyZXN0YXRlU2VjdXJpdHlHcm91cCk7XG4gICAgZnMuZ3JhbnRSb290QWNjZXNzKHJlc3RhdGVGYXJnYXRlU2VydmljZS50YXNrRGVmaW5pdGlvbi50YXNrUm9sZS5ncmFudFByaW5jaXBhbCk7XG5cbiAgICBjb25zdCBhbGIgPSBuZXcgZWxiMi5BcHBsaWNhdGlvbkxvYWRCYWxhbmNlcih0aGlzLCBcIkFsYlwiLCB7XG4gICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgaW50ZXJuZXRGYWNpbmc6IHByb3BzLmxvYWRCYWxhbmNlcj8uaW50ZXJuZXRGYWNpbmcsXG4gICAgfSk7XG5cbiAgICBjb25zdCBwdWJsaWNBcGlDZXJ0aWZpY2F0ZSA9IG5ldyBhY20uQ2VydGlmaWNhdGUodGhpcywgXCJDZXJ0aWZpY2F0ZVwiLCB7XG4gICAgICBkb21haW5OYW1lOiBwcm9wcy5kbnNOYW1lLFxuICAgICAgdmFsaWRhdGlvbjogYWNtLkNlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zKHByb3BzLmhvc3RlZFpvbmUpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaW5ncmVzc0xpc3RlbmVyID0gYWxiLmFkZExpc3RlbmVyKFwiSW5ncmVzc0xpc3RlbmVyXCIsIHtcbiAgICAgIHBvcnQ6IFBVQkxJQ19JTkdSRVNTX1BPUlQsXG4gICAgICBwcm90b2NvbDogZWxiMi5BcHBsaWNhdGlvblByb3RvY29sLkhUVFBTLFxuICAgICAgY2VydGlmaWNhdGVzOiBbcHVibGljQXBpQ2VydGlmaWNhdGVdLFxuICAgICAgb3BlbjogcHJvcHMubG9hZEJhbGFuY2VyPy5vcGVuLFxuICAgIH0pO1xuICAgIGluZ3Jlc3NMaXN0ZW5lci5hZGRUYXJnZXRzKFwiRmFyZ2F0ZUluZ3Jlc3NUYXJnZXRcIiwge1xuICAgICAgdGFyZ2V0czogW1xuICAgICAgICByZXN0YXRlRmFyZ2F0ZVNlcnZpY2UubG9hZEJhbGFuY2VyVGFyZ2V0KHtcbiAgICAgICAgICBjb250YWluZXJOYW1lOiByZXN0YXRlLmNvbnRhaW5lck5hbWUsXG4gICAgICAgICAgY29udGFpbmVyUG9ydDogUkVTVEFURV9JTkdSRVNTX1BPUlQsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICAgIHByb3RvY29sOiBlbGIyLkFwcGxpY2F0aW9uUHJvdG9jb2wuSFRUUCxcbiAgICAgIGhlYWx0aENoZWNrOiB7XG4gICAgICAgIHBhdGg6IFwiL2dycGMuaGVhbHRoLnYxLkhlYWx0aC9DaGVja1wiLFxuICAgICAgICBpbnRlcnZhbDogY2RrLkR1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICAgIGhlYWx0aHlUaHJlc2hvbGRDb3VudDogMyxcbiAgICAgICAgdW5oZWFsdGh5VGhyZXNob2xkQ291bnQ6IDMsXG4gICAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDIpLFxuICAgICAgfSxcbiAgICAgIGRlcmVnaXN0cmF0aW9uRGVsYXk6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgIH0pO1xuICAgIHRoaXMuaW5ncmVzc0xpc3RlbmVyID0gaW5ncmVzc0xpc3RlbmVyO1xuXG4gICAgY29uc3QgYWRtaW5MaXN0ZW5lciA9IGFsYi5hZGRMaXN0ZW5lcihcIkFkbWluTGlzdGVuZXJcIiwge1xuICAgICAgcG9ydDogUFVCTElDX0FETUlOX1BPUlQsXG4gICAgICBwcm90b2NvbDogZWxiMi5BcHBsaWNhdGlvblByb3RvY29sLkhUVFBTLFxuICAgICAgY2VydGlmaWNhdGVzOiBbcHVibGljQXBpQ2VydGlmaWNhdGVdLFxuICAgIH0pO1xuICAgIGFkbWluTGlzdGVuZXIuYWRkVGFyZ2V0cyhcIkZhcmdhdGVBZG1pblRhcmdldFwiLCB7XG4gICAgICB0YXJnZXRzOiBbXG4gICAgICAgIHJlc3RhdGVGYXJnYXRlU2VydmljZS5sb2FkQmFsYW5jZXJUYXJnZXQoe1xuICAgICAgICAgIGNvbnRhaW5lck5hbWU6IHJlc3RhdGUuY29udGFpbmVyTmFtZSxcbiAgICAgICAgICBjb250YWluZXJQb3J0OiBSRVNUQVRFX0FETUlOX1BPUlQsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICAgIHByb3RvY29sOiBlbGIyLkFwcGxpY2F0aW9uUHJvdG9jb2wuSFRUUCxcbiAgICAgIGhlYWx0aENoZWNrOiB7XG4gICAgICAgIHBhdGg6IFwiL2hlYWx0aFwiLFxuICAgICAgICBpbnRlcnZhbDogY2RrLkR1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICAgIGhlYWx0aHlUaHJlc2hvbGRDb3VudDogMyxcbiAgICAgICAgdW5oZWFsdGh5VGhyZXNob2xkQ291bnQ6IDMsXG4gICAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDIpLFxuICAgICAgfSxcbiAgICAgIGRlcmVnaXN0cmF0aW9uRGVsYXk6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgIH0pO1xuICAgIHRoaXMuYWRtaW5MaXN0ZW5lciA9IGFkbWluTGlzdGVuZXI7XG5cbiAgICBuZXcgcjUzLkFSZWNvcmQodGhpcywgXCJBbGJBbGlhc1wiLCB7XG4gICAgICB6b25lOiBwcm9wcy5ob3N0ZWRab25lLFxuICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG5zTmFtZS5zcGxpdChcIi5cIilbMF0sXG4gICAgICB0YXJnZXQ6IHI1My5SZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyB0YXJnZXRzLkxvYWRCYWxhbmNlclRhcmdldChhbGIpKSxcbiAgICAgIC8vIG90aGVyIEFSZWNvcmQgY29uZmlndXJhdGlvbi4uLlxuICAgIH0pO1xuXG4gICAgdGhpcy5pbmdyZXNzVXJsID0gYGh0dHBzOi8vJHtwcm9wcy5kbnNOYW1lfSR7UFVCTElDX0lOR1JFU1NfUE9SVCA9PSA0NDMgPyBcIlwiIDogYDoke1BVQkxJQ19JTkdSRVNTX1BPUlR9YH1gO1xuICAgIHRoaXMuYWRtaW5VcmwgPSBgaHR0cHM6Ly8ke3Byb3BzLmRuc05hbWV9OiR7UFVCTElDX0FETUlOX1BPUlR9YDtcbiAgfVxufVxuIl19
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- export * from "./lambda-service-registry";
2
- export * from "./registration-provider";
3
- export * from "./restate-cloud-environment";
1
+ export * from "./service-deployer";
4
2
  export * from "./restate-environment";
3
+ export * from "./deployments-common";
5
4
  export * from "./single-node-restate-deployment";
5
+ export * from "./fargate-restate-deployment";
package/dist/index.js CHANGED
@@ -24,9 +24,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
24
24
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
25
25
  };
26
26
  Object.defineProperty(exports, "__esModule", { value: true });
27
- __exportStar(require("./lambda-service-registry"), exports);
28
- __exportStar(require("./registration-provider"), exports);
29
- __exportStar(require("./restate-cloud-environment"), exports);
27
+ __exportStar(require("./service-deployer"), exports);
30
28
  __exportStar(require("./restate-environment"), exports);
29
+ __exportStar(require("./deployments-common"), exports);
31
30
  __exportStar(require("./single-node-restate-deployment"), exports);
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCw0REFBMEM7QUFDMUMsMERBQXdDO0FBQ3hDLDhEQUE0QztBQUM1Qyx3REFBc0M7QUFDdEMsbUVBQWlEIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMyAtIFJlc3RhdGUgU29mdHdhcmUsIEluYy4sIFJlc3RhdGUgR21iSFxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBSZXN0YXRlIFNESyBmb3IgTm9kZS5qcy9UeXBlU2NyaXB0LFxuICogd2hpY2ggaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqIFlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaW4gZmlsZSBMSUNFTlNFIGluIHRoZSByb290XG4gKiBkaXJlY3Rvcnkgb2YgdGhpcyByZXBvc2l0b3J5IG9yIHBhY2thZ2UsIG9yIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcmVzdGF0ZWRldi9zZGstdHlwZXNjcmlwdC9ibG9iL21haW4vTElDRU5TRVxuICovXG5cbmV4cG9ydCAqIGZyb20gXCIuL2xhbWJkYS1zZXJ2aWNlLXJlZ2lzdHJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZWdpc3RyYXRpb24tcHJvdmlkZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jlc3RhdGUtY2xvdWQtZW52aXJvbm1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jlc3RhdGUtZW52aXJvbm1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NpbmdsZS1ub2RlLXJlc3RhdGUtZGVwbG95bWVudFwiOyJdfQ==
31
+ __exportStar(require("./fargate-restate-deployment"), exports);
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCxxREFBbUM7QUFDbkMsd0RBQXNDO0FBQ3RDLHVEQUFxQztBQUNyQyxtRUFBaUQ7QUFDakQsK0RBQTZDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMyAtIFJlc3RhdGUgU29mdHdhcmUsIEluYy4sIFJlc3RhdGUgR21iSFxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBSZXN0YXRlIFNESyBmb3IgTm9kZS5qcy9UeXBlU2NyaXB0LFxuICogd2hpY2ggaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqIFlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaW4gZmlsZSBMSUNFTlNFIGluIHRoZSByb290XG4gKiBkaXJlY3Rvcnkgb2YgdGhpcyByZXBvc2l0b3J5IG9yIHBhY2thZ2UsIG9yIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcmVzdGF0ZWRldi9zZGstdHlwZXNjcmlwdC9ibG9iL21haW4vTElDRU5TRVxuICovXG5cbmV4cG9ydCAqIGZyb20gXCIuL3NlcnZpY2UtZGVwbG95ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jlc3RhdGUtZW52aXJvbm1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlcGxveW1lbnRzLWNvbW1vblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2luZ2xlLW5vZGUtcmVzdGF0ZS1kZXBsb3ltZW50XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9mYXJnYXRlLXJlc3RhdGUtZGVwbG95bWVudFwiO1xuIl19
@@ -8,9 +8,12 @@ export interface RegistrationProperties {
8
8
  invokeRoleArn?: string;
9
9
  removalPolicy?: cdk.RemovalPolicy;
10
10
  authTokenSecretArn?: string;
11
+ configurationVersion?: string;
12
+ private?: "true" | "false";
13
+ insecure?: "true" | "false";
11
14
  }
12
15
  /**
13
16
  * Custom Resource event handler for Restate service registration. This handler backs the custom resources created by
14
- * {@link LambdaServiceRegistry} to facilitate Lambda service handler discovery.
17
+ * {@link ServiceDeployer} to facilitate Lambda service handler discovery.
15
18
  */
16
19
  export declare const handler: Handler<CloudFormationCustomResourceEvent, void>;