cdk-nextjs 0.7.10 → 0.7.11

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 (54) hide show
  1. package/.jsii +3 -3
  2. package/README.md +1 -1
  3. package/docs/harness-coverage.md +1 -1
  4. package/docs/nextjs-private-apis.md +128 -0
  5. package/lib/adapter/adapter.mjs +276 -24
  6. package/lib/adapter/build-outputs.d.ts +1 -1
  7. package/lib/adapter/build-outputs.js +29 -13
  8. package/lib/adapter/build-outputs.test.js +35 -7
  9. package/lib/adapter/cache-handler.d.ts +1 -1
  10. package/lib/adapter/cache-handler.js +1 -1
  11. package/lib/adapter/cache-kinds.d.ts +12 -1
  12. package/lib/adapter/cache-kinds.js +16 -4
  13. package/lib/adapter/init-cache.js +7 -7
  14. package/lib/adapter/local-file-cache-handler.d.ts +1 -1
  15. package/lib/adapter/local-file-cache-handler.js +1 -1
  16. package/lib/adapter/memory-cache-handler.d.ts +2 -2
  17. package/lib/adapter/memory-cache-handler.js +1 -1
  18. package/lib/adapter/s3-cache-handler.d.ts +2 -2
  19. package/lib/adapter/s3-cache-handler.js +1 -1
  20. package/lib/adapter/use-cache-common.d.ts +1 -1
  21. package/lib/adapter/use-cache-common.js +1 -1
  22. package/lib/adapter/use-cache-common.test.js +1 -1
  23. package/lib/adapter/use-cache-default-handler.d.ts +1 -1
  24. package/lib/adapter/use-cache-default-handler.js +1 -1
  25. package/lib/adapter/use-cache-handlers.test.js +1 -1
  26. package/lib/adapter/use-cache-remote-handler.d.ts +1 -1
  27. package/lib/adapter/use-cache-remote-handler.js +1 -1
  28. package/lib/cdk-nextjs-version.d.ts +10 -0
  29. package/lib/cdk-nextjs-version.js +15 -0
  30. package/lib/nextjs-api.js +1 -1
  31. package/lib/nextjs-build/nextjs-build.js +7 -6
  32. package/lib/nextjs-build/nextjs-build.test.js +16 -3
  33. package/lib/nextjs-cache.js +1 -1
  34. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  35. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  36. package/lib/nextjs-distribution.js +5 -5
  37. package/lib/nextjs-post-deploy.js +1 -1
  38. package/lib/nextjs-static-assets.js +1 -1
  39. package/lib/root-constructs/nextjs-base-construct.js +1 -1
  40. package/lib/root-constructs/nextjs-global-containers.js +1 -1
  41. package/lib/root-constructs/nextjs-global-functions.js +1 -1
  42. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  43. package/lib/root-constructs/nextjs-regional-functions.js +1 -1
  44. package/lib/runtime/core.test.js +17 -8
  45. package/lib/runtime/dispatch.js +4 -5
  46. package/lib/runtime/image.js +43 -32
  47. package/lib/runtime/image.test.js +27 -26
  48. package/lib/runtime/lambda.mjs +276 -36
  49. package/lib/runtime/manifest.d.ts +34 -8
  50. package/lib/runtime/manifest.js +7 -5
  51. package/lib/runtime/server.mjs +276 -36
  52. package/package.json +1 -1
  53. package/scripts/capture-adapter-fixture.mjs +13 -1
  54. package/scripts/zero-config-build.mjs +5 -1
