@odigos/aws-cdk 0.0.17 → 0.0.18
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 +80 -42
- package/lib/collector-config.d.ts +14 -12
- package/lib/collector-config.js +36 -14
- package/lib/fargate.js +14 -12
- package/lib/generated/distributions.d.ts +19 -58
- package/lib/generated/distributions.js +206 -2
- package/lib/generated/fargate.d.ts +2 -2
- package/lib/generated/fargate.js +3 -3
- package/lib/generated/layers.d.ts +3 -3
- package/lib/generated/layers.js +350 -148
- package/lib/instrumentation.d.ts +11 -7
- package/lib/instrumentation.js +65 -71
- package/lib/runtime.d.ts +2 -0
- package/lib/runtime.js +13 -2
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/types.d.ts +7 -1
- package/lib/types.js +1 -1
- package/package.json +1 -1
package/lib/instrumentation.d.ts
CHANGED
|
@@ -70,6 +70,12 @@ export interface OdigosInstrumentationOptions {
|
|
|
70
70
|
* @default - resolved from layerSource
|
|
71
71
|
*/
|
|
72
72
|
readonly layerVersion?: lambda.ILayerVersion;
|
|
73
|
+
/**
|
|
74
|
+
* Architecture-matched collector layer when supplying a custom ADOT SDK layer.
|
|
75
|
+
* Upstream SDK layers already include their collector and do not use this option.
|
|
76
|
+
* @default - resolved from layerSource for ADOT
|
|
77
|
+
*/
|
|
78
|
+
readonly collectorLayerVersion?: lambda.ILayerVersion;
|
|
73
79
|
/**
|
|
74
80
|
* The value the function already needs in its language loader variable (`NODE_OPTIONS`,
|
|
75
81
|
* `JAVA_TOOL_OPTIONS` or `PYTHONPATH`), which the Odigos loader is joined to rather than replacing.
|
|
@@ -115,8 +121,8 @@ export interface OdigosLambdaInstrumentationProps extends OdigosInstrumentationO
|
|
|
115
121
|
* ```
|
|
116
122
|
*
|
|
117
123
|
* What it does to each function: attaches the layer for the function's language and architecture, sets
|
|
118
|
-
* `AWS_LAMBDA_EXEC_WRAPPER`
|
|
119
|
-
* collector
|
|
124
|
+
* `AWS_LAMBDA_EXEC_WRAPPER` and compact `ODIGOS_LAMBDA_CONFIG`. The layer builds the SDK environment and
|
|
125
|
+
* collector pipelines at startup; ownership and exact layer attribution are recorded in resource tags.
|
|
120
126
|
*
|
|
121
127
|
* The function's SDK exports to the collector on localhost, not to your destination. The collector
|
|
122
128
|
* forwards after the handler has already returned, so a slow destination costs billed duration rather
|
|
@@ -129,14 +135,13 @@ export interface OdigosLambdaInstrumentationProps extends OdigosInstrumentationO
|
|
|
129
135
|
* ends up owned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts the
|
|
130
136
|
* connector's, and every round trip publishes a new function version.
|
|
131
137
|
*
|
|
132
|
-
* Choose one per function. This construct writes `
|
|
133
|
-
* ownership
|
|
138
|
+
* Choose one per function. This construct writes `odigos:iac` resource tags and never the connector's `odigos:managed`
|
|
139
|
+
* ownership tag, so an IaC-instrumented function reports as instrumented but is not one the connector
|
|
134
140
|
* will roll back — though it will happily take it over if you enable it as a source.
|
|
135
141
|
*/
|
|
136
142
|
export declare class OdigosLambdaInstrumentation extends Construct {
|
|
137
143
|
private readonly options;
|
|
138
144
|
private readonly resolver;
|
|
139
|
-
private readonly collectorConfig;
|
|
140
145
|
private readonly instrumented;
|
|
141
146
|
constructor(scope: Construct, id: string, props: OdigosLambdaInstrumentationProps);
|
|
142
147
|
/**
|
|
@@ -151,8 +156,7 @@ export declare class OdigosLambdaInstrumentation extends Construct {
|
|
|
151
156
|
*
|
|
152
157
|
* Mirrors `applyHandlerEnv` / `applyWebServerEnv` in the connector, including what is deliberately NOT
|
|
153
158
|
* set: `OTEL_EXPORTER_OTLP_ENDPOINT` stays unset so the SDK keeps exporting to the in-Lambda collector
|
|
154
|
-
* on localhost rather than blocking the invocation on the remote destination, and
|
|
155
|
-
* `OTEL_*_EXPORTER` stays unset because `otlp` is already the SDK default.
|
|
159
|
+
* on localhost rather than blocking the invocation on the remote destination, and every signal exporter is selected explicitly.
|
|
156
160
|
*/
|
|
157
161
|
private environmentFor;
|
|
158
162
|
}
|
package/lib/instrumentation.js
CHANGED
|
@@ -5,41 +5,17 @@ exports.OdigosInstrumentationAspect = exports.OdigosLambdaInstrumentation = void
|
|
|
5
5
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
6
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
7
7
|
const lambda = require("aws-cdk-lib/aws-lambda");
|
|
8
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
8
9
|
const constructs_1 = require("constructs");
|
|
9
10
|
const collector_config_1 = require("./collector-config");
|
|
10
|
-
const layers_1 = require("./generated/layers");
|
|
11
11
|
const layer_resolver_1 = require("./layer-resolver");
|
|
12
12
|
const runtime_1 = require("./runtime");
|
|
13
13
|
const types_1 = require("./types");
|
|
14
14
|
/** `AWS_LAMBDA_EXEC_WRAPPER` — the layer's entry point in handler mode. */
|
|
15
15
|
const ENV_EXEC_WRAPPER = 'AWS_LAMBDA_EXEC_WRAPPER';
|
|
16
16
|
/** Service name reported on every span, metric and log record. */
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const ENV_OTEL_LOG_LEVEL = 'OTEL_LOG_LEVEL';
|
|
20
|
-
/**
|
|
21
|
-
* Schema version of the marker payload. Must match `api.IaCMarkerVersion` in the connector — it is what tells
|
|
22
|
-
* the connector how to read the rest of the object, so a bumped version there is a change here.
|
|
23
|
-
*/
|
|
24
|
-
const MARKER_VERSION = 1;
|
|
25
|
-
/**
|
|
26
|
-
* `ODIGOS_IAC` — the marker recording that this function was instrumented by Odigos IaC tooling, by which
|
|
27
|
-
* package version, and carrying which layer. This construct always writes it, and it is what makes Odigos
|
|
28
|
-
* report the function as instrumented rather than `Absent` — "awaiting your deployment".
|
|
29
|
-
*
|
|
30
|
-
* It is NOT `ODIGOS_MANAGED`, and the difference is the whole reason there are two variables. That one is the
|
|
31
|
-
* connector's record of a mutation IT performed, whose payload is the snapshot it restores from on rollback;
|
|
32
|
-
* a CDK stack has no such snapshot to offer, because nothing was mutated — the environment below IS the
|
|
33
|
-
* function's definition. So the connector accepts either marker for "is this instrumented by Odigos", and
|
|
34
|
-
* only its own for "may I roll this back". This construct writes the first and never the second: the package
|
|
35
|
-
* will not claim ownership of a function on your behalf.
|
|
36
|
-
*
|
|
37
|
-
* The `layer` field is the load-bearing one. The connector reads it back to decide which layer version the
|
|
38
|
-
* function is SUPPOSED to carry, so a version you pinned is respected instead of being reported as drift the
|
|
39
|
-
* day Odigos publishes a newer one. It works in `IN_ACCOUNT` mode too, where the ARN is a deploy-time
|
|
40
|
-
* reference your own code has no way to obtain.
|
|
41
|
-
*/
|
|
42
|
-
const ENV_IAC_MARKER = 'ODIGOS_IAC';
|
|
17
|
+
/** Compact SDK and destination settings; all attribution markers are Lambda resource tags. */
|
|
18
|
+
const ENV_LAMBDA_CONFIG = 'ODIGOS_LAMBDA_CONFIG';
|
|
43
19
|
/**
|
|
44
20
|
* The service a function reports as, when the caller has not named one.
|
|
45
21
|
*
|
|
@@ -78,8 +54,8 @@ function defaultServiceName(fn) {
|
|
|
78
54
|
* ```
|
|
79
55
|
*
|
|
80
56
|
* What it does to each function: attaches the layer for the function's language and architecture, sets
|
|
81
|
-
* `AWS_LAMBDA_EXEC_WRAPPER`
|
|
82
|
-
* collector
|
|
57
|
+
* `AWS_LAMBDA_EXEC_WRAPPER` and compact `ODIGOS_LAMBDA_CONFIG`. The layer builds the SDK environment and
|
|
58
|
+
* collector pipelines at startup; ownership and exact layer attribution are recorded in resource tags.
|
|
83
59
|
*
|
|
84
60
|
* The function's SDK exports to the collector on localhost, not to your destination. The collector
|
|
85
61
|
* forwards after the handler has already returned, so a slow destination costs billed duration rather
|
|
@@ -92,8 +68,8 @@ function defaultServiceName(fn) {
|
|
|
92
68
|
* ends up owned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts the
|
|
93
69
|
* connector's, and every round trip publishes a new function version.
|
|
94
70
|
*
|
|
95
|
-
* Choose one per function. This construct writes `
|
|
96
|
-
* ownership
|
|
71
|
+
* Choose one per function. This construct writes `odigos:iac` resource tags and never the connector's `odigos:managed`
|
|
72
|
+
* ownership tag, so an IaC-instrumented function reports as instrumented but is not one the connector
|
|
97
73
|
* will roll back — though it will happily take it over if you enable it as a source.
|
|
98
74
|
*/
|
|
99
75
|
class OdigosLambdaInstrumentation extends constructs_1.Construct {
|
|
@@ -104,7 +80,7 @@ class OdigosLambdaInstrumentation extends constructs_1.Construct {
|
|
|
104
80
|
this.resolver = new layer_resolver_1.OdigosLayerResolver(this, props.layerSource ?? types_1.OdigosLayerSource.ODIGOS_PUBLIC);
|
|
105
81
|
// Rendered once. It depends only on the destination, and rendering it per function would make an
|
|
106
82
|
// accidental difference between two functions possible.
|
|
107
|
-
|
|
83
|
+
(0, collector_config_1.renderCollectorConfig)(props.destination);
|
|
108
84
|
// A warning rather than an error, because a collector CAN be reached over gRPC on a non-standard port —
|
|
109
85
|
// but the overwhelmingly likelier reading of `endpoint: "host:4318"` is an OTLP/HTTP endpoint passed to
|
|
110
86
|
// the gRPC exporter, which builds, starts, and then never delivers a batch. Silent for the caller who
|
|
@@ -143,13 +119,26 @@ class OdigosLambdaInstrumentation extends constructs_1.Construct {
|
|
|
143
119
|
}
|
|
144
120
|
throw new Error(`${message} Set skipUnsupportedRuntimes: true to skip it instead.`);
|
|
145
121
|
}
|
|
122
|
+
const recipe = (0, runtime_1.distributionRecipe)(language, this.options.distro, runtimeName);
|
|
123
|
+
(0, runtime_1.distributionWrapper)(language, this.options.distro, this.options.javaHandlerDistro, this.options.mode === types_1.OdigosInstrumentationMode.WEB_SERVER);
|
|
124
|
+
if (recipe.applicationSignals && !(0, collector_config_1.resolvedSignals)(this.options.destination).traces) {
|
|
125
|
+
throw new Error('ADOT + Application Signals requires traces to be enabled for the destination.');
|
|
126
|
+
}
|
|
127
|
+
if (recipe.applicationSignals) {
|
|
128
|
+
fn.role?.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('CloudWatchLambdaApplicationSignalsExecutionRolePolicy'));
|
|
129
|
+
aws_cdk_lib_1.Annotations.of(fn).addWarningV2('@odigos/aws-cdk:applicationSignals', 'Enable CloudWatch Application Signals service discovery once in this AWS account and region. Application Signals also sends AWS service telemetry through the Lambda embedded agent.');
|
|
130
|
+
}
|
|
131
|
+
const resource = fn.node.defaultChild;
|
|
132
|
+
resource.addPropertyDeletionOverride('Environment.Variables.ODIGOS_MANAGED');
|
|
133
|
+
resource.addPropertyDeletionOverride('Environment.Variables.ODIGOS_IAC');
|
|
146
134
|
this.instrumented.add(key);
|
|
147
135
|
const architecture = fn.architecture.name;
|
|
148
|
-
const layer = this.options.layerVersion ?? this.resolver.resolve(language, architecture);
|
|
149
|
-
|
|
136
|
+
const layer = this.options.layerVersion ?? this.resolver.resolve(recipe.artifact ?? language, architecture);
|
|
137
|
+
const collectorLayer = recipe.artifact ? (this.options.collectorLayerVersion ?? this.resolver.resolve('adot-collector', architecture)) : undefined;
|
|
138
|
+
fn.addLayers(...(collectorLayer ? [layer, collectorLayer] : [layer]));
|
|
150
139
|
// The ARN, not the construct: the marker has to name the exact layer version the function carries, and
|
|
151
140
|
// in IN_ACCOUNT mode that is a nested-stack output reference resolved at deploy time.
|
|
152
|
-
for (const [name, value] of Object.entries(this.environmentFor(fn, language, layer.layerVersionArn))) {
|
|
141
|
+
for (const [name, value] of Object.entries(this.environmentFor(fn, language, layer.layerVersionArn, collectorLayer?.layerVersionArn))) {
|
|
153
142
|
fn.addEnvironment(name, value);
|
|
154
143
|
}
|
|
155
144
|
}
|
|
@@ -164,53 +153,58 @@ class OdigosLambdaInstrumentation extends constructs_1.Construct {
|
|
|
164
153
|
*
|
|
165
154
|
* Mirrors `applyHandlerEnv` / `applyWebServerEnv` in the connector, including what is deliberately NOT
|
|
166
155
|
* set: `OTEL_EXPORTER_OTLP_ENDPOINT` stays unset so the SDK keeps exporting to the in-Lambda collector
|
|
167
|
-
* on localhost rather than blocking the invocation on the remote destination, and
|
|
168
|
-
* `OTEL_*_EXPORTER` stays unset because `otlp` is already the SDK default.
|
|
156
|
+
* on localhost rather than blocking the invocation on the remote destination, and every signal exporter is selected explicitly.
|
|
169
157
|
*/
|
|
170
|
-
environmentFor(fn, language, layerArn) {
|
|
158
|
+
environmentFor(fn, language, layerArn, collectorLayerArn) {
|
|
171
159
|
const { destination, mode, debug, serviceName, javaHandlerDistro, distro, existingLoaderValue } = this.options;
|
|
172
160
|
const webServer = mode === types_1.OdigosInstrumentationMode.WEB_SERVER;
|
|
161
|
+
const recipe = (0, runtime_1.distributionRecipe)(language, distro, fn.runtime.name);
|
|
162
|
+
const signals = (0, collector_config_1.resolvedSignals)(destination);
|
|
163
|
+
const resource = fn.node.defaultChild;
|
|
164
|
+
const current = aws_cdk_lib_1.Stack.of(fn).resolve(resource.environment);
|
|
165
|
+
const originalWrapper = current?.variables?.AWS_LAMBDA_EXEC_WRAPPER ?? '';
|
|
166
|
+
const execWrapper = webServer ? '/opt/odigos-webserver' : (0, runtime_1.distributionWrapper)(language, distro, javaHandlerDistro, false);
|
|
167
|
+
const functionLogs = signals.logs && !webServer && (language === 'ruby' || (language === 'java' &&
|
|
168
|
+
['/opt/otel-handler', '/opt/otel-proxy-handler', '/opt/otel-sqs-handler', '/opt/otel-stream-handler'].includes(execWrapper)));
|
|
169
|
+
const config = {
|
|
170
|
+
v: 1,
|
|
171
|
+
s: serviceName ?? defaultServiceName(fn),
|
|
172
|
+
t: (signals.traces ? 1 : 0) | (signals.metrics ? 2 : 0) | (signals.logs ? 4 : 0),
|
|
173
|
+
e: destination.endpoint ?? destination.httpEndpoint,
|
|
174
|
+
...(destination.httpEndpoint ? { p: true } : {}),
|
|
175
|
+
...(destination.endpoint && destination.insecure ? { i: true } : {}),
|
|
176
|
+
...(destination.headers && Object.keys(destination.headers).length ? { h: destination.headers } : {}),
|
|
177
|
+
...(recipe.applicationSignals ? { a: true } : {}),
|
|
178
|
+
...(functionLogs ? { l: true } : {}),
|
|
179
|
+
...(debug && !webServer ? { d: true } : {}),
|
|
180
|
+
...(webServer ? { w: originalWrapper } : {}),
|
|
181
|
+
};
|
|
173
182
|
const env = {
|
|
174
|
-
[
|
|
175
|
-
[
|
|
176
|
-
[ENV_IAC_MARKER]: JSON.stringify({
|
|
177
|
-
v: MARKER_VERSION,
|
|
178
|
-
source: 'cdk',
|
|
179
|
-
version: layers_1.ODIGOS_VERSION || 'unreleased',
|
|
180
|
-
layer: layerArn,
|
|
181
|
-
}),
|
|
183
|
+
[ENV_EXEC_WRAPPER]: execWrapper,
|
|
184
|
+
[ENV_LAMBDA_CONFIG]: JSON.stringify(config),
|
|
182
185
|
};
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
186
|
+
aws_cdk_lib_1.Tags.of(fn).add('odigos:iac', 'v1');
|
|
187
|
+
aws_cdk_lib_1.Tags.of(fn).add('odigos:sdk-layer', layerArn);
|
|
188
|
+
if (collectorLayerArn)
|
|
189
|
+
aws_cdk_lib_1.Tags.of(fn).add('odigos:collector-layer', collectorLayerArn);
|
|
190
|
+
// Explicit customer loader options remain ordinary customer environment values.
|
|
191
|
+
if (webServer && existingLoaderValue !== undefined) {
|
|
192
|
+
const loaderKey = { java: 'JAVA_TOOL_OPTIONS', nodejs: 'NODE_OPTIONS', python: 'PYTHONPATH' }[language];
|
|
193
|
+
if (loaderKey)
|
|
194
|
+
env[loaderKey] = existingLoaderValue;
|
|
187
195
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
if (debug) {
|
|
191
|
-
env[ENV_OTEL_LOG_LEVEL] = 'debug';
|
|
192
|
-
}
|
|
196
|
+
if (language === 'ruby' && signals.metrics) {
|
|
197
|
+
aws_cdk_lib_1.Annotations.of(fn).addWarningV2('@odigos/aws-cdk:rubySignalsUnsupported', 'The bundled Ruby Lambda SDK cannot generate OTLP metrics. Function stdout/stderr logs are collected by the Lambda collector when logs are selected.');
|
|
193
198
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
// error loop; the pipeline being absent is the half that stops the export.
|
|
197
|
-
const enabled = (0, collector_config_1.resolvedSignals)(destination);
|
|
198
|
-
const overrides = [
|
|
199
|
-
[collector_config_1.ENV_TRACES_EXPORTER, (0, collector_config_1.exporterOverrideFor)(enabled.traces)],
|
|
200
|
-
[collector_config_1.ENV_METRICS_EXPORTER, (0, collector_config_1.exporterOverrideFor)(enabled.metrics)],
|
|
201
|
-
[collector_config_1.ENV_LOGS_EXPORTER, (0, collector_config_1.exporterOverrideFor)(enabled.logs)],
|
|
202
|
-
];
|
|
203
|
-
for (const [name, value] of overrides) {
|
|
204
|
-
if (value !== undefined) {
|
|
205
|
-
env[name] = value;
|
|
206
|
-
}
|
|
199
|
+
if (destination.profiles) {
|
|
200
|
+
aws_cdk_lib_1.Annotations.of(fn).addWarningV2('@odigos/aws-cdk:profilesUnsupported', 'The bundled Lambda language agents do not generate OTLP profiles. Other selected signals remain enabled.');
|
|
207
201
|
}
|
|
208
202
|
return env;
|
|
209
203
|
}
|
|
210
204
|
}
|
|
211
205
|
exports.OdigosLambdaInstrumentation = OdigosLambdaInstrumentation;
|
|
212
206
|
_a = JSII_RTTI_SYMBOL_1;
|
|
213
|
-
OdigosLambdaInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosLambdaInstrumentation", version: "0.0.
|
|
207
|
+
OdigosLambdaInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosLambdaInstrumentation", version: "0.0.18" };
|
|
214
208
|
/**
|
|
215
209
|
* Applies Odigos instrumentation to every `lambda.Function` in a scope.
|
|
216
210
|
*
|
|
@@ -248,5 +242,5 @@ class OdigosInstrumentationAspect {
|
|
|
248
242
|
}
|
|
249
243
|
exports.OdigosInstrumentationAspect = OdigosInstrumentationAspect;
|
|
250
244
|
_b = JSII_RTTI_SYMBOL_1;
|
|
251
|
-
OdigosInstrumentationAspect[_b] = { fqn: "@odigos/aws-cdk.OdigosInstrumentationAspect", version: "0.0.
|
|
252
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFpRTtBQUNqRSxpREFBaUQ7QUFDakQsMkNBQW1EO0FBQ25ELHlEQVE0QjtBQUM1QiwrQ0FBb0Q7QUFDcEQscURBQXVEO0FBQ3ZELHVDQUFtRjtBQUNuRixtQ0FLaUI7QUFFakIsMkVBQTJFO0FBQzNFLE1BQU0sZ0JBQWdCLEdBQUcseUJBQXlCLENBQUM7QUFDbkQsa0VBQWtFO0FBQ2xFLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUM7QUFDN0MsMkZBQTJGO0FBQzNGLE1BQU0sa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUM7QUFFNUM7OztHQUdHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBRXpCOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDO0FBRXBDOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILFNBQVMsa0JBQWtCLENBQUMsRUFBbUI7SUFDN0MsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUE4QyxDQUFDO0lBQ25FLE1BQU0sUUFBUSxHQUFHLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4RixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNyRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNw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O1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDOztBQXZJSCxrRUF3SUM7OztBQU9EOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBYSwyQkFBMkI7SUFHdEM7Ozs7T0FJRztJQUNILFlBQVksS0FBZ0IsRUFBRSxLQUF1QztRQUNuRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksMkJBQTJCLENBQUMsS0FBSyxFQUFFLDZCQUE2QixFQUFFO1lBQzNGLHVCQUF1QixFQUFFLElBQUk7WUFDN0IsR0FBRyxLQUFLO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFnQjtRQUMzQixJQUFJLElBQUksWUFBWSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7O0FBbkJILGtFQW9CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBJQXNwZWN0LCBTdGFjaywgVG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7XG4gIEVOVl9DT0xMRUNUT1JfQ09ORklHX1VSSSxcbiAgRU5WX0xPR1NfRVhQT1JURVIsXG4gIEVOVl9NRVRSSUNTX0VYUE9SVEVSLFxuICBFTlZfVFJBQ0VTX0VYUE9SVEVSLFxuICBleHBvcnRlck92ZXJyaWRlRm9yLFxuICByZW5kZXJDb2xsZWN0b3JDb25maWcsXG4gIHJlc29sdmVkU2lnbmFscyxcbn0gZnJvbSAnLi9jb2xsZWN0b3ItY29uZmlnJztcbmltcG9ydCB7IE9ESUdPU19WRVJTSU9OIH0gZnJvbSAnLi9nZW5lcmF0ZWQvbGF5ZXJzJztcbmltcG9ydCB7IE9kaWdvc0xheWVyUmVzb2x2ZXIgfSBmcm9tICcuL2xheWVyLXJlc29sdmVyJztcbmltcG9ydCB7IGRpc3RyaWJ1dGlvbldyYXBwZXIsIGxhbmd1YWdlRnJvbVJ1bnRpbWUsIHdlYlNlcnZlckVudiB9IGZyb20gJy4vcnVudGltZSc7XG5pbXBvcnQge1xuICBPZGlnb3NEZXN0aW5hdGlvbixcbiAgT2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZSxcbiAgT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8sXG4gIE9kaWdvc0xheWVyU291cmNlLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqIGBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUmAg4oCUIHRoZSBsYXllcidzIGVudHJ5IHBvaW50IGluIGhhbmRsZXIgbW9kZS4gKi9cbmNvbnN0IEVOVl9FWEVDX1dSQVBQRVIgPSAnQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVInO1xuLyoqIFNlcnZpY2UgbmFtZSByZXBvcnRlZCBvbiBldmVyeSBzcGFuLCBtZXRyaWMgYW5kIGxvZyByZWNvcmQuICovXG5jb25zdCBFTlZfU0VSVklDRV9OQU1FID0gJ09URUxfU0VSVklDRV9OQU1FJztcbi8qKiBSYWlzZXMgaW4tZnVuY3Rpb24gT3BlblRlbGVtZXRyeSB2ZXJib3NpdHkgaW50byB0aGUgZnVuY3Rpb24ncyBDbG91ZFdhdGNoIGxvZyBncm91cC4gKi9cbmNvbnN0IEVOVl9PVEVMX0xPR19MRVZFTCA9ICdPVEVMX0xPR19MRVZFTCc7XG5cbi8qKlxuICogU2NoZW1hIHZlcnNpb24gb2YgdGhlIG1hcmtlciBwYXlsb2FkLiBNdXN0IG1hdGNoIGBhcGkuSWFDTWFya2VyVmVyc2lvbmAgaW4gdGhlIGNvbm5lY3RvciDigJQgaXQgaXMgd2hhdCB0ZWxsc1xuICogdGhlIGNvbm5lY3RvciBob3cgdG8gcmVhZCB0aGUgcmVzdCBvZiB0aGUgb2JqZWN0LCBzbyBhIGJ1bXBlZCB2ZXJzaW9uIHRoZXJlIGlzIGEgY2hhbmdlIGhlcmUuXG4gKi9cbmNvbnN0IE1BUktFUl9WRVJTSU9OID0gMTtcblxuLyoqXG4gKiBgT0RJR09TX0lBQ2Ag4oCUIHRoZSBtYXJrZXIgcmVjb3JkaW5nIHRoYXQgdGhpcyBmdW5jdGlvbiB3YXMgaW5zdHJ1bWVudGVkIGJ5IE9kaWdvcyBJYUMgdG9vbGluZywgYnkgd2hpY2hcbiAqIHBhY2thZ2UgdmVyc2lvbiwgYW5kIGNhcnJ5aW5nIHdoaWNoIGxheWVyLiBUaGlzIGNvbnN0cnVjdCBhbHdheXMgd3JpdGVzIGl0LCBhbmQgaXQgaXMgd2hhdCBtYWtlcyBPZGlnb3NcbiAqIHJlcG9ydCB0aGUgZnVuY3Rpb24gYXMgaW5zdHJ1bWVudGVkIHJhdGhlciB0aGFuIGBBYnNlbnRgIOKAlCBcImF3YWl0aW5nIHlvdXIgZGVwbG95bWVudFwiLlxuICpcbiAqIEl0IGlzIE5PVCBgT0RJR09TX01BTkFHRURgLCBhbmQgdGhlIGRpZmZlcmVuY2UgaXMgdGhlIHdob2xlIHJlYXNvbiB0aGVyZSBhcmUgdHdvIHZhcmlhYmxlcy4gVGhhdCBvbmUgaXMgdGhlXG4gKiBjb25uZWN0b3IncyByZWNvcmQgb2YgYSBtdXRhdGlvbiBJVCBwZXJmb3JtZWQsIHdob3NlIHBheWxvYWQgaXMgdGhlIHNuYXBzaG90IGl0IHJlc3RvcmVzIGZyb20gb24gcm9sbGJhY2s7XG4gKiBhIENESyBzdGFjayBoYXMgbm8gc3VjaCBzbmFwc2hvdCB0byBvZmZlciwgYmVjYXVzZSBub3RoaW5nIHdhcyBtdXRhdGVkIOKAlCB0aGUgZW52aXJvbm1lbnQgYmVsb3cgSVMgdGhlXG4gKiBmdW5jdGlvbidzIGRlZmluaXRpb24uIFNvIHRoZSBjb25uZWN0b3IgYWNjZXB0cyBlaXRoZXIgbWFya2VyIGZvciBcImlzIHRoaXMgaW5zdHJ1bWVudGVkIGJ5IE9kaWdvc1wiLCBhbmRcbiAqIG9ubHkgaXRzIG93biBmb3IgXCJtYXkgSSByb2xsIHRoaXMgYmFja1wiLiBUaGlzIGNvbnN0cnVjdCB3cml0ZXMgdGhlIGZpcnN0IGFuZCBuZXZlciB0aGUgc2Vjb25kOiB0aGUgcGFja2FnZVxuICogd2lsbCBub3QgY2xhaW0gb3duZXJzaGlwIG9mIGEgZnVuY3Rpb24gb24geW91ciBiZWhhbGYuXG4gKlxuICogVGhlIGBsYXllcmAgZmllbGQgaXMgdGhlIGxvYWQtYmVhcmluZyBvbmUuIFRoZSBjb25uZWN0b3IgcmVhZHMgaXQgYmFjayB0byBkZWNpZGUgd2hpY2ggbGF5ZXIgdmVyc2lvbiB0aGVcbiAqIGZ1bmN0aW9uIGlzIFNVUFBPU0VEIHRvIGNhcnJ5LCBzbyBhIHZlcnNpb24geW91IHBpbm5lZCBpcyByZXNwZWN0ZWQgaW5zdGVhZCBvZiBiZWluZyByZXBvcnRlZCBhcyBkcmlmdCB0aGVcbiAqIGRheSBPZGlnb3MgcHVibGlzaGVzIGEgbmV3ZXIgb25lLiBJdCB3b3JrcyBpbiBgSU5fQUNDT1VOVGAgbW9kZSB0b28sIHdoZXJlIHRoZSBBUk4gaXMgYSBkZXBsb3ktdGltZVxuICogcmVmZXJlbmNlIHlvdXIgb3duIGNvZGUgaGFzIG5vIHdheSB0byBvYnRhaW4uXG4gKi9cbmNvbnN0IEVOVl9JQUNfTUFSS0VSID0gJ09ESUdPU19JQUMnO1xuXG4vKipcbiAqIFRoZSBzZXJ2aWNlIGEgZnVuY3Rpb24gcmVwb3J0cyBhcywgd2hlbiB0aGUgY2FsbGVyIGhhcyBub3QgbmFtZWQgb25lLlxuICpcbiAqIFJFQUQgRlJPTSBUSEUgTDEsIE5PVCBGUk9NIGBmbi5mdW5jdGlvbk5hbWVgLiBUaGUgTDIgcHJvcGVydHkgaXMgYSBjcm9zcy1lbnZpcm9ubWVudC1hd2FyZSB0b2tlbiB0aGF0XG4gKiByZXNvbHZlcyB0byBhIGBSZWZgIHRvIHRoZSBmdW5jdGlvbiBpdHNlbGYgZXZlbiB3aGVuIHRoZSBzdGFjayBzZXQgYGZ1bmN0aW9uTmFtZWAgZXhwbGljaXRseSDigJQgc28gdGhlXG4gKiBvYnZpb3VzIGBTdGFjay5vZihmbikucmVzb2x2ZShmbi5mdW5jdGlvbk5hbWUpYCBuZXZlciB5aWVsZHMgYSBsaXRlcmFsLCBhbmQgZXZlcnkgZnVuY3Rpb24gc2lsZW50bHkgZmVsbFxuICogYmFjayB0byBpdHMgY29uc3RydWN0IGlkLiBgQ2ZuRnVuY3Rpb24uZnVuY3Rpb25OYW1lYCBpcyB0aGUgcmF3IHRlbXBsYXRlIHZhbHVlOiB0aGUgbGl0ZXJhbCB0aGUgc3RhY2tcbiAqIHBhc3NlZCwgb3IgdW5kZWZpbmVkIHdoZW4gQ2xvdWRGb3JtYXRpb24gZ2VuZXJhdGVzIHRoZSBuYW1lLlxuICpcbiAqIFdoeSB0aGUgZmFsbGJhY2sgaXMgdGhlIGNvbnN0cnVjdCBpZCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJhdGVkIG5hbWU6IGEgZ2VuZXJhdGVkIG5hbWUgaXMgYSBgUmVmYCB0byB0aGVcbiAqIGZ1bmN0aW9uLCBhbmQgcHV0dGluZyB0aGF0IGluIHRoZSBmdW5jdGlvbidzIG93biBlbnZpcm9ubWVudCBtYWtlcyB0aGUgcmVzb3VyY2UgZGVwZW5kIG9uIGl0cyBvd25cbiAqIGNyZWF0aW9uIOKAlCBDbG91ZEZvcm1hdGlvbiByZWplY3RzIHRoZSB0ZW1wbGF0ZSB3aXRoIGEgZGVwZW5kZW5jeSBjeWNsZSwgYXQgZGVwbG95IHRpbWUuXG4gKlxuICogVGhpcyBtYXR0ZXJzIGJleW9uZCBjb3NtZXRpY3MuIFRoZSBjb25uZWN0b3IgY29tcGFyZXMgYE9URUxfU0VSVklDRV9OQU1FYCBhZ2FpbnN0IHRoZSB3b3JrbG9hZCdzIG5hbWUgaW5cbiAqIE9kaWdvcywgd2hpY2ggaXMgdGhlIHJlYWwgQVdTIGZ1bmN0aW9uIG5hbWUsIHNvIGEgZnVuY3Rpb24gcmVwb3J0aW5nIGl0cyBjb25zdHJ1Y3QgaWQgaXMgcmVwb3J0ZWQgYXNcbiAqIGRyaWZ0ZWQgb24gdGhlIHNlcnZpY2UtbmFtZSBjb21wb25lbnQuIE5hbWluZyB0aGUgZnVuY3Rpb24gaW4geW91ciBzdGFjayBpcyBub3cgZW5vdWdoIHRvIGxpbmUgdGhlIHR3b1xuICogdXA7IGEgZnVuY3Rpb24gd2hvc2UgbmFtZSBDbG91ZEZvcm1hdGlvbiBnZW5lcmF0ZXMgc3RpbGwgbmVlZHMgYHNlcnZpY2VOYW1lYCBwYXNzZWQgZXhwbGljaXRseS5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdFNlcnZpY2VOYW1lKGZuOiBsYW1iZGEuRnVuY3Rpb24pOiBzdHJpbmcge1xuICBjb25zdCBjZm4gPSBmbi5ub2RlLmRlZmF1bHRDaGlsZCBhcyBsYW1iZGEuQ2ZuRnVuY3Rpb24gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc29sdmVkID0gY2ZuID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTdGFjay5vZihmbikucmVzb2x2ZShjZm4uZnVuY3Rpb25OYW1lKTtcbiAgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gJ3N0cmluZycgJiYgcmVzb2x2ZWQgIT09ICcnICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocmVzb2x2ZWQpKSB7XG4gICAgcmV0dXJuIHJlc29sdmVkO1xuICB9XG4gIHJldHVybiBmbi5ub2RlLmlkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgc2hhcmVkIGJ5IHRoZSBjb25zdHJ1Y3QgYW5kIHRoZSBhc3BlY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zSW5zdHJ1bWVudGF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgaW4tTGFtYmRhIGNvbGxlY3RvciBleHBvcnRzIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb246IE9kaWdvc0Rlc3RpbmF0aW9uO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgT2RpZ29zIGxheWVyIGNvbWVzIGZyb20uXG4gICAqXG4gICAqIEBkZWZhdWx0IE9kaWdvc0xheWVyU291cmNlLk9ESUdPU19QVUJMSUNcbiAgICovXG4gIHJlYWRvbmx5IGxheWVyU291cmNlPzogT2RpZ29zTGF5ZXJTb3VyY2U7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgbW9kZSBvciB3ZWItc2VydmVyIChMYW1iZGEgV2ViIEFkYXB0ZXIpIG1vZGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGF1dG8tZGV0ZWN0aW9uLCBhbmQgdGhhdCBpcyBkZWxpYmVyYXRlIHJhdGhlciB0aGFuIGFuIG9taXNzaW9uOiBkZXRlY3RpbmcgdGhlIHdlYiBhZGFwdGVyXG4gICAqIG1lYW5zIGluc3BlY3RpbmcgdGhlIGZ1bmN0aW9uJ3Mgb3RoZXIgbGF5ZXJzLCB3aGljaCBhdCBzeW50aCB0aW1lIGFyZSBmcmVxdWVudGx5IHVucmVzb2x2ZWQgdG9rZW5zLlxuICAgKiBBIGRldGVjdG9yIHRoYXQgaXMgcmlnaHQgbW9zdCBvZiB0aGUgdGltZSB3b3VsZCBzaWxlbnRseSBicmVhayB0aGUgZnVuY3Rpb25zIGl0IGdvdCB3cm9uZy5cbiAgICpcbiAgICogQGRlZmF1bHQgT2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZS5IQU5ETEVSXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogT2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZTtcblxuICAvKipcbiAgICogQ29ubmVjdG9yIEdyYXBoUUwgZGlzdHJvIG5hbWUsIHN1Y2ggYXMgamF2YS1sYW1iZGEtb3RlbC1hZ2VudCBvciBqYXZhLWxhbWJkYS1vdGVsLXdyYXBwZXIuXG4gICAqIEBkZWZhdWx0IC0gdGhlIGJ1bmRsZWQgZGVmYXVsdCBkaXN0cmlidXRpb24gZm9yIHRoZSBmdW5jdGlvbidzIHJ1bnRpbWVcbiAgICovXG4gIHJlYWRvbmx5IGRpc3Rybz86IHN0cmluZztcblxuICAvKipcbiAgICogTGVnYWN5IGxpZ2h0d2VpZ2h0IEphdmEgaGFuZGxlciBhZGFwdGVyLlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIGNvcnJlc3BvbmRpbmcgamF2YS1sYW1iZGEtb3RlbC0qLXdyYXBwZXIgZGlzdHJvLlxuICAgKi9cbiAgcmVhZG9ubHkgamF2YUhhbmRsZXJEaXN0cm8/OiBPZGlnb3NKYXZhSGFuZGxlckRpc3RybztcblxuICAvKipcbiAgICogYE9URUxfU0VSVklDRV9OQU1FYCBmb3IgZXZlcnkgZnVuY3Rpb24gdGhpcyBpbnN0cnVtZW50cy5cbiAgICpcbiAgICogVXN1YWxseSB3cm9uZyB0byBzZXQgd2hlbiBpbnN0cnVtZW50aW5nIG1vcmUgdGhhbiBvbmUgZnVuY3Rpb24g4oCUIHRoZXkgd291bGQgYWxsIHJlcG9ydCBhcyB0aGUgc2FtZVxuICAgKiBzZXJ2aWNlLlxuICAgKlxuICAgKiBMZWZ0IHVuc2V0LCBhIGZ1bmN0aW9uIHJlcG9ydHMgYXMgaXRzIGV4cGxpY2l0bHktc2V0IHBoeXNpY2FsIG5hbWUgaWYgaXQgaGFzIG9uZSwgYW5kIG90aGVyd2lzZSBhc1xuICAgKiBpdHMgY29uc3RydWN0IGlkLiBJdCBkZWxpYmVyYXRlbHkgZG9lcyBub3QgZGVmYXVsdCB0byB0aGUgZ2VuZXJhdGVkIHBoeXNpY2FsIG5hbWU6IHRoYXQgdmFsdWUgaXMgYVxuICAgKiBgUmVmYCB0byB0aGUgZnVuY3Rpb24gaXRzZWxmLCBhbmQgYSBmdW5jdGlvbiByZWZlcmVuY2luZyBpdHNlbGYgaW4gaXRzIG93biBlbnZpcm9ubWVudCBpcyBhXG4gICAqIENsb3VkRm9ybWF0aW9uIGRlcGVuZGVuY3kgY3ljbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGZ1bmN0aW9uJ3MgcGh5c2ljYWwgbmFtZSBpZiBleHBsaWNpdGx5IHNldCwgb3RoZXJ3aXNlIGl0cyBjb25zdHJ1Y3QgaWRcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSYWlzZSBpbi1mdW5jdGlvbiBPcGVuVGVsZW1ldHJ5IHZlcmJvc2l0eSAoYE9URUxfTE9HX0xFVkVMPWRlYnVnYCkuXG4gICAqXG4gICAqIFRoZSBsYXllciwgU0RLIGFuZCBjb2xsZWN0b3IgdGhlbiBlbWl0IHNwYW4gYW5kIE9UTFAtZXhwb3J0IGRpYWdub3N0aWNzIGludG8gdGhlIGZ1bmN0aW9uJ3MgQ2xvdWRXYXRjaFxuICAgKiBsb2cgZ3JvdXAuIFVzZWZ1bCB3aGlsZSB3aXJpbmcgdXAgYSBkZXN0aW5hdGlvbiwgZXhwZW5zaXZlIHRvIGxlYXZlIG9uLlxuICAgKlxuICAgKiBIYXMgbm8gZWZmZWN0IGluIHdlYi1zZXJ2ZXIgbW9kZSwgbWF0Y2hpbmcgdGhlIGNvbm5lY3Rvciwgd2hpY2ggbmV2ZXIgc2V0cyBhIGxvZyBsZXZlbCB0aGVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRlYnVnPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQXR0YWNoIHRoaXMgbGF5ZXIgaW5zdGVhZCBvZiByZXNvbHZpbmcgb25lLiBPdmVycmlkZXMgYGxheWVyU291cmNlYCBlbnRpcmVseS5cbiAgICpcbiAgICogVGhlIGVzY2FwZSBoYXRjaCBmb3IgYSBsYXllciBtaXJyb3JlZCBpbnRvIGEgcHJpdmF0ZSByZWdpc3RyeSBvciBhbiBpbnRlcm5hbCBhY2NvdW50LiBUaGUgbGF5ZXIgbXVzdFxuICAgKiBoYXZlIHRoZSBzYW1lIGNvbnRlbnRzIGFzIHRoZSBPZGlnb3Mgb25lIOKAlCB0aGUgZW52aXJvbm1lbnQgc2V0IGhlcmUgYXNzdW1lcyBpdHMgZXhhY3Qgc2NyaXB0IGxheW91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSByZXNvbHZlZCBmcm9tIGxheWVyU291cmNlXG4gICAqL1xuICByZWFkb25seSBsYXllclZlcnNpb24/OiBsYW1iZGEuSUxheWVyVmVyc2lvbjtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSBmdW5jdGlvbiBhbHJlYWR5IG5lZWRzIGluIGl0cyBsYW5ndWFnZSBsb2FkZXIgdmFyaWFibGUgKGBOT0RFX09QVElPTlNgLFxuICAgKiBgSkFWQV9UT09MX09QVElPTlNgIG9yIGBQWVRIT05QQVRIYCksIHdoaWNoIHRoZSBPZGlnb3MgbG9hZGVyIGlzIGpvaW5lZCB0byByYXRoZXIgdGhhbiByZXBsYWNpbmcuXG4gICAqXG4gICAqIE9ubHkgdXNlZCBpbiB3ZWItc2VydmVyIG1vZGUuIEl0IGhhcyB0byBiZSBwYXNzZWQgZXhwbGljaXRseSBiZWNhdXNlIENESydzIGBsYW1iZGEuRnVuY3Rpb25gIGV4cG9zZXNcbiAgICogbm8gd2F5IHRvIHJlYWQgYmFjayBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXQgZWxzZXdoZXJlIGluIHRoZSBhcHAg4oCUIGFuIG9taXR0ZWQgdmFsdWUgaGVyZSBpc1xuICAgKiBzaWxlbnRseSBvdmVyd3JpdHRlbiwgd2hpY2ggZm9yIGBOT0RFX09QVElPTlNgIGNhbiBtZWFuIGxvc2luZyBhIGZsYWcgdGhlIGFwcCBuZWVkcyB0byBib290LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBsb2FkZXIgdmFyaWFibGUgaXMgc2V0IHRvIHRoZSBPZGlnb3MgdmFsdWUgYWxvbmVcbiAgICovXG4gIHJlYWRvbmx5IGV4aXN0aW5nTG9hZGVyVmFsdWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNraXAgZnVuY3Rpb25zIHdob3NlIHJ1bnRpbWUgaGFzIG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGluc3RlYWQgb2YgdGhyb3dpbmcuXG4gICAqXG4gICAqIGBkb3RuZXQqYCBhbmQgYHByb3ZpZGVkLipgIChHbywgY3VzdG9tIHJ1bnRpbWVzKSBoYXZlIG5vIGxhbmd1YWdlIGxheWVyIHVwc3RyZWFtLiBFeHBsaWNpdGx5XG4gICAqIGluc3RydW1lbnRpbmcgb25lIGlzIGEgbWlzdGFrZSB3b3J0aCBmYWlsaW5nIG9uOyBzd2VlcGluZyBhIHdob2xlIHN0YWNrIHdpdGggdGhlIGFzcGVjdCBhbmQgaGl0dGluZ1xuICAgKiBvbmUgaXMgbm90LCB3aGljaCBpcyB3aHkgdGhlIGFzcGVjdCBkZWZhdWx0cyB0aGlzIHRvIGB0cnVlYCBhbmQgdGhlIGNvbnN0cnVjdCB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcFVuc3VwcG9ydGVkUnVudGltZXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciB7QGxpbmsgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9ufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb25Qcm9wcyBleHRlbmRzIE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogRnVuY3Rpb25zIHRvIGluc3RydW1lbnQgb24gY29uc3RydWN0aW9uLiBNb3JlIGNhbiBiZSBhZGRlZCB3aXRoIGBpbnN0cnVtZW50KClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9ucz86IGxhbWJkYS5GdW5jdGlvbltdO1xufVxuXG4vKipcbiAqIEluc3RydW1lbnRzIEFXUyBMYW1iZGEgZnVuY3Rpb25zIHdpdGggdGhlIE9kaWdvcyBPcGVuVGVsZW1ldHJ5IGxheWVyLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBvZGlnb3MgPSBuZXcgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uKHRoaXMsICdPZGlnb3MnLCB7XG4gKiAgIGRlc3RpbmF0aW9uOiB7IGVuZHBvaW50OiAnb3RscC5leGFtcGxlLmNvbTo0MzE3JyB9LFxuICogICBmdW5jdGlvbnM6IFthcGlGbiwgd29ya2VyRm5dLFxuICogfSk7XG4gKiBvZGlnb3MuaW5zdHJ1bWVudChhbm90aGVyRm4pO1xuICogYGBgXG4gKlxuICogV2hhdCBpdCBkb2VzIHRvIGVhY2ggZnVuY3Rpb246IGF0dGFjaGVzIHRoZSBsYXllciBmb3IgdGhlIGZ1bmN0aW9uJ3MgbGFuZ3VhZ2UgYW5kIGFyY2hpdGVjdHVyZSwgc2V0c1xuICogYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCBzbyB0aGUgbGF5ZXIgbG9hZHMgdGhlIFNESywgc2V0cyBgT1RFTF9TRVJWSUNFX05BTUVgLCBhbmQgaGFuZHMgdGhlIGluLUxhbWJkYVxuICogY29sbGVjdG9yIGl0cyBlbnRpcmUgY29uZmlndXJhdGlvbiBpbmxpbmUgdGhyb3VnaCBgT1BFTlRFTEVNRVRSWV9DT0xMRUNUT1JfQ09ORklHX1VSSWAuXG4gKlxuICogVGhlIGZ1bmN0aW9uJ3MgU0RLIGV4cG9ydHMgdG8gdGhlIGNvbGxlY3RvciBvbiBsb2NhbGhvc3QsIG5vdCB0byB5b3VyIGRlc3RpbmF0aW9uLiBUaGUgY29sbGVjdG9yXG4gKiBmb3J3YXJkcyBhZnRlciB0aGUgaGFuZGxlciBoYXMgYWxyZWFkeSByZXR1cm5lZCwgc28gYSBzbG93IGRlc3RpbmF0aW9uIGNvc3RzIGJpbGxlZCBkdXJhdGlvbiByYXRoZXJcbiAqIHRoYW4gY2FsbGVyIGxhdGVuY3kuXG4gKlxuICogIyMgRG8gbm90IGFsc28gaW5zdHJ1bWVudCB0aGVzZSBmdW5jdGlvbnMgd2l0aCB0aGUgY29ubmVjdG9yXG4gKlxuICogVGhlIE9kaWdvcyBBV1MgY29ubmVjdG9yIGluc3RydW1lbnRzIGxpdmUgZnVuY3Rpb25zIGJ5IG11dGF0aW5nIHRoZW0sIGFuZCByZWNvbmNpbGVzIHRoZW0gYmFjayB0byBpdHNcbiAqIG93biBkZXNpcmVkIHN0YXRlIG9uIGV2ZXJ5IHBhc3MuIEEgZnVuY3Rpb24gaW5zdHJ1bWVudGVkIGhlcmUgYW5kIGFsc28gZW5hYmxlZCBhcyBhIGNvbm5lY3RvciBzb3VyY2VcbiAqIGVuZHMgdXAgb3duZWQgYnkgYm90aDogZWFjaCBgY2RrIGRlcGxveWAgcmVhc3NlcnRzIHRoZSBDREsncyBlbnZpcm9ubWVudCwgZWFjaCByZWNvbmNpbGUgcmVhc3NlcnRzIHRoZVxuICogY29ubmVjdG9yJ3MsIGFuZCBldmVyeSByb3VuZCB0cmlwIHB1Ymxpc2hlcyBhIG5ldyBmdW5jdGlvbiB2ZXJzaW9uLlxuICpcbiAqIENob29zZSBvbmUgcGVyIGZ1bmN0aW9uLiBUaGlzIGNvbnN0cnVjdCB3cml0ZXMgYE9ESUdPU19JQUNgIGFuZCBuZXZlciB0aGUgY29ubmVjdG9yJ3MgYE9ESUdPU19NQU5BR0VEYFxuICogb3duZXJzaGlwIG1hcmtlciwgc28gYW4gSWFDLWluc3RydW1lbnRlZCBmdW5jdGlvbiByZXBvcnRzIGFzIGluc3RydW1lbnRlZCBidXQgaXMgbm90IG9uZSB0aGUgY29ubmVjdG9yXG4gKiB3aWxsIHJvbGwgYmFjayDigJQgdGhvdWdoIGl0IHdpbGwgaGFwcGlseSB0YWtlIGl0IG92ZXIgaWYgeW91IGVuYWJsZSBpdCBhcyBhIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogT2RpZ29zSW5zdHJ1bWVudGF0aW9uT3B0aW9ucztcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvbHZlcjogT2RpZ29zTGF5ZXJSZXNvbHZlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsZWN0b3JDb25maWc6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0cnVtZW50ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5vcHRpb25zID0gcHJvcHM7XG4gICAgdGhpcy5yZXNvbHZlciA9IG5ldyBPZGlnb3NMYXllclJlc29sdmVyKHRoaXMsIHByb3BzLmxheWVyU291cmNlID8/IE9kaWdvc0xheWVyU291cmNlLk9ESUdPU19QVUJMSUMpO1xuXG4gICAgLy8gUmVuZGVyZWQgb25jZS4gSXQgZGVwZW5kcyBvbmx5IG9uIHRoZSBkZXN0aW5hdGlvbiwgYW5kIHJlbmRlcmluZyBpdCBwZXIgZnVuY3Rpb24gd291bGQgbWFrZSBhblxuICAgIC8vIGFjY2lkZW50YWwgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBmdW5jdGlvbnMgcG9zc2libGUuXG4gICAgdGhpcy5jb2xsZWN0b3JDb25maWcgPSByZW5kZXJDb2xsZWN0b3JDb25maWcocHJvcHMuZGVzdGluYXRpb24pO1xuXG4gICAgLy8gQSB3YXJuaW5nIHJhdGhlciB0aGFuIGFuIGVycm9yLCBiZWNhdXNlIGEgY29sbGVjdG9yIENBTiBiZSByZWFjaGVkIG92ZXIgZ1JQQyBvbiBhIG5vbi1zdGFuZGFyZCBwb3J0IOKAlFxuICAgIC8vIGJ1dCB0aGUgb3ZlcndoZWxtaW5nbHkgbGlrZWxpZXIgcmVhZGluZyBvZiBgZW5kcG9pbnQ6IFwiaG9zdDo0MzE4XCJgIGlzIGFuIE9UTFAvSFRUUCBlbmRwb2ludCBwYXNzZWQgdG9cbiAgICAvLyB0aGUgZ1JQQyBleHBvcnRlciwgd2hpY2ggYnVpbGRzLCBzdGFydHMsIGFuZCB0aGVuIG5ldmVyIGRlbGl2ZXJzIGEgYmF0Y2guIFNpbGVudCBmb3IgdGhlIGNhbGxlciB3aG9cbiAgICAvLyBtZWFudCBpdDsgbG91ZCBmb3IgdGhlIG9uZSB3aG8gZGlkIG5vdC5cbiAgICBpZiAocHJvcHMuZGVzdGluYXRpb24uZW5kcG9pbnQ/LmVuZHNXaXRoKCc6NDMxOCcpKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoXG4gICAgICAgICdAb2RpZ29zL2F3cy1jZGs6cHJvYmFibGVIdHRwRW5kcG9pbnQnLFxuICAgICAgICBgT2RpZ29zOiBkZXN0aW5hdGlvbiBlbmRwb2ludCBcIiR7cHJvcHMuZGVzdGluYXRpb24uZW5kcG9pbnR9XCIgaXMgb24gNDMxOCwgdGhlIE9UTFAvSFRUUCBwb3J0LCBidXQgYCArXG4gICAgICAgICAgJ2BlbmRwb2ludGAgY29uZmlndXJlcyB0aGUgZ1JQQyBleHBvcnRlciAoY29udmVudGlvbmFsbHkgNDMxNykuIElmIHRoYXQgaXMgYW4gT1RMUC9IVFRQIGNvbGxlY3RvciwgJyArXG4gICAgICAgICAgJ3Bhc3MgaXQgYXMgYGh0dHBFbmRwb2ludDogXCJodHRwOi8vaG9zdDo0MzE4XCJgIGluc3RlYWQg4oCUIHRoZSBnUlBDIGV4cG9ydGVyIHdpbGwgZXhwb3J0IG5vdGhpbmcgdG8gaXQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5kZXN0aW5hdGlvbi5odHRwRW5kcG9pbnQ/LmVuZHNXaXRoKCc6NDMxNycpKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoXG4gICAgICAgICdAb2RpZ29zL2F3cy1jZGs6cHJvYmFibGVHcnBjRW5kcG9pbnQnLFxuICAgICAgICBgT2RpZ29zOiBkZXN0aW5hdGlvbiBodHRwRW5kcG9pbnQgXCIke3Byb3BzLmRlc3RpbmF0aW9uLmh0dHBFbmRwb2ludH1cIiBpcyBvbiA0MzE3LCB0aGUgT1RMUC9nUlBDIHBvcnQsIGAgK1xuICAgICAgICAgICdidXQgYGh0dHBFbmRwb2ludGAgY29uZmlndXJlcyB0aGUgSFRUUCBleHBvcnRlciAoY29udmVudGlvbmFsbHkgNDMxOCkuIElmIHRoYXQgaXMgYSBnUlBDIGNvbGxlY3RvciwgJyArXG4gICAgICAgICAgJ3Bhc3MgaXQgYXMgYGVuZHBvaW50OiBcImhvc3Q6NDMxN1wiYCBpbnN0ZWFkLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZm4gb2YgcHJvcHMuZnVuY3Rpb25zID8/IFtdKSB7XG4gICAgICB0aGlzLmluc3RydW1lbnQoZm4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0cnVtZW50cyBvbmUgZnVuY3Rpb24uIElkZW1wb3RlbnQg4oCUIGluc3RydW1lbnRpbmcgdGhlIHNhbWUgZnVuY3Rpb24gdHdpY2UgaXMgYSBuby1vcCByYXRoZXIgdGhhbiBhXG4gICAqIGRvdWJsZWQgbG9hZGVyIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGluc3RydW1lbnQoZm46IGxhbWJkYS5GdW5jdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IGZuLm5vZGUucGF0aDtcbiAgICBpZiAodGhpcy5pbnN0cnVtZW50ZWQuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBydW50aW1lTmFtZSA9IGZuLnJ1bnRpbWUubmFtZTtcbiAgICBjb25zdCBsYW5ndWFnZSA9IGxhbmd1YWdlRnJvbVJ1bnRpbWUocnVudGltZU5hbWUpO1xuICAgIGlmICghbGFuZ3VhZ2UpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICBgT2RpZ29zOiBydW50aW1lIFwiJHtydW50aW1lTmFtZX1cIiBoYXMgbm8gT3BlblRlbGVtZXRyeSBMYW1iZGEgbGF5ZXIgYCArXG4gICAgICAgICcodXBzdHJlYW0gcHVibGlzaGVzIGxheWVycyBmb3IgcHl0aG9uLCBub2RlanMsIGphdmEgYW5kIHJ1Ynkgb25seSksIHNvIHRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGluc3RydW1lbnRlZC4nO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5za2lwVW5zdXBwb3J0ZWRSdW50aW1lcykge1xuICAgICAgICBBbm5vdGF0aW9ucy5vZihmbikuYWRkV2FybmluZ1YyKCdAb2RpZ29zL2F3cy1jZGs6dW5zdXBwb3J0ZWRSdW50aW1lJywgYCR7bWVzc2FnZX0gU2tpcHBpbmcuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHttZXNzYWdlfSBTZXQgc2tpcFVuc3VwcG9ydGVkUnVudGltZXM6IHRydWUgdG8gc2tpcCBpdCBpbnN0ZWFkLmApO1xuICAgIH1cblxuICAgIHRoaXMuaW5zdHJ1bWVudGVkLmFkZChrZXkpO1xuXG4gICAgY29uc3QgYXJjaGl0ZWN0dXJlID0gZm4uYXJjaGl0ZWN0dXJlLm5hbWU7XG4gICAgY29uc3QgbGF5ZXIgPSB0aGlzLm9wdGlvbnMubGF5ZXJWZXJzaW9uID8/IHRoaXMucmVzb2x2ZXIucmVzb2x2ZShsYW5ndWFnZSwgYXJjaGl0ZWN0dXJlKTtcbiAgICBmbi5hZGRMYXllcnMobGF5ZXIpO1xuXG4gICAgLy8gVGhlIEFSTiwgbm90IHRoZSBjb25zdHJ1Y3Q6IHRoZSBtYXJrZXIgaGFzIHRvIG5hbWUgdGhlIGV4YWN0IGxheWVyIHZlcnNpb24gdGhlIGZ1bmN0aW9uIGNhcnJpZXMsIGFuZFxuICAgIC8vIGluIElOX0FDQ09VTlQgbW9kZSB0aGF0IGlzIGEgbmVzdGVkLXN0YWNrIG91dHB1dCByZWZlcmVuY2UgcmVzb2x2ZWQgYXQgZGVwbG95IHRpbWUuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW52aXJvbm1lbnRGb3IoZm4sIGxhbmd1YWdlLCBsYXllci5sYXllclZlcnNpb25Bcm4pKSkge1xuICAgICAgZm4uYWRkRW52aXJvbm1lbnQobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBJbnN0cnVtZW50cyBldmVyeSBmdW5jdGlvbiBpbiB0aGUgbGlzdC4gKi9cbiAgcHVibGljIGluc3RydW1lbnRBbGwoZnVuY3Rpb25zOiBsYW1iZGEuRnVuY3Rpb25bXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZm4gb2YgZnVuY3Rpb25zKSB7XG4gICAgICB0aGlzLmluc3RydW1lbnQoZm4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZW52aXJvbm1lbnQgYXBwbGllZCB0byBvbmUgZnVuY3Rpb24uXG4gICAqXG4gICAqIE1pcnJvcnMgYGFwcGx5SGFuZGxlckVudmAgLyBgYXBwbHlXZWJTZXJ2ZXJFbnZgIGluIHRoZSBjb25uZWN0b3IsIGluY2x1ZGluZyB3aGF0IGlzIGRlbGliZXJhdGVseSBOT1RcbiAgICogc2V0OiBgT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UYCBzdGF5cyB1bnNldCBzbyB0aGUgU0RLIGtlZXBzIGV4cG9ydGluZyB0byB0aGUgaW4tTGFtYmRhIGNvbGxlY3RvclxuICAgKiBvbiBsb2NhbGhvc3QgcmF0aGVyIHRoYW4gYmxvY2tpbmcgdGhlIGludm9jYXRpb24gb24gdGhlIHJlbW90ZSBkZXN0aW5hdGlvbiwgYW5kIGFuIGVuYWJsZWQgc2lnbmFsJ3NcbiAgICogYE9URUxfKl9FWFBPUlRFUmAgc3RheXMgdW5zZXQgYmVjYXVzZSBgb3RscGAgaXMgYWxyZWFkeSB0aGUgU0RLIGRlZmF1bHQuXG4gICAqL1xuICBwcml2YXRlIGVudmlyb25tZW50Rm9yKGZuOiBsYW1iZGEuRnVuY3Rpb24sIGxhbmd1YWdlOiBzdHJpbmcsIGxheWVyQXJuOiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCB7IGRlc3RpbmF0aW9uLCBtb2RlLCBkZWJ1Zywgc2VydmljZU5hbWUsIGphdmFIYW5kbGVyRGlzdHJvLCBkaXN0cm8sIGV4aXN0aW5nTG9hZGVyVmFsdWUgfSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCB3ZWJTZXJ2ZXIgPSBtb2RlID09PSBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLldFQl9TRVJWRVI7XG5cbiAgICBjb25zdCBlbnY6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICBbRU5WX1NFUlZJQ0VfTkFNRV06IHNlcnZpY2VOYW1lID8/IGRlZmF1bHRTZXJ2aWNlTmFtZShmbiksXG4gICAgICBbRU5WX0NPTExFQ1RPUl9DT05GSUdfVVJJXTogdGhpcy5jb2xsZWN0b3JDb25maWcsXG4gICAgICBbRU5WX0lBQ19NQVJLRVJdOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHY6IE1BUktFUl9WRVJTSU9OLFxuICAgICAgICBzb3VyY2U6ICdjZGsnLFxuICAgICAgICB2ZXJzaW9uOiBPRElHT1NfVkVSU0lPTiB8fCAndW5yZWxlYXNlZCcsXG4gICAgICAgIGxheWVyOiBsYXllckFybixcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICBjb25zdCBzZWxlY3RlZFdyYXBwZXIgPSBkaXN0cmlidXRpb25XcmFwcGVyKGxhbmd1YWdlLCBkaXN0cm8sIGphdmFIYW5kbGVyRGlzdHJvLCB3ZWJTZXJ2ZXIpO1xuICAgIGlmICh3ZWJTZXJ2ZXIpIHtcbiAgICAgIC8vIE5vIGV4ZWMgd3JhcHBlcjogdGhlIExhbWJkYSBXZWIgQWRhcHRlciBvd25zIGl0LCBhbmQgb3ZlcndyaXRpbmcgaXQgc3RvcHMgdGhlIGZ1bmN0aW9uIHNlcnZpbmcuXG4gICAgICBPYmplY3QuYXNzaWduKGVudiwgd2ViU2VydmVyRW52KGxhbmd1YWdlLCBleGlzdGluZ0xvYWRlclZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudltFTlZfRVhFQ19XUkFQUEVSXSA9IHNlbGVjdGVkV3JhcHBlcjtcbiAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBlbnZbRU5WX09URUxfTE9HX0xFVkVMXSA9ICdkZWJ1Zyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3VwcHJlc3MgdGhlIHNpZ25hbHMgdGhlIGRlc3RpbmF0aW9uIGRvZXMgbm90IGFjY2VwdC4gQSBzaWduYWwgd2l0aCBubyBjb2xsZWN0b3IgcGlwZWxpbmUgaXMgcmVmdXNlZFxuICAgIC8vIGF0IHRoZSByZWNlaXZlciBvbiBldmVyeSBiYXRjaCwgc28gdGVsbGluZyB0aGUgU0RLIG5vdCB0byBwcm9kdWNlIGl0IGlzIHRoZSBoYWxmIHRoYXQgc3RvcHMgdGhlXG4gICAgLy8gZXJyb3IgbG9vcDsgdGhlIHBpcGVsaW5lIGJlaW5nIGFic2VudCBpcyB0aGUgaGFsZiB0aGF0IHN0b3BzIHRoZSBleHBvcnQuXG4gICAgY29uc3QgZW5hYmxlZCA9IHJlc29sdmVkU2lnbmFscyhkZXN0aW5hdGlvbik7XG4gICAgY29uc3Qgb3ZlcnJpZGVzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWRdPiA9IFtcbiAgICAgIFtFTlZfVFJBQ0VTX0VYUE9SVEVSLCBleHBvcnRlck92ZXJyaWRlRm9yKGVuYWJsZWQudHJhY2VzKV0sXG4gICAgICBbRU5WX01FVFJJQ1NfRVhQT1JURVIsIGV4cG9ydGVyT3ZlcnJpZGVGb3IoZW5hYmxlZC5tZXRyaWNzKV0sXG4gICAgICBbRU5WX0xPR1NfRVhQT1JURVIsIGV4cG9ydGVyT3ZlcnJpZGVGb3IoZW5hYmxlZC5sb2dzKV0sXG4gICAgXTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2Ygb3ZlcnJpZGVzKSB7XG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbnZbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW52O1xuICB9XG59XG5cbi8qKlxuICogUHJvcHMgZm9yIHtAbGluayBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdFByb3BzIGV4dGVuZHMgT2RpZ29zSW5zdHJ1bWVudGF0aW9uT3B0aW9ucyB7fVxuXG4vKipcbiAqIEFwcGxpZXMgT2RpZ29zIGluc3RydW1lbnRhdGlvbiB0byBldmVyeSBgbGFtYmRhLkZ1bmN0aW9uYCBpbiBhIHNjb3BlLlxuICpcbiAqIGBgYHRzXG4gKiBBc3BlY3RzLm9mKHN0YWNrKS5hZGQobmV3IE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdChzdGFjaywge1xuICogICBkZXN0aW5hdGlvbjogeyBlbmRwb2ludDogJ290bHAuZXhhbXBsZS5jb206NDMxNycgfSxcbiAqIH0pKTtcbiAqIGBgYFxuICpcbiAqIGBza2lwVW5zdXBwb3J0ZWRSdW50aW1lc2AgZGVmYXVsdHMgdG8gYHRydWVgIGhlcmUsIHVubGlrZSB0aGUgY29uc3RydWN0OiBhbiBhc3BlY3QgdmlzaXRzIGV2ZXJ5IGZ1bmN0aW9uXG4gKiBpbiB0aGUgc2NvcGUsIGluY2x1ZGluZyBvbmVzIHdob3NlIHJ1bnRpbWUgaGFzIG5vIE9wZW5UZWxlbWV0cnkgbGF5ZXIsIGFuZCBmYWlsaW5nIHRoZSB3aG9sZSBzeW50aFxuICogYmVjYXVzZSBhIHN0YWNrIGhhcHBlbnMgdG8gY29udGFpbiBvbmUgR28gZnVuY3Rpb24gaXMgbm90IHVzZWZ1bC4gRWFjaCBza2lwIGlzIHJlcG9ydGVkIGFzIGEgc3ludGhcbiAqIHdhcm5pbmcsIHNvIGl0IGlzIHZpc2libGUgcmF0aGVyIHRoYW4gc2lsZW50LlxuICpcbiAqIFRoZSBhc3BlY3QgaW5zdHJ1bWVudHMgd2hhdCBleGlzdHMgaW4gdGhlIHRyZWUgd2hlbiBpdCBydW5zLiBBIGZ1bmN0aW9uIGFkZGVkIGJ5IGEgbGF0ZXIgYXNwZWN0IGlzIG5vdFxuICogdmlzaXRlZDsgdXNlIHRoZSBjb25zdHJ1Y3QgZGlyZWN0bHkgZm9yIHRob3NlLlxuICovXG5leHBvcnQgY2xhc3MgT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0IGltcGxlbWVudHMgSUFzcGVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdHJ1bWVudGF0aW9uOiBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb247XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzY29wZSB3aGVyZSB0aGUgc2hhcmVkIGxheWVyIGNvbnN0cnVjdHMgYXJlIGNyZWF0ZWQuIFVzdWFsbHkgdGhlIHNhbWUgc2NvcGUgdGhlIGFzcGVjdCBpc1xuICAgKiBhcHBsaWVkIHRvLiBJdCBpcyBhIHNlcGFyYXRlIGFyZ3VtZW50IGZyb20gdGhlIHZpc2l0ZWQgbm9kZXMgYmVjYXVzZSB0aGUgbGF5ZXIgKGFuZCwgaW4gYElOX0FDQ09VTlRgXG4gICAqIG1vZGUsIHRoZSBuZXN0ZWQgU0FSIGFwcGxpY2F0aW9uKSBpcyBjcmVhdGVkIG9uY2UgYW5kIHNoYXJlZCBieSBldmVyeSBmdW5jdGlvbiB0aGUgYXNwZWN0IHZpc2l0cy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIHByb3BzOiBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3RQcm9wcykge1xuICAgIHRoaXMuaW5zdHJ1bWVudGF0aW9uID0gbmV3IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbihzY29wZSwgJ09kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdCcsIHtcbiAgICAgIHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzOiB0cnVlLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdmlzaXQobm9kZTogSUNvbnN0cnVjdCk6IHZvaWQge1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgbGFtYmRhLkZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLmluc3RydW1lbnRhdGlvbi5pbnN0cnVtZW50KG5vZGUpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
245
|
+
OdigosInstrumentationAspect[_b] = { fqn: "@odigos/aws-cdk.OdigosInstrumentationAspect", version: "0.0.18" };
|
|
246
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUF1RTtBQUN2RSxpREFBaUQ7QUFDakQsMkNBQTJDO0FBQzNDLDJDQUFtRDtBQUNuRCx5REFHNEI7QUFDNUIscURBQXVEO0FBQ3ZELHVDQUF5RjtBQUN6RixtQ0FLaUI7QUFFakIsMkVBQTJFO0FBQzNFLE1BQU0sZ0JBQWdCLEdBQUcseUJBQXlCLENBQUM7QUFDbkQsa0VBQWtFO0FBQ2xFLDhGQUE4RjtBQUM5RixNQUFNLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILFNBQVMsa0JBQWtCLENBQUMsRUFBbUI7SUFDN0MsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUE4QyxDQUFDO0lBQ25FLE1BQU0sUUFBUSxHQUFHLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4RixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNyRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBeUhEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILE1BQWEsMkJBQTRCLFNBQVEsc0JBQVM7SUFLeEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF1QztRQUMvRSxLQUFLLENBQUMsS0FBSyxF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N0IsR0FBRyxLQUFLO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFnQjtRQUMzQixJQUFJLElBQUksWUFBWSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7O0FBbkJILGtFQW9CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBJQXNwZWN0LCBTdGFjaywgVG9rZW4sIFRhZ3MgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7XG4gIHJlc29sdmVkU2lnbmFscyxcbiAgcmVuZGVyQ29sbGVjdG9yQ29uZmlnLFxufSBmcm9tICcuL2NvbGxlY3Rvci1jb25maWcnO1xuaW1wb3J0IHsgT2RpZ29zTGF5ZXJSZXNvbHZlciB9IGZyb20gJy4vbGF5ZXItcmVzb2x2ZXInO1xuaW1wb3J0IHsgZGlzdHJpYnV0aW9uUmVjaXBlLCBkaXN0cmlidXRpb25XcmFwcGVyLCBsYW5ndWFnZUZyb21SdW50aW1lIH0gZnJvbSAnLi9ydW50aW1lJztcbmltcG9ydCB7XG4gIE9kaWdvc0Rlc3RpbmF0aW9uLFxuICBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLFxuICBPZGlnb3NKYXZhSGFuZGxlckRpc3RybyxcbiAgT2RpZ29zTGF5ZXJTb3VyY2UsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKiogYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCDigJQgdGhlIGxheWVyJ3MgZW50cnkgcG9pbnQgaW4gaGFuZGxlciBtb2RlLiAqL1xuY29uc3QgRU5WX0VYRUNfV1JBUFBFUiA9ICdBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUic7XG4vKiogU2VydmljZSBuYW1lIHJlcG9ydGVkIG9uIGV2ZXJ5IHNwYW4sIG1ldHJpYyBhbmQgbG9nIHJlY29yZC4gKi9cbi8qKiBDb21wYWN0IFNESyBhbmQgZGVzdGluYXRpb24gc2V0dGluZ3M7IGFsbCBhdHRyaWJ1dGlvbiBtYXJrZXJzIGFyZSBMYW1iZGEgcmVzb3VyY2UgdGFncy4gKi9cbmNvbnN0IEVOVl9MQU1CREFfQ09ORklHID0gJ09ESUdPU19MQU1CREFfQ09ORklHJztcblxuLyoqXG4gKiBUaGUgc2VydmljZSBhIGZ1bmN0aW9uIHJlcG9ydHMgYXMsIHdoZW4gdGhlIGNhbGxlciBoYXMgbm90IG5hbWVkIG9uZS5cbiAqXG4gKiBSRUFEIEZST00gVEhFIEwxLCBOT1QgRlJPTSBgZm4uZnVuY3Rpb25OYW1lYC4gVGhlIEwyIHByb3BlcnR5IGlzIGEgY3Jvc3MtZW52aXJvbm1lbnQtYXdhcmUgdG9rZW4gdGhhdFxuICogcmVzb2x2ZXMgdG8gYSBgUmVmYCB0byB0aGUgZnVuY3Rpb24gaXRzZWxmIGV2ZW4gd2hlbiB0aGUgc3RhY2sgc2V0IGBmdW5jdGlvbk5hbWVgIGV4cGxpY2l0bHkg4oCUIHNvIHRoZVxuICogb2J2aW91cyBgU3RhY2sub2YoZm4pLnJlc29sdmUoZm4uZnVuY3Rpb25OYW1lKWAgbmV2ZXIgeWllbGRzIGEgbGl0ZXJhbCwgYW5kIGV2ZXJ5IGZ1bmN0aW9uIHNpbGVudGx5IGZlbGxcbiAqIGJhY2sgdG8gaXRzIGNvbnN0cnVjdCBpZC4gYENmbkZ1bmN0aW9uLmZ1bmN0aW9uTmFtZWAgaXMgdGhlIHJhdyB0ZW1wbGF0ZSB2YWx1ZTogdGhlIGxpdGVyYWwgdGhlIHN0YWNrXG4gKiBwYXNzZWQsIG9yIHVuZGVmaW5lZCB3aGVuIENsb3VkRm9ybWF0aW9uIGdlbmVyYXRlcyB0aGUgbmFtZS5cbiAqXG4gKiBXaHkgdGhlIGZhbGxiYWNrIGlzIHRoZSBjb25zdHJ1Y3QgaWQgcmF0aGVyIHRoYW4gdGhlIGdlbmVyYXRlZCBuYW1lOiBhIGdlbmVyYXRlZCBuYW1lIGlzIGEgYFJlZmAgdG8gdGhlXG4gKiBmdW5jdGlvbiwgYW5kIHB1dHRpbmcgdGhhdCBpbiB0aGUgZnVuY3Rpb24ncyBvd24gZW52aXJvbm1lbnQgbWFrZXMgdGhlIHJlc291cmNlIGRlcGVuZCBvbiBpdHMgb3duXG4gKiBjcmVhdGlvbiDigJQgQ2xvdWRGb3JtYXRpb24gcmVqZWN0cyB0aGUgdGVtcGxhdGUgd2l0aCBhIGRlcGVuZGVuY3kgY3ljbGUsIGF0IGRlcGxveSB0aW1lLlxuICpcbiAqIFRoaXMgbWF0dGVycyBiZXlvbmQgY29zbWV0aWNzLiBUaGUgY29ubmVjdG9yIGNvbXBhcmVzIGBPVEVMX1NFUlZJQ0VfTkFNRWAgYWdhaW5zdCB0aGUgd29ya2xvYWQncyBuYW1lIGluXG4gKiBPZGlnb3MsIHdoaWNoIGlzIHRoZSByZWFsIEFXUyBmdW5jdGlvbiBuYW1lLCBzbyBhIGZ1bmN0aW9uIHJlcG9ydGluZyBpdHMgY29uc3RydWN0IGlkIGlzIHJlcG9ydGVkIGFzXG4gKiBkcmlmdGVkIG9uIHRoZSBzZXJ2aWNlLW5hbWUgY29tcG9uZW50LiBOYW1pbmcgdGhlIGZ1bmN0aW9uIGluIHlvdXIgc3RhY2sgaXMgbm93IGVub3VnaCB0byBsaW5lIHRoZSB0d29cbiAqIHVwOyBhIGZ1bmN0aW9uIHdob3NlIG5hbWUgQ2xvdWRGb3JtYXRpb24gZ2VuZXJhdGVzIHN0aWxsIG5lZWRzIGBzZXJ2aWNlTmFtZWAgcGFzc2VkIGV4cGxpY2l0bHkuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRTZXJ2aWNlTmFtZShmbjogbGFtYmRhLkZ1bmN0aW9uKTogc3RyaW5nIHtcbiAgY29uc3QgY2ZuID0gZm4ubm9kZS5kZWZhdWx0Q2hpbGQgYXMgbGFtYmRhLkNmbkZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCByZXNvbHZlZCA9IGNmbiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU3RhY2sub2YoZm4pLnJlc29sdmUoY2ZuLmZ1bmN0aW9uTmFtZSk7XG4gIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09ICdzdHJpbmcnICYmIHJlc29sdmVkICE9PSAnJyAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHJlc29sdmVkKSkge1xuICAgIHJldHVybiByZXNvbHZlZDtcbiAgfVxuICByZXR1cm4gZm4ubm9kZS5pZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIHNoYXJlZCBieSB0aGUgY29uc3RydWN0IGFuZCB0aGUgYXNwZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogV2hlcmUgdGhlIGluLUxhbWJkYSBjb2xsZWN0b3IgZXhwb3J0cyB0by5cbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uOiBPZGlnb3NEZXN0aW5hdGlvbjtcblxuICAvKipcbiAgICogV2hlcmUgdGhlIE9kaWdvcyBsYXllciBjb21lcyBmcm9tLlxuICAgKlxuICAgKiBAZGVmYXVsdCBPZGlnb3NMYXllclNvdXJjZS5PRElHT1NfUFVCTElDXG4gICAqL1xuICByZWFkb25seSBsYXllclNvdXJjZT86IE9kaWdvc0xheWVyU291cmNlO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIG1vZGUgb3Igd2ViLXNlcnZlciAoTGFtYmRhIFdlYiBBZGFwdGVyKSBtb2RlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBhdXRvLWRldGVjdGlvbiwgYW5kIHRoYXQgaXMgZGVsaWJlcmF0ZSByYXRoZXIgdGhhbiBhbiBvbWlzc2lvbjogZGV0ZWN0aW5nIHRoZSB3ZWIgYWRhcHRlclxuICAgKiBtZWFucyBpbnNwZWN0aW5nIHRoZSBmdW5jdGlvbidzIG90aGVyIGxheWVycywgd2hpY2ggYXQgc3ludGggdGltZSBhcmUgZnJlcXVlbnRseSB1bnJlc29sdmVkIHRva2Vucy5cbiAgICogQSBkZXRlY3RvciB0aGF0IGlzIHJpZ2h0IG1vc3Qgb2YgdGhlIHRpbWUgd291bGQgc2lsZW50bHkgYnJlYWsgdGhlIGZ1bmN0aW9ucyBpdCBnb3Qgd3JvbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IE9kaWdvc0luc3RydW1lbnRhdGlvbk1vZGUuSEFORExFUlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZT86IE9kaWdvc0luc3RydW1lbnRhdGlvbk1vZGU7XG5cbiAgLyoqXG4gICAqIENvbm5lY3RvciBHcmFwaFFMIGRpc3RybyBuYW1lLCBzdWNoIGFzIGphdmEtbGFtYmRhLW90ZWwtYWdlbnQgb3IgamF2YS1sYW1iZGEtb3RlbC13cmFwcGVyLlxuICAgKiBAZGVmYXVsdCAtIHRoZSBidW5kbGVkIGRlZmF1bHQgZGlzdHJpYnV0aW9uIGZvciB0aGUgZnVuY3Rpb24ncyBydW50aW1lXG4gICAqL1xuICByZWFkb25seSBkaXN0cm8/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExlZ2FjeSBsaWdodHdlaWdodCBKYXZhIGhhbmRsZXIgYWRhcHRlci5cbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBjb3JyZXNwb25kaW5nIGphdmEtbGFtYmRhLW90ZWwtKi13cmFwcGVyIGRpc3Ryby5cbiAgICovXG4gIHJlYWRvbmx5IGphdmFIYW5kbGVyRGlzdHJvPzogT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm87XG5cbiAgLyoqXG4gICAqIGBPVEVMX1NFUlZJQ0VfTkFNRWAgZm9yIGV2ZXJ5IGZ1bmN0aW9uIHRoaXMgaW5zdHJ1bWVudHMuXG4gICAqXG4gICAqIFVzdWFsbHkgd3JvbmcgdG8gc2V0IHdoZW4gaW5zdHJ1bWVudGluZyBtb3JlIHRoYW4gb25lIGZ1bmN0aW9uIOKAlCB0aGV5IHdvdWxkIGFsbCByZXBvcnQgYXMgdGhlIHNhbWVcbiAgICogc2VydmljZS5cbiAgICpcbiAgICogTGVmdCB1bnNldCwgYSBmdW5jdGlvbiByZXBvcnRzIGFzIGl0cyBleHBsaWNpdGx5LXNldCBwaHlzaWNhbCBuYW1lIGlmIGl0IGhhcyBvbmUsIGFuZCBvdGhlcndpc2UgYXNcbiAgICogaXRzIGNvbnN0cnVjdCBpZC4gSXQgZGVsaWJlcmF0ZWx5IGRvZXMgbm90IGRlZmF1bHQgdG8gdGhlIGdlbmVyYXRlZCBwaHlzaWNhbCBuYW1lOiB0aGF0IHZhbHVlIGlzIGFcbiAgICogYFJlZmAgdG8gdGhlIGZ1bmN0aW9uIGl0c2VsZiwgYW5kIGEgZnVuY3Rpb24gcmVmZXJlbmNpbmcgaXRzZWxmIGluIGl0cyBvd24gZW52aXJvbm1lbnQgaXMgYVxuICAgKiBDbG91ZEZvcm1hdGlvbiBkZXBlbmRlbmN5IGN5Y2xlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBmdW5jdGlvbidzIHBoeXNpY2FsIG5hbWUgaWYgZXhwbGljaXRseSBzZXQsIG90aGVyd2lzZSBpdHMgY29uc3RydWN0IGlkXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUmFpc2UgaW4tZnVuY3Rpb24gT3BlblRlbGVtZXRyeSB2ZXJib3NpdHkgKGBPVEVMX0xPR19MRVZFTD1kZWJ1Z2ApLlxuICAgKlxuICAgKiBUaGUgbGF5ZXIsIFNESyBhbmQgY29sbGVjdG9yIHRoZW4gZW1pdCBzcGFuIGFuZCBPVExQLWV4cG9ydCBkaWFnbm9zdGljcyBpbnRvIHRoZSBmdW5jdGlvbidzIENsb3VkV2F0Y2hcbiAgICogbG9nIGdyb3VwLiBVc2VmdWwgd2hpbGUgd2lyaW5nIHVwIGEgZGVzdGluYXRpb24sIGV4cGVuc2l2ZSB0byBsZWF2ZSBvbi5cbiAgICpcbiAgICogSGFzIG5vIGVmZmVjdCBpbiB3ZWItc2VydmVyIG1vZGUsIG1hdGNoaW5nIHRoZSBjb25uZWN0b3IsIHdoaWNoIG5ldmVyIHNldHMgYSBsb2cgbGV2ZWwgdGhlcmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkZWJ1Zz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEF0dGFjaCB0aGlzIGxheWVyIGluc3RlYWQgb2YgcmVzb2x2aW5nIG9uZS4gT3ZlcnJpZGVzIGBsYXllclNvdXJjZWAgZW50aXJlbHkuXG4gICAqXG4gICAqIFRoZSBlc2NhcGUgaGF0Y2ggZm9yIGEgbGF5ZXIgbWlycm9yZWQgaW50byBhIHByaXZhdGUgcmVnaXN0cnkgb3IgYW4gaW50ZXJuYWwgYWNjb3VudC4gVGhlIGxheWVyIG11c3RcbiAgICogaGF2ZSB0aGUgc2FtZSBjb250ZW50cyBhcyB0aGUgT2RpZ29zIG9uZSDigJQgdGhlIGVudmlyb25tZW50IHNldCBoZXJlIGFzc3VtZXMgaXRzIGV4YWN0IHNjcmlwdCBsYXlvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcmVzb2x2ZWQgZnJvbSBsYXllclNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgbGF5ZXJWZXJzaW9uPzogbGFtYmRhLklMYXllclZlcnNpb247XG5cbiAgLyoqXG4gICAqIEFyY2hpdGVjdHVyZS1tYXRjaGVkIGNvbGxlY3RvciBsYXllciB3aGVuIHN1cHBseWluZyBhIGN1c3RvbSBBRE9UIFNESyBsYXllci5cbiAgICogVXBzdHJlYW0gU0RLIGxheWVycyBhbHJlYWR5IGluY2x1ZGUgdGhlaXIgY29sbGVjdG9yIGFuZCBkbyBub3QgdXNlIHRoaXMgb3B0aW9uLlxuICAgKiBAZGVmYXVsdCAtIHJlc29sdmVkIGZyb20gbGF5ZXJTb3VyY2UgZm9yIEFET1RcbiAgICovXG4gIHJlYWRvbmx5IGNvbGxlY3RvckxheWVyVmVyc2lvbj86IGxhbWJkYS5JTGF5ZXJWZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGhlIGZ1bmN0aW9uIGFscmVhZHkgbmVlZHMgaW4gaXRzIGxhbmd1YWdlIGxvYWRlciB2YXJpYWJsZSAoYE5PREVfT1BUSU9OU2AsXG4gICAqIGBKQVZBX1RPT0xfT1BUSU9OU2Agb3IgYFBZVEhPTlBBVEhgKSwgd2hpY2ggdGhlIE9kaWdvcyBsb2FkZXIgaXMgam9pbmVkIHRvIHJhdGhlciB0aGFuIHJlcGxhY2luZy5cbiAgICpcbiAgICogT25seSB1c2VkIGluIHdlYi1zZXJ2ZXIgbW9kZS4gSXQgaGFzIHRvIGJlIHBhc3NlZCBleHBsaWNpdGx5IGJlY2F1c2UgQ0RLJ3MgYGxhbWJkYS5GdW5jdGlvbmAgZXhwb3Nlc1xuICAgKiBubyB3YXkgdG8gcmVhZCBiYWNrIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHNldCBlbHNld2hlcmUgaW4gdGhlIGFwcCDigJQgYW4gb21pdHRlZCB2YWx1ZSBoZXJlIGlzXG4gICAqIHNpbGVudGx5IG92ZXJ3cml0dGVuLCB3aGljaCBmb3IgYE5PREVfT1BUSU9OU2AgY2FuIG1lYW4gbG9zaW5nIGEgZmxhZyB0aGUgYXBwIG5lZWRzIHRvIGJvb3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGxvYWRlciB2YXJpYWJsZSBpcyBzZXQgdG8gdGhlIE9kaWdvcyB2YWx1ZSBhbG9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhpc3RpbmdMb2FkZXJWYWx1ZT86IHN0cmluZztcblxuICAvKipcbiAgICogU2tpcCBmdW5jdGlvbnMgd2hvc2UgcnVudGltZSBoYXMgbm8gT3BlblRlbGVtZXRyeSBMYW1iZGEgbGF5ZXIgaW5zdGVhZCBvZiB0aHJvd2luZy5cbiAgICpcbiAgICogYGRvdG5ldCpgIGFuZCBgcHJvdmlkZWQuKmAgKEdvLCBjdXN0b20gcnVudGltZXMpIGhhdmUgbm8gbGFuZ3VhZ2UgbGF5ZXIgdXBzdHJlYW0uIEV4cGxpY2l0bHlcbiAgICogaW5zdHJ1bWVudGluZyBvbmUgaXMgYSBtaXN0YWtlIHdvcnRoIGZhaWxpbmcgb247IHN3ZWVwaW5nIGEgd2hvbGUgc3RhY2sgd2l0aCB0aGUgYXNwZWN0IGFuZCBoaXR0aW5nXG4gICAqIG9uZSBpcyBub3QsIHdoaWNoIGlzIHdoeSB0aGUgYXNwZWN0IGRlZmF1bHRzIHRoaXMgdG8gYHRydWVgIGFuZCB0aGUgY29uc3RydWN0IHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBza2lwVW5zdXBwb3J0ZWRSdW50aW1lcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvcHMgZm9yIHtAbGluayBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvblByb3BzIGV4dGVuZHMgT2RpZ29zSW5zdHJ1bWVudGF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBGdW5jdGlvbnMgdG8gaW5zdHJ1bWVudCBvbiBjb25zdHJ1Y3Rpb24uIE1vcmUgY2FuIGJlIGFkZGVkIHdpdGggYGluc3RydW1lbnQoKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25zPzogbGFtYmRhLkZ1bmN0aW9uW107XG59XG5cbi8qKlxuICogSW5zdHJ1bWVudHMgQVdTIExhbWJkYSBmdW5jdGlvbnMgd2l0aCB0aGUgT2RpZ29zIE9wZW5UZWxlbWV0cnkgbGF5ZXIuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IG9kaWdvcyA9IG5ldyBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb24odGhpcywgJ09kaWdvcycsIHtcbiAqICAgZGVzdGluYXRpb246IHsgZW5kcG9pbnQ6ICdvdGxwLmV4YW1wbGUuY29tOjQzMTcnIH0sXG4gKiAgIGZ1bmN0aW9uczogW2FwaUZuLCB3b3JrZXJGbl0sXG4gKiB9KTtcbiAqIG9kaWdvcy5pbnN0cnVtZW50KGFub3RoZXJGbik7XG4gKiBgYGBcbiAqXG4gKiBXaGF0IGl0IGRvZXMgdG8gZWFjaCBmdW5jdGlvbjogYXR0YWNoZXMgdGhlIGxheWVyIGZvciB0aGUgZnVuY3Rpb24ncyBsYW5ndWFnZSBhbmQgYXJjaGl0ZWN0dXJlLCBzZXRzXG4gKiBgQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVJgIGFuZCBjb21wYWN0IGBPRElHT1NfTEFNQkRBX0NPTkZJR2AuIFRoZSBsYXllciBidWlsZHMgdGhlIFNESyBlbnZpcm9ubWVudCBhbmRcbiAqIGNvbGxlY3RvciBwaXBlbGluZXMgYXQgc3RhcnR1cDsgb3duZXJzaGlwIGFuZCBleGFjdCBsYXllciBhdHRyaWJ1dGlvbiBhcmUgcmVjb3JkZWQgaW4gcmVzb3VyY2UgdGFncy5cbiAqXG4gKiBUaGUgZnVuY3Rpb24ncyBTREsgZXhwb3J0cyB0byB0aGUgY29sbGVjdG9yIG9uIGxvY2FsaG9zdCwgbm90IHRvIHlvdXIgZGVzdGluYXRpb24uIFRoZSBjb2xsZWN0b3JcbiAqIGZvcndhcmRzIGFmdGVyIHRoZSBoYW5kbGVyIGhhcyBhbHJlYWR5IHJldHVybmVkLCBzbyBhIHNsb3cgZGVzdGluYXRpb24gY29zdHMgYmlsbGVkIGR1cmF0aW9uIHJhdGhlclxuICogdGhhbiBjYWxsZXIgbGF0ZW5jeS5cbiAqXG4gKiAjIyBEbyBub3QgYWxzbyBpbnN0cnVtZW50IHRoZXNlIGZ1bmN0aW9ucyB3aXRoIHRoZSBjb25uZWN0b3JcbiAqXG4gKiBUaGUgT2RpZ29zIEFXUyBjb25uZWN0b3IgaW5zdHJ1bWVudHMgbGl2ZSBmdW5jdGlvbnMgYnkgbXV0YXRpbmcgdGhlbSwgYW5kIHJlY29uY2lsZXMgdGhlbSBiYWNrIHRvIGl0c1xuICogb3duIGRlc2lyZWQgc3RhdGUgb24gZXZlcnkgcGFzcy4gQSBmdW5jdGlvbiBpbnN0cnVtZW50ZWQgaGVyZSBhbmQgYWxzbyBlbmFibGVkIGFzIGEgY29ubmVjdG9yIHNvdXJjZVxuICogZW5kcyB1cCBvd25lZCBieSBib3RoOiBlYWNoIGBjZGsgZGVwbG95YCByZWFzc2VydHMgdGhlIENESydzIGVudmlyb25tZW50LCBlYWNoIHJlY29uY2lsZSByZWFzc2VydHMgdGhlXG4gKiBjb25uZWN0b3IncywgYW5kIGV2ZXJ5IHJvdW5kIHRyaXAgcHVibGlzaGVzIGEgbmV3IGZ1bmN0aW9uIHZlcnNpb24uXG4gKlxuICogQ2hvb3NlIG9uZSBwZXIgZnVuY3Rpb24uIFRoaXMgY29uc3RydWN0IHdyaXRlcyBgb2RpZ29zOmlhY2AgcmVzb3VyY2UgdGFncyBhbmQgbmV2ZXIgdGhlIGNvbm5lY3RvcidzIGBvZGlnb3M6bWFuYWdlZGBcbiAqIG93bmVyc2hpcCB0YWcsIHNvIGFuIElhQy1pbnN0cnVtZW50ZWQgZnVuY3Rpb24gcmVwb3J0cyBhcyBpbnN0cnVtZW50ZWQgYnV0IGlzIG5vdCBvbmUgdGhlIGNvbm5lY3RvclxuICogd2lsbCByb2xsIGJhY2sg4oCUIHRob3VnaCBpdCB3aWxsIGhhcHBpbHkgdGFrZSBpdCBvdmVyIGlmIHlvdSBlbmFibGUgaXQgYXMgYSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZXI6IE9kaWdvc0xheWVyUmVzb2x2ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdHJ1bWVudGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IHByb3BzO1xuICAgIHRoaXMucmVzb2x2ZXIgPSBuZXcgT2RpZ29zTGF5ZXJSZXNvbHZlcih0aGlzLCBwcm9wcy5sYXllclNvdXJjZSA/PyBPZGlnb3NMYXllclNvdXJjZS5PRElHT1NfUFVCTElDKTtcblxuICAgIC8vIFJlbmRlcmVkIG9uY2UuIEl0IGRlcGVuZHMgb25seSBvbiB0aGUgZGVzdGluYXRpb24sIGFuZCByZW5kZXJpbmcgaXQgcGVyIGZ1bmN0aW9uIHdvdWxkIG1ha2UgYW5cbiAgICAvLyBhY2NpZGVudGFsIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZnVuY3Rpb25zIHBvc3NpYmxlLlxuICAgIHJlbmRlckNvbGxlY3RvckNvbmZpZyhwcm9wcy5kZXN0aW5hdGlvbik7XG5cbiAgICAvLyBBIHdhcm5pbmcgcmF0aGVyIHRoYW4gYW4gZXJyb3IsIGJlY2F1c2UgYSBjb2xsZWN0b3IgQ0FOIGJlIHJlYWNoZWQgb3ZlciBnUlBDIG9uIGEgbm9uLXN0YW5kYXJkIHBvcnQg4oCUXG4gICAgLy8gYnV0IHRoZSBvdmVyd2hlbG1pbmdseSBsaWtlbGllciByZWFkaW5nIG9mIGBlbmRwb2ludDogXCJob3N0OjQzMThcImAgaXMgYW4gT1RMUC9IVFRQIGVuZHBvaW50IHBhc3NlZCB0b1xuICAgIC8vIHRoZSBnUlBDIGV4cG9ydGVyLCB3aGljaCBidWlsZHMsIHN0YXJ0cywgYW5kIHRoZW4gbmV2ZXIgZGVsaXZlcnMgYSBiYXRjaC4gU2lsZW50IGZvciB0aGUgY2FsbGVyIHdob1xuICAgIC8vIG1lYW50IGl0OyBsb3VkIGZvciB0aGUgb25lIHdobyBkaWQgbm90LlxuICAgIGlmIChwcm9wcy5kZXN0aW5hdGlvbi5lbmRwb2ludD8uZW5kc1dpdGgoJzo0MzE4JykpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMihcbiAgICAgICAgJ0BvZGlnb3MvYXdzLWNkazpwcm9iYWJsZUh0dHBFbmRwb2ludCcsXG4gICAgICAgIGBPZGlnb3M6IGRlc3RpbmF0aW9uIGVuZHBvaW50IFwiJHtwcm9wcy5kZXN0aW5hdGlvbi5lbmRwb2ludH1cIiBpcyBvbiA0MzE4LCB0aGUgT1RMUC9IVFRQIHBvcnQsIGJ1dCBgICtcbiAgICAgICAgICAnYGVuZHBvaW50YCBjb25maWd1cmVzIHRoZSBnUlBDIGV4cG9ydGVyIChjb252ZW50aW9uYWxseSA0MzE3KS4gSWYgdGhhdCBpcyBhbiBPVExQL0hUVFAgY29sbGVjdG9yLCAnICtcbiAgICAgICAgICAncGFzcyBpdCBhcyBgaHR0cEVuZHBvaW50OiBcImh0dHA6Ly9ob3N0OjQzMThcImAgaW5zdGVhZCDigJQgdGhlIGdSUEMgZXhwb3J0ZXIgd2lsbCBleHBvcnQgbm90aGluZyB0byBpdC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmRlc3RpbmF0aW9uLmh0dHBFbmRwb2ludD8uZW5kc1dpdGgoJzo0MzE3JykpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMihcbiAgICAgICAgJ0BvZGlnb3MvYXdzLWNkazpwcm9iYWJsZUdycGNFbmRwb2ludCcsXG4gICAgICAgIGBPZGlnb3M6IGRlc3RpbmF0aW9uIGh0dHBFbmRwb2ludCBcIiR7cHJvcHMuZGVzdGluYXRpb24uaHR0cEVuZHBvaW50fVwiIGlzIG9uIDQzMTcsIHRoZSBPVExQL2dSUEMgcG9ydCwgYCArXG4gICAgICAgICAgJ2J1dCBgaHR0cEVuZHBvaW50YCBjb25maWd1cmVzIHRoZSBIVFRQIGV4cG9ydGVyIChjb252ZW50aW9uYWxseSA0MzE4KS4gSWYgdGhhdCBpcyBhIGdSUEMgY29sbGVjdG9yLCAnICtcbiAgICAgICAgICAncGFzcyBpdCBhcyBgZW5kcG9pbnQ6IFwiaG9zdDo0MzE3XCJgIGluc3RlYWQuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmbiBvZiBwcm9wcy5mdW5jdGlvbnMgPz8gW10pIHtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudChmbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc3RydW1lbnRzIG9uZSBmdW5jdGlvbi4gSWRlbXBvdGVudCDigJQgaW5zdHJ1bWVudGluZyB0aGUgc2FtZSBmdW5jdGlvbiB0d2ljZSBpcyBhIG5vLW9wIHJhdGhlciB0aGFuIGFcbiAgICogZG91YmxlZCBsb2FkZXIgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgaW5zdHJ1bWVudChmbjogbGFtYmRhLkZ1bmN0aW9uKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gZm4ubm9kZS5wYXRoO1xuICAgIGlmICh0aGlzLmluc3RydW1lbnRlZC5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bnRpbWVOYW1lID0gZm4ucnVudGltZS5uYW1lO1xuICAgIGNvbnN0IGxhbmd1YWdlID0gbGFuZ3VhZ2VGcm9tUnVudGltZShydW50aW1lTmFtZSk7XG4gICAgaWYgKCFsYW5ndWFnZSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgIGBPZGlnb3M6IHJ1bnRpbWUgXCIke3J1bnRpbWVOYW1lfVwiIGhhcyBubyBPcGVuVGVsZW1ldHJ5IExhbWJkYSBsYXllciBgICtcbiAgICAgICAgJyh1cHN0cmVhbSBwdWJsaXNoZXMgbGF5ZXJzIGZvciBweXRob24sIG5vZGVqcywgamF2YSBhbmQgcnVieSBvbmx5KSwgc28gdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgaW5zdHJ1bWVudGVkLic7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzKSB7XG4gICAgICAgIEFubm90YXRpb25zLm9mKGZuKS5hZGRXYXJuaW5nVjIoJ0BvZGlnb3MvYXdzLWNkazp1bnN1cHBvcnRlZFJ1bnRpbWUnLCBgJHttZXNzYWdlfSBTa2lwcGluZy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke21lc3NhZ2V9IFNldCBza2lwVW5zdXBwb3J0ZWRSdW50aW1lczogdHJ1ZSB0byBza2lwIGl0IGluc3RlYWQuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjaXBlID0gZGlzdHJpYnV0aW9uUmVjaXBlKGxhbmd1YWdlLCB0aGlzLm9wdGlvbnMuZGlzdHJvLCBydW50aW1lTmFtZSk7XG4gICAgZGlzdHJpYnV0aW9uV3JhcHBlcihsYW5ndWFnZSwgdGhpcy5vcHRpb25zLmRpc3RybywgdGhpcy5vcHRpb25zLmphdmFIYW5kbGVyRGlzdHJvLCB0aGlzLm9wdGlvbnMubW9kZSA9PT0gT2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZS5XRUJfU0VSVkVSKTtcbiAgICBpZiAocmVjaXBlLmFwcGxpY2F0aW9uU2lnbmFscyAmJiAhcmVzb2x2ZWRTaWduYWxzKHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbikudHJhY2VzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FET1QgKyBBcHBsaWNhdGlvbiBTaWduYWxzIHJlcXVpcmVzIHRyYWNlcyB0byBiZSBlbmFibGVkIGZvciB0aGUgZGVzdGluYXRpb24uJyk7XG4gICAgfVxuICAgIGlmIChyZWNpcGUuYXBwbGljYXRpb25TaWduYWxzKSB7XG4gICAgICBmbi5yb2xlPy5hZGRNYW5hZ2VkUG9saWN5KGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnQ2xvdWRXYXRjaExhbWJkYUFwcGxpY2F0aW9uU2lnbmFsc0V4ZWN1dGlvblJvbGVQb2xpY3knKSk7XG4gICAgICBBbm5vdGF0aW9ucy5vZihmbikuYWRkV2FybmluZ1YyKCdAb2RpZ29zL2F3cy1jZGs6YXBwbGljYXRpb25TaWduYWxzJyxcbiAgICAgICAgJ0VuYWJsZSBDbG91ZFdhdGNoIEFwcGxpY2F0aW9uIFNpZ25hbHMgc2VydmljZSBkaXNjb3Zlcnkgb25jZSBpbiB0aGlzIEFXUyBhY2NvdW50IGFuZCByZWdpb24uIEFwcGxpY2F0aW9uIFNpZ25hbHMgYWxzbyBzZW5kcyBBV1Mgc2VydmljZSB0ZWxlbWV0cnkgdGhyb3VnaCB0aGUgTGFtYmRhIGVtYmVkZGVkIGFnZW50LicpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlPWZuLm5vZGUuZGVmYXVsdENoaWxkIGFzIGxhbWJkYS5DZm5GdW5jdGlvbjtcbiAgICByZXNvdXJjZS5hZGRQcm9wZXJ0eURlbGV0aW9uT3ZlcnJpZGUoJ0Vudmlyb25tZW50LlZhcmlhYmxlcy5PRElHT1NfTUFOQUdFRCcpO1xuICAgIHJlc291cmNlLmFkZFByb3BlcnR5RGVsZXRpb25PdmVycmlkZSgnRW52aXJvbm1lbnQuVmFyaWFibGVzLk9ESUdPU19JQUMnKTtcbiAgICB0aGlzLmluc3RydW1lbnRlZC5hZGQoa2V5KTtcblxuICAgIGNvbnN0IGFyY2hpdGVjdHVyZSA9IGZuLmFyY2hpdGVjdHVyZS5uYW1lO1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5vcHRpb25zLmxheWVyVmVyc2lvbiA/PyB0aGlzLnJlc29sdmVyLnJlc29sdmUocmVjaXBlLmFydGlmYWN0ID8/IGxhbmd1YWdlLCBhcmNoaXRlY3R1cmUpO1xuICAgIGNvbnN0IGNvbGxlY3RvckxheWVyID0gcmVjaXBlLmFydGlmYWN0ID8gKHRoaXMub3B0aW9ucy5jb2xsZWN0b3JMYXllclZlcnNpb24gPz8gdGhpcy5yZXNvbHZlci5yZXNvbHZlKCdhZG90LWNvbGxlY3RvcicsIGFyY2hpdGVjdHVyZSkpIDogdW5kZWZpbmVkO1xuICAgIGZuLmFkZExheWVycyguLi4oY29sbGVjdG9yTGF5ZXIgPyBbbGF5ZXIsIGNvbGxlY3RvckxheWVyXSA6IFtsYXllcl0pKTtcblxuICAgIC8vIFRoZSBBUk4sIG5vdCB0aGUgY29uc3RydWN0OiB0aGUgbWFya2VyIGhhcyB0byBuYW1lIHRoZSBleGFjdCBsYXllciB2ZXJzaW9uIHRoZSBmdW5jdGlvbiBjYXJyaWVzLCBhbmRcbiAgICAvLyBpbiBJTl9BQ0NPVU5UIG1vZGUgdGhhdCBpcyBhIG5lc3RlZC1zdGFjayBvdXRwdXQgcmVmZXJlbmNlIHJlc29sdmVkIGF0IGRlcGxveSB0aW1lLlxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudmlyb25tZW50Rm9yKGZuLCBsYW5ndWFnZSwgbGF5ZXIubGF5ZXJWZXJzaW9uQXJuLCBjb2xsZWN0b3JMYXllcj8ubGF5ZXJWZXJzaW9uQXJuKSkpIHtcbiAgICAgIGZuLmFkZEVudmlyb25tZW50KG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogSW5zdHJ1bWVudHMgZXZlcnkgZnVuY3Rpb24gaW4gdGhlIGxpc3QuICovXG4gIHB1YmxpYyBpbnN0cnVtZW50QWxsKGZ1bmN0aW9uczogbGFtYmRhLkZ1bmN0aW9uW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGZuIG9mIGZ1bmN0aW9ucykge1xuICAgICAgdGhpcy5pbnN0cnVtZW50KGZuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50IGFwcGxpZWQgdG8gb25lIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBNaXJyb3JzIGBhcHBseUhhbmRsZXJFbnZgIC8gYGFwcGx5V2ViU2VydmVyRW52YCBpbiB0aGUgY29ubmVjdG9yLCBpbmNsdWRpbmcgd2hhdCBpcyBkZWxpYmVyYXRlbHkgTk9UXG4gICAqIHNldDogYE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVGAgc3RheXMgdW5zZXQgc28gdGhlIFNESyBrZWVwcyBleHBvcnRpbmcgdG8gdGhlIGluLUxhbWJkYSBjb2xsZWN0b3JcbiAgICogb24gbG9jYWxob3N0IHJhdGhlciB0aGFuIGJsb2NraW5nIHRoZSBpbnZvY2F0aW9uIG9uIHRoZSByZW1vdGUgZGVzdGluYXRpb24sIGFuZCBldmVyeSBzaWduYWwgZXhwb3J0ZXIgaXMgc2VsZWN0ZWQgZXhwbGljaXRseS5cbiAgICovXG4gIHByaXZhdGUgZW52aXJvbm1lbnRGb3IoZm46IGxhbWJkYS5GdW5jdGlvbiwgbGFuZ3VhZ2U6IHN0cmluZywgbGF5ZXJBcm46IHN0cmluZywgY29sbGVjdG9yTGF5ZXJBcm4/OiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCB7IGRlc3RpbmF0aW9uLCBtb2RlLCBkZWJ1Zywgc2VydmljZU5hbWUsIGphdmFIYW5kbGVyRGlzdHJvLCBkaXN0cm8sIGV4aXN0aW5nTG9hZGVyVmFsdWUgfSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCB3ZWJTZXJ2ZXIgPSBtb2RlID09PSBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLldFQl9TRVJWRVI7XG5cbiAgICBjb25zdCByZWNpcGUgPSBkaXN0cmlidXRpb25SZWNpcGUobGFuZ3VhZ2UsIGRpc3RybywgZm4ucnVudGltZS5uYW1lKTtcbiAgICBjb25zdCBzaWduYWxzID0gcmVzb2x2ZWRTaWduYWxzKGRlc3RpbmF0aW9uKTtcbiAgICBjb25zdCByZXNvdXJjZSA9IGZuLm5vZGUuZGVmYXVsdENoaWxkIGFzIGxhbWJkYS5DZm5GdW5jdGlvbjtcbiAgICBjb25zdCBjdXJyZW50ID0gU3RhY2sub2YoZm4pLnJlc29sdmUocmVzb3VyY2UuZW52aXJvbm1lbnQpIGFzIGxhbWJkYS5DZm5GdW5jdGlvbi5FbnZpcm9ubWVudFByb3BlcnR5IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IG9yaWdpbmFsV3JhcHBlciA9IChjdXJyZW50Py52YXJpYWJsZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LkFXU19MQU1CREFfRVhFQ19XUkFQUEVSID8/ICcnO1xuICAgIGNvbnN0IGV4ZWNXcmFwcGVyID0gd2ViU2VydmVyID8gJy9vcHQvb2RpZ29zLXdlYnNlcnZlcicgOiBkaXN0cmlidXRpb25XcmFwcGVyKGxhbmd1YWdlLCBkaXN0cm8sIGphdmFIYW5kbGVyRGlzdHJvLCBmYWxzZSk7XG4gICAgY29uc3QgZnVuY3Rpb25Mb2dzID0gc2lnbmFscy5sb2dzICYmICF3ZWJTZXJ2ZXIgJiYgKGxhbmd1YWdlID09PSAncnVieScgfHwgKGxhbmd1YWdlID09PSAnamF2YScgJiZcbiAgICAgIFsnL29wdC9vdGVsLWhhbmRsZXInLCAnL29wdC9vdGVsLXByb3h5LWhhbmRsZXInLCAnL29wdC9vdGVsLXNxcy1oYW5kbGVyJywgJy9vcHQvb3RlbC1zdHJlYW0taGFuZGxlciddLmluY2x1ZGVzKGV4ZWNXcmFwcGVyKSkpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHY6IDEsXG4gICAgICBzOiBzZXJ2aWNlTmFtZSA/PyBkZWZhdWx0U2VydmljZU5hbWUoZm4pLFxuICAgICAgdDogKHNpZ25hbHMudHJhY2VzID8gMSA6IDApIHwgKHNpZ25hbHMubWV0cmljcyA/IDIgOiAwKSB8IChzaWduYWxzLmxvZ3MgPyA0IDogMCksXG4gICAgICBlOiBkZXN0aW5hdGlvbi5lbmRwb2ludCA/PyBkZXN0aW5hdGlvbi5odHRwRW5kcG9pbnQsXG4gICAgICAuLi4oZGVzdGluYXRpb24uaHR0cEVuZHBvaW50ID8geyBwOiB0cnVlIH0gOiB7fSksXG4gICAgICAuLi4oZGVzdGluYXRpb24uZW5kcG9pbnQgJiYgZGVzdGluYXRpb24uaW5zZWN1cmUgPyB7IGk6IHRydWUgfSA6IHt9KSxcbiAgICAgIC4uLihkZXN0aW5hdGlvbi5oZWFkZXJzICYmIE9iamVjdC5rZXlzKGRlc3RpbmF0aW9uLmhlYWRlcnMpLmxlbmd0aCA/IHsgaDogZGVzdGluYXRpb24uaGVhZGVycyB9IDoge30pLFxuICAgICAgLi4uKHJlY2lwZS5hcHBsaWNhdGlvblNpZ25hbHMgPyB7IGE6IHRydWUgfSA6IHt9KSxcbiAgICAgIC4uLihmdW5jdGlvbkxvZ3MgPyB7IGw6IHRydWUgfSA6IHt9KSxcbiAgICAgIC4uLihkZWJ1ZyAmJiAhd2ViU2VydmVyID8geyBkOiB0cnVlIH0gOiB7fSksXG4gICAgICAuLi4od2ViU2VydmVyID8geyB3OiBvcmlnaW5hbFdyYXBwZXIgfSA6IHt9KSxcbiAgICB9O1xuICAgIGNvbnN0IGVudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgIFtFTlZfRVhFQ19XUkFQUEVSXTogZXhlY1dyYXBwZXIsXG4gICAgICBbRU5WX0xBTUJEQV9DT05GSUddOiBKU09OLnN0cmluZ2lmeShjb25maWcpLFxuICAgIH07XG4gICAgVGFncy5vZihmbikuYWRkKCdvZGlnb3M6aWFjJywgJ3YxJyk7XG4gICAgVGFncy5vZihmbikuYWRkKCdvZGlnb3M6c2RrLWxheWVyJywgbGF5ZXJBcm4pO1xuICAgIGlmIChjb2xsZWN0b3JMYXllckFybikgVGFncy5vZihmbikuYWRkKCdvZGlnb3M6Y29sbGVjdG9yLWxheWVyJywgY29sbGVjdG9yTGF5ZXJBcm4pO1xuICAgIC8vIEV4cGxpY2l0IGN1c3RvbWVyIGxvYWRlciBvcHRpb25zIHJlbWFpbiBvcmRpbmFyeSBjdXN0b21lciBlbnZpcm9ubWVudCB2YWx1ZXMuXG4gICAgaWYgKHdlYlNlcnZlciAmJiBleGlzdGluZ0xvYWRlclZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGxvYWRlcktleSA9IHsgamF2YTogJ0pBVkFfVE9PTF9PUFRJT05TJywgbm9kZWpzOiAnTk9ERV9PUFRJT05TJywgcHl0aG9uOiAnUFlUSE9OUEFUSCcgfVtsYW5ndWFnZV07XG4gICAgICBpZiAobG9hZGVyS2V5KSBlbnZbbG9hZGVyS2V5XSA9IGV4aXN0aW5nTG9hZGVyVmFsdWU7XG4gICAgfVxuICAgIGlmIChsYW5ndWFnZSA9PT0gJ3J1YnknICYmIHNpZ25hbHMubWV0cmljcykge1xuICAgICAgQW5ub3RhdGlvbnMub2YoZm4pLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOnJ1YnlTaWduYWxzVW5zdXBwb3J0ZWQnLFxuICAgICAgICAnVGhlIGJ1bmRsZWQgUnVieSBMYW1iZGEgU0RLIGNhbm5vdCBnZW5lcmF0ZSBPVExQIG1ldHJpY3MuIEZ1bmN0aW9uIHN0ZG91dC9zdGRlcnIgbG9ncyBhcmUgY29sbGVjdGVkIGJ5IHRoZSBMYW1iZGEgY29sbGVjdG9yIHdoZW4gbG9ncyBhcmUgc2VsZWN0ZWQuJyk7XG4gICAgfVxuICAgIGlmIChkZXN0aW5hdGlvbi5wcm9maWxlcykge1xuICAgICAgQW5ub3RhdGlvbnMub2YoZm4pLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOnByb2ZpbGVzVW5zdXBwb3J0ZWQnLFxuICAgICAgICAnVGhlIGJ1bmRsZWQgTGFtYmRhIGxhbmd1YWdlIGFnZW50cyBkbyBub3QgZ2VuZXJhdGUgT1RMUCBwcm9maWxlcy4gT3RoZXIgc2VsZWN0ZWQgc2lnbmFscyByZW1haW4gZW5hYmxlZC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudjtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BzIGZvciB7QGxpbmsgT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3RQcm9wcyBleHRlbmRzIE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnMge31cblxuLyoqXG4gKiBBcHBsaWVzIE9kaWdvcyBpbnN0cnVtZW50YXRpb24gdG8gZXZlcnkgYGxhbWJkYS5GdW5jdGlvbmAgaW4gYSBzY29wZS5cbiAqXG4gKiBgYGB0c1xuICogQXNwZWN0cy5vZihzdGFjaykuYWRkKG5ldyBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3Qoc3RhY2ssIHtcbiAqICAgZGVzdGluYXRpb246IHsgZW5kcG9pbnQ6ICdvdGxwLmV4YW1wbGUuY29tOjQzMTcnIH0sXG4gKiB9KSk7XG4gKiBgYGBcbiAqXG4gKiBgc2tpcFVuc3VwcG9ydGVkUnVudGltZXNgIGRlZmF1bHRzIHRvIGB0cnVlYCBoZXJlLCB1bmxpa2UgdGhlIGNvbnN0cnVjdDogYW4gYXNwZWN0IHZpc2l0cyBldmVyeSBmdW5jdGlvblxuICogaW4gdGhlIHNjb3BlLCBpbmNsdWRpbmcgb25lcyB3aG9zZSBydW50aW1lIGhhcyBubyBPcGVuVGVsZW1ldHJ5IGxheWVyLCBhbmQgZmFpbGluZyB0aGUgd2hvbGUgc3ludGhcbiAqIGJlY2F1c2UgYSBzdGFjayBoYXBwZW5zIHRvIGNvbnRhaW4gb25lIEdvIGZ1bmN0aW9uIGlzIG5vdCB1c2VmdWwuIEVhY2ggc2tpcCBpcyByZXBvcnRlZCBhcyBhIHN5bnRoXG4gKiB3YXJuaW5nLCBzbyBpdCBpcyB2aXNpYmxlIHJhdGhlciB0aGFuIHNpbGVudC5cbiAqXG4gKiBUaGUgYXNwZWN0IGluc3RydW1lbnRzIHdoYXQgZXhpc3RzIGluIHRoZSB0cmVlIHdoZW4gaXQgcnVucy4gQSBmdW5jdGlvbiBhZGRlZCBieSBhIGxhdGVyIGFzcGVjdCBpcyBub3RcbiAqIHZpc2l0ZWQ7IHVzZSB0aGUgY29uc3RydWN0IGRpcmVjdGx5IGZvciB0aG9zZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdCBpbXBsZW1lbnRzIElBc3BlY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RydW1lbnRhdGlvbjogT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc2NvcGUgd2hlcmUgdGhlIHNoYXJlZCBsYXllciBjb25zdHJ1Y3RzIGFyZSBjcmVhdGVkLiBVc3VhbGx5IHRoZSBzYW1lIHNjb3BlIHRoZSBhc3BlY3QgaXNcbiAgICogYXBwbGllZCB0by4gSXQgaXMgYSBzZXBhcmF0ZSBhcmd1bWVudCBmcm9tIHRoZSB2aXNpdGVkIG5vZGVzIGJlY2F1c2UgdGhlIGxheWVyIChhbmQsIGluIGBJTl9BQ0NPVU5UYFxuICAgKiBtb2RlLCB0aGUgbmVzdGVkIFNBUiBhcHBsaWNhdGlvbikgaXMgY3JlYXRlZCBvbmNlIGFuZCBzaGFyZWQgYnkgZXZlcnkgZnVuY3Rpb24gdGhlIGFzcGVjdCB2aXNpdHMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBwcm9wczogT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0UHJvcHMpIHtcbiAgICB0aGlzLmluc3RydW1lbnRhdGlvbiA9IG5ldyBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb24oc2NvcGUsICdPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3QnLCB7XG4gICAgICBza2lwVW5zdXBwb3J0ZWRSdW50aW1lczogdHJ1ZSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIGxhbWJkYS5GdW5jdGlvbikge1xuICAgICAgdGhpcy5pbnN0cnVtZW50YXRpb24uaW5zdHJ1bWVudChub2RlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
package/lib/runtime.d.ts
CHANGED
|
@@ -58,3 +58,5 @@ export declare function webServerEnv(language: string, existingLoaderValue?: str
|
|
|
58
58
|
};
|
|
59
59
|
/** Resolve the same concrete SDK names advertised by the connector's GraphQL catalog. */
|
|
60
60
|
export declare function distributionWrapper(language: string, name?: string, legacy?: OdigosJavaHandlerDistro, webServer?: boolean): string;
|
|
61
|
+
/** Concrete layer family and AWS preset associated with a GraphQL distro name. */
|
|
62
|
+
export declare function distributionRecipe(language: string, name?: string, runtime?: string): import("./generated/distributions").LambdaDistribution;
|
package/lib/runtime.js
CHANGED
|
@@ -7,6 +7,7 @@ exports.addLoaderValue = addLoaderValue;
|
|
|
7
7
|
exports.webServerLoaderKey = webServerLoaderKey;
|
|
8
8
|
exports.webServerEnv = webServerEnv;
|
|
9
9
|
exports.distributionWrapper = distributionWrapper;
|
|
10
|
+
exports.distributionRecipe = distributionRecipe;
|
|
10
11
|
const distributions_1 = require("./generated/distributions");
|
|
11
12
|
const layers_1 = require("./generated/layers");
|
|
12
13
|
const types_1 = require("./types");
|
|
@@ -146,9 +147,19 @@ function distributionWrapper(language, name, legacy, webServer = false) {
|
|
|
146
147
|
if (webServer && language === 'ruby')
|
|
147
148
|
throw new Error('Web-server instrumentation is not supported for ruby');
|
|
148
149
|
const d = distributions_1.LAMBDA_DISTRIBUTIONS.find(d => d.language === language && (name ? d.name === name : d.isDefault));
|
|
149
|
-
if (!d || (webServer && (language === 'ruby' || (language === 'java' && d.name !== 'java-lambda-otel-agent')))) {
|
|
150
|
+
if (!d || (webServer && (d.artifact || language === 'ruby' || (language === 'java' && d.name !== 'java-lambda-otel-agent')))) {
|
|
150
151
|
throw new Error(`Unsupported Lambda distro ${name ?? '(default)'} for ${language}`);
|
|
151
152
|
}
|
|
152
153
|
return d.execWrapper;
|
|
153
154
|
}
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMkJBLGtEQU9DO0FBb0JELHdDQVNDO0FBR0Qsb0NBTUM7QUFjRCx3Q0FRQztBQVVELGdEQUVDO0FBY0Qsb0NBcUJDO0FBR0Qsa0RBY0M7QUE5SkQsNkRBQWlFO0FBQ2pFLCtDQUErQztBQUMvQyxtQ0FBNkU7QUFFN0U7Ozs7OztHQU1HO0FBRUgsNEdBQTRHO0FBQzVHLE1BQU0saUJBQWlCLEdBQTRCO0lBQ2pELENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUNwQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUM7SUFDcEIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztDQUNqQixDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsV0FBbUI7SUFDckQsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDbkQsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkMsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLE1BQU0sb0JBQW9CLEdBQThCO0lBQ3RELENBQUMsK0JBQXVCLENBQUMsWUFBWSxDQUFDLEVBQUUsbUJBQW1CO0lBQzNELENBQUMsK0JBQXVCLENBQUMsa0JBQWtCLENBQUMsRUFBRSx5QkFBeUI7SUFDdkUsQ0FBQywrQkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLHVCQUF1QjtJQUNuRSxDQUFDLCtCQUF1QixDQUFDLG1CQUFtQixDQUFDLEVBQUUsMEJBQTBCO0NBQzFFLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxT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bmVyYXRlZC9kaXN0cmlidXRpb25zJztcbmltcG9ydCB7IExBTkdVQUdFUyB9IGZyb20gJy4vZ2VuZXJhdGVkL2xheWVycyc7XG5pbXBvcnQgeyBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLCBPZGlnb3NKYXZhSGFuZGxlckRpc3RybyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFJ1bnRpbWUgLT4gbGFuZ3VhZ2UsIGFuZCBsYW5ndWFnZSAtPiB0aGUgZXhhY3QgZW52IHRoZSBsYXllciBleHBlY3RzLlxuICpcbiAqIE1pcnJvcnMgYExhbmd1YWdlRnJvbVJ1bnRpbWVgLCBgZXhlY1dyYXBwZXJGb3JMYW5ndWFnZWAgYW5kIGB3ZWJTZXJ2ZXJMb2FkZXJgIGluIHRoZSBjb25uZWN0b3Inc1xuICogaW5zdHJ1bWVudG9yLiBUaGUgZGF0YSBsaXZlcyBpbiAuLi8uLi9hcnRpZmFjdHMuanNvbiBhbmQgcmVhY2hlcyBoZXJlIHRocm91Z2ggdGhlIGdlbmVyYXRlZCBtb2R1bGU7IHRoZVxuICogZGVjaXNpb25zIGxpdmUgaGVyZS5cbiAqL1xuXG4vKiogUnVudGltZSBwcmVmaXhlcyB0aGF0IG1hcCB0byBhbiBPVGVsIGxheWVyIGxhbmd1YWdlLiBQcmVmaXgtbWF0Y2hlZCwgc28gYGphdmE4LmFsMmAgcmVzb2x2ZXMgdG8gamF2YS4gKi9cbmNvbnN0IExBTkdVQUdFX1BSRUZJWEVTOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtcbiAgWydweXRob24nLCAncHl0aG9uJ10sXG4gIFsnbm9kZWpzJywgJ25vZGVqcyddLFxuICBbJ2phdmEnLCAnamF2YSddLFxuICBbJ3J1YnknLCAncnVieSddLFxuXTtcblxuLyoqXG4gKiBSZXNvbHZlcyBhIExhbWJkYSBydW50aW1lIGlkZW50aWZpZXIgKGBweXRob24zLjEyYCwgYGphdmEyMWAsIGBub2RlanMyMi54YCkgdG8gdGhlIE9UZWwgbGF5ZXIgbGFuZ3VhZ2UuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgcnVudGltZXMgd2l0aCBubyBPcGVuVGVsZW1ldHJ5IExhbWJkYSBsYW5ndWFnZSBsYXllciDigJQgYGRvdG5ldCpgLCBgcHJvdmlkZWQuKmBcbiAqIChHbyBhbmQgY3VzdG9tIHJ1bnRpbWVzKS4gVGhlIGNhbGxlciByZWZ1c2VzIHRvIGluc3RydW1lbnQgcmF0aGVyIHRoYW4gYXR0YWNoaW5nIGEgbGF5ZXIgdGhhdCBkb2VzXG4gKiBub3RoaW5nLCBiZWNhdXNlIGEgbGF5ZXIgcGx1cyBhbiBleGVjIHdyYXBwZXIgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBpdCBmYWlscyB0aGUgZnVuY3Rpb24gYXQgY29sZCBzdGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhbmd1YWdlRnJvbVJ1bnRpbWUocnVudGltZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgW3ByZWZpeCwgbGFuZ3VhZ2VdIG9mIExBTkdVQUdFX1BSRUZJWEVTKSB7XG4gICAgaWYgKHJ1bnRpbWVOYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgcmV0dXJuIGxhbmd1YWdlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogTWFwcyB0aGUgSmF2YSBkaXN0cm8gZW51bSB0byB0aGUgd3JhcHBlciBzY3JpcHQgcGF0aCB0aGUgbGF5ZXIgc2hpcHMuICovXG5jb25zdCBKQVZBX0RJU1RST19XUkFQUEVSUzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgW09kaWdvc0phdmFIYW5kbGVyRGlzdHJvLk9URUxfSEFORExFUl06ICcvb3B0L290ZWwtaGFuZGxlcicsXG4gIFtPZGlnb3NKYXZhSGFuZGxlckRpc3Ryby5PVEVMX1BST1hZX0hBTkRMRVJdOiAnL29wdC9vdGVsLXByb3h5LWhhbmRsZXInLFxuICBbT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9TUVNfSEFORExFUl06ICcvb3B0L290ZWwtc3FzLWhhbmRsZXInLFxuICBbT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9TVFJFQU1fSEFORExFUl06ICcvb3B0L290ZWwtc3RyZWFtLWhhbmRsZXInLFxufTtcblxuLyoqXG4gKiBUaGUgYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCB2YWx1ZSBmb3IgYSBsYW5ndWFnZS5cbiAqXG4gKiBUaGUgd3JhcHBlciBzY3JpcHQgaXMgbGFuZ3VhZ2Utc3BlY2lmaWMuIEphdmEgZGVmYXVsdHMgdG8gYC9vcHQvb3RlbC1qYXZhYWdlbnQtaGFuZGxlcmA7XG4gKiBQeXRob24gdXNlcyBgL29wdC9vdGVsLWluc3RydW1lbnRgLCBhbmQgTm9kZS5qcy9SdWJ5IHVzZSBgL29wdC9vdGVsLWhhbmRsZXJgLiBTZXR0aW5nIHRoZSB3cm9uZyBvbmUgbWFrZXMgdGhlIGxheWVyIGJvb3RzdHJhcCBmYWlsIGF0IGNvbGQgc3RhcnQgd2l0aFxuICogYC9vcHQvb3RlbC1pbnN0cnVtZW50OiBkb2VzIG5vdCBleGlzdGAgYW5kIHRoZSBmdW5jdGlvbiBlcnJvcnMgb3V0IOKAlCB3aGljaCBpcyB3aHkgdGhpcyBpcyBuZXZlciBhXG4gKiBoYXJkY29kZWQgY29uc3RhbnQgYXQgYSBjYWxsIHNpdGUuXG4gKlxuICogYGRpc3Ryb2AgaXMgb25seSBjb25zdWx0ZWQgZm9yIEphdmEsIHdob3NlIGxheWVyIHNoaXBzIGZvdXIgd3JhcHBlcnMsIG9uZSBwZXIgaGFuZGxlciBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjV3JhcHBlckZvcihsYW5ndWFnZTogc3RyaW5nLCBkaXN0cm8/OiBPZGlnb3NKYXZhSGFuZGxlckRpc3Rybyk6IHN0cmluZyB7XG4gIGlmIChsYW5ndWFnZSA9PT0gJ2phdmEnKSB7XG4gICAgcmV0dXJuIGRpc3RybyA/IEpBVkFfRElTVFJPX1dSQVBQRVJTW2Rpc3Ryb10gOiAnL29wdC9vdGVsLWphdmFhZ2VudC1oYW5kbGVyJztcbiAgfVxuICBjb25zdCBzcGVjID0gTEFOR1VBR0VTW2xhbmd1YWdlXTtcbiAgaWYgKCFzcGVjKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPZGlnb3M6IG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGZvciBsYW5ndWFnZSBcIiR7bGFuZ3VhZ2V9XCJgKTtcbiAgfVxuICByZXR1cm4gc3BlYy5leGVjV3JhcHBlcjtcbn1cblxuLyoqIExheWVyIG5hbWUgZm9yIGEgbGFuZ3VhZ2UvYXJjaGl0ZWN0dXJlIOKAlCBgb2RpZ29zLW90ZWwtcHl0aG9uLWFybTY0YC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllck5hbWVGb3IobGFuZ3VhZ2U6IHN0cmluZywgYXJjaGl0ZWN0dXJlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzcGVjID0gTEFOR1VBR0VTW2xhbmd1YWdlXTtcbiAgaWYgKCFzcGVjKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPZGlnb3M6IHVua25vd24gbGFuZ3VhZ2UgXCIke2xhbmd1YWdlfVwiYCk7XG4gIH1cbiAgcmV0dXJuIGAke3NwZWMubGF5ZXJOYW1lfS0ke2FyY2hpdGVjdHVyZX1gO1xufVxuXG4vKiogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldCBvbiBhIGZ1bmN0aW9uLCBhcyBhIHBsYWluIG1hcC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW52VmFycyB7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IHN0cmluZztcbn1cblxuLyoqXG4gKiBJZGVtcG90ZW50bHkgYWRkcyBvdXIgbG9hZGVyIHZhbHVlIHRvIGEgdmFsdWUgdGhlIGZ1bmN0aW9uIGFscmVhZHkgY2Fycmllcy5cbiAqXG4gKiBgUFlUSE9OUEFUSGAgaXMgUFJFUEVOREVELCBzbyB0aGUgbGF5ZXIncyBwYWNrYWdlcyBhbmQgaXRzIGBzaXRlY3VzdG9taXplYCBhcmUgZm91bmQgZmlyc3Q7IHRoZVxuICogYCpfT1BUSU9OU2AgdmFyaWFibGVzIGFyZSBhcHBlbmRlZCwgc28gdGhlIGN1c3RvbWVyJ3Mgb3duIGZsYWdzIGtlZXAgcHJlY2VkZW5jZS4gTWlycm9yc1xuICogYGFkZExvYWRlclZhbHVlYCBpbiB0aGUgY29ubmVjdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkTG9hZGVyVmFsdWUoZXhpc3Rpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCwgdmFsdWU6IHN0cmluZywgc2VwYXJhdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChleGlzdGluZy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cbiAgcmV0dXJuIHNlcGFyYXRvciA9PT0gJzonID8gYCR7dmFsdWV9JHtzZXBhcmF0b3J9JHtleGlzdGluZ31gIDogYCR7ZXhpc3Rpbmd9JHtzZXBhcmF0b3J9JHt2YWx1ZX1gO1xufVxuXG4vKipcbiAqIFRoZSBsb2FkZXIgdmFyaWFibGUgYSBsYW5ndWFnZSBhY3RpdmF0ZXMgdGhyb3VnaCBpbiB3ZWItc2VydmVyIG1vZGUgKGBOT0RFX09QVElPTlNgLFxuICogYEpBVkFfVE9PTF9PUFRJT05TYCwgYFBZVEhPTlBBVEhgKSwgb3IgdW5kZWZpbmVkIGZvciBhIGxhbmd1YWdlIHdpdGggbm8gdmVyaWZpZWQgd2ViLXNlcnZlciBsb2FkZXIuXG4gKlxuICogRXhpc3RzIHNvIGEgY2FsbGVyIHRoYXQgbmVlZHMgdG8gbmFtZSB0aGUgdmFyaWFibGUg4oCUIHRoZSBvd25lcnNoaXAgbWFya2VyJ3Mgcm9sbGJhY2sgc25hcHNob3QsIHdoaWNoIGhhc1xuICogdG8gcmVjb3JkIHRoZSBjYWxsZXIncyBvd24gcHJpb3IgdmFsdWUgZm9yIGl0IOKAlCBkb2VzIG5vdCBoYXZlIHRvIGd1ZXNzIGl0IGZyb20gdGhlIGtleSBvcmRlciBvZlxuICogYHdlYlNlcnZlckVudmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3ZWJTZXJ2ZXJMb2FkZXJLZXkobGFuZ3VhZ2U6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBMQU5HVUFHRVNbbGFuZ3VhZ2VdPy53ZWJTZXJ2ZXI/LmVudktleTtcbn1cblxuLyoqXG4gKiBUaGUgZW52aXJvbm1lbnQgdGhhdCBsb2FkcyB0aGUgbGFuZ3VhZ2UgYWdlbnQgaW4gd2ViLXNlcnZlciAoQVdTIExhbWJkYSBXZWIgQWRhcHRlcikgbW9kZS5cbiAqXG4gKiBXZWItYWRhcHRlciBmdW5jdGlvbnMgcnVuIGEgd2ViIHNlcnZlciByYXRoZXIgdGhhbiBhIExhbWJkYSBoYW5kbGVyLCBhbmQgdGhlIGFkYXB0ZXIgb3duc1xuICogYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCDigJQgc28gaW5zdHJ1bWVudGF0aW9uIGlzIGxvYWRlZCB0aHJvdWdoIHRoZSBsYW5ndWFnZSdzIG93biBsb2FkZXIgdmFyaWFibGUgYW5kXG4gKiB0aGUgd3JhcHBlciBpcyBsZWZ0IGFsb25lLiBIYW5kbGVyLW1vZGUgaW5zdHJ1bWVudGF0aW9uIGFwcGxpZWQgdG8gb25lIG9mIHRoZXNlIG92ZXJ3cml0ZXMgdGhlXG4gKiBhZGFwdGVyJ3Mgd3JhcHBlciBhbmQgdGhlIGZ1bmN0aW9uIHN0b3BzIHNlcnZpbmcuXG4gKlxuICogQHBhcmFtIGV4aXN0aW5nTG9hZGVyVmFsdWUgdGhlIHZhbHVlIHRoZSBmdW5jdGlvbiBhbHJlYWR5IG5lZWRzIGluIGl0cyBsb2FkZXIgdmFyaWFibGUsIHdoaWNoIG91cnMgaXNcbiAqIGpvaW5lZCB0by4gQ0RLJ3MgYGxhbWJkYS5GdW5jdGlvbmAgZXhwb3NlcyBubyB3YXkgdG8gcmVhZCBiYWNrIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHNldCBlbHNld2hlcmUgaW5cbiAqIHRoZSBhcHAsIHNvIGEgdmFsdWUgdGhhdCBtdXN0IGJlIHByZXNlcnZlZCBoYXMgdG8gYmUgcGFzc2VkIGluIGV4cGxpY2l0bHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3ZWJTZXJ2ZXJFbnYoXG4gIGxhbmd1YWdlOiBzdHJpbmcsXG4gIGV4aXN0aW5nTG9hZGVyVmFsdWU/OiBzdHJpbmcsXG4pOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgY29uc3Qgc3BlYyA9IExBTkdVQUdFU1tsYW5ndWFnZV07XG4gIGNvbnN0IGxvYWRlciA9IHNwZWM/LndlYlNlcnZlcjtcbiAgaWYgKCFsb2FkZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgT2RpZ29zOiAke09kaWdvc0luc3RydW1lbnRhdGlvbk1vZGUuV0VCX1NFUlZFUn0gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGZvciAke2xhbmd1YWdlfSDigJQgYCArXG4gICAgICAgICd0aGVyZSBpcyBubyB2ZXJpZmllZCB3ZWItc2VydmVyIGxvYWRlciBmb3IgaXQuIFVzZSBIQU5ETEVSIG1vZGUsIG9yIGxlYXZlIHRoZSBmdW5jdGlvbiB1bmluc3RydW1lbnRlZC4nLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZW52OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIFtsb2FkZXIuZW52S2V5XTogYWRkTG9hZGVyVmFsdWUoZXhpc3RpbmdMb2FkZXJWYWx1ZSwgbG9hZGVyLnZhbHVlLCBsb2FkZXIuc2VwYXJhdG9yKSxcbiAgfTtcbiAgLy8gUHl0aG9uIG11c3QgYmUgcGlubmVkIHRvIHRoZSBIVFRQIE9UTFAgZXhwb3J0ZXIg4oCUIHRoZSBvbmx5IG9uZSBidW5kbGVkIGluIGl0cyBsYXllci4gT3RoZXIgbGFuZ3VhZ2VzXG4gIC8vIGV4cG9ydCBjb3JyZWN0bHkgd2l0aCB0aGVpciBkZWZhdWx0cywgc28gbm90aGluZyBleHRyYSBpcyB3cml0dGVuIGZvciB0aGVtLlxuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhsb2FkZXIuZXh0cmFFbnYpKSB7XG4gICAgZW52W2tdID0gdjtcbiAgfVxuICByZXR1cm4gZW52O1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgc2FtZSBjb25jcmV0ZSBTREsgbmFtZXMgYWR2ZXJ0aXNlZCBieSB0aGUgY29ubmVjdG9yJ3MgR3JhcGhRTCBjYXRhbG9nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RyaWJ1dGlvbldyYXBwZXIobGFuZ3VhZ2U6IHN0cmluZywgbmFtZT86IHN0cmluZywgbGVnYWN5PzogT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8sIHdlYlNlcnZlciA9IGZhbHNlKTogc3RyaW5nIHtcbiAgaWYgKGxlZ2FjeSAmJiBuYW1lKSB0aHJvdyBuZXcgRXJyb3IoJ1VzZSBkaXN0cm8gb3IgbGVnYWN5IGphdmFIYW5kbGVyRGlzdHJvLCBub3QgYm90aCcpO1xuICBpZiAobGVnYWN5KSB7XG4gICAgaWYgKGxhbmd1YWdlICE9PSAnamF2YScpIHJldHVybiBleGVjV3JhcHBlckZvcihsYW5ndWFnZSk7XG4gICAgaWYgKHdlYlNlcnZlcikgdGhyb3cgbmV3IEVycm9yKCdKYXZhIGhhbmRsZXIgYWRhcHRlcnMgcmVxdWlyZSBIQU5ETEVSIG1vZGUnKTtcbiAgICBpZiAoIUpBVkFfRElTVFJPX1dSQVBQRVJTW2xlZ2FjeV0pIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgSmF2YSBoYW5kbGVyIGFkYXB0ZXIgJHtsZWdhY3l9YCk7XG4gICAgcmV0dXJuIGV4ZWNXcmFwcGVyRm9yKGxhbmd1YWdlLCBsZWdhY3kpO1xuICB9XG4gIGlmICh3ZWJTZXJ2ZXIgJiYgbGFuZ3VhZ2UgPT09ICdydWJ5JykgdGhyb3cgbmV3IEVycm9yKCdXZWItc2VydmVyIGluc3RydW1lbnRhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBydWJ5Jyk7XG4gIGNvbnN0IGQgPSBMQU1CREFfRElTVFJJQlVUSU9OUy5maW5kKGQgPT4gZC5sYW5ndWFnZSA9PT0gbGFuZ3VhZ2UgJiYgKG5hbWUgPyBkLm5hbWUgPT09IG5hbWUgOiBkLmlzRGVmYXVsdCkpO1xuICBpZiAoIWQgfHwgKHdlYlNlcnZlciAmJiAobGFuZ3VhZ2UgPT09ICdydWJ5JyB8fCAobGFuZ3VhZ2UgPT09ICdqYXZhJyAmJiBkLm5hbWUgIT09ICdqYXZhLWxhbWJkYS1vdGVsLWFnZW50JykpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgTGFtYmRhIGRpc3RybyAke25hbWUgPz8gJyhkZWZhdWx0KSd9IGZvciAke2xhbmd1YWdlfWApO1xuICB9XG4gIHJldHVybiBkLmV4ZWNXcmFwcGVyO1xufVxuIl19
|
|
155
|
+
/** Concrete layer family and AWS preset associated with a GraphQL distro name. */
|
|
156
|
+
function distributionRecipe(language, name, runtime) {
|
|
157
|
+
const d = distributions_1.LAMBDA_DISTRIBUTIONS.find(d => d.language === language && (name ? d.name === name : d.isDefault));
|
|
158
|
+
if (!d)
|
|
159
|
+
throw new Error(`Unsupported Lambda distro ${name ?? '(default)'} for ${language}`);
|
|
160
|
+
if (runtime && d.compatibleRuntimes && !d.compatibleRuntimes.includes(runtime)) {
|
|
161
|
+
throw new Error(`Lambda distro ${d.name} does not support runtime ${runtime}`);
|
|
162
|
+
}
|
|
163
|
+
return d;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMkJBLGtEQU9DO0FBb0JELHdDQVNDO0FBR0Qsb0NBTUM7QUFjRCx3Q0FRQztBQVVELGdEQUVDO0FBY0Qsb0NBcUJDO0FBR0Qsa0RBY0M7QUFHRCxnREFPQztBQXhLRCw2REFBaUU7QUFDakUsK0NBQStDO0FBQy9DLG1DQUE2RTtBQUU3RTs7Ozs7O0dBTUc7QUFFSCw0R0FBNEc7QUFDNUcsTUFBTSxpQkFBaUIsR0FBNEI7SUFDakQsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO0lBQ3BCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUNwQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDaEIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO0NBQ2pCLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxXQUFtQjtJQUNyRCxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUNuRCxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsTUFBTSxvQkFBb0IsR0FBOEI7SUFDdEQsQ0FBQywrQkFBdUIsQ0FBQyxZQUFZLENBQUMsRUFBRSxtQkFBbUI7SUFDM0QsQ0FBQywrQkFBdUIsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLHlCQUF5QjtJQUN2RSxDQUFDLCtCQUF1QixDQUFDLGdCQUFnQixDQUFDLEVBQUUsdUJBQXVCO0lBQ25FLENBQUMsK0JBQXVCLENBQUMsbUJBQW1CLENBQUMsRUFBRSwwQkFBMEI7Q0FDMUUsQ0FBQztBQUVGOzs7Ozs7Ozs7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Q0FBQyxRQUFnQixFQUFFLElBQWEsRUFBRSxPQUFnQjtJQUNsRixNQUFNLENBQUMsR0FBRyxvQ0FBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzVHLElBQUksQ0FBQyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsSUFBSSxJQUFJLFdBQVcsUUFBUSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzVGLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUMvRSxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSw2QkFBNkIsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTEFNQkRBX0RJU1RSSUJVVElPTlMgfSBmcm9tICcuL2dlbmVyYXRlZC9kaXN0cmlidXRpb25zJztcbmltcG9ydCB7IExBTkdVQUdFUyB9IGZyb20gJy4vZ2VuZXJhdGVkL2xheWVycyc7XG5pbXBvcnQgeyBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLCBPZGlnb3NKYXZhSGFuZGxlckRpc3RybyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFJ1bnRpbWUgLT4gbGFuZ3VhZ2UsIGFuZCBsYW5ndWFnZSAtPiB0aGUgZXhhY3QgZW52IHRoZSBsYXllciBleHBlY3RzLlxuICpcbiAqIE1pcnJvcnMgYExhbmd1YWdlRnJvbVJ1bnRpbWVgLCBgZXhlY1dyYXBwZXJGb3JMYW5ndWFnZWAgYW5kIGB3ZWJTZXJ2ZXJMb2FkZXJgIGluIHRoZSBjb25uZWN0b3Inc1xuICogaW5zdHJ1bWVudG9yLiBUaGUgZGF0YSBsaXZlcyBpbiAuLi8uLi9hcnRpZmFjdHMuanNvbiBhbmQgcmVhY2hlcyBoZXJlIHRocm91Z2ggdGhlIGdlbmVyYXRlZCBtb2R1bGU7IHRoZVxuICogZGVjaXNpb25zIGxpdmUgaGVyZS5cbiAqL1xuXG4vKiogUnVudGltZSBwcmVmaXhlcyB0aGF0IG1hcCB0byBhbiBPVGVsIGxheWVyIGxhbmd1YWdlLiBQcmVmaXgtbWF0Y2hlZCwgc28gYGphdmE4LmFsMmAgcmVzb2x2ZXMgdG8gamF2YS4gKi9cbmNvbnN0IExBTkdVQUdFX1BSRUZJWEVTOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtcbiAgWydweXRob24nLCAncHl0aG9uJ10sXG4gIFsnbm9kZWpzJywgJ25vZGVqcyddLFxuICBbJ2phdmEnLCAnamF2YSddLFxuICBbJ3J1YnknLCAncnVieSddLFxuXTtcblxuLyoqXG4gKiBSZXNvbHZlcyBhIExhbWJkYSBydW50aW1lIGlkZW50aWZpZXIgKGBweXRob24zLjEyYCwgYGphdmEyMWAsIGBub2RlanMyMi54YCkgdG8gdGhlIE9UZWwgbGF5ZXIgbGFuZ3VhZ2UuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgcnVudGltZXMgd2l0aCBubyBPcGVuVGVsZW1ldHJ5IExhbWJkYSBsYW5ndWFnZSBsYXllciDigJQgYGRvdG5ldCpgLCBgcHJvdmlkZWQuKmBcbiAqIChHbyBhbmQgY3VzdG9tIHJ1bnRpbWVzKS4gVGhlIGNhbGxlciByZWZ1c2VzIHRvIGluc3RydW1lbnQgcmF0aGVyIHRoYW4gYXR0YWNoaW5nIGEgbGF5ZXIgdGhhdCBkb2VzXG4gKiBub3RoaW5nLCBiZWNhdXNlIGEgbGF5ZXIgcGx1cyBhbiBleGVjIHdyYXBwZXIgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBpdCBmYWlscyB0aGUgZnVuY3Rpb24gYXQgY29sZCBzdGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhbmd1YWdlRnJvbVJ1bnRpbWUocnVudGltZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgW3ByZWZpeCwgbGFuZ3VhZ2VdIG9mIExBTkdVQUdFX1BSRUZJWEVTKSB7XG4gICAgaWYgKHJ1bnRpbWVOYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgcmV0dXJuIGxhbmd1YWdlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogTWFwcyB0aGUgSmF2YSBkaXN0cm8gZW51bSB0byB0aGUgd3JhcHBlciBzY3JpcHQgcGF0aCB0aGUgbGF5ZXIgc2hpcHMuICovXG5jb25zdCBKQVZBX0RJU1RST19XUkFQUEVSUzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgW09kaWdvc0phdmFIYW5kbGVyRGlzdHJvLk9URUxfSEFORExFUl06ICcvb3B0L290ZWwtaGFuZGxlcicsXG4gIFtPZGlnb3NKYXZhSGFuZGxlckRpc3Ryby5PVEVMX1BST1hZX0hBTkRMRVJdOiAnL29wdC9vdGVsLXByb3h5LWhhbmRsZXInLFxuICBbT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9TUVNfSEFORExFUl06ICcvb3B0L290ZWwtc3FzLWhhbmRsZXInLFxuICBbT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9TVFJFQU1fSEFORExFUl06ICcvb3B0L290ZWwtc3RyZWFtLWhhbmRsZXInLFxufTtcblxuLyoqXG4gKiBUaGUgYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCB2YWx1ZSBmb3IgYSBsYW5ndWFnZS5cbiAqXG4gKiBUaGUgd3JhcHBlciBzY3JpcHQgaXMgbGFuZ3VhZ2Utc3BlY2lmaWMuIEphdmEgZGVmYXVsdHMgdG8gYC9vcHQvb3RlbC1qYXZhYWdlbnQtaGFuZGxlcmA7XG4gKiBQeXRob24gdXNlcyBgL29wdC9vdGVsLWluc3RydW1lbnRgLCBhbmQgTm9kZS5qcy9SdWJ5IHVzZSBgL29wdC9vdGVsLWhhbmRsZXJgLiBTZXR0aW5nIHRoZSB3cm9uZyBvbmUgbWFrZXMgdGhlIGxheWVyIGJvb3RzdHJhcCBmYWlsIGF0IGNvbGQgc3RhcnQgd2l0aFxuICogYC9vcHQvb3RlbC1pbnN0cnVtZW50OiBkb2VzIG5vdCBleGlzdGAgYW5kIHRoZSBmdW5jdGlvbiBlcnJvcnMgb3V0IOKAlCB3aGljaCBpcyB3aHkgdGhpcyBpcyBuZXZlciBhXG4gKiBoYXJkY29kZWQgY29uc3RhbnQgYXQgYSBjYWxsIHNpdGUuXG4gKlxuICogYGRpc3Ryb2AgaXMgb25seSBjb25zdWx0ZWQgZm9yIEphdmEsIHdob3NlIGxheWVyIHNoaXBzIGZvdXIgd3JhcHBlcnMsIG9uZSBwZXIgaGFuZGxlciBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjV3JhcHBlckZvcihsYW5ndWFnZTogc3RyaW5nLCBkaXN0cm8/OiBPZGlnb3NKYXZhSGFuZGxlckRpc3Rybyk6IHN0cmluZyB7XG4gIGlmIChsYW5ndWFnZSA9PT0gJ2phdmEnKSB7XG4gICAgcmV0dXJuIGRpc3RybyA/IEpBVkFfRElTVFJPX1dSQVBQRVJTW2Rpc3Ryb10gOiAnL29wdC9vdGVsLWphdmFhZ2VudC1oYW5kbGVyJztcbiAgfVxuICBjb25zdCBzcGVjID0gTEFOR1VBR0VTW2xhbmd1YWdlXTtcbiAgaWYgKCFzcGVjKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPZGlnb3M6IG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGZvciBsYW5ndWFnZSBcIiR7bGFuZ3VhZ2V9XCJgKTtcbiAgfVxuICByZXR1cm4gc3BlYy5leGVjV3JhcHBlcjtcbn1cblxuLyoqIExheWVyIG5hbWUgZm9yIGEgbGFuZ3VhZ2UvYXJjaGl0ZWN0dXJlIOKAlCBgb2RpZ29zLW90ZWwtcHl0aG9uLWFybTY0YC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllck5hbWVGb3IobGFuZ3VhZ2U6IHN0cmluZywgYXJjaGl0ZWN0dXJlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzcGVjID0gTEFOR1VBR0VTW2xhbmd1YWdlXTtcbiAgaWYgKCFzcGVjKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPZGlnb3M6IHVua25vd24gbGFuZ3VhZ2UgXCIke2xhbmd1YWdlfVwiYCk7XG4gIH1cbiAgcmV0dXJuIGAke3NwZWMubGF5ZXJOYW1lfS0ke2FyY2hpdGVjdHVyZX1gO1xufVxuXG4vKiogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldCBvbiBhIGZ1bmN0aW9uLCBhcyBhIHBsYWluIG1hcC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW52VmFycyB7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IHN0cmluZztcbn1cblxuLyoqXG4gKiBJZGVtcG90ZW50bHkgYWRkcyBvdXIgbG9hZGVyIHZhbHVlIHRvIGEgdmFsdWUgdGhlIGZ1bmN0aW9uIGFscmVhZHkgY2Fycmllcy5cbiAqXG4gKiBgUFlUSE9OUEFUSGAgaXMgUFJFUEVOREVELCBzbyB0aGUgbGF5ZXIncyBwYWNrYWdlcyBhbmQgaXRzIGBzaXRlY3VzdG9taXplYCBhcmUgZm91bmQgZmlyc3Q7IHRoZVxuICogYCpfT1BUSU9OU2AgdmFyaWFibGVzIGFyZSBhcHBlbmRlZCwgc28gdGhlIGN1c3RvbWVyJ3Mgb3duIGZsYWdzIGtlZXAgcHJlY2VkZW5jZS4gTWlycm9yc1xuICogYGFkZExvYWRlclZhbHVlYCBpbiB0aGUgY29ubmVjdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkTG9hZGVyVmFsdWUoZXhpc3Rpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCwgdmFsdWU6IHN0cmluZywgc2VwYXJhdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChleGlzdGluZy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cbiAgcmV0dXJuIHNlcGFyYXRvciA9PT0gJzonID8gYCR7dmFsdWV9JHtzZXBhcmF0b3J9JHtleGlzdGluZ31gIDogYCR7ZXhpc3Rpbmd9JHtzZXBhcmF0b3J9JHt2YWx1ZX1gO1xufVxuXG4vKipcbiAqIFRoZSBsb2FkZXIgdmFyaWFibGUgYSBsYW5ndWFnZSBhY3RpdmF0ZXMgdGhyb3VnaCBpbiB3ZWItc2VydmVyIG1vZGUgKGBOT0RFX09QVElPTlNgLFxuICogYEpBVkFfVE9PTF9PUFRJT05TYCwgYFBZVEhPTlBBVEhgKSwgb3IgdW5kZWZpbmVkIGZvciBhIGxhbmd1YWdlIHdpdGggbm8gdmVyaWZpZWQgd2ViLXNlcnZlciBsb2FkZXIuXG4gKlxuICogRXhpc3RzIHNvIGEgY2FsbGVyIHRoYXQgbmVlZHMgdG8gbmFtZSB0aGUgdmFyaWFibGUg4oCUIHRoZSBvd25lcnNoaXAgbWFya2VyJ3Mgcm9sbGJhY2sgc25hcHNob3QsIHdoaWNoIGhhc1xuICogdG8gcmVjb3JkIHRoZSBjYWxsZXIncyBvd24gcHJpb3IgdmFsdWUgZm9yIGl0IOKAlCBkb2VzIG5vdCBoYXZlIHRvIGd1ZXNzIGl0IGZyb20gdGhlIGtleSBvcmRlciBvZlxuICogYHdlYlNlcnZlckVudmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3ZWJTZXJ2ZXJMb2FkZXJLZXkobGFuZ3VhZ2U6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBMQU5HVUFHRVNbbGFuZ3VhZ2VdPy53ZWJTZXJ2ZXI/LmVudktleTtcbn1cblxuLyoqXG4gKiBUaGUgZW52aXJvbm1lbnQgdGhhdCBsb2FkcyB0aGUgbGFuZ3VhZ2UgYWdlbnQgaW4gd2ViLXNlcnZlciAoQVdTIExhbWJkYSBXZWIgQWRhcHRlcikgbW9kZS5cbiAqXG4gKiBXZWItYWRhcHRlciBmdW5jdGlvbnMgcnVuIGEgd2ViIHNlcnZlciByYXRoZXIgdGhhbiBhIExhbWJkYSBoYW5kbGVyLCBhbmQgdGhlIGFkYXB0ZXIgb3duc1xuICogYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCDigJQgc28gaW5zdHJ1bWVudGF0aW9uIGlzIGxvYWRlZCB0aHJvdWdoIHRoZSBsYW5ndWFnZSdzIG93biBsb2FkZXIgdmFyaWFibGUgYW5kXG4gKiB0aGUgd3JhcHBlciBpcyBsZWZ0IGFsb25lLiBIYW5kbGVyLW1vZGUgaW5zdHJ1bWVudGF0aW9uIGFwcGxpZWQgdG8gb25lIG9mIHRoZXNlIG92ZXJ3cml0ZXMgdGhlXG4gKiBhZGFwdGVyJ3Mgd3JhcHBlciBhbmQgdGhlIGZ1bmN0aW9uIHN0b3BzIHNlcnZpbmcuXG4gKlxuICogQHBhcmFtIGV4aXN0aW5nTG9hZGVyVmFsdWUgdGhlIHZhbHVlIHRoZSBmdW5jdGlvbiBhbHJlYWR5IG5lZWRzIGluIGl0cyBsb2FkZXIgdmFyaWFibGUsIHdoaWNoIG91cnMgaXNcbiAqIGpvaW5lZCB0by4gQ0RLJ3MgYGxhbWJkYS5GdW5jdGlvbmAgZXhwb3NlcyBubyB3YXkgdG8gcmVhZCBiYWNrIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHNldCBlbHNld2hlcmUgaW5cbiAqIHRoZSBhcHAsIHNvIGEgdmFsdWUgdGhhdCBtdXN0IGJlIHByZXNlcnZlZCBoYXMgdG8gYmUgcGFzc2VkIGluIGV4cGxpY2l0bHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3ZWJTZXJ2ZXJFbnYoXG4gIGxhbmd1YWdlOiBzdHJpbmcsXG4gIGV4aXN0aW5nTG9hZGVyVmFsdWU/OiBzdHJpbmcsXG4pOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgY29uc3Qgc3BlYyA9IExBTkdVQUdFU1tsYW5ndWFnZV07XG4gIGNvbnN0IGxvYWRlciA9IHNwZWM/LndlYlNlcnZlcjtcbiAgaWYgKCFsb2FkZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgT2RpZ29zOiAke09kaWdvc0luc3RydW1lbnRhdGlvbk1vZGUuV0VCX1NFUlZFUn0gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGZvciAke2xhbmd1YWdlfSDigJQgYCArXG4gICAgICAgICd0aGVyZSBpcyBubyB2ZXJpZmllZCB3ZWItc2VydmVyIGxvYWRlciBmb3IgaXQuIFVzZSBIQU5ETEVSIG1vZGUsIG9yIGxlYXZlIHRoZSBmdW5jdGlvbiB1bmluc3RydW1lbnRlZC4nLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZW52OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIFtsb2FkZXIuZW52S2V5XTogYWRkTG9hZGVyVmFsdWUoZXhpc3RpbmdMb2FkZXJWYWx1ZSwgbG9hZGVyLnZhbHVlLCBsb2FkZXIuc2VwYXJhdG9yKSxcbiAgfTtcbiAgLy8gUHl0aG9uIG11c3QgYmUgcGlubmVkIHRvIHRoZSBIVFRQIE9UTFAgZXhwb3J0ZXIg4oCUIHRoZSBvbmx5IG9uZSBidW5kbGVkIGluIGl0cyBsYXllci4gT3RoZXIgbGFuZ3VhZ2VzXG4gIC8vIGV4cG9ydCBjb3JyZWN0bHkgd2l0aCB0aGVpciBkZWZhdWx0cywgc28gbm90aGluZyBleHRyYSBpcyB3cml0dGVuIGZvciB0aGVtLlxuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhsb2FkZXIuZXh0cmFFbnYpKSB7XG4gICAgZW52W2tdID0gdjtcbiAgfVxuICByZXR1cm4gZW52O1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgc2FtZSBjb25jcmV0ZSBTREsgbmFtZXMgYWR2ZXJ0aXNlZCBieSB0aGUgY29ubmVjdG9yJ3MgR3JhcGhRTCBjYXRhbG9nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RyaWJ1dGlvbldyYXBwZXIobGFuZ3VhZ2U6IHN0cmluZywgbmFtZT86IHN0cmluZywgbGVnYWN5PzogT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8sIHdlYlNlcnZlciA9IGZhbHNlKTogc3RyaW5nIHtcbiAgaWYgKGxlZ2FjeSAmJiBuYW1lKSB0aHJvdyBuZXcgRXJyb3IoJ1VzZSBkaXN0cm8gb3IgbGVnYWN5IGphdmFIYW5kbGVyRGlzdHJvLCBub3QgYm90aCcpO1xuICBpZiAobGVnYWN5KSB7XG4gICAgaWYgKGxhbmd1YWdlICE9PSAnamF2YScpIHJldHVybiBleGVjV3JhcHBlckZvcihsYW5ndWFnZSk7XG4gICAgaWYgKHdlYlNlcnZlcikgdGhyb3cgbmV3IEVycm9yKCdKYXZhIGhhbmRsZXIgYWRhcHRlcnMgcmVxdWlyZSBIQU5ETEVSIG1vZGUnKTtcbiAgICBpZiAoIUpBVkFfRElTVFJPX1dSQVBQRVJTW2xlZ2FjeV0pIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgSmF2YSBoYW5kbGVyIGFkYXB0ZXIgJHtsZWdhY3l9YCk7XG4gICAgcmV0dXJuIGV4ZWNXcmFwcGVyRm9yKGxhbmd1YWdlLCBsZWdhY3kpO1xuICB9XG4gIGlmICh3ZWJTZXJ2ZXIgJiYgbGFuZ3VhZ2UgPT09ICdydWJ5JykgdGhyb3cgbmV3IEVycm9yKCdXZWItc2VydmVyIGluc3RydW1lbnRhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBydWJ5Jyk7XG4gIGNvbnN0IGQgPSBMQU1CREFfRElTVFJJQlVUSU9OUy5maW5kKGQgPT4gZC5sYW5ndWFnZSA9PT0gbGFuZ3VhZ2UgJiYgKG5hbWUgPyBkLm5hbWUgPT09IG5hbWUgOiBkLmlzRGVmYXVsdCkpO1xuICBpZiAoIWQgfHwgKHdlYlNlcnZlciAmJiAoZC5hcnRpZmFjdCB8fCBsYW5ndWFnZSA9PT0gJ3J1YnknIHx8IChsYW5ndWFnZSA9PT0gJ2phdmEnICYmIGQubmFtZSAhPT0gJ2phdmEtbGFtYmRhLW90ZWwtYWdlbnQnKSkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBMYW1iZGEgZGlzdHJvICR7bmFtZSA/PyAnKGRlZmF1bHQpJ30gZm9yICR7bGFuZ3VhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIGQuZXhlY1dyYXBwZXI7XG59XG5cbi8qKiBDb25jcmV0ZSBsYXllciBmYW1pbHkgYW5kIEFXUyBwcmVzZXQgYXNzb2NpYXRlZCB3aXRoIGEgR3JhcGhRTCBkaXN0cm8gbmFtZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0cmlidXRpb25SZWNpcGUobGFuZ3VhZ2U6IHN0cmluZywgbmFtZT86IHN0cmluZywgcnVudGltZT86IHN0cmluZykge1xuICBjb25zdCBkID0gTEFNQkRBX0RJU1RSSUJVVElPTlMuZmluZChkID0+IGQubGFuZ3VhZ2UgPT09IGxhbmd1YWdlICYmIChuYW1lID8gZC5uYW1lID09PSBuYW1lIDogZC5pc0RlZmF1bHQpKTtcbiAgaWYgKCFkKSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIExhbWJkYSBkaXN0cm8gJHtuYW1lID8/ICcoZGVmYXVsdCknfSBmb3IgJHtsYW5ndWFnZX1gKTtcbiAgaWYgKHJ1bnRpbWUgJiYgZC5jb21wYXRpYmxlUnVudGltZXMgJiYgIWQuY29tcGF0aWJsZVJ1bnRpbWVzLmluY2x1ZGVzKHJ1bnRpbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBMYW1iZGEgZGlzdHJvICR7ZC5uYW1lfSBkb2VzIG5vdCBzdXBwb3J0IHJ1bnRpbWUgJHtydW50aW1lfWApO1xuICB9XG4gIHJldHVybiBkO1xufVxuIl19
|