@pipeline-builder/pipeline-data 4.3.3 → 4.3.5

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.
Files changed (47) hide show
  1. package/lib/api/crud-service.d.ts +7 -0
  2. package/lib/api/crud-service.js +14 -3
  3. package/lib/api/pipeline-step-resolution.d.ts +111 -0
  4. package/lib/api/pipeline-step-resolution.js +163 -0
  5. package/lib/api/plugin-consumption-policy.d.ts +8 -2
  6. package/lib/api/plugin-consumption-policy.js +20 -3
  7. package/lib/api/plugin-resolution.d.ts +26 -9
  8. package/lib/api/plugin-resolution.js +51 -33
  9. package/lib/api/reporting/analytics-queries.d.ts +6 -4
  10. package/lib/api/reporting/analytics-queries.js +11 -11
  11. package/lib/api/reporting/deploy-rollup.d.ts +2 -0
  12. package/lib/api/reporting/deploy-rollup.js +5 -1
  13. package/lib/api/reporting/failure-classifier.d.ts +2 -6
  14. package/lib/api/reporting/failure-classifier.js +22 -1
  15. package/lib/api/reporting/ingest.js +73 -16
  16. package/lib/api/reporting/plugin-exposure.d.ts +261 -15
  17. package/lib/api/reporting/plugin-exposure.js +423 -38
  18. package/lib/api/reporting/stakeholder/compose.d.ts +1 -1
  19. package/lib/api/reporting/stakeholder/compose.js +30 -1
  20. package/lib/api/reporting/stakeholder/store.d.ts +16 -2
  21. package/lib/api/reporting/stakeholder/store.js +17 -6
  22. package/lib/api/reporting/types.d.ts +80 -1
  23. package/lib/api/reporting/types.js +1 -1
  24. package/lib/api/reporting-service.d.ts +11 -4
  25. package/lib/api/reporting-service.js +106 -43
  26. package/lib/api/soft-delete-sweep.d.ts +8 -18
  27. package/lib/api/soft-delete-sweep.js +35 -5
  28. package/lib/api/version-references.d.ts +80 -0
  29. package/lib/api/version-references.js +135 -0
  30. package/lib/core/query-filters.d.ts +3 -3
  31. package/lib/core/query-filters.js +1 -1
  32. package/lib/database/drizzle-schema.d.ts +1238 -143
  33. package/lib/database/drizzle-schema.js +6 -3
  34. package/lib/database/index.d.ts +1 -1
  35. package/lib/database/index.js +2 -2
  36. package/lib/database/schema/ecosystem.d.ts +53 -0
  37. package/lib/database/schema/ecosystem.js +14 -3
  38. package/lib/database/schema/pipeline.d.ts +38 -0
  39. package/lib/database/schema/pipeline.js +20 -2
  40. package/lib/database/schema/plugin.d.ts +265 -0
  41. package/lib/database/schema/plugin.js +34 -3
  42. package/lib/database/schema/reporting-analytics.d.ts +786 -4
  43. package/lib/database/schema/reporting-analytics.js +111 -5
  44. package/lib/index.d.ts +5 -3
  45. package/lib/index.js +5 -3
  46. package/lib/testing/exports.json +24 -0
  47. package/package.json +4 -3
