@pipeline-builder/pipeline-core 4.4.3 → 4.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/lib/config/app-config.d.ts +1 -0
  2. package/lib/config/app-config.js +7 -1
  3. package/lib/config/config-types.d.ts +9 -0
  4. package/lib/config/config-types.js +1 -1
  5. package/lib/config/handler-constants.d.ts +7 -0
  6. package/lib/config/handler-constants.js +8 -1
  7. package/lib/config/infrastructure-config.js +2 -1
  8. package/lib/core/audit-correlation.d.ts +34 -0
  9. package/lib/core/audit-correlation.js +50 -0
  10. package/lib/core/pipeline-helpers.js +50 -6
  11. package/lib/core/pipeline-registration.d.ts +25 -0
  12. package/lib/core/pipeline-registration.js +28 -0
  13. package/lib/core/platform-tls.d.ts +43 -0
  14. package/lib/core/platform-tls.js +70 -0
  15. package/lib/core/plugin-contract.d.ts +8 -0
  16. package/lib/core/plugin-contract.js +15 -3
  17. package/lib/core/plugin-lookup-envelope.d.ts +30 -2
  18. package/lib/core/plugin-lookup-envelope.js +58 -7
  19. package/lib/core/quota-exceeded.d.ts +11 -0
  20. package/lib/core/quota-exceeded.js +44 -0
  21. package/lib/core/runtime-check.d.ts +53 -0
  22. package/lib/core/runtime-check.js +56 -0
  23. package/lib/core/security-reports.d.ts +26 -0
  24. package/lib/core/security-reports.js +28 -0
  25. package/lib/core/step-manifest.d.ts +7 -0
  26. package/lib/core/step-manifest.js +1 -1
  27. package/lib/core/synth-failure.d.ts +38 -0
  28. package/lib/core/synth-failure.js +63 -0
  29. package/lib/handlers/plugin-lookup-handler.d.ts +19 -2
  30. package/lib/handlers/plugin-lookup-handler.js +107 -17
  31. package/lib/index.d.ts +9 -2
  32. package/lib/index.js +10 -3
  33. package/lib/pipeline/pipeline-builder.js +55 -8
  34. package/lib/pipeline/plugin-lookup.d.ts +18 -1
  35. package/lib/pipeline/plugin-lookup.js +28 -7
  36. package/lib/pipeline/runtime-vuln-check-step.d.ts +29 -0
  37. package/lib/pipeline/runtime-vuln-check-step.js +36 -0
  38. package/lib/pipeline/stage-builder.d.ts +9 -0
  39. package/lib/pipeline/stage-builder.js +28 -7
  40. package/lib/pipeline/step-manifest-recorder.d.ts +2 -2
  41. package/lib/pipeline/step-manifest-recorder.js +8 -6
  42. package/lib/testing/exports.json +35 -0
  43. package/package.json +5 -4
