@pipeline-builder/pipeline-data 4.1.14 → 4.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/lib/api/access-control-builder.d.ts +18 -1
  2. package/lib/api/access-control-builder.js +19 -6
  3. package/lib/api/crud-service.d.ts +94 -36
  4. package/lib/api/crud-service.js +188 -166
  5. package/lib/api/plugin-resolution.d.ts +253 -0
  6. package/lib/api/plugin-resolution.js +649 -0
  7. package/lib/api/public-directory.d.ts +281 -0
  8. package/lib/api/public-directory.js +457 -0
  9. package/lib/api/query-builders.d.ts +13 -0
  10. package/lib/api/query-builders.js +74 -9
  11. package/lib/api/reporting/caches.js +4 -4
  12. package/lib/api/reporting/dora-scoring.d.ts +3 -3
  13. package/lib/api/reporting/dora-scoring.js +4 -4
  14. package/lib/api/reporting/dora.d.ts +6 -6
  15. package/lib/api/reporting/dora.js +97 -73
  16. package/lib/api/reporting/plugin-runtime.d.ts +25 -0
  17. package/lib/api/reporting/plugin-runtime.js +106 -0
  18. package/lib/api/reporting/query-scope.d.ts +8 -2
  19. package/lib/api/reporting/query-scope.js +16 -7
  20. package/lib/api/reporting/retention.d.ts +4 -10
  21. package/lib/api/reporting/retention.js +8 -11
  22. package/lib/api/reporting/sql-helpers.d.ts +4 -7
  23. package/lib/api/reporting/sql-helpers.js +8 -9
  24. package/lib/api/reporting/types.d.ts +55 -17
  25. package/lib/api/reporting/types.js +1 -1
  26. package/lib/api/reporting-service.d.ts +35 -26
  27. package/lib/api/reporting-service.js +245 -161
  28. package/lib/api/semver-range.d.ts +73 -0
  29. package/lib/api/semver-range.js +227 -0
  30. package/lib/api/soft-delete-sweep.js +8 -20
  31. package/lib/core/query-filters.d.ts +18 -3
  32. package/lib/core/query-filters.js +1 -1
  33. package/lib/database/drizzle-schema.d.ts +7790 -2461
  34. package/lib/database/drizzle-schema.js +29 -1
  35. package/lib/database/index.d.ts +4 -2
  36. package/lib/database/index.js +5 -3
  37. package/lib/database/pg-result.d.ts +19 -0
  38. package/lib/database/pg-result.js +32 -0
  39. package/lib/database/postgres-connection.js +14 -24
  40. package/lib/database/public-reader.d.ts +14 -0
  41. package/lib/database/public-reader.js +68 -0
  42. package/lib/database/retry-strategy.d.ts +3 -5
  43. package/lib/database/retry-strategy.js +4 -6
  44. package/lib/database/schema/compliance.d.ts +16 -34
  45. package/lib/database/schema/compliance.js +4 -4
  46. package/lib/database/schema/dashboard.js +4 -2
  47. package/lib/database/schema/ecosystem.d.ts +6586 -0
  48. package/lib/database/schema/ecosystem.js +709 -0
  49. package/lib/database/schema/message.d.ts +6 -12
  50. package/lib/database/schema/message.js +3 -1
  51. package/lib/database/schema/pipeline.d.ts +79 -5
  52. package/lib/database/schema/pipeline.js +46 -25
  53. package/lib/database/schema/plugin.d.ts +587 -3
  54. package/lib/database/schema/plugin.js +86 -14
  55. package/lib/database/tenancy.d.ts +6 -7
  56. package/lib/database/tenancy.js +13 -14
  57. package/lib/index.d.ts +7 -4
  58. package/lib/index.js +7 -4
  59. package/lib/testing/exports.json +146 -0
  60. package/package.json +44 -7
@@ -17,7 +17,7 @@ import { schema } from '../../database/drizzle-schema.js';
17
17
  import { withTenantTx } from '../../database/tenancy.js';
18
18
  import { drizzleRows } from '../crud-service.js';
19
19
  /**
20
- * 1.9 DORA metrics over a [from,to] deploy-completion window, org-scoped +
20
+ * DORA metrics over a [from,to] deploy-completion window, org-scoped +
21
21
  * rollup-aware. DEPLOY-BASIS ONLY — every metric derives from real deploy-stage
22
22
  * executions (`event_type='STAGE'` with a non-null `environment`, set by the
23
23
  * forwarder for the stages a user declared in `pb.deploys`). No run-based
@@ -26,8 +26,8 @@ import { drizzleRows } from '../crud-service.js';
26
26
  * Four scoped SQL scans run inside one tx (each org-gated by `p.org_id ${pred}`
27
27
  * / `o.org_id ${pred}` so a rollup passes the org→team subtree and a foreign
28
28
  * org's rows never enter): (1) terminal deploy rows PER (execution, env) — one
29
- * "deployment" = one execution reaching an env (D1) — → DF / deploy-time CFR /
30
- * measured lead time (lead time joins the execution's earliest commit, D2);
29
+ * "deployment" = one execution reaching an env — → DF / deploy-time CFR /
30
+ * measured lead time (lead time joins the execution's earliest commit);
31
31
  * the scan also reaches back `windowHours` before `from` so incidents opened
32
32
  * near the window start can correlate to a just-prior deploy; (2) `deployment_outcomes`
33
33
  * in-window → post-deploy CFR component; (3) production restored/failed
@@ -78,12 +78,12 @@ export async function getDoraMetrics(orgId, from, to, orgIds, opts = {}) {
78
78
  const lookbackFrom = Number.isFinite(fromMs)
79
79
  ? new Date(fromMs - effectiveWindowHours * 3600 * 1000).toISOString()
80
80
  : from;
81
- // (1) Terminal deploy rows: PER-EXECUTION (D1), one row per (environment,
81
+ // (1) Terminal deploy rows: PER-EXECUTION, one row per (environment,
82
82
  // execution) — every deploy STAGE targeting that env within the execution is
83
83
  // rolled up to a terminal status (FAILED wins, then SUCCEEDED). A single
84
84
  // execution with two deploy stages to the same env is ONE deployment, not two.
85
85
  // completed_at = the deploy's completion (MAX over its stages). `commit_ts`
86
- // (D2) is the execution's EARLIEST commit time across ALL its events (commit
86
+ // is the execution's EARLIEST commit time across ALL its events (commit
87
87
  // enrichment rides the PIPELINE/source event where environment IS NULL, never
88
88
  // the deploy STAGE row), joined by execution_id. `in_window` marks whether the
89
89
  // deploy completed inside [from,to] (vs. a look-back-only row kept solely for
@@ -184,49 +184,33 @@ export async function getDoraMetrics(orgId, from, to, orgIds, opts = {}) {
184
184
  const key = `${orgId}:dora:${from}:${to}:${pipelineId ?? ''}:${environment ?? ''}:${effectiveWindowHours}`;
185
185
  return runReport(key, multi, exec);
186
186
  }
187
+ /** Get-or-create the accumulator for `env`. */
188
+ function accFor(envs, env) {
189
+ let a = envs.get(env);
190
+ if (!a) {
191
+ a = { deployments: 0, deployTimeFailures: 0, attempts: 0, leadGaps: [] };
192
+ envs.set(env, a);
193
+ }
194
+ return a;
195
+ }
187
196
  /**
188
- * Shape the raw DORA scan rows into the public {@link DoraMetrics}. Buckets the
189
- * terminal deploy rows by environment (DF / deploy-time CFR / measured lead),
190
- * folds in the post-deploy failure counts (manual outcomes + webhook-ingested
191
- * incidents, deduped by deploy execution), computes production MTTR from both
192
- * sources (incident `resolved_at − opened_at` taking precedence over the manual
193
- * `restored − deployed`), and reconciles coverage — all cross-source medians
194
- * over deltas clamped ≥0.
195
- *
196
- * Phase 5 incident correlation: each incident is attributed to the most recent
197
- * SUCCESSFUL deploy to its environment with `completed_at ≤ opened_at` within
198
- * {@link DORA_INCIDENT_WINDOW_HOURS}. That deploy is a post-deploy failure; an
199
- * uncorrelated incident (no eligible deploy) contributes nothing.
197
+ * A deploy row counts toward DF/CFR/lead only if it completed inside [from,to].
198
+ * Look-back-only rows (in_window=false, kept for incident correlation) are
199
+ * skipped. Absent in a fixture ⇒ in-window (unit tests omit the flag).
200
200
  */
