@rio-cloud/cdk-v2-constructs 9.0.0-alpha.8 → 9.0.0
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 +883 -183
- package/README.md +65 -0
- package/docs/AGENTS_DOCUMENTATION.md +20 -203
- package/lib/fargate/datadog.d.ts +4 -1
- package/lib/fargate/datadog.js +6 -3
- package/lib/fargate/rio-fargate-service-blue-green-alpha.js +6 -1
- package/lib/fargate/rio-fargate-service.d.ts +22 -1
- package/lib/fargate/rio-fargate-service.js +11 -2
- package/lib/fargate/trace-sampling.d.ts +87 -0
- package/lib/fargate/trace-sampling.js +123 -0
- package/lib/sbom-catalog/lambda/handler.cjs +38 -1
- package/node_modules/zod/package.json +1 -1
- package/node_modules/zod/src/v4/classic/tests/array.test.ts +27 -0
- package/node_modules/zod/src/v4/classic/tests/map.test.ts +7 -0
- package/node_modules/zod/src/v4/classic/tests/set.test.ts +6 -0
- package/node_modules/zod/src/v4/core/compile.ts +9 -0
- package/node_modules/zod/src/v4/core/schemas.ts +35 -1
- package/node_modules/zod/src/v4/core/util.ts +13 -0
- package/node_modules/zod/src/v4/core/versions.ts +1 -1
- package/node_modules/zod/v4/core/compile.cjs +8 -0
- package/node_modules/zod/v4/core/compile.js +8 -0
- package/node_modules/zod/v4/core/schemas.cjs +30 -0
- package/node_modules/zod/v4/core/schemas.d.cts +3 -1
- package/node_modules/zod/v4/core/schemas.d.ts +3 -1
- package/node_modules/zod/v4/core/schemas.js +30 -0
- package/node_modules/zod/v4/core/util.cjs +15 -0
- package/node_modules/zod/v4/core/util.d.cts +2 -0
- package/node_modules/zod/v4/core/util.d.ts +2 -0
- package/node_modules/zod/v4/core/util.js +14 -0
- package/node_modules/zod/v4/core/versions.cjs +1 -1
- package/node_modules/zod/v4/core/versions.js +1 -1
- package/package.json +1 -1
- package/version.json +1 -1
package/README.md
CHANGED
|
@@ -28,6 +28,71 @@ $ npm install --save @rio-cloud/cdk-v2-constructs
|
|
|
28
28
|
|
|
29
29
|
## Constructs overview (Under construction...)
|
|
30
30
|
|
|
31
|
+
### Fargate trace sampling
|
|
32
|
+
|
|
33
|
+
`RioFargateService` and `RioFargateServiceBlueGreenAlpha` configure Datadog
|
|
34
|
+
trace sampling through `datadogOptions.traceSampling`. The default is
|
|
35
|
+
`TraceSamplingMode.DEFAULT`: it sets `DD_APM_TARGET_TPS=5` and
|
|
36
|
+
`DD_APM_ERROR_TPS=10` on the Datadog Agent sidecar. This replaces the
|
|
37
|
+
historical application-level fixed rate of `DD_TRACE_SAMPLE_RATE=1.0`.
|
|
38
|
+
These settings apply per Agent; each Fargate task has its own Agent sidecar.
|
|
39
|
+
|
|
40
|
+
The head-sampling target is averaged over time, so traffic spikes can exceed
|
|
41
|
+
it. Error sampling captures additional local error trace chunks missed by
|
|
42
|
+
head sampling; it does not cap the total number of error traces ingested.
|
|
43
|
+
|
|
44
|
+
RIO uses target-per-second sampling as its default because it is appropriate
|
|
45
|
+
for both low- and high-traffic services: low-traffic services can retain all
|
|
46
|
+
their traces, while high-traffic services are sampled toward the target.
|
|
47
|
+
|
|
48
|
+
For Kotlin/Spring Boot services on Fargate it is recommended to use the
|
|
49
|
+
Datadog Java tracer, `dd-java-agent`, as a JVM agent. It automatically
|
|
50
|
+
instruments supported Spring Boot libraries and enables the Agent-side
|
|
51
|
+
target-per-second sampling configured by this construct.
|
|
52
|
+
|
|
53
|
+
Do not use the OpenTelemetry Java agent. The default tracing behavior for RIO
|
|
54
|
+
Fargate Services—`DD_APM_TARGET_TPS`—controls Datadog SDKs, not OTLP
|
|
55
|
+
ingestion. OpenTelemetry users must configure sampling in their own SDK and
|
|
56
|
+
maintain that integration separately.
|
|
57
|
+
|
|
58
|
+
- `DEFAULT` (or no option) emits the RIO Agent head-sampling target of 5
|
|
59
|
+
traces per second and an additional error-sampling budget of 10 error trace
|
|
60
|
+
chunks per second, per Agent (and therefore per running service instance).
|
|
61
|
+
This target-per-second approach is a practical default for both low- and
|
|
62
|
+
high-traffic services.
|
|
63
|
+
- `DATADOG_DEFAULT` emits no sampling variables, leaving Datadog's sampling
|
|
64
|
+
defaults in control.
|
|
65
|
+
- `FIXED_RATE` requires `fixedRate` (from 0 through 1) and emits a global
|
|
66
|
+
`DD_TRACE_SAMPLING_RULES` rule on the application container.
|
|
67
|
+
Datadog tracers additionally enforce their built-in 100-traces-per-second
|
|
68
|
+
rate limit when sampling rules are configured. This construct deliberately
|
|
69
|
+
does not expose or override that safeguard, so `fixedRate` is subject to
|
|
70
|
+
that per-instance upper bound on high-traffic services.
|
|
71
|
+
- `TARGET_PER_SECOND` requires `targetTracesPerSecond` and emits
|
|
72
|
+
`DD_APM_TARGET_TPS` on the Agent sidecar. This is an average head-sampling
|
|
73
|
+
target per Agent. Optional `errorTracesPerSecond` configures
|
|
74
|
+
`DD_APM_ERROR_TPS`, the budget for additional local error trace chunks per
|
|
75
|
+
second missed by head sampling.
|
|
76
|
+
|
|
77
|
+
For example:
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
datadogOptions: {
|
|
81
|
+
traceSampling: {
|
|
82
|
+
mode: TraceSamplingMode.TARGET_PER_SECOND,
|
|
83
|
+
targetTracesPerSecond: 20,
|
|
84
|
+
errorTracesPerSecond: 10,
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
`DD_TRACE_SAMPLING_RULES`, `DD_TRACE_SAMPLE_RATE`, `DD_APM_TARGET_TPS`, or
|
|
90
|
+
`DD_APM_ERROR_TPS` SHOULD not be set directly in
|
|
91
|
+
`containerDefinitionOption.environment`. Direct configuration remains possible
|
|
92
|
+
for backwards compatibility and produces a synthesis warning only.
|
|
93
|
+
Users who choose this approach are responsible for its configuration,
|
|
94
|
+
compatibility, and ongoing maintenance.
|
|
95
|
+
|
|
31
96
|
### Watchful
|
|
32
97
|
|
|
33
98
|
Watchful constructs help generate some default monitors based on the resources defined in your stack. E.g. - If your stack contains a lambda function, and you configure watchful construct, then it will create out of box metric monitors for Throttling, Lambda error and Log error monitors. The ever-growing list of resources that watchful creates monitors for as of today are:
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# Agents Documentation for `@rio-cloud/cdk-v2-constructs`
|
|
1
|
+
# Agents Documentation for `@rio-cloud-internal/cdk-v2-constructs`
|
|
2
2
|
|
|
3
3
|
## Purpose
|
|
4
4
|
|
|
5
|
-
Use this document as the entry point when an agent needs to understand or apply the npm package `@rio-cloud/cdk-v2-constructs` from an installed project. Prefer package-owned documentation in `.d.ts` files and generated type artifacts over memory or guesses.
|
|
5
|
+
Use this document as the entry point when an agent needs to understand or apply the npm package `@rio-cloud-internal/cdk-v2-constructs` from an installed project. Prefer package-owned documentation in `.d.ts` files and generated type artifacts over memory or guesses.
|
|
6
6
|
|
|
7
7
|
This package provides RIO-specific AWS CDK v2 constructs and helpers for:
|
|
8
8
|
|
|
@@ -26,196 +26,38 @@ Use `lib/**/*.d.ts` for generated type information and JSDoc-derived annotations
|
|
|
26
26
|
|
|
27
27
|
## Import And Edit Workflow
|
|
28
28
|
|
|
29
|
-
Prefer `import * as rio from '@rio-cloud/cdk-v2-constructs';` unless an exported subpath is explicitly available in the installed `package.json`.
|
|
30
|
-
|
|
31
|
-
Read the relevant declaration comments and examples before writing or changing infrastructure code.
|
|
32
|
-
|
|
33
|
-
## Migration guidance for `9.0.0`
|
|
34
|
-
|
|
35
|
-
This section applies when upgrading a consuming project to `9.0.0` or
|
|
36
|
-
later. Confirm the installed package version and its `package.json` exports
|
|
37
|
-
before applying it. The guidance below is based on the implementation and
|
|
38
|
-
tests in this release; it intentionally does not prescribe replacements for
|
|
39
|
-
environment variables for which this wrapper exposes no one-to-one prop.
|
|
40
|
-
|
|
41
|
-
### Datadog Lambda instrumentation: Datadog v5 environment handling
|
|
42
|
-
|
|
43
|
-
`DatadogLambdaInstrumentation` now uses `datadog-cdk-constructs-v2` v5. Before
|
|
44
|
-
calling `addLambdaFunctions()`, the construct rejects a Lambda whose CDK
|
|
45
|
-
environment already contains any of these variables:
|
|
46
|
-
|
|
47
|
-
```text
|
|
48
|
-
DD_TRACE_ENABLED
|
|
49
|
-
DD_MERGE_XRAY_TRACES
|
|
50
|
-
DD_LOGS_INJECTION
|
|
51
|
-
DD_SERVERLESS_LOGS_ENABLED
|
|
52
|
-
DD_CAPTURE_LAMBDA_PAYLOAD
|
|
53
|
-
DD_TRACE_CLOUD_REQUEST_PAYLOAD_TAGGING
|
|
54
|
-
DD_TRACE_CLOUD_RESPONSE_PAYLOAD_TAGGING
|
|
55
|
-
DD_LOG_LEVEL
|
|
56
|
-
DD_APPSEC_ENABLED
|
|
57
|
-
DD_SERVERLESS_APPSEC_ENABLED
|
|
58
|
-
AWS_LAMBDA_EXEC_WRAPPER
|
|
59
|
-
DD_TAGS
|
|
60
|
-
```
|
|
29
|
+
Prefer `import * as rio from '@rio-cloud-internal/cdk-v2-constructs';` unless an exported subpath is explicitly available in the installed `package.json`.
|
|
61
30
|
|
|
62
|
-
|
|
63
|
-
before instrumentation can be overwritten, so remove these settings from the
|
|
64
|
-
Lambda constructor and from any `addEnvironment()` call made before
|
|
65
|
-
`addLambdaFunctions()`.
|
|
66
|
-
|
|
67
|
-
Use the instrumentation props for settings that have a corresponding public
|
|
68
|
-
prop. The direct mappings established by this package are:
|
|
69
|
-
|
|
70
|
-
| Lambda environment variable | `DatadogLambdaInstrumentation` prop |
|
|
71
|
-
| --- | --- |
|
|
72
|
-
| `DD_TRACE_ENABLED` | `enableDatadogTracing` |
|
|
73
|
-
| `DD_MERGE_XRAY_TRACES` | `enableMergeXrayTraces` |
|
|
74
|
-
| `DD_LOGS_INJECTION` | `injectLogContext` |
|
|
75
|
-
| `DD_SERVERLESS_LOGS_ENABLED` | `enableDatadogLogs` |
|
|
76
|
-
| `DD_CAPTURE_LAMBDA_PAYLOAD` | `captureLambdaPayload` |
|
|
77
|
-
| `DD_LOG_LEVEL` | `logLevel` |
|
|
78
|
-
| `DD_TAGS` | `tags` |
|
|
79
|
-
|
|
80
|
-
The wrapper also exposes `enableDatadogASM` and `datadogAppSecMode`, but the
|
|
81
|
-
repository does not document a mechanical mapping for every AppSec-related
|
|
82
|
-
environment variable. Do not invent one; inspect the installed declarations
|
|
83
|
-
and the Datadog v5 behavior for the desired AppSec configuration. The same
|
|
84
|
-
applies to the two cloud-payload-tagging variables and
|
|
85
|
-
`AWS_LAMBDA_EXEC_WRAPPER`, for which this wrapper has no same-named prop.
|
|
86
|
-
|
|
87
|
-
If a per-function override is intentional, apply it only after instrumentation:
|
|
31
|
+
## Versioned migration guides
|
|
88
32
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
handler.addEnvironment('DD_LOG_LEVEL', 'debug');
|
|
92
|
-
```
|
|
33
|
+
For the breaking namespace migration and all `9.0.0` upgrade guidance, read
|
|
34
|
+
the [migration guide for `9.0.0`](./migration_guide.md).
|
|
93
35
|
|
|
94
|
-
|
|
95
|
-
construct, including Git metadata added through `addGitCommitMetadata()`.
|
|
96
|
-
`addLambdaFunctions()` validates the complete batch before changing any of its
|
|
97
|
-
functions. The validation covers the underlying CDK `Function` environment,
|
|
98
|
-
including `SingletonFunction` and values added with `addEnvironment()`; it
|
|
99
|
-
does not inspect `CfnFunction` escape-hatch overrides.
|
|
36
|
+
## Usage Guidance
|
|
100
37
|
|
|
101
|
-
|
|
102
|
-
`DD_TAGS`. For snapshot tests that must disable it, set this exact context key
|
|
103
|
-
on the test `App` to either boolean `false` or string `"false"`:
|
|
38
|
+
### General
|
|
104
39
|
|
|
105
|
-
|
|
106
|
-
const app = new App({
|
|
107
|
-
context: {
|
|
108
|
-
'@rio-cloud/cdk-v2-constructs:enableSourceCodeIntegration': false,
|
|
109
|
-
},
|
|
110
|
-
});
|
|
111
|
-
```
|
|
40
|
+
Prefer RIO constructs over raw AWS CDK constructs when the use case matches. These constructs encode RIO infrastructure defaults, Datadog tags, shared secrets, team and account SSM parameters, and monitoring conventions.
|
|
112
41
|
|
|
113
|
-
Do not
|
|
114
|
-
version props remain required; choose versions compatible with the installed
|
|
115
|
-
Datadog Lambda Node and extension layer releases rather than copying stale
|
|
116
|
-
values from tests.
|
|
42
|
+
Do not set construct attributes explicitly when the value you plan to set is already the construct default. Prefer relying on defaults unless you are intentionally changing behavior and that intent is clear in the code.
|
|
117
43
|
|
|
118
|
-
|
|
44
|
+
Preserve the target repository's existing stack boundaries and scripts when maintaining an existing project.
|
|
119
45
|
|
|
120
|
-
|
|
121
|
-
`@rio-cloud/rio-license-checker` as a direct dev dependency and commit the
|
|
122
|
-
corresponding lockfile:
|
|
46
|
+
### Observability
|
|
123
47
|
|
|
124
|
-
|
|
125
|
-
npm install --save-dev @rio-cloud/rio-license-checker
|
|
126
|
-
```
|
|
48
|
+
Watchful is RIO's monitoring and alerting abstraction. Prefer `rio.watchfulv2.Watchful` and `rio.datadogv2`. Use legacy `watchful` or `datadog` only when maintaining existing code that already depends on those APIs.
|
|
127
49
|
|
|
128
|
-
|
|
129
|
-
construct no longer supplies this package transitively. Add it to the package
|
|
130
|
-
whose `npm ci` precedes the call:
|
|
131
|
-
|
|
132
|
-
| Generated pipeline feature | Workspace in which the checker is invoked | Package that needs the dev dependency |
|
|
133
|
-
| --- | --- | --- |
|
|
134
|
-
| Infrastructure synth | `infrastructure/` | `infrastructure/package.json` |
|
|
135
|
-
| `gradleBuild` | repository root | root `package.json` |
|
|
136
|
-
| `npmBuild` | repository root | root `package.json` |
|
|
137
|
-
|
|
138
|
-
If a project enables more than one of these generated build paths, make the
|
|
139
|
-
checker available in each corresponding workspace. A custom main/branch or
|
|
140
|
-
vulnerability buildspec is loaded instead of the generated one, so inspect
|
|
141
|
-
that file separately for its own license-check command and install location.
|
|
142
|
-
The package's release notes link to the internal [RIO license-check
|
|
143
|
-
guidance](https://confluence.collaboration-man.com/spaces/RIOSHIPPER/pages/448924008/License+Checks).
|
|
144
|
-
|
|
145
|
-
### Contribution imports and package dependencies
|
|
146
|
-
|
|
147
|
-
Contribution constructs are no longer exported from the package root. Use the
|
|
148
|
-
owner-level subpaths that are present in the installed package's `exports` map:
|
|
149
|
-
|
|
150
|
-
| Owner | Public import path in `9.0.0` |
|
|
151
|
-
| --- | --- |
|
|
152
|
-
| Team Claid | `@rio-cloud/cdk-v2-constructs/contributions/team-claid` |
|
|
153
|
-
| Team Outbound Order Book | `@rio-cloud/cdk-v2-constructs/contributions/team-outbound-order-book` |
|
|
154
|
-
| Team Shipper Inbound Blue | `@rio-cloud/cdk-v2-constructs/contributions/team-shipper-inbound-blue` |
|
|
155
|
-
| Smart Route / GitLab Runner | `@rio-cloud/cdk-v2-constructs/contributions/smart-route` |
|
|
156
|
-
| Team Transport | `@rio-cloud/cdk-v2-constructs/contributions/team-transport` |
|
|
157
|
-
| CoP Frontend | `@rio-cloud/cdk-v2-constructs/contributions/cop-frontend` |
|
|
158
|
-
|
|
159
|
-
For example, change a root import while keeping the named imports:
|
|
160
|
-
|
|
161
|
-
```diff
|
|
162
|
-
-import { PipelineStack, PipelineType } from '@rio-cloud/cdk-v2-constructs';
|
|
163
|
-
+import { PipelineStack, PipelineType } from '@rio-cloud/cdk-v2-constructs/contributions/team-transport';
|
|
164
|
-
```
|
|
50
|
+
Do not add raw CloudWatch metrics, alarms, or monitoring resources for agent-generated changes. Use RIO monitoring constructs and Datadog-based abstractions for observability.
|
|
165
51
|
|
|
166
|
-
|
|
167
|
-
Import its pipeline, Datadog, and synthetics constructs from the single
|
|
168
|
-
owner-level path above. Do not infer additional public subpaths from the
|
|
169
|
-
source directory layout; the installed `package.json` `exports` map is the
|
|
170
|
-
authority.
|
|
52
|
+
Treat `rio.SesObservability` logs as PII. Do not forward those logs to third-party services and do not extend retention beyond the construct default.
|
|
171
53
|
|
|
172
|
-
|
|
173
|
-
`@pepperize/cdk-autoscaling-gitlab-runner` as a direct project dependency:
|
|
54
|
+
### RIO Infrastructure Defaults
|
|
174
55
|
|
|
175
|
-
|
|
176
|
-
npm install @pepperize/cdk-autoscaling-gitlab-runner
|
|
177
|
-
```
|
|
56
|
+
RIO infrastructure defaults are the baseline VPC, hosted zone, and team/account values provided by the RIO environment. Use `rio.RioLandingZone` helpers for default VPC, hosted zone, team name, team identifier, team email, team alert Slack channel, and account name. Avoid hard-coded VPC IDs, hosted-zone IDs, or parameter names when a helper exists.
|
|
178
57
|
|
|
179
|
-
|
|
180
|
-
that a consuming project can obtain transitively. This additional dependency
|
|
181
|
-
is required only by projects importing the Smart Route GitLab Runner
|
|
182
|
-
constructs.
|
|
183
|
-
|
|
184
|
-
### TypeScript resolver required for contribution subpaths
|
|
185
|
-
|
|
186
|
-
The contribution imports depend on Node package export maps. A legacy
|
|
187
|
-
`moduleResolution: "node"` configuration does not resolve these imports
|
|
188
|
-
reliably. Use a resolver that honors `exports` and keep the `module` and
|
|
189
|
-
`moduleResolution` settings compatible. For example, a CommonJS-oriented
|
|
190
|
-
project can use:
|
|
191
|
-
|
|
192
|
-
```json
|
|
193
|
-
{
|
|
194
|
-
"compilerOptions": {
|
|
195
|
-
"module": "Node16",
|
|
196
|
-
"moduleResolution": "node16"
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
```
|
|
58
|
+
### Services
|
|
200
59
|
|
|
201
|
-
|
|
202
|
-
resolution mode with its existing bundler-compatible module setting. Do not
|
|
203
|
-
change only `moduleResolution` in a configuration whose `module` setting is
|
|
204
|
-
incompatible; preserve the consuming project's module model and verify it with
|
|
205
|
-
the project's typecheck and synth commands.
|
|
206
|
-
|
|
207
|
-
### Team Transport CodeBuild runtime options
|
|
208
|
-
|
|
209
|
-
This is an alpha.4 pipeline feature rather than a breaking migration, but it
|
|
210
|
-
is relevant when updating pipeline code. Generated main, branch, and
|
|
211
|
-
vulnerability buildspecs continue to use Node.js 24 by default. To require an
|
|
212
|
-
exact toolchain, set `codeBuildOptions.nodejsVersion` and/or
|
|
213
|
-
`codeBuildOptions.npmVersion` to an exact `major.minor.patch` value. The
|
|
214
|
-
generated install phase checks the selected versions before installing project
|
|
215
|
-
dependencies; it does not install npm globally. These options affect only
|
|
216
|
-
generated buildspecs. A custom buildspec supplied through
|
|
217
|
-
`partialBuildSpecPath` or `vulnerabilityPartialBuildSpecPath` is responsible
|
|
218
|
-
for its own runtime and version checks.
|
|
60
|
+
Use `rio.RioFargateService` for ECS/Fargate services when possible.
|
|
219
61
|
|
|
220
62
|
### CloudFront certificates added in v9
|
|
221
63
|
|
|
@@ -224,7 +66,7 @@ DNS-validated ACM certificate in `us-east-1` for a stack in any region and
|
|
|
224
66
|
requires a public Route 53 hosted zone in the same account:
|
|
225
67
|
|
|
226
68
|
```typescript
|
|
227
|
-
import { CloudFrontCertificate } from '@rio-cloud/cdk-v2-constructs';
|
|
69
|
+
import { CloudFrontCertificate } from '@rio-cloud-internal/cdk-v2-constructs';
|
|
228
70
|
import { Distribution } from 'aws-cdk-lib/aws-cloudfront';
|
|
229
71
|
|
|
230
72
|
const certificate = new CloudFrontCertificate(this, 'CloudFrontCertificate', {
|
|
@@ -243,31 +85,6 @@ certificate. Use `certificateArn` only for integrations that require a string
|
|
|
243
85
|
ARN. Changing the domain or hosted zone replaces the certificate; validation
|
|
244
86
|
CNAME records are retained for renewal.
|
|
245
87
|
|
|
246
|
-
## Usage Guidance
|
|
247
|
-
|
|
248
|
-
### General
|
|
249
|
-
|
|
250
|
-
Prefer RIO constructs over raw AWS CDK constructs when the use case matches. These constructs encode RIO infrastructure defaults, Datadog tags, shared secrets, team and account SSM parameters, and monitoring conventions.
|
|
251
|
-
|
|
252
|
-
Do not set construct attributes explicitly when the value you plan to set is already the construct default. Prefer relying on defaults unless you are intentionally changing behavior and that intent is clear in the code.
|
|
253
|
-
|
|
254
|
-
Preserve the target repository's existing stack boundaries and scripts when maintaining an existing project.
|
|
255
|
-
|
|
256
|
-
### Observability
|
|
257
|
-
|
|
258
|
-
Watchful is RIO's monitoring and alerting abstraction. Prefer `rio.watchfulv2.Watchful` and `rio.datadogv2`. Use legacy `watchful` or `datadog` only when maintaining existing code that already depends on those APIs.
|
|
259
|
-
|
|
260
|
-
Do not add raw CloudWatch metrics, alarms, or monitoring resources for agent-generated changes. Use RIO monitoring constructs and Datadog-based abstractions for observability.
|
|
261
|
-
|
|
262
|
-
Treat `rio.SesObservability` logs as PII. Do not forward those logs to third-party services and do not extend retention beyond the construct default.
|
|
263
|
-
|
|
264
|
-
### RIO Infrastructure Defaults
|
|
265
|
-
|
|
266
|
-
RIO infrastructure defaults are the baseline VPC, hosted zone, and team/account values provided by the RIO environment. Use `rio.RioLandingZone` helpers for default VPC, hosted zone, team name, team identifier, team email, team alert Slack channel, and account name. Avoid hard-coded VPC IDs, hosted-zone IDs, or parameter names when a helper exists.
|
|
267
|
-
|
|
268
|
-
### Services
|
|
269
|
-
|
|
270
|
-
Use `rio.RioFargateService` for ECS/Fargate services when possible.
|
|
271
88
|
### Kafka
|
|
272
89
|
|
|
273
90
|
Use `rio.KafkaTopicV4` for new Kafka topics. Set audience and recovery policy deliberately.
|
package/lib/fargate/datadog.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import * as ecs from 'aws-cdk-lib/aws-ecs';
|
|
|
2
2
|
import type { Construct } from 'constructs';
|
|
3
3
|
import { DataDogLoggingMode, type RioFargateService } from './rio-fargate-service';
|
|
4
4
|
import type { RioFargateServiceBlueGreenAlpha } from './rio-fargate-service-blue-green-alpha';
|
|
5
|
+
import { type TraceSamplingOptions } from './trace-sampling';
|
|
5
6
|
/**
|
|
6
7
|
* @deprecated Moved out static methods and imporoved signature. Use named import instead.
|
|
7
8
|
*/
|
|
@@ -16,7 +17,7 @@ export declare class DataDog {
|
|
|
16
17
|
};
|
|
17
18
|
static addDatadogSidecar(scope: Construct, taskDefinition: ecs.TaskDefinition, accountName: string, teamName: string, teamIdentifier: string, stage: string, serviceName: string, version: string, datadogApiKey: ecs.Secret, datadogSite: string, datadogLoggingMode: DataDogLoggingMode, apmGetResourcesToIgnore: string[], cpu: number, memoryLimitMiB: number, essential: boolean, containerTag: string, additionalTags: {
|
|
18
19
|
[k: string]: string;
|
|
19
|
-
} | undefined, enableRestartPolicy: boolean, restartIgnoredExitCodes: number[]): ecs.ContainerDefinition;
|
|
20
|
+
} | undefined, enableRestartPolicy: boolean, restartIgnoredExitCodes: number[], traceSampling?: TraceSamplingOptions): ecs.ContainerDefinition;
|
|
20
21
|
static addFireLensLogRouter(taskDefinition: ecs.TaskDefinition, cpu: number, memoryLimitMiB: number, firelensConfigFilePath: string, firelensConfigBucketArn: string, serviceName: string): ecs.ContainerDefinition;
|
|
21
22
|
static setupLogging(scope: Construct, accountName: string, teamName: string, teamIdentifier: string, stage: string, serviceName: string, version: string, datadogApiKey: ecs.Secret, datadogLoggingMode: DataDogLoggingMode, datadogSite: string, containerType: 'service' | 'datadog-sidecar', additionalTags: {
|
|
22
23
|
[k: string]: string;
|
|
@@ -34,6 +35,7 @@ export declare function getFargateContainerEnvironmentVariables(props: {
|
|
|
34
35
|
additionalTags: {
|
|
35
36
|
[k: string]: string;
|
|
36
37
|
} | undefined;
|
|
38
|
+
traceSampling?: TraceSamplingOptions;
|
|
37
39
|
}): {
|
|
38
40
|
[key: string]: string;
|
|
39
41
|
};
|
|
@@ -66,6 +68,7 @@ export declare function addDatadogSidecar(props: {
|
|
|
66
68
|
} | undefined;
|
|
67
69
|
enableRestartPolicy: boolean;
|
|
68
70
|
restartIgnoredExitCodes: number[] | undefined;
|
|
71
|
+
traceSampling?: TraceSamplingOptions;
|
|
69
72
|
}): ecs.ContainerDefinition;
|
|
70
73
|
export declare function addFirelensConfigUploadFromS3Permissions(props: {
|
|
71
74
|
taskDefinition: ecs.TaskDefinition;
|
package/lib/fargate/datadog.js
CHANGED
|
@@ -16,6 +16,7 @@ const lambda = require("aws-cdk-lib/aws-lambda");
|
|
|
16
16
|
const logs = require("aws-cdk-lib/aws-logs");
|
|
17
17
|
const ssm = require("aws-cdk-lib/aws-ssm");
|
|
18
18
|
const rio_fargate_service_1 = require("./rio-fargate-service");
|
|
19
|
+
const trace_sampling_1 = require("./trace-sampling");
|
|
19
20
|
/**
|
|
20
21
|
* @deprecated Moved out static methods and imporoved signature. Use named import instead.
|
|
21
22
|
*/
|
|
@@ -35,7 +36,7 @@ class DataDog {
|
|
|
35
36
|
static getFargateDockerLabels(stage, serviceName, version) {
|
|
36
37
|
return getFargateDockerLabels({ stage, serviceName, version });
|
|
37
38
|
}
|
|
38
|
-
static addDatadogSidecar(scope, taskDefinition, accountName, teamName, teamIdentifier, stage, serviceName, version, datadogApiKey, datadogSite, datadogLoggingMode, apmGetResourcesToIgnore, cpu, memoryLimitMiB, essential, containerTag, additionalTags, enableRestartPolicy, restartIgnoredExitCodes) {
|
|
39
|
+
static addDatadogSidecar(scope, taskDefinition, accountName, teamName, teamIdentifier, stage, serviceName, version, datadogApiKey, datadogSite, datadogLoggingMode, apmGetResourcesToIgnore, cpu, memoryLimitMiB, essential, containerTag, additionalTags, enableRestartPolicy, restartIgnoredExitCodes, traceSampling) {
|
|
39
40
|
return addDatadogSidecar({
|
|
40
41
|
scope,
|
|
41
42
|
taskDefinition,
|
|
@@ -56,6 +57,7 @@ class DataDog {
|
|
|
56
57
|
additionalTags,
|
|
57
58
|
enableRestartPolicy,
|
|
58
59
|
restartIgnoredExitCodes,
|
|
60
|
+
traceSampling,
|
|
59
61
|
});
|
|
60
62
|
}
|
|
61
63
|
static addFireLensLogRouter(taskDefinition, cpu, memoryLimitMiB, firelensConfigFilePath, firelensConfigBucketArn, serviceName) {
|
|
@@ -105,7 +107,7 @@ function getFargateContainerEnvironmentVariables(props) {
|
|
|
105
107
|
accountId,
|
|
106
108
|
region,
|
|
107
109
|
}),
|
|
108
|
-
|
|
110
|
+
...(0, trace_sampling_1.getApplicationTraceSamplingEnvironment)(props.traceSampling),
|
|
109
111
|
};
|
|
110
112
|
}
|
|
111
113
|
// we add all possible service mappings here even if not used in a particular service to get globally unique names
|
|
@@ -155,6 +157,7 @@ function addDatadogSidecar(props) {
|
|
|
155
157
|
ECS_FARGATE: 'true',
|
|
156
158
|
DD_CLOUD_PROVIDER_METADATA: 'aws',
|
|
157
159
|
DD_REMOTE_CONFIGURATION_ENABLED: 'false',
|
|
160
|
+
...(0, trace_sampling_1.getAgentTraceSamplingEnvironment)(props.traceSampling),
|
|
158
161
|
},
|
|
159
162
|
// see https://github.com/DataDog/datadog-agent/blob/master/Dockerfiles/agent/amd64/Dockerfile#L171-L172
|
|
160
163
|
healthCheck: {
|
|
@@ -348,4 +351,4 @@ function ensureLoggingAndMonitoringAreReadyBeforeServiceStarts(rioFargateService
|
|
|
348
351
|
}
|
|
349
352
|
}
|
|
350
353
|
}
|
|
351
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWRvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYXJnYXRlL2RhdGFkb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMElBLDBGQTRCQztBQW1CRCx3REFRQztBQUVELDhDQXVFQztBQUVELDRGQVdDO0FBMkNELG9EQThDQztBQUVELG9DQXlHQztBQUVELHNIQXFCQztBQWxmRCw2Q0FBOEQ7QUFDOUQsMkNBQTJDO0FBQzNDLGlEQUF1RDtBQUN2RCwyQ0FBMkM7QUFDM0MsaURBQWlEO0FBQ2pELDZDQUE2QztBQUM3QywyQ0FBMkM7QUFFM0MsK0RBQW1GO0FBR25GOztHQUVHO0FBQ0gsTUFBYSxPQUFPO0lBQ1gsTUFBTSxDQUFDLHVDQUF1QyxDQUNuRCxLQUFnQixFQUNoQixLQUFhLEVBQ2IsV0FBbUIsRUFDbkIsT0FBZSxFQUNmLFdBQW1CLEVBQ25CLFFBQWdCLEVBQ2hCLGNBQXNCLEVBQ3RCLGNBQW1EO1FBRW5ELE9BQU8sdUNBQXVDLENBQUM7WUFDN0MsS0FBSztZQUNMLEtBQUs7WUFDTCxXQUFXO1lBQ1gsT0FBTztZQUNQLFdBQVc7WUFDWCxRQUFRO1lBQ1IsY0FBYztZQUNkLGNBQWM7U0FDZixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQWEsRUFBRSxXQUFtQixFQUFFLE9BQWU7UUFDdEYsT0FBTyxzQkFBc0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU0sTUFBTSxDQUFDLGlCQUFpQixDQUM3QixLQUFnQixFQUNoQixjQUFrQyxFQUNsQyxXQUFtQixFQUNuQixRQUFnQixFQUNoQixjQUFzQixFQUN0QixLQUFhLEVBQ2IsV0FBbUIsRUFDbkIsT0FBZSxFQUNmLGFBQXlCLEVBQ3pCLFdBQW1CLEVBQ25CLGtCQUFzQyxFQUN0Qyx1QkFBaUMsRUFDakMsR0FBVyxFQUNYLGNBQXNCLEVBQ3RC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Q3ZDLGFBQWEsRUFBRSxrQkFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7YUFDbEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBZ0IscURBQXFELENBQ25FLGlCQUFzRTtJQUV0RSxpQkFBaUIsQ0FBQywwQkFBMEIsQ0FBQyx3QkFBd0IsQ0FBQztRQUNwRSxTQUFTLEVBQUUsaUJBQWlCLENBQUMsaUNBQWlDO1FBQzlELFNBQVMsRUFBRSxHQUFHLENBQUMsNEJBQTRCLENBQUMsT0FBTztLQUNwRCxDQUFDLENBQUM7SUFFSCxJQUFJLGlCQUFpQixDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDbkQsaUJBQWlCLENBQUMsMEJBQTBCLENBQUMsd0JBQXdCLENBQUM7WUFDcEUsU0FBUyxFQUFFLGlCQUFpQixDQUFDLDRCQUE0QjtZQUN6RCxTQUFTLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixDQUFDLEtBQUs7U0FDbEQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxpQkFBaUIsQ0FBQyxpQ0FBaUMsQ0FBQyxlQUFlLEVBQUUsU0FBUyxLQUFLLGFBQWEsRUFBRSxDQUFDO1lBQ3JHLGlCQUFpQixDQUFDLGlDQUFpQyxDQUFDLHdCQUF3QixDQUFDO2dCQUMzRSxTQUFTLEVBQUUsaUJBQWlCLENBQUMsNEJBQTRCO2dCQUN6RCxTQUFTLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixDQUFDLEtBQUs7YUFDbEQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24sIEZuLCBTaXplLCBTdGFjaywgVGFncyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGVjcyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNzJztcbmltcG9ydCB7IEF3c0xvZ0RyaXZlck1vZGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNzJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0ICogYXMgc3NtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zc20nO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IERhdGFEb2dMb2dnaW5nTW9kZSwgdHlwZSBSaW9GYXJnYXRlU2VydmljZSB9IGZyb20gJy4vcmlvLWZhcmdhdGUtc2VydmljZSc7XG5pbXBvcnQgdHlwZSB7IFJpb0ZhcmdhdGVTZXJ2aWNlQmx1ZUdyZWVuQWxwaGEgfSBmcm9tICcuL3Jpby1mYXJnYXRlLXNlcnZpY2UtYmx1ZS1ncmVlbi1hbHBoYSc7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgTW92ZWQgb3V0IHN0YXRpYyBtZXRob2RzIGFuZCBpbXBvcm92ZWQgc2lnbmF0dXJlLiBVc2UgbmFtZWQgaW1wb3J0IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhRG9nIHtcbiAgcHVibGljIHN0YXRpYyBnZXRGYXJnYXRlQ29udGFpbmVyRW52aXJvbm1lbnRWYXJpYWJsZXMoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBzdGFnZTogc3RyaW5nLFxuICAgIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICAgdmVyc2lvbjogc3RyaW5nLFxuICAgIGFjY291bnROYW1lOiBzdHJpbmcsXG4gICAgdGVhbU5hbWU6IHN0cmluZyxcbiAgICB0ZWFtSWRlbnRpZmllcjogc3RyaW5nLFxuICAgIGFkZGl0aW9uYWxUYWdzOiB7IFtrOiBzdHJpbmddOiBzdHJpbmcgfSB8IHVuZGVmaW5lZFxuICApOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICByZXR1cm4gZ2V0RmFyZ2F0ZUNvbnRhaW5lckVudmlyb25tZW50VmFyaWFibGVzKHtcbiAgICAgIHNjb3BlLFxuICAgICAgc3RhZ2UsXG4gICAgICBzZXJ2aWNlTmFtZSxcbiAgICAgIHZlcnNpb24sXG4gICAgICBhY2NvdW50TmFtZSxcbiAgICAgIHRlYW1OYW1lLFxuICAgICAgdGVhbUlkZW50aWZpZXIsXG4gICAgICBhZGRpdGlvbmFsVGFncyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0RmFyZ2F0ZURvY2tlckxhYmVscyhzdGFnZTogc3RyaW5nLCBzZXJ2aWNlTmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICByZXR1cm4gZ2V0RmFyZ2F0ZURvY2tlckxhYmVscyh7IHN0YWdlLCBzZXJ2aWNlTmFtZSwgdmVyc2lvbiB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYWRkRGF0YWRvZ1NpZGVjYXIoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICB0YXNrRGVmaW5pdGlvbjogZWNzLlRhc2tEZWZpbml0aW9uLFxuICAgIGFjY291bnROYW1lOiBzdHJpbmcsXG4gICAgdGVhbU5hbWU6IHN0cmluZyxcbiAgICB0ZWFtSWRlbnRpZmllcjogc3RyaW5nLFxuICAgIHN0YWdlOiBzdHJpbmcsXG4gICAgc2VydmljZU5hbWU6IHN0cmluZyxcbiAgICB2ZXJzaW9uOiBzdHJpbmcsXG4gICAgZGF0YWRvZ0FwaUtleTogZWNzLlNlY3JldCxcbiAgICBkYXRhZG9nU2l0ZTogc3RyaW5nLFxuICAgIGRhdGFkb2dMb2dnaW5nTW9kZTogRGF0YURvZ0xvZ2dpbmdNb2RlLFxuICAgIGFwbUdldFJlc291cmNlc1RvSWdub3JlOiBzdHJpbmdbXSxcbiAgICBjcHU6IG51bWJlcixcbiAgICBtZW1vcnlMaW1pdE1pQjogbnVtYmVyLFxuICAgIGVzc2VudGlhbDogYm9vbGVhbixcbiAgICBjb250YWluZXJUYWc6IHN0cmluZyxcbiAgICBhZGRpdGlvbmFsVGFnczogeyBbazogc3RyaW5nXTogc3RyaW5nIH0gfCB1bmRlZmluZWQsXG4gICAgZW5hYmxlUmVzdGFydFBvbGljeTogYm9vbGVhbixcbiAgICByZXN0YXJ0SWdub3JlZEV4aXRDb2RlczogbnVtYmVyW11cbiAgKTogZWNzLkNvbnRhaW5lckRlZmluaXRpb24ge1xuICAgIHJldHVybiBhZGREYXRhZG9nU2lkZWNhcih7XG4gICAgICBzY29wZSxcbiAgICAgIHRhc2tEZWZpbml0aW9uLFxuICAgICAgYWNjb3VudE5hbWUsXG4gICAgICB0ZWFtTmFtZSxcbiAgICAgIHRlYW1JZGVudGlmaWVyLFxuICAgICAgc3RhZ2UsXG4gICAgICBzZXJ2aWNlTmFtZSxcbiAgICAgIHZlcnNpb24sXG4gICAgICBkYXRhZG9nQXBpS2V5LFxuICAgICAgZGF0YWRvZ1NpdGUsXG4gICAgICBkYXRhZG9nTG9nZ2luZ01vZGUsXG4gICAgICBhcG1HZXRSZXNvdXJjZXNUb0lnbm9yZSxcbiAgICAgIGNwdSxcbiAgICAgIG1lbW9yeUxpbWl0TWlCLFxuICAgICAgZXNzZW50aWFsLFxuICAgICAgY29udGFpbmVyVGFnLFxuICAgICAgYWRkaXRpb25hbFRhZ3MsXG4gICAgICBlbmFibGVSZXN0YXJ0UG9saWN5LFxuICAgICAgcmVzdGFydElnbm9yZWRFeGl0Q29kZXMsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFkZEZpcmVMZW5zTG9nUm91dGVyKFxuICAgIHRhc2tEZWZpbml0aW9uOiBlY3MuVGFza0RlZmluaXRpb24sXG4gICAgY3B1OiBudW1iZXIsXG4gICAgbWVtb3J5TGltaXRNaUI6IG51bWJlcixcbiAgICBmaXJlbGVuc0NvbmZpZ0ZpbGVQYXRoOiBzdHJpbmcsXG4gICAgZmlyZWxlbnNDb25maWdCdWNrZXRBcm46IHN0cmluZyxcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nXG4gICk6IGVjcy5Db250YWluZXJEZWZpbml0aW9uIHtcbiAgICByZXR1cm4gYWRkRmlyZUxlbnNMb2dSb3V0ZXIoe1xuICAgICAgdGFza0RlZmluaXRpb24sXG4gICAgICBjcHUsXG4gICAgICBtZW1vcnlMaW1pdE1pQixcbiAgICAgIGZpcmVsZW5zQ29uZmlnRmlsZVBhdGgsXG4gICAgICBmaXJlbGVuc0NvbmZpZ0J1Y2tldEFybixcbiAgICAgIHNlcnZpY2VOYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzZXR1cExvZ2dpbmcoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBhY2NvdW50TmFtZTogc3RyaW5nLFxuICAgIHRlYW1OYW1lOiBzdHJpbmcsXG4gICAgdGVhbUlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBzdGFnZTogc3RyaW5nLFxuICAgIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICAgdmVyc2lvbjogc3RyaW5nLFxuICAgIGRhdGFkb2dBcGlLZXk6IGVjcy5TZWNyZXQsXG4gICAgZGF0YWRvZ0xvZ2dpbmdNb2RlOiBEYXRhRG9nTG9nZ2luZ01vZGUsXG4gICAgZGF0YWRvZ1NpdGU6IHN0cmluZyxcbiAgICBjb250YWluZXJUeXBlOiAnc2VydmljZScgfCAnZGF0YWRvZy1zaWRlY2FyJyxcbiAgICBhZGRpdGlvbmFsVGFnczogeyBbazogc3RyaW5nXTogc3RyaW5nIH0gfCB1bmRlZmluZWRcbiAgKTogZWNzLkxvZ0RyaXZlciB7XG4gICAgcmV0dXJuIHNldHVwTG9nZ2luZyh7XG4gICAgICBzY29wZSxcbiAgICAgIGFjY291bnROYW1lLFxuICAgICAgdGVhbU5hbWUsXG4gICAgICB0ZWFtSWRlbnRpZmllcixcbiAgICAgIHN0YWdlLFxuICAgICAgc2VydmljZU5hbWUsXG4gICAgICB2ZXJzaW9uLFxuICAgICAgZGF0YWRvZ0FwaUtleSxcbiAgICAgIGRhdGFkb2dMb2dnaW5nTW9kZSxcbiAgICAgIGRhdGFkb2dTaXRlLFxuICAgICAgY29udGFpbmVyVHlwZSxcbiAgICAgIGFkZGl0aW9uYWxUYWdzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBlbnN1cmVMb2dnaW5nQW5kTW9uaXRvcmluZ0FyZVJlYWR5QmVmb3JlU2VydmljZVN0YXJ0cyhyaW9GYXJnYXRlU2VydmljZTogUmlvRmFyZ2F0ZVNlcnZpY2UpIHtcbiAgICBlbnN1cmVMb2dnaW5nQW5kTW9uaXRvcmluZ0FyZVJlYWR5QmVmb3JlU2VydmljZVN0YXJ0cyhyaW9GYXJnYXRlU2VydmljZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZhcmdhdGVDb250YWluZXJFbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9wczoge1xuICBzY29wZTogQ29uc3RydWN0O1xuICBzdGFnZTogc3RyaW5nO1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIGFjY291bnROYW1lOiBzdHJpbmc7XG4gIHRlYW1OYW1lOiBzdHJpbmc7XG4gIHRlYW1JZGVudGlmaWVyOiBzdHJpbmc7XG4gIGFkZGl0aW9uYWxUYWdzOiB7IFtrOiBzdHJpbmddOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbn0pOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgY29uc3QgeyBhY2NvdW50OiBhY2NvdW50SWQsIHJlZ2lvbiB9ID0gU3RhY2sub2YocHJvcHMuc2NvcGUpO1xuXG4gIHJldHVybiB7XG4gICAgLy8gdW5pZmllZCB0YWdnaW5nLCBzZWUgaHR0cHM6Ly9kb2NzLmRhdGFkb2docS5jb20vZ2V0dGluZ19zdGFydGVkL3RhZ2dpbmcvdW5pZmllZF9zZXJ2aWNlX3RhZ2dpbmcvP3RhYj1lY3NcbiAgICBERF9FTlY6IHByb3BzLnN0YWdlLFxuICAgIEREX1NFUlZJQ0U6IHByb3BzLnNlcnZpY2VOYW1lLFxuICAgIEREX1ZFUlNJT046IHByb3BzLnZlcnNpb24sXG4gICAgLy8gQVBNIGFuZCB0cmFjaW5nLCBzZWUgaHR0cHM6Ly9kb2NzLmRhdGFkb2docS5jb20vdHJhY2luZy9zZXR1cF9vdmVydmlldy9zZXR1cC9qYXZhLz90YWI9Y29udGFpbmVyc1xuICAgIEREX0xPR1NfSU5KRUNUSU9OOiAndHJ1ZScsXG4gICAgRERfU0VSVklDRV9NQVBQSU5HOiBnZXRBcG1TZXJ2aWNlTWFwcGluZ0Vudmlyb25tZW50VmFyaWFibGVWYWx1ZShwcm9wcy5zZXJ2aWNlTmFtZSksXG4gICAgRERfVEFHUzogZ2V0VGFnc0Vudmlyb25tZW50VmFyaWFibGVWYWx1ZSh7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGNvbnRhaW5lclR5cGU6ICdzZXJ2aWNlJyxcbiAgICAgIGFjY291bnRJZCxcbiAgICAgIHJlZ2lvbixcbiAgICB9KSxcbiAgICBERF9UUkFDRV9TQU1QTEVfUkFURTogJzEuMCcsIC8vIHNlZSBodHRwczovL2RkdHJhY2UucmVhZHRoZWRvY3MuaW8vZW4vc3RhYmxlL2NvbmZpZ3VyYXRpb24uaHRtbFxuICB9O1xufVxuXG4vLyB3ZSBhZGQgYWxsIHBvc3NpYmxlIHNlcnZpY2UgbWFwcGluZ3MgaGVyZSBldmVuIGlmIG5vdCB1c2VkIGluIGEgcGFydGljdWxhciBzZXJ2aWNlIHRvIGdldCBnbG9iYWxseSB1bmlxdWUgbmFtZXNcbmZ1bmN0aW9uIGdldEFwbVNlcnZpY2VNYXBwaW5nRW52aXJvbm1lbnRWYXJpYWJsZVZhbHVlKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzZXJ2aWNlTWFwcGluZyA9IHtcbiAgICBkYXRhYmFzZTogYCR7c2VydmljZU5hbWV9LWF1cm9yYWAsXG4gICAgJ2phdmEtYXdzLXNkayc6IGAke3NlcnZpY2VOYW1lfS1hd3Mtc2RrYCxcbiAgICBrYWZrYTogYCR7c2VydmljZU5hbWV9LWthZmthYCxcbiAgICBteXNxbDogYCR7c2VydmljZU5hbWV9LWF1cm9yYWAsXG4gICAgcmVkaXM6IGAke3NlcnZpY2VOYW1lfS1yZWRpc2AsXG4gICAgJ2F3cy5keW5hbW9kYic6IGAke3NlcnZpY2VOYW1lfS1keW5hbW9kYmAsXG4gICAgbW9uZ286IGAke3NlcnZpY2VOYW1lfS1kb2N1bWVudGRiYCxcbiAgfTtcblxuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoc2VydmljZU1hcHBpbmcpXG4gICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9OiR7dmFsdWV9YClcbiAgICAuam9pbignLCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmFyZ2F0ZURvY2tlckxhYmVscyhwcm9wczogeyBzdGFnZTogc3RyaW5nOyBzZXJ2aWNlTmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfSk6IHtcbiAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xufSB7XG4gIHJldHVybiB7XG4gICAgJ2NvbS5kYXRhZG9naHEudGFncy5lbnYnOiBwcm9wcy5zdGFnZSxcbiAgICAnY29tLmRhdGFkb2docS50YWdzLnNlcnZpY2UnOiBwcm9wcy5zZXJ2aWNlTmFtZSxcbiAgICAnY29tLmRhdGFkb2docS50YWdzLnZlcnNpb24nOiBwcm9wcy52ZXJzaW9uLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkRGF0YWRvZ1NpZGVjYXIocHJvcHM6IHtcbiAgc2NvcGU6IENvbnN0cnVjdDtcbiAgdGFza0RlZmluaXRpb246IGVjcy5UYXNrRGVmaW5pdGlvbjtcbiAgYWNjb3VudE5hbWU6IHN0cmluZztcbiAgdGVhbU5hbWU6IHN0cmluZztcbiAgdGVhbUlkZW50aWZpZXI6IHN0cmluZztcbiAgc3RhZ2U6IHN0cmluZztcbiAgc2VydmljZU5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBkYXRhZG9nQXBpS2V5OiBlY3MuU2VjcmV0O1xuICBkYXRhZG9nU2l0ZTogc3RyaW5nO1xuICBkYXRhZG9nTG9nZ2luZ01vZGU6IERhdGFEb2dMb2dnaW5nTW9kZTtcbiAgYXBtR2V0UmVzb3VyY2VzVG9JZ25vcmU6IHN0cmluZ1tdO1xuICBjcHU6IG51bWJlcjtcbiAgbWVtb3J5TGltaXRNaUI6IG51bWJlcjtcbiAgZXNzZW50aWFsOiBib29sZWFuO1xuICBjb250YWluZXJUYWc6IHN0cmluZztcbiAgYWRkaXRpb25hbFRhZ3M6IHsgW2s6IHN0cmluZ106IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICBlbmFibGVSZXN0YXJ0UG9saWN5OiBib29sZWFuO1xuICByZXN0YXJ0SWdub3JlZEV4aXRDb2RlczogbnVtYmVyW10gfCB1bmRlZmluZWQ7XG59KTogZWNzLkNvbnRhaW5lckRlZmluaXRpb24ge1xuICBjb25zdCB7IGFjY291bnQ6IGFjY291bnRJZCwgcmVnaW9uIH0gPSBTdGFjay5vZihwcm9wcy5zY29wZSk7XG4gIGNvbnN0IGRhdGFkb2dTaWRlY2FyID0gcHJvcHMudGFza0RlZmluaXRpb24uYWRkQ29udGFpbmVyKCdkYXRhZG9nLWFnZW50Jywge1xuICAgIGltYWdlOiBlY3MuQ29udGFpbmVySW1hZ2UuZnJvbVJlZ2lzdHJ5KGBwdWJsaWMuZWNyLmF3cy9kYXRhZG9nL2FnZW50OiR7cHJvcHMuY29udGFpbmVyVGFnfWApLFxuICAgIGVuYWJsZVJlc3RhcnRQb2xpY3k6IHByb3BzLmVuYWJsZVJlc3RhcnRQb2xpY3ksXG4gICAgcmVzdGFydElnbm9yZWRFeGl0Q29kZXM6IHByb3BzLnJlc3RhcnRJZ25vcmVkRXhpdENvZGVzLFxuICAgIGxvZ2dpbmc6IHNldHVwTG9nZ2luZyh7IC4uLnByb3BzLCBjb250YWluZXJUeXBlOiAnZGF0YWRvZy1zaWRlY2FyJyB9KSxcbiAgICBjcHU6IHByb3BzLmNwdSxcbiAgICBtZW1vcnlMaW1pdE1pQjogcHJvcHMubWVtb3J5TGltaXRNaUIsXG4gICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgIC8vIHVuaWZpZWQgdGFnZ2luZywgc2VlIGh0dHBzOi8vZG9jcy5kYXRhZG9naHEuY29tL2dldHRpbmdfc3RhcnRlZC90YWdnaW5nL3VuaWZpZWRfc2VydmljZV90YWdnaW5nLz90YWI9ZWNzXG4gICAgICBERF9FTlY6IHByb3BzLnN0YWdlLFxuICAgICAgRERfU0VSVklDRTogcHJvcHMuc2VydmljZU5hbWUsXG4gICAgICBERF9WRVJTSU9OOiBwcm9wcy52ZXJzaW9uLFxuICAgICAgLy8gQVBNIGFuZCB0cmFjaW5nIHNlZSBodHRwczovL2RvY3MuZGF0YWRvZ2hxLmNvbS9hZ2VudC9kb2NrZXIvYXBtLz90YWI9bGludXhcbiAgICAgIEREX0FQTV9FTkFCTEVEOiAndHJ1ZScsXG4gICAgICBERF9BUE1fSUdOT1JFX1JFU09VUkNFUzogcHJvcHMuYXBtR2V0UmVzb3VyY2VzVG9JZ25vcmVcbiAgICAgICAgLm1hcChhcG1HZXRSZXNvdXJjZVRvSWdub3JlID0+IGBHRVQgJHthcG1HZXRSZXNvdXJjZVRvSWdub3JlfWApXG4gICAgICAgIC5qb2luKCcsJyksXG4gICAgICAvLyBnZW5lcmFsIHNldHRpbmdzXG4gICAgICBERF9TSVRFOiBwcm9wcy5kYXRhZG9nU2l0ZSxcbiAgICAgIEREX1RBR1M6IGdldFRhZ3NFbnZpcm9ubWVudFZhcmlhYmxlVmFsdWUoeyAuLi5wcm9wcywgYWNjb3VudElkLCByZWdpb24sIGNvbnRhaW5lclR5cGU6ICdkYXRhZG9nLXNpZGVjYXInIH0pLFxuICAgICAgRUNTX0ZBUkdBVEU6ICd0cnVlJyxcbiAgICAgIEREX0NMT1VEX1BST1ZJREVSX01FVEFEQVRBOiAnYXdzJyxcbiAgICAgIEREX1JFTU9URV9DT05GSUdVUkFUSU9OX0VOQUJMRUQ6ICdmYWxzZScsXG4gICAgfSxcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0RhdGFEb2cvZGF0YWRvZy1hZ2VudC9ibG9iL21hc3Rlci9Eb2NrZXJmaWxlcy9hZ2VudC9hbWQ2NC9Eb2NrZXJmaWxlI0wxNzEtTDE3MlxuICAgIGhlYWx0aENoZWNrOiB7XG4gICAgICBzdGFydFBlcmlvZDogRHVyYXRpb24ubWludXRlcygyKSxcbiAgICAgIGludGVydmFsOiBEdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICByZXRyaWVzOiAyLFxuICAgICAgY29tbWFuZDogWydDTUQtU0hFTEwnLCAnL3Byb2JlLnNoJ10sXG4gICAgfSxcbiAgICBzZWNyZXRzOiB7XG4gICAgICBERF9BUElfS0VZOiBwcm9wcy5kYXRhZG9nQXBpS2V5LFxuICAgIH0sXG4gICAgZXNzZW50aWFsOiBwcm9wcy5lc3NlbnRpYWwsXG4gIH0pO1xuXG4gIGRhdGFkb2dTaWRlY2FyLmFkZFBvcnRNYXBwaW5ncyh7XG4gICAgY29udGFpbmVyUG9ydDogODEyNSxcbiAgICBwcm90b2NvbDogZWNzLlByb3RvY29sLlVEUCxcbiAgfSk7XG5cbiAgZGF0YWRvZ1NpZGVjYXIuYWRkUG9ydE1hcHBpbmdzKHtcbiAgICBjb250YWluZXJQb3J0OiA4MTI2LFxuICAgIHByb3RvY29sOiBlY3MuUHJvdG9jb2wuVENQLFxuICB9KTtcblxuICByZXR1cm4gZGF0YWRvZ1NpZGVjYXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRGaXJlbGVuc0NvbmZpZ1VwbG9hZEZyb21TM1Blcm1pc3Npb25zKHByb3BzOiB7XG4gIHRhc2tEZWZpbml0aW9uOiBlY3MuVGFza0RlZmluaXRpb247XG4gIGZpcmVsZW5zQ29uZmlnQnVja2V0QXJuOiBzdHJpbmc7XG59KSB7XG4gIHByb3BzLnRhc2tEZWZpbml0aW9uLmFkZFRvVGFza1JvbGVQb2xpY3koXG4gICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgcmVzb3VyY2VzOiBbcHJvcHMuZmlyZWxlbnNDb25maWdCdWNrZXRBcm4sIGAke3Byb3BzLmZpcmVsZW5zQ29uZmlnQnVja2V0QXJufS8qYF0sXG4gICAgICBhY3Rpb25zOiBbJ3MzOkdldConXSxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICB9KVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRUYWdzRW52aXJvbm1lbnRWYXJpYWJsZVZhbHVlKHByb3BzOiB7XG4gIGFjY291bnRJZDogc3RyaW5nO1xuICBhY2NvdW50TmFtZTogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgdGVhbU5hbWU6IHN0cmluZztcbiAgdGVhbUlkZW50aWZpZXI6IHN0cmluZztcbiAgc3RhZ2U6IHN0cmluZztcbiAgc2VydmljZU5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBjb250YWluZXJUeXBlOiAnc2VydmljZScgfCAnZGF0YWRvZy1zaWRlY2FyJyB8ICdmbHVlbnQtYml0JztcbiAgYWRkaXRpb25hbFRhZ3M6IHsgW2s6IHN0cmluZ106IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xufSk6IHN0cmluZyB7XG4gIGNvbnN0IHNlcGFyYXRvciA9IGRldGVybWluZVNlcGFyYXRvcihwcm9wcy5jb250YWluZXJUeXBlKTtcblxuICBjb25zdCB0YWdzID0ge1xuICAgIC8vIHVuaWZpZWQgdGFnZ2luZ1xuICAgIC8vIG92ZXJyaWRkZW4gYnkgZGVkaWNhdGVkIHNldHRpbmdzIChlbnZpcm9ubWVudCB2YXJpYWJsZXMvdGFncylcbiAgICAvLyBkdXBsaWNhdGVkIGhlcmUgdG8gZW5zdXJlIHRoZXkgYXJlIHVzZWQgKGFuZCBzb21ldGltZXMsIG5vdCBhbGwgdGhyZWUgdmFsdWVzIGFyZSBzdXBwb3J0ZWQpXG4gICAgZW52OiBwcm9wcy5zdGFnZSxcbiAgICBzZXJ2aWNlOiBwcm9wcy5zZXJ2aWNlTmFtZSxcbiAgICB2ZXJzaW9uOiBwcm9wcy52ZXJzaW9uLFxuICAgIC8vIGFjY291bnQvdGVhbSBzcGVjaWZpYyBwYXJ0c1xuICAgIGFjY291bnRfaWQ6IHByb3BzLmFjY291bnRJZCxcbiAgICBhY2NvdW50X25hbWU6IHByb3BzLmFjY291bnROYW1lLFxuICAgIHJlZ2lvbjogcHJvcHMucmVnaW9uLFxuICAgIHRlYW06IHByb3BzLnRlYW1OYW1lLFxuICAgIHRlYW1faWRlbnRpZmllcjogcHJvcHMudGVhbUlkZW50aWZpZXIsXG4gIH07XG4gIHJldHVybiBPYmplY3QuZW50cmllcyh7IC4uLnRhZ3MsIC4uLnByb3BzLmFkZGl0aW9uYWxUYWdzIH0pXG4gICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9OiR7dmFsdWV9YClcbiAgICAuam9pbihzZXBhcmF0b3IpO1xufVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVTZXBhcmF0b3IoY29udGFpbmVyVHlwZTogJ3NlcnZpY2UnIHwgJ2RhdGFkb2ctc2lkZWNhcicgfCAnZmx1ZW50LWJpdCcpIHtcbiAgaWYgKGNvbnRhaW5lclR5cGUgPT09ICdkYXRhZG9nLXNpZGVjYXInKSB7XG4gICAgcmV0dXJuICcgJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gJywnO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRGaXJlTGVuc0xvZ1JvdXRlcihwcm9wczoge1xuICB0YXNrRGVmaW5pdGlvbjogZWNzLlRhc2tEZWZpbml0aW9uO1xuICBjcHU6IG51bWJlcjtcbiAgbWVtb3J5TGltaXRNaUI6IG51bWJlcjtcbiAgZmlyZWxlbnNDb25maWdCdWNrZXRBcm46IHN0cmluZztcbiAgZmlyZWxlbnNDb25maWdGaWxlUGF0aDogc3RyaW5nO1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xufSk6IGVjcy5Db250YWluZXJEZWZpbml0aW9uIHtcbiAgY29uc3QgZmx1ZW50Qml0UzNDb25maWdGaWxlID0gcHJvcHMuZmlyZWxlbnNDb25maWdCdWNrZXRBcm4gKyBwcm9wcy5maXJlbGVuc0NvbmZpZ0ZpbGVQYXRoO1xuXG4gIGNvbnN0IGZpcmVMZW5zTG9nUm91dGVySW1hZ2UgPSBzc20uU3RyaW5nUGFyYW1ldGVyLmZyb21TdHJpbmdQYXJhbWV0ZXJBdHRyaWJ1dGVzKFxuICAgIHByb3BzLnRhc2tEZWZpbml0aW9uLFxuICAgICdGbHVlbnRCaXRJbWFnZVRhZycsXG4gICAge1xuICAgICAgcGFyYW1ldGVyTmFtZTogJy9hd3Mvc2VydmljZS9hd3MtZm9yLWZsdWVudC1iaXQvaW5pdC0yLjMyLjIuMjAyNDA4MjAnLFxuICAgICAgLy8gSWYgdGhpcyBwcm9wZXJ0eSBpcyBub3Qgc2V0LCBpdCB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGxhdGVzdCB2ZXJzaW9uLlxuICAgICAgLy8gVGhpcyBsZWFkcyB0byBhIG5vbi1kZXRlcm1pbmlzdGljIGJlaGF2aW9yLlxuICAgICAgLy8gVXBkYXRpbmcgdGhpcyBuYW1lL3ZlcnNpb24gaXMgYSBwb3RlbnRpYWwgYnJlYWtpbmcgY2hhbmdlXG4gICAgICB2ZXJzaW9uOiAxLFxuICAgIH1cbiAgKS5zdHJpbmdWYWx1ZTtcblxuICByZXR1cm4gcHJvcHMudGFza0RlZmluaXRpb24uYWRkRmlyZWxlbnNMb2dSb3V0ZXIoJ2ZpcmVsZW5zLWxvZy1yb3V0ZXInLCB7XG4gICAgaW1hZ2U6IGVjcy5Db250YWluZXJJbWFnZS5mcm9tUmVnaXN0cnkoZmlyZUxlbnNMb2dSb3V0ZXJJbWFnZSksXG4gICAgZmlyZWxlbnNDb25maWc6IHtcbiAgICAgIHR5cGU6IGVjcy5GaXJlbGVuc0xvZ1JvdXRlclR5cGUuRkxVRU5UQklULFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBlbmFibGVFQ1NMb2dNZXRhZGF0YTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcHU6IHByb3BzLmNwdSxcbiAgICBtZW1vcnlMaW1pdE1pQjogcHJvcHMubWVtb3J5TGltaXRNaUIsXG4gICAgbG9nZ2luZzogZWNzLkxvZ0RyaXZlcnMuYXdzTG9ncyh7XG4gICAgICBsb2dHcm91cDogbmV3IGxvZ3MuTG9nR3JvdXAocHJvcHMudGFza0RlZmluaXRpb24sICdGaXJlbGVuc0xvZ1JvdXRlckxvZ0dyb3VwJywge1xuICAgICAgICBsb2dHcm91cE5hbWU6IGAke3Byb3BzLnNlcnZpY2VOYW1lfS1maXJlbGVucy1sb2ctcm91dGVyYCxcbiAgICAgIH0pLFxuICAgICAgc3RyZWFtUHJlZml4OiAnZmlyZWxlbnMtbG9nLXJvdXRlcicsXG4gICAgICBtb2RlOiBBd3NMb2dEcml2ZXJNb2RlLk5PTl9CTE9DS0lORyxcbiAgICB9KSxcbiAgICBoZWFsdGhDaGVjazoge1xuICAgICAgY29tbWFuZDogWydDTUQtU0hFTEwnLCAnY3VybCAtLWZhaWwgLS1zaWxlbnQgaHR0cDovLzEyNy4wLjAuMToyMDIwL2FwaS92MS9oZWFsdGggfHwgZXhpdCAxJ10sXG4gICAgfSxcbiAgICBlbnZpcm9ubWVudDoge1xuICAgICAgYXdzX2ZsdWVudF9iaXRfaW5pdF9zM18xOiBmbHVlbnRCaXRTM0NvbmZpZ0ZpbGUsXG4gICAgfSxcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cExvZ2dpbmcocHJvcHM6IHtcbiAgc2NvcGU6IENvbnN0cnVjdDtcbiAgYWNjb3VudE5hbWU6IHN0cmluZztcbiAgdGVhbU5hbWU6IHN0cmluZztcbiAgdGVhbUlkZW50aWZpZXI6IHN0cmluZztcbiAgc3RhZ2U6IHN0cmluZztcbiAgc2VydmljZU5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBkYXRhZG9nQXBpS2V5OiBlY3MuU2VjcmV0O1xuICBkYXRhZG9nTG9nZ2luZ01vZGU6IERhdGFEb2dMb2dnaW5nTW9kZTtcbiAgZGF0YWRvZ1NpdGU6IHN0cmluZztcbiAgY29udGFpbmVyVHlwZTogJ3NlcnZpY2UnIHwgJ2RhdGFkb2ctc2lkZWNhcic7XG4gIGFkZGl0aW9uYWxUYWdzOiB7IFtrOiBzdHJpbmddOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbn0pOiBlY3MuTG9nRHJpdmVyIHtcbiAgbGV0IGxvZ0dyb3VwTmFtZTogc3RyaW5nO1xuICBsZXQgbG9nR3JvdXBJZDogc3RyaW5nO1xuICBsZXQgY29udGFpbmVyVHlwZUNhbWVsQ2FzZTogc3RyaW5nO1xuXG4gIHN3aXRjaCAocHJvcHMuY29udGFpbmVyVHlwZSkge1xuICAgIGNhc2UgJ3NlcnZpY2UnOlxuICAgICAgbG9nR3JvdXBJZCA9ICdMb2dHcm91cEZvclNlcnZpY2UnO1xuICAgICAgbG9nR3JvdXBOYW1lID0gcHJvcHMuc2VydmljZU5hbWU7XG4gICAgICBjb250YWluZXJUeXBlQ2FtZWxDYXNlID0gJ1NlcnZpY2UnO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkYXRhZG9nLXNpZGVjYXInOlxuICAgICAgbG9nR3JvdXBJZCA9ICdMb2dHcm91cEZvckRhdGFkb2dTaWRlY2FyJztcbiAgICAgIGxvZ0dyb3VwTmFtZSA9IGAke3Byb3BzLnNlcnZpY2VOYW1lfS0ke3Byb3BzLmNvbnRhaW5lclR5cGV9YDtcbiAgICAgIGNvbnRhaW5lclR5cGVDYW1lbENhc2UgPSAnRGF0YWRvZ1NpZGVjYXInO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICBjb25zdCB7IGFjY291bnQ6IGFjY291bnRJZCwgcmVnaW9uIH0gPSBTdGFjay5vZihwcm9wcy5zY29wZSk7XG5cbiAgc3dpdGNoIChwcm9wcy5kYXRhZG9nTG9nZ2luZ01vZGUpIHtcbiAgICBjYXNlIERhdGFEb2dMb2dnaW5nTW9kZS5BV1NfRklSRV9MRU5TOlxuICAgICAgLy8gVE9ETyBjYW4gd2UgdXNlIGBzZWNyZXRPcHRpb25zYCBoZXJlIGFzIHdlbGwsIGUuZy4gYXMgaW4gaHR0cHM6Ly9naXRodWIuY29tL2F3cy1zYW1wbGVzL2FtYXpvbi1lY3MtZmlyZWxlbnMtZXhhbXBsZXMvYmxvYi9tYWlubGluZS9leGFtcGxlcy9mbHVlbnQtYml0L2RhdGFkb2cvdGFzay1kZWZpbml0aW9uLmpzb24jTDMzLUwzNlxuICAgICAgLy8gUHJvYmFibHkgbm90LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy84MTc0XG4gICAgICByZXR1cm4gZWNzLkxvZ0RyaXZlcnMuZmlyZWxlbnMoe1xuICAgICAgICAvLyBzZWUgaHR0cHM6Ly9kb2NzLmRhdGFkb2docS5jb20vaW50ZWdyYXRpb25zL2ZsdWVudGJpdC8jY29uZmlndXJhdGlvbi1wYXJhbWV0ZXJzXG4gICAgICAgIHNlY3JldE9wdGlvbnM6IHtcbiAgICAgICAgICBhcGlLZXk6IHByb3BzLmRhdGFkb2dBcGlLZXksXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBOYW1lOiAnZGF0YWRvZycsXG4gICAgICAgICAgTWF0Y2g6ICcqJyxcbiAgICAgICAgICBIb3N0OiBgaHR0cC1pbnRha2UubG9ncy4ke3Byb3BzLmRhdGFkb2dTaXRlfWAsXG4gICAgICAgICAgVExTOiAnb24nLFxuICAgICAgICAgIGNvbXByZXNzOiAnZ3ppcCcsXG4gICAgICAgICAgZGRfc2VydmljZTogbG9nR3JvdXBOYW1lLFxuICAgICAgICAgIGRkX3NvdXJjZTogJ3Jpby1mYXJnYXRlJyxcbiAgICAgICAgICBkZF9tZXNzYWdlX2tleTogJ2xvZycsXG4gICAgICAgICAgZGRfdGFnczogZ2V0VGFnc0Vudmlyb25tZW50VmFyaWFibGVWYWx1ZSh7IC4uLnByb3BzLCBhY2NvdW50SWQsIHJlZ2lvbiwgY29udGFpbmVyVHlwZTogJ2ZsdWVudC1iaXQnIH0pLFxuICAgICAgICAgIHByb3ZpZGVyOiAnZWNzJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgY2FzZSBEYXRhRG9nTG9nZ2luZ01vZGUuRk9SV0FSREVSX0xBTUJEQTpcbiAgICBjYXNlIERhdGFEb2dMb2dnaW5nTW9kZS5EQVRBRE9HX0ZPUldBUkRFUl9MQU1CREE6IHtcbiAgICAgIGNvbnN0IGxvZ0dyb3VwRm9yRm9yd2FyZGluZ0xhbWJkYSA9IG5ldyBsb2dzLkxvZ0dyb3VwKHByb3BzLnNjb3BlLCBsb2dHcm91cElkLCB7XG4gICAgICAgIGxvZ0dyb3VwTmFtZSxcbiAgICAgICAgcmV0ZW50aW9uOiBsb2dzLlJldGVudGlvbkRheXMuT05FX1dFRUssXG4gICAgICB9KTtcbiAgICAgIFRhZ3Mub2YobG9nR3JvdXBGb3JGb3J3YXJkaW5nTGFtYmRhKS5hZGQoJ3NlcnZpY2UnLCBwcm9wcy5zZXJ2aWNlTmFtZSk7XG4gICAgICBjb25zdCBsb2dGb3J3YXJkZXJMYW1iZGFBcm5PdXRwdXROYW1lID1cbiAgICAgICAgcHJvcHMuZGF0YWRvZ0xvZ2dpbmdNb2RlID09PSBEYXRhRG9nTG9nZ2luZ01vZGUuREFUQURPR19GT1JXQVJERVJfTEFNQkRBXG4gICAgICAgICAgPyAnZGF0YWRvZy1mb3J3YXJkZXItRm9yd2FyZGVyQXJuJ1xuICAgICAgICAgIDogJ2N1c3RvbS1yZXNvdXJjZS1kYXRhZG9nLWxvZ2ZvcndhcmRlci1mdW5jdGlvbi1hcm4nO1xuICAgICAgY29uc3QgbG9nRm9yd2FyZGVyTGFtYmRhQXJuID0gRm4uaW1wb3J0VmFsdWUobG9nRm9yd2FyZGVyTGFtYmRhQXJuT3V0cHV0TmFtZSk7XG4gICAgICBjb25zdCBjZm5QZXJtaXNzaW9uID0gbmV3IGxhbWJkYS5DZm5QZXJtaXNzaW9uKHByb3BzLnNjb3BlLCBgTG9nRm9yd2FyZGVyUGVybWlzc2lvbiR7Y29udGFpbmVyVHlwZUNhbWVsQ2FzZX1gLCB7XG4gICAgICAgIGFjdGlvbjogJ2xhbWJkYTpJbnZva2VGdW5jdGlvbicsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogbG9nRm9yd2FyZGVyTGFtYmRhQXJuLFxuICAgICAgICBwcmluY2lwYWw6IGBsb2dzLiR7cmVnaW9ufS5hbWF6b25hd3MuY29tYCxcbiAgICAgICAgc291cmNlQXJuOiBsb2dHcm91cEZvckZvcndhcmRpbmdMYW1iZGEubG9nR3JvdXBBcm4sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNmblN1YnNjcmlwdGlvbkZpbHRlciA9IG5ldyBsb2dzLkNmblN1YnNjcmlwdGlvbkZpbHRlcihcbiAgICAgICAgcHJvcHMuc2NvcGUsXG4gICAgICAgIGBMb2dGb3J3YXJkZXJTdWJzY3JpcHRpb25GaWx0ZXIke2NvbnRhaW5lclR5cGVDYW1lbENhc2V9YCxcbiAgICAgICAge1xuICAgICAgICAgIGRlc3RpbmF0aW9uQXJuOiBsb2dGb3J3YXJkZXJMYW1iZGFBcm4sXG4gICAgICAgICAgZmlsdGVyUGF0dGVybjogJycsXG4gICAgICAgICAgbG9nR3JvdXBOYW1lOiBsb2dHcm91cEZvckZvcndhcmRpbmdMYW1iZGEubG9nR3JvdXBOYW1lLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgY2ZuU3Vic2NyaXB0aW9uRmlsdGVyLmFkZERlcGVuZGVuY3koY2ZuUGVybWlzc2lvbik7XG4gICAgICByZXR1cm4gZWNzLkxvZ0RyaXZlcnMuYXdzTG9ncyh7XG4gICAgICAgIHN0cmVhbVByZWZpeDogcHJvcHMuY29udGFpbmVyVHlwZSxcbiAgICAgICAgbG9nR3JvdXA6IGxvZ0dyb3VwRm9yRm9yd2FyZGluZ0xhbWJkYSxcbiAgICAgICAgbW9kZTogZWNzLkF3c0xvZ0RyaXZlck1vZGUuTk9OX0JMT0NLSU5HLFxuICAgICAgICBtYXhCdWZmZXJTaXplOiBTaXplLm1lYmlieXRlcygyNSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjYXNlIERhdGFEb2dMb2dnaW5nTW9kZS5OT05FOiB7XG4gICAgICBjb25zdCBsb2dHcm91cEluQ2xvdWR3YXRjaE9ubHkgPSBuZXcgbG9ncy5Mb2dHcm91cChwcm9wcy5zY29wZSwgbG9nR3JvdXBJZCwge1xuICAgICAgICByZXRlbnRpb246IGxvZ3MuUmV0ZW50aW9uRGF5cy5PTkVfV0VFSyxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGVjcy5Mb2dEcml2ZXJzLmF3c0xvZ3Moe1xuICAgICAgICBzdHJlYW1QcmVmaXg6IHByb3BzLmNvbnRhaW5lclR5cGUsXG4gICAgICAgIGxvZ0dyb3VwOiBsb2dHcm91cEluQ2xvdWR3YXRjaE9ubHksXG4gICAgICAgIG1vZGU6IGVjcy5Bd3NMb2dEcml2ZXJNb2RlLk5PTl9CTE9DS0lORyxcbiAgICAgICAgbWF4QnVmZmVyU2l6ZTogU2l6ZS5tZWJpYnl0ZXMoMjUpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVMb2dnaW5nQW5kTW9uaXRvcmluZ0FyZVJlYWR5QmVmb3JlU2VydmljZVN0YXJ0cyhcbiAgcmlvRmFyZ2F0ZVNlcnZpY2U6IFJpb0ZhcmdhdGVTZXJ2aWNlIHwgUmlvRmFyZ2F0ZVNlcnZpY2VCbHVlR3JlZW5BbHBoYVxuKTogdm9pZCB7XG4gIHJpb0ZhcmdhdGVTZXJ2aWNlLnNlcnZpY2VDb250YWluZXJEZWZpbml0aW9uLmFkZENvbnRhaW5lckRlcGVuZGVuY2llcyh7XG4gICAgY29udGFpbmVyOiByaW9GYXJnYXRlU2VydmljZS5kYXRhZG9nU2lkZUNhckNvbnRhaW5lckRlZmluaXRpb24sXG4gICAgY29uZGl0aW9uOiBlY3MuQ29udGFpbmVyRGVwZW5kZW5jeUNvbmRpdGlvbi5IRUFMVEhZLFxuICB9KTtcblxuICBpZiAocmlvRmFyZ2F0ZVNlcnZpY2UubG9nUm91dGVyQ29udGFpbmVyRGVmaW5pdGlvbikge1xuICAgIHJpb0ZhcmdhdGVTZXJ2aWNlLnNlcnZpY2VDb250YWluZXJEZWZpbml0aW9uLmFkZENvbnRhaW5lckRlcGVuZGVuY2llcyh7XG4gICAgICBjb250YWluZXI6IHJpb0ZhcmdhdGVTZXJ2aWNlLmxvZ1JvdXRlckNvbnRhaW5lckRlZmluaXRpb24sXG4gICAgICBjb25kaXRpb246IGVjcy5Db250YWluZXJEZXBlbmRlbmN5Q29uZGl0aW9uLlNUQVJULFxuICAgIH0pO1xuXG4gICAgaWYgKHJpb0ZhcmdhdGVTZXJ2aWNlLmRhdGFkb2dTaWRlQ2FyQ29udGFpbmVyRGVmaW5pdGlvbi5sb2dEcml2ZXJDb25maWc/LmxvZ0RyaXZlciA9PT0gJ2F3c2ZpcmVsZW5zJykge1xuICAgICAgcmlvRmFyZ2F0ZVNlcnZpY2UuZGF0YWRvZ1NpZGVDYXJDb250YWluZXJEZWZpbml0aW9uLmFkZENvbnRhaW5lckRlcGVuZGVuY2llcyh7XG4gICAgICAgIGNvbnRhaW5lcjogcmlvRmFyZ2F0ZVNlcnZpY2UubG9nUm91dGVyQ29udGFpbmVyRGVmaW5pdGlvbixcbiAgICAgICAgY29uZGl0aW9uOiBlY3MuQ29udGFpbmVyRGVwZW5kZW5jeUNvbmRpdGlvbi5TVEFSVCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
354
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWRvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mYXJnYXRlL2RhdGFkb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBaUpBLDBGQTZCQztBQW1CRCx3REFRQztBQUVELDhDQXlFQztBQUVELDRGQVdDO0FBMkNELG9EQThDQztBQUVELG9DQXlHQztBQUVELHNIQXFCQztBQTVmRCw2Q0FBOEQ7QUFDOUQsMkNBQTJDO0FBQzNDLGlEQUF1RDtBQUN2RCwyQ0FBMkM7QUFDM0MsaURBQWlEO0FBQ2pELDZDQUE2QztBQUM3QywyQ0FBMkM7QUFFM0MsK0RBQW1GO0FBRW5GLHFEQUkwQjtBQUUxQjs7R0FFRztBQUNILE1BQWEsT0FBTztJQUNYLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FDbkQsS0FBZ0IsRUFDaEIsS0FBYSxFQUNiLFdBQW1CLEVBQ25CLE9BQWUsRUFDZixXQUFtQixFQUNuQixRQUFnQixFQUNoQixjQUFzQixFQUN0QixjQUFtRDtRQUVuRCxPQUFPLHVDQUF1QyxDQUFDO1lBQzdDLEtBQUs7WUFDTCxLQUFLO1lBQ0wsV0FBVztZQUNYLE9BQU87WUFDUCxXQUFXO1lBQ1gsUUFBUTtZQUNSLGNBQWM7WUFDZCxjQUFjO1NBQ2YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxLQUFhLEVBQUUsV0FBbUIsRUFBRSxPQUFlO1FBQ3RGLE9BQU8sc0JBQXNCLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVNLE1BQU0sQ0FBQyxpQkFBaUIsQ0FDN0IsS0FBZ0IsRUFDaEIsY0FBa0MsRUFDbEMsV0FBbUIsRUFDbkIsUUFBZ0IsRUFDaEIsY0FBc0IsRUFDdEIsS0FBYSxFQUNiLFdBQW1CLEVBQ25CLE9BQWUsRUFDZixhQUF5QixFQUN6QixXQUFtQixFQUNuQixrQkFBc0MsRUFDdEMsdUJBQWlDLEVBQ2pDLEdBQVcsRUFD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WUFBWSxFQUFFLEtBQUssQ0FBQyxhQUFhO2dCQUNqQyxRQUFRLEVBQUUsd0JBQXdCO2dCQUNsQyxJQUFJLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixDQUFDLFlBQVk7Z0JBQ3ZDLGFBQWEsRUFBRSxrQkFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7YUFDbEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBZ0IscURBQXFELENBQ25FLGlCQUFzRTtJQUV0RSxpQkFBaUIsQ0FBQywwQkFBMEIsQ0FBQyx3QkFBd0IsQ0FBQztRQUNwRSxTQUFTLEVBQUUsaUJBQWlCLENBQUMsaUNBQWlDO1FBQzlELFNBQVMsRUFBRSxHQUFHLENBQUMsNEJBQTRCLENBQUMsT0FBTztLQUNwRCxDQUFDLENBQUM7SUFFSCxJQUFJLGlCQUFpQixDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDbkQsaUJBQWlCLENBQUMsMEJBQTBCLENBQUMsd0JBQXdCLENBQUM7WUFDcEUsU0FBUyxFQUFFLGlCQUFpQixDQUFDLDRCQUE0QjtZQUN6RCxTQUFTLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixDQUFDLEtBQUs7U0FDbEQsQ0FBQyxDQUFDO1FBRUgsSUFBSSxpQkFBaUIsQ0FBQyxpQ0FBaUMsQ0FBQyxlQUFlLEVBQUUsU0FBUyxLQUFLLGFBQWEsRUFBRSxDQUFDO1lBQ3JHLGlCQUFpQixDQUFDLGlDQUFpQyxDQUFDLHdCQUF3QixDQUFDO2dCQUMzRSxTQUFTLEVBQUUsaUJBQWlCLENBQUMsNEJBQTRCO2dCQUN6RCxTQUFTLEVBQUUsR0FBRyxDQUFDLDRCQUE0QixDQUFDLEtBQUs7YUFDbEQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24sIEZuLCBTaXplLCBTdGFjaywgVGFncyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGVjcyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNzJztcbmltcG9ydCB7IEF3c0xvZ0RyaXZlck1vZGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNzJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0ICogYXMgc3NtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zc20nO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IERhdGFEb2dMb2dnaW5nTW9kZSwgdHlwZSBSaW9GYXJnYXRlU2VydmljZSB9IGZyb20gJy4vcmlvLWZhcmdhdGUtc2VydmljZSc7XG5pbXBvcnQgdHlwZSB7IFJpb0ZhcmdhdGVTZXJ2aWNlQmx1ZUdyZWVuQWxwaGEgfSBmcm9tICcuL3Jpby1mYXJnYXRlLXNlcnZpY2UtYmx1ZS1ncmVlbi1hbHBoYSc7XG5pbXBvcnQge1xuICBnZXRBZ2VudFRyYWNlU2FtcGxpbmdFbnZpcm9ubWVudCxcbiAgZ2V0QXBwbGljYXRpb25UcmFjZVNhbXBsaW5nRW52aXJvbm1lbnQsXG4gIHR5cGUgVHJhY2VTYW1wbGluZ09wdGlvbnMsXG59IGZyb20gJy4vdHJhY2Utc2FtcGxpbmcnO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIE1vdmVkIG91dCBzdGF0aWMgbWV0aG9kcyBhbmQgaW1wb3JvdmVkIHNpZ25hdHVyZS4gVXNlIG5hbWVkIGltcG9ydCBpbnN0ZWFkLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YURvZyB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0RmFyZ2F0ZUNvbnRhaW5lckVudmlyb25tZW50VmFyaWFibGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgc3RhZ2U6IHN0cmluZyxcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICAgIHZlcnNpb246IHN0cmluZyxcbiAgICBhY2NvdW50TmFtZTogc3RyaW5nLFxuICAgIHRlYW1OYW1lOiBzdHJpbmcsXG4gICAgdGVhbUlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBhZGRpdGlvbmFsVGFnczogeyBbazogc3RyaW5nXTogc3RyaW5nIH0gfCB1bmRlZmluZWRcbiAgKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIGdldEZhcmdhdGVDb250YWluZXJFbnZpcm9ubWVudFZhcmlhYmxlcyh7XG4gICAgICBzY29wZSxcbiAgICAgIHN0YWdlLFxuICAgICAgc2VydmljZU5hbWUsXG4gICAgICB2ZXJzaW9uLFxuICAgICAgYWNjb3VudE5hbWUsXG4gICAgICB0ZWFtTmFtZSxcbiAgICAgIHRlYW1JZGVudGlmaWVyLFxuICAgICAgYWRkaXRpb25hbFRhZ3MsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldEZhcmdhdGVEb2NrZXJMYWJlbHMoc3RhZ2U6IHN0cmluZywgc2VydmljZU5hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIGdldEZhcmdhdGVEb2NrZXJMYWJlbHMoeyBzdGFnZSwgc2VydmljZU5hbWUsIHZlcnNpb24gfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFkZERhdGFkb2dTaWRlY2FyKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgdGFza0RlZmluaXRpb246IGVjcy5UYXNrRGVmaW5pdGlvbixcbiAgICBhY2NvdW50TmFtZTogc3RyaW5nLFxuICAgIHRlYW1OYW1lOiBzdHJpbmcsXG4gICAgdGVhbUlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBzdGFnZTogc3RyaW5nLFxuICAgIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICAgdmVyc2lvbjogc3RyaW5nLFxuICAgIGRhdGFkb2dBcGlLZXk6IGVjcy5TZWNyZXQsXG4gICAgZGF0YWRvZ1NpdGU6IHN0cmluZyxcbiAgICBkYXRhZG9nTG9nZ2luZ01vZGU6IERhdGFEb2dMb2dnaW5nTW9kZSxcbiAgICBhcG1HZXRSZXNvdXJjZXNUb0lnbm9yZTogc3RyaW5nW10sXG4gICAgY3B1OiBudW1iZXIsXG4gICAgbWVtb3J5TGltaXRNaUI6IG51bWJlcixcbiAgICBlc3NlbnRpYWw6IGJvb2xlYW4sXG4gICAgY29udGFpbmVyVGFnOiBzdHJpbmcsXG4gICAgYWRkaXRpb25hbFRhZ3M6IHsgW2s6IHN0cmluZ106IHN0cmluZyB9IHwgdW5kZWZpbmVkLFxuICAgIGVuYWJsZVJlc3RhcnRQb2xpY3k6IGJvb2xlYW4sXG4gICAgcmVzdGFydElnbm9yZWRFeGl0Q29kZXM6IG51bWJlcltdLFxuICAgIHRyYWNlU2FtcGxpbmc/OiBUcmFjZVNhbXBsaW5nT3B0aW9uc1xuICApOiBlY3MuQ29udGFpbmVyRGVmaW5pdGlvbiB7XG4gICAgcmV0dXJuIGFkZERhdGFkb2dTaWRlY2FyKHtcbiAgICAgIHNjb3BlLFxuICAgICAgdGFza0RlZmluaXRpb24sXG4gICAgICBhY2NvdW50TmFtZSxcbiAgICAgIHRlYW1OYW1lLFxuICAgICAgdGVhbUlkZW50aWZpZXIsXG4gICAgICBzdGFnZSxcbiAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgdmVyc2lvbixcbiAgICAgIGRhdGFkb2dBcGlLZXksXG4gICAgICBkYXRhZG9nU2l0ZSxcbiAgICAgIGRhdGFkb2dMb2dnaW5nTW9kZSxcbiAgICAgIGFwbUdldFJlc291cmNlc1RvSWdub3JlLFxuICAgICAgY3B1LFxuICAgICAgbWVtb3J5TGltaXRNaUIsXG4gICAgICBlc3NlbnRpYWwsXG4gICAgICBjb250YWluZXJUYWcsXG4gICAgICBhZGRpdGlvbmFsVGFncyxcbiAgICAgIGVuYWJsZVJlc3RhcnRQb2xpY3ksXG4gICAgICByZXN0YXJ0SWdub3JlZEV4aXRDb2RlcyxcbiAgICAgIHRyYWNlU2FtcGxpbmcsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFkZEZpcmVMZW5zTG9nUm91dGVyKFxuICAgIHRhc2tEZWZpbml0aW9uOiBlY3MuVGFza0RlZmluaXRpb24sXG4gICAgY3B1OiBudW1iZXIsXG4gICAgbWVtb3J5TGltaXRNaUI6IG51bWJlcixcbiAgICBmaXJlbGVuc0NvbmZpZ0ZpbGVQYXRoOiBzdHJpbmcsXG4gICAgZmlyZWxlbnNDb25maWdCdWNrZXRBcm46IHN0cmluZyxcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nXG4gICk6IGVjcy5Db250YWluZXJEZWZpbml0aW9uIHtcbiAgICByZXR1cm4gYWRkRmlyZUxlbnNMb2dSb3V0ZXIoe1xuICAgICAgdGFza0RlZmluaXRpb24sXG4gICAgICBjcHUsXG4gICAgICBtZW1vcnlMaW1pdE1pQixcbiAgICAgIGZpcmVsZW5zQ29uZmlnRmlsZVBhdGgsXG4gICAgICBmaXJlbGVuc0NvbmZpZ0J1Y2tldEFybixcbiAgICAgIHNlcnZpY2VOYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBzZXR1cExvZ2dpbmcoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBhY2NvdW50TmFtZTogc3RyaW5nLFxuICAgIHRlYW1OYW1lOiBzdHJpbmcsXG4gICAgdGVhbUlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBzdGFnZTogc3RyaW5nLFxuICAgIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICAgdmVyc2lvbjogc3RyaW5nLFxuICAgIGRhdGFkb2dBcGlLZXk6IGVjcy5TZWNyZXQsXG4gICAgZGF0YWRvZ0xvZ2dpbmdNb2RlOiBEYXRhRG9nTG9nZ2luZ01vZGUsXG4gICAgZGF0YWRvZ1NpdGU6IHN0cmluZyxcbiAgICBjb250YWluZXJUeXBlOiAnc2VydmljZScgfCAnZGF0YWRvZy1zaWRlY2FyJyxcbiAgICBhZGRpdGlvbmFsVGFnczogeyBbazogc3RyaW5nXTogc3RyaW5nIH0gfCB1bmRlZmluZWRcbiAgKTogZWNzLkxvZ0RyaXZlciB7XG4gICAgcmV0dXJuIHNldHVwTG9nZ2luZyh7XG4gICAgICBzY29wZSxcbiAgICAgIGFjY291bnROYW1lLFxuICAgICAgdGVhbU5hbWUsXG4gICAgICB0ZWFtSWRlbnRpZmllcixcbiAgICAgIHN0YWdlLFxuICAgICAgc2VydmljZU5hbWUsXG4gICAgICB2ZXJzaW9uLFxuICAgICAgZGF0YWRvZ0FwaUtleSxcbiAgICAgIGRhdGFkb2dMb2dnaW5nTW9kZSxcbiAgICAgIGRhdGFkb2dTaXRlLFxuICAgICAgY29udGFpbmVyVHlwZSxcbiAgICAgIGFkZGl0aW9uYWxUYWdzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBlbnN1cmVMb2dnaW5nQW5kTW9uaXRvcmluZ0FyZVJlYWR5QmVmb3JlU2VydmljZVN0YXJ0cyhyaW9GYXJnYXRlU2VydmljZTogUmlvRmFyZ2F0ZVNlcnZpY2UpIHtcbiAgICBlbnN1cmVMb2dnaW5nQW5kTW9uaXRvcmluZ0FyZVJlYWR5QmVmb3JlU2VydmljZVN0YXJ0cyhyaW9GYXJnYXRlU2VydmljZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZhcmdhdGVDb250YWluZXJFbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9wczoge1xuICBzY29wZTogQ29uc3RydWN0O1xuICBzdGFnZTogc3RyaW5nO1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIGFjY291bnROYW1lOiBzdHJpbmc7XG4gIHRlYW1OYW1lOiBzdHJpbmc7XG4gIHRlYW1JZGVudGlmaWVyOiBzdHJpbmc7XG4gIGFkZGl0aW9uYWxUYWdzOiB7IFtrOiBzdHJpbmddOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgdHJhY2VTYW1wbGluZz86IFRyYWNlU2FtcGxpbmdPcHRpb25zO1xufSk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICBjb25zdCB7IGFjY291bnQ6IGFjY291bnRJZCwgcmVnaW9uIH0gPSBTdGFjay5vZihwcm9wcy5zY29wZSk7XG5cbiAgcmV0dXJuIHtcbiAgICAvLyB1bmlmaWVkIHRhZ2dpbmcsIHNlZSBodHRwczovL2RvY3MuZGF0YWRvZ2hxLmNvbS9nZXR0aW5nX3N0YXJ0ZWQvdGFnZ2luZy91bmlmaWVkX3NlcnZpY2VfdGFnZ2luZy8/dGFiPWVjc1xuICAgIEREX0VOVjogcHJvcHMuc3RhZ2UsXG4gICAgRERfU0VSVklDRTogcHJvcHMuc2VydmljZU5hbWUsXG4gICAgRERfVkVSU0lPTjogcHJvcHMudmVyc2lvbixcbiAgICAvLyBBUE0gYW5kIHRyYWNpbmcsIHNlZSBodHRwczovL2RvY3MuZGF0YWRvZ2hxLmNvbS90cmFjaW5nL3NldHVwX292ZXJ2aWV3L3NldHVwL2phdmEvP3RhYj1jb250YWluZXJzXG4gICAgRERfTE9HU19JTkpFQ1RJT046ICd0cnVlJyxcbiAgICBERF9TRVJWSUNFX01BUFBJTkc6IGdldEFwbVNlcnZpY2VNYXBwaW5nRW52aXJvbm1lbnRWYXJpYWJsZVZhbHVlKHByb3BzLnNlcnZpY2VOYW1lKSxcbiAgICBERF9UQUdTOiBnZXRUYWdzRW52aXJvbm1lbnRWYXJpYWJsZVZhbHVlKHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgY29udGFpbmVyVHlwZTogJ3NlcnZpY2UnLFxuICAgICAgYWNjb3VudElkLFxuICAgICAgcmVnaW9uLFxuICAgIH0pLFxuICAgIC4uLmdldEFwcGxpY2F0aW9uVHJhY2VTYW1wbGluZ0Vudmlyb25tZW50KHByb3BzLnRyYWNlU2FtcGxpbmcpLFxuICB9O1xufVxuXG4vLyB3ZSBhZGQgYWxsIHBvc3NpYmxlIHNlcnZpY2UgbWFwcGluZ3MgaGVyZSBldmVuIGlmIG5vdCB1c2VkIGluIGEgcGFydGljdWxhciBzZXJ2aWNlIHRvIGdldCBnbG9iYWxseSB1bmlxdWUgbmFtZXNcbmZ1bmN0aW9uIGdldEFwbVNlcnZpY2VNYXBwaW5nRW52aXJvbm1lbnRWYXJpYWJsZVZhbHVlKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzZXJ2aWNlTWFwcGluZyA9IHtcbiAgICBkYXRhYmFzZTogYCR7c2VydmljZU5hbWV9LWF1cm9yYWAsXG4gICAgJ2phdmEtYXdzLXNkayc6IGAke3NlcnZpY2VOYW1lfS1hd3Mtc2RrYCxcbiAgICBrYWZrYTogYCR7c2VydmljZU5hbWV9LWthZmthYCxcbiAgICBteXNxbDogYCR7c2VydmljZU5hbWV9LWF1cm9yYWAsXG4gICAgcmVkaXM6IGAke3NlcnZpY2VOYW1lfS1yZWRpc2AsXG4gICAgJ2F3cy5keW5hbW9kYic6IGAke3NlcnZpY2VOYW1lfS1keW5hbW9kYmAsXG4gICAgbW9uZ286IGAke3NlcnZpY2VOYW1lfS1kb2N1bWVudGRiYCxcbiAgfTtcblxuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoc2VydmljZU1hcHBpbmcpXG4gICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9OiR7dmFsdWV9YClcbiAgICAuam9pbignLCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmFyZ2F0ZURvY2tlckxhYmVscyhwcm9wczogeyBzdGFnZTogc3RyaW5nOyBzZXJ2aWNlTmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfSk6IHtcbiAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xufSB7XG4gIHJldHVybiB7XG4gICAgJ2NvbS5kYXRhZG9naHEudGFncy5lbnYnOiBwcm9wcy5zdGFnZSxcbiAgICAnY29tLmRhdGFkb2docS50YWdzLnNlcnZpY2UnOiBwcm9wcy5zZXJ2aWNlTmFtZSxcbiAgICAnY29tLmRhdGFkb2docS50YWdzLnZlcnNpb24nOiBwcm9wcy52ZXJzaW9uLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkRGF0YWRvZ1NpZGVjYXIocHJvcHM6IHtcbiAgc2NvcGU6IENvbnN0cnVjdDtcbiAgdGFza0RlZmluaXRpb246IGVjcy5UYXNrRGVmaW5pdGlvbjtcbiAgYWNjb3VudE5hbWU6IHN0cmluZztcbiAgdGVhbU5hbWU6IHN0cmluZztcbiAgdGVhbUlkZW50aWZpZXI6IHN0cmluZztcbiAgc3RhZ2U6IHN0cmluZztcbiAgc2VydmljZU5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBkYXRhZG9nQXBpS2V5OiBlY3MuU2VjcmV0O1xuICBkYXRhZG9nU2l0ZTogc3RyaW5nO1xuICBkYXRhZG9nTG9nZ2luZ01vZGU6IERhdGFEb2dMb2dnaW5nTW9kZTtcbiAgYXBtR2V0UmVzb3VyY2VzVG9JZ25vcmU6IHN0cmluZ1tdO1xuICBjcHU6IG51bWJlcjtcbiAgbWVtb3J5TGltaXRNaUI6IG51bWJlcjtcbiAgZXNzZW50aWFsOiBib29sZWFuO1xuICBjb250YWluZXJUYWc6IHN0cmluZztcbiAgYWRkaXRpb25hbFRhZ3M6IHsgW2s6IHN0cmluZ106IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICBlbmFibGVSZXN0YXJ0UG9saWN5OiBib29sZWFuO1xuICByZXN0YXJ0SWdub3JlZEV4aXRDb2RlczogbnVtYmVyW10gfCB1bmRlZmluZWQ7XG4gIHRyYWNlU2FtcGxpbmc/OiBUcmFjZVNhbXBsaW5nT3B0aW9ucztcbn0pOiBlY3MuQ29udGFpbmVyRGVmaW5pdGlvbiB7XG4gIGNvbnN0IHsgYWNjb3VudDogYWNjb3VudElkLCByZWdpb24gfSA9IFN0YWNrLm9mKHByb3BzLnNjb3BlKTtcbiAgY29uc3QgZGF0YWRvZ1NpZGVjYXIgPSBwcm9wcy50YXNrRGVmaW5pdGlvbi5hZGRDb250YWluZXIoJ2RhdGFkb2ctYWdlbnQnLCB7XG4gICAgaW1hZ2U6IGVjcy5Db250YWluZXJJbWFnZS5mcm9tUmVnaXN0cnkoYHB1YmxpYy5lY3IuYXdzL2RhdGFkb2cvYWdlbnQ6JHtwcm9wcy5jb250YWluZXJUYWd9YCksXG4gICAgZW5hYmxlUmVzdGFydFBvbGljeTogcHJvcHMuZW5hYmxlUmVzdGFydFBvbGljeSxcbiAgICByZXN0YXJ0SWdub3JlZEV4aXRDb2RlczogcHJvcHMucmVzdGFydElnbm9yZWRFeGl0Q29kZXMsXG4gICAgbG9nZ2luZzogc2V0dXBMb2dnaW5nKHsgLi4ucHJvcHMsIGNvbnRhaW5lclR5cGU6ICdkYXRhZG9nLXNpZGVjYXInIH0pLFxuICAgIGNwdTogcHJvcHMuY3B1LFxuICAgIG1lbW9yeUxpbWl0TWlCOiBwcm9wcy5tZW1vcnlMaW1pdE1pQixcbiAgICBlbnZpcm9ubWVudDoge1xuICAgICAgLy8gdW5pZmllZCB0YWdnaW5nLCBzZWUgaHR0cHM6Ly9kb2NzLmRhdGFkb2docS5jb20vZ2V0dGluZ19zdGFydGVkL3RhZ2dpbmcvdW5pZmllZF9zZXJ2aWNlX3RhZ2dpbmcvP3RhYj1lY3NcbiAgICAgIEREX0VOVjogcHJvcHMuc3RhZ2UsXG4gICAgICBERF9TRVJWSUNFOiBwcm9wcy5zZXJ2aWNlTmFtZSxcbiAgICAgIEREX1ZFUlNJT046IHByb3BzLnZlcnNpb24sXG4gICAgICAvLyBBUE0gYW5kIHRyYWNpbmcgc2VlIGh0dHBzOi8vZG9jcy5kYXRhZG9naHEuY29tL2FnZW50L2RvY2tlci9hcG0vP3RhYj1saW51eFxuICAgICAgRERfQVBNX0VOQUJMRUQ6ICd0cnVlJyxcbiAgICAgIEREX0FQTV9JR05PUkVfUkVTT1VSQ0VTOiBwcm9wcy5hcG1HZXRSZXNvdXJjZXNUb0lnbm9yZVxuICAgICAgICAubWFwKGFwbUdldFJlc291cmNlVG9JZ25vcmUgPT4gYEdFVCAke2FwbUdldFJlc291cmNlVG9JZ25vcmV9YClcbiAgICAgICAgLmpvaW4oJywnKSxcbiAgICAgIC8vIGdlbmVyYWwgc2V0dGluZ3NcbiAgICAgIEREX1NJVEU6IHByb3BzLmRhdGFkb2dTaXRlLFxuICAgICAgRERfVEFHUzogZ2V0VGFnc0Vudmlyb25tZW50VmFyaWFibGVWYWx1ZSh7IC4uLnByb3BzLCBhY2NvdW50SWQsIHJlZ2lvbiwgY29udGFpbmVyVHlwZTogJ2RhdGFkb2ctc2lkZWNhcicgfSksXG4gICAgICBFQ1NfRkFSR0FURTogJ3RydWUnLFxuICAgICAgRERfQ0xPVURfUFJPVklERVJfTUVUQURBVEE6ICdhd3MnLFxuICAgICAgRERfUkVNT1RFX0NPTkZJR1VSQVRJT05fRU5BQkxFRDogJ2ZhbHNlJyxcbiAgICAgIC4uLmdldEFnZW50VHJhY2VTYW1wbGluZ0Vudmlyb25tZW50KHByb3BzLnRyYWNlU2FtcGxpbmcpLFxuICAgIH0sXG4gICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXRhRG9nL2RhdGFkb2ctYWdlbnQvYmxvYi9tYXN0ZXIvRG9ja2VyZmlsZXMvYWdlbnQvYW1kNjQvRG9ja2VyZmlsZSNMMTcxLUwxNzJcbiAgICBoZWFsdGhDaGVjazoge1xuICAgICAgc3RhcnRQZXJpb2Q6IER1cmF0aW9uLm1pbnV0ZXMoMiksXG4gICAgICBpbnRlcnZhbDogRHVyYXRpb24uc2Vjb25kcygzMCksXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgcmV0cmllczogMixcbiAgICAgIGNvbW1hbmQ6IFsnQ01ELVNIRUxMJywgJy9wcm9iZS5zaCddLFxuICAgIH0sXG4gICAgc2VjcmV0czoge1xuICAgICAgRERfQVBJX0tFWTogcHJvcHMuZGF0YWRvZ0FwaUtleSxcbiAgICB9LFxuICAgIGVzc2VudGlhbDogcHJvcHMuZXNzZW50aWFsLFxuICB9KTtcblxuICBkYXRhZG9nU2lkZWNhci5hZGRQb3J0TWFwcGluZ3Moe1xuICAgIGNvbnRhaW5lclBvcnQ6IDgxMjUsXG4gICAgcHJvdG9jb2w6IGVjcy5Qcm90b2NvbC5VRFAsXG4gIH0pO1xuXG4gIGRhdGFkb2dTaWRlY2FyLmFkZFBvcnRNYXBwaW5ncyh7XG4gICAgY29udGFpbmVyUG9ydDogODEyNixcbiAgICBwcm90b2NvbDogZWNzLlByb3RvY29sLlRDUCxcbiAgfSk7XG5cbiAgcmV0dXJuIGRhdGFkb2dTaWRlY2FyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkRmlyZWxlbnNDb25maWdVcGxvYWRGcm9tUzNQZXJtaXNzaW9ucyhwcm9wczoge1xuICB0YXNrRGVmaW5pdGlvbjogZWNzLlRhc2tEZWZpbml0aW9uO1xuICBmaXJlbGVuc0NvbmZpZ0J1Y2tldEFybjogc3RyaW5nO1xufSkge1xuICBwcm9wcy50YXNrRGVmaW5pdGlvbi5hZGRUb1Rhc2tSb2xlUG9saWN5KFxuICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIHJlc291cmNlczogW3Byb3BzLmZpcmVsZW5zQ29uZmlnQnVja2V0QXJuLCBgJHtwcm9wcy5maXJlbGVuc0NvbmZpZ0J1Y2tldEFybn0vKmBdLFxuICAgICAgYWN0aW9uczogWydzMzpHZXQqJ10sXG4gICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgfSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFnc0Vudmlyb25tZW50VmFyaWFibGVWYWx1ZShwcm9wczoge1xuICBhY2NvdW50SWQ6IHN0cmluZztcbiAgYWNjb3VudE5hbWU6IHN0cmluZztcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIHRlYW1OYW1lOiBzdHJpbmc7XG4gIHRlYW1JZGVudGlmaWVyOiBzdHJpbmc7XG4gIHN0YWdlOiBzdHJpbmc7XG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbiAgY29udGFpbmVyVHlwZTogJ3NlcnZpY2UnIHwgJ2RhdGFkb2ctc2lkZWNhcicgfCAnZmx1ZW50LWJpdCc7XG4gIGFkZGl0aW9uYWxUYWdzOiB7IFtrOiBzdHJpbmddOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbn0pOiBzdHJpbmcge1xuICBjb25zdCBzZXBhcmF0b3IgPSBkZXRlcm1pbmVTZXBhcmF0b3IocHJvcHMuY29udGFpbmVyVHlwZSk7XG5cbiAgY29uc3QgdGFncyA9IHtcbiAgICAvLyB1bmlmaWVkIHRhZ2dpbmdcbiAgICAvLyBvdmVycmlkZGVuIGJ5IGRlZGljYXRlZCBzZXR0aW5ncyAoZW52aXJvbm1lbnQgdmFyaWFibGVzL3RhZ3MpXG4gICAgLy8gZHVwbGljYXRlZCBoZXJlIHRvIGVuc3VyZSB0aGV5IGFyZSB1c2VkIChhbmQgc29tZXRpbWVzLCBub3QgYWxsIHRocmVlIHZhbHVlcyBhcmUgc3VwcG9ydGVkKVxuICAgIGVudjogcHJvcHMuc3RhZ2UsXG4gICAgc2VydmljZTogcHJvcHMuc2VydmljZU5hbWUsXG4gICAgdmVyc2lvbjogcHJvcHMudmVyc2lvbixcbiAgICAvLyBhY2NvdW50L3RlYW0gc3BlY2lmaWMgcGFydHNcbiAgICBhY2NvdW50X2lkOiBwcm9wcy5hY2NvdW50SWQsXG4gICAgYWNjb3VudF9uYW1lOiBwcm9wcy5hY2NvdW50TmFtZSxcbiAgICByZWdpb246IHByb3BzLnJlZ2lvbixcbiAgICB0ZWFtOiBwcm9wcy50ZWFtTmFtZSxcbiAgICB0ZWFtX2lkZW50aWZpZXI6IHByb3BzLnRlYW1JZGVudGlmaWVyLFxuICB9O1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoeyAuLi50YWdzLCAuLi5wcm9wcy5hZGRpdGlvbmFsVGFncyB9KVxuICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fToke3ZhbHVlfWApXG4gICAgLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lU2VwYXJhdG9yKGNvbnRhaW5lclR5cGU6ICdzZXJ2aWNlJyB8ICdkYXRhZG9nLXNpZGVjYXInIHwgJ2ZsdWVudC1iaXQnKSB7XG4gIGlmIChjb250YWluZXJUeXBlID09PSAnZGF0YWRvZy1zaWRlY2FyJykge1xuICAgIHJldHVybiAnICc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuICcsJztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkRmlyZUxlbnNMb2dSb3V0ZXIocHJvcHM6IHtcbiAgdGFza0RlZmluaXRpb246IGVjcy5UYXNrRGVmaW5pdGlvbjtcbiAgY3B1OiBudW1iZXI7XG4gIG1lbW9yeUxpbWl0TWlCOiBudW1iZXI7XG4gIGZpcmVsZW5zQ29uZmlnQnVja2V0QXJuOiBzdHJpbmc7XG4gIGZpcmVsZW5zQ29uZmlnRmlsZVBhdGg6IHN0cmluZztcbiAgc2VydmljZU5hbWU6IHN0cmluZztcbn0pOiBlY3MuQ29udGFpbmVyRGVmaW5pdGlvbiB7XG4gIGNvbnN0IGZsdWVudEJpdFMzQ29uZmlnRmlsZSA9IHByb3BzLmZpcmVsZW5zQ29uZmlnQnVja2V0QXJuICsgcHJvcHMuZmlyZWxlbnNDb25maWdGaWxlUGF0aDtcblxuICBjb25zdCBmaXJlTGVuc0xvZ1JvdXRlckltYWdlID0gc3NtLlN0cmluZ1BhcmFtZXRlci5mcm9tU3RyaW5nUGFyYW1ldGVyQXR0cmlidXRlcyhcbiAgICBwcm9wcy50YXNrRGVmaW5pdGlvbixcbiAgICAnRmx1ZW50Qml0SW1hZ2VUYWcnLFxuICAgIHtcbiAgICAgIHBhcmFtZXRlck5hbWU6ICcvYXdzL3NlcnZpY2UvYXdzLWZvci1mbHVlbnQtYml0L2luaXQtMi4zMi4yLjIwMjQwODIwJyxcbiAgICAgIC8vIElmIHRoaXMgcHJvcGVydHkgaXMgbm90IHNldCwgaXQgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBsYXRlc3QgdmVyc2lvbi5cbiAgICAgIC8vIFRoaXMgbGVhZHMgdG8gYSBub24tZGV0ZXJtaW5pc3RpYyBiZWhhdmlvci5cbiAgICAgIC8vIFVwZGF0aW5nIHRoaXMgbmFtZS92ZXJzaW9uIGlzIGEgcG90ZW50aWFsIGJyZWFraW5nIGNoYW5nZVxuICAgICAgdmVyc2lvbjogMSxcbiAgICB9XG4gICkuc3RyaW5nVmFsdWU7XG5cbiAgcmV0dXJuIHByb3BzLnRhc2tEZWZpbml0aW9uLmFkZEZpcmVsZW5zTG9nUm91dGVyKCdmaXJlbGVucy1sb2ctcm91dGVyJywge1xuICAgIGltYWdlOiBlY3MuQ29udGFpbmVySW1hZ2UuZnJvbVJlZ2lzdHJ5KGZpcmVMZW5zTG9nUm91dGVySW1hZ2UpLFxuICAgIGZpcmVsZW5zQ29uZmlnOiB7XG4gICAgICB0eXBlOiBlY3MuRmlyZWxlbnNMb2dSb3V0ZXJUeXBlLkZMVUVOVEJJVCxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgZW5hYmxlRUNTTG9nTWV0YWRhdGE6IHRydWUsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY3B1OiBwcm9wcy5jcHUsXG4gICAgbWVtb3J5TGltaXRNaUI6IHByb3BzLm1lbW9yeUxpbWl0TWlCLFxuICAgIGxvZ2dpbmc6IGVjcy5Mb2dEcml2ZXJzLmF3c0xvZ3Moe1xuICAgICAgbG9nR3JvdXA6IG5ldyBsb2dzLkxvZ0dyb3VwKHByb3BzLnRhc2tEZWZpbml0aW9uLCAnRmlyZWxlbnNMb2dSb3V0ZXJMb2dHcm91cCcsIHtcbiAgICAgICAgbG9nR3JvdXBOYW1lOiBgJHtwcm9wcy5zZXJ2aWNlTmFtZX0tZmlyZWxlbnMtbG9nLXJvdXRlcmAsXG4gICAgICB9KSxcbiAgICAgIHN0cmVhbVByZWZpeDogJ2ZpcmVsZW5zLWxvZy1yb3V0ZXInLFxuICAgICAgbW9kZTogQXdzTG9nRHJpdmVyTW9kZS5OT05fQkxPQ0tJTkcsXG4gICAgfSksXG4gICAgaGVhbHRoQ2hlY2s6IHtcbiAgICAgIGNvbW1hbmQ6IFsnQ01ELVNIRUxMJywgJ2N1cmwgLS1mYWlsIC0tc2lsZW50IGh0dHA6Ly8xMjcuMC4wLjE6MjAyMC9hcGkvdjEvaGVhbHRoIHx8IGV4aXQgMSddLFxuICAgIH0sXG4gICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgIGF3c19mbHVlbnRfYml0X2luaXRfczNfMTogZmx1ZW50Qml0UzNDb25maWdGaWxlLFxuICAgIH0sXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBMb2dnaW5nKHByb3BzOiB7XG4gIHNjb3BlOiBDb25zdHJ1Y3Q7XG4gIGFjY291bnROYW1lOiBzdHJpbmc7XG4gIHRlYW1OYW1lOiBzdHJpbmc7XG4gIHRlYW1JZGVudGlmaWVyOiBzdHJpbmc7XG4gIHN0YWdlOiBzdHJpbmc7XG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbiAgZGF0YWRvZ0FwaUtleTogZWNzLlNlY3JldDtcbiAgZGF0YWRvZ0xvZ2dpbmdNb2RlOiBEYXRhRG9nTG9nZ2luZ01vZGU7XG4gIGRhdGFkb2dTaXRlOiBzdHJpbmc7XG4gIGNvbnRhaW5lclR5cGU6ICdzZXJ2aWNlJyB8ICdkYXRhZG9nLXNpZGVjYXInO1xuICBhZGRpdGlvbmFsVGFnczogeyBbazogc3RyaW5nXTogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG59KTogZWNzLkxvZ0RyaXZlciB7XG4gIGxldCBsb2dHcm91cE5hbWU6IHN0cmluZztcbiAgbGV0IGxvZ0dyb3VwSWQ6IHN0cmluZztcbiAgbGV0IGNvbnRhaW5lclR5cGVDYW1lbENhc2U6IHN0cmluZztcblxuICBzd2l0Y2ggKHByb3BzLmNvbnRhaW5lclR5cGUpIHtcbiAgICBjYXNlICdzZXJ2aWNlJzpcbiAgICAgIGxvZ0dyb3VwSWQgPSAnTG9nR3JvdXBGb3JTZXJ2aWNlJztcbiAgICAgIGxvZ0dyb3VwTmFtZSA9IHByb3BzLnNlcnZpY2VOYW1lO1xuICAgICAgY29udGFpbmVyVHlwZUNhbWVsQ2FzZSA9ICdTZXJ2aWNlJztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZGF0YWRvZy1zaWRlY2FyJzpcbiAgICAgIGxvZ0dyb3VwSWQgPSAnTG9nR3JvdXBGb3JEYXRhZG9nU2lkZWNhcic7XG4gICAgICBsb2dHcm91cE5hbWUgPSBgJHtwcm9wcy5zZXJ2aWNlTmFtZX0tJHtwcm9wcy5jb250YWluZXJUeXBlfWA7XG4gICAgICBjb250YWluZXJUeXBlQ2FtZWxDYXNlID0gJ0RhdGFkb2dTaWRlY2FyJztcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgY29uc3QgeyBhY2NvdW50OiBhY2NvdW50SWQsIHJlZ2lvbiB9ID0gU3RhY2sub2YocHJvcHMuc2NvcGUpO1xuXG4gIHN3aXRjaCAocHJvcHMuZGF0YWRvZ0xvZ2dpbmdNb2RlKSB7XG4gICAgY2FzZSBEYXRhRG9nTG9nZ2luZ01vZGUuQVdTX0ZJUkVfTEVOUzpcbiAgICAgIC8vIFRPRE8gY2FuIHdlIHVzZSBgc2VjcmV0T3B0aW9uc2AgaGVyZSBhcyB3ZWxsLCBlLmcuIGFzIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3Mtc2FtcGxlcy9hbWF6b24tZWNzLWZpcmVsZW5zLWV4YW1wbGVzL2Jsb2IvbWFpbmxpbmUvZXhhbXBsZXMvZmx1ZW50LWJpdC9kYXRhZG9nL3Rhc2stZGVmaW5pdGlvbi5qc29uI0wzMy1MMzZcbiAgICAgIC8vIFByb2JhYmx5IG5vdCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvODE3NFxuICAgICAgcmV0dXJuIGVjcy5Mb2dEcml2ZXJzLmZpcmVsZW5zKHtcbiAgICAgICAgLy8gc2VlIGh0dHBzOi8vZG9jcy5kYXRhZG9naHEuY29tL2ludGVncmF0aW9ucy9mbHVlbnRiaXQvI2NvbmZpZ3VyYXRpb24tcGFyYW1ldGVyc1xuICAgICAgICBzZWNyZXRPcHRpb25zOiB7XG4gICAgICAgICAgYXBpS2V5OiBwcm9wcy5kYXRhZG9nQXBpS2V5LFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgTmFtZTogJ2RhdGFkb2cnLFxuICAgICAgICAgIE1hdGNoOiAnKicsXG4gICAgICAgICAgSG9zdDogYGh0dHAtaW50YWtlLmxvZ3MuJHtwcm9wcy5kYXRhZG9nU2l0ZX1gLFxuICAgICAgICAgIFRMUzogJ29uJyxcbiAgICAgICAgICBjb21wcmVzczogJ2d6aXAnLFxuICAgICAgICAgIGRkX3NlcnZpY2U6IGxvZ0dyb3VwTmFtZSxcbiAgICAgICAgICBkZF9zb3VyY2U6ICdyaW8tZmFyZ2F0ZScsXG4gICAgICAgICAgZGRfbWVzc2FnZV9rZXk6ICdsb2cnLFxuICAgICAgICAgIGRkX3RhZ3M6IGdldFRhZ3NFbnZpcm9ubWVudFZhcmlhYmxlVmFsdWUoeyAuLi5wcm9wcywgYWNjb3VudElkLCByZWdpb24sIGNvbnRhaW5lclR5cGU6ICdmbHVlbnQtYml0JyB9KSxcbiAgICAgICAgICBwcm92aWRlcjogJ2VjcycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgIGNhc2UgRGF0YURvZ0xvZ2dpbmdNb2RlLkZPUldBUkRFUl9MQU1CREE6XG4gICAgY2FzZSBEYXRhRG9nTG9nZ2luZ01vZGUuREFUQURPR19GT1JXQVJERVJfTEFNQkRBOiB7XG4gICAgICBjb25zdCBsb2dHcm91cEZvckZvcndhcmRpbmdMYW1iZGEgPSBuZXcgbG9ncy5Mb2dHcm91cChwcm9wcy5zY29wZSwgbG9nR3JvdXBJZCwge1xuICAgICAgICBsb2dHcm91cE5hbWUsXG4gICAgICAgIHJldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9XRUVLLFxuICAgICAgfSk7XG4gICAgICBUYWdzLm9mKGxvZ0dyb3VwRm9yRm9yd2FyZGluZ0xhbWJkYSkuYWRkKCdzZXJ2aWNlJywgcHJvcHMuc2VydmljZU5hbWUpO1xuICAgICAgY29uc3QgbG9nRm9yd2FyZGVyTGFtYmRhQXJuT3V0cHV0TmFtZSA9XG4gICAgICAgIHByb3BzLmRhdGFkb2dMb2dnaW5nTW9kZSA9PT0gRGF0YURvZ0xvZ2dpbmdNb2RlLkRBVEFET0dfRk9SV0FSREVSX0xBTUJEQVxuICAgICAgICAgID8gJ2RhdGFkb2ctZm9yd2FyZGVyLUZvcndhcmRlckFybidcbiAgICAgICAgICA6ICdjdXN0b20tcmVzb3VyY2UtZGF0YWRvZy1sb2dmb3J3YXJkZXItZnVuY3Rpb24tYXJuJztcbiAgICAgIGNvbnN0IGxvZ0ZvcndhcmRlckxhbWJkYUFybiA9IEZuLmltcG9ydFZhbHVlKGxvZ0ZvcndhcmRlckxhbWJkYUFybk91dHB1dE5hbWUpO1xuICAgICAgY29uc3QgY2ZuUGVybWlzc2lvbiA9IG5ldyBsYW1iZGEuQ2ZuUGVybWlzc2lvbihwcm9wcy5zY29wZSwgYExvZ0ZvcndhcmRlclBlcm1pc3Npb24ke2NvbnRhaW5lclR5cGVDYW1lbENhc2V9YCwge1xuICAgICAgICBhY3Rpb246ICdsYW1iZGE6SW52b2tlRnVuY3Rpb24nLFxuICAgICAgICBmdW5jdGlvbk5hbWU6IGxvZ0ZvcndhcmRlckxhbWJkYUFybixcbiAgICAgICAgcHJpbmNpcGFsOiBgbG9ncy4ke3JlZ2lvbn0uYW1hem9uYXdzLmNvbWAsXG4gICAgICAgIHNvdXJjZUFybjogbG9nR3JvdXBGb3JGb3J3YXJkaW5nTGFtYmRhLmxvZ0dyb3VwQXJuLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBjZm5TdWJzY3JpcHRpb25GaWx0ZXIgPSBuZXcgbG9ncy5DZm5TdWJzY3JpcHRpb25GaWx0ZXIoXG4gICAgICAgIHByb3BzLnNjb3BlLFxuICAgICAgICBgTG9nRm9yd2FyZGVyU3Vic2NyaXB0aW9uRmlsdGVyJHtjb250YWluZXJUeXBlQ2FtZWxDYXNlfWAsXG4gICAgICAgIHtcbiAgICAgICAgICBkZXN0aW5hdGlvbkFybjogbG9nRm9yd2FyZGVyTGFtYmRhQXJuLFxuICAgICAgICAgIGZpbHRlclBhdHRlcm46ICcnLFxuICAgICAgICAgIGxvZ0dyb3VwTmFtZTogbG9nR3JvdXBGb3JGb3J3YXJkaW5nTGFtYmRhLmxvZ0dyb3VwTmFtZSxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGNmblN1YnNjcmlwdGlvbkZpbHRlci5hZGREZXBlbmRlbmN5KGNmblBlcm1pc3Npb24pO1xuICAgICAgcmV0dXJuIGVjcy5Mb2dEcml2ZXJzLmF3c0xvZ3Moe1xuICAgICAgICBzdHJlYW1QcmVmaXg6IHByb3BzLmNvbnRhaW5lclR5cGUsXG4gICAgICAgIGxvZ0dyb3VwOiBsb2dHcm91cEZvckZvcndhcmRpbmdMYW1iZGEsXG4gICAgICAgIG1vZGU6IGVjcy5Bd3NMb2dEcml2ZXJNb2RlLk5PTl9CTE9DS0lORyxcbiAgICAgICAgbWF4QnVmZmVyU2l6ZTogU2l6ZS5tZWJpYnl0ZXMoMjUpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2FzZSBEYXRhRG9nTG9nZ2luZ01vZGUuTk9ORToge1xuICAgICAgY29uc3QgbG9nR3JvdXBJbkNsb3Vkd2F0Y2hPbmx5ID0gbmV3IGxvZ3MuTG9nR3JvdXAocHJvcHMuc2NvcGUsIGxvZ0dyb3VwSWQsIHtcbiAgICAgICAgcmV0ZW50aW9uOiBsb2dzLlJldGVudGlvbkRheXMuT05FX1dFRUssXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBlY3MuTG9nRHJpdmVycy5hd3NMb2dzKHtcbiAgICAgICAgc3RyZWFtUHJlZml4OiBwcm9wcy5jb250YWluZXJUeXBlLFxuICAgICAgICBsb2dHcm91cDogbG9nR3JvdXBJbkNsb3Vkd2F0Y2hPbmx5LFxuICAgICAgICBtb2RlOiBlY3MuQXdzTG9nRHJpdmVyTW9kZS5OT05fQkxPQ0tJTkcsXG4gICAgICAgIG1heEJ1ZmZlclNpemU6IFNpemUubWViaWJ5dGVzKDI1KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlTG9nZ2luZ0FuZE1vbml0b3JpbmdBcmVSZWFkeUJlZm9yZVNlcnZpY2VTdGFydHMoXG4gIHJpb0ZhcmdhdGVTZXJ2aWNlOiBSaW9GYXJnYXRlU2VydmljZSB8IFJpb0ZhcmdhdGVTZXJ2aWNlQmx1ZUdyZWVuQWxwaGFcbik6IHZvaWQge1xuICByaW9GYXJnYXRlU2VydmljZS5zZXJ2aWNlQ29udGFpbmVyRGVmaW5pdGlvbi5hZGRDb250YWluZXJEZXBlbmRlbmNpZXMoe1xuICAgIGNvbnRhaW5lcjogcmlvRmFyZ2F0ZVNlcnZpY2UuZGF0YWRvZ1NpZGVDYXJDb250YWluZXJEZWZpbml0aW9uLFxuICAgIGNvbmRpdGlvbjogZWNzLkNvbnRhaW5lckRlcGVuZGVuY3lDb25kaXRpb24uSEVBTFRIWSxcbiAgfSk7XG5cbiAgaWYgKHJpb0ZhcmdhdGVTZXJ2aWNlLmxvZ1JvdXRlckNvbnRhaW5lckRlZmluaXRpb24pIHtcbiAgICByaW9GYXJnYXRlU2VydmljZS5zZXJ2aWNlQ29udGFpbmVyRGVmaW5pdGlvbi5hZGRDb250YWluZXJEZXBlbmRlbmNpZXMoe1xuICAgICAgY29udGFpbmVyOiByaW9GYXJnYXRlU2VydmljZS5sb2dSb3V0ZXJDb250YWluZXJEZWZpbml0aW9uLFxuICAgICAgY29uZGl0aW9uOiBlY3MuQ29udGFpbmVyRGVwZW5kZW5jeUNvbmRpdGlvbi5TVEFSVCxcbiAgICB9KTtcblxuICAgIGlmIChyaW9GYXJnYXRlU2VydmljZS5kYXRhZG9nU2lkZUNhckNvbnRhaW5lckRlZmluaXRpb24ubG9nRHJpdmVyQ29uZmlnPy5sb2dEcml2ZXIgPT09ICdhd3NmaXJlbGVucycpIHtcbiAgICAgIHJpb0ZhcmdhdGVTZXJ2aWNlLmRhdGFkb2dTaWRlQ2FyQ29udGFpbmVyRGVmaW5pdGlvbi5hZGRDb250YWluZXJEZXBlbmRlbmNpZXMoe1xuICAgICAgICBjb250YWluZXI6IHJpb0ZhcmdhdGVTZXJ2aWNlLmxvZ1JvdXRlckNvbnRhaW5lckRlZmluaXRpb24sXG4gICAgICAgIGNvbmRpdGlvbjogZWNzLkNvbnRhaW5lckRlcGVuZGVuY3lDb25kaXRpb24uU1RBUlQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|