@@ -0,0 +1,163 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Per-STEP plugin resolution state of a pipeline, beyond the version-level
5
+ * reporting tables:
6
+ *
7
+ * - {@link declaredResolution} — the rows `pipeline_plugin_resolution` and the
8
+ * declared exposures are written from, given the pipeline's plugin steps and
9
+ * a resolver. ONE assembly for both writers: the pipeline service on a save
10
+ * (resolving the way its contract check does) and the plugin service when a
11
+ * publish, a flag / unflag or a yank changes what a declared range resolves to
12
+ * (resolving the way `/plugins/lookup` does). The step list comes from the
13
+ * caller (pipeline-core's `collectPluginSteps`, which this package cannot
14
+ * import), and the writes stay with the caller, so each can test its own.
15
+ * - `pipeline_step_lookups` — what synth was TOLD per step at its last lookup
16
+ * ({@link recordStepLookup}), when synth sends the step's context.
17
+ */
18
+ import { and, eq, sql } from 'drizzle-orm';
19
+ import { schema } from '../database/drizzle-schema.js';
20
+ import { executeRows } from '../database/pg-result.js';
21
+ import { withTenantTx } from '../database/tenancy.js';
22
+ /** `Build/scan` → `['Build', 'scan']`; `synth` → `['synth', 'synth']`. */
23
+ export function stageAndStep(label) {
24
+ const at = label.indexOf('/');
25
+ return at === -1 ? [label, label] : [label.slice(0, at), label.slice(at + 1)];
26
+ }
27
+ /** The step label a resolution row stands for (the inverse of {@link stageAndStep}). */
28
+ export function stepLabelOf(stageName, stepName) {
29
+ return stageName === stepName && stageName === 'synth' ? 'synth' : `${stageName}/${stepName}`;
30
+ }
31
+ /**
32
+ * The declared resolution rows of a pipeline and the steps its DECLARED
33
+ * exposures reconcile against. Each step resolves as synth would, plus what an
34
+ * UNVERSIONED reference resolves to now (the "latest" the version gap is measured
35
+ * against). A refused reference is recorded with no resolved version and
36
+ * `withinPolicy: false` rather than dropped: "this step can no longer resolve"
37
+ * is precisely what the outdated section should show. Each distinct filter is
38
+ * resolved once.
39
+ */
40
+ export async function declaredResolution(input) {
41
+ const memo = new Map();
42
+ const resolve = (filter) => {
43
+ const key = JSON.stringify(Object.entries(filter).sort(([a], [b]) => a.localeCompare(b)));
44
+ let hit = memo.get(key);
45
+ if (!hit) {
46
+ hit = input.resolve(filter);
47
+ memo.set(key, hit);
48
+ }
49
+ return hit;
50
+ };
51
+ const rows = new Map();
52
+ const exposureSteps = [];
53
+ for (const step of input.steps) {
54
+ const resolution = await resolve(step.lookupFilter);
55
+ const plugin = resolution && 'plugin' in resolution ? resolution.plugin : null;
56
+ const latest = await resolve({ name: step.name, ...(step.publisher ? { publisher: step.publisher } : {}), isActive: true });
57
+ const latestPlugin = latest && 'plugin' in latest ? latest.plugin : null;
58
+ const [stageName, stepName] = stageAndStep(step.label);
59
+ rows.set(`${stageName}\u0000${stepName}`, {
60
+ orgId: input.orgId,
61
+ pipelineId: input.pipelineId,
62
+ stageName,
63
+ stepName,
64
+ pluginPublisher: plugin?.publisher ?? step.publisher ?? null,
65
+ pluginName: plugin?.name ?? step.name,
66
+ declaredVersion: typeof step.filter?.version === 'string' ? step.filter.version : null,
67
+ resolvedVersion: plugin?.version ?? null,
68
+ resolvedPluginId: plugin?.id ?? null,
69
+ resolvedDigest: plugin?.imageDigest ?? null,
70
+ latestVersion: latestPlugin?.version ?? null,
71
+ withinPolicy: !(resolution && 'refusal' in resolution),
72
+ rootOrgId: input.rootOrgId ?? null,
73
+ });
74
+ if (plugin) {
75
+ exposureSteps.push({
76
+ pluginPublisher: plugin.publisher,
77
+ pluginName: plugin.name,
78
+ pluginVersion: plugin.version,
79
+ imageDigest: plugin.imageDigest ?? null,
80
+ scan: plugin.scan ?? {},
81
+ });
82
+ }
83
+ }
84
+ return { rows: [...rows.values()], exposureSteps };
85
+ }
86
+ /**
87
+ * The LIVE pipelines whose declared steps reference a plugin — a listing (every
88
+ * org's pipelines naming that publisher) or an org's own plugin (that org's and
89
+ * its teams' unqualified references) — oldest computation first, at most `limit`.
90
+ * Must run with a scope that can read every org's rows (elevated).
91
+ */
92
+ export async function declaredPipelinesForPlugin(target, limit) {
93
+ const owner = 'publisher' in target
94
+ ? sql `r.plugin_publisher = ${target.publisher}`
95
+ : sql `r.plugin_publisher IS NULL AND (lower(r.org_id) = ${target.orgId.toLowerCase()} OR lower(r.root_org_id) = ${target.orgId.toLowerCase()})`;
96
+ return withTenantTx(async (tx) => {
97
+ const ids = await executeRows(tx, sql `
98
+ SELECT r.pipeline_id, MIN(r.computed_at) AS oldest
99
+ FROM pipeline_plugin_resolution r
100
+ JOIN pipelines p ON p.id::text = r.pipeline_id AND p.deleted_at IS NULL
101
+ WHERE r.plugin_name = ${target.pluginName} AND ${owner}
102
+ GROUP BY r.pipeline_id
103
+ ORDER BY oldest
104
+ LIMIT ${limit + 1}
105
+ `);
106
+ const truncated = ids.length > limit;
107
+ const wanted = ids.slice(0, limit).map((r) => r.pipeline_id);
108
+ if (wanted.length === 0)
109
+ return { pipelines: [], truncated: false };
110
+ const pipelines = await executeRows(tx, sql `
111
+ SELECT p.id::text AS id, p.org_id, p.props FROM pipelines p WHERE p.id::text = ANY(${wanted}) AND p.deleted_at IS NULL
112
+ `);
113
+ const steps = await executeRows(tx, sql `
114
+ SELECT pipeline_id, stage_name, step_name, resolved_version, resolved_digest, root_org_id
115
+ FROM pipeline_plugin_resolution WHERE pipeline_id = ANY(${wanted})
116
+ `);
117
+ return {
118
+ truncated,
119
+ pipelines: pipelines.map((p) => {
120
+ const own = steps.filter((s) => s.pipeline_id === p.id);
121
+ return {
122
+ pipelineId: p.id,
123
+ orgId: p.org_id,
124
+ rootOrgId: own.find((s) => s.root_org_id)?.root_org_id ?? null,
125
+ props: p.props,
126
+ current: new Map(own.map((s) => [`${s.stage_name}\u0000${s.step_name}`, { resolvedVersion: s.resolved_version, resolvedDigest: s.resolved_digest }])),
127
+ };
128
+ }),
129
+ };
130
+ });
131
+ }
132
+ const L = () => schema.pipelineStepLookup;
133
+ /**
134
+ * Record (replace) one step's last lookup outcome. Runs under the CALLER's
135
+ * scope, which RLS pins to its own org: a context naming another org's pipeline
136
+ * is refused by the caller before it gets here.
137
+ */
138
+ export async function recordStepLookup(r) {
139
+ const values = {
140
+ orgId: r.orgId,
141
+ pipelineId: r.pipelineId,
142
+ stepKey: r.stepKey,
143
+ pluginPublisher: r.pluginPublisher ?? null,
144
+ pluginName: r.pluginName,
145
+ requestedVersion: r.requestedVersion ?? null,
146
+ resolvedVersion: r.resolvedVersion ?? null,
147
+ resolvedPluginId: r.resolvedPluginId ?? null,
148
+ imageDigest: r.imageDigest ?? null,
149
+ warnings: r.warnings.slice(0, 50).map((w) => ({ code: w.code, message: w.message.slice(0, 2000), ...(w.severity ? { severity: w.severity } : {}) })),
150
+ refusal: r.refusal ?? null,
151
+ lookedUpAt: r.lookedUpAt ?? new Date(),
152
+ };
153
+ const { pipelineId: _p, stepKey: _s, ...update } = values;
154
+ await withTenantTx((tx) => tx.insert(L()).values(values)
155
+ .onConflictDoUpdate({ target: [L().pipelineId, L().stepKey], set: update }));
156
+ }
157
+ /** A pipeline's recorded step lookups (its org only). */
158
+ export async function pipelineStepLookups(orgId, pipelineId) {
159
+ return withTenantTx((tx) => tx.select().from(L())
160
+ .where(and(eq(L().orgId, orgId), eq(L().pipelineId, pipelineId)))
161
+ .orderBy(L().stepKey));
162
+ }
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtc3RlcC1yZXNvbHV0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9waXBlbGluZS1zdGVwLXJlc29sdXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQTRCdEQsMEVBQTBFO0FBQzFFLE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBYTtJQUN4QyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFFRCx3RkFBd0Y7QUFDeEYsTUFBTSxVQUFVLFdBQVcsQ0FBQyxTQUFpQixFQUFFLFFBQWdCO0lBQzdELE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxTQUFTLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxJQUFJLFFBQVEsRUFBRSxDQUFDO0FBQ2hHLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUs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dXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogUGVyLVNURVAgcGx1Z2luIHJlc29sdXRpb24gc3RhdGUgb2YgYSBwaXBlbGluZSwgYmV5b25kIHRoZSB2ZXJzaW9uLWxldmVsXG4gKiByZXBvcnRpbmcgdGFibGVzOlxuICpcbiAqICAtIHtAbGluayBkZWNsYXJlZFJlc29sdXRpb259IOKAlCB0aGUgcm93cyBgcGlwZWxpbmVfcGx1Z2luX3Jlc29sdXRpb25gIGFuZCB0aGVcbiAqICAgIGRlY2xhcmVkIGV4cG9zdXJlcyBhcmUgd3JpdHRlbiBmcm9tLCBnaXZlbiB0aGUgcGlwZWxpbmUncyBwbHVnaW4gc3RlcHMgYW5kXG4gKiAgICBhIHJlc29sdmVyLiBPTkUgYXNzZW1ibHkgZm9yIGJvdGggd3JpdGVyczogdGhlIHBpcGVsaW5lIHNlcnZpY2Ugb24gYSBzYXZlXG4gKiAgICAocmVzb2x2aW5nIHRoZSB3YXkgaXRzIGNvbnRyYWN0IGNoZWNrIGRvZXMpIGFuZCB0aGUgcGx1Z2luIHNlcnZpY2Ugd2hlbiBhXG4gKiAgICBwdWJsaXNoLCBhIGZsYWcgLyB1bmZsYWcgb3IgYSB5YW5rIGNoYW5nZXMgd2hhdCBhIGRlY2xhcmVkIHJhbmdlIHJlc29sdmVzIHRvXG4gKiAgICAocmVzb2x2aW5nIHRoZSB3YXkgYC9wbHVnaW5zL2xvb2t1cGAgZG9lcykuIFRoZSBzdGVwIGxpc3QgY29tZXMgZnJvbSB0aGVcbiAqICAgIGNhbGxlciAocGlwZWxpbmUtY29yZSdzIGBjb2xsZWN0UGx1Z2luU3RlcHNgLCB3aGljaCB0aGlzIHBhY2thZ2UgY2Fubm90XG4gKiAgICBpbXBvcnQpLCBhbmQgdGhlIHdyaXRlcyBzdGF5IHdpdGggdGhlIGNhbGxlciwgc28gZWFjaCBjYW4gdGVzdCBpdHMgb3duLlxuICogIC0gYHBpcGVsaW5lX3N0ZXBfbG9va3Vwc2Ag4oCUIHdoYXQgc3ludGggd2FzIFRPTEQgcGVyIHN0ZXAgYXQgaXRzIGxhc3QgbG9va3VwXG4gKiAgICAoe0BsaW5rIHJlY29yZFN0ZXBMb29rdXB9KSwgd2hlbiBzeW50aCBzZW5kcyB0aGUgc3RlcCdzIGNvbnRleHQuXG4gKi9cblxuaW1wb3J0IHsgYW5kLCBlcSwgc3FsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHR5cGUgeyBFeHBvc3VyZVN0ZXAsIFJlc29sdmVkU3RlcCwgU2NhblN0YXRlIH0gZnJvbSAnLi9yZXBvcnRpbmcvcGx1Z2luLWV4cG9zdXJlLmpzJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB7IGV4ZWN1dGVSb3dzIH0gZnJvbSAnLi4vZGF0YWJhc2UvcGctcmVzdWx0LmpzJztcbmltcG9ydCB7IHdpdGhUZW5hbnRUeCB9IGZyb20gJy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG4vKiogT25lIHBsdWdpbiBzdGVwIG9mIGEgcGlwZWxpbmUsIGFzIHBpcGVsaW5lLWNvcmUncyBgY29sbGVjdFBsdWdpblN0ZXBzYCArIGBwbHVnaW5Mb29rdXBGaWx0ZXJgIGRlc2NyaWJlIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWNsYXJlZFN0ZXBJbnB1dCB7XG4gIC8qKiBgc3ludGhgIG9yIGA8c3RhZ2VOYW1lPi88YWxpYXMgPz8gbmFtZT5gLiAqL1xuICBsYWJlbDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHB1Ymxpc2hlcj86IHN0cmluZztcbiAgLyoqIFRoZSByZWZlcmVuY2UncyBvd24gYGZpbHRlcmAgKGl0cyBgdmVyc2lvbmAgaXMgdGhlIGRlY2xhcmVkIHNwZWMpLiAqL1xuICBmaWx0ZXI/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIFRoZSBsb29rdXAgZmlsdGVyIHN5bnRoIHdvdWxkIHNlbmQgZm9yIGl0LiAqL1xuICBsb29rdXBGaWx0ZXI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogV2hhdCBhIHN0ZXAncyByZWZlcmVuY2UgcmVzb2x2ZWQgdG8uICovXG5leHBvcnQgaW50ZXJmYWNlIERlY2xhcmVkU3RlcFBsdWdpbiB7XG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgbGlzdGluZydzIHB1Ymxpc2hlcjsgbnVsbCBmb3IgYW4gb3JnIHJvdy4gKi9cbiAgcHVibGlzaGVyOiBzdHJpbmcgfCBudWxsO1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbiAgaW1hZ2VEaWdlc3Q/OiBzdHJpbmcgfCBudWxsO1xuICBzY2FuPzogU2NhblN0YXRlO1xufVxuXG4vKiogQSByZXNvbHZlcidzIGFuc3dlcjogYSBwbHVnaW4sIGEgcmVmdXNhbCAodGhlIHJlZmVyZW5jZSBjYW4ndCByZXNvbHZlKSwgb3Igbm90aGluZyBhdCBhbGwuICovXG5leHBvcnQgdHlwZSBEZWNsYXJlZFN0ZXBSZXNvbHV0aW9uID0geyBwbHVnaW46IERlY2xhcmVkU3RlcFBsdWdpbiB9IHwgeyByZWZ1c2FsOiB1bmtub3duIH0gfCBudWxsO1xuXG4vKiogYEJ1aWxkL3NjYW5gIOKGkiBgWydCdWlsZCcsICdzY2FuJ11gOyBgc3ludGhgIOKGkiBgWydzeW50aCcsICdzeW50aCddYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFnZUFuZFN0ZXAobGFiZWw6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICBjb25zdCBhdCA9IGxhYmVsLmluZGV4T2YoJy8nKTtcbiAgcmV0dXJuIGF0ID09PSAtMSA/IFtsYWJlbCwgbGFiZWxdIDogW2xhYmVsLnNsaWNlKDAsIGF0KSwgbGFiZWwuc2xpY2UoYXQgKyAxKV07XG59XG5cbi8qKiBUaGUgc3RlcCBsYWJlbCBhIHJlc29sdXRpb24gcm93IHN0YW5kcyBmb3IgKHRoZSBpbnZlcnNlIG9mIHtAbGluayBzdGFnZUFuZFN0ZXB9KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVwTGFiZWxPZihzdGFnZU5hbWU6IHN0cmluZywgc3RlcE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzdGFnZU5hbWUgPT09IHN0ZXBOYW1lICYmIHN0YWdlTmFtZSA9PT0gJ3N5bnRoJyA/ICdzeW50aCcgOiBgJHtzdGFnZU5hbWV9LyR7c3RlcE5hbWV9YDtcbn1cblxuLyoqXG4gKiBUaGUgZGVjbGFyZWQgcmVzb2x1dGlvbiByb3dzIG9mIGEgcGlwZWxpbmUgYW5kIHRoZSBzdGVwcyBpdHMgREVDTEFSRURcbiAqIGV4cG9zdXJlcyByZWNvbmNpbGUgYWdhaW5zdC4gRWFjaCBzdGVwIHJlc29sdmVzIGFzIHN5bnRoIHdvdWxkLCBwbHVzIHdoYXQgYW5cbiAqIFVOVkVSU0lPTkVEIHJlZmVyZW5jZSByZXNvbHZlcyB0byBub3cgKHRoZSBcImxhdGVzdFwiIHRoZSB2ZXJzaW9uIGdhcCBpcyBtZWFzdXJlZFxuICogYWdhaW5zdCkuIEEgcmVmdXNlZCByZWZlcmVuY2UgaXMgcmVjb3JkZWQgd2l0aCBubyByZXNvbHZlZCB2ZXJzaW9uIGFuZFxuICogYHdpdGhpblBvbGljeTogZmFsc2VgIHJhdGhlciB0aGFuIGRyb3BwZWQ6IFwidGhpcyBzdGVwIGNhbiBubyBsb25nZXIgcmVzb2x2ZVwiXG4gKiBpcyBwcmVjaXNlbHkgd2hhdCB0aGUgb3V0ZGF0ZWQgc2VjdGlvbiBzaG91bGQgc2hvdy4gRWFjaCBkaXN0aW5jdCBmaWx0ZXIgaXNcbiAqIHJlc29sdmVkIG9uY2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNsYXJlZFJlc29sdXRpb24oaW5wdXQ6IHtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBvcmdJZDogc3RyaW5nO1xuICByb290T3JnSWQ/OiBzdHJpbmcgfCBudWxsO1xuICBzdGVwczogcmVhZG9ubHkgRGVjbGFyZWRTdGVwSW5wdXRbXTtcbiAgcmVzb2x2ZTogKGZpbHRlcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IFByb21pc2U8RGVjbGFyZWRTdGVwUmVzb2x1dGlvbj47XG59KTogUHJvbWlzZTx7IHJvd3M6IFJlc29sdmVkU3RlcFtdOyBleHBvc3VyZVN0ZXBzOiBFeHBvc3VyZVN0ZXBbXSB9PiB7XG4gIGNvbnN0IG1lbW8gPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxEZWNsYXJlZFN0ZXBSZXNvbHV0aW9uPj4oKTtcbiAgY29uc3QgcmVzb2x2ZSA9IChmaWx0ZXI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmVudHJpZXMoZmlsdGVyKS5zb3J0KChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSk7XG4gICAgbGV0IGhpdCA9IG1lbW8uZ2V0KGtleSk7XG4gICAgaWYgKCFoaXQpIHtcbiAgICAgIGhpdCA9IGlucHV0LnJlc29sdmUoZmlsdGVyKTtcbiAgICAgIG1lbW8uc2V0KGtleSwgaGl0KTtcbiAgICB9XG4gICAgcmV0dXJuIGhpdDtcbiAgfTtcbiAgY29uc3Qgcm93cyA9IG5ldyBNYXA8c3RyaW5nLCBSZXNvbHZlZFN0ZXA+KCk7XG4gIGNvbnN0IGV4cG9zdXJlU3RlcHM6IEV4cG9zdXJlU3RlcFtdID0gW107XG4gIGZvciAoY29uc3Qgc3RlcCBvZiBpbnB1dC5zdGVwcykge1xuICAgIGNvbnN0IHJlc29sdXRpb24gPSBhd2FpdCByZXNvbHZlKHN0ZXAubG9va3VwRmlsdGVyKTtcbiAgICBjb25zdCBwbHVnaW4gPSByZXNvbHV0aW9uICYmICdwbHVnaW4nIGluIHJlc29sdXRpb24gPyByZXNvbHV0aW9uLnBsdWdpbiA6IG51bGw7XG4gICAgY29uc3QgbGF0ZXN0ID0gYXdhaXQgcmVzb2x2ZSh7IG5hbWU6IHN0ZXAubmFtZSwgLi4uKHN0ZXAucHVibGlzaGVyID8geyBwdWJsaXNoZXI6IHN0ZXAucHVibGlzaGVyIH0gOiB7fSksIGlzQWN0aXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IGxhdGVzdFBsdWdpbiA9IGxhdGVzdCAmJiAncGx1Z2luJyBpbiBsYXRlc3QgPyBsYXRlc3QucGx1Z2luIDogbnVsbDtcbiAgICBjb25zdCBbc3RhZ2VOYW1lLCBzdGVwTmFtZV0gPSBzdGFnZUFuZFN0ZXAoc3RlcC5sYWJlbCk7XG4gICAgcm93cy5zZXQoYCR7c3RhZ2VOYW1lfVxcdTAwMDAke3N0ZXBOYW1lfWAsIHtcbiAgICAgIG9yZ0lkOiBpbnB1dC5vcmdJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IGlucHV0LnBpcGVsaW5lSWQsXG4gICAgICBzdGFnZU5hbWUsXG4gICAgICBzdGVwTmFtZSxcbiAgICAgIHBsdWdpblB1Ymxpc2hlcjogcGx1Z2luPy5wdWJsaXNoZXIgPz8gc3RlcC5wdWJsaXNoZXIgPz8gbnVsbCxcbiAgICAgIHBsdWdpbk5hbWU6IHBsdWdpbj8ubmFtZSA/PyBzdGVwLm5hbWUsXG4gICAgICBkZWNsYXJlZFZlcnNpb246IHR5cGVvZiBzdGVwLmZpbHRlcj8udmVyc2lvbiA9PT0gJ3N0cmluZycgPyBzdGVwLmZpbHRlci52ZXJzaW9uIDogbnVsbCxcbiAgICAgIHJlc29sdmVkVmVyc2lvbjogcGx1Z2luPy52ZXJzaW9uID8/IG51bGwsXG4gICAgICByZXNvbHZlZFBsdWdpbklkOiBwbHVnaW4/LmlkID8/IG51bGwsXG4gICAgICByZXNvbHZlZERpZ2VzdDogcGx1Z2luPy5pbWFnZURpZ2VzdCA/PyBudWxsLFxuICAgICAgbGF0ZXN0VmVyc2lvbjogbGF0ZXN0UGx1Z2luPy52ZXJzaW9uID8/IG51bGwsXG4gICAgICB3aXRoaW5Qb2xpY3k6ICEocmVzb2x1dGlvbiAmJiAncmVmdXNhbCcgaW4gcmVzb2x1dGlvbiksXG4gICAgICByb290T3JnSWQ6IGlucHV0LnJvb3RPcmdJZCA/PyBudWxsLFxuICAgIH0pO1xuICAgIGlmIChwbHVnaW4pIHtcbiAgICAgIGV4cG9zdXJlU3RlcHMucHVzaCh7XG4gICAgICAgIHBsdWdpblB1Ymxpc2hlcjogcGx1Z2luLnB1Ymxpc2hlcixcbiAgICAgICAgcGx1Z2luTmFtZTogcGx1Z2luLm5hbWUsXG4gICAgICAgIHBsdWdpblZlcnNpb246IHBsdWdpbi52ZXJzaW9uLFxuICAgICAgICBpbWFnZURpZ2VzdDogcGx1Z2luLmltYWdlRGlnZXN0ID8/IG51bGwsXG4gICAgICAgIHNjYW46IHBsdWdpbi5zY2FuID8/IHt9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IHJvd3M6IFsuLi5yb3dzLnZhbHVlcygpXSwgZXhwb3N1cmVTdGVwcyB9O1xufVxuXG4vKiogQSBwaXBlbGluZSB3aG9zZSBkZWNsYXJlZCBzdGVwcyByZWZlcmVuY2UgYSBwbHVnaW4sIHdpdGggd2hhdCByZS1yZXNvbHZpbmcgaXQgbmVlZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIERlY2xhcmVkUGlwZWxpbmVSZWYge1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIHJvb3RPcmdJZDogc3RyaW5nIHwgbnVsbDtcbiAgcHJvcHM6IHVua25vd247XG4gIC8qKiBUaGUgc3RlcCByb3dzIGFzIGxhc3QgcmVjb3JkZWQ6IGBzdGFnZVxcMHN0ZXBgIOKGkiByZXNvbHZlZCB2ZXJzaW9uICsgZGlnZXN0LiAqL1xuICBjdXJyZW50OiBNYXA8c3RyaW5nLCB7IHJlc29sdmVkVmVyc2lvbjogc3RyaW5nIHwgbnVsbDsgcmVzb2x2ZWREaWdlc3Q6IHN0cmluZyB8IG51bGwgfT47XG59XG5cbi8qKlxuICogVGhlIExJVkUgcGlwZWxpbmVzIHdob3NlIGRlY2xhcmVkIHN0ZXBzIHJlZmVyZW5jZSBhIHBsdWdpbiDigJQgYSBsaXN0aW5nIChldmVyeVxuICogb3JnJ3MgcGlwZWxpbmVzIG5hbWluZyB0aGF0IHB1Ymxpc2hlcikgb3IgYW4gb3JnJ3Mgb3duIHBsdWdpbiAodGhhdCBvcmcncyBhbmRcbiAqIGl0cyB0ZWFtcycgdW5xdWFsaWZpZWQgcmVmZXJlbmNlcykg4oCUIG9sZGVzdCBjb21wdXRhdGlvbiBmaXJzdCwgYXQgbW9zdCBgbGltaXRgLlxuICogTXVzdCBydW4gd2l0aCBhIHNjb3BlIHRoYXQgY2FuIHJlYWQgZXZlcnkgb3JnJ3Mgcm93cyAoZWxldmF0ZWQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVjbGFyZWRQaXBlbGluZXNGb3JQbHVnaW4oXG4gIHRhcmdldDogeyBwbHVnaW5OYW1lOiBzdHJpbmc7IHB1Ymxpc2hlcjogc3RyaW5nIH0gfCB7IHBsdWdpbk5hbWU6IHN0cmluZzsgb3JnSWQ6IHN0cmluZyB9LFxuICBsaW1pdDogbnVtYmVyLFxuKTogUHJvbWlzZTx7IHBpcGVsaW5lczogRGVjbGFyZWRQaXBlbGluZVJlZltdOyB0cnVuY2F0ZWQ6IGJvb2xlYW4gfT4ge1xuICBjb25zdCBvd25lciA9ICdwdWJsaXNoZXInIGluIHRhcmdldFxuICAgID8gc3FsYHIucGx1Z2luX3B1Ymxpc2hlciA9ICR7dGFyZ2V0LnB1Ymxpc2hlcn1gXG4gICAgOiBzcWxgci5wbHVnaW5fcHVibGlzaGVyIElTIE5VTEwgQU5EIChsb3dlcihyLm9yZ19pZCkgPSAke3RhcmdldC5vcmdJZC50b0xvd2VyQ2FzZSgpfSBPUiBsb3dlcihyLnJvb3Rfb3JnX2lkKSA9ICR7dGFyZ2V0Lm9yZ0lkLnRvTG93ZXJDYXNlKCl9KWA7XG4gIHJldHVybiB3aXRoVGVuYW50VHgoYXN5bmMgKHR4KSA9PiB7XG4gICAgY29uc3QgaWRzID0gYXdhaXQgZXhlY3V0ZVJvd3M8eyBwaXBlbGluZV9pZDogc3RyaW5nIH0+KHR4LCBzcWxgXG4gICAgICBTRUxFQ1Qgci5waXBlbGluZV9pZCwgTUlOKHIuY29tcHV0ZWRfYXQpIEFTIG9sZGVzdFxuICAgICAgICBGUk9NIHBpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uIHJcbiAgICAgICAgSk9JTiBwaXBlbGluZXMgcCBPTiBwLmlkOjp0ZXh0ID0gci5waXBlbGluZV9pZCBBTkQgcC5kZWxldGVkX2F0IElTIE5VTExcbiAgICAgICBXSEVSRSByLnBsdWdpbl9uYW1lID0gJHt0YXJnZXQucGx1Z2luTmFtZX0gQU5EICR7b3duZXJ9XG4gICAgICAgR1JPVVAgQlkgci5waXBlbGluZV9pZFxuICAgICAgIE9SREVSIEJZIG9sZGVzdFxuICAgICAgIExJTUlUICR7bGltaXQgKyAxfVxuICAgIGApO1xuICAgIGNvbnN0IHRydW5jYXRlZCA9IGlkcy5sZW5ndGggPiBsaW1pdDtcbiAgICBjb25zdCB3YW50ZWQgPSBpZHMuc2xpY2UoMCwgbGltaXQpLm1hcCgocikgPT4gci5waXBlbGluZV9pZCk7XG4gICAgaWYgKHdhbnRlZC5sZW5ndGggPT09IDApIHJldHVybiB7IHBpcGVsaW5lczogW10sIHRydW5jYXRlZDogZmFsc2UgfTtcbiAgICBjb25zdCBwaXBlbGluZXMgPSBhd2FpdCBleGVjdXRlUm93czx7IGlkOiBzdHJpbmc7IG9yZ19pZDogc3RyaW5nOyBwcm9wczogdW5rbm93biB9Pih0eCwgc3FsYFxuICAgICAgU0VMRUNUIHAuaWQ6OnRleHQgQVMgaWQsIHAub3JnX2lkLCBwLnByb3BzIEZST00gcGlwZWxpbmVzIHAgV0hFUkUgcC5pZDo6dGV4dCA9IEFOWSgke3dhbnRlZH0pIEFORCBwLmRlbGV0ZWRfYXQgSVMgTlVMTFxuICAgIGApO1xuICAgIGNvbnN0IHN0ZXBzID0gYXdhaXQgZXhlY3V0ZVJvd3M8eyBwaXBlbGluZV9pZDogc3RyaW5nOyBzdGFnZV9uYW1lOiBzdHJpbmc7IHN0ZXBfbmFtZTogc3RyaW5nOyByZXNvbHZlZF92ZXJzaW9uOiBzdHJpbmcgfCBudWxsOyByZXNvbHZlZF9kaWdlc3Q6IHN0cmluZyB8IG51bGw7IHJvb3Rfb3JnX2lkOiBzdHJpbmcgfCBudWxsIH0+KHR4LCBzcWxgXG4gICAgICBTRUxFQ1QgcGlwZWxpbmVfaWQsIHN0YWdlX25hbWUsIHN0ZXBfbmFtZSwgcmVzb2x2ZWRfdmVyc2lvbiwgcmVzb2x2ZWRfZGlnZXN0LCByb290X29yZ19pZFxuICAgICAgICBGUk9NIHBpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uIFdIRVJFIHBpcGVsaW5lX2lkID0gQU5ZKCR7d2FudGVkfSlcbiAgICBgKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHJ1bmNhdGVkLFxuICAgICAgcGlwZWxpbmVzOiBwaXBlbGluZXMubWFwKChwKSA9PiB7XG4gICAgICAgIGNvbnN0IG93biA9IHN0ZXBzLmZpbHRlcigocykgPT4gcy5waXBlbGluZV9pZCA9PT0gcC5pZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGlwZWxpbmVJZDogcC5pZCxcbiAgICAgICAgICBvcmdJZDogcC5vcmdfaWQsXG4gICAgICAgICAgcm9vdE9yZ0lkOiBvd24uZmluZCgocykgPT4gcy5yb290X29yZ19pZCk/LnJvb3Rfb3JnX2lkID8/IG51bGwsXG4gICAgICAgICAgcHJvcHM6IHAucHJvcHMsXG4gICAgICAgICAgY3VycmVudDogbmV3IE1hcChvd24ubWFwKChzKSA9PiBbYCR7cy5zdGFnZV9uYW1lfVxcdTAwMDAke3Muc3RlcF9uYW1lfWAsIHsgcmVzb2x2ZWRWZXJzaW9uOiBzLnJlc29sdmVkX3ZlcnNpb24sIHJlc29sdmVkRGlnZXN0OiBzLnJlc29sdmVkX2RpZ2VzdCB9XSkpLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKiBPbmUgc3RlcCdzIGxvb2t1cCBvdXRjb21lLCBhcyBgL3BsdWdpbnMvbG9va3VwYCByZWNvcmRzIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGVwTG9va3VwUmVjb3JkIHtcbiAgb3JnSWQ6IHN0cmluZztcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBzdGVwS2V5OiBzdHJpbmc7XG4gIHBsdWdpblB1Ymxpc2hlcj86IHN0cmluZyB8IG51bGw7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgcmVxdWVzdGVkVmVyc2lvbj86IHN0cmluZyB8IG51bGw7XG4gIHJlc29sdmVkVmVyc2lvbj86IHN0cmluZyB8IG51bGw7XG4gIHJlc29sdmVkUGx1Z2luSWQ/OiBzdHJpbmcgfCBudWxsO1xuICBpbWFnZURpZ2VzdD86IHN0cmluZyB8IG51bGw7XG4gIHdhcm5pbmdzOiBBcnJheTx7IGNvZGU6IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nOyBzZXZlcml0eT86IHN0cmluZyB9PjtcbiAgcmVmdXNhbD86IHsgY29kZTogc3RyaW5nOyByZWFzb246IHN0cmluZzsgbWVzc2FnZTogc3RyaW5nIH0gfCBudWxsO1xuICBsb29rZWRVcEF0PzogRGF0ZTtcbn1cblxuY29uc3QgTCA9ICgpID0+IHNjaGVtYS5waXBlbGluZVN0ZXBMb29rdXA7XG5cbi8qKlxuICogUmVjb3JkIChyZXBsYWNlKSBvbmUgc3RlcCdzIGxhc3QgbG9va3VwIG91dGNvbWUuIFJ1bnMgdW5kZXIgdGhlIENBTExFUidzXG4gKiBzY29wZSwgd2hpY2ggUkxTIHBpbnMgdG8gaXRzIG93biBvcmc6IGEgY29udGV4dCBuYW1pbmcgYW5vdGhlciBvcmcncyBwaXBlbGluZVxuICogaXMgcmVmdXNlZCBieSB0aGUgY2FsbGVyIGJlZm9yZSBpdCBnZXRzIGhlcmUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNvcmRTdGVwTG9va3VwKHI6IFN0ZXBMb29rdXBSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdmFsdWVzID0ge1xuICAgIG9yZ0lkOiByLm9yZ0lkLFxuICAgIHBpcGVsaW5lSWQ6IHIucGlwZWxpbmVJZCxcbiAgICBzdGVwS2V5OiByLnN0ZXBLZXksXG4gICAgcGx1Z2luUHVibGlzaGVyOiByLnBsdWdpblB1Ymxpc2hlciA/PyBudWxsLFxuICAgIHBsdWdpbk5hbWU6IHIucGx1Z2luTmFtZSxcbiAgICByZXF1ZXN0ZWRWZXJzaW9uOiByLnJlcXVlc3RlZFZlcnNpb24gPz8gbnVsbCxcbiAgICByZXNvbHZlZFZlcnNpb246IHIucmVzb2x2ZWRWZXJzaW9uID8/IG51bGwsXG4gICAgcmVzb2x2ZWRQbHVnaW5JZDogci5yZXNvbHZlZFBsdWdpbklkID8/IG51bGwsXG4gICAgaW1hZ2VEaWdlc3Q6IHIuaW1hZ2VEaWdlc3QgPz8gbnVsbCxcbiAgICB3YXJuaW5nczogci53YXJuaW5ncy5zbGljZSgwLCA1MCkubWFwKCh3KSA9PiAoeyBjb2RlOiB3LmNvZGUsIG1lc3NhZ2U6IHcubWVzc2FnZS5zbGljZSgwLCAyMDAwKSwgLi4uKHcuc2V2ZXJpdHkgPyB7IHNldmVyaXR5OiB3LnNldmVyaXR5IH0gOiB7fSkgfSkpLFxuICAgIHJlZnVzYWw6IHIucmVmdXNhbCA/PyBudWxsLFxuICAgIGxvb2tlZFVwQXQ6IHIubG9va2VkVXBBdCA/PyBuZXcgRGF0ZSgpLFxuICB9O1xuICBjb25zdCB7IHBpcGVsaW5lSWQ6IF9wLCBzdGVwS2V5OiBfcywgLi4udXBkYXRlIH0gPSB2YWx1ZXM7XG4gIGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4Lmluc2VydChMKCkpLnZhbHVlcyh2YWx1ZXMpXG4gICAgLm9uQ29uZmxpY3REb1VwZGF0ZSh7IHRhcmdldDogW0woKS5waXBlbGluZUlkLCBMKCkuc3RlcEtleV0sIHNldDogdXBkYXRlIH0pKTtcbn1cblxuLyoqIEEgcGlwZWxpbmUncyByZWNvcmRlZCBzdGVwIGxvb2t1cHMgKGl0cyBvcmcgb25seSkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGlwZWxpbmVTdGVwTG9va3VwcyhvcmdJZDogc3RyaW5nLCBwaXBlbGluZUlkOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PHR5cGVvZiBzY2hlbWEucGlwZWxpbmVTdGVwTG9va3VwLiRpbmZlclNlbGVjdD4+IHtcbiAgcmV0dXJuIHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oTCgpKVxuICAgIC53aGVyZShhbmQoZXEoTCgpLm9yZ0lkLCBvcmdJZCksIGVxKEwoKS5waXBlbGluZUlkLCBwaXBlbGluZUlkKSkpXG4gICAgLm9yZGVyQnkoTCgpLnN0ZXBLZXkpKSBhcyBQcm9taXNlPEFycmF5PHR5cGVvZiBzY2hlbWEucGlwZWxpbmVTdGVwTG9va3VwLiRpbmZlclNlbGVjdD4+O1xufVxuIl19
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * An org's plugin CONSUMPTION POLICY: which publisher tiers it trusts, which
3
- * listings it blocks, which advisory severities block a resolution, and which
4
- * tiers may receive secrets. Applied at every resolution (see
3
+ * listings it blocks, which advisory severities block a resolution, which
4
+ * tiers may receive secrets, and how loud a version's fixable High findings are. Applied at every resolution (see
5
5
  * ./plugin-resolution.ts) and edited through the org's policy row.