201
- function shapeDora(deployRows, outcomeRows, mttrRows, coverageRow, incidentRows, from, to, filters, windowHours = DORA_INCIDENT_WINDOW_HOURS) {
202
- // Window length in days (floored at 1 so a sub-day window yields the count as
203
- // the rate, never /0 or an extrapolation). Guard unparseable dates → 1 day.
204
- const spanDays = (Date.parse(to) - Date.parse(from)) / 86400000;
205
- const days = Number.isFinite(spanDays) ? Math.max(spanDays, 1) : 1;
206
- // Window end instant for MTTR right-censoring (a resolution after `to` is
207
- // unobserved). +Infinity when `to` is unparseable ⇒ no censoring (fail-open).
208
- const toParsed = Date.parse(to);
209
- const toMs = Number.isFinite(toParsed) ? toParsed : Number.POSITIVE_INFINITY;
201
+ function isInWindow(row) {
202
+ return row.in_window == null ? true : (row.in_window === true || row.in_window === 't');
203
+ }
204
+ /** Bucket the in-window terminal deploy rows by environment (DF / deploy-time CFR / measured lead). */
205
+ function accumulateDeploys(deployRows) {
210
206
  const envs = new Map();
211
- const accFor = (env) => {
212
- let a = envs.get(env);
213
- if (!a) {
214
- a = { deployments: 0, deployTimeFailures: 0, attempts: 0, leadGaps: [] };
215
- envs.set(env, a);
216
- }
217
- return a;
218
- };
219
- // A deploy row counts toward DF/CFR/lead only if it completed inside [from,to].
220
- // Look-back-only rows (in_window=false, kept for incident correlation) are
221
- // skipped here. Absent in a fixture ⇒ in-window (unit tests omit the flag).
222
- const isInWindow = (row) => row.in_window == null ? true : (row.in_window === true || row.in_window === 't');
223
207
  for (const row of deployRows) {
224
208
  const env = row.environment;
225
209
  if (!env)
226
210
  continue;
227
211
  if (!isInWindow(row))
228
212
  continue; // look-back-only row → correlation, not DF/CFR
229
- const a = accFor(env);
213
+ const a = accFor(envs, env);
230
214
  if (row.status === 'SUCCEEDED') {
231
215
  a.deployments++;
232
216
  a.attempts++;
@@ -242,10 +226,17 @@ function shapeDora(deployRows, outcomeRows, mttrRows, coverageRow, incidentRows,
242
226
  a.attempts++;
243
227
  }
244
228
  }
245
- // Incident→deploy correlation (Phase 5). Index the SUCCESSFUL deploys per env
246
- // (execution id + completion instant), newest first, so each incident can be
247
- // attributed to the most recent deploy that completed within the window
248
- // before it opened. That execution is a post-deploy failure.
229
+ return envs;
230
+ }
231
+ /**
232
+ * Incident→deploy correlation. Each incident is attributed to the most recent
233
+ * SUCCESSFUL deploy to its environment with `completed_at ≤ opened_at` within
234
+ * `windowHours`; an uncorrelated incident is dropped. A resolution after the
235
+ * window end (`toMs`) is right-censored: the incident still counts, unresolved.
236
+ */
237
+ function correlateIncidents(deployRows, incidentRows, windowHours, toMs) {
238
+ // Index the SUCCESSFUL deploys per env (execution id + completion instant),
239
+ // newest first.
249
240
  const windowMs = windowHours * 3600 * 1000;
250
241
  const successfulByEnv = new Map();
251
242
  for (const row of deployRows) {
@@ -260,7 +251,6 @@ function shapeDora(deployRows, outcomeRows, mttrRows, coverageRow, incidentRows,
260
251
  }
261
252
  for (const list of successfulByEnv.values())
262
253
  list.sort((a, b) => b.completedMs - a.completedMs);
263
- /** Correlate an incident to the most recent in-window successful deploy execution. */
264
254
  const correlate = (env, openedMs) => {
265
255
  const list = successfulByEnv.get(env);
266
256
  if (!list)
@@ -271,7 +261,7 @@ function shapeDora(deployRows, outcomeRows, mttrRows, coverageRow, incidentRows,
271
261
  }
272
262
  return null;
273
263
  };
274
- const correlatedIncidents = [];
264
+ const correlated = [];
275
265
  for (const inc of incidentRows) {
276
266
  if (!inc.environment || inc.opened_at == null)
277
267
  continue;
@@ -294,12 +284,18 @@ function shapeDora(deployRows, outcomeRows, mttrRows, coverageRow, incidentRows,
294
284
  resolvedGap = Math.max(g, 0);
295
285
  }
296
286
  }
297
- correlatedIncidents.push({ environment: inc.environment, exec, resolvedGap });
287
+ correlated.push({ environment: inc.environment, exec, resolvedGap });
298
288
  }
299
- // Post-deploy failures per env — the DISTINCT set of deploy executions flagged
300
- // by a manual `failed` outcome OR a correlated incident (deduped by execution,
301
- // so a deploy flagged by both counts once). A manual outcome without an
302
- // execution id (legacy/unresolvable) still counts via a per-row sentinel.
289
+ return correlated;
290
+ }
291
+ /**
292
+ * Post-deploy failures per env — the DISTINCT set of deploy executions flagged
293
+ * by a manual `failed` outcome OR a correlated incident (deduped by execution,
294
+ * so a deploy flagged by both counts once). A manual outcome without an
295
+ * execution id still counts via a per-row sentinel. Every flagged env is added
296
+ * to `envs` so it appears even with no in-window deploy events.
297
+ */
298
+ function countPostDeployFailures(envs, outcomeRows, correlated) {
303
299
  const postDeployExecsByEnv = new Map();
304
300
  let sentinel = 0;
305
301
  const flagFor = (env) => {
@@ -314,21 +310,25 @@ function shapeDora(deployRows, outcomeRows, mttrRows, coverageRow, incidentRows,
314
310
  if (o.outcome !== 'failed' || !o.environment)
315
311
  continue;
316
312
  flagFor(o.environment).add(o.execution_id ?? `manual-${sentinel++}`);
317
- accFor(o.environment); // ensure env appears even with no deploy events
313
+ accFor(envs, o.environment);
318
314
  }
319
- for (const ci of correlatedIncidents) {
315
+ for (const ci of correlated) {
320
316
  flagFor(ci.environment).add(ci.exec);
321
- accFor(ci.environment); // ensure env appears even if the deploy is out-of-window
317
+ accFor(envs, ci.environment);
322
318
  }
323
319
  const postDeployByEnv = new Map();
324
320
  for (const [env, set] of postDeployExecsByEnv)
325
321
  postDeployByEnv.set(env, set.size);
326
- const environments = [...envs.entries()]
322
+ return postDeployByEnv;
323
+ }
324
+ /** Per-environment DF / CFR / lead-time rows, production first. */
325
+ function buildEnvMetrics(envs, postDeployByEnv, days, requestedEnv) {
326
+ return [...envs.entries()]
327
327
  // The deploy and incident scans admit PRODUCTION alongside a requested
328
328
  // environment so MTTR can correlate production incidents (see
329
329
  // `scanEnvClause`). That production row is plumbing for MTTR, not something
330
330
  // the caller asked to see — report only the environment that was requested.
331
- .filter(([environment]) => !filters.environment || environment === filters.environment)
331
+ .filter(([environment]) => !requestedEnv || environment === requestedEnv)
332
332
  .map(([environment, a]) => {
333
333
  const postDeployFailures = postDeployByEnv.get(environment) ?? 0;
334
334
  const rawPerDay = a.deployments / days;
@@ -366,16 +366,20 @@ function shapeDora(deployRows, outcomeRows, mttrRows, coverageRow, incidentRows,
366
366
  return 1;
367
367
  return x.environment.localeCompare(y.environment);
368
368
  });
369
- // MTTR — PRODUCTION-ONLY, from BOTH sources. Incidents take precedence: a
370
- // production incident correlated to a deploy contributes the real recovery
371
- // (`resolved_at − opened_at`), and any manual outcome on the SAME deploy is
372
- // skipped. Manual outcomes on other deploys keep the Phase-2 behavior
373
- // (`failed` → an incident; `restored` → a recovery gap of `restored − deployed`).
369
+ }
370
+ /**
371
+ * MTTR — PRODUCTION-ONLY, from BOTH sources. Incidents take precedence: a
372
+ * production incident correlated to a deploy contributes the real recovery
373
+ * (`resolved_at − opened_at`), and any manual outcome on the SAME deploy is
374
+ * skipped. Manual outcomes on other deploys count as recorded (`failed` → an
375
+ * incident; `restored` → a recovery gap of `restored − deployed`).
376
+ */
377
+ function computeMttr(correlated, mttrRows) {
374
378
  let incidents = 0, restored = 0;
375
379
  const mttrGaps = [];
376
380
  // Executions already attributed to a production incident (precedence guard).
377
381
  const incidentExecs = new Set();
378
- for (const ci of correlatedIncidents) {
382
+ for (const ci of correlated) {
379
383
  if (ci.environment !== HEADLINE_ENV)
380
384
  continue; // MTTR is production-only
381
385
  incidents++;
@@ -403,19 +407,39 @@ function shapeDora(deployRows, outcomeRows, mttrRows, coverageRow, incidentRows,
403
407
  }
404
408
  }
405
409
  const mttrMedian = median(mttrGaps);
410
+ return {
411
+ incidents,
412
+ restored,
413
+ medianSeconds: mttrMedian != null ? round(mttrMedian, 1) : null,
414
+ level: doraLevelForRestore(mttrMedian),
415
+ };
416
+ }
417
+ /**
418
+ * Shape the raw DORA scan rows into the public {@link DoraMetrics}: per-env
419
+ * DF / CFR / lead time (post-deploy failures folded in), production MTTR from
420
+ * incidents + manual outcomes, and deploy coverage — all cross-source medians
421
+ * over deltas clamped ≥0.
422
+ */
423
+ function shapeDora(deployRows, outcomeRows, mttrRows, coverageRow, incidentRows, from, to, filters, windowHours = DORA_INCIDENT_WINDOW_HOURS) {
424
+ // Window length in days (floored at 1 so a sub-day window yields the count as
425
+ // the rate, never /0 or an extrapolation). Guard unparseable dates → 1 day.
426
+ const spanDays = (Date.parse(to) - Date.parse(from)) / 86400000;
427
+ const days = Number.isFinite(spanDays) ? Math.max(spanDays, 1) : 1;
428
+ // Window end instant for MTTR right-censoring (a resolution after `to` is
429
+ // unobserved). +Infinity when `to` is unparseable ⇒ no censoring (fail-open).
430
+ const toParsed = Date.parse(to);
431
+ const toMs = Number.isFinite(toParsed) ? toParsed : Number.POSITIVE_INFINITY;
432
+ const envs = accumulateDeploys(deployRows);
433
+ const correlated = correlateIncidents(deployRows, incidentRows, windowHours, toMs);
434
+ const postDeployByEnv = countPostDeployFailures(envs, outcomeRows, correlated);
406
435
  const registered = Number(coverageRow?.registered) || 0;
407
436
  const deploying = Number(coverageRow?.deploying) || 0;
408
437
  return {
409
438
  window: { from, to },
410
439
  filters: { pipelineId: filters.pipelineId ?? null, environment: filters.environment ?? null },
411
440
  headline: HEADLINE_ENV,
412
- environments,
413
- meanTimeToRestore: {
414
- incidents,
415
- restored,
416
- medianSeconds: mttrMedian != null ? round(mttrMedian, 1) : null,
417
- level: doraLevelForRestore(mttrMedian),
418
- },
441
+ environments: buildEnvMetrics(envs, postDeployByEnv, days, filters.environment),
442
+ meanTimeToRestore: computeMttr(correlated, mttrRows),
419
443
  coverage: {
420
444
  registered,
421
445
  deploying,
@@ -424,7 +448,7 @@ function shapeDora(deployRows, outcomeRows, mttrRows, coverageRow, incidentRows,
424
448
  };
425
449
  }
426
450
  /**
427
- * 1.9b DORA trend — deployment frequency + deploy-time change-failure rate
451
+ * DORA trend — deployment frequency + deploy-time change-failure rate
428
452
  * bucketed by `interval` (day/week/month) for a sparkline. Deploy-basis like
429
453
  * getDoraMetrics: buckets terminal deploy-stage executions on their
430
454
  * `completed_at`. Shares the org/rollup + pipelineId/environment scoping. MTTR,
@@ -438,7 +462,7 @@ export async function getDoraTrend(orgId, interval, from, to, orgIds, opts = {})
438
462
  const envClause = environment ? sql `AND e.environment = ${environment}` : sql ``;
439
463
  const exec = () => withTenantTx((tx) => tx.execute(sql `
440
464
  WITH deploys AS (
441
- -- PER-EXECUTION deploy unit (D1): one row per (environment, execution),
465
+ -- PER-EXECUTION deploy unit: one row per (environment, execution),
442
466
  -- every deploy STAGE to that env within the execution rolled up to a
443
467
  -- single terminal status — NOT one row per stage.
444
468
  SELECT
@@ -466,7 +490,7 @@ export async function getDoraTrend(orgId, interval, from, to, orgIds, opts = {})
466
490
  return runReport(key, multi, exec);
467
491
  }
468
492
  /**
469
- * 1.10 Per-pipeline BUILD HEALTH (Phase 6) — a standard (NOT `advanced_reporting`)
493
+ * Per-pipeline BUILD HEALTH — a standard (NOT `advanced_reporting`)
470
494
  * per-stage breakdown for one pipeline over a [from,to] window. Aggregates the
471
495
  * existing `pipeline_events` STAGE rows: each stage is rolled up per execution
472
496
  * to a terminal status (FAILED wins, then SUCCEEDED) + its max duration, then
@@ -518,8 +542,8 @@ export async function getBuildHealth(orgId, pipelineId, from, to, orgIds) {
518
542
  return runReport(`${orgId}:build-health:${pipelineId}:${from}:${to}`, multi, exec);
519
543
  }
520
544
  // ── Category 2: Plugin Inventory & Builds ──
521
- /** 2.1 Plugin summary — counts and breakdowns.
545
+ /** Plugin summary — counts and breakdowns.
522
546
  * INTENTIONALLY SINGLE-ORG (no rollup): plugin inventory is an org-owned
523
547
  * asset count, not an execution/build activity report, so a parent's view is
524
548
  * its own plugins — teams manage their own inventory. Single `= $org` scope. */
525
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9yYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcmVwb3J0aW5nL2RvcmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUNMLFlBQVksRUFBRSwwQkFBMEIsRUFBRSwwQkFBMEIsRUFDcEUscUJBQXFCLEVBQUUseUJBQXlCLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQzNGLEtBQUssRUFBRSxNQUFNLEdBQ2QsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FDbEMsS0FBYSxFQUNiLElBQVksRUFDWixFQUFVLEVBQ1YsTUFBaUIsRUFDakIsSUFBSSxHQUFnQixFQUFFO0lBRXRCLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoRCxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQztJQUN6QyxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSx1QkFBdUIsVUFBVSxFQUFFLENB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QVEsR0FBRyxDQUFDLENBQUM7UUFDM0IsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFBQyxDQUFDO1FBQ2pFLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUM7SUFDbkUsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLFNBQVMsQ0FBQyxHQUFHLEtBQUssaUJBQWlCLFVBQVUsSUFBSSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3JGLENBQUM7QUFFRCw4Q0FBOEM7QUFFOUM7OztpRkFHaUYiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBET1JBIG1ldHJpY3M6IHRoZSBmb3VyIGhlYWRsaW5lIG1lYXN1cmVzLCB0aGVpciBwZXItZW52aXJvbm1lbnQgYnJlYWtkb3duLFxuICogdGhlIHRyZW5kIHNlcmllcywgYW5kIHBlci1waXBlbGluZSBidWlsZCBoZWFsdGguXG4gKlxuICogQnkgZmFyIHRoZSBsYXJnZXN0IGRvbWFpbiBpbiB0aGUgcmVwb3J0aW5nIHNlcnZpY2UgKH40OTAgbGluZXMgb2YgcXVlcnkgK1xuICogc2hhcGluZyBhZ2FpbnN0IHNpeCByb3cgc2hhcGVzKSwgd2hpY2ggaXMgd2h5IGl0IGxpdmVzIGluIGl0cyBvd24gbW9kdWxlLlxuICogUmVwb3J0aW5nU2VydmljZSBkZWxlZ2F0ZXMgdG8gdGhlc2U7IHRoZSBiYW5kaW5nIHRocmVzaG9sZHMgdGhleSBhcHBseSBhcmUgaW5cbiAqIC4vZG9yYS1zY29yaW5nLnRzLCBkZWxpYmVyYXRlbHkgc2VwYXJhdGUgc28gdGhleSBjYW4gYmUgdGVzdGVkIHdpdGhvdXQgYSBEQi5cbiAqL1xuXG5pbXBvcnQgeyBzcWwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQge1xuICBIRUFETElORV9FTlYsIERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTLCByZXNvbHZlSW5jaWRlbnRXaW5kb3dIb3VycyxcbiAgZG9yYUxldmVsRm9yRnJlcXVlbmN5LCBkb3JhTGV2ZWxGb3JDaGFuZ2VGYWlsdXJlLCBkb3JhTGV2ZWxGb3JSZXN0b3JlLCBkb3JhTGV2ZWxGb3JMZWFkVGltZSxcbiAgcm91bmQsIG1lZGlhbixcbn0gZnJvbSAnLi9kb3JhLXNjb3JpbmcuanMnO1xuaW1wb3J0IHsgb3JnU2NvcGUsIHJ1blJlcG9ydCB9IGZyb20gJy4vcXVlcnktc2NvcGUuanMnO1xuaW1wb3J0IHsgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwsIHRlcm1pbmFsU3RhdHVzUm9sbHVwIH0gZnJvbSAnLi9zcWwtaGVscGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIERvcmFPcHRpb25zLCBEb3JhTWV0cmljcywgRG9yYUVudk1ldHJpY3MsIERvcmFUcmVuZFBvaW50LCBCdWlsZEhlYWx0aCwgQnVpbGRIZWFsdGhTdGFnZSxcbiAgRGVwbG95Um93LCBPdXRjb21lUm93LCBNdHRyUGFpclJvdywgSW5jaWRlbnRSb3csIENvdmVyYWdlUm93LFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB7IHdpdGhUZW5hbnRUeCB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuaW1wb3J0IHsgZHJpenpsZVJvd3MgfSBmcm9tICcuLi9jcnVkLXNlcnZpY2UuanMnO1xuXG4vKipcbiAqIDEuOSBET1JBIG1ldHJpY3Mgb3ZlciBhIFtmcm9tLHRvXSBkZXBsb3ktY29tcGxldGlvbiB3aW5kb3csIG9yZy1zY29wZWQgK1xuICogcm9sbHVwLWF3YXJlLiBERVBMT1ktQkFTSVMgT05MWSDigJQgZXZlcnkgbWV0cmljIGRlcml2ZXMgZnJvbSByZWFsIGRlcGxveS1zdGFnZVxuICogZXhlY3V0aW9ucyAoYGV2ZW50X3R5cGU9J1NUQUdFJ2Agd2l0aCBhIG5vbi1udWxsIGBlbnZpcm9ubWVudGAsIHNldCBieSB0aGVcbiAqIGZvcndhcmRlciBmb3IgdGhlIHN0YWdlcyBhIHVzZXIgZGVjbGFyZWQgaW4gYHBiLmRlcGxveXNgKS4gTm8gcnVuLWJhc2VkXG4gKiBmYWxsYmFjazogYSBwaXBlbGluZSB3aXRoIG5vIGRlcGxveSBzdGFnZSBwcm9kdWNlcyBubyBET1JBIGRhdGEuXG4gKlxuICogRm91ciBzY29wZWQgU1FMIHNjYW5zIHJ1biBpbnNpZGUgb25lIHR4IChlYWNoIG9yZy1nYXRlZCBieSBgcC5vcmdfaWQgJHtwcmVkfWBcbiAqIC8gYG8ub3JnX2lkICR7cHJlZH1gIHNvIGEgcm9sbHVwIHBhc3NlcyB0aGUgb3Jn4oaSdGVhbSBzdWJ0cmVlIGFuZCBhIGZvcmVpZ25cbiAqIG9yZydzIHJvd3MgbmV2ZXIgZW50ZXIpOiAoMSkgdGVybWluYWwgZGVwbG95IHJvd3MgUEVSIChleGVjdXRpb24sIGVudikg4oCUIG9uZVxuICogXCJkZXBsb3ltZW50XCIgPSBvbmUgZXhlY3V0aW9uIHJlYWNoaW5nIGFuIGVudiAoRDEpIOKAlCDihpIgREYgLyBkZXBsb3ktdGltZSBDRlIgL1xuICogbWVhc3VyZWQgbGVhZCB0aW1lIChsZWFkIHRpbWUgam9pbnMgdGhlIGV4ZWN1dGlvbidzIGVhcmxpZXN0IGNvbW1pdCwgRDIpO1xuICogdGhlIHNjYW4gYWxzbyByZWFjaGVzIGJhY2sgYHdpbmRvd0hvdXJzYCBiZWZvcmUgYGZyb21gIHNvIGluY2lkZW50cyBvcGVuZWRcbiAqIG5lYXIgdGhlIHdpbmRvdyBzdGFydCBjYW4gY29ycmVsYXRlIHRvIGEganVzdC1wcmlvciBkZXBsb3k7ICgyKSBgZGVwbG95bWVudF9vdXRjb21lc2BcbiAqIGluLXdpbmRvdyDihpIgcG9zdC1kZXBsb3kgQ0ZSIGNvbXBvbmVudDsgKDMpIHByb2R1Y3Rpb24gcmVzdG9yZWQvZmFpbGVkXG4gKiBvdXRjb21lcyBqb2luZWQgdG8gdGhlaXIgZGVwbG95IOKGkiBNVFRSOyAoNCkgcmVnaXN0cnkgdnMgZGVwbG95aW5nIOKGkiBjb3ZlcmFnZS5cbiAqIFRoZSBjcm9zcy1zb3VyY2UgbWVkaWFucyAobGVhZCB0aW1lLCBNVFRSKSBhcmUgY29tcHV0ZWQgaW4gSlMgZnJvbSBjbGFtcGVkXG4gKiAo4omlMCkgZGVsdGFzLlxuICpcbiAqIEBwYXJhbSBvcHRzLnBpcGVsaW5lSWQgICAgcmVzdHJpY3QgdG8gb25lIHBpcGVsaW5lIChwZXItcGlwZWxpbmUgRE9SQSlcbiAqIEBwYXJhbSBvcHRzLmVudmlyb25tZW50ICAgcmVzdHJpY3QgdG8gb25lIGRlcGxveSBlbnZpcm9ubWVudFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RG9yYU1ldHJpY3MoXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIGZyb206IHN0cmluZyxcbiAgdG86IHN0cmluZyxcbiAgb3JnSWRzPzogc3RyaW5nW10sXG4gIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPERvcmFNZXRyaWNzPiB7XG4gIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IG9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICBjb25zdCB7IHBpcGVsaW5lSWQsIGVudmlyb25tZW50IH0gPSBvcHRzO1xuICBjb25zdCBwaXBlbGluZUNsYXVzZSA9IHBpcGVsaW5lSWQgPyBzcWxgQU5EIGUucGlwZWxpbmVfaWQgPSAke3BpcGVsaW5lSWR9YCA6IHNxbGBgO1xuICBjb25zdCBwaXBlbGluZUNsYXVzZVIgPSBwaXBlbGluZUlkID8gc3FsYEFORCByLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfWAgOiBzcWxgYDtcbiAgLy8gUG9zdC1kZXBsb3kgb3V0Y29tZXMgY2Fycnkgbm8gcGlwZWxpbmUgaWQsIG9ubHkgdGhlIGV4ZWN1dGlvbiB0aGF0XG4gIC8vIHByb2R1Y2VkIHRoZW0sIHNvIGEgcGVyLXBpcGVsaW5lIHZpZXcgaGFzIHRvIHNjb3BlIHRoZW0gVEhST1VHSCB0aGVcbiAgLy8gZXhlY3V0aW9uLiBXaXRob3V0IGl0IHRoZSBvdXRjb21lIGFuZCBNVFRSIHNjYW5zIHJlYWQgZXZlcnkgcGlwZWxpbmUgaW4gdGhlXG4gIC8vIG9yZzogYW5vdGhlciBwaXBlbGluZSdzIGBmYWlsZWRgIG1hcmtlciBjb3VudGVkIGFnYWluc3QgdGhpcyBvbmUncyBjaGFuZ2VcbiAgLy8gZmFpbHVyZSByYXRlICh0ZW4gY2xlYW4gZGVwbG95cyBjb3VsZCBkcm9wIGZyb20gZWxpdGUgdG8gaGlnaCkgYW5kIGl0c1xuICAvLyByZWNvdmVyaWVzIGZlZCB0aGlzIG9uZSdzIE1UVFIuXG4gIGNvbnN0IG91dGNvbWVQaXBlbGluZUNsYXVzZSA9IHBpcGVsaW5lSWRcbiAgICA/IHNxbGBBTkQgby5leGVjdXRpb25faWQgSU4gKFNFTEVDVCBwZS5leGVjdXRpb25faWQgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBwZSBXSEVSRSBwZS5waXBlbGluZV9pZCA9ICR7cGlwZWxpbmVJZH0pYFxuICAgIDogc3FsYGA7XG4gIC8vIGBlbnZDbGF1c2VgIGlzIHRoZSBTVFJJQ1QgZmlsdGVyIChjb3ZlcmFnZSwgYW5kIHRoZSBvdXRwdXQpLiBUaGUgZGVwbG95IGFuZFxuICAvLyBpbmNpZGVudCBTQ0FOUyB1c2UgdGhlIHdpZGVuZWQgYHNjYW5FbnZDbGF1c2VgL2BzY2FuSW5jaWRlbnRFbnZDbGF1c2VgXG4gIC8vIGluc3RlYWQsIHdoaWNoIGFsd2F5cyBhZG1pdCBwcm9kdWN0aW9uOiBNVFRSIGlzIHByb2R1Y3Rpb24tb25seSBhbmRcbiAgLy8gZG9jdW1lbnRlZCBhcyBpbmRlcGVuZGVudCBvZiB0aGUgZW52aXJvbm1lbnQgZmlsdGVyLCBidXQgaW5jaWRlbnQtc291cmNlZFxuICAvLyBNVFRSIGNvcnJlbGF0ZXMgZWFjaCBwcm9kdWN0aW9uIGluY2lkZW50IGFnYWluc3QgcHJvZHVjdGlvbiBERVBMT1kgcm93cy5cbiAgLy8gRmlsdGVyaW5nIGJvdGggc2NhbnMgdG8gYD9lbnZpcm9ubWVudD1zdGFnaW5nYCByZW1vdmVkIGV2ZXJ5IHByb2R1Y3Rpb25cbiAgLy8gaW5jaWRlbnQgYW5kIGV2ZXJ5IHByb2R1Y3Rpb24gZGVwbG95LCBzbyBpbmNpZGVudCByZWNvdmVyeSBzaWxlbnRseSBkcm9wcGVkXG4gIC8vIG91dCBvZiBNVFRSIHRoZSBtb21lbnQgYW55b25lIGxvb2tlZCBhdCBhIG5vbi1wcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAvLyBgc2hhcGVEb3JhYCBuYXJyb3dzIHRoZSByZXBvcnRlZCBlbnZpcm9ubWVudHMgYmFjayB0byB0aGUgcmVxdWVzdGVkIG9uZS5cbiAgY29uc3QgZW52Q2xhdXNlID0gZW52aXJvbm1lbnQgPyBzcWxgQU5EIGUuZW52aXJvbm1lbnQgPSAke2Vudmlyb25tZW50fWAgOiBzcWxgYDtcbiAgY29uc3Qgc2NhbkVudkNsYXVzZSA9IGVudmlyb25tZW50ID8gc3FsYEFORCBlLmVudmlyb25tZW50IElOICgke2Vudmlyb25tZW50fSwgJHtIRUFETElORV9FTlZ9KWAgOiBzcWxgYDtcbiAgY29uc3Qgb3V0Y29tZUVudkNsYXVzZSA9IGVudmlyb25tZW50ID8gc3FsYEFORCBvLmVudmlyb25tZW50ID0gJHtlbnZpcm9ubWVudH1gIDogc3FsYGA7XG4gIGNvbnN0IHNjYW5JbmNpZGVudEVudkNsYXVzZSA9IGVudmlyb25tZW50ID8gc3FsYEFORCBpLmVudmlyb25tZW50IElOICgke2Vudmlyb25tZW50fSwgJHtIRUFETElORV9FTlZ9KWAgOiBzcWxgYDtcblxuICAvLyBFZmZlY3RpdmUgaW5jaWRlbnQtY29ycmVsYXRpb24gd2luZG93IChwZXItb3JnIG92ZXJyaWRlIG9yIHRoZSBnbG9iYWxcbiAgLy8gZGVmYXVsdCkuIENvbXB1dGVkIGhlcmUgKG5vdCBqdXN0IGluIHNoYXBlRG9yYSkgYmVjYXVzZSB0aGUgZGVwbG95IHNjYW5cbiAgLy8gbmVlZHMgaXQgZm9yIEJPVEggdGhlIGNvcnJlbGF0aW9uIGxvb2stYmFjayBsb3dlciBib3VuZCBBTkQgdGhlIGNhY2hlIGtleS5cbiAgY29uc3QgZWZmZWN0aXZlV2luZG93SG91cnMgPSByZXNvbHZlSW5jaWRlbnRXaW5kb3dIb3VycyhvcHRzLmluY2lkZW50V2luZG93SG91cnMpO1xuICAvLyBDb3JyZWxhdGlvbiBsb29rLWJhY2s6IGluY2lkZW50cyBvcGVuZWQganVzdCBpbnNpZGUgYGZyb21gIGNhbiBhdHRyaWJ1dGUgdG9cbiAgLy8gYSBkZXBsb3kgdGhhdCBjb21wbGV0ZWQgdXAgdG8gYHdpbmRvd0hvdXJzYCBCRUZPUkUgYGZyb21gIChtaXJyb3JzIHRoZVxuICAvLyBMQVRFUkFMIGxvb2stYmFjayBpbiBsaXN0SW5jaWRlbnRzKS4gV2lkZW4gdGhlIGRlcGxveSBzY2FuJ3MgbG93ZXIgYm91bmQgdG9cbiAgLy8gYGZyb20g4oiSIHdpbmRvd0hvdXJzYDsgREYvQ0ZSL2xlYWQgc3RpbGwgY291bnQgb25seSB0aGUgaW4tYGZyb21gLi5gdG9gXG4gIC8vIHN1YnNldCAoZmxhZ2dlZCBieSBgaW5fd2luZG93YCksIHdoaWxlIGNvcnJlbGF0aW9uIHNlZXMgdGhlIHdpZGVyIHNldC5cbiAgY29uc3QgZnJvbU1zID0gRGF0ZS5wYXJzZShmcm9tKTtcbiAgY29uc3QgbG9va2JhY2tGcm9tID0gTnVtYmVyLmlzRmluaXRlKGZyb21NcylcbiAgICA/IG5ldyBEYXRlKGZyb21NcyAtIGVmZmVjdGl2ZVdpbmRvd0hvdXJzICogMzYwMCAqIDEwMDApLnRvSVNPU3RyaW5nKClcbiAgICA6IGZyb207XG5cbiAgLy8gKDEpIFRlcm1pbmFsIGRlcGxveSByb3dzOiBQRVItRVhFQ1VUSU9OIChEMSksIG9uZSByb3cgcGVyIChlbnZpcm9ubWVudCxcbiAgLy8gZXhlY3V0aW9uKSDigJQgZXZlcnkgZGVwbG95IFNUQUdFIHRhcmdldGluZyB0aGF0IGVudiB3aXRoaW4gdGhlIGV4ZWN1dGlvbiBpc1xuICAvLyByb2xsZWQgdXAgdG8gYSB0ZXJtaW5hbCBzdGF0dXMgKEZBSUxFRCB3aW5zLCB0aGVuIFNVQ0NFRURFRCkuIEEgc2luZ2xlXG4gIC8vIGV4ZWN1dGlvbiB3aXRoIHR3byBkZXBsb3kgc3RhZ2VzIHRvIHRoZSBzYW1lIGVudiBpcyBPTkUgZGVwbG95bWVudCwgbm90IHR3by5cbiAgLy8gY29tcGxldGVkX2F0ID0gdGhlIGRlcGxveSdzIGNvbXBsZXRpb24gKE1BWCBvdmVyIGl0cyBzdGFnZXMpLiBgY29tbWl0X3RzYFxuICAvLyAoRDIpIGlzIHRoZSBleGVjdXRpb24ncyBFQVJMSUVTVCBjb21taXQgdGltZSBhY3Jvc3MgQUxMIGl0cyBldmVudHMgKGNvbW1pdFxuICAvLyBlbnJpY2htZW50IHJpZGVzIHRoZSBQSVBFTElORS9zb3VyY2UgZXZlbnQgd2hlcmUgZW52aXJvbm1lbnQgSVMgTlVMTCwgbmV2ZXJcbiAgLy8gdGhlIGRlcGxveSBTVEFHRSByb3cpLCBqb2luZWQgYnkgZXhlY3V0aW9uX2lkLiBgaW5fd2luZG93YCBtYXJrcyB3aGV0aGVyIHRoZVxuICAvLyBkZXBsb3kgY29tcGxldGVkIGluc2lkZSBbZnJvbSx0b10gKHZzLiBhIGxvb2stYmFjay1vbmx5IHJvdyBrZXB0IHNvbGVseSBmb3JcbiAgLy8gaW5jaWRlbnQgY29ycmVsYXRpb24pLiBleGVjdXRpb25faWQgaXMgcHJvamVjdGVkIHNvIHBvc3QtZGVwbG95IGZhaWx1cmVzXG4gIC8vIChtYW51YWwgb3V0Y29tZXMgKyBjb3JyZWxhdGVkIGluY2lkZW50cykgY2FuIGRlZHVwIGFnYWluc3QgdGhlaXIgZGVwbG95LlxuICBjb25zdCBkZXBsb3lTcWwgPSBzcWxgXG4gICAgICBXSVRIIGRlcGxveV9zdGFnZXMgQVMgKFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmVudmlyb25tZW50IEFTIGVudmlyb25tZW50LFxuICAgICAgICAgIGUuZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCxcbiAgICAgICAgICAke3Rlcm1pbmFsU3RhdHVzUm9sbHVwfSBBUyBzdGF0dXMsXG4gICAgICAgICAgTUFYKGUuY29tcGxldGVkX2F0KSBBUyBjb21wbGV0ZWRfYXRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5lbnZpcm9ubWVudCBJUyBOT1QgTlVMTFxuICAgICAgICAgICR7cGlwZWxpbmVDbGF1c2V9ICR7c2NhbkVudkNsYXVzZX1cbiAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPj0gJHtsb29rYmFja0Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5jb21wbGV0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIGUuZW52aXJvbm1lbnQsIGUuZXhlY3V0aW9uX2lkXG4gICAgICApLFxuICAgICAgZXhlY19jb21taXRzIEFTIChcbiAgICAgICAgU0VMRUNUIGMuZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCwgTUlOKGMuY29tbWl0X3RpbWVzdGFtcCkgQVMgY29tbWl0X3RzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gY1xuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBjLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGMuY29tbWl0X3RpbWVzdGFtcCBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBjLmV4ZWN1dGlvbl9pZCBJTiAoU0VMRUNUIGV4ZWN1dGlvbl9pZCBGUk9NIGRlcGxveV9zdGFnZXMpXG4gICAgICAgIEdST1VQIEJZIGMuZXhlY3V0aW9uX2lkXG4gICAgICApXG4gICAgICBTRUxFQ1RcbiAgICAgICAgZHMuZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnQsXG4gICAgICAgIGRzLmV4ZWN1dGlvbl9pZCBBUyBleGVjdXRpb25faWQsXG4gICAgICAgIGRzLnN0YXR1cyBBUyBzdGF0dXMsXG4gICAgICAgIGRzLmNvbXBsZXRlZF9hdDo6dGV4dCBBUyBjb21wbGV0ZWRfYXQsXG4gICAgICAgIChkcy5jb21wbGV0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHopIEFTIGluX3dpbmRvdyxcbiAgICAgICAgZWMuY29tbWl0X3RzOjp0ZXh0IEFTIGNvbW1pdF90c1xuICAgICAgRlJPTSBkZXBsb3lfc3RhZ2VzIGRzXG4gICAgICBMRUZUIEpPSU4gZXhlY19jb21taXRzIGVjIE9OIGVjLmV4ZWN1dGlvbl9pZCA9IGRzLmV4ZWN1dGlvbl9pZGA7XG5cbiAgLy8gKDIpIFBvc3QtZGVwbG95IG91dGNvbWUgbWFya2VycyBpbi13aW5kb3cgKHBlciBlbnYpLiBQb3N0LWRlcGxveSBmYWlsdXJlc1xuICAvLyAob3V0Y29tZT0nZmFpbGVkJykgYWRkIHRvIHRoZSBDRlIgbnVtZXJhdG9yIHdpdGhvdXQgY2hhbmdpbmcgYXR0ZW1wdHMuXG4gIC8vIGV4ZWN1dGlvbl9pZCBsZXRzIHRoZSBDRlIgZGVkdXAgYSBtYW51YWwgZmFpbHVyZSBhZ2FpbnN0IGFuIGluY2lkZW50IHRoYXRcbiAgLy8gY29ycmVsYXRlcyB0byB0aGUgc2FtZSBkZXBsb3kgKG5vIGRvdWJsZS1jb3VudCkuXG4gIGNvbnN0IG91dGNvbWVTcWwgPSBzcWxgXG4gICAgICBTRUxFQ1Qgby5lbnZpcm9ubWVudCBBUyBlbnZpcm9ubWVudCwgby5vdXRjb21lIEFTIG91dGNvbWUsIG8uZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZFxuICAgICAgRlJPTSAke3NjaGVtYS5kZXBsb3ltZW50T3V0Y29tZX0gb1xuICAgICAgV0hFUkUgby5vcmdfaWQgJHtwcmVkfSAke291dGNvbWVFbnZDbGF1c2V9ICR7b3V0Y29tZVBpcGVsaW5lQ2xhdXNlfVxuICAgICAgICBBTkQgby5hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgby5hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpgO1xuXG4gIC8vICgzKSBNVFRSIOKAlCBQUk9EVUNUSU9OLU9OTFksIGluZGVwZW5kZW50IG9mIHRoZSBlbnYgZmlsdGVyLiBFdmVyeSBwcm9kdWN0aW9uXG4gIC8vIG91dGNvbWUgaW4td2luZG93OyBmb3IgYSAncmVzdG9yZWQnIG9uZSwgY29ycmVsYXRlIHRvIGl0cyBkZXBsb3knc1xuICAvLyBjb21wbGV0aW9uIHZpYSBleGVjdXRpb25faWQgdG8gbWVhc3VyZSByZXN0b3JlZC5hdCDiiJIgZGVwbG95ZWQuY29tcGxldGVkX2F0LlxuICAvLyBleGVjdXRpb25faWQgaXMgcHJvamVjdGVkIHNvIGFuIGluY2lkZW50LXNvdXJjZWQgcmVjb3ZlcnkgZm9yIHRoZSBzYW1lXG4gIC8vIGRlcGxveSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIG1hbnVhbCByZXN0b3JlZCBnYXAuXG4gIGNvbnN0IG10dHJTcWwgPSBzcWxgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgby5vdXRjb21lIEFTIG91dGNvbWUsXG4gICAgICAgIG8uZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCxcbiAgICAgICAgby5hdDo6dGV4dCBBUyByZXN0b3JlZF9hdCxcbiAgICAgICAgKFNFTEVDVCBNQVgoZC5jb21wbGV0ZWRfYXQpIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZFxuICAgICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwMiBPTiBwMi5pZCA9IGQucGlwZWxpbmVfaWRcbiAgICAgICAgICAgV0hFUkUgcDIub3JnX2lkICR7cHJlZH0gQU5EIGQuZXhlY3V0aW9uX2lkID0gby5leGVjdXRpb25faWRcbiAgICAgICAgICAgICBBTkQgZC5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZC5lbnZpcm9ubWVudCA9ICR7SEVBRExJTkVfRU5WfSk6OnRleHQgQVMgZGVwbG95ZWRfYXRcbiAgICAgIEZST00gJHtzY2hlbWEuZGVwbG95bWVudE91dGNvbWV9IG9cbiAgICAgIFdIRVJFIG8ub3JnX2lkICR7cHJlZH0gQU5EIG8uZW52aXJvbm1lbnQgPSAke0hFQURMSU5FX0VOVn0gJHtvdXRjb21lUGlwZWxpbmVDbGF1c2V9XG4gICAgICAgIEFORCBvLmF0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBvLmF0IDw9ICR7dG99Ojp0aW1lc3RhbXB0emA7XG5cbiAgLy8gKDUpIEluY2lkZW50cyBvcGVuZWQgaW4td2luZG93IChwZXIgZW52KS4gQ29ycmVsYXRlZCBpbiBKUyB0byB0aGUgbW9zdFxuICAvLyByZWNlbnQgc3VjY2Vzc2Z1bCBkZXBsb3kg4oaSIGF1dG9tYXRlZCBwb3N0LWRlcGxveSBmYWlsdXJlIChDRlIpICsgcmVhbFxuICAvLyByZWNvdmVyeSB0aW1lIChyZXNvbHZlZF9hdCDiiJIgb3BlbmVkX2F0KSBmb3IgTVRUUiAocHJvZHVjdGlvbikuXG4gIGNvbnN0IGluY2lkZW50U3FsID0gc3FsYFxuICAgICAgU0VMRUNUIGkuZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnQsIGkub3BlbmVkX2F0Ojp0ZXh0IEFTIG9wZW5lZF9hdCwgaS5yZXNvbHZlZF9hdDo6dGV4dCBBUyByZXNvbHZlZF9hdFxuICAgICAgRlJPTSAke3NjaGVtYS5pbmNpZGVudH0gaVxuICAgICAgV0hFUkUgaS5vcmdfaWQgJHtwcmVkfSAke3NjYW5JbmNpZGVudEVudkNsYXVzZX1cbiAgICAgICAgQU5EIGkub3BlbmVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBpLm9wZW5lZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpgO1xuXG4gIC8vICg0KSBDb3ZlcmFnZTogcmVnaXN0ZXJlZCBwaXBlbGluZXMgdnMgdGhvc2UgdGhhdCBhY3R1YWxseSBkZXBsb3llZCBpbi13aW5kb3cuXG4gIGNvbnN0IGNvdmVyYWdlU3FsID0gc3FsYFxuICAgICAgU0VMRUNUXG4gICAgICAgIChTRUxFQ1QgQ09VTlQoKik6OmludCBGUk9NICR7c2NoZW1hLnBpcGVsaW5lUmVnaXN0cnl9IHJcbiAgICAgICAgICAgV0hFUkUgci5vcmdfaWQgJHtwcmVkfSAke3BpcGVsaW5lQ2xhdXNlUn0pIEFTIHJlZ2lzdGVyZWQsXG4gICAgICAgIChTRUxFQ1QgQ09VTlQoRElTVElOQ1QgZS5waXBlbGluZV9pZCk6OmludCBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLmVudmlyb25tZW50IElTIE5PVCBOVUxMXG4gICAgICAgICAgICAgJHtwaXBlbGluZUNsYXVzZX0gJHtlbnZDbGF1c2V9XG4gICAgICAgICAgICAgQU5EIGUuY29tcGxldGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLmNvbXBsZXRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHopIEFTIGRlcGxveWluZ2A7XG5cbiAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAvLyBTY2FuIG9yZGVyIGlzIGxvYWQtYmVhcmluZyBmb3IgdGhlIGdlbmVyYXRlZC1TUUwgdGVzdHM6IDA9ZGVwbG95LFxuICAgIC8vIDE9b3V0Y29tZXMsIDI9bXR0ciwgMz1jb3ZlcmFnZSwgND1pbmNpZGVudHMgKGFwcGVuZGVkIGxhc3Qgc28gdGhlXG4gICAgLy8gZWFybGllciBpbmRpY2VzIHN0YXkgc3RhYmxlKS5cbiAgICBjb25zdCBkZXBsb3lSb3dzID0gZHJpenpsZVJvd3M8RGVwbG95Um93PigoYXdhaXQgdHguZXhlY3V0ZShkZXBsb3lTcWwpKS5yb3dzKTtcbiAgICBjb25zdCBvdXRjb21lUm93cyA9IGRyaXp6bGVSb3dzPE91dGNvbWVSb3c+KChhd2FpdCB0eC5leGVjdXRlKG91dGNvbWVTcWwpKS5yb3dzKTtcbiAgICBjb25zdCBtdHRyUm93cyA9IGRyaXp6bGVSb3dzPE10dHJQYWlyUm93ICYgeyBvdXRjb21lOiBzdHJpbmcgfT4oKGF3YWl0IHR4LmV4ZWN1dGUobXR0clNxbCkpLnJvd3MpO1xuICAgIGNvbnN0IGNvdmVyYWdlUm93ID0gZHJpenpsZVJvd3M8Q292ZXJhZ2VSb3c+KChhd2FpdCB0eC5leGVjdXRlKGNvdmVyYWdlU3FsKSkucm93cylbMF07XG4gICAgY29uc3QgaW5jaWRlbnRSb3dzID0gZHJpenpsZVJvd3M8SW5jaWRlbnRSb3c+KChhd2FpdCB0eC5leGVjdXRlKGluY2lkZW50U3FsKSkucm93cyk7XG4gICAgcmV0dXJuIHNoYXBlRG9yYShkZXBsb3lSb3dzLCBvdXRjb21lUm93cywgbXR0clJvd3MsIGNvdmVyYWdlUm93LCBpbmNpZGVudFJvd3MsIGZyb20sIHRvLCB7XG4gICAgICBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCxcbiAgICB9LCBlZmZlY3RpdmVXaW5kb3dIb3Vycyk7XG4gIH0pO1xuICAvLyBDYWNoZSBrZXkgTVVTVCBpbmNsdWRlIHRoZSBlZmZlY3RpdmUgaW5jaWRlbnQgd2luZG93OiB0aGUgc2NvcmVjYXJkIHJlYWRzXG4gIC8vIC9kb3JhIHdpdGggdGhlIG9yZydzIGRlZmF1bHQgd2luZG93IHdoaWxlIGFuIGV4cGxpY2l0IC9kb3JhIGNhbGwgbWF5IHBhc3MgYW5cbiAgLy8gb3ZlcnJpZGUg4oCUIGRpZmZlcmVudCB3aW5kb3dzIHlpZWxkIGRpZmZlcmVudCBDRlIvTVRUUiwgc28gdGhleSBtdXN0IG5vdFxuICAvLyBjb2xsaWRlIG9uIHRoZSBzYW1lIGtleS5cbiAgY29uc3Qga2V5ID0gYCR7b3JnSWR9OmRvcmE6JHtmcm9tfToke3RvfToke3BpcGVsaW5lSWQgPz8gJyd9OiR7ZW52aXJvbm1lbnQgPz8gJyd9OiR7ZWZmZWN0aXZlV2luZG93SG91cnN9YDtcbiAgcmV0dXJuIHJ1blJlcG9ydChrZXksIG11bHRpLCBleGVjKTtcbn1cblxuLyoqXG4gKiBTaGFwZSB0aGUgcmF3IERPUkEgc2NhbiByb3dzIGludG8gdGhlIHB1YmxpYyB7QGxpbmsgRG9yYU1ldHJpY3N9LiBCdWNrZXRzIHRoZVxuICogdGVybWluYWwgZGVwbG95IHJvd3MgYnkgZW52aXJvbm1lbnQgKERGIC8gZGVwbG95LXRpbWUgQ0ZSIC8gbWVhc3VyZWQgbGVhZCksXG4gKiBmb2xkcyBpbiB0aGUgcG9zdC1kZXBsb3kgZmFpbHVyZSBjb3VudHMgKG1hbnVhbCBvdXRjb21lcyArIHdlYmhvb2staW5nZXN0ZWRcbiAqIGluY2lkZW50cywgZGVkdXBlZCBieSBkZXBsb3kgZXhlY3V0aW9uKSwgY29tcHV0ZXMgcHJvZHVjdGlvbiBNVFRSIGZyb20gYm90aFxuICogc291cmNlcyAoaW5jaWRlbnQgYHJlc29sdmVkX2F0IOKIkiBvcGVuZWRfYXRgIHRha2luZyBwcmVjZWRlbmNlIG92ZXIgdGhlIG1hbnVhbFxuICogYHJlc3RvcmVkIOKIkiBkZXBsb3llZGApLCBhbmQgcmVjb25jaWxlcyBjb3ZlcmFnZSDigJQgYWxsIGNyb3NzLXNvdXJjZSBtZWRpYW5zXG4gKiBvdmVyIGRlbHRhcyBjbGFtcGVkIOKJpTAuXG4gKlxuICogUGhhc2UgNSBpbmNpZGVudCBjb3JyZWxhdGlvbjogZWFjaCBpbmNpZGVudCBpcyBhdHRyaWJ1dGVkIHRvIHRoZSBtb3N0IHJlY2VudFxuICogU1VDQ0VTU0ZVTCBkZXBsb3kgdG8gaXRzIGVudmlyb25tZW50IHdpdGggYGNvbXBsZXRlZF9hdCDiiaQgb3BlbmVkX2F0YCB3aXRoaW5cbiAqIHtAbGluayBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSU30uIFRoYXQgZGVwbG95IGlzIGEgcG9zdC1kZXBsb3kgZmFpbHVyZTsgYW5cbiAqIHVuY29ycmVsYXRlZCBpbmNpZGVudCAobm8gZWxpZ2libGUgZGVwbG95KSBjb250cmlidXRlcyBub3RoaW5nLlxuICovXG5mdW5jdGlvbiBzaGFwZURvcmEoXG4gIGRlcGxveVJvd3M6IERlcGxveVJvd1tdLFxuICBvdXRjb21lUm93czogT3V0Y29tZVJvd1tdLFxuICBtdHRyUm93czogQXJyYXk8TXR0clBhaXJSb3cgJiB7IG91dGNvbWU6IHN0cmluZyB9PixcbiAgY292ZXJhZ2VSb3c6IENvdmVyYWdlUm93IHwgdW5kZWZpbmVkLFxuICBpbmNpZGVudFJvd3M6IEluY2lkZW50Um93W10sXG4gIGZyb206IHN0cmluZyxcbiAgdG86IHN0cmluZyxcbiAgZmlsdGVyczogeyBwaXBlbGluZUlkPzogc3RyaW5nOyBlbnZpcm9ubWVudD86IHN0cmluZyB9LFxuICB3aW5kb3dIb3VyczogbnVtYmVyID0gRE9SQV9JTkNJREVOVF9XSU5ET1dfSE9VUlMsXG4pOiBEb3JhTWV0cmljcyB7XG4gIC8vIFdpbmRvdyBsZW5ndGggaW4gZGF5cyAoZmxvb3JlZCBhdCAxIHNvIGEgc3ViLWRheSB3aW5kb3cgeWllbGRzIHRoZSBjb3VudCBhc1xuICAvLyB0aGUgcmF0ZSwgbmV2ZXIgLzAgb3IgYW4gZXh0cmFwb2xhdGlvbikuIEd1YXJkIHVucGFyc2VhYmxlIGRhdGVzIOKGkiAxIGRheS5cbiAgY29uc3Qgc3BhbkRheXMgPSAoRGF0ZS5wYXJzZSh0bykgLSBEYXRlLnBhcnNlKGZyb20pKSAvIDg2NDAwMDAwO1xuICBjb25zdCBkYXlzID0gTnVtYmVyLmlzRmluaXRlKHNwYW5EYXlzKSA/IE1hdGgubWF4KHNwYW5EYXlzLCAxKSA6IDE7XG4gIC8vIFdpbmRvdyBlbmQgaW5zdGFudCBmb3IgTVRUUiByaWdodC1jZW5zb3JpbmcgKGEgcmVzb2x1dGlvbiBhZnRlciBgdG9gIGlzXG4gIC8vIHVub2JzZXJ2ZWQpLiArSW5maW5pdHkgd2hlbiBgdG9gIGlzIHVucGFyc2VhYmxlIOKHkiBubyBjZW5zb3JpbmcgKGZhaWwtb3BlbikuXG4gIGNvbnN0IHRvUGFyc2VkID0gRGF0ZS5wYXJzZSh0byk7XG4gIGNvbnN0IHRvTXMgPSBOdW1iZXIuaXNGaW5pdGUodG9QYXJzZWQpID8gdG9QYXJzZWQgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG5cbiAgLy8gUGVyLWVudiBhY2N1bXVsYXRvci5cbiAgaW50ZXJmYWNlIEFjYyB7XG4gICAgZGVwbG95bWVudHM6IG51bWJlcjtcbiAgICBkZXBsb3lUaW1lRmFpbHVyZXM6IG51bWJlcjtcbiAgICBhdHRlbXB0czogbnVtYmVyO1xuICAgIGxlYWRHYXBzOiBudW1iZXJbXTtcbiAgfVxuICBjb25zdCBlbnZzID0gbmV3IE1hcDxzdHJpbmcsIEFjYz4oKTtcbiAgY29uc3QgYWNjRm9yID0gKGVudjogc3RyaW5nKTogQWNjID0+IHtcbiAgICBsZXQgYSA9IGVudnMuZ2V0KGVudik7XG4gICAgaWYgKCFhKSB7IGEgPSB7IGRlcGxveW1lbnRzOiAwLCBkZXBsb3lUaW1lRmFpbHVyZXM6IDAsIGF0dGVtcHRzOiAwLCBsZWFkR2FwczogW10gfTsgZW52cy5zZXQoZW52LCBhKTsgfVxuICAgIHJldHVybiBhO1xuICB9O1xuXG4gIC8vIEEgZGVwbG95IHJvdyBjb3VudHMgdG93YXJkIERGL0NGUi9sZWFkIG9ubHkgaWYgaXQgY29tcGxldGVkIGluc2lkZSBbZnJvbSx0b10uXG4gIC8vIExvb2stYmFjay1vbmx5IHJvd3MgKGluX3dpbmRvdz1mYWxzZSwga2VwdCBmb3IgaW5jaWRlbnQgY29ycmVsYXRpb24pIGFyZVxuICAvLyBza2lwcGVkIGhlcmUuIEFic2VudCBpbiBhIGZpeHR1cmUg4oeSIGluLXdpbmRvdyAodW5pdCB0ZXN0cyBvbWl0IHRoZSBmbGFnKS5cbiAgY29uc3QgaXNJbldpbmRvdyA9IChyb3c6IERlcGxveVJvdyk6IGJvb2xlYW4gPT5cbiAgICByb3cuaW5fd2luZG93ID09IG51bGwgPyB0cnVlIDogKHJvdy5pbl93aW5kb3cgPT09IHRydWUgfHwgcm93LmluX3dpbmRvdyA9PT0gJ3QnKTtcblxuICBmb3IgKGNvbnN0IHJvdyBvZiBkZXBsb3lSb3dzKSB7XG4gICAgY29uc3QgZW52ID0gcm93LmVudmlyb25tZW50O1xuICAgIGlmICghZW52KSBjb250aW51ZTtcbiAgICBpZiAoIWlzSW5XaW5kb3cocm93KSkgY29udGludWU7IC8vIGxvb2stYmFjay1vbmx5IHJvdyDihpIgY29ycmVsYXRpb24sIG5vdCBERi9DRlJcbiAgICBjb25zdCBhID0gYWNjRm9yKGVudik7XG4gICAgaWYgKHJvdy5zdGF0dXMgPT09ICdTVUNDRUVERUQnKSB7XG4gICAgICBhLmRlcGxveW1lbnRzKys7XG4gICAgICBhLmF0dGVtcHRzKys7XG4gICAgICAvLyBNZWFzdXJlZCBsZWFkIHRpbWU6IGRlcGxveSBjb21wbGV0aW9uIOKIkiBleGVjdXRpb24ncyBlYXJsaWVzdCBjb21taXQgdGltZS5cbiAgICAgIGlmIChyb3cuY29tbWl0X3RzICE9IG51bGwgJiYgcm93LmNvbXBsZXRlZF9hdCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGdhcCA9IChEYXRlLnBhcnNlKHJvdy5jb21wbGV0ZWRfYXQpIC0gRGF0ZS5wYXJzZShyb3cuY29tbWl0X3RzKSkgLyAxMDAwO1xuICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKGdhcCkpIGEubGVhZEdhcHMucHVzaChNYXRoLm1heChnYXAsIDApKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJvdy5zdGF0dXMgPT09ICdGQUlMRUQnKSB7XG4gICAgICBhLmRlcGxveVRpbWVGYWlsdXJlcysrO1xuICAgICAgYS5hdHRlbXB0cysrO1xuICAgIH1cbiAgfVxuXG4gIC8vIEluY2lkZW504oaSZGVwbG95IGNvcnJlbGF0aW9uIChQaGFzZSA1KS4gSW5kZXggdGhlIFNVQ0NFU1NGVUwgZGVwbG95cyBwZXIgZW52XG4gIC8vIChleGVjdXRpb24gaWQgKyBjb21wbGV0aW9uIGluc3RhbnQpLCBuZXdlc3QgZmlyc3QsIHNvIGVhY2ggaW5jaWRlbnQgY2FuIGJlXG4gIC8vIGF0dHJpYnV0ZWQgdG8gdGhlIG1vc3QgcmVjZW50IGRlcGxveSB0aGF0IGNvbXBsZXRlZCB3aXRoaW4gdGhlIHdpbmRvd1xuICAvLyBiZWZvcmUgaXQgb3BlbmVkLiBUaGF0IGV4ZWN1dGlvbiBpcyBhIHBvc3QtZGVwbG95IGZhaWx1cmUuXG4gIGNvbnN0IHdpbmRvd01zID0gd2luZG93SG91cnMgKiAzNjAwICogMTAwMDtcbiAgY29uc3Qgc3VjY2Vzc2Z1bEJ5RW52ID0gbmV3IE1hcDxzdHJpbmcsIEFycmF5PHsgZXhlYzogc3RyaW5nOyBjb21wbGV0ZWRNczogbnVtYmVyIH0+PigpO1xuICBmb3IgKGNvbnN0IHJvdyBvZiBkZXBsb3lSb3dzKSB7XG4gICAgaWYgKHJvdy5zdGF0dXMgIT09ICdTVUNDRUVERUQnIHx8ICFyb3cuZW52aXJvbm1lbnQgfHwgcm93LmV4ZWN1dGlvbl9pZCA9PSBudWxsIHx8IHJvdy5jb21wbGV0ZWRfYXQgPT0gbnVsbCkgY29udGludWU7XG4gICAgY29uc3QgbXMgPSBEYXRlLnBhcnNlKHJvdy5jb21wbGV0ZWRfYXQpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG1zKSkgY29udGludWU7XG4gICAgY29uc3QgbGlzdCA9IHN1Y2Nlc3NmdWxCeUVudi5nZXQocm93LmVudmlyb25tZW50KSA/PyBbXTtcbiAgICBsaXN0LnB1c2goeyBleGVjOiByb3cuZXhlY3V0aW9uX2lkLCBjb21wbGV0ZWRNczogbXMgfSk7XG4gICAgc3VjY2Vzc2Z1bEJ5RW52LnNldChyb3cuZW52aXJvbm1lbnQsIGxpc3QpO1xuICB9XG4gIGZvciAoY29uc3QgbGlzdCBvZiBzdWNjZXNzZnVsQnlFbnYudmFsdWVzKCkpIGxpc3Quc29ydCgoYSwgYikgPT4gYi5jb21wbGV0ZWRNcyAtIGEuY29tcGxldGVkTXMpO1xuXG4gIC8qKiBDb3JyZWxhdGUgYW4gaW5jaWRlbnQgdG8gdGhlIG1vc3QgcmVjZW50IGluLXdpbmRvdyBzdWNjZXNzZnVsIGRlcGxveSBleGVjdXRpb24uICovXG4gIGNvbnN0IGNvcnJlbGF0ZSA9IChlbnY6IHN0cmluZywgb3BlbmVkTXM6IG51bWJlcik6IHN0cmluZyB8IG51bGwgPT4ge1xuICAgIGNvbnN0IGxpc3QgPSBzdWNjZXNzZnVsQnlFbnYuZ2V0KGVudik7XG4gICAgaWYgKCFsaXN0KSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKGNvbnN0IGQgb2YgbGlzdCkge1xuICAgICAgaWYgKGQuY29tcGxldGVkTXMgPD0gb3BlbmVkTXMgJiYgb3BlbmVkTXMgLSBkLmNvbXBsZXRlZE1zIDw9IHdpbmRvd01zKSByZXR1cm4gZC5leGVjO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICAvLyBDb3JyZWxhdGVkIGluY2lkZW50cyAoYWxsIGVudnMg4oaSIENGUjsgcHJvZHVjdGlvbiBzdWJzZXQg4oaSIE1UVFIpLiBFYWNoIGNhcnJpZXNcbiAgLy8gdGhlIGRlcGxveSBleGVjdXRpb24gaXQgYXR0cmlidXRlcyB0byArIGl0cyByZWFsIHJlY292ZXJ5IGdhcCAod2hlbiByZXNvbHZlZCkuXG4gIGludGVyZmFjZSBDb3JyZWxhdGVkSW5jaWRlbnQgeyBlbnZpcm9ubWVudDogc3RyaW5nOyBleGVjOiBzdHJpbmc7IHJlc29sdmVkR2FwOiBudW1iZXIgfCBudWxsIH1cbiAgY29uc3QgY29ycmVsYXRlZEluY2lkZW50czogQ29ycmVsYXRlZEluY2lkZW50W10gPSBbXTtcbiAgZm9yIChjb25zdCBpbmMgb2YgaW5jaWRlbnRSb3dzKSB7XG4gICAgaWYgKCFpbmMuZW52aXJvbm1lbnQgfHwgaW5jLm9wZW5lZF9hdCA9PSBudWxsKSBjb250aW51ZTtcbiAgICBjb25zdCBvcGVuZWRNcyA9IERhdGUucGFyc2UoaW5jLm9wZW5lZF9hdCk7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUob3BlbmVkTXMpKSBjb250aW51ZTtcbiAgICBjb25zdCBleGVjID0gY29ycmVsYXRlKGluYy5lbnZpcm9ubWVudCwgb3BlbmVkTXMpO1xuICAgIGlmIChleGVjID09IG51bGwpIGNvbnRpbnVlOyAvLyB1bmNvcnJlbGF0ZWQg4oaSIG5vdCBhdHRyaWJ1dGFibGUgdG8gYSBkZXBsb3lcbiAgICBsZXQgcmVzb2x2ZWRHYXA6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGlmIChpbmMucmVzb2x2ZWRfYXQgIT0gbnVsbCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWRNcyA9IERhdGUucGFyc2UoaW5jLnJlc29sdmVkX2F0KTtcbiAgICAgIC8vIFJpZ2h0LWNlbnNvcmluZzogYSByZXNvbHV0aW9uIEFGVEVSIHRoZSB3aW5kb3cgZW5kIChgdG9gKSBpcyBub3Qgb2JzZXJ2ZWRcbiAgICAgIC8vIHdpdGhpbiB0aGUgd2luZG93IOKAlCB0cmVhdCB0aGUgaW5jaWRlbnQgYXMgc3RpbGwgb3BlbiAoZ2FwIHN0YXlzIG51bGwpIHNvXG4gICAgICAvLyBNVFRSIG5ldmVyIHJlYWRzIHVuYm91bmRlZCBwYXN0IGB0b2AuIFRoZSBpbmNpZGVudCBzdGlsbCBjb3VudHMgdG93YXJkIHRoZVxuICAgICAgLy8gaW5jaWRlbnQgdG90YWwgKHVucmVzb2x2ZWQpLCBpdCBqdXN0IGNvbnRyaWJ1dGVzIG5vIHJlY292ZXJ5IHRpbWUuXG4gICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHJlc29sdmVkTXMpICYmIHJlc29sdmVkTXMgPD0gdG9Ncykge1xuICAgICAgICBjb25zdCBnID0gKHJlc29sdmVkTXMgLSBvcGVuZWRNcykgLyAxMDAwO1xuICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKGcpKSByZXNvbHZlZEdhcCA9IE1hdGgubWF4KGcsIDApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb3JyZWxhdGVkSW5jaWRlbnRzLnB1c2goeyBlbnZpcm9ubWVudDogaW5jLmVudmlyb25tZW50LCBleGVjLCByZXNvbHZlZEdhcCB9KTtcbiAgfVxuXG4gIC8vIFBvc3QtZGVwbG95IGZhaWx1cmVzIHBlciBlbnYg4oCUIHRoZSBESVNUSU5DVCBzZXQgb2YgZGVwbG95IGV4ZWN1dGlvbnMgZmxhZ2dlZFxuICAvLyBieSBhIG1hbnVhbCBgZmFpbGVkYCBvdXRjb21lIE9SIGEgY29ycmVsYXRlZCBpbmNpZGVudCAoZGVkdXBlZCBieSBleGVjdXRpb24sXG4gIC8vIHNvIGEgZGVwbG95IGZsYWdnZWQgYnkgYm90aCBjb3VudHMgb25jZSkuIEEgbWFudWFsIG91dGNvbWUgd2l0aG91dCBhblxuICAvLyBleGVjdXRpb24gaWQgKGxlZ2FjeS91bnJlc29sdmFibGUpIHN0aWxsIGNvdW50cyB2aWEgYSBwZXItcm93IHNlbnRpbmVsLlxuICBjb25zdCBwb3N0RGVwbG95RXhlY3NCeUVudiA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgbGV0IHNlbnRpbmVsID0gMDtcbiAgY29uc3QgZmxhZ0ZvciA9IChlbnY6IHN0cmluZyk6IFNldDxzdHJpbmc+ID0+IHtcbiAgICBsZXQgcyA9IHBvc3REZXBsb3lFeGVjc0J5RW52LmdldChlbnYpO1xuICAgIGlmICghcykgeyBzID0gbmV3IFNldDxzdHJpbmc+KCk7IHBvc3REZXBsb3lFeGVjc0J5RW52LnNldChlbnYsIHMpOyB9XG4gICAgcmV0dXJuIHM7XG4gIH07XG4gIGZvciAoY29uc3QgbyBvZiBvdXRjb21lUm93cykge1xuICAgIGlmIChvLm91dGNvbWUgIT09ICdmYWlsZWQnIHx8ICFvLmVudmlyb25tZW50KSBjb250aW51ZTtcbiAgICBmbGFnRm9yKG8uZW52aXJvbm1lbnQpLmFkZChvLmV4ZWN1dGlvbl9pZCA/PyBgbWFudWFsLSR7c2VudGluZWwrK31gKTtcbiAgICBhY2NGb3Ioby5lbnZpcm9ubWVudCk7IC8vIGVuc3VyZSBlbnYgYXBwZWFycyBldmVuIHdpdGggbm8gZGVwbG95IGV2ZW50c1xuICB9XG4gIGZvciAoY29uc3QgY2kgb2YgY29ycmVsYXRlZEluY2lkZW50cykge1xuICAgIGZsYWdGb3IoY2kuZW52aXJvbm1lbnQpLmFkZChjaS5leGVjKTtcbiAgICBhY2NGb3IoY2kuZW52aXJvbm1lbnQpOyAvLyBlbnN1cmUgZW52IGFwcGVhcnMgZXZlbiBpZiB0aGUgZGVwbG95IGlzIG91dC1vZi13aW5kb3dcbiAgfVxuICBjb25zdCBwb3N0RGVwbG95QnlFbnYgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IFtlbnYsIHNldF0gb2YgcG9zdERlcGxveUV4ZWNzQnlFbnYpIHBvc3REZXBsb3lCeUVudi5zZXQoZW52LCBzZXQuc2l6ZSk7XG5cbiAgY29uc3QgZW52aXJvbm1lbnRzOiBEb3JhRW52TWV0cmljc1tdID0gWy4uLmVudnMuZW50cmllcygpXVxuICAgIC8vIFRoZSBkZXBsb3kgYW5kIGluY2lkZW50IHNjYW5zIGFkbWl0IFBST0RVQ1RJT04gYWxvbmdzaWRlIGEgcmVxdWVzdGVkXG4gICAgLy8gZW52aXJvbm1lbnQgc28gTVRUUiBjYW4gY29ycmVsYXRlIHByb2R1Y3Rpb24gaW5jaWRlbnRzIChzZWVcbiAgICAvLyBgc2NhbkVudkNsYXVzZWApLiBUaGF0IHByb2R1Y3Rpb24gcm93IGlzIHBsdW1iaW5nIGZvciBNVFRSLCBub3Qgc29tZXRoaW5nXG4gICAgLy8gdGhlIGNhbGxlciBhc2tlZCB0byBzZWUg4oCUIHJlcG9ydCBvbmx5IHRoZSBlbnZpcm9ubWVudCB0aGF0IHdhcyByZXF1ZXN0ZWQuXG4gICAgLmZpbHRlcigoW2Vudmlyb25tZW50XSkgPT4gIWZpbHRlcnMuZW52aXJvbm1lbnQgfHwgZW52aXJvbm1lbnQgPT09IGZpbHRlcnMuZW52aXJvbm1lbnQpXG4gICAgLm1hcCgoW2Vudmlyb25tZW50LCBhXSkgPT4ge1xuICAgICAgY29uc3QgcG9zdERlcGxveUZhaWx1cmVzID0gcG9zdERlcGxveUJ5RW52LmdldChlbnZpcm9ubWVudCkgPz8gMDtcbiAgICAgIGNvbnN0IHJhd1BlckRheSA9IGEuZGVwbG95bWVudHMgLyBkYXlzO1xuICAgICAgY29uc3QgbnVtZXJhdG9yID0gYS5kZXBsb3lUaW1lRmFpbHVyZXMgKyBwb3N0RGVwbG95RmFpbHVyZXM7XG4gICAgICAvLyBDbGFtcCB0byBbMCwxMDBdOiBwb3N0LWRlcGxveSBmYWlsdXJlcyBjYW4gY29ycmVsYXRlIHRvIGEgZGVwbG95IHRoYXRcbiAgICAgIC8vIGNvbXBsZXRlZCBqdXN0IGJlZm9yZSB0aGUgd2luZG93IChrZXB0IGZvciBjb3JyZWxhdGlvbiksIHNvIHRoZSBudW1lcmF0b3JcbiAgICAgIC8vIGNhbiB0cmFuc2llbnRseSBleGNlZWQgaW4td2luZG93IGF0dGVtcHRzIOKAlCBhIENGUiA+IDEwMCUgaXMgbmV2ZXIgdmFsaWQuXG4gICAgICBjb25zdCByYXdSYXRlID0gYS5hdHRlbXB0cyA+IDAgPyBNYXRoLm1pbigxMDAsIChudW1lcmF0b3IgLyBhLmF0dGVtcHRzKSAqIDEwMCkgOiAwO1xuICAgICAgY29uc3QgbHRNZWRpYW4gPSBtZWRpYW4oYS5sZWFkR2Fwcyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgZGVwbG95bWVudEZyZXF1ZW5jeToge1xuICAgICAgICAgIGRlcGxveW1lbnRzOiBhLmRlcGxveW1lbnRzLFxuICAgICAgICAgIHBlckRheTogcm91bmQocmF3UGVyRGF5LCAyKSxcbiAgICAgICAgICBsZXZlbDogZG9yYUxldmVsRm9yRnJlcXVlbmN5KHJhd1BlckRheSwgYS5kZXBsb3ltZW50cyksXG4gICAgICAgIH0sXG4gICAgICAgIGNoYW5nZUZhaWx1cmVSYXRlOiB7XG4gICAgICAgICAgcmF0ZTogcm91bmQocmF3UmF0ZSwgMSksXG4gICAgICAgICAgZGVwbG95VGltZUZhaWx1cmVzOiBhLmRlcGxveVRpbWVGYWlsdXJlcyxcbiAgICAgICAgICBwb3N0RGVwbG95RmFpbHVyZXMsXG4gICAgICAgICAgYXR0ZW1wdHM6IGEuYXR0ZW1wdHMsXG4gICAgICAgICAgbGV2ZWw6IGRvcmFMZXZlbEZvckNoYW5nZUZhaWx1cmUocmF3UmF0ZSwgYS5hdHRlbXB0cyksXG4gICAgICAgIH0sXG4gICAgICAgIGxlYWRUaW1lOiB7XG4gICAgICAgICAgZGVwbG95bWVudHM6IGEubGVhZEdhcHMubGVuZ3RoLFxuICAgICAgICAgIG1lZGlhblNlY29uZHM6IGx0TWVkaWFuICE9IG51bGwgPyByb3VuZChsdE1lZGlhbiwgMSkgOiBudWxsLFxuICAgICAgICAgIGxldmVsOiBkb3JhTGV2ZWxGb3JMZWFkVGltZShsdE1lZGlhbiksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0pXG4gICAgLnNvcnQoKHgsIHkpID0+IHtcbiAgICAgIGlmICh4LmVudmlyb25tZW50ID09PSBIRUFETElORV9FTlYpIHJldHVybiAtMTtcbiAgICAgIGlmICh5LmVudmlyb25tZW50ID09PSBIRUFETElORV9FTlYpIHJldHVybiAxO1xuICAgICAgcmV0dXJuIHguZW52aXJvbm1lbnQubG9jYWxlQ29tcGFyZSh5LmVudmlyb25tZW50KTtcbiAgICB9KTtcblxuICAvLyBNVFRSIOKAlCBQUk9EVUNUSU9OLU9OTFksIGZyb20gQk9USCBzb3VyY2VzLiBJbmNpZGVudHMgdGFrZSBwcmVjZWRlbmNlOiBhXG4gIC8vIHByb2R1Y3Rpb24gaW5jaWRlbnQgY29ycmVsYXRlZCB0byBhIGRlcGxveSBjb250cmlidXRlcyB0aGUgcmVhbCByZWNvdmVyeVxuICAvLyAoYHJlc29sdmVkX2F0IOKIkiBvcGVuZWRfYXRgKSwgYW5kIGFueSBtYW51YWwgb3V0Y29tZSBvbiB0aGUgU0FNRSBkZXBsb3kgaXNcbiAgLy8gc2tpcHBlZC4gTWFudWFsIG91dGNvbWVzIG9uIG90aGVyIGRlcGxveXMga2VlcCB0aGUgUGhhc2UtMiBiZWhhdmlvclxuICAvLyAoYGZhaWxlZGAg4oaSIGFuIGluY2lkZW50OyBgcmVzdG9yZWRgIOKGkiBhIHJlY292ZXJ5IGdhcCBvZiBgcmVzdG9yZWQg4oiSIGRlcGxveWVkYCkuXG4gIGxldCBpbmNpZGVudHMgPSAwLCByZXN0b3JlZCA9IDA7XG4gIGNvbnN0IG10dHJHYXBzOiBudW1iZXJbXSA9IFtdO1xuICAvLyBFeGVjdXRpb25zIGFscmVhZHkgYXR0cmlidXRlZCB0byBhIHByb2R1Y3Rpb24gaW5jaWRlbnQgKHByZWNlZGVuY2UgZ3VhcmQpLlxuICBjb25zdCBpbmNpZGVudEV4ZWNzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgY2kgb2YgY29ycmVsYXRlZEluY2lkZW50cykge1xuICAgIGlmIChjaS5lbnZpcm9ubWVudCAhPT0gSEVBRExJTkVfRU5WKSBjb250aW51ZTsgLy8gTVRUUiBpcyBwcm9kdWN0aW9uLW9ubHlcbiAgICBpbmNpZGVudHMrKztcbiAgICBpbmNpZGVudEV4ZWNzLmFkZChjaS5leGVjKTtcbiAgICBpZiAoY2kucmVzb2x2ZWRHYXAgIT0gbnVsbCkgeyByZXN0b3JlZCsrOyBtdHRyR2Fwcy5wdXNoKGNpLnJlc29sdmVkR2FwKTsgfVxuICB9XG4gIGZvciAoY29uc3QgbSBvZiBtdHRyUm93cykge1xuICAgIC8vIEluY2lkZW50IHByZWNlZGVuY2U6IGRvbid0IGRvdWJsZS1jb3VudCBhIGRlcGxveSBhbHJlYWR5IGZsYWdnZWQgYnkgYW4gaW5jaWRlbnQuXG4gICAgaWYgKG0uZXhlY3V0aW9uX2lkICE9IG51bGwgJiYgaW5jaWRlbnRFeGVjcy5oYXMobS5leGVjdXRpb25faWQpKSBjb250aW51ZTtcbiAgICBpZiAobS5vdXRjb21lID09PSAnZmFpbGVkJykgeyBpbmNpZGVudHMrKzsgY29udGludWU7IH1cbiAgICBpZiAobS5vdXRjb21lID09PSAncmVzdG9yZWQnKSB7XG4gICAgICByZXN0b3JlZCsrO1xuICAgICAgaWYgKG0ucmVzdG9yZWRfYXQgIT0gbnVsbCAmJiBtLmRlcGxveWVkX2F0ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgZ2FwID0gKERhdGUucGFyc2UobS5yZXN0b3JlZF9hdCkgLSBEYXRlLnBhcnNlKG0uZGVwbG95ZWRfYXQpKSAvIDEwMDA7XG4gICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoZ2FwKSkgbXR0ckdhcHMucHVzaChNYXRoLm1heChnYXAsIDApKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgbXR0ck1lZGlhbiA9IG1lZGlhbihtdHRyR2Fwcyk7XG5cbiAgY29uc3QgcmVnaXN0ZXJlZCA9IE51bWJlcihjb3ZlcmFnZVJvdz8ucmVnaXN0ZXJlZCkgfHwgMDtcbiAgY29uc3QgZGVwbG95aW5nID0gTnVtYmVyKGNvdmVyYWdlUm93Py5kZXBsb3lpbmcpIHx8IDA7XG5cbiAgcmV0dXJuIHtcbiAgICB3aW5kb3c6IHsgZnJvbSwgdG8gfSxcbiAgICBmaWx0ZXJzOiB7IHBpcGVsaW5lSWQ6IGZpbHRlcnMucGlwZWxpbmVJZCA/PyBudWxsLCBlbnZpcm9ubWVudDogZmlsdGVycy5lbnZpcm9ubWVudCA/PyBudWxsIH0sXG4gICAgaGVhZGxpbmU6IEhFQURMSU5FX0VOVixcbiAgICBlbnZpcm9ubWVudHMsXG4gICAgbWVhblRpbWVUb1Jlc3RvcmU6IHtcbiAgICAgIGluY2lkZW50cyxcbiAgICAgIHJlc3RvcmVkLFxuICAgICAgbWVkaWFuU2Vjb25kczogbXR0ck1lZGlhbiAhPSBudWxsID8gcm91bmQobXR0ck1lZGlhbiwgMSkgOiBudWxsLFxuICAgICAgbGV2ZWw6IGRvcmFMZXZlbEZvclJlc3RvcmUobXR0ck1lZGlhbiksXG4gICAgfSxcbiAgICBjb3ZlcmFnZToge1xuICAgICAgcmVnaXN0ZXJlZCxcbiAgICAgIGRlcGxveWluZyxcbiAgICAgIHdpdGhvdXREZXBsb3lzOiBNYXRoLm1heChyZWdpc3RlcmVkIC0gZGVwbG95aW5nLCAwKSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIDEuOWIgRE9SQSB0cmVuZCDigJQgZGVwbG95bWVudCBmcmVxdWVuY3kgKyBkZXBsb3ktdGltZSBjaGFuZ2UtZmFpbHVyZSByYXRlXG4gKiBidWNrZXRlZCBieSBgaW50ZXJ2YWxgIChkYXkvd2Vlay9tb250aCkgZm9yIGEgc3BhcmtsaW5lLiBEZXBsb3ktYmFzaXMgbGlrZVxuICogZ2V0RG9yYU1ldHJpY3M6IGJ1Y2tldHMgdGVybWluYWwgZGVwbG95LXN0YWdlIGV4ZWN1dGlvbnMgb24gdGhlaXJcbiAqIGBjb21wbGV0ZWRfYXRgLiBTaGFyZXMgdGhlIG9yZy9yb2xsdXAgKyBwaXBlbGluZUlkL2Vudmlyb25tZW50IHNjb3BpbmcuIE1UVFIsXG4gKiBsZWFkIHRpbWUsIGFuZCBwb3N0LWRlcGxveSBDRlIgYXJlIGludGVudGlvbmFsbHkgb21pdHRlZCAodG9vIGhlYXZ5IHRvIGJ1Y2tldCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREb3JhVHJlbmQoXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIGludGVydmFsOiBzdHJpbmcsXG4gIGZyb206IHN0cmluZyxcbiAgdG86IHN0cmluZyxcbiAgb3JnSWRzPzogc3RyaW5nW10sXG4gIG9wdHM6IERvcmFPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPERvcmFUcmVuZFBvaW50W10+IHtcbiAgYXNzZXJ0UmVwb3J0SW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSBvcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgY29uc3QgeyBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCB9ID0gb3B0cztcbiAgY29uc3QgcGlwZWxpbmVDbGF1c2UgPSBwaXBlbGluZUlkID8gc3FsYEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfWAgOiBzcWxgYDtcbiAgY29uc3QgZW52Q2xhdXNlID0gZW52aXJvbm1lbnQgPyBzcWxgQU5EIGUuZW52aXJvbm1lbnQgPSAke2Vudmlyb25tZW50fWAgOiBzcWxgYDtcbiAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgV0lUSCBkZXBsb3lzIEFTIChcbiAgICAgICAgLS0gUEVSLUVYRUNVVElPTiBkZXBsb3kgdW5pdCAoRDEpOiBvbmUgcm93IHBlciAoZW52aXJvbm1lbnQsIGV4ZWN1dGlvbiksXG4gICAgICAgIC0tIGV2ZXJ5IGRlcGxveSBTVEFHRSB0byB0aGF0IGVudiB3aXRoaW4gdGhlIGV4ZWN1dGlvbiByb2xsZWQgdXAgdG8gYVxuICAgICAgICAtLSBzaW5nbGUgdGVybWluYWwgc3RhdHVzIOKAlCBOT1Qgb25lIHJvdyBwZXIgc3RhZ2UuXG4gICAgICAgIFNFTEVDVFxuICAgICAgICAgICR7dGVybWluYWxTdGF0dXNSb2xsdXB9IEFTIHN0YXR1cyxcbiAgICAgICAgICBNQVgoZS5jb21wbGV0ZWRfYXQpIEFTIGNvbXBsZXRlZF9hdFxuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLmVudmlyb25tZW50IElTIE5PVCBOVUxMXG4gICAgICAgICAgJHtwaXBlbGluZUNsYXVzZX0gJHtlbnZDbGF1c2V9XG4gICAgICAgICAgQU5EIGUuY29tcGxldGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLmNvbXBsZXRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpcbiAgICAgICAgR1JPVVAgQlkgZS5lbnZpcm9ubWVudCwgZS5leGVjdXRpb25faWRcbiAgICAgIClcbiAgICAgIFNFTEVDVFxuICAgICAgICBEQVRFX1RSVU5DKCR7aW50ZXJ2YWx9LCBjb21wbGV0ZWRfYXQpOjp0ZXh0IEFTIHBlcmlvZCxcbiAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnU1VDQ0VFREVEJyk6OmludCBBUyBkZXBsb3ltZW50cyxcbiAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsZWQsXG4gICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcpKTo6aW50IEFTIHRvdGFsLFxuICAgICAgICAtLSBxdW90ZWQgYWxpYXMgc28gdGhlIHJhdyByb3cga2V5IGlzIGV4YWN0bHkgdGhlIERvcmFUcmVuZFBvaW50IGZpZWxkXG4gICAgICAgIENPQUxFU0NFKFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ0ZBSUxFRCcpOjpudW1lcmljXG4gICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJykpLCAwKSAqIDEwMCwgMSksIDApOjpmbG9hdCBBUyBcImNoYW5nZUZhaWx1cmVQY3RcIlxuICAgICAgRlJPTSBkZXBsb3lzXG4gICAgICBHUk9VUCBCWSBwZXJpb2QgT1JERVIgQlkgcGVyaW9kXG4gICAgYCkudGhlbihyID0+IGRyaXp6bGVSb3dzPERvcmFUcmVuZFBvaW50PihyLnJvd3MpKSk7XG4gIGNvbnN0IGtleSA9IGAke29yZ0lkfTpkb3JhLXRyZW5kOiR7aW50ZXJ2YWx9OiR7ZnJvbX06JHt0b306JHtwaXBlbGluZUlkID8/ICcnfToke2Vudmlyb25tZW50ID8/ICcnfWA7XG4gIHJldHVybiBydW5SZXBvcnQoa2V5LCBtdWx0aSwgZXhlYyk7XG59XG5cbi8qKlxuICogMS4xMCBQZXItcGlwZWxpbmUgQlVJTEQgSEVBTFRIIChQaGFzZSA2KSDigJQgYSBzdGFuZGFyZCAoTk9UIGBhZHZhbmNlZF9yZXBvcnRpbmdgKVxuICogcGVyLXN0YWdlIGJyZWFrZG93biBmb3Igb25lIHBpcGVsaW5lIG92ZXIgYSBbZnJvbSx0b10gd2luZG93LiBBZ2dyZWdhdGVzIHRoZVxuICogZXhpc3RpbmcgYHBpcGVsaW5lX2V2ZW50c2AgU1RBR0Ugcm93czogZWFjaCBzdGFnZSBpcyByb2xsZWQgdXAgcGVyIGV4ZWN1dGlvblxuICogdG8gYSB0ZXJtaW5hbCBzdGF0dXMgKEZBSUxFRCB3aW5zLCB0aGVuIFNVQ0NFRURFRCkgKyBpdHMgbWF4IGR1cmF0aW9uLCB0aGVuXG4gKiBncm91cGVkIHBlciBzdGFnZSBpbnRvIHJ1bi9zdWNjZXNzL2ZhaWx1cmUgY291bnRzLCBhIHN1Y2Nlc3MgcmF0ZSwgYW5kXG4gKiBkdXJhdGlvbiBwZXJjZW50aWxlcyAocDUwL3A5MC9wOTkpLiBUb3RhbHMgc3VtIGFjcm9zcyBzdGFnZXMuIE9yZy1zY29wZWQgdmlhXG4gKiB0aGUgcGlwZWxpbmUgam9pbiAoYHAub3JnX2lkICR7cHJlZH1gKSArIHJvbGx1cC1hd2FyZSBsaWtlIHRoZSBzaWJsaW5nIHJlcG9ydHM7XG4gKiBhIHBpcGVsaW5lSWQgb3duZWQgYnkgYW5vdGhlciBvcmcgcmV0dXJucyBhbiBlbXB0eSBicmVha2Rvd24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCdWlsZEhlYWx0aChcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcGlwZWxpbmVJZDogc3RyaW5nLFxuICBmcm9tOiBzdHJpbmcsXG4gIHRvOiBzdHJpbmcsXG4gIG9yZ0lkcz86IHN0cmluZ1tdLFxuKTogUHJvbWlzZTxCdWlsZEhlYWx0aD4ge1xuICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSBvcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICBjb25zdCByb3dzID0gZHJpenpsZVJvd3M8QnVpbGRIZWFsdGhTdGFnZT4oKGF3YWl0IHR4LmV4ZWN1dGUoc3FsYFxuICAgICAgV0lUSCBzdGFnZV9ydW5zIEFTIChcbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgZS5zdGFnZV9uYW1lIEFTIHN0YWdlLFxuICAgICAgICAgICR7dGVybWluYWxTdGF0dXNSb2xsdXB9IEFTIHN0YXR1cyxcbiAgICAgICAgICBNQVgoZS5kdXJhdGlvbl9tcykgQVMgZHVyYXRpb25fbXNcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5waXBlbGluZV9pZCA9ICR7cGlwZWxpbmVJZH1cbiAgICAgICAgICBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5zdGFnZV9uYW1lIElTIE5PVCBOVUxMXG4gICAgICAgICAgQU5EIGUuc3RhcnRlZF9hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5zdGFydGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlLnN0YWdlX25hbWUsIGUuZXhlY3V0aW9uX2lkXG4gICAgICApXG4gICAgICBTRUxFQ1RcbiAgICAgICAgc3RhZ2UsXG4gICAgICAgIENPVU5UKCopOjppbnQgQVMgcnVucyxcbiAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnU1VDQ0VFREVEJyk6OmludCBBUyBzdWNjZXNzZXMsXG4gICAgICAgIENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ0ZBSUxFRCcpOjppbnQgQVMgZmFpbHVyZXMsXG4gICAgICAgIENPQUxFU0NFKFJPVU5EKENPVU5UKCopIEZJTFRFUiAoV0hFUkUgc3RhdHVzID0gJ1NVQ0NFRURFRCcpOjpudW1lcmljXG4gICAgICAgICAgLyBOVUxMSUYoQ09VTlQoKiksIDApICogMTAwLCAxKSwgMCk6OmZsb2F0IEFTIFwic3VjY2Vzc1JhdGVcIixcbiAgICAgICAgUEVSQ0VOVElMRV9DT05UKDAuNSkgV0lUSElOIEdST1VQIChPUkRFUiBCWSBkdXJhdGlvbl9tcyk6OmludCBBUyBcInA1ME1zXCIsXG4gICAgICAgIFBFUkNFTlRJTEVfQ09OVCgwLjkpIFdJVEhJTiBHUk9VUCAoT1JERVIgQlkgZHVyYXRpb25fbXMpOjppbnQgQVMgXCJwOTBNc1wiLFxuICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC45OSkgV0lUSElOIEdST1VQIChPUkRFUiBCWSBkdXJhdGlvbl9tcyk6OmludCBBUyBcInA5OU1zXCJcbiAgICAgIEZST00gc3RhZ2VfcnVuc1xuICAgICAgV0hFUkUgc3RhdHVzIElOICgnU1VDQ0VFREVEJywgJ0ZBSUxFRCcpXG4gICAgICBHUk9VUCBCWSBzdGFnZVxuICAgICAgT1JERVIgQlkgcnVucyBERVNDLCBzdGFnZVxuICAgIGApKS5yb3dzKTtcblxuICAgIC8vIFRvdGFscyBzdW0gYWNyb3NzIHN0YWdlcyAodG90YWwgc3RhZ2UtcnVucyAvIHN0YWdlLWZhaWx1cmVzIGluIHRoZSB3aW5kb3cpLlxuICAgIGxldCBydW5zID0gMCwgZmFpbHVyZXMgPSAwO1xuICAgIGZvciAoY29uc3QgcyBvZiByb3dzKSB7IHJ1bnMgKz0gcy5ydW5zOyBmYWlsdXJlcyArPSBzLmZhaWx1cmVzOyB9XG4gICAgY29uc3QgZmFpbHVyZVJhdGUgPSBydW5zID4gMCA/IHJvdW5kKChmYWlsdXJlcyAvIHJ1bnMpICogMTAwLCAxKSA6IDA7XG4gICAgcmV0dXJuIHsgc3RhZ2VzOiByb3dzLCB0b3RhbHM6IHsgcnVucywgZmFpbHVyZXMsIGZhaWx1cmVSYXRlIH0gfTtcbiAgfSk7XG4gIHJldHVybiBydW5SZXBvcnQoYCR7b3JnSWR9OmJ1aWxkLWhlYWx0aDoke3BpcGVsaW5lSWR9OiR7ZnJvbX06JHt0b31gLCBtdWx0aSwgZXhlYyk7XG59XG5cbi8vIOKUgOKUgCBDYXRlZ29yeSAyOiBQbHVnaW4gSW52ZW50b3J5ICYgQnVpbGRzIOKUgOKUgFxuXG4vKiogMi4xIFBsdWdpbiBzdW1tYXJ5IOKAlCBjb3VudHMgYW5kIGJyZWFrZG93bnMuXG4gKiAgSU5URU5USU9OQUxMWSBTSU5HTEUtT1JHIChubyByb2xsdXApOiBwbHVnaW4gaW52ZW50b3J5IGlzIGFuIG9yZy1vd25lZFxuICogIGFzc2V0IGNvdW50LCBub3QgYW4gZXhlY3V0aW9uL2J1aWxkIGFjdGl2aXR5IHJlcG9ydCwgc28gYSBwYXJlbnQncyB2aWV3IGlzXG4gKiAgaXRzIG93biBwbHVnaW5zIOKAlCB0ZWFtcyBtYW5hZ2UgdGhlaXIgb3duIGludmVudG9yeS4gU2luZ2xlIGA9ICRvcmdgIHNjb3BlLiAqL1xuIl19
549
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9yYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGkvcmVwb3J0aW5nL2RvcmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUNMLFlBQVksRUFBRSwwQkFBMEIsRUFBRSwwQkFBMEIsRUFDcEUscUJBQXFCLEVBQUUseUJBQXlCLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQzNGLEtBQUssRUFBRSxNQUFNLEdBQ2QsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FDbEMsS0FBYSxFQUNiLElBQVksRUFDWixFQUFVLEVBQ1YsTUFBaUIsRUFDakIsSUFBSSxHQUFnQixFQUFFO0lBRXRCLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoRCxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQztJQUN6QyxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQSx1QkFBdUIsVUFBVSxFQUFFLENB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Q0FBQztJQUNILE9BQU8sU0FBUyxDQUFDLEdBQUcsS0FBSyxpQkFBaUIsVUFBVSxJQUFJLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDckYsQ0FBQztBQUVELDhDQUE4QztBQUU5Qzs7O2lGQUdpRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIERPUkEgbWV0cmljczogdGhlIGZvdXIgaGVhZGxpbmUgbWVhc3VyZXMsIHRoZWlyIHBlci1lbnZpcm9ubWVudCBicmVha2Rvd24sXG4gKiB0aGUgdHJlbmQgc2VyaWVzLCBhbmQgcGVyLXBpcGVsaW5lIGJ1aWxkIGhlYWx0aC5cbiAqXG4gKiBCeSBmYXIgdGhlIGxhcmdlc3QgZG9tYWluIGluIHRoZSByZXBvcnRpbmcgc2VydmljZSAofjQ5MCBsaW5lcyBvZiBxdWVyeSArXG4gKiBzaGFwaW5nIGFnYWluc3Qgc2l4IHJvdyBzaGFwZXMpLCB3aGljaCBpcyB3aHkgaXQgbGl2ZXMgaW4gaXRzIG93biBtb2R1bGUuXG4gKiBSZXBvcnRpbmdTZXJ2aWNlIGRlbGVnYXRlcyB0byB0aGVzZTsgdGhlIGJhbmRpbmcgdGhyZXNob2xkcyB0aGV5IGFwcGx5IGFyZSBpblxuICogLi9kb3JhLXNjb3JpbmcudHMsIGRlbGliZXJhdGVseSBzZXBhcmF0ZSBzbyB0aGV5IGNhbiBiZSB0ZXN0ZWQgd2l0aG91dCBhIERCLlxuICovXG5cbmltcG9ydCB7IHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7XG4gIEhFQURMSU5FX0VOViwgRE9SQV9JTkNJREVOVF9XSU5ET1dfSE9VUlMsIHJlc29sdmVJbmNpZGVudFdpbmRvd0hvdXJzLFxuICBkb3JhTGV2ZWxGb3JGcmVxdWVuY3ksIGRvcmFMZXZlbEZvckNoYW5nZUZhaWx1cmUsIGRvcmFMZXZlbEZvclJlc3RvcmUsIGRvcmFMZXZlbEZvckxlYWRUaW1lLFxuICByb3VuZCwgbWVkaWFuLFxufSBmcm9tICcuL2RvcmEtc2NvcmluZy5qcyc7XG5pbXBvcnQgeyBvcmdTY29wZSwgcnVuUmVwb3J0IH0gZnJvbSAnLi9xdWVyeS1zY29wZS5qcyc7XG5pbXBvcnQgeyBhc3NlcnRSZXBvcnRJbnRlcnZhbCwgdGVybWluYWxTdGF0dXNSb2xsdXAgfSBmcm9tICcuL3NxbC1oZWxwZXJzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRG9yYU9wdGlvbnMsIERvcmFNZXRyaWNzLCBEb3JhRW52TWV0cmljcywgRG9yYVRyZW5kUG9pbnQsIEJ1aWxkSGVhbHRoLCBCdWlsZEhlYWx0aFN0YWdlLFxuICBEZXBsb3lSb3csIE91dGNvbWVSb3csIE10dHJQYWlyUm93LCBJbmNpZGVudFJvdywgQ292ZXJhZ2VSb3csXG59IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi4vLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudFR4IH0gZnJvbSAnLi4vLi4vZGF0YWJhc2UvdGVuYW5jeS5qcyc7XG5pbXBvcnQgeyBkcml6emxlUm93cyB9IGZyb20gJy4uL2NydWQtc2VydmljZS5qcyc7XG5cbi8qKlxuICogRE9SQSBtZXRyaWNzIG92ZXIgYSBbZnJvbSx0b10gZGVwbG95LWNvbXBsZXRpb24gd2luZG93LCBvcmctc2NvcGVkICtcbiAqIHJvbGx1cC1hd2FyZS4gREVQTE9ZLUJBU0lTIE9OTFkg4oCUIGV2ZXJ5IG1ldHJpYyBkZXJpdmVzIGZyb20gcmVhbCBkZXBsb3ktc3RhZ2VcbiAqIGV4ZWN1dGlvbnMgKGBldmVudF90eXBlPSdTVEFHRSdgIHdpdGggYSBub24tbnVsbCBgZW52aXJvbm1lbnRgLCBzZXQgYnkgdGhlXG4gKiBmb3J3YXJkZXIgZm9yIHRoZSBzdGFnZXMgYSB1c2VyIGRlY2xhcmVkIGluIGBwYi5kZXBsb3lzYCkuIE5vIHJ1bi1iYXNlZFxuICogZmFsbGJhY2s6IGEgcGlwZWxpbmUgd2l0aCBubyBkZXBsb3kgc3RhZ2UgcHJvZHVjZXMgbm8gRE9SQSBkYXRhLlxuICpcbiAqIEZvdXIgc2NvcGVkIFNRTCBzY2FucyBydW4gaW5zaWRlIG9uZSB0eCAoZWFjaCBvcmctZ2F0ZWQgYnkgYHAub3JnX2lkICR7cHJlZH1gXG4gKiAvIGBvLm9yZ19pZCAke3ByZWR9YCBzbyBhIHJvbGx1cCBwYXNzZXMgdGhlIG9yZ+KGknRlYW0gc3VidHJlZSBhbmQgYSBmb3JlaWduXG4gKiBvcmcncyByb3dzIG5ldmVyIGVudGVyKTogKDEpIHRlcm1pbmFsIGRlcGxveSByb3dzIFBFUiAoZXhlY3V0aW9uLCBlbnYpIOKAlCBvbmVcbiAqIFwiZGVwbG95bWVudFwiID0gb25lIGV4ZWN1dGlvbiByZWFjaGluZyBhbiBlbnYg4oCUIOKGkiBERiAvIGRlcGxveS10aW1lIENGUiAvXG4gKiBtZWFzdXJlZCBsZWFkIHRpbWUgKGxlYWQgdGltZSBqb2lucyB0aGUgZXhlY3V0aW9uJ3MgZWFybGllc3QgY29tbWl0KTtcbiAqIHRoZSBzY2FuIGFsc28gcmVhY2hlcyBiYWNrIGB3aW5kb3dIb3Vyc2AgYmVmb3JlIGBmcm9tYCBzbyBpbmNpZGVudHMgb3BlbmVkXG4gKiBuZWFyIHRoZSB3aW5kb3cgc3RhcnQgY2FuIGNvcnJlbGF0ZSB0byBhIGp1c3QtcHJpb3IgZGVwbG95OyAoMikgYGRlcGxveW1lbnRfb3V0Y29tZXNgXG4gKiBpbi13aW5kb3cg4oaSIHBvc3QtZGVwbG95IENGUiBjb21wb25lbnQ7ICgzKSBwcm9kdWN0aW9uIHJlc3RvcmVkL2ZhaWxlZFxuICogb3V0Y29tZXMgam9pbmVkIHRvIHRoZWlyIGRlcGxveSDihpIgTVRUUjsgKDQpIHJlZ2lzdHJ5IHZzIGRlcGxveWluZyDihpIgY292ZXJhZ2UuXG4gKiBUaGUgY3Jvc3Mtc291cmNlIG1lZGlhbnMgKGxlYWQgdGltZSwgTVRUUikgYXJlIGNvbXB1dGVkIGluIEpTIGZyb20gY2xhbXBlZFxuICogKOKJpTApIGRlbHRhcy5cbiAqXG4gKiBAcGFyYW0gb3B0cy5waXBlbGluZUlkICAgIHJlc3RyaWN0IHRvIG9uZSBwaXBlbGluZSAocGVyLXBpcGVsaW5lIERPUkEpXG4gKiBAcGFyYW0gb3B0cy5lbnZpcm9ubWVudCAgIHJlc3RyaWN0IHRvIG9uZSBkZXBsb3kgZW52aXJvbm1lbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldERvcmFNZXRyaWNzKFxuICBvcmdJZDogc3RyaW5nLFxuICBmcm9tOiBzdHJpbmcsXG4gIHRvOiBzdHJpbmcsXG4gIG9yZ0lkcz86IHN0cmluZ1tdLFxuICBvcHRzOiBEb3JhT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxEb3JhTWV0cmljcz4ge1xuICBjb25zdCB7IHByZWQsIG11bHRpIH0gPSBvcmdTY29wZShvcmdJZCwgb3JnSWRzKTtcbiAgY29uc3QgeyBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCB9ID0gb3B0cztcbiAgY29uc3QgcGlwZWxpbmVDbGF1c2UgPSBwaXBlbGluZUlkID8gc3FsYEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfWAgOiBzcWxgYDtcbiAgY29uc3QgcGlwZWxpbmVDbGF1c2VSID0gcGlwZWxpbmVJZCA/IHNxbGBBTkQgci5waXBlbGluZV9pZCA9ICR7cGlwZWxpbmVJZH1gIDogc3FsYGA7XG4gIC8vIFBvc3QtZGVwbG95IG91dGNvbWVzIGNhcnJ5IG5vIHBpcGVsaW5lIGlkLCBvbmx5IHRoZSBleGVjdXRpb24gdGhhdFxuICAvLyBwcm9kdWNlZCB0aGVtLCBzbyBhIHBlci1waXBlbGluZSB2aWV3IGhhcyB0byBzY29wZSB0aGVtIFRIUk9VR0ggdGhlXG4gIC8vIGV4ZWN1dGlvbi4gV2l0aG91dCBpdCB0aGUgb3V0Y29tZSBhbmQgTVRUUiBzY2FucyByZWFkIGV2ZXJ5IHBpcGVsaW5lIGluIHRoZVxuICAvLyBvcmc6IGFub3RoZXIgcGlwZWxpbmUncyBgZmFpbGVkYCBtYXJrZXIgY291bnRlZCBhZ2FpbnN0IHRoaXMgb25lJ3MgY2hhbmdlXG4gIC8vIGZhaWx1cmUgcmF0ZSAodGVuIGNsZWFuIGRlcGxveXMgY291bGQgZHJvcCBmcm9tIGVsaXRlIHRvIGhpZ2gpIGFuZCBpdHNcbiAgLy8gcmVjb3ZlcmllcyBmZWQgdGhpcyBvbmUncyBNVFRSLlxuICBjb25zdCBvdXRjb21lUGlwZWxpbmVDbGF1c2UgPSBwaXBlbGluZUlkXG4gICAgPyBzcWxgQU5EIG8uZXhlY3V0aW9uX2lkIElOIChTRUxFQ1QgcGUuZXhlY3V0aW9uX2lkIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gcGUgV0hFUkUgcGUucGlwZWxpbmVfaWQgPSAke3BpcGVsaW5lSWR9KWBcbiAgICA6IHNxbGBgO1xuICAvLyBgZW52Q2xhdXNlYCBpcyB0aGUgU1RSSUNUIGZpbHRlciAoY292ZXJhZ2UsIGFuZCB0aGUgb3V0cHV0KS4gVGhlIGRlcGxveSBhbmRcbiAgLy8gaW5jaWRlbnQgU0NBTlMgdXNlIHRoZSB3aWRlbmVkIGBzY2FuRW52Q2xhdXNlYC9gc2NhbkluY2lkZW50RW52Q2xhdXNlYFxuICAvLyBpbnN0ZWFkLCB3aGljaCBhbHdheXMgYWRtaXQgcHJvZHVjdGlvbjogTVRUUiBpcyBwcm9kdWN0aW9uLW9ubHkgYW5kXG4gIC8vIGRvY3VtZW50ZWQgYXMgaW5kZXBlbmRlbnQgb2YgdGhlIGVudmlyb25tZW50IGZpbHRlciwgYnV0IGluY2lkZW50LXNvdXJjZWRcbiAgLy8gTVRUUiBjb3JyZWxhdGVzIGVhY2ggcHJvZHVjdGlvbiBpbmNpZGVudCBhZ2FpbnN0IHByb2R1Y3Rpb24gREVQTE9ZIHJvd3MuXG4gIC8vIEZpbHRlcmluZyBib3RoIHNjYW5zIHRvIGA/ZW52aXJvbm1lbnQ9c3RhZ2luZ2AgcmVtb3ZlZCBldmVyeSBwcm9kdWN0aW9uXG4gIC8vIGluY2lkZW50IGFuZCBldmVyeSBwcm9kdWN0aW9uIGRlcGxveSwgc28gaW5jaWRlbnQgcmVjb3Zlcnkgc2lsZW50bHkgZHJvcHBlZFxuICAvLyBvdXQgb2YgTVRUUiB0aGUgbW9tZW50IGFueW9uZSBsb29rZWQgYXQgYSBub24tcHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgLy8gYHNoYXBlRG9yYWAgbmFycm93cyB0aGUgcmVwb3J0ZWQgZW52aXJvbm1lbnRzIGJhY2sgdG8gdGhlIHJlcXVlc3RlZCBvbmUuXG4gIGNvbnN0IGVudkNsYXVzZSA9IGVudmlyb25tZW50ID8gc3FsYEFORCBlLmVudmlyb25tZW50ID0gJHtlbnZpcm9ubWVudH1gIDogc3FsYGA7XG4gIGNvbnN0IHNjYW5FbnZDbGF1c2UgPSBlbnZpcm9ubWVudCA/IHNxbGBBTkQgZS5lbnZpcm9ubWVudCBJTiAoJHtlbnZpcm9ubWVudH0sICR7SEVBRExJTkVfRU5WfSlgIDogc3FsYGA7XG4gIGNvbnN0IG91dGNvbWVFbnZDbGF1c2UgPSBlbnZpcm9ubWVudCA/IHNxbGBBTkQgby5lbnZpcm9ubWVudCA9ICR7ZW52aXJvbm1lbnR9YCA6IHNxbGBgO1xuICBjb25zdCBzY2FuSW5jaWRlbnRFbnZDbGF1c2UgPSBlbnZpcm9ubWVudCA/IHNxbGBBTkQgaS5lbnZpcm9ubWVudCBJTiAoJHtlbnZpcm9ubWVudH0sICR7SEVBRExJTkVfRU5WfSlgIDogc3FsYGA7XG5cbiAgLy8gRWZmZWN0aXZlIGluY2lkZW50LWNvcnJlbGF0aW9uIHdpbmRvdyAocGVyLW9yZyBvdmVycmlkZSBvciB0aGUgZ2xvYmFsXG4gIC8vIGRlZmF1bHQpLiBDb21wdXRlZCBoZXJlIChub3QganVzdCBpbiBzaGFwZURvcmEpIGJlY2F1c2UgdGhlIGRlcGxveSBzY2FuXG4gIC8vIG5lZWRzIGl0IGZvciBCT1RIIHRoZSBjb3JyZWxhdGlvbiBsb29rLWJhY2sgbG93ZXIgYm91bmQgQU5EIHRoZSBjYWNoZSBrZXkuXG4gIGNvbnN0IGVmZmVjdGl2ZVdpbmRvd0hvdXJzID0gcmVzb2x2ZUluY2lkZW50V2luZG93SG91cnMob3B0cy5pbmNpZGVudFdpbmRvd0hvdXJzKTtcbiAgLy8gQ29ycmVsYXRpb24gbG9vay1iYWNrOiBpbmNpZGVudHMgb3BlbmVkIGp1c3QgaW5zaWRlIGBmcm9tYCBjYW4gYXR0cmlidXRlIHRvXG4gIC8vIGEgZGVwbG95IHRoYXQgY29tcGxldGVkIHVwIHRvIGB3aW5kb3dIb3Vyc2AgQkVGT1JFIGBmcm9tYCAobWlycm9ycyB0aGVcbiAgLy8gTEFURVJBTCBsb29rLWJhY2sgaW4gbGlzdEluY2lkZW50cykuIFdpZGVuIHRoZSBkZXBsb3kgc2NhbidzIGxvd2VyIGJvdW5kIHRvXG4gIC8vIGBmcm9tIOKIkiB3aW5kb3dIb3Vyc2A7IERGL0NGUi9sZWFkIHN0aWxsIGNvdW50IG9ubHkgdGhlIGluLWBmcm9tYC4uYHRvYFxuICAvLyBzdWJzZXQgKGZsYWdnZWQgYnkgYGluX3dpbmRvd2ApLCB3aGlsZSBjb3JyZWxhdGlvbiBzZWVzIHRoZSB3aWRlciBzZXQuXG4gIGNvbnN0IGZyb21NcyA9IERhdGUucGFyc2UoZnJvbSk7XG4gIGNvbnN0IGxvb2tiYWNrRnJvbSA9IE51bWJlci5pc0Zpbml0ZShmcm9tTXMpXG4gICAgPyBuZXcgRGF0ZShmcm9tTXMgLSBlZmZlY3RpdmVXaW5kb3dIb3VycyAqIDM2MDAgKiAxMDAwKS50b0lTT1N0cmluZygpXG4gICAgOiBmcm9tO1xuXG4gIC8vICgxKSBUZXJtaW5hbCBkZXBsb3kgcm93czogUEVSLUVYRUNVVElPTiwgb25lIHJvdyBwZXIgKGVudmlyb25tZW50LFxuICAvLyBleGVjdXRpb24pIOKAlCBldmVyeSBkZXBsb3kgU1RBR0UgdGFyZ2V0aW5nIHRoYXQgZW52IHdpdGhpbiB0aGUgZXhlY3V0aW9uIGlzXG4gIC8vIHJvbGxlZCB1cCB0byBhIHRlcm1pbmFsIHN0YXR1cyAoRkFJTEVEIHdpbnMsIHRoZW4gU1VDQ0VFREVEKS4gQSBzaW5nbGVcbiAgLy8gZXhlY3V0aW9uIHdpdGggdHdvIGRlcGxveSBzdGFnZXMgdG8gdGhlIHNhbWUgZW52IGlzIE9ORSBkZXBsb3ltZW50LCBub3QgdHdvLlxuICAvLyBjb21wbGV0ZWRfYXQgPSB0aGUgZGVwbG95J3MgY29tcGxldGlvbiAoTUFYIG92ZXIgaXRzIHN0YWdlcykuIGBjb21taXRfdHNgXG4gIC8vIGlzIHRoZSBleGVjdXRpb24ncyBFQVJMSUVTVCBjb21taXQgdGltZSBhY3Jvc3MgQUxMIGl0cyBldmVudHMgKGNvbW1pdFxuICAvLyBlbnJpY2htZW50IHJpZGVzIHRoZSBQSVBFTElORS9zb3VyY2UgZXZlbnQgd2hlcmUgZW52aXJvbm1lbnQgSVMgTlVMTCwgbmV2ZXJcbiAgLy8gdGhlIGRlcGxveSBTVEFHRSByb3cpLCBqb2luZWQgYnkgZXhlY3V0aW9uX2lkLiBgaW5fd2luZG93YCBtYXJrcyB3aGV0aGVyIHRoZVxuICAvLyBkZXBsb3kgY29tcGxldGVkIGluc2lkZSBbZnJvbSx0b10gKHZzLiBhIGxvb2stYmFjay1vbmx5IHJvdyBrZXB0IHNvbGVseSBmb3JcbiAgLy8gaW5jaWRlbnQgY29ycmVsYXRpb24pLiBleGVjdXRpb25faWQgaXMgcHJvamVjdGVkIHNvIHBvc3QtZGVwbG95IGZhaWx1cmVzXG4gIC8vIChtYW51YWwgb3V0Y29tZXMgKyBjb3JyZWxhdGVkIGluY2lkZW50cykgY2FuIGRlZHVwIGFnYWluc3QgdGhlaXIgZGVwbG95LlxuICBjb25zdCBkZXBsb3lTcWwgPSBzcWxgXG4gICAgICBXSVRIIGRlcGxveV9zdGFnZXMgQVMgKFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLmVudmlyb25tZW50IEFTIGVudmlyb25tZW50LFxuICAgICAgICAgIGUuZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCxcbiAgICAgICAgICAke3Rlcm1pbmFsU3RhdHVzUm9sbHVwfSBBUyBzdGF0dXMsXG4gICAgICAgICAgTUFYKGUuY29tcGxldGVkX2F0KSBBUyBjb21wbGV0ZWRfYXRcbiAgICAgICAgRlJPTSAke3NjaGVtYS5waXBlbGluZUV2ZW50fSBlXG4gICAgICAgIEpPSU4gJHtzY2hlbWEucGlwZWxpbmV9IHAgT04gcC5pZCA9IGUucGlwZWxpbmVfaWRcbiAgICAgICAgV0hFUkUgcC5vcmdfaWQgJHtwcmVkfSBBTkQgZS5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZS5lbnZpcm9ubWVudCBJUyBOT1QgTlVMTFxuICAgICAgICAgICR7cGlwZWxpbmVDbGF1c2V9ICR7c2NhbkVudkNsYXVzZX1cbiAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPj0gJHtsb29rYmFja0Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgZS5jb21wbGV0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIGUuZW52aXJvbm1lbnQsIGUuZXhlY3V0aW9uX2lkXG4gICAgICApLFxuICAgICAgZXhlY19jb21taXRzIEFTIChcbiAgICAgICAgU0VMRUNUIGMuZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCwgTUlOKGMuY29tbWl0X3RpbWVzdGFtcCkgQVMgY29tbWl0X3RzXG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gY1xuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBjLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGMuY29tbWl0X3RpbWVzdGFtcCBJUyBOT1QgTlVMTFxuICAgICAgICAgIEFORCBjLmV4ZWN1dGlvbl9pZCBJTiAoU0VMRUNUIGV4ZWN1dGlvbl9pZCBGUk9NIGRlcGxveV9zdGFnZXMpXG4gICAgICAgIEdST1VQIEJZIGMuZXhlY3V0aW9uX2lkXG4gICAgICApXG4gICAgICBTRUxFQ1RcbiAgICAgICAgZHMuZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnQsXG4gICAgICAgIGRzLmV4ZWN1dGlvbl9pZCBBUyBleGVjdXRpb25faWQsXG4gICAgICAgIGRzLnN0YXR1cyBBUyBzdGF0dXMsXG4gICAgICAgIGRzLmNvbXBsZXRlZF9hdDo6dGV4dCBBUyBjb21wbGV0ZWRfYXQsXG4gICAgICAgIChkcy5jb21wbGV0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHopIEFTIGluX3dpbmRvdyxcbiAgICAgICAgZWMuY29tbWl0X3RzOjp0ZXh0IEFTIGNvbW1pdF90c1xuICAgICAgRlJPTSBkZXBsb3lfc3RhZ2VzIGRzXG4gICAgICBMRUZUIEpPSU4gZXhlY19jb21taXRzIGVjIE9OIGVjLmV4ZWN1dGlvbl9pZCA9IGRzLmV4ZWN1dGlvbl9pZGA7XG5cbiAgLy8gKDIpIFBvc3QtZGVwbG95IG91dGNvbWUgbWFya2VycyBpbi13aW5kb3cgKHBlciBlbnYpLiBQb3N0LWRlcGxveSBmYWlsdXJlc1xuICAvLyAob3V0Y29tZT0nZmFpbGVkJykgYWRkIHRvIHRoZSBDRlIgbnVtZXJhdG9yIHdpdGhvdXQgY2hhbmdpbmcgYXR0ZW1wdHMuXG4gIC8vIGV4ZWN1dGlvbl9pZCBsZXRzIHRoZSBDRlIgZGVkdXAgYSBtYW51YWwgZmFpbHVyZSBhZ2FpbnN0IGFuIGluY2lkZW50IHRoYXRcbiAgLy8gY29ycmVsYXRlcyB0byB0aGUgc2FtZSBkZXBsb3kgKG5vIGRvdWJsZS1jb3VudCkuXG4gIGNvbnN0IG91dGNvbWVTcWwgPSBzcWxgXG4gICAgICBTRUxFQ1Qgby5lbnZpcm9ubWVudCBBUyBlbnZpcm9ubWVudCwgby5vdXRjb21lIEFTIG91dGNvbWUsIG8uZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZFxuICAgICAgRlJPTSAke3NjaGVtYS5kZXBsb3ltZW50T3V0Y29tZX0gb1xuICAgICAgV0hFUkUgby5vcmdfaWQgJHtwcmVkfSAke291dGNvbWVFbnZDbGF1c2V9ICR7b3V0Y29tZVBpcGVsaW5lQ2xhdXNlfVxuICAgICAgICBBTkQgby5hdCA+PSAke2Zyb219Ojp0aW1lc3RhbXB0eiBBTkQgby5hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpgO1xuXG4gIC8vICgzKSBNVFRSIOKAlCBQUk9EVUNUSU9OLU9OTFksIGluZGVwZW5kZW50IG9mIHRoZSBlbnYgZmlsdGVyLiBFdmVyeSBwcm9kdWN0aW9uXG4gIC8vIG91dGNvbWUgaW4td2luZG93OyBmb3IgYSAncmVzdG9yZWQnIG9uZSwgY29ycmVsYXRlIHRvIGl0cyBkZXBsb3knc1xuICAvLyBjb21wbGV0aW9uIHZpYSBleGVjdXRpb25faWQgdG8gbWVhc3VyZSByZXN0b3JlZC5hdCDiiJIgZGVwbG95ZWQuY29tcGxldGVkX2F0LlxuICAvLyBleGVjdXRpb25faWQgaXMgcHJvamVjdGVkIHNvIGFuIGluY2lkZW50LXNvdXJjZWQgcmVjb3ZlcnkgZm9yIHRoZSBzYW1lXG4gIC8vIGRlcGxveSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIG1hbnVhbCByZXN0b3JlZCBnYXAuXG4gIGNvbnN0IG10dHJTcWwgPSBzcWxgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgby5vdXRjb21lIEFTIG91dGNvbWUsXG4gICAgICAgIG8uZXhlY3V0aW9uX2lkIEFTIGV4ZWN1dGlvbl9pZCxcbiAgICAgICAgby5hdDo6dGV4dCBBUyByZXN0b3JlZF9hdCxcbiAgICAgICAgKFNFTEVDVCBNQVgoZC5jb21wbGV0ZWRfYXQpIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZFxuICAgICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwMiBPTiBwMi5pZCA9IGQucGlwZWxpbmVfaWRcbiAgICAgICAgICAgV0hFUkUgcDIub3JnX2lkICR7cHJlZH0gQU5EIGQuZXhlY3V0aW9uX2lkID0gby5leGVjdXRpb25faWRcbiAgICAgICAgICAgICBBTkQgZC5ldmVudF90eXBlID0gJ1NUQUdFJyBBTkQgZC5lbnZpcm9ubWVudCA9ICR7SEVBRExJTkVfRU5WfSk6OnRleHQgQVMgZGVwbG95ZWRfYXRcbiAgICAgIEZST00gJHtzY2hlbWEuZGVwbG95bWVudE91dGNvbWV9IG9cbiAgICAgIFdIRVJFIG8ub3JnX2lkICR7cHJlZH0gQU5EIG8uZW52aXJvbm1lbnQgPSAke0hFQURMSU5FX0VOVn0gJHtvdXRjb21lUGlwZWxpbmVDbGF1c2V9XG4gICAgICAgIEFORCBvLmF0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBvLmF0IDw9ICR7dG99Ojp0aW1lc3RhbXB0emA7XG5cbiAgLy8gKDUpIEluY2lkZW50cyBvcGVuZWQgaW4td2luZG93IChwZXIgZW52KS4gQ29ycmVsYXRlZCBpbiBKUyB0byB0aGUgbW9zdFxuICAvLyByZWNlbnQgc3VjY2Vzc2Z1bCBkZXBsb3kg4oaSIGF1dG9tYXRlZCBwb3N0LWRlcGxveSBmYWlsdXJlIChDRlIpICsgcmVhbFxuICAvLyByZWNvdmVyeSB0aW1lIChyZXNvbHZlZF9hdCDiiJIgb3BlbmVkX2F0KSBmb3IgTVRUUiAocHJvZHVjdGlvbikuXG4gIGNvbnN0IGluY2lkZW50U3FsID0gc3FsYFxuICAgICAgU0VMRUNUIGkuZW52aXJvbm1lbnQgQVMgZW52aXJvbm1lbnQsIGkub3BlbmVkX2F0Ojp0ZXh0IEFTIG9wZW5lZF9hdCwgaS5yZXNvbHZlZF9hdDo6dGV4dCBBUyByZXNvbHZlZF9hdFxuICAgICAgRlJPTSAke3NjaGVtYS5pbmNpZGVudH0gaVxuICAgICAgV0hFUkUgaS5vcmdfaWQgJHtwcmVkfSAke3NjYW5JbmNpZGVudEVudkNsYXVzZX1cbiAgICAgICAgQU5EIGkub3BlbmVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBpLm9wZW5lZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHpgO1xuXG4gIC8vICg0KSBDb3ZlcmFnZTogcmVnaXN0ZXJlZCBwaXBlbGluZXMgdnMgdGhvc2UgdGhhdCBhY3R1YWxseSBkZXBsb3llZCBpbi13aW5kb3cuXG4gIGNvbnN0IGNvdmVyYWdlU3FsID0gc3FsYFxuICAgICAgU0VMRUNUXG4gICAgICAgIChTRUxFQ1QgQ09VTlQoKik6OmludCBGUk9NICR7c2NoZW1hLnBpcGVsaW5lUmVnaXN0cnl9IHJcbiAgICAgICAgICAgV0hFUkUgci5vcmdfaWQgJHtwcmVkfSAke3BpcGVsaW5lQ2xhdXNlUn0pIEFTIHJlZ2lzdGVyZWQsXG4gICAgICAgIChTRUxFQ1QgQ09VTlQoRElTVElOQ1QgZS5waXBlbGluZV9pZCk6OmludCBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLmVudmlyb25tZW50IElTIE5PVCBOVUxMXG4gICAgICAgICAgICAgJHtwaXBlbGluZUNsYXVzZX0gJHtlbnZDbGF1c2V9XG4gICAgICAgICAgICAgQU5EIGUuY29tcGxldGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLmNvbXBsZXRlZF9hdCA8PSAke3RvfTo6dGltZXN0YW1wdHopIEFTIGRlcGxveWluZ2A7XG5cbiAgY29uc3QgZXhlYyA9ICgpID0+IHdpdGhUZW5hbnRUeChhc3luYyAodHgpID0+IHtcbiAgICAvLyBTY2FuIG9yZGVyIGlzIGxvYWQtYmVhcmluZyBmb3IgdGhlIGdlbmVyYXRlZC1TUUwgdGVzdHM6IDA9ZGVwbG95LFxuICAgIC8vIDE9b3V0Y29tZXMsIDI9bXR0ciwgMz1jb3ZlcmFnZSwgND1pbmNpZGVudHMgKGFwcGVuZGVkIGxhc3Qgc28gdGhlXG4gICAgLy8gZWFybGllciBpbmRpY2VzIHN0YXkgc3RhYmxlKS5cbiAgICBjb25zdCBkZXBsb3lSb3dzID0gZHJpenpsZVJvd3M8RGVwbG95Um93PigoYXdhaXQgdHguZXhlY3V0ZShkZXBsb3lTcWwpKS5yb3dzKTtcbiAgICBjb25zdCBvdXRjb21lUm93cyA9IGRyaXp6bGVSb3dzPE91dGNvbWVSb3c+KChhd2FpdCB0eC5leGVjdXRlKG91dGNvbWVTcWwpKS5yb3dzKTtcbiAgICBjb25zdCBtdHRyUm93cyA9IGRyaXp6bGVSb3dzPE10dHJQYWlyUm93ICYgeyBvdXRjb21lOiBzdHJpbmcgfT4oKGF3YWl0IHR4LmV4ZWN1dGUobXR0clNxbCkpLnJvd3MpO1xuICAgIGNvbnN0IGNvdmVyYWdlUm93ID0gZHJpenpsZVJvd3M8Q292ZXJhZ2VSb3c+KChhd2FpdCB0eC5leGVjdXRlKGNvdmVyYWdlU3FsKSkucm93cylbMF07XG4gICAgY29uc3QgaW5jaWRlbnRSb3dzID0gZHJpenpsZVJvd3M8SW5jaWRlbnRSb3c+KChhd2FpdCB0eC5leGVjdXRlKGluY2lkZW50U3FsKSkucm93cyk7XG4gICAgcmV0dXJuIHNoYXBlRG9yYShkZXBsb3lSb3dzLCBvdXRjb21lUm93cywgbXR0clJvd3MsIGNvdmVyYWdlUm93LCBpbmNpZGVudFJvd3MsIGZyb20sIHRvLCB7XG4gICAgICBwaXBlbGluZUlkLCBlbnZpcm9ubWVudCxcbiAgICB9LCBlZmZlY3RpdmVXaW5kb3dIb3Vycyk7XG4gIH0pO1xuICAvLyBDYWNoZSBrZXkgTVVTVCBpbmNsdWRlIHRoZSBlZmZlY3RpdmUgaW5jaWRlbnQgd2luZG93OiB0aGUgc2NvcmVjYXJkIHJlYWRzXG4gIC8vIC9kb3JhIHdpdGggdGhlIG9yZydzIGRlZmF1bHQgd2luZG93IHdoaWxlIGFuIGV4cGxpY2l0IC9kb3JhIGNhbGwgbWF5IHBhc3MgYW5cbiAgLy8gb3ZlcnJpZGUg4oCUIGRpZmZlcmVudCB3aW5kb3dzIHlpZWxkIGRpZmZlcmVudCBDRlIvTVRUUiwgc28gdGhleSBtdXN0IG5vdFxuICAvLyBjb2xsaWRlIG9uIHRoZSBzYW1lIGtleS5cbiAgY29uc3Qga2V5ID0gYCR7b3JnSWR9OmRvcmE6JHtmcm9tfToke3RvfToke3BpcGVsaW5lSWQgPz8gJyd9OiR7ZW52aXJvbm1lbnQgPz8gJyd9OiR7ZWZmZWN0aXZlV2luZG93SG91cnN9YDtcbiAgcmV0dXJuIHJ1blJlcG9ydChrZXksIG11bHRpLCBleGVjKTtcbn1cblxuLyoqIFBlci1lbnZpcm9ubWVudCBkZXBsb3kgYWNjdW11bGF0b3IuICovXG5pbnRlcmZhY2UgRW52QWNjIHtcbiAgZGVwbG95bWVudHM6IG51bWJlcjtcbiAgZGVwbG95VGltZUZhaWx1cmVzOiBudW1iZXI7XG4gIGF0dGVtcHRzOiBudW1iZXI7XG4gIGxlYWRHYXBzOiBudW1iZXJbXTtcbn1cblxuLyoqIEEgcHJvZHVjdGlvbi1vci1vdGhlciBpbmNpZGVudCBhdHRyaWJ1dGVkIHRvIHRoZSBkZXBsb3kgZXhlY3V0aW9uIGl0IGZvbGxvd2VkLiAqL1xuaW50ZXJmYWNlIENvcnJlbGF0ZWRJbmNpZGVudCB7IGVudmlyb25tZW50OiBzdHJpbmc7IGV4ZWM6IHN0cmluZzsgcmVzb2x2ZWRHYXA6IG51bWJlciB8IG51bGwgfVxuXG4vKiogR2V0LW9yLWNyZWF0ZSB0aGUgYWNjdW11bGF0b3IgZm9yIGBlbnZgLiAqL1xuZnVuY3Rpb24gYWNjRm9yKGVudnM6IE1hcDxzdHJpbmcsIEVudkFjYz4sIGVudjogc3RyaW5nKTogRW52QWNjIHtcbiAgbGV0IGEgPSBlbnZzLmdldChlbnYpO1xuICBpZiAoIWEpIHsgYSA9IHsgZGVwbG95bWVudHM6IDAsIGRlcGxveVRpbWVGYWlsdXJlczogMCwgYXR0ZW1wdHM6IDAsIGxlYWRHYXBzOiBbXSB9OyBlbnZzLnNldChlbnYsIGEpOyB9XG4gIHJldHVybiBhO1xufVxuXG4vKipcbiAqIEEgZGVwbG95IHJvdyBjb3VudHMgdG93YXJkIERGL0NGUi9sZWFkIG9ubHkgaWYgaXQgY29tcGxldGVkIGluc2lkZSBbZnJvbSx0b10uXG4gKiBMb29rLWJhY2stb25seSByb3dzIChpbl93aW5kb3c9ZmFsc2UsIGtlcHQgZm9yIGluY2lkZW50IGNvcnJlbGF0aW9uKSBhcmVcbiAqIHNraXBwZWQuIEFic2VudCBpbiBhIGZpeHR1cmUg4oeSIGluLXdpbmRvdyAodW5pdCB0ZXN0cyBvbWl0IHRoZSBmbGFnKS5cbiAqL1xuZnVuY3Rpb24gaXNJbldpbmRvdyhyb3c6IERlcGxveVJvdyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcm93LmluX3dpbmRvdyA9PSBudWxsID8gdHJ1ZSA6IChyb3cuaW5fd2luZG93ID09PSB0cnVlIHx8IHJvdy5pbl93aW5kb3cgPT09ICd0Jyk7XG59XG5cbi8qKiBCdWNrZXQgdGhlIGluLXdpbmRvdyB0ZXJtaW5hbCBkZXBsb3kgcm93cyBieSBlbnZpcm9ubWVudCAoREYgLyBkZXBsb3ktdGltZSBDRlIgLyBtZWFzdXJlZCBsZWFkKS4gKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGVEZXBsb3lzKGRlcGxveVJvd3M6IERlcGxveVJvd1tdKTogTWFwPHN0cmluZywgRW52QWNjPiB7XG4gIGNvbnN0IGVudnMgPSBuZXcgTWFwPHN0cmluZywgRW52QWNjPigpO1xuICBmb3IgKGNvbnN0IHJvdyBvZiBkZXBsb3lSb3dzKSB7XG4gICAgY29uc3QgZW52ID0gcm93LmVudmlyb25tZW50O1xuICAgIGlmICghZW52KSBjb250aW51ZTtcbiAgICBpZiAoIWlzSW5XaW5kb3cocm93KSkgY29udGludWU7IC8vIGxvb2stYmFjay1vbmx5IHJvdyDihpIgY29ycmVsYXRpb24sIG5vdCBERi9DRlJcbiAgICBjb25zdCBhID0gYWNjRm9yKGVudnMsIGVudik7XG4gICAgaWYgKHJvdy5zdGF0dXMgPT09ICdTVUNDRUVERUQnKSB7XG4gICAgICBhLmRlcGxveW1lbnRzKys7XG4gICAgICBhLmF0dGVtcHRzKys7XG4gICAgICAvLyBNZWFzdXJlZCBsZWFkIHRpbWU6IGRlcGxveSBjb21wbGV0aW9uIOKIkiBleGVjdXRpb24ncyBlYXJsaWVzdCBjb21taXQgdGltZS5cbiAgICAgIGlmIChyb3cuY29tbWl0X3RzICE9IG51bGwgJiYgcm93LmNvbXBsZXRlZF9hdCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGdhcCA9IChEYXRlLnBhcnNlKHJvdy5jb21wbGV0ZWRfYXQpIC0gRGF0ZS5wYXJzZShyb3cuY29tbWl0X3RzKSkgLyAxMDAwO1xuICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKGdhcCkpIGEubGVhZEdhcHMucHVzaChNYXRoLm1heChnYXAsIDApKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJvdy5zdGF0dXMgPT09ICdGQUlMRUQnKSB7XG4gICAgICBhLmRlcGxveVRpbWVGYWlsdXJlcysrO1xuICAgICAgYS5hdHRlbXB0cysrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZW52cztcbn1cblxuLyoqXG4gKiBJbmNpZGVudOKGkmRlcGxveSBjb3JyZWxhdGlvbi4gRWFjaCBpbmNpZGVudCBpcyBhdHRyaWJ1dGVkIHRvIHRoZSBtb3N0IHJlY2VudFxuICogU1VDQ0VTU0ZVTCBkZXBsb3kgdG8gaXRzIGVudmlyb25tZW50IHdpdGggYGNvbXBsZXRlZF9hdCDiiaQgb3BlbmVkX2F0YCB3aXRoaW5cbiAqIGB3aW5kb3dIb3Vyc2A7IGFuIHVuY29ycmVsYXRlZCBpbmNpZGVudCBpcyBkcm9wcGVkLiBBIHJlc29sdXRpb24gYWZ0ZXIgdGhlXG4gKiB3aW5kb3cgZW5kIChgdG9Nc2ApIGlzIHJpZ2h0LWNlbnNvcmVkOiB0aGUgaW5jaWRlbnQgc3RpbGwgY291bnRzLCB1bnJlc29sdmVkLlxuICovXG5mdW5jdGlvbiBjb3JyZWxhdGVJbmNpZGVudHMoXG4gIGRlcGxveVJvd3M6IERlcGxveVJvd1tdLFxuICBpbmNpZGVudFJvd3M6IEluY2lkZW50Um93W10sXG4gIHdpbmRvd0hvdXJzOiBudW1iZXIsXG4gIHRvTXM6IG51bWJlcixcbik6IENvcnJlbGF0ZWRJbmNpZGVudFtdIHtcbiAgLy8gSW5kZXggdGhlIFNVQ0NFU1NGVUwgZGVwbG95cyBwZXIgZW52IChleGVjdXRpb24gaWQgKyBjb21wbGV0aW9uIGluc3RhbnQpLFxuICAvLyBuZXdlc3QgZmlyc3QuXG4gIGNvbnN0IHdpbmRvd01zID0gd2luZG93SG91cnMgKiAzNjAwICogMTAwMDtcbiAgY29uc3Qgc3VjY2Vzc2Z1bEJ5RW52ID0gbmV3IE1hcDxzdHJpbmcsIEFycmF5PHsgZXhlYzogc3RyaW5nOyBjb21wbGV0ZWRNczogbnVtYmVyIH0+PigpO1xuICBmb3IgKGNvbnN0IHJvdyBvZiBkZXBsb3lSb3dzKSB7XG4gICAgaWYgKHJvdy5zdGF0dXMgIT09ICdTVUNDRUVERUQnIHx8ICFyb3cuZW52aXJvbm1lbnQgfHwgcm93LmV4ZWN1dGlvbl9pZCA9PSBudWxsIHx8IHJvdy5jb21wbGV0ZWRfYXQgPT0gbnVsbCkgY29udGludWU7XG4gICAgY29uc3QgbXMgPSBEYXRlLnBhcnNlKHJvdy5jb21wbGV0ZWRfYXQpO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKG1zKSkgY29udGludWU7XG4gICAgY29uc3QgbGlzdCA9IHN1Y2Nlc3NmdWxCeUVudi5nZXQocm93LmVudmlyb25tZW50KSA/PyBbXTtcbiAgICBsaXN0LnB1c2goeyBleGVjOiByb3cuZXhlY3V0aW9uX2lkLCBjb21wbGV0ZWRNczogbXMgfSk7XG4gICAgc3VjY2Vzc2Z1bEJ5RW52LnNldChyb3cuZW52aXJvbm1lbnQsIGxpc3QpO1xuICB9XG4gIGZvciAoY29uc3QgbGlzdCBvZiBzdWNjZXNzZnVsQnlFbnYudmFsdWVzKCkpIGxpc3Quc29ydCgoYSwgYikgPT4gYi5jb21wbGV0ZWRNcyAtIGEuY29tcGxldGVkTXMpO1xuXG4gIGNvbnN0IGNvcnJlbGF0ZSA9IChlbnY6IHN0cmluZywgb3BlbmVkTXM6IG51bWJlcik6IHN0cmluZyB8IG51bGwgPT4ge1xuICAgIGNvbnN0IGxpc3QgPSBzdWNjZXNzZnVsQnlFbnYuZ2V0KGVudik7XG4gICAgaWYgKCFsaXN0KSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKGNvbnN0IGQgb2YgbGlzdCkge1xuICAgICAgaWYgKGQuY29tcGxldGVkTXMgPD0gb3BlbmVkTXMgJiYgb3BlbmVkTXMgLSBkLmNvbXBsZXRlZE1zIDw9IHdpbmRvd01zKSByZXR1cm4gZC5leGVjO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBjb25zdCBjb3JyZWxhdGVkOiBDb3JyZWxhdGVkSW5jaWRlbnRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGluYyBvZiBpbmNpZGVudFJvd3MpIHtcbiAgICBpZiAoIWluYy5lbnZpcm9ubWVudCB8fCBpbmMub3BlbmVkX2F0ID09IG51bGwpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG9wZW5lZE1zID0gRGF0ZS5wYXJzZShpbmMub3BlbmVkX2F0KTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShvcGVuZWRNcykpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGV4ZWMgPSBjb3JyZWxhdGUoaW5jLmVudmlyb25tZW50LCBvcGVuZWRNcyk7XG4gICAgaWYgKGV4ZWMgPT0gbnVsbCkgY29udGludWU7IC8vIHVuY29ycmVsYXRlZCDihpIgbm90IGF0dHJpYnV0YWJsZSB0byBhIGRlcGxveVxuICAgIGxldCByZXNvbHZlZEdhcDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGluYy5yZXNvbHZlZF9hdCAhPSBudWxsKSB7XG4gICAgICBjb25zdCByZXNvbHZlZE1zID0gRGF0ZS5wYXJzZShpbmMucmVzb2x2ZWRfYXQpO1xuICAgICAgLy8gUmlnaHQtY2Vuc29yaW5nOiBhIHJlc29sdXRpb24gQUZURVIgdGhlIHdpbmRvdyBlbmQgKGB0b2ApIGlzIG5vdCBvYnNlcnZlZFxuICAgICAgLy8gd2l0aGluIHRoZSB3aW5kb3cg4oCUIHRyZWF0IHRoZSBpbmNpZGVudCBhcyBzdGlsbCBvcGVuIChnYXAgc3RheXMgbnVsbCkgc29cbiAgICAgIC8vIE1UVFIgbmV2ZXIgcmVhZHMgdW5ib3VuZGVkIHBhc3QgYHRvYC4gVGhlIGluY2lkZW50IHN0aWxsIGNvdW50cyB0b3dhcmQgdGhlXG4gICAgICAvLyBpbmNpZGVudCB0b3RhbCAodW5yZXNvbHZlZCksIGl0IGp1c3QgY29udHJpYnV0ZXMgbm8gcmVjb3ZlcnkgdGltZS5cbiAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUocmVzb2x2ZWRNcykgJiYgcmVzb2x2ZWRNcyA8PSB0b01zKSB7XG4gICAgICAgIGNvbnN0IGcgPSAocmVzb2x2ZWRNcyAtIG9wZW5lZE1zKSAvIDEwMDA7XG4gICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoZykpIHJlc29sdmVkR2FwID0gTWF0aC5tYXgoZywgMCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvcnJlbGF0ZWQucHVzaCh7IGVudmlyb25tZW50OiBpbmMuZW52aXJvbm1lbnQsIGV4ZWMsIHJlc29sdmVkR2FwIH0pO1xuICB9XG4gIHJldHVybiBjb3JyZWxhdGVkO1xufVxuXG4vKipcbiAqIFBvc3QtZGVwbG95IGZhaWx1cmVzIHBlciBlbnYg4oCUIHRoZSBESVNUSU5DVCBzZXQgb2YgZGVwbG95IGV4ZWN1dGlvbnMgZmxhZ2dlZFxuICogYnkgYSBtYW51YWwgYGZhaWxlZGAgb3V0Y29tZSBPUiBhIGNvcnJlbGF0ZWQgaW5jaWRlbnQgKGRlZHVwZWQgYnkgZXhlY3V0aW9uLFxuICogc28gYSBkZXBsb3kgZmxhZ2dlZCBieSBib3RoIGNvdW50cyBvbmNlKS4gQSBtYW51YWwgb3V0Y29tZSB3aXRob3V0IGFuXG4gKiBleGVjdXRpb24gaWQgc3RpbGwgY291bnRzIHZpYSBhIHBlci1yb3cgc2VudGluZWwuIEV2ZXJ5IGZsYWdnZWQgZW52IGlzIGFkZGVkXG4gKiB0byBgZW52c2Agc28gaXQgYXBwZWFycyBldmVuIHdpdGggbm8gaW4td2luZG93IGRlcGxveSBldmVudHMuXG4gKi9cbmZ1bmN0aW9uIGNvdW50UG9zdERlcGxveUZhaWx1cmVzKFxuICBlbnZzOiBNYXA8c3RyaW5nLCBFbnZBY2M+LFxuICBvdXRjb21lUm93czogT3V0Y29tZVJvd1tdLFxuICBjb3JyZWxhdGVkOiBDb3JyZWxhdGVkSW5jaWRlbnRbXSxcbik6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICBjb25zdCBwb3N0RGVwbG95RXhlY3NCeUVudiA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgbGV0IHNlbnRpbmVsID0gMDtcbiAgY29uc3QgZmxhZ0ZvciA9IChlbnY6IHN0cmluZyk6IFNldDxzdHJpbmc+ID0+IHtcbiAgICBsZXQgcyA9IHBvc3REZXBsb3lFeGVjc0J5RW52LmdldChlbnYpO1xuICAgIGlmICghcykgeyBzID0gbmV3IFNldDxzdHJpbmc+KCk7IHBvc3REZXBsb3lFeGVjc0J5RW52LnNldChlbnYsIHMpOyB9XG4gICAgcmV0dXJuIHM7XG4gIH07XG4gIGZvciAoY29uc3QgbyBvZiBvdXRjb21lUm93cykge1xuICAgIGlmIChvLm91dGNvbWUgIT09ICdmYWlsZWQnIHx8ICFvLmVudmlyb25tZW50KSBjb250aW51ZTtcbiAgICBmbGFnRm9yKG8uZW52aXJvbm1lbnQpLmFkZChvLmV4ZWN1dGlvbl9pZCA/PyBgbWFudWFsLSR7c2VudGluZWwrK31gKTtcbiAgICBhY2NGb3IoZW52cywgby5lbnZpcm9ubWVudCk7XG4gIH1cbiAgZm9yIChjb25zdCBjaSBvZiBjb3JyZWxhdGVkKSB7XG4gICAgZmxhZ0ZvcihjaS5lbnZpcm9ubWVudCkuYWRkKGNpLmV4ZWMpO1xuICAgIGFjY0ZvcihlbnZzLCBjaS5lbnZpcm9ubWVudCk7XG4gIH1cbiAgY29uc3QgcG9zdERlcGxveUJ5RW52ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCBbZW52LCBzZXRdIG9mIHBvc3REZXBsb3lFeGVjc0J5RW52KSBwb3N0RGVwbG95QnlFbnYuc2V0KGVudiwgc2V0LnNpemUpO1xuICByZXR1cm4gcG9zdERlcGxveUJ5RW52O1xufVxuXG4vKiogUGVyLWVudmlyb25tZW50IERGIC8gQ0ZSIC8gbGVhZC10aW1lIHJvd3MsIHByb2R1Y3Rpb24gZmlyc3QuICovXG5mdW5jdGlvbiBidWlsZEVudk1ldHJpY3MoXG4gIGVudnM6IE1hcDxzdHJpbmcsIEVudkFjYz4sXG4gIHBvc3REZXBsb3lCeUVudjogTWFwPHN0cmluZywgbnVtYmVyPixcbiAgZGF5czogbnVtYmVyLFxuICByZXF1ZXN0ZWRFbnY6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IERvcmFFbnZNZXRyaWNzW10ge1xuICByZXR1cm4gWy4uLmVudnMuZW50cmllcygpXVxuICAgIC8vIFRoZSBkZXBsb3kgYW5kIGluY2lkZW50IHNjYW5zIGFkbWl0IFBST0RVQ1RJT04gYWxvbmdzaWRlIGEgcmVxdWVzdGVkXG4gICAgLy8gZW52aXJvbm1lbnQgc28gTVRUUiBjYW4gY29ycmVsYXRlIHByb2R1Y3Rpb24gaW5jaWRlbnRzIChzZWVcbiAgICAvLyBgc2NhbkVudkNsYXVzZWApLiBUaGF0IHByb2R1Y3Rpb24gcm93IGlzIHBsdW1iaW5nIGZvciBNVFRSLCBub3Qgc29tZXRoaW5nXG4gICAgLy8gdGhlIGNhbGxlciBhc2tlZCB0byBzZWUg4oCUIHJlcG9ydCBvbmx5IHRoZSBlbnZpcm9ubWVudCB0aGF0IHdhcyByZXF1ZXN0ZWQuXG4gICAgLmZpbHRlcigoW2Vudmlyb25tZW50XSkgPT4gIXJlcXVlc3RlZEVudiB8fCBlbnZpcm9ubWVudCA9PT0gcmVxdWVzdGVkRW52KVxuICAgIC5tYXAoKFtlbnZpcm9ubWVudCwgYV0pID0+IHtcbiAgICAgIGNvbnN0IHBvc3REZXBsb3lGYWlsdXJlcyA9IHBvc3REZXBsb3lCeUVudi5nZXQoZW52aXJvbm1lbnQpID8/IDA7XG4gICAgICBjb25zdCByYXdQZXJEYXkgPSBhLmRlcGxveW1lbnRzIC8gZGF5cztcbiAgICAgIGNvbnN0IG51bWVyYXRvciA9IGEuZGVwbG95VGltZUZhaWx1cmVzICsgcG9zdERlcGxveUZhaWx1cmVzO1xuICAgICAgLy8gQ2xhbXAgdG8gWzAsMTAwXTogcG9zdC1kZXBsb3kgZmFpbHVyZXMgY2FuIGNvcnJlbGF0ZSB0byBhIGRlcGxveSB0aGF0XG4gICAgICAvLyBjb21wbGV0ZWQganVzdCBiZWZvcmUgdGhlIHdpbmRvdyAoa2VwdCBmb3IgY29ycmVsYXRpb24pLCBzbyB0aGUgbnVtZXJhdG9yXG4gICAgICAvLyBjYW4gdHJhbnNpZW50bHkgZXhjZWVkIGluLXdpbmRvdyBhdHRlbXB0cyDigJQgYSBDRlIgPiAxMDAlIGlzIG5ldmVyIHZhbGlkLlxuICAgICAgY29uc3QgcmF3UmF0ZSA9IGEuYXR0ZW1wdHMgPiAwID8gTWF0aC5taW4oMTAwLCAobnVtZXJhdG9yIC8gYS5hdHRlbXB0cykgKiAxMDApIDogMDtcbiAgICAgIGNvbnN0IGx0TWVkaWFuID0gbWVkaWFuKGEubGVhZEdhcHMpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgIGRlcGxveW1lbnRGcmVxdWVuY3k6IHtcbiAgICAgICAgICBkZXBsb3ltZW50czogYS5kZXBsb3ltZW50cyxcbiAgICAgICAgICBwZXJEYXk6IHJvdW5kKHJhd1BlckRheSwgMiksXG4gICAgICAgICAgbGV2ZWw6IGRvcmFMZXZlbEZvckZyZXF1ZW5jeShyYXdQZXJEYXksIGEuZGVwbG95bWVudHMpLFxuICAgICAgICB9LFxuICAgICAgICBjaGFuZ2VGYWlsdXJlUmF0ZToge1xuICAgICAgICAgIHJhdGU6IHJvdW5kKHJhd1JhdGUsIDEpLFxuICAgICAgICAgIGRlcGxveVRpbWVGYWlsdXJlczogYS5kZXBsb3lUaW1lRmFpbHVyZXMsXG4gICAgICAgICAgcG9zdERlcGxveUZhaWx1cmVzLFxuICAgICAgICAgIGF0dGVtcHRzOiBhLmF0dGVtcHRzLFxuICAgICAgICAgIGxldmVsOiBkb3JhTGV2ZWxGb3JDaGFuZ2VGYWlsdXJlKHJhd1JhdGUsIGEuYXR0ZW1wdHMpLFxuICAgICAgICB9LFxuICAgICAgICBsZWFkVGltZToge1xuICAgICAgICAgIGRlcGxveW1lbnRzOiBhLmxlYWRHYXBzLmxlbmd0aCxcbiAgICAgICAgICBtZWRpYW5TZWNvbmRzOiBsdE1lZGlhbiAhPSBudWxsID8gcm91bmQobHRNZWRpYW4sIDEpIDogbnVsbCxcbiAgICAgICAgICBsZXZlbDogZG9yYUxldmVsRm9yTGVhZFRpbWUobHRNZWRpYW4pLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9KVxuICAgIC5zb3J0KCh4LCB5KSA9PiB7XG4gICAgICBpZiAoeC5lbnZpcm9ubWVudCA9PT0gSEVBRExJTkVfRU5WKSByZXR1cm4gLTE7XG4gICAgICBpZiAoeS5lbnZpcm9ubWVudCA9PT0gSEVBRExJTkVfRU5WKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiB4LmVudmlyb25tZW50LmxvY2FsZUNvbXBhcmUoeS5lbnZpcm9ubWVudCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogTVRUUiDigJQgUFJPRFVDVElPTi1PTkxZLCBmcm9tIEJPVEggc291cmNlcy4gSW5jaWRlbnRzIHRha2UgcHJlY2VkZW5jZTogYVxuICogcHJvZHVjdGlvbiBpbmNpZGVudCBjb3JyZWxhdGVkIHRvIGEgZGVwbG95IGNvbnRyaWJ1dGVzIHRoZSByZWFsIHJlY292ZXJ5XG4gKiAoYHJlc29sdmVkX2F0IOKIkiBvcGVuZWRfYXRgKSwgYW5kIGFueSBtYW51YWwgb3V0Y29tZSBvbiB0aGUgU0FNRSBkZXBsb3kgaXNcbiAqIHNraXBwZWQuIE1hbnVhbCBvdXRjb21lcyBvbiBvdGhlciBkZXBsb3lzIGNvdW50IGFzIHJlY29yZGVkIChgZmFpbGVkYCDihpIgYW5cbiAqIGluY2lkZW50OyBgcmVzdG9yZWRgIOKGkiBhIHJlY292ZXJ5IGdhcCBvZiBgcmVzdG9yZWQg4oiSIGRlcGxveWVkYCkuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVNdHRyKFxuICBjb3JyZWxhdGVkOiBDb3JyZWxhdGVkSW5jaWRlbnRbXSxcbiAgbXR0clJvd3M6IEFycmF5PE10dHJQYWlyUm93ICYgeyBvdXRjb21lOiBzdHJpbmcgfT4sXG4pOiBEb3JhTWV0cmljc1snbWVhblRpbWVUb1Jlc3RvcmUnXSB7XG4gIGxldCBpbmNpZGVudHMgPSAwLCByZXN0b3JlZCA9IDA7XG4gIGNvbnN0IG10dHJHYXBzOiBudW1iZXJbXSA9IFtdO1xuICAvLyBFeGVjdXRpb25zIGFscmVhZHkgYXR0cmlidXRlZCB0byBhIHByb2R1Y3Rpb24gaW5jaWRlbnQgKHByZWNlZGVuY2UgZ3VhcmQpLlxuICBjb25zdCBpbmNpZGVudEV4ZWNzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgY2kgb2YgY29ycmVsYXRlZCkge1xuICAgIGlmIChjaS5lbnZpcm9ubWVudCAhPT0gSEVBRExJTkVfRU5WKSBjb250aW51ZTsgLy8gTVRUUiBpcyBwcm9kdWN0aW9uLW9ubHlcbiAgICBpbmNpZGVudHMrKztcbiAgICBpbmNpZGVudEV4ZWNzLmFkZChjaS5leGVjKTtcbiAgICBpZiAoY2kucmVzb2x2ZWRHYXAgIT0gbnVsbCkgeyByZXN0b3JlZCsrOyBtdHRyR2Fwcy5wdXNoKGNpLnJlc29sdmVkR2FwKTsgfVxuICB9XG4gIGZvciAoY29uc3QgbSBvZiBtdHRyUm93cykge1xuICAgIC8vIEluY2lkZW50IHByZWNlZGVuY2U6IGRvbid0IGRvdWJsZS1jb3VudCBhIGRlcGxveSBhbHJlYWR5IGZsYWdnZWQgYnkgYW4gaW5jaWRlbnQuXG4gICAgaWYgKG0uZXhlY3V0aW9uX2lkICE9IG51bGwgJiYgaW5jaWRlbnRFeGVjcy5oYXMobS5leGVjdXRpb25faWQpKSBjb250aW51ZTtcbiAgICBpZiAobS5vdXRjb21lID09PSAnZmFpbGVkJykgeyBpbmNpZGVudHMrKzsgY29udGludWU7IH1cbiAgICBpZiAobS5vdXRjb21lID09PSAncmVzdG9yZWQnKSB7XG4gICAgICByZXN0b3JlZCsrO1xuICAgICAgaWYgKG0ucmVzdG9yZWRfYXQgIT0gbnVsbCAmJiBtLmRlcGxveWVkX2F0ICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgZ2FwID0gKERhdGUucGFyc2UobS5yZXN0b3JlZF9hdCkgLSBEYXRlLnBhcnNlKG0uZGVwbG95ZWRfYXQpKSAvIDEwMDA7XG4gICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoZ2FwKSkgbXR0ckdhcHMucHVzaChNYXRoLm1heChnYXAsIDApKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgbXR0ck1lZGlhbiA9IG1lZGlhbihtdHRyR2Fwcyk7XG4gIHJldHVybiB7XG4gICAgaW5jaWRlbnRzLFxuICAgIHJlc3RvcmVkLFxuICAgIG1lZGlhblNlY29uZHM6IG10dHJNZWRpYW4gIT0gbnVsbCA/IHJvdW5kKG10dHJNZWRpYW4sIDEpIDogbnVsbCxcbiAgICBsZXZlbDogZG9yYUxldmVsRm9yUmVzdG9yZShtdHRyTWVkaWFuKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaGFwZSB0aGUgcmF3IERPUkEgc2NhbiByb3dzIGludG8gdGhlIHB1YmxpYyB7QGxpbmsgRG9yYU1ldHJpY3N9OiBwZXItZW52XG4gKiBERiAvIENGUiAvIGxlYWQgdGltZSAocG9zdC1kZXBsb3kgZmFpbHVyZXMgZm9sZGVkIGluKSwgcHJvZHVjdGlvbiBNVFRSIGZyb21cbiAqIGluY2lkZW50cyArIG1hbnVhbCBvdXRjb21lcywgYW5kIGRlcGxveSBjb3ZlcmFnZSDigJQgYWxsIGNyb3NzLXNvdXJjZSBtZWRpYW5zXG4gKiBvdmVyIGRlbHRhcyBjbGFtcGVkIOKJpTAuXG4gKi9cbmZ1bmN0aW9uIHNoYXBlRG9yYShcbiAgZGVwbG95Um93czogRGVwbG95Um93W10sXG4gIG91dGNvbWVSb3dzOiBPdXRjb21lUm93W10sXG4gIG10dHJSb3dzOiBBcnJheTxNdHRyUGFpclJvdyAmIHsgb3V0Y29tZTogc3RyaW5nIH0+LFxuICBjb3ZlcmFnZVJvdzogQ292ZXJhZ2VSb3cgfCB1bmRlZmluZWQsXG4gIGluY2lkZW50Um93czogSW5jaWRlbnRSb3dbXSxcbiAgZnJvbTogc3RyaW5nLFxuICB0bzogc3RyaW5nLFxuICBmaWx0ZXJzOiB7IHBpcGVsaW5lSWQ/OiBzdHJpbmc7IGVudmlyb25tZW50Pzogc3RyaW5nIH0sXG4gIHdpbmRvd0hvdXJzOiBudW1iZXIgPSBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSUyxcbik6IERvcmFNZXRyaWNzIHtcbiAgLy8gV2luZG93IGxlbmd0aCBpbiBkYXlzIChmbG9vcmVkIGF0IDEgc28gYSBzdWItZGF5IHdpbmRvdyB5aWVsZHMgdGhlIGNvdW50IGFzXG4gIC8vIHRoZSByYXRlLCBuZXZlciAvMCBvciBhbiBleHRyYXBvbGF0aW9uKS4gR3VhcmQgdW5wYXJzZWFibGUgZGF0ZXMg4oaSIDEgZGF5LlxuICBjb25zdCBzcGFuRGF5cyA9IChEYXRlLnBhcnNlKHRvKSAtIERhdGUucGFyc2UoZnJvbSkpIC8gODY0MDAwMDA7XG4gIGNvbnN0IGRheXMgPSBOdW1iZXIuaXNGaW5pdGUoc3BhbkRheXMpID8gTWF0aC5tYXgoc3BhbkRheXMsIDEpIDogMTtcbiAgLy8gV2luZG93IGVuZCBpbnN0YW50IGZvciBNVFRSIHJpZ2h0LWNlbnNvcmluZyAoYSByZXNvbHV0aW9uIGFmdGVyIGB0b2AgaXNcbiAgLy8gdW5vYnNlcnZlZCkuICtJbmZpbml0eSB3aGVuIGB0b2AgaXMgdW5wYXJzZWFibGUg4oeSIG5vIGNlbnNvcmluZyAoZmFpbC1vcGVuKS5cbiAgY29uc3QgdG9QYXJzZWQgPSBEYXRlLnBhcnNlKHRvKTtcbiAgY29uc3QgdG9NcyA9IE51bWJlci5pc0Zpbml0ZSh0b1BhcnNlZCkgPyB0b1BhcnNlZCA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuICBjb25zdCBlbnZzID0gYWNjdW11bGF0ZURlcGxveXMoZGVwbG95Um93cyk7XG4gIGNvbnN0IGNvcnJlbGF0ZWQgPSBjb3JyZWxhdGVJbmNpZGVudHMoZGVwbG95Um93cywgaW5jaWRlbnRSb3dzLCB3aW5kb3dIb3VycywgdG9Ncyk7XG4gIGNvbnN0IHBvc3REZXBsb3lCeUVudiA9IGNvdW50UG9zdERlcGxveUZhaWx1cmVzKGVudnMsIG91dGNvbWVSb3dzLCBjb3JyZWxhdGVkKTtcblxuICBjb25zdCByZWdpc3RlcmVkID0gTnVtYmVyKGNvdmVyYWdlUm93Py5yZWdpc3RlcmVkKSB8fCAwO1xuICBjb25zdCBkZXBsb3lpbmcgPSBOdW1iZXIoY292ZXJhZ2VSb3c/LmRlcGxveWluZykgfHwgMDtcblxuICByZXR1cm4ge1xuICAgIHdpbmRvdzogeyBmcm9tLCB0byB9LFxuICAgIGZpbHRlcnM6IHsgcGlwZWxpbmVJZDogZmlsdGVycy5waXBlbGluZUlkID8/IG51bGwsIGVudmlyb25tZW50OiBmaWx0ZXJzLmVudmlyb25tZW50ID8/IG51bGwgfSxcbiAgICBoZWFkbGluZTogSEVBRExJTkVfRU5WLFxuICAgIGVudmlyb25tZW50czogYnVpbGRFbnZNZXRyaWNzKGVudnMsIHBvc3REZXBsb3lCeUVudiwgZGF5cywgZmlsdGVycy5lbnZpcm9ubWVudCksXG4gICAgbWVhblRpbWVUb1Jlc3RvcmU6IGNvbXB1dGVNdHRyKGNvcnJlbGF0ZWQsIG10dHJSb3dzKSxcbiAgICBjb3ZlcmFnZToge1xuICAgICAgcmVnaXN0ZXJlZCxcbiAgICAgIGRlcGxveWluZyxcbiAgICAgIHdpdGhvdXREZXBsb3lzOiBNYXRoLm1heChyZWdpc3RlcmVkIC0gZGVwbG95aW5nLCAwKSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIERPUkEgdHJlbmQg4oCUIGRlcGxveW1lbnQgZnJlcXVlbmN5ICsgZGVwbG95LXRpbWUgY2hhbmdlLWZhaWx1cmUgcmF0ZVxuICogYnVja2V0ZWQgYnkgYGludGVydmFsYCAoZGF5L3dlZWsvbW9udGgpIGZvciBhIHNwYXJrbGluZS4gRGVwbG95LWJhc2lzIGxpa2VcbiAqIGdldERvcmFNZXRyaWNzOiBidWNrZXRzIHRlcm1pbmFsIGRlcGxveS1zdGFnZSBleGVjdXRpb25zIG9uIHRoZWlyXG4gKiBgY29tcGxldGVkX2F0YC4gU2hhcmVzIHRoZSBvcmcvcm9sbHVwICsgcGlwZWxpbmVJZC9lbnZpcm9ubWVudCBzY29waW5nLiBNVFRSLFxuICogbGVhZCB0aW1lLCBhbmQgcG9zdC1kZXBsb3kgQ0ZSIGFyZSBpbnRlbnRpb25hbGx5IG9taXR0ZWQgKHRvbyBoZWF2eSB0byBidWNrZXQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RG9yYVRyZW5kKFxuICBvcmdJZDogc3RyaW5nLFxuICBpbnRlcnZhbDogc3RyaW5nLFxuICBmcm9tOiBzdHJpbmcsXG4gIHRvOiBzdHJpbmcsXG4gIG9yZ0lkcz86IHN0cmluZ1tdLFxuICBvcHRzOiBEb3JhT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxEb3JhVHJlbmRQb2ludFtdPiB7XG4gIGFzc2VydFJlcG9ydEludGVydmFsKGludGVydmFsKTtcbiAgY29uc3QgeyBwcmVkLCBtdWx0aSB9ID0gb3JnU2NvcGUob3JnSWQsIG9yZ0lkcyk7XG4gIGNvbnN0IHsgcGlwZWxpbmVJZCwgZW52aXJvbm1lbnQgfSA9IG9wdHM7XG4gIGNvbnN0IHBpcGVsaW5lQ2xhdXNlID0gcGlwZWxpbmVJZCA/IHNxbGBBTkQgZS5waXBlbGluZV9pZCA9ICR7cGlwZWxpbmVJZH1gIDogc3FsYGA7XG4gIGNvbnN0IGVudkNsYXVzZSA9IGVudmlyb25tZW50ID8gc3FsYEFORCBlLmVudmlyb25tZW50ID0gJHtlbnZpcm9ubWVudH1gIDogc3FsYGA7XG4gIGNvbnN0IGV4ZWMgPSAoKSA9PiB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICAgIFdJVEggZGVwbG95cyBBUyAoXG4gICAgICAgIC0tIFBFUi1FWEVDVVRJT04gZGVwbG95IHVuaXQ6IG9uZSByb3cgcGVyIChlbnZpcm9ubWVudCwgZXhlY3V0aW9uKSxcbiAgICAgICAgLS0gZXZlcnkgZGVwbG95IFNUQUdFIHRvIHRoYXQgZW52IHdpdGhpbiB0aGUgZXhlY3V0aW9uIHJvbGxlZCB1cCB0byBhXG4gICAgICAgIC0tIHNpbmdsZSB0ZXJtaW5hbCBzdGF0dXMg4oCUIE5PVCBvbmUgcm93IHBlciBzdGFnZS5cbiAgICAgICAgU0VMRUNUXG4gICAgICAgICAgJHt0ZXJtaW5hbFN0YXR1c1JvbGx1cH0gQVMgc3RhdHVzLFxuICAgICAgICAgIE1BWChlLmNvbXBsZXRlZF9hdCkgQVMgY29tcGxldGVkX2F0XG4gICAgICAgIEZST00gJHtzY2hlbWEucGlwZWxpbmVFdmVudH0gZVxuICAgICAgICBKT0lOICR7c2NoZW1hLnBpcGVsaW5lfSBwIE9OIHAuaWQgPSBlLnBpcGVsaW5lX2lkXG4gICAgICAgIFdIRVJFIHAub3JnX2lkICR7cHJlZH0gQU5EIGUuZXZlbnRfdHlwZSA9ICdTVEFHRScgQU5EIGUuZW52aXJvbm1lbnQgSVMgTk9UIE5VTExcbiAgICAgICAgICAke3BpcGVsaW5lQ2xhdXNlfSAke2VudkNsYXVzZX1cbiAgICAgICAgICBBTkQgZS5jb21wbGV0ZWRfYXQgPj0gJHtmcm9tfTo6dGltZXN0YW1wdHogQU5EIGUuY29tcGxldGVkX2F0IDw9ICR7dG99Ojp0aW1lc3RhbXB0elxuICAgICAgICBHUk9VUCBCWSBlLmVudmlyb25tZW50LCBlLmV4ZWN1dGlvbl9pZFxuICAgICAgKVxuICAgICAgU0VMRUNUXG4gICAgICAgIERBVEVfVFJVTkMoJHtpbnRlcnZhbH0sIGNvbXBsZXRlZF9hdCk6OnRleHQgQVMgcGVyaW9kLFxuICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIGRlcGxveW1lbnRzLFxuICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdGQUlMRUQnKTo6aW50IEFTIGZhaWxlZCxcbiAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJykpOjppbnQgQVMgdG90YWwsXG4gICAgICAgIC0tIHF1b3RlZCBhbGlhcyBzbyB0aGUgcmF3IHJvdyBrZXkgaXMgZXhhY3RseSB0aGUgRG9yYVRyZW5kUG9pbnQgZmllbGRcbiAgICAgICAgQ09BTEVTQ0UoUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnRkFJTEVEJyk6Om51bWVyaWNcbiAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyBJTiAoJ1NVQ0NFRURFRCcsICdGQUlMRUQnKSksIDApICogMTAwLCAxKSwgMCk6OmZsb2F0IEFTIFwiY2hhbmdlRmFpbHVyZVBjdFwiXG4gICAgICBGUk9NIGRlcGxveXNcbiAgICAgIEdST1VQIEJZIHBlcmlvZCBPUkRFUiBCWSBwZXJpb2RcbiAgICBgKS50aGVuKHIgPT4gZHJpenpsZVJvd3M8RG9yYVRyZW5kUG9pbnQ+KHIucm93cykpKTtcbiAgY29uc3Qga2V5ID0gYCR7b3JnSWR9OmRvcmEtdHJlbmQ6JHtpbnRlcnZhbH06JHtmcm9tfToke3RvfToke3BpcGVsaW5lSWQgPz8gJyd9OiR7ZW52aXJvbm1lbnQgPz8gJyd9YDtcbiAgcmV0dXJuIHJ1blJlcG9ydChrZXksIG11bHRpLCBleGVjKTtcbn1cblxuLyoqXG4gKiBQZXItcGlwZWxpbmUgQlVJTEQgSEVBTFRIIOKAlCBhIHN0YW5kYXJkIChOT1QgYGFkdmFuY2VkX3JlcG9ydGluZ2ApXG4gKiBwZXItc3RhZ2UgYnJlYWtkb3duIGZvciBvbmUgcGlwZWxpbmUgb3ZlciBhIFtmcm9tLHRvXSB3aW5kb3cuIEFnZ3JlZ2F0ZXMgdGhlXG4gKiBleGlzdGluZyBgcGlwZWxpbmVfZXZlbnRzYCBTVEFHRSByb3dzOiBlYWNoIHN0YWdlIGlzIHJvbGxlZCB1cCBwZXIgZXhlY3V0aW9uXG4gKiB0byBhIHRlcm1pbmFsIHN0YXR1cyAoRkFJTEVEIHdpbnMsIHRoZW4gU1VDQ0VFREVEKSArIGl0cyBtYXggZHVyYXRpb24sIHRoZW5cbiAqIGdyb3VwZWQgcGVyIHN0YWdlIGludG8gcnVuL3N1Y2Nlc3MvZmFpbHVyZSBjb3VudHMsIGEgc3VjY2VzcyByYXRlLCBhbmRcbiAqIGR1cmF0aW9uIHBlcmNlbnRpbGVzIChwNTAvcDkwL3A5OSkuIFRvdGFscyBzdW0gYWNyb3NzIHN0YWdlcy4gT3JnLXNjb3BlZCB2aWFcbiAqIHRoZSBwaXBlbGluZSBqb2luIChgcC5vcmdfaWQgJHtwcmVkfWApICsgcm9sbHVwLWF3YXJlIGxpa2UgdGhlIHNpYmxpbmcgcmVwb3J0cztcbiAqIGEgcGlwZWxpbmVJZCBvd25lZCBieSBhbm90aGVyIG9yZyByZXR1cm5zIGFuIGVtcHR5IGJyZWFrZG93bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1aWxkSGVhbHRoKFxuICBvcmdJZDogc3RyaW5nLFxuICBwaXBlbGluZUlkOiBzdHJpbmcsXG4gIGZyb206IHN0cmluZyxcbiAgdG86IHN0cmluZyxcbiAgb3JnSWRzPzogc3RyaW5nW10sXG4pOiBQcm9taXNlPEJ1aWxkSGVhbHRoPiB7XG4gIGNvbnN0IHsgcHJlZCwgbXVsdGkgfSA9IG9yZ1Njb3BlKG9yZ0lkLCBvcmdJZHMpO1xuICBjb25zdCBleGVjID0gKCkgPT4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgIGNvbnN0IHJvd3MgPSBkcml6emxlUm93czxCdWlsZEhlYWx0aFN0YWdlPigoYXdhaXQgdHguZXhlY3V0ZShzcWxgXG4gICAgICBXSVRIIHN0YWdlX3J1bnMgQVMgKFxuICAgICAgICBTRUxFQ1RcbiAgICAgICAgICBlLnN0YWdlX25hbWUgQVMgc3RhZ2UsXG4gICAgICAgICAgJHt0ZXJtaW5hbFN0YXR1c1JvbGx1cH0gQVMgc3RhdHVzLFxuICAgICAgICAgIE1BWChlLmR1cmF0aW9uX21zKSBBUyBkdXJhdGlvbl9tc1xuICAgICAgICBGUk9NICR7c2NoZW1hLnBpcGVsaW5lRXZlbnR9IGVcbiAgICAgICAgSk9JTiAke3NjaGVtYS5waXBlbGluZX0gcCBPTiBwLmlkID0gZS5waXBlbGluZV9pZFxuICAgICAgICBXSEVSRSBwLm9yZ19pZCAke3ByZWR9IEFORCBlLnBpcGVsaW5lX2lkID0gJHtwaXBlbGluZUlkfVxuICAgICAgICAgIEFORCBlLmV2ZW50X3R5cGUgPSAnU1RBR0UnIEFORCBlLnN0YWdlX25hbWUgSVMgTk9UIE5VTExcbiAgICAgICAgICBBTkQgZS5zdGFydGVkX2F0ID49ICR7ZnJvbX06OnRpbWVzdGFtcHR6IEFORCBlLnN0YXJ0ZWRfYXQgPD0gJHt0b306OnRpbWVzdGFtcHR6XG4gICAgICAgIEdST1VQIEJZIGUuc3RhZ2VfbmFtZSwgZS5leGVjdXRpb25faWRcbiAgICAgIClcbiAgICAgIFNFTEVDVFxuICAgICAgICBzdGFnZSxcbiAgICAgICAgQ09VTlQoKik6OmludCBBUyBydW5zLFxuICAgICAgICBDT1VOVCgqKSBGSUxURVIgKFdIRVJFIHN0YXR1cyA9ICdTVUNDRUVERUQnKTo6aW50IEFTIHN1Y2Nlc3NlcyxcbiAgICAgICAgQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnRkFJTEVEJyk6OmludCBBUyBmYWlsdXJlcyxcbiAgICAgICAgQ09BTEVTQ0UoUk9VTkQoQ09VTlQoKikgRklMVEVSIChXSEVSRSBzdGF0dXMgPSAnU1VDQ0VFREVEJyk6Om51bWVyaWNcbiAgICAgICAgICAvIE5VTExJRihDT1VOVCgqKSwgMCkgKiAxMDAsIDEpLCAwKTo6ZmxvYXQgQVMgXCJzdWNjZXNzUmF0ZVwiLFxuICAgICAgICBQRVJDRU5USUxFX0NPTlQoMC41KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGR1cmF0aW9uX21zKTo6aW50IEFTIFwicDUwTXNcIixcbiAgICAgICAgUEVSQ0VOVElMRV9DT05UKDAuOSkgV0lUSElOIEdST1VQIChPUkRFUiBCWSBkdXJhdGlvbl9tcyk6OmludCBBUyBcInA5ME1zXCIsXG4gICAgICAgIFBFUkNFTlRJTEVfQ09OVCgwLjk5KSBXSVRISU4gR1JPVVAgKE9SREVSIEJZIGR1cmF0aW9uX21zKTo6aW50IEFTIFwicDk5TXNcIlxuICAgICAgRlJPTSBzdGFnZV9ydW5zXG4gICAgICBXSEVSRSBzdGF0dXMgSU4gKCdTVUNDRUVERUQnLCAnRkFJTEVEJylcbiAgICAgIEdST1VQIEJZIHN0YWdlXG4gICAgICBPUkRFUiBCWSBydW5zIERFU0MsIHN0YWdlXG4gICAgYCkpLnJvd3MpO1xuXG4gICAgLy8gVG90YWxzIHN1bSBhY3Jvc3Mgc3RhZ2VzICh0b3RhbCBzdGFnZS1ydW5zIC8gc3RhZ2UtZmFpbHVyZXMgaW4gdGhlIHdpbmRvdykuXG4gICAgbGV0IHJ1bnMgPSAwLCBmYWlsdXJlcyA9IDA7XG4gICAgZm9yIChjb25zdCBzIG9mIHJvd3MpIHsgcnVucyArPSBzLnJ1bnM7IGZhaWx1cmVzICs9IHMuZmFpbHVyZXM7IH1cbiAgICBjb25zdCBmYWlsdXJlUmF0ZSA9IHJ1bnMgPiAwID8gcm91bmQoKGZhaWx1cmVzIC8gcnVucykgKiAxMDAsIDEpIDogMDtcbiAgICByZXR1cm4geyBzdGFnZXM6IHJvd3MsIHRvdGFsczogeyBydW5zLCBmYWlsdXJlcywgZmFpbHVyZVJhdGUgfSB9O1xuICB9KTtcbiAgcmV0dXJuIHJ1blJlcG9ydChgJHtvcmdJZH06YnVpbGQtaGVhbHRoOiR7cGlwZWxpbmVJZH06JHtmcm9tfToke3RvfWAsIG11bHRpLCBleGVjKTtcbn1cblxuLy8g4pSA4pSAIENhdGVnb3J5IDI6IFBsdWdpbiBJbnZlbnRvcnkgJiBCdWlsZHMg4pSA4pSAXG5cbi8qKiBQbHVnaW4gc3VtbWFyeSDigJQgY291bnRzIGFuZCBicmVha2Rvd25zLlxuICogIElOVEVOVElPTkFMTFkgU0lOR0xFLU9SRyAobm8gcm9sbHVwKTogcGx1Z2luIGludmVudG9yeSBpcyBhbiBvcmctb3duZWRcbiAqICBhc3NldCBjb3VudCwgbm90IGFuIGV4ZWN1dGlvbi9idWlsZCBhY3Rpdml0eSByZXBvcnQsIHNvIGEgcGFyZW50J3MgdmlldyBpc1xuICogIGl0cyBvd24gcGx1Z2lucyDigJQgdGVhbXMgbWFuYWdlIHRoZWlyIG93biBpbnZlbnRvcnkuIFNpbmdsZSBgPSAkb3JnYCBzY29wZS4gKi9cbiJdfQ==
@@ -0,0 +1,25 @@
1
+ import type { PluginRuntimeAggregate, PluginRuntimeFilter, PluginRuntimeStats } from './types.js';
2
+ /** Window for the ecosystem aggregate (`plugin_stats.success_rate_30d`). */
3
+ export declare const PLUGIN_RUNTIME_AGGREGATE_DAYS = 30;
4
+ /** Window for review "verified use": a successful run in the last 90 days. */
5
+ export declare const PLUGIN_VERIFIED_USE_DAYS = 90;
6
+ /**
7
+ * Per plugin version: runs, success rate and duration (p50/p95) over
8
+ * `[from, to]` on `completed_at`, for the org (or its rollup subtree).
9
+ * Optional filters narrow to one plugin name / publisher (`null` = own-org
10
+ * plugins) / version.
11
+ */
12
+ export declare function getPluginRuntime(orgId: string, from: string, to: string, filter?: PluginRuntimeFilter, orgIds?: string[]): Promise<PluginRuntimeStats[]>;
13
+ /**
14
+ * Ecosystem aggregate for one listing over the last 30 days, across EVERY org:
15
+ * runs, success rate (0–1; null with no runs) and how many distinct orgs ran it.
16
+ * Runs under system context — the caller is the plugin service computing
17
+ * `plugin_stats`, and `activeOrgCount30d` is only ever shown at ≥ 5.
18
+ */
19
+ export declare function getPluginRuntimeAggregate(publisher: string, name: string): Promise<PluginRuntimeAggregate>;
20
+ /**
21
+ * Review "verified use": did `orgId` run `(publisher, name)` successfully
22
+ * in the last 90 days? Bounded by the org's event retention — a run older than
23
+ * the retention horizon has been swept and no longer counts.
24
+ */
25
+ export declare function hasVerifiedPluginUse(orgId: string, publisher: string, name: string): Promise<boolean>;