@@ -25416,7 +25416,7 @@ var require_dist_cjs13 = __commonJS({
25416
25416
  "node_modules/.pnpm/@aws-sdk+credential-provider-web-identity@3.972.78/node_modules/@aws-sdk/credential-provider-web-identity/dist-cjs/index.js"(exports) {
25417
25417
  var { setCredentialFeature: setCredentialFeature2 } = (init_client3(), __toCommonJS(client_exports2));
25418
25418
  var { CredentialsProviderError: CredentialsProviderError2, externalDataInterceptor: externalDataInterceptor2 } = (init_config2(), __toCommonJS(config_exports));
25419
- var { readFileSync: readFileSync3 } = __require("node:fs");
25419
+ var { readFileSync: readFileSync2 } = __require("node:fs");
25420
25420
  var fromWebToken = (init) => async (awsIdentityProperties) => {
25421
25421
  init.logger?.debug("@aws-sdk/credential-provider-web-identity - fromWebToken");
25422
25422
  const { roleArn, roleSessionName, webIdentityToken, providerId, policyArns, policy, durationSeconds } = init;
@@ -25457,7 +25457,7 @@ var require_dist_cjs13 = __commonJS({
25457
25457
  }
25458
25458
  const credentials = await fromWebToken({
25459
25459
  ...init,
25460
- webIdentityToken: externalDataInterceptor2?.getTokenRecord?.()[webIdentityTokenFile] ?? readFileSync3(webIdentityTokenFile, { encoding: "ascii" }),
25460
+ webIdentityToken: externalDataInterceptor2?.getTokenRecord?.()[webIdentityTokenFile] ?? readFileSync2(webIdentityTokenFile, { encoding: "ascii" }),
25461
25461
  roleArn,
25462
25462
  roleSessionName
25463
25463
  })(awsIdentityProperties);
@@ -35918,7 +35918,7 @@ var require_dist = __commonJS({
35918
35918
  if (typeof e5 !== "undefined") e5.ab = __dirname + "/";
35919
35919
  var t = {};
35920
35920
  e5.r(t);
35921
- e5.d(t, { detectDomainLocale: () => detectDomainLocale2, detectLocale: () => detectLocale2, getAcceptLanguageLocale: () => getAcceptLanguageLocale, getCookieLocale: () => getCookieLocale, normalizeLocalePath: () => normalizeLocalePath, resolveRoutes: () => resolveRoutes2, responseToMiddlewareResult: () => responseToMiddlewareResult2 });
35921
+ e5.d(t, { detectDomainLocale: () => detectDomainLocale2, detectLocale: () => detectLocale2, getAcceptLanguageLocale: () => getAcceptLanguageLocale, getCookieLocale: () => getCookieLocale, normalizeLocalePath: () => normalizeLocalePath2, resolveRoutes: () => resolveRoutes2, responseToMiddlewareResult: () => responseToMiddlewareResult2 });
35922
35922
  function matchesCondition(e6, t8) {
35923
35923
  if (e6 === void 0) {
35924
35924
  return { matched: false };
@@ -36117,7 +36117,7 @@ var require_dist = __commonJS({
36117
36117
  }
36118
36118
  return void 0;
36119
36119
  }
36120
- function normalizeLocalePath(e6, t8) {
36120
+ function normalizeLocalePath2(e6, t8) {
36121
36121
  if (!t8 || t8.length === 0) {
36122
36122
  return { pathname: e6 };
36123
36123
  }
@@ -36201,7 +36201,7 @@ var require_dist = __commonJS({
36201
36201
  }
36202
36202
  function detectLocale2(e6) {
36203
36203
  const { pathname: t8, hostname: n4, cookieHeader: a5, acceptLanguageHeader: s2, i18n: r5 } = e6;
36204
- const o3 = normalizeLocalePath(t8, r5.locales);
36204
+ const o3 = normalizeLocalePath2(t8, r5.locales);
36205
36205
  if (o3.detectedLocale) {
36206
36206
  return { locale: o3.detectedLocale, pathnameWithoutLocale: o3.pathname, localeInPath: true };
36207
36207
  }
@@ -36486,7 +36486,7 @@ var require_dist = __commonJS({
36486
36486
  const t9 = f5.hostname;
36487
36487
  const a6 = h5.get("cookie") || void 0;
36488
36488
  const s4 = h5.get("accept-language") || void 0;
36489
- const r6 = normalizeLocalePath(e7, l3.locales);
36489
+ const r6 = normalizeLocalePath2(e7, l3.locales);
36490
36490
  const o4 = !!r6.detectedLocale;
36491
36491
  const i6 = detectDomainLocale2(l3.domains, t9);
36492
36492
  const c6 = i6?.defaultLocale || l3.defaultLocale;
@@ -36877,9 +36877,249 @@ var require_dist = __commonJS({
36877
36877
  }
36878
36878
  });
36879
36879
 
36880
+ // package.json
36881
+ var require_package = __commonJS({
36882
+ "package.json"(exports, module) {
36883
+ module.exports = {
36884
+ name: "cdk-nextjs",
36885
+ description: "Deploy Next.js apps on AWS with CDK",
36886
+ repository: {
36887
+ type: "git",
36888
+ url: "https://github.com/cdklabs/cdk-nextjs.git"
36889
+ },
36890
+ scripts: {
36891
+ build: "pnpm dlx projen build",
36892
+ bump: "pnpm dlx projen bump",
36893
+ "bump:releasable-commits": "pnpm dlx projen bump:releasable-commits",
36894
+ bundle: "pnpm dlx projen bundle",
36895
+ "bundle:adapter/adapter": "pnpm dlx projen bundle:adapter/adapter",
36896
+ "bundle:adapter/adapter:watch": "pnpm dlx projen bundle:adapter/adapter:watch",
36897
+ "bundle:adapter/cache-handler": "pnpm dlx projen bundle:adapter/cache-handler",
36898
+ "bundle:adapter/cache-handler:watch": "pnpm dlx projen bundle:adapter/cache-handler:watch",
36899
+ "bundle:adapter/use-cache-default-handler": "pnpm dlx projen bundle:adapter/use-cache-default-handler",
36900
+ "bundle:adapter/use-cache-default-handler:watch": "pnpm dlx projen bundle:adapter/use-cache-default-handler:watch",
36901
+ "bundle:adapter/use-cache-remote-handler": "pnpm dlx projen bundle:adapter/use-cache-remote-handler",
36902
+ "bundle:adapter/use-cache-remote-handler:watch": "pnpm dlx projen bundle:adapter/use-cache-remote-handler:watch",
36903
+ "bundle:lambdas/post-deploy/post-deploy.lambda": "pnpm dlx projen bundle:lambdas/post-deploy/post-deploy.lambda",
36904
+ "bundle:lambdas/post-deploy/post-deploy.lambda:watch": "pnpm dlx projen bundle:lambdas/post-deploy/post-deploy.lambda:watch",
36905
+ "bundle:lambdas/redeploy-stage/redeploy-stage.lambda": "pnpm dlx projen bundle:lambdas/redeploy-stage/redeploy-stage.lambda",
36906
+ "bundle:lambdas/redeploy-stage/redeploy-stage.lambda:watch": "pnpm dlx projen bundle:lambdas/redeploy-stage/redeploy-stage.lambda:watch",
36907
+ "bundle:nextjs-build/patch-fetch": "pnpm dlx projen bundle:nextjs-build/patch-fetch",
36908
+ "bundle:nextjs-build/patch-fetch:watch": "pnpm dlx projen bundle:nextjs-build/patch-fetch:watch",
36909
+ "bundle:runtime/lambda": "pnpm dlx projen bundle:runtime/lambda",
36910
+ "bundle:runtime/lambda:watch": "pnpm dlx projen bundle:runtime/lambda:watch",
36911
+ "bundle:runtime/server": "pnpm dlx projen bundle:runtime/server",
36912
+ "bundle:runtime/server:watch": "pnpm dlx projen bundle:runtime/server:watch",
36913
+ clobber: "pnpm dlx projen clobber",
36914
+ compat: "pnpm dlx projen compat",
36915
+ compile: "pnpm dlx projen compile",
36916
+ default: "pnpm dlx projen default",
36917
+ docgen: "pnpm dlx projen docgen",
36918
+ eject: "pnpm dlx projen eject",
36919
+ eslint: "pnpm dlx projen eslint",
36920
+ integ: "pnpm dlx projen integ",
36921
+ "integ:update": "pnpm dlx projen integ:update",
36922
+ package: "pnpm dlx projen package",
36923
+ "package-all": "pnpm dlx projen package-all",
36924
+ "package:js": "pnpm dlx projen package:js",
36925
+ "post-compile": "pnpm dlx projen post-compile",
36926
+ "post-upgrade": "pnpm dlx projen post-upgrade",
36927
+ "pre-compile": "pnpm dlx projen pre-compile",
36928
+ release: "pnpm dlx projen release",
36929
+ "rosetta:extract": "pnpm dlx projen rosetta:extract",
36930
+ test: "pnpm dlx projen test",
36931
+ "test:watch": "pnpm dlx projen test:watch",
36932
+ unbump: "pnpm dlx projen unbump",
36933
+ upgrade: "pnpm dlx projen upgrade",
36934
+ "upgrade-cdklabs-projen-project-types": "pnpm dlx projen upgrade-cdklabs-projen-project-types",
36935
+ "upgrade-dev-deps": "pnpm dlx projen upgrade-dev-deps",
36936
+ watch: "pnpm dlx projen watch",
36937
+ projen: "pnpm dlx projen"
36938
+ },
36939
+ author: {
36940
+ name: "Amazon Web Services",
36941
+ email: "aws-cdk-dev@amazon.com",
36942
+ organization: true
36943
+ },
36944
+ devDependencies: {
36945
+ "@aws-cdk/integ-runner": "latest",
36946
+ "@aws-cdk/integ-tests-alpha": "latest",
36947
+ "@aws-crypto/sha256-js": "^5.2.0",
36948
+ "@aws-sdk/client-api-gateway": "^3.1141.0",
36949
+ "@aws-sdk/client-cloudfront": "^3.1141.0",
36950
+ "@aws-sdk/client-dynamodb": "^3.1141.0",
36951
+ "@aws-sdk/client-s3": "^3.1141.0",
36952
+ "@aws-sdk/client-ssm": "^3.1141.0",
36953
+ "@aws-sdk/lib-storage": "^3.1141.0",
36954
+ "@mrgrain/jsii-struct-builder": "^0.7.64",
36955
+ "@next/routing": "16.4.0",
36956
+ "@smithy/signature-v4": "^2.3.0",
36957
+ "@types/aws-lambda": "^8.10.163",
36958
+ "@types/debug": "^4.1.13",
36959
+ "@types/jest": "^29.5.14",
36960
+ "@types/mime-types": "^2.1.4",
36961
+ "@types/node": "^24",
36962
+ "@typescript-eslint/eslint-plugin": "^8",
36963
+ "@typescript-eslint/parser": "^8",
36964
+ "aws-cdk": "^2.1143.0",
36965
+ "aws-cdk-lib": "2.261.0",
36966
+ "cdk-nag": "^2.38.2",
36967
+ "cdklabs-projen-project-types": "^0.6.17",
36968
+ "commit-and-tag-version": "^12",
36969
+ constructs: "10.5.1",
36970
+ debug: "^4.4.3",
36971
+ esbuild: "^0.28.2",
36972
+ eslint: "^9",
36973
+ "eslint-config-prettier": "^9.1.2",
36974
+ "eslint-import-resolver-typescript": "^3.10.1",
36975
+ "eslint-plugin-import": "^2.32.0",
36976
+ "eslint-plugin-prettier": "^5.5.6",
36977
+ jest: "^29.7.0",
36978
+ "jest-junit": "^17",
36979
+ jsii: "~6.0.4",
36980
+ "jsii-diff": "^1.140.0",
36981
+ "jsii-docgen": "^10.5.0",
36982
+ "jsii-pacmak": "^1.140.0",
36983
+ "jsii-rosetta": "~5.9.67",
36984
+ "mime-types": "^2.1.35",
36985
+ next: "^16.4.0",
36986
+ prettier: "^3.9.9",
36987
+ projen: "^0.101.6",
36988
+ "ts-jest": "^29.4.14",
36989
+ "ts-node": "^10.9.2",
36990
+ typescript: "^5.9.3",
36991
+ undici: "^6.29.0"
36992
+ },
36993
+ peerDependencies: {
36994
+ "aws-cdk-lib": "^2.261.0",
36995
+ constructs: "^10.5.1"
36996
+ },
36997
+ pnpm: {
36998
+ onlyBuiltDependencies: [
36999
+ "esbuild",
37000
+ "unrs-resolver",
37001
+ "sharp"
37002
+ ],
37003
+ overrides: {
37004
+ postcss: "^8.5.23",
37005
+ browserslist: "^4.28.7",
37006
+ "js-yaml@3": "^3.15.1",
37007
+ "js-yaml@4": "^4.3.1",
37008
+ "brace-expansion@1": "^1.1.21",
37009
+ "brace-expansion@5": "^5.0.12",
37010
+ "@babel/core": "^7.29.6",
37011
+ sharp: "^0.35.5",
37012
+ "source-map-js": "^1.2.2"
37013
+ }
37014
+ },
37015
+ keywords: [
37016
+ "aws",
37017
+ "aws-cdk",
37018
+ "cdk",
37019
+ "next",
37020
+ "next.js",
37021
+ "nextjs"
37022
+ ],
37023
+ devEngines: {
37024
+ packageManager: {
37025
+ name: "pnpm",
37026
+ version: "10.32.1",
37027
+ onFail: "ignore"
37028
+ }
37029
+ },
37030
+ main: "lib/index.js",
37031
+ license: "Apache-2.0",
37032
+ stability: "stable",
37033
+ publishConfig: {
37034
+ access: "public"
37035
+ },
37036
+ version: "0.7.11",
37037
+ packageManager: "pnpm@10.32.1",
37038
+ jest: {
37039
+ coverageProvider: "v8",
37040
+ testPathIgnorePatterns: [
37041
+ "/node_modules/",
37042
+ "/cdk.out/"
37043
+ ],
37044
+ testMatch: [
37045
+ "<rootDir>/@(src|test)/**/*(*.)@(spec|test).ts?(x)",
37046
+ "<rootDir>/@(src|test)/**/__tests__/**/*.ts?(x)",
37047
+ "<rootDir>/@(projenrc)/**/*(*.)@(spec|test).ts?(x)",
37048
+ "<rootDir>/@(projenrc)/**/__tests__/**/*.ts?(x)"
37049
+ ],
37050
+ clearMocks: true,
37051
+ collectCoverage: true,
37052
+ coverageReporters: [
37053
+ "json",
37054
+ "lcov",
37055
+ "clover",
37056
+ "cobertura",
37057
+ "text"
37058
+ ],
37059
+ coverageDirectory: "coverage",
37060
+ coveragePathIgnorePatterns: [
37061
+ "/node_modules/",
37062
+ "/cdk.out/"
37063
+ ],
37064
+ watchPathIgnorePatterns: [
37065
+ "/node_modules/"
37066
+ ],
37067
+ reporters: [
37068
+ "default",
37069
+ [
37070
+ "jest-junit",
37071
+ {
37072
+ outputDirectory: "test-reports"
37073
+ }
37074
+ ]
37075
+ ],
37076
+ transform: {
37077
+ "^.+\\.[t]sx?$": [
37078
+ "ts-jest",
37079
+ {
37080
+ tsconfig: "test/tsconfig.json"
37081
+ }
37082
+ ]
37083
+ }
37084
+ },
37085
+ types: "lib/index.d.ts",
37086
+ jsii: {
37087
+ outdir: "dist",
37088
+ targets: {},
37089
+ tsconfig: "tsconfig.json",
37090
+ validateTsconfig: "strict"
37091
+ },
37092
+ exports: {
37093
+ ".": {
37094
+ types: "./lib/index.d.ts",
37095
+ import: "./lib/index.js",
37096
+ default: "./lib/index.js"
37097
+ },
37098
+ "./adapter": {
37099
+ import: "./lib/adapter/adapter.mjs",
37100
+ default: "./lib/adapter/adapter.mjs"
37101
+ },
37102
+ "./cache-handler": {
37103
+ import: "./lib/adapter/cache-handler.mjs",
37104
+ default: "./lib/adapter/cache-handler.mjs"
37105
+ },
37106
+ "./cache-handlers/default": {
37107
+ import: "./lib/adapter/use-cache-default-handler.mjs",
37108
+ default: "./lib/adapter/use-cache-default-handler.mjs"
37109
+ },
37110
+ "./cache-handlers/remote": {
37111
+ import: "./lib/adapter/use-cache-remote-handler.mjs",
37112
+ default: "./lib/adapter/use-cache-remote-handler.mjs"
37113
+ }
37114
+ },
37115
+ "//": '~~ Generated by projen. To modify, edit .projenrc.ts and run "pnpm dlx projen".'
37116
+ };
37117
+ }
37118
+ });
37119
+
36880
37120
  // src/runtime/lambda.mts
36881
37121
  import { dirname as dirname2 } from "node:path";
36882
- import { fileURLToPath as fileURLToPath2 } from "node:url";
37122
+ import { fileURLToPath } from "node:url";
36883
37123
 
36884
37124
  // src/runtime/core.ts
36885
37125
  import { readFile as readFile3 } from "node:fs/promises";
@@ -37547,8 +37787,7 @@ function requestLocale(manifest, url) {
37547
37787
  const i18n = asI18n(manifest.config.i18n);
37548
37788
  if (!i18n) return void 0;
37549
37789
  const pathname = withoutPathPrefix(url.pathname, manifest.config.basePath);
37550
- const segment = (pathname.split("/")[1] ?? "").toLowerCase();
37551
- return i18n.locales.find((candidate) => candidate.toLowerCase() === segment) ?? (0, import_routing.detectDomainLocale)(i18n.domains, url.hostname)?.defaultLocale ?? i18n.defaultLocale;
37790
+ return (0, import_routing.normalizeLocalePath)(pathname, i18n.locales).detectedLocale ?? (0, import_routing.detectDomainLocale)(i18n.domains, url.hostname)?.defaultLocale ?? i18n.defaultLocale;
37552
37791
  }
37553
37792
 
37554
37793
  // src/runtime/entrypoints.ts
@@ -38032,9 +38271,8 @@ function padEmptyBody() {
38032
38271
  }
38033
38272
 
38034
38273
  // src/runtime/image.ts
38035
- import { readFileSync as readFileSync2 } from "node:fs";
38036
38274
  import { isAbsolute as isAbsolutePath, join as join9 } from "node:path";
38037
- import { fileURLToPath, pathToFileURL } from "node:url";
38275
+ import { pathToFileURL } from "node:url";
38038
38276
 
38039
38277
  // src/runtime/image-utils.ts
38040
38278
  var import_client_s32 = __toESM(require_dist_cjs16());
@@ -38105,6 +38343,9 @@ function resolveErrorResponse(error2, ImageError) {
38105
38343
  return { statusCode: 500, message: "Internal Server Error" };
38106
38344
  }
38107
38345
 
38346
+ // src/cdk-nextjs-version.ts
38347
+ var CDK_NEXTJS_VERSION = require_package().version;
38348
+
38108
38349
  // src/runtime/next-modules.ts
38109
38350
  import { createRequire as createRequire2 } from "node:module";
38110
38351
  import { join as join8 } from "node:path";
@@ -38164,13 +38405,13 @@ var RuntimeImageOptimizer = class {
38164
38405
  * off.
38165
38406
  */
38166
38407
  isEnabled() {
38167
- this.loaded ??= loadImageRuntime(this.options);
38168
- const { imagesConfig } = this.loaded;
38169
- return imagesConfig.loader === "default" && !imagesConfig.unoptimized;
38408
+ const images = manifestImages(this.options.manifest);
38409
+ return images.loader === "default" && !images.unoptimized;
38170
38410
  }
38171
38411
  async handle(req, res, url, waitUntil) {
38172
38412
  this.loaded ??= loadImageRuntime(this.options);
38173
- const { next, nextConfig, imagesConfig } = this.loaded;
38413
+ const { next, nextConfig } = this.loaded;
38414
+ const imagesConfig = nextConfig.images;
38174
38415
  const {
38175
38416
  ImageError,
38176
38417
  ImageOptimizerCache,
@@ -38405,9 +38646,8 @@ function newImageResponseCache(ResponseCache) {
38405
38646
  }
38406
38647
  }
38407
38648
  function cacheHandlerUrl(distDir, cacheHandler) {
38408
- const path = cacheHandler.startsWith("file://") ? fileURLToPath(cacheHandler) : cacheHandler;
38409
38649
  return pathToFileURL(
38410
- isAbsolutePath(path) ? path : join9(distDir, path)
38650
+ isAbsolutePath(cacheHandler) ? cacheHandler : join9(distDir, cacheHandler)
38411
38651
  ).toString();
38412
38652
  }
38413
38653
  function deferWrites(images, waitUntil) {
@@ -38427,29 +38667,29 @@ function sendText(res, statusCode, body) {
38427
38667
  res.setHeader("Content-Type", "text/plain");
38428
38668
  res.end(body);
38429
38669
  }
38430
- function loadImageRuntime({ deploymentRoot, manifest }) {
38670
+ function manifestImages(manifest) {
38671
+ if (manifest.cdkNextjsVersion !== CDK_NEXTJS_VERSION) {
38672
+ throw new Error(
38673
+ `The adapter manifest was written by cdk-nextjs ${manifest.cdkNextjsVersion ?? "(unknown)"}, but this runtime is cdk-nextjs ${CDK_NEXTJS_VERSION}. Rebuild the app with this version.`
38674
+ );
38675
+ }
38676
+ return manifest.config.images;
38677
+ }
38678
+ function loadImageRuntime({ manifest }) {
38431
38679
  const next = {
38432
- configShared: nextModule("next/dist/server/config-shared.js"),
38433
- imageConfig: nextModule("next/dist/shared/lib/image-config.js"),
38434
38680
  optimizer: nextModule("next/dist/server/image-optimizer.js"),
38435
38681
  serveStatic: nextModule("next/dist/server/serve-static.js")
38436
38682
  };
38437
- const path = join9(
38438
- deploymentRoot,
38439
- manifest.relativeProjectDir,
38440
- manifest.config.distDir,
38441
- "required-server-files.json"
38442
- );
38443
- const required = JSON.parse(readFileSync2(path, "utf-8"));
38444
- const nextConfig = next.configShared.getNextConfigRuntime(required.config);
38445
- return {
38446
- next,
38447
- nextConfig,
38448
- imagesConfig: {
38449
- ...next.imageConfig.imageConfigDefault,
38450
- ...nextConfig.images
38451
- }
38683
+ const { config } = manifest;
38684
+ const nextConfig = {
38685
+ basePath: config.basePath,
38686
+ assetPrefix: config.assetPrefix,
38687
+ images: manifestImages(manifest),
38688
+ experimental: config.experimental,
38689
+ cacheHandler: config.cacheHandler ?? void 0,
38690
+ cacheMaxMemorySize: config.cacheMaxMemorySize
38452
38691
  };
38692
+ return { next, nextConfig };
38453
38693
  }
38454
38694
 
38455
38695
  // src/runtime/middleware.ts
@@ -39702,7 +39942,7 @@ function formatQuery(event) {
39702
39942
 
39703
39943
  // src/runtime/lambda.mts
39704
39944
  var runtime = await loadRuntime(
39705
- deploymentRootOf(dirname2(fileURLToPath2(import.meta.url)))
39945
+ deploymentRootOf(dirname2(fileURLToPath(import.meta.url)))
39706
39946
  );
39707
39947
  var LambdaResponseSink = class {
39708
39948
  constructor(responseStream) {
@@ -1,5 +1,3 @@
1
- /** Current {@link AdapterManifest.version}. Bump on any breaking shape change. */
2
- export declare const ADAPTER_MANIFEST_VERSION = 1;
3
1
  /**
4
2
  * Directory written inside `distDir` (`.next`), matching the existing
5
3
  * `cdk-nextjs-init-cache` convention.
@@ -84,7 +82,13 @@ export declare const PUBLIC_FILES_FILE_NAME = "public-files.json";
84
82
  */
85
83
  export declare function deployedManifestPath(deploymentRoot: string): string;
86
84
  export interface AdapterManifest {
87
- readonly version: 1;
85
+ /**
86
+ * The cdk-nextjs that wrote this (`CDK_NEXTJS_VERSION`). Whatever reads the
87
+ * manifest requires its own version here, rather than a hand-bumped shape
88
+ * version: the adapter and its readers ship in one package, so a mismatch is
89
+ * always a stale build or a second cdk-nextjs install.
90
+ */
91
+ readonly cdkNextjsVersion: string;
88
92
  readonly buildId: string;
89
93
  /**
90
94
  * From the deployment root to the Next.js project dir. "" when the app is at
@@ -171,11 +175,7 @@ export interface AdapterManifestConfig {
171
175
  readonly basePath: string;
172
176
  readonly trailingSlash: boolean;
173
177
  readonly assetPrefix: string;
174
- /**
175
- * `distDir` relative to the project dir — `.next` unless configured. POSIX.
176
- * The runtime reads `required-server-files.json` from here for the image
177
- * optimizer's config.
178
- */
178
+ /** `distDir` relative to the project dir — `.next` unless configured. POSIX. */
179
179
  readonly distDir: string;
180
180
  /**
181
181
  * `next.config` `compress`. The runtime gzips streamed responses itself
@@ -200,6 +200,32 @@ export interface AdapterManifestConfig {
200
200
  * when the app sets none.
201
201
  */
202
202
  readonly deploymentId: string;
203
+ /**
204
+ * `next.config` `images`, resolved and defaulted (`ctx.config.images`).
205
+ * `NextConfigComplete["images"]`-shaped. With {@link experimental},
206
+ * {@link cacheHandler} and {@link cacheMaxMemorySize}, what the image
207
+ * optimizer is handed as its `nextConfig`.
208
+ *
209
+ * `images` and `experimental` are copied whole rather than field by field:
210
+ * Next's optimizer picks what it reads out of both (six `experimental.imgOpt*`
211
+ * flags in 16.4), and a hand-kept list would silently drop the next one it
212
+ * starts reading.
213
+ */
214
+ readonly images: unknown;
215
+ /**
216
+ * `next.config` `experimental`, resolved (`ctx.config.experimental`), as
217
+ * JSON: function-valued entries are dropped, as they are from
218
+ * `required-server-files.json`. See {@link images}.
219
+ */
220
+ readonly experimental: unknown;
221
+ /**
222
+ * `next.config` `cacheHandler`, relative to the dist dir as
223
+ * `required-server-files.json` has it (the build machine's absolute path
224
+ * means nothing in the deployment). `null` when there is none.
225
+ */
226
+ readonly cacheHandler: string | null;
227
+ /** `next.config` `cacheMaxMemorySize`. */
228
+ readonly cacheMaxMemorySize: number;
203
229
  }
204
230
  export type AdapterEntrypointType = "app-page" | "app-route" | "page" | "page-api";
205
231
  export interface AdapterEntrypoint {
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PUBLIC_FILES_FILE_NAME = exports.RUNTIME_DIR_NAME = exports.ERROR_PAGE_SUFFIXES = exports.STATUS_PAGE_SUFFIXES = exports.MANIFEST_FILE_NAME = exports.REVALIDATED_PAGE_HOOK = exports.FUNCTION_GROUP_ENV_VAR = exports.GROUPS_DIR_NAME = exports.STAGING_DIR_NAME = exports.ADAPTER_DIR_NAME = exports.ADAPTER_MANIFEST_VERSION = void 0;
3
+ exports.PUBLIC_FILES_FILE_NAME = exports.RUNTIME_DIR_NAME = exports.ERROR_PAGE_SUFFIXES = exports.STATUS_PAGE_SUFFIXES = exports.MANIFEST_FILE_NAME = exports.REVALIDATED_PAGE_HOOK = exports.FUNCTION_GROUP_ENV_VAR = exports.GROUPS_DIR_NAME = exports.STAGING_DIR_NAME = exports.ADAPTER_DIR_NAME = void 0;
4
4
  exports.groupStagingDirName = groupStagingDirName;
5
5
  exports.deployedManifestPath = deployedManifestPath;
6
6
  /**
@@ -15,15 +15,17 @@ exports.deployedManifestPath = deployedManifestPath;
15
15
  * build-machine absolute path: absolute paths work on the build machine and
16
16
  * fail in Lambda. The staging tree those keys index into is
17
17
  * `<distDir>/cdk-nextjs-adapter/app`; the runtime calls that directory the
18
- * *deployment root* and resolves every key against it.
18
+ * *deployment root* and resolves every key against it. The exceptions are the
19
+ * Next.js config copied into {@link AdapterManifestConfig}: `cacheHandler` is
20
+ * relative to the dist dir, as Next's own `required-server-files.json` has it,
21
+ * and `images` is copied whole, so `images.loaderFile` stays the build machine's
22
+ * absolute path (nothing in the runtime reads it).
19
23
  *
20
24
  * This file is intentionally not exported from `src/index.ts`: it is an
21
25
  * internal contract, not public construct API, so it is exempt from the JSII
22
26
  * restrictions the rest of `src/` follows.
23
27
  */
24
28
  const node_path_1 = require("node:path");
25
- /** Current {@link AdapterManifest.version}. Bump on any breaking shape change. */
26
- exports.ADAPTER_MANIFEST_VERSION = 1;
27
29
  /**
28
30
  * Directory written inside `distDir` (`.next`), matching the existing
29
31
  * `cdk-nextjs-init-cache` convention.
@@ -115,4 +117,4 @@ exports.PUBLIC_FILES_FILE_NAME = "public-files.json";
115
117
  function deployedManifestPath(deploymentRoot) {
116
118
  return (0, node_path_1.join)(deploymentRoot, exports.RUNTIME_DIR_NAME, exports.MANIFEST_FILE_NAME);
117
119
  }
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuaWZlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9tYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFzRUEsa0RBRUM7QUFvREQsb0RBRUM7QUE5SEQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gseUNBQWlDO0FBRWpDLGtGQUFrRjtBQUNyRSxRQUFBLHdCQUF3QixHQUFHLENBQUMsQ0FBQztBQUUxQzs7O0dBR0c7QUFDVSxRQUFBLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDO0FBRXJEOzs7O0dBSUc7QUFDVSxRQUFBLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUV0Qzs7Ozs7Ozs7OztHQVVHO0FBQ1UsUUFBQSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBRXhDOzs7R0FHRztBQUNVLFFBQUEsc0JBQXNCLEdBQUcsMkJBQTJCLENBQUM7QUFFbEU7Ozs7O0dBS0c7QUFDVSxRQUFBLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQzdDLHNDQUFzQyxDQUN2QyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLEtBQWM7SUFDaEQsT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyx3QkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyx1QkFBZSxJQUFJLEtBQUssRUFBRSxDQUFDO0FBQ2hGLENBQUM7QUFFRCx3RUFBd0U7QUFDM0QsUUFBQSxrQkFBa0IsR0FBRyxlQUFlLENBQUM7QUFFbEQ7OztHQUdHO0FBQ1UsUUFBQSxvQkFBb0IsR0FBRztJQUNsQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDO0lBQzVCLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUNiLFFBQVEsRUFBRSxTQUFTO0NBQ3BCLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNVLFFBQUEsbUJBQW1CLEdBQUc7SUFDakMsR0FBRyw0QkFBb0IsQ0FBQyxHQUFHLENBQUM7SUFDNUIsR0FBRyw0QkFBb0IsQ0FBQyxHQUFHLENBQUM7SUFDNUIsNEJBQW9CLENBQUMsUUFBUTtDQUM5QixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDVSxRQUFBLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDO0FBRXJEOzs7Ozs7OztHQVFHO0FBQ1UsUUFBQSxzQkFBc0IsR0FBRyxtQkFBbUIsQ0FBQztBQUUxRDs7Ozs7R0FLRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLGNBQXNCO0lBQ3pELE9BQU8sSUFBQSxnQkFBSSxFQUFDLGNBQWMsRUFBRSx3QkFBZ0IsRUFBRSwwQkFBa0IsQ0FBQyxDQUFDO0FBQ3BFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBidWlsZC10aW1lIOKGkiBydW4tdGltZSBjb250cmFjdCBmb3IgdGhlIGFkYXB0ZXIgcnVudGltZS5cbiAqXG4gKiBgc3JjL2FkYXB0ZXIvYnVpbGQtb3V0cHV0cy50c2Agd3JpdGVzIGFuIHtAbGluayBBZGFwdGVyTWFuaWZlc3R9IGR1cmluZ1xuICogYG5leHQgYnVpbGRgOyB0aGUgcnVudGltZSBzaGVsbHMgaW4gYHNyYy9ydW50aW1lL2AgcmVhZCBpdCBhdCBjb2xkIHN0YXJ0IGFuZFxuICogdGhlIENESyBjb25zdHJ1Y3RzIHJlYWQgaXQgYXQgc3ludGguIEl0IGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgY3Jvc3NlcyB0aG9zZVxuICogdGhyZWUgYm91bmRhcmllcywgc28gaXQgaXMgZGVsaWJlcmF0ZWx5IHBsYWluIEpTT04uXG4gKlxuICogKipFdmVyeSBwYXRoIGluIHRoaXMgbWFuaWZlc3QgaXMgYSByZXBvLXJvb3QtcmVsYXRpdmUgUE9TSVgga2V5KiosIG5ldmVyIGFcbiAqIGJ1aWxkLW1hY2hpbmUgYWJzb2x1dGUgcGF0aDogYWJzb2x1dGUgcGF0aHMgd29yayBvbiB0aGUgYnVpbGQgbWFjaGluZSBhbmRcbiAqIGZhaWwgaW4gTGFtYmRhLiBUaGUgc3RhZ2luZyB0cmVlIHRob3NlIGtleXMgaW5kZXggaW50byBpc1xuICogYDxkaXN0RGlyPi9jZGstbmV4dGpzLWFkYXB0ZXIvYXBwYDsgdGhlIHJ1bnRpbWUgY2FsbHMgdGhhdCBkaXJlY3RvcnkgdGhlXG4gKiAqZGVwbG95bWVudCByb290KiBhbmQgcmVzb2x2ZXMgZXZlcnkga2V5IGFnYWluc3QgaXQuXG4gKlxuICogVGhpcyBmaWxlIGlzIGludGVudGlvbmFsbHkgbm90IGV4cG9ydGVkIGZyb20gYHNyYy9pbmRleC50c2A6IGl0IGlzIGFuXG4gKiBpbnRlcm5hbCBjb250cmFjdCwgbm90IHB1YmxpYyBjb25zdHJ1Y3QgQVBJLCBzbyBpdCBpcyBleGVtcHQgZnJvbSB0aGUgSlNJSVxuICogcmVzdHJpY3Rpb25zIHRoZSByZXN0IG9mIGBzcmMvYCBmb2xsb3dzLlxuICovXG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG4vKiogQ3VycmVudCB7QGxpbmsgQWRhcHRlck1hbmlmZXN0LnZlcnNpb259LiBCdW1wIG9uIGFueSBicmVha2luZyBzaGFwZSBjaGFuZ2UuICovXG5leHBvcnQgY29uc3QgQURBUFRFUl9NQU5JRkVTVF9WRVJTSU9OID0gMTtcblxuLyoqXG4gKiBEaXJlY3Rvcnkgd3JpdHRlbiBpbnNpZGUgYGRpc3REaXJgIChgLm5leHRgKSwgbWF0Y2hpbmcgdGhlIGV4aXN0aW5nXG4gKiBgY2RrLW5leHRqcy1pbml0LWNhY2hlYCBjb252ZW50aW9uLlxuICovXG5leHBvcnQgY29uc3QgQURBUFRFUl9ESVJfTkFNRSA9IFwiY2RrLW5leHRqcy1hZGFwdGVyXCI7XG5cbi8qKlxuICogRGVwbG95bWVudCByb290IGluc2lkZSB7QGxpbmsgQURBUFRFUl9ESVJfTkFNRX06IHRoZSBzdGFnZWQgdW5pb24gb2YgZXZlcnlcbiAqIHNoaXBwZWQgb3V0cHV0J3MgdHJhY2VkIGBhc3NldHNgLCBrZXllZCBieSByZXBvLXJvb3QtcmVsYXRpdmUgcGF0aC4gVGhpcyBpc1xuICogd2hhdCByZXBsYWNlcyBgb3V0cHV0OiBcInN0YW5kYWxvbmVcImAuXG4gKi9cbmV4cG9ydCBjb25zdCBTVEFHSU5HX0RJUl9OQU1FID0gXCJhcHBcIjtcblxuLyoqXG4gKiBQYXJlbnQgb2YgdGhlIHBlci1ncm91cCBkZXBsb3ltZW50IHJvb3RzLCB1c2VkIGluc3RlYWQgb2ZcbiAqIHtAbGluayBTVEFHSU5HX0RJUl9OQU1FfSB3aGVuIGBmdW5jdGlvbkdyb3Vwc2Agc3BsaXRzIHRoZSBhcHA6IGVhY2ggZ3JvdXAgaXNcbiAqIHN0YWdlZCBhdCBgPGRpc3REaXI+L2Nkay1uZXh0anMtYWRhcHRlci9ncm91cHMvPG5hbWU+L2AsIGluY2x1ZGluZyB0aGUgaW1wbGljaXRcbiAqIGBkZWZhdWx0YCBvbmUuXG4gKlxuICogU3BsaXR0aW5nIGdldHMgaXRzIG93biBzdWJ0cmVlIHJhdGhlciB0aGFuIHJldXNpbmcgYGFwcC9gIGZvciB0aGUgZGVmYXVsdCBncm91cFxuICogc28gdGhhdCBhIHRyZWUgbGVmdCBvdmVyIGZyb20gYSBidWlsZCB3aXRoIGRpZmZlcmVudCBncm91cGluZyBjYW4gbmV2ZXIgYmVcbiAqIG1pc3Rha2VuIGZvciB0aGlzIGJ1aWxkJ3MsIGFuZCBzbyBgZHVgIG9uIGVpdGhlciBkaXJlY3RvcnkgYW5zd2VycyBcImhvdyBiaWcgaXNcbiAqIHRoZSB0aGluZyBJIGRlcGxveVwiIHdpdGhvdXQgcXVhbGlmaWNhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEdST1VQU19ESVJfTkFNRSA9IFwiZ3JvdXBzXCI7XG5cbi8qKlxuICogV2hpY2ggZ3JvdXAgdGhlIHJ1bm5pbmcgZnVuY3Rpb24gKmlzKi4gU2V0IHBlciBMYW1iZGEgYXQgc3ludGgsIHJlYWQgYnkgdGhlXG4gKiBydW50aW1lIG9ubHkgdG8gbWFrZSBhIG1pc3JvdXRlIHNheSBzbzsgc2VlIGBvd25lZFJvdXRlRXJyb3JgLlxuICovXG5leHBvcnQgY29uc3QgRlVOQ1RJT05fR1JPVVBfRU5WX1ZBUiA9IFwiQ0RLX05FWFRKU19GVU5DVElPTl9HUk9VUFwiO1xuXG4vKipcbiAqIFRoZSBnbG9iYWwgdGhlIGNhY2hlIGhhbmRsZXIgKGBzcmMvYWRhcHRlci9zMy1jYWNoZS1oYW5kbGVyLnRzYCkgcmVnaXN0ZXJzIGl0c1xuICogQ2xvdWRGcm9udCBpbnZhbGlkYXRpb24gaG9vayB1bmRlciwgYW5kIHRoZSBydW50aW1lIChgY29yZS50c2ApIGNhbGxzLiBBIGdsb2JhbFxuICogcmF0aGVyIHRoYW4gYW4gaW1wb3J0LCBiZWNhdXNlIHRoZSBjYWNoZSBoYW5kbGVyIGlzIGEgc2VwYXJhdGUgYnVuZGxlIHRoYXRcbiAqIE5leHQuanMgbG9hZHMgaXRzZWxmOiB0aGUgdHdvIHNoYXJlIGEgcHJvY2Vzcywgbm90IGEgbW9kdWxlIGdyYXBoLlxuICovXG5leHBvcnQgY29uc3QgUkVWQUxJREFURURfUEFHRV9IT09LID0gU3ltYm9sLmZvcihcbiAgXCJjZGstbmV4dGpzLmludmFsaWRhdGVSZXZhbGlkYXRlZFBhZ2VcIixcbik7XG5cbi8qKlxuICogRGlyZWN0b3J5IGluc2lkZSB7QGxpbmsgQURBUFRFUl9ESVJfTkFNRX0gaG9sZGluZyBvbmUgZGVwbG95bWVudCByb290LCByZWxhdGl2ZVxuICogYW5kIFBPU0lYLiBgdW5kZWZpbmVkYCBtZWFucyBcIm5vdCBzcGxpdHRpbmdcIiwgd2hpY2ggaXMgaXRzIG93biBsYXlvdXQgcmF0aGVyXG4gKiB0aGFuIGEgZ3JvdXAgbmFtZWQgYGRlZmF1bHRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBTdGFnaW5nRGlyTmFtZShncm91cD86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBncm91cCA9PT0gdW5kZWZpbmVkID8gU1RBR0lOR19ESVJfTkFNRSA6IGAke0dST1VQU19ESVJfTkFNRX0vJHtncm91cH1gO1xufVxuXG4vKioge0BsaW5rIEFkYXB0ZXJNYW5pZmVzdH0sIHdyaXR0ZW4gaW5zaWRlIHtAbGluayBBREFQVEVSX0RJUl9OQU1FfS4gKi9cbmV4cG9ydCBjb25zdCBNQU5JRkVTVF9GSUxFX05BTUUgPSBcIm1hbmlmZXN0Lmpzb25cIjtcblxuLyoqXG4gKiBUaGUgZW50cnlwb2ludHMgdGhlIHJ1bnRpbWUgcmVuZGVycyBhIDQwNCBvciBhIDUwMCB3aXRoLCBpbiB0aGUgb3JkZXIgaXRcbiAqIHRyaWVzIHRoZW0sIGFuZCBgL19lcnJvcmAsIHRoZSBsYXN0IHJlc29ydCBmb3IgYm90aC4gQmVmb3JlIGJhc2VQYXRoLlxuICovXG5leHBvcnQgY29uc3QgU1RBVFVTX1BBR0VfU1VGRklYRVMgPSB7XG4gIDQwNDogW1wiL19ub3QtZm91bmRcIiwgXCIvNDA0XCJdLFxuICA1MDA6IFtcIi81MDBcIl0sXG4gIGZhbGxiYWNrOiBcIi9fZXJyb3JcIixcbn07XG5cbi8qKlxuICogRXZlcnkge0BsaW5rIFNUQVRVU19QQUdFX1NVRkZJWEVTfSBwYWdlOiBBcHAgUm91dGVyJ3MgYC9fbm90LWZvdW5kYCwgUGFnZXNcbiAqIFJvdXRlcidzIGAvNDA0YCBhbmQgYC81MDBgLCBhbmQgYC9fZXJyb3JgLiBUaGUgcnVudGltZSBtYXkgcmVuZGVyIGFueSByZXF1ZXN0XG4gKiB3aXRoIHRoZW0sIHdoZXJldmVyIGl0IGxhbmRlZCwgc28gZXZlcnkgZnVuY3Rpb24gZ3JvdXAgc3RhZ2VzIHRoZW1cbiAqIChgY29sbGVjdEdyb3VwU3RhZ2luZ1BsYW5gKSBhbmQgbm8gVVJMIGhhcyB0byBiZSByb3V0ZWQgdG8gdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IEVSUk9SX1BBR0VfU1VGRklYRVMgPSBbXG4gIC4uLlNUQVRVU19QQUdFX1NVRkZJWEVTWzQwNF0sXG4gIC4uLlNUQVRVU19QQUdFX1NVRkZJWEVTWzUwMF0sXG4gIFNUQVRVU19QQUdFX1NVRkZJWEVTLmZhbGxiYWNrLFxuXTtcblxuLyoqXG4gKiBSZXNlcnZlZCBrZXkgaW5zaWRlIHRoZSBzdGFnaW5nIHRyZWUgdGhhdCBjZGstbmV4dGpzJ3Mgb3duIGJ1bmRsZWQgcnVudGltZVxuICogZmlsZXMgYXJlIGNvcGllZCB0byBhdCBzeW50aCAoTGFtYmRhIGhhbmRsZXJcbiAqIGBjZGstbmV4dGpzLXJ1bnRpbWUvbGFtYmRhLmhhbmRsZXJgKS4gUmVzZXJ2ZWQgYmVjYXVzZSBhIHJlcG8tcm9vdC1yZWxhdGl2ZVxuICogYXNzZXQga2V5IGNvdWxkIG90aGVyd2lzZSBjb2xsaWRlIHdpdGggaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBSVU5USU1FX0RJUl9OQU1FID0gXCJjZGstbmV4dGpzLXJ1bnRpbWVcIjtcblxuLyoqXG4gKiBUaGUgZmlsZSwgbmV4dCB0byB0aGUgbWFuaWZlc3QgaW4ge0BsaW5rIFJVTlRJTUVfRElSX05BTUV9LCB0aGF0IGxpc3RzXG4gKiBgcHVibGljL2Agb24gZXZlcnkgdHlwZSBidXQgYE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc2A6IGEgSlNPTiBhcnJheSBvZlxuICogYC9gLXNlcGFyYXRlZCBwYXRocyByZWxhdGl2ZSB0byBgcHVibGljL2AsIGFzIGByZWFkUHVibGljRmlsZXNgIHJldHVybnMgdGhlbS5cbiAqIFN5bnRoIHdyaXRlcyBpdCBhZnRlciB0aGUgYnVpbGQgY29tbWFuZCAoc28gYHBvc3RidWlsZGAgb3V0cHV0IGlzIGxpc3RlZClcbiAqIGJlY2F1c2UgdGhvc2UgZGVwbG95bWVudCBwYWNrYWdlcyBkbyBub3QgY2FycnkgYHB1YmxpYy9gIGl0c2VsZjsgdGhlIHJ1bnRpbWVcbiAqIHNlcnZlcyBhIGxpc3RlZCBmaWxlIGZyb20gUzMuIFRoZSBSZWdpb25hbENvbnRhaW5lcnMgaW1hZ2UgY29waWVzIGBwdWJsaWMvYFxuICogaW4gYW5kIGhhcyBubyBzdWNoIGZpbGUuXG4gKi9cbmV4cG9ydCBjb25zdCBQVUJMSUNfRklMRVNfRklMRV9OQU1FID0gXCJwdWJsaWMtZmlsZXMuanNvblwiO1xuXG4vKipcbiAqIFdoZXJlIHRoZSBydW50aW1lIHJlYWRzIHtAbGluayBBZGFwdGVyTWFuaWZlc3R9IGZyb20sIGdpdmVuIHRoZSBkZXBsb3ltZW50XG4gKiByb290LiBTeW50aCBjb3BpZXMgYG1hbmlmZXN0Lmpzb25gIGluIG5leHQgdG8gdGhlIGJ1bmRsZWQgc2hlbGxzIHJhdGhlciB0aGFuXG4gKiBsZWF2aW5nIGl0IGF0IGl0cyBidWlsZC10aW1lIGxvY2F0aW9uIChgPGRpc3REaXI+L2Nkay1uZXh0anMtYWRhcHRlci9gLCBvbmVcbiAqIGxldmVsICphYm92ZSogdGhlIHN0YWdpbmcgdHJlZSkgc28gdGhhdCBhIHNpbmdsZSBhc3NldCBpcyBzZWxmLWRlc2NyaWJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXBsb3llZE1hbmlmZXN0UGF0aChkZXBsb3ltZW50Um9vdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oZGVwbG95bWVudFJvb3QsIFJVTlRJTUVfRElSX05BTUUsIE1BTklGRVNUX0ZJTEVfTkFNRSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlck1hbmlmZXN0IHtcbiAgcmVhZG9ubHkgdmVyc2lvbjogMTtcbiAgcmVhZG9ubHkgYnVpbGRJZDogc3RyaW5nO1xuICAvKipcbiAgICogRnJvbSB0aGUgZGVwbG95bWVudCByb290IHRvIHRoZSBOZXh0LmpzIHByb2plY3QgZGlyLiBcIlwiIHdoZW4gdGhlIGFwcCBpcyBhdFxuICAgKiB0aGUgcmVwbyByb290LlxuICAgKlxuICAgKiAqKlRoZSBydW50aW1lIGBjaGRpcmBzIGhlcmUgYXQgY29sZCBzdGFydCwgYW5kIHRoYXQgaXMgbG9hZC1iZWFyaW5nLioqIE5leHRcbiAgICogaW5saW5lcyBgX19ORVhUX1JFTEFUSVZFX1BST0pFQ1RfRElSID0gcmVsYXRpdmUoYnVpbGRDd2QsIHByb2plY3REaXIpYCBpbnRvXG4gICAqIGV2ZXJ5IGVudHJ5cG9pbnQgYXQgYnVpbGQgdGltZSAoYG5leHQvZGlzdC9idWlsZC9kZWZpbmUtZW52LmpzYCksIGFuZCB0aGVcbiAgICogYnVpbHQgY29kZSByZXNvbHZlcyBpdCBhcyBgam9pbihwcm9jZXNzLmN3ZCgpLCByZWxhdGl2ZVByb2plY3REaXIpYCB0byBmaW5kXG4gICAqIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAsIHRoZSBwcmVyZW5kZXIgbWFuaWZlc3QsIGFuZCB0aGUgYXBwJ3Mgb3duXG4gICAqIGZpbGVzLiBgcmVxdWVzdE1ldGEucmVsYXRpdmVQcm9qZWN0RGlyYCBvdmVycmlkZXMgaXQgaW5cbiAgICogYG5leHQvZGlzdC9zZXJ2ZXIvcm91dGUtbW9kdWxlcy9yb3V0ZS1tb2R1bGUuanNgIGJ1dCAqKm5vdCoqIGluXG4gICAqIGBhcHAtcGFnZS1ydW50aW1lLmpzYCwgd2hpY2ggcGFzc2VzIHRoZSBpbmxpbmVkIHZhbHVlIHRocm91Z2ggYXMgdGhlIHJlbmRlclxuICAgKiBgZGlyYCDigJQgc28gYHByb2Nlc3MuY3dkKClgIGlzIHRoZSBvbmx5IG1lY2hhbmlzbSB0aGF0IGNvdmVycyBldmVyeVxuICAgKiBlbnRyeXBvaW50IHR5cGUuIGBidWlsZC1vdXRwdXRzLnRzYCBhc3NlcnRzIGBidWlsZEN3ZCA9PT0gcHJvamVjdERpcmAgdG9cbiAgICoga2VlcCB0aGUgaW5saW5lZCB2YWx1ZSBgXCJcImAgYW5kIHRoaXMgZmllbGQgdGhlIHdob2xlIGFuc3dlci5cbiAgICovXG4gIHJlYWRvbmx5IHJlbGF0aXZlUHJvamVjdERpcjogc3RyaW5nO1xuICByZWFkb25seSBjb25maWc6IEFkYXB0ZXJNYW5pZmVzdENvbmZpZztcbiAgLyoqIGBjdHgucm91dGluZ2AgdmVyYmF0aW0sIGluY2x1ZGluZyBgbWlkZGxld2FyZU1hdGNoZXJzYC4gKi9cbiAgcmVhZG9ubHkgcm91dGluZzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEV2ZXJ5IHBhdGhuYW1lIGByZXNvbHZlUm91dGVzYCBpcyBhbGxvd2VkIHRvIG1hdGNoOiB0aGUge0BsaW5rIGVudHJ5cG9pbnRzfVxuICAgKiBrZXlzIHBsdXMge0BsaW5rIHN0YXRpY0ZpbGVzfS4gU29ydGVkIGFuZCBkZWR1cGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aG5hbWVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFJvdXRlICp0ZW1wbGF0ZSogKGAvYmxvZy9bc2x1Z11gKSDihpIgZW50cnlwb2ludC4gS2V5cyBhcmUgYmFzZVBhdGgtIGFuZFxuICAgKiBsb2NhbGUtcHJlZml4ZWQgZXhhY3RseSBhcyBgcmVzb2x2ZVJvdXRlc2AgcmVwb3J0cyBgcmVzb2x2ZWRQYXRobmFtZWAsIHNvXG4gICAqIHRoZSBsb29rdXAgaXMgYSBwbGFpbiBpbmRleCB3aXRoIG5vIG5vcm1hbGl6YXRpb24uXG4gICAqXG4gICAqIEluY2x1ZGVzIGR5bmFtaWMgKnByZXJlbmRlciogdGVtcGxhdGVzIChub3RhYmx5IFBhZ2VzIFJvdXRlclxuICAgKiBgL19uZXh0L2RhdGEvPGJ1aWxkSWQ+Lzxsb2NhbGU+L2Jsb2cvW3NsdWddLmpzb25gKSBtYXBwZWQgdG8gdGhlIGVudHJ5cG9pbnRcbiAgICogb2YgdGhlIHJvdXRlIHRoYXQgb3ducyB0aGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgZW50cnlwb2ludHM6IFJlY29yZDxzdHJpbmcsIEFkYXB0ZXJFbnRyeXBvaW50PjtcbiAgcmVhZG9ubHkgbWlkZGxld2FyZTogQWRhcHRlck1pZGRsZXdhcmUgfCBudWxsO1xuICAvKipcbiAgICogUGF0aG5hbWUg4oaSIHJlcG8tcm9vdC1yZWxhdGl2ZSBQT1NJWCBrZXkgb2YgdGhlIGZpbGUgdG8gc2VydmUuXG4gICAqXG4gICAqIEEgbWFwIHJhdGhlciB0aGFuIGEgbGlzdCBvZiBwYXRobmFtZXMgYmVjYXVzZSB0aGUgdHdvIGFyZSBub3QgZGVyaXZhYmxlIGZyb21cbiAgICogZWFjaCBvdGhlcjogYC9mYXZpY29uLmljb2AgaXMgYDxkaXN0RGlyPi9zZXJ2ZXIvYXBwL2Zhdmljb24uaWNvLmJvZHlgLCBgLzQwNGBcbiAgICogaXMgYDxkaXN0RGlyPi9zZXJ2ZXIvcGFnZXMvNDA0Lmh0bWxgLCBhbmQgYSBmdWxseS1zdGF0aWMgUGFnZXMgUm91dGVyIHJvdXRlXG4gICAqIGlzIGA8ZGlzdERpcj4vc2VydmVyL3BhZ2VzLzxyb3V0ZT4uaHRtbGAuIFRoZSBydW50aW1lIHNlcnZlcyB0aGVzZSBpdHNlbGYg4oCUXG4gICAqIGBOZXh0anNTdGF0aWNBc3NldHNgIG9ubHkgdXBsb2FkcyBgPGRpc3REaXI+L3N0YXRpY2AgYW5kIGBwdWJsaWNgLCBzbyBub3RoaW5nXG4gICAqIGluIGZyb250IG9mIHRoZSBjb21wdXRlIGNhbiBhbnN3ZXIgdGhlbS5cbiAgICpcbiAgICogV2hldGhlciB0aGUgZmlsZSBpcyBwcmVzZW50IGluIHRoZSBkZXBsb3ltZW50IHBhY2thZ2UgZGVwZW5kcyBvbiB0aGVcbiAgICogZGVwbG95bWVudCB0eXBlOyBzZWUgYHN0YWdlU2VydmVkU3RhdGljRmlsZXNgIGluIGBidWlsZC1vdXRwdXRzLnRzYC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRpY0ZpbGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogR3JvdXAgbmFtZSDihpIgdGhlIHJvdXRlIHRlbXBsYXRlcyB0aGF0IGdyb3VwJ3MgZGVwbG95bWVudCBwYWNrYWdlIGhvbGRzLFxuICAgKiBpbmNsdWRpbmcgdGhlIGltcGxpY2l0IGBkZWZhdWx0YC4gQWJzZW50IHdoZW4gYGZ1bmN0aW9uR3JvdXBzYCBpcyBub3QgdXNlZC5cbiAgICpcbiAgICogRXZlcnkgZ3JvdXAgZ2V0cyB0aGUgKnNhbWUqIG1hbmlmZXN0LCBiZWNhdXNlIHJvdXRpbmcgaXMgaWRlbnRpY2FsIGluIGFsbCBvZlxuICAgKiB0aGVtOiBtaWRkbGV3YXJlLCByZWRpcmVjdHMgYW5kIHJld3JpdGVzIGFyZSBkdXBsaWNhdGVkIGJ5IGRlc2lnbiwgYW5kIGFcbiAgICogZ3JvdXAgaGFzIHRvIGJlIGFibGUgdG8gcmVzb2x2ZSBhIHBhdGhuYW1lIGl0IGRvZXMgbm90IG93biBpbiBvcmRlciB0byBzYXkgc29cbiAgICogcmF0aGVyIHRoYW4gY3Jhc2ggb24gYSBtaXNzaW5nIGZpbGUuIFRoaXMgZmllbGQgaXMgd2hhdCBsZXRzIGl0IHNheSBzby5cbiAgICovXG4gIHJlYWRvbmx5IGdyb3Vwcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqXG4gICAqIEV2ZXJ5IGJlaGF2aW9yIHRoZSBlZGdlIHJvdXRlcyBhIG5vbi1kZWZhdWx0IGdyb3VwIG9uLCBtb3N0IHNwZWNpZmljIGZpcnN0XG4gICAqIChgR3JvdXBCZWhhdmlvcmAgaW4gYGZ1bmN0aW9uLWdyb3Vwcy50c2ApLiBQcmVzZW50IGV4YWN0bHkgd2hlblxuICAgKiB7QGxpbmsgZ3JvdXBzfSBpcy4gUmVjb3JkZWQgYnkgdGhlIGFzc2lnbm1lbnQgcmF0aGVyIHRoYW4gcmVjb21wdXRlZCBhdFxuICAgKiBzeW50aCwgc28gdGhlIGJlaGF2aW9ycyBkZXBsb3llZCBhcmUgdGhlIG9uZXMgaXQgY2hlY2tlZC5cbiAgICovXG4gIHJlYWRvbmx5IGJlaGF2aW9ycz86IHsgZ3JvdXA6IHN0cmluZzsgcm91dGU6IHN0cmluZzsgcGF0dGVybjogc3RyaW5nIH1bXTtcbiAgLyoqXG4gICAqIFRoZSBgZnVuY3Rpb25Hcm91cHNgIHRoZSBidWlsZCB3YXMgc3BsaXQgYnkgKG5hbWUgYW5kIHJvdXRlcywgYXMgcGFzc2VkIGluXG4gICAqIGBDREtfTkVYVEpTX0ZVTkNUSU9OX0dST1VQU2ApLCBwcmVzZW50IGV4YWN0bHkgd2hlbiB7QGxpbmsgZ3JvdXBzfSBpcy4gU3ludGhcbiAgICogY29tcGFyZXMgaXQgd2l0aCBpdHMgb3duIHByb3BzIHRvIGNhdGNoIGEgc3RhbGUgb3IgaGFuZC1ydW4gYnVpbGQuXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkdyb3Vwcz86IHsgbmFtZTogc3RyaW5nOyByb3V0ZXM6IHN0cmluZ1tdIH1bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVyTWFuaWZlc3RDb25maWcge1xuICByZWFkb25seSBiYXNlUGF0aDogc3RyaW5nO1xuICByZWFkb25seSB0cmFpbGluZ1NsYXNoOiBib29sZWFuO1xuICByZWFkb25seSBhc3NldFByZWZpeDogc3RyaW5nO1xuICAvKipcbiAgICogYGRpc3REaXJgIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGRpciDigJQgYC5uZXh0YCB1bmxlc3MgY29uZmlndXJlZC4gUE9TSVguXG4gICAqIFRoZSBydW50aW1lIHJlYWRzIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAgZnJvbSBoZXJlIGZvciB0aGUgaW1hZ2VcbiAgICogb3B0aW1pemVyJ3MgY29uZmlnLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdERpcjogc3RyaW5nO1xuICAvKipcbiAgICogYG5leHQuY29uZmlnYCBgY29tcHJlc3NgLiBUaGUgcnVudGltZSBnemlwcyBzdHJlYW1lZCByZXNwb25zZXMgaXRzZWxmXG4gICAqIChuZWl0aGVyIEFQSSBHYXRld2F5IGluIFNUUkVBTSBtb2RlIG5vciBDbG91ZEZyb250IGNhbiksIHNvIGhvbm9yaW5nIHRoaXNcbiAgICogaXMgb24gdXMuXG4gICAqL1xuICByZWFkb25seSBjb21wcmVzczogYm9vbGVhbjtcbiAgLyoqXG4gICAqIGBuZXh0LmNvbmZpZ2AgYGdlbmVyYXRlRXRhZ3NgLiBIb25vcmVkIGZvciB0aGUgZmlsZXMgdGhlIHJ1bnRpbWUgc2VydmVzXG4gICAqIGl0c2VsZiwgYXMgYG5leHQgc3RhcnRgIGRvZXMgKGBzZXJ2ZVN0YXRpY2AncyBgZXRhZ2Agb3B0aW9uKS5cbiAgICovXG4gIHJlYWRvbmx5IGdlbmVyYXRlRXRhZ3M6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBgUmVzb2x2ZVJvdXRlc1BhcmFtc1tcImkxOG5cIl1gLXNoYXBlZCwgbmFycm93ZXIgdGhhbiBOZXh0Q29uZmlnQ29tcGxldGUuXG4gICAqIGBudWxsYCB3aGVuIHRoZSBhcHAgY29uZmlndXJlcyBubyBgaTE4bmAuXG4gICAqL1xuICByZWFkb25seSBpMThuOiB1bmtub3duIHwgbnVsbDtcbiAgLyoqXG4gICAqIGBuZXh0LmNvbmZpZ2AgYGRlcGxveW1lbnRJZGAgKG9yIGBORVhUX0RFUExPWU1FTlRfSURgKSwgcmVkdWNlZCB0byB0aGVcbiAgICogY2hhcmFjdGVycyBzYWZlIGluIGFuIFMzIGtleSBwcmVmaXggYW5kIGEgRHluYW1vREIgcGFydGl0aW9uIGtleSDigJQgYC9gIGluXG4gICAqIHBhcnRpY3VsYXIgd291bGQgc3BsaXQgdGhlIHByZWZpeCBgcHJ1bmUtY2FjaGUtYnVja2V0LnRzYCBtYXRjaGVzIG9uLiBgXCJcImBcbiAgICogd2hlbiB0aGUgYXBwIHNldHMgbm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBBZGFwdGVyRW50cnlwb2ludFR5cGUgPVxuICBcImFwcC1wYWdlXCIgfCBcImFwcC1yb3V0ZVwiIHwgXCJwYWdlXCIgfCBcInBhZ2UtYXBpXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlckVudHJ5cG9pbnQge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKiogUmVwby1yb290LXJlbGF0aXZlIFBPU0lYIGtleSBpbnNpZGUgdGhlIHN0YWdpbmcgdHJlZS4gTmV2ZXIgYWJzb2x1dGUuICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHR5cGU6IEFkYXB0ZXJFbnRyeXBvaW50VHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVyTWlkZGxld2FyZSB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIC8qKiBSZXBvLXJvb3QtcmVsYXRpdmUgUE9TSVgga2V5IGluc2lkZSB0aGUgc3RhZ2luZyB0cmVlLiBOZXZlciBhYnNvbHV0ZS4gKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcbn1cbiJdfQ==
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuaWZlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9tYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF1RUEsa0RBRUM7QUFvREQsb0RBRUM7QUEvSEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILHlDQUFpQztBQUVqQzs7O0dBR0c7QUFDVSxRQUFBLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDO0FBRXJEOzs7O0dBSUc7QUFDVSxRQUFBLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUV0Qzs7Ozs7Ozs7OztHQVVHO0FBQ1UsUUFBQSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBRXhDOzs7R0FHRztBQUNVLFFBQUEsc0JBQXNCLEdBQUcsMkJBQTJCLENBQUM7QUFFbEU7Ozs7O0dBS0c7QUFDVSxRQUFBLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQzdDLHNDQUFzQyxDQUN2QyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLEtBQWM7SUFDaEQsT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyx3QkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyx1QkFBZSxJQUFJLEtBQUssRUFBRSxDQUFDO0FBQ2hGLENBQUM7QUFFRCx3RUFBd0U7QUFDM0QsUUFBQSxrQkFBa0IsR0FBRyxlQUFlLENBQUM7QUFFbEQ7OztHQUdHO0FBQ1UsUUFBQSxvQkFBb0IsR0FBRztJQUNsQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDO0lBQzVCLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUNiLFFBQVEsRUFBRSxTQUFTO0NBQ3BCLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNVLFFBQUEsbUJBQW1CLEdBQUc7SUFDakMsR0FBRyw0QkFBb0IsQ0FBQyxHQUFHLENBQUM7SUFDNUIsR0FBRyw0QkFBb0IsQ0FBQyxHQUFHLENBQUM7SUFDNUIsNEJBQW9CLENBQUMsUUFBUTtDQUM5QixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDVSxRQUFBLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDO0FBRXJEOzs7Ozs7OztHQVFHO0FBQ1UsUUFBQSxzQkFBc0IsR0FBRyxtQkFBbUIsQ0FBQztBQUUxRDs7Ozs7R0FLRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLGNBQXNCO0lBQ3pELE9BQU8sSUFBQSxnQkFBSSxFQUFDLGNBQWMsRUFBRSx3QkFBZ0IsRUFBRSwwQkFBa0IsQ0FBQyxDQUFDO0FBQ3BFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBidWlsZC10aW1lIOKGkiBydW4tdGltZSBjb250cmFjdCBmb3IgdGhlIGFkYXB0ZXIgcnVudGltZS5cbiAqXG4gKiBgc3JjL2FkYXB0ZXIvYnVpbGQtb3V0cHV0cy50c2Agd3JpdGVzIGFuIHtAbGluayBBZGFwdGVyTWFuaWZlc3R9IGR1cmluZ1xuICogYG5leHQgYnVpbGRgOyB0aGUgcnVudGltZSBzaGVsbHMgaW4gYHNyYy9ydW50aW1lL2AgcmVhZCBpdCBhdCBjb2xkIHN0YXJ0IGFuZFxuICogdGhlIENESyBjb25zdHJ1Y3RzIHJlYWQgaXQgYXQgc3ludGguIEl0IGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgY3Jvc3NlcyB0aG9zZVxuICogdGhyZWUgYm91bmRhcmllcywgc28gaXQgaXMgZGVsaWJlcmF0ZWx5IHBsYWluIEpTT04uXG4gKlxuICogKipFdmVyeSBwYXRoIGluIHRoaXMgbWFuaWZlc3QgaXMgYSByZXBvLXJvb3QtcmVsYXRpdmUgUE9TSVgga2V5KiosIG5ldmVyIGFcbiAqIGJ1aWxkLW1hY2hpbmUgYWJzb2x1dGUgcGF0aDogYWJzb2x1dGUgcGF0aHMgd29yayBvbiB0aGUgYnVpbGQgbWFjaGluZSBhbmRcbiAqIGZhaWwgaW4gTGFtYmRhLiBUaGUgc3RhZ2luZyB0cmVlIHRob3NlIGtleXMgaW5kZXggaW50byBpc1xuICogYDxkaXN0RGlyPi9jZGstbmV4dGpzLWFkYXB0ZXIvYXBwYDsgdGhlIHJ1bnRpbWUgY2FsbHMgdGhhdCBkaXJlY3RvcnkgdGhlXG4gKiAqZGVwbG95bWVudCByb290KiBhbmQgcmVzb2x2ZXMgZXZlcnkga2V5IGFnYWluc3QgaXQuIFRoZSBleGNlcHRpb25zIGFyZSB0aGVcbiAqIE5leHQuanMgY29uZmlnIGNvcGllZCBpbnRvIHtAbGluayBBZGFwdGVyTWFuaWZlc3RDb25maWd9OiBgY2FjaGVIYW5kbGVyYCBpc1xuICogcmVsYXRpdmUgdG8gdGhlIGRpc3QgZGlyLCBhcyBOZXh0J3Mgb3duIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAgaGFzIGl0LFxuICogYW5kIGBpbWFnZXNgIGlzIGNvcGllZCB3aG9sZSwgc28gYGltYWdlcy5sb2FkZXJGaWxlYCBzdGF5cyB0aGUgYnVpbGQgbWFjaGluZSdzXG4gKiBhYnNvbHV0ZSBwYXRoIChub3RoaW5nIGluIHRoZSBydW50aW1lIHJlYWRzIGl0KS5cbiAqXG4gKiBUaGlzIGZpbGUgaXMgaW50ZW50aW9uYWxseSBub3QgZXhwb3J0ZWQgZnJvbSBgc3JjL2luZGV4LnRzYDogaXQgaXMgYW5cbiAqIGludGVybmFsIGNvbnRyYWN0LCBub3QgcHVibGljIGNvbnN0cnVjdCBBUEksIHNvIGl0IGlzIGV4ZW1wdCBmcm9tIHRoZSBKU0lJXG4gKiByZXN0cmljdGlvbnMgdGhlIHJlc3Qgb2YgYHNyYy9gIGZvbGxvd3MuXG4gKi9cbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbi8qKlxuICogRGlyZWN0b3J5IHdyaXR0ZW4gaW5zaWRlIGBkaXN0RGlyYCAoYC5uZXh0YCksIG1hdGNoaW5nIHRoZSBleGlzdGluZ1xuICogYGNkay1uZXh0anMtaW5pdC1jYWNoZWAgY29udmVudGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEFEQVBURVJfRElSX05BTUUgPSBcImNkay1uZXh0anMtYWRhcHRlclwiO1xuXG4vKipcbiAqIERlcGxveW1lbnQgcm9vdCBpbnNpZGUge0BsaW5rIEFEQVBURVJfRElSX05BTUV9OiB0aGUgc3RhZ2VkIHVuaW9uIG9mIGV2ZXJ5XG4gKiBzaGlwcGVkIG91dHB1dCdzIHRyYWNlZCBgYXNzZXRzYCwga2V5ZWQgYnkgcmVwby1yb290LXJlbGF0aXZlIHBhdGguIFRoaXMgaXNcbiAqIHdoYXQgcmVwbGFjZXMgYG91dHB1dDogXCJzdGFuZGFsb25lXCJgLlxuICovXG5leHBvcnQgY29uc3QgU1RBR0lOR19ESVJfTkFNRSA9IFwiYXBwXCI7XG5cbi8qKlxuICogUGFyZW50IG9mIHRoZSBwZXItZ3JvdXAgZGVwbG95bWVudCByb290cywgdXNlZCBpbnN0ZWFkIG9mXG4gKiB7QGxpbmsgU1RBR0lOR19ESVJfTkFNRX0gd2hlbiBgZnVuY3Rpb25Hcm91cHNgIHNwbGl0cyB0aGUgYXBwOiBlYWNoIGdyb3VwIGlzXG4gKiBzdGFnZWQgYXQgYDxkaXN0RGlyPi9jZGstbmV4dGpzLWFkYXB0ZXIvZ3JvdXBzLzxuYW1lPi9gLCBpbmNsdWRpbmcgdGhlIGltcGxpY2l0XG4gKiBgZGVmYXVsdGAgb25lLlxuICpcbiAqIFNwbGl0dGluZyBnZXRzIGl0cyBvd24gc3VidHJlZSByYXRoZXIgdGhhbiByZXVzaW5nIGBhcHAvYCBmb3IgdGhlIGRlZmF1bHQgZ3JvdXBcbiAqIHNvIHRoYXQgYSB0cmVlIGxlZnQgb3ZlciBmcm9tIGEgYnVpbGQgd2l0aCBkaWZmZXJlbnQgZ3JvdXBpbmcgY2FuIG5ldmVyIGJlXG4gKiBtaXN0YWtlbiBmb3IgdGhpcyBidWlsZCdzLCBhbmQgc28gYGR1YCBvbiBlaXRoZXIgZGlyZWN0b3J5IGFuc3dlcnMgXCJob3cgYmlnIGlzXG4gKiB0aGUgdGhpbmcgSSBkZXBsb3lcIiB3aXRob3V0IHF1YWxpZmljYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBHUk9VUFNfRElSX05BTUUgPSBcImdyb3Vwc1wiO1xuXG4vKipcbiAqIFdoaWNoIGdyb3VwIHRoZSBydW5uaW5nIGZ1bmN0aW9uICppcyouIFNldCBwZXIgTGFtYmRhIGF0IHN5bnRoLCByZWFkIGJ5IHRoZVxuICogcnVudGltZSBvbmx5IHRvIG1ha2UgYSBtaXNyb3V0ZSBzYXkgc287IHNlZSBgb3duZWRSb3V0ZUVycm9yYC5cbiAqL1xuZXhwb3J0IGNvbnN0IEZVTkNUSU9OX0dST1VQX0VOVl9WQVIgPSBcIkNES19ORVhUSlNfRlVOQ1RJT05fR1JPVVBcIjtcblxuLyoqXG4gKiBUaGUgZ2xvYmFsIHRoZSBjYWNoZSBoYW5kbGVyIChgc3JjL2FkYXB0ZXIvczMtY2FjaGUtaGFuZGxlci50c2ApIHJlZ2lzdGVycyBpdHNcbiAqIENsb3VkRnJvbnQgaW52YWxpZGF0aW9uIGhvb2sgdW5kZXIsIGFuZCB0aGUgcnVudGltZSAoYGNvcmUudHNgKSBjYWxscy4gQSBnbG9iYWxcbiAqIHJhdGhlciB0aGFuIGFuIGltcG9ydCwgYmVjYXVzZSB0aGUgY2FjaGUgaGFuZGxlciBpcyBhIHNlcGFyYXRlIGJ1bmRsZSB0aGF0XG4gKiBOZXh0LmpzIGxvYWRzIGl0c2VsZjogdGhlIHR3byBzaGFyZSBhIHByb2Nlc3MsIG5vdCBhIG1vZHVsZSBncmFwaC5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFVkFMSURBVEVEX1BBR0VfSE9PSyA9IFN5bWJvbC5mb3IoXG4gIFwiY2RrLW5leHRqcy5pbnZhbGlkYXRlUmV2YWxpZGF0ZWRQYWdlXCIsXG4pO1xuXG4vKipcbiAqIERpcmVjdG9yeSBpbnNpZGUge0BsaW5rIEFEQVBURVJfRElSX05BTUV9IGhvbGRpbmcgb25lIGRlcGxveW1lbnQgcm9vdCwgcmVsYXRpdmVcbiAqIGFuZCBQT1NJWC4gYHVuZGVmaW5lZGAgbWVhbnMgXCJub3Qgc3BsaXR0aW5nXCIsIHdoaWNoIGlzIGl0cyBvd24gbGF5b3V0IHJhdGhlclxuICogdGhhbiBhIGdyb3VwIG5hbWVkIGBkZWZhdWx0YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwU3RhZ2luZ0Rpck5hbWUoZ3JvdXA/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZ3JvdXAgPT09IHVuZGVmaW5lZCA/IFNUQUdJTkdfRElSX05BTUUgOiBgJHtHUk9VUFNfRElSX05BTUV9LyR7Z3JvdXB9YDtcbn1cblxuLyoqIHtAbGluayBBZGFwdGVyTWFuaWZlc3R9LCB3cml0dGVuIGluc2lkZSB7QGxpbmsgQURBUFRFUl9ESVJfTkFNRX0uICovXG5leHBvcnQgY29uc3QgTUFOSUZFU1RfRklMRV9OQU1FID0gXCJtYW5pZmVzdC5qc29uXCI7XG5cbi8qKlxuICogVGhlIGVudHJ5cG9pbnRzIHRoZSBydW50aW1lIHJlbmRlcnMgYSA0MDQgb3IgYSA1MDAgd2l0aCwgaW4gdGhlIG9yZGVyIGl0XG4gKiB0cmllcyB0aGVtLCBhbmQgYC9fZXJyb3JgLCB0aGUgbGFzdCByZXNvcnQgZm9yIGJvdGguIEJlZm9yZSBiYXNlUGF0aC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNUQVRVU19QQUdFX1NVRkZJWEVTID0ge1xuICA0MDQ6IFtcIi9fbm90LWZvdW5kXCIsIFwiLzQwNFwiXSxcbiAgNTAwOiBbXCIvNTAwXCJdLFxuICBmYWxsYmFjazogXCIvX2Vycm9yXCIsXG59O1xuXG4vKipcbiAqIEV2ZXJ5IHtAbGluayBTVEFUVVNfUEFHRV9TVUZGSVhFU30gcGFnZTogQXBwIFJvdXRlcidzIGAvX25vdC1mb3VuZGAsIFBhZ2VzXG4gKiBSb3V0ZXIncyBgLzQwNGAgYW5kIGAvNTAwYCwgYW5kIGAvX2Vycm9yYC4gVGhlIHJ1bnRpbWUgbWF5IHJlbmRlciBhbnkgcmVxdWVzdFxuICogd2l0aCB0aGVtLCB3aGVyZXZlciBpdCBsYW5kZWQsIHNvIGV2ZXJ5IGZ1bmN0aW9uIGdyb3VwIHN0YWdlcyB0aGVtXG4gKiAoYGNvbGxlY3RHcm91cFN0YWdpbmdQbGFuYCkgYW5kIG5vIFVSTCBoYXMgdG8gYmUgcm91dGVkIHRvIHRoZW0uXG4gKi9cbmV4cG9ydCBjb25zdCBFUlJPUl9QQUdFX1NVRkZJWEVTID0gW1xuICAuLi5TVEFUVVNfUEFHRV9TVUZGSVhFU1s0MDRdLFxuICAuLi5TVEFUVVNfUEFHRV9TVUZGSVhFU1s1MDBdLFxuICBTVEFUVVNfUEFHRV9TVUZGSVhFUy5mYWxsYmFjayxcbl07XG5cbi8qKlxuICogUmVzZXJ2ZWQga2V5IGluc2lkZSB0aGUgc3RhZ2luZyB0cmVlIHRoYXQgY2RrLW5leHRqcydzIG93biBidW5kbGVkIHJ1bnRpbWVcbiAqIGZpbGVzIGFyZSBjb3BpZWQgdG8gYXQgc3ludGggKExhbWJkYSBoYW5kbGVyXG4gKiBgY2RrLW5leHRqcy1ydW50aW1lL2xhbWJkYS5oYW5kbGVyYCkuIFJlc2VydmVkIGJlY2F1c2UgYSByZXBvLXJvb3QtcmVsYXRpdmVcbiAqIGFzc2V0IGtleSBjb3VsZCBvdGhlcndpc2UgY29sbGlkZSB3aXRoIGl0LlxuICovXG5leHBvcnQgY29uc3QgUlVOVElNRV9ESVJfTkFNRSA9IFwiY2RrLW5leHRqcy1ydW50aW1lXCI7XG5cbi8qKlxuICogVGhlIGZpbGUsIG5leHQgdG8gdGhlIG1hbmlmZXN0IGluIHtAbGluayBSVU5USU1FX0RJUl9OQU1FfSwgdGhhdCBsaXN0c1xuICogYHB1YmxpYy9gIG9uIGV2ZXJ5IHR5cGUgYnV0IGBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNgOiBhIEpTT04gYXJyYXkgb2ZcbiAqIGAvYC1zZXBhcmF0ZWQgcGF0aHMgcmVsYXRpdmUgdG8gYHB1YmxpYy9gLCBhcyBgcmVhZFB1YmxpY0ZpbGVzYCByZXR1cm5zIHRoZW0uXG4gKiBTeW50aCB3cml0ZXMgaXQgYWZ0ZXIgdGhlIGJ1aWxkIGNvbW1hbmQgKHNvIGBwb3N0YnVpbGRgIG91dHB1dCBpcyBsaXN0ZWQpXG4gKiBiZWNhdXNlIHRob3NlIGRlcGxveW1lbnQgcGFja2FnZXMgZG8gbm90IGNhcnJ5IGBwdWJsaWMvYCBpdHNlbGY7IHRoZSBydW50aW1lXG4gKiBzZXJ2ZXMgYSBsaXN0ZWQgZmlsZSBmcm9tIFMzLiBUaGUgUmVnaW9uYWxDb250YWluZXJzIGltYWdlIGNvcGllcyBgcHVibGljL2BcbiAqIGluIGFuZCBoYXMgbm8gc3VjaCBmaWxlLlxuICovXG5leHBvcnQgY29uc3QgUFVCTElDX0ZJTEVTX0ZJTEVfTkFNRSA9IFwicHVibGljLWZpbGVzLmpzb25cIjtcblxuLyoqXG4gKiBXaGVyZSB0aGUgcnVudGltZSByZWFkcyB7QGxpbmsgQWRhcHRlck1hbmlmZXN0fSBmcm9tLCBnaXZlbiB0aGUgZGVwbG95bWVudFxuICogcm9vdC4gU3ludGggY29waWVzIGBtYW5pZmVzdC5qc29uYCBpbiBuZXh0IHRvIHRoZSBidW5kbGVkIHNoZWxscyByYXRoZXIgdGhhblxuICogbGVhdmluZyBpdCBhdCBpdHMgYnVpbGQtdGltZSBsb2NhdGlvbiAoYDxkaXN0RGlyPi9jZGstbmV4dGpzLWFkYXB0ZXIvYCwgb25lXG4gKiBsZXZlbCAqYWJvdmUqIHRoZSBzdGFnaW5nIHRyZWUpIHNvIHRoYXQgYSBzaW5nbGUgYXNzZXQgaXMgc2VsZi1kZXNjcmliaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVwbG95ZWRNYW5pZmVzdFBhdGgoZGVwbG95bWVudFJvb3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBqb2luKGRlcGxveW1lbnRSb290LCBSVU5USU1FX0RJUl9OQU1FLCBNQU5JRkVTVF9GSUxFX05BTUUpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0ZXJNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBUaGUgY2RrLW5leHRqcyB0aGF0IHdyb3RlIHRoaXMgKGBDREtfTkVYVEpTX1ZFUlNJT05gKS4gV2hhdGV2ZXIgcmVhZHMgdGhlXG4gICAqIG1hbmlmZXN0IHJlcXVpcmVzIGl0cyBvd24gdmVyc2lvbiBoZXJlLCByYXRoZXIgdGhhbiBhIGhhbmQtYnVtcGVkIHNoYXBlXG4gICAqIHZlcnNpb246IHRoZSBhZGFwdGVyIGFuZCBpdHMgcmVhZGVycyBzaGlwIGluIG9uZSBwYWNrYWdlLCBzbyBhIG1pc21hdGNoIGlzXG4gICAqIGFsd2F5cyBhIHN0YWxlIGJ1aWxkIG9yIGEgc2Vjb25kIGNkay1uZXh0anMgaW5zdGFsbC5cbiAgICovXG4gIHJlYWRvbmx5IGNka05leHRqc1ZlcnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgYnVpbGRJZDogc3RyaW5nO1xuICAvKipcbiAgICogRnJvbSB0aGUgZGVwbG95bWVudCByb290IHRvIHRoZSBOZXh0LmpzIHByb2plY3QgZGlyLiBcIlwiIHdoZW4gdGhlIGFwcCBpcyBhdFxuICAgKiB0aGUgcmVwbyByb290LlxuICAgKlxuICAgKiAqKlRoZSBydW50aW1lIGBjaGRpcmBzIGhlcmUgYXQgY29sZCBzdGFydCwgYW5kIHRoYXQgaXMgbG9hZC1iZWFyaW5nLioqIE5leHRcbiAgICogaW5saW5lcyBgX19ORVhUX1JFTEFUSVZFX1BST0pFQ1RfRElSID0gcmVsYXRpdmUoYnVpbGRDd2QsIHByb2plY3REaXIpYCBpbnRvXG4gICAqIGV2ZXJ5IGVudHJ5cG9pbnQgYXQgYnVpbGQgdGltZSAoYG5leHQvZGlzdC9idWlsZC9kZWZpbmUtZW52LmpzYCksIGFuZCB0aGVcbiAgICogYnVpbHQgY29kZSByZXNvbHZlcyBpdCBhcyBgam9pbihwcm9jZXNzLmN3ZCgpLCByZWxhdGl2ZVByb2plY3REaXIpYCB0byBmaW5kXG4gICAqIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAsIHRoZSBwcmVyZW5kZXIgbWFuaWZlc3QsIGFuZCB0aGUgYXBwJ3Mgb3duXG4gICAqIGZpbGVzLiBgcmVxdWVzdE1ldGEucmVsYXRpdmVQcm9qZWN0RGlyYCBvdmVycmlkZXMgaXQgaW5cbiAgICogYG5leHQvZGlzdC9zZXJ2ZXIvcm91dGUtbW9kdWxlcy9yb3V0ZS1tb2R1bGUuanNgIGJ1dCAqKm5vdCoqIGluXG4gICAqIGBhcHAtcGFnZS1ydW50aW1lLmpzYCwgd2hpY2ggcGFzc2VzIHRoZSBpbmxpbmVkIHZhbHVlIHRocm91Z2ggYXMgdGhlIHJlbmRlclxuICAgKiBgZGlyYCDigJQgc28gYHByb2Nlc3MuY3dkKClgIGlzIHRoZSBvbmx5IG1lY2hhbmlzbSB0aGF0IGNvdmVycyBldmVyeVxuICAgKiBlbnRyeXBvaW50IHR5cGUuIGBidWlsZC1vdXRwdXRzLnRzYCBhc3NlcnRzIGBidWlsZEN3ZCA9PT0gcHJvamVjdERpcmAgdG9cbiAgICoga2VlcCB0aGUgaW5saW5lZCB2YWx1ZSBgXCJcImAgYW5kIHRoaXMgZmllbGQgdGhlIHdob2xlIGFuc3dlci5cbiAgICovXG4gIHJlYWRvbmx5IHJlbGF0aXZlUHJvamVjdERpcjogc3RyaW5nO1xuICByZWFkb25seSBjb25maWc6IEFkYXB0ZXJNYW5pZmVzdENvbmZpZztcbiAgLyoqIGBjdHgucm91dGluZ2AgdmVyYmF0aW0sIGluY2x1ZGluZyBgbWlkZGxld2FyZU1hdGNoZXJzYC4gKi9cbiAgcmVhZG9ubHkgcm91dGluZzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEV2ZXJ5IHBhdGhuYW1lIGByZXNvbHZlUm91dGVzYCBpcyBhbGxvd2VkIHRvIG1hdGNoOiB0aGUge0BsaW5rIGVudHJ5cG9pbnRzfVxuICAgKiBrZXlzIHBsdXMge0BsaW5rIHN0YXRpY0ZpbGVzfS4gU29ydGVkIGFuZCBkZWR1cGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aG5hbWVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFJvdXRlICp0ZW1wbGF0ZSogKGAvYmxvZy9bc2x1Z11gKSDihpIgZW50cnlwb2ludC4gS2V5cyBhcmUgYmFzZVBhdGgtIGFuZFxuICAgKiBsb2NhbGUtcHJlZml4ZWQgZXhhY3RseSBhcyBgcmVzb2x2ZVJvdXRlc2AgcmVwb3J0cyBgcmVzb2x2ZWRQYXRobmFtZWAsIHNvXG4gICAqIHRoZSBsb29rdXAgaXMgYSBwbGFpbiBpbmRleCB3aXRoIG5vIG5vcm1hbGl6YXRpb24uXG4gICAqXG4gICAqIEluY2x1ZGVzIGR5bmFtaWMgKnByZXJlbmRlciogdGVtcGxhdGVzIChub3RhYmx5IFBhZ2VzIFJvdXRlclxuICAgKiBgL19uZXh0L2RhdGEvPGJ1aWxkSWQ+Lzxsb2NhbGU+L2Jsb2cvW3NsdWddLmpzb25gKSBtYXBwZWQgdG8gdGhlIGVudHJ5cG9pbnRcbiAgICogb2YgdGhlIHJvdXRlIHRoYXQgb3ducyB0aGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgZW50cnlwb2ludHM6IFJlY29yZDxzdHJpbmcsIEFkYXB0ZXJFbnRyeXBvaW50PjtcbiAgcmVhZG9ubHkgbWlkZGxld2FyZTogQWRhcHRlck1pZGRsZXdhcmUgfCBudWxsO1xuICAvKipcbiAgICogUGF0aG5hbWUg4oaSIHJlcG8tcm9vdC1yZWxhdGl2ZSBQT1NJWCBrZXkgb2YgdGhlIGZpbGUgdG8gc2VydmUuXG4gICAqXG4gICAqIEEgbWFwIHJhdGhlciB0aGFuIGEgbGlzdCBvZiBwYXRobmFtZXMgYmVjYXVzZSB0aGUgdHdvIGFyZSBub3QgZGVyaXZhYmxlIGZyb21cbiAgICogZWFjaCBvdGhlcjogYC9mYXZpY29uLmljb2AgaXMgYDxkaXN0RGlyPi9zZXJ2ZXIvYXBwL2Zhdmljb24uaWNvLmJvZHlgLCBgLzQwNGBcbiAgICogaXMgYDxkaXN0RGlyPi9zZXJ2ZXIvcGFnZXMvNDA0Lmh0bWxgLCBhbmQgYSBmdWxseS1zdGF0aWMgUGFnZXMgUm91dGVyIHJvdXRlXG4gICAqIGlzIGA8ZGlzdERpcj4vc2VydmVyL3BhZ2VzLzxyb3V0ZT4uaHRtbGAuIFRoZSBydW50aW1lIHNlcnZlcyB0aGVzZSBpdHNlbGYg4oCUXG4gICAqIGBOZXh0anNTdGF0aWNBc3NldHNgIG9ubHkgdXBsb2FkcyBgPGRpc3REaXI+L3N0YXRpY2AgYW5kIGBwdWJsaWNgLCBzbyBub3RoaW5nXG4gICAqIGluIGZyb250IG9mIHRoZSBjb21wdXRlIGNhbiBhbnN3ZXIgdGhlbS5cbiAgICpcbiAgICogV2hldGhlciB0aGUgZmlsZSBpcyBwcmVzZW50IGluIHRoZSBkZXBsb3ltZW50IHBhY2thZ2UgZGVwZW5kcyBvbiB0aGVcbiAgICogZGVwbG95bWVudCB0eXBlOyBzZWUgYHN0YWdlU2VydmVkU3RhdGljRmlsZXNgIGluIGBidWlsZC1vdXRwdXRzLnRzYC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRpY0ZpbGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogR3JvdXAgbmFtZSDihpIgdGhlIHJvdXRlIHRlbXBsYXRlcyB0aGF0IGdyb3VwJ3MgZGVwbG95bWVudCBwYWNrYWdlIGhvbGRzLFxuICAgKiBpbmNsdWRpbmcgdGhlIGltcGxpY2l0IGBkZWZhdWx0YC4gQWJzZW50IHdoZW4gYGZ1bmN0aW9uR3JvdXBzYCBpcyBub3QgdXNlZC5cbiAgICpcbiAgICogRXZlcnkgZ3JvdXAgZ2V0cyB0aGUgKnNhbWUqIG1hbmlmZXN0LCBiZWNhdXNlIHJvdXRpbmcgaXMgaWRlbnRpY2FsIGluIGFsbCBvZlxuICAgKiB0aGVtOiBtaWRkbGV3YXJlLCByZWRpcmVjdHMgYW5kIHJld3JpdGVzIGFyZSBkdXBsaWNhdGVkIGJ5IGRlc2lnbiwgYW5kIGFcbiAgICogZ3JvdXAgaGFzIHRvIGJlIGFibGUgdG8gcmVzb2x2ZSBhIHBhdGhuYW1lIGl0IGRvZXMgbm90IG93biBpbiBvcmRlciB0byBzYXkgc29cbiAgICogcmF0aGVyIHRoYW4gY3Jhc2ggb24gYSBtaXNzaW5nIGZpbGUuIFRoaXMgZmllbGQgaXMgd2hhdCBsZXRzIGl0IHNheSBzby5cbiAgICovXG4gIHJlYWRvbmx5IGdyb3Vwcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqXG4gICAqIEV2ZXJ5IGJlaGF2aW9yIHRoZSBlZGdlIHJvdXRlcyBhIG5vbi1kZWZhdWx0IGdyb3VwIG9uLCBtb3N0IHNwZWNpZmljIGZpcnN0XG4gICAqIChgR3JvdXBCZWhhdmlvcmAgaW4gYGZ1bmN0aW9uLWdyb3Vwcy50c2ApLiBQcmVzZW50IGV4YWN0bHkgd2hlblxuICAgKiB7QGxpbmsgZ3JvdXBzfSBpcy4gUmVjb3JkZWQgYnkgdGhlIGFzc2lnbm1lbnQgcmF0aGVyIHRoYW4gcmVjb21wdXRlZCBhdFxuICAgKiBzeW50aCwgc28gdGhlIGJlaGF2aW9ycyBkZXBsb3llZCBhcmUgdGhlIG9uZXMgaXQgY2hlY2tlZC5cbiAgICovXG4gIHJlYWRvbmx5IGJlaGF2aW9ycz86IHsgZ3JvdXA6IHN0cmluZzsgcm91dGU6IHN0cmluZzsgcGF0dGVybjogc3RyaW5nIH1bXTtcbiAgLyoqXG4gICAqIFRoZSBgZnVuY3Rpb25Hcm91cHNgIHRoZSBidWlsZCB3YXMgc3BsaXQgYnkgKG5hbWUgYW5kIHJvdXRlcywgYXMgcGFzc2VkIGluXG4gICAqIGBDREtfTkVYVEpTX0ZVTkNUSU9OX0dST1VQU2ApLCBwcmVzZW50IGV4YWN0bHkgd2hlbiB7QGxpbmsgZ3JvdXBzfSBpcy4gU3ludGhcbiAgICogY29tcGFyZXMgaXQgd2l0aCBpdHMgb3duIHByb3BzIHRvIGNhdGNoIGEgc3RhbGUgb3IgaGFuZC1ydW4gYnVpbGQuXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkdyb3Vwcz86IHsgbmFtZTogc3RyaW5nOyByb3V0ZXM6IHN0cmluZ1tdIH1bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVyTWFuaWZlc3RDb25maWcge1xuICByZWFkb25seSBiYXNlUGF0aDogc3RyaW5nO1xuICByZWFkb25seSB0cmFpbGluZ1NsYXNoOiBib29sZWFuO1xuICByZWFkb25seSBhc3NldFByZWZpeDogc3RyaW5nO1xuICAvKiogYGRpc3REaXJgIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGRpciDigJQgYC5uZXh0YCB1bmxlc3MgY29uZmlndXJlZC4gUE9TSVguICovXG4gIHJlYWRvbmx5IGRpc3REaXI6IHN0cmluZztcbiAgLyoqXG4gICAqIGBuZXh0LmNvbmZpZ2AgYGNvbXByZXNzYC4gVGhlIHJ1bnRpbWUgZ3ppcHMgc3RyZWFtZWQgcmVzcG9uc2VzIGl0c2VsZlxuICAgKiAobmVpdGhlciBBUEkgR2F0ZXdheSBpbiBTVFJFQU0gbW9kZSBub3IgQ2xvdWRGcm9udCBjYW4pLCBzbyBob25vcmluZyB0aGlzXG4gICAqIGlzIG9uIHVzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcHJlc3M6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBgbmV4dC5jb25maWdgIGBnZW5lcmF0ZUV0YWdzYC4gSG9ub3JlZCBmb3IgdGhlIGZpbGVzIHRoZSBydW50aW1lIHNlcnZlc1xuICAgKiBpdHNlbGYsIGFzIGBuZXh0IHN0YXJ0YCBkb2VzIChgc2VydmVTdGF0aWNgJ3MgYGV0YWdgIG9wdGlvbikuXG4gICAqL1xuICByZWFkb25seSBnZW5lcmF0ZUV0YWdzOiBib29sZWFuO1xuICAvKipcbiAgICogYFJlc29sdmVSb3V0ZXNQYXJhbXNbXCJpMThuXCJdYC1zaGFwZWQsIG5hcnJvd2VyIHRoYW4gTmV4dENvbmZpZ0NvbXBsZXRlLlxuICAgKiBgbnVsbGAgd2hlbiB0aGUgYXBwIGNvbmZpZ3VyZXMgbm8gYGkxOG5gLlxuICAgKi9cbiAgcmVhZG9ubHkgaTE4bjogdW5rbm93biB8IG51bGw7XG4gIC8qKlxuICAgKiBgbmV4dC5jb25maWdgIGBkZXBsb3ltZW50SWRgIChvciBgTkVYVF9ERVBMT1lNRU5UX0lEYCksIHJlZHVjZWQgdG8gdGhlXG4gICAqIGNoYXJhY3RlcnMgc2FmZSBpbiBhbiBTMyBrZXkgcHJlZml4IGFuZCBhIER5bmFtb0RCIHBhcnRpdGlvbiBrZXkg4oCUIGAvYCBpblxuICAgKiBwYXJ0aWN1bGFyIHdvdWxkIHNwbGl0IHRoZSBwcmVmaXggYHBydW5lLWNhY2hlLWJ1Y2tldC50c2AgbWF0Y2hlcyBvbi4gYFwiXCJgXG4gICAqIHdoZW4gdGhlIGFwcCBzZXRzIG5vbmUuXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50SWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIGBuZXh0LmNvbmZpZ2AgYGltYWdlc2AsIHJlc29sdmVkIGFuZCBkZWZhdWx0ZWQgKGBjdHguY29uZmlnLmltYWdlc2ApLlxuICAgKiBgTmV4dENvbmZpZ0NvbXBsZXRlW1wiaW1hZ2VzXCJdYC1zaGFwZWQuIFdpdGgge0BsaW5rIGV4cGVyaW1lbnRhbH0sXG4gICAqIHtAbGluayBjYWNoZUhhbmRsZXJ9IGFuZCB7QGxpbmsgY2FjaGVNYXhNZW1vcnlTaXplfSwgd2hhdCB0aGUgaW1hZ2VcbiAgICogb3B0aW1pemVyIGlzIGhhbmRlZCBhcyBpdHMgYG5leHRDb25maWdgLlxuICAgKlxuICAgKiBgaW1hZ2VzYCBhbmQgYGV4cGVyaW1lbnRhbGAgYXJlIGNvcGllZCB3aG9sZSByYXRoZXIgdGhhbiBmaWVsZCBieSBmaWVsZDpcbiAgICogTmV4dCdzIG9wdGltaXplciBwaWNrcyB3aGF0IGl0IHJlYWRzIG91dCBvZiBib3RoIChzaXggYGV4cGVyaW1lbnRhbC5pbWdPcHQqYFxuICAgKiBmbGFncyBpbiAxNi40KSwgYW5kIGEgaGFuZC1rZXB0IGxpc3Qgd291bGQgc2lsZW50bHkgZHJvcCB0aGUgbmV4dCBvbmUgaXRcbiAgICogc3RhcnRzIHJlYWRpbmcuXG4gICAqL1xuICByZWFkb25seSBpbWFnZXM6IHVua25vd247XG4gIC8qKlxuICAgKiBgbmV4dC5jb25maWdgIGBleHBlcmltZW50YWxgLCByZXNvbHZlZCAoYGN0eC5jb25maWcuZXhwZXJpbWVudGFsYCksIGFzXG4gICAqIEpTT046IGZ1bmN0aW9uLXZhbHVlZCBlbnRyaWVzIGFyZSBkcm9wcGVkLCBhcyB0aGV5IGFyZSBmcm9tXG4gICAqIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAuIFNlZSB7QGxpbmsgaW1hZ2VzfS5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGVyaW1lbnRhbDogdW5rbm93bjtcbiAgLyoqXG4gICAqIGBuZXh0LmNvbmZpZ2AgYGNhY2hlSGFuZGxlcmAsIHJlbGF0aXZlIHRvIHRoZSBkaXN0IGRpciBhc1xuICAgKiBgcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25gIGhhcyBpdCAodGhlIGJ1aWxkIG1hY2hpbmUncyBhYnNvbHV0ZSBwYXRoXG4gICAqIG1lYW5zIG5vdGhpbmcgaW4gdGhlIGRlcGxveW1lbnQpLiBgbnVsbGAgd2hlbiB0aGVyZSBpcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGVIYW5kbGVyOiBzdHJpbmcgfCBudWxsO1xuICAvKiogYG5leHQuY29uZmlnYCBgY2FjaGVNYXhNZW1vcnlTaXplYC4gKi9cbiAgcmVhZG9ubHkgY2FjaGVNYXhNZW1vcnlTaXplOiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIEFkYXB0ZXJFbnRyeXBvaW50VHlwZSA9XG4gIFwiYXBwLXBhZ2VcIiB8IFwiYXBwLXJvdXRlXCIgfCBcInBhZ2VcIiB8IFwicGFnZS1hcGlcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVyRW50cnlwb2ludCB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIC8qKiBSZXBvLXJvb3QtcmVsYXRpdmUgUE9TSVgga2V5IGluc2lkZSB0aGUgc3RhZ2luZyB0cmVlLiBOZXZlciBhYnNvbHV0ZS4gKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgdHlwZTogQWRhcHRlckVudHJ5cG9pbnRUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0ZXJNaWRkbGV3YXJlIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgLyoqIFJlcG8tcm9vdC1yZWxhdGl2ZSBQT1NJWCBrZXkgaW5zaWRlIHRoZSBzdGFnaW5nIHRyZWUuIE5ldmVyIGFic29sdXRlLiAqL1xuICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xufVxuIl19