@pipeline-builder/pipeline-core 4.4.11 → 4.4.12

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.
@@ -2,12 +2,66 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  /** Severities, least to most serious. */
4
4
  export const LOOKUP_WARNING_SEVERITIES = ['info', 'warning', 'error', 'critical'];
5
+ export const TOOLCHAIN_RESOLVED_VIA = ['pin', 'org-default', 'canary', 'default'];
6
+ const TOOLCHAIN_VERSION_KEYS = ['pipelineManager', 'awsCdk', 'cdkAssets', 'esbuild', 'pnpm', 'node'];
7
+ /** Pick the string tool versions off an object (unknown keys and non-strings ignored). */
8
+ function pickVersions(raw) {
9
+ if (!raw || typeof raw !== 'object')
10
+ return {};
11
+ const out = {};
12
+ for (const key of TOOLCHAIN_VERSION_KEYS) {
13
+ const v = raw[key];
14
+ if (typeof v === 'string' && v.length > 0)
15
+ out[key] = v;
16
+ }
17
+ return out;
18
+ }
19
+ /**
20
+ * The flat `metadata` key prefix the platform persists a build image's
21
+ * `toolchain` under (`toolchain.awsCdk`, …; api-core `TOOLCHAIN_METADATA_PREFIX`,
22
+ * repeated here so this module stays dependency-free).
23
+ */
24
+ const TOOLCHAIN_METADATA_PREFIX = 'toolchain.';
25
+ /** The tool versions a plugin row's `metadata` carries as flat `toolchain.<field>` keys. */
26
+ function versionsFromMetadata(metadata) {
27
+ if (!metadata || typeof metadata !== 'object')
28
+ return {};
29
+ const fields = {};
30
+ for (const [k, v] of Object.entries(metadata)) {
31
+ if (k.startsWith(TOOLCHAIN_METADATA_PREFIX))
32
+ fields[k.slice(TOOLCHAIN_METADATA_PREFIX.length)] = v;
33
+ }
34
+ return pickVersions(fields);
35
+ }
36
+ /**
37
+ * Parse a lookup's `toolchain` block. Null unless it carries a release version
38
+ * and a known `resolvedVia`. Tool versions come from, lowest precedence first:
39
+ * the plugin row's `metadata` (`toolchain.<field>` keys, where the platform
40
+ * persists the bootstrap spec's `toolchain`), the record's own `toolchain`,
41
+ * the block's flat fields, then `toolchain.versions`.
42
+ */
43
+ export function parseLookupToolchain(raw, plugin) {
44
+ if (!raw || typeof raw !== 'object')
45
+ return null;
46
+ const { releaseVersion, resolvedVia, versions } = raw;
47
+ if (typeof releaseVersion !== 'string' || releaseVersion.length === 0)
48
+ return null;
49
+ if (!TOOLCHAIN_RESOLVED_VIA.includes(resolvedVia))
50
+ return null;
51
+ const rec = plugin && typeof plugin === 'object' ? plugin : undefined;
52
+ return {
53
+ releaseVersion,
54
+ resolvedVia: resolvedVia,
55
+ versions: { ...versionsFromMetadata(rec?.metadata), ...pickVersions(rec?.toolchain), ...pickVersions(raw), ...pickVersions(versions) },
56
+ };
57
+ }
5
58
  /**
6
59
  * Unwrap a `/plugins/lookup` answer. The platform's success envelope is
7
60
  * `{ success, statusCode, data: { plugin, warnings } }` (note the double
8
61
  * nesting: `data.plugin`); `{ data: Plugin }`, `{ plugin }` and a bare Plugin
9
62
  * are tolerated too. Returns the plugin (null when absent or nameless) and the
10
- * graded warnings (lifecycle, vulnerability, compliance) that ride beside it.
63
+ * graded warnings (lifecycle, vulnerability, compliance) that ride beside it,
64
+ * and — for a managed toolchain name — the release it resolved to (`toolchain`).
11
65
  *
12
66
  * Dependency-free (type-only imports) so the plugin-lookup Lambda can bundle it.
13
67
  */
@@ -36,7 +90,8 @@ export function unwrapLookup(body) {
36
90
  });
37
91
  }
38
92
  }
39
- return { plugin, warnings };
93
+ const toolchain = parseLookupToolchain(container.toolchain, plugin);
94
+ return { plugin, warnings, ...(toolchain && { toolchain }) };
40
95
  }
