@pipeline-builder/api-core 5.2.6 → 5.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/constants/ai-providers.js +1 -1
- package/lib/constants/http-status.js +1 -1
- package/lib/constants/index.js +1 -1
- package/lib/constants/time.js +1 -1
- package/lib/errors/app-errors.js +1 -1
- package/lib/errors/index.js +1 -1
- package/lib/helpers/access-helpers.d.ts +19 -0
- package/lib/helpers/access-helpers.js +24 -4
- package/lib/helpers/content-disposition.js +1 -1
- package/lib/helpers/crud-helpers.js +1 -1
- package/lib/helpers/index.d.ts +1 -1
- package/lib/helpers/index.js +2 -2
- package/lib/helpers/org-hierarchy-http.js +1 -1
- package/lib/helpers/org-hierarchy.js +1 -1
- package/lib/helpers/restore-helpers.js +1 -1
- package/lib/helpers/sse-helpers.js +13 -2
- package/lib/helpers/support-calendar.js +1 -1
- package/lib/index.js +1 -1
- package/lib/middleware/ask-provenance.js +1 -1
- package/lib/middleware/assurance.js +1 -1
- package/lib/middleware/auth.js +1 -1
- package/lib/middleware/deferred-quota-check.js +1 -1
- package/lib/middleware/ecosystem-guard.js +1 -1
- package/lib/middleware/index.js +1 -1
- package/lib/middleware/jwt-verify.js +1 -1
- package/lib/middleware/mongo-sanitize.js +1 -1
- package/lib/middleware/on-behalf.js +1 -1
- package/lib/middleware/permission-gates.js +1 -1
- package/lib/middleware/quota-exempt-routes.js +1 -1
- package/lib/middleware/revocation.js +1 -1
- package/lib/middleware/route-table.js +16 -1
- package/lib/middleware/service-tokens.js +1 -1
- package/lib/middleware/step-up.js +1 -1
- package/lib/middleware/system-org.d.ts +18 -5
- package/lib/middleware/system-org.js +19 -6
- package/lib/openapi/extend-zod.js +1 -1
- package/lib/openapi/index.js +1 -1
- package/lib/openapi/registry.js +1 -1
- package/lib/openapi/routes/ask-routes.js +1 -1
- package/lib/openapi/routes/billing-routes.js +1 -1
- package/lib/openapi/routes/image-registry-routes.js +1 -1
- package/lib/openapi/routes/index.js +1 -1
- package/lib/openapi/routes/message-routes.js +1 -1
- package/lib/openapi/routes/pipeline-routes.js +1 -1
- package/lib/openapi/routes/pipeline-template-routes.js +1 -1
- package/lib/openapi/routes/plugin-routes.js +1 -1
- package/lib/openapi/routes/quota-routes.js +1 -1
- package/lib/openapi/schema-registry.js +1 -1
- package/lib/routes/health.js +1 -1
- package/lib/routes/index.js +1 -1
- package/lib/services/ai-call-weight.js +1 -1
- package/lib/services/alert-delivery.js +1 -1
- package/lib/services/api-key-exchange.js +1 -1
- package/lib/services/audit-context.js +1 -1
- package/lib/services/audit-spool.js +1 -1
- package/lib/services/cache-service.js +1 -1
- package/lib/services/circuit-breaker.js +1 -1
- package/lib/services/compliance-client.js +1 -1
- package/lib/services/compliance-event-subscriber.js +1 -1
- package/lib/services/durable-event-bus.js +1 -1
- package/lib/services/ecosystem-notify-client.d.ts +7 -1
- package/lib/services/ecosystem-notify-client.js +9 -3
- package/lib/services/entity-events.js +1 -1
- package/lib/services/env-redis.js +1 -1
- package/lib/services/http-client.js +19 -3
- package/lib/services/index.d.ts +1 -1
- package/lib/services/index.js +2 -2
- package/lib/services/jwks-cache.js +1 -1
- package/lib/services/leader-lock.js +1 -1
- package/lib/services/notification-channels.js +1 -1
- package/lib/services/org-ai-client.js +1 -1
- package/lib/services/pagerduty-inbound.js +1 -1
- package/lib/services/pagerduty.js +1 -1
- package/lib/services/quota-increment-batcher.js +1 -1
- package/lib/services/quota.js +1 -1
- package/lib/services/remote-audit-client.js +1 -1
- package/lib/services/retry-forever.js +1 -1
- package/lib/services/retry-strategy.js +1 -1
- package/lib/services/s3-client.js +1 -1
- package/lib/services/scheduler.js +1 -1
- package/lib/services/service-boot.js +1 -1
- package/lib/services/service-keys.js +2 -2
- package/lib/services/sse-ticket-store.js +1 -1
- package/lib/services/system-notification.js +1 -1
- package/lib/services/token-revocation.js +1 -1
- package/lib/services/version-vuln-policy.d.ts +11 -0
- package/lib/services/version-vuln-policy.js +33 -7
- package/lib/types/ai-catalog.js +1 -1
- package/lib/types/ask-proposals.d.ts +23 -0
- package/lib/types/ask-proposals.js +29 -1
- package/lib/types/audit-events.js +1 -1
- package/lib/types/build-catalog.d.ts +65 -0
- package/lib/types/build-catalog.js +95 -1
- package/lib/types/catalog-metadata.js +1 -1
- package/lib/types/common.js +1 -1
- package/lib/types/compliance-exemption.js +1 -1
- package/lib/types/ecosystem-notifications.d.ts +9 -0
- package/lib/types/ecosystem-notifications.js +15 -6
- package/lib/types/ecosystem.d.ts +1 -6
- package/lib/types/ecosystem.js +18 -5
- package/lib/types/error-codes.js +1 -1
- package/lib/types/feature-flags.d.ts +17 -1
- package/lib/types/feature-flags.js +1 -1
- package/lib/types/http.js +1 -1
- package/lib/types/index.d.ts +3 -3
- package/lib/types/index.js +4 -4
- package/lib/types/metadata-keys.js +1 -1
- package/lib/types/permissions.d.ts +60 -13
- package/lib/types/permissions.js +63 -14
- package/lib/types/pipeline-template.js +1 -1
- package/lib/types/pipeline.js +1 -1
- package/lib/types/plugin-catalog.js +1 -1
- package/lib/types/plugin-health.js +1 -1
- package/lib/types/plugin-scan.d.ts +69 -0
- package/lib/types/plugin-scan.js +77 -1
- package/lib/types/quota-catalog.js +15 -2
- package/lib/types/quota-tiers.d.ts +27 -160
- package/lib/types/quota-tiers.js +47 -255
- package/lib/types/remote-audit-actions.d.ts +1 -1
- package/lib/types/remote-audit-actions.js +9 -1
- package/lib/types/reserved-tags.js +1 -1
- package/lib/types/tier-limits.d.ts +210 -0
- package/lib/types/tier-limits.js +254 -0
- package/lib/types/usage-projection.js +1 -1
- package/lib/types/visibility.js +1 -1
- package/lib/types/wire-vocabulary.d.ts +7 -0
- package/lib/types/wire-vocabulary.js +7 -1
- package/lib/utils/alias-resolver.js +1 -1
- package/lib/utils/api-key.js +1 -1
- package/lib/utils/audit.js +1 -1
- package/lib/utils/aws-scrub.js +1 -1
- package/lib/utils/compliance-attributes.js +1 -1
- package/lib/utils/concurrency-gate.d.ts +98 -0
- package/lib/utils/concurrency-gate.js +110 -0
- package/lib/utils/concurrency.js +1 -1
- package/lib/utils/crash-handlers.js +1 -1
- package/lib/utils/date.js +1 -1
- package/lib/utils/dsse.js +1 -1
- package/lib/utils/env.d.ts +11 -0
- package/lib/utils/env.js +14 -1
- package/lib/utils/headers.js +1 -1
- package/lib/utils/identity.js +1 -1
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.js +2 -1
- package/lib/utils/jwk.js +2 -2
- package/lib/utils/logger.js +1 -1
- package/lib/utils/metric-emitter.js +1 -1
- package/lib/utils/object.js +1 -1
- package/lib/utils/params.js +1 -1
- package/lib/utils/plugin-compliance.d.ts +9 -1
- package/lib/utils/plugin-compliance.js +1 -1
- package/lib/utils/proof-of-work.js +1 -1
- package/lib/utils/response.js +1 -1
- package/lib/utils/retention.js +1 -1
- package/lib/utils/safe-require.js +1 -1
- package/lib/utils/secret-encryption.js +1 -1
- package/lib/utils/secret-rotation.js +1 -1
- package/lib/utils/secure-compare.js +1 -1
- package/lib/utils/sensitive-patterns.js +1 -1
- package/lib/utils/service-registry.js +1 -1
- package/lib/utils/ssrf.js +1 -1
- package/lib/validation/ai-schemas.js +1 -1
- package/lib/validation/common-schemas.js +1 -1
- package/lib/validation/dockerfile-static.js +1 -1
- package/lib/validation/index.d.ts +1 -1
- package/lib/validation/index.js +2 -2
- package/lib/validation/message-schemas.d.ts +73 -0
- package/lib/validation/message-schemas.js +63 -2
- package/lib/validation/middleware.js +1 -1
- package/lib/validation/pipeline-schemas.js +1 -1
- package/lib/validation/pipeline-template-schemas.js +1 -1
- package/lib/validation/plugin-base-images.js +1 -1
- package/lib/validation/plugin-catalog-detect.js +1 -1
- package/lib/validation/plugin-catalog-metadata.js +1 -1
- package/lib/validation/plugin-heuristics.js +1 -1
- package/lib/validation/plugin-lint.js +1 -1
- package/lib/validation/plugin-name-confusable.js +1 -1
- package/lib/validation/plugin-schemas.js +1 -1
- package/lib/validation/plugin-spec-schema.js +1 -1
- package/lib/validation/plugin-template-contract.js +1 -1
- package/package.json +11 -4
package/lib/types/quota-tiers.js
CHANGED
|
@@ -1,84 +1,16 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { envBool, envInt, envStr } from '../utils/env.js';
|
|
3
|
+
import { envBool, envInt, envNameFragment, envStr } from '../utils/env.js';
|
|
4
|
+
import { DEFAULT_TIER_LIMITS, tierLabel } from './tier-limits.js';
|
|
4
5
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* `storageBytes` is the aggregate registry cap per org. Sized
|
|
13
|
-
* around plugin-image realities: a typical plugin image is 200500 MB;
|
|
14
|
-
* Developer's 2 GB holds ~4 versions × ~500 MB, Pro's 25 GB covers a
|
|
15
|
-
* mature catalog. Operators can override per-org via the quota CRUD API.
|
|
6
|
+
* The limits shape, the code-default table and the sizing arithmetic live in
|
|
7
|
+
* `./tier-limits.js` — dependency-free, so the BROWSER imports them
|
|
8
|
+
* (`@pipeline-builder/api-core/tier-limits`) instead of keeping a hand-synced
|
|
9
|
+
* copy. Re-exported here because this is the module every server consumer and
|
|
10
|
+
* the package barrel already name; what stays here is everything the env
|
|
11
|
+
* touches.
|
|
16
12
|
*/
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* How the `automationCalls` defaults are sized — written down so the next
|
|
20
|
-
* person to touch them argues with the arithmetic, not with the numbers.
|
|
21
|
-
*
|
|
22
|
-
* Every call an org's automation keys make in one pipeline RUN, itemized (the
|
|
23
|
-
* earlier sizing counted only the plugin lookups and hand-waved the rest as
|
|
24
|
-
* "×2"):
|
|
25
|
-
*
|
|
26
|
-
* plugin lookups 12 one per plugin step (self-mutating pipeline)
|
|
27
|
-
* synth 1 the synth step fetching the pipeline config
|
|
28
|
-
* runtime check 1 the pre-deploy runtime-check call
|
|
29
|
-
* security-report upload 1 the scan step posting its report
|
|
30
|
-
* registry register 1 pipeline-register stamping the deployed version
|
|
31
|
-
* reporting ingest batches 12 the event forwarder posts ~one batch per action
|
|
32
|
-
* --
|
|
33
|
-
* 28 calls per run
|
|
34
|
-
*
|
|
35
|
-
* Per default period (`QUOTA_RESET_DAYS`, 3 days) one active pipeline running
|
|
36
|
-
* hourly makes 28 × 24 × 3 = 2,016 calls. An org keeps far more pipelines alive
|
|
37
|
-
* than it CREATES in a period (`pipelines` is a creation rate), so active
|
|
38
|
-
* pipelines are taken as 4× the tier's `pipelines`. On top sits a per-ORG
|
|
39
|
-
* constant that does not scale with pipelines: the ingest-health heartbeat
|
|
40
|
-
* (≤ 1/minute → 1,440/day → 4,320/period). The sum gets 25% headroom (retries,
|
|
41
|
-
* registry pushes, ad-hoc CI scripts on keys) and rounds UP to the next 10,000:
|
|
42
|
-
*
|
|
43
|
-
* developer 2×4×2016 + 4320 = 20,448 × 1.25 = 25,560 → 30,000
|
|
44
|
-
* pro 5×4×2016 + 4320 = 44,640 × 1.25 = 55,800 → 60,000
|
|
45
|
-
* team 10×4×2016 + 4320 = 84,960 × 1.25 = 106,200 → 110,000
|
|
46
|
-
* business 20×4×2016 + 4320 = 165,600 × 1.25 = 207,000 → 210,000
|
|
47
|
-
* enterprise 30×4×2016 + 4320 = 246,240 × 1.25 = 307,800 → 310,000
|
|
48
|
-
*
|
|
49
|
-
* {@link automationCallsFor} computes exactly this, and the tier tests hold the
|
|
50
|
-
* table to it. Over the cap the 429 is SOFT for a band ({@link quotaGracePct}):
|
|
51
|
-
* a self-mutating pipeline that hard-stopped at 100% stayed stopped until the
|
|
52
|
-
* period reset, up to 3 days. The limits are PER PERIOD: an operator who
|
|
53
|
-
* lengthens `QUOTA_RESET_DAYS` should scale `QUOTA_TIER_<TIER>_AUTOMATION_CALLS`
|
|
54
|
-
* by the same factor.
|
|
55
|
-
*/
|
|
56
|
-
export const AUTOMATION_CALLS_SIZING = {
|
|
57
|
-
callsPerRun: {
|
|
58
|
-
pluginLookups: 12,
|
|
59
|
-
synth: 1,
|
|
60
|
-
runtimeCheck: 1,
|
|
61
|
-
securityReportUpload: 1,
|
|
62
|
-
registryRegister: 1,
|
|
63
|
-
ingestBatches: 12,
|
|
64
|
-
},
|
|
65
|
-
runsPerDay: 24,
|
|
66
|
-
activePipelinesPerCreation: 4,
|
|
67
|
-
/** Ingest-health heartbeats per org per day (≤ one a minute). */
|
|
68
|
-
heartbeatsPerDay: 1440,
|
|
69
|
-
/** Multiplier on the itemized total. */
|
|
70
|
-
headroom: 1.25,
|
|
71
|
-
/** Defaults round UP to a multiple of this. */
|
|
72
|
-
roundTo: 10_000,
|
|
73
|
-
};
|
|
74
|
-
/** The {@link AUTOMATION_CALLS_SIZING} formula for a tier creating `pipelines` per period. */
|
|
75
|
-
export function automationCallsFor(pipelines, periodDays = 3) {
|
|
76
|
-
const s = AUTOMATION_CALLS_SIZING;
|
|
77
|
-
const perRun = Object.values(s.callsPerRun).reduce((a, b) => a + b, 0);
|
|
78
|
-
const perPipeline = perRun * s.runsPerDay * periodDays;
|
|
79
|
-
const total = (pipelines * s.activePipelinesPerCreation * perPipeline + s.heartbeatsPerDay * periodDays) * s.headroom;
|
|
80
|
-
return Math.ceil(total / s.roundTo) * s.roundTo;
|
|
81
|
-
}
|
|
13
|
+
export { AUTOMATION_CALLS_SIZING, automationCallsFor, DEFAULT_TIER_LIMITS, tierLabel } from './tier-limits.js';
|
|
82
14
|
/**
|
|
83
15
|
* The SOFT band above a quota's cap, per type, in percent of the limit. A type
|
|
84
16
|
* absent from this map has NO band and stops hard at 100%.
|
|
@@ -107,6 +39,11 @@ export function automationCallsFor(pipelines, periodDays = 3) {
|
|
|
107
39
|
const QUOTA_GRACE_PCT = {
|
|
108
40
|
automationCalls: envInt('QUOTA_AUTOMATION_GRACE_PCT', 10, { min: 0, max: 100 }),
|
|
109
41
|
storageBytes: envInt('QUOTA_STORAGE_GRACE_PCT', 10, { min: 0, max: 100 }),
|
|
42
|
+
// `satisfies Partial<…>` keeps BOTH properties this map needs: the keys are
|
|
43
|
+
// checked against `QuotaType` (a typo'd `storagebytes` would otherwise leave a
|
|
44
|
+
// banded quota stopping hard at 100%, silently), while the annotation keeps the
|
|
45
|
+
// string index the accessor below needs for an untrusted `quotaType`. Partial
|
|
46
|
+
// because absence is meaningful here — see above.
|
|
110
47
|
};
|
|
111
48
|
/** The soft band for `quotaType` in percent, or 0 for a type that stops hard. */
|
|
112
49
|
export function quotaGracePct(quotaType) {
|
|
@@ -128,152 +65,6 @@ export function enforcedQuotaLimit(quotaType, limit, gracePct = quotaGracePct(qu
|
|
|
128
65
|
return limit;
|
|
129
66
|
return Math.floor((limit * (100 + gracePct)) / 100);
|
|
130
67
|
}
|
|
131
|
-
/**
|
|
132
|
-
* Code-default limits per tier — the fallback when no env override is set.
|
|
133
|
-
* -1 means unlimited. (Counts sized to "comfortably enough for one team, not
|
|
134
|
-
* script spam": 20 dashboards, 50 alert rules, 10 destinations, 1 IdP config
|
|
135
|
-
* for Developer; scaled up for Pro; -1 (uncapped) for the cheap count-quotas
|
|
136
|
-
* on Team/Enterprise while cost-driving quotas — incl. apiCalls — stay finite.)
|
|
137
|
-
*/
|
|
138
|
-
const DEFAULT_TIER_LIMITS = {
|
|
139
|
-
// Free tier: single seat, 2 pipelines, apiCalls CAPPED (was unlimited — a
|
|
140
|
-
// DoS/abuse hole on a shared resource); aiCalls small (each has ~$0.01-0.10
|
|
141
|
-
// external cost). Lean base — growth happens by upgrading, not stacking here.
|
|
142
|
-
developer: {
|
|
143
|
-
plugins: 10,
|
|
144
|
-
pipelines: 2,
|
|
145
|
-
apiCalls: 25_000,
|
|
146
|
-
automationCalls: 30_000,
|
|
147
|
-
aiCalls: 20,
|
|
148
|
-
cpuCredits: 4_500,
|
|
149
|
-
storageBytes: 2 * GB,
|
|
150
|
-
dashboards: 20,
|
|
151
|
-
alertRules: 50,
|
|
152
|
-
alertDestinations: 10,
|
|
153
|
-
idpConfigs: 1,
|
|
154
|
-
listings: 3,
|
|
155
|
-
seats: 1,
|
|
156
|
-
supportContacts: 0,
|
|
157
|
-
supportPremiumContacts: 0,
|
|
158
|
-
eventRetentionDays: 30,
|
|
159
|
-
doraRetentionDays: 180,
|
|
160
|
-
},
|
|
161
|
-
// Pro = individual power user, single seat, individual pricing. A 2nd seat (or
|
|
162
|
-
// team collaboration) requires the Team tier — the `seat` add-on is Team+ only,
|
|
163
|
-
// keeping Team the collaboration tier. Pro's value over Developer is its richer
|
|
164
|
-
// call/storage/plugin ceilings + feature add-ons (SSO/audit/DORA), not seats.
|
|
165
|
-
pro: {
|
|
166
|
-
plugins: 25,
|
|
167
|
-
pipelines: 5,
|
|
168
|
-
apiCalls: 100_000,
|
|
169
|
-
automationCalls: 60_000,
|
|
170
|
-
aiCalls: 200,
|
|
171
|
-
cpuCredits: 11_250,
|
|
172
|
-
storageBytes: 25 * GB,
|
|
173
|
-
dashboards: 200,
|
|
174
|
-
alertRules: 500,
|
|
175
|
-
alertDestinations: 50,
|
|
176
|
-
idpConfigs: 5,
|
|
177
|
-
listings: 10,
|
|
178
|
-
seats: 1,
|
|
179
|
-
supportContacts: 0,
|
|
180
|
-
supportPremiumContacts: 0,
|
|
181
|
-
eventRetentionDays: 30,
|
|
182
|
-
doraRetentionDays: 180,
|
|
183
|
-
},
|
|
184
|
-
// Team = collaboration tier; the seat limit (3) is the real differentiator over
|
|
185
|
-
// Pro (single-seat) — it's the multi-seat collaboration floor. Lean base ($79):
|
|
186
|
-
// growth rides the seat/pipeline/etc add-ons (land-and-expand). Limits sit
|
|
187
|
-
// between Pro and Enterprise.
|
|
188
|
-
team: {
|
|
189
|
-
plugins: 50,
|
|
190
|
-
pipelines: 10,
|
|
191
|
-
apiCalls: 300_000,
|
|
192
|
-
automationCalls: 110_000,
|
|
193
|
-
aiCalls: 600,
|
|
194
|
-
cpuCredits: 22_500,
|
|
195
|
-
storageBytes: 60 * GB,
|
|
196
|
-
dashboards: -1,
|
|
197
|
-
alertRules: -1,
|
|
198
|
-
alertDestinations: -1,
|
|
199
|
-
idpConfigs: 5,
|
|
200
|
-
listings: 25,
|
|
201
|
-
seats: 3,
|
|
202
|
-
supportContacts: 0,
|
|
203
|
-
supportPremiumContacts: 0,
|
|
204
|
-
eventRetentionDays: 30,
|
|
205
|
-
doraRetentionDays: 180,
|
|
206
|
-
},
|
|
207
|
-
// Business ($249): the step the $79 -> $599 cliff was missing. 8 seats, 20
|
|
208
|
-
// pipelines, and DORA (advanced_reporting) included rather than an add-on.
|
|
209
|
-
// Every cost driver is 100,000 apiCalls and 200 aiCalls PER SEAT, the same
|
|
210
|
-
// per-seat rate as Pro/Team/Enterprise, so the ladder reads consistently to a
|
|
211
|
-
// buyer who divides by headcount. Count-quotas that Team already uncaps stay
|
|
212
|
-
// -1; `idpConfigs` sits between Team's 5 and Enterprise's unlimited.
|
|
213
|
-
business: {
|
|
214
|
-
plugins: 100,
|
|
215
|
-
pipelines: 20,
|
|
216
|
-
apiCalls: 800_000,
|
|
217
|
-
automationCalls: 210_000,
|
|
218
|
-
aiCalls: 1_600,
|
|
219
|
-
cpuCredits: 45_000,
|
|
220
|
-
storageBytes: 120 * GB,
|
|
221
|
-
dashboards: -1,
|
|
222
|
-
alertRules: -1,
|
|
223
|
-
alertDestinations: -1,
|
|
224
|
-
idpConfigs: 10,
|
|
225
|
-
listings: 50,
|
|
226
|
-
seats: 8,
|
|
227
|
-
supportContacts: 0,
|
|
228
|
-
supportPremiumContacts: 0,
|
|
229
|
-
eventRetentionDays: 30,
|
|
230
|
-
doraRetentionDays: 180,
|
|
231
|
-
},
|
|
232
|
-
// Enterprise ($599, held): the all-inclusive tier — 15 seats, 30 pipelines, ALL
|
|
233
|
-
// premium features included (see TIER_FEATURES). FAIR-USE — cost drivers (apiCalls,
|
|
234
|
-
// aiCalls, storageBytes) capped so one account can't run up unbounded
|
|
235
|
-
// compute/provider/storage cost on a flat price; cheap count-quotas stay -1.
|
|
236
|
-
enterprise: {
|
|
237
|
-
plugins: 150,
|
|
238
|
-
pipelines: 30,
|
|
239
|
-
apiCalls: 1_500_000,
|
|
240
|
-
automationCalls: 310_000,
|
|
241
|
-
aiCalls: 3_000,
|
|
242
|
-
cpuCredits: 67_500,
|
|
243
|
-
storageBytes: 250 * GB,
|
|
244
|
-
dashboards: -1,
|
|
245
|
-
alertRules: -1,
|
|
246
|
-
alertDestinations: -1,
|
|
247
|
-
idpConfigs: -1,
|
|
248
|
-
listings: 100,
|
|
249
|
-
seats: 15,
|
|
250
|
-
supportContacts: 0,
|
|
251
|
-
supportPremiumContacts: 0,
|
|
252
|
-
eventRetentionDays: 30,
|
|
253
|
-
doraRetentionDays: 180,
|
|
254
|
-
},
|
|
255
|
-
// Unlimited: EVERY quota uncapped (-1). The default when billing is disabled
|
|
256
|
-
// (no enforcement surface) — never shown/selectable when billing is enabled.
|
|
257
|
-
unlimited: {
|
|
258
|
-
plugins: -1,
|
|
259
|
-
pipelines: -1,
|
|
260
|
-
apiCalls: -1,
|
|
261
|
-
automationCalls: -1,
|
|
262
|
-
aiCalls: -1,
|
|
263
|
-
cpuCredits: -1,
|
|
264
|
-
storageBytes: -1,
|
|
265
|
-
dashboards: -1,
|
|
266
|
-
alertRules: -1,
|
|
267
|
-
alertDestinations: -1,
|
|
268
|
-
idpConfigs: -1,
|
|
269
|
-
listings: -1,
|
|
270
|
-
seats: -1,
|
|
271
|
-
supportContacts: -1,
|
|
272
|
-
supportPremiumContacts: -1,
|
|
273
|
-
eventRetentionDays: -1,
|
|
274
|
-
doraRetentionDays: -1,
|
|
275
|
-
},
|
|
276
|
-
};
|
|
277
68
|
/**
|
|
278
69
|
* Read a tier LIMIT env var. `-1` = unlimited; anything below that is nonsense
|
|
279
70
|
* (a `-5` limit would ship a broken finite cap), so it falls back to the code
|
|
@@ -304,38 +95,39 @@ function tierLimits(tier) {
|
|
|
304
95
|
}
|
|
305
96
|
const d = DEFAULT_TIER_LIMITS[tier];
|
|
306
97
|
const T = tier.toUpperCase();
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
listings: tierLimitEnv(`QUOTA_TIER_${T}_LISTINGS`, d.listings),
|
|
320
|
-
seats: tierLimitEnv(`QUOTA_TIER_${T}_SEATS`, d.seats),
|
|
321
|
-
supportContacts: tierLimitEnv(`QUOTA_TIER_${T}_SUPPORT_CONTACTS`, d.supportContacts),
|
|
322
|
-
supportPremiumContacts: tierLimitEnv(`QUOTA_TIER_${T}_SUPPORT_PREMIUM_CONTACTS`, d.supportPremiumContacts),
|
|
323
|
-
eventRetentionDays: tierLimitEnv(`QUOTA_TIER_${T}_EVENT_RETENTION_DAYS`, d.eventRetentionDays),
|
|
324
|
-
doraRetentionDays: tierLimitEnv(`QUOTA_TIER_${T}_DORA_RETENTION_DAYS`, d.doraRetentionDays),
|
|
325
|
-
};
|
|
98
|
+
// Keyed off the limits table rather than seventeen hand-written lines, so a
|
|
99
|
+
// newly-added limit is env-overridable the moment it has a default — the hand
|
|
100
|
+
// list made that a second edit, in a file where forgetting it yields a knob
|
|
101
|
+
// the docs describe and the code ignores.
|
|
102
|
+
const out = { ...d };
|
|
103
|
+
for (const field of Object.keys(out)) {
|
|
104
|
+
// The knob names are DERIVED from the field names (`envNameFragment`), which
|
|
105
|
+
// is why `test/quota-tiers.test.ts` pins the full set of seventeen: a field
|
|
106
|
+
// rename would otherwise move somebody's configured knob without a word.
|
|
107
|
+
out[field] = tierLimitEnv(`QUOTA_TIER_${T}_${envNameFragment(field)}`, d[field]);
|
|
108
|
+
}
|
|
109
|
+
return out;
|
|
326
110
|
}
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
*
|
|
338
|
-
|
|
111
|
+
/** All valid tier names (incl. `unlimited`), in ladder order. Used for validation
|
|
112
|
+
* of a *stored* tier — `unlimited` is a valid value even though it's never
|
|
113
|
+
* offered for sale. Derived from the code-default limits table, which is the one
|
|
114
|
+
* place a tier cannot be added without being given numbers. */
|
|
115
|
+
export const VALID_TIERS = Object.keys(DEFAULT_TIER_LIMITS);
|
|
116
|
+
/**
|
|
117
|
+
* Every tier's preset, keyed off {@link VALID_TIERS} rather than written out
|
|
118
|
+
* tier by tier — a tier added to the limits table gets its preset here with no
|
|
119
|
+
* second edit.
|
|
120
|
+
*
|
|
121
|
+
* The label defaults to {@link tierLabel} of the key ("business" → "Business",
|
|
122
|
+
* "pro_plus" → "Pro Plus"), which is what all six were spelled as by hand, and
|
|
123
|
+
* stays overridable via `QUOTA_TIER_<TIER>_LABEL` for a deployment that wants its
|
|
124
|
+
* own wording — or for a key the derivation cannot get right, such as an acronym.
|
|
125
|
+
* Display name only: it never affects a limit.
|
|
126
|
+
*/
|
|
127
|
+
export const QUOTA_TIERS = Object.fromEntries(VALID_TIERS.map((tier) => [tier, {
|
|
128
|
+
label: envStr(`QUOTA_TIER_${tier.toUpperCase()}_LABEL`, tierLabel(tier)),
|
|
129
|
+
limits: tierLimits(tier),
|
|
130
|
+
}]));
|
|
339
131
|
/** The standard, billing-selectable tiers — the ones offered as purchasable plans
|
|
340
132
|
* and shown in tier pickers. Derived as "every valid tier except `unlimited`",
|
|
341
133
|
* which is the billing-DISABLED default and is never displayed/selectable when
|
|
@@ -430,4 +222,4 @@ export function nextQuotaResetDate(days = QUOTA_RESET_DAYS, now = new Date()) {
|
|
|
430
222
|
date.setHours(0, 0, 0, 0);
|
|
431
223
|
return date;
|
|
432
224
|
}
|
|
433
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtdGllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcXVvdGEtdGllcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQXFIMUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFOUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQ0c7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRztJQUNyQyxXQUFXLEVBQUU7UUFDWCxhQUFhLEVBQUUsRUFBRTtRQUNqQixLQUFLLEVBQUUsQ0FBQztRQUNSLFlBQVksRUFBRSxDQUFDO1FBQ2Ysb0JBQW9CLEVBQUUsQ0FBQztRQUN2QixnQkFBZ0IsRUFBRSxDQUFDO1FBQ25CLGFBQWEsRUFBRSxFQUFFO0tBQ2xCO0lBQ0QsVUFBVSxFQUFFLEVBQUU7SUFDZCwwQkFBMEIsRUFBRSxDQUFDO0lBQzdCLGlFQUFpRTtJQUNqRSxnQkFBZ0IsRUFBRSxJQUFJO0lBQ3RCLHdDQUF3QztJQUN4QyxRQUFRLEVBQUUsSUFBSTtJQUNkLCtDQUErQztJQUMvQyxPQUFPLEVBQUUsTUFBTTtDQUNQLENBQUM7QUFFWCw4RkFBOEY7QUFDOUYsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFNBQWlCLEVBQUUsVUFBVSxHQUFXLENBQUM7SUFDMUUsTUFBTSxDQUFDLEdBQUcsdUJBQXVCLENBQUM7SUFDbEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFD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RTtJQUN4RixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBlbnZCb29sLCBlbnZJbnQsIGVudlN0ciB9IGZyb20gJy4uL3V0aWxzL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1b3RhVHlwZSB9IGZyb20gJy4vY29tbW9uLmpzJztcblxuLyoqIEF2YWlsYWJsZSBxdW90YSB0aWVyIGlkZW50aWZpZXJzLlxuICpcbiAqIGB1bmxpbWl0ZWRgIGlzIGEgc3BlY2lhbCB0aWVyOiBldmVyeSBxdW90YSBpcyBgLTFgICh1bmNhcHBlZCkgYW5kIGl0IGluY2x1ZGVzXG4gKiBldmVyeSBmZWF0dXJlL2FkZC1vbiBidW5kbGUuIEl0IGlzIHRoZSBERUZBVUxUIHdoZW4gYmlsbGluZyBpcyBkaXNhYmxlZCAobm9cbiAqIG1ldGVyaW5nL2VuZm9yY2VtZW50IHN1cmZhY2UgZXhpc3RzLCBzbyBub3RoaW5nIGlzIGNhcHBlZCksIGFuZCBpdCBpcyBORVZFUlxuICogc2hvd24gb3Igc2VsZWN0YWJsZSB3aGVuIGJpbGxpbmcgaXMgZW5hYmxlZCDigJQgc2VlIGBTVEFOREFSRF9USUVSU2AuICovXG5leHBvcnQgdHlwZSBRdW90YVRpZXIgPSAnZGV2ZWxvcGVyJyB8ICdwcm8nIHwgJ3RlYW0nIHwgJ2J1c2luZXNzJyB8ICdlbnRlcnByaXNlJyB8ICd1bmxpbWl0ZWQnO1xuXG4vKiogTGltaXQgdmFsdWVzIGZvciBlYWNoIHF1b3RhIHR5cGUgd2l0aGluIGEgdGllci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUaWVyTGltaXRzIHtcbiAgcGx1Z2luczogbnVtYmVyO1xuICBwaXBlbGluZXM6IG51bWJlcjtcbiAgYXBpQ2FsbHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIE1ldGVyZWQgQVBJIGNhbGxzIG1hZGUgYnkgT1JHIFNFUlZJQ0UgQUNDT1VOVFMgKGF1dG9tYXRpb24pLCBjb3VudGVkXG4gICAqIGluc3RlYWQgb2YgYGFwaUNhbGxzYCBzbyBwaXBlbGluZXMgY2FuJ3Qgc3RhcnZlIHRoZSBvcmcncyBwZW9wbGUuIFNlZVxuICAgKiB7QGxpbmsgQVVUT01BVElPTl9DQUxMU19TSVpJTkd9IGZvciBob3cgdGhlIGRlZmF1bHRzIGFyZSBkZXJpdmVkLlxuICAgKi9cbiAgYXV0b21hdGlvbkNhbGxzOiBudW1iZXI7XG4gIGFpQ2FsbHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIEFnZ3JlZ2F0ZSByZWdpc3RyeSBzdG9yYWdlIGNhcCBpbiBCWVRFUy4gQ291bnRlZCBhY3Jvc3MgZXZlcnkgcmVwb1xuICAgKiB1bmRlciB0aGUgb3JnJ3MgYG9yZy17b3JnSWR9L2AgbmFtZXNwYWNlLiAtMSBtZWFucyB1bmxpbWl0ZWQuXG4gICAqIHB1c2gtZ2F0ZSByZWFkcyB0aGlzOyB0aGUgaW1hZ2UtcmVnaXN0cnkgcmVqZWN0cyB0b2tlbiBpc3N1YW5jZSBmb3JcbiAgICogYHB1c2hgIHNjb3BlIHdoZW4gdGhlIG9yZydzIG1lYXN1cmVkIHVzYWdlIGV4Y2VlZHMgdGhlIGxpbWl0LlxuICAgKi9cbiAgc3RvcmFnZUJ5dGVzOiBudW1iZXI7XG4gIC8qKlxuICAgKiB2Q1BVLU1JTlVURVMgb2YgcGx1Z2luLWJ1aWxkIGNvbXB1dGUgcGVyIE1PTlRIIOKAlCB0aGUgb25lIHF1b3RhIG9uIGEgcGVyaW9kXG4gICAqIG9mIGl0cyBvd24gKGV2ZXJ5IG90aGVyIGZsb3cgcXVvdGEgcm9sbHMgb24gYFFVT1RBX1JFU0VUX0RBWVNgLCAzIGRheXMpLlxuICAgKlxuICAgKiBEZXJpdmVkIGZyb20gdGhlIGBwbHVnaW5zYCBjYXAgcmF0aGVyIHRoYW4gZ3Vlc3NlZDogYHBsdWdpbnMgeCAxMGAgYnVpbGRzIGFcbiAgICogbW9udGgsIGF0IGEgZmxhdCAzMCB3YWxsLW1pbnV0ZXMgYSBidWlsZCBhbmQgMS41IHZDUFUgb2YgYnVpbGRraXRkLCBzb1xuICAgKiBgY3JlZGl0cyA9IGJ1aWxkcyB4IDQ1YC4gVGhlIGZsYXQgcGVyLWJ1aWxkIGZpZ3VyZSBpcyBkZWxpYmVyYXRlIOKAlCBzY2FsaW5nXG4gICAqIEJPVEggdGhlIGJ1aWxkIGNvdW50IGFuZCB0aGUgcGVyLWJ1aWxkIGNvc3QgYnkgdGllciBtYWRlIGNyZWRpdHNcbiAgICogc3VwZXJsaW5lYXIgaW4gdGllciBvbiB0aGUgc3RyZW5ndGggb2YgYW4gdW5tZWFzdXJlZCBjbGFpbSwgYW5kIGl0IG1hZGUgYVxuICAgKiBwYWNrJ3MgY3JlZGl0IGdyYW50IHRpZXItZGVwZW5kZW50LCB3aGljaCB0aGUgY2F0YWxvZ3VlJ3MgZ3JhbnQgc2hhcGUgY2Fubm90XG4gICAqIGV4cHJlc3MuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGZpcnN0IGRpbWVuc2lvbiB3aXRoIGdlbnVpbmUgcGVyLXVuaXQgbWFyZ2luYWwgY29zdDogZXZlcnkgb3RoZXJcbiAgICogcXVvdGEgaXMgYSByYXRlIGxpbWl0IHByb3RlY3Rpbmcgc2hhcmVkIGluZnJhc3RydWN0dXJlLCB0aGlzIG9uZSBpcyBjb21wdXRlXG4gICAqIHRoZSBwbGF0Zm9ybSBwYXlzIGZvci4gU2VlIGBkb2NzL3BsYW5zL2NwdS1jcmVkaXRzLm1kYC5cbiAgICovXG4gIGNwdUNyZWRpdHM6IG51bWJlcjtcbiAgLyoqIENvdW50LXF1b3RhcyBvbiB0aGUgdXNlci1lZGl0YWJsZSBmZWF0dXJlIHRhYmxlcyBhZGRlZCB0byBjbG9zZSBwZXItb3JnXG4gICAqICBEb1MgdmlhIHNwYW0uIC0xIG1lYW5zIHVubGltaXRlZC4gKi9cbiAgZGFzaGJvYXJkczogbnVtYmVyO1xuICBhbGVydFJ1bGVzOiBudW1iZXI7XG4gIGFsZXJ0RGVzdGluYXRpb25zOiBudW1iZXI7XG4gIGlkcENvbmZpZ3M6IG51bWJlcjtcbiAgLyoqXG4gICAqIEFjdGl2ZSwgbm9uLXN1c3BlbmRlZCBwbHVnaW4tZWNvc3lzdGVtIGxpc3RpbmdzIHRoZSBvcmcgcHVibGlzaGVzXG4gICAqIChkb2NzL3BsdWdpbi1pbnN0YWxsaW5nLm1kKS4gQSBDT1VOVCBxdW90YSDigJQgaW5zdGFsbHMgbmV2ZXJcbiAgICogY291bnQuIC0xID0gdW5saW1pdGVkLiBFeHRlbmRhYmxlIHZpYSB0aGUgYGxpc3RpbmdfcGFja2AgYWRkLW9uIGJ1bmRsZS5cbiAgICovXG4gIGxpc3RpbmdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXggb3JnIG1lbWJlcnMgKGFjdGl2ZSB1c2VycyAvIHNlYXRzKS4gLTEgPSB1bmxpbWl0ZWQuIFRoaXMgaXMgdGhlIFwiVGVhbVwiXG4gICAqIHRpZXIgZGlmZmVyZW50aWF0b3Ig4oCUIGVuZm9yY2VkIGF0IG1lbWJlci1pbnZpdGUgdGltZSAoYW4gaW52aXRlIGlzIGJsb2NrZWRcbiAgICogd2hlbiBhY3RpdmUgbWVtYmVycyArIHBlbmRpbmcgaW52aXRlcyB3b3VsZCBleGNlZWQgdGhpcykuXG4gICAqL1xuICBzZWF0czogbnVtYmVyO1xuICAvKipcbiAgICogTWF4IGRlc2lnbmF0ZWQgU1VQUE9SVCBDT05UQUNUUyDigJQgdGhlIG1lbWJlcnMgYXV0aG9yaXNlZCB0byBvcGVuIHN1cHBvcnRcbiAgICogY2FzZXMuIC0xID0gdW5saW1pdGVkLiBCYXNlIGlzICoqMCBvbiBldmVyeSB0aWVyKio6IHN1cHBvcnQgaXMgYW4gYWRkLW9uIGF0XG4gICAqIGV2ZXJ5IHRpZXIgYW5kIGluY2x1ZGVkIGluIG5vbmUsIHNvIGFuIG9yZyB3aXRoIG5vIHN1cHBvcnQgYnVuZGxlIGhhcyBub1xuICAgKiBjb250YWN0cyBhbmQgY2Fubm90IG9wZW4gYSBjYXNlLiBUaGF0IG1ha2VzIHRoZSBzdXBwb3J0IHBheXdhbGwgYSBxdW90YVxuICAgKiBjaGVjayByYXRoZXIgdGhhbiBhIGZlYXR1cmUgZmxhZy5cbiAgICpcbiAgICogTGlrZSBgc2VhdHNgIHRoaXMgaXMgYSB0aWVyIExJTUlULCBub3QgYSB0cmFja2VkIGNvdW50ZXIg4oCUIGVuZm9yY2VkIGxpdmUgYXRcbiAgICogZGVzaWduYXRpb24gdGltZSBhZ2FpbnN0IGN1cnJlbnQgZGVzaWduYXRpb25zIGFjcm9zcyB0aGUgb3JnIHN1YnRyZWUuXG4gICAqIEV4dGVuZGVkIHBlciB1bml0IGJ5IHRoZSBgc3VwcG9ydF9zdGFuZGFyZGAgLyBgc3VwcG9ydF9wcmlvcml0eWAgQkFTRUxJTkVcbiAgICogYnVuZGxlcywgd2hpY2ggYXJlIHByaWNlZCBwZXIgY29udGFjdC5cbiAgICovXG4gIHN1cHBvcnRDb250YWN0czogbnVtYmVyO1xuICAvKipcbiAgICogSG93IG1hbnkgb2YgdGhvc2UgY29udGFjdHMgbWF5IGJlIFVQR1JBREVEIHRvIHByZW1pdW0gKDI0w5c3LCA4LWhvdXJcbiAgICogcmVzcG9uc2UsIGFuZCB0aGUgb25seSBvbmVzIHdobyBtYXkgZGVjbGFyZSBgdXJnZW50YCkuXG4gICAqXG4gICAqIEEgc2Vjb25kIGRpbWVuc2lvbiByYXRoZXIgdGhhbiBhIHRoaXJkIGJhc2VsaW5lIGxldmVsLCBiZWNhdXNlIHByZW1pdW0gaXMgYW5cbiAgICogVVBHUkFERSBhbmQgbm90IGFuIGFsdGVybmF0aXZlLiBUaGUgc2hhcGUgaXQgZW5jb2RlczogYW4gb3JnIGJ1eXMgTiBiYXNlbGluZVxuICAgKiBjb250YWN0cyBhbmQgdXBncmFkZXMgTSBvZiB0aGVtLCBNIOKJpCBOLiBUaGF0IGlzIHdoYXQgbGV0cyBhIDEwMC1zZWF0XG4gICAqIGN1c3RvbWVyIGdpdmUgYnVzaW5lc3MtaG91cnMgc3VwcG9ydCB0byBpdHMgdGhyZWUgbmFtZWQgY29udGFjdHMgYW5kIDI0w5c3XG4gICAqIHRvIHRoZSBvbmUgd2hvIGNhcnJpZXMgdGhlIHBhZ2VyIOKAlCB0aGUgY2FzZSB0aGUgbXV0dWFsbHktZXhjbHVzaXZlIGxhZGRlclxuICAgKiBjb3VsZCBub3QgZXhwcmVzcyBhdCBhbGwsIHdoZXJlIGJ1eWluZyBcIjk5IHN0YW5kYXJkICsgMSBwcmVtaXVtXCIgY2hhcmdlZCBmb3JcbiAgICogMTAwIHVuaXRzIGFuZCBncmFudGVkIG9uZSBjb250YWN0LlxuICAgKlxuICAgKiBBRERJVElWRSwgZGVsaWJlcmF0ZWx5LiBBIHByZW1pdW0gY29udGFjdCBjb3N0cyB0aGUgYmFzZWxpbmUgdW5pdCBQTFVTIHRoZVxuICAgKiB1cGdyYWRlICgkMTkuOTkgKyAkOTkuOTkpLCBiZWNhdXNlIGl0IGlzIHNlcnZlZCBkdXJpbmcgYnVzaW5lc3MgaG91cnNcbiAgICogdGhyb3VnaCB0aGUgYmFzZWxpbmUgYW5kIG92ZXJuaWdodCB0aHJvdWdoIHRoZSB1cGdyYWRlOyBwcmljaW5nIHRoZSB1cGdyYWRlXG4gICAqIGFzIGEgZGVsdGEgd291bGQgcHJldGVuZCB0aGUgYmFzZWxpbmUgd2VyZSBmcmVlLiBCYXNlIDAgb24gZXZlcnkgdGllciwgbGlrZVxuICAgKiBgc3VwcG9ydENvbnRhY3RzYCwgc28gdGhlIHBheXdhbGwgc3RheXMgYSBxdW90YSBjaGVjay5cbiAgICovXG4gIHN1cHBvcnRQcmVtaXVtQ29udGFjdHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJlcG9ydGluZyByZXRlbnRpb24gaW4gREFZUyDigJQgTk9UIGEgZmxvdyBxdW90YSAobmV2ZXIgZGVjcmVtZW50ZWQsIGFic2VudFxuICAgKiBmcm9tIGBWQUxJRF9RVU9UQV9UWVBFU2ApOiB0aGVzZSByaWRlIHRoZSB0aWVyLWJhc2VsaW5lICsgYnVuZGxlLWdyYW50IG1hdGhcbiAgICogcHVyZWx5IGFzIGFuIGVudGl0bGVtZW50IHRoZSBiaWxsaW5nIHNlcnZpY2Ugc3luY3MgdG8gcmVwb3J0aW5nJ3NcbiAgICogYGRvcmFfc2V0dGluZ3NgLiAtMSA9IHVubGltaXRlZCAodGhlIHN3ZWVwIHNraXBzIHRoZSBvcmcgZW50aXJlbHkpLlxuICAgKiAgIGBldmVudFJldGVudGlvbkRheXNgIOKAlCBub24tZGVwbG95IGBwaXBlbGluZV9ldmVudHNgIChTVEFHRS9BQ1RJT04vYnVpbGQpLlxuICAgKiAgIGBkb3JhUmV0ZW50aW9uRGF5c2AgIOKAlCBkZXBsb3kgZXZlbnRzICsgYGRlcGxveW1lbnRfb3V0Y29tZXNgICsgYGluY2lkZW50c2AsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHBlci1vcmcgcmVwb3J0LXF1ZXJ5IHdpbmRvdyBmb3IgRE9SQSByb3V0ZXMuXG4gICAqIEV4dGVuZGFibGUgdmlhIHRoZSBgcmV0ZW50aW9uX3BhY2tgIC8gYGRvcmFfaGlzdG9yeV9wYWNrYCBhZGQtb24gYnVuZGxlcy5cbiAgICovXG4gIGV2ZW50UmV0ZW50aW9uRGF5czogbnVtYmVyO1xuICBkb3JhUmV0ZW50aW9uRGF5czogbnVtYmVyO1xufVxuXG4vKiogRnVsbCBwcmVzZXQgZm9yIGEgc2luZ2xlIHRpZXIgKGxhYmVsICsgbGltaXRzKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUaWVyUHJlc2V0IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgbGltaXRzOiBRdW90YVRpZXJMaW1pdHM7XG59XG5cbi8qKlxuICogUHJlc2V0IGxpbWl0cyBmb3IgZWFjaCB0aWVyLiAtMSBtZWFucyB1bmxpbWl0ZWQuXG4gKlxuICogQUkgY2FsbHMgYXJlIHNpemVkIG11Y2ggc21hbGxlciB0aGFuIGBhcGlDYWxsc2AgYmVjYXVzZSBlYWNoIGNhbGwgaGFzXG4gKiBleHRlcm5hbCBwcm92aWRlciBjb3N0ICh+JDAuMDEkMC4xMC9jYWxsKS4gRGV2ZWxvcGVyIHRpZXIgYWxsb3dzIGxpZ2h0XG4gKiBleHBsb3JhdGlvbiAoNTAvcGVyaW9kKTsgUHJvIGxpZnRzIHRvIDIsNTAwOyBFbnRlcnByaXNlIGlzIGNhcHBlZCBoaWdoXG4gKiAoMjUsMDAwKSDigJQgZmFpci11c2UsIG5vdCBsaXRlcmFsbHkgdW5saW1pdGVkLlxuICpcbiAqIGBzdG9yYWdlQnl0ZXNgIGlzIHRoZSBhZ2dyZWdhdGUgcmVnaXN0cnkgY2FwIHBlciBvcmcuIFNpemVkXG4gKiBhcm91bmQgcGx1Z2luLWltYWdlIHJlYWxpdGllczogYSB0eXBpY2FsIHBsdWdpbiBpbWFnZSBpcyAyMDA1MDAgTUI7XG4gKiBEZXZlbG9wZXIncyAyIEdCIGhvbGRzIH40IHZlcnNpb25zIMOXIH41MDAgTUIsIFBybydzIDI1IEdCIGNvdmVycyBhXG4gKiBtYXR1cmUgY2F0YWxvZy4gT3BlcmF0b3JzIGNhbiBvdmVycmlkZSBwZXItb3JnIHZpYSB0aGUgcXVvdGEgQ1JVRCBBUEkuXG4gKi9cbmNvbnN0IEdCID0gMTAyNCAqIDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIEhvdyB0aGUgYGF1dG9tYXRpb25DYWxsc2AgZGVmYXVsdHMgYXJlIHNpemVkIOKAlCB3cml0dGVuIGRvd24gc28gdGhlIG5leHRcbiAqIHBlcnNvbiB0byB0b3VjaCB0aGVtIGFyZ3VlcyB3aXRoIHRoZSBhcml0aG1ldGljLCBub3Qgd2l0aCB0aGUgbnVtYmVycy5cbiAqXG4gKiBFdmVyeSBjYWxsIGFuIG9yZydzIGF1dG9tYXRpb24ga2V5cyBtYWtlIGluIG9uZSBwaXBlbGluZSBSVU4sIGl0ZW1pemVkICh0aGVcbiAqIGVhcmxpZXIgc2l6aW5nIGNvdW50ZWQgb25seSB0aGUgcGx1Z2luIGxvb2t1cHMgYW5kIGhhbmQtd2F2ZWQgdGhlIHJlc3QgYXNcbiAqIFwiw5cyXCIpOlxuICpcbiAqICAgcGx1Z2luIGxvb2t1cHMgICAgICAgICAgICAxMiAgIG9uZSBwZXIgcGx1Z2luIHN0ZXAgKHNlbGYtbXV0YXRpbmcgcGlwZWxpbmUpXG4gKiAgIHN5bnRoICAgICAgICAgICAgICAgICAgICAgIDEgICB0aGUgc3ludGggc3RlcCBmZXRjaGluZyB0aGUgcGlwZWxpbmUgY29uZmlnXG4gKiAgIHJ1bnRpbWUgY2hlY2sgICAgICAgICAgICAgIDEgICB0aGUgcHJlLWRlcGxveSBydW50aW1lLWNoZWNrIGNhbGxcbiAqICAgc2VjdXJpdHktcmVwb3J0IHVwbG9hZCAgICAgMSAgIHRoZSBzY2FuIHN0ZXAgcG9zdGluZyBpdHMgcmVwb3J0XG4gKiAgIHJlZ2lzdHJ5IHJlZ2lzdGVyICAgICAgICAgIDEgICBwaXBlbGluZS1yZWdpc3RlciBzdGFtcGluZyB0aGUgZGVwbG95ZWQgdmVyc2lvblxuICogICByZXBvcnRpbmcgaW5nZXN0IGJhdGNoZXMgIDEyICAgdGhlIGV2ZW50IGZvcndhcmRlciBwb3N0cyB+b25lIGJhdGNoIHBlciBhY3Rpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4ICAgY2FsbHMgcGVyIHJ1blxuICpcbiAqIFBlciBkZWZhdWx0IHBlcmlvZCAoYFFVT1RBX1JFU0VUX0RBWVNgLCAzIGRheXMpIG9uZSBhY3RpdmUgcGlwZWxpbmUgcnVubmluZ1xuICogaG91cmx5IG1ha2VzIDI4IMOXIDI0IMOXIDMgPSAyLDAxNiBjYWxscy4gQW4gb3JnIGtlZXBzIGZhciBtb3JlIHBpcGVsaW5lcyBhbGl2ZVxuICogdGhhbiBpdCBDUkVBVEVTIGluIGEgcGVyaW9kIChgcGlwZWxpbmVzYCBpcyBhIGNyZWF0aW9uIHJhdGUpLCBzbyBhY3RpdmVcbiAqIHBpcGVsaW5lcyBhcmUgdGFrZW4gYXMgNMOXIHRoZSB0aWVyJ3MgYHBpcGVsaW5lc2AuIE9uIHRvcCBzaXRzIGEgcGVyLU9SR1xuICogY29uc3RhbnQgdGhhdCBkb2VzIG5vdCBzY2FsZSB3aXRoIHBpcGVsaW5lczogdGhlIGluZ2VzdC1oZWFsdGggaGVhcnRiZWF0XG4gKiAo4omkIDEvbWludXRlIOKGkiAxLDQ0MC9kYXkg4oaSIDQsMzIwL3BlcmlvZCkuIFRoZSBzdW0gZ2V0cyAyNSUgaGVhZHJvb20gKHJldHJpZXMsXG4gKiByZWdpc3RyeSBwdXNoZXMsIGFkLWhvYyBDSSBzY3JpcHRzIG9uIGtleXMpIGFuZCByb3VuZHMgVVAgdG8gdGhlIG5leHQgMTAsMDAwOlxuICpcbiAqICAgZGV2ZWxvcGVyICAgMsOXNMOXMjAxNiArIDQzMjAgPSAgMjAsNDQ4IMOXIDEuMjUgPSAgMjUsNTYwIOKGkiAgMzAsMDAwXG4gKiAgIHBybyAgICAgICAgIDXDlzTDlzIwMTYgKyA0MzIwID0gIDQ0LDY0MCDDlyAxLjI1ID0gIDU1LDgwMCDihpIgIDYwLDAwMFxuICogICB0ZWFtICAgICAgIDEww5c0w5cyMDE2ICsgNDMyMCA9ICA4NCw5NjAgw5cgMS4yNSA9IDEwNiwyMDAg4oaSIDExMCwwMDBcbiAqICAgYnVzaW5lc3MgICAyMMOXNMOXMjAxNiArIDQzMjAgPSAxNjUsNjAwIMOXIDEuMjUgPSAyMDcsMDAwIOKGkiAyMTAsMDAwXG4gKiAgIGVudGVycHJpc2UgMzDDlzTDlzIwMTYgKyA0MzIwID0gMjQ2LDI0MCDDlyAxLjI1ID0gMzA3LDgwMCDihpIgMzEwLDAwMFxuICpcbiAqIHtAbGluayBhdXRvbWF0aW9uQ2FsbHNGb3J9IGNvbXB1dGVzIGV4YWN0bHkgdGhpcywgYW5kIHRoZSB0aWVyIHRlc3RzIGhvbGQgdGhlXG4gKiB0YWJsZSB0byBpdC4gT3ZlciB0aGUgY2FwIHRoZSA0MjkgaXMgU09GVCBmb3IgYSBiYW5kICh7QGxpbmsgcXVvdGFHcmFjZVBjdH0pOlxuICogYSBzZWxmLW11dGF0aW5nIHBpcGVsaW5lIHRoYXQgaGFyZC1zdG9wcGVkIGF0IDEwMCUgc3RheWVkIHN0b3BwZWQgdW50aWwgdGhlXG4gKiBwZXJpb2QgcmVzZXQsIHVwIHRvIDMgZGF5cy4gVGhlIGxpbWl0cyBhcmUgUEVSIFBFUklPRDogYW4gb3BlcmF0b3Igd2hvXG4gKiBsZW5ndGhlbnMgYFFVT1RBX1JFU0VUX0RBWVNgIHNob3VsZCBzY2FsZSBgUVVPVEFfVElFUl88VElFUj5fQVVUT01BVElPTl9DQUxMU2BcbiAqIGJ5IHRoZSBzYW1lIGZhY3Rvci5cbiAqL1xuZXhwb3J0IGNvbnN0IEFVVE9NQVRJT05fQ0FMTFNfU0laSU5HID0ge1xuICBjYWxsc1BlclJ1bjoge1xuICAgIHBsdWdpbkxvb2t1cHM6IDEyLFxuICAgIHN5bnRoOiAxLFxuICAgIHJ1bnRpbWVDaGVjazogMSxcbiAgICBzZWN1cml0eVJlcG9ydFVwbG9hZDogMSxcbiAgICByZWdpc3RyeVJlZ2lzdGVyOiAxLFxuICAgIGluZ2VzdEJhdGNoZXM6IDEyLFxuICB9LFxuICBydW5zUGVyRGF5OiAyNCxcbiAgYWN0aXZlUGlwZWxpbmVzUGVyQ3JlYXRpb246IDQsXG4gIC8qKiBJbmdlc3QtaGVhbHRoIGhlYXJ0YmVhdHMgcGVyIG9yZyBwZXIgZGF5ICjiiaQgb25lIGEgbWludXRlKS4gKi9cbiAgaGVhcnRiZWF0c1BlckRheTogMTQ0MCxcbiAgLyoqIE11bHRpcGxpZXIgb24gdGhlIGl0ZW1pemVkIHRvdGFsLiAqL1xuICBoZWFkcm9vbTogMS4yNSxcbiAgLyoqIERlZmF1bHRzIHJvdW5kIFVQIHRvIGEgbXVsdGlwbGUgb2YgdGhpcy4gKi9cbiAgcm91bmRUbzogMTBfMDAwLFxufSBhcyBjb25zdDtcblxuLyoqIFRoZSB7QGxpbmsgQVVUT01BVElPTl9DQUxMU19TSVpJTkd9IGZvcm11bGEgZm9yIGEgdGllciBjcmVhdGluZyBgcGlwZWxpbmVzYCBwZXIgcGVyaW9kLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF1dG9tYXRpb25DYWxsc0ZvcihwaXBlbGluZXM6IG51bWJlciwgcGVyaW9kRGF5czogbnVtYmVyID0gMyk6IG51bWJlciB7XG4gIGNvbnN0IHMgPSBBVVRPTUFUSU9OX0NBTExTX1NJWklORztcbiAgY29uc3QgcGVyUnVuID0gT2JqZWN0LnZhbHVlcyhzLmNhbGxzUGVyUnVuKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgY29uc3QgcGVyUGlwZWxpbmUgPSBwZXJSdW4gKiBzLnJ1bnNQZXJEYXkgKiBwZXJpb2REYXlzO1xuICBjb25zdCB0b3RhbCA9IChwaXBlbGluZXMgKiBzLmFjdGl2ZVBpcGVsaW5lc1BlckNyZWF0aW9uICogcGVyUGlwZWxpbmUgKyBzLmhlYXJ0YmVhdHNQZXJEYXkgKiBwZXJpb2REYXlzKSAqIHMuaGVhZHJvb207XG4gIHJldHVybiBNYXRoLmNlaWwodG90YWwgLyBzLnJvdW5kVG8pICogcy5yb3VuZFRvO1xufVxuXG4vKipcbiAqIFRoZSBTT0ZUIGJhbmQgYWJvdmUgYSBxdW90YSdzIGNhcCwgcGVyIHR5cGUsIGluIHBlcmNlbnQgb2YgdGhlIGxpbWl0LiBBIHR5cGVcbiAqIGFic2VudCBmcm9tIHRoaXMgbWFwIGhhcyBOTyBiYW5kIGFuZCBzdG9wcyBoYXJkIGF0IDEwMCUuXG4gKlxuICogQXQgMTAwJSB0aGUgYWNjb3VudCBnZXRzIHRoZSBcInJlYWNoZWRcIiBub3RpY2UgYW5kIGtlZXBzIHJ1bm5pbmc7IHRoZSByZWZ1c2FsXG4gKiBzdGFydHMgb25seSBwYXN0IGBsaW1pdCDDlyAoMTAwICsgcGN0KSAvIDEwMGAuIFJlYWRzIHN0aWxsIFJFUE9SVCB0aGUgbm9taW5hbFxuICogbGltaXQsIHNvIHVzYWdlIHNob3dzIGFib3ZlIDEwMCUgd2hpbGUgaW5zaWRlIHRoZSBiYW5kLlxuICpcbiAqIFR3byB0eXBlcyBxdWFsaWZ5LCBmb3IgdGhlIHNhbWUgcmVhc29uIHN0YXRlZCB0d28gd2F5cyDigJQgYSBoYXJkIHN0b3AgZXhhY3RseVxuICogYXQgMTAwJSBpcyB3b3JzZSB0aGFuIGEgc2hvcnQgb3ZlcnJ1biB3aGVuIHRoZSBjYWxsZXIgY2Fubm90IHNpbXBseSB3YWl0OlxuICpcbiAqIC0gYGF1dG9tYXRpb25DYWxsc2AgKGBRVU9UQV9BVVRPTUFUSU9OX0dSQUNFX1BDVGApOiB0aGUgY2FsbGVyIGlzIGEgcGlwZWxpbmVcbiAqICAgbWlkLWRlcGxveSwgbm90IGEgcGVyc29uLCBhbmQgdGhlIGNvdW50ZXIgd291bGQgc3RheSBmdWxsIGZvciB0aGUgcmVzdCBvZlxuICogICB0aGUgcGVyaW9kLlxuICogLSBgc3RvcmFnZUJ5dGVzYCAoYFFVT1RBX1NUT1JBR0VfR1JBQ0VfUENUYCk6IHN0b3JhZ2UgaXMgYSBTVE9DSyDigJQgaXQgZG9lc1xuICogICBub3QgcmVzZXQsIHNvIHdpdGhvdXQgYSBiYW5kIGEgZG93bmdyYWRlIG9yIGEgY2FuY2VsbGVkIHBhY2sgZmxpcHMgYW5cbiAqICAgYWNjb3VudCBmcm9tIHdvcmtpbmcgdG8gcmVmdXNlZCB3aXRoIG5vIGJ1ZmZlciBhdCBhbGwsIGFuZCB0aGUgcmVtZWR5XG4gKiAgIChwcnVuZSwgb3IgYnV5IGNhcGFjaXR5KSB0YWtlcyB0aW1lIHRoZSBiYW5kIGlzIHRoZXJlIHRvIHByb3ZpZGUuIE5vdGUgdGhlXG4gKiAgIGJhbmQgb24gYSBzdG9jayBpcyBhIE9ORS1USU1FIGJ1ZmZlciByYXRoZXIgdGhhbiBhIHBlci1wZXJpb2Qgb25lOyB0aGF0IGlzXG4gKiAgIGl0cyBwdXJwb3NlIGhlcmUsIG5vdCBhIGxpbWl0YXRpb24gb2YgaXQuXG4gKlxuICogRXZlcnkgb3RoZXIgdHlwZSBzdGF5cyBoYXJkLiBUaGlzIHdhcyBhIGhhcmRjb2RlZCBgcXVvdGFUeXBlICE9PVxuICogJ2F1dG9tYXRpb25DYWxscydgIGNvbXBhcmlzb24sIHdoaWNoIGlzIHdoeSBzdG9yYWdlIGhhZCBub3RoaW5nOiB0aGVcbiAqIG1lY2hhbmlzbSBleGlzdGVkIGFuZCBvbmx5IHRoZSBwcmVkaWNhdGUgZXhjbHVkZWQgaXQuXG4gKi9cbmNvbnN0IFFVT1RBX0dSQUNFX1BDVDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4gPSB7XG4gIGF1dG9tYXRpb25DYWxsczogZW52SW50KCdRVU9UQV9BVVRPTUFUSU9OX0dSQUNFX1BDVCcsIDEwLCB7IG1pbjogMCwgbWF4OiAxMDAgfSksXG4gIHN0b3JhZ2VCeXRlczogZW52SW50KCdRVU9UQV9TVE9SQUdFX0dSQUNFX1BDVCcsIDEwLCB7IG1pbjogMCwgbWF4OiAxMDAgfSksXG59O1xuXG4vKiogVGhlIHNvZnQgYmFuZCBmb3IgYHF1b3RhVHlwZWAgaW4gcGVyY2VudCwgb3IgMCBmb3IgYSB0eXBlIHRoYXQgc3RvcHMgaGFyZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90YUdyYWNlUGN0KHF1b3RhVHlwZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIFFVT1RBX0dSQUNFX1BDVFtxdW90YVR5cGVdID8/IDA7XG59XG5cbi8qKlxuICogVGhlIGxpbWl0IGVuZm9yY2VtZW50IGFjdHVhbGx5IGJpbmRzIG9uIGZvciBgcXVvdGFUeXBlYDogdGhlIG5vbWluYWwgbGltaXQsXG4gKiBwbHVzIHRoZSB0eXBlJ3Mge0BsaW5rIHF1b3RhR3JhY2VQY3R9IGJhbmQgd2hlcmUgaXQgaGFzIG9uZS4gVW5saW1pdGVkICgtMSlcbiAqIGFuZCB6ZXJvIChcIm5vbmVcIikgbGltaXRzIGFyZSByZXR1cm5lZCB1bmNoYW5nZWQg4oCUIGEgMCBjYXAgaXMgYSBkZWxpYmVyYXRlXG4gKiByZWZ1c2FsLCBub3QgYSBidWRnZXQgdG8gb3ZlcnJ1bi5cbiAqXG4gKiB7QGxpbmsgUVVPVEFfR1JBQ0VfUENUfSBkZWNpZGVzIFdIRVRIRVIgYSB0eXBlIGhhcyBhIGJhbmQ7IGBncmFjZVBjdGAgb25seVxuICogc2l6ZXMgaXQuIFNvIGFuIGV4cGxpY2l0IHBlcmNlbnRhZ2UgcGFzc2VkIGZvciBhbiB1bmJhbmRlZCB0eXBlIHN0aWxsIHlpZWxkc1xuICogdGhlIG5vbWluYWwgbGltaXQsIHJhdGhlciB0aGFuIHF1aWV0bHkgZ3JhbnRpbmcgYSBiYW5kIHRoZSB0eXBlIGlzIG5vdCBtZWFudFxuICogdG8gaGF2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuZm9yY2VkUXVvdGFMaW1pdChxdW90YVR5cGU6IHN0cmluZywgbGltaXQ6IG51bWJlciwgZ3JhY2VQY3Q6IG51bWJlciA9IHF1b3RhR3JhY2VQY3QocXVvdGFUeXBlKSk6IG51bWJlciB7XG4gIGlmIChsaW1pdCA8PSAwIHx8IGdyYWNlUGN0IDw9IDAgfHwgcXVvdGFHcmFjZVBjdChxdW90YVR5cGUpIDw9IDApIHJldHVybiBsaW1pdDtcbiAgcmV0dXJuIE1hdGguZmxvb3IoKGxpbWl0ICogKDEwMCArIGdyYWNlUGN0KSkgLyAxMDApO1xufVxuXG4vKipcbiAqIENvZGUtZGVmYXVsdCBsaW1pdHMgcGVyIHRpZXIg4oCUIHRoZSBmYWxsYmFjayB3aGVuIG5vIGVudiBvdmVycmlkZSBpcyBzZXQuXG4gKiAtMSBtZWFucyB1bmxpbWl0ZWQuIChDb3VudHMgc2l6ZWQgdG8gXCJjb21mb3J0YWJseSBlbm91Z2ggZm9yIG9uZSB0ZWFtLCBub3RcbiAqIHNjcmlwdCBzcGFtXCI6IDIwIGRhc2hib2FyZHMsIDUwIGFsZXJ0IHJ1bGVzLCAxMCBkZXN0aW5hdGlvbnMsIDEgSWRQIGNvbmZpZ1xuICogZm9yIERldmVsb3Blcjsgc2NhbGVkIHVwIGZvciBQcm87IC0xICh1bmNhcHBlZCkgZm9yIHRoZSBjaGVhcCBjb3VudC1xdW90YXNcbiAqIG9uIFRlYW0vRW50ZXJwcmlzZSB3aGlsZSBjb3N0LWRyaXZpbmcgcXVvdGFzIOKAlCBpbmNsLiBhcGlDYWxscyDigJQgc3RheSBmaW5pdGUuKVxuICovXG5jb25zdCBERUZBVUxUX1RJRVJfTElNSVRTOiBSZWNvcmQ8UXVvdGFUaWVyLCBRdW90YVRpZXJMaW1pdHM+ID0ge1xuICAvLyBGcmVlIHRpZXI6IHNpbmdsZSBzZWF0LCAyIHBpcGVsaW5lcywgYXBpQ2FsbHMgQ0FQUEVEICh3YXMgdW5saW1pdGVkIOKAlCBhXG4gIC8vIERvUy9hYnVzZSBob2xlIG9uIGEgc2hhcmVkIHJlc291cmNlKTsgYWlDYWxscyBzbWFsbCAoZWFjaCBoYXMgfiQwLjAxLTAuMTBcbiAgLy8gZXh0ZXJuYWwgY29zdCkuIExlYW4gYmFzZSDigJQgZ3Jvd3RoIGhhcHBlbnMgYnkgdXBncmFkaW5nLCBub3Qgc3RhY2tpbmcgaGVyZS5cbiAgZGV2ZWxvcGVyOiB7XG4gICAgcGx1Z2luczogMTAsXG4gICAgcGlwZWxpbmVzOiAyLFxuICAgIGFwaUNhbGxzOiAyNV8wMDAsXG4gICAgYXV0b21hdGlvbkNhbGxzOiAzMF8wMDAsXG4gICAgYWlDYWxsczogMjAsXG4gICAgY3B1Q3JlZGl0czogNF81MDAsXG4gICAgc3RvcmFnZUJ5dGVzOiAyICogR0IsXG4gICAgZGFzaGJvYXJkczogMjAsXG4gICAgYWxlcnRSdWxlczogNTAsXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IDEwLFxuICAgIGlkcENvbmZpZ3M6IDEsXG4gICAgbGlzdGluZ3M6IDMsXG4gICAgc2VhdHM6IDEsXG4gICAgc3VwcG9ydENvbnRhY3RzOiAwLFxuICAgIHN1cHBvcnRQcmVtaXVtQ29udGFjdHM6IDAsXG4gICAgZXZlbnRSZXRlbnRpb25EYXlzOiAzMCxcbiAgICBkb3JhUmV0ZW50aW9uRGF5czogMTgwLFxuICB9LFxuICAvLyBQcm8gPSBpbmRpdmlkdWFsIHBvd2VyIHVzZXIsIHNpbmdsZSBzZWF0LCBpbmRpdmlkdWFsIHByaWNpbmcuIEEgMm5kIHNlYXQgKG9yXG4gIC8vIHRlYW0gY29sbGFib3JhdGlvbikgcmVxdWlyZXMgdGhlIFRlYW0gdGllciDigJQgdGhlIGBzZWF0YCBhZGQtb24gaXMgVGVhbSsgb25seSxcbiAgLy8ga2VlcGluZyBUZWFtIHRoZSBjb2xsYWJvcmF0aW9uIHRpZXIuIFBybydzIHZhbHVlIG92ZXIgRGV2ZWxvcGVyIGlzIGl0cyByaWNoZXJcbiAgLy8gY2FsbC9zdG9yYWdlL3BsdWdpbiBjZWlsaW5ncyArIGZlYXR1cmUgYWRkLW9ucyAoU1NPL2F1ZGl0L0RPUkEpLCBub3Qgc2VhdHMuXG4gIHBybzoge1xuICAgIHBsdWdpbnM6IDI1LFxuICAgIHBpcGVsaW5lczogNSxcbiAgICBhcGlDYWxsczogMTAwXzAwMCxcbiAgICBhdXRvbWF0aW9uQ2FsbHM6IDYwXzAwMCxcbiAgICBhaUNhbGxzOiAyMDAsXG4gICAgY3B1Q3JlZGl0czogMTFfMjUwLFxuICAgIHN0b3JhZ2VCeXRlczogMjUgKiBHQixcbiAgICBkYXNoYm9hcmRzOiAyMDAsXG4gICAgYWxlcnRSdWxlczogNTAwLFxuICAgIGFsZXJ0RGVzdGluYXRpb25zOiA1MCxcbiAgICBpZHBDb25maWdzOiA1LFxuICAgIGxpc3RpbmdzOiAxMCxcbiAgICBzZWF0czogMSxcbiAgICBzdXBwb3J0Q29udGFjdHM6IDAsXG4gICAgc3VwcG9ydFByZW1pdW1Db250YWN0czogMCxcbiAgICBldmVudFJldGVudGlvbkRheXM6IDMwLFxuICAgIGRvcmFSZXRlbnRpb25EYXlzOiAxODAsXG4gIH0sXG4gIC8vIFRlYW0gPSBjb2xsYWJvcmF0aW9uIHRpZXI7IHRoZSBzZWF0IGxpbWl0ICgzKSBpcyB0aGUgcmVhbCBkaWZmZXJlbnRpYXRvciBvdmVyXG4gIC8vIFBybyAoc2luZ2xlLXNlYXQpIOKAlCBpdCdzIHRoZSBtdWx0aS1zZWF0IGNvbGxhYm9yYXRpb24gZmxvb3IuIExlYW4gYmFzZSAoJDc5KTpcbiAgLy8gZ3Jvd3RoIHJpZGVzIHRoZSBzZWF0L3BpcGVsaW5lL2V0YyBhZGQtb25zIChsYW5kLWFuZC1leHBhbmQpLiBMaW1pdHMgc2l0XG4gIC8vIGJldHdlZW4gUHJvIGFuZCBFbnRlcnByaXNlLlxuICB0ZWFtOiB7XG4gICAgcGx1Z2luczogNTAsXG4gICAgcGlwZWxpbmVzOiAxMCxcbiAgICBhcGlDYWxsczogMzAwXzAwMCxcbiAgICBhdXRvbWF0aW9uQ2FsbHM6IDExMF8wMDAsXG4gICAgYWlDYWxsczogNjAwLFxuICAgIGNwdUNyZWRpdHM6IDIyXzUwMCxcbiAgICBzdG9yYWdlQnl0ZXM6IDYwICogR0IsXG4gICAgZGFzaGJvYXJkczogLTEsXG4gICAgYWxlcnRSdWxlczogLTEsXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IC0xLFxuICAgIGlkcENvbmZpZ3M6IDUsXG4gICAgbGlzdGluZ3M6IDI1LFxuICAgIHNlYXRzOiAzLFxuICAgIHN1cHBvcnRDb250YWN0czogMCxcbiAgICBzdXBwb3J0UHJlbWl1bUNvbnRhY3RzOiAwLFxuICAgIGV2ZW50UmV0ZW50aW9uRGF5czogMzAsXG4gICAgZG9yYVJldGVudGlvbkRheXM6IDE4MCxcbiAgfSxcbiAgLy8gQnVzaW5lc3MgKCQyNDkpOiB0aGUgc3RlcCB0aGUgJDc5IC0+ICQ1OTkgY2xpZmYgd2FzIG1pc3NpbmcuIDggc2VhdHMsIDIwXG4gIC8vIHBpcGVsaW5lcywgYW5kIERPUkEgKGFkdmFuY2VkX3JlcG9ydGluZykgaW5jbHVkZWQgcmF0aGVyIHRoYW4gYW4gYWRkLW9uLlxuICAvLyBFdmVyeSBjb3N0IGRyaXZlciBpcyAxMDAsMDAwIGFwaUNhbGxzIGFuZCAyMDAgYWlDYWxscyBQRVIgU0VBVCwgdGhlIHNhbWVcbiAgLy8gcGVyLXNlYXQgcmF0ZSBhcyBQcm8vVGVhbS9FbnRlcnByaXNlLCBzbyB0aGUgbGFkZGVyIHJlYWRzIGNvbnNpc3RlbnRseSB0byBhXG4gIC8vIGJ1eWVyIHdobyBkaXZpZGVzIGJ5IGhlYWRjb3VudC4gQ291bnQtcXVvdGFzIHRoYXQgVGVhbSBhbHJlYWR5IHVuY2FwcyBzdGF5XG4gIC8vIC0xOyBgaWRwQ29uZmlnc2Agc2l0cyBiZXR3ZWVuIFRlYW0ncyA1IGFuZCBFbnRlcnByaXNlJ3MgdW5saW1pdGVkLlxuICBidXNpbmVzczoge1xuICAgIHBsdWdpbnM6IDEwMCxcbiAgICBwaXBlbGluZXM6IDIwLFxuICAgIGFwaUNhbGxzOiA4MDBfMDAwLFxuICAgIGF1dG9tYXRpb25DYWxsczogMjEwXzAwMCxcbiAgICBhaUNhbGxzOiAxXzYwMCxcbiAgICBjcHVDcmVkaXRzOiA0NV8wMDAsXG4gICAgc3RvcmFnZUJ5dGVzOiAxMjAgKiBHQixcbiAgICBkYXNoYm9hcmRzOiAtMSxcbiAgICBhbGVydFJ1bGVzOiAtMSxcbiAgICBhbGVydERlc3RpbmF0aW9uczogLTEsXG4gICAgaWRwQ29uZmlnczogMTAsXG4gICAgbGlzdGluZ3M6IDUwLFxuICAgIHNlYXRzOiA4LFxuICAgIHN1cHBvcnRDb250YWN0czogMCxcbiAgICBzdXBwb3J0UHJlbWl1bUNvbnRhY3RzOiAwLFxuICAgIGV2ZW50UmV0ZW50aW9uRGF5czogMzAsXG4gICAgZG9yYVJldGVudGlvbkRheXM6IDE4MCxcbiAgfSxcbiAgLy8gRW50ZXJwcmlzZSAoJDU5OSwgaGVsZCk6IHRoZSBhbGwtaW5jbHVzaXZlIHRpZXIg4oCUIDE1IHNlYXRzLCAzMCBwaXBlbGluZXMsIEFMTFxuICAvLyBwcmVtaXVtIGZlYXR1cmVzIGluY2x1ZGVkIChzZWUgVElFUl9GRUFUVVJFUykuIEZBSVItVVNFIOKAlCBjb3N0IGRyaXZlcnMgKGFwaUNhbGxzLFxuICAvLyBhaUNhbGxzLCBzdG9yYWdlQnl0ZXMpIGNhcHBlZCBzbyBvbmUgYWNjb3VudCBjYW4ndCBydW4gdXAgdW5ib3VuZGVkXG4gIC8vIGNvbXB1dGUvcHJvdmlkZXIvc3RvcmFnZSBjb3N0IG9uIGEgZmxhdCBwcmljZTsgY2hlYXAgY291bnQtcXVvdGFzIHN0YXkgLTEuXG4gIGVudGVycHJpc2U6IHtcbiAgICBwbHVnaW5zOiAxNTAsXG4gICAgcGlwZWxpbmVzOiAzMCxcbiAgICBhcGlDYWxsczogMV81MDBfMDAwLFxuICAgIGF1dG9tYXRpb25DYWxsczogMzEwXzAwMCxcbiAgICBhaUNhbGxzOiAzXzAwMCxcbiAgICBjcHVDcmVkaXRzOiA2N181MDAsXG4gICAgc3RvcmFnZUJ5dGVzOiAyNTAgKiBHQixcbiAgICBkYXNoYm9hcmRzOiAtMSxcbiAgICBhbGVydFJ1bGVzOiAtMSxcbiAgICBhbGVydERlc3RpbmF0aW9uczogLTEsXG4gICAgaWRwQ29uZmlnczogLTEsXG4gICAgbGlzdGluZ3M6IDEwMCxcbiAgICBzZWF0czogMTUsXG4gICAgc3VwcG9ydENvbnRhY3RzOiAwLFxuICAgIHN1cHBvcnRQcmVtaXVtQ29udGFjdHM6IDAsXG4gICAgZXZlbnRSZXRlbnRpb25EYXlzOiAzMCxcbiAgICBkb3JhUmV0ZW50aW9uRGF5czogMTgwLFxuICB9LFxuICAvLyBVbmxpbWl0ZWQ6IEVWRVJZIHF1b3RhIHVuY2FwcGVkICgtMSkuIFRoZSBkZWZhdWx0IHdoZW4gYmlsbGluZyBpcyBkaXNhYmxlZFxuICAvLyAobm8gZW5mb3JjZW1lbnQgc3VyZmFjZSkg4oCUIG5ldmVyIHNob3duL3NlbGVjdGFibGUgd2hlbiBiaWxsaW5nIGlzIGVuYWJsZWQuXG4gIHVubGltaXRlZDoge1xuICAgIHBsdWdpbnM6IC0xLFxuICAgIHBpcGVsaW5lczogLTEsXG4gICAgYXBpQ2FsbHM6IC0xLFxuICAgIGF1dG9tYXRpb25DYWxsczogLTEsXG4gICAgYWlDYWxsczogLTEsXG4gICAgY3B1Q3JlZGl0czogLTEsXG4gICAgc3RvcmFnZUJ5dGVzOiAtMSxcbiAgICBkYXNoYm9hcmRzOiAtMSxcbiAgICBhbGVydFJ1bGVzOiAtMSxcbiAgICBhbGVydERlc3RpbmF0aW9uczogLTEsXG4gICAgaWRwQ29uZmlnczogLTEsXG4gICAgbGlzdGluZ3M6IC0xLFxuICAgIHNlYXRzOiAtMSxcbiAgICBzdXBwb3J0Q29udGFjdHM6IC0xLFxuICAgIHN1cHBvcnRQcmVtaXVtQ29udGFjdHM6IC0xLFxuICAgIGV2ZW50UmV0ZW50aW9uRGF5czogLTEsXG4gICAgZG9yYVJldGVudGlvbkRheXM6IC0xLFxuICB9LFxufTtcblxuLyoqXG4gKiBSZWFkIGEgdGllciBMSU1JVCBlbnYgdmFyLiBgLTFgID0gdW5saW1pdGVkOyBhbnl0aGluZyBiZWxvdyB0aGF0IGlzIG5vbnNlbnNlXG4gKiAoYSBgLTVgIGxpbWl0IHdvdWxkIHNoaXAgYSBicm9rZW4gZmluaXRlIGNhcCksIHNvIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGNvZGVcbiAqIGRlZmF1bHQgcmF0aGVyIHRoYW4gY2xhbXBpbmcgdXAgdG8gYC0xYC4gVGhlIHBhcnNpbmcgaXRzZWxmIGlzIGFwaS1jb3JlJ3NcbiAqIHNoYXJlZCBgZW52SW50YCDigJQgc3RyaWN0IGFib3V0IGRlY2ltYWxzL2dhcmJhZ2Ug4oCUIG5vdCBhIGxvY2FsIHJlLWRlcml2YXRpb24uXG4gKi9cbmZ1bmN0aW9uIHRpZXJMaW1pdEVudihuYW1lOiBzdHJpbmcsIGZhbGxiYWNrOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBuID0gZW52SW50KG5hbWUsIGZhbGxiYWNrKTtcbiAgcmV0dXJuIG4gPCAtMSA/IGZhbGxiYWNrIDogbjtcbn1cblxuLyoqXG4gKiBQZXItdGllciBsaW1pdHMsIGVhY2ggb3ZlcnJpZGFibGUgdmlhIGBRVU9UQV9USUVSXzxUSUVSPl88TElNSVQ+YCBlbnYgdmFyc1xuICogKGUuZy4gYFFVT1RBX1RJRVJfUFJPX1BJUEVMSU5FUz0yNTBgLCBgUVVPVEFfVElFUl9ERVZFTE9QRVJfU1RPUkFHRV9CWVRFUz0uLi5gKS5cbiAqIFVuc2V0L2VtcHR5IOKGkiB0aGUgY29kZSBkZWZhdWx0LiBgLTFgID0gdW5saW1pdGVkLiBSZWFkIG9uY2UgYXQgbW9kdWxlIGxvYWQg4oCUXG4gKiBvbiBrOHMgdGhlc2UgZmxvdyBpbiB2aWEgdGhlIGBhcHAtZW52YCBDb25maWdNYXAgKGJ1aWx0IGZyb20gYC5lbnZgKS5cbiAqL1xuZnVuY3Rpb24gdGllckxpbWl0cyh0aWVyOiBRdW90YVRpZXIpOiBRdW90YVRpZXJMaW1pdHMge1xuICAvLyBgdW5saW1pdGVkYCBpcyB1bmNhcHBlZCBCWSBERUZJTklUSU9OOiBFVkVSWSBxdW90YSBpcyAtMSBhbmQgaXQgaXMgTk9UXG4gIC8vIGVudi1vdmVycmlkYWJsZS4gUmVhZGluZyBRVU9UQV9USUVSX1VOTElNSVRFRF8qIGhlcmUgd291bGQgbGV0IGEgc3RyYXkgZW52XG4gIC8vIHZhciBzaWxlbnRseSBjYXAgdGhlIGJpbGxpbmctRElTQUJMRUQgZGVmYXVsdCB0aWVyIOKAlCBzdXJmYWNpbmcgYXMgYSBzcHVyaW91c1xuICAvLyBcInF1b3RhIGV4Y2VlZGVkXCIgb24gYSBkZXBsb3kgdGhhdCBtZXRlcnMgbm90aGluZy4gRGVyaXZlIC0xIGZvciBldmVyeSBmaWVsZFxuICAvLyBmcm9tIHRoZSBsaW1pdHMgc2hhcGUgc28gYSBuZXdseS1hZGRlZCBxdW90YSBpcyB1bmNhcHBlZCBoZXJlIGF1dG9tYXRpY2FsbHkuXG4gIGlmICh0aWVyID09PSAndW5saW1pdGVkJykge1xuICAgIGNvbnN0IHVuY2FwcGVkID0geyAuLi5ERUZBVUxUX1RJRVJfTElNSVRTLnVubGltaXRlZCB9O1xuICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyh1bmNhcHBlZCkgYXMgKGtleW9mIFF1b3RhVGllckxpbWl0cylbXSkgdW5jYXBwZWRba10gPSAtMTtcbiAgICByZXR1cm4gdW5jYXBwZWQ7XG4gIH1cbiAgY29uc3QgZCA9IERFRkFVTFRfVElFUl9MSU1JVFNbdGllcl07XG4gIGNvbnN0IFQgPSB0aWVyLnRvVXBwZXJDYXNlKCk7XG4gIHJldHVybiB7XG4gICAgcGx1Z2luczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fUExVR0lOU2AsIGQucGx1Z2lucyksXG4gICAgcGlwZWxpbmVzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9QSVBFTElORVNgLCBkLnBpcGVsaW5lcyksXG4gICAgYXBpQ2FsbHM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0FQSV9DQUxMU2AsIGQuYXBpQ2FsbHMpLFxuICAgIGF1dG9tYXRpb25DYWxsczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fQVVUT01BVElPTl9DQUxMU2AsIGQuYXV0b21hdGlvbkNhbGxzKSxcbiAgICBhaUNhbGxzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9BSV9DQUxMU2AsIGQuYWlDYWxscyksXG4gICAgc3RvcmFnZUJ5dGVzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9TVE9SQUdFX0JZVEVTYCwgZC5zdG9yYWdlQnl0ZXMpLFxuICAgIGNwdUNyZWRpdHM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0NQVV9DUkVESVRTYCwgZC5jcHVDcmVkaXRzKSxcbiAgICBkYXNoYm9hcmRzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9EQVNIQk9BUkRTYCwgZC5kYXNoYm9hcmRzKSxcbiAgICBhbGVydFJ1bGVzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9BTEVSVF9SVUxFU2AsIGQuYWxlcnRSdWxlcyksXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0FMRVJUX0RFU1RJTkFUSU9OU2AsIGQuYWxlcnREZXN0aW5hdGlvbnMpLFxuICAgIGlkcENvbmZpZ3M6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0lEUF9DT05GSUdTYCwgZC5pZHBDb25maWdzKSxcbiAgICBsaXN0aW5nczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fTElTVElOR1NgLCBkLmxpc3RpbmdzKSxcbiAgICBzZWF0czogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fU0VBVFNgLCBkLnNlYXRzKSxcbiAgICBzdXBwb3J0Q29udGFjdHM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X1NVUFBPUlRfQ09OVEFDVFNgLCBkLnN1cHBvcnRDb250YWN0cyksXG4gICAgc3VwcG9ydFByZW1pdW1Db250YWN0czogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fU1VQUE9SVF9QUkVNSVVNX0NPTlRBQ1RTYCwgZC5zdXBwb3J0UHJlbWl1bUNvbnRhY3RzKSxcbiAgICBldmVudFJldGVudGlvbkRheXM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0VWRU5UX1JFVEVOVElPTl9EQVlTYCwgZC5ldmVudFJldGVudGlvbkRheXMpLFxuICAgIGRvcmFSZXRlbnRpb25EYXlzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9ET1JBX1JFVEVOVElPTl9EQVlTYCwgZC5kb3JhUmV0ZW50aW9uRGF5cyksXG4gIH07XG59XG5cbi8vIExhYmVscyBhcmUgb3ZlcnJpZGFibGUgdmlhIGBRVU9UQV9USUVSXzxUSUVSPl9MQUJFTGAgKGRpc3BsYXkgbmFtZSBvbmx5KS5cbmV4cG9ydCBjb25zdCBRVU9UQV9USUVSUzogUmVjb3JkPFF1b3RhVGllciwgUXVvdGFUaWVyUHJlc2V0PiA9IHtcbiAgZGV2ZWxvcGVyOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfREVWRUxPUEVSX0xBQkVMJywgJ0RldmVsb3BlcicpLCBsaW1pdHM6IHRpZXJMaW1pdHMoJ2RldmVsb3BlcicpIH0sXG4gIHBybzogeyBsYWJlbDogZW52U3RyKCdRVU9UQV9USUVSX1BST19MQUJFTCcsICdQcm8nKSwgbGltaXRzOiB0aWVyTGltaXRzKCdwcm8nKSB9LFxuICB0ZWFtOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfVEVBTV9MQUJFTCcsICdUZWFtJyksIGxpbWl0czogdGllckxpbWl0cygndGVhbScpIH0sXG4gIGJ1c2luZXNzOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfQlVTSU5FU1NfTEFCRUwnLCAnQnVzaW5lc3MnKSwgbGltaXRzOiB0aWVyTGltaXRzKCdidXNpbmVzcycpIH0sXG4gIGVudGVycHJpc2U6IHsgbGFiZWw6IGVudlN0cignUVVPVEFfVElFUl9FTlRFUlBSSVNFX0xBQkVMJywgJ0VudGVycHJpc2UnKSwgbGltaXRzOiB0aWVyTGltaXRzKCdlbnRlcnByaXNlJykgfSxcbiAgdW5saW1pdGVkOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfVU5MSU1JVEVEX0xBQkVMJywgJ1VubGltaXRlZCcpLCBsaW1pdHM6IHRpZXJMaW1pdHMoJ3VubGltaXRlZCcpIH0sXG59O1xuXG4vKiogQWxsIHZhbGlkIHRpZXIgbmFtZXMgKGluY2wuIGB1bmxpbWl0ZWRgKS4gVXNlZCBmb3IgdmFsaWRhdGlvbiBvZiBhICpzdG9yZWQqXG4gKiAgdGllciDigJQgYHVubGltaXRlZGAgaXMgYSB2YWxpZCB2YWx1ZSBldmVuIHRob3VnaCBpdCdzIG5ldmVyIG9mZmVyZWQgZm9yIHNhbGUuICovXG5leHBvcnQgY29uc3QgVkFMSURfVElFUlM6IHJlYWRvbmx5IFF1b3RhVGllcltdID0gT2JqZWN0LmtleXMoUVVPVEFfVElFUlMpIGFzIFF1b3RhVGllcltdO1xuXG4vKiogVGhlIHN0YW5kYXJkLCBiaWxsaW5nLXNlbGVjdGFibGUgdGllcnMg4oCUIHRoZSBvbmVzIG9mZmVyZWQgYXMgcHVyY2hhc2FibGUgcGxhbnNcbiAqICBhbmQgc2hvd24gaW4gdGllciBwaWNrZXJzLiBEZXJpdmVkIGFzIFwiZXZlcnkgdmFsaWQgdGllciBleGNlcHQgYHVubGltaXRlZGBcIixcbiAqICB3aGljaCBpcyB0aGUgYmlsbGluZy1ESVNBQkxFRCBkZWZhdWx0IGFuZCBpcyBuZXZlciBkaXNwbGF5ZWQvc2VsZWN0YWJsZSB3aGVuXG4gKiAgYmlsbGluZyBpcyBlbmFibGVkLiBLZXB0IERSWSBvZmYgYFZBTElEX1RJRVJTYCBzbyBhZGRpbmcgYSB0aWVyIGZsb3dzIHRocm91Z2guICovXG5leHBvcnQgY29uc3QgU1RBTkRBUkRfVElFUlM6IHJlYWRvbmx5IFF1b3RhVGllcltdID0gVkFMSURfVElFUlMuZmlsdGVyKCh0KSA9PiB0ICE9PSAndW5saW1pdGVkJyk7XG5cbi8qKiBUaWVycyB0aGF0IHBlcm1pdCB0aGUgb3JnIOKGkiB0ZWFtIGhpZXJhcmNoeSAobmVzdGluZyB0ZWFtcyB1bmRlciBhIHJvb3QpLiBUaGVcbiAqICBiaWxsaW5nLW9mZiBgdW5saW1pdGVkYCB0aWVyIGlzIHRlYW0tY2FwYWJsZSAoaXQncyB0aGUgbW9zdCBwZXJtaXNzaXZlKTsgdGhlXG4gKiAgZW50cnktbGV2ZWwgYGRldmVsb3BlcmAvYHByb2AgdGllcnMgYXJlIG5vdC4gU2luZ2xlIHNvdXJjZSBmb3IgdGhlIHBhcmVudC1cbiAqICBlbGlnaWJpbGl0eSArIGRvd25ncmFkZS1vdmVyY2FwIGNoZWNrcyBzbyB0aGV5IGNhbid0IGRyaWZ0LiAqL1xuZXhwb3J0IGNvbnN0IFRFQU1fQ0FQQUJMRV9USUVSUzogcmVhZG9ubHkgUXVvdGFUaWVyW10gPSBbJ3RlYW0nLCAnYnVzaW5lc3MnLCAnZW50ZXJwcmlzZScsICd1bmxpbWl0ZWQnXTtcbmV4cG9ydCBmdW5jdGlvbiB0aWVyQWxsb3dzVGVhbXModGllcjogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISF0aWVyICYmIChURUFNX0NBUEFCTEVfVElFUlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHRpZXIpO1xufVxuXG4vKiogVGllcnMgdGhhdCBtYXkgYnV5IGV4dHJhIHNlYXRzIOKAlCBiaWxsaW5nJ3MgcGVyLXNlYXQgYHNlYXRgIGFkZC1vbi4gU2VhdHMgYXJlXG4gKiAgdGhlIFRlYW0gZGlmZmVyZW50aWF0b3IsIHNvIHRoZSBzaW5nbGUtc2VhdCBgZGV2ZWxvcGVyYC9gcHJvYCB0aWVycyBjYW5ub3RcbiAqICBzdGFjayB0aGVtIGFuZCBtdXN0IHVwZ3JhZGUgaW5zdGVhZDsgYHVubGltaXRlZGAgaGFzIG5vIHNlYXQgY2FwIGF0IGFsbC5cbiAqICBTaW5nbGUgc291cmNlIGZvciB0aGUgYmlsbGluZyBjYXRhbG9nIGFuZCBldmVyeSBcIm91dCBvZiBzZWF0c1wiIG1lc3NhZ2UuICovXG5leHBvcnQgY29uc3QgU0VBVF9QQUNLX1RJRVJTOiByZWFkb25seSBRdW90YVRpZXJbXSA9IFsndGVhbScsICdidXNpbmVzcycsICdlbnRlcnByaXNlJ107XG5cbi8qKiBIb3cgYW4gYWNjb3VudCB0aGF0IGhhcyB1c2VkIGV2ZXJ5IHNlYXQgY2FuIGdldCBhbm90aGVyLiAqL1xuZXhwb3J0IHR5cGUgU2VhdFJlbWVkeSA9ICd1cGdyYWRlJyB8ICdzZWF0X3BhY2snO1xuXG4vKipcbiAqIFRoZSByZW1lZHkgdG8gb2ZmZXIgYW4gYWNjb3VudCBhdCBpdHMgc2VhdCBjYXAsIGZyb20gdGhlIEFDQ09VTlQncyAocm9vdCkgdGllcjpcbiAqIGBzZWF0X3BhY2tgIHdoZXJlIHNlYXRzIGNhbiBiZSBib3VnaHQsIGB1cGdyYWRlYCBvbiB0aGUgc2luZ2xlLXNlYXQgdGllcnMuXG4gKiBgbnVsbGAgd2hlbiB0aGUgdGllciBpcyB1bmtub3duIG9yIGhhcyBubyBjYXAg4oCUIHNheSBub3RoaW5nIHJhdGhlciB0aGFuIGd1ZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VhdFJlbWVkeSh0aWVyOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogU2VhdFJlbWVkeSB8IG51bGwge1xuICBpZiAoIXRpZXIgfHwgIWlzVmFsaWRUaWVyKHRpZXIpIHx8IHRpZXIgPT09ICd1bmxpbWl0ZWQnKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIChTRUFUX1BBQ0tfVElFUlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHRpZXIpID8gJ3NlYXRfcGFjaycgOiAndXBncmFkZSc7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBiaWxsaW5nIHNlcnZpY2UgaXMgZW5hYmxlZCBpbiB0aGlzIGRlcGxveW1lbnQgKGBCSUxMSU5HX0VOQUJMRURgLFxuICogIG9wdC1vdXQgZGVmYXVsdC1vbiDigJQgbWlycm9ycyB0aGUgYmlsbGluZy9wbGF0Zm9ybSBjb25maWdzKS4gV2l0aCBiaWxsaW5nIE9GRlxuICogIHRoZXJlJ3Mgbm8gbWV0ZXJpbmcvZW5mb3JjZW1lbnQgc3VyZmFjZSwgc28gdGhlIGRlZmF1bHQgdGllciBpcyBgdW5saW1pdGVkYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbGxpbmdFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZW52Qm9vbCgnQklMTElOR19FTkFCTEVEJywgdHJ1ZSk7XG59XG5cbi8qKlxuICogRGVmYXVsdCB0aWVyIGFzc2lnbmVkIHRvIG5ldyBvcmdhbml6YXRpb25zLlxuICogLSBCaWxsaW5nIERJU0FCTEVEIOKGkiBgdW5saW1pdGVkYCAobm90aGluZyBpcyBtZXRlcmVkLCBzbyBldmVyeXRoaW5nIGlzIHVuY2FwcGVkKS5cbiAqIC0gQmlsbGluZyBFTkFCTEVEICDihpIgYERFRkFVTFRfUVVPVEFfVElFUmAgaWYgaXQncyBhIHZhbGlkIHN0YW5kYXJkIHRpZXIsIGVsc2UgYGRldmVsb3BlcmAuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJRVI6IFF1b3RhVGllciA9ICFpc0JpbGxpbmdFbmFibGVkKClcbiAgPyAndW5saW1pdGVkJ1xuICA6IChpc1ZhbGlkVGllcihwcm9jZXNzLmVudi5ERUZBVUxUX1FVT1RBX1RJRVIgPz8gJycpICYmIHByb2Nlc3MuZW52LkRFRkFVTFRfUVVPVEFfVElFUiAhPT0gJ3VubGltaXRlZCdcbiAgICA/IChwcm9jZXNzLmVudi5ERUZBVUxUX1FVT1RBX1RJRVIgYXMgUXVvdGFUaWVyKVxuICAgIDogJ2RldmVsb3BlcicpO1xuXG4vKiogQ2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIFF1b3RhVGllci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVGllcih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgUXVvdGFUaWVyIHtcbiAgLy8gVXNlIHRoZSBleHBsaWNpdCB0dXBsZSwgbm90IGB2YWx1ZSBpbiBRVU9UQV9USUVSU2A6IGBpbmAgd2Fsa3MgdGhlIHByb3RvdHlwZVxuICAvLyBjaGFpbiwgc28gaW5oZXJpdGVkIE9iamVjdCBrZXlzICgndG9TdHJpbmcnLCAnY29uc3RydWN0b3InLCDigKYpIHdvdWxkIHJldHVyblxuICAvLyB0cnVlIGFuZCB0aGVuIGBnZXRUaWVyTGltaXRzYCB3b3VsZCByZWFkIGAubGltaXRzYCBvZmYgYSBmdW5jdGlvbiDihpIgY3Jhc2guXG4gIC8vIGB0aWVyYCBpcyBhdHRhY2tlci1pbmZsdWVuY2VhYmxlIChKV1QgLyByZXF1ZXN0IGJvZHkgLyBERUZBVUxUX1FVT1RBX1RJRVIgZW52KS5cbiAgcmV0dXJuIChWQUxJRF9USUVSUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpO1xufVxuXG4vKiogR2V0IHRoZSBkZWZhdWx0IGxpbWl0cyBmb3IgYSBnaXZlbiB0aWVyIChmYWxscyBiYWNrIHRvIGRldmVsb3BlcikuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGllckxpbWl0cyh0aWVyOiBzdHJpbmcpOiBRdW90YVRpZXJMaW1pdHMge1xuICByZXR1cm4gaXNWYWxpZFRpZXIodGllcikgPyBRVU9UQV9USUVSU1t0aWVyXS5saW1pdHM6IFFVT1RBX1RJRVJTLmRldmVsb3Blci5saW1pdHM7XG59XG5cbi8qKlxuICogVGhlIHBlcmlvZCAoZGF5cykgZXZlcnkgdXNhZ2UgY291bnRlciByb2xscyBvdmVyIG9uLiBBbGwgcXVvdGFzIGFyZSBwZXItcGVyaW9kXG4gKiBGTE9XIGNvdW50ZXJzIG9uIG9uZSBzaGFyZWQgcGVyaW9kOiB0aGUgcXVvdGEgc2VydmljZSByZXNldHMgYSBjb3VudGVyIHRoaXNcbiAqIG1hbnkgZGF5cyBhZnRlciBpdCBleHBpcmVzLCBhbmQgcGxhdGZvcm0gc2VlZHMgYSBuZXcgb3JnJ3MgY291bnRlcnMgd2l0aCB0aGVcbiAqIHNhbWUgd2luZG93IChgUVVPVEFfUkVTRVRfREFZU2AsIGRlZmF1bHQgMykuXG4gKi9cbmV4cG9ydCBjb25zdCBRVU9UQV9SRVNFVF9EQVlTID0gZW52SW50KCdRVU9UQV9SRVNFVF9EQVlTJywgMywgeyBtaW46IDEgfSk7XG5cbi8qKiBUaGUgbmV4dCBxdW90YSByZXNldDogbG9jYWwgbWlkbmlnaHQgYGRheXNgIGZyb20gYG5vd2AuICovXG4vKipcbiAqIFRoZSBgY3B1Q3JlZGl0c2AgcGVyaW9kLCBpbiBkYXlzLiBBIE1PTlRIIHJhdGhlciB0aGFuIHRoZSBnbG9iYWwgdGhyZWUtZGF5XG4gKiB3aW5kb3csIGJlY2F1c2UgYnVpbGQgZGVtYW5kIGlzIGJ1cnN0eSBpbiBhIHdheSBBUEkgdHJhZmZpYyBpcyBub3Q6IGEgZnVsbFxuICogY2F0YWxvZ3VlIHJlYnVpbGQgaXMgYSBkYXkncyB3b3JrIHRoYXQgYXJyaXZlcyBvbiBvbmUgZGF5LCBhbmQgYSB0aHJlZS1kYXlcbiAqIHdpbmRvdyByZWZ1c2VzIGl0IHdoaWxlIHRoZSBhY2NvdW50IGhvbGRzIG1vc3Qgb2YgYSBtb250aCdzIGJ1ZGdldCB1bnNwZW50LlxuICovXG5leHBvcnQgY29uc3QgQ1BVX0NSRURJVFNfUEVSSU9EX0RBWVMgPSBlbnZJbnQoJ1FVT1RBX0NQVV9DUkVESVRTX1BFUklPRF9EQVlTJywgMzAsIHsgbWluOiAxIH0pO1xuXG4vKipcbiAqIFRoZSB1c2FnZSBwZXJpb2QgZm9yIE9ORSBxdW90YSB0eXBlLCBpbiBkYXlzLlxuICpcbiAqIEV2ZXJ5IGZsb3cgcXVvdGEgYnV0IGBjcHVDcmVkaXRzYCByb2xscyBvbiB0aGUgZ2xvYmFsIHtAbGluayBRVU9UQV9SRVNFVF9EQVlTfS5cbiAqIENyZWRpdHMgYXJlIG1vbnRobHksIHdoaWNoIG1ha2VzIHRoZSBwZXJpb2QgYSBQRVItVFlQRSBmYWN0IOKAlCBzbyBhbnl0aGluZyB0aGF0XG4gKiBjb21wdXRlcyBhIHJlc2V0IGRhdGUsIGEgXCJyZXNldHMgaW4gTiBkYXlzXCIgbGluZSBvciBhIGJ1cm4tcmF0ZSBmb3JlY2FzdCBoYXNcbiAqIHRvIGFzayBmb3IgdGhlIHR5cGUncyBvd24gcGVyaW9kIHJhdGhlciB0aGFuIHJlYWRpbmcgdGhlIGdsb2JhbCBjb25zdGFudC4gQVxuICogZm9yZWNhc3QgYWdhaW5zdCB0aGUgd3Jvbmcgd2luZG93IGlzIHdyb25nIGJ5IGEgZmFjdG9yIG9mIHRlbi5cbiAqXG4gKiBTdG9ja3MgKGBzdG9yYWdlQnl0ZXNgIGFuZCB0aGUgcmVzb3VyY2UgY291bnRzKSBoYXZlIG5vIHBlcmlvZCBhdCBhbGw7IHRoaXNcbiAqIHJldHVybnMgdGhlIGdsb2JhbCB3aW5kb3cgZm9yIHRoZW0gYmVjYXVzZSBjYWxsZXJzIGdhdGUgb25cbiAqIGBxdW90YUFjY3J1YWwodHlwZSkgPT09ICdzdG9jaydgIGJlZm9yZSB1c2luZyBpdCwgYW5kIHJldHVybmluZyBhIGZpZ3VyZSBpc1xuICogbGVzcyBkaXNydXB0aXZlIHRoYW4gbWFraW5nIGV2ZXJ5IGNhbGxlciBoYW5kbGUgYSBudWxsLiBDaGVjayB0aGUgYWNjcnVhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhUGVyaW9kRGF5cyh0eXBlOiBRdW90YVR5cGUpOiBudW1iZXIge1xuICByZXR1cm4gdHlwZSA9PT0gJ2NwdUNyZWRpdHMnID8gQ1BVX0NSRURJVFNfUEVSSU9EX0RBWVMgOiBRVU9UQV9SRVNFVF9EQVlTO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV4dFF1b3RhUmVzZXREYXRlKGRheXM6IG51bWJlciA9IFFVT1RBX1JFU0VUX0RBWVMsIG5vdzogRGF0ZSA9IG5ldyBEYXRlKCkpOiBEYXRlIHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5vdyk7XG4gIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIGRheXMpO1xuICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZGF0ZTtcbn1cbiJdfQ==
|
|
225
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtdGllcnMuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9xdW90YS10aWVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUF3QixNQUFNLGtCQUFrQixDQUFDO0FBRXhGOzs7Ozs7O0dBT0c7QUFDSCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFpQi9HOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLGVBQWUsR0FBcUM7SUFDeEQsZUFBZSxFQUFFLE1BQU0sQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMvRSxZQUFZLEVBQUUsTUFBTSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3pFLDRFQUE0RTtJQUM1RSwrRUFBK0U7SUFDL0UsZ0ZBQWdGO0lBQ2hGLDhFQUE4RTtJQUM5RSxrREFBa0Q7Q0FDTixDQUFDO0FBRS9DLGlGQUFpRjtBQUNqRixNQUFNLFVBQVUsYUFBYSxDQUFDLFNBQWlCO0lBQzdDLE9BQU8sZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxTQUFpQixFQUFFLEtBQWEsRUFBRSxRQUFRLEdBQVcsYUFBYSxDQUFDLFNBQVMsQ0FBQztJQUM5RyxJQUFJLEtBQUssSUFB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Q29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBlbnZCb29sLCBlbnZJbnQsIGVudk5hbWVGcmFnbWVudCwgZW52U3RyIH0gZnJvbSAnLi4vdXRpbHMvZW52LmpzJztcbmltcG9ydCB0eXBlIHsgUXVvdGFUeXBlIH0gZnJvbSAnLi9jb21tb24uanMnO1xuaW1wb3J0IHsgREVGQVVMVF9USUVSX0xJTUlUUywgdGllckxhYmVsLCB0eXBlIFF1b3RhVGllckxpbWl0cyB9IGZyb20gJy4vdGllci1saW1pdHMuanMnO1xuXG4vKipcbiAqIFRoZSBsaW1pdHMgc2hhcGUsIHRoZSBjb2RlLWRlZmF1bHQgdGFibGUgYW5kIHRoZSBzaXppbmcgYXJpdGhtZXRpYyBsaXZlIGluXG4gKiBgLi90aWVyLWxpbWl0cy5qc2Ag4oCUIGRlcGVuZGVuY3ktZnJlZSwgc28gdGhlIEJST1dTRVIgaW1wb3J0cyB0aGVtXG4gKiAoYEBwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlL3RpZXItbGltaXRzYCkgaW5zdGVhZCBvZiBrZWVwaW5nIGEgaGFuZC1zeW5jZWRcbiAqIGNvcHkuIFJlLWV4cG9ydGVkIGhlcmUgYmVjYXVzZSB0aGlzIGlzIHRoZSBtb2R1bGUgZXZlcnkgc2VydmVyIGNvbnN1bWVyIGFuZFxuICogdGhlIHBhY2thZ2UgYmFycmVsIGFscmVhZHkgbmFtZTsgd2hhdCBzdGF5cyBoZXJlIGlzIGV2ZXJ5dGhpbmcgdGhlIGVudlxuICogdG91Y2hlcy5cbiAqL1xuZXhwb3J0IHsgQVVUT01BVElPTl9DQUxMU19TSVpJTkcsIGF1dG9tYXRpb25DYWxsc0ZvciwgREVGQVVMVF9USUVSX0xJTUlUUywgdGllckxhYmVsIH0gZnJvbSAnLi90aWVyLWxpbWl0cy5qcyc7XG5leHBvcnQgdHlwZSB7IFF1b3RhVGllckxpbWl0cyB9IGZyb20gJy4vdGllci1saW1pdHMuanMnO1xuXG4vKiogQXZhaWxhYmxlIHF1b3RhIHRpZXIgaWRlbnRpZmllcnMuXG4gKlxuICogYHVubGltaXRlZGAgaXMgYSBzcGVjaWFsIHRpZXI6IGV2ZXJ5IHF1b3RhIGlzIGAtMWAgKHVuY2FwcGVkKSBhbmQgaXQgaW5jbHVkZXNcbiAqIGV2ZXJ5IGZlYXR1cmUvYWRkLW9uIGJ1bmRsZS4gSXQgaXMgdGhlIERFRkFVTFQgd2hlbiBiaWxsaW5nIGlzIGRpc2FibGVkIChub1xuICogbWV0ZXJpbmcvZW5mb3JjZW1lbnQgc3VyZmFjZSBleGlzdHMsIHNvIG5vdGhpbmcgaXMgY2FwcGVkKSwgYW5kIGl0IGlzIE5FVkVSXG4gKiBzaG93biBvciBzZWxlY3RhYmxlIHdoZW4gYmlsbGluZyBpcyBlbmFibGVkIOKAlCBzZWUgYFNUQU5EQVJEX1RJRVJTYC4gKi9cbmV4cG9ydCB0eXBlIFF1b3RhVGllciA9ICdkZXZlbG9wZXInIHwgJ3BybycgfCAndGVhbScgfCAnYnVzaW5lc3MnIHwgJ2VudGVycHJpc2UnIHwgJ3VubGltaXRlZCc7XG5cbi8qKiBGdWxsIHByZXNldCBmb3IgYSBzaW5nbGUgdGllciAobGFiZWwgKyBsaW1pdHMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YVRpZXJQcmVzZXQge1xuICBsYWJlbDogc3RyaW5nO1xuICBsaW1pdHM6IFF1b3RhVGllckxpbWl0cztcbn1cblxuLyoqXG4gKiBUaGUgU09GVCBiYW5kIGFib3ZlIGEgcXVvdGEncyBjYXAsIHBlciB0eXBlLCBpbiBwZXJjZW50IG9mIHRoZSBsaW1pdC4gQSB0eXBlXG4gKiBhYnNlbnQgZnJvbSB0aGlzIG1hcCBoYXMgTk8gYmFuZCBhbmQgc3RvcHMgaGFyZCBhdCAxMDAlLlxuICpcbiAqIEF0IDEwMCUgdGhlIGFjY291bnQgZ2V0cyB0aGUgXCJyZWFjaGVkXCIgbm90aWNlIGFuZCBrZWVwcyBydW5uaW5nOyB0aGUgcmVmdXNhbFxuICogc3RhcnRzIG9ubHkgcGFzdCBgbGltaXQgw5cgKDEwMCArIHBjdCkgLyAxMDBgLiBSZWFkcyBzdGlsbCBSRVBPUlQgdGhlIG5vbWluYWxcbiAqIGxpbWl0LCBzbyB1c2FnZSBzaG93cyBhYm92ZSAxMDAlIHdoaWxlIGluc2lkZSB0aGUgYmFuZC5cbiAqXG4gKiBUd28gdHlwZXMgcXVhbGlmeSwgZm9yIHRoZSBzYW1lIHJlYXNvbiBzdGF0ZWQgdHdvIHdheXMg4oCUIGEgaGFyZCBzdG9wIGV4YWN0bHlcbiAqIGF0IDEwMCUgaXMgd29yc2UgdGhhbiBhIHNob3J0IG92ZXJydW4gd2hlbiB0aGUgY2FsbGVyIGNhbm5vdCBzaW1wbHkgd2FpdDpcbiAqXG4gKiAtIGBhdXRvbWF0aW9uQ2FsbHNgIChgUVVPVEFfQVVUT01BVElPTl9HUkFDRV9QQ1RgKTogdGhlIGNhbGxlciBpcyBhIHBpcGVsaW5lXG4gKiAgIG1pZC1kZXBsb3ksIG5vdCBhIHBlcnNvbiwgYW5kIHRoZSBjb3VudGVyIHdvdWxkIHN0YXkgZnVsbCBmb3IgdGhlIHJlc3Qgb2ZcbiAqICAgdGhlIHBlcmlvZC5cbiAqIC0gYHN0b3JhZ2VCeXRlc2AgKGBRVU9UQV9TVE9SQUdFX0dSQUNFX1BDVGApOiBzdG9yYWdlIGlzIGEgU1RPQ0sg4oCUIGl0IGRvZXNcbiAqICAgbm90IHJlc2V0LCBzbyB3aXRob3V0IGEgYmFuZCBhIGRvd25ncmFkZSBvciBhIGNhbmNlbGxlZCBwYWNrIGZsaXBzIGFuXG4gKiAgIGFjY291bnQgZnJvbSB3b3JraW5nIHRvIHJlZnVzZWQgd2l0aCBubyBidWZmZXIgYXQgYWxsLCBhbmQgdGhlIHJlbWVkeVxuICogICAocHJ1bmUsIG9yIGJ1eSBjYXBhY2l0eSkgdGFrZXMgdGltZSB0aGUgYmFuZCBpcyB0aGVyZSB0byBwcm92aWRlLiBOb3RlIHRoZVxuICogICBiYW5kIG9uIGEgc3RvY2sgaXMgYSBPTkUtVElNRSBidWZmZXIgcmF0aGVyIHRoYW4gYSBwZXItcGVyaW9kIG9uZTsgdGhhdCBpc1xuICogICBpdHMgcHVycG9zZSBoZXJlLCBub3QgYSBsaW1pdGF0aW9uIG9mIGl0LlxuICpcbiAqIEV2ZXJ5IG90aGVyIHR5cGUgc3RheXMgaGFyZC4gVGhpcyB3YXMgYSBoYXJkY29kZWQgYHF1b3RhVHlwZSAhPT1cbiAqICdhdXRvbWF0aW9uQ2FsbHMnYCBjb21wYXJpc29uLCB3aGljaCBpcyB3aHkgc3RvcmFnZSBoYWQgbm90aGluZzogdGhlXG4gKiBtZWNoYW5pc20gZXhpc3RlZCBhbmQgb25seSB0aGUgcHJlZGljYXRlIGV4Y2x1ZGVkIGl0LlxuICovXG5jb25zdCBRVU9UQV9HUkFDRV9QQ1Q6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIG51bWJlcj4+ID0ge1xuICBhdXRvbWF0aW9uQ2FsbHM6IGVudkludCgnUVVPVEFfQVVUT01BVElPTl9HUkFDRV9QQ1QnLCAxMCwgeyBtaW46IDAsIG1heDogMTAwIH0pLFxuICBzdG9yYWdlQnl0ZXM6IGVudkludCgnUVVPVEFfU1RPUkFHRV9HUkFDRV9QQ1QnLCAxMCwgeyBtaW46IDAsIG1heDogMTAwIH0pLFxuICAvLyBgc2F0aXNmaWVzIFBhcnRpYWw84oCmPmAga2VlcHMgQk9USCBwcm9wZXJ0aWVzIHRoaXMgbWFwIG5lZWRzOiB0aGUga2V5cyBhcmVcbiAgLy8gY2hlY2tlZCBhZ2FpbnN0IGBRdW90YVR5cGVgIChhIHR5cG8nZCBgc3RvcmFnZWJ5dGVzYCB3b3VsZCBvdGhlcndpc2UgbGVhdmUgYVxuICAvLyBiYW5kZWQgcXVvdGEgc3RvcHBpbmcgaGFyZCBhdCAxMDAlLCBzaWxlbnRseSksIHdoaWxlIHRoZSBhbm5vdGF0aW9uIGtlZXBzIHRoZVxuICAvLyBzdHJpbmcgaW5kZXggdGhlIGFjY2Vzc29yIGJlbG93IG5lZWRzIGZvciBhbiB1bnRydXN0ZWQgYHF1b3RhVHlwZWAuIFBhcnRpYWxcbiAgLy8gYmVjYXVzZSBhYnNlbmNlIGlzIG1lYW5pbmdmdWwgaGVyZSDigJQgc2VlIGFib3ZlLlxufSBzYXRpc2ZpZXMgUGFydGlhbDxSZWNvcmQ8UXVvdGFUeXBlLCBudW1iZXI+PjtcblxuLyoqIFRoZSBzb2Z0IGJhbmQgZm9yIGBxdW90YVR5cGVgIGluIHBlcmNlbnQsIG9yIDAgZm9yIGEgdHlwZSB0aGF0IHN0b3BzIGhhcmQuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGFHcmFjZVBjdChxdW90YVR5cGU6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBRVU9UQV9HUkFDRV9QQ1RbcXVvdGFUeXBlXSA/PyAwO1xufVxuXG4vKipcbiAqIFRoZSBsaW1pdCBlbmZvcmNlbWVudCBhY3R1YWxseSBiaW5kcyBvbiBmb3IgYHF1b3RhVHlwZWA6IHRoZSBub21pbmFsIGxpbWl0LFxuICogcGx1cyB0aGUgdHlwZSdzIHtAbGluayBxdW90YUdyYWNlUGN0fSBiYW5kIHdoZXJlIGl0IGhhcyBvbmUuIFVubGltaXRlZCAoLTEpXG4gKiBhbmQgemVybyAoXCJub25lXCIpIGxpbWl0cyBhcmUgcmV0dXJuZWQgdW5jaGFuZ2VkIOKAlCBhIDAgY2FwIGlzIGEgZGVsaWJlcmF0ZVxuICogcmVmdXNhbCwgbm90IGEgYnVkZ2V0IHRvIG92ZXJydW4uXG4gKlxuICoge0BsaW5rIFFVT1RBX0dSQUNFX1BDVH0gZGVjaWRlcyBXSEVUSEVSIGEgdHlwZSBoYXMgYSBiYW5kOyBgZ3JhY2VQY3RgIG9ubHlcbiAqIHNpemVzIGl0LiBTbyBhbiBleHBsaWNpdCBwZXJjZW50YWdlIHBhc3NlZCBmb3IgYW4gdW5iYW5kZWQgdHlwZSBzdGlsbCB5aWVsZHNcbiAqIHRoZSBub21pbmFsIGxpbWl0LCByYXRoZXIgdGhhbiBxdWlldGx5IGdyYW50aW5nIGEgYmFuZCB0aGUgdHlwZSBpcyBub3QgbWVhbnRcbiAqIHRvIGhhdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmZvcmNlZFF1b3RhTGltaXQocXVvdGFUeXBlOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIsIGdyYWNlUGN0OiBudW1iZXIgPSBxdW90YUdyYWNlUGN0KHF1b3RhVHlwZSkpOiBudW1iZXIge1xuICBpZiAobGltaXQgPD0gMCB8fCBncmFjZVBjdCA8PSAwIHx8IHF1b3RhR3JhY2VQY3QocXVvdGFUeXBlKSA8PSAwKSByZXR1cm4gbGltaXQ7XG4gIHJldHVybiBNYXRoLmZsb29yKChsaW1pdCAqICgxMDAgKyBncmFjZVBjdCkpIC8gMTAwKTtcbn1cblxuLyoqXG4gKiBSZWFkIGEgdGllciBMSU1JVCBlbnYgdmFyLiBgLTFgID0gdW5saW1pdGVkOyBhbnl0aGluZyBiZWxvdyB0aGF0IGlzIG5vbnNlbnNlXG4gKiAoYSBgLTVgIGxpbWl0IHdvdWxkIHNoaXAgYSBicm9rZW4gZmluaXRlIGNhcCksIHNvIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGNvZGVcbiAqIGRlZmF1bHQgcmF0aGVyIHRoYW4gY2xhbXBpbmcgdXAgdG8gYC0xYC4gVGhlIHBhcnNpbmcgaXRzZWxmIGlzIGFwaS1jb3JlJ3NcbiAqIHNoYXJlZCBgZW52SW50YCDigJQgc3RyaWN0IGFib3V0IGRlY2ltYWxzL2dhcmJhZ2Ug4oCUIG5vdCBhIGxvY2FsIHJlLWRlcml2YXRpb24uXG4gKi9cbmZ1bmN0aW9uIHRpZXJMaW1pdEVudihuYW1lOiBzdHJpbmcsIGZhbGxiYWNrOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBuID0gZW52SW50KG5hbWUsIGZhbGxiYWNrKTtcbiAgcmV0dXJuIG4gPCAtMSA/IGZhbGxiYWNrIDogbjtcbn1cblxuLyoqXG4gKiBQZXItdGllciBsaW1pdHMsIGVhY2ggb3ZlcnJpZGFibGUgdmlhIGBRVU9UQV9USUVSXzxUSUVSPl88TElNSVQ+YCBlbnYgdmFyc1xuICogKGUuZy4gYFFVT1RBX1RJRVJfUFJPX1BJUEVMSU5FUz0yNTBgLCBgUVVPVEFfVElFUl9ERVZFTE9QRVJfU1RPUkFHRV9CWVRFUz0uLi5gKS5cbiAqIFVuc2V0L2VtcHR5IOKGkiB0aGUgY29kZSBkZWZhdWx0LiBgLTFgID0gdW5saW1pdGVkLiBSZWFkIG9uY2UgYXQgbW9kdWxlIGxvYWQg4oCUXG4gKiBvbiBrOHMgdGhlc2UgZmxvdyBpbiB2aWEgdGhlIGBhcHAtZW52YCBDb25maWdNYXAgKGJ1aWx0IGZyb20gYC5lbnZgKS5cbiAqL1xuZnVuY3Rpb24gdGllckxpbWl0cyh0aWVyOiBRdW90YVRpZXIpOiBRdW90YVRpZXJMaW1pdHMge1xuICAvLyBgdW5saW1pdGVkYCBpcyB1bmNhcHBlZCBCWSBERUZJTklUSU9OOiBFVkVSWSBxdW90YSBpcyAtMSBhbmQgaXQgaXMgTk9UXG4gIC8vIGVudi1vdmVycmlkYWJsZS4gUmVhZGluZyBRVU9UQV9USUVSX1VOTElNSVRFRF8qIGhlcmUgd291bGQgbGV0IGEgc3RyYXkgZW52XG4gIC8vIHZhciBzaWxlbnRseSBjYXAgdGhlIGJpbGxpbmctRElTQUJMRUQgZGVmYXVsdCB0aWVyIOKAlCBzdXJmYWNpbmcgYXMgYSBzcHVyaW91c1xuICAvLyBcInF1b3RhIGV4Y2VlZGVkXCIgb24gYSBkZXBsb3kgdGhhdCBtZXRlcnMgbm90aGluZy4gRGVyaXZlIC0xIGZvciBldmVyeSBmaWVsZFxuICAvLyBmcm9tIHRoZSBsaW1pdHMgc2hhcGUgc28gYSBuZXdseS1hZGRlZCBxdW90YSBpcyB1bmNhcHBlZCBoZXJlIGF1dG9tYXRpY2FsbHkuXG4gIGlmICh0aWVyID09PSAndW5saW1pdGVkJykge1xuICAgIGNvbnN0IHVuY2FwcGVkID0geyAuLi5ERUZBVUxUX1RJRVJfTElNSVRTLnVubGltaXRlZCB9O1xuICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyh1bmNhcHBlZCkgYXMgKGtleW9mIFF1b3RhVGllckxpbWl0cylbXSkgdW5jYXBwZWRba10gPSAtMTtcbiAgICByZXR1cm4gdW5jYXBwZWQ7XG4gIH1cbiAgY29uc3QgZCA9IERFRkFVTFRfVElFUl9MSU1JVFNbdGllcl07XG4gIGNvbnN0IFQgPSB0aWVyLnRvVXBwZXJDYXNlKCk7XG4gIC8vIEtleWVkIG9mZiB0aGUgbGltaXRzIHRhYmxlIHJhdGhlciB0aGFuIHNldmVudGVlbiBoYW5kLXdyaXR0ZW4gbGluZXMsIHNvIGFcbiAgLy8gbmV3bHktYWRkZWQgbGltaXQgaXMgZW52LW92ZXJyaWRhYmxlIHRoZSBtb21lbnQgaXQgaGFzIGEgZGVmYXVsdCDigJQgdGhlIGhhbmRcbiAgLy8gbGlzdCBtYWRlIHRoYXQgYSBzZWNvbmQgZWRpdCwgaW4gYSBmaWxlIHdoZXJlIGZvcmdldHRpbmcgaXQgeWllbGRzIGEga25vYlxuICAvLyB0aGUgZG9jcyBkZXNjcmliZSBhbmQgdGhlIGNvZGUgaWdub3Jlcy5cbiAgY29uc3Qgb3V0ID0geyAuLi5kIH07XG4gIGZvciAoY29uc3QgZmllbGQgb2YgT2JqZWN0LmtleXMob3V0KSBhcyAoa2V5b2YgUXVvdGFUaWVyTGltaXRzKVtdKSB7XG4gICAgLy8gVGhlIGtub2IgbmFtZXMgYXJlIERFUklWRUQgZnJvbSB0aGUgZmllbGQgbmFtZXMgKGBlbnZOYW1lRnJhZ21lbnRgKSwgd2hpY2hcbiAgICAvLyBpcyB3aHkgYHRlc3QvcXVvdGEtdGllcnMudGVzdC50c2AgcGlucyB0aGUgZnVsbCBzZXQgb2Ygc2V2ZW50ZWVuOiBhIGZpZWxkXG4gICAgLy8gcmVuYW1lIHdvdWxkIG90aGVyd2lzZSBtb3ZlIHNvbWVib2R5J3MgY29uZmlndXJlZCBrbm9iIHdpdGhvdXQgYSB3b3JkLlxuICAgIG91dFtmaWVsZF0gPSB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV8ke2Vudk5hbWVGcmFnbWVudChmaWVsZCl9YCwgZFtmaWVsZF0pO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBBbGwgdmFsaWQgdGllciBuYW1lcyAoaW5jbC4gYHVubGltaXRlZGApLCBpbiBsYWRkZXIgb3JkZXIuIFVzZWQgZm9yIHZhbGlkYXRpb25cbiAqICBvZiBhICpzdG9yZWQqIHRpZXIg4oCUIGB1bmxpbWl0ZWRgIGlzIGEgdmFsaWQgdmFsdWUgZXZlbiB0aG91Z2ggaXQncyBuZXZlclxuICogIG9mZmVyZWQgZm9yIHNhbGUuIERlcml2ZWQgZnJvbSB0aGUgY29kZS1kZWZhdWx0IGxpbWl0cyB0YWJsZSwgd2hpY2ggaXMgdGhlIG9uZVxuICogIHBsYWNlIGEgdGllciBjYW5ub3QgYmUgYWRkZWQgd2l0aG91dCBiZWluZyBnaXZlbiBudW1iZXJzLiAqL1xuZXhwb3J0IGNvbnN0IFZBTElEX1RJRVJTOiByZWFkb25seSBRdW90YVRpZXJbXSA9IE9iamVjdC5rZXlzKERFRkFVTFRfVElFUl9MSU1JVFMpIGFzIFF1b3RhVGllcltdO1xuXG4vKipcbiAqIEV2ZXJ5IHRpZXIncyBwcmVzZXQsIGtleWVkIG9mZiB7QGxpbmsgVkFMSURfVElFUlN9IHJhdGhlciB0aGFuIHdyaXR0ZW4gb3V0XG4gKiB0aWVyIGJ5IHRpZXIg4oCUIGEgdGllciBhZGRlZCB0byB0aGUgbGltaXRzIHRhYmxlIGdldHMgaXRzIHByZXNldCBoZXJlIHdpdGggbm9cbiAqIHNlY29uZCBlZGl0LlxuICpcbiAqIFRoZSBsYWJlbCBkZWZhdWx0cyB0byB7QGxpbmsgdGllckxhYmVsfSBvZiB0aGUga2V5IChcImJ1c2luZXNzXCIg4oaSIFwiQnVzaW5lc3NcIixcbiAqIFwicHJvX3BsdXNcIiDihpIgXCJQcm8gUGx1c1wiKSwgd2hpY2ggaXMgd2hhdCBhbGwgc2l4IHdlcmUgc3BlbGxlZCBhcyBieSBoYW5kLCBhbmRcbiAqIHN0YXlzIG92ZXJyaWRhYmxlIHZpYSBgUVVPVEFfVElFUl88VElFUj5fTEFCRUxgIGZvciBhIGRlcGxveW1lbnQgdGhhdCB3YW50cyBpdHNcbiAqIG93biB3b3JkaW5nIOKAlCBvciBmb3IgYSBrZXkgdGhlIGRlcml2YXRpb24gY2Fubm90IGdldCByaWdodCwgc3VjaCBhcyBhbiBhY3JvbnltLlxuICogRGlzcGxheSBuYW1lIG9ubHk6IGl0IG5ldmVyIGFmZmVjdHMgYSBsaW1pdC5cbiAqL1xuZXhwb3J0IGNvbnN0IFFVT1RBX1RJRVJTOiBSZWNvcmQ8UXVvdGFUaWVyLCBRdW90YVRpZXJQcmVzZXQ+ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICBWQUxJRF9USUVSUy5tYXAoKHRpZXIpID0+IFt0aWVyLCB7XG4gICAgbGFiZWw6IGVudlN0cihgUVVPVEFfVElFUl8ke3RpZXIudG9VcHBlckNhc2UoKX1fTEFCRUxgLCB0aWVyTGFiZWwodGllcikpLFxuICAgIGxpbWl0czogdGllckxpbWl0cyh0aWVyKSxcbiAgfV0pLFxuKSBhcyBSZWNvcmQ8UXVvdGFUaWVyLCBRdW90YVRpZXJQcmVzZXQ+O1xuXG4vKiogVGhlIHN0YW5kYXJkLCBiaWxsaW5nLXNlbGVjdGFibGUgdGllcnMg4oCUIHRoZSBvbmVzIG9mZmVyZWQgYXMgcHVyY2hhc2FibGUgcGxhbnNcbiAqICBhbmQgc2hvd24gaW4gdGllciBwaWNrZXJzLiBEZXJpdmVkIGFzIFwiZXZlcnkgdmFsaWQgdGllciBleGNlcHQgYHVubGltaXRlZGBcIixcbiAqICB3aGljaCBpcyB0aGUgYmlsbGluZy1ESVNBQkxFRCBkZWZhdWx0IGFuZCBpcyBuZXZlciBkaXNwbGF5ZWQvc2VsZWN0YWJsZSB3aGVuXG4gKiAgYmlsbGluZyBpcyBlbmFibGVkLiBLZXB0IERSWSBvZmYgYFZBTElEX1RJRVJTYCBzbyBhZGRpbmcgYSB0aWVyIGZsb3dzIHRocm91Z2guICovXG5leHBvcnQgY29uc3QgU1RBTkRBUkRfVElFUlM6IHJlYWRvbmx5IFF1b3RhVGllcltdID0gVkFMSURfVElFUlMuZmlsdGVyKCh0KSA9PiB0ICE9PSAndW5saW1pdGVkJyk7XG5cbi8qKiBUaWVycyB0aGF0IHBlcm1pdCB0aGUgb3JnIOKGkiB0ZWFtIGhpZXJhcmNoeSAobmVzdGluZyB0ZWFtcyB1bmRlciBhIHJvb3QpLiBUaGVcbiAqICBiaWxsaW5nLW9mZiBgdW5saW1pdGVkYCB0aWVyIGlzIHRlYW0tY2FwYWJsZSAoaXQncyB0aGUgbW9zdCBwZXJtaXNzaXZlKTsgdGhlXG4gKiAgZW50cnktbGV2ZWwgYGRldmVsb3BlcmAvYHByb2AgdGllcnMgYXJlIG5vdC4gU2luZ2xlIHNvdXJjZSBmb3IgdGhlIHBhcmVudC1cbiAqICBlbGlnaWJpbGl0eSArIGRvd25ncmFkZS1vdmVyY2FwIGNoZWNrcyBzbyB0aGV5IGNhbid0IGRyaWZ0LiAqL1xuZXhwb3J0IGNvbnN0IFRFQU1fQ0FQQUJMRV9USUVSUzogcmVhZG9ubHkgUXVvdGFUaWVyW10gPSBbJ3RlYW0nLCAnYnVzaW5lc3MnLCAnZW50ZXJwcmlzZScsICd1bmxpbWl0ZWQnXTtcbmV4cG9ydCBmdW5jdGlvbiB0aWVyQWxsb3dzVGVhbXModGllcjogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISF0aWVyICYmIChURUFNX0NBUEFCTEVfVElFUlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHRpZXIpO1xufVxuXG4vKiogVGllcnMgdGhhdCBtYXkgYnV5IGV4dHJhIHNlYXRzIOKAlCBiaWxsaW5nJ3MgcGVyLXNlYXQgYHNlYXRgIGFkZC1vbi4gU2VhdHMgYXJlXG4gKiAgdGhlIFRlYW0gZGlmZmVyZW50aWF0b3IsIHNvIHRoZSBzaW5nbGUtc2VhdCBgZGV2ZWxvcGVyYC9gcHJvYCB0aWVycyBjYW5ub3RcbiAqICBzdGFjayB0aGVtIGFuZCBtdXN0IHVwZ3JhZGUgaW5zdGVhZDsgYHVubGltaXRlZGAgaGFzIG5vIHNlYXQgY2FwIGF0IGFsbC5cbiAqICBTaW5nbGUgc291cmNlIGZvciB0aGUgYmlsbGluZyBjYXRhbG9nIGFuZCBldmVyeSBcIm91dCBvZiBzZWF0c1wiIG1lc3NhZ2UuICovXG5leHBvcnQgY29uc3QgU0VBVF9QQUNLX1RJRVJTOiByZWFkb25seSBRdW90YVRpZXJbXSA9IFsndGVhbScsICdidXNpbmVzcycsICdlbnRlcnByaXNlJ107XG5cbi8qKiBIb3cgYW4gYWNjb3VudCB0aGF0IGhhcyB1c2VkIGV2ZXJ5IHNlYXQgY2FuIGdldCBhbm90aGVyLiAqL1xuZXhwb3J0IHR5cGUgU2VhdFJlbWVkeSA9ICd1cGdyYWRlJyB8ICdzZWF0X3BhY2snO1xuXG4vKipcbiAqIFRoZSByZW1lZHkgdG8gb2ZmZXIgYW4gYWNjb3VudCBhdCBpdHMgc2VhdCBjYXAsIGZyb20gdGhlIEFDQ09VTlQncyAocm9vdCkgdGllcjpcbiAqIGBzZWF0X3BhY2tgIHdoZXJlIHNlYXRzIGNhbiBiZSBib3VnaHQsIGB1cGdyYWRlYCBvbiB0aGUgc2luZ2xlLXNlYXQgdGllcnMuXG4gKiBgbnVsbGAgd2hlbiB0aGUgdGllciBpcyB1bmtub3duIG9yIGhhcyBubyBjYXAg4oCUIHNheSBub3RoaW5nIHJhdGhlciB0aGFuIGd1ZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VhdFJlbWVkeSh0aWVyOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogU2VhdFJlbWVkeSB8IG51bGwge1xuICBpZiAoIXRpZXIgfHwgIWlzVmFsaWRUaWVyKHRpZXIpIHx8IHRpZXIgPT09ICd1bmxpbWl0ZWQnKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIChTRUFUX1BBQ0tfVElFUlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHRpZXIpID8gJ3NlYXRfcGFjaycgOiAndXBncmFkZSc7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBiaWxsaW5nIHNlcnZpY2UgaXMgZW5hYmxlZCBpbiB0aGlzIGRlcGxveW1lbnQgKGBCSUxMSU5HX0VOQUJMRURgLFxuICogIG9wdC1vdXQgZGVmYXVsdC1vbiDigJQgbWlycm9ycyB0aGUgYmlsbGluZy9wbGF0Zm9ybSBjb25maWdzKS4gV2l0aCBiaWxsaW5nIE9GRlxuICogIHRoZXJlJ3Mgbm8gbWV0ZXJpbmcvZW5mb3JjZW1lbnQgc3VyZmFjZSwgc28gdGhlIGRlZmF1bHQgdGllciBpcyBgdW5saW1pdGVkYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbGxpbmdFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZW52Qm9vbCgnQklMTElOR19FTkFCTEVEJywgdHJ1ZSk7XG59XG5cbi8qKlxuICogRGVmYXVsdCB0aWVyIGFzc2lnbmVkIHRvIG5ldyBvcmdhbml6YXRpb25zLlxuICogLSBCaWxsaW5nIERJU0FCTEVEIOKGkiBgdW5saW1pdGVkYCAobm90aGluZyBpcyBtZXRlcmVkLCBzbyBldmVyeXRoaW5nIGlzIHVuY2FwcGVkKS5cbiAqIC0gQmlsbGluZyBFTkFCTEVEICDihpIgYERFRkFVTFRfUVVPVEFfVElFUmAgaWYgaXQncyBhIHZhbGlkIHN0YW5kYXJkIHRpZXIsIGVsc2UgYGRldmVsb3BlcmAuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJRVI6IFF1b3RhVGllciA9ICFpc0JpbGxpbmdFbmFibGVkKClcbiAgPyAndW5saW1pdGVkJ1xuICA6IChpc1ZhbGlkVGllcihwcm9jZXNzLmVudi5ERUZBVUxUX1FVT1RBX1RJRVIgPz8gJycpICYmIHByb2Nlc3MuZW52LkRFRkFVTFRfUVVPVEFfVElFUiAhPT0gJ3VubGltaXRlZCdcbiAgICA/IChwcm9jZXNzLmVudi5ERUZBVUxUX1FVT1RBX1RJRVIgYXMgUXVvdGFUaWVyKVxuICAgIDogJ2RldmVsb3BlcicpO1xuXG4vKiogQ2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIFF1b3RhVGllci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVGllcih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgUXVvdGFUaWVyIHtcbiAgLy8gVXNlIHRoZSBleHBsaWNpdCB0dXBsZSwgbm90IGB2YWx1ZSBpbiBRVU9UQV9USUVSU2A6IGBpbmAgd2Fsa3MgdGhlIHByb3RvdHlwZVxuICAvLyBjaGFpbiwgc28gaW5oZXJpdGVkIE9iamVjdCBrZXlzICgndG9TdHJpbmcnLCAnY29uc3RydWN0b3InLCDigKYpIHdvdWxkIHJldHVyblxuICAvLyB0cnVlIGFuZCB0aGVuIGBnZXRUaWVyTGltaXRzYCB3b3VsZCByZWFkIGAubGltaXRzYCBvZmYgYSBmdW5jdGlvbiDihpIgY3Jhc2guXG4gIC8vIGB0aWVyYCBpcyBhdHRhY2tlci1pbmZsdWVuY2VhYmxlIChKV1QgLyByZXF1ZXN0IGJvZHkgLyBERUZBVUxUX1FVT1RBX1RJRVIgZW52KS5cbiAgcmV0dXJuIChWQUxJRF9USUVSUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpO1xufVxuXG4vKiogR2V0IHRoZSBkZWZhdWx0IGxpbWl0cyBmb3IgYSBnaXZlbiB0aWVyIChmYWxscyBiYWNrIHRvIGRldmVsb3BlcikuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGllckxpbWl0cyh0aWVyOiBzdHJpbmcpOiBRdW90YVRpZXJMaW1pdHMge1xuICByZXR1cm4gaXNWYWxpZFRpZXIodGllcikgPyBRVU9UQV9USUVSU1t0aWVyXS5saW1pdHM6IFFVT1RBX1RJRVJTLmRldmVsb3Blci5saW1pdHM7XG59XG5cbi8qKlxuICogVGhlIHBlcmlvZCAoZGF5cykgZXZlcnkgdXNhZ2UgY291bnRlciByb2xscyBvdmVyIG9uLiBBbGwgcXVvdGFzIGFyZSBwZXItcGVyaW9kXG4gKiBGTE9XIGNvdW50ZXJzIG9uIG9uZSBzaGFyZWQgcGVyaW9kOiB0aGUgcXVvdGEgc2VydmljZSByZXNldHMgYSBjb3VudGVyIHRoaXNcbiAqIG1hbnkgZGF5cyBhZnRlciBpdCBleHBpcmVzLCBhbmQgcGxhdGZvcm0gc2VlZHMgYSBuZXcgb3JnJ3MgY291bnRlcnMgd2l0aCB0aGVcbiAqIHNhbWUgd2luZG93IChgUVVPVEFfUkVTRVRfREFZU2AsIGRlZmF1bHQgMykuXG4gKi9cbmV4cG9ydCBjb25zdCBRVU9UQV9SRVNFVF9EQVlTID0gZW52SW50KCdRVU9UQV9SRVNFVF9EQVlTJywgMywgeyBtaW46IDEgfSk7XG5cbi8qKiBUaGUgbmV4dCBxdW90YSByZXNldDogbG9jYWwgbWlkbmlnaHQgYGRheXNgIGZyb20gYG5vd2AuICovXG4vKipcbiAqIFRoZSBgY3B1Q3JlZGl0c2AgcGVyaW9kLCBpbiBkYXlzLiBBIE1PTlRIIHJhdGhlciB0aGFuIHRoZSBnbG9iYWwgdGhyZWUtZGF5XG4gKiB3aW5kb3csIGJlY2F1c2UgYnVpbGQgZGVtYW5kIGlzIGJ1cnN0eSBpbiBhIHdheSBBUEkgdHJhZmZpYyBpcyBub3Q6IGEgZnVsbFxuICogY2F0YWxvZ3VlIHJlYnVpbGQgaXMgYSBkYXkncyB3b3JrIHRoYXQgYXJyaXZlcyBvbiBvbmUgZGF5LCBhbmQgYSB0aHJlZS1kYXlcbiAqIHdpbmRvdyByZWZ1c2VzIGl0IHdoaWxlIHRoZSBhY2NvdW50IGhvbGRzIG1vc3Qgb2YgYSBtb250aCdzIGJ1ZGdldCB1bnNwZW50LlxuICovXG5leHBvcnQgY29uc3QgQ1BVX0NSRURJVFNfUEVSSU9EX0RBWVMgPSBlbnZJbnQoJ1FVT1RBX0NQVV9DUkVESVRTX1BFUklPRF9EQVlTJywgMzAsIHsgbWluOiAxIH0pO1xuXG4vKipcbiAqIFRoZSB1c2FnZSBwZXJpb2QgZm9yIE9ORSBxdW90YSB0eXBlLCBpbiBkYXlzLlxuICpcbiAqIEV2ZXJ5IGZsb3cgcXVvdGEgYnV0IGBjcHVDcmVkaXRzYCByb2xscyBvbiB0aGUgZ2xvYmFsIHtAbGluayBRVU9UQV9SRVNFVF9EQVlTfS5cbiAqIENyZWRpdHMgYXJlIG1vbnRobHksIHdoaWNoIG1ha2VzIHRoZSBwZXJpb2QgYSBQRVItVFlQRSBmYWN0IOKAlCBzbyBhbnl0aGluZyB0aGF0XG4gKiBjb21wdXRlcyBhIHJlc2V0IGRhdGUsIGEgXCJyZXNldHMgaW4gTiBkYXlzXCIgbGluZSBvciBhIGJ1cm4tcmF0ZSBmb3JlY2FzdCBoYXNcbiAqIHRvIGFzayBmb3IgdGhlIHR5cGUncyBvd24gcGVyaW9kIHJhdGhlciB0aGFuIHJlYWRpbmcgdGhlIGdsb2JhbCBjb25zdGFudC4gQVxuICogZm9yZWNhc3QgYWdhaW5zdCB0aGUgd3Jvbmcgd2luZG93IGlzIHdyb25nIGJ5IGEgZmFjdG9yIG9mIHRlbi5cbiAqXG4gKiBTdG9ja3MgKGBzdG9yYWdlQnl0ZXNgIGFuZCB0aGUgcmVzb3VyY2UgY291bnRzKSBoYXZlIG5vIHBlcmlvZCBhdCBhbGw7IHRoaXNcbiAqIHJldHVybnMgdGhlIGdsb2JhbCB3aW5kb3cgZm9yIHRoZW0gYmVjYXVzZSBjYWxsZXJzIGdhdGUgb25cbiAqIGBxdW90YUFjY3J1YWwodHlwZSkgPT09ICdzdG9jaydgIGJlZm9yZSB1c2luZyBpdCwgYW5kIHJldHVybmluZyBhIGZpZ3VyZSBpc1xuICogbGVzcyBkaXNydXB0aXZlIHRoYW4gbWFraW5nIGV2ZXJ5IGNhbGxlciBoYW5kbGUgYSBudWxsLiBDaGVjayB0aGUgYWNjcnVhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhUGVyaW9kRGF5cyh0eXBlOiBRdW90YVR5cGUpOiBudW1iZXIge1xuICByZXR1cm4gdHlwZSA9PT0gJ2NwdUNyZWRpdHMnID8gQ1BVX0NSRURJVFNfUEVSSU9EX0RBWVMgOiBRVU9UQV9SRVNFVF9EQVlTO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV4dFF1b3RhUmVzZXREYXRlKGRheXM6IG51bWJlciA9IFFVT1RBX1JFU0VUX0RBWVMsIG5vdzogRGF0ZSA9IG5ldyBEYXRlKCkpOiBEYXRlIHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5vdyk7XG4gIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIGRheXMpO1xuICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZGF0ZTtcbn1cbiJdfQ==
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* (`admin.superadmin.grant`, `org.ownership.transfer`, `user.login`, …). Keep
|
|
18
18
|
* this list free of any platform-only action.
|
|
19
19
|
*/
|
|
20
|
-
export declare const REMOTE_AUDIT_ACTIONS: readonly ['plugin.build.completed', 'plugin.build.failed', 'plugin.build.timeout', 'plugin.scan.skipped', 'plugin.vuln.waived', 'plugin.vuln.flagged', 'plugin.vuln.cleared', 'plugin.delete', 'plugin.restore', 'plugin.purge', 'plugin.update', 'plugin.upload', 'plugin.deploy', 'plugin.bulk.update', 'plugin.bulk.delete', 'plugin.dlq.purge', 'plugin.build.retry', 'plugin.dlq.replay', 'pipeline.create', 'pipeline.update', 'pipeline.delete', 'pipeline.restore', 'pipeline.purge', 'pipeline_template.create', 'pipeline_template.update', 'pipeline_template.delete', 'pipeline_template.restore', 'pipeline_template.purge', 'pipeline.execution.start', 'pipeline.execution.cancel', 'pipeline.registry.register', 'pipeline.registry.deregister', 'quota.reset', 'quota.limit.update', 'quota.delete', 'quota.notice_settings.update', 'compliance.exemption.approve', 'compliance.exemption.revoke', 'compliance.exemption.request', 'compliance.exemption.reject', 'compliance.rule.toggle', 'compliance.rule.create', 'compliance.rule.update', 'compliance.rule.delete', 'compliance.rule.restore', 'compliance.rule.purge', 'compliance.policy.create', 'compliance.policy.update', 'compliance.policy.delete', 'compliance.policy.restore', 'compliance.policy.purge', 'compliance.scan-schedule.create', 'compliance.scan-schedule.update', 'compliance.scan-schedule.delete', 'compliance.template.apply', 'compliance.scan.create', 'compliance.scan.cancel', 'compliance.scan.complete', 'compliance.subscription.auto-subscribe', 'compliance.notification-preference.update', 'registry.gc', 'registry.image.delete', 'registry.image.copy', 'registry.image.sign', 'registry.token.issue', 'registry.quarantine.credential.mint', 'message.announcement.create', 'message.delete', 'message.restore', 'message.purge', 'message.update', 'message.attachment.upload', 'message.notify.internal', 'message.org.purge', 'support.case.open', 'support.case.reply', 'support.case.status', 'support.case.severity', 'support.case.assign', 'support.case.transfer', 'support.oncall.acknowledged', 'support.oncall.escalated', 'support.oncall.test', 'support.oncall.paged', 'support.contact.designate', 'support.contact.revoke', 'support.contact.upgrade', 'support.contact.downgrade', 'support.case.note', 'support.canned.write', 'billing.subscription.create', 'billing.subscription.update', 'billing.subscription.reactivate', 'billing.subscription.cancel', 'billing.subscription.delete', 'billing.tier.override', 'billing.support-floor.override', 'billing.support-incident.grant', 'billing.addon.add', 'billing.addon.remove', 'billing.addon.prune', 'billing.discount.generate', 'billing.discount.issue', 'billing.discount.apply', 'billing.discount.remove', 'billing.discount.revoke', 'billing.campaign.create', 'billing.campaign.update', 'billing.campaign.end', 'billing.promotion.create', 'billing.promotion.update', 'billing.promotion.revoke', 'billing.promotion.grant', 'billing.promotion.activate', 'billing.offer.sent', 'billing.offer.withdrawn', 'billing.offer.declined', 'billing.offer.dismissed', 'billing.offer.exclusion.set', 'billing.offer.exclusion.cleared', 'billing.offer.trigger', 'billing.credit.consumed', 'billing.credit.exhausted', 'billing.combo.expired', 'reporting.settings.update', 'reporting.deployment.outcome', 'reporting.retention.sync', 'reporting.report.definition.create', 'reporting.report.definition.update', 'reporting.report.definition.delete', 'reporting.report.ownership.transfer', 'reporting.report.published', 'reporting.report.republished', 'reporting.report.link.created', 'reporting.report.link.revoked', 'reporting.report.recipient.added', 'reporting.report.recipient.removed', 'reporting.report.policy.update', 'reporting.report.paused', 'reporting.report.resumed', 'reporting.report.run.compose', 'reporting.report.run.notes', 'reporting.report.run.summary', 'reporting.report.recipient.resend', 'reporting.report.recipient.verified', 'reporting.report.recipient.unsubscribed', 'reporting.ingest.batch', 'reporting.ingest.rejected', 'reporting.incident.record', 'authz.denied', 'ask.query', 'ask.agent.turn', 'ask.feedback', 'pipeline.ai.generate', 'plugin.ai.generate', 'publisher.create', 'publisher.update', 'publisher.terms.accept', 'publisher.verify.request', 'publisher.verify.approve', 'publisher.verify.reject', 'publisher.tier.change', 'publisher.suspend', 'publisher.unsuspend', 'publisher.transfer.request', 'publisher.transfer.accept', 'publisher.transfer.decline', 'publisher.transfer.approve', 'publisher.transfer.reject', 'publisher.profile-change.approve', 'publisher.profile-change.reject', 'plugin.request.submit', 'plugin.request.withdraw', 'plugin.request.approve', 'plugin.request.second-approve', 'plugin.request.reject', 'plugin.request.auto-approve', 'plugin.listing.publish', 'plugin.listing.update', 'plugin.listing.state.change', 'plugin.listing.pause', 'plugin.listing.unpause', 'plugin.version.pause', 'plugin.version.yank', 'plugin.version.unyank', 'plugin.version.deprecate', 'plugin.version.prune', 'ecosystem.auto-approval-rule.create', 'ecosystem.auto-approval-rule.update', 'ecosystem.auto-approval-rule.delete', 'ecosystem.reserved-name.update', 'ecosystem.bootstrap.open', 'ecosystem.bootstrap.close', 'registry.image.publish', 'registry.image.resign', 'registry.image.yank', 'registry.image.gc', 'plugin.install.request', 'plugin.install.approve', 'plugin.install.deny', 'plugin.install.create', 'plugin.install.upgrade', 'plugin.install.change-request', 'plugin.install.change-approve', 'plugin.install.change-reject', 'plugin.install.remove', 'org.plugin-install-policy.update', 'plugin.shadowing.denied', 'plugin.review.create', 'plugin.review.update', 'plugin.review.delete', 'plugin.review.report', 'plugin.review.hold', 'plugin.review.release', 'plugin.review.remove', 'plugin.review.anonymize', 'plugin.review.reply.create', 'plugin.review.reply.update', 'plugin.review.reply.delete', 'plugin.submission.create', 'plugin.submission.verify', 'plugin.submission.gate-fail', 'plugin.submission.approve', 'plugin.submission.reject', 'plugin.submission.claim', 'plugin.submission.expire', 'plugin.advisory.create', 'plugin.advisory.update', 'plugin.advisory.publish', 'plugin.advisory.withdraw', 'plugin.security_notifications.update', 'plugin.security_notifications.external_email.verify', 'plugin.security_notifications.test', 'plugin.setup_image.promoted', 'plugin.setup_image.promote_refused', 'plugin.setup_image.kept', 'plugin.setup_image.discarded', 'pipeline.vuln.accepted', 'pipeline.vuln.false_positive', 'pipeline.vuln.reopened', 'pipeline.runtime_check.flagged', 'pipeline.plugin.upgraded', 'pipeline.security_report.upload'];
|
|
20
|
+
export declare const REMOTE_AUDIT_ACTIONS: readonly ['plugin.build.completed', 'plugin.build.failed', 'plugin.build.timeout', 'plugin.scan.skipped', 'plugin.vuln.waived', 'plugin.vuln.flagged', 'plugin.vuln.cleared', 'plugin.delete', 'plugin.restore', 'plugin.purge', 'plugin.update', 'plugin.upload', 'plugin.deploy', 'plugin.bulk.update', 'plugin.bulk.delete', 'plugin.dlq.purge', 'plugin.build.retry', 'plugin.dlq.replay', 'pipeline.create', 'pipeline.update', 'pipeline.delete', 'pipeline.restore', 'pipeline.purge', 'pipeline_template.create', 'pipeline_template.update', 'pipeline_template.delete', 'pipeline_template.restore', 'pipeline_template.purge', 'pipeline.execution.start', 'pipeline.execution.cancel', 'pipeline.registry.register', 'pipeline.registry.deregister', 'quota.reset', 'quota.limit.update', 'quota.delete', 'quota.notice_settings.update', 'compliance.exemption.approve', 'compliance.exemption.revoke', 'compliance.exemption.request', 'compliance.exemption.reject', 'compliance.rule.toggle', 'compliance.rule.create', 'compliance.rule.update', 'compliance.rule.delete', 'compliance.rule.restore', 'compliance.rule.purge', 'compliance.policy.create', 'compliance.policy.update', 'compliance.policy.delete', 'compliance.policy.restore', 'compliance.policy.purge', 'compliance.scan-schedule.create', 'compliance.scan-schedule.update', 'compliance.scan-schedule.delete', 'compliance.template.apply', 'compliance.scan.create', 'compliance.scan.cancel', 'compliance.scan.complete', 'compliance.subscription.auto-subscribe', 'compliance.notification-preference.update', 'registry.gc', 'registry.image.delete', 'registry.image.copy', 'registry.image.sign', 'registry.token.issue', 'registry.quarantine.credential.mint', 'message.announcement.create', 'message.delete', 'message.hide', 'message.unhide', 'message.restore', 'message.purge', 'message.update', 'message.attachment.upload', 'message.notify.internal', 'message.org.purge', 'support.case.open', 'support.case.reply', 'support.case.status', 'support.case.severity', 'support.case.assign', 'support.case.transfer', 'support.oncall.acknowledged', 'support.oncall.escalated', 'support.oncall.test', 'support.oncall.paged', 'support.contact.designate', 'support.contact.revoke', 'support.contact.upgrade', 'support.contact.downgrade', 'support.case.note', 'support.canned.write', 'billing.subscription.create', 'billing.subscription.update', 'billing.subscription.reactivate', 'billing.subscription.cancel', 'billing.subscription.delete', 'billing.tier.override', 'billing.support-floor.override', 'billing.support-incident.grant', 'billing.addon.add', 'billing.addon.remove', 'billing.addon.prune', 'billing.discount.generate', 'billing.discount.issue', 'billing.discount.apply', 'billing.discount.remove', 'billing.discount.revoke', 'billing.campaign.create', 'billing.campaign.update', 'billing.campaign.end', 'billing.promotion.create', 'billing.promotion.update', 'billing.promotion.revoke', 'billing.promotion.grant', 'billing.promotion.activate', 'billing.offer.sent', 'billing.offer.withdrawn', 'billing.offer.declined', 'billing.offer.dismissed', 'billing.offer.exclusion.set', 'billing.offer.exclusion.cleared', 'billing.offer.trigger', 'billing.credit.consumed', 'billing.credit.exhausted', 'billing.combo.expired', 'reporting.settings.update', 'reporting.deployment.outcome', 'reporting.retention.sync', 'reporting.report.definition.create', 'reporting.report.definition.update', 'reporting.report.definition.delete', 'reporting.report.ownership.transfer', 'reporting.report.published', 'reporting.report.republished', 'reporting.report.link.created', 'reporting.report.link.revoked', 'reporting.report.recipient.added', 'reporting.report.recipient.removed', 'reporting.report.policy.update', 'reporting.report.paused', 'reporting.report.resumed', 'reporting.report.run.compose', 'reporting.report.run.notes', 'reporting.report.run.summary', 'reporting.report.recipient.resend', 'reporting.report.recipient.verified', 'reporting.report.recipient.unsubscribed', 'reporting.ingest.batch', 'reporting.ingest.rejected', 'reporting.incident.record', 'authz.denied', 'ask.query', 'ask.agent.turn', 'ask.feedback', 'pipeline.ai.generate', 'plugin.ai.generate', 'publisher.create', 'publisher.update', 'publisher.terms.accept', 'publisher.verify.request', 'publisher.verify.approve', 'publisher.verify.reject', 'publisher.tier.change', 'publisher.suspend', 'publisher.unsuspend', 'publisher.transfer.request', 'publisher.transfer.accept', 'publisher.transfer.decline', 'publisher.transfer.approve', 'publisher.transfer.reject', 'publisher.profile-change.approve', 'publisher.profile-change.reject', 'plugin.request.submit', 'plugin.request.withdraw', 'plugin.request.approve', 'plugin.request.second-approve', 'plugin.request.reject', 'plugin.request.auto-approve', 'plugin.listing.publish', 'plugin.listing.update', 'plugin.listing.state.change', 'plugin.listing.pause', 'plugin.listing.unpause', 'plugin.version.pause', 'plugin.version.yank', 'plugin.version.unyank', 'plugin.version.deprecate', 'plugin.version.prune', 'ecosystem.auto-approval-rule.create', 'ecosystem.auto-approval-rule.update', 'ecosystem.auto-approval-rule.delete', 'ecosystem.reserved-name.update', 'ecosystem.bootstrap.open', 'ecosystem.bootstrap.close', 'registry.image.publish', 'registry.image.resign', 'registry.image.yank', 'registry.image.gc', 'plugin.install.request', 'plugin.install.approve', 'plugin.install.deny', 'plugin.install.create', 'plugin.install.upgrade', 'plugin.install.change-request', 'plugin.install.change-approve', 'plugin.install.change-reject', 'plugin.install.remove', 'org.plugin-install-policy.update', 'plugin.shadowing.denied', 'plugin.review.create', 'plugin.review.update', 'plugin.review.delete', 'plugin.review.report', 'plugin.review.hold', 'plugin.review.release', 'plugin.review.remove', 'plugin.review.anonymize', 'plugin.review.reply.create', 'plugin.review.reply.update', 'plugin.review.reply.delete', 'plugin.submission.create', 'plugin.submission.verify', 'plugin.submission.gate-fail', 'plugin.submission.approve', 'plugin.submission.reject', 'plugin.submission.claim', 'plugin.submission.expire', 'plugin.advisory.create', 'plugin.advisory.update', 'plugin.advisory.publish', 'plugin.advisory.withdraw', 'plugin.security_notifications.update', 'plugin.security_notifications.external_email.verify', 'plugin.security_notifications.test', 'plugin.setup_image.promoted', 'plugin.setup_image.promote_refused', 'plugin.setup_image.kept', 'plugin.setup_image.discarded', 'pipeline.vuln.accepted', 'pipeline.vuln.false_positive', 'pipeline.vuln.reopened', 'pipeline.runtime_check.flagged', 'pipeline.plugin.upgraded', 'pipeline.security_report.upload'];
|
|
21
21
|
export type RemoteAuditAction = typeof REMOTE_AUDIT_ACTIONS[number];
|
|
22
22
|
/** Whether `value` is an action a remote service may emit (the ingest allow-list). */
|
|
23
23
|
export declare function isRemoteAuditAction(value: string): value is RemoteAuditAction;
|