6
6
  *
7
7
  * Pure functions over the stored row — no I/O — so the same rules run in the
@@ -18,6 +18,12 @@ export interface ConsumptionPolicy {
18
18
  /** What to do when a name overrides a listing or the parent org's plugin. */
19
19
  shadowing: ShadowingMode;
20
20
  blockedListings: BlockedListingRef[];
21
+ /**
22
+ * Fixable High findings above this many make a version's warning a `warning`
23
+ * rather than `info` (lookup, save, runtime check). Vulnerability state never
24
+ * refuses a pipeline; this only sets how loud it is. null = never louder than info.
25
+ */
26
+ warnFixableHigh: number | null;
21
27
  }
22
28
  /** The defaults (and the column defaults of `plugin_install_policies`). */
23
29
  export declare const DEFAULT_CONSUMPTION_POLICY: Readonly<ConsumptionPolicy>;
@@ -2,8 +2,8 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  /**
4
4
  * An org's plugin CONSUMPTION POLICY: which publisher tiers it trusts, which
5
- * listings it blocks, which advisory severities block a resolution, and which
6
- * tiers may receive secrets. Applied at every resolution (see
5
+ * listings it blocks, which advisory severities block a resolution, which
6
+ * tiers may receive secrets, and how loud a version's fixable High findings are. Applied at every resolution (see
7
7
  * ./plugin-resolution.ts) and edited through the org's policy row.
8
8
  *
9
9
  * Pure functions over the stored row — no I/O — so the same rules run in the
@@ -22,6 +22,7 @@ export const DEFAULT_CONSUMPTION_POLICY = Object.freeze({
22
22
  // deployment that already relies on it. `deny` is the opt-in.
23
23
  shadowing: 'warn',
24
24
  blockedListings: [],
25
+ warnFixableHigh: 0,
25
26
  });
26
27
  /** At most this many blocked listings per policy. */