41
96
  /**
42
97
  * One line summarizing graded warnings, most serious first —
@@ -77,4 +132,4 @@ export function exactPinNotFoundMessage(label, pin, state) {
77
132
  default: return `Plugin "${label}" version ${pin} does not exist (never published, or refused by its build's vulnerability scan)`;
78
133
  }
79
134
  }
80
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxvb2t1cC1lbnZlbG9wZS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvcGx1Z2luLWxvb2t1cC1lbnZlbG9wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBT3RDLHlDQUF5QztBQUN6QyxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBcUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQVVwSDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBYTtJQUN4QyxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDN0UsTUFBTSxLQUFLLEdBQUksSUFBMkIsQ0FBQyxJQUFJLENBQUM7SUFDaEQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBNkMsQ0FBQztJQUNsSCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQztJQUNoRCxNQUFNLE1BQU0sR0FBRyxTQUFTLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQVEsU0FBZ0MsQ0FBQyxJQUFJLEtBQUssUUFBUTtXQUNqSCxTQUE4QixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUNsRCxDQUFDLENBQUMsU0FBbUI7UUFDckIsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNULE1BQU0sUUFBUSxHQUFvQixFQUFFLENBQUM7SUFDckMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3RDLEtBQUssTUFBTSxDQUFDLElBQUksU0FB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QUFFLEtBQWlDO0lBQ25HLFFBQVEsS0FBSyxFQUFFLENBQUM7UUFDZCxLQUFLLFNBQVMsRUFBRSxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcscUNBQXFDLENBQUM7UUFDN0YsS0FBSyxVQUFVLEVBQUUsT0FBTyxXQUFXLEtBQUssYUFBYSxHQUFHLGNBQWMsQ0FBQztRQUN2RSxLQUFLLFFBQVEsRUFBRSxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ3BFLEtBQUssU0FBUyxFQUFFLE9BQU8sV0FBVyxLQUFLLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQztRQUN6RSxTQUFTLE9BQU8sV0FBVyxLQUFLLGFBQWEsR0FBRyxpRkFBaUYsQ0FBQztJQUNwSSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuXG4vKiogSG93IHNlcmlvdXMgYSBsb29rdXAgd2FybmluZyBpcyAodnVsbmVyYWJpbGl0eSBzdGF0ZSBpcyBncmFkZWQsIG5ldmVyIHJlZnVzZWQpLiAqL1xuZXhwb3J0IHR5cGUgTG9va3VwV2FybmluZ1NldmVyaXR5ID0gJ2luZm8nIHwgJ3dhcm5pbmcnIHwgJ2Vycm9yJyB8ICdjcml0aWNhbCc7XG5cbi8qKiBTZXZlcml0aWVzLCBsZWFzdCB0byBtb3N0IHNlcmlvdXMuICovXG5leHBvcnQgY29uc3QgTE9PS1VQX1dBUk5JTkdfU0VWRVJJVElFUzogcmVhZG9ubHkgTG9va3VwV2FybmluZ1NldmVyaXR5W10gPSBbJ2luZm8nLCAnd2FybmluZycsICdlcnJvcicsICdjcml0aWNhbCddO1xuXG4vKiogT25lIHdhcm5pbmcgcmlkaW5nIGJlc2lkZSBhIHJlc29sdmVkIHBsdWdpbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9va3VwV2FybmluZyB7XG4gIHJlYWRvbmx5IGNvZGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIEFic2VudCBvbiB0aGUgd2lyZSDihpIgYHdhcm5pbmdgLiAqL1xuICByZWFkb25seSBzZXZlcml0eTogTG9va3VwV2FybmluZ1NldmVyaXR5O1xufVxuXG4vKipcbiAqIFVud3JhcCBhIGAvcGx1Z2lucy9sb29rdXBgIGFuc3dlci4gVGhlIHBsYXRmb3JtJ3Mgc3VjY2VzcyBlbnZlbG9wZSBpc1xuICogYHsgc3VjY2Vzcywgc3RhdHVzQ29kZSwgZGF0YTogeyBwbHVnaW4sIHdhcm5pbmdzIH0gfWAgKG5vdGUgdGhlIGRvdWJsZVxuICogbmVzdGluZzogYGRhdGEucGx1Z2luYCk7IGB7IGRhdGE6IFBsdWdpbiB9YCwgYHsgcGx1Z2luIH1gIGFuZCBhIGJhcmUgUGx1Z2luXG4gKiBhcmUgdG9sZXJhdGVkIHRvby4gUmV0dXJucyB0aGUgcGx1Z2luIChudWxsIHdoZW4gYWJzZW50IG9yIG5hbWVsZXNzKSBhbmQgdGhlXG4gKiBncmFkZWQgd2FybmluZ3MgKGxpZmVjeWNsZSwgdnVsbmVyYWJpbGl0eSwgY29tcGxpYW5jZSkgdGhhdCByaWRlIGJlc2lkZSBpdC5cbiAqXG4gKiBEZXBlbmRlbmN5LWZyZWUgKHR5cGUtb25seSBpbXBvcnRzKSBzbyB0aGUgcGx1Z2luLWxvb2t1cCBMYW1iZGEgY2FuIGJ1bmRsZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcExvb2t1cChib2R5OiB1bmtub3duKTogeyBwbHVnaW46IFBsdWdpbiB8IG51bGw7IHdhcm5pbmdzOiBMb29rdXBXYXJuaW5nW10gfSB7XG4gIGlmICghYm9keSB8fCB0eXBlb2YgYm9keSAhPT0gJ29iamVjdCcpIHJldHVybiB7IHBsdWdpbjogbnVsbCwgd2FybmluZ3M6IFtdIH07XG4gIGNvbnN0IGlubmVyID0gKGJvZHkgYXMgeyBkYXRhPzogdW5rbm93biB9KS5kYXRhO1xuICBjb25zdCBjb250YWluZXIgPSAoaW5uZXIgJiYgdHlwZW9mIGlubmVyID09PSAnb2JqZWN0JyA/IGlubmVyIDogYm9keSkgYXMgeyBwbHVnaW4/OiB1bmtub3duOyB3YXJuaW5ncz86IHVua25vd24gfTtcbiAgY29uc3QgY2FuZGlkYXRlID0gY29udGFpbmVyLnBsdWdpbiA/PyBjb250YWluZXI7XG4gIGNvbnN0IHBsdWdpbiA9IGNhbmRpZGF0ZSAmJiB0eXBlb2YgY2FuZGlkYXRlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgKGNhbmRpZGF0ZSBhcyB7IG5hbWU/OiB1bmtub3duIH0pLm5hbWUgPT09ICdzdHJpbmcnXG4gICAgJiYgKGNhbmRpZGF0ZSBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lLmxlbmd0aCA+IDBcbiAgICA/IGNhbmRpZGF0ZSBhcyBQbHVnaW5cbiAgICA6IG51bGw7XG4gIGNvbnN0IHdhcm5pbmdzOiBMb29rdXBXYXJuaW5nW10gPSBbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyLndhcm5pbmdzKSkge1xuICAgIGZvciAoY29uc3QgdyBvZiBjb250YWluZXIud2FybmluZ3MpIHtcbiAgICAgIGlmICghdyB8fCB0eXBlb2YgdyAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgeyBjb2RlLCBtZXNzYWdlLCBzZXZlcml0eSB9ID0gdyBhcyB7IGNvZGU/OiB1bmtub3duOyBtZXNzYWdlPzogdW5rbm93bjsgc2V2ZXJpdHk/OiB1bmtub3duIH07XG4gICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgIT09ICdzdHJpbmcnIHx8IG1lc3NhZ2UubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAuLi4odHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnID8geyBjb2RlIH0gOiB7fSksXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHNldmVyaXR5OiAoTE9PS1VQX1dBUk5JTkdfU0VWRVJJVElFUyBhcyByZWFkb25seSB1bmtub3duW10pLmluY2x1ZGVzKHNldmVyaXR5KSA/IHNldmVyaXR5IGFzIExvb2t1cFdhcm5pbmdTZXZlcml0eSA6ICd3YXJuaW5nJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBwbHVnaW4sIHdhcm5pbmdzIH07XG59XG5cbi8qKlxuICogT25lIGxpbmUgc3VtbWFyaXppbmcgZ3JhZGVkIHdhcm5pbmdzLCBtb3N0IHNlcmlvdXMgZmlyc3Qg4oCUXG4gKiBgMyBwbHVnaW4gd2FybmluZ3M6IDEgY3JpdGljYWwsIDIgZXJyb3JgLiBOdWxsIHdoZW4gdGhlcmUgYXJlIG5vbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdW1tYXJpemVMb29rdXBXYXJuaW5ncyh3YXJuaW5nczogcmVhZG9ubHkgUGljazxMb29rdXBXYXJuaW5nLCAnc2V2ZXJpdHknPltdKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICBjb25zdCBwYXJ0cyA9IFsuLi5MT09LVVBfV0FSTklOR19TRVZFUklUSUVTXS5yZXZlcnNlKClcbiAgICAubWFwKChzZXYpID0+IFtzZXYsIHdhcm5pbmdzLmZpbHRlcigodykgPT4gdy5zZXZlcml0eSA9PT0gc2V2KS5sZW5ndGhdIGFzIGNvbnN0KVxuICAgIC5maWx0ZXIoKFssIG5dKSA9PiBuID4gMClcbiAgICAubWFwKChbc2V2LCBuXSkgPT4gYCR7bn0gJHtzZXZ9YCk7XG4gIHJldHVybiBgJHt3YXJuaW5ncy5sZW5ndGh9IHBsdWdpbiB3YXJuaW5nJHt3YXJuaW5ncy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ306ICR7cGFydHMuam9pbignLCAnKX1gO1xufVxuXG4vKiogV2h5IGEgbG9va3VwIGZvdW5kIG5vdGhpbmcsIGFzIHRoZSBwbHVnaW4gc2VydmljZSdzIDQwNCBgZGV0YWlscy5zdGF0ZWAgcmVwb3J0cyBpdC4gKi9cbmV4cG9ydCB0eXBlIExvb2t1cE5vdEZvdW5kU3RhdGUgPSAnZGVsZXRlZCcgfCAnaW5hY3RpdmUnIHwgJ3lhbmtlZCcgfCAnbWlzc2luZyc7XG5cbmNvbnN0IE5PVF9GT1VORF9TVEFURVM6IHJlYWRvbmx5IExvb2t1cE5vdEZvdW5kU3RhdGVbXSA9IFsnZGVsZXRlZCcsICdpbmFjdGl2ZScsICd5YW5rZWQnLCAnbWlzc2luZyddO1xuXG4vKipcbiAqIGBkZXRhaWxzLnN0YXRlYCBvZiBhIHJlZnVzZWQgbG9va3VwLCByZWFkIG9mZiBlaXRoZXIgYW4gYXhpb3Mtc3R5bGUgZXJyb3JcbiAqIChgZXJyLnJlc3BvbnNlLmRhdGFgKSBvciB0aGUgcmVzcG9uc2UgYm9keSBpdHNlbGYuIE51bGwgd2hlbiBhYnNlbnQvdW5rbm93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvb2t1cE5vdEZvdW5kU3RhdGUoZXJyT3JCb2R5OiB1bmtub3duKTogTG9va3VwTm90Rm91bmRTdGF0ZSB8IG51bGwge1xuICBpZiAoIWVyck9yQm9keSB8fCB0eXBlb2YgZXJyT3JCb2R5ICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGRhdGEgPSAoZXJyT3JCb2R5IGFzIHsgcmVzcG9uc2U/OiB7IGRhdGE/OiB1bmtub3duIH0gfSkucmVzcG9uc2U/LmRhdGEgPz8gZXJyT3JCb2R5O1xuICBjb25zdCBkZXRhaWxzID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyAoZGF0YSBhcyB7IGRldGFpbHM/OiB1bmtub3duIH0pLmRldGFpbHMgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXRlID0gZGV0YWlscyAmJiB0eXBlb2YgZGV0YWlscyA9PT0gJ29iamVjdCcgPyAoZGV0YWlscyBhcyB7IHN0YXRlPzogdW5rbm93biB9KS5zdGF0ZSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gJ3N0cmluZycgJiYgKE5PVF9GT1VORF9TVEFURVMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHN0YXRlKSA/IHN0YXRlIGFzIExvb2t1cE5vdEZvdW5kU3RhdGUgOiBudWxsO1xufVxuXG4vKipcbiAqIFRoZSBtZXNzYWdlIGZvciBhbiBleGFjdCB2ZXJzaW9uIHBpbiB0aGF0IGRpZCBub3QgcmVzb2x2ZS4gU2hhcmVkIGJ5IHRoZVxuICogQ0xJJ3MgcHJlLXJlc29sdXRpb24gYW5kIHRoZSBkZXBsb3ktdGltZSBMYW1iZGEncyBDbG91ZEZvcm1hdGlvbiByZWFzb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGFjdFBpbk5vdEZvdW5kTWVzc2FnZShsYWJlbDogc3RyaW5nLCBwaW46IHN0cmluZywgc3RhdGU6IExvb2t1cE5vdEZvdW5kU3RhdGUgfCBudWxsKTogc3RyaW5nIHtcbiAgc3dpdGNoIChzdGF0ZSkge1xuICAgIGNhc2UgJ2RlbGV0ZWQnOiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gd2FzIGRlbGV0ZWQgZnJvbSB5b3VyIG9yZ2FuaXphdGlvbmA7XG4gICAgY2FzZSAnaW5hY3RpdmUnOiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gaXMgaW5hY3RpdmVgO1xuICAgIGNhc2UgJ3lhbmtlZCc6IHJldHVybiBgUGx1Z2luIFwiJHtsYWJlbH1cIiB2ZXJzaW9uICR7cGlufSB3YXMgeWFua2VkYDtcbiAgICBjYXNlICdtaXNzaW5nJzogcmV0dXJuIGBQbHVnaW4gXCIke2xhYmVsfVwiIHZlcnNpb24gJHtwaW59IGRvZXMgbm90IGV4aXN0YDtcbiAgICBkZWZhdWx0OiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gZG9lcyBub3QgZXhpc3QgKG5ldmVyIHB1Ymxpc2hlZCwgb3IgcmVmdXNlZCBieSBpdHMgYnVpbGQncyB2dWxuZXJhYmlsaXR5IHNjYW4pYDtcbiAgfVxufVxuIl19
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxvb2t1cC1lbnZlbG9wZS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvcGx1Z2luLWxvb2t1cC1lbnZlbG9wZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBT3RDLHlDQUF5QztBQUN6QyxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBcUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQWFwSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBb0MsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQVluSCxNQUFNLHNCQUFzQixHQUF5QyxDQUFDLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQXlCM0ksMEZBQTBGO0FBQzFGLFNBQVMsWUFBWSxDQUFDLEdBQVk7SUFDaEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDL0MsTUFBTSxHQUFHLEdBQTJCLEVBQUUsQ0FBQztJQUN2QyxLQUFLLE1BQU0sR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7UUFDekMsTUFBTSxDQUFDLEdBQUksR0FBK0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSx5QkFBeUIsR0FBRyxZQUFZLENBQUM7QUFFL0MsNEZBQTRGO0FBQzVGLFNBQVMsb0JBQW9CLENBQUMsUUFBaUI7SUFDN0MsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDekQsTUFBTSxNQUFNLEdBQTRCLEVBQUUsQ0FBQztJQUMzQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFtQyxDQUFDLEVBQUUsQ0FBQztRQUN6RSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUM7WUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsT0FBTyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxHQUFZLEVBQUUsTUFBZ0I7SUFDakUsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDakQsTUFBTSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBOEUsQ0FBQztJQUNqSSxJQUFJLE9BQU8sY0FBYyxLQUFLLFFBQVEsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNuRixJQUFJLENBQUUsc0JBQTZDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZGLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQXFELENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNySCxPQUFPO1FBQ0wsY0FBYztRQUNkLFdBQVcsRUFBRSxXQUFtQztRQUNoRCxRQUFRLEVBQUUsRUFBRSxHQUFHLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUU7S0FDdkksQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQWE7SUFDeEMsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1FBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQzdFLE1BQU0sS0FBSyxHQUFJLElBQTJCLENBQUMsSUFBSSxDQUFDO0lBQ2hELE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQWtFLENBQUM7SUFDdkksTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUM7SUFDaEQsTUFBTSxNQUFNLEdBQUcsU0FBUyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxPQUFRLFNBQWdDLENBQUMsSUFBSSxLQUFLLFFBQVE7V0FDakgsU0FBOEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUM7UUFDbEQsQ0FBQyxDQUFDLFNBQW1CO1FBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDVCxNQUFNLFFBQVEsR0FBb0IsRUFBRSxDQUFDO0lBQ3JDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN0QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7Z0JBQUUsU0FBUztZQUMxQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUE4RCxDQUFDO1lBQ25HLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxTQUFTO1lBQ2xFLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ1osR0FBRyxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxPQUFPO2dCQUNQLFFBQVEsRUFBRyx5QkFBZ0QsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQWlDLENBQUMsQ0FBQyxDQUFDLFNBQVM7YUFDL0gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFDRCxNQUFNLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDL0QsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxRQUFvRDtJQUMxRixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZDLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyx5QkFBeUIsQ0FBQyxDQUFDLE9BQU8sRUFBRTtTQUNuRCxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFVLENBQUM7U0FDL0UsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxrQkFBa0IsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNyRyxDQUFDO0FBS0QsTUFBTSxnQkFBZ0IsR0FBbUMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUV0Rzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsU0FBa0I7SUFDcEQsSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDN0QsTUFBTSxJQUFJLEdBQUksU0FBK0MsQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FBQztJQUMxRixNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBRSxJQUE4QixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZHLE1BQU0sS0FBSyxHQUFHLE9BQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFFLE9BQStCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDMUcsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUssZ0JBQXNDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUE0QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEksQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLEtBQWlDO0lBQ25HLFFBQVEsS0FBSyxFQUFFLENBQUM7UUFDZCxLQUFLLFNBQVMsRUFBRSxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcscUNBQXFDLENBQUM7UUFDN0YsS0FBSyxVQUFVLEVBQUUsT0FBTyxXQUFXLEtBQUssYUFBYSxHQUFHLGNBQWMsQ0FBQztRQUN2RSxLQUFLLFFBQVEsRUFBRSxPQUFPLFdBQVcsS0FBSyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ3BFLEtBQUssU0FBUyxFQUFFLE9BQU8sV0FBVyxLQUFLLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQztRQUN6RSxTQUFTLE9BQU8sV0FBVyxLQUFLLGFBQWEsR0FBRyxpRkFBaUYsQ0FBQztJQUNwSSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuXG4vKiogSG93IHNlcmlvdXMgYSBsb29rdXAgd2FybmluZyBpcyAodnVsbmVyYWJpbGl0eSBzdGF0ZSBpcyBncmFkZWQsIG5ldmVyIHJlZnVzZWQpLiAqL1xuZXhwb3J0IHR5cGUgTG9va3VwV2FybmluZ1NldmVyaXR5ID0gJ2luZm8nIHwgJ3dhcm5pbmcnIHwgJ2Vycm9yJyB8ICdjcml0aWNhbCc7XG5cbi8qKiBTZXZlcml0aWVzLCBsZWFzdCB0byBtb3N0IHNlcmlvdXMuICovXG5leHBvcnQgY29uc3QgTE9PS1VQX1dBUk5JTkdfU0VWRVJJVElFUzogcmVhZG9ubHkgTG9va3VwV2FybmluZ1NldmVyaXR5W10gPSBbJ2luZm8nLCAnd2FybmluZycsICdlcnJvcicsICdjcml0aWNhbCddO1xuXG4vKiogT25lIHdhcm5pbmcgcmlkaW5nIGJlc2lkZSBhIHJlc29sdmVkIHBsdWdpbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9va3VwV2FybmluZyB7XG4gIHJlYWRvbmx5IGNvZGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIEFic2VudCBvbiB0aGUgd2lyZSDihpIgYHdhcm5pbmdgLiAqL1xuICByZWFkb25seSBzZXZlcml0eTogTG9va3VwV2FybmluZ1NldmVyaXR5O1xufVxuXG4vKiogSG93IGEgbWFuYWdlZCB0b29sY2hhaW4gcmVsZWFzZSB3YXMgY2hvc2VuIGZvciB0aGUgY2FsbGVyIChuZXZlciBhbnl0aGluZyBhYm91dCBvdGhlciBvcmdzKS4gKi9cbmV4cG9ydCB0eXBlIFRvb2xjaGFpblJlc29sdmVkVmlhID0gJ3BpbicgfCAnb3JnLWRlZmF1bHQnIHwgJ2NhbmFyeScgfCAnZGVmYXVsdCc7XG5cbmV4cG9ydCBjb25zdCBUT09MQ0hBSU5fUkVTT0xWRURfVklBOiByZWFkb25seSBUb29sY2hhaW5SZXNvbHZlZFZpYVtdID0gWydwaW4nLCAnb3JnLWRlZmF1bHQnLCAnY2FuYXJ5JywgJ2RlZmF1bHQnXTtcblxuLyoqIFRoZSBleGFjdCB0b29sIHZlcnNpb25zIGEgdG9vbGNoYWluIHJlbGVhc2UgY2FycmllcyAodGhlIGJvb3RzdHJhcCBzcGVjJ3MgYHRvb2xjaGFpbmApLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sY2hhaW5WZXJzaW9ucyB7XG4gIHJlYWRvbmx5IHBpcGVsaW5lTWFuYWdlcj86IHN0cmluZztcbiAgcmVhZG9ubHkgYXdzQ2RrPzogc3RyaW5nO1xuICByZWFkb25seSBjZGtBc3NldHM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVzYnVpbGQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBucG0/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5vZGU/OiBzdHJpbmc7XG59XG5cbmNvbnN0IFRPT0xDSEFJTl9WRVJTSU9OX0tFWVM6IHJlYWRvbmx5IChrZXlvZiBUb29sY2hhaW5WZXJzaW9ucylbXSA9IFsncGlwZWxpbmVNYW5hZ2VyJywgJ2F3c0NkaycsICdjZGtBc3NldHMnLCAnZXNidWlsZCcsICdwbnBtJywgJ25vZGUnXTtcblxuLyoqXG4gKiBUaGUgcmVsZWFzZSBhIG1hbmFnZWQtbmFtZSBsb29rdXAgKGBwaXBlbGluZS1ib290c3RyYXBgLCBgY2RrLXN5bnRoYClcbiAqIHJlc29sdmVkIHRvOiBgZGF0YS50b29sY2hhaW5gIG9mIHRoZSBgL3BsdWdpbnMvbG9va3VwYCBhbnN3ZXIuIGB2ZXJzaW9uc2BcbiAqIGhvbGRzIHRoZSB0b29sIHZlcnNpb25zIHdoZW4gdGhlIGFuc3dlciAob3IgdGhlIHBsdWdpbiByZWNvcmQpIGNhcnJpZXMgdGhlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb29rdXBUb29sY2hhaW4ge1xuICByZWFkb25seSByZWxlYXNlVmVyc2lvbjogc3RyaW5nO1xuICByZWFkb25seSByZXNvbHZlZFZpYTogVG9vbGNoYWluUmVzb2x2ZWRWaWE7XG4gIHJlYWRvbmx5IHZlcnNpb25zOiBUb29sY2hhaW5WZXJzaW9ucztcbn1cblxuLyoqXG4gKiBUaGUgcmVzb2x2ZWQgYHBpcGVsaW5lLWJvb3RzdHJhcGAgaGFsZiBvZiBhIHRvb2xjaGFpbiByZWxlYXNlOiB0aGUgcGx1Z2luXG4gKiByZWNvcmQgdGhlIGRlZmF1bHQgQ29kZUJ1aWxkIGltYWdlIGlzIHBpbm5lZCB0byAoYnkgaXRzIHNpZ25lZCBkaWdlc3QpIGFuZFxuICogdGhlIHJlbGVhc2UgaXQgY2FtZSBmcm9tLiBQcm9kdWNlZCBieSBgcGlwZWxpbmUtbWFuYWdlcmAnc1xuICogYHJlc29sdmVCb290c3RyYXBJbWFnZWAgKG9yIGEgYC0tdG9vbGNoYWluLWZpbGVgKSBhbmQgcGFzc2VkIHRvXG4gKiBgUGlwZWxpbmVCdWlsZGVyYCBhcyBgcmVzb2x2ZWRCb290c3RyYXBgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkQm9vdHN0cmFwIHtcbiAgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG4gIHJlYWRvbmx5IHRvb2xjaGFpbjogTG9va3VwVG9vbGNoYWluO1xufVxuXG4vKiogUGljayB0aGUgc3RyaW5nIHRvb2wgdmVyc2lvbnMgb2ZmIGFuIG9iamVjdCAodW5rbm93biBrZXlzIGFuZCBub24tc3RyaW5ncyBpZ25vcmVkKS4gKi9cbmZ1bmN0aW9uIHBpY2tWZXJzaW9ucyhyYXc6IHVua25vd24pOiBUb29sY2hhaW5WZXJzaW9ucyB7XG4gIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09ICdvYmplY3QnKSByZXR1cm4ge307XG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBUT09MQ0hBSU5fVkVSU0lPTl9LRVlTKSB7XG4gICAgY29uc3QgdiA9IChyYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2Lmxlbmd0aCA+IDApIG91dFtrZXldID0gdjtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFRoZSBmbGF0IGBtZXRhZGF0YWAga2V5IHByZWZpeCB0aGUgcGxhdGZvcm0gcGVyc2lzdHMgYSBidWlsZCBpbWFnZSdzXG4gKiBgdG9vbGNoYWluYCB1bmRlciAoYHRvb2xjaGFpbi5hd3NDZGtgLCDigKY7IGFwaS1jb3JlIGBUT09MQ0hBSU5fTUVUQURBVEFfUFJFRklYYCxcbiAqIHJlcGVhdGVkIGhlcmUgc28gdGhpcyBtb2R1bGUgc3RheXMgZGVwZW5kZW5jeS1mcmVlKS5cbiAqL1xuY29uc3QgVE9PTENIQUlOX01FVEFEQVRBX1BSRUZJWCA9ICd0b29sY2hhaW4uJztcblxuLyoqIFRoZSB0b29sIHZlcnNpb25zIGEgcGx1Z2luIHJvdydzIGBtZXRhZGF0YWAgY2FycmllcyBhcyBmbGF0IGB0b29sY2hhaW4uPGZpZWxkPmAga2V5cy4gKi9cbmZ1bmN0aW9uIHZlcnNpb25zRnJvbU1ldGFkYXRhKG1ldGFkYXRhOiB1bmtub3duKTogVG9vbGNoYWluVmVyc2lvbnMge1xuICBpZiAoIW1ldGFkYXRhIHx8IHR5cGVvZiBtZXRhZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiB7fTtcbiAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhtZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICBpZiAoay5zdGFydHNXaXRoKFRPT0xDSEFJTl9NRVRBREFUQV9QUkVGSVgpKSBmaWVsZHNbay5zbGljZShUT09MQ0hBSU5fTUVUQURBVEFfUFJFRklYLmxlbmd0aCldID0gdjtcbiAgfVxuICByZXR1cm4gcGlja1ZlcnNpb25zKGZpZWxkcyk7XG59XG5cbi8qKlxuICogUGFyc2UgYSBsb29rdXAncyBgdG9vbGNoYWluYCBibG9jay4gTnVsbCB1bmxlc3MgaXQgY2FycmllcyBhIHJlbGVhc2UgdmVyc2lvblxuICogYW5kIGEga25vd24gYHJlc29sdmVkVmlhYC4gVG9vbCB2ZXJzaW9ucyBjb21lIGZyb20sIGxvd2VzdCBwcmVjZWRlbmNlIGZpcnN0OlxuICogdGhlIHBsdWdpbiByb3cncyBgbWV0YWRhdGFgIChgdG9vbGNoYWluLjxmaWVsZD5gIGtleXMsIHdoZXJlIHRoZSBwbGF0Zm9ybVxuICogcGVyc2lzdHMgdGhlIGJvb3RzdHJhcCBzcGVjJ3MgYHRvb2xjaGFpbmApLCB0aGUgcmVjb3JkJ3Mgb3duIGB0b29sY2hhaW5gLFxuICogdGhlIGJsb2NrJ3MgZmxhdCBmaWVsZHMsIHRoZW4gYHRvb2xjaGFpbi52ZXJzaW9uc2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxvb2t1cFRvb2xjaGFpbihyYXc6IHVua25vd24sIHBsdWdpbj86IHVua25vd24pOiBMb29rdXBUb29sY2hhaW4gfCBudWxsIHtcbiAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuICBjb25zdCB7IHJlbGVhc2VWZXJzaW9uLCByZXNvbHZlZFZpYSwgdmVyc2lvbnMgfSA9IHJhdyBhcyB7IHJlbGVhc2VWZXJzaW9uPzogdW5rbm93bjsgcmVzb2x2ZWRWaWE/OiB1bmtub3duOyB2ZXJzaW9ucz86IHVua25vd24gfTtcbiAgaWYgKHR5cGVvZiByZWxlYXNlVmVyc2lvbiAhPT0gJ3N0cmluZycgfHwgcmVsZWFzZVZlcnNpb24ubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgaWYgKCEoVE9PTENIQUlOX1JFU09MVkVEX1ZJQSBhcyByZWFkb25seSB1bmtub3duW10pLmluY2x1ZGVzKHJlc29sdmVkVmlhKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHJlYyA9IHBsdWdpbiAmJiB0eXBlb2YgcGx1Z2luID09PSAnb2JqZWN0JyA/IHBsdWdpbiBhcyB7IHRvb2xjaGFpbj86IHVua25vd247IG1ldGFkYXRhPzogdW5rbm93biB9IDogdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIHJlbGVhc2VWZXJzaW9uLFxuICAgIHJlc29sdmVkVmlhOiByZXNvbHZlZFZpYSBhcyBUb29sY2hhaW5SZXNvbHZlZFZpYSxcbiAgICB2ZXJzaW9uczogeyAuLi52ZXJzaW9uc0Zyb21NZXRhZGF0YShyZWM/Lm1ldGFkYXRhKSwgLi4ucGlja1ZlcnNpb25zKHJlYz8udG9vbGNoYWluKSwgLi4ucGlja1ZlcnNpb25zKHJhdyksIC4uLnBpY2tWZXJzaW9ucyh2ZXJzaW9ucykgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBVbndyYXAgYSBgL3BsdWdpbnMvbG9va3VwYCBhbnN3ZXIuIFRoZSBwbGF0Zm9ybSdzIHN1Y2Nlc3MgZW52ZWxvcGUgaXNcbiAqIGB7IHN1Y2Nlc3MsIHN0YXR1c0NvZGUsIGRhdGE6IHsgcGx1Z2luLCB3YXJuaW5ncyB9IH1gIChub3RlIHRoZSBkb3VibGVcbiAqIG5lc3Rpbmc6IGBkYXRhLnBsdWdpbmApOyBgeyBkYXRhOiBQbHVnaW4gfWAsIGB7IHBsdWdpbiB9YCBhbmQgYSBiYXJlIFBsdWdpblxuICogYXJlIHRvbGVyYXRlZCB0b28uIFJldHVybnMgdGhlIHBsdWdpbiAobnVsbCB3aGVuIGFic2VudCBvciBuYW1lbGVzcykgYW5kIHRoZVxuICogZ3JhZGVkIHdhcm5pbmdzIChsaWZlY3ljbGUsIHZ1bG5lcmFiaWxpdHksIGNvbXBsaWFuY2UpIHRoYXQgcmlkZSBiZXNpZGUgaXQsXG4gKiBhbmQg4oCUIGZvciBhIG1hbmFnZWQgdG9vbGNoYWluIG5hbWUg4oCUIHRoZSByZWxlYXNlIGl0IHJlc29sdmVkIHRvIChgdG9vbGNoYWluYCkuXG4gKlxuICogRGVwZW5kZW5jeS1mcmVlICh0eXBlLW9ubHkgaW1wb3J0cykgc28gdGhlIHBsdWdpbi1sb29rdXAgTGFtYmRhIGNhbiBidW5kbGUgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXBMb29rdXAoYm9keTogdW5rbm93bik6IHsgcGx1Z2luOiBQbHVnaW4gfCBudWxsOyB3YXJuaW5nczogTG9va3VwV2FybmluZ1tdOyB0b29sY2hhaW4/OiBMb29rdXBUb29sY2hhaW4gfSB7XG4gIGlmICghYm9keSB8fCB0eXBlb2YgYm9keSAhPT0gJ29iamVjdCcpIHJldHVybiB7IHBsdWdpbjogbnVsbCwgd2FybmluZ3M6IFtdIH07XG4gIGNvbnN0IGlubmVyID0gKGJvZHkgYXMgeyBkYXRhPzogdW5rbm93biB9KS5kYXRhO1xuICBjb25zdCBjb250YWluZXIgPSAoaW5uZXIgJiYgdHlwZW9mIGlubmVyID09PSAnb2JqZWN0JyA/IGlubmVyIDogYm9keSkgYXMgeyBwbHVnaW4/OiB1bmtub3duOyB3YXJuaW5ncz86IHVua25vd247IHRvb2xjaGFpbj86IHVua25vd24gfTtcbiAgY29uc3QgY2FuZGlkYXRlID0gY29udGFpbmVyLnBsdWdpbiA/PyBjb250YWluZXI7XG4gIGNvbnN0IHBsdWdpbiA9IGNhbmRpZGF0ZSAmJiB0eXBlb2YgY2FuZGlkYXRlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgKGNhbmRpZGF0ZSBhcyB7IG5hbWU/OiB1bmtub3duIH0pLm5hbWUgPT09ICdzdHJpbmcnXG4gICAgJiYgKGNhbmRpZGF0ZSBhcyB7IG5hbWU6IHN0cmluZyB9KS5uYW1lLmxlbmd0aCA+IDBcbiAgICA/IGNhbmRpZGF0ZSBhcyBQbHVnaW5cbiAgICA6IG51bGw7XG4gIGNvbnN0IHdhcm5pbmdzOiBMb29rdXBXYXJuaW5nW10gPSBbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29udGFpbmVyLndhcm5pbmdzKSkge1xuICAgIGZvciAoY29uc3QgdyBvZiBjb250YWluZXIud2FybmluZ3MpIHtcbiAgICAgIGlmICghdyB8fCB0eXBlb2YgdyAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgeyBjb2RlLCBtZXNzYWdlLCBzZXZlcml0eSB9ID0gdyBhcyB7IGNvZGU/OiB1bmtub3duOyBtZXNzYWdlPzogdW5rbm93bjsgc2V2ZXJpdHk/OiB1bmtub3duIH07XG4gICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgIT09ICdzdHJpbmcnIHx8IG1lc3NhZ2UubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICAgIHdhcm5pbmdzLnB1c2goe1xuICAgICAgICAuLi4odHlwZW9mIGNvZGUgPT09ICdzdHJpbmcnID8geyBjb2RlIH0gOiB7fSksXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHNldmVyaXR5OiAoTE9PS1VQX1dBUk5JTkdfU0VWRVJJVElFUyBhcyByZWFkb25seSB1bmtub3duW10pLmluY2x1ZGVzKHNldmVyaXR5KSA/IHNldmVyaXR5IGFzIExvb2t1cFdhcm5pbmdTZXZlcml0eSA6ICd3YXJuaW5nJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBjb25zdCB0b29sY2hhaW4gPSBwYXJzZUxvb2t1cFRvb2xjaGFpbihjb250YWluZXIudG9vbGNoYWluLCBwbHVnaW4pO1xuICByZXR1cm4geyBwbHVnaW4sIHdhcm5pbmdzLCAuLi4odG9vbGNoYWluICYmIHsgdG9vbGNoYWluIH0pIH07XG59XG5cbi8qKlxuICogT25lIGxpbmUgc3VtbWFyaXppbmcgZ3JhZGVkIHdhcm5pbmdzLCBtb3N0IHNlcmlvdXMgZmlyc3Qg4oCUXG4gKiBgMyBwbHVnaW4gd2FybmluZ3M6IDEgY3JpdGljYWwsIDIgZXJyb3JgLiBOdWxsIHdoZW4gdGhlcmUgYXJlIG5vbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdW1tYXJpemVMb29rdXBXYXJuaW5ncyh3YXJuaW5nczogcmVhZG9ubHkgUGljazxMb29rdXBXYXJuaW5nLCAnc2V2ZXJpdHknPltdKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICBjb25zdCBwYXJ0cyA9IFsuLi5MT09LVVBfV0FSTklOR19TRVZFUklUSUVTXS5yZXZlcnNlKClcbiAgICAubWFwKChzZXYpID0+IFtzZXYsIHdhcm5pbmdzLmZpbHRlcigodykgPT4gdy5zZXZlcml0eSA9PT0gc2V2KS5sZW5ndGhdIGFzIGNvbnN0KVxuICAgIC5maWx0ZXIoKFssIG5dKSA9PiBuID4gMClcbiAgICAubWFwKChbc2V2LCBuXSkgPT4gYCR7bn0gJHtzZXZ9YCk7XG4gIHJldHVybiBgJHt3YXJuaW5ncy5sZW5ndGh9IHBsdWdpbiB3YXJuaW5nJHt3YXJuaW5ncy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ306ICR7cGFydHMuam9pbignLCAnKX1gO1xufVxuXG4vKiogV2h5IGEgbG9va3VwIGZvdW5kIG5vdGhpbmcsIGFzIHRoZSBwbHVnaW4gc2VydmljZSdzIDQwNCBgZGV0YWlscy5zdGF0ZWAgcmVwb3J0cyBpdC4gKi9cbmV4cG9ydCB0eXBlIExvb2t1cE5vdEZvdW5kU3RhdGUgPSAnZGVsZXRlZCcgfCAnaW5hY3RpdmUnIHwgJ3lhbmtlZCcgfCAnbWlzc2luZyc7XG5cbmNvbnN0IE5PVF9GT1VORF9TVEFURVM6IHJlYWRvbmx5IExvb2t1cE5vdEZvdW5kU3RhdGVbXSA9IFsnZGVsZXRlZCcsICdpbmFjdGl2ZScsICd5YW5rZWQnLCAnbWlzc2luZyddO1xuXG4vKipcbiAqIGBkZXRhaWxzLnN0YXRlYCBvZiBhIHJlZnVzZWQgbG9va3VwLCByZWFkIG9mZiBlaXRoZXIgYW4gYXhpb3Mtc3R5bGUgZXJyb3JcbiAqIChgZXJyLnJlc3BvbnNlLmRhdGFgKSBvciB0aGUgcmVzcG9uc2UgYm9keSBpdHNlbGYuIE51bGwgd2hlbiBhYnNlbnQvdW5rbm93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvb2t1cE5vdEZvdW5kU3RhdGUoZXJyT3JCb2R5OiB1bmtub3duKTogTG9va3VwTm90Rm91bmRTdGF0ZSB8IG51bGwge1xuICBpZiAoIWVyck9yQm9keSB8fCB0eXBlb2YgZXJyT3JCb2R5ICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGRhdGEgPSAoZXJyT3JCb2R5IGFzIHsgcmVzcG9uc2U/OiB7IGRhdGE/OiB1bmtub3duIH0gfSkucmVzcG9uc2U/LmRhdGEgPz8gZXJyT3JCb2R5O1xuICBjb25zdCBkZXRhaWxzID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyAoZGF0YSBhcyB7IGRldGFpbHM/OiB1bmtub3duIH0pLmRldGFpbHMgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YXRlID0gZGV0YWlscyAmJiB0eXBlb2YgZGV0YWlscyA9PT0gJ29iamVjdCcgPyAoZGV0YWlscyBhcyB7IHN0YXRlPzogdW5rbm93biB9KS5zdGF0ZSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gJ3N0cmluZycgJiYgKE5PVF9GT1VORF9TVEFURVMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHN0YXRlKSA/IHN0YXRlIGFzIExvb2t1cE5vdEZvdW5kU3RhdGUgOiBudWxsO1xufVxuXG4vKipcbiAqIFRoZSBtZXNzYWdlIGZvciBhbiBleGFjdCB2ZXJzaW9uIHBpbiB0aGF0IGRpZCBub3QgcmVzb2x2ZS4gU2hhcmVkIGJ5IHRoZVxuICogQ0xJJ3MgcHJlLXJlc29sdXRpb24gYW5kIHRoZSBkZXBsb3ktdGltZSBMYW1iZGEncyBDbG91ZEZvcm1hdGlvbiByZWFzb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGFjdFBpbk5vdEZvdW5kTWVzc2FnZShsYWJlbDogc3RyaW5nLCBwaW46IHN0cmluZywgc3RhdGU6IExvb2t1cE5vdEZvdW5kU3RhdGUgfCBudWxsKTogc3RyaW5nIHtcbiAgc3dpdGNoIChzdGF0ZSkge1xuICAgIGNhc2UgJ2RlbGV0ZWQnOiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gd2FzIGRlbGV0ZWQgZnJvbSB5b3VyIG9yZ2FuaXphdGlvbmA7XG4gICAgY2FzZSAnaW5hY3RpdmUnOiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gaXMgaW5hY3RpdmVgO1xuICAgIGNhc2UgJ3lhbmtlZCc6IHJldHVybiBgUGx1Z2luIFwiJHtsYWJlbH1cIiB2ZXJzaW9uICR7cGlufSB3YXMgeWFua2VkYDtcbiAgICBjYXNlICdtaXNzaW5nJzogcmV0dXJuIGBQbHVnaW4gXCIke2xhYmVsfVwiIHZlcnNpb24gJHtwaW59IGRvZXMgbm90IGV4aXN0YDtcbiAgICBkZWZhdWx0OiByZXR1cm4gYFBsdWdpbiBcIiR7bGFiZWx9XCIgdmVyc2lvbiAke3Bpbn0gZG9lcyBub3QgZXhpc3QgKG5ldmVyIHB1Ymxpc2hlZCwgb3IgcmVmdXNlZCBieSBpdHMgYnVpbGQncyB2dWxuZXJhYmlsaXR5IHNjYW4pYDtcbiAgfVxufVxuIl19
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Self-mutation runtime (docs/plans/bootstrap-image-versioning.md §3, D10).
3
+ *
4
+ * Self-mutation runs on an AWS CURATED image, not the toolchain's bootstrap
5
+ * image, so a defective toolchain release can always be rolled back: the step
6
+ * that re-deploys the pipeline does not depend on the release it is replacing.
7
+ * It needs only Node and the CDK CLI. CDK Pipelines' SelfMutate runs
8
+ * `npm install -g aws-cdk@<cliVersion>` then `cdk -a <asm> deploy` (no
9
+ * re-synth), and `cliVersion` is always pinned to the release's `awsCdk`.
10
+ *
11
+ * The Node runtime is PINNED through `partialBuildSpec`
12
+ * `phases.install.runtime-versions.nodejs`, never left to the image default,
13
+ * and a contract test (test/self-mutation-runtime.test.ts) fails when the major
14
+ * falls outside the pinned CLI's `engines.node` or the image's published runtimes.
15
+ *
16
+ * CDK-free (plain data) so the root entry can export it.
17
+ */
18
+ /** The curated CodeBuild image self-mutation runs on. */
19
+ export declare const CURATED_SELF_MUTATION_IMAGE = "aws/codebuild/standard:8.0";
20
+ /**
21
+ * Node.js runtime majors `aws/codebuild/standard:8.0` publishes for
22
+ * `runtime-versions.nodejs`.
23
+ *
24
+ * Source: https://github.com/aws/aws-codebuild-docker-images/blob/master/ubuntu/standard/8.0/runtimes.yml
25
+ * (`runtimes.nodejs.versions`; read 2026-11-13). Re-check when the image changes.
26
+ */
27
+ export declare const CURATED_SELF_MUTATION_NODE_RUNTIMES: readonly number[];
28
+ /** The Node.js major self-mutation pins (`runtime-versions.nodejs`). */
29
+ export declare const SELF_MUTATION_NODE_MAJOR = 24;
30
+ /** The `partialBuildSpec` object that pins self-mutation's Node runtime. */
31
+ export declare function selfMutationPartialBuildSpec(): Record<string, unknown>;
@@ -0,0 +1,36 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Self-mutation runtime (docs/plans/bootstrap-image-versioning.md §3, D10).
5
+ *
6
+ * Self-mutation runs on an AWS CURATED image, not the toolchain's bootstrap
7
+ * image, so a defective toolchain release can always be rolled back: the step
8
+ * that re-deploys the pipeline does not depend on the release it is replacing.
9
+ * It needs only Node and the CDK CLI. CDK Pipelines' SelfMutate runs
10
+ * `npm install -g aws-cdk@<cliVersion>` then `cdk -a <asm> deploy` (no
11
+ * re-synth), and `cliVersion` is always pinned to the release's `awsCdk`.
12
+ *
13
+ * The Node runtime is PINNED through `partialBuildSpec`
14
+ * `phases.install.runtime-versions.nodejs`, never left to the image default,
15
+ * and a contract test (test/self-mutation-runtime.test.ts) fails when the major
16
+ * falls outside the pinned CLI's `engines.node` or the image's published runtimes.
17
+ *
18
+ * CDK-free (plain data) so the root entry can export it.
19
+ */
20
+ /** The curated CodeBuild image self-mutation runs on. */
21
+ export const CURATED_SELF_MUTATION_IMAGE = 'aws/codebuild/standard:8.0';
22
+ /**
23
+ * Node.js runtime majors `aws/codebuild/standard:8.0` publishes for
24
+ * `runtime-versions.nodejs`.
25
+ *
26
+ * Source: https://github.com/aws/aws-codebuild-docker-images/blob/master/ubuntu/standard/8.0/runtimes.yml
27
+ * (`runtimes.nodejs.versions`; read 2026-11-13). Re-check when the image changes.
28
+ */
29
+ export const CURATED_SELF_MUTATION_NODE_RUNTIMES = [22, 24, 26];
30
+ /** The Node.js major self-mutation pins (`runtime-versions.nodejs`). */
31
+ export const SELF_MUTATION_NODE_MAJOR = 24;
32
+ /** The `partialBuildSpec` object that pins self-mutation's Node runtime. */
33
+ export function selfMutationPartialBuildSpec() {
34
+ return { phases: { install: { 'runtime-versions': { nodejs: String(SELF_MUTATION_NODE_MAJOR) } } } };
35
+ }
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZi1tdXRhdGlvbi5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvc2VsZi1tdXRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgseURBQXlEO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLDRCQUE0QixDQUFDO0FBRXhFOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1DQUFtQyxHQUFzQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFbkYsd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUUzQyw0RUFBNEU7QUFDNUUsTUFBTSxVQUFVLDRCQUE0QjtJQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUN2RyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogU2VsZi1tdXRhdGlvbiBydW50aW1lIChkb2NzL3BsYW5zL2Jvb3RzdHJhcC1pbWFnZS12ZXJzaW9uaW5nLm1kIMKnMywgRDEwKS5cbiAqXG4gKiBTZWxmLW11dGF0aW9uIHJ1bnMgb24gYW4gQVdTIENVUkFURUQgaW1hZ2UsIG5vdCB0aGUgdG9vbGNoYWluJ3MgYm9vdHN0cmFwXG4gKiBpbWFnZSwgc28gYSBkZWZlY3RpdmUgdG9vbGNoYWluIHJlbGVhc2UgY2FuIGFsd2F5cyBiZSByb2xsZWQgYmFjazogdGhlIHN0ZXBcbiAqIHRoYXQgcmUtZGVwbG95cyB0aGUgcGlwZWxpbmUgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSByZWxlYXNlIGl0IGlzIHJlcGxhY2luZy5cbiAqIEl0IG5lZWRzIG9ubHkgTm9kZSBhbmQgdGhlIENESyBDTEkuIENESyBQaXBlbGluZXMnIFNlbGZNdXRhdGUgcnVuc1xuICogYG5wbSBpbnN0YWxsIC1nIGF3cy1jZGtAPGNsaVZlcnNpb24+YCB0aGVuIGBjZGsgLWEgPGFzbT4gZGVwbG95YCAobm9cbiAqIHJlLXN5bnRoKSwgYW5kIGBjbGlWZXJzaW9uYCBpcyBhbHdheXMgcGlubmVkIHRvIHRoZSByZWxlYXNlJ3MgYGF3c0Nka2AuXG4gKlxuICogVGhlIE5vZGUgcnVudGltZSBpcyBQSU5ORUQgdGhyb3VnaCBgcGFydGlhbEJ1aWxkU3BlY2BcbiAqIGBwaGFzZXMuaW5zdGFsbC5ydW50aW1lLXZlcnNpb25zLm5vZGVqc2AsIG5ldmVyIGxlZnQgdG8gdGhlIGltYWdlIGRlZmF1bHQsXG4gKiBhbmQgYSBjb250cmFjdCB0ZXN0ICh0ZXN0L3NlbGYtbXV0YXRpb24tcnVudGltZS50ZXN0LnRzKSBmYWlscyB3aGVuIHRoZSBtYWpvclxuICogZmFsbHMgb3V0c2lkZSB0aGUgcGlubmVkIENMSSdzIGBlbmdpbmVzLm5vZGVgIG9yIHRoZSBpbWFnZSdzIHB1Ymxpc2hlZCBydW50aW1lcy5cbiAqXG4gKiBDREstZnJlZSAocGxhaW4gZGF0YSkgc28gdGhlIHJvb3QgZW50cnkgY2FuIGV4cG9ydCBpdC5cbiAqL1xuXG4vKiogVGhlIGN1cmF0ZWQgQ29kZUJ1aWxkIGltYWdlIHNlbGYtbXV0YXRpb24gcnVucyBvbi4gKi9cbmV4cG9ydCBjb25zdCBDVVJBVEVEX1NFTEZfTVVUQVRJT05fSU1BR0UgPSAnYXdzL2NvZGVidWlsZC9zdGFuZGFyZDo4LjAnO1xuXG4vKipcbiAqIE5vZGUuanMgcnVudGltZSBtYWpvcnMgYGF3cy9jb2RlYnVpbGQvc3RhbmRhcmQ6OC4wYCBwdWJsaXNoZXMgZm9yXG4gKiBgcnVudGltZS12ZXJzaW9ucy5ub2RlanNgLlxuICpcbiAqIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY29kZWJ1aWxkLWRvY2tlci1pbWFnZXMvYmxvYi9tYXN0ZXIvdWJ1bnR1L3N0YW5kYXJkLzguMC9ydW50aW1lcy55bWxcbiAqIChgcnVudGltZXMubm9kZWpzLnZlcnNpb25zYDsgcmVhZCAyMDI2LTExLTEzKS4gUmUtY2hlY2sgd2hlbiB0aGUgaW1hZ2UgY2hhbmdlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IENVUkFURURfU0VMRl9NVVRBVElPTl9OT0RFX1JVTlRJTUVTOiByZWFkb25seSBudW1iZXJbXSA9IFsyMiwgMjQsIDI2XTtcblxuLyoqIFRoZSBOb2RlLmpzIG1ham9yIHNlbGYtbXV0YXRpb24gcGlucyAoYHJ1bnRpbWUtdmVyc2lvbnMubm9kZWpzYCkuICovXG5leHBvcnQgY29uc3QgU0VMRl9NVVRBVElPTl9OT0RFX01BSk9SID0gMjQ7XG5cbi8qKiBUaGUgYHBhcnRpYWxCdWlsZFNwZWNgIG9iamVjdCB0aGF0IHBpbnMgc2VsZi1tdXRhdGlvbidzIE5vZGUgcnVudGltZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxmTXV0YXRpb25QYXJ0aWFsQnVpbGRTcGVjKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHsgcGhhc2VzOiB7IGluc3RhbGw6IHsgJ3J1bnRpbWUtdmVyc2lvbnMnOiB7IG5vZGVqczogU3RyaW5nKFNFTEZfTVVUQVRJT05fTk9ERV9NQUpPUikgfSB9IH0gfTtcbn1cbiJdfQ==
@@ -1,3 +1,18 @@
1
+ /**
2
+ * Step manifest: which plugin each CodePipeline action
3
+ * of a deployed pipeline runs. CDK-free half — the shapes and helpers shared by
4
+ * the synth (which records it, see `pipeline/step-manifest-recorder.ts`), the
5
+ * CLI (which ships it with the registry registration) and the pipeline service
6
+ * (which validates and stores it in `pipeline_step_manifests`).
7
+ *
8
+ * Event ingest joins `pipeline_events` on (pipeline_id, stage_name,
9
+ * action_name), so `stageName`/`actionName` here are read off the BUILT
10
+ * CodePipeline, never recomputed from our own ids — they are exactly the names
11
+ * CodePipeline state-change events report.
12
+ */
13
+ import { BUILD_IMAGE_MANIFEST_ACTION, BUILD_IMAGE_MANIFEST_STAGE, BUILD_IMAGE_STEP_KEY } from '@pipeline-builder/api-core';
14
+ import type { ToolchainResolvedVia } from './plugin-lookup-envelope.js';
15
+ export { BUILD_IMAGE_MANIFEST_ACTION, BUILD_IMAGE_MANIFEST_STAGE, BUILD_IMAGE_STEP_KEY };
1
16
  /**
2
17
  * File the synth app writes the manifest to, inside the cloud assembly
3
18
  * directory (`cdk deploy --output=<dir>`). The CLI reads it back after a
@@ -35,6 +50,27 @@ export interface StepManifestEntry {
35
50
  */
