@pipeline-builder/pipeline-manager 4.5.2 → 4.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -37
- package/dist/agent/post-steps.d.ts +5 -4
- package/dist/agent/post-steps.d.ts.map +1 -1
- package/dist/agent/post-steps.js +19 -7
- package/dist/agent/targets.d.ts +12 -2
- package/dist/agent/targets.d.ts.map +1 -1
- package/dist/agent/targets.js +20 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +16 -7
- package/dist/commands/audit-stacks.d.ts +42 -1
- package/dist/commands/audit-stacks.d.ts.map +1 -1
- package/dist/commands/audit-stacks.js +104 -23
- package/dist/commands/audit-tokens.d.ts.map +1 -1
- package/dist/commands/audit-tokens.js +3 -4
- package/dist/commands/create-pat.d.ts.map +1 -1
- package/dist/commands/create-pat.js +9 -6
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +15 -2
- package/dist/commands/login.d.ts +3 -2
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +19 -10
- package/dist/commands/logout.d.ts +24 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +105 -0
- package/dist/commands/new-plugin.js +5 -5
- package/dist/commands/org-export.js +2 -2
- package/dist/commands/pipeline-remove.d.ts +26 -0
- package/dist/commands/pipeline-remove.d.ts.map +1 -0
- package/dist/commands/pipeline-remove.js +84 -0
- package/dist/commands/provision-steps.d.ts.map +1 -1
- package/dist/commands/provision-steps.js +1 -2
- package/dist/commands/provision.d.ts.map +1 -1
- package/dist/commands/provision.js +6 -5
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +3 -4
- package/dist/commands/status.d.ts +5 -2
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +65 -25
- package/dist/commands/toolchain.d.ts +21 -0
- package/dist/commands/toolchain.d.ts.map +1 -0
- package/dist/commands/toolchain.js +70 -0
- package/dist/commands/validate-templates.d.ts.map +1 -1
- package/dist/commands/validate-templates.js +4 -5
- package/dist/config/cli.constants.d.ts +8 -0
- package/dist/config/cli.constants.d.ts.map +1 -1
- package/dist/config/cli.constants.js +21 -2
- package/dist/types/plugin.d.ts +0 -6
- package/dist/types/plugin.d.ts.map +1 -1
- package/dist/types/plugin.js +1 -1
- package/dist/utils/command-utils.d.ts +13 -0
- package/dist/utils/command-utils.d.ts.map +1 -1
- package/dist/utils/command-utils.js +31 -17
- package/dist/utils/config-loader.d.ts +2 -1
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +14 -4
- package/dist/utils/credential-store.d.ts +9 -1
- package/dist/utils/credential-store.d.ts.map +1 -1
- package/dist/utils/credential-store.js +21 -2
- package/dist/utils/error-handler.d.ts +10 -1
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +20 -8
- package/dist/utils/pipeline-config.d.ts +5 -2
- package/dist/utils/pipeline-config.d.ts.map +1 -1
- package/dist/utils/pipeline-config.js +12 -3
- package/dist/utils/plugin-resolver.d.ts +21 -6
- package/dist/utils/plugin-resolver.d.ts.map +1 -1
- package/dist/utils/plugin-resolver.js +42 -9
- package/dist/utils/response-utils.d.ts +11 -0
- package/dist/utils/response-utils.d.ts.map +1 -1
- package/dist/utils/response-utils.js +23 -1
- package/dist/utils/toolchain.d.ts +78 -0
- package/dist/utils/toolchain.d.ts.map +1 -0
- package/dist/utils/toolchain.js +195 -0
- package/package.json +4 -4
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* The pipeline's toolchain release (docs/plans/bootstrap-image-versioning.md §2, D2).
|
|
5
|
+
*
|
|
6
|
+
* `pipeline-bootstrap` (the default CodeBuild image) and `cdk-synth` (the synth
|
|
7
|
+
* step) are one release. The bootstrap is not a step, so nothing else resolves
|
|
8
|
+
* it: {@link resolveBootstrapImage} looks it up with the pipeline's
|
|
9
|
+
* `toolchain.release` pin, and ANY failure stops the synth — the template has
|
|
10
|
+
* no other image to fall back to.
|
|
11
|
+
*
|
|
12
|
+
* `pipeline deploy --local-spec` never contacts the platform, so it reads the
|
|
13
|
+
* release from a file `pipeline-manager toolchain export` wrote instead.
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from 'node:fs';
|
|
16
|
+
import * as path from 'node:path';
|
|
17
|
+
import { BUILD_IMAGE_STEP_KEY, ErrorCode, errorMessage, MANAGED_TOOLCHAIN, toolchainReleasePin } from '@pipeline-builder/api-core';
|
|
18
|
+
import { parseLookupToolchain, pluginArtifactAlias, unwrapLookup, } from '@pipeline-builder/pipeline-core';
|
|
19
|
+
import { PluginResolutionError, isManagedToolchainRef, printLookupWarning, serviceErrorCode } from './plugin-resolver.js';
|
|
20
|
+
import { bakePlatformRegistry } from './registry.js';
|
|
21
|
+
const { bootstrap: BOOTSTRAP_PLUGIN, synth: SYNTH_PLUGIN } = MANAGED_TOOLCHAIN;
|
|
22
|
+
/** `toolchain export` file format version. */
|
|
23
|
+
export const TOOLCHAIN_FILE_FORMAT = 1;
|
|
24
|
+
/** The refusal every failure here raises — one code, so `PB_SYNTH_FAILURE` reports it uniformly. */
|
|
25
|
+
export function bootstrapUnresolved(message, code = ErrorCode.BOOTSTRAP_IMAGE_UNRESOLVED) {
|
|
26
|
+
return new PluginResolutionError([{ plugin: BOOTSTRAP_PLUGIN, code, message }]);
|
|
27
|
+
}
|
|
28
|
+
/** Look up one managed half. Throws {@link bootstrapUnresolved} on any failure. */
|
|
29
|
+
async function lookupManaged(client, name, releasePin, context) {
|
|
30
|
+
const what = `${name}${releasePin ? ` (release ${releasePin})` : ''}`;
|
|
31
|
+
let res;
|
|
32
|
+
try {
|
|
33
|
+
res = await client.post('/api/plugins/lookup', {
|
|
34
|
+
filter: { name },
|
|
35
|
+
...(releasePin ? { releasePin } : {}),
|
|
36
|
+
...(context ? { context } : {}),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
const code = serviceErrorCode(err);
|
|
41
|
+
const status = err?.response?.status;
|
|
42
|
+
const why = code === ErrorCode.TOOLCHAIN_NO_DEFAULT
|
|
43
|
+
? 'the platform has no default toolchain release (an operator sets one with `deploy/bin/init-platform.sh` or the Toolchain console)'
|
|
44
|
+
: status === 404 && releasePin
|
|
45
|
+
? `release ${releasePin} does not exist (deleted) — pin another release or clear the pipeline's toolchain.release`
|
|
46
|
+
: errorMessage(err);
|
|
47
|
+
throw bootstrapUnresolved(`Toolchain ${what} could not be resolved: ${why}`);
|
|
48
|
+
}
|
|
49
|
+
const { plugin, warnings, toolchain } = unwrapLookup(res);
|
|
50
|
+
if (!plugin || plugin.name !== name)
|
|
51
|
+
throw bootstrapUnresolved(`Toolchain ${what} could not be resolved: the lookup returned no ${name} record`);
|
|
52
|
+
if (!toolchain)
|
|
53
|
+
throw bootstrapUnresolved(`Toolchain ${what} could not be resolved: the answer carried no toolchain release`);
|
|
54
|
+
if (releasePin && toolchain.releaseVersion !== releasePin) {
|
|
55
|
+
throw bootstrapUnresolved(`Toolchain ${what} resolved to release ${toolchain.releaseVersion}, not the pinned ${releasePin}`, ErrorCode.TOOLCHAIN_PAIR_MISMATCH);
|
|
56
|
+
}
|
|
57
|
+
return { plugin, toolchain, warnings };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Resolve the pipeline's `pipeline-bootstrap` through `/plugins/lookup` with
|
|
61
|
+
* `releasePin = props.toolchain?.release`. FATAL on any failure
|
|
62
|
+
* (`BOOTSTRAP_IMAGE_UNRESOLVED`): unreachable platform, no default (409
|
|
63
|
+
* `TOOLCHAIN_NO_DEFAULT`), a deleted pin (404), a refused signature, or an
|
|
64
|
+
* answer without a release. Warnings are printed, appended to `warningSink`,
|
|
65
|
+
* and — with a `pipelineId` — recorded by the platform on the pipeline's
|
|
66
|
+
* "Build image" row (`context.stepKeys: ['build-image']`).
|
|
67
|
+
*/
|
|
68
|
+
export async function resolveBootstrapImage(client, props, warningSink) {
|
|
69
|
+
const pipelineId = typeof props.pipelineId === 'string' && props.pipelineId.length > 0 ? props.pipelineId : undefined;
|
|
70
|
+
const { plugin, toolchain, warnings } = await lookupManaged(client, BOOTSTRAP_PLUGIN, toolchainReleasePin(props),
|
|
71
|
+
// Recorded against the pipeline's "Build image" row (api-core BUILD_IMAGE_STEP_KEY).
|
|
72
|
+
pipelineId ? { pipelineId, stepKeys: [BUILD_IMAGE_STEP_KEY] } : undefined);
|
|
73
|
+
for (const warning of warnings) {
|
|
74
|
+
printLookupWarning(BOOTSTRAP_PLUGIN, warning);
|
|
75
|
+
warningSink?.push(warning);
|
|
76
|
+
}
|
|
77
|
+
return { plugin, toolchain };
|
|
78
|
+
}
|
|
79
|
+
/** The managed synth reference of a pipeline's props, when its synth plugin is `cdk-synth`. */
|
|
80
|
+
export function managedSynthKey(props) {
|
|
81
|
+
const ref = props.synth?.plugin;
|
|
82
|
+
if (!ref?.name || !isManagedToolchainRef(ref))
|
|
83
|
+
return null;
|
|
84
|
+
return pluginArtifactAlias(ref);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Both halves of one release must agree. A managed `cdk-synth` that resolved
|
|
88
|
+
* to a different release than the bootstrap is refused (never served).
|
|
89
|
+
*/
|
|
90
|
+
export function assertOneRelease(bootstrap, synthToolchains) {
|
|
91
|
+
for (const [key, synth] of Object.entries(synthToolchains)) {
|
|
92
|
+
if (synth.releaseVersion !== bootstrap.toolchain.releaseVersion) {
|
|
93
|
+
throw bootstrapUnresolved(`Toolchain halves disagree: pipeline-bootstrap is release ${bootstrap.toolchain.releaseVersion} but "${key}" is ${synth.releaseVersion}`, ErrorCode.TOOLCHAIN_PAIR_MISMATCH);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function half(plugin) {
|
|
98
|
+
const rec = plugin;
|
|
99
|
+
return {
|
|
100
|
+
name: rec.name,
|
|
101
|
+
version: rec.version,
|
|
102
|
+
imageRepository: rec.imageRepository ?? '',
|
|
103
|
+
imageDigest: rec.imageDigest ?? '',
|
|
104
|
+
plugin,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Resolve both halves of a release for export: `release` when given, else
|
|
109
|
+
* whatever the caller's org resolves to now (its default, canary or the
|
|
110
|
+
* platform default). Both lookups send the same pin; when no pin is given the
|
|
111
|
+
* bootstrap's release becomes the synth's pin, so the halves always match.
|
|
112
|
+
*/
|
|
113
|
+
export async function exportToolchain(client, release) {
|
|
114
|
+
const bootstrap = await lookupManaged(client, BOOTSTRAP_PLUGIN, release);
|
|
115
|
+
const synth = await lookupManaged(client, SYNTH_PLUGIN, release ?? bootstrap.toolchain.releaseVersion);
|
|
116
|
+
assertOneRelease({ plugin: bootstrap.plugin, toolchain: bootstrap.toolchain }, { [SYNTH_PLUGIN]: synth.toolchain });
|
|
117
|
+
return {
|
|
118
|
+
format: TOOLCHAIN_FILE_FORMAT,
|
|
119
|
+
releaseVersion: bootstrap.toolchain.releaseVersion,
|
|
120
|
+
resolvedVia: bootstrap.toolchain.resolvedVia,
|
|
121
|
+
toolchain: { ...synth.toolchain.versions, ...bootstrap.toolchain.versions },
|
|
122
|
+
exportedAt: new Date().toISOString(),
|
|
123
|
+
...(client.getConfig().api.baseUrl ? { platformBaseUrl: client.getConfig().api.baseUrl } : {}),
|
|
124
|
+
bootstrap: half(bootstrap.plugin),
|
|
125
|
+
synth: half(synth.plugin),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
const HOW_TO_EXPORT = 'Produce one with `pipeline-manager toolchain export --output toolchain.json` (add `--release <V>` to pin a release) '
|
|
129
|
+
+ 'against the platform, then pass `--toolchain-file toolchain.json`.';
|
|
130
|
+
/** The local-spec refusal when no `--toolchain-file` was given. */
|
|
131
|
+
export function toolchainFileRequired() {
|
|
132
|
+
return bootstrapUnresolved(`--local-spec deploys without the platform, so the toolchain release must come from --toolchain-file. ${HOW_TO_EXPORT}`);
|
|
133
|
+
}
|
|
134
|
+
const DIGEST_RE = /^sha256:[0-9a-f]{64}$/;
|
|
135
|
+
/**
|
|
136
|
+
* Read and check a `toolchain export` file: both halves present, named right,
|
|
137
|
+
* digest-pinned, and of one release. Any problem is `BOOTSTRAP_IMAGE_UNRESOLVED`.
|
|
138
|
+
*/
|
|
139
|
+
export function readToolchainFile(file) {
|
|
140
|
+
const abs = path.resolve(file);
|
|
141
|
+
let raw;
|
|
142
|
+
try {
|
|
143
|
+
raw = JSON.parse(fs.readFileSync(abs, 'utf-8'));
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
throw bootstrapUnresolved(`Can't read --toolchain-file ${abs}: ${errorMessage(err)}. ${HOW_TO_EXPORT}`);
|
|
147
|
+
}
|
|
148
|
+
const bad = (why) => { throw bootstrapUnresolved(`--toolchain-file ${abs} is not a toolchain export: ${why}. ${HOW_TO_EXPORT}`); };
|
|
149
|
+
const f = raw;
|
|
150
|
+
if (!f || typeof f !== 'object')
|
|
151
|
+
bad('not a JSON object');
|
|
152
|
+
if (f.format !== TOOLCHAIN_FILE_FORMAT)
|
|
153
|
+
bad(`unsupported format ${String(f.format)}`);
|
|
154
|
+
const toolchain = parseLookupToolchain({ releaseVersion: f.releaseVersion, resolvedVia: f.resolvedVia, versions: f.toolchain });
|
|
155
|
+
if (!toolchain)
|
|
156
|
+
bad('missing releaseVersion / resolvedVia');
|
|
157
|
+
const check = (h, name) => {
|
|
158
|
+
if (!h?.plugin || h.plugin.name !== name || h.name !== name)
|
|
159
|
+
bad(`missing the ${name} half`);
|
|
160
|
+
if (h.version !== toolchain.releaseVersion || h.plugin.version !== toolchain.releaseVersion)
|
|
161
|
+
bad(`${name} is not release ${toolchain.releaseVersion}`);
|
|
162
|
+
const rec = h.plugin;
|
|
163
|
+
if (!rec.imageDigest || !DIGEST_RE.test(rec.imageDigest) || rec.imageDigest !== h.imageDigest)
|
|
164
|
+
bad(`${name} has no signed image digest`);
|
|
165
|
+
if (rec.imageRepository !== `system/${name}` || h.imageRepository !== rec.imageRepository)
|
|
166
|
+
bad(`${name} is not system/${name}`);
|
|
167
|
+
return h.plugin;
|
|
168
|
+
};
|
|
169
|
+
const bootstrap = check(f.bootstrap, BOOTSTRAP_PLUGIN);
|
|
170
|
+
const synth = check(f.synth, SYNTH_PLUGIN);
|
|
171
|
+
const platformBaseUrl = typeof f.platformBaseUrl === 'string' && f.platformBaseUrl.length > 0 ? f.platformBaseUrl : undefined;
|
|
172
|
+
return { bootstrap: { plugin: bootstrap, toolchain: toolchain }, synth, ...(platformBaseUrl && { platformBaseUrl }) };
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Apply a toolchain file to local-spec props: the bootstrap as
|
|
176
|
+
* `resolvedBootstrap`, the exporting platform as the registry pull host, and —
|
|
177
|
+
* when the synth plugin is the managed `cdk-synth` — the exported synth half
|
|
178
|
+
* as its pre-resolved plugin.
|
|
179
|
+
*/
|
|
180
|
+
export function applyToolchainFile(props, file) {
|
|
181
|
+
const { bootstrap, synth, platformBaseUrl } = readToolchainFile(file);
|
|
182
|
+
const pin = toolchainReleasePin(props);
|
|
183
|
+
if (pin && pin !== bootstrap.toolchain.releaseVersion) {
|
|
184
|
+
throw bootstrapUnresolved(`The pipeline pins toolchain release ${pin} but --toolchain-file holds ${bootstrap.toolchain.releaseVersion}. `
|
|
185
|
+
+ `Export the pinned one: \`pipeline-manager toolchain export --release ${pin}\`.`, ErrorCode.TOOLCHAIN_PAIR_MISMATCH);
|
|
186
|
+
}
|
|
187
|
+
props.resolvedBootstrap = bootstrap;
|
|
188
|
+
bakePlatformRegistry(props, platformBaseUrl);
|
|
189
|
+
const synthKey = managedSynthKey(props);
|
|
190
|
+
if (synthKey) {
|
|
191
|
+
props.resolvedPlugins = { ...props.resolvedPlugins, [synthKey]: synth };
|
|
192
|
+
}
|
|
193
|
+
return bootstrap.toolchain.releaseVersion;
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGNoYWluLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdG9vbGNoYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25JLE9BQU8sRUFDNkQsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxHQUMxSCxNQUFNLGlDQUFpQyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRCxNQUFNLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsR0FBRyxpQkFBaUIsQ0FBQztBQUUvRSw4Q0FBOEM7QUFDOUMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBZ0N2QyxvR0FBb0c7QUFDcEcsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE9BQWUsRUFBRSxJQUFJLEdBQVcsU0FBUyxDQUFDLDBCQUEwQjtJQUN0RyxPQUFPLElBQUkscUJBQXFCLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLENBQUM7QUFFRCxtRkFBbUY7QUFDbkYsS0FBSyxVQUFVLGFBQWEsQ0FDMUIsTUFBaUIsRUFDakIsSUFBWSxFQUNaLFVBQThCLEVBQzlCLE9BQW9EO0lBRXBELE1BQU0sSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDdEUsSUFBSSxHQUFZLENBQUM7SUFDakIsSUFBSSxDQUFDO1FBQ0gsR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBVSxxQkFBcUIsRUFBRTtZQUN0RCxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUU7WUFDaEIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNoQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sTUFBTSxHQUFJLEdBQXVELEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztRQUMxRixNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssU0FBUyxDQUFDLG9CQUFvQjtZQUNqRCxDQUFDLENBQUMsa0lBQWtJO1lBQ3BJLENBQUMsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVU7Z0JBQzVCLENBQUMsQ0FBQyxXQUFXLFVBQVUsMkZBQTJGO2dCQUNsSCxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sbUJBQW1CLENBQUMsYUFBYSxJQUFJLDJCQUEyQixHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFDRCxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUQsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUk7UUFBRSxNQUFNLG1CQUFtQixDQUFDLGFBQWEsSUFBSSxrREFBa0QsSUFBSSxTQUFTLENBQUMsQ0FBQztJQUNqSixJQUFJLENBQUMsU0FBUztRQUFFLE1BQU0sbUJBQW1CLENBQUMsYUFBYSxJQUFJLGlFQUFpRSxDQUFDLENBQUM7SUFDOUgsSUFBSSxVQUFVLElBQUksU0FBUyxDQUFDLGNBQWMsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUMxRCxNQUFNLG1CQUFtQixDQUFDLGFBQWEsSUFBSSx3QkFBd0IsU0FBUyxDQUFDLGNBQWMsb0JBQW9CLFVBQVUsRUFBRSxFQUFFLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ2xLLENBQUM7SUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHFCQUFxQixDQUN6QyxNQUFpQixFQUNqQixLQUE4QixFQUM5QixXQUE2QjtJQUU3QixNQUFNLFVBQVUsR0FBRyxPQUFPLEtBQUssQ0FBQyxVQUFVLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3RILE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sYUFBYSxDQUN6RCxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUMsS0FBSyxDQUFDO0lBQ3BELHFGQUFxRjtJQUNyRixVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUMxRSxDQUFDO0lBQ0YsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMvQixrQkFBa0IsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5QyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRCwrRkFBK0Y7QUFDL0YsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUE4QjtJQUM1RCxNQUFNLEdBQUcsR0FBSSxLQUFLLENBQUMsS0FBMEgsRUFBRSxNQUFNLENBQUM7SUFDdEosSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMzRCxPQUFPLG1CQUFtQixDQUFDLEdBQXVCLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFNBQTRCLEVBQUUsZUFBZ0Q7SUFDN0csS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztRQUMzRCxJQUFJLEtBQUssQ0FBQyxjQUFjLEtBQUssU0FBUyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNoRSxNQUFNLG1CQUFtQixDQUN2Qiw0REFBNEQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxjQUFjLFNBQVMsR0FBRyxRQUFRLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFDeEksU0FBUyxDQUFDLHVCQUF1QixDQUNsQyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxJQUFJLENBQUMsTUFBb0I7SUFDaEMsTUFBTSxHQUFHLEdBQUcsTUFBeUYsQ0FBQztJQUN0RyxPQUFPO1FBQ0wsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ2QsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1FBQ3BCLGVBQWUsRUFBRSxHQUFHLENBQUMsZUFBZSxJQUFJLEVBQUU7UUFDMUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXLElBQUksRUFBRTtRQUNsQyxNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUFDLE1BQWlCLEVBQUUsT0FBZ0I7SUFDdkUsTUFBTSxTQUFTLEdBQUcsTUFBTSxhQUFhLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sS0FBSyxHQUFHLE1BQU0sYUFBYSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdkcsZ0JBQWdCLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNwSCxPQUFPO1FBQ0wsTUFBTSxFQUFFLHFCQUFxQjtRQUM3QixjQUFjLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxjQUFjO1FBQ2xELFdBQVcsRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLFdBQVc7UUFDNUMsU0FBUyxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQzNFLFVBQVUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtRQUNwQyxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM5RixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDakMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0tBQzFCLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxhQUFhLEdBQUcsc0hBQXNIO01BQ3hJLG9FQUFvRSxDQUFDO0FBRXpFLG1FQUFtRTtBQUNuRSxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLE9BQU8sbUJBQW1CLENBQUMsd0dBQXdHLGFBQWEsRUFBRSxDQUFDLENBQUM7QUFDdEosQ0FBQztBQUVELE1BQU0sU0FBUyxHQUFHLHVCQUF1QixDQUFDO0FBRTFDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxJQUFZO0lBQzVDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsSUFBSSxHQUFZLENBQUM7SUFDakIsSUFBSSxDQUFDO1FBQ0gsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sbUJBQW1CLENBQUMsK0JBQStCLEdBQUcsS0FBSyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssYUFBYSxFQUFFLENBQUMsQ0FBQztJQUMxRyxDQUFDO0lBQ0QsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFXLEVBQVMsRUFBRSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsb0JBQW9CLEdBQUcsK0JBQStCLEdBQUcsS0FBSyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xKLE1BQU0sQ0FBQyxHQUFHLEdBQW9DLENBQUM7SUFDL0MsSUFBSSxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRO1FBQUUsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDMUQsSUFBSSxDQUFFLENBQUMsTUFBTSxLQUFLLHFCQUFxQjtRQUFFLEdBQUcsQ0FBQyxzQkFBc0IsTUFBTSxDQUFDLENBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEYsTUFBTSxTQUFTLEdBQUcsb0JBQW9CLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBRSxDQUFDLGNBQWMsRUFBRSxXQUFXLEVBQUUsQ0FBRSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsQ0FBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDbkksSUFBSSxDQUFDLFNBQVM7UUFBRSxHQUFHLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUM1RCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQWdDLEVBQUUsSUFBWSxFQUFnQixFQUFFO1FBQzdFLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUk7WUFBRSxHQUFHLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FBQyxDQUFDO1FBQzdGLElBQUksQ0FBRSxDQUFDLE9BQU8sS0FBSyxTQUFVLENBQUMsY0FBYyxJQUFJLENBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVUsQ0FBQyxjQUFjO1lBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxtQkFBbUIsU0FBVSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDNUosTUFBTSxHQUFHLEdBQUcsQ0FBRSxDQUFDLE1BQXlGLENBQUM7UUFDekcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsV0FBVyxLQUFLLENBQUUsQ0FBQyxXQUFXO1lBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSw2QkFBNkIsQ0FBQyxDQUFDO1FBQzFJLElBQUksR0FBRyxDQUFDLGVBQWUsS0FBSyxVQUFVLElBQUksRUFBRSxJQUFJLENBQUUsQ0FBQyxlQUFlLEtBQUssR0FBRyxDQUFDLGVBQWU7WUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLGtCQUFrQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pJLE9BQU8sQ0FBRSxDQUFDLE1BQU0sQ0FBQztJQUNuQixDQUFDLENBQUM7SUFDRixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBRSxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFFLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzVDLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBRSxDQUFDLGVBQWUsS0FBSyxRQUFRLElBQUksQ0FBRSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDakksT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsZUFBZSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3pILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxLQUE4QixFQUFFLElBQVk7SUFDN0UsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEUsTUFBTSxHQUFHLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLFNBQVMsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEQsTUFBTSxtQkFBbUIsQ0FDdkIsdUNBQXVDLEdBQUcsK0JBQStCLFNBQVMsQ0FBQyxTQUFTLENBQUMsY0FBYyxJQUFJO2NBQzdHLHdFQUF3RSxHQUFHLEtBQUssRUFDbEYsU0FBUyxDQUFDLHVCQUF1QixDQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUNELEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7SUFDcEMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsS0FBSyxDQUFDLGVBQWUsR0FBRyxFQUFFLEdBQUksS0FBSyxDQUFDLGVBQXVELEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNuSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogVGhlIHBpcGVsaW5lJ3MgdG9vbGNoYWluIHJlbGVhc2UgKGRvY3MvcGxhbnMvYm9vdHN0cmFwLWltYWdlLXZlcnNpb25pbmcubWQgwqcyLCBEMikuXG4gKlxuICogYHBpcGVsaW5lLWJvb3RzdHJhcGAgKHRoZSBkZWZhdWx0IENvZGVCdWlsZCBpbWFnZSkgYW5kIGBjZGstc3ludGhgICh0aGUgc3ludGhcbiAqIHN0ZXApIGFyZSBvbmUgcmVsZWFzZS4gVGhlIGJvb3RzdHJhcCBpcyBub3QgYSBzdGVwLCBzbyBub3RoaW5nIGVsc2UgcmVzb2x2ZXNcbiAqIGl0OiB7QGxpbmsgcmVzb2x2ZUJvb3RzdHJhcEltYWdlfSBsb29rcyBpdCB1cCB3aXRoIHRoZSBwaXBlbGluZSdzXG4gKiBgdG9vbGNoYWluLnJlbGVhc2VgIHBpbiwgYW5kIEFOWSBmYWlsdXJlIHN0b3BzIHRoZSBzeW50aCDigJQgdGhlIHRlbXBsYXRlIGhhc1xuICogbm8gb3RoZXIgaW1hZ2UgdG8gZmFsbCBiYWNrIHRvLlxuICpcbiAqIGBwaXBlbGluZSBkZXBsb3kgLS1sb2NhbC1zcGVjYCBuZXZlciBjb250YWN0cyB0aGUgcGxhdGZvcm0sIHNvIGl0IHJlYWRzIHRoZVxuICogcmVsZWFzZSBmcm9tIGEgZmlsZSBgcGlwZWxpbmUtbWFuYWdlciB0b29sY2hhaW4gZXhwb3J0YCB3cm90ZSBpbnN0ZWFkLlxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgQlVJTERfSU1BR0VfU1RFUF9LRVksIEVycm9yQ29kZSwgZXJyb3JNZXNzYWdlLCBNQU5BR0VEX1RPT0xDSEFJTiwgdG9vbGNoYWluUmVsZWFzZVBpbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7XG4gIHR5cGUgTG9va3VwVG9vbGNoYWluLCB0eXBlIExvb2t1cFdhcm5pbmcsIHR5cGUgUmVzb2x2ZWRCb290c3RyYXAsIHBhcnNlTG9va3VwVG9vbGNoYWluLCBwbHVnaW5BcnRpZmFjdEFsaWFzLCB1bndyYXBMb29rdXAsXG59IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBBcGlDbGllbnQgfSBmcm9tICcuL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgUGx1Z2luUmVzb2x1dGlvbkVycm9yLCBpc01hbmFnZWRUb29sY2hhaW5SZWYsIHByaW50TG9va3VwV2FybmluZywgc2VydmljZUVycm9yQ29kZSB9IGZyb20gJy4vcGx1Z2luLXJlc29sdmVyLmpzJztcbmltcG9ydCB7IGJha2VQbGF0Zm9ybVJlZ2lzdHJ5IH0gZnJvbSAnLi9yZWdpc3RyeS5qcyc7XG5cbmNvbnN0IHsgYm9vdHN0cmFwOiBCT09UU1RSQVBfUExVR0lOLCBzeW50aDogU1lOVEhfUExVR0lOIH0gPSBNQU5BR0VEX1RPT0xDSEFJTjtcblxuLyoqIGB0b29sY2hhaW4gZXhwb3J0YCBmaWxlIGZvcm1hdCB2ZXJzaW9uLiAqL1xuZXhwb3J0IGNvbnN0IFRPT0xDSEFJTl9GSUxFX0ZPUk1BVCA9IDE7XG5cbi8qKiBBIHBsdWdpbiByZWNvcmQgYXMgdGhlIGxvb2t1cCByZXR1cm5lZCBpdCAob3BhcXVlIGhlcmU7IHBpcGVsaW5lLWNvcmUgcmVhZHMgaXQpLiAqL1xudHlwZSBQbHVnaW5SZWNvcmQgPSBSZXNvbHZlZEJvb3RzdHJhcFsncGx1Z2luJ107XG5cbi8qKiBPbmUgaGFsZiBvZiBhbiBleHBvcnRlZCByZWxlYXNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sY2hhaW5GaWxlSGFsZiB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBpbWFnZVJlcG9zaXRvcnk6IHN0cmluZztcbiAgcmVhZG9ubHkgaW1hZ2VEaWdlc3Q6IHN0cmluZztcbiAgLyoqIFRoZSBmdWxsIGxvb2t1cCByZWNvcmQg4oCUIHdoYXQgdGhlIHN5bnRoIGNvbnN1bWVzLiAqL1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpblJlY29yZDtcbn1cblxuLyoqIFdoYXQgYHBpcGVsaW5lLW1hbmFnZXIgdG9vbGNoYWluIGV4cG9ydGAgd3JpdGVzIGFuZCBgLS10b29sY2hhaW4tZmlsZWAgcmVhZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xjaGFpbkZpbGUge1xuICByZWFkb25seSBmb3JtYXQ6IHR5cGVvZiBUT09MQ0hBSU5fRklMRV9GT1JNQVQ7XG4gIHJlYWRvbmx5IHJlbGVhc2VWZXJzaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlc29sdmVkVmlhOiBMb29rdXBUb29sY2hhaW5bJ3Jlc29sdmVkVmlhJ107XG4gIHJlYWRvbmx5IHRvb2xjaGFpbjogTG9va3VwVG9vbGNoYWluWyd2ZXJzaW9ucyddO1xuICByZWFkb25seSBleHBvcnRlZEF0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcGxhdGZvcm0gdGhlIHJlbGVhc2Ugd2FzIGV4cG9ydGVkIGZyb20uIEl0cyBob3N0IGlzIHRoZSByZWdpc3RyeVxuICAgKiBDb2RlQnVpbGQgcHVsbHMgYm90aCBpbWFnZXMgZnJvbSwgc28gYSBsb2NhbC1zcGVjIGRlcGxveSBiYWtlcyBpdCBhcyB0aGVcbiAgICogcHVsbCBob3N0ICh1bmxlc3MgSU1BR0VfUkVHSVNUUllfUFVMTF9IT1NUIGlzIHNldCksIGxpa2UgYSBwbGF0Zm9ybSBkZXBsb3kuXG4gICAqL1xuICByZWFkb25seSBwbGF0Zm9ybUJhc2VVcmw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGJvb3RzdHJhcDogVG9vbGNoYWluRmlsZUhhbGY7XG4gIHJlYWRvbmx5IHN5bnRoOiBUb29sY2hhaW5GaWxlSGFsZjtcbn1cblxuLyoqIFRoZSByZWZ1c2FsIGV2ZXJ5IGZhaWx1cmUgaGVyZSByYWlzZXMg4oCUIG9uZSBjb2RlLCBzbyBgUEJfU1lOVEhfRkFJTFVSRWAgcmVwb3J0cyBpdCB1bmlmb3JtbHkuICovXG5leHBvcnQgZnVuY3Rpb24gYm9vdHN0cmFwVW5yZXNvbHZlZChtZXNzYWdlOiBzdHJpbmcsIGNvZGU6IHN0cmluZyA9IEVycm9yQ29kZS5CT09UU1RSQVBfSU1BR0VfVU5SRVNPTFZFRCk6IFBsdWdpblJlc29sdXRpb25FcnJvciB7XG4gIHJldHVybiBuZXcgUGx1Z2luUmVzb2x1dGlvbkVycm9yKFt7IHBsdWdpbjogQk9PVFNUUkFQX1BMVUdJTiwgY29kZSwgbWVzc2FnZSB9XSk7XG59XG5cbi8qKiBMb29rIHVwIG9uZSBtYW5hZ2VkIGhhbGYuIFRocm93cyB7QGxpbmsgYm9vdHN0cmFwVW5yZXNvbHZlZH0gb24gYW55IGZhaWx1cmUuICovXG5hc3luYyBmdW5jdGlvbiBsb29rdXBNYW5hZ2VkKFxuICBjbGllbnQ6IEFwaUNsaWVudCxcbiAgbmFtZTogc3RyaW5nLFxuICByZWxlYXNlUGluOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGNvbnRleHQ/OiB7IHBpcGVsaW5lSWQ6IHN0cmluZzsgc3RlcEtleXM6IHN0cmluZ1tdIH0sXG4pOiBQcm9taXNlPHsgcGx1Z2luOiBQbHVnaW5SZWNvcmQ7IHRvb2xjaGFpbjogTG9va3VwVG9vbGNoYWluOyB3YXJuaW5nczogTG9va3VwV2FybmluZ1tdIH0+IHtcbiAgY29uc3Qgd2hhdCA9IGAke25hbWV9JHtyZWxlYXNlUGluID8gYCAocmVsZWFzZSAke3JlbGVhc2VQaW59KWAgOiAnJ31gO1xuICBsZXQgcmVzOiB1bmtub3duO1xuICB0cnkge1xuICAgIHJlcyA9IGF3YWl0IGNsaWVudC5wb3N0PHVua25vd24+KCcvYXBpL3BsdWdpbnMvbG9va3VwJywge1xuICAgICAgZmlsdGVyOiB7IG5hbWUgfSxcbiAgICAgIC4uLihyZWxlYXNlUGluID8geyByZWxlYXNlUGluIH0gOiB7fSksXG4gICAgICAuLi4oY29udGV4dCA/IHsgY29udGV4dCB9IDoge30pLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zdCBjb2RlID0gc2VydmljZUVycm9yQ29kZShlcnIpO1xuICAgIGNvbnN0IHN0YXR1cyA9IChlcnIgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogdW5rbm93biB9IH0gfCB1bmRlZmluZWQpPy5yZXNwb25zZT8uc3RhdHVzO1xuICAgIGNvbnN0IHdoeSA9IGNvZGUgPT09IEVycm9yQ29kZS5UT09MQ0hBSU5fTk9fREVGQVVMVFxuICAgICAgPyAndGhlIHBsYXRmb3JtIGhhcyBubyBkZWZhdWx0IHRvb2xjaGFpbiByZWxlYXNlIChhbiBvcGVyYXRvciBzZXRzIG9uZSB3aXRoIGBkZXBsb3kvYmluL2luaXQtcGxhdGZvcm0uc2hgIG9yIHRoZSBUb29sY2hhaW4gY29uc29sZSknXG4gICAgICA6IHN0YXR1cyA9PT0gNDA0ICYmIHJlbGVhc2VQaW5cbiAgICAgICAgPyBgcmVsZWFzZSAke3JlbGVhc2VQaW59IGRvZXMgbm90IGV4aXN0IChkZWxldGVkKSDigJQgcGluIGFub3RoZXIgcmVsZWFzZSBvciBjbGVhciB0aGUgcGlwZWxpbmUncyB0b29sY2hhaW4ucmVsZWFzZWBcbiAgICAgICAgOiBlcnJvck1lc3NhZ2UoZXJyKTtcbiAgICB0aHJvdyBib290c3RyYXBVbnJlc29sdmVkKGBUb29sY2hhaW4gJHt3aGF0fSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQ6ICR7d2h5fWApO1xuICB9XG4gIGNvbnN0IHsgcGx1Z2luLCB3YXJuaW5ncywgdG9vbGNoYWluIH0gPSB1bndyYXBMb29rdXAocmVzKTtcbiAgaWYgKCFwbHVnaW4gfHwgcGx1Z2luLm5hbWUgIT09IG5hbWUpIHRocm93IGJvb3RzdHJhcFVucmVzb2x2ZWQoYFRvb2xjaGFpbiAke3doYXR9IGNvdWxkIG5vdCBiZSByZXNvbHZlZDogdGhlIGxvb2t1cCByZXR1cm5lZCBubyAke25hbWV9IHJlY29yZGApO1xuICBpZiAoIXRvb2xjaGFpbikgdGhyb3cgYm9vdHN0cmFwVW5yZXNvbHZlZChgVG9vbGNoYWluICR7d2hhdH0gY291bGQgbm90IGJlIHJlc29sdmVkOiB0aGUgYW5zd2VyIGNhcnJpZWQgbm8gdG9vbGNoYWluIHJlbGVhc2VgKTtcbiAgaWYgKHJlbGVhc2VQaW4gJiYgdG9vbGNoYWluLnJlbGVhc2VWZXJzaW9uICE9PSByZWxlYXNlUGluKSB7XG4gICAgdGhyb3cgYm9vdHN0cmFwVW5yZXNvbHZlZChgVG9vbGNoYWluICR7d2hhdH0gcmVzb2x2ZWQgdG8gcmVsZWFzZSAke3Rvb2xjaGFpbi5yZWxlYXNlVmVyc2lvbn0sIG5vdCB0aGUgcGlubmVkICR7cmVsZWFzZVBpbn1gLCBFcnJvckNvZGUuVE9PTENIQUlOX1BBSVJfTUlTTUFUQ0gpO1xuICB9XG4gIHJldHVybiB7IHBsdWdpbiwgdG9vbGNoYWluLCB3YXJuaW5ncyB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIHBpcGVsaW5lJ3MgYHBpcGVsaW5lLWJvb3RzdHJhcGAgdGhyb3VnaCBgL3BsdWdpbnMvbG9va3VwYCB3aXRoXG4gKiBgcmVsZWFzZVBpbiA9IHByb3BzLnRvb2xjaGFpbj8ucmVsZWFzZWAuIEZBVEFMIG9uIGFueSBmYWlsdXJlXG4gKiAoYEJPT1RTVFJBUF9JTUFHRV9VTlJFU09MVkVEYCk6IHVucmVhY2hhYmxlIHBsYXRmb3JtLCBubyBkZWZhdWx0ICg0MDlcbiAqIGBUT09MQ0hBSU5fTk9fREVGQVVMVGApLCBhIGRlbGV0ZWQgcGluICg0MDQpLCBhIHJlZnVzZWQgc2lnbmF0dXJlLCBvciBhblxuICogYW5zd2VyIHdpdGhvdXQgYSByZWxlYXNlLiBXYXJuaW5ncyBhcmUgcHJpbnRlZCwgYXBwZW5kZWQgdG8gYHdhcm5pbmdTaW5rYCxcbiAqIGFuZCDigJQgd2l0aCBhIGBwaXBlbGluZUlkYCDigJQgcmVjb3JkZWQgYnkgdGhlIHBsYXRmb3JtIG9uIHRoZSBwaXBlbGluZSdzXG4gKiBcIkJ1aWxkIGltYWdlXCIgcm93IChgY29udGV4dC5zdGVwS2V5czogWydidWlsZC1pbWFnZSddYCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlQm9vdHN0cmFwSW1hZ2UoXG4gIGNsaWVudDogQXBpQ2xpZW50LFxuICBwcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHdhcm5pbmdTaW5rPzogTG9va3VwV2FybmluZ1tdLFxuKTogUHJvbWlzZTxSZXNvbHZlZEJvb3RzdHJhcD4ge1xuICBjb25zdCBwaXBlbGluZUlkID0gdHlwZW9mIHByb3BzLnBpcGVsaW5lSWQgPT09ICdzdHJpbmcnICYmIHByb3BzLnBpcGVsaW5lSWQubGVuZ3RoID4gMCA/IHByb3BzLnBpcGVsaW5lSWQgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgcGx1Z2luLCB0b29sY2hhaW4sIHdhcm5pbmdzIH0gPSBhd2FpdCBsb29rdXBNYW5hZ2VkKFxuICAgIGNsaWVudCwgQk9PVFNUUkFQX1BMVUdJTiwgdG9vbGNoYWluUmVsZWFzZVBpbihwcm9wcyksXG4gICAgLy8gUmVjb3JkZWQgYWdhaW5zdCB0aGUgcGlwZWxpbmUncyBcIkJ1aWxkIGltYWdlXCIgcm93IChhcGktY29yZSBCVUlMRF9JTUFHRV9TVEVQX0tFWSkuXG4gICAgcGlwZWxpbmVJZCA/IHsgcGlwZWxpbmVJZCwgc3RlcEtleXM6IFtCVUlMRF9JTUFHRV9TVEVQX0tFWV0gfSA6IHVuZGVmaW5lZCxcbiAgKTtcbiAgZm9yIChjb25zdCB3YXJuaW5nIG9mIHdhcm5pbmdzKSB7XG4gICAgcHJpbnRMb29rdXBXYXJuaW5nKEJPT1RTVFJBUF9QTFVHSU4sIHdhcm5pbmcpO1xuICAgIHdhcm5pbmdTaW5rPy5wdXNoKHdhcm5pbmcpO1xuICB9XG4gIHJldHVybiB7IHBsdWdpbiwgdG9vbGNoYWluIH07XG59XG5cbi8qKiBUaGUgbWFuYWdlZCBzeW50aCByZWZlcmVuY2Ugb2YgYSBwaXBlbGluZSdzIHByb3BzLCB3aGVuIGl0cyBzeW50aCBwbHVnaW4gaXMgYGNkay1zeW50aGAuICovXG5leHBvcnQgZnVuY3Rpb24gbWFuYWdlZFN5bnRoS2V5KHByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCByZWYgPSAocHJvcHMuc3ludGggYXMgeyBwbHVnaW4/OiB7IG5hbWU/OiBzdHJpbmc7IHB1Ymxpc2hlcj86IHN0cmluZzsgYWxpYXM/OiBzdHJpbmc7IGZpbHRlcj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0gfSB8IHVuZGVmaW5lZCk/LnBsdWdpbjtcbiAgaWYgKCFyZWY/Lm5hbWUgfHwgIWlzTWFuYWdlZFRvb2xjaGFpblJlZihyZWYpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHBsdWdpbkFydGlmYWN0QWxpYXMocmVmIGFzIHsgbmFtZTogc3RyaW5nIH0pO1xufVxuXG4vKipcbiAqIEJvdGggaGFsdmVzIG9mIG9uZSByZWxlYXNlIG11c3QgYWdyZWUuIEEgbWFuYWdlZCBgY2RrLXN5bnRoYCB0aGF0IHJlc29sdmVkXG4gKiB0byBhIGRpZmZlcmVudCByZWxlYXNlIHRoYW4gdGhlIGJvb3RzdHJhcCBpcyByZWZ1c2VkIChuZXZlciBzZXJ2ZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0T25lUmVsZWFzZShib290c3RyYXA6IFJlc29sdmVkQm9vdHN0cmFwLCBzeW50aFRvb2xjaGFpbnM6IFJlY29yZDxzdHJpbmcsIExvb2t1cFRvb2xjaGFpbj4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBba2V5LCBzeW50aF0gb2YgT2JqZWN0LmVudHJpZXMoc3ludGhUb29sY2hhaW5zKSkge1xuICAgIGlmIChzeW50aC5yZWxlYXNlVmVyc2lvbiAhPT0gYm9vdHN0cmFwLnRvb2xjaGFpbi5yZWxlYXNlVmVyc2lvbikge1xuICAgICAgdGhyb3cgYm9vdHN0cmFwVW5yZXNvbHZlZChcbiAgICAgICAgYFRvb2xjaGFpbiBoYWx2ZXMgZGlzYWdyZWU6IHBpcGVsaW5lLWJvb3RzdHJhcCBpcyByZWxlYXNlICR7Ym9vdHN0cmFwLnRvb2xjaGFpbi5yZWxlYXNlVmVyc2lvbn0gYnV0IFwiJHtrZXl9XCIgaXMgJHtzeW50aC5yZWxlYXNlVmVyc2lvbn1gLFxuICAgICAgICBFcnJvckNvZGUuVE9PTENIQUlOX1BBSVJfTUlTTUFUQ0gsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoYWxmKHBsdWdpbjogUGx1Z2luUmVjb3JkKTogVG9vbGNoYWluRmlsZUhhbGYge1xuICBjb25zdCByZWMgPSBwbHVnaW4gYXMgUGx1Z2luUmVjb3JkICYgeyBpbWFnZVJlcG9zaXRvcnk/OiBzdHJpbmcgfCBudWxsOyBpbWFnZURpZ2VzdD86IHN0cmluZyB8IG51bGwgfTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiByZWMubmFtZSxcbiAgICB2ZXJzaW9uOiByZWMudmVyc2lvbixcbiAgICBpbWFnZVJlcG9zaXRvcnk6IHJlYy5pbWFnZVJlcG9zaXRvcnkgPz8gJycsXG4gICAgaW1hZ2VEaWdlc3Q6IHJlYy5pbWFnZURpZ2VzdCA/PyAnJyxcbiAgICBwbHVnaW4sXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBib3RoIGhhbHZlcyBvZiBhIHJlbGVhc2UgZm9yIGV4cG9ydDogYHJlbGVhc2VgIHdoZW4gZ2l2ZW4sIGVsc2VcbiAqIHdoYXRldmVyIHRoZSBjYWxsZXIncyBvcmcgcmVzb2x2ZXMgdG8gbm93IChpdHMgZGVmYXVsdCwgY2FuYXJ5IG9yIHRoZVxuICogcGxhdGZvcm0gZGVmYXVsdCkuIEJvdGggbG9va3VwcyBzZW5kIHRoZSBzYW1lIHBpbjsgd2hlbiBubyBwaW4gaXMgZ2l2ZW4gdGhlXG4gKiBib290c3RyYXAncyByZWxlYXNlIGJlY29tZXMgdGhlIHN5bnRoJ3MgcGluLCBzbyB0aGUgaGFsdmVzIGFsd2F5cyBtYXRjaC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cG9ydFRvb2xjaGFpbihjbGllbnQ6IEFwaUNsaWVudCwgcmVsZWFzZT86IHN0cmluZyk6IFByb21pc2U8VG9vbGNoYWluRmlsZT4ge1xuICBjb25zdCBib290c3RyYXAgPSBhd2FpdCBsb29rdXBNYW5hZ2VkKGNsaWVudCwgQk9PVFNUUkFQX1BMVUdJTiwgcmVsZWFzZSk7XG4gIGNvbnN0IHN5bnRoID0gYXdhaXQgbG9va3VwTWFuYWdlZChjbGllbnQsIFNZTlRIX1BMVUdJTiwgcmVsZWFzZSA/PyBib290c3RyYXAudG9vbGNoYWluLnJlbGVhc2VWZXJzaW9uKTtcbiAgYXNzZXJ0T25lUmVsZWFzZSh7IHBsdWdpbjogYm9vdHN0cmFwLnBsdWdpbiwgdG9vbGNoYWluOiBib290c3RyYXAudG9vbGNoYWluIH0sIHsgW1NZTlRIX1BMVUdJTl06IHN5bnRoLnRvb2xjaGFpbiB9KTtcbiAgcmV0dXJuIHtcbiAgICBmb3JtYXQ6IFRPT0xDSEFJTl9GSUxFX0ZPUk1BVCxcbiAgICByZWxlYXNlVmVyc2lvbjogYm9vdHN0cmFwLnRvb2xjaGFpbi5yZWxlYXNlVmVyc2lvbixcbiAgICByZXNvbHZlZFZpYTogYm9vdHN0cmFwLnRvb2xjaGFpbi5yZXNvbHZlZFZpYSxcbiAgICB0b29sY2hhaW46IHsgLi4uc3ludGgudG9vbGNoYWluLnZlcnNpb25zLCAuLi5ib290c3RyYXAudG9vbGNoYWluLnZlcnNpb25zIH0sXG4gICAgZXhwb3J0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIC4uLihjbGllbnQuZ2V0Q29uZmlnKCkuYXBpLmJhc2VVcmwgPyB7IHBsYXRmb3JtQmFzZVVybDogY2xpZW50LmdldENvbmZpZygpLmFwaS5iYXNlVXJsIH0gOiB7fSksXG4gICAgYm9vdHN0cmFwOiBoYWxmKGJvb3RzdHJhcC5wbHVnaW4pLFxuICAgIHN5bnRoOiBoYWxmKHN5bnRoLnBsdWdpbiksXG4gIH07XG59XG5cbmNvbnN0IEhPV19UT19FWFBPUlQgPSAnUHJvZHVjZSBvbmUgd2l0aCBgcGlwZWxpbmUtbWFuYWdlciB0b29sY2hhaW4gZXhwb3J0IC0tb3V0cHV0IHRvb2xjaGFpbi5qc29uYCAoYWRkIGAtLXJlbGVhc2UgPFY+YCB0byBwaW4gYSByZWxlYXNlKSAnXG4gICsgJ2FnYWluc3QgdGhlIHBsYXRmb3JtLCB0aGVuIHBhc3MgYC0tdG9vbGNoYWluLWZpbGUgdG9vbGNoYWluLmpzb25gLic7XG5cbi8qKiBUaGUgbG9jYWwtc3BlYyByZWZ1c2FsIHdoZW4gbm8gYC0tdG9vbGNoYWluLWZpbGVgIHdhcyBnaXZlbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b29sY2hhaW5GaWxlUmVxdWlyZWQoKTogUGx1Z2luUmVzb2x1dGlvbkVycm9yIHtcbiAgcmV0dXJuIGJvb3RzdHJhcFVucmVzb2x2ZWQoYC0tbG9jYWwtc3BlYyBkZXBsb3lzIHdpdGhvdXQgdGhlIHBsYXRmb3JtLCBzbyB0aGUgdG9vbGNoYWluIHJlbGVhc2UgbXVzdCBjb21lIGZyb20gLS10b29sY2hhaW4tZmlsZS4gJHtIT1dfVE9fRVhQT1JUfWApO1xufVxuXG5jb25zdCBESUdFU1RfUkUgPSAvXnNoYTI1NjpbMC05YS1mXXs2NH0kLztcblxuLyoqXG4gKiBSZWFkIGFuZCBjaGVjayBhIGB0b29sY2hhaW4gZXhwb3J0YCBmaWxlOiBib3RoIGhhbHZlcyBwcmVzZW50LCBuYW1lZCByaWdodCxcbiAqIGRpZ2VzdC1waW5uZWQsIGFuZCBvZiBvbmUgcmVsZWFzZS4gQW55IHByb2JsZW0gaXMgYEJPT1RTVFJBUF9JTUFHRV9VTlJFU09MVkVEYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRUb29sY2hhaW5GaWxlKGZpbGU6IHN0cmluZyk6IHsgYm9vdHN0cmFwOiBSZXNvbHZlZEJvb3RzdHJhcDsgc3ludGg6IFBsdWdpblJlY29yZDsgcGxhdGZvcm1CYXNlVXJsPzogc3RyaW5nIH0ge1xuICBjb25zdCBhYnMgPSBwYXRoLnJlc29sdmUoZmlsZSk7XG4gIGxldCByYXc6IHVua25vd247XG4gIHRyeSB7XG4gICAgcmF3ID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoYWJzLCAndXRmLTgnKSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IGJvb3RzdHJhcFVucmVzb2x2ZWQoYENhbid0IHJlYWQgLS10b29sY2hhaW4tZmlsZSAke2Fic306ICR7ZXJyb3JNZXNzYWdlKGVycil9LiAke0hPV19UT19FWFBPUlR9YCk7XG4gIH1cbiAgY29uc3QgYmFkID0gKHdoeTogc3RyaW5nKTogbmV2ZXIgPT4geyB0aHJvdyBib290c3RyYXBVbnJlc29sdmVkKGAtLXRvb2xjaGFpbi1maWxlICR7YWJzfSBpcyBub3QgYSB0b29sY2hhaW4gZXhwb3J0OiAke3doeX0uICR7SE9XX1RPX0VYUE9SVH1gKTsgfTtcbiAgY29uc3QgZiA9IHJhdyBhcyBQYXJ0aWFsPFRvb2xjaGFpbkZpbGU+IHwgbnVsbDtcbiAgaWYgKCFmIHx8IHR5cGVvZiBmICE9PSAnb2JqZWN0JykgYmFkKCdub3QgYSBKU09OIG9iamVjdCcpO1xuICBpZiAoZiEuZm9ybWF0ICE9PSBUT09MQ0hBSU5fRklMRV9GT1JNQVQpIGJhZChgdW5zdXBwb3J0ZWQgZm9ybWF0ICR7U3RyaW5nKGYhLmZvcm1hdCl9YCk7XG4gIGNvbnN0IHRvb2xjaGFpbiA9IHBhcnNlTG9va3VwVG9vbGNoYWluKHsgcmVsZWFzZVZlcnNpb246IGYhLnJlbGVhc2VWZXJzaW9uLCByZXNvbHZlZFZpYTogZiEucmVzb2x2ZWRWaWEsIHZlcnNpb25zOiBmIS50b29sY2hhaW4gfSk7XG4gIGlmICghdG9vbGNoYWluKSBiYWQoJ21pc3NpbmcgcmVsZWFzZVZlcnNpb24gLyByZXNvbHZlZFZpYScpO1xuICBjb25zdCBjaGVjayA9IChoOiBUb29sY2hhaW5GaWxlSGFsZiB8IHVuZGVmaW5lZCwgbmFtZTogc3RyaW5nKTogUGx1Z2luUmVjb3JkID0+IHtcbiAgICBpZiAoIWg/LnBsdWdpbiB8fCBoLnBsdWdpbi5uYW1lICE9PSBuYW1lIHx8IGgubmFtZSAhPT0gbmFtZSkgYmFkKGBtaXNzaW5nIHRoZSAke25hbWV9IGhhbGZgKTtcbiAgICBpZiAoaCEudmVyc2lvbiAhPT0gdG9vbGNoYWluIS5yZWxlYXNlVmVyc2lvbiB8fCBoIS5wbHVnaW4udmVyc2lvbiAhPT0gdG9vbGNoYWluIS5yZWxlYXNlVmVyc2lvbikgYmFkKGAke25hbWV9IGlzIG5vdCByZWxlYXNlICR7dG9vbGNoYWluIS5yZWxlYXNlVmVyc2lvbn1gKTtcbiAgICBjb25zdCByZWMgPSBoIS5wbHVnaW4gYXMgUGx1Z2luUmVjb3JkICYgeyBpbWFnZURpZ2VzdD86IHN0cmluZyB8IG51bGw7IGltYWdlUmVwb3NpdG9yeT86IHN0cmluZyB8IG51bGwgfTtcbiAgICBpZiAoIXJlYy5pbWFnZURpZ2VzdCB8fCAhRElHRVNUX1JFLnRlc3QocmVjLmltYWdlRGlnZXN0KSB8fCByZWMuaW1hZ2VEaWdlc3QgIT09IGghLmltYWdlRGlnZXN0KSBiYWQoYCR7bmFtZX0gaGFzIG5vIHNpZ25lZCBpbWFnZSBkaWdlc3RgKTtcbiAgICBpZiAocmVjLmltYWdlUmVwb3NpdG9yeSAhPT0gYHN5c3RlbS8ke25hbWV9YCB8fCBoIS5pbWFnZVJlcG9zaXRvcnkgIT09IHJlYy5pbWFnZVJlcG9zaXRvcnkpIGJhZChgJHtuYW1lfSBpcyBub3Qgc3lzdGVtLyR7bmFtZX1gKTtcbiAgICByZXR1cm4gaCEucGx1Z2luO1xuICB9O1xuICBjb25zdCBib290c3RyYXAgPSBjaGVjayhmIS5ib290c3RyYXAsIEJPT1RTVFJBUF9QTFVHSU4pO1xuICBjb25zdCBzeW50aCA9IGNoZWNrKGYhLnN5bnRoLCBTWU5USF9QTFVHSU4pO1xuICBjb25zdCBwbGF0Zm9ybUJhc2VVcmwgPSB0eXBlb2YgZiEucGxhdGZvcm1CYXNlVXJsID09PSAnc3RyaW5nJyAmJiBmIS5wbGF0Zm9ybUJhc2VVcmwubGVuZ3RoID4gMCA/IGYhLnBsYXRmb3JtQmFzZVVybCA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHsgYm9vdHN0cmFwOiB7IHBsdWdpbjogYm9vdHN0cmFwLCB0b29sY2hhaW46IHRvb2xjaGFpbiEgfSwgc3ludGgsIC4uLihwbGF0Zm9ybUJhc2VVcmwgJiYgeyBwbGF0Zm9ybUJhc2VVcmwgfSkgfTtcbn1cblxuLyoqXG4gKiBBcHBseSBhIHRvb2xjaGFpbiBmaWxlIHRvIGxvY2FsLXNwZWMgcHJvcHM6IHRoZSBib290c3RyYXAgYXNcbiAqIGByZXNvbHZlZEJvb3RzdHJhcGAsIHRoZSBleHBvcnRpbmcgcGxhdGZvcm0gYXMgdGhlIHJlZ2lzdHJ5IHB1bGwgaG9zdCwgYW5kIOKAlFxuICogd2hlbiB0aGUgc3ludGggcGx1Z2luIGlzIHRoZSBtYW5hZ2VkIGBjZGstc3ludGhgIOKAlCB0aGUgZXhwb3J0ZWQgc3ludGggaGFsZlxuICogYXMgaXRzIHByZS1yZXNvbHZlZCBwbHVnaW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVRvb2xjaGFpbkZpbGUocHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBmaWxlOiBzdHJpbmcpOiBUb29sY2hhaW5GaWxlWydyZWxlYXNlVmVyc2lvbiddIHtcbiAgY29uc3QgeyBib290c3RyYXAsIHN5bnRoLCBwbGF0Zm9ybUJhc2VVcmwgfSA9IHJlYWRUb29sY2hhaW5GaWxlKGZpbGUpO1xuICBjb25zdCBwaW4gPSB0b29sY2hhaW5SZWxlYXNlUGluKHByb3BzKTtcbiAgaWYgKHBpbiAmJiBwaW4gIT09IGJvb3RzdHJhcC50b29sY2hhaW4ucmVsZWFzZVZlcnNpb24pIHtcbiAgICB0aHJvdyBib290c3RyYXBVbnJlc29sdmVkKFxuICAgICAgYFRoZSBwaXBlbGluZSBwaW5zIHRvb2xjaGFpbiByZWxlYXNlICR7cGlufSBidXQgLS10b29sY2hhaW4tZmlsZSBob2xkcyAke2Jvb3RzdHJhcC50b29sY2hhaW4ucmVsZWFzZVZlcnNpb259LiBgXG4gICAgICArIGBFeHBvcnQgdGhlIHBpbm5lZCBvbmU6IFxcYHBpcGVsaW5lLW1hbmFnZXIgdG9vbGNoYWluIGV4cG9ydCAtLXJlbGVhc2UgJHtwaW59XFxgLmAsXG4gICAgICBFcnJvckNvZGUuVE9PTENIQUlOX1BBSVJfTUlTTUFUQ0gsXG4gICAgKTtcbiAgfVxuICBwcm9wcy5yZXNvbHZlZEJvb3RzdHJhcCA9IGJvb3RzdHJhcDtcbiAgYmFrZVBsYXRmb3JtUmVnaXN0cnkocHJvcHMsIHBsYXRmb3JtQmFzZVVybCk7XG4gIGNvbnN0IHN5bnRoS2V5ID0gbWFuYWdlZFN5bnRoS2V5KHByb3BzKTtcbiAgaWYgKHN5bnRoS2V5KSB7XG4gICAgcHJvcHMucmVzb2x2ZWRQbHVnaW5zID0geyAuLi4ocHJvcHMucmVzb2x2ZWRQbHVnaW5zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKSwgW3N5bnRoS2V5XTogc3ludGggfTtcbiAgfVxuICByZXR1cm4gYm9vdHN0cmFwLnRvb2xjaGFpbi5yZWxlYXNlVmVyc2lvbjtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -33,9 +33,9 @@
|
|
|
33
33
|
"@aws-sdk/client-secrets-manager": "3.1160.0",
|
|
34
34
|
"@aws-sdk/client-sqs": "3.1160.0",
|
|
35
35
|
"@aws-sdk/client-sts": "3.1160.0",
|
|
36
|
-
"@pipeline-builder/ai-core": "4.3.
|
|
37
|
-
"@pipeline-builder/api-core": "5.2.
|
|
38
|
-
"@pipeline-builder/pipeline-core": "4.4.
|
|
36
|
+
"@pipeline-builder/ai-core": "4.3.12",
|
|
37
|
+
"@pipeline-builder/api-core": "5.2.12",
|
|
38
|
+
"@pipeline-builder/pipeline-core": "4.4.13",
|
|
39
39
|
"aws-cdk-lib": "2.275.0",
|
|
40
40
|
"axios": "1.21.1",
|
|
41
41
|
"commander": "15.1.0",
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
"registry": "https://registry.npmjs.org/",
|
|
107
107
|
"provenance": true
|
|
108
108
|
},
|
|
109
|
-
"version": "4.5.
|
|
109
|
+
"version": "4.5.4",
|
|
110
110
|
"bugs": {
|
|
111
111
|
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
112
112
|
},
|