@pipeline-builder/api-core 5.2.3 → 5.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/lib/constants/ai-providers.d.ts +3 -22
  2. package/lib/constants/ai-providers.js +6 -56
  3. package/lib/errors/app-errors.d.ts +14 -0
  4. package/lib/errors/app-errors.js +21 -1
  5. package/lib/helpers/sse-helpers.d.ts +33 -3
  6. package/lib/helpers/sse-helpers.js +91 -19
  7. package/lib/middleware/auth.js +6 -3
  8. package/lib/middleware/deferred-quota-check.d.ts +5 -0
  9. package/lib/middleware/deferred-quota-check.js +33 -0
  10. package/lib/middleware/ecosystem-guard.d.ts +3 -3
  11. package/lib/middleware/ecosystem-guard.js +5 -5
  12. package/lib/middleware/index.d.ts +5 -2
  13. package/lib/middleware/index.js +6 -3
  14. package/lib/middleware/on-behalf.d.ts +37 -0
  15. package/lib/middleware/on-behalf.js +143 -0
  16. package/lib/middleware/permission-gates.d.ts +11 -0
  17. package/lib/middleware/permission-gates.js +7 -1
  18. package/lib/middleware/quota-exempt-routes.d.ts +36 -0
  19. package/lib/middleware/quota-exempt-routes.js +47 -0
  20. package/lib/middleware/route-table.d.ts +104 -0
  21. package/lib/middleware/route-table.js +72 -2
  22. package/lib/middleware/service-tokens.d.ts +8 -0
  23. package/lib/middleware/service-tokens.js +2 -1
  24. package/lib/middleware/step-up.js +11 -1
  25. package/lib/services/ai-call-weight.d.ts +24 -0
  26. package/lib/services/ai-call-weight.js +77 -0
  27. package/lib/services/audit-context.d.ts +105 -0
  28. package/lib/services/audit-context.js +134 -0
  29. package/lib/services/index.d.ts +7 -2
  30. package/lib/services/index.js +7 -2
  31. package/lib/services/org-ai-client.d.ts +61 -0
  32. package/lib/services/org-ai-client.js +112 -0
  33. package/lib/services/quota-increment-batcher.d.ts +81 -0
  34. package/lib/services/quota-increment-batcher.js +166 -0
  35. package/lib/services/quota.d.ts +158 -14
  36. package/lib/services/quota.js +252 -22
  37. package/lib/services/remote-audit-client.d.ts +44 -1
  38. package/lib/services/remote-audit-client.js +106 -20
  39. package/lib/services/version-vuln-policy.d.ts +174 -0
  40. package/lib/services/version-vuln-policy.js +242 -0
  41. package/lib/types/ai-catalog.d.ts +63 -0
  42. package/lib/types/ai-catalog.js +82 -0
  43. package/lib/types/ask-proposals.js +6 -6
  44. package/lib/types/build-catalog.d.ts +154 -0
  45. package/lib/types/build-catalog.js +158 -0
  46. package/lib/types/common.d.ts +37 -3
  47. package/lib/types/common.js +20 -2
  48. package/lib/types/ecosystem-notifications.d.ts +5 -5
  49. package/lib/types/ecosystem-notifications.js +9 -3
  50. package/lib/types/error-codes.d.ts +13 -6
  51. package/lib/types/error-codes.js +18 -8
  52. package/lib/types/feature-flags.d.ts +6 -4
  53. package/lib/types/feature-flags.js +11 -6
  54. package/lib/types/index.d.ts +6 -4
  55. package/lib/types/index.js +12 -5
  56. package/lib/types/metadata-keys.d.ts +6 -0
  57. package/lib/types/metadata-keys.js +4 -1
  58. package/lib/types/permissions.d.ts +344 -3
  59. package/lib/types/permissions.js +596 -21
  60. package/lib/types/pipeline.d.ts +39 -0
  61. package/lib/types/pipeline.js +57 -1
  62. package/lib/types/plugin-health.d.ts +0 -2
  63. package/lib/types/plugin-health.js +1 -11
  64. package/lib/types/plugin-scan.d.ts +192 -42
  65. package/lib/types/plugin-scan.js +159 -43
  66. package/lib/types/quota-catalog.d.ts +247 -0
  67. package/lib/types/quota-catalog.js +122 -0
  68. package/lib/types/quota-tiers.d.ts +118 -0
  69. package/lib/types/quota-tiers.js +153 -2
  70. package/lib/types/remote-audit-actions.d.ts +1 -1
  71. package/lib/types/remote-audit-actions.js +131 -1
  72. package/lib/types/wire-vocabulary.js +8 -1
  73. package/lib/utils/index.d.ts +1 -1
  74. package/lib/utils/index.js +2 -2
  75. package/lib/utils/response.d.ts +35 -2
  76. package/lib/utils/response.js +42 -3
  77. package/lib/validation/ai-schemas.d.ts +27 -0
  78. package/lib/validation/ai-schemas.js +31 -5
  79. package/lib/validation/plugin-schemas.d.ts +15 -0
  80. package/lib/validation/plugin-schemas.js +28 -1
  81. package/package.json +31 -2
@@ -22,6 +22,45 @@ export declare const ComputeType: {
22
22
  readonly X2_LARGE: 'X2_LARGE';
23
23
  };
24
24
  export type ComputeType = ValueOf<typeof ComputeType>;