27
28
  export const MAX_BLOCKED_LISTINGS = 500;
@@ -47,8 +48,17 @@ export function policyOf(row) {
47
48
  shadowing: row?.shadowing ?? d.shadowing,
48
49
  officialInstalls: row?.officialInstalls ?? d.officialInstalls,
49
50
  blockedListings: uniqueListings(row?.blockedListings ?? d.blockedListings),
51
+ warnFixableHigh: row === null || row === undefined || row.warnFixableHigh === undefined ? d.warnFixableHigh : row.warnFixableHigh,
50
52
  };
51
53
  }
54
+ /** The stricter of two optional thresholds: the lower number, or whichever is set. */
55
+ function stricterFloor(a, b) {
56
+ if (a === null)
57
+ return b;
58
+ if (b === null)
59
+ return a;
60
+ return Math.min(a, b);
61
+ }
52
62
  /**
53
63
  * A team's policy under its root org's: each field takes the STRICTER of
54
64
  * the two, so a team can narrow what its root allows but never widen it.
@@ -69,6 +79,7 @@ export function mergeConsumptionPolicies(root, team) {
69
79
  // setting — the team is the party doing the shadowing.
70
80
  shadowing: SHADOW_ORDER.indexOf(root.shadowing) >= SHADOW_ORDER.indexOf(team.shadowing) ? root.shadowing : team.shadowing,
71
81
  blockedListings: uniqueListings([...root.blockedListings, ...team.blockedListings]),
82
+ warnFixableHigh: stricterFloor(root.warnFixableHigh, team.warnFixableHigh),
72
83
  };
73
84
  }
74
85
  /**
@@ -121,6 +132,12 @@ export function applyPolicyUpdate(base, input) {
121
132
  return 'officialInstalls must be implicit or explicit';
122
133
  next.officialInstalls = b.officialInstalls;
123
134
  }
135
+ if (b.warnFixableHigh !== undefined) {
136
+ if (b.warnFixableHigh !== null && !(Number.isInteger(b.warnFixableHigh) && b.warnFixableHigh >= 0)) {
137
+ return 'warnFixableHigh must be a non-negative integer or null';
138
+ }
139
+ next.warnFixableHigh = b.warnFixableHigh;
140
+ }
124
141
  if (b.blockedListings !== undefined) {
125
142
  if (!Array.isArray(b.blockedListings))
126
143
  return 'blockedListings must be an array';
@@ -141,4 +158,4 @@ export function applyPolicyUpdate(base, input) {
141
158
  }
142
159
  return next;
143
160
  }
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWNvbnN1bXB0aW9uLXBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcGx1Z2luLWNvbnN1bXB0aW9uLXBvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQU9MLGVBQWUsR0FDaEIsTUFBTSwrQkFBK0IsQ0FBQztBQWV2QywyRUFBMkU7QUFDM0UsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQWdDLE1BQU0sQ0FBQyxNQUFNLENBQW9CO0lBQ3RHLFlBQVksRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUM7SUFDdEMsb0JBQW9CLEVBQUUsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDO0lBQ2pELG1CQUFtQixFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQztJQUM3QyxlQUFlLEVBQUUsVUFBVTtJQUMzQixnQkFBZ0IsRUFBRSxVQUFVO0lBQzVCLDZFQUE2RTtJQUM3RSx5RUFBeUU7SUFDekUsOERBQThEO0lBQzlELFNBQVMsRUFBRSxNQUFNO0lBQ2pCLGVBQWUsRUFBRSxFQUFFO0NBQ3BCLENBQUMsQ0FBQztBQUVILHFEQUFxRDtBQUNyRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFFeEMsTUFBTSxXQUFXLEdBQStCLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM5RSx1RUFBdUU7QUFDdkUsTUFBTSxZQUFZLEdBQTZCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUV6RSxNQUFNLFNBQVMsR0FBRyxDQUFDLEtBQThCLEVBQW1CLEVBQUUsQ0FDcEUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFvQixFQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBRWhGLFNBQVMsY0FBYyxDQUFDLElBQWtDO0lBQ3hELE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO0lBQ2xELEtBQUssTUFBTSxDQUFDLElBQUksSUFBSTtRQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3hGLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBRUQsb0VBQW9FO0FBQ3BFLE1BQU0sVUFBVSxRQUFRLENBQUMsR0FBb0Q7SUFDM0UsTUFBTSxDQUFDLEdBQUcsMEJBQTBCLENBQUM7SUFDckMsT0FBTztRQUNMLFlBQVksRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLFlBQVksSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQzVELG9CQUFvQixFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLElBQUksQ0FBQyxDQUFDLG9CQUFvQixDQUFDO1FBQ3BGLG1CQUFtQixFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLElBQUksQ0FBQyxDQUFDLG1CQUFtQixDQUFDO1FBQ2pGLGVBQWUsRUFBRSxHQUFHLEVBQUUsZUFBZSxJQUFJLENBQUMsQ0FBQyxlQUFlO1FBQzFELFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxJQUFJLENBQUMsQ0FBQyxTQUFTO1FBQ3hDLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsZ0JBQWdCO1FBQzdELGVBQWUsRUFBRSxjQUFjLENBQUMsR0FBRyxFQUFFLGVBQWUsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDO0tBQzNFLENBQUM7QUFDSixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLElBQXVCLEVBQUUsSUFBdUI7SUFDdkYsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFrQixFQUFFLENBQWtCLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQWtCLEVBQUUsQ0FBa0IsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUMxRyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUNoRCxPQUFPO1FBQ0wsWUFBWSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDN0Qsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDakYsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDbEYsZUFBZSxFQUFFLGFBQWE7UUFDOUIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixLQUFLLFVBQVUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVU7UUFDeEgsNEVBQTRFO1FBQzVFLDJFQUEyRTtRQUMzRSx1REFBdUQ7UUFDdkQsU0FBUyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUztRQUN6SCxlQUFlLEVBQUUsY0FBYyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0tBQ3BGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FDeEMsSUFBc0UsRUFDdEUsS0FBYSxFQUNiLFNBQWtCO0lBRWxCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3hELElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxLQUFLLEtBQUs7UUFBRSxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUN2RSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDcEUsQ0FBQztBQUVELE1BQU0sU0FBUyxHQUFHLDRCQUE0QixDQUFDO0FBQy9DLE1BQU0sT0FBTyxHQUFHLHdCQUF3QixDQUFDO0FBRXpDLFNBQVMsUUFBUSxDQUFDLENBQVUsRUFBRSxLQUFhO0lBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sR0FBRyxLQUFLLDRCQUE0QixDQUFDO0lBQ25FLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUUsZUFBc0MsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRixJQUFJLEdBQUcsQ0FBQyxNQUFNO1FBQUUsT0FBTyxHQUFHLEtBQUssdUJBQXVCLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbkYsT0FBTyxTQUFTLENBQUMsQ0FBb0IsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLElBQXVCLEVBQUUsS0FBYztJQUN2RSxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sd0JBQXdCLENBQUM7SUFDakcsTUFBTSxDQUFDLEdBQUcsS0FBZ0MsQ0FBQztJQUMzQyxNQUFNLElBQUksR0FBc0IsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO0lBQzVDLEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQyxjQUFjLEVBQUUsc0JBQXNCLEVBQUUscUJBQXFCLENBQVUsRUFBRSxDQUFDO1FBQzdGLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVM7WUFBRSxTQUFTO1FBQ3JDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxlQUFrQyxDQUFDO1lBQUUsT0FBTyxpREFBaUQsQ0FBQztRQUMxSCxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxlQUFrQyxDQUFDO0lBQzlELENBQUM7SUFDRCxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsS0FBSyxVQUFVLElBQUksQ0FBQyxDQUFDLGdCQUFnQixLQUFLLFVBQVU7WUFBRSxPQUFPLCtDQUErQyxDQUFDO1FBQ25JLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLENBQUM7SUFDN0MsQ0FBQztJQUNELElBQUksQ0FBQyxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO1lBQUUsT0FBTyxrQ0FBa0MsQ0FBQztRQUNqRixJQUFJLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLG9CQUFvQjtZQUFFLE9BQU8sV0FBVyxvQkFBb0IsbUJBQW1CLENBQUM7UUFDL0csTUFBTSxJQUFJLEdBQXdCLEVBQUUsQ0FBQztRQUNyQyxLQUFLLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNwQyxNQUFNLEdBQUcsR0FBRyxPQUFPLEdBQUcsS0FBSyxRQUFRO2dCQUNqQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3pILENBQUMsQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRyxHQUF5QixDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUcsR0FBeUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3ZJLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUTttQkFDeEUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQy9ELE9BQU8sd0VBQXdFLENBQUM7WUFDbEYsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBBbiBvcmcncyBwbHVnaW4gQ09OU1VNUFRJT04gUE9MSUNZOiB3aGljaCBwdWJsaXNoZXIgdGllcnMgaXQgdHJ1c3RzLCB3aGljaFxuICogbGlzdGluZ3MgaXQgYmxvY2tzLCB3aGljaCBhZHZpc29yeSBzZXZlcml0aWVzIGJsb2NrIGEgcmVzb2x1dGlvbiwgYW5kIHdoaWNoXG4gKiB0aWVycyBtYXkgcmVjZWl2ZSBzZWNyZXRzLiBBcHBsaWVkIGF0IGV2ZXJ5IHJlc29sdXRpb24gKHNlZVxuICogLi9wbHVnaW4tcmVzb2x1dGlvbi50cykgYW5kIGVkaXRlZCB0aHJvdWdoIHRoZSBvcmcncyBwb2xpY3kgcm93LlxuICpcbiAqIFB1cmUgZnVuY3Rpb25zIG92ZXIgdGhlIHN0b3JlZCByb3cg4oCUIG5vIEkvTyDigJQgc28gdGhlIHNhbWUgcnVsZXMgcnVuIGluIHRoZVxuICogcmVzb2x2ZXIsIGluIHRoZSBwb2xpY3ktdXBkYXRlIHJvdXRlLCBhbmQgaW4gdGVzdHMuXG4gKi9cblxuaW1wb3J0IHtcbiAgdHlwZSBCbG9ja2VkTGlzdGluZ1JlZixcbiAgdHlwZSBCbG9ja09uQWR2aXNvcnksXG4gIHR5cGUgT2ZmaWNpYWxJbnN0YWxscyxcbiAgdHlwZSBTaGFkb3dpbmdNb2RlLFxuICB0eXBlIFBsdWdpbkluc3RhbGxQb2xpY3ksXG4gIHR5cGUgUHVibGlzaGVyVGllcixcbiAgUFVCTElTSEVSX1RJRVJTLFxufSBmcm9tICcuLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYS5qcyc7XG5cblxuLyoqIEFuIG9yZydzIGNvbnN1bXB0aW9uIHBvbGljeSwgYXMgdGhlIHJlc29sdmVyIGFwcGxpZXMgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnN1bXB0aW9uUG9saWN5IHtcbiAgYWxsb3dlZFRpZXJzOiBQdWJsaXNoZXJUaWVyW107XG4gIHJlcXVpcmVBcHByb3ZhbFRpZXJzOiBQdWJsaXNoZXJUaWVyW107XG4gIHNlY3JldHNBbGxvd2VkVGllcnM6IFB1Ymxpc2hlclRpZXJbXTtcbiAgYmxvY2tPbkFkdmlzb3J5OiBCbG9ja09uQWR2aXNvcnk7XG4gIG9mZmljaWFsSW5zdGFsbHM6IE9mZmljaWFsSW5zdGFsbHM7XG4gIC8qKiBXaGF0IHRvIGRvIHdoZW4gYSBuYW1lIG92ZXJyaWRlcyBhIGxpc3Rpbmcgb3IgdGhlIHBhcmVudCBvcmcncyBwbHVnaW4uICovXG4gIHNoYWRvd2luZzogU2hhZG93aW5nTW9kZTtcbiAgYmxvY2tlZExpc3RpbmdzOiBCbG9ja2VkTGlzdGluZ1JlZltdO1xufVxuXG4vKiogVGhlIGRlZmF1bHRzIChhbmQgdGhlIGNvbHVtbiBkZWZhdWx0cyBvZiBgcGx1Z2luX2luc3RhbGxfcG9saWNpZXNgKS4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NPTlNVTVBUSU9OX1BPTElDWTogUmVhZG9ubHk8Q29uc3VtcHRpb25Qb2xpY3k+ID0gT2JqZWN0LmZyZWV6ZTxDb25zdW1wdGlvblBvbGljeT4oe1xuICBhbGxvd2VkVGllcnM6IFsnb2ZmaWNpYWwnLCAndmVyaWZpZWQnXSxcbiAgcmVxdWlyZUFwcHJvdmFsVGllcnM6IFsnY29tbXVuaXR5JywgJ3VudmVyaWZpZWQnXSxcbiAgc2VjcmV0c0FsbG93ZWRUaWVyczogWydvZmZpY2lhbCcsICd2ZXJpZmllZCddLFxuICBibG9ja09uQWR2aXNvcnk6ICdjcml0aWNhbCcsXG4gIG9mZmljaWFsSW5zdGFsbHM6ICdpbXBsaWNpdCcsXG4gIC8vIGB3YXJuYCwgbm90IGBkZW55YDogc2hhZG93aW5nIGlzIGxlZ2l0aW1hdGUgKGFuIG9yZyBvdmVycmlkaW5nIGFuIE9mZmljaWFsXG4gIC8vIHBsdWdpbiBvbiBwdXJwb3NlKSwgc28gdGhlIGRlZmF1bHQgbWFrZXMgaXQgdmlzaWJsZSB3aXRob3V0IGJyZWFraW5nIGFcbiAgLy8gZGVwbG95bWVudCB0aGF0IGFscmVhZHkgcmVsaWVzIG9uIGl0LiBgZGVueWAgaXMgdGhlIG9wdC1pbi5cbiAgc2hhZG93aW5nOiAnd2FybicsXG4gIGJsb2NrZWRMaXN0aW5nczogW10sXG59KTtcblxuLyoqIEF0IG1vc3QgdGhpcyBtYW55IGJsb2NrZWQgbGlzdGluZ3MgcGVyIHBvbGljeS4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQkxPQ0tFRF9MSVNUSU5HUyA9IDUwMDtcblxuY29uc3QgQkxPQ0tfT1JERVI6IHJlYWRvbmx5IEJsb2NrT25BZHZpc29yeVtdID0gWyduZXZlcicsICdjcml0aWNhbCcsICdoaWdoJ107XG4vKiogSW5jcmVhc2luZyBzdHJpY3RuZXNzLCBzbyB0aGUgbWVyZ2UgY2FuIHRha2UgdGhlIGdyZWF0ZXIgb2YgdHdvLiAqL1xuY29uc3QgU0hBRE9XX09SREVSOiByZWFkb25seSBTaGFkb3dpbmdNb2RlW10gPSBbJ2FsbG93JywgJ3dhcm4nLCAnZGVueSddO1xuXG5jb25zdCBzb3J0VGllcnMgPSAodGllcnM6IEl0ZXJhYmxlPFB1Ymxpc2hlclRpZXI+KTogUHVibGlzaGVyVGllcltdID0+XG4gIFBVQkxJU0hFUl9USUVSUy5maWx0ZXIoKHQpID0+IG5ldyBTZXQodGllcnMpLmhhcyh0KSk7XG5cbmNvbnN0IGxpc3RpbmdLZXkgPSAocjogQmxvY2tlZExpc3RpbmdSZWYpOiBzdHJpbmcgPT4gYCR7ci5wdWJsaXNoZXJ9LyR7ci5uYW1lfWA7XG5cbmZ1bmN0aW9uIHVuaXF1ZUxpc3RpbmdzKHJlZnM6IHJlYWRvbmx5IEJsb2NrZWRMaXN0aW5nUmVmW10pOiBCbG9ja2VkTGlzdGluZ1JlZltdIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXA8c3RyaW5nLCBCbG9ja2VkTGlzdGluZ1JlZj4oKTtcbiAgZm9yIChjb25zdCByIG9mIHJlZnMpIHNlZW4uc2V0KGxpc3RpbmdLZXkociksIHsgcHVibGlzaGVyOiByLnB1Ymxpc2hlciwgbmFtZTogci5uYW1lIH0pO1xuICByZXR1cm4gWy4uLnNlZW4udmFsdWVzKCldLnNvcnQoKGEsIGIpID0+IGxpc3RpbmdLZXkoYSkubG9jYWxlQ29tcGFyZShsaXN0aW5nS2V5KGIpKSk7XG59XG5cbi8qKiBBIHN0b3JlZCBwb2xpY3kgcm93IChvciBub25lKSBhcyBhIHtAbGluayBDb25zdW1wdGlvblBvbGljeX0uICovXG5leHBvcnQgZnVuY3Rpb24gcG9saWN5T2Yocm93OiBQYXJ0aWFsPFBsdWdpbkluc3RhbGxQb2xpY3k+IHwgbnVsbCB8IHVuZGVmaW5lZCk6IENvbnN1bXB0aW9uUG9saWN5IHtcbiAgY29uc3QgZCA9IERFRkFVTFRfQ09OU1VNUFRJT05fUE9MSUNZO1xuICByZXR1cm4ge1xuICAgIGFsbG93ZWRUaWVyczogc29ydFRpZXJzKHJvdz8uYWxsb3dlZFRpZXJzID8/IGQuYWxsb3dlZFRpZXJzKSxcbiAgICByZXF1aXJlQXBwcm92YWxUaWVyczogc29ydFRpZXJzKHJvdz8ucmVxdWlyZUFwcHJvdmFsVGllcnMgPz8gZC5yZXF1aXJlQXBwcm92YWxUaWVycyksXG4gICAgc2VjcmV0c0FsbG93ZWRUaWVyczogc29ydFRpZXJzKHJvdz8uc2VjcmV0c0FsbG93ZWRUaWVycyA/PyBkLnNlY3JldHNBbGxvd2VkVGllcnMpLFxuICAgIGJsb2NrT25BZHZpc29yeTogcm93Py5ibG9ja09uQWR2aXNvcnkgPz8gZC5ibG9ja09uQWR2aXNvcnksXG4gICAgc2hhZG93aW5nOiByb3c/LnNoYWRvd2luZyA/PyBkLnNoYWRvd2luZyxcbiAgICBvZmZpY2lhbEluc3RhbGxzOiByb3c/Lm9mZmljaWFsSW5zdGFsbHMgPz8gZC5vZmZpY2lhbEluc3RhbGxzLFxuICAgIGJsb2NrZWRMaXN0aW5nczogdW5pcXVlTGlzdGluZ3Mocm93Py5ibG9ja2VkTGlzdGluZ3MgPz8gZC5ibG9ja2VkTGlzdGluZ3MpLFxuICB9O1xufVxuXG4vKipcbiAqIEEgdGVhbSdzIHBvbGljeSB1bmRlciBpdHMgcm9vdCBvcmcnczogZWFjaCBmaWVsZCB0YWtlcyB0aGUgU1RSSUNURVIgb2ZcbiAqIHRoZSB0d28sIHNvIGEgdGVhbSBjYW4gbmFycm93IHdoYXQgaXRzIHJvb3QgYWxsb3dzIGJ1dCBuZXZlciB3aWRlbiBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQ29uc3VtcHRpb25Qb2xpY2llcyhyb290OiBDb25zdW1wdGlvblBvbGljeSwgdGVhbTogQ29uc3VtcHRpb25Qb2xpY3kpOiBDb25zdW1wdGlvblBvbGljeSB7XG4gIGNvbnN0IGludGVyc2VjdCA9IChhOiBQdWJsaXNoZXJUaWVyW10sIGI6IFB1Ymxpc2hlclRpZXJbXSkgPT4gc29ydFRpZXJzKGEuZmlsdGVyKCh0KSA9PiBiLmluY2x1ZGVzKHQpKSk7XG4gIGNvbnN0IHVuaW9uID0gKGE6IFB1Ymxpc2hlclRpZXJbXSwgYjogUHVibGlzaGVyVGllcltdKSA9PiBzb3J0VGllcnMoWy4uLmEsIC4uLmJdKTtcbiAgY29uc3Qgc3RyaWN0ZXJCbG9jayA9IEJMT0NLX09SREVSLmluZGV4T2Yocm9vdC5ibG9ja09uQWR2aXNvcnkpID49IEJMT0NLX09SREVSLmluZGV4T2YodGVhbS5ibG9ja09uQWR2aXNvcnkpXG4gICAgPyByb290LmJsb2NrT25BZHZpc29yeSA6IHRlYW0uYmxvY2tPbkFkdmlzb3J5O1xuICByZXR1cm4ge1xuICAgIGFsbG93ZWRUaWVyczogaW50ZXJzZWN0KHJvb3QuYWxsb3dlZFRpZXJzLCB0ZWFtLmFsbG93ZWRUaWVycyksXG4gICAgcmVxdWlyZUFwcHJvdmFsVGllcnM6IHVuaW9uKHJvb3QucmVxdWlyZUFwcHJvdmFsVGllcnMsIHRlYW0ucmVxdWlyZUFwcHJvdmFsVGllcnMpLFxuICAgIHNlY3JldHNBbGxvd2VkVGllcnM6IGludGVyc2VjdChyb290LnNlY3JldHNBbGxvd2VkVGllcnMsIHRlYW0uc2VjcmV0c0FsbG93ZWRUaWVycyksXG4gICAgYmxvY2tPbkFkdmlzb3J5OiBzdHJpY3RlckJsb2NrLFxuICAgIG9mZmljaWFsSW5zdGFsbHM6IHJvb3Qub2ZmaWNpYWxJbnN0YWxscyA9PT0gJ2V4cGxpY2l0JyB8fCB0ZWFtLm9mZmljaWFsSW5zdGFsbHMgPT09ICdleHBsaWNpdCcgPyAnZXhwbGljaXQnIDogJ2ltcGxpY2l0JyxcbiAgICAvLyBTdHJpY3RlciBvZiB0aGUgdHdvIHdpbnMsIGxpa2UgZXZlcnkgb3RoZXIgZmllbGQgaGVyZTogYSB0ZWFtIG11c3Qgbm90IGJlXG4gICAgLy8gYWJsZSB0byBsb29zZW4gYSByb290IHRoYXQgY2hvc2UgYGRlbnlgLCB3aGljaCBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhlXG4gICAgLy8gc2V0dGluZyDigJQgdGhlIHRlYW0gaXMgdGhlIHBhcnR5IGRvaW5nIHRoZSBzaGFkb3dpbmcuXG4gICAgc2hhZG93aW5nOiBTSEFET1dfT1JERVIuaW5kZXhPZihyb290LnNoYWRvd2luZykgPj0gU0hBRE9XX09SREVSLmluZGV4T2YodGVhbS5zaGFkb3dpbmcpID8gcm9vdC5zaGFkb3dpbmcgOiB0ZWFtLnNoYWRvd2luZyxcbiAgICBibG9ja2VkTGlzdGluZ3M6IHVuaXF1ZUxpc3RpbmdzKFsuLi5yb290LmJsb2NrZWRMaXN0aW5ncywgLi4udGVhbS5ibG9ja2VkTGlzdGluZ3NdKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgcG9saWN5IGFuIG9yZydzIHJlc29sdXRpb24gcnVucyB1bmRlci4gQSByb290IG9yZzogaXRzIG93biByb3cgKG9yIHRoZVxuICogZGVmYXVsdHMpLiBBIHRlYW0gKGByb290T3JnSWRgIHNldCk6IGl0cyByb290J3MgcG9saWN5LCBtZXJnZWQgd2l0aCB0aGVcbiAqIHRlYW0ncyBvd24gcm93IHdoZW4gaXQgaGFzIG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVmZmVjdGl2ZUNvbnN1bXB0aW9uUG9saWN5KFxuICByb3dzOiBSZWFkb25seUFycmF5PFBhcnRpYWw8UGx1Z2luSW5zdGFsbFBvbGljeT4gJiB7IG9yZ0lkPzogc3RyaW5nIH0+LFxuICBvcmdJZDogc3RyaW5nLFxuICByb290T3JnSWQ/OiBzdHJpbmcsXG4pOiBDb25zdW1wdGlvblBvbGljeSB7XG4gIGNvbnN0IG93biA9IHJvd3MuZmluZCgocikgPT4gci5vcmdJZCA9PT0gb3JnSWQpID8/IG51bGw7XG4gIGlmICghcm9vdE9yZ0lkIHx8IHJvb3RPcmdJZCA9PT0gb3JnSWQpIHJldHVybiBwb2xpY3lPZihvd24pO1xuICBjb25zdCByb290ID0gcG9saWN5T2Yocm93cy5maW5kKChyKSA9PiByLm9yZ0lkID09PSByb290T3JnSWQpID8/IG51bGwpO1xuICByZXR1cm4gb3duID8gbWVyZ2VDb25zdW1wdGlvblBvbGljaWVzKHJvb3QsIHBvbGljeU9mKG93bikpIDogcm9vdDtcbn1cblxuY29uc3QgSEFORExFX1JFID0gL15bYS16MC05XSsoPzotW2EtejAtOV0rKSokLztcbmNvbnN0IE5BTUVfUkUgPSAvXlthLXowLTldW2EtejAtOS5fLV0qJC87XG5cbmZ1bmN0aW9uIHRpZXJMaXN0KHY6IHVua25vd24sIGZpZWxkOiBzdHJpbmcpOiBQdWJsaXNoZXJUaWVyW10gfCBzdHJpbmcge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodikpIHJldHVybiBgJHtmaWVsZH0gbXVzdCBiZSBhbiBhcnJheSBvZiB0aWVyc2A7XG4gIGNvbnN0IGJhZCA9IHYuZmlsdGVyKCh0KSA9PiAhKFBVQkxJU0hFUl9USUVSUyBhcyByZWFkb25seSB1bmtub3duW10pLmluY2x1ZGVzKHQpKTtcbiAgaWYgKGJhZC5sZW5ndGgpIHJldHVybiBgJHtmaWVsZH0gaGFzIHVua25vd24gdGllcnM6ICR7YmFkLm1hcChTdHJpbmcpLmpvaW4oJywgJyl9YDtcbiAgcmV0dXJuIHNvcnRUaWVycyh2IGFzIFB1Ymxpc2hlclRpZXJbXSk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSAocGFydGlhbCkgcG9saWN5IHVwZGF0ZSBvdmVyIGBiYXNlYC4gUmV0dXJucyB0aGUgZnVsbCBuZXcgcG9saWN5LFxuICogb3IgYW4gZXJyb3IgbWVzc2FnZS4gYGJsb2NrZWRMaXN0aW5nc2AgZW50cmllcyBhcmUgYHsgcHVibGlzaGVyLCBuYW1lIH1gIG9yXG4gKiBgXCJwdWJsaXNoZXIvbmFtZVwiYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UG9saWN5VXBkYXRlKGJhc2U6IENvbnN1bXB0aW9uUG9saWN5LCBpbnB1dDogdW5rbm93bik6IENvbnN1bXB0aW9uUG9saWN5IHwgc3RyaW5nIHtcbiAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoaW5wdXQpKSByZXR1cm4gJ2JvZHkgbXVzdCBiZSBhbiBvYmplY3QnO1xuICBjb25zdCBiID0gaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IG5leHQ6IENvbnN1bXB0aW9uUG9saWN5ID0geyAuLi5iYXNlIH07XG4gIGZvciAoY29uc3QgZmllbGQgb2YgWydhbGxvd2VkVGllcnMnLCAncmVxdWlyZUFwcHJvdmFsVGllcnMnLCAnc2VjcmV0c0FsbG93ZWRUaWVycyddIGFzIGNvbnN0KSB7XG4gICAgaWYgKGJbZmllbGRdID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHRpZXJzID0gdGllckxpc3QoYltmaWVsZF0sIGZpZWxkKTtcbiAgICBpZiAodHlwZW9mIHRpZXJzID09PSAnc3RyaW5nJykgcmV0dXJuIHRpZXJzO1xuICAgIG5leHRbZmllbGRdID0gdGllcnM7XG4gIH1cbiAgaWYgKGIuYmxvY2tPbkFkdmlzb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIUJMT0NLX09SREVSLmluY2x1ZGVzKGIuYmxvY2tPbkFkdmlzb3J5IGFzIEJsb2NrT25BZHZpc29yeSkpIHJldHVybiAnYmxvY2tPbkFkdmlzb3J5IG11c3QgYmUgY3JpdGljYWwsIGhpZ2ggb3IgbmV2ZXInO1xuICAgIG5leHQuYmxvY2tPbkFkdmlzb3J5ID0gYi5ibG9ja09uQWR2aXNvcnkgYXMgQmxvY2tPbkFkdmlzb3J5O1xuICB9XG4gIGlmIChiLm9mZmljaWFsSW5zdGFsbHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChiLm9mZmljaWFsSW5zdGFsbHMgIT09ICdpbXBsaWNpdCcgJiYgYi5vZmZpY2lhbEluc3RhbGxzICE9PSAnZXhwbGljaXQnKSByZXR1cm4gJ29mZmljaWFsSW5zdGFsbHMgbXVzdCBiZSBpbXBsaWNpdCBvciBleHBsaWNpdCc7XG4gICAgbmV4dC5vZmZpY2lhbEluc3RhbGxzID0gYi5vZmZpY2lhbEluc3RhbGxzO1xuICB9XG4gIGlmIChiLmJsb2NrZWRMaXN0aW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGIuYmxvY2tlZExpc3RpbmdzKSkgcmV0dXJuICdibG9ja2VkTGlzdGluZ3MgbXVzdCBiZSBhbiBhcnJheSc7XG4gICAgaWYgKGIuYmxvY2tlZExpc3RpbmdzLmxlbmd0aCA+IE1BWF9CTE9DS0VEX0xJU1RJTkdTKSByZXR1cm4gYGF0IG1vc3QgJHtNQVhfQkxPQ0tFRF9MSVNUSU5HU30gYmxvY2tlZCBsaXN0aW5nc2A7XG4gICAgY29uc3QgcmVmczogQmxvY2tlZExpc3RpbmdSZWZbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcmF3IG9mIGIuYmxvY2tlZExpc3RpbmdzKSB7XG4gICAgICBjb25zdCByZWYgPSB0eXBlb2YgcmF3ID09PSAnc3RyaW5nJ1xuICAgICAgICA/ICgoKSA9PiB7IGNvbnN0IFtwdWJsaXNoZXIsIG5hbWUsIGV4dHJhXSA9IHJhdy5zcGxpdCgnLycpOyByZXR1cm4gZXh0cmEgPT09IHVuZGVmaW5lZCA/IHsgcHVibGlzaGVyLCBuYW1lIH0gOiBudWxsOyB9KSgpXG4gICAgICAgIDogcmF3ICYmIHR5cGVvZiByYXcgPT09ICdvYmplY3QnID8geyBwdWJsaXNoZXI6IChyYXcgYXMgQmxvY2tlZExpc3RpbmdSZWYpLnB1Ymxpc2hlciwgbmFtZTogKHJhdyBhcyBCbG9ja2VkTGlzdGluZ1JlZikubmFtZSB9IDogbnVsbDtcbiAgICAgIGlmICghcmVmIHx8IHR5cGVvZiByZWYucHVibGlzaGVyICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgcmVmLm5hbWUgIT09ICdzdHJpbmcnXG4gICAgICAgIHx8ICFIQU5ETEVfUkUudGVzdChyZWYucHVibGlzaGVyKSB8fCAhTkFNRV9SRS50ZXN0KHJlZi5uYW1lKSkge1xuICAgICAgICByZXR1cm4gJ2VhY2ggYmxvY2tlZCBsaXN0aW5nIG11c3QgYmUgeyBwdWJsaXNoZXIsIG5hbWUgfSAob3IgXCJwdWJsaXNoZXIvbmFtZVwiKSc7XG4gICAgICB9XG4gICAgICByZWZzLnB1c2goeyBwdWJsaXNoZXI6IHJlZi5wdWJsaXNoZXIsIG5hbWU6IHJlZi5uYW1lIH0pO1xuICAgIH1cbiAgICBuZXh0LmJsb2NrZWRMaXN0aW5ncyA9IHVuaXF1ZUxpc3RpbmdzKHJlZnMpO1xuICB9XG4gIHJldHVybiBuZXh0O1xufVxuIl19
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWNvbnN1bXB0aW9uLXBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcGx1Z2luLWNvbnN1bXB0aW9uLXBvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQU9MLGVBQWUsR0FDaEIsTUFBTSwrQkFBK0IsQ0FBQztBQXFCdkMsMkVBQTJFO0FBQzNFLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFnQyxNQUFNLENBQUMsTUFBTSxDQUFvQjtJQUN0RyxZQUFZLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDO0lBQ3RDLG9CQUFvQixFQUFFLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQztJQUNqRCxtQkFBbUIsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUM7SUFDN0MsZUFBZSxFQUFFLFVBQVU7SUFDM0IsZ0JBQWdCLEVBQUUsVUFBVTtJQUM1Qiw2RUFBNkU7SUFDN0UseUVBQXlFO0lBQ3pFLDhEQUE4RDtJQUM5RCxTQUFTLEVBQUUsTUFBTTtJQUNqQixlQUFlLEVBQUUsRUFBRTtJQUNuQixlQUFlLEVBQUUsQ0FBQztDQUNuQixDQUFDLENBQUM7QUFFSCxxREFBcUQ7QUFDckQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBRXhDLE1BQU0sV0FBVyxHQUErQixDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDOUUsdUVBQXVFO0FBQ3ZFLE1BQU0sWUFBWSxHQUE2QixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFFekUsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUE4QixFQUFtQixFQUFFLENBQ3BFLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FB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QUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRyxHQUF5QixDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUcsR0FBeUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3ZJLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUTttQkFDeEUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQy9ELE9BQU8sd0VBQXdFLENBQUM7WUFDbEYsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBBbiBvcmcncyBwbHVnaW4gQ09OU1VNUFRJT04gUE9MSUNZOiB3aGljaCBwdWJsaXNoZXIgdGllcnMgaXQgdHJ1c3RzLCB3aGljaFxuICogbGlzdGluZ3MgaXQgYmxvY2tzLCB3aGljaCBhZHZpc29yeSBzZXZlcml0aWVzIGJsb2NrIGEgcmVzb2x1dGlvbiwgd2hpY2hcbiAqIHRpZXJzIG1heSByZWNlaXZlIHNlY3JldHMsIGFuZCBob3cgbG91ZCBhIHZlcnNpb24ncyBmaXhhYmxlIEhpZ2ggZmluZGluZ3MgYXJlLiBBcHBsaWVkIGF0IGV2ZXJ5IHJlc29sdXRpb24gKHNlZVxuICogLi9wbHVnaW4tcmVzb2x1dGlvbi50cykgYW5kIGVkaXRlZCB0aHJvdWdoIHRoZSBvcmcncyBwb2xpY3kgcm93LlxuICpcbiAqIFB1cmUgZnVuY3Rpb25zIG92ZXIgdGhlIHN0b3JlZCByb3cg4oCUIG5vIEkvTyDigJQgc28gdGhlIHNhbWUgcnVsZXMgcnVuIGluIHRoZVxuICogcmVzb2x2ZXIsIGluIHRoZSBwb2xpY3ktdXBkYXRlIHJvdXRlLCBhbmQgaW4gdGVzdHMuXG4gKi9cblxuaW1wb3J0IHtcbiAgdHlwZSBCbG9ja2VkTGlzdGluZ1JlZixcbiAgdHlwZSBCbG9ja09uQWR2aXNvcnksXG4gIHR5cGUgT2ZmaWNpYWxJbnN0YWxscyxcbiAgdHlwZSBTaGFkb3dpbmdNb2RlLFxuICB0eXBlIFBsdWdpbkluc3RhbGxQb2xpY3ksXG4gIHR5cGUgUHVibGlzaGVyVGllcixcbiAgUFVCTElTSEVSX1RJRVJTLFxufSBmcm9tICcuLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYS5qcyc7XG5cblxuLyoqIEFuIG9yZydzIGNvbnN1bXB0aW9uIHBvbGljeSwgYXMgdGhlIHJlc29sdmVyIGFwcGxpZXMgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnN1bXB0aW9uUG9saWN5IHtcbiAgYWxsb3dlZFRpZXJzOiBQdWJsaXNoZXJUaWVyW107XG4gIHJlcXVpcmVBcHByb3ZhbFRpZXJzOiBQdWJsaXNoZXJUaWVyW107XG4gIHNlY3JldHNBbGxvd2VkVGllcnM6IFB1Ymxpc2hlclRpZXJbXTtcbiAgYmxvY2tPbkFkdmlzb3J5OiBCbG9ja09uQWR2aXNvcnk7XG4gIG9mZmljaWFsSW5zdGFsbHM6IE9mZmljaWFsSW5zdGFsbHM7XG4gIC8qKiBXaGF0IHRvIGRvIHdoZW4gYSBuYW1lIG92ZXJyaWRlcyBhIGxpc3Rpbmcgb3IgdGhlIHBhcmVudCBvcmcncyBwbHVnaW4uICovXG4gIHNoYWRvd2luZzogU2hhZG93aW5nTW9kZTtcbiAgYmxvY2tlZExpc3RpbmdzOiBCbG9ja2VkTGlzdGluZ1JlZltdO1xuICAvKipcbiAgICogRml4YWJsZSBIaWdoIGZpbmRpbmdzIGFib3ZlIHRoaXMgbWFueSBtYWtlIGEgdmVyc2lvbidzIHdhcm5pbmcgYSBgd2FybmluZ2BcbiAgICogcmF0aGVyIHRoYW4gYGluZm9gIChsb29rdXAsIHNhdmUsIHJ1bnRpbWUgY2hlY2spLiBWdWxuZXJhYmlsaXR5IHN0YXRlIG5ldmVyXG4gICAqIHJlZnVzZXMgYSBwaXBlbGluZTsgdGhpcyBvbmx5IHNldHMgaG93IGxvdWQgaXQgaXMuIG51bGwgPSBuZXZlciBsb3VkZXIgdGhhbiBpbmZvLlxuICAgKi9cbiAgd2FybkZpeGFibGVIaWdoOiBudW1iZXIgfCBudWxsO1xufVxuXG4vKiogVGhlIGRlZmF1bHRzIChhbmQgdGhlIGNvbHVtbiBkZWZhdWx0cyBvZiBgcGx1Z2luX2luc3RhbGxfcG9saWNpZXNgKS4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NPTlNVTVBUSU9OX1BPTElDWTogUmVhZG9ubHk8Q29uc3VtcHRpb25Qb2xpY3k+ID0gT2JqZWN0LmZyZWV6ZTxDb25zdW1wdGlvblBvbGljeT4oe1xuICBhbGxvd2VkVGllcnM6IFsnb2ZmaWNpYWwnLCAndmVyaWZpZWQnXSxcbiAgcmVxdWlyZUFwcHJvdmFsVGllcnM6IFsnY29tbXVuaXR5JywgJ3VudmVyaWZpZWQnXSxcbiAgc2VjcmV0c0FsbG93ZWRUaWVyczogWydvZmZpY2lhbCcsICd2ZXJpZmllZCddLFxuICBibG9ja09uQWR2aXNvcnk6ICdjcml0aWNhbCcsXG4gIG9mZmljaWFsSW5zdGFsbHM6ICdpbXBsaWNpdCcsXG4gIC8vIGB3YXJuYCwgbm90IGBkZW55YDogc2hhZG93aW5nIGlzIGxlZ2l0aW1hdGUgKGFuIG9yZyBvdmVycmlkaW5nIGFuIE9mZmljaWFsXG4gIC8vIHBsdWdpbiBvbiBwdXJwb3NlKSwgc28gdGhlIGRlZmF1bHQgbWFrZXMgaXQgdmlzaWJsZSB3aXRob3V0IGJyZWFraW5nIGFcbiAgLy8gZGVwbG95bWVudCB0aGF0IGFscmVhZHkgcmVsaWVzIG9uIGl0LiBgZGVueWAgaXMgdGhlIG9wdC1pbi5cbiAgc2hhZG93aW5nOiAnd2FybicsXG4gIGJsb2NrZWRMaXN0aW5nczogW10sXG4gIHdhcm5GaXhhYmxlSGlnaDogMCxcbn0pO1xuXG4vKiogQXQgbW9zdCB0aGlzIG1hbnkgYmxvY2tlZCBsaXN0aW5ncyBwZXIgcG9saWN5LiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9CTE9DS0VEX0xJU1RJTkdTID0gNTAwO1xuXG5jb25zdCBCTE9DS19PUkRFUjogcmVhZG9ubHkgQmxvY2tPbkFkdmlzb3J5W10gPSBbJ25ldmVyJywgJ2NyaXRpY2FsJywgJ2hpZ2gnXTtcbi8qKiBJbmNyZWFzaW5nIHN0cmljdG5lc3MsIHNvIHRoZSBtZXJnZSBjYW4gdGFrZSB0aGUgZ3JlYXRlciBvZiB0d28uICovXG5jb25zdCBTSEFET1dfT1JERVI6IHJlYWRvbmx5IFNoYWRvd2luZ01vZGVbXSA9IFsnYWxsb3cnLCAnd2FybicsICdkZW55J107XG5cbmNvbnN0IHNvcnRUaWVycyA9ICh0aWVyczogSXRlcmFibGU8UHVibGlzaGVyVGllcj4pOiBQdWJsaXNoZXJUaWVyW10gPT5cbiAgUFVCTElTSEVSX1RJRVJTLmZpbHRlcigodCkgPT4gbmV3IFNldCh0aWVycykuaGFzKHQpKTtcblxuY29uc3QgbGlzdGluZ0tleSA9IChyOiBCbG9ja2VkTGlzdGluZ1JlZik6IHN0cmluZyA9PiBgJHtyLnB1Ymxpc2hlcn0vJHtyLm5hbWV9YDtcblxuZnVuY3Rpb24gdW5pcXVlTGlzdGluZ3MocmVmczogcmVhZG9ubHkgQmxvY2tlZExpc3RpbmdSZWZbXSk6IEJsb2NrZWRMaXN0aW5nUmVmW10ge1xuICBjb25zdCBzZWVuID0gbmV3IE1hcDxzdHJpbmcsIEJsb2NrZWRMaXN0aW5nUmVmPigpO1xuICBmb3IgKGNvbnN0IHIgb2YgcmVmcykgc2Vlbi5zZXQobGlzdGluZ0tleShyKSwgeyBwdWJsaXNoZXI6IHIucHVibGlzaGVyLCBuYW1lOiByLm5hbWUgfSk7XG4gIHJldHVybiBbLi4uc2Vlbi52YWx1ZXMoKV0uc29ydCgoYSwgYikgPT4gbGlzdGluZ0tleShhKS5sb2NhbGVDb21wYXJlKGxpc3RpbmdLZXkoYikpKTtcbn1cblxuLyoqIEEgc3RvcmVkIHBvbGljeSByb3cgKG9yIG5vbmUpIGFzIGEge0BsaW5rIENvbnN1bXB0aW9uUG9saWN5fS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2xpY3lPZihyb3c6IFBhcnRpYWw8UGx1Z2luSW5zdGFsbFBvbGljeT4gfCBudWxsIHwgdW5kZWZpbmVkKTogQ29uc3VtcHRpb25Qb2xpY3kge1xuICBjb25zdCBkID0gREVGQVVMVF9DT05TVU1QVElPTl9QT0xJQ1k7XG4gIHJldHVybiB7XG4gICAgYWxsb3dlZFRpZXJzOiBzb3J0VGllcnMocm93Py5hbGxvd2VkVGllcnMgPz8gZC5hbGxvd2VkVGllcnMpLFxuICAgIHJlcXVpcmVBcHByb3ZhbFRpZXJzOiBzb3J0VGllcnMocm93Py5yZXF1aXJlQXBwcm92YWxUaWVycyA/PyBkLnJlcXVpcmVBcHByb3ZhbFRpZXJzKSxcbiAgICBzZWNyZXRzQWxsb3dlZFRpZXJzOiBzb3J0VGllcnMocm93Py5zZWNyZXRzQWxsb3dlZFRpZXJzID8/IGQuc2VjcmV0c0FsbG93ZWRUaWVycyksXG4gICAgYmxvY2tPbkFkdmlzb3J5OiByb3c/LmJsb2NrT25BZHZpc29yeSA/PyBkLmJsb2NrT25BZHZpc29yeSxcbiAgICBzaGFkb3dpbmc6IHJvdz8uc2hhZG93aW5nID8/IGQuc2hhZG93aW5nLFxuICAgIG9mZmljaWFsSW5zdGFsbHM6IHJvdz8ub2ZmaWNpYWxJbnN0YWxscyA/PyBkLm9mZmljaWFsSW5zdGFsbHMsXG4gICAgYmxvY2tlZExpc3RpbmdzOiB1bmlxdWVMaXN0aW5ncyhyb3c/LmJsb2NrZWRMaXN0aW5ncyA/PyBkLmJsb2NrZWRMaXN0aW5ncyksXG4gICAgd2FybkZpeGFibGVIaWdoOiByb3cgPT09IG51bGwgfHwgcm93ID09PSB1bmRlZmluZWQgfHwgcm93Lndhcm5GaXhhYmxlSGlnaCA9PT0gdW5kZWZpbmVkID8gZC53YXJuRml4YWJsZUhpZ2ggOiByb3cud2FybkZpeGFibGVIaWdoLFxuICB9O1xufVxuXG4vKiogVGhlIHN0cmljdGVyIG9mIHR3byBvcHRpb25hbCB0aHJlc2hvbGRzOiB0aGUgbG93ZXIgbnVtYmVyLCBvciB3aGljaGV2ZXIgaXMgc2V0LiAqL1xuZnVuY3Rpb24gc3RyaWN0ZXJGbG9vcihhOiBudW1iZXIgfCBudWxsLCBiOiBudW1iZXIgfCBudWxsKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmIChhID09PSBudWxsKSByZXR1cm4gYjtcbiAgaWYgKGIgPT09IG51bGwpIHJldHVybiBhO1xuICByZXR1cm4gTWF0aC5taW4oYSwgYik7XG59XG5cbi8qKlxuICogQSB0ZWFtJ3MgcG9saWN5IHVuZGVyIGl0cyByb290IG9yZydzOiBlYWNoIGZpZWxkIHRha2VzIHRoZSBTVFJJQ1RFUiBvZlxuICogdGhlIHR3bywgc28gYSB0ZWFtIGNhbiBuYXJyb3cgd2hhdCBpdHMgcm9vdCBhbGxvd3MgYnV0IG5ldmVyIHdpZGVuIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb25zdW1wdGlvblBvbGljaWVzKHJvb3Q6IENvbnN1bXB0aW9uUG9saWN5LCB0ZWFtOiBDb25zdW1wdGlvblBvbGljeSk6IENvbnN1bXB0aW9uUG9saWN5IHtcbiAgY29uc3QgaW50ZXJzZWN0ID0gKGE6IFB1Ymxpc2hlclRpZXJbXSwgYjogUHVibGlzaGVyVGllcltdKSA9PiBzb3J0VGllcnMoYS5maWx0ZXIoKHQpID0+IGIuaW5jbHVkZXModCkpKTtcbiAgY29uc3QgdW5pb24gPSAoYTogUHVibGlzaGVyVGllcltdLCBiOiBQdWJsaXNoZXJUaWVyW10pID0+IHNvcnRUaWVycyhbLi4uYSwgLi4uYl0pO1xuICBjb25zdCBzdHJpY3RlckJsb2NrID0gQkxPQ0tfT1JERVIuaW5kZXhPZihyb290LmJsb2NrT25BZHZpc29yeSkgPj0gQkxPQ0tfT1JERVIuaW5kZXhPZih0ZWFtLmJsb2NrT25BZHZpc29yeSlcbiAgICA/IHJvb3QuYmxvY2tPbkFkdmlzb3J5IDogdGVhbS5ibG9ja09uQWR2aXNvcnk7XG4gIHJldHVybiB7XG4gICAgYWxsb3dlZFRpZXJzOiBpbnRlcnNlY3Qocm9vdC5hbGxvd2VkVGllcnMsIHRlYW0uYWxsb3dlZFRpZXJzKSxcbiAgICByZXF1aXJlQXBwcm92YWxUaWVyczogdW5pb24ocm9vdC5yZXF1aXJlQXBwcm92YWxUaWVycywgdGVhbS5yZXF1aXJlQXBwcm92YWxUaWVycyksXG4gICAgc2VjcmV0c0FsbG93ZWRUaWVyczogaW50ZXJzZWN0KHJvb3Quc2VjcmV0c0FsbG93ZWRUaWVycywgdGVhbS5zZWNyZXRzQWxsb3dlZFRpZXJzKSxcbiAgICBibG9ja09uQWR2aXNvcnk6IHN0cmljdGVyQmxvY2ssXG4gICAgb2ZmaWNpYWxJbnN0YWxsczogcm9vdC5vZmZpY2lhbEluc3RhbGxzID09PSAnZXhwbGljaXQnIHx8IHRlYW0ub2ZmaWNpYWxJbnN0YWxscyA9PT0gJ2V4cGxpY2l0JyA/ICdleHBsaWNpdCcgOiAnaW1wbGljaXQnLFxuICAgIC8vIFN0cmljdGVyIG9mIHRoZSB0d28gd2lucywgbGlrZSBldmVyeSBvdGhlciBmaWVsZCBoZXJlOiBhIHRlYW0gbXVzdCBub3QgYmVcbiAgICAvLyBhYmxlIHRvIGxvb3NlbiBhIHJvb3QgdGhhdCBjaG9zZSBgZGVueWAsIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGVcbiAgICAvLyBzZXR0aW5nIOKAlCB0aGUgdGVhbSBpcyB0aGUgcGFydHkgZG9pbmcgdGhlIHNoYWRvd2luZy5cbiAgICBzaGFkb3dpbmc6IFNIQURPV19PUkRFUi5pbmRleE9mKHJvb3Quc2hhZG93aW5nKSA+PSBTSEFET1dfT1JERVIuaW5kZXhPZih0ZWFtLnNoYWRvd2luZykgPyByb290LnNoYWRvd2luZyA6IHRlYW0uc2hhZG93aW5nLFxuICAgIGJsb2NrZWRMaXN0aW5nczogdW5pcXVlTGlzdGluZ3MoWy4uLnJvb3QuYmxvY2tlZExpc3RpbmdzLCAuLi50ZWFtLmJsb2NrZWRMaXN0aW5nc10pLFxuICAgIHdhcm5GaXhhYmxlSGlnaDogc3RyaWN0ZXJGbG9vcihyb290Lndhcm5GaXhhYmxlSGlnaCwgdGVhbS53YXJuRml4YWJsZUhpZ2gpLFxuICB9O1xufVxuXG4vKipcbiAqIFRoZSBwb2xpY3kgYW4gb3JnJ3MgcmVzb2x1dGlvbiBydW5zIHVuZGVyLiBBIHJvb3Qgb3JnOiBpdHMgb3duIHJvdyAob3IgdGhlXG4gKiBkZWZhdWx0cykuIEEgdGVhbSAoYHJvb3RPcmdJZGAgc2V0KTogaXRzIHJvb3QncyBwb2xpY3ksIG1lcmdlZCB3aXRoIHRoZVxuICogdGVhbSdzIG93biByb3cgd2hlbiBpdCBoYXMgb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZWZmZWN0aXZlQ29uc3VtcHRpb25Qb2xpY3koXG4gIHJvd3M6IFJlYWRvbmx5QXJyYXk8UGFydGlhbDxQbHVnaW5JbnN0YWxsUG9saWN5PiAmIHsgb3JnSWQ/OiBzdHJpbmcgfT4sXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHJvb3RPcmdJZD86IHN0cmluZyxcbik6IENvbnN1bXB0aW9uUG9saWN5IHtcbiAgY29uc3Qgb3duID0gcm93cy5maW5kKChyKSA9PiByLm9yZ0lkID09PSBvcmdJZCkgPz8gbnVsbDtcbiAgaWYgKCFyb290T3JnSWQgfHwgcm9vdE9yZ0lkID09PSBvcmdJZCkgcmV0dXJuIHBvbGljeU9mKG93bik7XG4gIGNvbnN0IHJvb3QgPSBwb2xpY3lPZihyb3dzLmZpbmQoKHIpID0+IHIub3JnSWQgPT09IHJvb3RPcmdJZCkgPz8gbnVsbCk7XG4gIHJldHVybiBvd24gPyBtZXJnZUNvbnN1bXB0aW9uUG9saWNpZXMocm9vdCwgcG9saWN5T2Yob3duKSkgOiByb290O1xufVxuXG5jb25zdCBIQU5ETEVfUkUgPSAvXlthLXowLTldKyg/Oi1bYS16MC05XSspKiQvO1xuY29uc3QgTkFNRV9SRSA9IC9eW2EtejAtOV1bYS16MC05Ll8tXSokLztcblxuZnVuY3Rpb24gdGllckxpc3QodjogdW5rbm93biwgZmllbGQ6IHN0cmluZyk6IFB1Ymxpc2hlclRpZXJbXSB8IHN0cmluZyB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2KSkgcmV0dXJuIGAke2ZpZWxkfSBtdXN0IGJlIGFuIGFycmF5IG9mIHRpZXJzYDtcbiAgY29uc3QgYmFkID0gdi5maWx0ZXIoKHQpID0+ICEoUFVCTElTSEVSX1RJRVJTIGFzIHJlYWRvbmx5IHVua25vd25bXSkuaW5jbHVkZXModCkpO1xuICBpZiAoYmFkLmxlbmd0aCkgcmV0dXJuIGAke2ZpZWxkfSBoYXMgdW5rbm93biB0aWVyczogJHtiYWQubWFwKFN0cmluZykuam9pbignLCAnKX1gO1xuICByZXR1cm4gc29ydFRpZXJzKHYgYXMgUHVibGlzaGVyVGllcltdKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIChwYXJ0aWFsKSBwb2xpY3kgdXBkYXRlIG92ZXIgYGJhc2VgLiBSZXR1cm5zIHRoZSBmdWxsIG5ldyBwb2xpY3ksXG4gKiBvciBhbiBlcnJvciBtZXNzYWdlLiBgYmxvY2tlZExpc3RpbmdzYCBlbnRyaWVzIGFyZSBgeyBwdWJsaXNoZXIsIG5hbWUgfWAgb3JcbiAqIGBcInB1Ymxpc2hlci9uYW1lXCJgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQb2xpY3lVcGRhdGUoYmFzZTogQ29uc3VtcHRpb25Qb2xpY3ksIGlucHV0OiB1bmtub3duKTogQ29uc3VtcHRpb25Qb2xpY3kgfCBzdHJpbmcge1xuICBpZiAoIWlucHV0IHx8IHR5cGVvZiBpbnB1dCAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShpbnB1dCkpIHJldHVybiAnYm9keSBtdXN0IGJlIGFuIG9iamVjdCc7XG4gIGNvbnN0IGIgPSBpbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgbmV4dDogQ29uc3VtcHRpb25Qb2xpY3kgPSB7IC4uLmJhc2UgfTtcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBbJ2FsbG93ZWRUaWVycycsICdyZXF1aXJlQXBwcm92YWxUaWVycycsICdzZWNyZXRzQWxsb3dlZFRpZXJzJ10gYXMgY29uc3QpIHtcbiAgICBpZiAoYltmaWVsZF0gPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgY29uc3QgdGllcnMgPSB0aWVyTGlzdChiW2ZpZWxkXSwgZmllbGQpO1xuICAgIGlmICh0eXBlb2YgdGllcnMgPT09ICdzdHJpbmcnKSByZXR1cm4gdGllcnM7XG4gICAgbmV4dFtmaWVsZF0gPSB0aWVycztcbiAgfVxuICBpZiAoYi5ibG9ja09uQWR2aXNvcnkgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghQkxPQ0tfT1JERVIuaW5jbHVkZXMoYi5ibG9ja09uQWR2aXNvcnkgYXMgQmxvY2tPbkFkdmlzb3J5KSkgcmV0dXJuICdibG9ja09uQWR2aXNvcnkgbXVzdCBiZSBjcml0aWNhbCwgaGlnaCBvciBuZXZlcic7XG4gICAgbmV4dC5ibG9ja09uQWR2aXNvcnkgPSBiLmJsb2NrT25BZHZpc29yeSBhcyBCbG9ja09uQWR2aXNvcnk7XG4gIH1cbiAgaWYgKGIub2ZmaWNpYWxJbnN0YWxscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGIub2ZmaWNpYWxJbnN0YWxscyAhPT0gJ2ltcGxpY2l0JyAmJiBiLm9mZmljaWFsSW5zdGFsbHMgIT09ICdleHBsaWNpdCcpIHJldHVybiAnb2ZmaWNpYWxJbnN0YWxscyBtdXN0IGJlIGltcGxpY2l0IG9yIGV4cGxpY2l0JztcbiAgICBuZXh0Lm9mZmljaWFsSW5zdGFsbHMgPSBiLm9mZmljaWFsSW5zdGFsbHM7XG4gIH1cbiAgaWYgKGIud2FybkZpeGFibGVIaWdoICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoYi53YXJuRml4YWJsZUhpZ2ggIT09IG51bGwgJiYgIShOdW1iZXIuaXNJbnRlZ2VyKGIud2FybkZpeGFibGVIaWdoKSAmJiAoYi53YXJuRml4YWJsZUhpZ2ggYXMgbnVtYmVyKSA+PSAwKSkge1xuICAgICAgcmV0dXJuICd3YXJuRml4YWJsZUhpZ2ggbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIG9yIG51bGwnO1xuICAgIH1cbiAgICBuZXh0Lndhcm5GaXhhYmxlSGlnaCA9IGIud2FybkZpeGFibGVIaWdoIGFzIG51bWJlciB8IG51bGw7XG4gIH1cbiAgaWYgKGIuYmxvY2tlZExpc3RpbmdzICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYi5ibG9ja2VkTGlzdGluZ3MpKSByZXR1cm4gJ2Jsb2NrZWRMaXN0aW5ncyBtdXN0IGJlIGFuIGFycmF5JztcbiAgICBpZiAoYi5ibG9ja2VkTGlzdGluZ3MubGVuZ3RoID4gTUFYX0JMT0NLRURfTElTVElOR1MpIHJldHVybiBgYXQgbW9zdCAke01BWF9CTE9DS0VEX0xJU1RJTkdTfSBibG9ja2VkIGxpc3RpbmdzYDtcbiAgICBjb25zdCByZWZzOiBCbG9ja2VkTGlzdGluZ1JlZltdID0gW107XG4gICAgZm9yIChjb25zdCByYXcgb2YgYi5ibG9ja2VkTGlzdGluZ3MpIHtcbiAgICAgIGNvbnN0IHJlZiA9IHR5cGVvZiByYXcgPT09ICdzdHJpbmcnXG4gICAgICAgID8gKCgpID0+IHsgY29uc3QgW3B1Ymxpc2hlciwgbmFtZSwgZXh0cmFdID0gcmF3LnNwbGl0KCcvJyk7IHJldHVybiBleHRyYSA9PT0gdW5kZWZpbmVkID8geyBwdWJsaXNoZXIsIG5hbWUgfSA6IG51bGw7IH0pKClcbiAgICAgICAgOiByYXcgJiYgdHlwZW9mIHJhdyA9PT0gJ29iamVjdCcgPyB7IHB1Ymxpc2hlcjogKHJhdyBhcyBCbG9ja2VkTGlzdGluZ1JlZikucHVibGlzaGVyLCBuYW1lOiAocmF3IGFzIEJsb2NrZWRMaXN0aW5nUmVmKS5uYW1lIH0gOiBudWxsO1xuICAgICAgaWYgKCFyZWYgfHwgdHlwZW9mIHJlZi5wdWJsaXNoZXIgIT09ICdzdHJpbmcnIHx8IHR5cGVvZiByZWYubmFtZSAhPT0gJ3N0cmluZydcbiAgICAgICAgfHwgIUhBTkRMRV9SRS50ZXN0KHJlZi5wdWJsaXNoZXIpIHx8ICFOQU1FX1JFLnRlc3QocmVmLm5hbWUpKSB7XG4gICAgICAgIHJldHVybiAnZWFjaCBibG9ja2VkIGxpc3RpbmcgbXVzdCBiZSB7IHB1Ymxpc2hlciwgbmFtZSB9IChvciBcInB1Ymxpc2hlci9uYW1lXCIpJztcbiAgICAgIH1cbiAgICAgIHJlZnMucHVzaCh7IHB1Ymxpc2hlcjogcmVmLnB1Ymxpc2hlciwgbmFtZTogcmVmLm5hbWUgfSk7XG4gICAgfVxuICAgIG5leHQuYmxvY2tlZExpc3RpbmdzID0gdW5pcXVlTGlzdGluZ3MocmVmcyk7XG4gIH1cbiAgcmV0dXJuIG5leHQ7XG59XG4iXX0=
@@ -25,11 +25,12 @@
25
25
  * version spec. Yanked versions never resolve for a listing; a paused
26
26
  * version is skipped unless the install already resolved to it or the
27
27
  * reference pins it exactly; advisory-blocked versions are skipped.
28
- * - Scan flags: a version the nightly rescan FLAGGED (fixable Criticals
29
- * over `PLUGIN_VULN_MAX_CRITICAL`) resolves with a `VULN_FLAGGED` warning —
30
- * or, with `PLUGIN_BLOCK_ON_NEW_CRITICAL` on, is skipped like an
31
- * advisory-blocked one, and an exact pin to it is refused
32
- * `PLUGIN_VERSION_VULN_BLOCKED`.
28
+ * - Scan flags: a version the nightly rescan FLAGGED (gated Criticals over
29
+ * `PLUGIN_VULN_MAX_FINDINGS`) resolves like any other, with a `VULN_FLAGGED`
30
+ * warning (severity `error`, `critical` with a KEV finding). Vulnerability
31
+ * state NEVER skips or refuses a version — it is graded, and the pipeline's
32
+ * owners are told. When the reference's pin keeps it OFF a newer unflagged
33
+ * version the install allows, `VULN_UPGRADE_AVAILABLE` (info) names it.
33
34
  */
