terraconstructs 0.0.8 → 0.0.10
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/.jsii +1392 -146
- package/.mise.toml +4 -1
- package/.nvmrc +1 -1
- package/README.md +15 -3
- package/go.mod +63 -77
- package/go.sum +130 -962
- package/lib/aws/arn.js +1 -1
- package/lib/aws/aws-construct.js +1 -1
- package/lib/aws/aws-stack.js +1 -1
- package/lib/aws/cloudwatch/actions/ec2.js +1 -1
- package/lib/aws/cloudwatch/actions/lambda.js +1 -1
- package/lib/aws/cloudwatch/alarm-base.js +1 -1
- package/lib/aws/cloudwatch/alarm-rule.js +1 -1
- package/lib/aws/cloudwatch/alarm-status-widget.js +1 -1
- package/lib/aws/cloudwatch/alarm.js +1 -1
- package/lib/aws/cloudwatch/composite-alarm.js +1 -1
- package/lib/aws/cloudwatch/dashboard.js +1 -1
- package/lib/aws/cloudwatch/data-protection-policy.js +3 -3
- package/lib/aws/cloudwatch/graph.js +8 -8
- package/lib/aws/cloudwatch/layout.js +3 -3
- package/lib/aws/cloudwatch/log-destinations/kinesis.js +1 -1
- package/lib/aws/cloudwatch/log-destinations/lambda.js +1 -1
- package/lib/aws/cloudwatch/log-group.js +1 -1
- package/lib/aws/cloudwatch/log-query.js +1 -1
- package/lib/aws/cloudwatch/log-stream.js +1 -1
- package/lib/aws/cloudwatch/metric-filter.js +1 -1
- package/lib/aws/cloudwatch/metric.js +2 -2
- package/lib/aws/cloudwatch/pattern.js +3 -3
- package/lib/aws/cloudwatch/policy.js +1 -1
- package/lib/aws/cloudwatch/query-definition.js +2 -2
- package/lib/aws/cloudwatch/stats.js +1 -1
- package/lib/aws/cloudwatch/subscription-filter.js +1 -1
- package/lib/aws/cloudwatch/text.js +1 -1
- package/lib/aws/cloudwatch/variable.js +3 -3
- package/lib/aws/cloudwatch/widget.js +1 -1
- package/lib/aws/compute/activity.js +1 -1
- package/lib/aws/compute/architecture.js +1 -1
- package/lib/aws/compute/chain.js +1 -1
- package/lib/aws/compute/condition.js +1 -1
- package/lib/aws/compute/event-invoke-config.js +1 -1
- package/lib/aws/compute/event-source-filter.js +2 -2
- package/lib/aws/compute/event-source-mapping.js +1 -1
- package/lib/aws/compute/event-sources/s3-onfailure-destination.js +1 -1
- package/lib/aws/compute/event-sources/s3.js +1 -1
- package/lib/aws/compute/event-sources/sqs-dlq.js +1 -1
- package/lib/aws/compute/event-sources/sqs.js +1 -1
- package/lib/aws/compute/fields.js +4 -4
- package/lib/aws/compute/function-alias.js +1 -1
- package/lib/aws/compute/function-base.js +2 -2
- package/lib/aws/compute/function-destinations/event-bridge.js +1 -1
- package/lib/aws/compute/function-destinations/function.js +1 -1
- package/lib/aws/compute/function-destinations/sqs.js +1 -1
- package/lib/aws/compute/function-nodejs.js +1 -1
- package/lib/aws/compute/function-url.js +1 -1
- package/lib/aws/compute/function.js +1 -1
- package/lib/aws/compute/state-graph.js +1 -1
- package/lib/aws/compute/state-machine-fragment.js +1 -1
- package/lib/aws/compute/state-machine.js +4 -4
- package/lib/aws/compute/states/choice.js +1 -1
- package/lib/aws/compute/states/custom-state.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-batcher.js +1 -1
- package/lib/aws/compute/states/distributed-map/item-reader.js +5 -5
- package/lib/aws/compute/states/distributed-map/result-writer.js +1 -1
- package/lib/aws/compute/states/distributed-map.js +1 -1
- package/lib/aws/compute/states/fail.js +1 -1
- package/lib/aws/compute/states/map-base.js +1 -1
- package/lib/aws/compute/states/map.js +1 -1
- package/lib/aws/compute/states/parallel.js +1 -1
- package/lib/aws/compute/states/pass.js +2 -2
- package/lib/aws/compute/states/state.js +1 -1
- package/lib/aws/compute/states/succeed.js +1 -1
- package/lib/aws/compute/states/task-base.js +2 -2
- package/lib/aws/compute/states/task.js +1 -1
- package/lib/aws/compute/states/wait.js +2 -2
- package/lib/aws/compute/task-credentials.js +1 -1
- package/lib/aws/compute/task-input.js +1 -1
- package/lib/aws/compute/tasks/aws-sdk/call-aws-service.js +1 -1
- package/lib/aws/compute/tasks/eventbridge/put-events.js +1 -1
- package/lib/aws/compute/tasks/http/invoke.js +1 -1
- package/lib/aws/compute/tasks/lambda/invoke.js +1 -1
- package/lib/aws/compute/tasks/sqs/send-message.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/invoke-activity.js +1 -1
- package/lib/aws/compute/tasks/stepfunctions/start-execution.js +1 -1
- package/lib/aws/compute/types.js +1 -1
- package/lib/aws/edge/certificate.js +1 -1
- package/lib/aws/edge/distribution.d.ts +5 -19
- package/lib/aws/edge/distribution.js +16 -26
- package/lib/aws/edge/dns-alias-record-targets.js +2 -2
- package/lib/aws/edge/dns-record.js +13 -13
- package/lib/aws/edge/dns-zone.js +1 -1
- package/lib/aws/edge/function.js +2 -2
- package/lib/aws/edge/index.d.ts +1 -0
- package/lib/aws/edge/index.js +2 -1
- package/lib/aws/edge/key-value-store.js +4 -4
- package/lib/aws/edge/origin.js +3 -3
- package/lib/aws/edge/response-headers-policy.d.ts +374 -0
- package/lib/aws/edge/response-headers-policy.js +220 -0
- package/lib/aws/encryption/alias.js +1 -1
- package/lib/aws/encryption/key.js +1 -1
- package/lib/aws/encryption/via-service-principal.js +1 -1
- package/lib/aws/iam/grant.js +2 -2
- package/lib/aws/iam/managed-policy.js +1 -1
- package/lib/aws/iam/oidc-provider.js +1 -1
- package/lib/aws/iam/policy-document.js +1 -1
- package/lib/aws/iam/policy-statement.js +1 -1
- package/lib/aws/iam/policy.js +1 -1
- package/lib/aws/iam/principals.js +20 -20
- package/lib/aws/iam/role.js +1 -1
- package/lib/aws/iam/saml-provider.js +2 -2
- package/lib/aws/iam/unknown-principal.js +1 -1
- package/lib/aws/network/simple-ipv4-vpc.js +1 -1
- package/lib/aws/network/subnet-group.js +3 -3
- package/lib/aws/network/subnet.js +4 -4
- package/lib/aws/notify/archive.js +1 -1
- package/lib/aws/notify/connection.js +3 -3
- package/lib/aws/notify/event-bus.js +3 -3
- package/lib/aws/notify/event-pattern.js +1 -1
- package/lib/aws/notify/input.js +2 -2
- package/lib/aws/notify/kinesis-stream.js +1 -1
- package/lib/aws/notify/queue-policy.js +1 -1
- package/lib/aws/notify/queue.js +1 -1
- package/lib/aws/notify/resource-policy.js +1 -1
- package/lib/aws/notify/rule.js +1 -1
- package/lib/aws/notify/schedule.js +1 -1
- package/lib/aws/notify/targets/event-bus.js +1 -1
- package/lib/aws/notify/targets/function.js +1 -1
- package/lib/aws/notify/targets/log-group.js +2 -2
- package/lib/aws/notify/targets/sqs.js +1 -1
- package/lib/aws/notify/targets/state-machine.js +1 -1
- package/lib/aws/storage/bucket-notifications.js +1 -1
- package/lib/aws/storage/bucket-policy.js +1 -1
- package/lib/aws/storage/bucket-source.js +1 -1
- package/lib/aws/storage/bucket.js +1 -1
- package/lib/aws/storage/notification-targets/function.js +1 -1
- package/lib/aws/storage/notification-targets/queue.js +1 -1
- package/lib/aws/storage/origin-access-identity.js +1 -1
- package/lib/construct-base.js +2 -2
- package/lib/duration.js +1 -1
- package/lib/size.js +1 -1
- package/lib/stack-base.js +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import { cloudfrontResponseHeadersPolicy } from "@cdktf/provider-aws";
|
|
2
|
+
import { Construct } from "constructs";
|
|
3
|
+
import { Duration } from "../../duration";
|
|
4
|
+
import { AwsConstructBase, AwsConstructProps } from "../aws-construct";
|
|
5
|
+
/**
|
|
6
|
+
* Represents a response headers policy.
|
|
7
|
+
*/
|
|
8
|
+
export interface IResponseHeadersPolicy {
|
|
9
|
+
/**
|
|
10
|
+
* The ID of the response headers policy
|
|
11
|
+
* @attribute
|
|
12
|
+
**/
|
|
13
|
+
readonly responseHeadersPolicyId: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Properties for creating a Response Headers Policy
|
|
17
|
+
*/
|
|
18
|
+
export interface ResponseHeadersPolicyProps extends AwsConstructProps {
|
|
19
|
+
/**
|
|
20
|
+
* A unique name to identify the response headers policy.
|
|
21
|
+
*
|
|
22
|
+
* @default - generated from the `id`
|
|
23
|
+
*/
|
|
24
|
+
readonly responseHeadersPolicyName?: string;
|
|
25
|
+
/**
|
|
26
|
+
* A comment to describe the response headers policy.
|
|
27
|
+
*
|
|
28
|
+
* @default - no comment
|
|
29
|
+
*/
|
|
30
|
+
readonly comment?: string;
|
|
31
|
+
/**
|
|
32
|
+
* A configuration for a set of HTTP response headers that are used for cross-origin resource sharing (CORS).
|
|
33
|
+
*
|
|
34
|
+
* @default - no cors behavior
|
|
35
|
+
*/
|
|
36
|
+
readonly corsBehavior?: ResponseHeadersCorsBehavior;
|
|
37
|
+
/**
|
|
38
|
+
* A configuration for a set of custom HTTP response headers.
|
|
39
|
+
*
|
|
40
|
+
* @default - no custom headers behavior
|
|
41
|
+
*/
|
|
42
|
+
readonly customHeadersBehavior?: ResponseCustomHeadersBehavior;
|
|
43
|
+
/**
|
|
44
|
+
* A configuration for a set of security-related HTTP response headers.
|
|
45
|
+
*
|
|
46
|
+
* @default - no security headers behavior
|
|
47
|
+
*/
|
|
48
|
+
readonly securityHeadersBehavior?: ResponseSecurityHeadersBehavior;
|
|
49
|
+
/**
|
|
50
|
+
* A list of HTTP response headers that CloudFront removes from HTTP responses
|
|
51
|
+
* that it sends to viewers.
|
|
52
|
+
*
|
|
53
|
+
* @default - no headers are removed
|
|
54
|
+
*/
|
|
55
|
+
readonly removeHeaders?: string[];
|
|
56
|
+
/**
|
|
57
|
+
* The percentage of responses that you want CloudFront to add the Server-Timing
|
|
58
|
+
* header to.
|
|
59
|
+
*
|
|
60
|
+
* @default - no Server-Timing header is added to HTTP responses
|
|
61
|
+
*/
|
|
62
|
+
readonly serverTimingSamplingRate?: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A Response Headers Policy configuration
|
|
66
|
+
*
|
|
67
|
+
* @link https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-response-headers-policies.html
|
|
68
|
+
* @link https://registry.terraform.io/providers/hashicorp/aws/5.60.0/docs/resources/cloudfront_response_headers_policy
|
|
69
|
+
*/
|
|
70
|
+
export declare class ResponseHeadersPolicy extends AwsConstructBase implements IResponseHeadersPolicy {
|
|
71
|
+
/**
|
|
72
|
+
* Import an existing Response Headers Policy from its ID.
|
|
73
|
+
*/
|
|
74
|
+
static fromResponseHeadersPolicyId(scope: Construct, id: string, responseHeadersPolicyId: string): IResponseHeadersPolicy;
|
|
75
|
+
static fromManagedPolicyName(scope: Construct, id: string, managedResponseHeadersPolicyName: ManagedResponseHeadersPolicy): IResponseHeadersPolicy;
|
|
76
|
+
readonly resource: cloudfrontResponseHeadersPolicy.CloudfrontResponseHeadersPolicy;
|
|
77
|
+
readonly responseHeadersPolicyId: string;
|
|
78
|
+
readonly outputs: Record<string, any>;
|
|
79
|
+
constructor(scope: Construct, id: string, props?: ResponseHeadersPolicyProps);
|
|
80
|
+
private _renderCorsConfig;
|
|
81
|
+
private _renderCustomHeadersConfig;
|
|
82
|
+
private _renderSecurityHeadersConfig;
|
|
83
|
+
private _renderRemoveHeadersConfig;
|
|
84
|
+
private _renderServerTimingHeadersConfig;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Configuration for a set of HTTP response headers that are used for cross-origin resource sharing (CORS).
|
|
88
|
+
* CloudFront adds these headers to HTTP responses that it sends for CORS requests that match a cache behavior
|
|
89
|
+
* associated with this response headers policy.
|
|
90
|
+
*/
|
|
91
|
+
export interface ResponseHeadersCorsBehavior {
|
|
92
|
+
/**
|
|
93
|
+
* A Boolean that CloudFront uses as the value for the Access-Control-Allow-Credentials HTTP response header.
|
|
94
|
+
*/
|
|
95
|
+
readonly accessControlAllowCredentials: boolean;
|
|
96
|
+
/**
|
|
97
|
+
* A list of HTTP header names that CloudFront includes as values for the Access-Control-Allow-Headers HTTP response header.
|
|
98
|
+
* You can specify `['*']` to allow all headers.
|
|
99
|
+
*/
|
|
100
|
+
readonly accessControlAllowHeaders: string[];
|
|
101
|
+
/**
|
|
102
|
+
* A list of HTTP methods that CloudFront includes as values for the Access-Control-Allow-Methods HTTP response header.
|
|
103
|
+
*/
|
|
104
|
+
readonly accessControlAllowMethods: string[];
|
|
105
|
+
/**
|
|
106
|
+
* A list of origins (domain names) that CloudFront can use as the value for the Access-Control-Allow-Origin HTTP response header.
|
|
107
|
+
* You can specify `['*']` to allow all origins.
|
|
108
|
+
*/
|
|
109
|
+
readonly accessControlAllowOrigins: string[];
|
|
110
|
+
/**
|
|
111
|
+
* A list of HTTP headers that CloudFront includes as values for the Access-Control-Expose-Headers HTTP response header.
|
|
112
|
+
* You can specify `['*']` to expose all headers.
|
|
113
|
+
*
|
|
114
|
+
* @default - no headers exposed
|
|
115
|
+
*/
|
|
116
|
+
readonly accessControlExposeHeaders?: string[];
|
|
117
|
+
/**
|
|
118
|
+
* A number that CloudFront uses as the value for the Access-Control-Max-Age HTTP response header.
|
|
119
|
+
*
|
|
120
|
+
* @default - no max age
|
|
121
|
+
*/
|
|
122
|
+
readonly accessControlMaxAge?: Duration;
|
|
123
|
+
/**
|
|
124
|
+
* A Boolean that determines whether CloudFront overrides HTTP response headers received from the origin with the ones specified in this response headers policy.
|
|
125
|
+
*/
|
|
126
|
+
readonly originOverride: boolean;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Configuration for a set of HTTP response headers that are sent for requests that match a cache behavior
|
|
130
|
+
* that’s associated with this response headers policy.
|
|
131
|
+
*/
|
|
132
|
+
export interface ResponseCustomHeadersBehavior {
|
|
133
|
+
/**
|
|
134
|
+
* The list of HTTP response headers and their values.
|
|
135
|
+
*/
|
|
136
|
+
readonly customHeaders: ResponseCustomHeader[];
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* An HTTP response header name and its value.
|
|
140
|
+
* CloudFront includes this header in HTTP responses that it sends for requests that match a cache behavior that’s associated with this response headers policy.
|
|
141
|
+
*/
|
|
142
|
+
export interface ResponseCustomHeader {
|
|
143
|
+
/**
|
|
144
|
+
* The HTTP response header name.
|
|
145
|
+
*/
|
|
146
|
+
readonly header: string;
|
|
147
|
+
/**
|
|
148
|
+
* A Boolean that determines whether CloudFront overrides a response header with the same name
|
|
149
|
+
* received from the origin with the header specified here.
|
|
150
|
+
*/
|
|
151
|
+
readonly override: boolean;
|
|
152
|
+
/**
|
|
153
|
+
* The value for the HTTP response header.
|
|
154
|
+
*/
|
|
155
|
+
readonly value: string;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Configuration for a set of security-related HTTP response headers.
|
|
159
|
+
* CloudFront adds these headers to HTTP responses that it sends for requests that match a cache behavior
|
|
160
|
+
* associated with this response headers policy.
|
|
161
|
+
*/
|
|
162
|
+
export interface ResponseSecurityHeadersBehavior {
|
|
163
|
+
/**
|
|
164
|
+
* The policy directives and their values that CloudFront includes as values for the Content-Security-Policy HTTP response header.
|
|
165
|
+
*
|
|
166
|
+
* @default - no content security policy
|
|
167
|
+
*/
|
|
168
|
+
readonly contentSecurityPolicy?: ResponseHeadersContentSecurityPolicy;
|
|
169
|
+
/**
|
|
170
|
+
* Determines whether CloudFront includes the X-Content-Type-Options HTTP response header with its value set to nosniff.
|
|
171
|
+
*
|
|
172
|
+
* @default - no content type options
|
|
173
|
+
*/
|
|
174
|
+
readonly contentTypeOptions?: ResponseHeadersContentTypeOptions;
|
|
175
|
+
/**
|
|
176
|
+
* Determines whether CloudFront includes the X-Frame-Options HTTP response header and the header’s value.
|
|
177
|
+
*
|
|
178
|
+
* @default - no frame options
|
|
179
|
+
*/
|
|
180
|
+
readonly frameOptions?: ResponseHeadersFrameOptions;
|
|
181
|
+
/**
|
|
182
|
+
* Determines whether CloudFront includes the Referrer-Policy HTTP response header and the header’s value.
|
|
183
|
+
*
|
|
184
|
+
* @default - no referrer policy
|
|
185
|
+
*/
|
|
186
|
+
readonly referrerPolicy?: ResponseHeadersReferrerPolicy;
|
|
187
|
+
/**
|
|
188
|
+
* Determines whether CloudFront includes the Strict-Transport-Security HTTP response header and the header’s value.
|
|
189
|
+
*
|
|
190
|
+
* @default - no strict transport security
|
|
191
|
+
*/
|
|
192
|
+
readonly strictTransportSecurity?: ResponseHeadersStrictTransportSecurity;
|
|
193
|
+
/**
|
|
194
|
+
* Determines whether CloudFront includes the X-XSS-Protection HTTP response header and the header’s value.
|
|
195
|
+
*
|
|
196
|
+
* @default - no xss protection
|
|
197
|
+
*/
|
|
198
|
+
readonly xssProtection?: ResponseHeadersXSSProtection;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* The policy directives and their values that CloudFront includes as values for the Content-Security-Policy HTTP response header.
|
|
202
|
+
*/
|
|
203
|
+
export interface ResponseHeadersContentSecurityPolicy {
|
|
204
|
+
/**
|
|
205
|
+
* The policy directives and their values that CloudFront includes as values for the Content-Security-Policy HTTP response header.
|
|
206
|
+
*/
|
|
207
|
+
readonly contentSecurityPolicy: string;
|
|
208
|
+
/**
|
|
209
|
+
* A Boolean that determines whether CloudFront overrides the Content-Security-Policy HTTP response header
|
|
210
|
+
* received from the origin with the one specified in this response headers policy.
|
|
211
|
+
*/
|
|
212
|
+
readonly override: boolean;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Determines whether CloudFront includes the X-Content-Type-Options HTTP response header with its value set to nosniff.
|
|
216
|
+
*/
|
|
217
|
+
export interface ResponseHeadersContentTypeOptions {
|
|
218
|
+
/**
|
|
219
|
+
* A Boolean that determines whether CloudFront overrides the X-Content-Type-Options HTTP response header
|
|
220
|
+
* received from the origin with the one specified in this response headers policy.
|
|
221
|
+
*/
|
|
222
|
+
readonly override: boolean;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Determines whether CloudFront includes the X-Frame-Options HTTP response header and the header’s value.
|
|
226
|
+
*/
|
|
227
|
+
export interface ResponseHeadersFrameOptions {
|
|
228
|
+
/**
|
|
229
|
+
* The value of the X-Frame-Options HTTP response header.
|
|
230
|
+
*/
|
|
231
|
+
readonly frameOption: HeadersFrameOption;
|
|
232
|
+
/**
|
|
233
|
+
* A Boolean that determines whether CloudFront overrides the X-Frame-Options HTTP response header
|
|
234
|
+
* received from the origin with the one specified in this response headers policy.
|
|
235
|
+
*/
|
|
236
|
+
readonly override: boolean;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Determines whether CloudFront includes the Referrer-Policy HTTP response header and the header’s value.
|
|
240
|
+
*/
|
|
241
|
+
export interface ResponseHeadersReferrerPolicy {
|
|
242
|
+
/**
|
|
243
|
+
* The value of the Referrer-Policy HTTP response header.
|
|
244
|
+
*/
|
|
245
|
+
readonly referrerPolicy: HeadersReferrerPolicy;
|
|
246
|
+
/**
|
|
247
|
+
* A Boolean that determines whether CloudFront overrides the Referrer-Policy HTTP response header
|
|
248
|
+
* received from the origin with the one specified in this response headers policy.
|
|
249
|
+
*/
|
|
250
|
+
readonly override: boolean;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Determines whether CloudFront includes the Strict-Transport-Security HTTP response header and the header’s value.
|
|
254
|
+
*/
|
|
255
|
+
export interface ResponseHeadersStrictTransportSecurity {
|
|
256
|
+
/**
|
|
257
|
+
* A number that CloudFront uses as the value for the max-age directive in the Strict-Transport-Security HTTP response header.
|
|
258
|
+
*/
|
|
259
|
+
readonly accessControlMaxAge: Duration;
|
|
260
|
+
/**
|
|
261
|
+
* A Boolean that determines whether CloudFront includes the includeSubDomains directive in the Strict-Transport-Security HTTP response header.
|
|
262
|
+
*
|
|
263
|
+
* @default false
|
|
264
|
+
*/
|
|
265
|
+
readonly includeSubdomains?: boolean;
|
|
266
|
+
/**
|
|
267
|
+
* A Boolean that determines whether CloudFront overrides the Strict-Transport-Security HTTP response header
|
|
268
|
+
* received from the origin with the one specified in this response headers policy.
|
|
269
|
+
*/
|
|
270
|
+
readonly override: boolean;
|
|
271
|
+
/**
|
|
272
|
+
* A Boolean that determines whether CloudFront includes the preload directive in the Strict-Transport-Security HTTP response header.
|
|
273
|
+
*
|
|
274
|
+
* @default false
|
|
275
|
+
*/
|
|
276
|
+
readonly preload?: boolean;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Determines whether CloudFront includes the X-XSS-Protection HTTP response header and the header’s value.
|
|
280
|
+
*/
|
|
281
|
+
export interface ResponseHeadersXSSProtection {
|
|
282
|
+
/**
|
|
283
|
+
* A Boolean that determines whether CloudFront includes the mode=block directive in the X-XSS-Protection header.
|
|
284
|
+
*
|
|
285
|
+
* @default false
|
|
286
|
+
*/
|
|
287
|
+
readonly modeBlock?: boolean;
|
|
288
|
+
/**
|
|
289
|
+
* A Boolean that determines whether CloudFront overrides the X-XSS-Protection HTTP response header
|
|
290
|
+
* received from the origin with the one specified in this response headers policy.
|
|
291
|
+
*/
|
|
292
|
+
readonly override: boolean;
|
|
293
|
+
/**
|
|
294
|
+
* A Boolean that determines the value of the X-XSS-Protection HTTP response header.
|
|
295
|
+
* When this setting is true, the value of the X-XSS-Protection header is 1.
|
|
296
|
+
* When this setting is false, the value of the X-XSS-Protection header is 0.
|
|
297
|
+
*/
|
|
298
|
+
readonly protection: boolean;
|
|
299
|
+
/**
|
|
300
|
+
* A reporting URI, which CloudFront uses as the value of the report directive in the X-XSS-Protection header.
|
|
301
|
+
* You cannot specify a ReportUri when ModeBlock is true.
|
|
302
|
+
*
|
|
303
|
+
* @default - no report uri
|
|
304
|
+
*/
|
|
305
|
+
readonly reportUri?: string;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Enum representing possible values of the X-Frame-Options HTTP response header.
|
|
309
|
+
*/
|
|
310
|
+
export declare enum HeadersFrameOption {
|
|
311
|
+
/**
|
|
312
|
+
* The page can only be displayed in a frame on the same origin as the page itself.
|
|
313
|
+
*/
|
|
314
|
+
DENY = "DENY",
|
|
315
|
+
/**
|
|
316
|
+
* The page can only be displayed in a frame on the specified origin.
|
|
317
|
+
*/
|
|
318
|
+
SAMEORIGIN = "SAMEORIGIN"
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Enum representing possible values of the Referrer-Policy HTTP response header.
|
|
322
|
+
*/
|
|
323
|
+
export declare enum HeadersReferrerPolicy {
|
|
324
|
+
/**
|
|
325
|
+
* The referrer policy is not set.
|
|
326
|
+
*/
|
|
327
|
+
NO_REFERRER = "no-referrer",
|
|
328
|
+
/**
|
|
329
|
+
* The referrer policy is no-referrer-when-downgrade.
|
|
330
|
+
*/
|
|
331
|
+
NO_REFERRER_WHEN_DOWNGRADE = "no-referrer-when-downgrade",
|
|
332
|
+
/**
|
|
333
|
+
* The referrer policy is origin.
|
|
334
|
+
*/
|
|
335
|
+
ORIGIN = "origin",
|
|
336
|
+
/**
|
|
337
|
+
* The referrer policy is origin-when-cross-origin.
|
|
338
|
+
*/
|
|
339
|
+
ORIGIN_WHEN_CROSS_ORIGIN = "origin-when-cross-origin",
|
|
340
|
+
/**
|
|
341
|
+
* The referrer policy is same-origin.
|
|
342
|
+
*/
|
|
343
|
+
SAME_ORIGIN = "same-origin",
|
|
344
|
+
/**
|
|
345
|
+
* The referrer policy is strict-origin.
|
|
346
|
+
*/
|
|
347
|
+
STRICT_ORIGIN = "strict-origin",
|
|
348
|
+
/**
|
|
349
|
+
* The referrer policy is strict-origin-when-cross-origin.
|
|
350
|
+
*/
|
|
351
|
+
STRICT_ORIGIN_WHEN_CROSS_ORIGIN = "strict-origin-when-cross-origin",
|
|
352
|
+
/**
|
|
353
|
+
* The referrer policy is unsafe-url.
|
|
354
|
+
*/
|
|
355
|
+
UNSAFE_URL = "unsafe-url"
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* A Response Headers Policy configuration
|
|
359
|
+
*
|
|
360
|
+
* @link https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-response-headers-policies.html
|
|
361
|
+
* @link https://registry.terraform.io/providers/hashicorp/aws/5.60.0/docs/data-sources/cloudfront_response_headers_policy#aws-managed-policies
|
|
362
|
+
*/
|
|
363
|
+
export declare enum ManagedResponseHeadersPolicy {
|
|
364
|
+
/** Use this managed policy to allow simple CORS requests from any origin. */
|
|
365
|
+
CORS_ALLOW_ALL_ORIGINS = "Managed-SimpleCORS",//60669652-455b-4ae9-85a4-c4c02393f86c
|
|
366
|
+
/** Use this managed policy to allow CORS requests from any origin, including preflight requests. */
|
|
367
|
+
CORS_ALLOW_ALL_ORIGINS_WITH_PREFLIGHT = "Managed-CORS-With-Preflight",//5cc3b908-e619-4b99-88e5-2cf7f45965bd
|
|
368
|
+
/** Use this managed policy to add a set of security headers to all responses that CloudFront sends to viewers. */
|
|
369
|
+
SECURITY_HEADERS = "Managed-SecurityHeadersPolicy",//67f7725c-6f97-4210-82d7-5512b31e9d03
|
|
370
|
+
/** Use this managed policy to allow simple CORS requests from any origin and add a set of security headers to all responses that CloudFront sends to viewers. */
|
|
371
|
+
CORS_ALLOW_ALL_ORIGINS_AND_SECURITY_HEADERS = "Managed-CORS-and-SecurityHeadersPolicy",//e61eb60c-9c35-4d20-a928-2b84e02af89c
|
|
372
|
+
/** Use this managed policy to allow CORS requests from any origin, including preflight requests, and add a set of security headers to all responses that CloudFront sends to viewers. */
|
|
373
|
+
CORS_ALLOW_ALL_ORIGINS_WITH_PREFLIGHT_AND_SECURITY_HEADERS = "Managed-CORS-with-preflight-and-SecurityHeadersPolicy"
|
|
374
|
+
}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.ManagedResponseHeadersPolicy = exports.HeadersReferrerPolicy = exports.HeadersFrameOption = exports.ResponseHeadersPolicy = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
// https://github.com/aws/aws-cdk/blob/0f077c0a6adc1e5258d073f6de232d09cbb7ae54/packages/aws-cdk-lib/aws-cloudfront/lib/response-headers-policy.ts
|
|
7
|
+
const provider_aws_1 = require("@cdktf/provider-aws");
|
|
8
|
+
const cdktf_1 = require("cdktf");
|
|
9
|
+
const aws_construct_1 = require("../aws-construct");
|
|
10
|
+
/**
|
|
11
|
+
* A Response Headers Policy configuration
|
|
12
|
+
*
|
|
13
|
+
* @link https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-response-headers-policies.html
|
|
14
|
+
* @link https://registry.terraform.io/providers/hashicorp/aws/5.60.0/docs/resources/cloudfront_response_headers_policy
|
|
15
|
+
*/
|
|
16
|
+
class ResponseHeadersPolicy extends aws_construct_1.AwsConstructBase {
|
|
17
|
+
/**
|
|
18
|
+
* Import an existing Response Headers Policy from its ID.
|
|
19
|
+
*/
|
|
20
|
+
static fromResponseHeadersPolicyId(scope, id, responseHeadersPolicyId) {
|
|
21
|
+
class Import extends aws_construct_1.AwsConstructBase {
|
|
22
|
+
constructor() {
|
|
23
|
+
super(...arguments);
|
|
24
|
+
this.outputs = {};
|
|
25
|
+
this.responseHeadersPolicyId = responseHeadersPolicyId;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return new Import(scope, id);
|
|
29
|
+
}
|
|
30
|
+
static fromManagedPolicyName(scope, id, managedResponseHeadersPolicyName) {
|
|
31
|
+
class Import extends aws_construct_1.AwsConstructBase {
|
|
32
|
+
constructor() {
|
|
33
|
+
super(scope, id);
|
|
34
|
+
this.outputs = {};
|
|
35
|
+
this.resource =
|
|
36
|
+
new provider_aws_1.dataAwsCloudfrontResponseHeadersPolicy.DataAwsCloudfrontResponseHeadersPolicy(this, "Resource", {
|
|
37
|
+
name: managedResponseHeadersPolicyName,
|
|
38
|
+
});
|
|
39
|
+
this.responseHeadersPolicyId = this.resource.id;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return new Import();
|
|
43
|
+
}
|
|
44
|
+
constructor(scope, id, props = {}) {
|
|
45
|
+
super(scope, id, props);
|
|
46
|
+
this.outputs = {};
|
|
47
|
+
const responseHeadersPolicyName = props.responseHeadersPolicyName ||
|
|
48
|
+
this.stack.uniqueResourceName(this, {
|
|
49
|
+
prefix: this.gridUUID,
|
|
50
|
+
maxLength: 128,
|
|
51
|
+
});
|
|
52
|
+
this.resource =
|
|
53
|
+
new provider_aws_1.cloudfrontResponseHeadersPolicy.CloudfrontResponseHeadersPolicy(this, "Resource", {
|
|
54
|
+
name: responseHeadersPolicyName,
|
|
55
|
+
comment: props.comment,
|
|
56
|
+
corsConfig: props.corsBehavior
|
|
57
|
+
? this._renderCorsConfig(props.corsBehavior)
|
|
58
|
+
: undefined,
|
|
59
|
+
customHeadersConfig: props.customHeadersBehavior
|
|
60
|
+
? this._renderCustomHeadersConfig(props.customHeadersBehavior)
|
|
61
|
+
: undefined,
|
|
62
|
+
securityHeadersConfig: props.securityHeadersBehavior
|
|
63
|
+
? this._renderSecurityHeadersConfig(props.securityHeadersBehavior)
|
|
64
|
+
: undefined,
|
|
65
|
+
removeHeadersConfig: props.removeHeaders
|
|
66
|
+
? this._renderRemoveHeadersConfig(props.removeHeaders)
|
|
67
|
+
: undefined,
|
|
68
|
+
serverTimingHeadersConfig: props.serverTimingSamplingRate
|
|
69
|
+
? this._renderServerTimingHeadersConfig(props.serverTimingSamplingRate)
|
|
70
|
+
: undefined,
|
|
71
|
+
});
|
|
72
|
+
this.responseHeadersPolicyId = this.resource.id;
|
|
73
|
+
}
|
|
74
|
+
_renderCorsConfig(behavior) {
|
|
75
|
+
return {
|
|
76
|
+
accessControlAllowCredentials: behavior.accessControlAllowCredentials,
|
|
77
|
+
accessControlAllowHeaders: { items: behavior.accessControlAllowHeaders },
|
|
78
|
+
accessControlAllowMethods: { items: behavior.accessControlAllowMethods },
|
|
79
|
+
accessControlAllowOrigins: { items: behavior.accessControlAllowOrigins },
|
|
80
|
+
accessControlExposeHeaders: behavior.accessControlExposeHeaders
|
|
81
|
+
? { items: behavior.accessControlExposeHeaders }
|
|
82
|
+
: undefined,
|
|
83
|
+
accessControlMaxAgeSec: behavior.accessControlMaxAge
|
|
84
|
+
? behavior.accessControlMaxAge.toSeconds()
|
|
85
|
+
: undefined,
|
|
86
|
+
originOverride: behavior.originOverride,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
_renderCustomHeadersConfig(behavior) {
|
|
90
|
+
return {
|
|
91
|
+
items: behavior.customHeaders,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
_renderSecurityHeadersConfig(behavior) {
|
|
95
|
+
return {
|
|
96
|
+
contentSecurityPolicy: behavior.contentSecurityPolicy,
|
|
97
|
+
contentTypeOptions: behavior.contentTypeOptions,
|
|
98
|
+
frameOptions: behavior.frameOptions,
|
|
99
|
+
referrerPolicy: behavior.referrerPolicy,
|
|
100
|
+
strictTransportSecurity: behavior.strictTransportSecurity
|
|
101
|
+
? {
|
|
102
|
+
...behavior.strictTransportSecurity,
|
|
103
|
+
accessControlMaxAgeSec: behavior.strictTransportSecurity.accessControlMaxAge.toSeconds(),
|
|
104
|
+
}
|
|
105
|
+
: undefined,
|
|
106
|
+
xssProtection: behavior.xssProtection,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
_renderRemoveHeadersConfig(headers) {
|
|
110
|
+
const readonlyHeaders = [
|
|
111
|
+
"content-encoding",
|
|
112
|
+
"content-length",
|
|
113
|
+
"transfer-encoding",
|
|
114
|
+
"warning",
|
|
115
|
+
"via",
|
|
116
|
+
];
|
|
117
|
+
return {
|
|
118
|
+
items: headers.map((header) => {
|
|
119
|
+
if (!cdktf_1.Token.isUnresolved(header) &&
|
|
120
|
+
readonlyHeaders.includes(header.toLowerCase())) {
|
|
121
|
+
throw new Error(`Cannot remove read-only header ${header}`);
|
|
122
|
+
}
|
|
123
|
+
return { header };
|
|
124
|
+
}),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
_renderServerTimingHeadersConfig(samplingRate) {
|
|
128
|
+
if (!cdktf_1.Token.isUnresolved(samplingRate)) {
|
|
129
|
+
if (samplingRate < 0 || samplingRate > 100) {
|
|
130
|
+
throw new Error(`Sampling rate must be between 0 and 100 (inclusive), received ${samplingRate}`);
|
|
131
|
+
}
|
|
132
|
+
if (!hasMaxDecimalPlaces(samplingRate, 4)) {
|
|
133
|
+
throw new Error(`Sampling rate can have up to four decimal places, received ${samplingRate}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
enabled: true,
|
|
138
|
+
samplingRate,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.ResponseHeadersPolicy = ResponseHeadersPolicy;
|
|
143
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
144
|
+
ResponseHeadersPolicy[_a] = { fqn: "terraconstructs.aws.edge.ResponseHeadersPolicy", version: "0.0.10" };
|
|
145
|
+
/**
|
|
146
|
+
* Enum representing possible values of the X-Frame-Options HTTP response header.
|
|
147
|
+
*/
|
|
148
|
+
var HeadersFrameOption;
|
|
149
|
+
(function (HeadersFrameOption) {
|
|
150
|
+
/**
|
|
151
|
+
* The page can only be displayed in a frame on the same origin as the page itself.
|
|
152
|
+
*/
|
|
153
|
+
HeadersFrameOption["DENY"] = "DENY";
|
|
154
|
+
/**
|
|
155
|
+
* The page can only be displayed in a frame on the specified origin.
|
|
156
|
+
*/
|
|
157
|
+
HeadersFrameOption["SAMEORIGIN"] = "SAMEORIGIN";
|
|
158
|
+
})(HeadersFrameOption || (exports.HeadersFrameOption = HeadersFrameOption = {}));
|
|
159
|
+
/**
|
|
160
|
+
* Enum representing possible values of the Referrer-Policy HTTP response header.
|
|
161
|
+
*/
|
|
162
|
+
var HeadersReferrerPolicy;
|
|
163
|
+
(function (HeadersReferrerPolicy) {
|
|
164
|
+
/**
|
|
165
|
+
* The referrer policy is not set.
|
|
166
|
+
*/
|
|
167
|
+
HeadersReferrerPolicy["NO_REFERRER"] = "no-referrer";
|
|
168
|
+
/**
|
|
169
|
+
* The referrer policy is no-referrer-when-downgrade.
|
|
170
|
+
*/
|
|
171
|
+
HeadersReferrerPolicy["NO_REFERRER_WHEN_DOWNGRADE"] = "no-referrer-when-downgrade";
|
|
172
|
+
/**
|
|
173
|
+
* The referrer policy is origin.
|
|
174
|
+
*/
|
|
175
|
+
HeadersReferrerPolicy["ORIGIN"] = "origin";
|
|
176
|
+
/**
|
|
177
|
+
* The referrer policy is origin-when-cross-origin.
|
|
178
|
+
*/
|
|
179
|
+
HeadersReferrerPolicy["ORIGIN_WHEN_CROSS_ORIGIN"] = "origin-when-cross-origin";
|
|
180
|
+
/**
|
|
181
|
+
* The referrer policy is same-origin.
|
|
182
|
+
*/
|
|
183
|
+
HeadersReferrerPolicy["SAME_ORIGIN"] = "same-origin";
|
|
184
|
+
/**
|
|
185
|
+
* The referrer policy is strict-origin.
|
|
186
|
+
*/
|
|
187
|
+
HeadersReferrerPolicy["STRICT_ORIGIN"] = "strict-origin";
|
|
188
|
+
/**
|
|
189
|
+
* The referrer policy is strict-origin-when-cross-origin.
|
|
190
|
+
*/
|
|
191
|
+
HeadersReferrerPolicy["STRICT_ORIGIN_WHEN_CROSS_ORIGIN"] = "strict-origin-when-cross-origin";
|
|
192
|
+
/**
|
|
193
|
+
* The referrer policy is unsafe-url.
|
|
194
|
+
*/
|
|
195
|
+
HeadersReferrerPolicy["UNSAFE_URL"] = "unsafe-url";
|
|
196
|
+
})(HeadersReferrerPolicy || (exports.HeadersReferrerPolicy = HeadersReferrerPolicy = {}));
|
|
197
|
+
function hasMaxDecimalPlaces(num, decimals) {
|
|
198
|
+
const parts = num.toString().split(".");
|
|
199
|
+
return parts.length === 1 || parts[1].length <= decimals;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* A Response Headers Policy configuration
|
|
203
|
+
*
|
|
204
|
+
* @link https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-response-headers-policies.html
|
|
205
|
+
* @link https://registry.terraform.io/providers/hashicorp/aws/5.60.0/docs/data-sources/cloudfront_response_headers_policy#aws-managed-policies
|
|
206
|
+
*/
|
|
207
|
+
var ManagedResponseHeadersPolicy;
|
|
208
|
+
(function (ManagedResponseHeadersPolicy) {
|
|
209
|
+
/** Use this managed policy to allow simple CORS requests from any origin. */
|
|
210
|
+
ManagedResponseHeadersPolicy["CORS_ALLOW_ALL_ORIGINS"] = "Managed-SimpleCORS";
|
|
211
|
+
/** Use this managed policy to allow CORS requests from any origin, including preflight requests. */
|
|
212
|
+
ManagedResponseHeadersPolicy["CORS_ALLOW_ALL_ORIGINS_WITH_PREFLIGHT"] = "Managed-CORS-With-Preflight";
|
|
213
|
+
/** Use this managed policy to add a set of security headers to all responses that CloudFront sends to viewers. */
|
|
214
|
+
ManagedResponseHeadersPolicy["SECURITY_HEADERS"] = "Managed-SecurityHeadersPolicy";
|
|
215
|
+
/** Use this managed policy to allow simple CORS requests from any origin and add a set of security headers to all responses that CloudFront sends to viewers. */
|
|
216
|
+
ManagedResponseHeadersPolicy["CORS_ALLOW_ALL_ORIGINS_AND_SECURITY_HEADERS"] = "Managed-CORS-and-SecurityHeadersPolicy";
|
|
217
|
+
/** Use this managed policy to allow CORS requests from any origin, including preflight requests, and add a set of security headers to all responses that CloudFront sends to viewers. */
|
|
218
|
+
ManagedResponseHeadersPolicy["CORS_ALLOW_ALL_ORIGINS_WITH_PREFLIGHT_AND_SECURITY_HEADERS"] = "Managed-CORS-with-preflight-and-SecurityHeadersPolicy";
|
|
219
|
+
})(ManagedResponseHeadersPolicy || (exports.ManagedResponseHeadersPolicy = ManagedResponseHeadersPolicy = {}));
|
|
220
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2UtaGVhZGVycy1wb2xpY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL2VkZ2UvcmVzcG9uc2UtaGVhZGVycy1wb2xpY3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrSkFBa0o7QUFDbEosc0RBRzZCO0FBQzdCLGlDQUE4QjtBQUc5QixvREFBdUU7QUFxRXZFOzs7OztHQUtHO0FBQ0gsTUFBYSxxQkFDWCxTQUFRLGdDQUFnQjtJQUd4Qjs7T0FFRztJQUNJLE1BQU0sQ0FBQywyQkFBMkIsQ0FDdkMsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLHVCQUErQjtRQUUvQixNQUFNLE1BQU8sU0FBUSxnQ0FBZ0I7WUFBckM7O2dCQUNrQixZQUFPLEdBQXdCLEVBQUUsQ0FBQztnQkFDbEMsNEJBQXVCLEdBQUcsdUJBQXVCLENBQUM7WUFDcEUsQ0FBQztTQUFBO1FBQ0QsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxxQkFBcUIsQ0FDakMsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLGdDQUE4RDtRQUU5RCxNQUFNLE1BQU8sU0FBUSxnQ0FBZ0I7WUFJbkM7Z0JBQ0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFKSCxZQUFPLEdBQXdCLEVBQUUsQ0FBQztnQkFLaEQsSUFBSSxDQUFDLFFBQVE7b0JBQ1gsSUFBSSxxREFBc0MsQ0FBQyxzQ0FBc0MsQ0FDL0UsSUFBSSxFQUNKLFVBQVUsRUFDVjt3QkFDRSxJQUFJLEVBQUUsZ0NBQWdDO3FCQUN2QyxDQUNGLENBQUM7Z0JBQ0osSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2xELENBQUM7U0FDRjtRQUNELE9BQU8sSUFBSSxNQUFNLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBTUQsWUFDRSxLQUFnQixF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RSw2RUFBNkMsQ0FBQTtJQUM3QyxvR0FBb0c7SUFDcEcscUdBQXFFLENBQUE7SUFDckUsa0hBQWtIO0lBQ2xILGtGQUFrRCxDQUFBO0lBQ2xELGlLQUFpSztJQUNqSyxzSEFBc0YsQ0FBQTtJQUN0Rix5TEFBeUw7SUFDekwsb0pBQW9ILENBQUE7QUFDdEgsQ0FBQyxFQVhXLDRCQUE0Qiw0Q0FBNUIsNEJBQTRCLFFBV3ZDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2Jsb2IvMGYwNzdjMGE2YWRjMWU1MjU4ZDA3M2Y2ZGUyMzJkMDljYmI3YWU1NC9wYWNrYWdlcy9hd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC9saWIvcmVzcG9uc2UtaGVhZGVycy1wb2xpY3kudHNcbmltcG9ydCB7XG4gIGNsb3VkZnJvbnRSZXNwb25zZUhlYWRlcnNQb2xpY3ksXG4gIGRhdGFBd3NDbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5LFxufSBmcm9tIFwiQGNka3RmL3Byb3ZpZGVyLWF3c1wiO1xuaW1wb3J0IHsgVG9rZW4gfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCIuLi8uLi9kdXJhdGlvblwiO1xuaW1wb3J0IHsgQXdzQ29uc3RydWN0QmFzZSwgQXdzQ29uc3RydWN0UHJvcHMgfSBmcm9tIFwiLi4vYXdzLWNvbnN0cnVjdFwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSByZXNwb25zZSBoZWFkZXJzIHBvbGljeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJUmVzcG9uc2VIZWFkZXJzUG9saWN5IHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcmVzcG9uc2UgaGVhZGVycyBwb2xpY3lcbiAgICogQGF0dHJpYnV0ZVxuICAgKiovXG4gIHJlYWRvbmx5IHJlc3BvbnNlSGVhZGVyc1BvbGljeUlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBSZXNwb25zZSBIZWFkZXJzIFBvbGljeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlSGVhZGVyc1BvbGljeVByb3BzIGV4dGVuZHMgQXdzQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogQSB1bmlxdWUgbmFtZSB0byBpZGVudGlmeSB0aGUgcmVzcG9uc2UgaGVhZGVycyBwb2xpY3kuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZ2VuZXJhdGVkIGZyb20gdGhlIGBpZGBcbiAgICovXG4gIHJlYWRvbmx5IHJlc3BvbnNlSGVhZGVyc1BvbGljeU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgY29tbWVudCB0byBkZXNjcmliZSB0aGUgcmVzcG9uc2UgaGVhZGVycyBwb2xpY3kuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29tbWVudFxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWVudD86IHN0cmluZztcblxuICAvKipcbiAgICogQSBjb25maWd1cmF0aW9uIGZvciBhIHNldCBvZiBIVFRQIHJlc3BvbnNlIGhlYWRlcnMgdGhhdCBhcmUgdXNlZCBmb3IgY3Jvc3Mtb3JpZ2luIHJlc291cmNlIHNoYXJpbmcgKENPUlMpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvcnMgYmVoYXZpb3JcbiAgICovXG4gIHJlYWRvbmx5IGNvcnNCZWhhdmlvcj86IFJlc3BvbnNlSGVhZGVyc0NvcnNCZWhhdmlvcjtcblxuICAvKipcbiAgICogQSBjb25maWd1cmF0aW9uIGZvciBhIHNldCBvZiBjdXN0b20gSFRUUCByZXNwb25zZSBoZWFkZXJzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGN1c3RvbSBoZWFkZXJzIGJlaGF2aW9yXG4gICAqL1xuICByZWFkb25seSBjdXN0b21IZWFkZXJzQmVoYXZpb3I/OiBSZXNwb25zZUN1c3RvbUhlYWRlcnNCZWhhdmlvcjtcblxuICAvKipcbiAgICogQSBjb25maWd1cmF0aW9uIGZvciBhIHNldCBvZiBzZWN1cml0eS1yZWxhdGVkIEhUVFAgcmVzcG9uc2UgaGVhZGVycy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBzZWN1cml0eSBoZWFkZXJzIGJlaGF2aW9yXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUhlYWRlcnNCZWhhdmlvcj86IFJlc3BvbnNlU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBIVFRQIHJlc3BvbnNlIGhlYWRlcnMgdGhhdCBDbG91ZEZyb250IHJlbW92ZXMgZnJvbSBIVFRQIHJlc3BvbnNlc1xuICAgKiB0aGF0IGl0IHNlbmRzIHRvIHZpZXdlcnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gaGVhZGVycyBhcmUgcmVtb3ZlZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZlSGVhZGVycz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcGVyY2VudGFnZSBvZiByZXNwb25zZXMgdGhhdCB5b3Ugd2FudCBDbG91ZEZyb250IHRvIGFkZCB0aGUgU2VydmVyLVRpbWluZ1xuICAgKiBoZWFkZXIgdG8uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gU2VydmVyLVRpbWluZyBoZWFkZXIgaXMgYWRkZWQgdG8gSFRUUCByZXNwb25zZXNcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZlclRpbWluZ1NhbXBsaW5nUmF0ZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBIFJlc3BvbnNlIEhlYWRlcnMgUG9saWN5IGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1yZXNwb25zZS1oZWFkZXJzLXBvbGljaWVzLmh0bWxcbiAqIEBsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuNjAuMC9kb2NzL3Jlc291cmNlcy9jbG91ZGZyb250X3Jlc3BvbnNlX2hlYWRlcnNfcG9saWN5XG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNwb25zZUhlYWRlcnNQb2xpY3lcbiAgZXh0ZW5kcyBBd3NDb25zdHJ1Y3RCYXNlXG4gIGltcGxlbWVudHMgSVJlc3BvbnNlSGVhZGVyc1BvbGljeVxue1xuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIFJlc3BvbnNlIEhlYWRlcnMgUG9saWN5IGZyb20gaXRzIElELlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tUmVzcG9uc2VIZWFkZXJzUG9saWN5SWQoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHJlc3BvbnNlSGVhZGVyc1BvbGljeUlkOiBzdHJpbmcsXG4gICk6IElSZXNwb25zZUhlYWRlcnNQb2xpY3kge1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIEF3c0NvbnN0cnVjdEJhc2UgaW1wbGVtZW50cyBJUmVzcG9uc2VIZWFkZXJzUG9saWN5IHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBvdXRwdXRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VIZWFkZXJzUG9saWN5SWQgPSByZXNwb25zZUhlYWRlcnNQb2xpY3lJZDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZnJvbU1hbmFnZWRQb2xpY3lOYW1lKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBtYW5hZ2VkUmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZTogTWFuYWdlZFJlc3BvbnNlSGVhZGVyc1BvbGljeSxcbiAgKTogSVJlc3BvbnNlSGVhZGVyc1BvbGljeSB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgQXdzQ29uc3RydWN0QmFzZSBpbXBsZW1lbnRzIElSZXNwb25zZUhlYWRlcnNQb2xpY3kge1xuICAgICAgcHVibGljIHJlYWRvbmx5IG91dHB1dHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIHB1YmxpYyByZWFkb25seSByZXNwb25zZUhlYWRlcnNQb2xpY3lJZDogc3RyaW5nO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlOiBkYXRhQXdzQ2xvdWRmcm9udFJlc3BvbnNlSGVhZGVyc1BvbGljeS5EYXRhQXdzQ2xvdWRmcm9udFJlc3BvbnNlSGVhZGVyc1BvbGljeTtcbiAgICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICAgICAgdGhpcy5yZXNvdXJjZSA9XG4gICAgICAgICAgbmV3IGRhdGFBd3NDbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5LkRhdGFBd3NDbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5KFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIFwiUmVzb3VyY2VcIixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogbWFuYWdlZFJlc3BvbnNlSGVhZGVyc1BvbGljeU5hbWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzUG9saWN5SWQgPSB0aGlzLnJlc291cmNlLmlkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEltcG9ydCgpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlOiBjbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5LkNsb3VkZnJvbnRSZXNwb25zZUhlYWRlcnNQb2xpY3k7XG4gIHB1YmxpYyByZWFkb25seSByZXNwb25zZUhlYWRlcnNQb2xpY3lJZDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgb3V0cHV0czogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogUmVzcG9uc2VIZWFkZXJzUG9saWN5UHJvcHMgPSB7fSxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgY29uc3QgcmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZSA9XG4gICAgICBwcm9wcy5yZXNwb25zZUhlYWRlcnNQb2xpY3lOYW1lIHx8XG4gICAgICB0aGlzLnN0YWNrLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7XG4gICAgICAgIHByZWZpeDogdGhpcy5ncmlkVVVJRCxcbiAgICAgICAgbWF4TGVuZ3RoOiAxMjgsXG4gICAgICB9KTtcblxuICAgIHRoaXMucmVzb3VyY2UgPVxuICAgICAgbmV3IGNsb3VkZnJvbnRSZXNwb25zZUhlYWRlcnNQb2xpY3kuQ2xvdWRmcm9udFJlc3BvbnNlSGVhZGVyc1BvbGljeShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgXCJSZXNvdXJjZVwiLFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogcmVzcG9uc2VIZWFkZXJzUG9saWN5TmFtZSxcbiAgICAgICAgICBjb21tZW50OiBwcm9wcy5jb21tZW50LFxuICAgICAgICAgIGNvcnNDb25maWc6IHByb3BzLmNvcnNCZWhhdmlvclxuICAgICAgICAgICAgPyB0aGlzLl9yZW5kZXJDb3JzQ29uZmlnKHByb3BzLmNvcnNCZWhhdmlvcilcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGN1c3RvbUhlYWRlcnNDb25maWc6IHByb3BzLmN1c3RvbUhlYWRlcnNCZWhhdmlvclxuICAgICAgICAgICAgPyB0aGlzLl9yZW5kZXJDdXN0b21IZWFkZXJzQ29uZmlnKHByb3BzLmN1c3RvbUhlYWRlcnNCZWhhdmlvcilcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHNlY3VyaXR5SGVhZGVyc0NvbmZpZzogcHJvcHMuc2VjdXJpdHlIZWFkZXJzQmVoYXZpb3JcbiAgICAgICAgICAgID8gdGhpcy5fcmVuZGVyU2VjdXJpdHlIZWFkZXJzQ29uZmlnKHByb3BzLnNlY3VyaXR5SGVhZGVyc0JlaGF2aW9yKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgcmVtb3ZlSGVhZGVyc0NvbmZpZzogcHJvcHMucmVtb3ZlSGVhZGVyc1xuICAgICAgICAgICAgPyB0aGlzLl9yZW5kZXJSZW1vdmVIZWFkZXJzQ29uZmlnKHByb3BzLnJlbW92ZUhlYWRlcnMpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzZXJ2ZXJUaW1pbmdIZWFkZXJzQ29uZmlnOiBwcm9wcy5zZXJ2ZXJUaW1pbmdTYW1wbGluZ1JhdGVcbiAgICAgICAgICAgID8gdGhpcy5fcmVuZGVyU2VydmVyVGltaW5nSGVhZGVyc0NvbmZpZyhcbiAgICAgICAgICAgICAgICBwcm9wcy5zZXJ2ZXJUaW1pbmdTYW1wbGluZ1JhdGUsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzUG9saWN5SWQgPSB0aGlzLnJlc291cmNlLmlkO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyQ29yc0NvbmZpZyhcbiAgICBiZWhhdmlvcjogUmVzcG9uc2VIZWFkZXJzQ29yc0JlaGF2aW9yLFxuICApOiBjbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5LkNsb3VkZnJvbnRSZXNwb25zZUhlYWRlcnNQb2xpY3lDb3JzQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWNjZXNzQ29udHJvbEFsbG93Q3JlZGVudGlhbHM6IGJlaGF2aW9yLmFjY2Vzc0NvbnRyb2xBbGxvd0NyZWRlbnRpYWxzLFxuICAgICAgYWNjZXNzQ29udHJvbEFsbG93SGVhZGVyczogeyBpdGVtczogYmVoYXZpb3IuYWNjZXNzQ29udHJvbEFsbG93SGVhZGVycyB9LFxuICAgICAgYWNjZXNzQ29udHJvbEFsbG93TWV0aG9kczogeyBpdGVtczogYmVoYXZpb3IuYWNjZXNzQ29udHJvbEFsbG93TWV0aG9kcyB9LFxuICAgICAgYWNjZXNzQ29udHJvbEFsbG93T3JpZ2luczogeyBpdGVtczogYmVoYXZpb3IuYWNjZXNzQ29udHJvbEFsbG93T3JpZ2lucyB9LFxuICAgICAgYWNjZXNzQ29udHJvbEV4cG9zZUhlYWRlcnM6IGJlaGF2aW9yLmFjY2Vzc0NvbnRyb2xFeHBvc2VIZWFkZXJzXG4gICAgICAgID8geyBpdGVtczogYmVoYXZpb3IuYWNjZXNzQ29udHJvbEV4cG9zZUhlYWRlcnMgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGFjY2Vzc0NvbnRyb2xNYXhBZ2VTZWM6IGJlaGF2aW9yLmFjY2Vzc0NvbnRyb2xNYXhBZ2VcbiAgICAgICAgPyBiZWhhdmlvci5hY2Nlc3NDb250cm9sTWF4QWdlLnRvU2Vjb25kcygpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgb3JpZ2luT3ZlcnJpZGU6IGJlaGF2aW9yLm9yaWdpbk92ZXJyaWRlLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJDdXN0b21IZWFkZXJzQ29uZmlnKFxuICAgIGJlaGF2aW9yOiBSZXNwb25zZUN1c3RvbUhlYWRlcnNCZWhhdmlvcixcbiAgKTogY2xvdWRmcm9udFJlc3BvbnNlSGVhZGVyc1BvbGljeS5DbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5Q3VzdG9tSGVhZGVyc0NvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1zOiBiZWhhdmlvci5jdXN0b21IZWFkZXJzLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJTZWN1cml0eUhlYWRlcnNDb25maWcoXG4gICAgYmVoYXZpb3I6IFJlc3BvbnNlU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3IsXG4gICk6IGNsb3VkZnJvbnRSZXNwb25zZUhlYWRlcnNQb2xpY3kuQ2xvdWRmcm9udFJlc3BvbnNlSGVhZGVyc1BvbGljeVNlY3VyaXR5SGVhZGVyc0NvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnRTZWN1cml0eVBvbGljeTogYmVoYXZpb3IuY29udGVudFNlY3VyaXR5UG9saWN5LFxuICAgICAgY29udGVudFR5cGVPcHRpb25zOiBiZWhhdmlvci5jb250ZW50VHlwZU9wdGlvbnMsXG4gICAgICBmcmFtZU9wdGlvbnM6IGJlaGF2aW9yLmZyYW1lT3B0aW9ucyxcbiAgICAgIHJlZmVycmVyUG9saWN5OiBiZWhhdmlvci5yZWZlcnJlclBvbGljeSxcbiAgICAgIHN0cmljdFRyYW5zcG9ydFNlY3VyaXR5OiBiZWhhdmlvci5zdHJpY3RUcmFuc3BvcnRTZWN1cml0eVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLmJlaGF2aW9yLnN0cmljdFRyYW5zcG9ydFNlY3VyaXR5LFxuICAgICAgICAgICAgYWNjZXNzQ29udHJvbE1heEFnZVNlYzpcbiAgICAgICAgICAgICAgYmVoYXZpb3Iuc3RyaWN0VHJhbnNwb3J0U2VjdXJpdHkuYWNjZXNzQ29udHJvbE1heEFnZS50b1NlY29uZHMoKSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgeHNzUHJvdGVjdGlvbjogYmVoYXZpb3IueHNzUHJvdGVjdGlvbixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyUmVtb3ZlSGVhZGVyc0NvbmZpZyhcbiAgICBoZWFkZXJzOiBzdHJpbmdbXSxcbiAgKTogY2xvdWRmcm9udFJlc3BvbnNlSGVhZGVyc1BvbGljeS5DbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5UmVtb3ZlSGVhZGVyc0NvbmZpZyB7XG4gICAgY29uc3QgcmVhZG9ubHlIZWFkZXJzID0gW1xuICAgICAgXCJjb250ZW50LWVuY29kaW5nXCIsXG4gICAgICBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgICBcInRyYW5zZmVyLWVuY29kaW5nXCIsXG4gICAgICBcIndhcm5pbmdcIixcbiAgICAgIFwidmlhXCIsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBpdGVtczogaGVhZGVycy5tYXAoKGhlYWRlcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIVRva2VuLmlzVW5yZXNvbHZlZChoZWFkZXIpICYmXG4gICAgICAgICAgcmVhZG9ubHlIZWFkZXJzLmluY2x1ZGVzKGhlYWRlci50b0xvd2VyQ2FzZSgpKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZW1vdmUgcmVhZC1vbmx5IGhlYWRlciAke2hlYWRlcn1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBoZWFkZXIgfTtcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJTZXJ2ZXJUaW1pbmdIZWFkZXJzQ29uZmlnKFxuICAgIHNhbXBsaW5nUmF0ZTogbnVtYmVyLFxuICApOiBjbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5LkNsb3VkZnJvbnRSZXNwb25zZUhlYWRlcnNQb2xpY3lTZXJ2ZXJUaW1pbmdIZWFkZXJzQ29uZmlnIHtcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZChzYW1wbGluZ1JhdGUpKSB7XG4gICAgICBpZiAoc2FtcGxpbmdSYXRlIDwgMCB8fCBzYW1wbGluZ1JhdGUgPiAxMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBTYW1wbGluZyByYXRlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAgKGluY2x1c2l2ZSksIHJlY2VpdmVkICR7c2FtcGxpbmdSYXRlfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICghaGFzTWF4RGVjaW1hbFBsYWNlcyhzYW1wbGluZ1JhdGUsIDQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU2FtcGxpbmcgcmF0ZSBjYW4gaGF2ZSB1cCB0byBmb3VyIGRlY2ltYWwgcGxhY2VzLCByZWNlaXZlZCAke3NhbXBsaW5nUmF0ZX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgc2FtcGxpbmdSYXRlLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIHNldCBvZiBIVFRQIHJlc3BvbnNlIGhlYWRlcnMgdGhhdCBhcmUgdXNlZCBmb3IgY3Jvc3Mtb3JpZ2luIHJlc291cmNlIHNoYXJpbmcgKENPUlMpLlxuICogQ2xvdWRGcm9udCBhZGRzIHRoZXNlIGhlYWRlcnMgdG8gSFRUUCByZXNwb25zZXMgdGhhdCBpdCBzZW5kcyBmb3IgQ09SUyByZXF1ZXN0cyB0aGF0IG1hdGNoIGEgY2FjaGUgYmVoYXZpb3JcbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlSGVhZGVyc0NvcnNCZWhhdmlvciB7XG4gIC8qKlxuICAgKiBBIEJvb2xlYW4gdGhhdCBDbG91ZEZyb250IHVzZXMgYXMgdGhlIHZhbHVlIGZvciB0aGUgQWNjZXNzLUNvbnRyb2wtQWxsb3ctQ3JlZGVudGlhbHMgSFRUUCByZXNwb25zZSBoZWFkZXIuXG4gICAqL1xuICByZWFkb25seSBhY2Nlc3NDb250cm9sQWxsb3dDcmVkZW50aWFsczogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIEhUVFAgaGVhZGVyIG5hbWVzIHRoYXQgQ2xvdWRGcm9udCBpbmNsdWRlcyBhcyB2YWx1ZXMgZm9yIHRoZSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzIEhUVFAgcmVzcG9uc2UgaGVhZGVyLlxuICAgKiBZb3UgY2FuIHNwZWNpZnkgYFsnKiddYCB0byBhbGxvdyBhbGwgaGVhZGVycy5cbiAgICovXG4gIHJlYWRvbmx5IGFjY2Vzc0NvbnRyb2xBbGxvd0hlYWRlcnM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgSFRUUCBtZXRob2RzIHRoYXQgQ2xvdWRGcm9udCBpbmNsdWRlcyBhcyB2YWx1ZXMgZm9yIHRoZSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzIEhUVFAgcmVzcG9uc2UgaGVhZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXNzQ29udHJvbEFsbG93TWV0aG9kczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBvcmlnaW5zIChkb21haW4gbmFtZXMpIHRoYXQgQ2xvdWRGcm9udCBjYW4gdXNlIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIEFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbiBIVFRQIHJlc3BvbnNlIGhlYWRlci5cbiAgICogWW91IGNhbiBzcGVjaWZ5IGBbJyonXWAgdG8gYWxsb3cgYWxsIG9yaWdpbnMuXG4gICAqL1xuICByZWFkb25seSBhY2Nlc3NDb250cm9sQWxsb3dPcmlnaW5zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIEhUVFAgaGVhZGVycyB0aGF0IENsb3VkRnJvbnQgaW5jbHVkZXMgYXMgdmFsdWVzIGZvciB0aGUgQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnMgSFRUUCByZXNwb25zZSBoZWFkZXIuXG4gICAqIFlvdSBjYW4gc3BlY2lmeSBgWycqJ11gIHRvIGV4cG9zZSBhbGwgaGVhZGVycy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBoZWFkZXJzIGV4cG9zZWRcbiAgICovXG4gIHJlYWRvbmx5IGFjY2Vzc0NvbnRyb2xFeHBvc2VIZWFkZXJzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbnVtYmVyIHRoYXQgQ2xvdWRGcm9udCB1c2VzIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIEFjY2Vzcy1Db250cm9sLU1heC1BZ2UgSFRUUCByZXNwb25zZSBoZWFkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbWF4IGFnZVxuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXNzQ29udHJvbE1heEFnZT86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBBIEJvb2xlYW4gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgQ2xvdWRGcm9udCBvdmVycmlkZXMgSFRUUCByZXNwb25zZSBoZWFkZXJzIHJlY2VpdmVkIGZyb20gdGhlIG9yaWdpbiB3aXRoIHRoZSBvbmVzIHNwZWNpZmllZCBpbiB0aGlzIHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5LlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luT3ZlcnJpZGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBzZXQgb2YgSFRUUCByZXNwb25zZSBoZWFkZXJzIHRoYXQgYXJlIHNlbnQgZm9yIHJlcXVlc3RzIHRoYXQgbWF0Y2ggYSBjYWNoZSBiZWhhdmlvclxuICogdGhhdOKAmXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVzcG9uc2UgaGVhZGVycyBwb2xpY3kuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VDdXN0b21IZWFkZXJzQmVoYXZpb3Ige1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgSFRUUCByZXNwb25zZSBoZWFkZXJzIGFuZCB0aGVpciB2YWx1ZXMuXG4gICAqL1xuICByZWFkb25seSBjdXN0b21IZWFkZXJzOiBSZXNwb25zZUN1c3RvbUhlYWRlcltdO1xufVxuXG4vKipcbiAqIEFuIEhUVFAgcmVzcG9uc2UgaGVhZGVyIG5hbWUgYW5kIGl0cyB2YWx1ZS5cbiAqIENsb3VkRnJvbnQgaW5jbHVkZXMgdGhpcyBoZWFkZXIgaW4gSFRUUCByZXNwb25zZXMgdGhhdCBpdCBzZW5kcyBmb3IgcmVxdWVzdHMgdGhhdCBtYXRjaCBhIGNhY2hlIGJlaGF2aW9yIHRoYXTigJlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlQ3VzdG9tSGVhZGVyIHtcbiAgLyoqXG4gICAqIFRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlciBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgaGVhZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgQm9vbGVhbiB0aGF0IGRldGVybWluZXMgd2hldGhlciBDbG91ZEZyb250IG92ZXJyaWRlcyBhIHJlc3BvbnNlIGhlYWRlciB3aXRoIHRoZSBzYW1lIG5hbWVcbiAgICogcmVjZWl2ZWQgZnJvbSB0aGUgb3JpZ2luIHdpdGggdGhlIGhlYWRlciBzcGVjaWZpZWQgaGVyZS5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgZm9yIHRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlci5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYSBzZXQgb2Ygc2VjdXJpdHktcmVsYXRlZCBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuXG4gKiBDbG91ZEZyb250IGFkZHMgdGhlc2UgaGVhZGVycyB0byBIVFRQIHJlc3BvbnNlcyB0aGF0IGl0IHNlbmRzIGZvciByZXF1ZXN0cyB0aGF0IG1hdGNoIGEgY2FjaGUgYmVoYXZpb3JcbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlU2VjdXJpdHlIZWFkZXJzQmVoYXZpb3Ige1xuICAvKipcbiAgICogVGhlIHBvbGljeSBkaXJlY3RpdmVzIGFuZCB0aGVpciB2YWx1ZXMgdGhhdCBDbG91ZEZyb250IGluY2x1ZGVzIGFzIHZhbHVlcyBmb3IgdGhlIENvbnRlbnQtU2VjdXJpdHktUG9saWN5IEhUVFAgcmVzcG9uc2UgaGVhZGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbnRlbnQgc2VjdXJpdHkgcG9saWN5XG4gICAqL1xuICByZWFkb25seSBjb250ZW50U2VjdXJpdHlQb2xpY3k/OiBSZXNwb25zZUhlYWRlcnNDb250ZW50U2VjdXJpdHlQb2xpY3k7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBDbG91ZEZyb250IGluY2x1ZGVzIHRoZSBYLUNvbnRlbnQtVHlwZS1PcHRpb25zIEhUVFAgcmVzcG9uc2UgaGVhZGVyIHdpdGggaXRzIHZhbHVlIHNldCB0byBub3NuaWZmLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbnRlbnQgdHlwZSBvcHRpb25zXG4gICAqL1xuICByZWFkb25seSBjb250ZW50VHlwZU9wdGlvbnM/OiBSZXNwb25zZUhlYWRlcnNDb250ZW50VHlwZU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBDbG91ZEZyb250IGluY2x1ZGVzIHRoZSBYLUZyYW1lLU9wdGlvbnMgSFRUUCByZXNwb25zZSBoZWFkZXIgYW5kIHRoZSBoZWFkZXLigJlzIHZhbHVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGZyYW1lIG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGZyYW1lT3B0aW9ucz86IFJlc3BvbnNlSGVhZGVyc0ZyYW1lT3B0aW9ucztcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIENsb3VkRnJvbnQgaW5jbHVkZXMgdGhlIFJlZmVycmVyLVBvbGljeSBIVFRQIHJlc3BvbnNlIGhlYWRlciBhbmQgdGhlIGhlYWRlcuKAmXMgdmFsdWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcmVmZXJyZXIgcG9saWN5XG4gICAqL1xuICByZWFkb25seSByZWZlcnJlclBvbGljeT86IFJlc3BvbnNlSGVhZGVyc1JlZmVycmVyUG9saWN5O1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgQ2xvdWRGcm9udCBpbmNsdWRlcyB0aGUgU3RyaWN0LVRyYW5zcG9ydC1TZWN1cml0eSBIVFRQIHJlc3BvbnNlIGhlYWRlciBhbmQgdGhlIGhlYWRlcuKAmXMgdmFsdWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gc3RyaWN0IHRyYW5zcG9ydCBzZWN1cml0eVxuICAgKi9cbiAgcmVhZG9ubHkgc3RyaWN0VHJhbnNwb3J0U2VjdXJpdHk/OiBSZXNwb25zZUhlYWRlcnNTdHJpY3RUcmFuc3BvcnRTZWN1cml0eTtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIENsb3VkRnJvbnQgaW5jbHVkZXMgdGhlIFgtWFNTLVByb3RlY3Rpb24gSFRUUCByZXNwb25zZSBoZWFkZXIgYW5kIHRoZSBoZWFkZXLigJlzIHZhbHVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHhzcyBwcm90ZWN0aW9uXG4gICAqL1xuICByZWFkb25seSB4c3NQcm90ZWN0aW9uPzogUmVzcG9uc2VIZWFkZXJzWFNTUHJvdGVjdGlvbjtcbn1cblxuLyoqXG4gKiBUaGUgcG9saWN5IGRpcmVjdGl2ZXMgYW5kIHRoZWlyIHZhbHVlcyB0aGF0IENsb3VkRnJvbnQgaW5jbHVkZXMgYXMgdmFsdWVzIGZvciB0aGUgQ29udGVudC1TZWN1cml0eS1Qb2xpY3kgSFRUUCByZXNwb25zZSBoZWFkZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VIZWFkZXJzQ29udGVudFNlY3VyaXR5UG9saWN5IHtcbiAgLyoqXG4gICAqIFRoZSBwb2xpY3kgZGlyZWN0aXZlcyBhbmQgdGhlaXIgdmFsdWVzIHRoYXQgQ2xvdWRGcm9udCBpbmNsdWRlcyBhcyB2YWx1ZXMgZm9yIHRoZSBDb250ZW50LVNlY3VyaXR5LVBvbGljeSBIVFRQIHJlc3BvbnNlIGhlYWRlci5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnRTZWN1cml0eVBvbGljeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIEJvb2xlYW4gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgQ2xvdWRGcm9udCBvdmVycmlkZXMgdGhlIENvbnRlbnQtU2VjdXJpdHktUG9saWN5IEhUVFAgcmVzcG9uc2UgaGVhZGVyXG4gICAqIHJlY2VpdmVkIGZyb20gdGhlIG9yaWdpbiB3aXRoIHRoZSBvbmUgc3BlY2lmaWVkIGluIHRoaXMgcmVzcG9uc2UgaGVhZGVycyBwb2xpY3kuXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgQ2xvdWRGcm9udCBpbmNsdWRlcyB0aGUgWC1Db250ZW50LVR5cGUtT3B0aW9ucyBIVFRQIHJlc3BvbnNlIGhlYWRlciB3aXRoIGl0cyB2YWx1ZSBzZXQgdG8gbm9zbmlmZi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNwb25zZUhlYWRlcnNDb250ZW50VHlwZU9wdGlvbnMge1xuICAvKipcbiAgICogQSBCb29sZWFuIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIENsb3VkRnJvbnQgb3ZlcnJpZGVzIHRoZSBYLUNvbnRlbnQtVHlwZS1PcHRpb25zIEhUVFAgcmVzcG9uc2UgaGVhZGVyXG4gICAqIHJlY2VpdmVkIGZyb20gdGhlIG9yaWdpbiB3aXRoIHRoZSBvbmUgc3BlY2lmaWVkIGluIHRoaXMgcmVzcG9uc2UgaGVhZGVycyBwb2xpY3kuXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgQ2xvdWRGcm9udCBpbmNsdWRlcyB0aGUgWC1GcmFtZS1PcHRpb25zIEhUVFAgcmVzcG9uc2UgaGVhZGVyIGFuZCB0aGUgaGVhZGVy4oCZcyB2YWx1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNwb25zZUhlYWRlcnNGcmFtZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBYLUZyYW1lLU9wdGlvbnMgSFRUUCByZXNwb25zZSBoZWFkZXIuXG4gICAqL1xuICByZWFkb25seSBmcmFtZU9wdGlvbjogSGVhZGVyc0ZyYW1lT3B0aW9uO1xuXG4gIC8qKlxuICAgKiBBIEJvb2xlYW4gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgQ2xvdWRGcm9udCBvdmVycmlkZXMgdGhlIFgtRnJhbWUtT3B0aW9ucyBIVFRQIHJlc3BvbnNlIGhlYWRlclxuICAgKiByZWNlaXZlZCBmcm9tIHRoZSBvcmlnaW4gd2l0aCB0aGUgb25lIHNwZWNpZmllZCBpbiB0aGlzIHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5LlxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIENsb3VkRnJvbnQgaW5jbHVkZXMgdGhlIFJlZmVycmVyLVBvbGljeSBIVFRQIHJlc3BvbnNlIGhlYWRlciBhbmQgdGhlIGhlYWRlcuKAmXMgdmFsdWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VIZWFkZXJzUmVmZXJyZXJQb2xpY3kge1xuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBSZWZlcnJlci1Qb2xpY3kgSFRUUCByZXNwb25zZSBoZWFkZXIuXG4gICAqL1xuICByZWFkb25seSByZWZlcnJlclBvbGljeTogSGVhZGVyc1JlZmVycmVyUG9saWN5O1xuXG4gIC8qKlxuICAgKiBBIEJvb2xlYW4gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgQ2xvdWRGcm9udCBvdmVycmlkZXMgdGhlIFJlZmVycmVyLVBvbGljeSBIVFRQIHJlc3BvbnNlIGhlYWRlclxuICAgKiByZWNlaXZlZCBmcm9tIHRoZSBvcmlnaW4gd2l0aCB0aGUgb25lIHNwZWNpZmllZCBpbiB0aGlzIHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5LlxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIENsb3VkRnJvbnQgaW5jbHVkZXMgdGhlIFN0cmljdC1UcmFuc3BvcnQtU2VjdXJpdHkgSFRUUCByZXNwb25zZSBoZWFkZXIgYW5kIHRoZSBoZWFkZXLigJlzIHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlSGVhZGVyc1N0cmljdFRyYW5zcG9ydFNlY3VyaXR5IHtcbiAgLyoqXG4gICAqIEEgbnVtYmVyIHRoYXQgQ2xvdWRGcm9udCB1c2VzIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIG1heC1hZ2UgZGlyZWN0aXZlIGluIHRoZSBTdHJpY3QtVHJhbnNwb3J0LVNlY3VyaXR5IEhUVFAgcmVzcG9uc2UgaGVhZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXNzQ29udHJvbE1heEFnZTogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEEgQm9vbGVhbiB0aGF0IGRldGVybWluZXMgd2hldGhlciBDbG91ZEZyb250IGluY2x1ZGVzIHRoZSBpbmNsdWRlU3ViRG9tYWlucyBkaXJlY3RpdmUgaW4gdGhlIFN0cmljdC1UcmFuc3BvcnQtU2VjdXJpdHkgSFRUUCByZXNwb25zZSBoZWFkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlU3ViZG9tYWlucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgQm9vbGVhbiB0aGF0IGRldGVybWluZXMgd2hldGhlciBDbG91ZEZyb250IG92ZXJyaWRlcyB0aGUgU3RyaWN0LVRyYW5zcG9ydC1TZWN1cml0eSBIVFRQIHJlc3BvbnNlIGhlYWRlclxuICAgKiByZWNlaXZlZCBmcm9tIHRoZSBvcmlnaW4gd2l0aCB0aGUgb25lIHNwZWNpZmllZCBpbiB0aGlzIHJlc3BvbnNlIGhlYWRlcnMgcG9saWN5LlxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgQm9vbGVhbiB0aGF0IGRldGVybWluZXMgd2hldGhlciBDbG91ZEZyb250IGluY2x1ZGVzIHRoZSBwcmVsb2FkIGRpcmVjdGl2ZSBpbiB0aGUgU3RyaWN0LVRyYW5zcG9ydC1TZWN1cml0eSBIVFRQIHJlc3BvbnNlIGhlYWRlci5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHByZWxvYWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBDbG91ZEZyb250IGluY2x1ZGVzIHRoZSBYLVhTUy1Qcm90ZWN0aW9uIEhUVFAgcmVzcG9uc2UgaGVhZGVyIGFuZCB0aGUgaGVhZGVy4oCZcyB2YWx1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNwb25zZUhlYWRlcnNYU1NQcm90ZWN0aW9uIHtcbiAgLyoqXG4gICAqIEEgQm9vbGVhbiB0aGF0IGRldGVybWluZXMgd2hldGhlciBDbG91ZEZyb250IGluY2x1ZGVzIHRoZSBtb2RlPWJsb2NrIGRpcmVjdGl2ZSBpbiB0aGUgWC1YU1MtUHJvdGVjdGlvbiBoZWFkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBtb2RlQmxvY2s/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIEJvb2xlYW4gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgQ2xvdWRGcm9udCBvdmVycmlkZXMgdGhlIFgtWFNTLVByb3RlY3Rpb24gSFRUUCByZXNwb25zZSBoZWFkZXJcbiAgICogcmVjZWl2ZWQgZnJvbSB0aGUgb3JpZ2luIHdpdGggdGhlIG9uZSBzcGVjaWZpZWQgaW4gdGhpcyByZXNwb25zZSBoZWFkZXJzIHBvbGljeS5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIEJvb2xlYW4gdGhhdCBkZXRlcm1pbmVzIHRoZSB2YWx1ZSBvZiB0aGUgWC1YU1MtUHJvdGVjdGlvbiBIVFRQIHJlc3BvbnNlIGhlYWRlci5cbiAgICogV2hlbiB0aGlzIHNldHRpbmcgaXMgdHJ1ZSwgdGhlIHZhbHVlIG9mIHRoZSBYLVhTUy1Qcm90ZWN0aW9uIGhlYWRlciBpcyAxLlxuICAgKiBXaGVuIHRoaXMgc2V0dGluZyBpcyBmYWxzZSwgdGhlIHZhbHVlIG9mIHRoZSBYLVhTUy1Qcm90ZWN0aW9uIGhlYWRlciBpcyAwLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdGVjdGlvbjogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSByZXBvcnRpbmcgVVJJLCB3aGljaCBDbG91ZEZyb250IHVzZXMgYXMgdGhlIHZhbHVlIG9mIHRoZSByZXBvcnQgZGlyZWN0aXZlIGluIHRoZSBYLVhTUy1Qcm90ZWN0aW9uIGhlYWRlci5cbiAgICogWW91IGNhbm5vdCBzcGVjaWZ5IGEgUmVwb3J0VXJpIHdoZW4gTW9kZUJsb2NrIGlzIHRydWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcmVwb3J0IHVyaVxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3J0VXJpPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgWC1GcmFtZS1PcHRpb25zIEhUVFAgcmVzcG9uc2UgaGVhZGVyLlxuICovXG5leHBvcnQgZW51bSBIZWFkZXJzRnJhbWVPcHRpb24ge1xuICAvKipcbiAgICogVGhlIHBhZ2UgY2FuIG9ubHkgYmUgZGlzcGxheWVkIGluIGEgZnJhbWUgb24gdGhlIHNhbWUgb3JpZ2luIGFzIHRoZSBwYWdlIGl0c2VsZi5cbiAgICovXG4gIERFTlkgPSBcIkRFTllcIixcblxuICAvKipcbiAgICogVGhlIHBhZ2UgY2FuIG9ubHkgYmUgZGlzcGxheWVkIGluIGEgZnJhbWUgb24gdGhlIHNwZWNpZmllZCBvcmlnaW4uXG4gICAqL1xuICBTQU1FT1JJR0lOID0gXCJTQU1FT1JJR0lOXCIsXG59XG5cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgcG9zc2libGUgdmFsdWVzIG9mIHRoZSBSZWZlcnJlci1Qb2xpY3kgSFRUUCByZXNwb25zZSBoZWFkZXIuXG4gKi9cbmV4cG9ydCBlbnVtIEhlYWRlcnNSZWZlcnJlclBvbGljeSB7XG4gIC8qKlxuICAgKiBUaGUgcmVmZXJyZXIgcG9saWN5IGlzIG5vdCBzZXQuXG4gICAqL1xuICBOT19SRUZFUlJFUiA9IFwibm8tcmVmZXJyZXJcIixcblxuICAvKipcbiAgICogVGhlIHJlZmVycmVyIHBvbGljeSBpcyBuby1yZWZlcnJlci13aGVuLWRvd25ncmFkZS5cbiAgICovXG4gIE5PX1JFRkVSUkVSX1dIRU5fRE9XTkdSQURFID0gXCJuby1yZWZlcnJlci13aGVuLWRvd25ncmFkZVwiLFxuXG4gIC8qKlxuICAgKiBUaGUgcmVmZXJyZXIgcG9saWN5IGlzIG9yaWdpbi5cbiAgICovXG4gIE9SSUdJTiA9IFwib3JpZ2luXCIsXG5cbiAgLyoqXG4gICAqIFRoZSByZWZlcnJlciBwb2xpY3kgaXMgb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luLlxuICAgKi9cbiAgT1JJR0lOX1dIRU5fQ1JPU1NfT1JJR0lOID0gXCJvcmlnaW4td2hlbi1jcm9zcy1vcmlnaW5cIixcblxuICAvKipcbiAgICogVGhlIHJlZmVycmVyIHBvbGljeSBpcyBzYW1lLW9yaWdpbi5cbiAgICovXG4gIFNBTUVfT1JJR0lOID0gXCJzYW1lLW9yaWdpblwiLFxuXG4gIC8qKlxuICAgKiBUaGUgcmVmZXJyZXIgcG9saWN5IGlzIHN0cmljdC1vcmlnaW4uXG4gICAqL1xuICBTVFJJQ1RfT1JJR0lOID0gXCJzdHJpY3Qtb3JpZ2luXCIsXG5cbiAgLyoqXG4gICAqIFRoZSByZWZlcnJlciBwb2xpY3kgaXMgc3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbi5cbiAgICovXG4gIFNUUklDVF9PUklHSU5fV0hFTl9DUk9TU19PUklHSU4gPSBcInN0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW5cIixcblxuICAvKipcbiAgICogVGhlIHJlZmVycmVyIHBvbGljeSBpcyB1bnNhZmUtdXJsLlxuICAgKi9cbiAgVU5TQUZFX1VSTCA9IFwidW5zYWZlLXVybFwiLFxufVxuXG5mdW5jdGlvbiBoYXNNYXhEZWNpbWFsUGxhY2VzKG51bTogbnVtYmVyLCBkZWNpbWFsczogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnRzID0gbnVtLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpO1xuICByZXR1cm4gcGFydHMubGVuZ3RoID09PSAxIHx8IHBhcnRzWzFdLmxlbmd0aCA8PSBkZWNpbWFscztcbn1cblxuLyoqXG4gKiBBIFJlc3BvbnNlIEhlYWRlcnMgUG9saWN5IGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvdXNpbmctbWFuYWdlZC1yZXNwb25zZS1oZWFkZXJzLXBvbGljaWVzLmh0bWxcbiAqIEBsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9oYXNoaWNvcnAvYXdzLzUuNjAuMC9kb2NzL2RhdGEtc291cmNlcy9jbG91ZGZyb250X3Jlc3BvbnNlX2hlYWRlcnNfcG9saWN5I2F3cy1tYW5hZ2VkLXBvbGljaWVzXG4gKi9cbmV4cG9ydCBlbnVtIE1hbmFnZWRSZXNwb25zZUhlYWRlcnNQb2xpY3kge1xuICAvKiogVXNlIHRoaXMgbWFuYWdlZCBwb2xpY3kgdG8gYWxsb3cgc2ltcGxlIENPUlMgcmVxdWVzdHMgZnJvbSBhbnkgb3JpZ2luLiAqL1xuICBDT1JTX0FMTE9XX0FMTF9PUklHSU5TID0gXCJNYW5hZ2VkLVNpbXBsZUNPUlNcIiwgLy82MDY2OTY1Mi00NTViLTRhZTktODVhNC1jNGMwMjM5M2Y4NmNcbiAgLyoqIFVzZSB0aGlzIG1hbmFnZWQgcG9saWN5IHRvIGFsbG93IENPUlMgcmVxdWVzdHMgZnJvbSBhbnkgb3JpZ2luLCBpbmNsdWRpbmcgcHJlZmxpZ2h0IHJlcXVlc3RzLiAqL1xuICBDT1JTX0FMTE9XX0FMTF9PUklHSU5TX1dJVEhfUFJFRkxJR0hUID0gXCJNYW5hZ2VkLUNPUlMtV2l0aC1QcmVmbGlnaHRcIiwgLy81Y2MzYjkwOC1lNjE5LTRiOTktODhlNS0yY2Y3ZjQ1OTY1YmRcbiAgLyoqIFVzZSB0aGlzIG1hbmFnZWQgcG9saWN5IHRvIGFkZCBhIHNldCBvZiBzZWN1cml0eSBoZWFkZXJzIHRvIGFsbCByZXNwb25zZXMgdGhhdCBDbG91ZEZyb250IHNlbmRzIHRvIHZpZXdlcnMuICovXG4gIFNFQ1VSSVRZX0hFQURFUlMgPSBcIk1hbmFnZWQtU2VjdXJpdHlIZWFkZXJzUG9saWN5XCIsIC8vNjdmNzcyNWMtNmY5Ny00MjEwLTgyZDctNTUxMmIzMWU5ZDAzXG4gIC8qKiBVc2UgdGhpcyBtYW5hZ2VkIHBvbGljeSB0byBhbGxvdyBzaW1wbGUgQ09SUyByZXF1ZXN0cyBmcm9tIGFueSBvcmlnaW4gYW5kIGFkZCBhIHNldCBvZiBzZWN1cml0eSBoZWFkZXJzIHRvIGFsbCByZXNwb25zZXMgdGhhdCBDbG91ZEZyb250IHNlbmRzIHRvIHZpZXdlcnMuICovXG4gIENPUlNfQUxMT1dfQUxMX09SSUdJTlNfQU5EX1NFQ1VSSVRZX0hFQURFUlMgPSBcIk1hbmFnZWQtQ09SUy1hbmQtU2VjdXJpdHlIZWFkZXJzUG9saWN5XCIsIC8vZTYxZWI2MGMtOWMzNS00ZDIwLWE5MjgtMmI4NGUwMmFmODljXG4gIC8qKiBVc2UgdGhpcyBtYW5hZ2VkIHBvbGljeSB0byBhbGxvdyBDT1JTIHJlcXVlc3RzIGZyb20gYW55IG9yaWdpbiwgaW5jbHVkaW5nIHByZWZsaWdodCByZXF1ZXN0cywgYW5kIGFkZCBhIHNldCBvZiBzZWN1cml0eSBoZWFkZXJzIHRvIGFsbCByZXNwb25zZXMgdGhhdCBDbG91ZEZyb250IHNlbmRzIHRvIHZpZXdlcnMuICovXG4gIENPUlNfQUxMT1dfQUxMX09SSUdJTlNfV0lUSF9QUkVGTElHSFRfQU5EX1NFQ1VSSVRZX0hFQURFUlMgPSBcIk1hbmFnZWQtQ09SUy13aXRoLXByZWZsaWdodC1hbmQtU2VjdXJpdHlIZWFkZXJzUG9saWN5XCIsIC8vZWFhYjQzODEtZWQzMy00YTg2LTg4Y2EtZDk1NThkYzZjZDYzXG59XG4iXX0=
|