36
51
  readonly stepKey?: string;
37
52
  }
53
+ /**
54
+ * The pipeline's BUILD IMAGE: the toolchain release's `pipeline-bootstrap` half
55
+ * every plugin-less action runs on (docs/plans/bootstrap-image-versioning.md §4).
56
+ * Not a step — it rides the manifest as a non-step entry under the
57
+ * `build-image` key and the sentinel (stage, action) the platform stores it
58
+ * under, so the deploy-reference path (in-use protection) counts the release.
59
+ * `pluginVersion` IS the release version (both halves share it); the platform
60
+ * re-reads name/version/digest from the `pluginId` row as for every entry.
61
+ */
62
+ export interface BuildImageManifestEntry extends StepManifestEntry {
63
+ readonly kind: 'build-image';
64
+ readonly stageName: typeof BUILD_IMAGE_MANIFEST_STAGE;
65
+ readonly actionName: typeof BUILD_IMAGE_MANIFEST_ACTION;
66
+ readonly stepKey: typeof BUILD_IMAGE_STEP_KEY;
67
+ readonly releaseVersion: string;
68
+ readonly imageRepository: string | null;
69
+ /** How the release was chosen for this pipeline at synth. */
70
+ readonly resolvedVia: ToolchainResolvedVia;
71
+ }
72
+ /** Whether a manifest entry is the {@link BuildImageManifestEntry}. */
73
+ export declare function isBuildImageEntry(entry: StepManifestEntry): entry is BuildImageManifestEntry;
38
74
  /** The plugin fields {@link pluginImageRepository} reads. */