25
+ /**
26
+ * vCPU each CodeBuild compute size provides, for turning a build's DURATION
27
+ * into `cpuCredits` (one credit = one vCPU-minute).
28
+ *
29
+ * Derived from the same AWS table the `ComputeType` doc above cites, and kept
30
+ * beside it on purpose: the memory/vCPU figures in that comment and the numbers
31
+ * here are the same fact, and splitting them is how one gets updated alone.
32
+ *
33
+ * `X2_LARGE` is 72 vCPU — thirty-six times SMALL. That ratio is why pipeline
34
+ * execution cannot be charged by wall-clock alone, and why ingesting it
35
+ * (Phase 4) re-derives the tier ladder rather than simply adding to it.
36
+ */
37
+ export declare const CODEBUILD_COMPUTE_VCPU: Readonly<Record<ComputeType, number>>;
38
+ /**
39
+ * AWS's own spelling of a compute size, as `BatchGetBuilds` returns it
40
+ * (`environment.computeType`), narrowed to ours.
41
+ *
42
+ * Needed because the two vocabularies differ: the pipeline config stores
43
+ * `MEDIUM`, AWS answers `BUILD_GENERAL1_MEDIUM`, and a wrong match here would
44
+ * price a build at the wrong vCPU rather than failing visibly. Anything
45
+ * unrecognised returns `null` — an unknown size must be reported as unknown, not
46
+ * silently priced as SMALL, which is the cheapest and therefore the most
47
+ * flattering guess.
48
+ */
49
+ export declare function normalizeComputeType(raw: string | undefined | null): ComputeType | null;
50
+ /**
51
+ * Credits one CodeBuild action consumed, from its duration and compute size.
52
+ *
53
+ * Rounds UP to the whole credit, matching the plugin-build meter
54
+ * (`creditsForBuild`) — two meters feeding one counter must round the same way
55
+ * or the counter means neither.
56
+ *
57
+ * Returns `null` rather than 0 when either input is missing, and the distinction
58
+ * is the point: a build with no measured duration was not observed, and
59
+ * reporting that as zero consumption would make the coverage gap look like
60
+ * idleness. The ingest counts those separately (`measured="false"`) so the
61
+ * coverage ratio is visible BEFORE anyone prices a tier off this series.
62
+ */
63
+ export declare function computeCreditsFor(durationMs: number | null | undefined, computeType: ComputeType | null): number | null;
25
64
  /**
26
65
  * Types of pipeline steps that can be created by plugins
27
66
  *
@@ -16,6 +16,62 @@ export const ComputeType = {
16
16
  LARGE: 'LARGE',
17
17
  X2_LARGE: 'X2_LARGE',
18
18
  };
19
+ /**
20
+ * vCPU each CodeBuild compute size provides, for turning a build's DURATION
21
+ * into `cpuCredits` (one credit = one vCPU-minute).
22
+ *
23
+ * Derived from the same AWS table the `ComputeType` doc above cites, and kept
24
+ * beside it on purpose: the memory/vCPU figures in that comment and the numbers
25
+ * here are the same fact, and splitting them is how one gets updated alone.
26
+ *
27
+ * `X2_LARGE` is 72 vCPU — thirty-six times SMALL. That ratio is why pipeline
28
+ * execution cannot be charged by wall-clock alone, and why ingesting it
29
+ * (Phase 4) re-derives the tier ladder rather than simply adding to it.
30
+ */
31
+ export const CODEBUILD_COMPUTE_VCPU = {
32
+ SMALL: 2,
33
+ MEDIUM: 4,
34
+ LARGE: 8,
35
+ X2_LARGE: 72,
36
+ };
37
+ /**
38
+ * AWS's own spelling of a compute size, as `BatchGetBuilds` returns it
39
+ * (`environment.computeType`), narrowed to ours.
40
+ *
41
+ * Needed because the two vocabularies differ: the pipeline config stores
42
+ * `MEDIUM`, AWS answers `BUILD_GENERAL1_MEDIUM`, and a wrong match here would
43
+ * price a build at the wrong vCPU rather than failing visibly. Anything
44
+ * unrecognised returns `null` — an unknown size must be reported as unknown, not
45
+ * silently priced as SMALL, which is the cheapest and therefore the most
46
+ * flattering guess.
47
+ */
48
+ export function normalizeComputeType(raw) {
49
+ if (!raw)
50
+ return null;
51
+ const upper = raw.toUpperCase();
52
+ const bare = upper.startsWith('BUILD_GENERAL1_') ? upper.slice('BUILD_GENERAL1_'.length) : upper;
53
+ // AWS spells the largest one `2XLARGE`; ours is `X2_LARGE`.
54
+ const key = bare === '2XLARGE' || bare === 'X2LARGE' ? 'X2_LARGE' : bare;
55
+ return Object.keys(CODEBUILD_COMPUTE_VCPU).find((c) => c === key) ?? null;
56
+ }
57
+ /**
58
+ * Credits one CodeBuild action consumed, from its duration and compute size.
59
+ *
60
+ * Rounds UP to the whole credit, matching the plugin-build meter
61
+ * (`creditsForBuild`) — two meters feeding one counter must round the same way
62
+ * or the counter means neither.
63
+ *
64
+ * Returns `null` rather than 0 when either input is missing, and the distinction
65
+ * is the point: a build with no measured duration was not observed, and
66
+ * reporting that as zero consumption would make the coverage gap look like
67
+ * idleness. The ingest counts those separately (`measured="false"`) so the
68
+ * coverage ratio is visible BEFORE anyone prices a tier off this series.
69
+ */
70
+ export function computeCreditsFor(durationMs, computeType) {
71
+ if (durationMs == null || !(durationMs > 0) || !computeType)
72
+ return null;
73
+ return Math.ceil((durationMs / 60_000) * CODEBUILD_COMPUTE_VCPU[computeType]);
74
+ }
19
75
  /**
20
76
  * Types of pipeline steps that can be created by plugins
21
77
  *
@@ -28,4 +84,4 @@ export const PluginType = {
28
84
  SHELL_STEP: 'ShellStep',
29
85
  MANUAL_APPROVAL_STEP: 'ManualApprovalStep',
30
86
  };
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQVd0Qzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUc7SUFDekIsS0FBSyxFQUFFLE9BQU87SUFDZCxNQUFNLEVBQUUsUUFBUTtJQUNoQixLQUFLLEVBQUUsT0FBTztJQUNkLFFBQVEsRUFBRSxVQUFVO0NBQ1osQ0FBQztBQUdYOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixlQUFlLEVBQUUsZUFBZTtJQUNoQyxVQUFVLEVBQUUsV0FBVztJQUN2QixvQkFBb0IsRUFBRSxvQkFBb0I7Q0FDbEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFNoYXJlZCBwaXBlbGluZSB0eXBlcyB1c2VkIGJ5IGJvdGggcGlwZWxpbmUtY29yZSBhbmQgcGlwZWxpbmUtZGF0YVxuICovXG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIGV4dHJhY3QgdGhlIHVuaW9uIG9mIGFsbCB2YWx1ZXMgZnJvbSBhbiBvYmplY3QgdHlwZVxuICovXG50eXBlIFZhbHVlT2Y8VD4gPSBUW2tleW9mIFRdO1xuXG4vKipcbiAqIEFXUyBDb2RlQnVpbGQgY29tcHV0ZSByZXNvdXJjZSBzaXplc1xuICpcbiAqIEBwcm9wZXJ0eSBTTUFMTCAtIDMgR0IgbWVtb3J5LCAyIHZDUFVzXG4gKiBAcHJvcGVydHkgTUVESVVNIC0gNyBHQiBtZW1vcnksIDQgdkNQVXNcbiAqIEBwcm9wZXJ0eSBMQVJHRSAtIDE1IEdCIG1lbW9yeSwgOCB2Q1BVc1xuICogQHByb3BlcnR5IFgyX0xBUkdFIC0gMTQ1IEdCIG1lbW9yeSwgNzIgdkNQVXNcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb2RlYnVpbGQvbGF0ZXN0L3VzZXJndWlkZS9idWlsZC1lbnYtcmVmLWNvbXB1dGUtdHlwZXMuaHRtbFxuICovXG5leHBvcnQgY29uc3QgQ29tcHV0ZVR5cGUgPSB7XG4gIFNNQUxMOiAnU01BTEwnLFxuICBNRURJVU06ICdNRURJVU0nLFxuICBMQVJHRTogJ0xBUkdFJyxcbiAgWDJfTEFSR0U6ICdYMl9MQVJHRScsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQ29tcHV0ZVR5cGUgPSBWYWx1ZU9mPHR5cGVvZiBDb21wdXRlVHlwZT47XG5cbi8qKlxuICogVHlwZXMgb2YgcGlwZWxpbmUgc3RlcHMgdGhhdCBjYW4gYmUgY3JlYXRlZCBieSBwbHVnaW5zXG4gKlxuICogQHByb3BlcnR5IENPREVfQlVJTERfU1RFUCAtIEZ1bGwgQ29kZUJ1aWxkIHN0ZXAgd2l0aCBjdXN0b20gYnVpbGQgZW52aXJvbm1lbnRcbiAqIEBwcm9wZXJ0eSBTSEVMTF9TVEVQIC0gU2ltcGxlIHNoZWxsIHN0ZXAgd2l0aG91dCBjdXN0b20gYnVpbGQgZW52aXJvbm1lbnRcbiAqIEBwcm9wZXJ0eSBNQU5VQUxfQVBQUk9WQUxfU1RFUCAtIE5hdGl2ZSBDREsgYXBwcm92YWwgZ2F0ZSAobm8gRG9ja2VyIGltYWdlLCBubyBjb21tYW5kcylcbiAqL1xuZXhwb3J0IGNvbnN0IFBsdWdpblR5cGUgPSB7XG4gIENPREVfQlVJTERfU1RFUDogJ0NvZGVCdWlsZFN0ZXAnLFxuICBTSEVMTF9TVEVQOiAnU2hlbGxTdGVwJyxcbiAgTUFOVUFMX0FQUFJPVkFMX1NURVA6ICdNYW51YWxBcHByb3ZhbFN0ZXAnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFBsdWdpblR5cGUgPSBWYWx1ZU9mPHR5cGVvZiBQbHVnaW5UeXBlPjtcblxuLyoqXG4gKiBNZXRhZGF0YSB0eXBlIGZvciBzdG9yaW5nIGNvbmZpZ3VyYXRpb24gYW5kIGN1c3RvbSBwcm9wZXJ0aWVzXG4gKlxuICogU3VwcG9ydHM6XG4gKiAtIFN0YW5kYXJkIGtleS12YWx1ZSBwYWlycyAoc3RyaW5nLCBib29sZWFuLCBudW1iZXIpXG4gKiAtIEN1c3RvbSBBV1MgQ0RLIGtleXMgd2l0aCB0aGUgcGF0dGVybiBgYXdzOmNkazp7bmFtZXNwYWNlfTp7a2V5fWBcbiAqICAgKGFsbCBsb3dlcmNhc2Ug4oCUIG1hdGNoZXMgdGhlIGZvcm1hdCBwcm9kdWNlZCBieSBgZ2V0Q3VzdG9tS2V5YClcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbWV0YWRhdGE6IE1ldGFEYXRhVHlwZSA9IHtcbiAqICAgQlVJTERfRU5WOiAncHJvZHVjdGlvbicsXG4gKiAgIE5PREVfVkVSU0lPTjogJzE4JyxcbiAqICAgRU5BQkxFX0NBQ0hFOiB0cnVlLFxuICogICBNQVhfUkVUUklFUzogM1xuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBNZXRhRGF0YVR5cGUgPVxuICBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyPiAmXG4gIHsgW0sgaW4gYGF3czpjZGs6JHtzdHJpbmd9YF0/OiB1bmtub3duIH07XG4iXX0=
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQVd0Qzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUc7SUFDekIsS0FBSyxFQUFFLE9BQU87SUFDZCxNQUFNLEVBQUUsUUFBUTtJQUNoQixLQUFLLEVBQUUsT0FBTztJQUNkLFFBQVEsRUFBRSxVQUFVO0NBQ1osQ0FBQztBQUdYOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQTBDO0lBQzNFLEtBQUssRUFBRSxDQUFDO0lBQ1IsTUFBTSxFQUFFLENBQUM7SUFDVCxLQUFLLEVBQUUsQ0FBQztJQUNSLFFBQVEsRUFBRSxFQUFFO0NBQ2IsQ0FBQztBQUVGOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsR0FBOEI7SUFDakUsSUFBSSxDQUFDLEdBQUc7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN0QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDaEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDakcsNERBQTREO0lBQzVELE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDekUsT0FBUSxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUMvRixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFVBQXFDLEVBQUUsV0FBK0I7SUFDdEcsSUFBSSxVQUFVLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDekUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixlQUFlLEVBQUUsZUFBZTtJQUNoQyxVQUFVLEVBQUUsV0FBVztJQUN2QixvQkFBb0IsRUFBRSxvQkFBb0I7Q0FDbEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFNoYXJlZCBwaXBlbGluZSB0eXBlcyB1c2VkIGJ5IGJvdGggcGlwZWxpbmUtY29yZSBhbmQgcGlwZWxpbmUtZGF0YVxuICovXG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIGV4dHJhY3QgdGhlIHVuaW9uIG9mIGFsbCB2YWx1ZXMgZnJvbSBhbiBvYmplY3QgdHlwZVxuICovXG50eXBlIFZhbHVlT2Y8VD4gPSBUW2tleW9mIFRdO1xuXG4vKipcbiAqIEFXUyBDb2RlQnVpbGQgY29tcHV0ZSByZXNvdXJjZSBzaXplc1xuICpcbiAqIEBwcm9wZXJ0eSBTTUFMTCAtIDMgR0IgbWVtb3J5LCAyIHZDUFVzXG4gKiBAcHJvcGVydHkgTUVESVVNIC0gNyBHQiBtZW1vcnksIDQgdkNQVXNcbiAqIEBwcm9wZXJ0eSBMQVJHRSAtIDE1IEdCIG1lbW9yeSwgOCB2Q1BVc1xuICogQHByb3BlcnR5IFgyX0xBUkdFIC0gMTQ1IEdCIG1lbW9yeSwgNzIgdkNQVXNcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb2RlYnVpbGQvbGF0ZXN0L3VzZXJndWlkZS9idWlsZC1lbnYtcmVmLWNvbXB1dGUtdHlwZXMuaHRtbFxuICovXG5leHBvcnQgY29uc3QgQ29tcHV0ZVR5cGUgPSB7XG4gIFNNQUxMOiAnU01BTEwnLFxuICBNRURJVU06ICdNRURJVU0nLFxuICBMQVJHRTogJ0xBUkdFJyxcbiAgWDJfTEFSR0U6ICdYMl9MQVJHRScsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQ29tcHV0ZVR5cGUgPSBWYWx1ZU9mPHR5cGVvZiBDb21wdXRlVHlwZT47XG5cbi8qKlxuICogdkNQVSBlYWNoIENvZGVCdWlsZCBjb21wdXRlIHNpemUgcHJvdmlkZXMsIGZvciB0dXJuaW5nIGEgYnVpbGQncyBEVVJBVElPTlxuICogaW50byBgY3B1Q3JlZGl0c2AgKG9uZSBjcmVkaXQgPSBvbmUgdkNQVS1taW51dGUpLlxuICpcbiAqIERlcml2ZWQgZnJvbSB0aGUgc2FtZSBBV1MgdGFibGUgdGhlIGBDb21wdXRlVHlwZWAgZG9jIGFib3ZlIGNpdGVzLCBhbmQga2VwdFxuICogYmVzaWRlIGl0IG9uIHB1cnBvc2U6IHRoZSBtZW1vcnkvdkNQVSBmaWd1cmVzIGluIHRoYXQgY29tbWVudCBhbmQgdGhlIG51bWJlcnNcbiAqIGhlcmUgYXJlIHRoZSBzYW1lIGZhY3QsIGFuZCBzcGxpdHRpbmcgdGhlbSBpcyBob3cgb25lIGdldHMgdXBkYXRlZCBhbG9uZS5cbiAqXG4gKiBgWDJfTEFSR0VgIGlzIDcyIHZDUFUg4oCUIHRoaXJ0eS1zaXggdGltZXMgU01BTEwuIFRoYXQgcmF0aW8gaXMgd2h5IHBpcGVsaW5lXG4gKiBleGVjdXRpb24gY2Fubm90IGJlIGNoYXJnZWQgYnkgd2FsbC1jbG9jayBhbG9uZSwgYW5kIHdoeSBpbmdlc3RpbmcgaXRcbiAqIChQaGFzZSA0KSByZS1kZXJpdmVzIHRoZSB0aWVyIGxhZGRlciByYXRoZXIgdGhhbiBzaW1wbHkgYWRkaW5nIHRvIGl0LlxuICovXG5leHBvcnQgY29uc3QgQ09ERUJVSUxEX0NPTVBVVEVfVkNQVTogUmVhZG9ubHk8UmVjb3JkPENvbXB1dGVUeXBlLCBudW1iZXI+PiA9IHtcbiAgU01BTEw6IDIsXG4gIE1FRElVTTogNCxcbiAgTEFSR0U6IDgsXG4gIFgyX0xBUkdFOiA3Mixcbn07XG5cbi8qKlxuICogQVdTJ3Mgb3duIHNwZWxsaW5nIG9mIGEgY29tcHV0ZSBzaXplLCBhcyBgQmF0Y2hHZXRCdWlsZHNgIHJldHVybnMgaXRcbiAqIChgZW52aXJvbm1lbnQuY29tcHV0ZVR5cGVgKSwgbmFycm93ZWQgdG8gb3Vycy5cbiAqXG4gKiBOZWVkZWQgYmVjYXVzZSB0aGUgdHdvIHZvY2FidWxhcmllcyBkaWZmZXI6IHRoZSBwaXBlbGluZSBjb25maWcgc3RvcmVzXG4gKiBgTUVESVVNYCwgQVdTIGFuc3dlcnMgYEJVSUxEX0dFTkVSQUwxX01FRElVTWAsIGFuZCBhIHdyb25nIG1hdGNoIGhlcmUgd291bGRcbiAqIHByaWNlIGEgYnVpbGQgYXQgdGhlIHdyb25nIHZDUFUgcmF0aGVyIHRoYW4gZmFpbGluZyB2aXNpYmx5LiBBbnl0aGluZ1xuICogdW5yZWNvZ25pc2VkIHJldHVybnMgYG51bGxgIOKAlCBhbiB1bmtub3duIHNpemUgbXVzdCBiZSByZXBvcnRlZCBhcyB1bmtub3duLCBub3RcbiAqIHNpbGVudGx5IHByaWNlZCBhcyBTTUFMTCwgd2hpY2ggaXMgdGhlIGNoZWFwZXN0IGFuZCB0aGVyZWZvcmUgdGhlIG1vc3RcbiAqIGZsYXR0ZXJpbmcgZ3Vlc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb21wdXRlVHlwZShyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwpOiBDb21wdXRlVHlwZSB8IG51bGwge1xuICBpZiAoIXJhdykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHVwcGVyID0gcmF3LnRvVXBwZXJDYXNlKCk7XG4gIGNvbnN0IGJhcmUgPSB1cHBlci5zdGFydHNXaXRoKCdCVUlMRF9HRU5FUkFMMV8nKSA/IHVwcGVyLnNsaWNlKCdCVUlMRF9HRU5FUkFMMV8nLmxlbmd0aCkgOiB1cHBlcjtcbiAgLy8gQVdTIHNwZWxscyB0aGUgbGFyZ2VzdCBvbmUgYDJYTEFSR0VgOyBvdXJzIGlzIGBYMl9MQVJHRWAuXG4gIGNvbnN0IGtleSA9IGJhcmUgPT09ICcyWExBUkdFJyB8fCBiYXJlID09PSAnWDJMQVJHRScgPyAnWDJfTEFSR0UnIDogYmFyZTtcbiAgcmV0dXJuIChPYmplY3Qua2V5cyhDT0RFQlVJTERfQ09NUFVURV9WQ1BVKSBhcyBDb21wdXRlVHlwZVtdKS5maW5kKChjKSA9PiBjID09PSBrZXkpID8/IG51bGw7XG59XG5cbi8qKlxuICogQ3JlZGl0cyBvbmUgQ29kZUJ1aWxkIGFjdGlvbiBjb25zdW1lZCwgZnJvbSBpdHMgZHVyYXRpb24gYW5kIGNvbXB1dGUgc2l6ZS5cbiAqXG4gKiBSb3VuZHMgVVAgdG8gdGhlIHdob2xlIGNyZWRpdCwgbWF0Y2hpbmcgdGhlIHBsdWdpbi1idWlsZCBtZXRlclxuICogKGBjcmVkaXRzRm9yQnVpbGRgKSDigJQgdHdvIG1ldGVycyBmZWVkaW5nIG9uZSBjb3VudGVyIG11c3Qgcm91bmQgdGhlIHNhbWUgd2F5XG4gKiBvciB0aGUgY291bnRlciBtZWFucyBuZWl0aGVyLlxuICpcbiAqIFJldHVybnMgYG51bGxgIHJhdGhlciB0aGFuIDAgd2hlbiBlaXRoZXIgaW5wdXQgaXMgbWlzc2luZywgYW5kIHRoZSBkaXN0aW5jdGlvblxuICogaXMgdGhlIHBvaW50OiBhIGJ1aWxkIHdpdGggbm8gbWVhc3VyZWQgZHVyYXRpb24gd2FzIG5vdCBvYnNlcnZlZCwgYW5kXG4gKiByZXBvcnRpbmcgdGhhdCBhcyB6ZXJvIGNvbnN1bXB0aW9uIHdvdWxkIG1ha2UgdGhlIGNvdmVyYWdlIGdhcCBsb29rIGxpa2VcbiAqIGlkbGVuZXNzLiBUaGUgaW5nZXN0IGNvdW50cyB0aG9zZSBzZXBhcmF0ZWx5IChgbWVhc3VyZWQ9XCJmYWxzZVwiYCkgc28gdGhlXG4gKiBjb3ZlcmFnZSByYXRpbyBpcyB2aXNpYmxlIEJFRk9SRSBhbnlvbmUgcHJpY2VzIGEgdGllciBvZmYgdGhpcyBzZXJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQ3JlZGl0c0ZvcihkdXJhdGlvbk1zOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBjb21wdXRlVHlwZTogQ29tcHV0ZVR5cGUgfCBudWxsKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmIChkdXJhdGlvbk1zID09IG51bGwgfHwgIShkdXJhdGlvbk1zID4gMCkgfHwgIWNvbXB1dGVUeXBlKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIE1hdGguY2VpbCgoZHVyYXRpb25NcyAvIDYwXzAwMCkgKiBDT0RFQlVJTERfQ09NUFVURV9WQ1BVW2NvbXB1dGVUeXBlXSk7XG59XG5cbi8qKlxuICogVHlwZXMgb2YgcGlwZWxpbmUgc3RlcHMgdGhhdCBjYW4gYmUgY3JlYXRlZCBieSBwbHVnaW5zXG4gKlxuICogQHByb3BlcnR5IENPREVfQlVJTERfU1RFUCAtIEZ1bGwgQ29kZUJ1aWxkIHN0ZXAgd2l0aCBjdXN0b20gYnVpbGQgZW52aXJvbm1lbnRcbiAqIEBwcm9wZXJ0eSBTSEVMTF9TVEVQIC0gU2ltcGxlIHNoZWxsIHN0ZXAgd2l0aG91dCBjdXN0b20gYnVpbGQgZW52aXJvbm1lbnRcbiAqIEBwcm9wZXJ0eSBNQU5VQUxfQVBQUk9WQUxfU1RFUCAtIE5hdGl2ZSBDREsgYXBwcm92YWwgZ2F0ZSAobm8gRG9ja2VyIGltYWdlLCBubyBjb21tYW5kcylcbiAqL1xuZXhwb3J0IGNvbnN0IFBsdWdpblR5cGUgPSB7XG4gIENPREVfQlVJTERfU1RFUDogJ0NvZGVCdWlsZFN0ZXAnLFxuICBTSEVMTF9TVEVQOiAnU2hlbGxTdGVwJyxcbiAgTUFOVUFMX0FQUFJPVkFMX1NURVA6ICdNYW51YWxBcHByb3ZhbFN0ZXAnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFBsdWdpblR5cGUgPSBWYWx1ZU9mPHR5cGVvZiBQbHVnaW5UeXBlPjtcblxuLyoqXG4gKiBNZXRhZGF0YSB0eXBlIGZvciBzdG9yaW5nIGNvbmZpZ3VyYXRpb24gYW5kIGN1c3RvbSBwcm9wZXJ0aWVzXG4gKlxuICogU3VwcG9ydHM6XG4gKiAtIFN0YW5kYXJkIGtleS12YWx1ZSBwYWlycyAoc3RyaW5nLCBib29sZWFuLCBudW1iZXIpXG4gKiAtIEN1c3RvbSBBV1MgQ0RLIGtleXMgd2l0aCB0aGUgcGF0dGVybiBgYXdzOmNkazp7bmFtZXNwYWNlfTp7a2V5fWBcbiAqICAgKGFsbCBsb3dlcmNhc2Ug4oCUIG1hdGNoZXMgdGhlIGZvcm1hdCBwcm9kdWNlZCBieSBgZ2V0Q3VzdG9tS2V5YClcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbWV0YWRhdGE6IE1ldGFEYXRhVHlwZSA9IHtcbiAqICAgQlVJTERfRU5WOiAncHJvZHVjdGlvbicsXG4gKiAgIE5PREVfVkVSU0lPTjogJzE4JyxcbiAqICAgRU5BQkxFX0NBQ0hFOiB0cnVlLFxuICogICBNQVhfUkVUUklFUzogM1xuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBNZXRhRGF0YVR5cGUgPVxuICBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyPiAmXG4gIHsgW0sgaW4gYGF3czpjZGs6JHtzdHJpbmd9YF0/OiB1bmtub3duIH07XG4iXX0=
@@ -23,8 +23,6 @@ export declare const HEALTH_COMPONENTS: readonly ['runtime', 'vulns', 'freshness
23
23
  export type HealthComponent = (typeof HEALTH_COMPONENTS)[number];
24
24
  /** Nominal weight of each component (they sum to 100). */