@@ -11,6 +11,7 @@ import { STEP_BOOTSTRAP_CMD, extractMetadataEnv, merge, wrapCommandsForFailureBe
11
11
  import { resolveNetwork } from './network.js';
12
12
  import { PluginType, ComputeType } from './pipeline-types.js';
13
13
  import { pluginArtifactAlias } from './plugin-contract.js';
14
+ import { SECURITY_REPORT_KEY_ENV, SECURITY_REPORT_SECRET_LEAF, SECURITY_REPORT_UPLOAD_ENV } from './security-reports.js';
14
15
  import { PLUGIN_IMAGE_REPOSITORY_RE } from './step-manifest.js';
15
16
  import { Config, CoreConstants } from '../config/app-config.js';
16
17
  import { resolvePluginTemplates } from '../template/plugin-resolver.js';
@@ -271,7 +272,9 @@ export function resolvePluginImage(scope, plugin, orgId) {
271
272
  *
272
273
  * Reads `aws.codeBuild.defaultImage` (env: `CODEBUILD_DEFAULT_IMAGE`).
273
274
  * Default: `pipeline-bootstrap:1.0` — the local tag built by
274
- * `deploy/codebuild/bootstrap/Dockerfile`.
275
+ * `deploy/codebuild/bootstrap/Dockerfile`. Pinned by
276
+ * `aws.codeBuild.defaultImageDigest` (env: `CODEBUILD_DEFAULT_IMAGE_DIGEST`)
277
+ * when set, the same way plugin images are pinned by their signed digest.
275
278
  *
276
279
  * - AWS curated image (`aws/codebuild/*`): use the matching `LinuxBuildImage`
277
280
  * constant so CDK emits `imagePullCredentialsType: CODEBUILD`. Using
@@ -310,10 +313,34 @@ function curatedLinuxBuildImage(imageId) {
310
313
  default: return LinuxBuildImage.fromCodeBuildImageId(imageId);
311
314
  }
312
315
  }
316
+ /** A registry manifest digest as CodeBuild accepts it in an image reference. */
317
+ const IMAGE_DIGEST_RE = /^sha256:[0-9a-f]{64}$/;
318
+ /**
319
+ * Pull reference for the configured default image's bare `<repo>:<tag>`:
320
+ * `<repo>@<digest>` when the bootstrap digest is configured, else the tag
321
+ * itself with a loud warning. A digest that is set but malformed fails the
322
+ * synth — it is a typo, and silently falling back to the tag would hide it.
323
+ */
324
+ function pinnedDefaultImageRef(configured, digest) {
325
+ if (!digest) {
326
+ log.warn(`CODEBUILD_DEFAULT_IMAGE='${configured}' is pulled by its MUTABLE tag — CODEBUILD_DEFAULT_IMAGE_DIGEST is not set. ` +
327
+ 'Anyone holding a registry push credential for library/ could re-point it. Set CODEBUILD_DEFAULT_IMAGE_DIGEST ' +
328
+ 'to the digest deploy/bin/build-codebuild-bootstrap.sh prints after publishing.');
329
+ return configured;
330
+ }
331
+ if (!IMAGE_DIGEST_RE.test(digest)) {
332
+ throw new Error(`CODEBUILD_DEFAULT_IMAGE_DIGEST='${digest}' is not a sha256 manifest digest (sha256:<64 hex>).`);
333
+ }
334
+ const repo = configured.replace(/@.*$/, '').replace(/:[^:/]+$/, '');
335
+ return `${repo}@${digest}`;
336
+ }
313
337
  export function resolveDefaultBuildImage(scope, orgId) {
314
338
  let configured;
339
+ let digest = '';
315
340
  try {
316
- configured = Config.get('aws').codeBuild.defaultImage;
341
+ const codeBuild = Config.get('aws').codeBuild;
342
+ configured = codeBuild.defaultImage;
343
+ digest = codeBuild.defaultImageDigest;
317
344
  }
318
345
  catch {
319
346
  configured = STANDARD_8_0;
@@ -323,9 +350,10 @@ export function resolveDefaultBuildImage(scope, orgId) {
323
350
  const curated = curatedLinuxBuildImage(configured);
324
351
  if (curated)
325
352
  return curated;
326
- // Fully-qualified URI — operator owns it. No registry/Secret wiring.
353
+ // Fully-qualified URI — operator owns it. No registry/Secret wiring. An
354
+ // operator-supplied digest is honoured; a tag-only URI is warned about.
327
355
  if (configured.includes('/')) {
328
- return LinuxBuildImage.fromDockerRegistry(configured);
356
+ return LinuxBuildImage.fromDockerRegistry(configured.includes('@sha256:') ? configured : pinnedDefaultImageRef(configured, digest));
329
357
  }
330
358
  // Bare tag → auto-prefix with the platform registry, mirroring
331
359
  // resolvePluginImage(). Bail to the curated standard:8.0 fallback
@@ -353,7 +381,7 @@ export function resolveDefaultBuildImage(scope, orgId) {
353
381
  // Use the external pull host/port (not the in-cluster host) — this URI is
354
382
  // consumed by AWS CodeBuild, which can't resolve the `registry:5000` ClusterIP.
355
383
  const { host: pullHost, portPart } = resolveExternalPullTarget(registry);
356
- const imageUri = `${pullHost}${portPart}/library/${configured}`;
384
+ const imageUri = `${pullHost}${portPart}/library/${pinnedDefaultImageRef(configured, digest)}`;
357
385
  // Same Secret as resolvePluginImage — the per-org REGISTRY credential, which
358
386
  // CodeBuild sends as Basic auth and image-registry exchanges for a scoped token.
359
387
  const stack = Stack.of(scope);
@@ -422,6 +450,21 @@ export function createCodeBuildStep(options) {
422
450
  ? toSecretEnvVars(requiredSecrets, orgId)
423
451
  : {};
424
452
  const env = buildEnv(plugin, merged, customEnv);
453
+ // Security-report upload (opt-in): inject the org's reporting:ingest-scoped
454
+ // key — never the full platform credential — as a SECRETS_MANAGER variable.
455
+ // CDK grants the step role read on exactly that secret. See core/security-reports.ts.
456
+ const reportUpload = env[SECURITY_REPORT_UPLOAD_ENV] === 'true';
457
+ if (reportUpload && !orgId) {
458
+ log.warn(`Step "${id}" sets ${SECURITY_REPORT_UPLOAD_ENV}=true but no orgId is available — the upload key cannot be injected and the upload will fail.`);
459
+ }
460
+ const reportKeyEnvVar = reportUpload && orgId
461
+ ? {
462
+ [SECURITY_REPORT_KEY_ENV]: {
463
+ value: `${CoreConstants.secretPath(orgId, SECURITY_REPORT_SECRET_LEAF)}:password`,
464
+ type: BuildEnvironmentVariableType.SECRETS_MANAGER,
465
+ },
466
+ }
467
+ : {};
425
468
  // CodePipeline resolved variables — must be in CodeBuildStep.env (action-level),
426
469
  // not buildEnvironment.environmentVariables (project-level)
427
470
  const actionEnv = {
@@ -510,6 +553,7 @@ export function createCodeBuildStep(options) {
510
553
  environmentVariables: {
511
554
  ...toCodeBuildEnvVars(env),
512
555
  ...secretEnvVars,
556
+ ...reportKeyEnvVar,
513
557
  },
514
558
  ...metaBuildEnv,
515
559
  },
@@ -563,4 +607,4 @@ export function getComputeType(input = 'SMALL') {
563
607
  export function unwrapSecret(value) {
564
608
  return typeof value === 'string' ? value : value.unsafeUnwrap();
565
609
  }
566
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3BpcGVsaW5lLWhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxTQUFTLEVBQUUsV0FBVyxJQUFJLGNBQWMsRUFBRSxlQUFlLEVBQW9CLE1BQU0sMkJBQTJCLENBQUM7QUFDdEosT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckYsT0FBTyxFQUFvQixNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx3QkFBd0IsRUFBRSwyQkFBMkIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9JLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0SCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFxQixNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEUsT0FBTyxFQUFF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QUFDLEtBQUssQ0FBQyxFQUFFLGNBQWMsQ0FBQyxLQUFLO1FBQ3pDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLGNBQWMsQ0FBQyxNQUFNO1FBQzNDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLGNBQWMsQ0FBQyxLQUFLO1FBQ3pDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxRQUFRO0tBQ2hELENBQUM7SUFFRixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osR0FBRyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsS0FBSywwQkFBMEIsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQTJCO0lBQ3RELE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YSc7XG5pbXBvcnQgeyBEdXJhdGlvbiwgU2VjcmV0VmFsdWUsIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlVHlwZSwgQnVpbGRTcGVjLCBDb21wdXRlVHlwZSBhcyBDREtDb21wdXRlVHlwZSwgTGludXhCdWlsZEltYWdlLCB0eXBlIElCdWlsZEltYWdlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZCc7XG5pbXBvcnQgeyBTZWNyZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXInO1xuaW1wb3J0IHsgQ29kZUJ1aWxkU3RlcCwgTWFudWFsQXBwcm92YWxTdGVwLCBTaGVsbFN0ZXAgfSBmcm9tICdhd3MtY2RrLWxpYi9waXBlbGluZXMnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IHR5cGUgQXJ0aWZhY3RLZXkgfSBmcm9tICcuL2FydGlmYWN0LW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgbWV0YWRhdGFGb3JTaGVsbFN0ZXAsIG1ldGFkYXRhRm9yQ29kZUJ1aWxkU3RlcCwgbWV0YWRhdGFGb3JCdWlsZEVudmlyb25tZW50LCBuZXR3b3JrQ29uZmlnRnJvbU1ldGFkYXRhIH0gZnJvbSAnLi9tZXRhZGF0YS1idWlsZGVyLmpzJztcbmltcG9ydCB7IFNURVBfQk9PVFNUUkFQX0NNRCwgZXh0cmFjdE1ldGFkYXRhRW52LCBtZXJnZSwgd3JhcENvbW1hbmRzRm9yRmFpbHVyZUJlaGF2aW9yIH0gZnJvbSAnLi9tZXRhZGF0YS1oZWxwZXJzLmpzJztcbmltcG9ydCB7IHJlc29sdmVOZXR3b3JrIH0gZnJvbSAnLi9uZXR3b3JrLmpzJztcbmltcG9ydCB7IFBsdWdpblR5cGUsIENvbXB1dGVUeXBlLCB0eXBlIE1ldGFEYXRhVHlwZSB9IGZyb20gJy4vcGlwZWxpbmUtdHlwZXMuanMnO1xuaW1wb3J0IHsgcGx1Z2luQXJ0aWZhY3RBbGlhcyB9IGZyb20gJy4vcGx1Z2luLWNvbnRyYWN0LmpzJztcbmltcG9ydCB7IFBMVUdJTl9JTUFHRV9SRVBPU0lUT1JZX1JFIH0gZnJvbSAnLi9zdGVwLW1hbmlmZXN0LmpzJztcbmltcG9ydCB7IENvbmZpZywgQ29yZUNvbnN0YW50cyB9IGZyb20gJy4uL2NvbmZpZy9hcHAtY29uZmlnLmpzJztcbmltcG9ydCB0eXBlIHsgQ29kZUJ1aWxkU3RlcE9wdGlvbnMsIFN0ZXBDdXN0b21pemF0aW9uIH0gZnJvbSAnLi4vcGlwZWxpbmUvc3RlcC10eXBlcy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUGx1Z2luVGVtcGxhdGVzIH0gZnJvbSAnLi4vdGVtcGxhdGUvcGx1Z2luLXJlc29sdmVyLmpzJztcblxuY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCdwaXBlbGluZS1oZWxwZXJzJyk7XG5cbi8qKlxuICogQnVpbGQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gcGx1Z2luIGNvbmZpZywgbWVyZ2VkIG1ldGFkYXRhLCBhbmQgY3VzdG9tIGVudi5cbiAqXG4gKiBNZXJnZSBvcmRlciAobGFzdCB3aW5zKTpcbiAqICAgMS4gcGx1Z2luLmVudiDigJQgcGx1Z2luIGRlZmF1bHQgZW52IHZhcnMgKGxvd2VzdCBwcmlvcml0eSlcbiAqICAgMi4gbm9uLW5hbWVzcGFjZWQgbWV0YWRhdGEga2V5cyDigJQgZS5nLiBQWVRIT05fVkVSU0lPTiwgV09SS0RJUlxuICogICAzLiBjdXN0b21FbnYg4oCUIHBlci1zdGVwIGN1c3RvbSBlbnYgdmFycyAoaGlnaGVzdCBwcmlvcml0eSlcbiAqL1xuZnVuY3Rpb24gYnVpbGRFbnYocGx1Z2luOiBQbHVnaW4sIG1ldGFkYXRhOiBNZXRhRGF0YVR5cGUsIGN1c3RvbUVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi4ocGx1Z2luLmVudiA/PyB7fSksXG4gICAgLi4uZXh0cmFjdE1ldGFkYXRhRW52KG1ldGFkYXRhKSxcbiAgICAuLi4oY3VzdG9tRW52ID8/IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBib290c3RyYXAtcHJlZml4ZWQgaW5zdGFsbCBhbmQgYnVpbGQgY29tbWFuZHMgZnJvbSBwbHVnaW4gY29uZmlnLlxuICogRWFjaCBjb21tYW5kIGxpc3QgaXMgcHJlcGVuZGVkIHdpdGggYSBXT1JLRElSIGJvb3RzdHJhcCB0aGF0IGRlZmF1bHRzIHRvICcuLycuXG4gKiBXaGVuIGN1c3RvbSBjb21tYW5kcyBhcmUgcHJvdmlkZWQsIHRoZXkgYXJlIGluamVjdGVkIGJlZm9yZS9hZnRlciB0aGUgcGx1Z2luJ3MgY29tbWFuZHMuXG4gKiBCdWlsZCBjb21tYW5kcyBhcmUgb3B0aW9uYWxseSB3cmFwcGVkIGJ5IGZhaWx1cmVCZWhhdmlvciBsb2dpYy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRDb21tYW5kcyhwbHVnaW46IFBsdWdpbiwgY3VzdG9tPzogU3RlcEN1c3RvbWl6YXRpb24sIGZhaWx1cmVCZWhhdmlvcj86ICdmYWlsJyB8ICd3YXJuJyB8ICdpZ25vcmUnKTogeyBpbnN0YWxsQ29tbWFuZHM6IHN0cmluZ1tdOyBjb21tYW5kczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IHVzZXJDb21tYW5kcyA9IFtcbiAgICAuLi4oY3VzdG9tPy5wcmVDb21tYW5kcyA/PyBbXSksXG4gICAgLi4uKHBsdWdpbi5jb21tYW5kcz8ubGVuZ3RoID8gcGx1Z2luLmNvbW1hbmRzIDogW10pLFxuICAgIC4uLihjdXN0b20/LnBvc3RDb21tYW5kcyA/PyBbXSksXG4gIF07XG5cbiAgcmV0dXJuIHtcbiAgICBpbnN0YWxsQ29tbWFuZHM6IFtcbiAgICAgIFNURVBfQk9PVFNUUkFQX0NNRCxcbiAgICAgIC4uLihjdXN0b20/LnByZUluc3RhbGxDb21tYW5kcyA/PyBbXSksXG4gICAgICAuLi4ocGx1Z2luLmluc3RhbGxDb21tYW5kcyA/PyBbXSksXG4gICAgICAuLi4oY3VzdG9tPy5wb3N0SW5zdGFsbENvbW1hbmRzID8/IFtdKSxcbiAgICBdLFxuICAgIGNvbW1hbmRzOiBbU1RFUF9CT09UU1RSQVBfQ01ELCAuLi53cmFwQ29tbWFuZHNGb3JGYWlsdXJlQmVoYXZpb3IodXNlckNvbW1hbmRzLCBmYWlsdXJlQmVoYXZpb3IpXSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgcGxhaW4gZW52IHJlY29yZCB0byBDb2RlQnVpbGQncyBlbnZpcm9ubWVudFZhcmlhYmxlcyBmb3JtYXQgKFBMQUlOVEVYVCkuXG4gKi9cbmZ1bmN0aW9uIHRvQ29kZUJ1aWxkRW52VmFycyhlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiBzdHJpbmcgfT4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKGVudikubWFwKChbbmFtZSwgdmFsdWVdKSA9PiBbbmFtZSwgeyB2YWx1ZSB9XSksXG4gICk7XG59XG5cbi8qKlxuICogQnVpbGQgU0VDUkVUU19NQU5BR0VSLXR5cGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gcGx1Z2luIHNlY3JldCBkZWNsYXJhdGlvbnMuXG4gKiBVc2VzIG5hbWluZyBjb252ZW50aW9uOiBwaXBlbGluZS1idWlsZGVyL3tvcmdJZH0ve3NlY3JldE5hbWV9XG4gKiBFYWNoIG9yZyBtYW5hZ2VzIHRoZXNlIHNlY3JldHMgaW4gdGhlaXIgb3duIEFXUyBTZWNyZXRzIE1hbmFnZXIuXG4gKi9cbmNvbnN0IFZBTElEX1NFQ1JFVF9OQU1FID0gL15bYS16QS1aMC05L18rPS5ALV0rJC87XG5cbi8qKlxuICogU2VjcmV0cyBNYW5hZ2VyIGxlYWYgaG9sZGluZyB0aGUgb3JnJ3MgUkVHSVNUUlkgY3JlZGVudGlhbCDigJQgdGhlXG4gKiBgcmVnaXN0cnk6cHVzaGAtc2NvcGVkIHNlcnZpY2UtYWNjb3VudCBrZXkgQ29kZUJ1aWxkIHByZXNlbnRzIGFzIEJhc2ljIGF1dGggdG9cbiAqIHBpcGVsaW5lLWltYWdlLXJlZ2lzdHJ5LiBEZWxpYmVyYXRlbHkgTk9UIGBwbGF0Zm9ybWA6IHRoYXQgc2VjcmV0IGhvbGRzXG4gKiB0aGUgb3JnJ3MgZnVsbC1wcml2aWxlZ2UgYXV0b21hdGlvbiBjcmVkZW50aWFsLCBhbmQgYSBidWlsZCBjb250YWluZXIgaGFzIG5vXG4gKiBidXNpbmVzcyBiZWluZyBhYmxlIHRvIGNhbGwgdGhlIEFQSSB3aXRoIGl0LlxuICogUHJvdmlzaW9uZWQgYnkgYHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW4gLS1zY29wZSByZWdpc3RyeTpwdXNoYC5cbiAqL1xuY29uc3QgUkVHSVNUUllfQ1JFREVOVElBTF9TRUNSRVQgPSAncmVnaXN0cnktcHVzaCc7XG5cbmZ1bmN0aW9uIHRvU2VjcmV0RW52VmFycyhcbiAgc2VjcmV0czogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHJlcXVpcmVkOiBib29sZWFuIH0+LFxuICBvcmdJZDogc3RyaW5nLFxuKTogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogc3RyaW5nOyB0eXBlOiBCdWlsZEVudmlyb25tZW50VmFyaWFibGVUeXBlIH0+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBzZWNyZXRzLm1hcCgoeyBuYW1lIH0pID0+IHtcbiAgICAgIGNvbnN0IHNlY3JldFBhdGggPSBDb3JlQ29uc3RhbnRzLnNlY3JldFBhdGgob3JnSWQsIG5hbWUpO1xuICAgICAgaWYgKCFWQUxJRF9TRUNSRVRfTkFNRS50ZXN0KHNlY3JldFBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2VjcmV0IHBhdGggXCIke3NlY3JldFBhdGh9XCIgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIGZvciBBV1MgU2VjcmV0cyBNYW5hZ2VyYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW1xuICAgICAgICBuYW1lLFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IHNlY3JldFBhdGgsXG4gICAgICAgICAgdHlwZTogQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlVHlwZS5TRUNSRVRTX01BTkFHRVIsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH0pLFxuICApO1xufVxuXG4vKipcbiAqIEluLWNsdXN0ZXIgLyBsb2NhbCByZWdpc3RyeSBob3N0bmFtZXMgdGhhdCBBV1MgQ29kZUJ1aWxkIChvdXQtb2YtY2x1c3RlcilcbiAqIGNhbm5vdCByZXNvbHZlLiBCYWtpbmcgb25lIG9mIHRoZXNlIGludG8gYSBDb2RlQnVpbGQgaW1hZ2UgVVJJIGd1YXJhbnRlZXMgYVxuICogYEJVSUxEX0NPTlRBSU5FUl9VTkFCTEVfVE9fUFVMTF9JTUFHRWAgZmFpbHVyZSBhdCBidWlsZCB0aW1lLCBzbyB3ZSBmYWlsIHRoZVxuICogc3ludGggZmFzdCBpbnN0ZWFkIOKAlCB3aXRoIGEgbWVzc2FnZSB0aGF0IHNheXMgaG93IHRvIGZpeCBpdC5cbiAqL1xuY29uc3QgVU5SRUFDSEFCTEVfUFVMTF9IT1NUUyA9IG5ldyBTZXQoWydyZWdpc3RyeScsICdsb2NhbGhvc3QnLCAnMTI3LjAuMC4xJywgJzo6MScsICcwLjAuMC4wJ10pO1xuXG4vKiogS3ViZXJuZXRlcyAvIG1ETlMgc3VmZml4ZXMgdGhhdCBvbmx5IHJlc29sdmUgaW5zaWRlIHRoZSBjbHVzdGVyL0xBTi4gKi9cbmNvbnN0IFVOUkVBQ0hBQkxFX0hPU1RfU1VGRklYRVMgPSBbJy5zdmMnLCAnLnN2Yy5jbHVzdGVyLmxvY2FsJywgJy5sb2NhbCddO1xuXG4vKipcbiAqIFJlZHVjZSBhIHJlZ2lzdHJ5IGhvc3QgdmFsdWUgdG8gaXRzIGJhcmUgaG9zdG5hbWUgZm9yIHRoZSByZWFjaGFiaWxpdHkgY2hlY2s6XG4gKiBzdHJpcCBJUHY2IGJyYWNrZXRzIGFuZCBhbnkgYDpwb3J0YCBzdWZmaXggKGFuIG9wZXJhdG9yIG1heSBwdXQgaG9zdCtwb3J0IGluXG4gKiBvbmUgZmllbGQpLCBzbyBgcmVnaXN0cnk6NTAwMGAgLyBgWzo6MV06NTAwMGAgYXJlIHN0aWxsIHJlY29nbml6ZWQuXG4gKi9cbmZ1bmN0aW9uIGJhcmVIb3N0bmFtZShyYXdIb3N0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgaCA9IHJhd0hvc3QudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChoLnN0YXJ0c1dpdGgoJ1snKSkge1xuICAgIGNvbnN0IGVuZCA9IGguaW5kZXhPZignXScpO1xuICAgIGlmIChlbmQgIT09IC0xKSByZXR1cm4gaC5zbGljZSgxLCBlbmQpOyAvLyBbOjoxXTo1MDAwIC0+IDo6MVxuICB9XG4gIC8vIFN0cmlwIGEgdHJhaWxpbmcgOnBvcnQgb25seSBmb3Igbm9uLUlQdjYgdmFsdWVzIChJUHY2IGNvbnRhaW5zICc6Oicgb3IgPjEgJzonKS5cbiAgaWYgKGguaW5jbHVkZXMoJzonKSAmJiAoaC5tYXRjaCgvOi9nKT8ubGVuZ3RoID8/IDApID09PSAxKSBoID0gaC5zcGxpdCgnOicpWzBdO1xuICByZXR1cm4gaDtcbn1cblxuLyoqIFRydWUgd2hlbiBDb2RlQnVpbGQgKG91dC1vZi1jbHVzdGVyKSBjb3VsZCBub3QgcmVzb2x2ZSB0aGlzIHJlZ2lzdHJ5IGhvc3QuICovXG5mdW5jdGlvbiBpc1VucmVhY2hhYmxlUHVsbEhvc3QocmF3SG9zdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGggPSBiYXJlSG9zdG5hbWUocmF3SG9zdCk7XG4gIGlmIChoID09PSAnJykgcmV0dXJuIHRydWU7IC8vIG5vIGhvc3Qg4oaSIG1hbGZvcm1lZCBVUklcbiAgaWYgKFVOUkVBQ0hBQkxFX1BVTExfSE9TVFMuaGFzKGgpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIFVOUkVBQ0hBQkxFX0hPU1RfU1VGRklYRVMuc29tZSgocykgPT4gaC5lbmRzV2l0aChzKSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZXh0ZXJuYWwgKG91dC1vZi1jbHVzdGVyKSByZWdpc3RyeSBwdWxsIGhvc3QgKyBgOnBvcnRgIHN1ZmZpeCBmb3JcbiAqIGEgQ29kZUJ1aWxkIGltYWdlIFVSSSwgYW5kIGZhaWwgZmFzdCBpZiBpdCByZXNvbHZlZCB0byBhbiBpbi1jbHVzdGVyL2xvY2FsXG4gKiBkZWZhdWx0IHRoYXQgQ29kZUJ1aWxkIGNhbid0IHJlYWNoLlxuICpcbiAqIFByZWZlcnMgYHB1bGxIb3N0YC9gcHVsbFBvcnRgICh0aGUgcHVibGljIGVuZHBvaW50IENvZGVCdWlsZCBjYW4gcmVzb2x2ZSkgYW5kXG4gKiBmYWxscyBiYWNrIHRvIGBob3N0YC9gcG9ydGAgZm9yIHNpbmdsZS1ob3N0IGRlcGxveXMuIHBpcGVsaW5lLW1hbmFnZXIgYmFrZXNcbiAqIHRoZSByaWdodCBwdWxsIGhvc3QgaW50byB0aGUgc3ludGggYXV0b21hdGljYWxseSBmcm9tIHRoZSBwbGF0Zm9ybSBVUkwgaXRcbiAqIGRlcGxveXMgYWdhaW5zdCAoYHByb3BzLnJlZ2lzdHJ5YCk7IHRoaXMgZ3VhcmQgY2F0Y2hlcyB0aGUgY2FzZSB3aGVyZSBuZWl0aGVyXG4gKiB0aGF0IG5vciBgSU1BR0VfUkVHSVNUUllfUFVMTF9IT1NUYC9gUExBVEZPUk1fQkFTRV9VUkxgIHdhcyBzdXBwbGllZC5cbiAqXG4gKiBFc2NhcGUgaGF0Y2g6IGBBTExPV19JTkNMVVNURVJfUFVMTF9IT1NUPXRydWVgIChlLmcuIENvZGVCdWlsZCBpbiBhIFZQQyB3aG9zZVxuICogcHJpdmF0ZSBETlMgZ2VudWluZWx5IHJlc29sdmVzIHRoZSBpbi1jbHVzdGVyIG5hbWUpLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRXh0ZXJuYWxQdWxsVGFyZ2V0KFxuICByZWdpc3RyeTogeyBob3N0Pzogc3RyaW5nOyBwb3J0PzogbnVtYmVyOyBwdWxsSG9zdD86IHN0cmluZzsgcHVsbFBvcnQ/OiBudW1iZXIgfSxcbik6IHsgaG9zdDogc3RyaW5nOyBwb3J0UGFydDogc3RyaW5nIH0ge1xuICBjb25zdCBob3N0ID0gcmVnaXN0cnkucHVsbEhvc3QgfHwgcmVnaXN0cnkuaG9zdCB8fCAnJztcbiAgY29uc3QgcG9ydCA9IHJlZ2lzdHJ5LnB1bGxQb3J0ID8/IHJlZ2lzdHJ5LnBvcnQ7XG4gIGlmIChwcm9jZXNzLmVudi5BTExPV19JTkNMVVNURVJfUFVMTF9IT1NUICE9PSAndHJ1ZScgJiYgaXNVbnJlYWNoYWJsZVB1bGxIb3N0KGhvc3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFJlZ2lzdHJ5IHB1bGwgaG9zdCByZXNvbHZlZCB0byAnJHtob3N0fScsIHdoaWNoIEFXUyBDb2RlQnVpbGQgY2Fubm90IHJlYWNoIOKAlCBpdCBpcyB0aGUgYCArXG4gICAgICAnaW4tY2x1c3Rlci9sb2NhbCBkZWZhdWx0LiBUaGUgc3ludGhlc2l6ZWQgcGlwZWxpbmUgd291bGQgZmFpbCBhdCBidWlsZCB0aW1lIHdpdGggJyArXG4gICAgICAnQlVJTERfQ09OVEFJTkVSX1VOQUJMRV9UT19QVUxMX0lNQUdFLiBTZXQgdGhlIHBsYXRmb3JtXFwncyBwdWJsaWMgaG9zdCB2aWEgJyArXG4gICAgICAnSU1BR0VfUkVHSVNUUllfUFVMTF9IT1NUIG9yIFBMQVRGT1JNX0JBU0VfVVJMIGJlZm9yZSBkZXBsb3lpbmcg4oCUIHBpcGVsaW5lLW1hbmFnZXIgYmFrZXMgJyArXG4gICAgICAndGhpcyBpbiBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIHBsYXRmb3JtIFVSTCBpdCBkZXBsb3lzIGFnYWluc3QuICcgK1xuICAgICAgJ1NldCBBTExPV19JTkNMVVNURVJfUFVMTF9IT1NUPXRydWUgdG8gYnlwYXNzIChpbi1WUEMgcHJpdmF0ZSBETlMpLicsXG4gICAgKTtcbiAgfVxuICBjb25zdCBwb3J0UGFydCA9IHBvcnQgJiYgcG9ydCAhPT0gODAgJiYgcG9ydCAhPT0gNDQzID8gYDoke3BvcnR9YCA6ICcnO1xuICByZXR1cm4geyBob3N0LCBwb3J0UGFydCB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIENvZGVCdWlsZCBpbWFnZSB0byB1c2UgZm9yIGEgcGx1Z2luLlxuICpcbiAqIFN0cmF0ZWd5OlxuICogICAxLiBJZiB0aGUgcGx1Z2luIHNldHMgYGF3czpjZGs6Y29kZWJ1aWxkOmJ1aWxkZW52aXJvbm1lbnQ6YnVpbGRJbWFnZWBcbiAqICAgICAgZXhwbGljaXRseSBpbiBtZXRhZGF0YSwgdGhlIG1ldGFkYXRhLWJ1aWxkZXIgcGFzc3Rocm91Z2ggaGFuZGxlcyBpdFxuICogICAgICAodmlhIGBtZXRhZGF0YUZvckJ1aWxkRW52aXJvbm1lbnRgKS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zXG4gKiAgICAgIGB1bmRlZmluZWRgIGFuZCB0aGUgbWV0YWRhdGEgd2lucy5cbiAqICAgMi4gT3RoZXJ3aXNlLCBpZiB0aGUgcGx1Z2luIGhhcyBhIGBuYW1lYCtgdmVyc2lvbmAgQU5EIHRoZSByZWdpc3RyeVxuICogICAgICBjb25maWcgaXMgcG9wdWxhdGVkLCBidWlsZCBhIGBMaW51eEJ1aWxkSW1hZ2UuZnJvbURvY2tlclJlZ2lzdHJ5KClgXG4gKiAgICAgIGltYWdlIHBvaW50aW5nIGF0IGA8cmVnaXN0cnktaG9zdD46PHBvcnQ+Lzxucz4vPG5hbWU+QDxpbWFnZURpZ2VzdD5gXG4gKiAgICAgIHdoZXJlIGA8bnM+YCBpcyBgc3lzdGVtYCBvciBgb3JnLTxvcmdJZD5gLiBQaW5uZWQgQlkgRElHRVNUIOKAlCB0aGUgb25lXG4gKiAgICAgIHRoZSBwbHVnaW4gc2VydmljZSB2ZXJpZmllZCBhZ2FpbnN0IGl0cyBzaWduaW5nIGtleSBiZWZvcmUgcmV0dXJuaW5nXG4gKiAgICAgIHRoaXMgcmVjb3JkIOKAlCBuZXZlciBieSB0aGUgbXV0YWJsZSBgOjx2ZXJzaW9uPmAgdGFnLCB3aGljaCBhbnlvbmVcbiAqICAgICAgaG9sZGluZyB0aGUgb3JnJ3MgcmVnaXN0cnkgcHVzaCBjcmVkZW50aWFsIGNvdWxkIHJlLXBvaW50LiBBIHBsdWdpblxuICogICAgICB0aGF0IG5lZWRzIGFuIGltYWdlIGJ1dCBjYXJyaWVzIG5vIGRpZ2VzdCBpcyByZWZ1c2VkICh0aHJvd3MpOiBydW5uaW5nXG4gKiAgICAgIGFuIHVudmVyaWZpZWQgaW1hZ2UgaXMgd29yc2UgdGhhbiBhIGZhaWxlZCBzeW50aC4gQ29kZUJ1aWxkIGF1dGhlbnRpY2F0ZXMgYnlcbiAqICAgICAgc2VuZGluZyB0aGUgcGVyLW9yZyBwbGF0Zm9ybSBTZWNyZXQgYXMgQmFzaWMgYXV0aCB0b1xuICogICAgICBgcGlwZWxpbmUtaW1hZ2UtcmVnaXN0cnlgJ3MgYC90b2tlbmAgZW5kcG9pbnQ7IHRoZSBKV1QgaW4gYHBhc3N3b3JkYFxuICogICAgICByZXNvbHZlcyB0byBhIHJlZ2lzdHJ5IHRva2VuIHNjb3BlZCB0byB0aGUgb3JnLlxuICogICAzLiBJZiBgbWV0YWRhdGFfb25seWAsIHJldHVybiBgdW5kZWZpbmVkYCBzbyBDb2RlQnVpbGQgdXNlcyBpdHMgZGVmYXVsdFxuICogICAgICAoYHN0YW5kYXJkOjcuMGApLlxuICpcbiAqIGBzY29wZWAgYW5kIGBvcmdJZGAgYXJlIHJlcXVpcmVkOiB0aGUgcGVyLW9yZyBwbGF0Zm9ybSBTZWNyZXQgaXMgbmFtZWRcbiAqIGBwaXBlbGluZS1idWlsZGVyLzxvcmdJZD4vcGxhdGZvcm1gLCBhbmQgYFNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKClgXG4gKiBuZWVkcyBhIENvbnN0cnVjdCB0byBhbmNob3IgdGhlIGltcG9ydGVkIHNlY3JldCB0by5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQbHVnaW5JbWFnZShzY29wZTogQ29uc3RydWN0IHwgdW5kZWZpbmVkLCBwbHVnaW46IFBsdWdpbiwgb3JnSWQ/OiBzdHJpbmcpOiBJQnVpbGRJbWFnZSB8IHVuZGVmaW5lZCB7XG4gIC8vIGBtZXRhZGF0YV9vbmx5YCBwbHVnaW5zIGxlZ2l0aW1hdGVseSBoYXZlIG5vIGltYWdlIOKAlCB0aGVpciB3b3JrIHJ1bnNcbiAgLy8gaW4gdGhlIGRlZmF1bHQgQ29kZUJ1aWxkIGltYWdlLiBRdWlldCBza2lwLlxuICBpZiAocGx1Z2luLmJ1aWxkVHlwZSA9PT0gJ21ldGFkYXRhX29ubHknKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIGJ1aWxkX2ltYWdlIC8gcHJlYnVpbHQgcGx1Z2lucyBtdXN0IGhhdmUgbmFtZSArIHZlcnNpb24gKERCIGNvbnN0cmFpbnRcbiAgLy8gbWFrZXMgYm90aCBOT1QgTlVMTCkuIERlZmVuc2l2ZSBjaGVjayBpbiBjYXNlIGEgbWFsZm9ybWVkIHJvdyBzbGlwcyBpbi5cbiAgaWYgKCFwbHVnaW4ubmFtZSB8fCAhcGx1Z2luLnZlcnNpb24pIHtcbiAgICBsb2cud2FybihcbiAgICAgIGBQbHVnaW4gXCIke3BsdWdpbi5uYW1lfVwiIGhhcyBidWlsZFR5cGU9JHtwbHVnaW4uYnVpbGRUeXBlfSBidXQgbWlzc2luZyBuYW1lL3ZlcnNpb24g4oCUIGAgK1xuICAgICAgJ0NvZGVCdWlsZCB3aWxsIHJ1biBvbiBhd3MvY29kZWJ1aWxkL3N0YW5kYXJkOjguMCBhbmQgd29uXFwndCBoYXZlIHRoZSBwbHVnaW5cXCdzIGJha2VkIHRvb2xzLicsXG4gICAgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gTm8gZGlnZXN0IOKHkiB0aGUgcGx1Z2luIHNlcnZpY2UgbmV2ZXIgc2lnbmVkIGFuIGltYWdlIGZvciB0aGlzIHJvdyAob3IgdGhlXG4gIC8vIHJlY29yZCBkaWRuJ3QgY29tZSBmcm9tIGAvcGx1Z2lucy9sb29rdXBgKS4gRmFpbCB0aGUgc3ludGggcmF0aGVyIHRoYW4gZmFsbFxuICAvLyBiYWNrIHRvIHRoZSB0YWcuXG4gIGlmICghcGx1Z2luLmltYWdlRGlnZXN0IHx8ICEvXnNoYTI1NjpbMC05YS1mXXs2NH0kLy50ZXN0KHBsdWdpbi5pbWFnZURpZ2VzdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgUGx1Z2luIFwiJHtwbHVnaW4ubmFtZX06JHtwbHVnaW4udmVyc2lvbn1cIiBoYXMgYnVpbGRUeXBlPSR7cGx1Z2luLmJ1aWxkVHlwZX0gYnV0IG5vIHNpZ25lZCBpbWFnZSBkaWdlc3QuIGAgK1xuICAgICAgJ1JlYnVpbGQgdGhlIHBsdWdpbiAocmUtdXBsb2FkIGl0KSBzbyB0aGUgcGxhdGZvcm0gY2FuIGJ1aWxkLCBzaWduIGFuZCByZWNvcmQgaXRzIGltYWdlLicsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSByZXBvc2l0b3J5IGNvbWVzIGZyb20gbG9va3VwOiBgcHVibGljLzxwdWJsaXNoZXI+LzxuYW1lPmAgZm9yIGFcbiAgLy8gbGlzdGVkIHBsdWdpbiAodGhlIHJlYWQtb25seSBjb3B5IGV2ZXJ5IG9yZyBtYXkgcHVsbCksIGBvcmctPGlkPi88bmFtZT5gXG4gIC8vIGZvciB0aGUgb3JnJ3Mgb3duLiBOZXZlciBkZXJpdmVkIGhlcmUgZnJvbSB0aGUgcmVjb3JkJ3Mgb3duZXIg4oCUIGEgbGlzdGluZydzXG4gIC8vIGltYWdlIGRvZXNuJ3QgbGl2ZSBpbiBpdHMgcHVibGlzaGVyJ3MgbmFtZXNwYWNlLlxuICBjb25zdCByZXBvc2l0b3J5ID0gKHBsdWdpbiBhcyBQbHVnaW4gJiB7IGltYWdlUmVwb3NpdG9yeT86IHN0cmluZyB8IG51bGwgfSkuaW1hZ2VSZXBvc2l0b3J5O1xuICBpZiAoIXJlcG9zaXRvcnkgfHwgIVBMVUdJTl9JTUFHRV9SRVBPU0lUT1JZX1JFLnRlc3QocmVwb3NpdG9yeSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgUGx1Z2luIFwiJHtwbHVnaW4ubmFtZX06JHtwbHVnaW4udmVyc2lvbn1cIiBoYXMgbm8gaW1hZ2UgcmVwb3NpdG9yeSBmcm9tIHRoZSBwbHVnaW4gbG9va3VwLiBgICtcbiAgICAgICdSZXNvbHZlIHBsdWdpbnMgdGhyb3VnaCB0aGUgcGxhdGZvcm0gKGBwaXBlbGluZS1tYW5hZ2VyIHBpcGVsaW5lIHN5bnRoYCAvIHRoZSBsb29rdXAgY3VzdG9tIHJlc291cmNlKS4nLFxuICAgICk7XG4gIH1cblxuICBsZXQgcmVnaXN0cnk7XG4gIHRyeSB7XG4gICAgcmVnaXN0cnkgPSBDb25maWcuZ2V0KCdyZWdpc3RyeScpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBDb25maWcgbmFtZXNwYWNlIG5vdCBsb2FkZWQgKGUuZy4sIHVuaXQgdGVzdHMgd2l0aG91dCBmdWxsIGNvbmZpZykuXG4gICAgbG9nLndhcm4oXG4gICAgICBgUGx1Z2luIFwiJHtwbHVnaW4ubmFtZX06JHtwbHVnaW4udmVyc2lvbn1cIiBuZWVkcyB0aGUgcmVnaXN0cnkgY29uZmlnIGJ1dCBpdCdzIG5vdCBsb2FkZWQg4oCUIGAgK1xuICAgICAgJ0NvZGVCdWlsZCB3aWxsIGZhbGwgYmFjayB0byBhd3MvY29kZWJ1aWxkL3N0YW5kYXJkOjguMC4gJyArXG4gICAgICAnU2V0IElNQUdFX1JFR0lTVFJZX0hPU1QgKyBJTUFHRV9SRUdJU1RSWV9QT1JUIGluIHBpcGVsaW5lLW1hbmFnZXJcXCdzIGVudmlyb25tZW50LicsXG4gICAgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFyZWdpc3RyeT8uaG9zdCkge1xuICAgIGxvZy53YXJuKFxuICAgICAgYFBsdWdpbiBcIiR7cGx1Z2luLm5hbWV9OiR7cGx1Z2luLnZlcnNpb259XCIgbmVlZHMgSU1BR0VfUkVHSVNUUllfSE9TVCBidXQgaXQncyBlbXB0eSDigJQgYCArXG4gICAgICAnQ29kZUJ1aWxkIHdpbGwgZmFsbCBiYWNrIHRvIGF3cy9jb2RlYnVpbGQvc3RhbmRhcmQ6OC4wLiAnICtcbiAgICAgICdTZXQgSU1BR0VfUkVHSVNUUllfSE9TVCBpbiBwaXBlbGluZS1tYW5hZ2VyXFwncyBlbnZpcm9ubWVudCB0byB1c2UgdGhlIHBsdWdpbiBpbWFnZS4nLFxuICAgICk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoIXNjb3BlKSB7XG4gICAgbG9nLndhcm4oYFBsdWdpbiBcIiR7cGx1Z2luLm5hbWV9XCIgaW1hZ2UgcmVzb2x1dGlvbiBza2lwcGVkOiBubyBjb25zdHJ1Y3Qgc2NvcGUgcHJvdmlkZWRgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gUGVyLW9yZyBhdXRoIHJlcXVpcmVzIG9yZ0lkIOKAlCB0aGUgU2VjcmV0IGlzIG5hbWVkIHBlciBvcmcuXG4gIGlmICghb3JnSWQpIHtcbiAgICBsb2cud2FybihcbiAgICAgIGBQbHVnaW4gXCIke3BsdWdpbi5uYW1lfVwiIGltYWdlIHJlc29sdXRpb24gc2tpcHBlZDogb3JnSWQgaXMgcmVxdWlyZWQgdG8gYCArXG4gICAgICAncmVzb2x2ZSB0aGUgcGVyLW9yZyBwbGF0Zm9ybSBTZWNyZXQgdXNlZCBmb3IgQ29kZUJ1aWxkIEJhc2ljIGF1dGguJyxcbiAgICApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBDb21wb3NlIHRoZSBpbWFnZSBVUkkgZnJvbSB0aGUgbG9va3VwJ3MgcmVwb3NpdG9yeSwgcGlubmVkIGJ5IGRpZ2VzdC5cbiAgLy8gVGhlIHRva2VuIHNlcnZpY2UgZ3JhbnRzIHB1bGwgb24gYHB1YmxpYy8qYCB0byBldmVyeSBhdXRoZW50aWNhdGVkXG4gIC8vIGlkZW50aXR5IGFuZCBvbiBgb3JnLTxpZD4vKmAgdG8gdGhhdCBvcmcgKGFuZCBpdHMgdGVhbXMpLlxuICAvLyBVc2UgdGhlIGV4dGVybmFsIHB1bGwgaG9zdC9wb3J0OiB0aGlzIGltYWdlIFVSSSBpcyBjb25zdW1lZCBieSBBV1NcbiAgLy8gQ29kZUJ1aWxkIChvdXQtb2YtY2x1c3RlciksIHdoaWNoIGNhbid0IHJlc29sdmUgdGhlIGluLWNsdXN0ZXJcbiAgLy8gYHJlZ2lzdHJ5OjUwMDBgIENsdXN0ZXJJUC4gRmFsbCBiYWNrIHRvIGBob3N0YC9gcG9ydGAgZm9yIHNpbmdsZS1ob3N0IC9cbiAgLy8gaW4tY2x1c3Rlci1vbmx5IGRlcGxveXMgd2hlcmUgbm8gc2VwYXJhdGUgcHVsbCBob3N0IGlzIGNvbmZpZ3VyZWQuXG4gIGNvbnN0IHsgaG9zdDogcHVsbEhvc3QsIHBvcnRQYXJ0IH0gPSByZXNvbHZlRXh0ZXJuYWxQdWxsVGFyZ2V0KHJlZ2lzdHJ5KTtcbiAgY29uc3QgaW1hZ2VVcmkgPSBgJHtwdWxsSG9zdH0ke3BvcnRQYXJ0fS8ke3JlcG9zaXRvcnl9QCR7cGx1Z2luLmltYWdlRGlnZXN0fWA7XG5cbiAgLy8gQ29kZUJ1aWxkIHJlYWRzIGBwaXBlbGluZS1idWlsZGVyLzxvcmdJZD4vcmVnaXN0cnktcHVzaGAgYW5kIHNlbmRzIGl0c1xuICAvLyBgdXNlcm5hbWVgL2BwYXNzd29yZGAgZmllbGRzIGFzIEhUVFAgQmFzaWMgdG8gdGhlIHJlZ2lzdHJ5LiBUaGUgcmVnaXN0cnlcbiAgLy8gY2hhbGxlbmdlcyB3aXRoIGEgQmVhcmVyIHJlYWxtIHBvaW50aW5nIGF0IHBpcGVsaW5lLWltYWdlLXJlZ2lzdHJ5J3NcbiAgLy8gYC90b2tlbmAgZW5kcG9pbnQ7IHRoZSBEb2NrZXIgY2xpZW50IGZvcndhcmRzIHRob3NlIGNyZWRzLCBpbWFnZS1yZWdpc3RyeVxuICAvLyBleGNoYW5nZXMgdGhlIG9wYXF1ZSBgcGJfc2Ff4oCmYCBrZXkgZm9yIGEgc2hvcnQtbGl2ZWQgdG9rZW4sIGFuZCBhIHJlZ2lzdHJ5XG4gIC8vIHRva2VuIHNjb3BlZCB0byB0aGUgb3JnIGlzIGlzc3VlZC5cbiAgLy9cbiAgLy8gVGhpcyBpcyB0aGUgUkVHSVNUUlktT05MWSBjcmVkZW50aWFsLCBub3QgdGhlIG9yZydzIGZ1bGwtcHJpdmlsZWdlXG4gIC8vIHBsYXRmb3JtIG9uZTogaXRzIGV4Y2hhbmdlZCB0b2tlbiBjYXJyaWVzIHRoZSBzaW5nbGUgYHJlZ2lzdHJ5OnB1c2hgIHNjb3BlXG4gIC8vIGFuZCBubyBBUEkgcGVybWlzc2lvbnMgYXQgYWxsLCBzbyBhIENvZGVCdWlsZCBqb2IgdGhhdCBsZWFrcyBpdCBjYW4gbW92ZVxuICAvLyBpbWFnZXMgaW5zaWRlIHRoaXMgb3JnJ3MgbmFtZXNwYWNlIGFuZCBub3RoaW5nIGVsc2UuIFRoZSBwbHVnaW4tbG9va3VwXG4gIC8vIExhbWJkYSBrZWVwcyByZWFkaW5nIGAuLi4vcGxhdGZvcm1gIOKAlCBpdCBjYWxscyB0aGUgb3JkaW5hcnkgQVBJLCB3aGljaCBub1xuICAvLyBzaW5nbGUgc2NvcGUgY292ZXJzLlxuICAvLyBQcm92aXNpb24gaXQgd2l0aDogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXNjb3BlIHJlZ2lzdHJ5OnB1c2hcbiAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZihzY29wZSk7XG4gIGNvbnN0IHNlY3JldE5hbWUgPSBDb3JlQ29uc3RhbnRzLnNlY3JldFBhdGgob3JnSWQsIFJFR0lTVFJZX0NSRURFTlRJQUxfU0VDUkVUKTtcbiAgLy8gQ0RLIGNvbnN0cnVjdCBJRHMgYWxsb3cgb25seSBbQS1aYS16MC05Xy1dOyBzYW5pdGl6ZSB0aGUgc2VjcmV0IG5hbWUuXG4gIGNvbnN0IHNlY3JldENvbnN0cnVjdElkID0gYFJlZ2lzdHJ5Q3JlZHNfJHtzZWNyZXROYW1lLnJlcGxhY2UoL1teQS1aYS16MC05Xy1dL2csICdfJyl9YDtcbiAgY29uc3QgY3JlZGVudGlhbHNTZWNyZXQgPSAoc3RhY2subm9kZS50cnlGaW5kQ2hpbGQoc2VjcmV0Q29uc3RydWN0SWQpIGFzIFNlY3JldCB8IHVuZGVmaW5lZClcbiAgICA/PyBTZWNyZXQuZnJvbVNlY3JldE5hbWVWMihzdGFjaywgc2VjcmV0Q29uc3RydWN0SWQsIHNlY3JldE5hbWUpO1xuXG4gIHJldHVybiBMaW51eEJ1aWxkSW1hZ2UuZnJvbURvY2tlclJlZ2lzdHJ5KGltYWdlVXJpLCB7XG4gICAgc2VjcmV0c01hbmFnZXJDcmVkZW50aWFsczogY3JlZGVudGlhbHNTZWNyZXQsXG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGZhbGxiYWNrIENvZGVCdWlsZCBpbWFnZSBmb3Igc3RlcHMgd2l0aG91dCBhIHBsdWdpbi1iYWtlZCBvbmUuXG4gKlxuICogUmVhZHMgYGF3cy5jb2RlQnVpbGQuZGVmYXVsdEltYWdlYCAoZW52OiBgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0VgKS5cbiAqIERlZmF1bHQ6IGBwaXBlbGluZS1ib290c3RyYXA6MS4wYCDigJQgdGhlIGxvY2FsIHRhZyBidWlsdCBieVxuICogYGRlcGxveS9jb2RlYnVpbGQvYm9vdHN0cmFwL0RvY2tlcmZpbGVgLlxuICpcbiAqIC0gQVdTIGN1cmF0ZWQgaW1hZ2UgKGBhd3MvY29kZWJ1aWxkLypgKTogdXNlIHRoZSBtYXRjaGluZyBgTGludXhCdWlsZEltYWdlYFxuICogICBjb25zdGFudCBzbyBDREsgZW1pdHMgYGltYWdlUHVsbENyZWRlbnRpYWxzVHlwZTogQ09ERUJVSUxEYC4gVXNpbmdcbiAqICAgYGZyb21Eb2NrZXJSZWdpc3RyeSgpYCBoZXJlIHdvdWxkIHNldCBTRVJWSUNFX1JPTEUgY3JlZGVudGlhbHMsIHdoaWNoXG4gKiAgIENGTiByZWplY3RzIHdpdGggXCJjYW5ub3QgdXNlIGEgQ29kZUJ1aWxkIGN1cmF0ZWQgaW1hZ2Ugd2l0aFxuICogICBpbWFnZVB1bGxDcmVkZW50aWFsc1R5cGUgU0VSVklDRV9ST0xFXCIuXG4gKiAtIEJhcmUgdGFnIChubyBgL2ApOiBhdXRvLXByZWZpeGVkIHRvXG4gKiAgIGA8cmVnaXN0cnktaG9zdD46PHBvcnQ+L2xpYnJhcnkvPHRhZz5gIHVzaW5nIHRoZSByZWdpc3RyeSBjb25maWcsXG4gKiAgIHdpdGggdGhlIHBlci1vcmcgcGxhdGZvcm0gU2VjcmV0IGFzIEJhc2ljIGF1dGgg4oCUIHNhbWUgcGF0aFxuICogICBgcmVzb2x2ZVBsdWdpbkltYWdlKClgIHVzZXMgZm9yIHBsdWdpbiBpbWFnZXMuIE5lZWRzIGBzY29wZWAgKyBgb3JnSWRgLlxuICogLSBGdWxseS1xdWFsaWZpZWQgcmVnaXN0cnkgVVJJIChjb250YWlucyBgL2ApOiB1c2VkIGFzLWlzLCBubyBhdXRoIHdpcmVkLlxuICogLSBNaXNzaW5nIHJlZ2lzdHJ5IGNvbmZpZyBvciBzY29wZS9vcmdJZCDihpIgZmFsbHMgYmFjayB0b1xuICogICBgYXdzL2NvZGVidWlsZC9zdGFuZGFyZDo4LjBgIChhcyBhIENVUkFURUQgaW1hZ2UsIHNlZSBhYm92ZSksIHdpdGggYVxuICogICB3YXJuaW5nIHNvIHN5bnRoIGRlZ3JhZGVzIGdyYWNlZnVsbHkgb24gcGFydGlhbGx5IGNvbmZpZ3VyZWQgZW52cy5cbiAqL1xuY29uc3QgU1RBTkRBUkRfOF8wID0gJ2F3cy9jb2RlYnVpbGQvc3RhbmRhcmQ6OC4wJztcblxuLyoqXG4gKiBhd3MtY2RrLWxpYiAyLjI1OCBoYXMgbm8gYExpbnV4QnVpbGRJbWFnZS5TVEFOREFSRF84XzBgIHN0YXRpYyB5ZXQsIHNvIHRoZVxuICogY3VyYXRlZCA4LjAgZmFsbGJhY2sgcmVzb2x2ZXMgdmlhIGBmcm9tQ29kZUJ1aWxkSW1hZ2VJZGAgKHN0aWxsIENPREVCVUlMRCBjcmVkcykuXG4gKi9cbmNvbnN0IGZhbGxiYWNrQnVpbGRJbWFnZSA9ICgpOiBJQnVpbGRJbWFnZSA9PiBMaW51eEJ1aWxkSW1hZ2UuZnJvbUNvZGVCdWlsZEltYWdlSWQoU1RBTkRBUkRfOF8wKTtcblxuLyoqXG4gKiBNYXAgQVdTIGN1cmF0ZWQgYGF3cy9jb2RlYnVpbGQvKmAgaW1hZ2Ugc3RyaW5ncyB0byB0aGUgbWF0Y2hpbmdcbiAqIGBMaW51eEJ1aWxkSW1hZ2VgIHN0YXRpYy4gRXh0ZW5kIHdoZW4gbmV3ZXIgc3RhbmRhcmQgaW1hZ2VzIHNoaXAuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBub24tY3VyYXRlZCBzdHJpbmdzIOKAlCBjYWxsZXIgc2hvdWxkIHVzZVxuICogYGZyb21Eb2NrZXJSZWdpc3RyeSgpYCBmb3IgdGhvc2UuXG4gKi9cbmZ1bmN0aW9uIGN1cmF0ZWRMaW51eEJ1aWxkSW1hZ2UoaW1hZ2VJZDogc3RyaW5nKTogSUJ1aWxkSW1hZ2UgfCB1bmRlZmluZWQge1xuICBpZiAoIWltYWdlSWQuc3RhcnRzV2l0aCgnYXdzL2NvZGVidWlsZC8nKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgc3dpdGNoIChpbWFnZUlkKSB7XG4gICAgY2FzZSAnYXdzL2NvZGVidWlsZC9zdGFuZGFyZDo2LjAnOiByZXR1cm4gTGludXhCdWlsZEltYWdlLlNUQU5EQVJEXzZfMDtcbiAgICBjYXNlICdhd3MvY29kZWJ1aWxkL3N0YW5kYXJkOjUuMCc6IHJldHVybiBMaW51eEJ1aWxkSW1hZ2UuU1RBTkRBUkRfNV8wO1xuICAgIC8vIE5ld2VyIGNvZGVuYW1lZCBpbWFnZXMgcm91dGUgdGhyb3VnaCBmcm9tQ29kZUJ1aWxkSW1hZ2VJZCwgd2hpY2hcbiAgICAvLyBDREsgYWxzbyBtYXJrcyBhcyBDT0RFQlVJTEQgY3JlZGVudGlhbHMgKGN1cmF0ZWQpLlxuICAgIGRlZmF1bHQ6IHJldHVybiBMaW51eEJ1aWxkSW1hZ2UuZnJvbUNvZGVCdWlsZEltYWdlSWQoaW1hZ2VJZCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEZWZhdWx0QnVpbGRJbWFnZShzY29wZT86IENvbnN0cnVjdCwgb3JnSWQ/OiBzdHJpbmcpOiBJQnVpbGRJbWFnZSB7XG4gIGxldCBjb25maWd1cmVkOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY29uZmlndXJlZCA9IENvbmZpZy5nZXQoJ2F3cycpLmNvZGVCdWlsZC5kZWZhdWx0SW1hZ2U7XG4gIH0gY2F0Y2gge1xuICAgIGNvbmZpZ3VyZWQgPSBTVEFOREFSRF84XzA7XG4gIH1cblxuICAvLyBBV1MgY3VyYXRlZCBpbWFnZSDihpIgQ09ERUJVSUxEIGNyZWRlbnRpYWxzLiBNVVNUIGdvIHRocm91Z2ggdGhlXG4gIC8vIExpbnV4QnVpbGRJbWFnZSBjb25zdGFudHMsIG5vdCBmcm9tRG9ja2VyUmVnaXN0cnkoKS5cbiAgY29uc3QgY3VyYXRlZCA9IGN1cmF0ZWRMaW51eEJ1aWxkSW1hZ2UoY29uZmlndXJlZCk7XG4gIGlmIChjdXJhdGVkKSByZXR1cm4gY3VyYXRlZDtcblxuICAvLyBGdWxseS1xdWFsaWZpZWQgVVJJIOKAlCBvcGVyYXRvciBvd25zIGl0LiBObyByZWdpc3RyeS9TZWNyZXQgd2lyaW5nLlxuICBpZiAoY29uZmlndXJlZC5pbmNsdWRlcygnLycpKSB7XG4gICAgcmV0dXJuIExpbnV4QnVpbGRJbWFnZS5mcm9tRG9ja2VyUmVnaXN0cnkoY29uZmlndXJlZCk7XG4gIH1cblxuICAvLyBCYXJlIHRhZyDihpIgYXV0by1wcmVmaXggd2l0aCB0aGUgcGxhdGZvcm0gcmVnaXN0cnksIG1pcnJvcmluZ1xuICAvLyByZXNvbHZlUGx1Z2luSW1hZ2UoKS4gQmFpbCB0byB0aGUgY3VyYXRlZCBzdGFuZGFyZDo4LjAgZmFsbGJhY2tcbiAgLy8gKHdpdGggYSB3YXJuaW5nKSBhdCBlYWNoIG1pc3NpbmcgcHJlcmVxdWlzaXRlIHNvIHN5bnRoIGRlZ3JhZGVzXG4gIC8vIGdyYWNlZnVsbHkgb24gcGFydGlhbGx5IGNvbmZpZ3VyZWQgZW52aXJvbm1lbnRzIGluc3RlYWQgb2YgZmFpbGluZy5cbiAgbGV0IHJlZ2lzdHJ5O1xuICB0cnkge1xuICAgIHJlZ2lzdHJ5ID0gQ29uZmlnLmdldCgncmVnaXN0cnknKTtcbiAgfSBjYXRjaCB7XG4gICAgbG9nLndhcm4oXG4gICAgICBgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0U9JyR7Y29uZmlndXJlZH0nIGlzIGEgYmFyZSB0YWcgYnV0IHJlZ2lzdHJ5IGNvbmZpZyBub3QgbG9hZGVkIOKAlCBgICtcbiAgICAgIGBmYWxsaW5nIGJhY2sgdG8gJHtTVEFOREFSRF84XzB9LiBTZXQgSU1BR0VfUkVHSVNUUllfSE9TVCArIElNQUdFX1JFR0lTVFJZX1BPUlQuYCxcbiAgICApO1xuICAgIHJldHVybiBmYWxsYmFja0J1aWxkSW1hZ2UoKTtcbiAgfVxuICBpZiAoIXJlZ2lzdHJ5Py5ob3N0KSB7XG4gICAgbG9nLndhcm4oXG4gICAgICBgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0U9JyR7Y29uZmlndXJlZH0nIGlzIGEgYmFyZSB0YWcgYnV0IElNQUdFX1JFR0lTVFJZX0hPU1QgaXMgZW1wdHkg4oCUIGAgK1xuICAgICAgYGZhbGxpbmcgYmFjayB0byAke1NUQU5EQVJEXzhfMH0uYCxcbiAgICApO1xuICAgIHJldHVybiBmYWxsYmFja0J1aWxkSW1hZ2UoKTtcbiAgfVxuICBpZiAoIXNjb3BlIHx8ICFvcmdJZCkge1xuICAgIGxvZy53YXJuKFxuICAgICAgYENPREVCVUlMRF9ERUZBVUxUX0lNQUdFPScke2NvbmZpZ3VyZWR9JyBuZWVkcyBzY29wZStvcmdJZCBmb3IgU2VjcmV0IGF1dGgg4oCUIGAgK1xuICAgICAgYGZhbGxpbmcgYmFjayB0byAke1NUQU5EQVJEXzhfMH0uIChDYWxsZXIgZGlkIG5vdCBzdXBwbHkgdGhlbS4pYCxcbiAgICApO1xuICAgIHJldHVybiBmYWxsYmFja0J1aWxkSW1hZ2UoKTtcbiAgfVxuXG4gIC8vIFVzZSB0aGUgZXh0ZXJuYWwgcHVsbCBob3N0L3BvcnQgKG5vdCB0aGUgaW4tY2x1c3RlciBob3N0KSDigJQgdGhpcyBVUkkgaXNcbiAgLy8gY29uc3VtZWQgYnkgQVdTIENvZGVCdWlsZCwgd2hpY2ggY2FuJ3QgcmVzb2x2ZSB0aGUgYHJlZ2lzdHJ5OjUwMDBgIENsdXN0ZXJJUC5cbiAgY29uc3QgeyBob3N0OiBwdWxsSG9zdCwgcG9ydFBhcnQgfSA9IHJlc29sdmVFeHRlcm5hbFB1bGxUYXJnZXQocmVnaXN0cnkpO1xuICBjb25zdCBpbWFnZVVyaSA9IGAke3B1bGxIb3N0fSR7cG9ydFBhcnR9L2xpYnJhcnkvJHtjb25maWd1cmVkfWA7XG5cbiAgLy8gU2FtZSBTZWNyZXQgYXMgcmVzb2x2ZVBsdWdpbkltYWdlIOKAlCB0aGUgcGVyLW9yZyBSRUdJU1RSWSBjcmVkZW50aWFsLCB3aGljaFxuICAvLyBDb2RlQnVpbGQgc2VuZHMgYXMgQmFzaWMgYXV0aCBhbmQgaW1hZ2UtcmVnaXN0cnkgZXhjaGFuZ2VzIGZvciBhIHNjb3BlZCB0b2tlbi5cbiAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZihzY29wZSk7XG4gIGNvbnN0IHNlY3JldE5hbWUgPSBDb3JlQ29uc3RhbnRzLnNlY3JldFBhdGgob3JnSWQsIFJFR0lTVFJZX0NSRURFTlRJQUxfU0VDUkVUKTtcbiAgY29uc3Qgc2VjcmV0Q29uc3RydWN0SWQgPSBgUmVnaXN0cnlDcmVkc18ke3NlY3JldE5hbWUucmVwbGFjZSgvW15BLVphLXowLTlfLV0vZywgJ18nKX1gO1xuICBjb25zdCBjcmVkZW50aWFsc1NlY3JldCA9IChzdGFjay5ub2RlLnRyeUZpbmRDaGlsZChzZWNyZXRDb25zdHJ1Y3RJZCkgYXMgU2VjcmV0IHwgdW5kZWZpbmVkKVxuICAgID8/IFNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKHN0YWNrLCBzZWNyZXRDb25zdHJ1Y3RJZCwgc2VjcmV0TmFtZSk7XG5cbiAgcmV0dXJuIExpbnV4QnVpbGRJbWFnZS5mcm9tRG9ja2VyUmVnaXN0cnkoaW1hZ2VVcmksIHtcbiAgICBzZWNyZXRzTWFuYWdlckNyZWRlbnRpYWxzOiBjcmVkZW50aWFsc1NlY3JldCxcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgQ29kZUJ1aWxkIHN0ZXAgb3IgU2hlbGwgc3RlcCBiYXNlZCBvbiBwbHVnaW4gY29uZmlndXJhdGlvbi5cbiAqXG4gKiBNZXRhZGF0YSBtZXJnZSBvcmRlciAobGFzdCB3aW5zKTpcbiAqICAgMS4gUGx1Z2luIG1ldGFkYXRhIChmcm9tIHBsdWdpbi5tZXRhZGF0YSBpbiBkYXRhYmFzZSkg4oCUIHRoZSBwbHVnaW5cbiAqICAgICAgYXV0aG9yJ3MgYmFrZWQtaW4gZGVmYXVsdHNcbiAqICAgMi4gU3RlcC1sZXZlbCBtZXRhZGF0YSAoZnJvbSBvcHRpb25zLm1ldGFkYXRhKSDigJQgdGhlIHBpcGVsaW5lIGF1dGhvcidzXG4gKiAgICAgIHBlci1zdGVwIG92ZXJyaWRlcywgd2hpY2ggYXJlIG1vcmUgc3BlY2lmaWMgYW5kIG11c3Qgd2luXG4gKlxuICogRW52aXJvbm1lbnQgbWVyZ2Ugb3JkZXIgKGxhc3Qgd2lucyk6XG4gKiAgIDEuIFBsdWdpbiBlbnYgdmFycyAoZnJvbSBwbHVnaW4uZW52KVxuICogICAyLiBDdXN0b20gZW52IHZhcnMgKGZyb20gb3B0aW9ucy5lbnYpXG4gKiAgIDMuIFdPUktESVIgZnJvbSBtZXJnZWQgbWV0YWRhdGFcbiAqXG4gKiBDREsgcHJvcCBzcHJlYWQgb3JkZXIgKGxhc3Qgd2lucyk6XG4gKiAgIHByb2dyYW1tYXRpYyBkZWZhdWx0cyAoaW5wdXQsIGNvbW1hbmRzLCBlbnYsIG5ldHdvcmspIOKGkiBtZXRhZGF0YSBvdmVycmlkZXNcbiAqXG4gKiBUaGlzIG1lYW5zIG1ldGFkYXRhIGtleXMgbGlrZSBgYXdzOmNkazpwaXBlbGluZXM6Y29kZWJ1aWxkc3RlcDpjb21tYW5kc2BcbiAqIHdpbGwgb3ZlcnJpZGUgdGhlIHBsdWdpbi1kZXJpdmVkIGNvbW1hbmRzIHdoZW4gZXhwbGljaXRseSBzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb2RlQnVpbGRTdGVwKG9wdGlvbnM6IENvZGVCdWlsZFN0ZXBPcHRpb25zKTogU2hlbGxTdGVwIHwgQ29kZUJ1aWxkU3RlcCB8IE1hbnVhbEFwcHJvdmFsU3RlcCB7XG4gIGNvbnN0IHtcbiAgICBpZCwgaW5wdXQsIG1ldGFkYXRhLCBuZXR3b3JrLCBzY29wZSxcbiAgICBwcmVJbnN0YWxsQ29tbWFuZHMsIHBvc3RJbnN0YWxsQ29tbWFuZHMsIHByZUNvbW1hbmRzLCBwb3N0Q29tbWFuZHMsXG4gICAgZW52OiBjdXN0b21FbnYsIGFkZGl0aW9uYWxJbnB1dHMsIHRpbWVvdXQsIGZhaWx1cmVCZWhhdmlvcixcbiAgICBhcnRpZmFjdE1hbmFnZXIsIHN0YWdlTmFtZSwgc3RhZ2VBbGlhcywgcGx1Z2luQWxpYXMsIG9yZ0lkLCBwaXBlbGluZVNjb3BlLFxuICB9ID0gb3B0aW9ucztcblxuICAvLyBSZXNvbHZlIHt7IC4uLiB9fSB0ZW1wbGF0ZXMgaW4gcGx1Z2luIHNwZWMgZmllbGRzIGFnYWluc3QgdGhlIHBpcGVsaW5lIHNjb3BlLlxuICAvLyBFdmVyeSBjYWxsIGdvZXMgdGhyb3VnaCB0aGUgcmVzb2x2ZXIg4oCUIHBsdWdpbnMgd2l0aG91dCB0ZW1wbGF0ZSB0b2tlbnMgYXJlXG4gIC8vIGEgbm8tb3AgZmFzdCBwYXRoIGluc2lkZSByZXNvbHZlUGx1Z2luVGVtcGxhdGVzKCkuXG4gIGNvbnN0IHBsdWdpbiA9IHJlc29sdmVQbHVnaW5UZW1wbGF0ZXMob3B0aW9ucy5wbHVnaW4sIHBpcGVsaW5lU2NvcGUpO1xuXG4gIC8vIFBlci1zdGVwIG1ldGFkYXRhICh0aGUgcGlwZWxpbmUgYXV0aG9yJ3Mgb3ZlcnJpZGVzLCBlLmcuIEpBVkFfVkVSU0lPTj0yNSlcbiAgLy8gbXVzdCB3aW4gb3ZlciB0aGUgcGx1Z2luJ3MgY2F0YWxvZyBgbWV0YWRhdGFgIGRlZmF1bHRzLCBzbyBpdCBnb2VzIExBU1QuXG4gIC8vIFJldmVyc2luZyB0aGVzZSBzaWxlbnRseSBkcm9wcGVkIHBlci1zdGVwIG92ZXJyaWRlcyBmb3IgYW55IHBsdWdpbiB0aGF0XG4gIC8vIHNoaXBzIG5vbi1lbXB0eSBjYXRhbG9nIG1ldGFkYXRhIChwbHVnaW5zIHRoYXQgY2FycnkgZGVmYXVsdHMgdW5kZXIgYGVudmBcbiAgLy8gaW5zdGVhZCDigJQgbGlrZSBqYXZhLWNvcnJldHRvIOKAlCB3ZXJlIHVuYWZmZWN0ZWQsIHdoaWNoIG1hc2tlZCB0aGlzKS5cbiAgY29uc3QgbWVyZ2VkID0gbWVyZ2UocGx1Z2luLm1ldGFkYXRhID8/IHt9LCBtZXRhZGF0YSA/PyB7fSk7XG5cbiAgLy8gTWFudWFsQXBwcm92YWxTdGVwOiBubyBjb21tYW5kcywgZW52LCBjb21wdXRlLCBvciBuZXR3b3JrIOKAlCBqdXN0IGlkICsgb3B0aW9uYWwgY29tbWVudFxuICBpZiAocGx1Z2luLnBsdWdpblR5cGUgPT09IFBsdWdpblR5cGUuTUFOVUFMX0FQUFJPVkFMX1NURVApIHtcbiAgICByZXR1cm4gbmV3IE1hbnVhbEFwcHJvdmFsU3RlcChpZCwge1xuICAgICAgY29tbWVudDogdHlwZW9mIG1lcmdlZC5BUFBST1ZBTF9DT01NRU5UID09PSAnc3RyaW5nJyA/IG1lcmdlZC5BUFBST1ZBTF9DT01NRU5UIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9XG5cbiAgbG9nLmRlYnVnKCdbQ3JlYXRlQ29kZUJ1aWxkU3RlcF0gQnVpbGRpbmcgc3RlcCB3aXRoIG1lcmdlZCBtZXRhZGF0YScpO1xuXG4gIC8vIFdhcm4gYWJvdXQgcmVxdWlyZWQgc2VjcmV0cyB3aXRob3V0IG9yZ0lkIChjYW4ndCByZXNvbHZlKVxuICBjb25zdCByZXF1aXJlZFNlY3JldHMgPSBwbHVnaW4uc2VjcmV0cz8uZmlsdGVyKHMgPT4gcy5yZXF1aXJlZCkgPz8gW107XG4gIGlmIChyZXF1aXJlZFNlY3JldHMubGVuZ3RoID4gMCAmJiAhb3JnSWQpIHtcbiAgICBsb2cud2FybihcbiAgICAgIGBQbHVnaW4gXCIke3BsdWdpbi5uYW1lfVwiIGRlY2xhcmVzICR7cmVxdWlyZWRTZWNyZXRzLmxlbmd0aH0gcmVxdWlyZWQgc2VjcmV0KHMpIGJ1dCBubyBvcmdJZCBpcyBhdmFpbGFibGUuIGAgK1xuICAgICAgYFNlY3JldHMgd2lsbCBub3QgYmUgaW5qZWN0ZWQ6ICR7cmVxdWlyZWRTZWNyZXRzLm1hcChzID0+IHMubmFtZSkuam9pbignLCAnKX1gLFxuICAgICk7XG4gIH1cblxuICAvLyBSZXNvbHZlIHBsdWdpbiBzZWNyZXRzIGFzIFNFQ1JFVFNfTUFOQUdFUiBlbnYgdmFycyDigJQgb25seSBSRVFVSVJFRCBvbmVzLlxuICAvLyBDb2RlQnVpbGQgdHJlYXRzIGEgU0VDUkVUU19NQU5BR0VSIGVudiB2YXIgYXMgTUFOREFUT1JZOiBpdCBmYWlscyB0aGUgYnVpbGRcbiAgLy8gYXQgRE9XTkxPQURfU09VUkNFIChcIlJlc291cmNlTm90Rm91bmRFeGNlcHRpb246IGNhbid0IGZpbmQgdGhlIHNwZWNpZmllZFxuICAvLyBzZWNyZXRcIikgaWYgdGhlIHNlY3JldCBpcyBhYnNlbnQuIEF1dG8td2lyaW5nIGFuIE9QVElPTkFMIHNlY3JldFxuICAvLyAoYHJlcXVpcmVkOiBmYWxzZWAsIGUuZy4gTlZEX0FQSV9LRVkgLyBTRU1HUkVQX0FQUF9UT0tFTikgdGhlIG9wZXJhdG9yIGhhc24ndFxuICAvLyBjcmVhdGVkIHdvdWxkIHRoZXJlZm9yZSBicmVhayBldmVyeSBidWlsZCDigJQgdGhlIGV4YWN0IG9wcG9zaXRlIG9mIFwib3B0aW9uYWxcIi5cbiAgLy8gT3B0aW9uYWwgc2VjcmV0cyBhcmUgbGVmdCBmb3IgdGhlIHBsdWdpbiB0byByZWFkIG9ubHkgd2hlcmUgdGhlIG9wZXJhdG9yIGhhc1xuICAvLyBwcm92aXNpb25lZCB0aGVtIChvdXQtb2YtYmFuZCBlbnYvc2VjcmV0KSwgbm90IGZvcmNlLWluamVjdGVkIGhlcmUuXG4gIGNvbnN0IHNlY3JldEVudlZhcnMgPSAocmVxdWlyZWRTZWNyZXRzLmxlbmd0aCAmJiBvcmdJZClcbiAgICA/IHRvU2VjcmV0RW52VmFycyhyZXF1aXJlZFNlY3JldHMsIG9yZ0lkKVxuICAgIDoge307XG5cbiAgY29uc3QgZW52ID0gYnVpbGRFbnYocGx1Z2luLCBtZXJnZWQsIGN1c3RvbUVudik7XG5cbiAgLy8gQ29kZVBpcGVsaW5lIHJlc29sdmVkIHZhcmlhYmxlcyDigJQgbXVzdCBiZSBpbiBDb2RlQnVpbGRTdGVwLmVudiAoYWN0aW9uLWxldmVsKSxcbiAgLy8gbm90IGJ1aWxkRW52aXJvbm1lbnQuZW52aXJvbm1lbnRWYXJpYWJsZXMgKHByb2plY3QtbGV2ZWwpXG4gIGNvbnN0IGFjdGlvbkVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBQSVBFTElORV9FWEVDVVRJT05fSUQ6ICcje2NvZGVwaXBlbGluZS5QaXBlbGluZUV4ZWN1dGlvbklkfScsXG4gIH07XG5cbiAgY29uc3Qgb3V0cHV0RGlyID0gcGx1Z2luLnByaW1hcnlPdXRwdXREaXJlY3Rvcnk7XG4gIGNvbnN0IGVuc3VyZU91dHB1dERpciA9IChvdXRwdXREaXIgJiYgIW91dHB1dERpci5pbmNsdWRlcygnKicpKVxuICAgID8gW2Bta2RpciAtcCBcIiR7b3V0cHV0RGlyfVwiICYmIHRvdWNoIFwiJHtvdXRwdXREaXJ9Ly5naXRrZWVwXCJgXVxuICAgIDogW107XG5cbiAgY29uc3QgeyBpbnN0YWxsQ29tbWFuZHMsIGNvbW1hbmRzIH0gPSBidWlsZENvbW1hbmRzKHBsdWdpbiwge1xuICAgIHByZUluc3RhbGxDb21tYW5kczogWy4uLmVuc3VyZU91dHB1dERpciwgLi4uKHByZUluc3RhbGxDb21tYW5kcyA/PyBbXSldLFxuICAgIHBvc3RJbnN0YWxsQ29tbWFuZHMsXG4gICAgcHJlQ29tbWFuZHMsXG4gICAgcG9zdENvbW1hbmRzLFxuICB9LCBmYWlsdXJlQmVoYXZpb3IpO1xuXG4gIGNvbnN0IHByb2dyYW1tYXRpYyA9IHsgaW5wdXQsIGluc3RhbGxDb21tYW5kcywgY29tbWFuZHMgfTtcblxuICAvLyBSZXNvbHZlIHRoZSBwbHVnaW4ncyBydW50aW1lIGltYWdlLiBDb2RlQnVpbGQgZGVmYXVsdHMgdG9cbiAgLy8gYGF3cy9jb2RlYnVpbGQvc3RhbmRhcmQ6Ny4wYCB3aGVuIG5vIGBidWlsZEltYWdlYCBpcyBzZXQg4oCUIHRoYXQncyB0aGVcbiAgLy8gQVdTLW1hbmFnZWQgVWJ1bnR1IGltYWdlIGFuZCBET0VTIE5PVCBoYXZlIGFueSBwbHVnaW4tYmFrZWQgdG9vbHNcbiAgLy8gKHBpcGVsaW5lLW1hbmFnZXIsIHNueWssIHRlcnJhZm9ybSwgZXRjLikuIFdpcmluZyB0aGUgcGx1Z2luJ3MgaW1hZ2VcbiAgLy8gaGVyZSBtZWFucyBDb2RlQnVpbGQgcHVsbHMgZnJvbSBvdXIgcHJpdmF0ZSByZWdpc3RyeSBhbmQgdGhlIHRvb2xzXG4gIC8vIGluc3RhbGxlZCBpbiB0aGUgcGx1Z2luJ3MgRG9ja2VyZmlsZSBhcmUgYWN0dWFsbHkgYXZhaWxhYmxlLlxuICBjb25zdCBwbHVnaW5CdWlsZEltYWdlID0gcmVzb2x2ZVBsdWdpbkltYWdlKHNjb3BlLCBwbHVnaW4sIG9yZ0lkKTtcblxuICAvLyBTaGVsbFN0ZXAgYnJhbmNoLlxuICAvLyBTaGVsbFN0ZXAgaXRzZWxmIGRvZXNuJ3QgYWNjZXB0IGBidWlsZEVudmlyb25tZW50YC9gYnVpbGRJbWFnZWAuIENES1xuICAvLyBwaXBlbGluZXMgd3JhcHMgU2hlbGxTdGVwcyBpbiBhIGRlZmF1bHQgQ29kZUJ1aWxkIGFjdGlvbiB0aGF0IHJ1bnMgb25cbiAgLy8gYGF3cy9jb2RlYnVpbGQvc3RhbmRhcmQ6Ny4wYCDigJQgd2hpY2ggd29uJ3QgaGF2ZSB0aGUgcGx1Z2luJ3MgdG9vbHMuXG4gIC8vXG4gIC8vIFNvIHdoZW4gYSBTSEVMTF9TVEVQIHBsdWdpbiBET0VTIGhhdmUgYW4gaW1hZ2UgKGJlY2F1c2UgaXRzIGF1dGhvclxuICAvLyBiYWtlZCB0b29scyBpbnRvIGEgRG9ja2VyZmlsZSksIHdlIFBST01PVEUgaXQgdG8gYSBDb2RlQnVpbGRTdGVwIHdpdGhcbiAgLy8gdGhlIHJlc29sdmVkIGltYWdlLiBUaGUgcGx1Z2luIGF1dGhvcidzIGludGVudCAoXCJ1c2UgbXkgYmFrZWQgdG9vbHNcIilcbiAgLy8gaXMgcHJlc2VydmVkIHdpdGhvdXQgZm9yY2luZyB0aGVtIHRvIGNoYW5nZSBwbHVnaW5UeXBlLlxuICAvL1xuICAvLyBXaGVuIHRoZSBwbHVnaW4gaGFzIG5vIGltYWdlIChvciByZWdpc3RyeSBpc24ndCBjb25maWd1cmVkKSwgd2Uga2VlcFxuICAvLyB0aGUgb3JpZ2luYWwgU2hlbGxTdGVwIOKAlCBpdCdzIGxpZ2h0ZXIgd2VpZ2h0IGFuZCB0aGUgZGVmYXVsdFxuICAvLyBDb2RlQnVpbGQgaW1hZ2UgaXMgZmluZS5cbiAgaWYgKHBsdWdpbi5wbHVnaW5UeXBlID09PSBQbHVnaW5UeXBlLlNIRUxMX1NURVApIHtcbiAgICBpZiAoIXBsdWdpbkJ1aWxkSW1hZ2UpIHtcbiAgICAgIHJldHVybiBuZXcgU2hlbGxTdGVwKGlkLCB7XG4gICAgICAgIC4uLnByb2dyYW1tYXRpYyxcbiAgICAgICAgZW52OiB7IC4uLmVudiwgLi4uYWN0aW9uRW52IH0sXG4gICAgICAgIC4uLm1ldGFkYXRhRm9yU2hlbGxTdGVwKG1lcmdlZCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBbQ3JlYXRlQ29kZUJ1aWxkU3RlcF0gU0hFTExfU1RFUCBwbHVnaW4gXCIke3BsdWdpbi5uYW1lfVwiIGhhcyBhIHJlZ2lzdHJ5IGltYWdlIOKAlCBwcm9tb3RpbmcgdG8gQ29kZUJ1aWxkU3RlcCBzbyB0aGUgcGx1Z2luIGltYWdlIGlzIGFjdHVhbGx5IHVzZWRgKTtcbiAgICAvLyBGYWxsIHRocm91Z2ggdG8gdGhlIENvZGVCdWlsZFN0ZXAgcGF0aCBiZWxvdy5cbiAgfVxuXG4gIGNvbnN0IGNvbXB1dGVUeXBlID0gZ2V0Q29tcHV0ZVR5cGUoXG4gICAgcGx1Z2luLmNvbXB1dGVUeXBlID8/IG9wdGlvbnMuZGVmYXVsdENvbXB1dGVUeXBlID8/ICdTTUFMTCcsXG4gICk7XG5cbiAgLy8gU3RlcCBuZXR3b3JrOiBleHBsaWNpdCBzdGVwIGNvbmZpZyB3aW5zLCBlbHNlIHRoaXMgc3RlcCdzIGBlYzI6bmV0d29ya2AgbWV0YWRhdGEuXG4gIGNvbnN0IHJlc29sdmVkTmV0d29yayA9IG5ldHdvcmsgPz8gbmV0d29ya0NvbmZpZ0Zyb21NZXRhZGF0YShtZXJnZWQpO1xuICBjb25zdCBuZXR3b3JrUHJvcHMgPSByZXNvbHZlZE5ldHdvcmtcbiAgICA/IHJlc29sdmVOZXR3b3JrKHNjb3BlLCBvcHRpb25zLnVuaXF1ZUlkLCByZXNvbHZlZE5ldHdvcmspXG4gICAgOiB7fTtcblxuICAvLyBNZXRhZGF0YSBzcHJlYWQgbGFzdCBzbyBpdCBjYW4gb3ZlcnJpZGUgcHJvZ3JhbW1hdGljIGRlZmF1bHRzLlxuICAvLyBOT1RFOiBDYWNoaW5nIGlzIHN1cHBvcnRlZCB2aWEgdHdvIG1ldGFkYXRhIHBhdGhzOlxuICAvLyAgIDEuIE1ldGFkYXRhS2V5cy5DQUNIRSAoJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVidWlsZHN0ZXA6Y2FjaGUnKSDigJQgcGFzc2VkIGRpcmVjdGx5XG4gIC8vICAgICAgYXMgdGhlIENvZGVCdWlsZFN0ZXAgYGNhY2hlYCBwcm9wIChleHBlY3RzIGEgY29kZWJ1aWxkLkNhY2hlIG9iamVjdCkuXG4gIC8vICAgMi4gTWV0YWRhdGFLZXlzLlBBUlRJQUxfQlVJTERfU1BFQyAoJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVidWlsZHN0ZXA6cGFydGlhbGJ1aWxkc3BlYycpXG4gIC8vICAgICAg4oCUIHBhc3NlZCBhcyBgcGFydGlhbEJ1aWxkU3BlY2AsIHdoaWNoIGNhbiBpbmNsdWRlIGEgYGNhY2hlOmAgc2VjdGlvbiBmb3JcbiAgLy8gICAgICBTMyBvciBsb2NhbCBjYWNoaW5nIChlLmcuLCBCdWlsZFNwZWMuZnJvbU9iamVjdCh7IGNhY2hlOiB7IHBhdGhzOiBbLi4uXSB9IH0pKS5cbiAgLy8gUGVyLXN0ZXAgYnVpbGRFbnZpcm9ubWVudCBvdmVycmlkZXMgZnJvbSBtZXRhZGF0YSAoYXdzOmNkazpjb2RlYnVpbGQ6YnVpbGRlbnZpcm9ubWVudDoqKS5cbiAgLy8gQSBtZXRhZGF0YS1wcm92aWRlZCBjb21wdXRlVHlwZSBpcyBhIHJhdyBwYXNzdGhyb3VnaCwgc28gbm9ybWFsaXplIGl0IHRocm91Z2hcbiAgLy8gZ2V0Q29tcHV0ZVR5cGUg4oCUIG90aGVyd2lzZSBhIGZyaWVuZGx5IHZhbHVlIGxpa2UgXCJMQVJHRVwiIHJlYWNoZXMgQ29kZUJ1aWxkIHZlcmJhdGltXG4gIC8vIGFuZCBmYWlscyB3aXRoIFwiSW52YWxpZCBjb21wdXRlIHR5cGUgcHJvdmlkZWRcIiAoaXQgbmVlZHMgQlVJTERfR0VORVJBTDFfTEFSR0UpLlxuICBjb25zdCByYXdNZXRhQnVpbGRFbnYgPSBtZXRhZGF0YUZvckJ1aWxkRW52aXJvbm1lbnQobWVyZ2VkKTtcbiAgY29uc3QgbWV0YUJ1aWxkRW52ID0gdHlwZW9mIHJhd01ldGFCdWlsZEVudi5jb21wdXRlVHlwZSA9PT0gJ3N0cmluZydcbiAgICA/IHsgLi4ucmF3TWV0YUJ1aWxkRW52LCBjb21wdXRlVHlwZTogZ2V0Q29tcHV0ZVR5cGUocmF3TWV0YUJ1aWxkRW52LmNvbXB1dGVUeXBlKSB9XG4gICAgOiByYXdNZXRhQnVpbGRFbnY7XG5cbiAgY29uc3Qgc3RlcCA9IG5ldyBDb2RlQnVpbGRTdGVwKGlkLCB7XG4gICAgLi4ucHJvZ3JhbW1hdGljLFxuICAgIC4uLm5ldHdvcmtQcm9wcyxcbiAgICAuLi4oYWRkaXRpb25hbElucHV0cyAmJiB7IGFkZGl0aW9uYWxJbnB1dHMgfSksXG4gICAgLi4uKHRpbWVvdXQgJiYgeyB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKHRpbWVvdXQpIH0pLFxuICAgIGVudjogYWN0aW9uRW52LFxuICAgIHByaW1hcnlPdXRwdXREaXJlY3Rvcnk6IHBsdWdpbi5wcmltYXJ5T3V0cHV0RGlyZWN0b3J5ID8/IHVuZGVmaW5lZCxcbiAgICAvLyBQaW4gdGhlIGJ1aWxkc3BlYyBzaGVsbCB0byBQT1NJWCAvYmluL3NoIHNvIGV4ZWN1dGlvbiBpcyBpZGVudGljYWwgdG9cbiAgICAvLyBDb2RlQnVpbGQncyBkZWZhdWx0IGFuZCBwb3J0YWJsZSBhY3Jvc3MgbWluaW1hbCBiYXNlIGltYWdlcyAobm8gYmFzaFxuICAgIC8vIGRlcGVuZGVuY3kpLiBQbHVnaW4gc3BlY3MgYXJlIGF1dGhvcmVkIFBPU0lYLWNsZWFuIHRvIG1hdGNoIOKAlCBubyBiYXNoLW9ubHlcbiAgICAvLyBgW1sgXV1gLCBhcnJheXMsIGByZWFkIC1yYSA8PDxgLCBvciBgc291cmNlYC9gbnZtIHVzZWAvYHNkayB1c2VgLiBBXG4gICAgLy8gcGx1Z2luLXN1cHBsaWVkIHBhcnRpYWxCdWlsZFNwZWMgKG5vbmUgdG9kYXkpIHdvdWxkIG92ZXJyaWRlIHRoaXMgdmlhIHRoZVxuICAgIC8vIG1ldGFkYXRhIHNwcmVhZCBiZWxvdyBhbmQgbXVzdCB0aGVuIHNldCBgZW52LnNoZWxsYCBpdHNlbGYuXG4gICAgcGFydGlhbEJ1aWxkU3BlYzogQnVpbGRTcGVjLmZyb21PYmplY3QoeyBlbnY6IHsgc2hlbGw6ICcvYmluL3NoJyB9IH0pLFxuICAgIGJ1aWxkRW52aXJvbm1lbnQ6IHtcbiAgICAgIGNvbXB1dGVUeXBlLFxuICAgICAgYnVpbGRJbWFnZTogcGx1Z2luQnVpbGRJbWFnZSA/PyByZXNvbHZlRGVmYXVsdEJ1aWxkSW1hZ2Uoc2NvcGUsIG9yZ0lkKSxcbiAgICAgIGVudmlyb25tZW50VmFyaWFibGVzOiB7XG4gICAgICAgIC4uLnRvQ29kZUJ1aWxkRW52VmFycyhlbnYpLFxuICAgICAgICAuLi5zZWNyZXRFbnZWYXJzLFxuICAgICAgfSxcbiAgICAgIC4uLm1ldGFCdWlsZEVudixcbiAgICB9LFxuICAgIC4uLm1ldGFkYXRhRm9yQ29kZUJ1aWxkU3RlcChtZXJnZWQpLFxuICB9KTtcblxuICAvLyBSZWdpc3RlciB3aXRoIGFydGlmYWN0IG1hbmFnZXIgaWYgcHJpbWFyeU91dHB1dERpcmVjdG9yeSBpcyBzZXRcbiAgaWYgKHBsdWdpbi5wcmltYXJ5T3V0cHV0RGlyZWN0b3J5ICYmIGFydGlmYWN0TWFuYWdlciAmJiBzdGFnZU5hbWUpIHtcbiAgICBjb25zdCBhcnRpZmFjdEtleTogQXJ0aWZhY3RLZXkgPSB7XG4gICAgICBzdGFnZU5hbWUsXG4gICAgICBzdGFnZUFsaWFzOiBzdGFnZUFsaWFzID8/IGAke3N0YWdlTmFtZX0tYWxpYXNgLFxuICAgICAgcGx1Z2luTmFtZTogcGx1Z2luLm5hbWUsXG4gICAgICBwbHVnaW5BbGlhczogcGx1Z2luQWxpYXMgPz8gcGx1Z2luQXJ0aWZhY3RBbGlhcyhwbHVnaW4pLFxuICAgICAgb3V0cHV0RGlyZWN0b3J5OiBwbHVnaW4ucHJpbWFyeU91dHB1dERpcmVjdG9yeSxcbiAgICB9O1xuICAgIGFydGlmYWN0TWFuYWdlci5hZGQoYXJ0aWZhY3RLZXksIHN0ZXApO1xuICB9XG5cbiAgcmV0dXJuIHN0ZXA7XG59XG5cbi8qKlxuICogQ29udmVydCBzdHJpbmcgb3IgQ29tcHV0ZVR5cGUgZW51bSB0byBDREsgQ29tcHV0ZVR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXB1dGVUeXBlKGlucHV0OiBzdHJpbmcgfCBDREtDb21wdXRlVHlwZSA9ICdTTUFMTCcpOiBDREtDb21wdXRlVHlwZSB7XG4gIC8vIElmIGFscmVhZHkgYSBDREsgQ29tcHV0ZVR5cGUsIHJldHVybiBhcy1pc1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIC8vIEFscmVhZHkgYSBuYXRpdmUgQ29kZUJ1aWxkIENvbXB1dGVUeXBlIChlLmcuIFwiQlVJTERfR0VORVJBTDFfTEFSR0VcIik/IEFjY2VwdCBhcy1pc1xuICAvLyBzbyBib3RoIGZyaWVuZGx5IChMQVJHRSkgYW5kIG5hdGl2ZSB2YWx1ZXMgcm91bmQtdHJpcCB3aXRob3V0IGZhbGxpbmcgYmFjayB0byBTTUFMTC5cbiAgaWYgKChPYmplY3QudmFsdWVzKENES0NvbXB1dGVUeXBlKSBhcyBzdHJpbmdbXSkuaW5jbHVkZXMoaW5wdXQpKSB7XG4gICAgcmV0dXJuIGlucHV0IGFzIENES0NvbXB1dGVUeXBlO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IGlucHV0LnRvVXBwZXJDYXNlKCkgYXMgQ29tcHV0ZVR5cGU7XG5cbiAgY29uc3QgbWFwcGluZzogUmVjb3JkPENvbXB1dGVUeXBlLCBDREtDb21wdXRlVHlwZT4gPSB7XG4gICAgW0NvbXB1dGVUeXBlLlNNQUxMXTogQ0RLQ29tcHV0ZVR5cGUuU01BTEwsXG4gICAgW0NvbXB1dGVUeXBlLk1FRElVTV06IENES0NvbXB1dGVUeXBlLk1FRElVTSxcbiAgICBbQ29tcHV0ZVR5cGUuTEFSR0VdOiBDREtDb21wdXRlVHlwZS5MQVJHRSxcbiAgICBbQ29tcHV0ZVR5cGUuWDJfTEFSR0VdOiBDREtDb21wdXRlVHlwZS5YMl9MQVJHRSxcbiAgfTtcblxuICBjb25zdCByZXN1bHQgPSBtYXBwaW5nW25vcm1hbGl6ZWRdO1xuICBpZiAoIXJlc3VsdCkge1xuICAgIGxvZy53YXJuKGBVbmtub3duIGNvbXB1dGUgdHlwZSBcIiR7aW5wdXR9XCIsIGZhbGxpbmcgYmFjayB0byBTTUFMTGApO1xuICAgIHJldHVybiBDREtDb21wdXRlVHlwZS5TTUFMTDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFVud3JhcCBhIFNlY3JldFZhbHVlIHwgc3RyaW5nIGludG8gYSBwbGFpbiBzdHJpbmcuXG4gKiBXaGVuIGEgU2VjcmV0VmFsdWUgaXMgcHJvdmlkZWQgKGUuZy4gZnJvbSBTZWNyZXRzIE1hbmFnZXIpLCBjYWxscyB1bnNhZmVVbndyYXAoKVxuICogdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcFNlY3JldCh2YWx1ZTogU2VjcmV0VmFsdWUgfCBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogdmFsdWUudW5zYWZlVW53cmFwKCk7XG59XG4iXX0=
610
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb3JlL3BpcGVsaW5lLWhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzNELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxTQUFTLEVBQUUsV0FBVyxJQUFJLGNBQWMsRUFBRSxlQUFlLEVBQW9CLE1BQU0sMkJBQTJCLENBQUM7QUFDdEosT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckYsT0FBTyxFQUFvQixNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSx3QkFBd0IsRUFBRSwyQkFBMkIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9JLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0SCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFxQixNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSwyQkFBMkIsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pILE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLG9CQUFvQixDQUFD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QztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YSc7XG5pbXBvcnQgeyBEdXJhdGlvbiwgU2VjcmV0VmFsdWUsIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlVHlwZSwgQnVpbGRTcGVjLCBDb21wdXRlVHlwZSBhcyBDREtDb21wdXRlVHlwZSwgTGludXhCdWlsZEltYWdlLCB0eXBlIElCdWlsZEltYWdlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZCc7XG5pbXBvcnQgeyBTZWNyZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXInO1xuaW1wb3J0IHsgQ29kZUJ1aWxkU3RlcCwgTWFudWFsQXBwcm92YWxTdGVwLCBTaGVsbFN0ZXAgfSBmcm9tICdhd3MtY2RrLWxpYi9waXBlbGluZXMnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IHR5cGUgQXJ0aWZhY3RLZXkgfSBmcm9tICcuL2FydGlmYWN0LW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgbWV0YWRhdGFGb3JTaGVsbFN0ZXAsIG1ldGFkYXRhRm9yQ29kZUJ1aWxkU3RlcCwgbWV0YWRhdGFGb3JCdWlsZEVudmlyb25tZW50LCBuZXR3b3JrQ29uZmlnRnJvbU1ldGFkYXRhIH0gZnJvbSAnLi9tZXRhZGF0YS1idWlsZGVyLmpzJztcbmltcG9ydCB7IFNURVBfQk9PVFNUUkFQX0NNRCwgZXh0cmFjdE1ldGFkYXRhRW52LCBtZXJnZSwgd3JhcENvbW1hbmRzRm9yRmFpbHVyZUJlaGF2aW9yIH0gZnJvbSAnLi9tZXRhZGF0YS1oZWxwZXJzLmpzJztcbmltcG9ydCB7IHJlc29sdmVOZXR3b3JrIH0gZnJvbSAnLi9uZXR3b3JrLmpzJztcbmltcG9ydCB7IFBsdWdpblR5cGUsIENvbXB1dGVUeXBlLCB0eXBlIE1ldGFEYXRhVHlwZSB9IGZyb20gJy4vcGlwZWxpbmUtdHlwZXMuanMnO1xuaW1wb3J0IHsgcGx1Z2luQXJ0aWZhY3RBbGlhcyB9IGZyb20gJy4vcGx1Z2luLWNvbnRyYWN0LmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX1JFUE9SVF9LRVlfRU5WLCBTRUNVUklUWV9SRVBPUlRfU0VDUkVUX0xFQUYsIFNFQ1VSSVRZX1JFUE9SVF9VUExPQURfRU5WIH0gZnJvbSAnLi9zZWN1cml0eS1yZXBvcnRzLmpzJztcbmltcG9ydCB7IFBMVUdJTl9JTUFHRV9SRVBPU0lUT1JZX1JFIH0gZnJvbSAnLi9zdGVwLW1hbmlmZXN0LmpzJztcbmltcG9ydCB7IENvbmZpZywgQ29yZUNvbnN0YW50cyB9IGZyb20gJy4uL2NvbmZpZy9hcHAtY29uZmlnLmpzJztcbmltcG9ydCB0eXBlIHsgQ29kZUJ1aWxkU3RlcE9wdGlvbnMsIFN0ZXBDdXN0b21pemF0aW9uIH0gZnJvbSAnLi4vcGlwZWxpbmUvc3RlcC10eXBlcy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUGx1Z2luVGVtcGxhdGVzIH0gZnJvbSAnLi4vdGVtcGxhdGUvcGx1Z2luLXJlc29sdmVyLmpzJztcblxuY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCdwaXBlbGluZS1oZWxwZXJzJyk7XG5cbi8qKlxuICogQnVpbGQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gcGx1Z2luIGNvbmZpZywgbWVyZ2VkIG1ldGFkYXRhLCBhbmQgY3VzdG9tIGVudi5cbiAqXG4gKiBNZXJnZSBvcmRlciAobGFzdCB3aW5zKTpcbiAqICAgMS4gcGx1Z2luLmVudiDigJQgcGx1Z2luIGRlZmF1bHQgZW52IHZhcnMgKGxvd2VzdCBwcmlvcml0eSlcbiAqICAgMi4gbm9uLW5hbWVzcGFjZWQgbWV0YWRhdGEga2V5cyDigJQgZS5nLiBQWVRIT05fVkVSU0lPTiwgV09SS0RJUlxuICogICAzLiBjdXN0b21FbnYg4oCUIHBlci1zdGVwIGN1c3RvbSBlbnYgdmFycyAoaGlnaGVzdCBwcmlvcml0eSlcbiAqL1xuZnVuY3Rpb24gYnVpbGRFbnYocGx1Z2luOiBQbHVnaW4sIG1ldGFkYXRhOiBNZXRhRGF0YVR5cGUsIGN1c3RvbUVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi4ocGx1Z2luLmVudiA/PyB7fSksXG4gICAgLi4uZXh0cmFjdE1ldGFkYXRhRW52KG1ldGFkYXRhKSxcbiAgICAuLi4oY3VzdG9tRW52ID8/IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBib290c3RyYXAtcHJlZml4ZWQgaW5zdGFsbCBhbmQgYnVpbGQgY29tbWFuZHMgZnJvbSBwbHVnaW4gY29uZmlnLlxuICogRWFjaCBjb21tYW5kIGxpc3QgaXMgcHJlcGVuZGVkIHdpdGggYSBXT1JLRElSIGJvb3RzdHJhcCB0aGF0IGRlZmF1bHRzIHRvICcuLycuXG4gKiBXaGVuIGN1c3RvbSBjb21tYW5kcyBhcmUgcHJvdmlkZWQsIHRoZXkgYXJlIGluamVjdGVkIGJlZm9yZS9hZnRlciB0aGUgcGx1Z2luJ3MgY29tbWFuZHMuXG4gKiBCdWlsZCBjb21tYW5kcyBhcmUgb3B0aW9uYWxseSB3cmFwcGVkIGJ5IGZhaWx1cmVCZWhhdmlvciBsb2dpYy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRDb21tYW5kcyhwbHVnaW46IFBsdWdpbiwgY3VzdG9tPzogU3RlcEN1c3RvbWl6YXRpb24sIGZhaWx1cmVCZWhhdmlvcj86ICdmYWlsJyB8ICd3YXJuJyB8ICdpZ25vcmUnKTogeyBpbnN0YWxsQ29tbWFuZHM6IHN0cmluZ1tdOyBjb21tYW5kczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IHVzZXJDb21tYW5kcyA9IFtcbiAgICAuLi4oY3VzdG9tPy5wcmVDb21tYW5kcyA/PyBbXSksXG4gICAgLi4uKHBsdWdpbi5jb21tYW5kcz8ubGVuZ3RoID8gcGx1Z2luLmNvbW1hbmRzIDogW10pLFxuICAgIC4uLihjdXN0b20/LnBvc3RDb21tYW5kcyA/PyBbXSksXG4gIF07XG5cbiAgcmV0dXJuIHtcbiAgICBpbnN0YWxsQ29tbWFuZHM6IFtcbiAgICAgIFNURVBfQk9PVFNUUkFQX0NNRCxcbiAgICAgIC4uLihjdXN0b20/LnByZUluc3RhbGxDb21tYW5kcyA/PyBbXSksXG4gICAgICAuLi4ocGx1Z2luLmluc3RhbGxDb21tYW5kcyA/PyBbXSksXG4gICAgICAuLi4oY3VzdG9tPy5wb3N0SW5zdGFsbENvbW1hbmRzID8/IFtdKSxcbiAgICBdLFxuICAgIGNvbW1hbmRzOiBbU1RFUF9CT09UU1RSQVBfQ01ELCAuLi53cmFwQ29tbWFuZHNGb3JGYWlsdXJlQmVoYXZpb3IodXNlckNvbW1hbmRzLCBmYWlsdXJlQmVoYXZpb3IpXSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgcGxhaW4gZW52IHJlY29yZCB0byBDb2RlQnVpbGQncyBlbnZpcm9ubWVudFZhcmlhYmxlcyBmb3JtYXQgKFBMQUlOVEVYVCkuXG4gKi9cbmZ1bmN0aW9uIHRvQ29kZUJ1aWxkRW52VmFycyhlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiBzdHJpbmcgfT4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKGVudikubWFwKChbbmFtZSwgdmFsdWVdKSA9PiBbbmFtZSwgeyB2YWx1ZSB9XSksXG4gICk7XG59XG5cbi8qKlxuICogQnVpbGQgU0VDUkVUU19NQU5BR0VSLXR5cGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gcGx1Z2luIHNlY3JldCBkZWNsYXJhdGlvbnMuXG4gKiBVc2VzIG5hbWluZyBjb252ZW50aW9uOiBwaXBlbGluZS1idWlsZGVyL3tvcmdJZH0ve3NlY3JldE5hbWV9XG4gKiBFYWNoIG9yZyBtYW5hZ2VzIHRoZXNlIHNlY3JldHMgaW4gdGhlaXIgb3duIEFXUyBTZWNyZXRzIE1hbmFnZXIuXG4gKi9cbmNvbnN0IFZBTElEX1NFQ1JFVF9OQU1FID0gL15bYS16QS1aMC05L18rPS5ALV0rJC87XG5cbi8qKlxuICogU2VjcmV0cyBNYW5hZ2VyIGxlYWYgaG9sZGluZyB0aGUgb3JnJ3MgUkVHSVNUUlkgY3JlZGVudGlhbCDigJQgdGhlXG4gKiBgcmVnaXN0cnk6cHVzaGAtc2NvcGVkIHNlcnZpY2UtYWNjb3VudCBrZXkgQ29kZUJ1aWxkIHByZXNlbnRzIGFzIEJhc2ljIGF1dGggdG9cbiAqIHBpcGVsaW5lLWltYWdlLXJlZ2lzdHJ5LiBEZWxpYmVyYXRlbHkgTk9UIGBwbGF0Zm9ybWA6IHRoYXQgc2VjcmV0IGhvbGRzXG4gKiB0aGUgb3JnJ3MgZnVsbC1wcml2aWxlZ2UgYXV0b21hdGlvbiBjcmVkZW50aWFsLCBhbmQgYSBidWlsZCBjb250YWluZXIgaGFzIG5vXG4gKiBidXNpbmVzcyBiZWluZyBhYmxlIHRvIGNhbGwgdGhlIEFQSSB3aXRoIGl0LlxuICogUHJvdmlzaW9uZWQgYnkgYHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW4gLS1zY29wZSByZWdpc3RyeTpwdXNoYC5cbiAqL1xuY29uc3QgUkVHSVNUUllfQ1JFREVOVElBTF9TRUNSRVQgPSAncmVnaXN0cnktcHVzaCc7XG5cbmZ1bmN0aW9uIHRvU2VjcmV0RW52VmFycyhcbiAgc2VjcmV0czogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHJlcXVpcmVkOiBib29sZWFuIH0+LFxuICBvcmdJZDogc3RyaW5nLFxuKTogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogc3RyaW5nOyB0eXBlOiBCdWlsZEVudmlyb25tZW50VmFyaWFibGVUeXBlIH0+IHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBzZWNyZXRzLm1hcCgoeyBuYW1lIH0pID0+IHtcbiAgICAgIGNvbnN0IHNlY3JldFBhdGggPSBDb3JlQ29uc3RhbnRzLnNlY3JldFBhdGgob3JnSWQsIG5hbWUpO1xuICAgICAgaWYgKCFWQUxJRF9TRUNSRVRfTkFNRS50ZXN0KHNlY3JldFBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2VjcmV0IHBhdGggXCIke3NlY3JldFBhdGh9XCIgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIGZvciBBV1MgU2VjcmV0cyBNYW5hZ2VyYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW1xuICAgICAgICBuYW1lLFxuICAgICAgICB7XG4gICAgICAgICAgdmFsdWU6IHNlY3JldFBhdGgsXG4gICAgICAgICAgdHlwZTogQnVpbGRFbnZpcm9ubWVudFZhcmlhYmxlVHlwZS5TRUNSRVRTX01BTkFHRVIsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH0pLFxuICApO1xufVxuXG4vKipcbiAqIEluLWNsdXN0ZXIgLyBsb2NhbCByZWdpc3RyeSBob3N0bmFtZXMgdGhhdCBBV1MgQ29kZUJ1aWxkIChvdXQtb2YtY2x1c3RlcilcbiAqIGNhbm5vdCByZXNvbHZlLiBCYWtpbmcgb25lIG9mIHRoZXNlIGludG8gYSBDb2RlQnVpbGQgaW1hZ2UgVVJJIGd1YXJhbnRlZXMgYVxuICogYEJVSUxEX0NPTlRBSU5FUl9VTkFCTEVfVE9fUFVMTF9JTUFHRWAgZmFpbHVyZSBhdCBidWlsZCB0aW1lLCBzbyB3ZSBmYWlsIHRoZVxuICogc3ludGggZmFzdCBpbnN0ZWFkIOKAlCB3aXRoIGEgbWVzc2FnZSB0aGF0IHNheXMgaG93IHRvIGZpeCBpdC5cbiAqL1xuY29uc3QgVU5SRUFDSEFCTEVfUFVMTF9IT1NUUyA9IG5ldyBTZXQoWydyZWdpc3RyeScsICdsb2NhbGhvc3QnLCAnMTI3LjAuMC4xJywgJzo6MScsICcwLjAuMC4wJ10pO1xuXG4vKiogS3ViZXJuZXRlcyAvIG1ETlMgc3VmZml4ZXMgdGhhdCBvbmx5IHJlc29sdmUgaW5zaWRlIHRoZSBjbHVzdGVyL0xBTi4gKi9cbmNvbnN0IFVOUkVBQ0hBQkxFX0hPU1RfU1VGRklYRVMgPSBbJy5zdmMnLCAnLnN2Yy5jbHVzdGVyLmxvY2FsJywgJy5sb2NhbCddO1xuXG4vKipcbiAqIFJlZHVjZSBhIHJlZ2lzdHJ5IGhvc3QgdmFsdWUgdG8gaXRzIGJhcmUgaG9zdG5hbWUgZm9yIHRoZSByZWFjaGFiaWxpdHkgY2hlY2s6XG4gKiBzdHJpcCBJUHY2IGJyYWNrZXRzIGFuZCBhbnkgYDpwb3J0YCBzdWZmaXggKGFuIG9wZXJhdG9yIG1heSBwdXQgaG9zdCtwb3J0IGluXG4gKiBvbmUgZmllbGQpLCBzbyBgcmVnaXN0cnk6NTAwMGAgLyBgWzo6MV06NTAwMGAgYXJlIHN0aWxsIHJlY29nbml6ZWQuXG4gKi9cbmZ1bmN0aW9uIGJhcmVIb3N0bmFtZShyYXdIb3N0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgaCA9IHJhd0hvc3QudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChoLnN0YXJ0c1dpdGgoJ1snKSkge1xuICAgIGNvbnN0IGVuZCA9IGguaW5kZXhPZignXScpO1xuICAgIGlmIChlbmQgIT09IC0xKSByZXR1cm4gaC5zbGljZSgxLCBlbmQpOyAvLyBbOjoxXTo1MDAwIC0+IDo6MVxuICB9XG4gIC8vIFN0cmlwIGEgdHJhaWxpbmcgOnBvcnQgb25seSBmb3Igbm9uLUlQdjYgdmFsdWVzIChJUHY2IGNvbnRhaW5zICc6Oicgb3IgPjEgJzonKS5cbiAgaWYgKGguaW5jbHVkZXMoJzonKSAmJiAoaC5tYXRjaCgvOi9nKT8ubGVuZ3RoID8/IDApID09PSAxKSBoID0gaC5zcGxpdCgnOicpWzBdO1xuICByZXR1cm4gaDtcbn1cblxuLyoqIFRydWUgd2hlbiBDb2RlQnVpbGQgKG91dC1vZi1jbHVzdGVyKSBjb3VsZCBub3QgcmVzb2x2ZSB0aGlzIHJlZ2lzdHJ5IGhvc3QuICovXG5mdW5jdGlvbiBpc1VucmVhY2hhYmxlUHVsbEhvc3QocmF3SG9zdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGggPSBiYXJlSG9zdG5hbWUocmF3SG9zdCk7XG4gIGlmIChoID09PSAnJykgcmV0dXJuIHRydWU7IC8vIG5vIGhvc3Qg4oaSIG1hbGZvcm1lZCBVUklcbiAgaWYgKFVOUkVBQ0hBQkxFX1BVTExfSE9TVFMuaGFzKGgpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIFVOUkVBQ0hBQkxFX0hPU1RfU1VGRklYRVMuc29tZSgocykgPT4gaC5lbmRzV2l0aChzKSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZXh0ZXJuYWwgKG91dC1vZi1jbHVzdGVyKSByZWdpc3RyeSBwdWxsIGhvc3QgKyBgOnBvcnRgIHN1ZmZpeCBmb3JcbiAqIGEgQ29kZUJ1aWxkIGltYWdlIFVSSSwgYW5kIGZhaWwgZmFzdCBpZiBpdCByZXNvbHZlZCB0byBhbiBpbi1jbHVzdGVyL2xvY2FsXG4gKiBkZWZhdWx0IHRoYXQgQ29kZUJ1aWxkIGNhbid0IHJlYWNoLlxuICpcbiAqIFByZWZlcnMgYHB1bGxIb3N0YC9gcHVsbFBvcnRgICh0aGUgcHVibGljIGVuZHBvaW50IENvZGVCdWlsZCBjYW4gcmVzb2x2ZSkgYW5kXG4gKiBmYWxscyBiYWNrIHRvIGBob3N0YC9gcG9ydGAgZm9yIHNpbmdsZS1ob3N0IGRlcGxveXMuIHBpcGVsaW5lLW1hbmFnZXIgYmFrZXNcbiAqIHRoZSByaWdodCBwdWxsIGhvc3QgaW50byB0aGUgc3ludGggYXV0b21hdGljYWxseSBmcm9tIHRoZSBwbGF0Zm9ybSBVUkwgaXRcbiAqIGRlcGxveXMgYWdhaW5zdCAoYHByb3BzLnJlZ2lzdHJ5YCk7IHRoaXMgZ3VhcmQgY2F0Y2hlcyB0aGUgY2FzZSB3aGVyZSBuZWl0aGVyXG4gKiB0aGF0IG5vciBgSU1BR0VfUkVHSVNUUllfUFVMTF9IT1NUYC9gUExBVEZPUk1fQkFTRV9VUkxgIHdhcyBzdXBwbGllZC5cbiAqXG4gKiBFc2NhcGUgaGF0Y2g6IGBBTExPV19JTkNMVVNURVJfUFVMTF9IT1NUPXRydWVgIChlLmcuIENvZGVCdWlsZCBpbiBhIFZQQyB3aG9zZVxuICogcHJpdmF0ZSBETlMgZ2VudWluZWx5IHJlc29sdmVzIHRoZSBpbi1jbHVzdGVyIG5hbWUpLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRXh0ZXJuYWxQdWxsVGFyZ2V0KFxuICByZWdpc3RyeTogeyBob3N0Pzogc3RyaW5nOyBwb3J0PzogbnVtYmVyOyBwdWxsSG9zdD86IHN0cmluZzsgcHVsbFBvcnQ/OiBudW1iZXIgfSxcbik6IHsgaG9zdDogc3RyaW5nOyBwb3J0UGFydDogc3RyaW5nIH0ge1xuICBjb25zdCBob3N0ID0gcmVnaXN0cnkucHVsbEhvc3QgfHwgcmVnaXN0cnkuaG9zdCB8fCAnJztcbiAgY29uc3QgcG9ydCA9IHJlZ2lzdHJ5LnB1bGxQb3J0ID8/IHJlZ2lzdHJ5LnBvcnQ7XG4gIGlmIChwcm9jZXNzLmVudi5BTExPV19JTkNMVVNURVJfUFVMTF9IT1NUICE9PSAndHJ1ZScgJiYgaXNVbnJlYWNoYWJsZVB1bGxIb3N0KGhvc3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFJlZ2lzdHJ5IHB1bGwgaG9zdCByZXNvbHZlZCB0byAnJHtob3N0fScsIHdoaWNoIEFXUyBDb2RlQnVpbGQgY2Fubm90IHJlYWNoIOKAlCBpdCBpcyB0aGUgYCArXG4gICAgICAnaW4tY2x1c3Rlci9sb2NhbCBkZWZhdWx0LiBUaGUgc3ludGhlc2l6ZWQgcGlwZWxpbmUgd291bGQgZmFpbCBhdCBidWlsZCB0aW1lIHdpdGggJyArXG4gICAgICAnQlVJTERfQ09OVEFJTkVSX1VOQUJMRV9UT19QVUxMX0lNQUdFLiBTZXQgdGhlIHBsYXRmb3JtXFwncyBwdWJsaWMgaG9zdCB2aWEgJyArXG4gICAgICAnSU1BR0VfUkVHSVNUUllfUFVMTF9IT1NUIG9yIFBMQVRGT1JNX0JBU0VfVVJMIGJlZm9yZSBkZXBsb3lpbmcg4oCUIHBpcGVsaW5lLW1hbmFnZXIgYmFrZXMgJyArXG4gICAgICAndGhpcyBpbiBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIHBsYXRmb3JtIFVSTCBpdCBkZXBsb3lzIGFnYWluc3QuICcgK1xuICAgICAgJ1NldCBBTExPV19JTkNMVVNURVJfUFVMTF9IT1NUPXRydWUgdG8gYnlwYXNzIChpbi1WUEMgcHJpdmF0ZSBETlMpLicsXG4gICAgKTtcbiAgfVxuICBjb25zdCBwb3J0UGFydCA9IHBvcnQgJiYgcG9ydCAhPT0gODAgJiYgcG9ydCAhPT0gNDQzID8gYDoke3BvcnR9YCA6ICcnO1xuICByZXR1cm4geyBob3N0LCBwb3J0UGFydCB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIENvZGVCdWlsZCBpbWFnZSB0byB1c2UgZm9yIGEgcGx1Z2luLlxuICpcbiAqIFN0cmF0ZWd5OlxuICogICAxLiBJZiB0aGUgcGx1Z2luIHNldHMgYGF3czpjZGs6Y29kZWJ1aWxkOmJ1aWxkZW52aXJvbm1lbnQ6YnVpbGRJbWFnZWBcbiAqICAgICAgZXhwbGljaXRseSBpbiBtZXRhZGF0YSwgdGhlIG1ldGFkYXRhLWJ1aWxkZXIgcGFzc3Rocm91Z2ggaGFuZGxlcyBpdFxuICogICAgICAodmlhIGBtZXRhZGF0YUZvckJ1aWxkRW52aXJvbm1lbnRgKS4gVGhpcyBmdW5jdGlvbiByZXR1cm5zXG4gKiAgICAgIGB1bmRlZmluZWRgIGFuZCB0aGUgbWV0YWRhdGEgd2lucy5cbiAqICAgMi4gT3RoZXJ3aXNlLCBpZiB0aGUgcGx1Z2luIGhhcyBhIGBuYW1lYCtgdmVyc2lvbmAgQU5EIHRoZSByZWdpc3RyeVxuICogICAgICBjb25maWcgaXMgcG9wdWxhdGVkLCBidWlsZCBhIGBMaW51eEJ1aWxkSW1hZ2UuZnJvbURvY2tlclJlZ2lzdHJ5KClgXG4gKiAgICAgIGltYWdlIHBvaW50aW5nIGF0IGA8cmVnaXN0cnktaG9zdD46PHBvcnQ+Lzxucz4vPG5hbWU+QDxpbWFnZURpZ2VzdD5gXG4gKiAgICAgIHdoZXJlIGA8bnM+YCBpcyBgc3lzdGVtYCBvciBgb3JnLTxvcmdJZD5gLiBQaW5uZWQgQlkgRElHRVNUIOKAlCB0aGUgb25lXG4gKiAgICAgIHRoZSBwbHVnaW4gc2VydmljZSB2ZXJpZmllZCBhZ2FpbnN0IGl0cyBzaWduaW5nIGtleSBiZWZvcmUgcmV0dXJuaW5nXG4gKiAgICAgIHRoaXMgcmVjb3JkIOKAlCBuZXZlciBieSB0aGUgbXV0YWJsZSBgOjx2ZXJzaW9uPmAgdGFnLCB3aGljaCBhbnlvbmVcbiAqICAgICAgaG9sZGluZyB0aGUgb3JnJ3MgcmVnaXN0cnkgcHVzaCBjcmVkZW50aWFsIGNvdWxkIHJlLXBvaW50LiBBIHBsdWdpblxuICogICAgICB0aGF0IG5lZWRzIGFuIGltYWdlIGJ1dCBjYXJyaWVzIG5vIGRpZ2VzdCBpcyByZWZ1c2VkICh0aHJvd3MpOiBydW5uaW5nXG4gKiAgICAgIGFuIHVudmVyaWZpZWQgaW1hZ2UgaXMgd29yc2UgdGhhbiBhIGZhaWxlZCBzeW50aC4gQ29kZUJ1aWxkIGF1dGhlbnRpY2F0ZXMgYnlcbiAqICAgICAgc2VuZGluZyB0aGUgcGVyLW9yZyBwbGF0Zm9ybSBTZWNyZXQgYXMgQmFzaWMgYXV0aCB0b1xuICogICAgICBgcGlwZWxpbmUtaW1hZ2UtcmVnaXN0cnlgJ3MgYC90b2tlbmAgZW5kcG9pbnQ7IHRoZSBKV1QgaW4gYHBhc3N3b3JkYFxuICogICAgICByZXNvbHZlcyB0byBhIHJlZ2lzdHJ5IHRva2VuIHNjb3BlZCB0byB0aGUgb3JnLlxuICogICAzLiBJZiBgbWV0YWRhdGFfb25seWAsIHJldHVybiBgdW5kZWZpbmVkYCBzbyBDb2RlQnVpbGQgdXNlcyBpdHMgZGVmYXVsdFxuICogICAgICAoYHN0YW5kYXJkOjcuMGApLlxuICpcbiAqIGBzY29wZWAgYW5kIGBvcmdJZGAgYXJlIHJlcXVpcmVkOiB0aGUgcGVyLW9yZyBwbGF0Zm9ybSBTZWNyZXQgaXMgbmFtZWRcbiAqIGBwaXBlbGluZS1idWlsZGVyLzxvcmdJZD4vcGxhdGZvcm1gLCBhbmQgYFNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKClgXG4gKiBuZWVkcyBhIENvbnN0cnVjdCB0byBhbmNob3IgdGhlIGltcG9ydGVkIHNlY3JldCB0by5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQbHVnaW5JbWFnZShzY29wZTogQ29uc3RydWN0IHwgdW5kZWZpbmVkLCBwbHVnaW46IFBsdWdpbiwgb3JnSWQ/OiBzdHJpbmcpOiBJQnVpbGRJbWFnZSB8IHVuZGVmaW5lZCB7XG4gIC8vIGBtZXRhZGF0YV9vbmx5YCBwbHVnaW5zIGxlZ2l0aW1hdGVseSBoYXZlIG5vIGltYWdlIOKAlCB0aGVpciB3b3JrIHJ1bnNcbiAgLy8gaW4gdGhlIGRlZmF1bHQgQ29kZUJ1aWxkIGltYWdlLiBRdWlldCBza2lwLlxuICBpZiAocGx1Z2luLmJ1aWxkVHlwZSA9PT0gJ21ldGFkYXRhX29ubHknKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIGJ1aWxkX2ltYWdlIC8gcHJlYnVpbHQgcGx1Z2lucyBtdXN0IGhhdmUgbmFtZSArIHZlcnNpb24gKERCIGNvbnN0cmFpbnRcbiAgLy8gbWFrZXMgYm90aCBOT1QgTlVMTCkuIERlZmVuc2l2ZSBjaGVjayBpbiBjYXNlIGEgbWFsZm9ybWVkIHJvdyBzbGlwcyBpbi5cbiAgaWYgKCFwbHVnaW4ubmFtZSB8fCAhcGx1Z2luLnZlcnNpb24pIHtcbiAgICBsb2cud2FybihcbiAgICAgIGBQbHVnaW4gXCIke3BsdWdpbi5uYW1lfVwiIGhhcyBidWlsZFR5cGU9JHtwbHVnaW4uYnVpbGRUeXBlfSBidXQgbWlzc2luZyBuYW1lL3ZlcnNpb24g4oCUIGAgK1xuICAgICAgJ0NvZGVCdWlsZCB3aWxsIHJ1biBvbiBhd3MvY29kZWJ1aWxkL3N0YW5kYXJkOjguMCBhbmQgd29uXFwndCBoYXZlIHRoZSBwbHVnaW5cXCdzIGJha2VkIHRvb2xzLicsXG4gICAgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gTm8gZGlnZXN0IOKHkiB0aGUgcGx1Z2luIHNlcnZpY2UgbmV2ZXIgc2lnbmVkIGFuIGltYWdlIGZvciB0aGlzIHJvdyAob3IgdGhlXG4gIC8vIHJlY29yZCBkaWRuJ3QgY29tZSBmcm9tIGAvcGx1Z2lucy9sb29rdXBgKS4gRmFpbCB0aGUgc3ludGggcmF0aGVyIHRoYW4gZmFsbFxuICAvLyBiYWNrIHRvIHRoZSB0YWcuXG4gIGlmICghcGx1Z2luLmltYWdlRGlnZXN0IHx8ICEvXnNoYTI1NjpbMC05YS1mXXs2NH0kLy50ZXN0KHBsdWdpbi5pbWFnZURpZ2VzdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgUGx1Z2luIFwiJHtwbHVnaW4ubmFtZX06JHtwbHVnaW4udmVyc2lvbn1cIiBoYXMgYnVpbGRUeXBlPSR7cGx1Z2luLmJ1aWxkVHlwZX0gYnV0IG5vIHNpZ25lZCBpbWFnZSBkaWdlc3QuIGAgK1xuICAgICAgJ1JlYnVpbGQgdGhlIHBsdWdpbiAocmUtdXBsb2FkIGl0KSBzbyB0aGUgcGxhdGZvcm0gY2FuIGJ1aWxkLCBzaWduIGFuZCByZWNvcmQgaXRzIGltYWdlLicsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSByZXBvc2l0b3J5IGNvbWVzIGZyb20gbG9va3VwOiBgcHVibGljLzxwdWJsaXNoZXI+LzxuYW1lPmAgZm9yIGFcbiAgLy8gbGlzdGVkIHBsdWdpbiAodGhlIHJlYWQtb25seSBjb3B5IGV2ZXJ5IG9yZyBtYXkgcHVsbCksIGBvcmctPGlkPi88bmFtZT5gXG4gIC8vIGZvciB0aGUgb3JnJ3Mgb3duLiBOZXZlciBkZXJpdmVkIGhlcmUgZnJvbSB0aGUgcmVjb3JkJ3Mgb3duZXIg4oCUIGEgbGlzdGluZydzXG4gIC8vIGltYWdlIGRvZXNuJ3QgbGl2ZSBpbiBpdHMgcHVibGlzaGVyJ3MgbmFtZXNwYWNlLlxuICBjb25zdCByZXBvc2l0b3J5ID0gKHBsdWdpbiBhcyBQbHVnaW4gJiB7IGltYWdlUmVwb3NpdG9yeT86IHN0cmluZyB8IG51bGwgfSkuaW1hZ2VSZXBvc2l0b3J5O1xuICBpZiAoIXJlcG9zaXRvcnkgfHwgIVBMVUdJTl9JTUFHRV9SRVBPU0lUT1JZX1JFLnRlc3QocmVwb3NpdG9yeSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgUGx1Z2luIFwiJHtwbHVnaW4ubmFtZX06JHtwbHVnaW4udmVyc2lvbn1cIiBoYXMgbm8gaW1hZ2UgcmVwb3NpdG9yeSBmcm9tIHRoZSBwbHVnaW4gbG9va3VwLiBgICtcbiAgICAgICdSZXNvbHZlIHBsdWdpbnMgdGhyb3VnaCB0aGUgcGxhdGZvcm0gKGBwaXBlbGluZS1tYW5hZ2VyIHBpcGVsaW5lIHN5bnRoYCAvIHRoZSBsb29rdXAgY3VzdG9tIHJlc291cmNlKS4nLFxuICAgICk7XG4gIH1cblxuICBsZXQgcmVnaXN0cnk7XG4gIHRyeSB7XG4gICAgcmVnaXN0cnkgPSBDb25maWcuZ2V0KCdyZWdpc3RyeScpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBDb25maWcgbmFtZXNwYWNlIG5vdCBsb2FkZWQgKGUuZy4sIHVuaXQgdGVzdHMgd2l0aG91dCBmdWxsIGNvbmZpZykuXG4gICAgbG9nLndhcm4oXG4gICAgICBgUGx1Z2luIFwiJHtwbHVnaW4ubmFtZX06JHtwbHVnaW4udmVyc2lvbn1cIiBuZWVkcyB0aGUgcmVnaXN0cnkgY29uZmlnIGJ1dCBpdCdzIG5vdCBsb2FkZWQg4oCUIGAgK1xuICAgICAgJ0NvZGVCdWlsZCB3aWxsIGZhbGwgYmFjayB0byBhd3MvY29kZWJ1aWxkL3N0YW5kYXJkOjguMC4gJyArXG4gICAgICAnU2V0IElNQUdFX1JFR0lTVFJZX0hPU1QgKyBJTUFHRV9SRUdJU1RSWV9QT1JUIGluIHBpcGVsaW5lLW1hbmFnZXJcXCdzIGVudmlyb25tZW50LicsXG4gICAgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFyZWdpc3RyeT8uaG9zdCkge1xuICAgIGxvZy53YXJuKFxuICAgICAgYFBsdWdpbiBcIiR7cGx1Z2luLm5hbWV9OiR7cGx1Z2luLnZlcnNpb259XCIgbmVlZHMgSU1BR0VfUkVHSVNUUllfSE9TVCBidXQgaXQncyBlbXB0eSDigJQgYCArXG4gICAgICAnQ29kZUJ1aWxkIHdpbGwgZmFsbCBiYWNrIHRvIGF3cy9jb2RlYnVpbGQvc3RhbmRhcmQ6OC4wLiAnICtcbiAgICAgICdTZXQgSU1BR0VfUkVHSVNUUllfSE9TVCBpbiBwaXBlbGluZS1tYW5hZ2VyXFwncyBlbnZpcm9ubWVudCB0byB1c2UgdGhlIHBsdWdpbiBpbWFnZS4nLFxuICAgICk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoIXNjb3BlKSB7XG4gICAgbG9nLndhcm4oYFBsdWdpbiBcIiR7cGx1Z2luLm5hbWV9XCIgaW1hZ2UgcmVzb2x1dGlvbiBza2lwcGVkOiBubyBjb25zdHJ1Y3Qgc2NvcGUgcHJvdmlkZWRgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gUGVyLW9yZyBhdXRoIHJlcXVpcmVzIG9yZ0lkIOKAlCB0aGUgU2VjcmV0IGlzIG5hbWVkIHBlciBvcmcuXG4gIGlmICghb3JnSWQpIHtcbiAgICBsb2cud2FybihcbiAgICAgIGBQbHVnaW4gXCIke3BsdWdpbi5uYW1lfVwiIGltYWdlIHJlc29sdXRpb24gc2tpcHBlZDogb3JnSWQgaXMgcmVxdWlyZWQgdG8gYCArXG4gICAgICAncmVzb2x2ZSB0aGUgcGVyLW9yZyBwbGF0Zm9ybSBTZWNyZXQgdXNlZCBmb3IgQ29kZUJ1aWxkIEJhc2ljIGF1dGguJyxcbiAgICApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBDb21wb3NlIHRoZSBpbWFnZSBVUkkgZnJvbSB0aGUgbG9va3VwJ3MgcmVwb3NpdG9yeSwgcGlubmVkIGJ5IGRpZ2VzdC5cbiAgLy8gVGhlIHRva2VuIHNlcnZpY2UgZ3JhbnRzIHB1bGwgb24gYHB1YmxpYy8qYCB0byBldmVyeSBhdXRoZW50aWNhdGVkXG4gIC8vIGlkZW50aXR5IGFuZCBvbiBgb3JnLTxpZD4vKmAgdG8gdGhhdCBvcmcgKGFuZCBpdHMgdGVhbXMpLlxuICAvLyBVc2UgdGhlIGV4dGVybmFsIHB1bGwgaG9zdC9wb3J0OiB0aGlzIGltYWdlIFVSSSBpcyBjb25zdW1lZCBieSBBV1NcbiAgLy8gQ29kZUJ1aWxkIChvdXQtb2YtY2x1c3RlciksIHdoaWNoIGNhbid0IHJlc29sdmUgdGhlIGluLWNsdXN0ZXJcbiAgLy8gYHJlZ2lzdHJ5OjUwMDBgIENsdXN0ZXJJUC4gRmFsbCBiYWNrIHRvIGBob3N0YC9gcG9ydGAgZm9yIHNpbmdsZS1ob3N0IC9cbiAgLy8gaW4tY2x1c3Rlci1vbmx5IGRlcGxveXMgd2hlcmUgbm8gc2VwYXJhdGUgcHVsbCBob3N0IGlzIGNvbmZpZ3VyZWQuXG4gIGNvbnN0IHsgaG9zdDogcHVsbEhvc3QsIHBvcnRQYXJ0IH0gPSByZXNvbHZlRXh0ZXJuYWxQdWxsVGFyZ2V0KHJlZ2lzdHJ5KTtcbiAgY29uc3QgaW1hZ2VVcmkgPSBgJHtwdWxsSG9zdH0ke3BvcnRQYXJ0fS8ke3JlcG9zaXRvcnl9QCR7cGx1Z2luLmltYWdlRGlnZXN0fWA7XG5cbiAgLy8gQ29kZUJ1aWxkIHJlYWRzIGBwaXBlbGluZS1idWlsZGVyLzxvcmdJZD4vcmVnaXN0cnktcHVzaGAgYW5kIHNlbmRzIGl0c1xuICAvLyBgdXNlcm5hbWVgL2BwYXNzd29yZGAgZmllbGRzIGFzIEhUVFAgQmFzaWMgdG8gdGhlIHJlZ2lzdHJ5LiBUaGUgcmVnaXN0cnlcbiAgLy8gY2hhbGxlbmdlcyB3aXRoIGEgQmVhcmVyIHJlYWxtIHBvaW50aW5nIGF0IHBpcGVsaW5lLWltYWdlLXJlZ2lzdHJ5J3NcbiAgLy8gYC90b2tlbmAgZW5kcG9pbnQ7IHRoZSBEb2NrZXIgY2xpZW50IGZvcndhcmRzIHRob3NlIGNyZWRzLCBpbWFnZS1yZWdpc3RyeVxuICAvLyBleGNoYW5nZXMgdGhlIG9wYXF1ZSBgcGJfc2Ff4oCmYCBrZXkgZm9yIGEgc2hvcnQtbGl2ZWQgdG9rZW4sIGFuZCBhIHJlZ2lzdHJ5XG4gIC8vIHRva2VuIHNjb3BlZCB0byB0aGUgb3JnIGlzIGlzc3VlZC5cbiAgLy9cbiAgLy8gVGhpcyBpcyB0aGUgUkVHSVNUUlktT05MWSBjcmVkZW50aWFsLCBub3QgdGhlIG9yZydzIGZ1bGwtcHJpdmlsZWdlXG4gIC8vIHBsYXRmb3JtIG9uZTogaXRzIGV4Y2hhbmdlZCB0b2tlbiBjYXJyaWVzIHRoZSBzaW5nbGUgYHJlZ2lzdHJ5OnB1c2hgIHNjb3BlXG4gIC8vIGFuZCBubyBBUEkgcGVybWlzc2lvbnMgYXQgYWxsLCBzbyBhIENvZGVCdWlsZCBqb2IgdGhhdCBsZWFrcyBpdCBjYW4gbW92ZVxuICAvLyBpbWFnZXMgaW5zaWRlIHRoaXMgb3JnJ3MgbmFtZXNwYWNlIGFuZCBub3RoaW5nIGVsc2UuIFRoZSBwbHVnaW4tbG9va3VwXG4gIC8vIExhbWJkYSBrZWVwcyByZWFkaW5nIGAuLi4vcGxhdGZvcm1gIOKAlCBpdCBjYWxscyB0aGUgb3JkaW5hcnkgQVBJLCB3aGljaCBub1xuICAvLyBzaW5nbGUgc2NvcGUgY292ZXJzLlxuICAvLyBQcm92aXNpb24gaXQgd2l0aDogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXNjb3BlIHJlZ2lzdHJ5OnB1c2hcbiAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZihzY29wZSk7XG4gIGNvbnN0IHNlY3JldE5hbWUgPSBDb3JlQ29uc3RhbnRzLnNlY3JldFBhdGgob3JnSWQsIFJFR0lTVFJZX0NSRURFTlRJQUxfU0VDUkVUKTtcbiAgLy8gQ0RLIGNvbnN0cnVjdCBJRHMgYWxsb3cgb25seSBbQS1aYS16MC05Xy1dOyBzYW5pdGl6ZSB0aGUgc2VjcmV0IG5hbWUuXG4gIGNvbnN0IHNlY3JldENvbnN0cnVjdElkID0gYFJlZ2lzdHJ5Q3JlZHNfJHtzZWNyZXROYW1lLnJlcGxhY2UoL1teQS1aYS16MC05Xy1dL2csICdfJyl9YDtcbiAgY29uc3QgY3JlZGVudGlhbHNTZWNyZXQgPSAoc3RhY2subm9kZS50cnlGaW5kQ2hpbGQoc2VjcmV0Q29uc3RydWN0SWQpIGFzIFNlY3JldCB8IHVuZGVmaW5lZClcbiAgICA/PyBTZWNyZXQuZnJvbVNlY3JldE5hbWVWMihzdGFjaywgc2VjcmV0Q29uc3RydWN0SWQsIHNlY3JldE5hbWUpO1xuXG4gIHJldHVybiBMaW51eEJ1aWxkSW1hZ2UuZnJvbURvY2tlclJlZ2lzdHJ5KGltYWdlVXJpLCB7XG4gICAgc2VjcmV0c01hbmFnZXJDcmVkZW50aWFsczogY3JlZGVudGlhbHNTZWNyZXQsXG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGZhbGxiYWNrIENvZGVCdWlsZCBpbWFnZSBmb3Igc3RlcHMgd2l0aG91dCBhIHBsdWdpbi1iYWtlZCBvbmUuXG4gKlxuICogUmVhZHMgYGF3cy5jb2RlQnVpbGQuZGVmYXVsdEltYWdlYCAoZW52OiBgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0VgKS5cbiAqIERlZmF1bHQ6IGBwaXBlbGluZS1ib290c3RyYXA6MS4wYCDigJQgdGhlIGxvY2FsIHRhZyBidWlsdCBieVxuICogYGRlcGxveS9jb2RlYnVpbGQvYm9vdHN0cmFwL0RvY2tlcmZpbGVgLiBQaW5uZWQgYnlcbiAqIGBhd3MuY29kZUJ1aWxkLmRlZmF1bHRJbWFnZURpZ2VzdGAgKGVudjogYENPREVCVUlMRF9ERUZBVUxUX0lNQUdFX0RJR0VTVGApXG4gKiB3aGVuIHNldCwgdGhlIHNhbWUgd2F5IHBsdWdpbiBpbWFnZXMgYXJlIHBpbm5lZCBieSB0aGVpciBzaWduZWQgZGlnZXN0LlxuICpcbiAqIC0gQVdTIGN1cmF0ZWQgaW1hZ2UgKGBhd3MvY29kZWJ1aWxkLypgKTogdXNlIHRoZSBtYXRjaGluZyBgTGludXhCdWlsZEltYWdlYFxuICogICBjb25zdGFudCBzbyBDREsgZW1pdHMgYGltYWdlUHVsbENyZWRlbnRpYWxzVHlwZTogQ09ERUJVSUxEYC4gVXNpbmdcbiAqICAgYGZyb21Eb2NrZXJSZWdpc3RyeSgpYCBoZXJlIHdvdWxkIHNldCBTRVJWSUNFX1JPTEUgY3JlZGVudGlhbHMsIHdoaWNoXG4gKiAgIENGTiByZWplY3RzIHdpdGggXCJjYW5ub3QgdXNlIGEgQ29kZUJ1aWxkIGN1cmF0ZWQgaW1hZ2Ugd2l0aFxuICogICBpbWFnZVB1bGxDcmVkZW50aWFsc1R5cGUgU0VSVklDRV9ST0xFXCIuXG4gKiAtIEJhcmUgdGFnIChubyBgL2ApOiBhdXRvLXByZWZpeGVkIHRvXG4gKiAgIGA8cmVnaXN0cnktaG9zdD46PHBvcnQ+L2xpYnJhcnkvPHRhZz5gIHVzaW5nIHRoZSByZWdpc3RyeSBjb25maWcsXG4gKiAgIHdpdGggdGhlIHBlci1vcmcgcGxhdGZvcm0gU2VjcmV0IGFzIEJhc2ljIGF1dGgg4oCUIHNhbWUgcGF0aFxuICogICBgcmVzb2x2ZVBsdWdpbkltYWdlKClgIHVzZXMgZm9yIHBsdWdpbiBpbWFnZXMuIE5lZWRzIGBzY29wZWAgKyBgb3JnSWRgLlxuICogLSBGdWxseS1xdWFsaWZpZWQgcmVnaXN0cnkgVVJJIChjb250YWlucyBgL2ApOiB1c2VkIGFzLWlzLCBubyBhdXRoIHdpcmVkLlxuICogLSBNaXNzaW5nIHJlZ2lzdHJ5IGNvbmZpZyBvciBzY29wZS9vcmdJZCDihpIgZmFsbHMgYmFjayB0b1xuICogICBgYXdzL2NvZGVidWlsZC9zdGFuZGFyZDo4LjBgIChhcyBhIENVUkFURUQgaW1hZ2UsIHNlZSBhYm92ZSksIHdpdGggYVxuICogICB3YXJuaW5nIHNvIHN5bnRoIGRlZ3JhZGVzIGdyYWNlZnVsbHkgb24gcGFydGlhbGx5IGNvbmZpZ3VyZWQgZW52cy5cbiAqL1xuY29uc3QgU1RBTkRBUkRfOF8wID0gJ2F3cy9jb2RlYnVpbGQvc3RhbmRhcmQ6OC4wJztcblxuLyoqXG4gKiBhd3MtY2RrLWxpYiAyLjI1OCBoYXMgbm8gYExpbnV4QnVpbGRJbWFnZS5TVEFOREFSRF84XzBgIHN0YXRpYyB5ZXQsIHNvIHRoZVxuICogY3VyYXRlZCA4LjAgZmFsbGJhY2sgcmVzb2x2ZXMgdmlhIGBmcm9tQ29kZUJ1aWxkSW1hZ2VJZGAgKHN0aWxsIENPREVCVUlMRCBjcmVkcykuXG4gKi9cbmNvbnN0IGZhbGxiYWNrQnVpbGRJbWFnZSA9ICgpOiBJQnVpbGRJbWFnZSA9PiBMaW51eEJ1aWxkSW1hZ2UuZnJvbUNvZGVCdWlsZEltYWdlSWQoU1RBTkRBUkRfOF8wKTtcblxuLyoqXG4gKiBNYXAgQVdTIGN1cmF0ZWQgYGF3cy9jb2RlYnVpbGQvKmAgaW1hZ2Ugc3RyaW5ncyB0byB0aGUgbWF0Y2hpbmdcbiAqIGBMaW51eEJ1aWxkSW1hZ2VgIHN0YXRpYy4gRXh0ZW5kIHdoZW4gbmV3ZXIgc3RhbmRhcmQgaW1hZ2VzIHNoaXAuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIGZvciBub24tY3VyYXRlZCBzdHJpbmdzIOKAlCBjYWxsZXIgc2hvdWxkIHVzZVxuICogYGZyb21Eb2NrZXJSZWdpc3RyeSgpYCBmb3IgdGhvc2UuXG4gKi9cbmZ1bmN0aW9uIGN1cmF0ZWRMaW51eEJ1aWxkSW1hZ2UoaW1hZ2VJZDogc3RyaW5nKTogSUJ1aWxkSW1hZ2UgfCB1bmRlZmluZWQge1xuICBpZiAoIWltYWdlSWQuc3RhcnRzV2l0aCgnYXdzL2NvZGVidWlsZC8nKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgc3dpdGNoIChpbWFnZUlkKSB7XG4gICAgY2FzZSAnYXdzL2NvZGVidWlsZC9zdGFuZGFyZDo2LjAnOiByZXR1cm4gTGludXhCdWlsZEltYWdlLlNUQU5EQVJEXzZfMDtcbiAgICBjYXNlICdhd3MvY29kZWJ1aWxkL3N0YW5kYXJkOjUuMCc6IHJldHVybiBMaW51eEJ1aWxkSW1hZ2UuU1RBTkRBUkRfNV8wO1xuICAgIC8vIE5ld2VyIGNvZGVuYW1lZCBpbWFnZXMgcm91dGUgdGhyb3VnaCBmcm9tQ29kZUJ1aWxkSW1hZ2VJZCwgd2hpY2hcbiAgICAvLyBDREsgYWxzbyBtYXJrcyBhcyBDT0RFQlVJTEQgY3JlZGVudGlhbHMgKGN1cmF0ZWQpLlxuICAgIGRlZmF1bHQ6IHJldHVybiBMaW51eEJ1aWxkSW1hZ2UuZnJvbUNvZGVCdWlsZEltYWdlSWQoaW1hZ2VJZCk7XG4gIH1cbn1cblxuLyoqIEEgcmVnaXN0cnkgbWFuaWZlc3QgZGlnZXN0IGFzIENvZGVCdWlsZCBhY2NlcHRzIGl0IGluIGFuIGltYWdlIHJlZmVyZW5jZS4gKi9cbmNvbnN0IElNQUdFX0RJR0VTVF9SRSA9IC9ec2hhMjU2OlswLTlhLWZdezY0fSQvO1xuXG4vKipcbiAqIFB1bGwgcmVmZXJlbmNlIGZvciB0aGUgY29uZmlndXJlZCBkZWZhdWx0IGltYWdlJ3MgYmFyZSBgPHJlcG8+Ojx0YWc+YDpcbiAqIGA8cmVwbz5APGRpZ2VzdD5gIHdoZW4gdGhlIGJvb3RzdHJhcCBkaWdlc3QgaXMgY29uZmlndXJlZCwgZWxzZSB0aGUgdGFnXG4gKiBpdHNlbGYgd2l0aCBhIGxvdWQgd2FybmluZy4gQSBkaWdlc3QgdGhhdCBpcyBzZXQgYnV0IG1hbGZvcm1lZCBmYWlscyB0aGVcbiAqIHN5bnRoIOKAlCBpdCBpcyBhIHR5cG8sIGFuZCBzaWxlbnRseSBmYWxsaW5nIGJhY2sgdG8gdGhlIHRhZyB3b3VsZCBoaWRlIGl0LlxuICovXG5mdW5jdGlvbiBwaW5uZWREZWZhdWx0SW1hZ2VSZWYoY29uZmlndXJlZDogc3RyaW5nLCBkaWdlc3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghZGlnZXN0KSB7XG4gICAgbG9nLndhcm4oXG4gICAgICBgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0U9JyR7Y29uZmlndXJlZH0nIGlzIHB1bGxlZCBieSBpdHMgTVVUQUJMRSB0YWcg4oCUIENPREVCVUlMRF9ERUZBVUxUX0lNQUdFX0RJR0VTVCBpcyBub3Qgc2V0LiBgICtcbiAgICAgICdBbnlvbmUgaG9sZGluZyBhIHJlZ2lzdHJ5IHB1c2ggY3JlZGVudGlhbCBmb3IgbGlicmFyeS8gY291bGQgcmUtcG9pbnQgaXQuIFNldCBDT0RFQlVJTERfREVGQVVMVF9JTUFHRV9ESUdFU1QgJyArXG4gICAgICAndG8gdGhlIGRpZ2VzdCBkZXBsb3kvYmluL2J1aWxkLWNvZGVidWlsZC1ib290c3RyYXAuc2ggcHJpbnRzIGFmdGVyIHB1Ymxpc2hpbmcuJyxcbiAgICApO1xuICAgIHJldHVybiBjb25maWd1cmVkO1xuICB9XG4gIGlmICghSU1BR0VfRElHRVNUX1JFLnRlc3QoZGlnZXN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0VfRElHRVNUPScke2RpZ2VzdH0nIGlzIG5vdCBhIHNoYTI1NiBtYW5pZmVzdCBkaWdlc3QgKHNoYTI1Njo8NjQgaGV4PikuYCk7XG4gIH1cbiAgY29uc3QgcmVwbyA9IGNvbmZpZ3VyZWQucmVwbGFjZSgvQC4qJC8sICcnKS5yZXBsYWNlKC86W146L10rJC8sICcnKTtcbiAgcmV0dXJuIGAke3JlcG99QCR7ZGlnZXN0fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGVmYXVsdEJ1aWxkSW1hZ2Uoc2NvcGU/OiBDb25zdHJ1Y3QsIG9yZ0lkPzogc3RyaW5nKTogSUJ1aWxkSW1hZ2Uge1xuICBsZXQgY29uZmlndXJlZDogc3RyaW5nO1xuICBsZXQgZGlnZXN0ID0gJyc7XG4gIHRyeSB7XG4gICAgY29uc3QgY29kZUJ1aWxkID0gQ29uZmlnLmdldCgnYXdzJykuY29kZUJ1aWxkO1xuICAgIGNvbmZpZ3VyZWQgPSBjb2RlQnVpbGQuZGVmYXVsdEltYWdlO1xuICAgIGRpZ2VzdCA9IGNvZGVCdWlsZC5kZWZhdWx0SW1hZ2VEaWdlc3Q7XG4gIH0gY2F0Y2gge1xuICAgIGNvbmZpZ3VyZWQgPSBTVEFOREFSRF84XzA7XG4gIH1cblxuICAvLyBBV1MgY3VyYXRlZCBpbWFnZSDihpIgQ09ERUJVSUxEIGNyZWRlbnRpYWxzLiBNVVNUIGdvIHRocm91Z2ggdGhlXG4gIC8vIExpbnV4QnVpbGRJbWFnZSBjb25zdGFudHMsIG5vdCBmcm9tRG9ja2VyUmVnaXN0cnkoKS5cbiAgY29uc3QgY3VyYXRlZCA9IGN1cmF0ZWRMaW51eEJ1aWxkSW1hZ2UoY29uZmlndXJlZCk7XG4gIGlmIChjdXJhdGVkKSByZXR1cm4gY3VyYXRlZDtcblxuICAvLyBGdWxseS1xdWFsaWZpZWQgVVJJIOKAlCBvcGVyYXRvciBvd25zIGl0LiBObyByZWdpc3RyeS9TZWNyZXQgd2lyaW5nLiBBblxuICAvLyBvcGVyYXRvci1zdXBwbGllZCBkaWdlc3QgaXMgaG9ub3VyZWQ7IGEgdGFnLW9ubHkgVVJJIGlzIHdhcm5lZCBhYm91dC5cbiAgaWYgKGNvbmZpZ3VyZWQuaW5jbHVkZXMoJy8nKSkge1xuICAgIHJldHVybiBMaW51eEJ1aWxkSW1hZ2UuZnJvbURvY2tlclJlZ2lzdHJ5KFxuICAgICAgY29uZmlndXJlZC5pbmNsdWRlcygnQHNoYTI1NjonKSA/IGNvbmZpZ3VyZWQgOiBwaW5uZWREZWZhdWx0SW1hZ2VSZWYoY29uZmlndXJlZCwgZGlnZXN0KSxcbiAgICApO1xuICB9XG5cbiAgLy8gQmFyZSB0YWcg4oaSIGF1dG8tcHJlZml4IHdpdGggdGhlIHBsYXRmb3JtIHJlZ2lzdHJ5LCBtaXJyb3JpbmdcbiAgLy8gcmVzb2x2ZVBsdWdpbkltYWdlKCkuIEJhaWwgdG8gdGhlIGN1cmF0ZWQgc3RhbmRhcmQ6OC4wIGZhbGxiYWNrXG4gIC8vICh3aXRoIGEgd2FybmluZykgYXQgZWFjaCBtaXNzaW5nIHByZXJlcXVpc2l0ZSBzbyBzeW50aCBkZWdyYWRlc1xuICAvLyBncmFjZWZ1bGx5IG9uIHBhcnRpYWxseSBjb25maWd1cmVkIGVudmlyb25tZW50cyBpbnN0ZWFkIG9mIGZhaWxpbmcuXG4gIGxldCByZWdpc3RyeTtcbiAgdHJ5IHtcbiAgICByZWdpc3RyeSA9IENvbmZpZy5nZXQoJ3JlZ2lzdHJ5Jyk7XG4gIH0gY2F0Y2gge1xuICAgIGxvZy53YXJuKFxuICAgICAgYENPREVCVUlMRF9ERUZBVUxUX0lNQUdFPScke2NvbmZpZ3VyZWR9JyBpcyBhIGJhcmUgdGFnIGJ1dCByZWdpc3RyeSBjb25maWcgbm90IGxvYWRlZCDigJQgYCArXG4gICAgICBgZmFsbGluZyBiYWNrIHRvICR7U1RBTkRBUkRfOF8wfS4gU2V0IElNQUdFX1JFR0lTVFJZX0hPU1QgKyBJTUFHRV9SRUdJU1RSWV9QT1JULmAsXG4gICAgKTtcbiAgICByZXR1cm4gZmFsbGJhY2tCdWlsZEltYWdlKCk7XG4gIH1cbiAgaWYgKCFyZWdpc3RyeT8uaG9zdCkge1xuICAgIGxvZy53YXJuKFxuICAgICAgYENPREVCVUlMRF9ERUZBVUxUX0lNQUdFPScke2NvbmZpZ3VyZWR9JyBpcyBhIGJhcmUgdGFnIGJ1dCBJTUFHRV9SRUdJU1RSWV9IT1NUIGlzIGVtcHR5IOKAlCBgICtcbiAgICAgIGBmYWxsaW5nIGJhY2sgdG8gJHtTVEFOREFSRF84XzB9LmAsXG4gICAgKTtcbiAgICByZXR1cm4gZmFsbGJhY2tCdWlsZEltYWdlKCk7XG4gIH1cbiAgaWYgKCFzY29wZSB8fCAhb3JnSWQpIHtcbiAgICBsb2cud2FybihcbiAgICAgIGBDT0RFQlVJTERfREVGQVVMVF9JTUFHRT0nJHtjb25maWd1cmVkfScgbmVlZHMgc2NvcGUrb3JnSWQgZm9yIFNlY3JldCBhdXRoIOKAlCBgICtcbiAgICAgIGBmYWxsaW5nIGJhY2sgdG8gJHtTVEFOREFSRF84XzB9LiAoQ2FsbGVyIGRpZCBub3Qgc3VwcGx5IHRoZW0uKWAsXG4gICAgKTtcbiAgICByZXR1cm4gZmFsbGJhY2tCdWlsZEltYWdlKCk7XG4gIH1cblxuICAvLyBVc2UgdGhlIGV4dGVybmFsIHB1bGwgaG9zdC9wb3J0IChub3QgdGhlIGluLWNsdXN0ZXIgaG9zdCkg4oCUIHRoaXMgVVJJIGlzXG4gIC8vIGNvbnN1bWVkIGJ5IEFXUyBDb2RlQnVpbGQsIHdoaWNoIGNhbid0IHJlc29sdmUgdGhlIGByZWdpc3RyeTo1MDAwYCBDbHVzdGVySVAuXG4gIGNvbnN0IHsgaG9zdDogcHVsbEhvc3QsIHBvcnRQYXJ0IH0gPSByZXNvbHZlRXh0ZXJuYWxQdWxsVGFyZ2V0KHJlZ2lzdHJ5KTtcbiAgY29uc3QgaW1hZ2VVcmkgPSBgJHtwdWxsSG9zdH0ke3BvcnRQYXJ0fS9saWJyYXJ5LyR7cGlubmVkRGVmYXVsdEltYWdlUmVmKGNvbmZpZ3VyZWQsIGRpZ2VzdCl9YDtcblxuICAvLyBTYW1lIFNlY3JldCBhcyByZXNvbHZlUGx1Z2luSW1hZ2Ug4oCUIHRoZSBwZXItb3JnIFJFR0lTVFJZIGNyZWRlbnRpYWwsIHdoaWNoXG4gIC8vIENvZGVCdWlsZCBzZW5kcyBhcyBCYXNpYyBhdXRoIGFuZCBpbWFnZS1yZWdpc3RyeSBleGNoYW5nZXMgZm9yIGEgc2NvcGVkIHRva2VuLlxuICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHNjb3BlKTtcbiAgY29uc3Qgc2VjcmV0TmFtZSA9IENvcmVDb25zdGFudHMuc2VjcmV0UGF0aChvcmdJZCwgUkVHSVNUUllfQ1JFREVOVElBTF9TRUNSRVQpO1xuICBjb25zdCBzZWNyZXRDb25zdHJ1Y3RJZCA9IGBSZWdpc3RyeUNyZWRzXyR7c2VjcmV0TmFtZS5yZXBsYWNlKC9bXkEtWmEtejAtOV8tXS9nLCAnXycpfWA7XG4gIGNvbnN0IGNyZWRlbnRpYWxzU2VjcmV0ID0gKHN0YWNrLm5vZGUudHJ5RmluZENoaWxkKHNlY3JldENvbnN0cnVjdElkKSBhcyBTZWNyZXQgfCB1bmRlZmluZWQpXG4gICAgPz8gU2VjcmV0LmZyb21TZWNyZXROYW1lVjIoc3RhY2ssIHNlY3JldENvbnN0cnVjdElkLCBzZWNyZXROYW1lKTtcblxuICByZXR1cm4gTGludXhCdWlsZEltYWdlLmZyb21Eb2NrZXJSZWdpc3RyeShpbWFnZVVyaSwge1xuICAgIHNlY3JldHNNYW5hZ2VyQ3JlZGVudGlhbHM6IGNyZWRlbnRpYWxzU2VjcmV0LFxuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBDb2RlQnVpbGQgc3RlcCBvciBTaGVsbCBzdGVwIGJhc2VkIG9uIHBsdWdpbiBjb25maWd1cmF0aW9uLlxuICpcbiAqIE1ldGFkYXRhIG1lcmdlIG9yZGVyIChsYXN0IHdpbnMpOlxuICogICAxLiBQbHVnaW4gbWV0YWRhdGEgKGZyb20gcGx1Z2luLm1ldGFkYXRhIGluIGRhdGFiYXNlKSDigJQgdGhlIHBsdWdpblxuICogICAgICBhdXRob3IncyBiYWtlZC1pbiBkZWZhdWx0c1xuICogICAyLiBTdGVwLWxldmVsIG1ldGFkYXRhIChmcm9tIG9wdGlvbnMubWV0YWRhdGEpIOKAlCB0aGUgcGlwZWxpbmUgYXV0aG9yJ3NcbiAqICAgICAgcGVyLXN0ZXAgb3ZlcnJpZGVzLCB3aGljaCBhcmUgbW9yZSBzcGVjaWZpYyBhbmQgbXVzdCB3aW5cbiAqXG4gKiBFbnZpcm9ubWVudCBtZXJnZSBvcmRlciAobGFzdCB3aW5zKTpcbiAqICAgMS4gUGx1Z2luIGVudiB2YXJzIChmcm9tIHBsdWdpbi5lbnYpXG4gKiAgIDIuIEN1c3RvbSBlbnYgdmFycyAoZnJvbSBvcHRpb25zLmVudilcbiAqICAgMy4gV09SS0RJUiBmcm9tIG1lcmdlZCBtZXRhZGF0YVxuICpcbiAqIENESyBwcm9wIHNwcmVhZCBvcmRlciAobGFzdCB3aW5zKTpcbiAqICAgcHJvZ3JhbW1hdGljIGRlZmF1bHRzIChpbnB1dCwgY29tbWFuZHMsIGVudiwgbmV0d29yaykg4oaSIG1ldGFkYXRhIG92ZXJyaWRlc1xuICpcbiAqIFRoaXMgbWVhbnMgbWV0YWRhdGEga2V5cyBsaWtlIGBhd3M6Y2RrOnBpcGVsaW5lczpjb2RlYnVpbGRzdGVwOmNvbW1hbmRzYFxuICogd2lsbCBvdmVycmlkZSB0aGUgcGx1Z2luLWRlcml2ZWQgY29tbWFuZHMgd2hlbiBleHBsaWNpdGx5IHNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvZGVCdWlsZFN0ZXAob3B0aW9uczogQ29kZUJ1aWxkU3RlcE9wdGlvbnMpOiBTaGVsbFN0ZXAgfCBDb2RlQnVpbGRTdGVwIHwgTWFudWFsQXBwcm92YWxTdGVwIHtcbiAgY29uc3Qge1xuICAgIGlkLCBpbnB1dCwgbWV0YWRhdGEsIG5ldHdvcmssIHNjb3BlLFxuICAgIHByZUluc3RhbGxDb21tYW5kcywgcG9zdEluc3RhbGxDb21tYW5kcywgcHJlQ29tbWFuZHMsIHBvc3RDb21tYW5kcyxcbiAgICBlbnY6IGN1c3RvbUVudiwgYWRkaXRpb25hbElucHV0cywgdGltZW91dCwgZmFpbHVyZUJlaGF2aW9yLFxuICAgIGFydGlmYWN0TWFuYWdlciwgc3RhZ2VOYW1lLCBzdGFnZUFsaWFzLCBwbHVnaW5BbGlhcywgb3JnSWQsIHBpcGVsaW5lU2NvcGUsXG4gIH0gPSBvcHRpb25zO1xuXG4gIC8vIFJlc29sdmUge3sgLi4uIH19IHRlbXBsYXRlcyBpbiBwbHVnaW4gc3BlYyBmaWVsZHMgYWdhaW5zdCB0aGUgcGlwZWxpbmUgc2NvcGUuXG4gIC8vIEV2ZXJ5IGNhbGwgZ29lcyB0aHJvdWdoIHRoZSByZXNvbHZlciDigJQgcGx1Z2lucyB3aXRob3V0IHRlbXBsYXRlIHRva2VucyBhcmVcbiAgLy8gYSBuby1vcCBmYXN0IHBhdGggaW5zaWRlIHJlc29sdmVQbHVnaW5UZW1wbGF0ZXMoKS5cbiAgY29uc3QgcGx1Z2luID0gcmVzb2x2ZVBsdWdpblRlbXBsYXRlcyhvcHRpb25zLnBsdWdpbiwgcGlwZWxpbmVTY29wZSk7XG5cbiAgLy8gUGVyLXN0ZXAgbWV0YWRhdGEgKHRoZSBwaXBlbGluZSBhdXRob3IncyBvdmVycmlkZXMsIGUuZy4gSkFWQV9WRVJTSU9OPTI1KVxuICAvLyBtdXN0IHdpbiBvdmVyIHRoZSBwbHVnaW4ncyBjYXRhbG9nIGBtZXRhZGF0YWAgZGVmYXVsdHMsIHNvIGl0IGdvZXMgTEFTVC5cbiAgLy8gUmV2ZXJzaW5nIHRoZXNlIHNpbGVudGx5IGRyb3BwZWQgcGVyLXN0ZXAgb3ZlcnJpZGVzIGZvciBhbnkgcGx1Z2luIHRoYXRcbiAgLy8gc2hpcHMgbm9uLWVtcHR5IGNhdGFsb2cgbWV0YWRhdGEgKHBsdWdpbnMgdGhhdCBjYXJyeSBkZWZhdWx0cyB1bmRlciBgZW52YFxuICAvLyBpbnN0ZWFkIOKAlCBsaWtlIGphdmEtY29ycmV0dG8g4oCUIHdlcmUgdW5hZmZlY3RlZCwgd2hpY2ggbWFza2VkIHRoaXMpLlxuICBjb25zdCBtZXJnZWQgPSBtZXJnZShwbHVnaW4ubWV0YWRhdGEgPz8ge30sIG1ldGFkYXRhID8/IHt9KTtcblxuICAvLyBNYW51YWxBcHByb3ZhbFN0ZXA6IG5vIGNvbW1hbmRzLCBlbnYsIGNvbXB1dGUsIG9yIG5ldHdvcmsg4oCUIGp1c3QgaWQgKyBvcHRpb25hbCBjb21tZW50XG4gIGlmIChwbHVnaW4ucGx1Z2luVHlwZSA9PT0gUGx1Z2luVHlwZS5NQU5VQUxfQVBQUk9WQUxfU1RFUCkge1xuICAgIHJldHVybiBuZXcgTWFudWFsQXBwcm92YWxTdGVwKGlkLCB7XG4gICAgICBjb21tZW50OiB0eXBlb2YgbWVyZ2VkLkFQUFJPVkFMX0NPTU1FTlQgPT09ICdzdHJpbmcnID8gbWVyZ2VkLkFQUFJPVkFMX0NPTU1FTlQgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH1cblxuICBsb2cuZGVidWcoJ1tDcmVhdGVDb2RlQnVpbGRTdGVwXSBCdWlsZGluZyBzdGVwIHdpdGggbWVyZ2VkIG1ldGFkYXRhJyk7XG5cbiAgLy8gV2FybiBhYm91dCByZXF1aXJlZCBzZWNyZXRzIHdpdGhvdXQgb3JnSWQgKGNhbid0IHJlc29sdmUpXG4gIGNvbnN0IHJlcXVpcmVkU2VjcmV0cyA9IHBsdWdpbi5zZWNyZXRzPy5maWx0ZXIocyA9PiBzLnJlcXVpcmVkKSA/PyBbXTtcbiAgaWYgKHJlcXVpcmVkU2VjcmV0cy5sZW5ndGggPiAwICYmICFvcmdJZCkge1xuICAgIGxvZy53YXJuKFxuICAgICAgYFBsdWdpbiBcIiR7cGx1Z2luLm5hbWV9XCIgZGVjbGFyZXMgJHtyZXF1aXJlZFNlY3JldHMubGVuZ3RofSByZXF1aXJlZCBzZWNyZXQocykgYnV0IG5vIG9yZ0lkIGlzIGF2YWlsYWJsZS4gYCArXG4gICAgICBgU2VjcmV0cyB3aWxsIG5vdCBiZSBpbmplY3RlZDogJHtyZXF1aXJlZFNlY3JldHMubWFwKHMgPT4gcy5uYW1lKS5qb2luKCcsICcpfWAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlc29sdmUgcGx1Z2luIHNlY3JldHMgYXMgU0VDUkVUU19NQU5BR0VSIGVudiB2YXJzIOKAlCBvbmx5IFJFUVVJUkVEIG9uZXMuXG4gIC8vIENvZGVCdWlsZCB0cmVhdHMgYSBTRUNSRVRTX01BTkFHRVIgZW52IHZhciBhcyBNQU5EQVRPUlk6IGl0IGZhaWxzIHRoZSBidWlsZFxuICAvLyBhdCBET1dOTE9BRF9TT1VSQ0UgKFwiUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjogY2FuJ3QgZmluZCB0aGUgc3BlY2lmaWVkXG4gIC8vIHNlY3JldFwiKSBpZiB0aGUgc2VjcmV0IGlzIGFic2VudC4gQXV0by13aXJpbmcgYW4gT1BUSU9OQUwgc2VjcmV0XG4gIC8vIChgcmVxdWlyZWQ6IGZhbHNlYCwgZS5nLiBOVkRfQVBJX0tFWSAvIFNFTUdSRVBfQVBQX1RPS0VOKSB0aGUgb3BlcmF0b3IgaGFzbid0XG4gIC8vIGNyZWF0ZWQgd291bGQgdGhlcmVmb3JlIGJyZWFrIGV2ZXJ5IGJ1aWxkIOKAlCB0aGUgZXhhY3Qgb3Bwb3NpdGUgb2YgXCJvcHRpb25hbFwiLlxuICAvLyBPcHRpb25hbCBzZWNyZXRzIGFyZSBsZWZ0IGZvciB0aGUgcGx1Z2luIHRvIHJlYWQgb25seSB3aGVyZSB0aGUgb3BlcmF0b3IgaGFzXG4gIC8vIHByb3Zpc2lvbmVkIHRoZW0gKG91dC1vZi1iYW5kIGVudi9zZWNyZXQpLCBub3QgZm9yY2UtaW5qZWN0ZWQgaGVyZS5cbiAgY29uc3Qgc2VjcmV0RW52VmFycyA9IChyZXF1aXJlZFNlY3JldHMubGVuZ3RoICYmIG9yZ0lkKVxuICAgID8gdG9TZWNyZXRFbnZWYXJzKHJlcXVpcmVkU2VjcmV0cywgb3JnSWQpXG4gICAgOiB7fTtcblxuICBjb25zdCBlbnYgPSBidWlsZEVudihwbHVnaW4sIG1lcmdlZCwgY3VzdG9tRW52KTtcblxuICAvLyBTZWN1cml0eS1yZXBvcnQgdXBsb2FkIChvcHQtaW4pOiBpbmplY3QgdGhlIG9yZydzIHJlcG9ydGluZzppbmdlc3Qtc2NvcGVkXG4gIC8vIGtleSDigJQgbmV2ZXIgdGhlIGZ1bGwgcGxhdGZvcm0gY3JlZGVudGlhbCDigJQgYXMgYSBTRUNSRVRTX01BTkFHRVIgdmFyaWFibGUuXG4gIC8vIENESyBncmFudHMgdGhlIHN0ZXAgcm9sZSByZWFkIG9uIGV4YWN0bHkgdGhhdCBzZWNyZXQuIFNlZSBjb3JlL3NlY3VyaXR5LXJlcG9ydHMudHMuXG4gIGNvbnN0IHJlcG9ydFVwbG9hZCA9IGVudltTRUNVUklUWV9SRVBPUlRfVVBMT0FEX0VOVl0gPT09ICd0cnVlJztcbiAgaWYgKHJlcG9ydFVwbG9hZCAmJiAhb3JnSWQpIHtcbiAgICBsb2cud2FybihgU3RlcCBcIiR7aWR9XCIgc2V0cyAke1NFQ1VSSVRZX1JFUE9SVF9VUExPQURfRU5WfT10cnVlIGJ1dCBubyBvcmdJZCBpcyBhdmFpbGFibGUg4oCUIHRoZSB1cGxvYWQga2V5IGNhbm5vdCBiZSBpbmplY3RlZCBhbmQgdGhlIHVwbG9hZCB3aWxsIGZhaWwuYCk7XG4gIH1cbiAgY29uc3QgcmVwb3J0S2V5RW52VmFyOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiBzdHJpbmc7IHR5cGU6IEJ1aWxkRW52aXJvbm1lbnRWYXJpYWJsZVR5cGUgfT4gPSByZXBvcnRVcGxvYWQgJiYgb3JnSWRcbiAgICA/IHtcbiAgICAgIFtTRUNVUklUWV9SRVBPUlRfS0VZX0VOVl06IHtcbiAgICAgICAgdmFsdWU6IGAke0NvcmVDb25zdGFudHMuc2VjcmV0UGF0aChvcmdJZCwgU0VDVVJJVFlfUkVQT1JUX1NFQ1JFVF9MRUFGKX06cGFzc3dvcmRgLFxuICAgICAgICB0eXBlOiBCdWlsZEVudmlyb25tZW50VmFyaWFibGVUeXBlLlNFQ1JFVFNfTUFOQUdFUixcbiAgICAgIH0sXG4gICAgfVxuICAgIDoge307XG5cbiAgLy8gQ29kZVBpcGVsaW5lIHJlc29sdmVkIHZhcmlhYmxlcyDigJQgbXVzdCBiZSBpbiBDb2RlQnVpbGRTdGVwLmVudiAoYWN0aW9uLWxldmVsKSxcbiAgLy8gbm90IGJ1aWxkRW52aXJvbm1lbnQuZW52aXJvbm1lbnRWYXJpYWJsZXMgKHByb2plY3QtbGV2ZWwpXG4gIGNvbnN0IGFjdGlvbkVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBQSVBFTElORV9FWEVDVVRJT05fSUQ6ICcje2NvZGVwaXBlbGluZS5QaXBlbGluZUV4ZWN1dGlvbklkfScsXG4gIH07XG5cbiAgY29uc3Qgb3V0cHV0RGlyID0gcGx1Z2luLnByaW1hcnlPdXRwdXREaXJlY3Rvcnk7XG4gIGNvbnN0IGVuc3VyZU91dHB1dERpciA9IChvdXRwdXREaXIgJiYgIW91dHB1dERpci5pbmNsdWRlcygnKicpKVxuICAgID8gW2Bta2RpciAtcCBcIiR7b3V0cHV0RGlyfVwiICYmIHRvdWNoIFwiJHtvdXRwdXREaXJ9Ly5naXRrZWVwXCJgXVxuICAgIDogW107XG5cbiAgY29uc3QgeyBpbnN0YWxsQ29tbWFuZHMsIGNvbW1hbmRzIH0gPSBidWlsZENvbW1hbmRzKHBsdWdpbiwge1xuICAgIHByZUluc3RhbGxDb21tYW5kczogWy4uLmVuc3VyZU91dHB1dERpciwgLi4uKHByZUluc3RhbGxDb21tYW5kcyA/PyBbXSldLFxuICAgIHBvc3RJbnN0YWxsQ29tbWFuZHMsXG4gICAgcHJlQ29tbWFuZHMsXG4gICAgcG9zdENvbW1hbmRzLFxuICB9LCBmYWlsdXJlQmVoYXZpb3IpO1xuXG4gIGNvbnN0IHByb2dyYW1tYXRpYyA9IHsgaW5wdXQsIGluc3RhbGxDb21tYW5kcywgY29tbWFuZHMgfTtcblxuICAvLyBSZXNvbHZlIHRoZSBwbHVnaW4ncyBydW50aW1lIGltYWdlLiBDb2RlQnVpbGQgZGVmYXVsdHMgdG9cbiAgLy8gYGF3cy9jb2RlYnVpbGQvc3RhbmRhcmQ6Ny4wYCB3aGVuIG5vIGBidWlsZEltYWdlYCBpcyBzZXQg4oCUIHRoYXQncyB0aGVcbiAgLy8gQVdTLW1hbmFnZWQgVWJ1bnR1IGltYWdlIGFuZCBET0VTIE5PVCBoYXZlIGFueSBwbHVnaW4tYmFrZWQgdG9vbHNcbiAgLy8gKHBpcGVsaW5lLW1hbmFnZXIsIHNueWssIHRlcnJhZm9ybSwgZXRjLikuIFdpcmluZyB0aGUgcGx1Z2luJ3MgaW1hZ2VcbiAgLy8gaGVyZSBtZWFucyBDb2RlQnVpbGQgcHVsbHMgZnJvbSBvdXIgcHJpdmF0ZSByZWdpc3RyeSBhbmQgdGhlIHRvb2xzXG4gIC8vIGluc3RhbGxlZCBpbiB0aGUgcGx1Z2luJ3MgRG9ja2VyZmlsZSBhcmUgYWN0dWFsbHkgYXZhaWxhYmxlLlxuICBjb25zdCBwbHVnaW5CdWlsZEltYWdlID0gcmVzb2x2ZVBsdWdpbkltYWdlKHNjb3BlLCBwbHVnaW4sIG9yZ0lkKTtcblxuICAvLyBTaGVsbFN0ZXAgYnJhbmNoLlxuICAvLyBTaGVsbFN0ZXAgaXRzZWxmIGRvZXNuJ3QgYWNjZXB0IGBidWlsZEVudmlyb25tZW50YC9gYnVpbGRJbWFnZWAuIENES1xuICAvLyBwaXBlbGluZXMgd3JhcHMgU2hlbGxTdGVwcyBpbiBhIGRlZmF1bHQgQ29kZUJ1aWxkIGFjdGlvbiB0aGF0IHJ1bnMgb25cbiAgLy8gYGF3cy9jb2RlYnVpbGQvc3RhbmRhcmQ6Ny4wYCDigJQgd2hpY2ggd29uJ3QgaGF2ZSB0aGUgcGx1Z2luJ3MgdG9vbHMuXG4gIC8vXG4gIC8vIFNvIHdoZW4gYSBTSEVMTF9TVEVQIHBsdWdpbiBET0VTIGhhdmUgYW4gaW1hZ2UgKGJlY2F1c2UgaXRzIGF1dGhvclxuICAvLyBiYWtlZCB0b29scyBpbnRvIGEgRG9ja2VyZmlsZSksIHdlIFBST01PVEUgaXQgdG8gYSBDb2RlQnVpbGRTdGVwIHdpdGhcbiAgLy8gdGhlIHJlc29sdmVkIGltYWdlLiBUaGUgcGx1Z2luIGF1dGhvcidzIGludGVudCAoXCJ1c2UgbXkgYmFrZWQgdG9vbHNcIilcbiAgLy8gaXMgcHJlc2VydmVkIHdpdGhvdXQgZm9yY2luZyB0aGVtIHRvIGNoYW5nZSBwbHVnaW5UeXBlLlxuICAvL1xuICAvLyBXaGVuIHRoZSBwbHVnaW4gaGFzIG5vIGltYWdlIChvciByZWdpc3RyeSBpc24ndCBjb25maWd1cmVkKSwgd2Uga2VlcFxuICAvLyB0aGUgb3JpZ2luYWwgU2hlbGxTdGVwIOKAlCBpdCdzIGxpZ2h0ZXIgd2VpZ2h0IGFuZCB0aGUgZGVmYXVsdFxuICAvLyBDb2RlQnVpbGQgaW1hZ2UgaXMgZmluZS5cbiAgaWYgKHBsdWdpbi5wbHVnaW5UeXBlID09PSBQbHVnaW5UeXBlLlNIRUxMX1NURVApIHtcbiAgICBpZiAoIXBsdWdpbkJ1aWxkSW1hZ2UpIHtcbiAgICAgIHJldHVybiBuZXcgU2hlbGxTdGVwKGlkLCB7XG4gICAgICAgIC4uLnByb2dyYW1tYXRpYyxcbiAgICAgICAgZW52OiB7IC4uLmVudiwgLi4uYWN0aW9uRW52IH0sXG4gICAgICAgIC4uLm1ldGFkYXRhRm9yU2hlbGxTdGVwKG1lcmdlZCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBbQ3JlYXRlQ29kZUJ1aWxkU3RlcF0gU0hFTExfU1RFUCBwbHVnaW4gXCIke3BsdWdpbi5uYW1lfVwiIGhhcyBhIHJlZ2lzdHJ5IGltYWdlIOKAlCBwcm9tb3RpbmcgdG8gQ29kZUJ1aWxkU3RlcCBzbyB0aGUgcGx1Z2luIGltYWdlIGlzIGFjdHVhbGx5IHVzZWRgKTtcbiAgICAvLyBGYWxsIHRocm91Z2ggdG8gdGhlIENvZGVCdWlsZFN0ZXAgcGF0aCBiZWxvdy5cbiAgfVxuXG4gIGNvbnN0IGNvbXB1dGVUeXBlID0gZ2V0Q29tcHV0ZVR5cGUoXG4gICAgcGx1Z2luLmNvbXB1dGVUeXBlID8/IG9wdGlvbnMuZGVmYXVsdENvbXB1dGVUeXBlID8/ICdTTUFMTCcsXG4gICk7XG5cbiAgLy8gU3RlcCBuZXR3b3JrOiBleHBsaWNpdCBzdGVwIGNvbmZpZyB3aW5zLCBlbHNlIHRoaXMgc3RlcCdzIGBlYzI6bmV0d29ya2AgbWV0YWRhdGEuXG4gIGNvbnN0IHJlc29sdmVkTmV0d29yayA9IG5ldHdvcmsgPz8gbmV0d29ya0NvbmZpZ0Zyb21NZXRhZGF0YShtZXJnZWQpO1xuICBjb25zdCBuZXR3b3JrUHJvcHMgPSByZXNvbHZlZE5ldHdvcmtcbiAgICA/IHJlc29sdmVOZXR3b3JrKHNjb3BlLCBvcHRpb25zLnVuaXF1ZUlkLCByZXNvbHZlZE5ldHdvcmspXG4gICAgOiB7fTtcblxuICAvLyBNZXRhZGF0YSBzcHJlYWQgbGFzdCBzbyBpdCBjYW4gb3ZlcnJpZGUgcHJvZ3JhbW1hdGljIGRlZmF1bHRzLlxuICAvLyBOT1RFOiBDYWNoaW5nIGlzIHN1cHBvcnRlZCB2aWEgdHdvIG1ldGFkYXRhIHBhdGhzOlxuICAvLyAgIDEuIE1ldGFkYXRhS2V5cy5DQUNIRSAoJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVidWlsZHN0ZXA6Y2FjaGUnKSDigJQgcGFzc2VkIGRpcmVjdGx5XG4gIC8vICAgICAgYXMgdGhlIENvZGVCdWlsZFN0ZXAgYGNhY2hlYCBwcm9wIChleHBlY3RzIGEgY29kZWJ1aWxkLkNhY2hlIG9iamVjdCkuXG4gIC8vICAgMi4gTWV0YWRhdGFLZXlzLlBBUlRJQUxfQlVJTERfU1BFQyAoJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVidWlsZHN0ZXA6cGFydGlhbGJ1aWxkc3BlYycpXG4gIC8vICAgICAg4oCUIHBhc3NlZCBhcyBgcGFydGlhbEJ1aWxkU3BlY2AsIHdoaWNoIGNhbiBpbmNsdWRlIGEgYGNhY2hlOmAgc2VjdGlvbiBmb3JcbiAgLy8gICAgICBTMyBvciBsb2NhbCBjYWNoaW5nIChlLmcuLCBCdWlsZFNwZWMuZnJvbU9iamVjdCh7IGNhY2hlOiB7IHBhdGhzOiBbLi4uXSB9IH0pKS5cbiAgLy8gUGVyLXN0ZXAgYnVpbGRFbnZpcm9ubWVudCBvdmVycmlkZXMgZnJvbSBtZXRhZGF0YSAoYXdzOmNkazpjb2RlYnVpbGQ6YnVpbGRlbnZpcm9ubWVudDoqKS5cbiAgLy8gQSBtZXRhZGF0YS1wcm92aWRlZCBjb21wdXRlVHlwZSBpcyBhIHJhdyBwYXNzdGhyb3VnaCwgc28gbm9ybWFsaXplIGl0IHRocm91Z2hcbiAgLy8gZ2V0Q29tcHV0ZVR5cGUg4oCUIG90aGVyd2lzZSBhIGZyaWVuZGx5IHZhbHVlIGxpa2UgXCJMQVJHRVwiIHJlYWNoZXMgQ29kZUJ1aWxkIHZlcmJhdGltXG4gIC8vIGFuZCBmYWlscyB3aXRoIFwiSW52YWxpZCBjb21wdXRlIHR5cGUgcHJvdmlkZWRcIiAoaXQgbmVlZHMgQlVJTERfR0VORVJBTDFfTEFSR0UpLlxuICBjb25zdCByYXdNZXRhQnVpbGRFbnYgPSBtZXRhZGF0YUZvckJ1aWxkRW52aXJvbm1lbnQobWVyZ2VkKTtcbiAgY29uc3QgbWV0YUJ1aWxkRW52ID0gdHlwZW9mIHJhd01ldGFCdWlsZEVudi5jb21wdXRlVHlwZSA9PT0gJ3N0cmluZydcbiAgICA/IHsgLi4ucmF3TWV0YUJ1aWxkRW52LCBjb21wdXRlVHlwZTogZ2V0Q29tcHV0ZVR5cGUocmF3TWV0YUJ1aWxkRW52LmNvbXB1dGVUeXBlKSB9XG4gICAgOiByYXdNZXRhQnVpbGRFbnY7XG5cbiAgY29uc3Qgc3RlcCA9IG5ldyBDb2RlQnVpbGRTdGVwKGlkLCB7XG4gICAgLi4ucHJvZ3JhbW1hdGljLFxuICAgIC4uLm5ldHdvcmtQcm9wcyxcbiAgICAuLi4oYWRkaXRpb25hbElucHV0cyAmJiB7IGFkZGl0aW9uYWxJbnB1dHMgfSksXG4gICAgLi4uKHRpbWVvdXQgJiYgeyB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKHRpbWVvdXQpIH0pLFxuICAgIGVudjogYWN0aW9uRW52LFxuICAgIHByaW1hcnlPdXRwdXREaXJlY3Rvcnk6IHBsdWdpbi5wcmltYXJ5T3V0cHV0RGlyZWN0b3J5ID8/IHVuZGVmaW5lZCxcbiAgICAvLyBQaW4gdGhlIGJ1aWxkc3BlYyBzaGVsbCB0byBQT1NJWCAvYmluL3NoIHNvIGV4ZWN1dGlvbiBpcyBpZGVudGljYWwgdG9cbiAgICAvLyBDb2RlQnVpbGQncyBkZWZhdWx0IGFuZCBwb3J0YWJsZSBhY3Jvc3MgbWluaW1hbCBiYXNlIGltYWdlcyAobm8gYmFzaFxuICAgIC8vIGRlcGVuZGVuY3kpLiBQbHVnaW4gc3BlY3MgYXJlIGF1dGhvcmVkIFBPU0lYLWNsZWFuIHRvIG1hdGNoIOKAlCBubyBiYXNoLW9ubHlcbiAgICAvLyBgW1sgXV1gLCBhcnJheXMsIGByZWFkIC1yYSA8PDxgLCBvciBgc291cmNlYC9gbnZtIHVzZWAvYHNkayB1c2VgLiBBXG4gICAgLy8gcGx1Z2luLXN1cHBsaWVkIHBhcnRpYWxCdWlsZFNwZWMgKG5vbmUgdG9kYXkpIHdvdWxkIG92ZXJyaWRlIHRoaXMgdmlhIHRoZVxuICAgIC8vIG1ldGFkYXRhIHNwcmVhZCBiZWxvdyBhbmQgbXVzdCB0aGVuIHNldCBgZW52LnNoZWxsYCBpdHNlbGYuXG4gICAgcGFydGlhbEJ1aWxkU3BlYzogQnVpbGRTcGVjLmZyb21PYmplY3QoeyBlbnY6IHsgc2hlbGw6ICcvYmluL3NoJyB9IH0pLFxuICAgIGJ1aWxkRW52aXJvbm1lbnQ6IHtcbiAgICAgIGNvbXB1dGVUeXBlLFxuICAgICAgYnVpbGRJbWFnZTogcGx1Z2luQnVpbGRJbWFnZSA/PyByZXNvbHZlRGVmYXVsdEJ1aWxkSW1hZ2Uoc2NvcGUsIG9yZ0lkKSxcbiAgICAgIGVudmlyb25tZW50VmFyaWFibGVzOiB7XG4gICAgICAgIC4uLnRvQ29kZUJ1aWxkRW52VmFycyhlbnYpLFxuICAgICAgICAuLi5zZWNyZXRFbnZWYXJzLFxuICAgICAgICAuLi5yZXBvcnRLZXlFbnZWYXIsXG4gICAgICB9LFxuICAgICAgLi4ubWV0YUJ1aWxkRW52LFxuICAgIH0sXG4gICAgLi4ubWV0YWRhdGFGb3JDb2RlQnVpbGRTdGVwKG1lcmdlZCksXG4gIH0pO1xuXG4gIC8vIFJlZ2lzdGVyIHdpdGggYXJ0aWZhY3QgbWFuYWdlciBpZiBwcmltYXJ5T3V0cHV0RGlyZWN0b3J5IGlzIHNldFxuICBpZiAocGx1Z2luLnByaW1hcnlPdXRwdXREaXJlY3RvcnkgJiYgYXJ0aWZhY3RNYW5hZ2VyICYmIHN0YWdlTmFtZSkge1xuICAgIGNvbnN0IGFydGlmYWN0S2V5OiBBcnRpZmFjdEtleSA9IHtcbiAgICAgIHN0YWdlTmFtZSxcbiAgICAgIHN0YWdlQWxpYXM6IHN0YWdlQWxpYXMgPz8gYCR7c3RhZ2VOYW1lfS1hbGlhc2AsXG4gICAgICBwbHVnaW5OYW1lOiBwbHVnaW4ubmFtZSxcbiAgICAgIHBsdWdpbkFsaWFzOiBwbHVnaW5BbGlhcyA/PyBwbHVnaW5BcnRpZmFjdEFsaWFzKHBsdWdpbiksXG4gICAgICBvdXRwdXREaXJlY3Rvcnk6IHBsdWdpbi5wcmltYXJ5T3V0cHV0RGlyZWN0b3J5LFxuICAgIH07XG4gICAgYXJ0aWZhY3RNYW5hZ2VyLmFkZChhcnRpZmFjdEtleSwgc3RlcCk7XG4gIH1cblxuICByZXR1cm4gc3RlcDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IHN0cmluZyBvciBDb21wdXRlVHlwZSBlbnVtIHRvIENESyBDb21wdXRlVHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcHV0ZVR5cGUoaW5wdXQ6IHN0cmluZyB8IENES0NvbXB1dGVUeXBlID0gJ1NNQUxMJyk6IENES0NvbXB1dGVUeXBlIHtcbiAgLy8gSWYgYWxyZWFkeSBhIENESyBDb21wdXRlVHlwZSwgcmV0dXJuIGFzLWlzXG4gIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG5cbiAgLy8gQWxyZWFkeSBhIG5hdGl2ZSBDb2RlQnVpbGQgQ29tcHV0ZVR5cGUgKGUuZy4gXCJCVUlMRF9HRU5FUkFMMV9MQVJHRVwiKT8gQWNjZXB0IGFzLWlzXG4gIC8vIHNvIGJvdGggZnJpZW5kbHkgKExBUkdFKSBhbmQgbmF0aXZlIHZhbHVlcyByb3VuZC10cmlwIHdpdGhvdXQgZmFsbGluZyBiYWNrIHRvIFNNQUxMLlxuICBpZiAoKE9iamVjdC52YWx1ZXMoQ0RLQ29tcHV0ZVR5cGUpIGFzIHN0cmluZ1tdKS5pbmNsdWRlcyhpbnB1dCkpIHtcbiAgICByZXR1cm4gaW5wdXQgYXMgQ0RLQ29tcHV0ZVR5cGU7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkID0gaW5wdXQudG9VcHBlckNhc2UoKSBhcyBDb21wdXRlVHlwZTtcblxuICBjb25zdCBtYXBwaW5nOiBSZWNvcmQ8Q29tcHV0ZVR5cGUsIENES0NvbXB1dGVUeXBlPiA9IHtcbiAgICBbQ29tcHV0ZVR5cGUuU01BTExdOiBDREtDb21wdXRlVHlwZS5TTUFMTCxcbiAgICBbQ29tcHV0ZVR5cGUuTUVESVVNXTogQ0RLQ29tcHV0ZVR5cGUuTUVESVVNLFxuICAgIFtDb21wdXRlVHlwZS5MQVJHRV06IENES0NvbXB1dGVUeXBlLkxBUkdFLFxuICAgIFtDb21wdXRlVHlwZS5YMl9MQVJHRV06IENES0NvbXB1dGVUeXBlLlgyX0xBUkdFLFxuICB9O1xuXG4gIGNvbnN0IHJlc3VsdCA9IG1hcHBpbmdbbm9ybWFsaXplZF07XG4gIGlmICghcmVzdWx0KSB7XG4gICAgbG9nLndhcm4oYFVua25vd24gY29tcHV0ZSB0eXBlIFwiJHtpbnB1dH1cIiwgZmFsbGluZyBiYWNrIHRvIFNNQUxMYCk7XG4gICAgcmV0dXJuIENES0NvbXB1dGVUeXBlLlNNQUxMO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVW53cmFwIGEgU2VjcmV0VmFsdWUgfCBzdHJpbmcgaW50byBhIHBsYWluIHN0cmluZy5cbiAqIFdoZW4gYSBTZWNyZXRWYWx1ZSBpcyBwcm92aWRlZCAoZS5nLiBmcm9tIFNlY3JldHMgTWFuYWdlciksIGNhbGxzIHVuc2FmZVVud3JhcCgpXG4gKiB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW53cmFwU2VjcmV0KHZhbHVlOiBTZWNyZXRWYWx1ZSB8IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiB2YWx1ZS51bnNhZmVVbndyYXAoKTtcbn1cbiJdfQ==
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The credential a self-mutating synth registers its step manifest with
3
+ * (`POST /api/pipelines/registry`).
4
+ *
5
+ * Not the org's `platform` secret: that key reads pipelines and plugins and
6
+ * nothing else (the Pipeline Automation Role). Registration needs
7
+ * `pipeline_registry:write`, which only the `pipeline-register` service account
8
+ * holds — minted by `pipeline-manager infra store-token --scope
9
+ * pipeline_registry:write` and stored at `<prefix>/<orgId>/pipeline-registry-write`.
10
+ *
11
+ * The synth CodeBuild project gets the secret's NAME as a plain variable, never
12
+ * the value as a SECRETS_MANAGER one: CodeBuild fails a build at DOWNLOAD_SOURCE
13
+ * when a SECRETS_MANAGER variable names a missing secret, and a missing
14
+ * registration key must skip the registration (loudly), not break every build.
15
+ * The synth reads the secret itself with the AWS SDK, so the project role is
16
+ * granted `GetSecretValue` on exactly that secret.
17
+ *
18
+ * Dependency-free so the CLI and the synth share the names.
19
+ */
20
+ /** The capability the registration key carries (its key-scope name in `store-token`). */
21
+ export declare const PIPELINE_REGISTRATION_CAPABILITY = "pipeline_registry:write";
22
+ /** Secrets Manager leaf of the registration key (`scopeSecretLeaf('pipeline_registry:write')`). */
23
+ export declare const PIPELINE_REGISTRATION_SECRET_LEAF = "pipeline-registry-write";
24
+ /** Env var the synth CodeBuild project carries the registration secret's NAME in. */
25
+ export declare const PIPELINE_REGISTRATION_SECRET_ENV = "PIPELINE_REGISTRATION_SECRET_NAME";
@@ -0,0 +1,28 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * The credential a self-mutating synth registers its step manifest with
5
+ * (`POST /api/pipelines/registry`).
6
+ *
7
+ * Not the org's `platform` secret: that key reads pipelines and plugins and
8
+ * nothing else (the Pipeline Automation Role). Registration needs
9
+ * `pipeline_registry:write`, which only the `pipeline-register` service account
10
+ * holds — minted by `pipeline-manager infra store-token --scope
11
+ * pipeline_registry:write` and stored at `<prefix>/<orgId>/pipeline-registry-write`.
12
+ *
13
+ * The synth CodeBuild project gets the secret's NAME as a plain variable, never
14
+ * the value as a SECRETS_MANAGER one: CodeBuild fails a build at DOWNLOAD_SOURCE
15
+ * when a SECRETS_MANAGER variable names a missing secret, and a missing
16
+ * registration key must skip the registration (loudly), not break every build.
17
+ * The synth reads the secret itself with the AWS SDK, so the project role is
18
+ * granted `GetSecretValue` on exactly that secret.
19
+ *
20
+ * Dependency-free so the CLI and the synth share the names.
21
+ */
22
+ /** The capability the registration key carries (its key-scope name in `store-token`). */
23
+ export const PIPELINE_REGISTRATION_CAPABILITY = 'pipeline_registry:write';
24
+ /** Secrets Manager leaf of the registration key (`scopeSecretLeaf('pipeline_registry:write')`). */
25
+ export const PIPELINE_REGISTRATION_SECRET_LEAF = 'pipeline-registry-write';
26
+ /** Env var the synth CodeBuild project carries the registration secret's NAME in. */
27
+ export const PIPELINE_REGISTRATION_SECRET_ENV = 'PIPELINE_REGISTRATION_SECRET_NAME';
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtcmVnaXN0cmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvcGlwZWxpbmUtcmVnaXN0cmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUVILHlGQUF5RjtBQUN6RixNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyx5QkFBeUIsQ0FBQztBQUUxRSxtR0FBbUc7QUFDbkcsTUFBTSxDQUFDLE1BQU0saUNBQWlDLEdBQUcseUJBQXlCLENBQUM7QUFFM0UscUZBQXFGO0FBQ3JGLE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUFHLG1DQUFtQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogVGhlIGNyZWRlbnRpYWwgYSBzZWxmLW11dGF0aW5nIHN5bnRoIHJlZ2lzdGVycyBpdHMgc3RlcCBtYW5pZmVzdCB3aXRoXG4gKiAoYFBPU1QgL2FwaS9waXBlbGluZXMvcmVnaXN0cnlgKS5cbiAqXG4gKiBOb3QgdGhlIG9yZydzIGBwbGF0Zm9ybWAgc2VjcmV0OiB0aGF0IGtleSByZWFkcyBwaXBlbGluZXMgYW5kIHBsdWdpbnMgYW5kXG4gKiBub3RoaW5nIGVsc2UgKHRoZSBQaXBlbGluZSBBdXRvbWF0aW9uIFJvbGUpLiBSZWdpc3RyYXRpb24gbmVlZHNcbiAqIGBwaXBlbGluZV9yZWdpc3RyeTp3cml0ZWAsIHdoaWNoIG9ubHkgdGhlIGBwaXBlbGluZS1yZWdpc3RlcmAgc2VydmljZSBhY2NvdW50XG4gKiBob2xkcyDigJQgbWludGVkIGJ5IGBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tc2NvcGVcbiAqIHBpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlYCBhbmQgc3RvcmVkIGF0IGA8cHJlZml4Pi88b3JnSWQ+L3BpcGVsaW5lLXJlZ2lzdHJ5LXdyaXRlYC5cbiAqXG4gKiBUaGUgc3ludGggQ29kZUJ1aWxkIHByb2plY3QgZ2V0cyB0aGUgc2VjcmV0J3MgTkFNRSBhcyBhIHBsYWluIHZhcmlhYmxlLCBuZXZlclxuICogdGhlIHZhbHVlIGFzIGEgU0VDUkVUU19NQU5BR0VSIG9uZTogQ29kZUJ1aWxkIGZhaWxzIGEgYnVpbGQgYXQgRE9XTkxPQURfU09VUkNFXG4gKiB3aGVuIGEgU0VDUkVUU19NQU5BR0VSIHZhcmlhYmxlIG5hbWVzIGEgbWlzc2luZyBzZWNyZXQsIGFuZCBhIG1pc3NpbmdcbiAqIHJlZ2lzdHJhdGlvbiBrZXkgbXVzdCBza2lwIHRoZSByZWdpc3RyYXRpb24gKGxvdWRseSksIG5vdCBicmVhayBldmVyeSBidWlsZC5cbiAqIFRoZSBzeW50aCByZWFkcyB0aGUgc2VjcmV0IGl0c2VsZiB3aXRoIHRoZSBBV1MgU0RLLCBzbyB0aGUgcHJvamVjdCByb2xlIGlzXG4gKiBncmFudGVkIGBHZXRTZWNyZXRWYWx1ZWAgb24gZXhhY3RseSB0aGF0IHNlY3JldC5cbiAqXG4gKiBEZXBlbmRlbmN5LWZyZWUgc28gdGhlIENMSSBhbmQgdGhlIHN5bnRoIHNoYXJlIHRoZSBuYW1lcy5cbiAqL1xuXG4vKiogVGhlIGNhcGFiaWxpdHkgdGhlIHJlZ2lzdHJhdGlvbiBrZXkgY2FycmllcyAoaXRzIGtleS1zY29wZSBuYW1lIGluIGBzdG9yZS10b2tlbmApLiAqL1xuZXhwb3J0IGNvbnN0IFBJUEVMSU5FX1JFR0lTVFJBVElPTl9DQVBBQklMSVRZID0gJ3BpcGVsaW5lX3JlZ2lzdHJ5OndyaXRlJztcblxuLyoqIFNlY3JldHMgTWFuYWdlciBsZWFmIG9mIHRoZSByZWdpc3RyYXRpb24ga2V5IChgc2NvcGVTZWNyZXRMZWFmKCdwaXBlbGluZV9yZWdpc3RyeTp3cml0ZScpYCkuICovXG5leHBvcnQgY29uc3QgUElQRUxJTkVfUkVHSVNUUkFUSU9OX1NFQ1JFVF9MRUFGID0gJ3BpcGVsaW5lLXJlZ2lzdHJ5LXdyaXRlJztcblxuLyoqIEVudiB2YXIgdGhlIHN5bnRoIENvZGVCdWlsZCBwcm9qZWN0IGNhcnJpZXMgdGhlIHJlZ2lzdHJhdGlvbiBzZWNyZXQncyBOQU1FIGluLiAqL1xuZXhwb3J0IGNvbnN0IFBJUEVMSU5FX1JFR0lTVFJBVElPTl9TRUNSRVRfRU5WID0gJ1BJUEVMSU5FX1JFR0lTVFJBVElPTl9TRUNSRVRfTkFNRSc7XG4iXX0=
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Trusting a platform that presents a certificate from a PRIVATE CA, without
3
+ * turning verification off.
4
+ *
5
+ * `PLATFORM_CA_BUNDLE` holds the PEM text of the CA (chain). Set where
6
+ * `pipeline-manager pipeline synth/deploy` runs, it is (1) trusted by the CLI's
7
+ * own API client, (2) propagated by the synth into every CodeBuild step's
8
+ * environment — so the self-mutating synth's plugin lookup verifies against it
9
+ * — and (3) into the plugin-lookup Lambda's environment. PEM text rather than a
10
+ * path because none of those three share a filesystem.
11
+ *
12
+ * Dependency-free so the plugin-lookup Lambda can bundle it.
13
+ */
14
+ export declare const PLATFORM_CA_BUNDLE_ENV = "PLATFORM_CA_BUNDLE";
15
+ /** The configured bundle (PEM text), or undefined. Refuses a value that holds no certificate. */
16
+ export declare function platformCaBundle(env?: NodeJS.ProcessEnv): string | undefined;
17
+ /**
18
+ * The CA list for an `https.Agent` when a bundle is configured: Node's roots,
19
+ * the `NODE_EXTRA_CA_CERTS` file (an explicit `ca` replaces the default store,
20
+ * which is where Node would otherwise have put it) and the bundle. Undefined
21
+ * when no bundle is set — keep Node's default store untouched then.
22
+ */
23
+ export declare function platformCaList(env?: NodeJS.ProcessEnv): string[] | undefined;
24
+ /**
25
+ * `PLATFORM_TLS_VERIFY` — the one knob for whether the pipeline verifies the
26
+ * platform's certificate. `true` (default) verifies; `false` is for a dev
27
+ * platform on a self-signed certificate with no CA to hand out (prefer
28
+ * {@link PLATFORM_CA_BUNDLE_ENV}, which keeps verification ON).
29
+ *
30
+ * Read at synth time and carried into the pipeline, where `false`:
31
+ * - appends `--no-verify-ssl` to the self-mutating synth's bootstrap command,
32
+ * - sets `NODE_TLS_REJECT_UNAUTHORIZED=0` (and this knob) on every CodeBuild
33
+ * step and on the plugin-lookup Lambda.
34
+ * The CLI still refuses an unverified connection that carries credentials when
35
+ * `NODE_ENV=production`, so the knob cannot quietly reach a production run.
36
+ *
37
+ * `NODE_TLS_REJECT_UNAUTHORIZED=0` already in the synth's environment means the
38
+ * same thing — the operator has turned verification off for this process — so
39
+ * it is honoured as `false` rather than silently ignored.
40
+ */
41
+ export declare const PLATFORM_TLS_VERIFY_ENV = "PLATFORM_TLS_VERIFY";
42
+ /** Whether the platform certificate is verified. Refuses a value other than `true`/`false`. */
43
+ export declare function platformTlsVerify(env?: NodeJS.ProcessEnv): boolean;
@@ -0,0 +1,70 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { readFileSync } from 'fs';
4
+ import { rootCertificates } from 'tls';
5
+ /**
6
+ * Trusting a platform that presents a certificate from a PRIVATE CA, without
7
+ * turning verification off.
8
+ *
9
+ * `PLATFORM_CA_BUNDLE` holds the PEM text of the CA (chain). Set where
10
+ * `pipeline-manager pipeline synth/deploy` runs, it is (1) trusted by the CLI's
11
+ * own API client, (2) propagated by the synth into every CodeBuild step's
12
+ * environment — so the self-mutating synth's plugin lookup verifies against it
13
+ * — and (3) into the plugin-lookup Lambda's environment. PEM text rather than a
14
+ * path because none of those three share a filesystem.
15
+ *
16
+ * Dependency-free so the plugin-lookup Lambda can bundle it.
17
+ */
18
+ export const PLATFORM_CA_BUNDLE_ENV = 'PLATFORM_CA_BUNDLE';
19
+ /** The configured bundle (PEM text), or undefined. Refuses a value that holds no certificate. */
20
+ export function platformCaBundle(env = process.env) {
21
+ const pem = env[PLATFORM_CA_BUNDLE_ENV]?.trim();
22
+ if (!pem)
23
+ return undefined;
24
+ if (!pem.includes('-----BEGIN CERTIFICATE-----')) {
25
+ throw new Error(`${PLATFORM_CA_BUNDLE_ENV} is set but holds no PEM certificate (expected "-----BEGIN CERTIFICATE-----")`);
26
+ }
27
+ return pem;
28
+ }
29
+ /**
30
+ * The CA list for an `https.Agent` when a bundle is configured: Node's roots,
31
+ * the `NODE_EXTRA_CA_CERTS` file (an explicit `ca` replaces the default store,
32
+ * which is where Node would otherwise have put it) and the bundle. Undefined
33
+ * when no bundle is set — keep Node's default store untouched then.
34
+ */
35
+ export function platformCaList(env = process.env) {
36
+ const bundle = platformCaBundle(env);
37
+ if (!bundle)
38
+ return undefined;
39
+ const extra = env.NODE_EXTRA_CA_CERTS ? readFileSync(env.NODE_EXTRA_CA_CERTS, 'utf8') : undefined;
40
+ return [...rootCertificates, ...(extra ? [extra] : []), bundle];
41
+ }
42
+ /**
43
+ * `PLATFORM_TLS_VERIFY` — the one knob for whether the pipeline verifies the
44
+ * platform's certificate. `true` (default) verifies; `false` is for a dev
45
+ * platform on a self-signed certificate with no CA to hand out (prefer
46
+ * {@link PLATFORM_CA_BUNDLE_ENV}, which keeps verification ON).
47
+ *
48
+ * Read at synth time and carried into the pipeline, where `false`:
49
+ * - appends `--no-verify-ssl` to the self-mutating synth's bootstrap command,
50
+ * - sets `NODE_TLS_REJECT_UNAUTHORIZED=0` (and this knob) on every CodeBuild
51
+ * step and on the plugin-lookup Lambda.
52
+ * The CLI still refuses an unverified connection that carries credentials when
53
+ * `NODE_ENV=production`, so the knob cannot quietly reach a production run.
54
+ *
55
+ * `NODE_TLS_REJECT_UNAUTHORIZED=0` already in the synth's environment means the
56
+ * same thing — the operator has turned verification off for this process — so
57
+ * it is honoured as `false` rather than silently ignored.
58
+ */
59
+ export const PLATFORM_TLS_VERIFY_ENV = 'PLATFORM_TLS_VERIFY';
60
+ /** Whether the platform certificate is verified. Refuses a value other than `true`/`false`. */
61
+ export function platformTlsVerify(env = process.env) {
62
+ const raw = env[PLATFORM_TLS_VERIFY_ENV]?.trim().toLowerCase();
63
+ if (raw !== undefined && raw !== '' && raw !== 'true' && raw !== 'false') {
64
+ throw new Error(`${PLATFORM_TLS_VERIFY_ENV} must be "true" or "false" (got "${env[PLATFORM_TLS_VERIFY_ENV]}")`);
65
+ }
66
+ if (raw === 'false')
67
+ return false;
68
+ return env.NODE_TLS_REJECT_UNAUTHORIZED !== '0';
69
+ }
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0tdGxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcmUvcGxhdGZvcm0tdGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQztBQUNsQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFdkM7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsb0JBQW9CLENBQUM7QUFFM0QsaUdBQWlHO0FBQ2pHLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxHQUFHLEdBQXNCLE9BQU8sQ0FBQyxHQUFHO0lBQ25FLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2hELElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsNkJBQTZCLENBQUMsRUFBRSxDQUFDO1FBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxzQkFBc0IsK0VBQStFLENBQUMsQ0FBQztJQUM1SCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQUcsR0FBc0IsT0FBTyxDQUFDLEdBQUc7SUFDakUsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM5QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNsRyxPQUFPLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxxQkFBcUIsQ0FBQztBQUU3RCwrRkFBK0Y7QUFDL0YsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEdBQUcsR0FBc0IsT0FBTyxDQUFDLEdBQUc7SUFDcEUsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDL0QsSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxFQUFFLElBQUksR0FBRyxLQUFLLE1BQU0sSUFBSSxHQUFHLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDekUsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLHVCQUF1QixvQ0FBb0MsR0FBRyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xILENBQUM7SUFDRCxJQUFJLEdBQUcsS0FBSyxPQUFPO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDbEMsT0FBTyxHQUFHLENBQUMsNEJBQTRCLEtBQUssR0FBRyxDQUFDO0FBQ2xELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgcm9vdENlcnRpZmljYXRlcyB9IGZyb20gJ3Rscyc7XG5cbi8qKlxuICogVHJ1c3RpbmcgYSBwbGF0Zm9ybSB0aGF0IHByZXNlbnRzIGEgY2VydGlmaWNhdGUgZnJvbSBhIFBSSVZBVEUgQ0EsIHdpdGhvdXRcbiAqIHR1cm5pbmcgdmVyaWZpY2F0aW9uIG9mZi5cbiAqXG4gKiBgUExBVEZPUk1fQ0FfQlVORExFYCBob2xkcyB0aGUgUEVNIHRleHQgb2YgdGhlIENBIChjaGFpbikuIFNldCB3aGVyZVxuICogYHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgc3ludGgvZGVwbG95YCBydW5zLCBpdCBpcyAoMSkgdHJ1c3RlZCBieSB0aGUgQ0xJJ3NcbiAqIG93biBBUEkgY2xpZW50LCAoMikgcHJvcGFnYXRlZCBieSB0aGUgc3ludGggaW50byBldmVyeSBDb2RlQnVpbGQgc3RlcCdzXG4gKiBlbnZpcm9ubWVudCDigJQgc28gdGhlIHNlbGYtbXV0YXRpbmcgc3ludGgncyBwbHVnaW4gbG9va3VwIHZlcmlmaWVzIGFnYWluc3QgaXRcbiAqIOKAlCBhbmQgKDMpIGludG8gdGhlIHBsdWdpbi1sb29rdXAgTGFtYmRhJ3MgZW52aXJvbm1lbnQuIFBFTSB0ZXh0IHJhdGhlciB0aGFuIGFcbiAqIHBhdGggYmVjYXVzZSBub25lIG9mIHRob3NlIHRocmVlIHNoYXJlIGEgZmlsZXN5c3RlbS5cbiAqXG4gKiBEZXBlbmRlbmN5LWZyZWUgc28gdGhlIHBsdWdpbi1sb29rdXAgTGFtYmRhIGNhbiBidW5kbGUgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFURk9STV9DQV9CVU5ETEVfRU5WID0gJ1BMQVRGT1JNX0NBX0JVTkRMRSc7XG5cbi8qKiBUaGUgY29uZmlndXJlZCBidW5kbGUgKFBFTSB0ZXh0KSwgb3IgdW5kZWZpbmVkLiBSZWZ1c2VzIGEgdmFsdWUgdGhhdCBob2xkcyBubyBjZXJ0aWZpY2F0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbGF0Zm9ybUNhQnVuZGxlKGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSBwcm9jZXNzLmVudik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBlbSA9IGVudltQTEFURk9STV9DQV9CVU5ETEVfRU5WXT8udHJpbSgpO1xuICBpZiAoIXBlbSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFwZW0uaW5jbHVkZXMoJy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLScpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke1BMQVRGT1JNX0NBX0JVTkRMRV9FTlZ9IGlzIHNldCBidXQgaG9sZHMgbm8gUEVNIGNlcnRpZmljYXRlIChleHBlY3RlZCBcIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVwiKWApO1xuICB9XG4gIHJldHVybiBwZW07XG59XG5cbi8qKlxuICogVGhlIENBIGxpc3QgZm9yIGFuIGBodHRwcy5BZ2VudGAgd2hlbiBhIGJ1bmRsZSBpcyBjb25maWd1cmVkOiBOb2RlJ3Mgcm9vdHMsXG4gKiB0aGUgYE5PREVfRVhUUkFfQ0FfQ0VSVFNgIGZpbGUgKGFuIGV4cGxpY2l0IGBjYWAgcmVwbGFjZXMgdGhlIGRlZmF1bHQgc3RvcmUsXG4gKiB3aGljaCBpcyB3aGVyZSBOb2RlIHdvdWxkIG90aGVyd2lzZSBoYXZlIHB1dCBpdCkgYW5kIHRoZSBidW5kbGUuIFVuZGVmaW5lZFxuICogd2hlbiBubyBidW5kbGUgaXMgc2V0IOKAlCBrZWVwIE5vZGUncyBkZWZhdWx0IHN0b3JlIHVudG91Y2hlZCB0aGVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGxhdGZvcm1DYUxpc3QoZW52OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHByb2Nlc3MuZW52KTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBidW5kbGUgPSBwbGF0Zm9ybUNhQnVuZGxlKGVudik7XG4gIGlmICghYnVuZGxlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBleHRyYSA9IGVudi5OT0RFX0VYVFJBX0NBX0NFUlRTID8gcmVhZEZpbGVTeW5jKGVudi5OT0RFX0VYVFJBX0NBX0NFUlRTLCAndXRmOCcpIDogdW5kZWZpbmVkO1xuICByZXR1cm4gWy4uLnJvb3RDZXJ0aWZpY2F0ZXMsIC4uLihleHRyYSA/IFtleHRyYV0gOiBbXSksIGJ1bmRsZV07XG59XG5cbi8qKlxuICogYFBMQVRGT1JNX1RMU19WRVJJRllgIOKAlCB0aGUgb25lIGtub2IgZm9yIHdoZXRoZXIgdGhlIHBpcGVsaW5lIHZlcmlmaWVzIHRoZVxuICogcGxhdGZvcm0ncyBjZXJ0aWZpY2F0ZS4gYHRydWVgIChkZWZhdWx0KSB2ZXJpZmllczsgYGZhbHNlYCBpcyBmb3IgYSBkZXZcbiAqIHBsYXRmb3JtIG9uIGEgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgd2l0aCBubyBDQSB0byBoYW5kIG91dCAocHJlZmVyXG4gKiB7QGxpbmsgUExBVEZPUk1fQ0FfQlVORExFX0VOVn0sIHdoaWNoIGtlZXBzIHZlcmlmaWNhdGlvbiBPTikuXG4gKlxuICogUmVhZCBhdCBzeW50aCB0aW1lIGFuZCBjYXJyaWVkIGludG8gdGhlIHBpcGVsaW5lLCB3aGVyZSBgZmFsc2VgOlxuICogICAtIGFwcGVuZHMgYC0tbm8tdmVyaWZ5LXNzbGAgdG8gdGhlIHNlbGYtbXV0YXRpbmcgc3ludGgncyBib290c3RyYXAgY29tbWFuZCxcbiAqICAgLSBzZXRzIGBOT0RFX1RMU19SRUpFQ1RfVU5BVVRIT1JJWkVEPTBgIChhbmQgdGhpcyBrbm9iKSBvbiBldmVyeSBDb2RlQnVpbGRcbiAqICAgICBzdGVwIGFuZCBvbiB0aGUgcGx1Z2luLWxvb2t1cCBMYW1iZGEuXG4gKiBUaGUgQ0xJIHN0aWxsIHJlZnVzZXMgYW4gdW52ZXJpZmllZCBjb25uZWN0aW9uIHRoYXQgY2FycmllcyBjcmVkZW50aWFscyB3aGVuXG4gKiBgTk9ERV9FTlY9cHJvZHVjdGlvbmAsIHNvIHRoZSBrbm9iIGNhbm5vdCBxdWlldGx5IHJlYWNoIGEgcHJvZHVjdGlvbiBydW4uXG4gKlxuICogYE5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQ9MGAgYWxyZWFkeSBpbiB0aGUgc3ludGgncyBlbnZpcm9ubWVudCBtZWFucyB0aGVcbiAqIHNhbWUgdGhpbmcg4oCUIHRoZSBvcGVyYXRvciBoYXMgdHVybmVkIHZlcmlmaWNhdGlvbiBvZmYgZm9yIHRoaXMgcHJvY2VzcyDigJQgc29cbiAqIGl0IGlzIGhvbm91cmVkIGFzIGBmYWxzZWAgcmF0aGVyIHRoYW4gc2lsZW50bHkgaWdub3JlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFBMQVRGT1JNX1RMU19WRVJJRllfRU5WID0gJ1BMQVRGT1JNX1RMU19WRVJJRlknO1xuXG4vKiogV2hldGhlciB0aGUgcGxhdGZvcm0gY2VydGlmaWNhdGUgaXMgdmVyaWZpZWQuIFJlZnVzZXMgYSB2YWx1ZSBvdGhlciB0aGFuIGB0cnVlYC9gZmFsc2VgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsYXRmb3JtVGxzVmVyaWZ5KGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSBwcm9jZXNzLmVudik6IGJvb2xlYW4ge1xuICBjb25zdCByYXcgPSBlbnZbUExBVEZPUk1fVExTX1ZFUklGWV9FTlZdPy50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHJhdyAhPT0gdW5kZWZpbmVkICYmIHJhdyAhPT0gJycgJiYgcmF3ICE9PSAndHJ1ZScgJiYgcmF3ICE9PSAnZmFsc2UnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke1BMQVRGT1JNX1RMU19WRVJJRllfRU5WfSBtdXN0IGJlIFwidHJ1ZVwiIG9yIFwiZmFsc2VcIiAoZ290IFwiJHtlbnZbUExBVEZPUk1fVExTX1ZFUklGWV9FTlZdfVwiKWApO1xuICB9XG4gIGlmIChyYXcgPT09ICdmYWxzZScpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGVudi5OT0RFX1RMU19SRUpFQ1RfVU5BVVRIT1JJWkVEICE9PSAnMCc7XG59XG4iXX0=
@@ -76,6 +76,14 @@ export interface PluginStepRef {
76
76
  readonly alias?: string;
77
77
  readonly filter?: Readonly<Record<string, unknown>>;
78
78
  }
79
+ /**
80
+ * THE step label: `synth` for the synth step, else
81
+ * `<stageName>/<alias ?? [<publisher>/]name>`. Every per-step record keys on it —
82
+ * the lookup `context.stepKeys` synth sends (CLI pre-resolver and the deploy-time
83
+ * custom resource), the step manifest, the runtime check, the declared
84
+ * resolution rows and the pipeline security view that joins them.
85
+ */
86
+ export declare function pluginStepLabel(stageName: string | null, ref: PluginRefIdentity): string;
79
87
  /**
80
88
  * Every plugin reference in a pipeline's props: `synth.plugin`, then each
81
89
  * `stages[].steps[].plugin` in order. One entry per STEP (not de-duplicated) —