39
75
  export interface PluginImageRef {
40
76
  readonly orgId: string;
@@ -12,7 +12,8 @@
12
12
  * CodePipeline, never recomputed from our own ids — they are exactly the names
13
13
  * CodePipeline state-change events report.
14
14
  */
15
- import { SYSTEM_ORG_ID } from '@pipeline-builder/api-core';
15
+ import { BUILD_IMAGE_MANIFEST_ACTION, BUILD_IMAGE_MANIFEST_STAGE, BUILD_IMAGE_STEP_KEY, SYSTEM_ORG_ID, } from '@pipeline-builder/api-core';
16
+ export { BUILD_IMAGE_MANIFEST_ACTION, BUILD_IMAGE_MANIFEST_STAGE, BUILD_IMAGE_STEP_KEY };
16
17
  /**
17
18
  * File the synth app writes the manifest to, inside the cloud assembly
18
19
  * directory (`cdk deploy --output=<dir>`). The CLI reads it back after a
@@ -25,6 +26,11 @@ export const STEP_MANIFEST_FILE = 'pb-step-manifest.json';
25
26
  * synth. Never a real `plugins` row, so the step manifest never records it.
26
27
  */
27
28
  export const PLACEHOLDER_PLUGIN_ID = '00000000-0000-0000-0000-000000000000';
29
+ /** Whether a manifest entry is the {@link BuildImageManifestEntry}. */
30
+ export function isBuildImageEntry(entry) {
31
+ return entry.kind === 'build-image'
32
+ || (entry.stageName === BUILD_IMAGE_MANIFEST_STAGE && entry.actionName === BUILD_IMAGE_MANIFEST_ACTION);
33
+ }
28
34
  /**
29
35
  * Registry repository an org-owned plugin ROW's image lives at
30
36
  * (`<namespace>/<name>`, no host, no digest): the system org's under
@@ -44,4 +50,4 @@ export function pluginImageRepository(plugin) {
44
50
  }
45
51
  /** A plugin image repository lookup may return: `public/<publisher>/<name>`, `org-<id>/<name>` or `system/<name>`. */
46
52
  export const PLUGIN_IMAGE_REPOSITORY_RE = /^(?:public\/[a-z0-9]+(?:-[a-z0-9]+)*|org-[a-z0-9][a-z0-9-]*|system)\/[a-z0-9][a-z0-9._-]*$/;
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1tYW5pZmVzdC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvc3RlcC1tYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7OztHQVdHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTNEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyx1QkFBdUIsQ0FBQztBQUUxRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsc0NBQXNDLENBQUM7QUFtQzVFOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsTUFBc0I7SUFDMUQsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLGVBQWU7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN0RCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNwRixPQUFPLEdBQUcsU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUN2QyxDQUFDO0FBRUQsc0hBQXNIO0FBQ3RILE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLDRGQUE0RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogU3RlcCBtYW5pZmVzdDogd2hpY2ggcGx1Z2luIGVhY2ggQ29kZVBpcGVsaW5lIGFjdGlvblxuICogb2YgYSBkZXBsb3llZCBwaXBlbGluZSBydW5zLiBDREstZnJlZSBoYWxmIOKAlCB0aGUgc2hhcGVzIGFuZCBoZWxwZXJzIHNoYXJlZCBieVxuICogdGhlIHN5bnRoICh3aGljaCByZWNvcmRzIGl0LCBzZWUgYHBpcGVsaW5lL3N0ZXAtbWFuaWZlc3QtcmVjb3JkZXIudHNgKSwgdGhlXG4gKiBDTEkgKHdoaWNoIHNoaXBzIGl0IHdpdGggdGhlIHJlZ2lzdHJ5IHJlZ2lzdHJhdGlvbikgYW5kIHRoZSBwaXBlbGluZSBzZXJ2aWNlXG4gKiAod2hpY2ggdmFsaWRhdGVzIGFuZCBzdG9yZXMgaXQgaW4gYHBpcGVsaW5lX3N0ZXBfbWFuaWZlc3RzYCkuXG4gKlxuICogRXZlbnQgaW5nZXN0IGpvaW5zIGBwaXBlbGluZV9ldmVudHNgIG9uIChwaXBlbGluZV9pZCwgc3RhZ2VfbmFtZSxcbiAqIGFjdGlvbl9uYW1lKSwgc28gYHN0YWdlTmFtZWAvYGFjdGlvbk5hbWVgIGhlcmUgYXJlIHJlYWQgb2ZmIHRoZSBCVUlMVFxuICogQ29kZVBpcGVsaW5lLCBuZXZlciByZWNvbXB1dGVkIGZyb20gb3VyIG93biBpZHMg4oCUIHRoZXkgYXJlIGV4YWN0bHkgdGhlIG5hbWVzXG4gKiBDb2RlUGlwZWxpbmUgc3RhdGUtY2hhbmdlIGV2ZW50cyByZXBvcnQuXG4gKi9cblxuaW1wb3J0IHsgU1lTVEVNX09SR19JRCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcblxuLyoqXG4gKiBGaWxlIHRoZSBzeW50aCBhcHAgd3JpdGVzIHRoZSBtYW5pZmVzdCB0bywgaW5zaWRlIHRoZSBjbG91ZCBhc3NlbWJseVxuICogZGlyZWN0b3J5IChgY2RrIGRlcGxveSAtLW91dHB1dD08ZGlyPmApLiBUaGUgQ0xJIHJlYWRzIGl0IGJhY2sgYWZ0ZXIgYVxuICogc3VjY2Vzc2Z1bCBkZXBsb3kgYW5kIGZvcndhcmRzIGl0IG9uIHRoZSByZWdpc3RyeSBQT1NULlxuICovXG5leHBvcnQgY29uc3QgU1RFUF9NQU5JRkVTVF9GSUxFID0gJ3BiLXN0ZXAtbWFuaWZlc3QuanNvbic7XG5cbi8qKlxuICogYGlkYCBvZiBldmVyeSBzeW50aGVzaXplZCBwbGFjZWhvbGRlciBwbHVnaW4gKFBsdWdpbkxvb2t1cCBgZmFsbGJhY2soKWAgL1xuICogYGJvb3RzdHJhcCgpYCkg4oCUIGEgcmVjb3JkIHN0YW5kaW5nIGluIGZvciBhIGxvb2t1cCB0aGF0IGNvdWxkIG5vdCByZXNvbHZlIGF0XG4gKiBzeW50aC4gTmV2ZXIgYSByZWFsIGBwbHVnaW5zYCByb3csIHNvIHRoZSBzdGVwIG1hbmlmZXN0IG5ldmVyIHJlY29yZHMgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFDRUhPTERFUl9QTFVHSU5fSUQgPSAnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJztcblxuLyoqXG4gKiBPbmUgbWFuaWZlc3QgZW50cnkgYXMgdGhlIHN5bnRoIHJlY29yZHMgaXQuIENhcnJpZXMgdGhlIHJlc29sdmVkIHBsdWdpblxuICogcmVjb3JkJ3MgaWQgc28gdGhlIHBpcGVsaW5lIHNlcnZpY2UgY2FuIHJlLXJlc29sdmUgdGhlIGF1dGhvcml0YXRpdmVcbiAqIG5hbWUvdmVyc2lvbi9kaWdlc3Qvb3duZXIgaXRzZWxmIOKAlCB0aGUgQ0xJJ3MgY2xhaW0gaXMgbmV2ZXIgdHJ1c3RlZCBmb3JcbiAqIGFueXRoaW5nIHRoYXQgZmVlZHMgY3Jvc3Mtb3JnIHN0YXRzIChwdWJsaXNoZXIsIHZlcmlmaWVkIHVzZSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcE1hbmlmZXN0RW50cnkge1xuICAvKiogQ29kZVBpcGVsaW5lIHN0YWdlIG5hbWUsIGFzIHRoZSBidWlsdCBwaXBlbGluZSBuYW1lcyBpdC4gKi9cbiAgcmVhZG9ubHkgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBDb2RlUGlwZWxpbmUgYWN0aW9uIG5hbWUsIGFzIHRoZSBidWlsdCBwaXBlbGluZSBuYW1lcyBpdC4gKi9cbiAgcmVhZG9ubHkgYWN0aW9uTmFtZTogc3RyaW5nO1xuICAvKiogYHBsdWdpbnMuaWRgIG9mIHRoZSByZXNvbHZlZCBwbHVnaW4gcmVjb3JkLiAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpblZlcnNpb246IHN0cmluZztcbiAgLyoqIFNpZ25lZCBpbWFnZSBkaWdlc3QgdGhlIHN0ZXAgaXMgcGlubmVkIHRvOyBudWxsIGZvciBpbWFnZS1sZXNzIHBsdWdpbnMuICovXG4gIHJlYWRvbmx5IGltYWdlRGlnZXN0OiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogVGhlIHN0ZXAncyBsYWJlbCAoYHBsdWdpblN0ZXBMYWJlbGA6IGBzeW50aGAgb3IgYDxzdGFnZT4vPGFsaWFzID8/IG5hbWU+YCkg4oCUXG4gICAqIHdoYXQgdGhlIENMSSBhbmQgdGhlIGxvb2t1cCBMYW1iZGEgc2VuZCBhcyBsb29rdXAgYGNvbnRleHQuc3RlcEtleXNgLCBhbmQgdGhlXG4gICAqIHJ1bi10aW1lIGNoZWNrIGFza3MgYWJvdXQuIExldHMgdGhlIHBsYXRmb3JtIGpvaW4gbG9va3VwIHdhcm5pbmdzIHRvIHRoaXNcbiAgICogbWFuaWZlc3Qgcm93LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RlcEtleT86IHN0cmluZztcbn1cblxuLyoqIFRoZSBwbHVnaW4gZmllbGRzIHtAbGluayBwbHVnaW5JbWFnZVJlcG9zaXRvcnl9IHJlYWRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5JbWFnZVJlZiB7XG4gIHJlYWRvbmx5IG9yZ0lkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYnVpbGRUeXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBSZWdpc3RyeSByZXBvc2l0b3J5IGFuIG9yZy1vd25lZCBwbHVnaW4gUk9XJ3MgaW1hZ2UgbGl2ZXMgYXRcbiAqIChgPG5hbWVzcGFjZT4vPG5hbWU+YCwgbm8gaG9zdCwgbm8gZGlnZXN0KTogdGhlIHN5c3RlbSBvcmcncyB1bmRlclxuICogYHN5c3RlbS9gLCBhIHRlbmFudCdzIHVuZGVyIGBvcmctPG9yZ0lkPi9gLiBNdXN0IG1hdGNoIHRoZSBwdXNoIHNpZGVcbiAqIChhcGkvcGx1Z2luIGBwbHVnaW5VcmlgKS4gUmV0dXJucyBudWxsIGZvciBhIGBtZXRhZGF0YV9vbmx5YCBwbHVnaW4uXG4gKlxuICogT25seSBmb3Igcm93cyB0aGUgY2FsbGVyJ3Mgb3JnIHJlc29sdmVzIGFzIGl0cyBPV04gKG9yIGl0cyBwYXJlbnQncyk6IHRoZVxuICogcGx1Z2luIGxvb2t1cCBzdGFtcHMgaXQgYXMgdGhlIHJlY29yZCdzIGBpbWFnZVJlcG9zaXRvcnlgLiBBIGxpc3RlZCBwbHVnaW4nc1xuICogcmVwb3NpdG9yeSBpcyBpdHMgbGlzdGluZyB2ZXJzaW9uJ3MgYHB1YmxpYy88cHVibGlzaGVyPi88bmFtZT5gIGNvcHkg4oCUXG4gKiBzeW50aCBuZXZlciBkZXJpdmVzIGEgcmVwb3NpdG9yeSBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbHVnaW5JbWFnZVJlcG9zaXRvcnkocGx1Z2luOiBQbHVnaW5JbWFnZVJlZik6IHN0cmluZyB8IG51bGwge1xuICBpZiAocGx1Z2luLmJ1aWxkVHlwZSA9PT0gJ21ldGFkYXRhX29ubHknKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbmFtZXNwYWNlID0gcGx1Z2luLm9yZ0lkID09PSBTWVNURU1fT1JHX0lEID8gJ3N5c3RlbScgOiBgb3JnLSR7cGx1Z2luLm9yZ0lkfWA7XG4gIHJldHVybiBgJHtuYW1lc3BhY2V9LyR7cGx1Z2luLm5hbWV9YDtcbn1cblxuLyoqIEEgcGx1Z2luIGltYWdlIHJlcG9zaXRvcnkgbG9va3VwIG1heSByZXR1cm46IGBwdWJsaWMvPHB1Ymxpc2hlcj4vPG5hbWU+YCwgYG9yZy08aWQ+LzxuYW1lPmAgb3IgYHN5c3RlbS88bmFtZT5gLiAqL1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9JTUFHRV9SRVBPU0lUT1JZX1JFID0gL14oPzpwdWJsaWNcXC9bYS16MC05XSsoPzotW2EtejAtOV0rKSp8b3JnLVthLXowLTldW2EtejAtOS1dKnxzeXN0ZW0pXFwvW2EtejAtOV1bYS16MC05Ll8tXSokLztcbiJdfQ==
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1tYW5pZmVzdC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvc3RlcC1tYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7OztHQVdHO0FBRUgsT0FBTyxFQUNMLDJCQUEyQixFQUFFLDBCQUEwQixFQUFFLG9CQUFvQixFQUFFLGFBQWEsR0FDN0YsTUFBTSw0QkFBNEIsQ0FBQztBQUdwQyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsMEJBQTBCLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztBQUV6Rjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsdUJBQXVCLENBQUM7QUFFMUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLHNDQUFzQyxDQUFDO0FBZ0Q1RSx1RUFBdUU7QUFDdkUsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQXdCO0lBQ3hELE9BQVEsS0FBNEIsQ0FBQyxJQUFJLEtBQUssYUFBYTtXQUN0RCxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssMEJBQTBCLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSywyQkFBMkIsQ0FBQyxDQUFDO0FBQzVHLENBQUM7QUFTRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQXNCO0lBQzFELElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxlQUFlO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDcEYsT0FBTyxHQUFHLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDdkMsQ0FBQztBQUVELHNIQUFzSDtBQUN0SCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyw0RkFBNEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFN0ZXAgbWFuaWZlc3Q6IHdoaWNoIHBsdWdpbiBlYWNoIENvZGVQaXBlbGluZSBhY3Rpb25cbiAqIG9mIGEgZGVwbG95ZWQgcGlwZWxpbmUgcnVucy4gQ0RLLWZyZWUgaGFsZiDigJQgdGhlIHNoYXBlcyBhbmQgaGVscGVycyBzaGFyZWQgYnlcbiAqIHRoZSBzeW50aCAod2hpY2ggcmVjb3JkcyBpdCwgc2VlIGBwaXBlbGluZS9zdGVwLW1hbmlmZXN0LXJlY29yZGVyLnRzYCksIHRoZVxuICogQ0xJICh3aGljaCBzaGlwcyBpdCB3aXRoIHRoZSByZWdpc3RyeSByZWdpc3RyYXRpb24pIGFuZCB0aGUgcGlwZWxpbmUgc2VydmljZVxuICogKHdoaWNoIHZhbGlkYXRlcyBhbmQgc3RvcmVzIGl0IGluIGBwaXBlbGluZV9zdGVwX21hbmlmZXN0c2ApLlxuICpcbiAqIEV2ZW50IGluZ2VzdCBqb2lucyBgcGlwZWxpbmVfZXZlbnRzYCBvbiAocGlwZWxpbmVfaWQsIHN0YWdlX25hbWUsXG4gKiBhY3Rpb25fbmFtZSksIHNvIGBzdGFnZU5hbWVgL2BhY3Rpb25OYW1lYCBoZXJlIGFyZSByZWFkIG9mZiB0aGUgQlVJTFRcbiAqIENvZGVQaXBlbGluZSwgbmV2ZXIgcmVjb21wdXRlZCBmcm9tIG91ciBvd24gaWRzIOKAlCB0aGV5IGFyZSBleGFjdGx5IHRoZSBuYW1lc1xuICogQ29kZVBpcGVsaW5lIHN0YXRlLWNoYW5nZSBldmVudHMgcmVwb3J0LlxuICovXG5cbmltcG9ydCB7XG4gIEJVSUxEX0lNQUdFX01BTklGRVNUX0FDVElPTiwgQlVJTERfSU1BR0VfTUFOSUZFU1RfU1RBR0UsIEJVSUxEX0lNQUdFX1NURVBfS0VZLCBTWVNURU1fT1JHX0lELFxufSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IFRvb2xjaGFpblJlc29sdmVkVmlhIH0gZnJvbSAnLi9wbHVnaW4tbG9va3VwLWVudmVsb3BlLmpzJztcblxuZXhwb3J0IHsgQlVJTERfSU1BR0VfTUFOSUZFU1RfQUNUSU9OLCBCVUlMRF9JTUFHRV9NQU5JRkVTVF9TVEFHRSwgQlVJTERfSU1BR0VfU1RFUF9LRVkgfTtcblxuLyoqXG4gKiBGaWxlIHRoZSBzeW50aCBhcHAgd3JpdGVzIHRoZSBtYW5pZmVzdCB0bywgaW5zaWRlIHRoZSBjbG91ZCBhc3NlbWJseVxuICogZGlyZWN0b3J5IChgY2RrIGRlcGxveSAtLW91dHB1dD08ZGlyPmApLiBUaGUgQ0xJIHJlYWRzIGl0IGJhY2sgYWZ0ZXIgYVxuICogc3VjY2Vzc2Z1bCBkZXBsb3kgYW5kIGZvcndhcmRzIGl0IG9uIHRoZSByZWdpc3RyeSBQT1NULlxuICovXG5leHBvcnQgY29uc3QgU1RFUF9NQU5JRkVTVF9GSUxFID0gJ3BiLXN0ZXAtbWFuaWZlc3QuanNvbic7XG5cbi8qKlxuICogYGlkYCBvZiBldmVyeSBzeW50aGVzaXplZCBwbGFjZWhvbGRlciBwbHVnaW4gKFBsdWdpbkxvb2t1cCBgZmFsbGJhY2soKWAgL1xuICogYGJvb3RzdHJhcCgpYCkg4oCUIGEgcmVjb3JkIHN0YW5kaW5nIGluIGZvciBhIGxvb2t1cCB0aGF0IGNvdWxkIG5vdCByZXNvbHZlIGF0XG4gKiBzeW50aC4gTmV2ZXIgYSByZWFsIGBwbHVnaW5zYCByb3csIHNvIHRoZSBzdGVwIG1hbmlmZXN0IG5ldmVyIHJlY29yZHMgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFDRUhPTERFUl9QTFVHSU5fSUQgPSAnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJztcblxuLyoqXG4gKiBPbmUgbWFuaWZlc3QgZW50cnkgYXMgdGhlIHN5bnRoIHJlY29yZHMgaXQuIENhcnJpZXMgdGhlIHJlc29sdmVkIHBsdWdpblxuICogcmVjb3JkJ3MgaWQgc28gdGhlIHBpcGVsaW5lIHNlcnZpY2UgY2FuIHJlLXJlc29sdmUgdGhlIGF1dGhvcml0YXRpdmVcbiAqIG5hbWUvdmVyc2lvbi9kaWdlc3Qvb3duZXIgaXRzZWxmIOKAlCB0aGUgQ0xJJ3MgY2xhaW0gaXMgbmV2ZXIgdHJ1c3RlZCBmb3JcbiAqIGFueXRoaW5nIHRoYXQgZmVlZHMgY3Jvc3Mtb3JnIHN0YXRzIChwdWJsaXNoZXIsIHZlcmlmaWVkIHVzZSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcE1hbmlmZXN0RW50cnkge1xuICAvKiogQ29kZVBpcGVsaW5lIHN0YWdlIG5hbWUsIGFzIHRoZSBidWlsdCBwaXBlbGluZSBuYW1lcyBpdC4gKi9cbiAgcmVhZG9ubHkgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBDb2RlUGlwZWxpbmUgYWN0aW9uIG5hbWUsIGFzIHRoZSBidWlsdCBwaXBlbGluZSBuYW1lcyBpdC4gKi9cbiAgcmVhZG9ubHkgYWN0aW9uTmFtZTogc3RyaW5nO1xuICAvKiogYHBsdWdpbnMuaWRgIG9mIHRoZSByZXNvbHZlZCBwbHVnaW4gcmVjb3JkLiAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpblZlcnNpb246IHN0cmluZztcbiAgLyoqIFNpZ25lZCBpbWFnZSBkaWdlc3QgdGhlIHN0ZXAgaXMgcGlubmVkIHRvOyBudWxsIGZvciBpbWFnZS1sZXNzIHBsdWdpbnMuICovXG4gIHJlYWRvbmx5IGltYWdlRGlnZXN0OiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogVGhlIHN0ZXAncyBsYWJlbCAoYHBsdWdpblN0ZXBMYWJlbGA6IGBzeW50aGAgb3IgYDxzdGFnZT4vPGFsaWFzID8/IG5hbWU+YCkg4oCUXG4gICAqIHdoYXQgdGhlIENMSSBhbmQgdGhlIGxvb2t1cCBMYW1iZGEgc2VuZCBhcyBsb29rdXAgYGNvbnRleHQuc3RlcEtleXNgLCBhbmQgdGhlXG4gICAqIHJ1bi10aW1lIGNoZWNrIGFza3MgYWJvdXQuIExldHMgdGhlIHBsYXRmb3JtIGpvaW4gbG9va3VwIHdhcm5pbmdzIHRvIHRoaXNcbiAgICogbWFuaWZlc3Qgcm93LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RlcEtleT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGlwZWxpbmUncyBCVUlMRCBJTUFHRTogdGhlIHRvb2xjaGFpbiByZWxlYXNlJ3MgYHBpcGVsaW5lLWJvb3RzdHJhcGAgaGFsZlxuICogZXZlcnkgcGx1Z2luLWxlc3MgYWN0aW9uIHJ1bnMgb24gKGRvY3MvcGxhbnMvYm9vdHN0cmFwLWltYWdlLXZlcnNpb25pbmcubWQgwqc0KS5cbiAqIE5vdCBhIHN0ZXAg4oCUIGl0IHJpZGVzIHRoZSBtYW5pZmVzdCBhcyBhIG5vbi1zdGVwIGVudHJ5IHVuZGVyIHRoZVxuICogYGJ1aWxkLWltYWdlYCBrZXkgYW5kIHRoZSBzZW50aW5lbCAoc3RhZ2UsIGFjdGlvbikgdGhlIHBsYXRmb3JtIHN0b3JlcyBpdFxuICogdW5kZXIsIHNvIHRoZSBkZXBsb3ktcmVmZXJlbmNlIHBhdGggKGluLXVzZSBwcm90ZWN0aW9uKSBjb3VudHMgdGhlIHJlbGVhc2UuXG4gKiBgcGx1Z2luVmVyc2lvbmAgSVMgdGhlIHJlbGVhc2UgdmVyc2lvbiAoYm90aCBoYWx2ZXMgc2hhcmUgaXQpOyB0aGUgcGxhdGZvcm1cbiAqIHJlLXJlYWRzIG5hbWUvdmVyc2lvbi9kaWdlc3QgZnJvbSB0aGUgYHBsdWdpbklkYCByb3cgYXMgZm9yIGV2ZXJ5IGVudHJ5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkSW1hZ2VNYW5pZmVzdEVudHJ5IGV4dGVuZHMgU3RlcE1hbmlmZXN0RW50cnkge1xuICByZWFkb25seSBraW5kOiAnYnVpbGQtaW1hZ2UnO1xuICByZWFkb25seSBzdGFnZU5hbWU6IHR5cGVvZiBCVUlMRF9JTUFHRV9NQU5JRkVTVF9TVEFHRTtcbiAgcmVhZG9ubHkgYWN0aW9uTmFtZTogdHlwZW9mIEJVSUxEX0lNQUdFX01BTklGRVNUX0FDVElPTjtcbiAgcmVhZG9ubHkgc3RlcEtleTogdHlwZW9mIEJVSUxEX0lNQUdFX1NURVBfS0VZO1xuICByZWFkb25seSByZWxlYXNlVmVyc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBpbWFnZVJlcG9zaXRvcnk6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBIb3cgdGhlIHJlbGVhc2Ugd2FzIGNob3NlbiBmb3IgdGhpcyBwaXBlbGluZSBhdCBzeW50aC4gKi9cbiAgcmVhZG9ubHkgcmVzb2x2ZWRWaWE6IFRvb2xjaGFpblJlc29sdmVkVmlhO1xufVxuXG4vKiogV2hldGhlciBhIG1hbmlmZXN0IGVudHJ5IGlzIHRoZSB7QGxpbmsgQnVpbGRJbWFnZU1hbmlmZXN0RW50cnl9LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQnVpbGRJbWFnZUVudHJ5KGVudHJ5OiBTdGVwTWFuaWZlc3RFbnRyeSk6IGVudHJ5IGlzIEJ1aWxkSW1hZ2VNYW5pZmVzdEVudHJ5IHtcbiAgcmV0dXJuIChlbnRyeSBhcyB7IGtpbmQ/OiB1bmtub3duIH0pLmtpbmQgPT09ICdidWlsZC1pbWFnZSdcbiAgICB8fCAoZW50cnkuc3RhZ2VOYW1lID09PSBCVUlMRF9JTUFHRV9NQU5JRkVTVF9TVEFHRSAmJiBlbnRyeS5hY3Rpb25OYW1lID09PSBCVUlMRF9JTUFHRV9NQU5JRkVTVF9BQ1RJT04pO1xufVxuXG4vKiogVGhlIHBsdWdpbiBmaWVsZHMge0BsaW5rIHBsdWdpbkltYWdlUmVwb3NpdG9yeX0gcmVhZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkltYWdlUmVmIHtcbiAgcmVhZG9ubHkgb3JnSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBidWlsZFR5cGU/OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKipcbiAqIFJlZ2lzdHJ5IHJlcG9zaXRvcnkgYW4gb3JnLW93bmVkIHBsdWdpbiBST1cncyBpbWFnZSBsaXZlcyBhdFxuICogKGA8bmFtZXNwYWNlPi88bmFtZT5gLCBubyBob3N0LCBubyBkaWdlc3QpOiB0aGUgc3lzdGVtIG9yZydzIHVuZGVyXG4gKiBgc3lzdGVtL2AsIGEgdGVuYW50J3MgdW5kZXIgYG9yZy08b3JnSWQ+L2AuIE11c3QgbWF0Y2ggdGhlIHB1c2ggc2lkZVxuICogKGFwaS9wbHVnaW4gYHBsdWdpblVyaWApLiBSZXR1cm5zIG51bGwgZm9yIGEgYG1ldGFkYXRhX29ubHlgIHBsdWdpbi5cbiAqXG4gKiBPbmx5IGZvciByb3dzIHRoZSBjYWxsZXIncyBvcmcgcmVzb2x2ZXMgYXMgaXRzIE9XTiAob3IgaXRzIHBhcmVudCdzKTogdGhlXG4gKiBwbHVnaW4gbG9va3VwIHN0YW1wcyBpdCBhcyB0aGUgcmVjb3JkJ3MgYGltYWdlUmVwb3NpdG9yeWAuIEEgbGlzdGVkIHBsdWdpbidzXG4gKiByZXBvc2l0b3J5IGlzIGl0cyBsaXN0aW5nIHZlcnNpb24ncyBgcHVibGljLzxwdWJsaXNoZXI+LzxuYW1lPmAgY29weSDigJRcbiAqIHN5bnRoIG5ldmVyIGRlcml2ZXMgYSByZXBvc2l0b3J5IGl0c2VsZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdWdpbkltYWdlUmVwb3NpdG9yeShwbHVnaW46IFBsdWdpbkltYWdlUmVmKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChwbHVnaW4uYnVpbGRUeXBlID09PSAnbWV0YWRhdGFfb25seScpIHJldHVybiBudWxsO1xuICBjb25zdCBuYW1lc3BhY2UgPSBwbHVnaW4ub3JnSWQgPT09IFNZU1RFTV9PUkdfSUQgPyAnc3lzdGVtJyA6IGBvcmctJHtwbHVnaW4ub3JnSWR9YDtcbiAgcmV0dXJuIGAke25hbWVzcGFjZX0vJHtwbHVnaW4ubmFtZX1gO1xufVxuXG4vKiogQSBwbHVnaW4gaW1hZ2UgcmVwb3NpdG9yeSBsb29rdXAgbWF5IHJldHVybjogYHB1YmxpYy88cHVibGlzaGVyPi88bmFtZT5gLCBgb3JnLTxpZD4vPG5hbWU+YCBvciBgc3lzdGVtLzxuYW1lPmAuICovXG5leHBvcnQgY29uc3QgUExVR0lOX0lNQUdFX1JFUE9TSVRPUllfUkUgPSAvXig/OnB1YmxpY1xcL1thLXowLTldKyg/Oi1bYS16MC05XSspKnxvcmctW2EtejAtOV1bYS16MC05LV0qfHN5c3RlbSlcXC9bYS16MC05XVthLXowLTkuXy1dKiQvO1xuIl19