25
25
  export declare const HEALTH_WEIGHTS: Readonly<Record<HealthComponent, number>>;
26
- /** Human labels for the breakdown panel. */
27
- export declare const HEALTH_COMPONENT_LABELS: Readonly<Record<HealthComponent, string>>;
28
26
  /** Fewer available components than this ⇒ no score. */
29
27
  export declare const HEALTH_MIN_COMPONENTS = 3;
30
28
  /** Runs needed in the window before the success rate counts. */
@@ -32,16 +32,6 @@ export const HEALTH_WEIGHTS = {
32
32
  docs: 10,
33
33
  rating: 10,
34
34
  };
35
- /** Human labels for the breakdown panel. */
36
- export const HEALTH_COMPONENT_LABELS = {
37
- runtime: 'Runtime success (30 days)',
38
- vulns: 'Known vulnerabilities',
39
- freshness: 'Freshness',
40
- signed: 'Signed image',
41
- smokeTest: 'Smoke test declared',
42
- docs: 'README and license',
43
- rating: 'Rating',
44
- };
45
35
  /** Fewer available components than this ⇒ no score. */
46
36
  export const HEALTH_MIN_COMPONENTS = 3;
47
37
  /** Runs needed in the window before the success rate counts. */
@@ -181,4 +171,4 @@ export function healthBand(score) {
181
171
  return 'fair';
182
172
  return 'poor';
183
173
  }
