@odigos/aws-cdk 0.0.16 → 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 +100 -45
- 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 +26 -0
- package/lib/generated/distributions.js +283 -0
- 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 +354 -149
- package/lib/instrumentation.d.ts +18 -10
- package/lib/instrumentation.js +66 -71
- package/lib/runtime.d.ts +6 -2
- package/lib/runtime.js +38 -4
- 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
|
@@ -27,9 +27,13 @@ export interface OdigosInstrumentationOptions {
|
|
|
27
27
|
*/
|
|
28
28
|
readonly mode?: OdigosInstrumentationMode;
|
|
29
29
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
|
|
30
|
+
* Connector GraphQL distro name, such as java-lambda-otel-agent or java-lambda-otel-wrapper.
|
|
31
|
+
* @default - the bundled default distribution for the function's runtime
|
|
32
|
+
*/
|
|
33
|
+
readonly distro?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Legacy lightweight Java handler adapter.
|
|
36
|
+
* @deprecated Use the corresponding java-lambda-otel-*-wrapper distro.
|
|
33
37
|
*/
|
|
34
38
|
readonly javaHandlerDistro?: OdigosJavaHandlerDistro;
|
|
35
39
|
/**
|
|
@@ -66,6 +70,12 @@ export interface OdigosInstrumentationOptions {
|
|
|
66
70
|
* @default - resolved from layerSource
|
|
67
71
|
*/
|
|
68
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;
|
|
69
79
|
/**
|
|
70
80
|
* The value the function already needs in its language loader variable (`NODE_OPTIONS`,
|
|
71
81
|
* `JAVA_TOOL_OPTIONS` or `PYTHONPATH`), which the Odigos loader is joined to rather than replacing.
|
|
@@ -111,8 +121,8 @@ export interface OdigosLambdaInstrumentationProps extends OdigosInstrumentationO
|
|
|
111
121
|
* ```
|
|
112
122
|
*
|
|
113
123
|
* What it does to each function: attaches the layer for the function's language and architecture, sets
|
|
114
|
-
* `AWS_LAMBDA_EXEC_WRAPPER`
|
|
115
|
-
* 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.
|
|
116
126
|
*
|
|
117
127
|
* The function's SDK exports to the collector on localhost, not to your destination. The collector
|
|
118
128
|
* forwards after the handler has already returned, so a slow destination costs billed duration rather
|
|
@@ -125,14 +135,13 @@ export interface OdigosLambdaInstrumentationProps extends OdigosInstrumentationO
|
|
|
125
135
|
* ends up owned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts the
|
|
126
136
|
* connector's, and every round trip publishes a new function version.
|
|
127
137
|
*
|
|
128
|
-
* Choose one per function. This construct writes `
|
|
129
|
-
* 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
|
|
130
140
|
* will roll back — though it will happily take it over if you enable it as a source.
|
|
131
141
|
*/
|
|
132
142
|
export declare class OdigosLambdaInstrumentation extends Construct {
|
|
133
143
|
private readonly options;
|
|
134
144
|
private readonly resolver;
|
|
135
|
-
private readonly collectorConfig;
|
|
136
145
|
private readonly instrumented;
|
|
137
146
|
constructor(scope: Construct, id: string, props: OdigosLambdaInstrumentationProps);
|
|
138
147
|
/**
|
|
@@ -147,8 +156,7 @@ export declare class OdigosLambdaInstrumentation extends Construct {
|
|
|
147
156
|
*
|
|
148
157
|
* Mirrors `applyHandlerEnv` / `applyWebServerEnv` in the connector, including what is deliberately NOT
|
|
149
158
|
* set: `OTEL_EXPORTER_OTLP_ENDPOINT` stays unset so the SDK keeps exporting to the in-Lambda collector
|
|
150
|
-
* on localhost rather than blocking the invocation on the remote destination, and
|
|
151
|
-
* `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.
|
|
152
160
|
*/
|
|
153
161
|
private environmentFor;
|
|
154
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,52 +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) {
|
|
171
|
-
const { destination, mode, debug, serviceName, javaHandlerDistro, existingLoaderValue } = this.options;
|
|
158
|
+
environmentFor(fn, language, layerArn, collectorLayerArn) {
|
|
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
|
+
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;
|
|
186
195
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
if (debug) {
|
|
190
|
-
env[ENV_OTEL_LOG_LEVEL] = 'debug';
|
|
191
|
-
}
|
|
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.');
|
|
192
198
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
// error loop; the pipeline being absent is the half that stops the export.
|
|
196
|
-
const enabled = (0, collector_config_1.resolvedSignals)(destination);
|
|
197
|
-
const overrides = [
|
|
198
|
-
[collector_config_1.ENV_TRACES_EXPORTER, (0, collector_config_1.exporterOverrideFor)(enabled.traces)],
|
|
199
|
-
[collector_config_1.ENV_METRICS_EXPORTER, (0, collector_config_1.exporterOverrideFor)(enabled.metrics)],
|
|
200
|
-
[collector_config_1.ENV_LOGS_EXPORTER, (0, collector_config_1.exporterOverrideFor)(enabled.logs)],
|
|
201
|
-
];
|
|
202
|
-
for (const [name, value] of overrides) {
|
|
203
|
-
if (value !== undefined) {
|
|
204
|
-
env[name] = value;
|
|
205
|
-
}
|
|
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.');
|
|
206
201
|
}
|
|
207
202
|
return env;
|
|
208
203
|
}
|
|
209
204
|
}
|
|
210
205
|
exports.OdigosLambdaInstrumentation = OdigosLambdaInstrumentation;
|
|
211
206
|
_a = JSII_RTTI_SYMBOL_1;
|
|
212
|
-
OdigosLambdaInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosLambdaInstrumentation", version: "0.0.
|
|
207
|
+
OdigosLambdaInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosLambdaInstrumentation", version: "0.0.18" };
|
|
213
208
|
/**
|
|
214
209
|
* Applies Odigos instrumentation to every `lambda.Function` in a scope.
|
|
215
210
|
*
|
|
@@ -247,5 +242,5 @@ class OdigosInstrumentationAspect {
|
|
|
247
242
|
}
|
|
248
243
|
exports.OdigosInstrumentationAspect = OdigosInstrumentationAspect;
|
|
249
244
|
_b = JSII_RTTI_SYMBOL_1;
|
|
250
|
-
OdigosInstrumentationAspect[_b] = { fqn: "@odigos/aws-cdk.OdigosInstrumentationAspect", version: "0.0.
|
|
251
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFpRTtBQUNqRSxpREFBaUQ7QUFDakQsMkNBQW1EO0FBQ25ELHlEQVE0QjtBQUM1QiwrQ0FBb0Q7QUFDcEQscURBQXVEO0FBQ3ZELHVDQUE4RTtBQUM5RSxtQ0FLaUI7QUFFakIsMkVBQTJFO0FBQzNFLE1BQU0sZ0JBQWdCLEdBQUcseUJBQXlCLENBQUM7QUFDbkQsa0VBQWtFO0FBQ2xFLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUM7QUFDN0MsMkZBQTJGO0FBQzNGLE1BQU0sa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUM7QUFFNUM7OztHQUdHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBRXpCOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDO0FBRXBDOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILFNBQVMsa0JBQWtCLENBQUMsRUFBbUI7SUFDN0MsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUE4QyxDQUFDO0lBQ25FLE1BQU0sUUFBUSxHQUFHLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4RixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNyRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNw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Ozs7OztHQWdCRztBQUNILE1BQWEsMkJBQTJCO0lBR3RDOzs7O09BSUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsS0FBdUM7UUFDbkUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLDJCQUEyQixDQUFDLEtBQUssRUFBRSw2QkFBNkIsRUFBRTtZQUMzRix1QkFBdUIsRUFBRSxJQUFJO1lBQzdCLEdBQUcsS0FBSztTQUNULENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBZ0I7UUFDM0IsSUFBSSxJQUFJLFlBQVksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLENBQUM7SUFDSCxDQUFDOztBQW5CSCxrRUFvQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbm5vdGF0aW9ucywgSUFzcGVjdCwgU3RhY2ssIFRva2VuIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge1xuICBFTlZfQ09MTEVDVE9SX0NPTkZJR19VUkksXG4gIEVOVl9MT0dTX0VYUE9SVEVSLFxuICBFTlZfTUVUUklDU19FWFBPUlRFUixcbiAgRU5WX1RSQUNFU19FWFBPUlRFUixcbiAgZXhwb3J0ZXJPdmVycmlkZUZvcixcbiAgcmVuZGVyQ29sbGVjdG9yQ29uZmlnLFxuICByZXNvbHZlZFNpZ25hbHMsXG59IGZyb20gJy4vY29sbGVjdG9yLWNvbmZpZyc7XG5pbXBvcnQgeyBPRElHT1NfVkVSU0lPTiB9IGZyb20gJy4vZ2VuZXJhdGVkL2xheWVycyc7XG5pbXBvcnQgeyBPZGlnb3NMYXllclJlc29sdmVyIH0gZnJvbSAnLi9sYXllci1yZXNvbHZlcic7XG5pbXBvcnQgeyBleGVjV3JhcHBlckZvciwgbGFuZ3VhZ2VGcm9tUnVudGltZSwgd2ViU2VydmVyRW52IH0gZnJvbSAnLi9ydW50aW1lJztcbmltcG9ydCB7XG4gIE9kaWdvc0Rlc3RpbmF0aW9uLFxuICBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLFxuICBPZGlnb3NKYXZhSGFuZGxlckRpc3RybyxcbiAgT2RpZ29zTGF5ZXJTb3VyY2UsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKiogYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCDigJQgdGhlIGxheWVyJ3MgZW50cnkgcG9pbnQgaW4gaGFuZGxlciBtb2RlLiAqL1xuY29uc3QgRU5WX0VYRUNfV1JBUFBFUiA9ICdBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUic7XG4vKiogU2VydmljZSBuYW1lIHJlcG9ydGVkIG9uIGV2ZXJ5IHNwYW4sIG1ldHJpYyBhbmQgbG9nIHJlY29yZC4gKi9cbmNvbnN0IEVOVl9TRVJWSUNFX05BTUUgPSAnT1RFTF9TRVJWSUNFX05BTUUnO1xuLyoqIFJhaXNlcyBpbi1mdW5jdGlvbiBPcGVuVGVsZW1ldHJ5IHZlcmJvc2l0eSBpbnRvIHRoZSBmdW5jdGlvbidzIENsb3VkV2F0Y2ggbG9nIGdyb3VwLiAqL1xuY29uc3QgRU5WX09URUxfTE9HX0xFVkVMID0gJ09URUxfTE9HX0xFVkVMJztcblxuLyoqXG4gKiBTY2hlbWEgdmVyc2lvbiBvZiB0aGUgbWFya2VyIHBheWxvYWQuIE11c3QgbWF0Y2ggYGFwaS5JYUNNYXJrZXJWZXJzaW9uYCBpbiB0aGUgY29ubmVjdG9yIOKAlCBpdCBpcyB3aGF0IHRlbGxzXG4gKiB0aGUgY29ubmVjdG9yIGhvdyB0byByZWFkIHRoZSByZXN0IG9mIHRoZSBvYmplY3QsIHNvIGEgYnVtcGVkIHZlcnNpb24gdGhlcmUgaXMgYSBjaGFuZ2UgaGVyZS5cbiAqL1xuY29uc3QgTUFSS0VSX1ZFUlNJT04gPSAxO1xuXG4vKipcbiAqIGBPRElHT1NfSUFDYCDigJQgdGhlIG1hcmtlciByZWNvcmRpbmcgdGhhdCB0aGlzIGZ1bmN0aW9uIHdhcyBpbnN0cnVtZW50ZWQgYnkgT2RpZ29zIElhQyB0b29saW5nLCBieSB3aGljaFxuICogcGFja2FnZSB2ZXJzaW9uLCBhbmQgY2Fycnlpbmcgd2hpY2ggbGF5ZXIuIFRoaXMgY29uc3RydWN0IGFsd2F5cyB3cml0ZXMgaXQsIGFuZCBpdCBpcyB3aGF0IG1ha2VzIE9kaWdvc1xuICogcmVwb3J0IHRoZSBmdW5jdGlvbiBhcyBpbnN0cnVtZW50ZWQgcmF0aGVyIHRoYW4gYEFic2VudGAg4oCUIFwiYXdhaXRpbmcgeW91ciBkZXBsb3ltZW50XCIuXG4gKlxuICogSXQgaXMgTk9UIGBPRElHT1NfTUFOQUdFRGAsIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgd2hvbGUgcmVhc29uIHRoZXJlIGFyZSB0d28gdmFyaWFibGVzLiBUaGF0IG9uZSBpcyB0aGVcbiAqIGNvbm5lY3RvcidzIHJlY29yZCBvZiBhIG11dGF0aW9uIElUIHBlcmZvcm1lZCwgd2hvc2UgcGF5bG9hZCBpcyB0aGUgc25hcHNob3QgaXQgcmVzdG9yZXMgZnJvbSBvbiByb2xsYmFjaztcbiAqIGEgQ0RLIHN0YWNrIGhhcyBubyBzdWNoIHNuYXBzaG90IHRvIG9mZmVyLCBiZWNhdXNlIG5vdGhpbmcgd2FzIG11dGF0ZWQg4oCUIHRoZSBlbnZpcm9ubWVudCBiZWxvdyBJUyB0aGVcbiAqIGZ1bmN0aW9uJ3MgZGVmaW5pdGlvbi4gU28gdGhlIGNvbm5lY3RvciBhY2NlcHRzIGVpdGhlciBtYXJrZXIgZm9yIFwiaXMgdGhpcyBpbnN0cnVtZW50ZWQgYnkgT2RpZ29zXCIsIGFuZFxuICogb25seSBpdHMgb3duIGZvciBcIm1heSBJIHJvbGwgdGhpcyBiYWNrXCIuIFRoaXMgY29uc3RydWN0IHdyaXRlcyB0aGUgZmlyc3QgYW5kIG5ldmVyIHRoZSBzZWNvbmQ6IHRoZSBwYWNrYWdlXG4gKiB3aWxsIG5vdCBjbGFpbSBvd25lcnNoaXAgb2YgYSBmdW5jdGlvbiBvbiB5b3VyIGJlaGFsZi5cbiAqXG4gKiBUaGUgYGxheWVyYCBmaWVsZCBpcyB0aGUgbG9hZC1iZWFyaW5nIG9uZS4gVGhlIGNvbm5lY3RvciByZWFkcyBpdCBiYWNrIHRvIGRlY2lkZSB3aGljaCBsYXllciB2ZXJzaW9uIHRoZVxuICogZnVuY3Rpb24gaXMgU1VQUE9TRUQgdG8gY2FycnksIHNvIGEgdmVyc2lvbiB5b3UgcGlubmVkIGlzIHJlc3BlY3RlZCBpbnN0ZWFkIG9mIGJlaW5nIHJlcG9ydGVkIGFzIGRyaWZ0IHRoZVxuICogZGF5IE9kaWdvcyBwdWJsaXNoZXMgYSBuZXdlciBvbmUuIEl0IHdvcmtzIGluIGBJTl9BQ0NPVU5UYCBtb2RlIHRvbywgd2hlcmUgdGhlIEFSTiBpcyBhIGRlcGxveS10aW1lXG4gKiByZWZlcmVuY2UgeW91ciBvd24gY29kZSBoYXMgbm8gd2F5IHRvIG9idGFpbi5cbiAqL1xuY29uc3QgRU5WX0lBQ19NQVJLRVIgPSAnT0RJR09TX0lBQyc7XG5cbi8qKlxuICogVGhlIHNlcnZpY2UgYSBmdW5jdGlvbiByZXBvcnRzIGFzLCB3aGVuIHRoZSBjYWxsZXIgaGFzIG5vdCBuYW1lZCBvbmUuXG4gKlxuICogUkVBRCBGUk9NIFRIRSBMMSwgTk9UIEZST00gYGZuLmZ1bmN0aW9uTmFtZWAuIFRoZSBMMiBwcm9wZXJ0eSBpcyBhIGNyb3NzLWVudmlyb25tZW50LWF3YXJlIHRva2VuIHRoYXRcbiAqIHJlc29sdmVzIHRvIGEgYFJlZmAgdG8gdGhlIGZ1bmN0aW9uIGl0c2VsZiBldmVuIHdoZW4gdGhlIHN0YWNrIHNldCBgZnVuY3Rpb25OYW1lYCBleHBsaWNpdGx5IOKAlCBzbyB0aGVcbiAqIG9idmlvdXMgYFN0YWNrLm9mKGZuKS5yZXNvbHZlKGZuLmZ1bmN0aW9uTmFtZSlgIG5ldmVyIHlpZWxkcyBhIGxpdGVyYWwsIGFuZCBldmVyeSBmdW5jdGlvbiBzaWxlbnRseSBmZWxsXG4gKiBiYWNrIHRvIGl0cyBjb25zdHJ1Y3QgaWQuIGBDZm5GdW5jdGlvbi5mdW5jdGlvbk5hbWVgIGlzIHRoZSByYXcgdGVtcGxhdGUgdmFsdWU6IHRoZSBsaXRlcmFsIHRoZSBzdGFja1xuICogcGFzc2VkLCBvciB1bmRlZmluZWQgd2hlbiBDbG91ZEZvcm1hdGlvbiBnZW5lcmF0ZXMgdGhlIG5hbWUuXG4gKlxuICogV2h5IHRoZSBmYWxsYmFjayBpcyB0aGUgY29uc3RydWN0IGlkIHJhdGhlciB0aGFuIHRoZSBnZW5lcmF0ZWQgbmFtZTogYSBnZW5lcmF0ZWQgbmFtZSBpcyBhIGBSZWZgIHRvIHRoZVxuICogZnVuY3Rpb24sIGFuZCBwdXR0aW5nIHRoYXQgaW4gdGhlIGZ1bmN0aW9uJ3Mgb3duIGVudmlyb25tZW50IG1ha2VzIHRoZSByZXNvdXJjZSBkZXBlbmQgb24gaXRzIG93blxuICogY3JlYXRpb24g4oCUIENsb3VkRm9ybWF0aW9uIHJlamVjdHMgdGhlIHRlbXBsYXRlIHdpdGggYSBkZXBlbmRlbmN5IGN5Y2xlLCBhdCBkZXBsb3kgdGltZS5cbiAqXG4gKiBUaGlzIG1hdHRlcnMgYmV5b25kIGNvc21ldGljcy4gVGhlIGNvbm5lY3RvciBjb21wYXJlcyBgT1RFTF9TRVJWSUNFX05BTUVgIGFnYWluc3QgdGhlIHdvcmtsb2FkJ3MgbmFtZSBpblxuICogT2RpZ29zLCB3aGljaCBpcyB0aGUgcmVhbCBBV1MgZnVuY3Rpb24gbmFtZSwgc28gYSBmdW5jdGlvbiByZXBvcnRpbmcgaXRzIGNvbnN0cnVjdCBpZCBpcyByZXBvcnRlZCBhc1xuICogZHJpZnRlZCBvbiB0aGUgc2VydmljZS1uYW1lIGNvbXBvbmVudC4gTmFtaW5nIHRoZSBmdW5jdGlvbiBpbiB5b3VyIHN0YWNrIGlzIG5vdyBlbm91Z2ggdG8gbGluZSB0aGUgdHdvXG4gKiB1cDsgYSBmdW5jdGlvbiB3aG9zZSBuYW1lIENsb3VkRm9ybWF0aW9uIGdlbmVyYXRlcyBzdGlsbCBuZWVkcyBgc2VydmljZU5hbWVgIHBhc3NlZCBleHBsaWNpdGx5LlxuICovXG5mdW5jdGlvbiBkZWZhdWx0U2VydmljZU5hbWUoZm46IGxhbWJkYS5GdW5jdGlvbik6IHN0cmluZyB7XG4gIGNvbnN0IGNmbiA9IGZuLm5vZGUuZGVmYXVsdENoaWxkIGFzIGxhbWJkYS5DZm5GdW5jdGlvbiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzb2x2ZWQgPSBjZm4gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFN0YWNrLm9mKGZuKS5yZXNvbHZlKGNmbi5mdW5jdGlvbk5hbWUpO1xuICBpZiAodHlwZW9mIHJlc29sdmVkID09PSAnc3RyaW5nJyAmJiByZXNvbHZlZCAhPT0gJycgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChyZXNvbHZlZCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gIH1cbiAgcmV0dXJuIGZuLm5vZGUuaWQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBzaGFyZWQgYnkgdGhlIGNvbnN0cnVjdCBhbmQgdGhlIGFzcGVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NJbnN0cnVtZW50YXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBpbi1MYW1iZGEgY29sbGVjdG9yIGV4cG9ydHMgdG8uXG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbjogT2RpZ29zRGVzdGluYXRpb247XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBPZGlnb3MgbGF5ZXIgY29tZXMgZnJvbS5cbiAgICpcbiAgICogQGRlZmF1bHQgT2RpZ29zTGF5ZXJTb3VyY2UuT0RJR09TX1BVQkxJQ1xuICAgKi9cbiAgcmVhZG9ubHkgbGF5ZXJTb3VyY2U/OiBPZGlnb3NMYXllclNvdXJjZTtcblxuICAvKipcbiAgICogSGFuZGxlciBtb2RlIG9yIHdlYi1zZXJ2ZXIgKExhbWJkYSBXZWIgQWRhcHRlcikgbW9kZS5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gYXV0by1kZXRlY3Rpb24sIGFuZCB0aGF0IGlzIGRlbGliZXJhdGUgcmF0aGVyIHRoYW4gYW4gb21pc3Npb246IGRldGVjdGluZyB0aGUgd2ViIGFkYXB0ZXJcbiAgICogbWVhbnMgaW5zcGVjdGluZyB0aGUgZnVuY3Rpb24ncyBvdGhlciBsYXllcnMsIHdoaWNoIGF0IHN5bnRoIHRpbWUgYXJlIGZyZXF1ZW50bHkgdW5yZXNvbHZlZCB0b2tlbnMuXG4gICAqIEEgZGV0ZWN0b3IgdGhhdCBpcyByaWdodCBtb3N0IG9mIHRoZSB0aW1lIHdvdWxkIHNpbGVudGx5IGJyZWFrIHRoZSBmdW5jdGlvbnMgaXQgZ290IHdyb25nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLkhBTkRMRVJcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlO1xuXG4gIC8qKlxuICAgKiBXaGljaCBvZiB0aGUgSmF2YSBsYXllcidzIGZvdXIgd3JhcHBlciBzY3JpcHRzIHRvIHVzZS4gSWdub3JlZCBmb3Igb3RoZXIgbGFuZ3VhZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBPZGlnb3NKYXZhSGFuZGxlckRpc3Ryby5PVEVMX0hBTkRMRVJcbiAgICovXG4gIHJlYWRvbmx5IGphdmFIYW5kbGVyRGlzdHJvPzogT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm87XG5cbiAgLyoqXG4gICAqIGBPVEVMX1NFUlZJQ0VfTkFNRWAgZm9yIGV2ZXJ5IGZ1bmN0aW9uIHRoaXMgaW5zdHJ1bWVudHMuXG4gICAqXG4gICAqIFVzdWFsbHkgd3JvbmcgdG8gc2V0IHdoZW4gaW5zdHJ1bWVudGluZyBtb3JlIHRoYW4gb25lIGZ1bmN0aW9uIOKAlCB0aGV5IHdvdWxkIGFsbCByZXBvcnQgYXMgdGhlIHNhbWVcbiAgICogc2VydmljZS5cbiAgICpcbiAgICogTGVmdCB1bnNldCwgYSBmdW5jdGlvbiByZXBvcnRzIGFzIGl0cyBleHBsaWNpdGx5LXNldCBwaHlzaWNhbCBuYW1lIGlmIGl0IGhhcyBvbmUsIGFuZCBvdGhlcndpc2UgYXNcbiAgICogaXRzIGNvbnN0cnVjdCBpZC4gSXQgZGVsaWJlcmF0ZWx5IGRvZXMgbm90IGRlZmF1bHQgdG8gdGhlIGdlbmVyYXRlZCBwaHlzaWNhbCBuYW1lOiB0aGF0IHZhbHVlIGlzIGFcbiAgICogYFJlZmAgdG8gdGhlIGZ1bmN0aW9uIGl0c2VsZiwgYW5kIGEgZnVuY3Rpb24gcmVmZXJlbmNpbmcgaXRzZWxmIGluIGl0cyBvd24gZW52aXJvbm1lbnQgaXMgYVxuICAgKiBDbG91ZEZvcm1hdGlvbiBkZXBlbmRlbmN5IGN5Y2xlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBmdW5jdGlvbidzIHBoeXNpY2FsIG5hbWUgaWYgZXhwbGljaXRseSBzZXQsIG90aGVyd2lzZSBpdHMgY29uc3RydWN0IGlkXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUmFpc2UgaW4tZnVuY3Rpb24gT3BlblRlbGVtZXRyeSB2ZXJib3NpdHkgKGBPVEVMX0xPR19MRVZFTD1kZWJ1Z2ApLlxuICAgKlxuICAgKiBUaGUgbGF5ZXIsIFNESyBhbmQgY29sbGVjdG9yIHRoZW4gZW1pdCBzcGFuIGFuZCBPVExQLWV4cG9ydCBkaWFnbm9zdGljcyBpbnRvIHRoZSBmdW5jdGlvbidzIENsb3VkV2F0Y2hcbiAgICogbG9nIGdyb3VwLiBVc2VmdWwgd2hpbGUgd2lyaW5nIHVwIGEgZGVzdGluYXRpb24sIGV4cGVuc2l2ZSB0byBsZWF2ZSBvbi5cbiAgICpcbiAgICogSGFzIG5vIGVmZmVjdCBpbiB3ZWItc2VydmVyIG1vZGUsIG1hdGNoaW5nIHRoZSBjb25uZWN0b3IsIHdoaWNoIG5ldmVyIHNldHMgYSBsb2cgbGV2ZWwgdGhlcmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkZWJ1Zz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEF0dGFjaCB0aGlzIGxheWVyIGluc3RlYWQgb2YgcmVzb2x2aW5nIG9uZS4gT3ZlcnJpZGVzIGBsYXllclNvdXJjZWAgZW50aXJlbHkuXG4gICAqXG4gICAqIFRoZSBlc2NhcGUgaGF0Y2ggZm9yIGEgbGF5ZXIgbWlycm9yZWQgaW50byBhIHByaXZhdGUgcmVnaXN0cnkgb3IgYW4gaW50ZXJuYWwgYWNjb3VudC4gVGhlIGxheWVyIG11c3RcbiAgICogaGF2ZSB0aGUgc2FtZSBjb250ZW50cyBhcyB0aGUgT2RpZ29zIG9uZSDigJQgdGhlIGVudmlyb25tZW50IHNldCBoZXJlIGFzc3VtZXMgaXRzIGV4YWN0IHNjcmlwdCBsYXlvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcmVzb2x2ZWQgZnJvbSBsYXllclNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgbGF5ZXJWZXJzaW9uPzogbGFtYmRhLklMYXllclZlcnNpb247XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0aGUgZnVuY3Rpb24gYWxyZWFkeSBuZWVkcyBpbiBpdHMgbGFuZ3VhZ2UgbG9hZGVyIHZhcmlhYmxlIChgTk9ERV9PUFRJT05TYCxcbiAgICogYEpBVkFfVE9PTF9PUFRJT05TYCBvciBgUFlUSE9OUEFUSGApLCB3aGljaCB0aGUgT2RpZ29zIGxvYWRlciBpcyBqb2luZWQgdG8gcmF0aGVyIHRoYW4gcmVwbGFjaW5nLlxuICAgKlxuICAgKiBPbmx5IHVzZWQgaW4gd2ViLXNlcnZlciBtb2RlLiBJdCBoYXMgdG8gYmUgcGFzc2VkIGV4cGxpY2l0bHkgYmVjYXVzZSBDREsncyBgbGFtYmRhLkZ1bmN0aW9uYCBleHBvc2VzXG4gICAqIG5vIHdheSB0byByZWFkIGJhY2sgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0IGVsc2V3aGVyZSBpbiB0aGUgYXBwIOKAlCBhbiBvbWl0dGVkIHZhbHVlIGhlcmUgaXNcbiAgICogc2lsZW50bHkgb3ZlcndyaXR0ZW4sIHdoaWNoIGZvciBgTk9ERV9PUFRJT05TYCBjYW4gbWVhbiBsb3NpbmcgYSBmbGFnIHRoZSBhcHAgbmVlZHMgdG8gYm9vdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgbG9hZGVyIHZhcmlhYmxlIGlzIHNldCB0byB0aGUgT2RpZ29zIHZhbHVlIGFsb25lXG4gICAqL1xuICByZWFkb25seSBleGlzdGluZ0xvYWRlclZhbHVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTa2lwIGZ1bmN0aW9ucyB3aG9zZSBydW50aW1lIGhhcyBubyBPcGVuVGVsZW1ldHJ5IExhbWJkYSBsYXllciBpbnN0ZWFkIG9mIHRocm93aW5nLlxuICAgKlxuICAgKiBgZG90bmV0KmAgYW5kIGBwcm92aWRlZC4qYCAoR28sIGN1c3RvbSBydW50aW1lcykgaGF2ZSBubyBsYW5ndWFnZSBsYXllciB1cHN0cmVhbS4gRXhwbGljaXRseVxuICAgKiBpbnN0cnVtZW50aW5nIG9uZSBpcyBhIG1pc3Rha2Ugd29ydGggZmFpbGluZyBvbjsgc3dlZXBpbmcgYSB3aG9sZSBzdGFjayB3aXRoIHRoZSBhc3BlY3QgYW5kIGhpdHRpbmdcbiAgICogb25lIGlzIG5vdCwgd2hpY2ggaXMgd2h5IHRoZSBhc3BlY3QgZGVmYXVsdHMgdGhpcyB0byBgdHJ1ZWAgYW5kIHRoZSBjb25zdHJ1Y3QgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm9wcyBmb3Ige0BsaW5rIE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uUHJvcHMgZXh0ZW5kcyBPZGlnb3NJbnN0cnVtZW50YXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEZ1bmN0aW9ucyB0byBpbnN0cnVtZW50IG9uIGNvbnN0cnVjdGlvbi4gTW9yZSBjYW4gYmUgYWRkZWQgd2l0aCBgaW5zdHJ1bWVudCgpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbnM/OiBsYW1iZGEuRnVuY3Rpb25bXTtcbn1cblxuLyoqXG4gKiBJbnN0cnVtZW50cyBBV1MgTGFtYmRhIGZ1bmN0aW9ucyB3aXRoIHRoZSBPZGlnb3MgT3BlblRlbGVtZXRyeSBsYXllci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3Qgb2RpZ29zID0gbmV3IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbih0aGlzLCAnT2RpZ29zJywge1xuICogICBkZXN0aW5hdGlvbjogeyBlbmRwb2ludDogJ290bHAuZXhhbXBsZS5jb206NDMxNycgfSxcbiAqICAgZnVuY3Rpb25zOiBbYXBpRm4sIHdvcmtlckZuXSxcbiAqIH0pO1xuICogb2RpZ29zLmluc3RydW1lbnQoYW5vdGhlckZuKTtcbiAqIGBgYFxuICpcbiAqIFdoYXQgaXQgZG9lcyB0byBlYWNoIGZ1bmN0aW9uOiBhdHRhY2hlcyB0aGUgbGF5ZXIgZm9yIHRoZSBmdW5jdGlvbidzIGxhbmd1YWdlIGFuZCBhcmNoaXRlY3R1cmUsIHNldHNcbiAqIGBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUmAgc28gdGhlIGxheWVyIGxvYWRzIHRoZSBTREssIHNldHMgYE9URUxfU0VSVklDRV9OQU1FYCwgYW5kIGhhbmRzIHRoZSBpbi1MYW1iZGFcbiAqIGNvbGxlY3RvciBpdHMgZW50aXJlIGNvbmZpZ3VyYXRpb24gaW5saW5lIHRocm91Z2ggYE9QRU5URUxFTUVUUllfQ09MTEVDVE9SX0NPTkZJR19VUklgLlxuICpcbiAqIFRoZSBmdW5jdGlvbidzIFNESyBleHBvcnRzIHRvIHRoZSBjb2xsZWN0b3Igb24gbG9jYWxob3N0LCBub3QgdG8geW91ciBkZXN0aW5hdGlvbi4gVGhlIGNvbGxlY3RvclxuICogZm9yd2FyZHMgYWZ0ZXIgdGhlIGhhbmRsZXIgaGFzIGFscmVhZHkgcmV0dXJuZWQsIHNvIGEgc2xvdyBkZXN0aW5hdGlvbiBjb3N0cyBiaWxsZWQgZHVyYXRpb24gcmF0aGVyXG4gKiB0aGFuIGNhbGxlciBsYXRlbmN5LlxuICpcbiAqICMjIERvIG5vdCBhbHNvIGluc3RydW1lbnQgdGhlc2UgZnVuY3Rpb25zIHdpdGggdGhlIGNvbm5lY3RvclxuICpcbiAqIFRoZSBPZGlnb3MgQVdTIGNvbm5lY3RvciBpbnN0cnVtZW50cyBsaXZlIGZ1bmN0aW9ucyBieSBtdXRhdGluZyB0aGVtLCBhbmQgcmVjb25jaWxlcyB0aGVtIGJhY2sgdG8gaXRzXG4gKiBvd24gZGVzaXJlZCBzdGF0ZSBvbiBldmVyeSBwYXNzLiBBIGZ1bmN0aW9uIGluc3RydW1lbnRlZCBoZXJlIGFuZCBhbHNvIGVuYWJsZWQgYXMgYSBjb25uZWN0b3Igc291cmNlXG4gKiBlbmRzIHVwIG93bmVkIGJ5IGJvdGg6IGVhY2ggYGNkayBkZXBsb3lgIHJlYXNzZXJ0cyB0aGUgQ0RLJ3MgZW52aXJvbm1lbnQsIGVhY2ggcmVjb25jaWxlIHJlYXNzZXJ0cyB0aGVcbiAqIGNvbm5lY3RvcidzLCBhbmQgZXZlcnkgcm91bmQgdHJpcCBwdWJsaXNoZXMgYSBuZXcgZnVuY3Rpb24gdmVyc2lvbi5cbiAqXG4gKiBDaG9vc2Ugb25lIHBlciBmdW5jdGlvbi4gVGhpcyBjb25zdHJ1Y3Qgd3JpdGVzIGBPRElHT1NfSUFDYCBhbmQgbmV2ZXIgdGhlIGNvbm5lY3RvcidzIGBPRElHT1NfTUFOQUdFRGBcbiAqIG93bmVyc2hpcCBtYXJrZXIsIHNvIGFuIElhQy1pbnN0cnVtZW50ZWQgZnVuY3Rpb24gcmVwb3J0cyBhcyBpbnN0cnVtZW50ZWQgYnV0IGlzIG5vdCBvbmUgdGhlIGNvbm5lY3RvclxuICogd2lsbCByb2xsIGJhY2sg4oCUIHRob3VnaCBpdCB3aWxsIGhhcHBpbHkgdGFrZSBpdCBvdmVyIGlmIHlvdSBlbmFibGUgaXQgYXMgYSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZXI6IE9kaWdvc0xheWVyUmVzb2x2ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29sbGVjdG9yQ29uZmlnOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdHJ1bWVudGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IHByb3BzO1xuICAgIHRoaXMucmVzb2x2ZXIgPSBuZXcgT2RpZ29zTGF5ZXJSZXNvbHZlcih0aGlzLCBwcm9wcy5sYXllclNvdXJjZSA/PyBPZGlnb3NMYXllclNvdXJjZS5PRElHT1NfUFVCTElDKTtcblxuICAgIC8vIFJlbmRlcmVkIG9uY2UuIEl0IGRlcGVuZHMgb25seSBvbiB0aGUgZGVzdGluYXRpb24sIGFuZCByZW5kZXJpbmcgaXQgcGVyIGZ1bmN0aW9uIHdvdWxkIG1ha2UgYW5cbiAgICAvLyBhY2NpZGVudGFsIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZnVuY3Rpb25zIHBvc3NpYmxlLlxuICAgIHRoaXMuY29sbGVjdG9yQ29uZmlnID0gcmVuZGVyQ29sbGVjdG9yQ29uZmlnKHByb3BzLmRlc3RpbmF0aW9uKTtcblxuICAgIC8vIEEgd2FybmluZyByYXRoZXIgdGhhbiBhbiBlcnJvciwgYmVjYXVzZSBhIGNvbGxlY3RvciBDQU4gYmUgcmVhY2hlZCBvdmVyIGdSUEMgb24gYSBub24tc3RhbmRhcmQgcG9ydCDigJRcbiAgICAvLyBidXQgdGhlIG92ZXJ3aGVsbWluZ2x5IGxpa2VsaWVyIHJlYWRpbmcgb2YgYGVuZHBvaW50OiBcImhvc3Q6NDMxOFwiYCBpcyBhbiBPVExQL0hUVFAgZW5kcG9pbnQgcGFzc2VkIHRvXG4gICAgLy8gdGhlIGdSUEMgZXhwb3J0ZXIsIHdoaWNoIGJ1aWxkcywgc3RhcnRzLCBhbmQgdGhlbiBuZXZlciBkZWxpdmVycyBhIGJhdGNoLiBTaWxlbnQgZm9yIHRoZSBjYWxsZXIgd2hvXG4gICAgLy8gbWVhbnQgaXQ7IGxvdWQgZm9yIHRoZSBvbmUgd2hvIGRpZCBub3QuXG4gICAgaWYgKHByb3BzLmRlc3RpbmF0aW9uLmVuZHBvaW50Py5lbmRzV2l0aCgnOjQzMTgnKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQG9kaWdvcy9hd3MtY2RrOnByb2JhYmxlSHR0cEVuZHBvaW50JyxcbiAgICAgICAgYE9kaWdvczogZGVzdGluYXRpb24gZW5kcG9pbnQgXCIke3Byb3BzLmRlc3RpbmF0aW9uLmVuZHBvaW50fVwiIGlzIG9uIDQzMTgsIHRoZSBPVExQL0hUVFAgcG9ydCwgYnV0IGAgK1xuICAgICAgICAgICdgZW5kcG9pbnRgIGNvbmZpZ3VyZXMgdGhlIGdSUEMgZXhwb3J0ZXIgKGNvbnZlbnRpb25hbGx5IDQzMTcpLiBJZiB0aGF0IGlzIGFuIE9UTFAvSFRUUCBjb2xsZWN0b3IsICcgK1xuICAgICAgICAgICdwYXNzIGl0IGFzIGBodHRwRW5kcG9pbnQ6IFwiaHR0cDovL2hvc3Q6NDMxOFwiYCBpbnN0ZWFkIOKAlCB0aGUgZ1JQQyBleHBvcnRlciB3aWxsIGV4cG9ydCBub3RoaW5nIHRvIGl0LicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZGVzdGluYXRpb24uaHR0cEVuZHBvaW50Py5lbmRzV2l0aCgnOjQzMTcnKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQG9kaWdvcy9hd3MtY2RrOnByb2JhYmxlR3JwY0VuZHBvaW50JyxcbiAgICAgICAgYE9kaWdvczogZGVzdGluYXRpb24gaHR0cEVuZHBvaW50IFwiJHtwcm9wcy5kZXN0aW5hdGlvbi5odHRwRW5kcG9pbnR9XCIgaXMgb24gNDMxNywgdGhlIE9UTFAvZ1JQQyBwb3J0LCBgICtcbiAgICAgICAgICAnYnV0IGBodHRwRW5kcG9pbnRgIGNvbmZpZ3VyZXMgdGhlIEhUVFAgZXhwb3J0ZXIgKGNvbnZlbnRpb25hbGx5IDQzMTgpLiBJZiB0aGF0IGlzIGEgZ1JQQyBjb2xsZWN0b3IsICcgK1xuICAgICAgICAgICdwYXNzIGl0IGFzIGBlbmRwb2ludDogXCJob3N0OjQzMTdcImAgaW5zdGVhZC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZuIG9mIHByb3BzLmZ1bmN0aW9ucyA/PyBbXSkge1xuICAgICAgdGhpcy5pbnN0cnVtZW50KGZuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zdHJ1bWVudHMgb25lIGZ1bmN0aW9uLiBJZGVtcG90ZW50IOKAlCBpbnN0cnVtZW50aW5nIHRoZSBzYW1lIGZ1bmN0aW9uIHR3aWNlIGlzIGEgbm8tb3AgcmF0aGVyIHRoYW4gYVxuICAgKiBkb3VibGVkIGxvYWRlciB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBpbnN0cnVtZW50KGZuOiBsYW1iZGEuRnVuY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBmbi5ub2RlLnBhdGg7XG4gICAgaWYgKHRoaXMuaW5zdHJ1bWVudGVkLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcnVudGltZU5hbWUgPSBmbi5ydW50aW1lLm5hbWU7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5ndWFnZUZyb21SdW50aW1lKHJ1bnRpbWVOYW1lKTtcbiAgICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgYE9kaWdvczogcnVudGltZSBcIiR7cnVudGltZU5hbWV9XCIgaGFzIG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGAgK1xuICAgICAgICAnKHVwc3RyZWFtIHB1Ymxpc2hlcyBsYXllcnMgZm9yIHB5dGhvbiwgbm9kZWpzLCBqYXZhIGFuZCBydWJ5IG9ubHkpLCBzbyB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBpbnN0cnVtZW50ZWQuJztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2tpcFVuc3VwcG9ydGVkUnVudGltZXMpIHtcbiAgICAgICAgQW5ub3RhdGlvbnMub2YoZm4pLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOnVuc3VwcG9ydGVkUnVudGltZScsIGAke21lc3NhZ2V9IFNraXBwaW5nLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bWVzc2FnZX0gU2V0IHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzOiB0cnVlIHRvIHNraXAgaXQgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICB0aGlzLmluc3RydW1lbnRlZC5hZGQoa2V5KTtcblxuICAgIGNvbnN0IGFyY2hpdGVjdHVyZSA9IGZuLmFyY2hpdGVjdHVyZS5uYW1lO1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5vcHRpb25zLmxheWVyVmVyc2lvbiA/PyB0aGlzLnJlc29sdmVyLnJlc29sdmUobGFuZ3VhZ2UsIGFyY2hpdGVjdHVyZSk7XG4gICAgZm4uYWRkTGF5ZXJzKGxheWVyKTtcblxuICAgIC8vIFRoZSBBUk4sIG5vdCB0aGUgY29uc3RydWN0OiB0aGUgbWFya2VyIGhhcyB0byBuYW1lIHRoZSBleGFjdCBsYXllciB2ZXJzaW9uIHRoZSBmdW5jdGlvbiBjYXJyaWVzLCBhbmRcbiAgICAvLyBpbiBJTl9BQ0NPVU5UIG1vZGUgdGhhdCBpcyBhIG5lc3RlZC1zdGFjayBvdXRwdXQgcmVmZXJlbmNlIHJlc29sdmVkIGF0IGRlcGxveSB0aW1lLlxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudmlyb25tZW50Rm9yKGZuLCBsYW5ndWFnZSwgbGF5ZXIubGF5ZXJWZXJzaW9uQXJuKSkpIHtcbiAgICAgIGZuLmFkZEVudmlyb25tZW50KG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogSW5zdHJ1bWVudHMgZXZlcnkgZnVuY3Rpb24gaW4gdGhlIGxpc3QuICovXG4gIHB1YmxpYyBpbnN0cnVtZW50QWxsKGZ1bmN0aW9uczogbGFtYmRhLkZ1bmN0aW9uW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGZuIG9mIGZ1bmN0aW9ucykge1xuICAgICAgdGhpcy5pbnN0cnVtZW50KGZuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50IGFwcGxpZWQgdG8gb25lIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBNaXJyb3JzIGBhcHBseUhhbmRsZXJFbnZgIC8gYGFwcGx5V2ViU2VydmVyRW52YCBpbiB0aGUgY29ubmVjdG9yLCBpbmNsdWRpbmcgd2hhdCBpcyBkZWxpYmVyYXRlbHkgTk9UXG4gICAqIHNldDogYE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVGAgc3RheXMgdW5zZXQgc28gdGhlIFNESyBrZWVwcyBleHBvcnRpbmcgdG8gdGhlIGluLUxhbWJkYSBjb2xsZWN0b3JcbiAgICogb24gbG9jYWxob3N0IHJhdGhlciB0aGFuIGJsb2NraW5nIHRoZSBpbnZvY2F0aW9uIG9uIHRoZSByZW1vdGUgZGVzdGluYXRpb24sIGFuZCBhbiBlbmFibGVkIHNpZ25hbCdzXG4gICAqIGBPVEVMXypfRVhQT1JURVJgIHN0YXlzIHVuc2V0IGJlY2F1c2UgYG90bHBgIGlzIGFscmVhZHkgdGhlIFNESyBkZWZhdWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBlbnZpcm9ubWVudEZvcihmbjogbGFtYmRhLkZ1bmN0aW9uLCBsYW5ndWFnZTogc3RyaW5nLCBsYXllckFybjogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgeyBkZXN0aW5hdGlvbiwgbW9kZSwgZGVidWcsIHNlcnZpY2VOYW1lLCBqYXZhSGFuZGxlckRpc3RybywgZXhpc3RpbmdMb2FkZXJWYWx1ZSB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHdlYlNlcnZlciA9IG1vZGUgPT09IE9kaWdvc0luc3RydW1lbnRhdGlvbk1vZGUuV0VCX1NFUlZFUjtcblxuICAgIGNvbnN0IGVudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgIFtFTlZfU0VSVklDRV9OQU1FXTogc2VydmljZU5hbWUgPz8gZGVmYXVsdFNlcnZpY2VOYW1lKGZuKSxcbiAgICAgIFtFTlZfQ09MTEVDVE9SX0NPTkZJR19VUkldOiB0aGlzLmNvbGxlY3RvckNvbmZpZyxcbiAgICAgIFtFTlZfSUFDX01BUktFUl06IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdjogTUFSS0VSX1ZFUlNJT04sXG4gICAgICAgIHNvdXJjZTogJ2NkaycsXG4gICAgICAgIHZlcnNpb246IE9ESUdPU19WRVJTSU9OIHx8ICd1bnJlbGVhc2VkJyxcbiAgICAgICAgbGF5ZXI6IGxheWVyQXJuLFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIGlmICh3ZWJTZXJ2ZXIpIHtcbiAgICAgIC8vIE5vIGV4ZWMgd3JhcHBlcjogdGhlIExhbWJkYSBXZWIgQWRhcHRlciBvd25zIGl0LCBhbmQgb3ZlcndyaXRpbmcgaXQgc3RvcHMgdGhlIGZ1bmN0aW9uIHNlcnZpbmcuXG4gICAgICBPYmplY3QuYXNzaWduKGVudiwgd2ViU2VydmVyRW52KGxhbmd1YWdlLCBleGlzdGluZ0xvYWRlclZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudltFTlZfRVhFQ19XUkFQUEVSXSA9IGV4ZWNXcmFwcGVyRm9yKGxhbmd1YWdlLCBqYXZhSGFuZGxlckRpc3Rybyk7XG4gICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgZW52W0VOVl9PVEVMX0xPR19MRVZFTF0gPSAnZGVidWcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN1cHByZXNzIHRoZSBzaWduYWxzIHRoZSBkZXN0aW5hdGlvbiBkb2VzIG5vdCBhY2NlcHQuIEEgc2lnbmFsIHdpdGggbm8gY29sbGVjdG9yIHBpcGVsaW5lIGlzIHJlZnVzZWRcbiAgICAvLyBhdCB0aGUgcmVjZWl2ZXIgb24gZXZlcnkgYmF0Y2gsIHNvIHRlbGxpbmcgdGhlIFNESyBub3QgdG8gcHJvZHVjZSBpdCBpcyB0aGUgaGFsZiB0aGF0IHN0b3BzIHRoZVxuICAgIC8vIGVycm9yIGxvb3A7IHRoZSBwaXBlbGluZSBiZWluZyBhYnNlbnQgaXMgdGhlIGhhbGYgdGhhdCBzdG9wcyB0aGUgZXhwb3J0LlxuICAgIGNvbnN0IGVuYWJsZWQgPSByZXNvbHZlZFNpZ25hbHMoZGVzdGluYXRpb24pO1xuICAgIGNvbnN0IG92ZXJyaWRlczogQXJyYXk8W3N0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkXT4gPSBbXG4gICAgICBbRU5WX1RSQUNFU19FWFBPUlRFUiwgZXhwb3J0ZXJPdmVycmlkZUZvcihlbmFibGVkLnRyYWNlcyldLFxuICAgICAgW0VOVl9NRVRSSUNTX0VYUE9SVEVSLCBleHBvcnRlck92ZXJyaWRlRm9yKGVuYWJsZWQubWV0cmljcyldLFxuICAgICAgW0VOVl9MT0dTX0VYUE9SVEVSLCBleHBvcnRlck92ZXJyaWRlRm9yKGVuYWJsZWQubG9ncyldLFxuICAgIF07XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIG92ZXJyaWRlcykge1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW52W25hbWVdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudjtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BzIGZvciB7QGxpbmsgT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3RQcm9wcyBleHRlbmRzIE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnMge31cblxuLyoqXG4gKiBBcHBsaWVzIE9kaWdvcyBpbnN0cnVtZW50YXRpb24gdG8gZXZlcnkgYGxhbWJkYS5GdW5jdGlvbmAgaW4gYSBzY29wZS5cbiAqXG4gKiBgYGB0c1xuICogQXNwZWN0cy5vZihzdGFjaykuYWRkKG5ldyBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3Qoc3RhY2ssIHtcbiAqICAgZGVzdGluYXRpb246IHsgZW5kcG9pbnQ6ICdvdGxwLmV4YW1wbGUuY29tOjQzMTcnIH0sXG4gKiB9KSk7XG4gKiBgYGBcbiAqXG4gKiBgc2tpcFVuc3VwcG9ydGVkUnVudGltZXNgIGRlZmF1bHRzIHRvIGB0cnVlYCBoZXJlLCB1bmxpa2UgdGhlIGNvbnN0cnVjdDogYW4gYXNwZWN0IHZpc2l0cyBldmVyeSBmdW5jdGlvblxuICogaW4gdGhlIHNjb3BlLCBpbmNsdWRpbmcgb25lcyB3aG9zZSBydW50aW1lIGhhcyBubyBPcGVuVGVsZW1ldHJ5IGxheWVyLCBhbmQgZmFpbGluZyB0aGUgd2hvbGUgc3ludGhcbiAqIGJlY2F1c2UgYSBzdGFjayBoYXBwZW5zIHRvIGNvbnRhaW4gb25lIEdvIGZ1bmN0aW9uIGlzIG5vdCB1c2VmdWwuIEVhY2ggc2tpcCBpcyByZXBvcnRlZCBhcyBhIHN5bnRoXG4gKiB3YXJuaW5nLCBzbyBpdCBpcyB2aXNpYmxlIHJhdGhlciB0aGFuIHNpbGVudC5cbiAqXG4gKiBUaGUgYXNwZWN0IGluc3RydW1lbnRzIHdoYXQgZXhpc3RzIGluIHRoZSB0cmVlIHdoZW4gaXQgcnVucy4gQSBmdW5jdGlvbiBhZGRlZCBieSBhIGxhdGVyIGFzcGVjdCBpcyBub3RcbiAqIHZpc2l0ZWQ7IHVzZSB0aGUgY29uc3RydWN0IGRpcmVjdGx5IGZvciB0aG9zZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdCBpbXBsZW1lbnRzIElBc3BlY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RydW1lbnRhdGlvbjogT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc2NvcGUgd2hlcmUgdGhlIHNoYXJlZCBsYXllciBjb25zdHJ1Y3RzIGFyZSBjcmVhdGVkLiBVc3VhbGx5IHRoZSBzYW1lIHNjb3BlIHRoZSBhc3BlY3QgaXNcbiAgICogYXBwbGllZCB0by4gSXQgaXMgYSBzZXBhcmF0ZSBhcmd1bWVudCBmcm9tIHRoZSB2aXNpdGVkIG5vZGVzIGJlY2F1c2UgdGhlIGxheWVyIChhbmQsIGluIGBJTl9BQ0NPVU5UYFxuICAgKiBtb2RlLCB0aGUgbmVzdGVkIFNBUiBhcHBsaWNhdGlvbikgaXMgY3JlYXRlZCBvbmNlIGFuZCBzaGFyZWQgYnkgZXZlcnkgZnVuY3Rpb24gdGhlIGFzcGVjdCB2aXNpdHMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBwcm9wczogT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0UHJvcHMpIHtcbiAgICB0aGlzLmluc3RydW1lbnRhdGlvbiA9IG5ldyBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb24oc2NvcGUsICdPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3QnLCB7XG4gICAgICBza2lwVW5zdXBwb3J0ZWRSdW50aW1lczogdHJ1ZSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIGxhbWJkYS5GdW5jdGlvbikge1xuICAgICAgdGhpcy5pbnN0cnVtZW50YXRpb24uaW5zdHJ1bWVudChub2RlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
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
|
@@ -10,8 +10,8 @@ export declare function languageFromRuntime(runtimeName: string): string | undef
|
|
|
10
10
|
/**
|
|
11
11
|
* The `AWS_LAMBDA_EXEC_WRAPPER` value for a language.
|
|
12
12
|
*
|
|
13
|
-
* The wrapper script is
|
|
14
|
-
*
|
|
13
|
+
* The wrapper script is language-specific. Java defaults to `/opt/otel-javaagent-handler`;
|
|
14
|
+
* Python uses `/opt/otel-instrument`, and Node.js/Ruby use `/opt/otel-handler`. Setting the wrong one makes the layer bootstrap fail at cold start with
|
|
15
15
|
* `/opt/otel-instrument: does not exist` and the function errors out — which is why this is never a
|
|
16
16
|
* hardcoded constant at a call site.
|
|
17
17
|
*
|
|
@@ -56,3 +56,7 @@ export declare function webServerLoaderKey(language: string): string | undefined
|
|
|
56
56
|
export declare function webServerEnv(language: string, existingLoaderValue?: string): {
|
|
57
57
|
[key: string]: string;
|
|
58
58
|
};
|
|
59
|
+
/** Resolve the same concrete SDK names advertised by the connector's GraphQL catalog. */
|
|
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
|
@@ -6,6 +6,9 @@ exports.layerNameFor = layerNameFor;
|
|
|
6
6
|
exports.addLoaderValue = addLoaderValue;
|
|
7
7
|
exports.webServerLoaderKey = webServerLoaderKey;
|
|
8
8
|
exports.webServerEnv = webServerEnv;
|
|
9
|
+
exports.distributionWrapper = distributionWrapper;
|
|
10
|
+
exports.distributionRecipe = distributionRecipe;
|
|
11
|
+
const distributions_1 = require("./generated/distributions");
|
|
9
12
|
const layers_1 = require("./generated/layers");
|
|
10
13
|
const types_1 = require("./types");
|
|
11
14
|
/**
|
|
@@ -47,8 +50,8 @@ const JAVA_DISTRO_WRAPPERS = {
|
|
|
47
50
|
/**
|
|
48
51
|
* The `AWS_LAMBDA_EXEC_WRAPPER` value for a language.
|
|
49
52
|
*
|
|
50
|
-
* The wrapper script is
|
|
51
|
-
*
|
|
53
|
+
* The wrapper script is language-specific. Java defaults to `/opt/otel-javaagent-handler`;
|
|
54
|
+
* Python uses `/opt/otel-instrument`, and Node.js/Ruby use `/opt/otel-handler`. Setting the wrong one makes the layer bootstrap fail at cold start with
|
|
52
55
|
* `/opt/otel-instrument: does not exist` and the function errors out — which is why this is never a
|
|
53
56
|
* hardcoded constant at a call site.
|
|
54
57
|
*
|
|
@@ -56,7 +59,7 @@ const JAVA_DISTRO_WRAPPERS = {
|
|
|
56
59
|
*/
|
|
57
60
|
function execWrapperFor(language, distro) {
|
|
58
61
|
if (language === 'java') {
|
|
59
|
-
return JAVA_DISTRO_WRAPPERS[distro
|
|
62
|
+
return distro ? JAVA_DISTRO_WRAPPERS[distro] : '/opt/otel-javaagent-handler';
|
|
60
63
|
}
|
|
61
64
|
const spec = layers_1.LANGUAGES[language];
|
|
62
65
|
if (!spec) {
|
|
@@ -128,4 +131,35 @@ function webServerEnv(language, existingLoaderValue) {
|
|
|
128
131
|
}
|
|
129
132
|
return env;
|
|
130
133
|
}
|
|
131
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMEJBLGtEQU9DO0FBb0JELHdDQVNDO0FBR0Qsb0NBTUM7QUFjRCx3Q0FRQztBQVVELGdEQUVDO0FBY0Qsb0NBcUJDO0FBNUlELCtDQUErQztBQUMvQyxtQ0FBNkU7QUFFN0U7Ozs7OztHQU1HO0FBRUgsNEdBQTRHO0FBQzVHLE1BQU0saUJBQWlCLEdBQTRCO0lBQ2pELENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUNwQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUM7SUFDcEIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztDQUNqQixDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsV0FBbUI7SUFDckQsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDbkQsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkMsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLE1BQU0sb0JBQW9CLEdBQThCO0lBQ3RELENBQUMsK0JBQXVCLENBQUMsWUFBWSxDQUFDLEVBQUUsbUJBQW1CO0lBQzNELENBQUMsK0JBQXVCLENBQUMsa0JBQWtCLENBQUMsRUFBRSx5QkFBeUI7SUFDdkUsQ0FBQywrQkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLHVCQUF1QjtJQUNuRSxDQUFDLCtCQUF1QixDQUFDLG1CQUFtQixDQUFDLEVBQUUsMEJBQTBCO0NBQzFFLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQixjQUFjLENBQUMsUUFBZ0IsRUFBRSxNQUFnQztJQUMvRSxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUN4QixPQUFPLG9CQUFvQixDQUFDLE1BQU0sSUFBSSwrQkFBdUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsa0JBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7QUFDMUIsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxTQUFnQixZQUFZLENBQUMsUUFBZ0IsRUFBRSxZQUFvQjtJQUNqRSxNQUFNLElBQUksR0FBRyxrQkFBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUNELE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLFlBQVksRUFBRSxDQUFDO0FBQzdDLENBQUM7QUFPRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixjQUFjLENBQUMsUUFBNEIsRUFBRSxLQUFhLEVBQUUsU0FBaUI7SUFDM0YsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDN0IsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUNELE9BQU8sU0FBUyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsU0FBUyxHQUFHLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxTQUFTLEdBQUcsS0FBSyxFQUFFLENBQUM7QUFDbkcsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxRQUFnQjtJQUNqRCxPQUFPLGtCQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQztBQUNoRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFnQixZQUFZLENBQzFCLFFBQWdCLEVBQ2hCLG1CQUE0QjtJQUU1QixNQUFNLElBQUksR0FBRyxrQkFBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxTQUFTLENBQUM7SUFDL0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLEtBQUssQ0FDYixXQUFXLGlDQUF5QixDQUFDLFVBQVUsOEJBQThCLFFBQVEsS0FBSztZQUN4Rix3R0FBd0csQ0FDM0csQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBOEI7UUFDckMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsY0FBYyxDQUFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQztLQUNyRixDQUFDO0lBQ0YsdUdBQXVHO0lBQ3ZHLDhFQUE4RTtJQUM5RSxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNyRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExBTkdVQUdFUyB9IGZyb20gJy4vZ2VuZXJhdGVkL2xheWVycyc7XG5pbXBvcnQgeyBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLCBPZGlnb3NKYXZhSGFuZGxlckRpc3RybyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFJ1bnRpbWUgLT4gbGFuZ3VhZ2UsIGFuZCBsYW5ndWFnZSAtPiB0aGUgZXhhY3QgZW52IHRoZSBsYXllciBleHBlY3RzLlxuICpcbiAqIE1pcnJvcnMgYExhbmd1YWdlRnJvbVJ1bnRpbWVgLCBgZXhlY1dyYXBwZXJGb3JMYW5ndWFnZWAgYW5kIGB3ZWJTZXJ2ZXJMb2FkZXJgIGluIHRoZSBjb25uZWN0b3Inc1xuICogaW5zdHJ1bWVudG9yLiBUaGUgZGF0YSBsaXZlcyBpbiAuLi8uLi9hcnRpZmFjdHMuanNvbiBhbmQgcmVhY2hlcyBoZXJlIHRocm91Z2ggdGhlIGdlbmVyYXRlZCBtb2R1bGU7IHRoZVxuICogZGVjaXNpb25zIGxpdmUgaGVyZS5cbiAqL1xuXG4vKiogUnVudGltZSBwcmVmaXhlcyB0aGF0IG1hcCB0byBhbiBPVGVsIGxheWVyIGxhbmd1YWdlLiBQcmVmaXgtbWF0Y2hlZCwgc28gYGphdmE4LmFsMmAgcmVzb2x2ZXMgdG8gamF2YS4gKi9cbmNvbnN0IExBTkdVQUdFX1BSRUZJWEVTOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtcbiAgWydweXRob24nLCAncHl0aG9uJ10sXG4gIFsnbm9kZWpzJywgJ25vZGVqcyddLFxuICBbJ2phdmEnLCAnamF2YSddLFxuICBbJ3J1YnknLCAncnVieSddLFxuXTtcblxuLyoqXG4gKiBSZXNvbHZlcyBhIExhbWJkYSBydW50aW1lIGlkZW50aWZpZXIgKGBweXRob24zLjEyYCwgYGphdmEyMWAsIGBub2RlanMyMi54YCkgdG8gdGhlIE9UZWwgbGF5ZXIgbGFuZ3VhZ2UuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgcnVudGltZXMgd2l0aCBubyBPcGVuVGVsZW1ldHJ5IExhbWJkYSBsYW5ndWFnZSBsYXllciDigJQgYGRvdG5ldCpgLCBgcHJvdmlkZWQuKmBcbiAqIChHbyBhbmQgY3VzdG9tIHJ1bnRpbWVzKS4gVGhlIGNhbGxlciByZWZ1c2VzIHRvIGluc3RydW1lbnQgcmF0aGVyIHRoYW4gYXR0YWNoaW5nIGEgbGF5ZXIgdGhhdCBkb2VzXG4gKiBub3RoaW5nLCBiZWNhdXNlIGEgbGF5ZXIgcGx1cyBhbiBleGVjIHdyYXBwZXIgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBpdCBmYWlscyB0aGUgZnVuY3Rpb24gYXQgY29sZCBzdGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhbmd1YWdlRnJvbVJ1bnRpbWUocnVudGltZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgW3ByZWZpeCwgbGFuZ3VhZ2VdIG9mIExBTkdVQUdFX1BSRUZJWEVTKSB7XG4gICAgaWYgKHJ1bnRpbWVOYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgcmV0dXJuIGxhbmd1YWdlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogTWFwcyB0aGUgSmF2YSBkaXN0cm8gZW51bSB0byB0aGUgd3JhcHBlciBzY3JpcHQgcGF0aCB0aGUgbGF5ZXIgc2hpcHMuICovXG5jb25zdCBKQVZBX0RJU1RST19XUkFQUEVSUzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgW09kaWdvc0phdmFIYW5kbGVyRGlzdHJvLk9URUxfSEFORExFUl06ICcvb3B0L290ZWwtaGFuZGxlcicsXG4gIFtPZGlnb3NKYXZhSGFuZGxlckRpc3Ryby5PVEVMX1BST1hZX0hBTkRMRVJdOiAnL29wdC9vdGVsLXByb3h5LWhhbmRsZXInLFxuICBbT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9TUVNfSEFORExFUl06ICcvb3B0L290ZWwtc3FzLWhhbmRsZXInLFxuICBbT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9TVFJFQU1fSEFORExFUl06ICcvb3B0L290ZWwtc3RyZWFtLWhhbmRsZXInLFxufTtcblxuLyoqXG4gKiBUaGUgYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCB2YWx1ZSBmb3IgYSBsYW5ndWFnZS5cbiAqXG4gKiBUaGUgd3JhcHBlciBzY3JpcHQgaXMgTEFOR1VBR0UtU1BFQ0lGSUM6IFB5dGhvbiBzaGlwcyBgL29wdC9vdGVsLWluc3RydW1lbnRgOyBOb2RlLmpzLCBKYXZhIGFuZCBSdWJ5XG4gKiBzaGlwIGAvb3B0L290ZWwtaGFuZGxlcmAuIFNldHRpbmcgdGhlIHdyb25nIG9uZSBtYWtlcyB0aGUgbGF5ZXIgYm9vdHN0cmFwIGZhaWwgYXQgY29sZCBzdGFydCB3aXRoXG4gKiBgL29wdC9vdGVsLWluc3RydW1lbnQ6IGRvZXMgbm90IGV4aXN0YCBhbmQgdGhlIGZ1bmN0aW9uIGVycm9ycyBvdXQg4oCUIHdoaWNoIGlzIHdoeSB0aGlzIGlzIG5ldmVyIGFcbiAqIGhhcmRjb2RlZCBjb25zdGFudCBhdCBhIGNhbGwgc2l0ZS5cbiAqXG4gKiBgZGlzdHJvYCBpcyBvbmx5IGNvbnN1bHRlZCBmb3IgSmF2YSwgd2hvc2UgbGF5ZXIgc2hpcHMgZm91ciB3cmFwcGVycywgb25lIHBlciBoYW5kbGVyIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWNXcmFwcGVyRm9yKGxhbmd1YWdlOiBzdHJpbmcsIGRpc3Rybz86IE9kaWdvc0phdmFIYW5kbGVyRGlzdHJvKTogc3RyaW5nIHtcbiAgaWYgKGxhbmd1YWdlID09PSAnamF2YScpIHtcbiAgICByZXR1cm4gSkFWQV9ESVNUUk9fV1JBUFBFUlNbZGlzdHJvID8/IE9kaWdvc0phdmFIYW5kbGVyRGlzdHJvLk9URUxfSEFORExFUl07XG4gIH1cbiAgY29uc3Qgc3BlYyA9IExBTkdVQUdFU1tsYW5ndWFnZV07XG4gIGlmICghc3BlYykge1xuICAgIHRocm93IG5ldyBFcnJvcihgT2RpZ29zOiBubyBPcGVuVGVsZW1ldHJ5IExhbWJkYSBsYXllciBmb3IgbGFuZ3VhZ2UgXCIke2xhbmd1YWdlfVwiYCk7XG4gIH1cbiAgcmV0dXJuIHNwZWMuZXhlY1dyYXBwZXI7XG59XG5cbi8qKiBMYXllciBuYW1lIGZvciBhIGxhbmd1YWdlL2FyY2hpdGVjdHVyZSDigJQgYG9kaWdvcy1vdGVsLXB5dGhvbi1hcm02NGAuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJOYW1lRm9yKGxhbmd1YWdlOiBzdHJpbmcsIGFyY2hpdGVjdHVyZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3BlYyA9IExBTkdVQUdFU1tsYW5ndWFnZV07XG4gIGlmICghc3BlYykge1xuICAgIHRocm93IG5ldyBFcnJvcihgT2RpZ29zOiB1bmtub3duIGxhbmd1YWdlIFwiJHtsYW5ndWFnZX1cImApO1xuICB9XG4gIHJldHVybiBgJHtzcGVjLmxheWVyTmFtZX0tJHthcmNoaXRlY3R1cmV9YDtcbn1cblxuLyoqIEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzZXQgb24gYSBmdW5jdGlvbiwgYXMgYSBwbGFpbiBtYXAuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudlZhcnMge1xuICByZWFkb25seSBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSWRlbXBvdGVudGx5IGFkZHMgb3VyIGxvYWRlciB2YWx1ZSB0byBhIHZhbHVlIHRoZSBmdW5jdGlvbiBhbHJlYWR5IGNhcnJpZXMuXG4gKlxuICogYFBZVEhPTlBBVEhgIGlzIFBSRVBFTkRFRCwgc28gdGhlIGxheWVyJ3MgcGFja2FnZXMgYW5kIGl0cyBgc2l0ZWN1c3RvbWl6ZWAgYXJlIGZvdW5kIGZpcnN0OyB0aGVcbiAqIGAqX09QVElPTlNgIHZhcmlhYmxlcyBhcmUgYXBwZW5kZWQsIHNvIHRoZSBjdXN0b21lcidzIG93biBmbGFncyBrZWVwIHByZWNlZGVuY2UuIE1pcnJvcnNcbiAqIGBhZGRMb2FkZXJWYWx1ZWAgaW4gdGhlIGNvbm5lY3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZExvYWRlclZhbHVlKGV4aXN0aW5nOiBzdHJpbmcgfCB1bmRlZmluZWQsIHZhbHVlOiBzdHJpbmcsIHNlcGFyYXRvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFleGlzdGluZykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoZXhpc3RpbmcuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nO1xuICB9XG4gIHJldHVybiBzZXBhcmF0b3IgPT09ICc6JyA/IGAke3ZhbHVlfSR7c2VwYXJhdG9yfSR7ZXhpc3Rpbmd9YCA6IGAke2V4aXN0aW5nfSR7c2VwYXJhdG9yfSR7dmFsdWV9YDtcbn1cblxuLyoqXG4gKiBUaGUgbG9hZGVyIHZhcmlhYmxlIGEgbGFuZ3VhZ2UgYWN0aXZhdGVzIHRocm91Z2ggaW4gd2ViLXNlcnZlciBtb2RlIChgTk9ERV9PUFRJT05TYCxcbiAqIGBKQVZBX1RPT0xfT1BUSU9OU2AsIGBQWVRIT05QQVRIYCksIG9yIHVuZGVmaW5lZCBmb3IgYSBsYW5ndWFnZSB3aXRoIG5vIHZlcmlmaWVkIHdlYi1zZXJ2ZXIgbG9hZGVyLlxuICpcbiAqIEV4aXN0cyBzbyBhIGNhbGxlciB0aGF0IG5lZWRzIHRvIG5hbWUgdGhlIHZhcmlhYmxlIOKAlCB0aGUgb3duZXJzaGlwIG1hcmtlcidzIHJvbGxiYWNrIHNuYXBzaG90LCB3aGljaCBoYXNcbiAqIHRvIHJlY29yZCB0aGUgY2FsbGVyJ3Mgb3duIHByaW9yIHZhbHVlIGZvciBpdCDigJQgZG9lcyBub3QgaGF2ZSB0byBndWVzcyBpdCBmcm9tIHRoZSBrZXkgb3JkZXIgb2ZcbiAqIGB3ZWJTZXJ2ZXJFbnZgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2ViU2VydmVyTG9hZGVyS2V5KGxhbmd1YWdlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gTEFOR1VBR0VTW2xhbmd1YWdlXT8ud2ViU2VydmVyPy5lbnZLZXk7XG59XG5cbi8qKlxuICogVGhlIGVudmlyb25tZW50IHRoYXQgbG9hZHMgdGhlIGxhbmd1YWdlIGFnZW50IGluIHdlYi1zZXJ2ZXIgKEFXUyBMYW1iZGEgV2ViIEFkYXB0ZXIpIG1vZGUuXG4gKlxuICogV2ViLWFkYXB0ZXIgZnVuY3Rpb25zIHJ1biBhIHdlYiBzZXJ2ZXIgcmF0aGVyIHRoYW4gYSBMYW1iZGEgaGFuZGxlciwgYW5kIHRoZSBhZGFwdGVyIG93bnNcbiAqIGBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUmAg4oCUIHNvIGluc3RydW1lbnRhdGlvbiBpcyBsb2FkZWQgdGhyb3VnaCB0aGUgbGFuZ3VhZ2UncyBvd24gbG9hZGVyIHZhcmlhYmxlIGFuZFxuICogdGhlIHdyYXBwZXIgaXMgbGVmdCBhbG9uZS4gSGFuZGxlci1tb2RlIGluc3RydW1lbnRhdGlvbiBhcHBsaWVkIHRvIG9uZSBvZiB0aGVzZSBvdmVyd3JpdGVzIHRoZVxuICogYWRhcHRlcidzIHdyYXBwZXIgYW5kIHRoZSBmdW5jdGlvbiBzdG9wcyBzZXJ2aW5nLlxuICpcbiAqIEBwYXJhbSBleGlzdGluZ0xvYWRlclZhbHVlIHRoZSB2YWx1ZSB0aGUgZnVuY3Rpb24gYWxyZWFkeSBuZWVkcyBpbiBpdHMgbG9hZGVyIHZhcmlhYmxlLCB3aGljaCBvdXJzIGlzXG4gKiBqb2luZWQgdG8uIENESydzIGBsYW1iZGEuRnVuY3Rpb25gIGV4cG9zZXMgbm8gd2F5IHRvIHJlYWQgYmFjayBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXQgZWxzZXdoZXJlIGluXG4gKiB0aGUgYXBwLCBzbyBhIHZhbHVlIHRoYXQgbXVzdCBiZSBwcmVzZXJ2ZWQgaGFzIHRvIGJlIHBhc3NlZCBpbiBleHBsaWNpdGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2ViU2VydmVyRW52KFxuICBsYW5ndWFnZTogc3RyaW5nLFxuICBleGlzdGluZ0xvYWRlclZhbHVlPzogc3RyaW5nLFxuKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gIGNvbnN0IHNwZWMgPSBMQU5HVUFHRVNbbGFuZ3VhZ2VdO1xuICBjb25zdCBsb2FkZXIgPSBzcGVjPy53ZWJTZXJ2ZXI7XG4gIGlmICghbG9hZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE9kaWdvczogJHtPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLldFQl9TRVJWRVJ9IG1vZGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgJHtsYW5ndWFnZX0g4oCUIGAgK1xuICAgICAgICAndGhlcmUgaXMgbm8gdmVyaWZpZWQgd2ViLXNlcnZlciBsb2FkZXIgZm9yIGl0LiBVc2UgSEFORExFUiBtb2RlLCBvciBsZWF2ZSB0aGUgZnVuY3Rpb24gdW5pbnN0cnVtZW50ZWQuJyxcbiAgICApO1xuICB9XG4gIGNvbnN0IGVudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICBbbG9hZGVyLmVudktleV06IGFkZExvYWRlclZhbHVlKGV4aXN0aW5nTG9hZGVyVmFsdWUsIGxvYWRlci52YWx1ZSwgbG9hZGVyLnNlcGFyYXRvciksXG4gIH07XG4gIC8vIFB5dGhvbiBtdXN0IGJlIHBpbm5lZCB0byB0aGUgSFRUUCBPVExQIGV4cG9ydGVyIOKAlCB0aGUgb25seSBvbmUgYnVuZGxlZCBpbiBpdHMgbGF5ZXIuIE90aGVyIGxhbmd1YWdlc1xuICAvLyBleHBvcnQgY29ycmVjdGx5IHdpdGggdGhlaXIgZGVmYXVsdHMsIHNvIG5vdGhpbmcgZXh0cmEgaXMgd3JpdHRlbiBmb3IgdGhlbS5cbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMobG9hZGVyLmV4dHJhRW52KSkge1xuICAgIGVudltrXSA9IHY7XG4gIH1cbiAgcmV0dXJuIGVudjtcbn1cbiJdfQ==
|
|
134
|
+
/** Resolve the same concrete SDK names advertised by the connector's GraphQL catalog. */
|
|
135
|
+
function distributionWrapper(language, name, legacy, webServer = false) {
|
|
136
|
+
if (legacy && name)
|
|
137
|
+
throw new Error('Use distro or legacy javaHandlerDistro, not both');
|
|
138
|
+
if (legacy) {
|
|
139
|
+
if (language !== 'java')
|
|
140
|
+
return execWrapperFor(language);
|
|
141
|
+
if (webServer)
|
|
142
|
+
throw new Error('Java handler adapters require HANDLER mode');
|
|
143
|
+
if (!JAVA_DISTRO_WRAPPERS[legacy])
|
|
144
|
+
throw new Error(`Unsupported Java handler adapter ${legacy}`);
|
|
145
|
+
return execWrapperFor(language, legacy);
|
|
146
|
+
}
|
|
147
|
+
if (webServer && language === 'ruby')
|
|
148
|
+
throw new Error('Web-server instrumentation is not supported for ruby');
|
|
149
|
+
const d = distributions_1.LAMBDA_DISTRIBUTIONS.find(d => d.language === language && (name ? d.name === name : d.isDefault));
|
|
150
|
+
if (!d || (webServer && (d.artifact || language === 'ruby' || (language === 'java' && d.name !== 'java-lambda-otel-agent')))) {
|
|
151
|
+
throw new Error(`Unsupported Lambda distro ${name ?? '(default)'} for ${language}`);
|
|
152
|
+
}
|
|
153
|
+
return d.execWrapper;
|
|
154
|
+
}
|
|
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
|