34
35
  import { type VulnFlaggedWarning } from '@pipeline-builder/api-core';
35
36
  import type { CrudTx } from './crud-service.js';
@@ -37,16 +38,31 @@ import { type ConsumptionPolicy } from './plugin-consumption-policy.js';
37
38
  import { type PluginAdvisory, type PluginInstall, type PluginInstallPolicy, type PluginListing, type PluginListingVersion, type Publisher } from '../database/drizzle-schema.js';
38
39
  /** Why a reference can't resolve; `code` is an api-core `ErrorCode` name. */
39
40
  export interface ResolutionRefusal {
40
- code: 'NOT_FOUND' | 'PLUGIN_NOT_INSTALLED' | 'PLUGIN_BLOCKED_BY_POLICY' | 'PLUGIN_UNAVAILABLE' | 'PLUGIN_VERSION_VULN_BLOCKED';
41
+ code: 'NOT_FOUND' | 'PLUGIN_NOT_INSTALLED' | 'PLUGIN_BLOCKED_BY_POLICY' | 'PLUGIN_UNAVAILABLE';
41
42
  reason: string;
42
43
  message: string;
43
44
  details?: Record<string, unknown>;
44
45
  }
46
+ /**
47
+ * `VULN_UPGRADE_AVAILABLE` (severity `info`): the resolved version is FLAGGED,
48
+ * and a newer UNFLAGGED version exists that the install allows but the
49
+ * reference's own pin excludes — so the pipeline keeps running the vulnerable
50
+ * release until someone moves the pin. `suggestedVersion` is the way out.
51
+ */
52
+ export interface VulnUpgradeAvailableWarning {
53
+ code: 'VULN_UPGRADE_AVAILABLE';
54
+ severity: 'info';
55
+ message: string;
56
+ resolved: string;
57
+ suggestedVersion: string;
58
+ }
45
59
  /** A non-fatal note a resolution carries (synth prints its `message`). */