184
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWhlYWx0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9wbHVnaW4taGVhbHRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQVUsQ0FBQztBQUdySCwwREFBMEQ7QUFDMUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUE4QztJQUN2RSxPQUFPLEVBQUUsRUFBRTtJQUNYLEtBQUssRUFBRSxFQUFFO0lBQ1QsU0FBUyxFQUFFLEVBQUU7SUFDYixNQUFNLEVBQUUsRUFBRTtJQUNWLFNBQVMsRUFBRSxFQUFFO0lBQ2IsSUFBSSxFQUFFLEVBQUU7SUFDUixNQUFNLEVBQUUsRUFBRTtDQUNYLENBQUM7QUFFRiw0Q0FBNEM7QUFDNUMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQThDO0lBQ2hGLE9BQU8sRUFBRSwyQkFBMkI7SUFDcEMsS0FBSyxFQUFFLHVCQUF1QjtJQUM5QixTQUFTLEVBQUUsV0FBVztJQUN0QixNQUFNLEVBQUUsY0FBYztJQUN0QixTQUFTLEVBQUUscUJBQXFCO0lBQ2hDLElBQUksRUFBRSxvQkFBb0I7SUFDMUIsTUFBTSxFQUFFLFFBQVE7Q0FDakIsQ0FBQztBQUVGLHVEQUF1RDtBQUN2RCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFDdkMsZ0VBQWdFO0FBQ2hFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDbEMsK0NBQStDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUNwQyw4RkFBOEY7QUFDOUYsTUFBTSxDQUFDLE1BQU0s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QUMsY0FBYyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQztZQUFFLFNBQVM7UUFDaEcsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDbEIsU0FBUyxJQUFJLENBQUMsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUM1QyxDQUFDO0lBQ0QsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUlELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztBQUNuQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFFbkMsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFnQztJQUN6RCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDdkYsSUFBSSxLQUFLLElBQUksZ0JBQWdCO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDN0MsSUFBSSxLQUFLLElBQUksZ0JBQWdCO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDN0MsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBwbHVnaW4gSEVBTFRIIFNDT1JFIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKTogb25lIDDigJMxMDBcbiAqIG51bWJlciBwZXIgbGlzdGluZywgZnJvbSBzZXZlbiBjb21wb25lbnRzLiBQdXJlIGFuZCBkZXBlbmRlbmN5LWZyZWUgc28gdGhlXG4gKiBwbHVnaW4gc2VydmljZSAodGhlIHN0YXRzIHN3ZWVwKSwgdGhlIGZyb250ZW5kICh0aGUgYnJlYWtkb3duIHBhbmVsJ3NcbiAqIGxhYmVscykgYW5kIHRoZSB0ZXN0cyBzaGFyZSBvbmUgZGVmaW5pdGlvbi5cbiAqXG4gKiBFYWNoIGNvbXBvbmVudCBzY29yZXMgMC4uMSBhbmQgY2FycmllcyBhIGZpeGVkIHdlaWdodC4gQSBjb21wb25lbnQgd2hvc2VcbiAqIGlucHV0cyBhcmUgbWlzc2luZyBpcyBEUk9QUEVEIGFuZCB0aGUgcmVtYWluaW5nIHdlaWdodHMgYXJlIHJlbm9ybWFsaXplZDsgd2l0aFxuICogZmV3ZXIgdGhhbiB7QGxpbmsgSEVBTFRIX01JTl9DT01QT05FTlRTfSBjb21wb25lbnRzIHRoZSBzY29yZSBpcyBudWxsIChcIm5vdFxuICogZW5vdWdoIGRhdGFcIiksIG5ldmVyIGEgZ3Vlc3MuXG4gKlxuICogfCBjb21wb25lbnQgIHwgd2VpZ2h0IHwgc2NvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IHJ1bnRpbWUgICAgfCAyNSAgICAgfCAzMC1kYXkgc3VjY2VzcyByYXRlOyBvbmx5IHdpdGgg4omlIDIwIHJ1bnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHZ1bG5zICAgICAgfCAyMCAgICAgfCAxIOKIkiAwLjXCt2NyaXRpY2FsIOKIkiAwLjHCt2hpZ2ggKGZsb29yIDApLCBsYXRlc3QgbGlzdGVkIHZlcnNpb247IHNjYW5uZWQgb25seSB8XG4gKiB8IGZyZXNobmVzcyAgfCAxNSAgICAgfCByZWxlYXNlIGFnZSAo4omkOTBkIDEg4oaSIDAgYXQgNTQwZCkgYXZlcmFnZWQgd2l0aCBiYXNlLWltYWdlIGFnZSAo4omkNjBkIDEg4oaSIDAgYXQgMzY1ZCkgd2hlbiByZWNvcmRlZCB8XG4gKiB8IHNpZ25lZCAgICAgfCAxMCAgICAgfCBpbWFnZSBkaWdlc3QgcHJlc2VudCBhbmQgc2lnbmVkIOKHkiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHNtb2tlVGVzdCAgfCAxMCAgICAgfCBzbW9rZSB0ZXN0IGRlY2xhcmVkIOKHkiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IGRvY3MgICAgICAgfCAxMCAgICAgfCBSRUFETUUgMC41ICsgbGljZW5zZSAwLjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCByYXRpbmcgICAgIHwgMTAgICAgIHwgQmF5ZXNpYW4gcmF0aW5nIC8gNTsgb25seSB3aXRoIOKJpSAzIHJhdGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICovXG5cbmV4cG9ydCBjb25zdCBIRUFMVEhfQ09NUE9ORU5UUyA9IFsncnVudGltZScsICd2dWxucycsICdmcmVzaG5lc3MnLCAnc2lnbmVkJywgJ3Ntb2tlVGVzdCcsICdkb2NzJywgJ3JhdGluZyddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgSGVhbHRoQ29tcG9uZW50ID0gKHR5cGVvZiBIRUFMVEhfQ09NUE9ORU5UUylbbnVtYmVyXTtcblxuLyoqIE5vbWluYWwgd2VpZ2h0IG9mIGVhY2ggY29tcG9uZW50ICh0aGV5IHN1bSB0byAxMDApLiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9XRUlHSFRTOiBSZWFkb25seTxSZWNvcmQ8SGVhbHRoQ29tcG9uZW50LCBudW1iZXI+PiA9IHtcbiAgcnVudGltZTogMjUsXG4gIHZ1bG5zOiAyMCxcbiAgZnJlc2huZXNzOiAxNSxcbiAgc2lnbmVkOiAxMCxcbiAgc21va2VUZXN0OiAxMCxcbiAgZG9jczogMTAsXG4gIHJhdGluZzogMTAsXG59O1xuXG4vKiogSHVtYW4gbGFiZWxzIGZvciB0aGUgYnJlYWtkb3duIHBhbmVsLiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9DT01QT05FTlRfTEFCRUxTOiBSZWFkb25seTxSZWNvcmQ8SGVhbHRoQ29tcG9uZW50LCBzdHJpbmc+PiA9IHtcbiAgcnVudGltZTogJ1J1bnRpbWUgc3VjY2VzcyAoMzAgZGF5cyknLFxuICB2dWxuczogJ0tub3duIHZ1bG5lcmFiaWxpdGllcycsXG4gIGZyZXNobmVzczogJ0ZyZXNobmVzcycsXG4gIHNpZ25lZDogJ1NpZ25lZCBpbWFnZScsXG4gIHNtb2tlVGVzdDogJ1Ntb2tlIHRlc3QgZGVjbGFyZWQnLFxuICBkb2NzOiAnUkVBRE1FIGFuZCBsaWNlbnNlJyxcbiAgcmF0aW5nOiAnUmF0aW5nJyxcbn07XG5cbi8qKiBGZXdlciBhdmFpbGFibGUgY29tcG9uZW50cyB0aGFuIHRoaXMg4oeSIG5vIHNjb3JlLiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9NSU5fQ09NUE9ORU5UUyA9IDM7XG4vKiogUnVucyBuZWVkZWQgaW4gdGhlIHdpbmRvdyBiZWZvcmUgdGhlIHN1Y2Nlc3MgcmF0ZSBjb3VudHMuICovXG5leHBvcnQgY29uc3QgSEVBTFRIX01JTl9SVU5TID0gMjA7XG4vKiogUmF0aW5ncyBuZWVkZWQgYmVmb3JlIHRoZSByYXRpbmcgY291bnRzLiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9NSU5fUkFUSU5HUyA9IDM7XG4vKiogUmVsZWFzZSBhZ2U6IGZ1bGwgbWFya3MgdXAgdG8gdGhpcyBtYW55IGRheXMsIHplcm8gYXQge0BsaW5rIEhFQUxUSF9SRUxFQVNFX1pFUk9fREFZU30uICovXG5leHBvcnQgY29uc3QgSEVBTFRIX1JFTEVBU0VfRlVMTF9EQVlTID0gOTA7XG5leHBvcnQgY29uc3QgSEVBTFRIX1JFTEVBU0VfWkVST19EQVlTID0gNTQwO1xuLyoqIEJhc2UtaW1hZ2UgYWdlOiBmdWxsIG1hcmtzIHVwIHRvIHRoaXMgbWFueSBkYXlzLCB6ZXJvIGF0IHtAbGluayBIRUFMVEhfQkFTRV9JTUFHRV9aRVJPX0RBWVN9LiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9CQVNFX0lNQUdFX0ZVTExfREFZUyA9IDYwO1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9CQVNFX0lNQUdFX1pFUk9fREFZUyA9IDM2NTtcblxuLyoqIE9uZSBjb21wb25lbnQncyBjb250cmlidXRpb246IGl0cyAwLi4xIHNjb3JlIChudWxsID0gbWlzc2luZywgZHJvcHBlZCkgYW5kIGl0cyBub21pbmFsIHdlaWdodC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoQ29tcG9uZW50U2NvcmUge1xuICBzY29yZTogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0OiBudW1iZXI7XG59XG5leHBvcnQgdHlwZSBIZWFsdGhCcmVha2Rvd24gPSBSZWNvcmQ8SGVhbHRoQ29tcG9uZW50LCBIZWFsdGhDb21wb25lbnRTY29yZT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoUmVzdWx0IHtcbiAgLyoqIDDigJMxMDAgaW50ZWdlciwgb3IgbnVsbCB3aXRoIGZld2VyIHRoYW4ge0BsaW5rIEhFQUxUSF9NSU5fQ09NUE9ORU5UU30gY29tcG9uZW50cy4gKi9cbiAgc2NvcmU6IG51bWJlciB8IG51bGw7XG4gIGJyZWFrZG93bjogSGVhbHRoQnJlYWtkb3duO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHNjb3JlIGlzIGNvbXB1dGVkIGZyb20uIEV2ZXJ5IGZpZWxkIGlzIG9wdGlvbmFsOiBgdW5kZWZpbmVkYCAvIG51bGxcbiAqIG1lYW5zIFwibm90IGtub3duXCIsIHdoaWNoIGRyb3BzIHRoZSBjb21wb25lbnQgKG9yLCBmb3IgZnJlc2huZXNzLCB0aGF0IGhhbGYpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aElucHV0cyB7XG4gIC8qKiBUZXJtaW5hbCBydW5zIGluIHRoZSAzMC1kYXkgd2luZG93LCBhbmQgdGhlIHNoYXJlIHRoYXQgc3VjY2VlZGVkICgwLi4xKS4gKi9cbiAgcnVuczMwZD86IG51bWJlciB8IG51bGw7XG4gIHN1Y2Nlc3NSYXRlMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIFRoZSBsYXRlc3QgbGlzdGVkIHZlcnNpb24ncyBzY2FuOyBgc2Nhbm5lZEF0YCBudWxsIOKHkiBuZXZlciBzY2FubmVkLiAqL1xuICB2dWxuQ3JpdGljYWw/OiBudW1iZXIgfCBudWxsO1xuICB2dWxuSGlnaD86IG51bWJlciB8IG51bGw7XG4gIHNjYW5uZWRBdD86IERhdGUgfCBzdHJpbmcgfCBudWxsO1xuICAvKiogV2hlbiB0aGUgbGF0ZXN0IGxpc3RlZCB2ZXJzaW9uIHdhcyBwdWJsaXNoZWQuICovXG4gIGxhc3RSZWxlYXNlQXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRoZSBsYXRlc3QgbGlzdGVkIHZlcnNpb24ncyBiYXNlIGltYWdlIGBjcmVhdGVkYCB0aW1lLCB3aGVuIHJlY29yZGVkLiAqL1xuICBiYXNlSW1hZ2VDcmVhdGVkQXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbDtcbiAgLyoqIExhdGVzdCBsaXN0ZWQgdmVyc2lvbiBoYXMgYW4gaW1hZ2UgZGlnZXN0IEFORCBhIHNpZ25hdHVyZSAoaXRzIGBwdWJsaWMvKmAgY29weSkuICovXG4gIHNpZ25lZD86IGJvb2xlYW4gfCBudWxsO1xuICBzbW9rZVRlc3REZWNsYXJlZD86IGJvb2xlYW4gfCBudWxsO1xuICBoYXNSZWFkbWU/OiBib29sZWFuIHwgbnVsbDtcbiAgaGFzTGljZW5zZT86IGJvb2xlYW4gfCBudWxsO1xuICByYXRpbmdCYXllcz86IG51bWJlciB8IG51bGw7XG4gIHJhdGluZ0NvdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cblxuY29uc3QgREFZX01TID0gODZfNDAwXzAwMDtcblxuY29uc3Qgcm91bmQzID0gKG46IG51bWJlcik6IG51bWJlciA9PiBNYXRoLnJvdW5kKG4gKiAxMDAwKSAvIDEwMDA7XG5jb25zdCBjbGFtcDAxID0gKG46IG51bWJlcik6IG51bWJlciA9PiBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBuKSk7XG5cbmZ1bmN0aW9uIHRvVGltZShkOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB8IG51bGwge1xuICBpZiAoZCA9PT0gbnVsbCB8fCBkID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICBjb25zdCB0ID0gbmV3IERhdGUoZCkuZ2V0VGltZSgpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHQpID8gdCA6IG51bGw7XG59XG5cbi8qKiAxIHVwIHRvIGBmdWxsRGF5c2AsIGZhbGxpbmcgbGluZWFybHkgdG8gMCBhdCBgemVyb0RheXNgIChhIGZ1dHVyZSBkYXRlIGNvdW50cyBhcyBmcmVzaCkuICovXG5leHBvcnQgZnVuY3Rpb24gYWdlU2NvcmUoYWdlRGF5czogbnVtYmVyLCBmdWxsRGF5czogbnVtYmVyLCB6ZXJvRGF5czogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGFnZURheXMgPD0gZnVsbERheXMpIHJldHVybiAxO1xuICBpZiAoYWdlRGF5cyA+PSB6ZXJvRGF5cykgcmV0dXJuIDA7XG4gIHJldHVybiBjbGFtcDAxKDEgLSAoYWdlRGF5cyAtIGZ1bGxEYXlzKSAvICh6ZXJvRGF5cyAtIGZ1bGxEYXlzKSk7XG59XG5cbi8qKiBUaGUgdnVsbmVyYWJpbGl0eSBjb21wb25lbnQ6IDEg4oiSIDAuNcK3Y3JpdGljYWwg4oiSIDAuMcK3aGlnaCwgZmxvb3JlZCBhdCAwLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZ1bG5TY29yZShjcml0aWNhbDogbnVtYmVyLCBoaWdoOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gY2xhbXAwMSgxIC0gMC41ICogTWF0aC5tYXgoMCwgY3JpdGljYWwpIC0gMC4xICogTWF0aC5tYXgoMCwgaGlnaCkpO1xufVxuXG5mdW5jdGlvbiBydW50aW1lQ29tcG9uZW50KGk6IEhlYWx0aElucHV0cyk6IG51bWJlciB8IG51bGwge1xuICBpZiAoaS5ydW5zMzBkID09PSBudWxsIHx8IGkucnVuczMwZCA9PT0gdW5kZWZpbmVkIHx8IGkucnVuczMwZCA8IEhFQUxUSF9NSU5fUlVOUykgcmV0dXJuIG51bGw7XG4gIGlmIChpLnN1Y2Nlc3NSYXRlMzBkID09PSBudWxsIHx8IGkuc3VjY2Vzc1JhdGUzMGQgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKGkuc3VjY2Vzc1JhdGUzMGQpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGNsYW1wMDEoaS5zdWNjZXNzUmF0ZTMwZCk7XG59XG5cbmZ1bmN0aW9uIHZ1bG5zQ29tcG9uZW50KGk6IEhlYWx0aElucHV0cyk6IG51bWJlciB8IG51bGwge1xuICBpZiAodG9UaW1lKGkuc2Nhbm5lZEF0KSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiB2dWxuU2NvcmUoaS52dWxuQ3JpdGljYWwgPz8gMCwgaS52dWxuSGlnaCA/PyAwKTtcbn1cblxuZnVuY3Rpb24gZnJlc2huZXNzQ29tcG9uZW50KGk6IEhlYWx0aElucHV0cywgbm93OiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgcGFydHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHJlbGVhc2UgPSB0b1RpbWUoaS5sYXN0UmVsZWFzZUF0KTtcbiAgaWYgKHJlbGVhc2UgIT09IG51bGwpIHBhcnRzLnB1c2goYWdlU2NvcmUoKG5vdyAtIHJlbGVhc2UpIC8gREFZX01TLCBIRUFMVEhfUkVMRUFTRV9GVUxMX0RBWVMsIEhFQUxUSF9SRUxFQVNFX1pFUk9fREFZUykpO1xuICBjb25zdCBiYXNlID0gdG9UaW1lKGkuYmFzZUltYWdlQ3JlYXRlZEF0KTtcbiAgaWYgKGJhc2UgIT09IG51bGwpIHBhcnRzLnB1c2goYWdlU2NvcmUoKG5vdyAtIGJhc2UpIC8gREFZX01TLCBIRUFMVEhfQkFTRV9JTUFHRV9GVUxMX0RBWVMsIEhFQUxUSF9CQVNFX0lNQUdFX1pFUk9fREFZUykpO1xuICBpZiAocGFydHMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHBhcnRzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gcGFydHMubGVuZ3RoO1xufVxuXG5jb25zdCBmbGFnID0gKGI6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgbnVsbCA9PiAoYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQgPyBudWxsIDogYiA/IDEgOiAwKTtcblxuZnVuY3Rpb24gZG9jc0NvbXBvbmVudChpOiBIZWFsdGhJbnB1dHMpOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKChpLmhhc1JlYWRtZSA9PT0gbnVsbCB8fCBpLmhhc1JlYWRtZSA9PT0gdW5kZWZpbmVkKSAmJiAoaS5oYXNMaWNlbnNlID09PSBudWxsIHx8IGkuaGFzTGljZW5zZSA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiAoaS5oYXNSZWFkbWUgPyAwLjUgOiAwKSArIChpLmhhc0xpY2Vuc2UgPyAwLjUgOiAwKTtcbn1cblxuZnVuY3Rpb24gcmF0aW5nQ29tcG9uZW50KGk6IEhlYWx0aElucHV0cyk6IG51bWJlciB8IG51bGwge1xuICBpZiAoaS5yYXRpbmdDb3VudCA9PT0gbnVsbCB8fCBpLnJhdGluZ0NvdW50ID09PSB1bmRlZmluZWQgfHwgaS5yYXRpbmdDb3VudCA8IEhFQUxUSF9NSU5fUkFUSU5HUykgcmV0dXJuIG51bGw7XG4gIGlmIChpLnJhdGluZ0JheWVzID09PSBudWxsIHx8IGkucmF0aW5nQmF5ZXMgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKGkucmF0aW5nQmF5ZXMpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGNsYW1wMDEoaS5yYXRpbmdCYXllcyAvIDUpO1xufVxuXG4vKiogVGhlIGhlYWx0aCBzY29yZSBhbmQgaXRzIHBlci1jb21wb25lbnQgYnJlYWtkb3duLiBQdXJlOyBgbm93YCBpcyBpbmplY3RhYmxlIGZvciB0ZXN0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlSGVhbHRoU2NvcmUoaW5wdXRzOiBIZWFsdGhJbnB1dHMsIG5vdzogRGF0ZSA9IG5ldyBEYXRlKCkpOiBIZWFsdGhSZXN1bHQge1xuICBjb25zdCB0ID0gbm93LmdldFRpbWUoKTtcbiAgY29uc3QgcmF3OiBSZWNvcmQ8SGVhbHRoQ29tcG9uZW50LCBudW1iZXIgfCBudWxsPiA9IHtcbiAgICBydW50aW1lOiBydW50aW1lQ29tcG9uZW50KGlucHV0cyksXG4gICAgdnVsbnM6IHZ1bG5zQ29tcG9uZW50KGlucHV0cyksXG4gICAgZnJlc2huZXNzOiBmcmVzaG5lc3NDb21wb25lbnQoaW5wdXRzLCB0KSxcbiAgICBzaWduZWQ6IGZsYWcoaW5wdXRzLnNpZ25lZCksXG4gICAgc21va2VUZXN0OiBmbGFnKGlucHV0cy5zbW9rZVRlc3REZWNsYXJlZCksXG4gICAgZG9jczogZG9jc0NvbXBvbmVudChpbnB1dHMpLFxuICAgIHJhdGluZzogcmF0aW5nQ29tcG9uZW50KGlucHV0cyksXG4gIH07XG4gIGNvbnN0IGJyZWFrZG93biA9IHt9IGFzIEhlYWx0aEJyZWFrZG93bjtcbiAgbGV0IHdlaWdodGVkID0gMDtcbiAgbGV0IHRvdGFsV2VpZ2h0ID0gMDtcbiAgbGV0IGF2YWlsYWJsZSA9IDA7XG4gIGZvciAoY29uc3QgYyBvZiBIRUFMVEhfQ09NUE9ORU5UUykge1xuICAgIGNvbnN0IHNjb3JlID0gcmF3W2NdO1xuICAgIGJyZWFrZG93bltjXSA9IHsgc2NvcmU6IHNjb3JlID09PSBudWxsID8gbnVsbCA6IHJvdW5kMyhzY29yZSksIHdlaWdodDogSEVBTFRIX1dFSUdIVFNbY10gfTtcbiAgICBpZiAoc2NvcmUgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgIGF2YWlsYWJsZSsrO1xuICAgIHdlaWdodGVkICs9IHNjb3JlICogSEVBTFRIX1dFSUdIVFNbY107XG4gICAgdG90YWxXZWlnaHQgKz0gSEVBTFRIX1dFSUdIVFNbY107XG4gIH1cbiAgY29uc3Qgc2NvcmUgPSBhdmFpbGFibGUgPCBIRUFMVEhfTUlOX0NPTVBPTkVOVFMgfHwgdG90YWxXZWlnaHQgPT09IDAgPyBudWxsIDogTWF0aC5yb3VuZCgoMTAwICogd2VpZ2h0ZWQpIC8gdG90YWxXZWlnaHQpO1xuICByZXR1cm4geyBzY29yZSwgYnJlYWtkb3duIH07XG59XG5cbi8qKlxuICogQSBwdWJsaXNoZXIncyBoZWFsdGg6IHRoZSBpbnN0YWxsLXdlaWdodGVkIG1lYW4gb2YgaXRzIGxpc3RpbmdzJyBzY29yZXNcbiAqIChsaXN0aW5ncyB3aXRoIG5vIHNjb3JlIGFyZSBza2lwcGVkOyB3aGVuIG5vIGxpc3RpbmcgaGFzIGluc3RhbGxzLCB0aGUgcGxhaW5cbiAqIG1lYW4pLiBOdWxsIHdoZW4gbm8gbGlzdGluZyBoYXMgYSBzY29yZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hlckhlYWx0aFNjb3JlKGxpc3RpbmdzOiBSZWFkb25seUFycmF5PHsgaGVhbHRoU2NvcmU6IG51bWJlciB8IG51bGw7IGluc3RhbGxDb3VudDogbnVtYmVyIH0+KTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IHNjb3JlZCA9IGxpc3RpbmdzLmZpbHRlcigobCk6IGwgaXMgeyBoZWFsdGhTY29yZTogbnVtYmVyOyBpbnN0YWxsQ291bnQ6IG51bWJlciB9ID0+XG4gICAgbC5oZWFsdGhTY29yZSAhPT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUobC5oZWFsdGhTY29yZSkpO1xuICBpZiAoc2NvcmVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHdlaWdodE9mID0gKG46IG51bWJlcikgPT4gTWF0aC5tYXgoMCwgbik7XG4gIGNvbnN0IHRvdGFsSW5zdGFsbHMgPSBzY29yZWQucmVkdWNlKChhLCBsKSA9PiBhICsgd2VpZ2h0T2YobC5pbnN0YWxsQ291bnQpLCAwKTtcbiAgaWYgKHRvdGFsSW5zdGFsbHMgPT09IDApIHJldHVybiBNYXRoLnJvdW5kKHNjb3JlZC5yZWR1Y2UoKGEsIGwpID0+IGEgKyBsLmhlYWx0aFNjb3JlLCAwKSAvIHNjb3JlZC5sZW5ndGgpO1xuICByZXR1cm4gTWF0aC5yb3VuZChzY29yZWQucmVkdWNlKChhLCBsKSA9PiBhICsgbC5oZWFsdGhTY29yZSAqIHdlaWdodE9mKGwuaW5zdGFsbENvdW50KSwgMCkgLyB0b3RhbEluc3RhbGxzKTtcbn1cblxuLyoqXG4gKiBBIHB1Ymxpc2hlcidzIDMwLWRheSBzdWNjZXNzIHJhdGUgYWNyb3NzIGl0cyBsaXN0aW5ncywgd2VpZ2h0ZWQgYnkgcnVucy5cbiAqIE51bGwgd2hlbiBub25lIG9mIGl0cyBsaXN0aW5ncyByYW4gaW4gdGhlIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hlclN1Y2Nlc3NSYXRlKGxpc3RpbmdzOiBSZWFkb25seUFycmF5PHsgc3VjY2Vzc1JhdGUzMGQ6IG51bWJlciB8IG51bGw7IHJ1bnMzMGQ6IG51bWJlciB9Pik6IG51bWJlciB8IG51bGwge1xuICBsZXQgcnVucyA9IDA7XG4gIGxldCBzdWNjZWVkZWQgPSAwO1xuICBmb3IgKGNvbnN0IGwgb2YgbGlzdGluZ3MpIHtcbiAgICBpZiAobC5zdWNjZXNzUmF0ZTMwZCA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzRmluaXRlKGwuc3VjY2Vzc1JhdGUzMGQpIHx8IGwucnVuczMwZCA8PSAwKSBjb250aW51ZTtcbiAgICBydW5zICs9IGwucnVuczMwZDtcbiAgICBzdWNjZWVkZWQgKz0gbC5zdWNjZXNzUmF0ZTMwZCAqIGwucnVuczMwZDtcbiAgfVxuICByZXR1cm4gcnVucyA9PT0gMCA/IG51bGwgOiByb3VuZDMoc3VjY2VlZGVkIC8gcnVucyk7XG59XG5cbi8qKiBEaXNwbGF5IGJhbmQgZm9yIGEgc2NvcmU6IGdvb2Qg4omlIDgwLCBmYWlyIOKJpSA1MCwgcG9vciBiZWxvdywgdW5rbm93biB3aGVuIG51bGwuICovXG5leHBvcnQgdHlwZSBIZWFsdGhCYW5kID0gJ2dvb2QnIHwgJ2ZhaXInIHwgJ3Bvb3InIHwgJ3Vua25vd24nO1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9CQU5EX0dPT0QgPSA4MDtcbmV4cG9ydCBjb25zdCBIRUFMVEhfQkFORF9GQUlSID0gNTA7XG5cbmV4cG9ydCBmdW5jdGlvbiBoZWFsdGhCYW5kKHNjb3JlOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogSGVhbHRoQmFuZCB7XG4gIGlmIChzY29yZSA9PT0gbnVsbCB8fCBzY29yZSA9PT0gdW5kZWZpbmVkIHx8ICFOdW1iZXIuaXNGaW5pdGUoc2NvcmUpKSByZXR1cm4gJ3Vua25vd24nO1xuICBpZiAoc2NvcmUgPj0gSEVBTFRIX0JBTkRfR09PRCkgcmV0dXJuICdnb29kJztcbiAgaWYgKHNjb3JlID49IEhFQUxUSF9CQU5EX0ZBSVIpIHJldHVybiAnZmFpcic7XG4gIHJldHVybiAncG9vcic7XG59XG4iXX0=
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWhlYWx0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9wbHVnaW4taGVhbHRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQVUsQ0FBQztBQUdySCwwREFBMEQ7QUFDMUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUE4QztJQUN2RSxPQUFPLEVBQUUsRUFBRTtJQUNYLEtBQUssRUFBRSxFQUFFO0lBQ1QsU0FBUyxFQUFFLEVBQUU7SUFDYixNQUFNLEVBQUUsRUFBRTtJQUNWLFNBQVMsRUFBRSxFQUFFO0lBQ2IsSUFBSSxFQUFFLEVBQUU7SUFDUixNQUFNLEVBQUUsRUFBRTtDQUNYLENBQUM7QUFFRix1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLGdFQUFnRTtBQUNoRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQ2xDLCtDQUErQztBQUMvQyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDcEMsOEZBQThGO0FBQzlGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUMzQyxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLENBQUM7QUFDNUMsb0dBQW9HO0FBQ3BHLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUM5QyxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxHQUFHLENBQUM7QUF3Qy9DLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQztBQUUxQixNQUFNLE1BQU0s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QUNELE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFJRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDbkMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBRW5DLE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBZ0M7SUFDekQsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3ZGLElBQUksS0FBSyxJQUFJLGdCQUFnQjtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzdDLElBQUksS0FBSyxJQUFJLGdCQUFnQjtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzdDLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUaGUgcGx1Z2luIEhFQUxUSCBTQ09SRSAoZG9jcy9wbHVnaW4tcHVibGlzaGluZy5tZCk6IG9uZSAw4oCTMTAwXG4gKiBudW1iZXIgcGVyIGxpc3RpbmcsIGZyb20gc2V2ZW4gY29tcG9uZW50cy4gUHVyZSBhbmQgZGVwZW5kZW5jeS1mcmVlIHNvIHRoZVxuICogcGx1Z2luIHNlcnZpY2UgKHRoZSBzdGF0cyBzd2VlcCksIHRoZSBmcm9udGVuZCAodGhlIGJyZWFrZG93biBwYW5lbCdzXG4gKiBsYWJlbHMpIGFuZCB0aGUgdGVzdHMgc2hhcmUgb25lIGRlZmluaXRpb24uXG4gKlxuICogRWFjaCBjb21wb25lbnQgc2NvcmVzIDAuLjEgYW5kIGNhcnJpZXMgYSBmaXhlZCB3ZWlnaHQuIEEgY29tcG9uZW50IHdob3NlXG4gKiBpbnB1dHMgYXJlIG1pc3NpbmcgaXMgRFJPUFBFRCBhbmQgdGhlIHJlbWFpbmluZyB3ZWlnaHRzIGFyZSByZW5vcm1hbGl6ZWQ7IHdpdGhcbiAqIGZld2VyIHRoYW4ge0BsaW5rIEhFQUxUSF9NSU5fQ09NUE9ORU5UU30gY29tcG9uZW50cyB0aGUgc2NvcmUgaXMgbnVsbCAoXCJub3RcbiAqIGVub3VnaCBkYXRhXCIpLCBuZXZlciBhIGd1ZXNzLlxuICpcbiAqIHwgY29tcG9uZW50ICB8IHdlaWdodCB8IHNjb3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCBydW50aW1lICAgIHwgMjUgICAgIHwgMzAtZGF5IHN1Y2Nlc3MgcmF0ZTsgb25seSB3aXRoIOKJpSAyMCBydW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCB2dWxucyAgICAgIHwgMjAgICAgIHwgMSDiiJIgMC41wrdjcml0aWNhbCDiiJIgMC4xwrdoaWdoIChmbG9vciAwKSwgbGF0ZXN0IGxpc3RlZCB2ZXJzaW9uOyBzY2FubmVkIG9ubHkgfFxuICogfCBmcmVzaG5lc3MgIHwgMTUgICAgIHwgcmVsZWFzZSBhZ2UgKOKJpDkwZCAxIOKGkiAwIGF0IDU0MGQpIGF2ZXJhZ2VkIHdpdGggYmFzZS1pbWFnZSBhZ2UgKOKJpDYwZCAxIOKGkiAwIGF0IDM2NWQpIHdoZW4gcmVjb3JkZWQgfFxuICogfCBzaWduZWQgICAgIHwgMTAgICAgIHwgaW1hZ2UgZGlnZXN0IHByZXNlbnQgYW5kIHNpZ25lZCDih5IgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBzbW9rZVRlc3QgIHwgMTAgICAgIHwgc21va2UgdGVzdCBkZWNsYXJlZCDih5IgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBkb2NzICAgICAgIHwgMTAgICAgIHwgUkVBRE1FIDAuNSArIGxpY2Vuc2UgMC41ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgcmF0aW5nICAgICB8IDEwICAgICB8IEJheWVzaWFuIHJhdGluZyAvIDU7IG9ubHkgd2l0aCDiiaUgMyByYXRpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqL1xuXG5leHBvcnQgY29uc3QgSEVBTFRIX0NPTVBPTkVOVFMgPSBbJ3J1bnRpbWUnLCAndnVsbnMnLCAnZnJlc2huZXNzJywgJ3NpZ25lZCcsICdzbW9rZVRlc3QnLCAnZG9jcycsICdyYXRpbmcnXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEhlYWx0aENvbXBvbmVudCA9ICh0eXBlb2YgSEVBTFRIX0NPTVBPTkVOVFMpW251bWJlcl07XG5cbi8qKiBOb21pbmFsIHdlaWdodCBvZiBlYWNoIGNvbXBvbmVudCAodGhleSBzdW0gdG8gMTAwKS4gKi9cbmV4cG9ydCBjb25zdCBIRUFMVEhfV0VJR0hUUzogUmVhZG9ubHk8UmVjb3JkPEhlYWx0aENvbXBvbmVudCwgbnVtYmVyPj4gPSB7XG4gIHJ1bnRpbWU6IDI1LFxuICB2dWxuczogMjAsXG4gIGZyZXNobmVzczogMTUsXG4gIHNpZ25lZDogMTAsXG4gIHNtb2tlVGVzdDogMTAsXG4gIGRvY3M6IDEwLFxuICByYXRpbmc6IDEwLFxufTtcblxuLyoqIEZld2VyIGF2YWlsYWJsZSBjb21wb25lbnRzIHRoYW4gdGhpcyDih5Igbm8gc2NvcmUuICovXG5leHBvcnQgY29uc3QgSEVBTFRIX01JTl9DT01QT05FTlRTID0gMztcbi8qKiBSdW5zIG5lZWRlZCBpbiB0aGUgd2luZG93IGJlZm9yZSB0aGUgc3VjY2VzcyByYXRlIGNvdW50cy4gKi9cbmV4cG9ydCBjb25zdCBIRUFMVEhfTUlOX1JVTlMgPSAyMDtcbi8qKiBSYXRpbmdzIG5lZWRlZCBiZWZvcmUgdGhlIHJhdGluZyBjb3VudHMuICovXG5leHBvcnQgY29uc3QgSEVBTFRIX01JTl9SQVRJTkdTID0gMztcbi8qKiBSZWxlYXNlIGFnZTogZnVsbCBtYXJrcyB1cCB0byB0aGlzIG1hbnkgZGF5cywgemVybyBhdCB7QGxpbmsgSEVBTFRIX1JFTEVBU0VfWkVST19EQVlTfS4gKi9cbmV4cG9ydCBjb25zdCBIRUFMVEhfUkVMRUFTRV9GVUxMX0RBWVMgPSA5MDtcbmV4cG9ydCBjb25zdCBIRUFMVEhfUkVMRUFTRV9aRVJPX0RBWVMgPSA1NDA7XG4vKiogQmFzZS1pbWFnZSBhZ2U6IGZ1bGwgbWFya3MgdXAgdG8gdGhpcyBtYW55IGRheXMsIHplcm8gYXQge0BsaW5rIEhFQUxUSF9CQVNFX0lNQUdFX1pFUk9fREFZU30uICovXG5leHBvcnQgY29uc3QgSEVBTFRIX0JBU0VfSU1BR0VfRlVMTF9EQVlTID0gNjA7XG5leHBvcnQgY29uc3QgSEVBTFRIX0JBU0VfSU1BR0VfWkVST19EQVlTID0gMzY1O1xuXG4vKiogT25lIGNvbXBvbmVudCdzIGNvbnRyaWJ1dGlvbjogaXRzIDAuLjEgc2NvcmUgKG51bGwgPSBtaXNzaW5nLCBkcm9wcGVkKSBhbmQgaXRzIG5vbWluYWwgd2VpZ2h0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDb21wb25lbnRTY29yZSB7XG4gIHNjb3JlOiBudW1iZXIgfCBudWxsO1xuICB3ZWlnaHQ6IG51bWJlcjtcbn1cbmV4cG9ydCB0eXBlIEhlYWx0aEJyZWFrZG93biA9IFJlY29yZDxIZWFsdGhDb21wb25lbnQsIEhlYWx0aENvbXBvbmVudFNjb3JlPjtcblxuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhSZXN1bHQge1xuICAvKiogMOKAkzEwMCBpbnRlZ2VyLCBvciBudWxsIHdpdGggZmV3ZXIgdGhhbiB7QGxpbmsgSEVBTFRIX01JTl9DT01QT05FTlRTfSBjb21wb25lbnRzLiAqL1xuICBzY29yZTogbnVtYmVyIHwgbnVsbDtcbiAgYnJlYWtkb3duOiBIZWFsdGhCcmVha2Rvd247XG59XG5cbi8qKlxuICogV2hhdCB0aGUgc2NvcmUgaXMgY29tcHV0ZWQgZnJvbS4gRXZlcnkgZmllbGQgaXMgb3B0aW9uYWw6IGB1bmRlZmluZWRgIC8gbnVsbFxuICogbWVhbnMgXCJub3Qga25vd25cIiwgd2hpY2ggZHJvcHMgdGhlIGNvbXBvbmVudCAob3IsIGZvciBmcmVzaG5lc3MsIHRoYXQgaGFsZikuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoSW5wdXRzIHtcbiAgLyoqIFRlcm1pbmFsIHJ1bnMgaW4gdGhlIDMwLWRheSB3aW5kb3csIGFuZCB0aGUgc2hhcmUgdGhhdCBzdWNjZWVkZWQgKDAuLjEpLiAqL1xuICBydW5zMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgc3VjY2Vzc1JhdGUzMGQ/OiBudW1iZXIgfCBudWxsO1xuICAvKiogVGhlIGxhdGVzdCBsaXN0ZWQgdmVyc2lvbidzIHNjYW47IGBzY2FubmVkQXRgIG51bGwg4oeSIG5ldmVyIHNjYW5uZWQuICovXG4gIHZ1bG5Dcml0aWNhbD86IG51bWJlciB8IG51bGw7XG4gIHZ1bG5IaWdoPzogbnVtYmVyIHwgbnVsbDtcbiAgc2Nhbm5lZEF0PzogRGF0ZSB8IHN0cmluZyB8IG51bGw7XG4gIC8qKiBXaGVuIHRoZSBsYXRlc3QgbGlzdGVkIHZlcnNpb24gd2FzIHB1Ymxpc2hlZC4gKi9cbiAgbGFzdFJlbGVhc2VBdD86IERhdGUgfCBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhlIGxhdGVzdCBsaXN0ZWQgdmVyc2lvbidzIGJhc2UgaW1hZ2UgYGNyZWF0ZWRgIHRpbWUsIHdoZW4gcmVjb3JkZWQuICovXG4gIGJhc2VJbWFnZUNyZWF0ZWRBdD86IERhdGUgfCBzdHJpbmcgfCBudWxsO1xuICAvKiogTGF0ZXN0IGxpc3RlZCB2ZXJzaW9uIGhhcyBhbiBpbWFnZSBkaWdlc3QgQU5EIGEgc2lnbmF0dXJlIChpdHMgYHB1YmxpYy8qYCBjb3B5KS4gKi9cbiAgc2lnbmVkPzogYm9vbGVhbiB8IG51bGw7XG4gIHNtb2tlVGVzdERlY2xhcmVkPzogYm9vbGVhbiB8IG51bGw7XG4gIGhhc1JlYWRtZT86IGJvb2xlYW4gfCBudWxsO1xuICBoYXNMaWNlbnNlPzogYm9vbGVhbiB8IG51bGw7XG4gIHJhdGluZ0JheWVzPzogbnVtYmVyIHwgbnVsbDtcbiAgcmF0aW5nQ291bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuXG5jb25zdCBEQVlfTVMgPSA4Nl80MDBfMDAwO1xuXG5jb25zdCByb3VuZDMgPSAobjogbnVtYmVyKTogbnVtYmVyID0+IE1hdGgucm91bmQobiAqIDEwMDApIC8gMTAwMDtcbmNvbnN0IGNsYW1wMDEgPSAobjogbnVtYmVyKTogbnVtYmVyID0+IE1hdGgubWluKDEsIE1hdGgubWF4KDAsIG4pKTtcblxuZnVuY3Rpb24gdG9UaW1lKGQ6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmIChkID09PSBudWxsIHx8IGQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHQgPSBuZXcgRGF0ZShkKS5nZXRUaW1lKCk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodCkgPyB0IDogbnVsbDtcbn1cblxuLyoqIDEgdXAgdG8gYGZ1bGxEYXlzYCwgZmFsbGluZyBsaW5lYXJseSB0byAwIGF0IGB6ZXJvRGF5c2AgKGEgZnV0dXJlIGRhdGUgY291bnRzIGFzIGZyZXNoKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZ2VTY29yZShhZ2VEYXlzOiBudW1iZXIsIGZ1bGxEYXlzOiBudW1iZXIsIHplcm9EYXlzOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoYWdlRGF5cyA8PSBmdWxsRGF5cykgcmV0dXJuIDE7XG4gIGlmIChhZ2VEYXlzID49IHplcm9EYXlzKSByZXR1cm4gMDtcbiAgcmV0dXJuIGNsYW1wMDEoMSAtIChhZ2VEYXlzIC0gZnVsbERheXMpIC8gKHplcm9EYXlzIC0gZnVsbERheXMpKTtcbn1cblxuLyoqIFRoZSB2dWxuZXJhYmlsaXR5IGNvbXBvbmVudDogMSDiiJIgMC41wrdjcml0aWNhbCDiiJIgMC4xwrdoaWdoLCBmbG9vcmVkIGF0IDAuICovXG5leHBvcnQgZnVuY3Rpb24gdnVsblNjb3JlKGNyaXRpY2FsOiBudW1iZXIsIGhpZ2g6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBjbGFtcDAxKDEgLSAwLjUgKiBNYXRoLm1heCgwLCBjcml0aWNhbCkgLSAwLjEgKiBNYXRoLm1heCgwLCBoaWdoKSk7XG59XG5cbmZ1bmN0aW9uIHJ1bnRpbWVDb21wb25lbnQoaTogSGVhbHRoSW5wdXRzKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmIChpLnJ1bnMzMGQgPT09IG51bGwgfHwgaS5ydW5zMzBkID09PSB1bmRlZmluZWQgfHwgaS5ydW5zMzBkIDwgSEVBTFRIX01JTl9SVU5TKSByZXR1cm4gbnVsbDtcbiAgaWYgKGkuc3VjY2Vzc1JhdGUzMGQgPT09IG51bGwgfHwgaS5zdWNjZXNzUmF0ZTMwZCA9PT0gdW5kZWZpbmVkIHx8ICFOdW1iZXIuaXNGaW5pdGUoaS5zdWNjZXNzUmF0ZTMwZCkpIHJldHVybiBudWxsO1xuICByZXR1cm4gY2xhbXAwMShpLnN1Y2Nlc3NSYXRlMzBkKTtcbn1cblxuZnVuY3Rpb24gdnVsbnNDb21wb25lbnQoaTogSGVhbHRoSW5wdXRzKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmICh0b1RpbWUoaS5zY2FubmVkQXQpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHZ1bG5TY29yZShpLnZ1bG5Dcml0aWNhbCA/PyAwLCBpLnZ1bG5IaWdoID8/IDApO1xufVxuXG5mdW5jdGlvbiBmcmVzaG5lc3NDb21wb25lbnQoaTogSGVhbHRoSW5wdXRzLCBub3c6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICBjb25zdCBwYXJ0czogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgcmVsZWFzZSA9IHRvVGltZShpLmxhc3RSZWxlYXNlQXQpO1xuICBpZiAocmVsZWFzZSAhPT0gbnVsbCkgcGFydHMucHVzaChhZ2VTY29yZSgobm93IC0gcmVsZWFzZSkgLyBEQVlfTVMsIEhFQUxUSF9SRUxFQVNFX0ZVTExfREFZUywgSEVBTFRIX1JFTEVBU0VfWkVST19EQVlTKSk7XG4gIGNvbnN0IGJhc2UgPSB0b1RpbWUoaS5iYXNlSW1hZ2VDcmVhdGVkQXQpO1xuICBpZiAoYmFzZSAhPT0gbnVsbCkgcGFydHMucHVzaChhZ2VTY29yZSgobm93IC0gYmFzZSkgLyBEQVlfTVMsIEhFQUxUSF9CQVNFX0lNQUdFX0ZVTExfREFZUywgSEVBTFRIX0JBU0VfSU1BR0VfWkVST19EQVlTKSk7XG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICByZXR1cm4gcGFydHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgLyBwYXJ0cy5sZW5ndGg7XG59XG5cbmNvbnN0IGZsYWcgPSAoYjogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIgfCBudWxsID0+IChiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBiID8gMSA6IDApO1xuXG5mdW5jdGlvbiBkb2NzQ29tcG9uZW50KGk6IEhlYWx0aElucHV0cyk6IG51bWJlciB8IG51bGwge1xuICBpZiAoKGkuaGFzUmVhZG1lID09PSBudWxsIHx8IGkuaGFzUmVhZG1lID09PSB1bmRlZmluZWQpICYmIChpLmhhc0xpY2Vuc2UgPT09IG51bGwgfHwgaS5oYXNMaWNlbnNlID09PSB1bmRlZmluZWQpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIChpLmhhc1JlYWRtZSA/IDAuNSA6IDApICsgKGkuaGFzTGljZW5zZSA/IDAuNSA6IDApO1xufVxuXG5mdW5jdGlvbiByYXRpbmdDb21wb25lbnQoaTogSGVhbHRoSW5wdXRzKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmIChpLnJhdGluZ0NvdW50ID09PSBudWxsIHx8IGkucmF0aW5nQ291bnQgPT09IHVuZGVmaW5lZCB8fCBpLnJhdGluZ0NvdW50IDwgSEVBTFRIX01JTl9SQVRJTkdTKSByZXR1cm4gbnVsbDtcbiAgaWYgKGkucmF0aW5nQmF5ZXMgPT09IG51bGwgfHwgaS5yYXRpbmdCYXllcyA9PT0gdW5kZWZpbmVkIHx8ICFOdW1iZXIuaXNGaW5pdGUoaS5yYXRpbmdCYXllcykpIHJldHVybiBudWxsO1xuICByZXR1cm4gY2xhbXAwMShpLnJhdGluZ0JheWVzIC8gNSk7XG59XG5cbi8qKiBUaGUgaGVhbHRoIHNjb3JlIGFuZCBpdHMgcGVyLWNvbXBvbmVudCBicmVha2Rvd24uIFB1cmU7IGBub3dgIGlzIGluamVjdGFibGUgZm9yIHRlc3RzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVIZWFsdGhTY29yZShpbnB1dHM6IEhlYWx0aElucHV0cywgbm93OiBEYXRlID0gbmV3IERhdGUoKSk6IEhlYWx0aFJlc3VsdCB7XG4gIGNvbnN0IHQgPSBub3cuZ2V0VGltZSgpO1xuICBjb25zdCByYXc6IFJlY29yZDxIZWFsdGhDb21wb25lbnQsIG51bWJlciB8IG51bGw+ID0ge1xuICAgIHJ1bnRpbWU6IHJ1bnRpbWVDb21wb25lbnQoaW5wdXRzKSxcbiAgICB2dWxuczogdnVsbnNDb21wb25lbnQoaW5wdXRzKSxcbiAgICBmcmVzaG5lc3M6IGZyZXNobmVzc0NvbXBvbmVudChpbnB1dHMsIHQpLFxuICAgIHNpZ25lZDogZmxhZyhpbnB1dHMuc2lnbmVkKSxcbiAgICBzbW9rZVRlc3Q6IGZsYWcoaW5wdXRzLnNtb2tlVGVzdERlY2xhcmVkKSxcbiAgICBkb2NzOiBkb2NzQ29tcG9uZW50KGlucHV0cyksXG4gICAgcmF0aW5nOiByYXRpbmdDb21wb25lbnQoaW5wdXRzKSxcbiAgfTtcbiAgY29uc3QgYnJlYWtkb3duID0ge30gYXMgSGVhbHRoQnJlYWtkb3duO1xuICBsZXQgd2VpZ2h0ZWQgPSAwO1xuICBsZXQgdG90YWxXZWlnaHQgPSAwO1xuICBsZXQgYXZhaWxhYmxlID0gMDtcbiAgZm9yIChjb25zdCBjIG9mIEhFQUxUSF9DT01QT05FTlRTKSB7XG4gICAgY29uc3Qgc2NvcmUgPSByYXdbY107XG4gICAgYnJlYWtkb3duW2NdID0geyBzY29yZTogc2NvcmUgPT09IG51bGwgPyBudWxsIDogcm91bmQzKHNjb3JlKSwgd2VpZ2h0OiBIRUFMVEhfV0VJR0hUU1tjXSB9O1xuICAgIGlmIChzY29yZSA9PT0gbnVsbCkgY29udGludWU7XG4gICAgYXZhaWxhYmxlKys7XG4gICAgd2VpZ2h0ZWQgKz0gc2NvcmUgKiBIRUFMVEhfV0VJR0hUU1tjXTtcbiAgICB0b3RhbFdlaWdodCArPSBIRUFMVEhfV0VJR0hUU1tjXTtcbiAgfVxuICBjb25zdCBzY29yZSA9IGF2YWlsYWJsZSA8IEhFQUxUSF9NSU5fQ09NUE9ORU5UUyB8fCB0b3RhbFdlaWdodCA9PT0gMCA/IG51bGwgOiBNYXRoLnJvdW5kKCgxMDAgKiB3ZWlnaHRlZCkgLyB0b3RhbFdlaWdodCk7XG4gIHJldHVybiB7IHNjb3JlLCBicmVha2Rvd24gfTtcbn1cblxuLyoqXG4gKiBBIHB1Ymxpc2hlcidzIGhlYWx0aDogdGhlIGluc3RhbGwtd2VpZ2h0ZWQgbWVhbiBvZiBpdHMgbGlzdGluZ3MnIHNjb3Jlc1xuICogKGxpc3RpbmdzIHdpdGggbm8gc2NvcmUgYXJlIHNraXBwZWQ7IHdoZW4gbm8gbGlzdGluZyBoYXMgaW5zdGFsbHMsIHRoZSBwbGFpblxuICogbWVhbikuIE51bGwgd2hlbiBubyBsaXN0aW5nIGhhcyBhIHNjb3JlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaGVySGVhbHRoU2NvcmUobGlzdGluZ3M6IFJlYWRvbmx5QXJyYXk8eyBoZWFsdGhTY29yZTogbnVtYmVyIHwgbnVsbDsgaW5zdGFsbENvdW50OiBudW1iZXIgfT4pOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3Qgc2NvcmVkID0gbGlzdGluZ3MuZmlsdGVyKChsKTogbCBpcyB7IGhlYWx0aFNjb3JlOiBudW1iZXI7IGluc3RhbGxDb3VudDogbnVtYmVyIH0gPT5cbiAgICBsLmhlYWx0aFNjb3JlICE9PSBudWxsICYmIE51bWJlci5pc0Zpbml0ZShsLmhlYWx0aFNjb3JlKSk7XG4gIGlmIChzY29yZWQubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3Qgd2VpZ2h0T2YgPSAobjogbnVtYmVyKSA9PiBNYXRoLm1heCgwLCBuKTtcbiAgY29uc3QgdG90YWxJbnN0YWxscyA9IHNjb3JlZC5yZWR1Y2UoKGEsIGwpID0+IGEgKyB3ZWlnaHRPZihsLmluc3RhbGxDb3VudCksIDApO1xuICBpZiAodG90YWxJbnN0YWxscyA9PT0gMCkgcmV0dXJuIE1hdGgucm91bmQoc2NvcmVkLnJlZHVjZSgoYSwgbCkgPT4gYSArIGwuaGVhbHRoU2NvcmUsIDApIC8gc2NvcmVkLmxlbmd0aCk7XG4gIHJldHVybiBNYXRoLnJvdW5kKHNjb3JlZC5yZWR1Y2UoKGEsIGwpID0+IGEgKyBsLmhlYWx0aFNjb3JlICogd2VpZ2h0T2YobC5pbnN0YWxsQ291bnQpLCAwKSAvIHRvdGFsSW5zdGFsbHMpO1xufVxuXG4vKipcbiAqIEEgcHVibGlzaGVyJ3MgMzAtZGF5IHN1Y2Nlc3MgcmF0ZSBhY3Jvc3MgaXRzIGxpc3RpbmdzLCB3ZWlnaHRlZCBieSBydW5zLlxuICogTnVsbCB3aGVuIG5vbmUgb2YgaXRzIGxpc3RpbmdzIHJhbiBpbiB0aGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaGVyU3VjY2Vzc1JhdGUobGlzdGluZ3M6IFJlYWRvbmx5QXJyYXk8eyBzdWNjZXNzUmF0ZTMwZDogbnVtYmVyIHwgbnVsbDsgcnVuczMwZDogbnVtYmVyIH0+KTogbnVtYmVyIHwgbnVsbCB7XG4gIGxldCBydW5zID0gMDtcbiAgbGV0IHN1Y2NlZWRlZCA9IDA7XG4gIGZvciAoY29uc3QgbCBvZiBsaXN0aW5ncykge1xuICAgIGlmIChsLnN1Y2Nlc3NSYXRlMzBkID09PSBudWxsIHx8ICFOdW1iZXIuaXNGaW5pdGUobC5zdWNjZXNzUmF0ZTMwZCkgfHwgbC5ydW5zMzBkIDw9IDApIGNvbnRpbnVlO1xuICAgIHJ1bnMgKz0gbC5ydW5zMzBkO1xuICAgIHN1Y2NlZWRlZCArPSBsLnN1Y2Nlc3NSYXRlMzBkICogbC5ydW5zMzBkO1xuICB9XG4gIHJldHVybiBydW5zID09PSAwID8gbnVsbCA6IHJvdW5kMyhzdWNjZWVkZWQgLyBydW5zKTtcbn1cblxuLyoqIERpc3BsYXkgYmFuZCBmb3IgYSBzY29yZTogZ29vZCDiiaUgODAsIGZhaXIg4omlIDUwLCBwb29yIGJlbG93LCB1bmtub3duIHdoZW4gbnVsbC4gKi9cbmV4cG9ydCB0eXBlIEhlYWx0aEJhbmQgPSAnZ29vZCcgfCAnZmFpcicgfCAncG9vcicgfCAndW5rbm93bic7XG5leHBvcnQgY29uc3QgSEVBTFRIX0JBTkRfR09PRCA9IDgwO1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9CQU5EX0ZBSVIgPSA1MDtcblxuZXhwb3J0IGZ1bmN0aW9uIGhlYWx0aEJhbmQoc2NvcmU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBIZWFsdGhCYW5kIHtcbiAgaWYgKHNjb3JlID09PSBudWxsIHx8IHNjb3JlID09PSB1bmRlZmluZWQgfHwgIU51bWJlci5pc0Zpbml0ZShzY29yZSkpIHJldHVybiAndW5rbm93bic7XG4gIGlmIChzY29yZSA+PSBIRUFMVEhfQkFORF9HT09EKSByZXR1cm4gJ2dvb2QnO1xuICBpZiAoc2NvcmUgPj0gSEVBTFRIX0JBTkRfRkFJUikgcmV0dXJuICdmYWlyJztcbiAgcmV0dXJuICdwb29yJztcbn1cbiJdfQ==
@@ -7,25 +7,50 @@ export interface PluginScanFinding {
7
7
  packageVersion: string;
8
8
  /** Versions that fix it; empty = no fix available (not fixable). */
9
9
  fixedIn: string[];
10
+ /**
11
+ * CISA lists it as KNOWN EXPLOITED (grype's `knownExploited`). Absent =
12
+ * not listed. A KEV Critical is gated even when unfixable, and only an
13
+ * ADVISORY-ID waiver can exempt it — see {@link applyVulnWaivers}.
14
+ */
15
+ kev?: boolean;
16
+ /**
17
+ * EPSS probability (0–1) that it is exploited in the next 30 days, as grype
18
+ * reports it; absent when the DB carries no score. Context for a reader
19
+ * ranking findings, never a gate input — a probability is not a verdict.
20
+ */
21
+ epss?: number;
10
22
  }
11
23
  /**
12
- * `scan_flag` on a version the nightly rescan flagged: its fixable
13
- * Critical/High counts at that rescan and the top fixable findings. Set while
14
- * fixable Criticals exceed `PLUGIN_VULN_MAX_CRITICAL`, cleared when a rescan
15
- * finds them resolved.
24
+ * `scan_flag` on a version the nightly rescan flagged: its GATED Critical
25
+ * count and fixable High count at that rescan, and the top gated findings. Set
26
+ * while gated findings exceed `PLUGIN_VULN_MAX_FINDINGS`, cleared when a
27
+ * rescan finds them resolved.
16
28
  */
17
29
  export interface PluginScanFlag {
18
- /** Fixable Critical findings. */
19
- critical: number;
30
+ /**
31
+ * Gated findings — at or above `failOn` (default Critical): fixable ones,
32
+ * plus unfixable KEV-listed ones under `PLUGIN_VULN_GATE_KEV`.
33
+ */
34
+ gated: number;
35
+ /** Of `gated`, the KEV-listed ones (CISA known exploited). Absent = none. */
36
+ kev?: number;
20
37
  /** Fixable High findings. */
21
38
  high: number;
22
- /** The floor it was compared against (`PLUGIN_VULN_MAX_CRITICAL`). */
23
- maxCritical: number;
39
+ /** The floor it was compared against (`PLUGIN_VULN_MAX_FINDINGS`). */
40
+ maxFindings: number;
41
+ /**
42
+ * The `PLUGIN_VULN_FAIL_ON` it was gated at, when that was `high` (then
43
+ * `gated` counts Critical AND High findings). Absent = `critical`.
44
+ * Carried on the flag because the services that RENDER it (the resolver,
45
+ * the dashboard) do not share the plugin service's environment.
46
+ */
47
+ failOn?: 'high';
24
48
  /** At most {@link SCAN_FLAG_TOP_FINDINGS} fixable findings, Criticals first. */
25
49
  findings: PluginScanFinding[];
26
50
  }