46
60
  export type ResolutionWarning = {
47
61
  code: 'PLUGIN_ADVISORY' | 'PLUGIN_DEPRECATED' | 'PLUGIN_SECRETS_WITHHELD' | 'LISTING_UNMAINTAINED';
48
62
  message: string;
49
- } | VulnFlaggedWarning;
63
+ } | VulnFlaggedWarning | VulnUpgradeAvailableWarning;
64
+ /** The `VULN_UPGRADE_AVAILABLE` warning for `ref` resolving to `resolved` with `suggested` outside the pin. */
65
+ export declare function vulnUpgradeAvailableWarning(ref: string, resolved: string, suggested: string): VulnUpgradeAvailableWarning;
50
66
  /** Why the org's policy (or the listing's state) keeps a listing out, or null. */
51
67
  export interface ListingBlock {
52
68
  reason: 'tier' | 'blocked_listing' | 'suspended';
@@ -84,8 +100,6 @@ export interface VersionChoiceInput<V extends PluginListingVersion = PluginListi
84
100
  requested?: string;
85
101
  advisories: readonly PluginAdvisory[];
86
102
  policy: ConsumptionPolicy;
87
- /** Skip / refuse rescan-flagged versions (default: `PLUGIN_BLOCK_ON_NEW_CRITICAL`). */
88
- blockFlagged?: boolean;
89
103
  }
90
104
  /**
91
105
  * Pick the listed version a reference resolves to (see the module doc), or
@@ -93,6 +107,7 @@ export interface VersionChoiceInput<V extends PluginListingVersion = PluginListi
93
107
  */
94
108
  export declare function selectListingVersion<V extends PluginListingVersion>(input: VersionChoiceInput<V>): {
95
109
  version: V;
110
+ suggestedVersion: string | null;
96
111
  } | {
97
112
  refusal: ResolutionRefusal;
98
113
  };
@@ -146,6 +161,8 @@ export interface ListingReference {
146
161
  /** A reference that resolved to a listed version. */
147
162
  export interface ListingResolved {
148
163
  ok: true;
164
+ /** For a FLAGGED version: the newest unflagged one above it the install allows (null otherwise). */
165
+ suggestedVersion: string | null;
149
166
  publisher: Publisher;
150
167
  listing: PluginListing;
151
168
  version: PluginListingVersion;