27
51
  /**
28
- * `scan_summary` on every in-use version: the LAST rescan's findings, written
52
+ * `scan_summary` on every scanned version: the LATEST scan's findings — written
53
+ * by the build that established the version and rewritten by every rescan —
29
54
  * whether or not the gate tripped.
30
55
  *
31
56
  * Distinct from {@link PluginScanFlag}, which exists only while a version is over
@@ -33,37 +58,137 @@ export interface PluginScanFlag {
33
58
  * report whose job is to show Critical AND High exposure had no source to read.
34
59
  * What a report SHOWS and what a build REFUSES are different questions, and
35
60
  * conflating them meant the answer to the first was "nothing".
61
+ *
62
+ * It is also the rescan's BASELINE. "Is anything new?" is answered by diffing
63
+ * finding identities against the previous summary ({@link newScanFindings}),
64
+ * not by comparing counts: one CVE fixed and a different one published leaves
65
+ * the count unchanged and hides a brand-new Critical.
66
+ *
67
+ * CONTRACT — read by the reporting / exposure code in pipeline-data. Fields are
68
+ * only ever added; every field below is present on every summary written.
36
69
  */
37
70
  export interface PluginScanSummary {
38
- /** Fixable Critical findings at the last rescan. */
71
+ /** Fixable Critical findings. */
39
72
  criticalFixable: number;
40
- /** Fixable High findings at the last rescan. */
73
+ /** Fixable High findings. */
41
74
  highFixable: number;
42
- /** Totals including unfixable findings, for context. */
75
+ /** Totals including unfixable findings. */
43
76
  critical: number;
44
77
  high: number;
45
- /** At most {@link SCAN_FLAG_TOP_FINDINGS} findings, Criticals first. */
78
+ medium: number;
79
+ low: number;
80
+ /** KEV-listed (CISA known exploited) Critical + High findings. */
81
+ kev: number;
82
+ /**
83
+ * EVERY Critical and High finding — fixable AND unfixable — Criticals first,
84
+ * capped at {@link SCAN_SUMMARY_MAX_FINDINGS}. `truncated` says whether the
85
+ * cap cut it; the counts above are never capped.
86
+ */
46
87
  findings: PluginScanFinding[];
47
- /** When the rescan that produced this ran (ISO). */
88
+ truncated: boolean;
89
+ /**
90
+ * Keys ({@link scanFindingKey}) of the findings a `PLUGIN_VULN_WAIVERS` entry
91
+ * exempted from the floor at this scan. They are still in `findings` — a
92
+ * waiver changes the verdict, not what the image contains.
93
+ */
94
+ waived: string[];
95
+ /** When this scan ran (ISO). */
48
96
  scannedAt: string;
97
+ /** Which path wrote it. */
98
+ trigger: 'build' | 'rescan' | 'promote';
49
99
  /** The image this describes. A version rebuilt on a patched base is a
50
100
  * different artifact, so a summary without its digest cannot be trusted. */
51
- imageDigest?: string;
101
+ imageDigest: string;
102
+ /**
103
+ * When the vulnerability DB the scan matched against was BUILT (ISO), or null
104
+ * when it could not be read. A scan is only as current as its DB: a clean
105
+ * result from a week-old DB says nothing about this week's CVEs.
106
+ */
107
+ dbBuiltAt: string | null;
108
+ /**
109
+ * Executables in the image that NO SBOM package accounts for — UPX-packed or
110
+ * stripped Go, Haskell, GraalVM native images, Node SEA bundles, vendored
111
+ * browsers. The scanner cannot see inside them, so their CVEs are invisible to
112
+ * every count above. Paths, sorted, capped at {@link SCAN_SUMMARY_MAX_BINARIES}.
113
+ * Informational: never a gate.
114
+ */
115
+ uncataloguedBinaries: string[];
52
116
  }
117
+ /** Findings a summary itemizes. Counts are never capped; this bounds the jsonb. */
118
+ export declare const SCAN_SUMMARY_MAX_FINDINGS = 500;
119
+ /** Uncatalogued binaries a summary lists. */
120
+ export declare const SCAN_SUMMARY_MAX_BINARIES = 200;
121
+ /**
122
+ * A finding's identity: the advisory in a specific package version. The same
123
+ * CVE in two packages is two findings; the same CVE reported again after a
124
+ * rescan is the same one.
125
+ */
126
+ export declare function scanFindingKey(f: Pick<PluginScanFinding, 'id' | 'packageName' | 'packageVersion'>): string;
127
+ /**
128
+ * The Critical/High findings in `after` that the previous summary did not
129
+ * carry — what N31 and an advisory draft are about.
130
+ *
131
+ * No previous summary means no baseline: every finding is new. A TRUNCATED
132
+ * baseline knows only its first {@link SCAN_SUMMARY_MAX_FINDINGS} findings
133
+ * (Criticals first), so a finding missing from it is new only if the baseline
134
+ * provably listed every finding of that severity — otherwise it may simply have
135
+ * been cut, and reporting it as new would be a false alarm on every pass.
136
+ */
137
+ export declare function newScanFindings(before: Pick<PluginScanSummary, 'findings' | 'truncated' | 'critical'> | null | undefined, after: readonly PluginScanFinding[]): PluginScanFinding[];
53
138
  /** Findings a flag / gate message carries. */
54
139
  export declare const SCAN_FLAG_TOP_FINDINGS = 10;
55
140
  /** Lookup / resolution warning code for a flagged version. */
56
141
  export declare const VULN_FLAGGED_WARNING = "VULN_FLAGGED";
57
142
  /**
58
- * `PLUGIN_VULN_MAX_CRITICAL`: the platform floor — a version with MORE fixable
59
- * Critical findings than this fails its build (`PLUGIN_VULN_GATE`) and is
143
+ * `PLUGIN_VULN_MAX_FINDINGS`: the platform floor — a version with MORE gated
144
+ * findings (fixable, or KEV-listed, at or above `PLUGIN_VULN_FAIL_ON`) than
145
+ * this fails its build (`PLUGIN_VULN_GATE`) and is
60
146
  * flagged by the rescan. Default `0`; `-1` disables the floor (and the flag).
61
147
  */
62
- export declare function pluginVulnMaxCritical(): number;
148
+ export declare function pluginVulnMaxFindings(): number;
149
+ /**
150
+ * The lowest severity the floor gates on — the plugin service's `--fail-on`.
151
+ * Only `critical` and `high` are possible: those are the severities a scan
152
+ * itemizes (Medium/Low are counted, never listed), and a floor can only gate on
153
+ * findings it can name, waive and report.
154
+ */
155
+ export type PluginVulnFailOn = 'critical' | 'high';
156
+ /**
157
+ * `PLUGIN_VULN_FAIL_ON` (default `critical`): the severity at and above which a
158
+ * fixable (or KEV-listed) finding counts against `PLUGIN_VULN_MAX_FINDINGS`.
159
+ * `high` gates Critical AND High. Any other value resolves to `high`, the
160
+ * STRICTER setting: the failure mode of a typo must be "the gate blocks more",
161
+ * never "the gate blocks less".
162
+ */
163
+ export declare function pluginVulnFailOn(): PluginVulnFailOn;
164
+ /** Whether a severity is at or above the gating threshold. */
165
+ export declare function atOrAboveFailOn(severity: PluginScanFinding['severity'], failOn?: PluginVulnFailOn): boolean;
166
+ /**
167
+ * The scanner's fixable count at or above the threshold — what the floor reads
168
+ * when a scan recorded counts but no findings to derive it from.
169
+ */
170
+ export declare function gatedFixableCount(counts: {
171
+ vulnCriticalFixable: number | null;
172
+ vulnHighFixable: number | null;
173
+ }, failOn?: PluginVulnFailOn): number;
174
+ /** `Critical` / `Critical or High` — the gated severities, for messages. */
175
+ export declare function failOnLabel(failOn?: PluginVulnFailOn): string;
176
+ /**
177
+ * `PLUGIN_VULN_GATE_KEV` (default true): a Critical CISA lists as known
178
+ * exploited counts against the floor even when it has NO fix. Off, KEV findings
179
+ * are gated exactly like any other Critical (fixable only).
180
+ */
181
+ export declare function pluginVulnGateKev(): boolean;
182
+ /**
183
+ * Whether a finding counts against the floor: a fixable finding at or above
184
+ * `PLUGIN_VULN_FAIL_ON` (default Critical), or — under `PLUGIN_VULN_GATE_KEV`
185
+ * — a KEV-listed one at or above it with or without a fix.
186
+ */
187
+ export declare function isGatedFinding(f: Pick<PluginScanFinding, 'severity' | 'fixedIn' | 'kev'>, kevGate?: boolean, failOn?: PluginVulnFailOn): boolean;
63
188
  /**
64
189
  * A scoped, EXPIRING exemption from the vulnerability floor for one plugin.
65
190
  *
66
- * `PLUGIN_VULN_MAX_CRITICAL` is the only other lever and it is far too blunt:
191
+ * `PLUGIN_VULN_MAX_FINDINGS` is the only other lever and it is far too blunt:
67
192
  * raising it above 0 exempts every plugin from every Critical. Some images
68
193
  * genuinely cannot reach zero — a browser-bundling test runner (artillery ships
69
194
  * Chromium through its own @playwright/browser-chromium dependency, playwright
@@ -75,9 +200,10 @@ export declare function pluginVulnMaxCritical(): number;
75
200
  * Three properties make this an exemption rather than a hole, and all three are
76
201
  * enforced below rather than documented and hoped for:
77
202
  *
78
- * SCOPED to one plugin, to named packages, AND to the system org. A new
79
- * Critical in any other package still fails the gate, so a waiver
80
- * cannot grow silently into "this plugin is exempt". The org bound
203
+ * SCOPED to one plugin (or, fleet-wide, to named advisories only), to
204
+ * named packages/advisories, AND to the system org. A new Critical
205
+ * in anything not named still fails the gate, so a waiver cannot
206
+ * grow silently into "this plugin is exempt". The org bound
81
207
  * matters because plugin names are unique per (name, version,
82
208
  * orgId) and NOT globally: without it, any tenant could inherit an
83
209
  * exemption by naming their plugin `artillery`.
@@ -88,15 +214,27 @@ export declare function pluginVulnMaxCritical(): number;
88
214
  * metric, the audit record and the build message instead of
89
215
  * vanishing from the count.
90
216
  *
91
- * Format — entries `;`-separated, fields `:`-separated, packages `,`-separated:
217
+ * Format — entries `;`-separated, fields `:`-separated, targets `,`-separated.
218
+ * A target is a package name (`chromium`) or an advisory id (`GO-2026-6612`),
219
+ * matched against the finding's package or id respectively:
92
220
  *
93
221
  * PLUGIN_VULN_WAIVERS=artillery:2026-12-31:chromium,chrome;playwright:2026-12-31:firefox
94
222
  *
223
+ * FLEET-WIDE (`*` as the plugin) is for one advisory that every bundler of a
224
+ * toolchain inherits — a Go stdlib CVE reaches every prebuilt Go binary at once,
225
+ * and listing each plugin hides that it is one decision. It may name ADVISORY
226
+ * IDS ONLY: `*:2026-12-31:stdlib` would waive every present and future stdlib
227
+ * Critical in every plugin, including ones a rebuild could clear, so a package
228
+ * name under `*` is rejected. `*` takes no `@version` (versions are per plugin)
229
+ * and keeps the system-org bound and the expiry:
230
+ *
231
+ * PLUGIN_VULN_WAIVERS=*:2026-12-31:GO-2026-6612,GO-2026-6604
232
+ *
95
233
  * A malformed entry is DROPPED, never treated as a wildcard: the failure mode
96
234
  * of a typo must be "the gate still blocks", not "everything is waived".
97
235
  */
98
236
  export interface VulnWaiver {
99
- /** Plugin name the waiver applies to (exact match). */
237
+ /** Plugin name the waiver applies to (exact match), or {@link WAIVE_ALL_PLUGINS}. */
100
238
  plugin: string;
101
239
  /**
102
240
  * Plugin version the waiver is limited to, or null for every version.
@@ -109,9 +247,14 @@ export interface VulnWaiver {
109
247
  version: string | null;
110
248
  /** Inclusive expiry (UTC date). After it the entry has no effect. */
111
249
  expires: Date;
112
- /** Package names whose findings are exempt. Never empty — see parseVulnWaivers. */
250
+ /**
251
+ * Package names and/or advisory ids whose findings are exempt. Never empty —
252
+ * see parseVulnWaivers. Advisory ids only when `plugin` is `*`.
253
+ */
113
254
  packages: string[];
114
255
  }
256
+ /** The `plugin` of a fleet-wide waiver. Advisory ids only — see VulnWaiver. */
257
+ export declare const WAIVE_ALL_PLUGINS = "*";
115
258
  /** A dropped entry and why, so the operator can be told instead of guessing. */
116
259
  export interface VulnWaiverProblem {
117
260
  entry: string;
@@ -142,37 +285,46 @@ export interface WaiverOutcome {
142
285
  counted: PluginScanFinding[];
143
286
  /** Findings an unexpired waiver exempted (empty when none applied). */
144
287
  waived: PluginScanFinding[];
288
+ /** The entries that exempted at least one finding — what "this waiver is still doing something" is measured by. */
289
+ matched: VulnWaiver[];
145
290
  }
291
+ /** One waiver entry's identity: the plugin it names (with its pin) and its targets. */
292
+ export declare function vulnWaiverLabels(w: Pick<VulnWaiver, 'plugin' | 'version' | 'packages'>): {
293
+ plugin: string;
294
+ targets: string;
295
+ };
146
296
  /**
147
297
  * Split findings into what still counts and what an unexpired waiver exempts.
148
298
  *
149
- * Matching is on the package name a waiver names, case-insensitively, and only
150
- * for findings that are FIXABLE — an unfixable finding never counted toward the
151
- * floor, so "waiving" it would overstate what the waiver does.
299
+ * Matching is on the package name or advisory id a waiver names,
300
+ * case-insensitively, and only for findings that are GATED
301
+ * ({@link isGatedFinding}) — an ungated finding never counted toward the floor,
302
+ * so "waiving" it would overstate what the waiver does.
303
+ *
304
+ * A KEV-listed finding is exempted by an ADVISORY-ID target only, never by a
305
+ * package name. `artillery:…:chromium` is a judgement about Chromium's ordinary
306
+ * churn; it was not written about, and must not silently cover, the one
307
+ * Chromium CVE that is being exploited today. Naming that CVE is the deliberate
308
+ * act an exemption for it requires.
152
309
  */
153
310
  export declare function applyVulnWaivers(pluginName: string, findings: readonly PluginScanFinding[], waivers?: readonly VulnWaiver[], now?: Date, orgId?: string, pluginVersion?: string): WaiverOutcome;
154
- /** Whether `fixableCritical` breaks the platform floor (never, when disabled). */
155
- export declare function exceedsVulnFloor(fixableCritical: number | null | undefined, max?: number): boolean;
156
- /**
157
- * `PLUGIN_BLOCK_ON_NEW_CRITICAL` (default false): resolution SKIPS flagged
158
- * versions for ranges and the default (falling back to the newest unflagged
159
- * one), and an exact pin to a flagged version is refused 409
160
- * `PLUGIN_VERSION_VULN_BLOCKED`. Off: flagged versions resolve with a
161
- * `VULN_FLAGGED` warning.
162
- */
163
- export declare function blockOnNewCritical(): boolean;
311
+ /** Whether `gatedCritical` breaks the platform floor (never, when disabled). */
312
+ export declare function exceedsVulnFloor(gated: number | null | undefined, max?: number): boolean;
164
313
  /** `pkg@1.2.3 → 1.2.4` / `pkg@1.2.3 (no fix)`. */
165
314
  export declare function describeFix(f: Pick<PluginScanFinding, 'packageName' | 'packageVersion' | 'fixedIn'>): string;
166
315
  /** `CVE-1 (openssl@3.0.1 → 3.0.2); CVE-2 (…)` for the first `limit` findings. */
167
316
  export declare function describeFindings(findings: readonly PluginScanFinding[], limit?: number): string;
168
317
  /** The warning text for a flagged version: `x@v has N fixable Critical findings — rebuild or upgrade`. */
169
- export declare function vulnFlaggedMessage(ref: string, flag: Pick<PluginScanFlag, 'critical'>): string;
318
+ export declare function vulnFlaggedMessage(ref: string, flag: Pick<PluginScanFlag, 'gated' | 'kev' | 'failOn'>): string;
170
319
  /** A `VULN_FLAGGED` lookup warning (the lookup envelope's `warnings[]` entry). */
171
320
  export interface VulnFlaggedWarning {
172
321
  code: typeof VULN_FLAGGED_WARNING;
322
+ /** `critical` when a gated finding is on CISA KEV, else `error` (a flag never refuses anything). */
323
+ severity: 'error' | 'critical';
173
324
  plugin: string;
174
325
  version: string;
175
- critical: number;
326
+ /** The flag's gated count (see {@link PluginScanFlag.gated}). */
327
+ gated: number;
176
328
  high: number;
177
329
  message: string;
178
330
  /** Top fixable findings with their fixed versions. */
@@ -180,7 +332,5 @@ export interface VulnFlaggedWarning {
180
332
  }
181
333
  /** Build the `VULN_FLAGGED` warning for `plugin@version`. */
182
334
  export declare function vulnFlaggedWarning(plugin: string, version: string, flag: PluginScanFlag): VulnFlaggedWarning;
183
- /** The 409 message for an exact pin to a flagged version while blocking. */
184
- export declare function vulnBlockedMessage(plugin: string, version: string, flag: PluginScanFlag): string;
185
335
  /** Narrow an unknown `scan_flag` jsonb value. */
186
336
  export declare function asScanFlag(value: unknown): PluginScanFlag | null;