cdk-nuxt 2.25.1 → 2.26.1

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.
@@ -27,10 +27,6 @@ export interface StaticAssetConfig {
27
27
  * The cache settings to use for the uploaded source files when accessing them on the target path with the specified pattern.
28
28
  */
29
29
  cacheControl: CacheControl[];
30
- /**
31
- * Whether to invalidate the files matching the config's pattern in the distribution's edge caches after the files are uploaded to the destination bucket.
32
- */
33
- invalidateOnChange?: boolean;
34
30
  }
35
31
  /**
36
32
  * Retrieves the static assets of the Nuxt app that shall be publicly available.
@@ -11,6 +11,7 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
11
11
  const getNuxtAppStaticAssetConfigs = (rootDir = '.') => {
12
12
  const customAssetsSourcePath = `${rootDir}/.output/public`;
13
13
  const customAssetsTargetPath = '/';
14
+ const latestBuildManifestPattern = '_nuxt/builds/latest.json';
14
15
  const configs = [
15
16
  // File to detect current deployment revision to delete outdated files of old deployments
16
17
  {
@@ -18,19 +19,35 @@ const getNuxtAppStaticAssetConfigs = (rootDir = '.') => {
18
19
  source: customAssetsSourcePath,
19
20
  target: customAssetsTargetPath,
20
21
  contentType: 'text/plain; charset=UTF-8',
21
- // Longer cache control since we automatically invalidate the revision file on every deployment
22
+ // Internal deployment marker used by the cleanup job to identify the newest uploaded asset revision.
22
23
  cacheControl: [
23
24
  aws_s3_deployment_1.CacheControl.setPublic(),
24
25
  aws_s3_deployment_1.CacheControl.maxAge(aws_cdk_lib_1.Duration.seconds(10)),
25
26
  aws_s3_deployment_1.CacheControl.sMaxAge(aws_cdk_lib_1.Duration.days(14)),
26
27
  ],
27
- invalidateOnChange: true
28
+ },
29
+ // Nuxt uses this file to detect that a newer deployment exists on the client.
30
+ // It is not build-hashed and therefore must not be treated as immutable.
31
+ // No CloudFront invalidation is needed: with s-maxage=0 + must-revalidate, every edge
32
+ // request triggers a conditional GET against S3 and the new ETag is picked up on the
33
+ // first request after the deployment.
34
+ {
35
+ pattern: latestBuildManifestPattern,
36
+ source: customAssetsSourcePath,
37
+ target: customAssetsTargetPath,
38
+ cacheControl: [
39
+ aws_s3_deployment_1.CacheControl.setPublic(),
40
+ aws_s3_deployment_1.CacheControl.maxAge(aws_cdk_lib_1.Duration.seconds(0)),
41
+ aws_s3_deployment_1.CacheControl.sMaxAge(aws_cdk_lib_1.Duration.seconds(0)),
42
+ aws_s3_deployment_1.CacheControl.fromString('must-revalidate'),
43
+ ],
28
44
  },
29
45
  // Build files
30
46
  {
31
47
  pattern: '_nuxt/*',
32
48
  source: customAssetsSourcePath,
33
49
  target: customAssetsTargetPath,
50
+ exclude: [latestBuildManifestPattern],
34
51
  // Build assets are hashed whereby they are immutable and can be cached for a long time
35
52
  cacheControl: [
36
53
  aws_s3_deployment_1.CacheControl.setPublic(),
@@ -38,6 +55,43 @@ const getNuxtAppStaticAssetConfigs = (rootDir = '.') => {
38
55
  aws_s3_deployment_1.CacheControl.fromString('immutable'),
39
56
  ],
40
57
  },
58
+ // Service worker bootstrap scripts emitted by PWA plugins (e.g. @vite-pwa/nuxt).
59
+ // These filenames are stable across deployments — they are NOT content-hashed — and
60
+ // they reference the hashed precache manifest baked into them. They MUST NOT be cached
61
+ // by the browser or CloudFront, otherwise:
62
+ // - browsers keep registering the old service worker for up to max-age, so users
63
+ // never receive new deployments until the cache expires,
64
+ // - registration.update() and periodic update checks revalidate against a stale
65
+ // edge copy and never observe new builds.
66
+ // The W3C service worker spec already caps browser caching of the SW script at 24 h,
67
+ // but explicit no-cache is the documented best practice (web.dev, MDN, Workbox docs).
68
+ // No CloudFront invalidation is needed: with s-maxage=0 + must-revalidate, every edge
69
+ // request triggers a conditional GET against S3 and the new ETag is picked up on the
70
+ // first request after the deployment.
71
+ // Two separate entries (one per file) because the pattern is also used as a CloudFront
72
+ // path pattern and CloudFront does not support brace expansion.
73
+ {
74
+ pattern: 'sw.js',
75
+ source: customAssetsSourcePath,
76
+ target: customAssetsTargetPath,
77
+ cacheControl: [
78
+ aws_s3_deployment_1.CacheControl.setPublic(),
79
+ aws_s3_deployment_1.CacheControl.maxAge(aws_cdk_lib_1.Duration.seconds(0)),
80
+ aws_s3_deployment_1.CacheControl.sMaxAge(aws_cdk_lib_1.Duration.seconds(0)),
81
+ aws_s3_deployment_1.CacheControl.fromString('must-revalidate'),
82
+ ],
83
+ },
84
+ {
85
+ pattern: 'registerSW.js',
86
+ source: customAssetsSourcePath,
87
+ target: customAssetsTargetPath,
88
+ cacheControl: [
89
+ aws_s3_deployment_1.CacheControl.setPublic(),
90
+ aws_s3_deployment_1.CacheControl.maxAge(aws_cdk_lib_1.Duration.seconds(0)),
91
+ aws_s3_deployment_1.CacheControl.sMaxAge(aws_cdk_lib_1.Duration.seconds(0)),
92
+ aws_s3_deployment_1.CacheControl.fromString('must-revalidate'),
93
+ ],
94
+ },
41
95
  // Files for native app links
42
96
  {
43
97
  pattern: '.well-known/*',
@@ -68,4 +122,4 @@ const getNuxtAppStaticAssetConfigs = (rootDir = '.') => {
68
122
  return configs;
69
123
  };
70
124
  exports.getNuxtAppStaticAssetConfigs = getNuxtAppStaticAssetConfigs;
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dEFwcFN0YXRpY0Fzc2V0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIk51eHRBcHBTdGF0aWNBc3NldHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQTJEO0FBQzNELDZDQUFxQztBQTJDckM7Ozs7R0FJRztBQUNJLE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxVQUFrQixHQUFHLEVBQXVCLEVBQUU7SUFDdkYsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLE9BQU8saUJBQWlCLENBQUM7SUFDM0QsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7SUFFbkMsTUFBTSxPQUFPLEdBQXdCO1FBRWpDLHlGQUF5RjtRQUN6RjtZQUNJLE9BQU8sRUFBRSxjQUFjO1lBQ3ZCLE1BQU0sRUFBRSxzQkFBc0I7WUFDOUIsTUFBTSxFQUFFLHNCQUFzQjtZQUM5QixXQUFXLEVBQUUsMkJBQTJCO1lBQ3hDLCtGQUErRjtZQUMvRixZQUFZLEVBQUU7Z0JBQ1YsZ0NBQVksQ0FBQyxTQUFTLEVBQUU7Z0JBQ3hCLGdDQUFZLENBQUMsTUFBTSxDQUFDLHNCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN6QyxnQ0FBWSxDQUFDLE9BQU8sQ0FBQyxzQkFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUMxQztZQUNELGtCQUFrQixFQUFFLElBQUk7U0FDM0I7UUFFRCxjQUFjO1FBQ2Q7WUFDSSxPQUFPLEVBQUUsU0FBUztZQUNsQixNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLE1BQU0sRUFBRSxzQkFBc0I7WUFFOUIsdUZBQXVGO1lBQ3ZGLFlBQVksRUFBRTtnQkFDVixnQ0FBWSxDQUFDLFNBQVMsRUFBRTtnQkFDeEIsZ0NBQVksQ0FBQyxNQUFNLENBQUMsc0JBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZDLGdDQUFZLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQzthQUN2QztTQUNKO1FBRUQsNkJBQTZCO1FBQzdCO1lBQ0ksT0FBTyxFQUFFLGVBQWU7WUFDeEIsTUFBTSxFQUFFLHNCQUFzQjtZQUM5QixNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLFdBQVcsRUFBRSxpQ0FBaUMsRUFBRSw4REFBOEQ7WUFDOUcsWUFBWSxFQUFFO2dCQUNWLGdDQUFZLENBQUMsU0FBUyxFQUFFO2dCQUN4QixnQ0FBWSxDQUFDLE1BQU0sQ0FBQyxzQkFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckMsZ0NBQVksQ0FBQyxPQUFPLENBQUMsc0JBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDMUM7U0FDSjtLQUNKLENBQUM7SUFFRixpSEFBaUg7SUFDakgsT0FBTyxDQUFDLElBQUksQ0FBQztRQUNULE9BQU8sRUFBRSxNQUFNLEVBQUUsNENBQTRDO1FBQzdELE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLCtCQUErQjtRQUMvRSxNQUFNLEVBQUUsc0JBQXNCO1FBQzlCLE1BQU0sRUFBRSxzQkFBc0I7UUFFOUIsd0dBQXdHO1FBQ3hHLHVEQUF1RDtRQUN2RCxZQUFZLEVBQUU7WUFDVixnQ0FBWSxDQUFDLFNBQVMsRUFBRTtZQUN4QixnQ0FBWSxDQUFDLE1BQU0sQ0FBQyxzQkFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxnQ0FBWSxDQUFDLE9BQU8sQ0FBQyxzQkFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxQztLQUNKLENBQUMsQ0FBQTtJQUVGLE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUMsQ0FBQztBQWxFVyxRQUFBLDRCQUE0QixnQ0FrRXZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDYWNoZUNvbnRyb2x9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHtEdXJhdGlvbn0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGljQXNzZXRDb25maWcge1xuXG4gICAgLyoqXG4gICAgICogVGhlIGxvY2FsIGRpcmVjdG9yeSB0byB1cGxvYWQgdGhlIGZpbGVzIGZyb20uXG4gICAgICovXG4gICAgc291cmNlOiBzdHJpbmcsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmlsZSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBmaWxlcyB0byB1cGxvYWQgKHJlY3Vyc2l2ZWx5KSBmcm9tIHRoZSBzb3VyY2UgcHJvcCBkaXJlY3RvcnkuXG4gICAgICogQWxzbyBkZWZpbmVzIHRoZSBwYXR0ZXJuIGZvciB0aGUgaW5jb21pbmcgcmVxdWVzdHMgdGhhdCBzaG91bGQgYmUgZm9yd2FyZGVkIHRvIHRoZSB0YXJnZXQgcGF0aCBpbiB0aGVcbiAgICAgKiBzdGF0aWMgYXNzZXRzIFMzIGJ1Y2tldCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjYWNoZSBhbmQgY29udGVudCBzZXR0aW5ncyBkZWZpbmVkIGluIHRoZSBzYW1lIG9iamVjdC5cbiAgICAgKi9cbiAgICBwYXR0ZXJuOiBzdHJpbmcsXG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBmaWxlIHBhdHRlcm5zIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgdXBsb2FkLlxuICAgICAqL1xuICAgIGV4Y2x1ZGU/OiBzdHJpbmdbXSxcblxuICAgIC8qKlxuICAgICAqIFRoZSByZW1vdGUgcGF0aCBhdCB3aGljaCB0byBtYWtlIHRoZSB1cGxvYWRlZCBmaWxlcyBmcm9tIHNvdXJjZSBhY2Nlc3NpYmxlLlxuICAgICAqL1xuICAgIHRhcmdldDogc3RyaW5nLFxuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnRlbnQgdHlwZSB0byBzZXQgZm9yIHRoZSBmaWxlcyBpbiB0aGUgc291cmNlIGZvbGRlciB3aGVuIHVwbG9hZGluZyB0aGVtIHRvIHRoZSB0YXJnZXQuXG4gICAgICogVXNlZnVsIHRvIG92ZXJyaWRlIGZvcmNlIGNvbnRlbnQgdHlwZXMgZm9yIHNwZWNpZmljIGZpbGVzLlxuICAgICAqL1xuICAgIGNvbnRlbnRUeXBlPzogc3RyaW5nLFxuXG4gICAgLyoqXG4gICAgICogVGhlIGNhY2hlIHNldHRpbmdzIHRvIHVzZSBmb3IgdGhlIHVwbG9hZGVkIHNvdXJjZSBmaWxlcyB3aGVuIGFjY2Vzc2luZyB0aGVtIG9uIHRoZSB0YXJnZXQgcGF0aCB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0dGVybi5cbiAgICAgKi9cbiAgICBjYWNoZUNvbnRyb2w6IENhY2hlQ29udHJvbFtdLFxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBpbnZhbGlkYXRlIHRoZSBmaWxlcyBtYXRjaGluZyB0aGUgY29uZmlnJ3MgcGF0dGVybiBpbiB0aGUgZGlzdHJpYnV0aW9uJ3MgZWRnZSBjYWNoZXMgYWZ0ZXIgdGhlIGZpbGVzIGFyZSB1cGxvYWRlZCB0byB0aGUgZGVzdGluYXRpb24gYnVja2V0LlxuICAgICAqL1xuICAgIGludmFsaWRhdGVPbkNoYW5nZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcCB0aGF0IHNoYWxsIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBAcGFyYW0gcm9vdERpciBUaGUgcGF0aCB0byB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIE51eHQgYXBwIGF0IHdoaWNoIHRoZSBgLm91dHB1dGAgYnVpbGQgZm9sZGVyIGlzIGxvY2F0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXROdXh0QXBwU3RhdGljQXNzZXRDb25maWdzID0gKHJvb3REaXI6IHN0cmluZyA9ICcuJyk6IFN0YXRpY0Fzc2V0Q29uZmlnW10gPT4ge1xuICAgIGNvbnN0IGN1c3RvbUFzc2V0c1NvdXJjZVBhdGggPSBgJHtyb290RGlyfS8ub3V0cHV0L3B1YmxpY2A7XG4gICAgY29uc3QgY3VzdG9tQXNzZXRzVGFyZ2V0UGF0aCA9ICcvJztcblxuICAgIGNvbnN0IGNvbmZpZ3M6IFN0YXRpY0Fzc2V0Q29uZmlnW10gPSBbXG5cbiAgICAgICAgLy8gRmlsZSB0byBkZXRlY3QgY3VycmVudCBkZXBsb3ltZW50IHJldmlzaW9uIHRvIGRlbGV0ZSBvdXRkYXRlZCBmaWxlcyBvZiBvbGQgZGVwbG95bWVudHNcbiAgICAgICAge1xuICAgICAgICAgICAgcGF0dGVybjogJ2FwcC1yZXZpc2lvbicsXG4gICAgICAgICAgICBzb3VyY2U6IGN1c3RvbUFzc2V0c1NvdXJjZVBhdGgsXG4gICAgICAgICAgICB0YXJnZXQ6IGN1c3RvbUFzc2V0c1RhcmdldFBhdGgsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgnLFxuICAgICAgICAgICAgLy8gTG9uZ2VyIGNhY2hlIGNvbnRyb2wgc2luY2Ugd2UgYXV0b21hdGljYWxseSBpbnZhbGlkYXRlIHRoZSByZXZpc2lvbiBmaWxlIG9uIGV2ZXJ5IGRlcGxveW1lbnRcbiAgICAgICAgICAgIGNhY2hlQ29udHJvbDogW1xuICAgICAgICAgICAgICAgIENhY2hlQ29udHJvbC5zZXRQdWJsaWMoKSxcbiAgICAgICAgICAgICAgICBDYWNoZUNvbnRyb2wubWF4QWdlKER1cmF0aW9uLnNlY29uZHMoMTApKSxcbiAgICAgICAgICAgICAgICBDYWNoZUNvbnRyb2wuc01heEFnZShEdXJhdGlvbi5kYXlzKDE0KSksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaW52YWxpZGF0ZU9uQ2hhbmdlOiB0cnVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gQnVpbGQgZmlsZXNcbiAgICAgICAge1xuICAgICAgICAgICAgcGF0dGVybjogJ19udXh0LyonLFxuICAgICAgICAgICAgc291cmNlOiBjdXN0b21Bc3NldHNTb3VyY2VQYXRoLFxuICAgICAgICAgICAgdGFyZ2V0OiBjdXN0b21Bc3NldHNUYXJnZXRQYXRoLFxuXG4gICAgICAgICAgICAvLyBCdWlsZCBhc3NldHMgYXJlIGhhc2hlZCB3aGVyZWJ5IHRoZXkgYXJlIGltbXV0YWJsZSBhbmQgY2FuIGJlIGNhY2hlZCBmb3IgYSBsb25nIHRpbWVcbiAgICAgICAgICAgIGNhY2hlQ29udHJvbDogW1xuICAgICAgICAgICAgICAgIENhY2hlQ29udHJvbC5zZXRQdWJsaWMoKSxcbiAgICAgICAgICAgICAgICBDYWNoZUNvbnRyb2wubWF4QWdlKER1cmF0aW9uLmRheXMoMzY1KSksXG4gICAgICAgICAgICAgICAgQ2FjaGVDb250cm9sLmZyb21TdHJpbmcoJ2ltbXV0YWJsZScpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBGaWxlcyBmb3IgbmF0aXZlIGFwcCBsaW5rc1xuICAgICAgICB7XG4gICAgICAgICAgICBwYXR0ZXJuOiAnLndlbGwta25vd24vKicsXG4gICAgICAgICAgICBzb3VyY2U6IGN1c3RvbUFzc2V0c1NvdXJjZVBhdGgsXG4gICAgICAgICAgICB0YXJnZXQ6IGN1c3RvbUFzc2V0c1RhcmdldFBhdGgsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgnLCAvLyBFeHBsaWNpdGx5IHByb3ZpZGVkIGFzIHRoZXNlIGZpbGUgdXN1YWxseSBoYXZlIG5vIGV4dGVuc2lvblxuICAgICAgICAgICAgY2FjaGVDb250cm9sOiBbXG4gICAgICAgICAgICAgICAgQ2FjaGVDb250cm9sLnNldFB1YmxpYygpLFxuICAgICAgICAgICAgICAgIENhY2hlQ29udHJvbC5tYXhBZ2UoRHVyYXRpb24uZGF5cygxKSksXG4gICAgICAgICAgICAgICAgQ2FjaGVDb250cm9sLnNNYXhBZ2UoRHVyYXRpb24uaG91cnMoMSkpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfVxuICAgIF07XG5cbiAgICAvLyBBbGwgY3VzdG9tIGZpbGVzIGZyb20gdGhlIHB1YmxpYyBkaXIsIGUuZy4sIHJvYm90cy50eHQsIGFkcy50eHQsIHNpdGVtYXAueG1sLCAqLmpzLCBtYW5pZmVzdC53ZWJtYW5pZmVzdCwgZXRjLlxuICAgIGNvbmZpZ3MucHVzaCh7XG4gICAgICAgIHBhdHRlcm46ICc/Ki4qJywgLy8gZXhjbHVkZSAuZ2l0aWdub3JlIGFuZCBvdGhlciBoaWRkZW4gZmlsZXNcbiAgICAgICAgZXhjbHVkZTogY29uZmlncy5tYXAoY29uZmlnID0+IGNvbmZpZy5wYXR0ZXJuKSwgLy8gZXhjbHVkZSBvdXIgc3BlY2lmaWMgY29uZmlnc1xuICAgICAgICBzb3VyY2U6IGN1c3RvbUFzc2V0c1NvdXJjZVBhdGgsXG4gICAgICAgIHRhcmdldDogY3VzdG9tQXNzZXRzVGFyZ2V0UGF0aCxcblxuICAgICAgICAvLyBDdXN0b20gYXNzZXRzIG1pZ2h0IG5vdCBiZSB2ZXJzaW9uZWQgd2hlcmVieSB3ZSB3YW50IHRvIHByZXZlbnQgYW55IGNhY2hpbmcgaXNzdWVzIHdoZW4gdXBkYXRpbmcgdGhlbVxuICAgICAgICAvLyAtPiBjYWNoZSBmb3Igb25seSAxIGRheSBvbiBDRE4gYW5kIDEgaG91ciBvbiBicm93c2VyXG4gICAgICAgIGNhY2hlQ29udHJvbDogW1xuICAgICAgICAgICAgQ2FjaGVDb250cm9sLnNldFB1YmxpYygpLFxuICAgICAgICAgICAgQ2FjaGVDb250cm9sLm1heEFnZShEdXJhdGlvbi5kYXlzKDEpKSxcbiAgICAgICAgICAgIENhY2hlQ29udHJvbC5zTWF4QWdlKER1cmF0aW9uLmhvdXJzKDEpKSxcbiAgICAgICAgXSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIGNvbmZpZ3M7XG59OyJdfQ==
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dEFwcFN0YXRpY0Fzc2V0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIk51eHRBcHBTdGF0aWNBc3NldHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUVBQTJEO0FBQzNELDZDQUFxQztBQXNDckM7Ozs7R0FJRztBQUNJLE1BQU0sNEJBQTRCLEdBQUcsQ0FBQyxVQUFrQixHQUFHLEVBQXVCLEVBQUU7SUFDdkYsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLE9BQU8saUJBQWlCLENBQUM7SUFDM0QsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUM7SUFDbkMsTUFBTSwwQkFBMEIsR0FBRywwQkFBMEIsQ0FBQztJQUU5RCxNQUFNLE9BQU8sR0FBd0I7UUFFakMseUZBQXlGO1FBQ3pGO1lBQ0ksT0FBTyxFQUFFLGNBQWM7WUFDdkIsTUFBTSxFQUFFLHNCQUFzQjtZQUM5QixNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLFdBQVcsRUFBRSwyQkFBMkI7WUFDeEMscUdBQXFHO1lBQ3JHLFlBQVksRUFBRTtnQkFDVixnQ0FBWSxDQUFDLFNBQVMsRUFBRTtnQkFDeEIsZ0NBQVksQ0FBQyxNQUFNLENBQUMsc0JBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3pDLGdDQUFZLENBQUMsT0FBTyxDQUFDLHNCQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzFDO1NBQ0o7UUFFRCw4RUFBOEU7UUFDOUUseUVBQXlFO1FBQ3pFLHNGQUFzRjtRQUN0RixxRkFBcUY7UUFDckYsc0NBQXNDO1FBQ3RDO1lBQ0ksT0FBTyxFQUFFLDBCQUEwQjtZQUNuQyxNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLE1BQU0sRUFBRSxzQkFBc0I7WUFDOUIsWUFBWSxFQUFFO2dCQUNWLGdDQUFZLENBQUMsU0FBUyxFQUFFO2dCQUN4QixnQ0FBWSxDQUFDLE1BQU0sQ0FBQyxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEMsZ0NBQVksQ0FBQyxPQUFPLENBQUMsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLGdDQUFZLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDO2FBQzdDO1NBQ0o7UUFFRCxjQUFjO1FBQ2Q7WUFDSSxPQUFPLEVBQUUsU0FBUztZQUNsQixNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLE1BQU0sRUFBRSxzQkFBc0I7WUFDOUIsT0FBTyxFQUFFLENBQUMsMEJBQTBCLENBQUM7WUFFckMsdUZBQXVGO1lBQ3ZGLFlBQVksRUFBRTtnQkFDVixnQ0FBWSxDQUFDLFNBQVMsRUFBRTtnQkFDeEIsZ0NBQVksQ0FBQyxNQUFNLENBQUMsc0JBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZDLGdDQUFZLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQzthQUN2QztTQUNKO1FBRUQsaUZBQWlGO1FBQ2pGLG9GQUFvRjtRQUNwRix1RkFBdUY7UUFDdkYsMkNBQTJDO1FBQzNDLG1GQUFtRjtRQUNuRiw2REFBNkQ7UUFDN0Qsa0ZBQWtGO1FBQ2xGLDhDQUE4QztRQUM5QyxxRkFBcUY7UUFDckYsc0ZBQXNGO1FBQ3RGLHNGQUFzRjtRQUN0RixxRkFBcUY7UUFDckYsc0NBQXNDO1FBQ3RDLHVGQUF1RjtRQUN2RixnRUFBZ0U7UUFDaEU7WUFDSSxPQUFPLEVBQUUsT0FBTztZQUNoQixNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLE1BQU0sRUFBRSxzQkFBc0I7WUFDOUIsWUFBWSxFQUFFO2dCQUNWLGdDQUFZLENBQUMsU0FBUyxFQUFFO2dCQUN4QixnQ0FBWSxDQUFDLE1BQU0sQ0FBQyxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEMsZ0NBQVksQ0FBQyxPQUFPLENBQUMsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLGdDQUFZLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDO2FBQzdDO1NBQ0o7UUFDRDtZQUNJLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLE1BQU0sRUFBRSxzQkFBc0I7WUFDOUIsTUFBTSxFQUFFLHNCQUFzQjtZQUM5QixZQUFZLEVBQUU7Z0JBQ1YsZ0NBQVksQ0FBQyxTQUFTLEVBQUU7Z0JBQ3hCLGdDQUFZLENBQUMsTUFBTSxDQUFDLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxnQ0FBWSxDQUFDLE9BQU8sQ0FBQyxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekMsZ0NBQVksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUM7YUFDN0M7U0FDSjtRQUVELDZCQUE2QjtRQUM3QjtZQUNJLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLE1BQU0sRUFBRSxzQkFBc0I7WUFDOUIsTUFBTSxFQUFFLHNCQUFzQjtZQUM5QixXQUFXLEVBQUUsaUNBQWlDLEVBQUUsOERBQThEO1lBQzlHLFlBQVksRUFBRTtnQkFDVixnQ0FBWSxDQUFDLFNBQVMsRUFBRTtnQkFDeEIsZ0NBQVksQ0FBQyxNQUFNLENBQUMsc0JBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLGdDQUFZLENBQUMsT0FBTyxDQUFDLHNCQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzFDO1NBQ0o7S0FDSixDQUFDO0lBRUYsaUhBQWlIO0lBQ2pILE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDVCxPQUFPLEVBQUUsTUFBTSxFQUFFLDRDQUE0QztRQUM3RCxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSwrQkFBK0I7UUFDL0UsTUFBTSxFQUFFLHNCQUFzQjtRQUM5QixNQUFNLEVBQUUsc0JBQXNCO1FBRTlCLHdHQUF3RztRQUN4Ryx1REFBdUQ7UUFDdkQsWUFBWSxFQUFFO1lBQ1YsZ0NBQVksQ0FBQyxTQUFTLEVBQUU7WUFDeEIsZ0NBQVksQ0FBQyxNQUFNLENBQUMsc0JBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsZ0NBQVksQ0FBQyxPQUFPLENBQUMsc0JBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDMUM7S0FDSixDQUFDLENBQUE7SUFFRixPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDLENBQUM7QUExSFcsUUFBQSw0QkFBNEIsZ0NBMEh2QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2FjaGVDb250cm9sfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzLWRlcGxveW1lbnRcIjtcbmltcG9ydCB7RHVyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRpY0Fzc2V0Q29uZmlnIHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBsb2NhbCBkaXJlY3RvcnkgdG8gdXBsb2FkIHRoZSBmaWxlcyBmcm9tLlxuICAgICAqL1xuICAgIHNvdXJjZTogc3RyaW5nLFxuXG4gICAgLyoqXG4gICAgICogVGhlIGZpbGUgcGF0dGVybiB0aGF0IG1hdGNoZXMgZmlsZXMgdG8gdXBsb2FkIChyZWN1cnNpdmVseSkgZnJvbSB0aGUgc291cmNlIHByb3AgZGlyZWN0b3J5LlxuICAgICAqIEFsc28gZGVmaW5lcyB0aGUgcGF0dGVybiBmb3IgdGhlIGluY29taW5nIHJlcXVlc3RzIHRoYXQgc2hvdWxkIGJlIGZvcndhcmRlZCB0byB0aGUgdGFyZ2V0IHBhdGggaW4gdGhlXG4gICAgICogc3RhdGljIGFzc2V0cyBTMyBidWNrZXQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY2FjaGUgYW5kIGNvbnRlbnQgc2V0dGluZ3MgZGVmaW5lZCBpbiB0aGUgc2FtZSBvYmplY3QuXG4gICAgICovXG4gICAgcGF0dGVybjogc3RyaW5nLFxuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZmlsZSBwYXR0ZXJucyB0byBleGNsdWRlIGZyb20gdGhlIHVwbG9hZC5cbiAgICAgKi9cbiAgICBleGNsdWRlPzogc3RyaW5nW10sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgcmVtb3RlIHBhdGggYXQgd2hpY2ggdG8gbWFrZSB0aGUgdXBsb2FkZWQgZmlsZXMgZnJvbSBzb3VyY2UgYWNjZXNzaWJsZS5cbiAgICAgKi9cbiAgICB0YXJnZXQ6IHN0cmluZyxcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb250ZW50IHR5cGUgdG8gc2V0IGZvciB0aGUgZmlsZXMgaW4gdGhlIHNvdXJjZSBmb2xkZXIgd2hlbiB1cGxvYWRpbmcgdGhlbSB0byB0aGUgdGFyZ2V0LlxuICAgICAqIFVzZWZ1bCB0byBvdmVycmlkZSBmb3JjZSBjb250ZW50IHR5cGVzIGZvciBzcGVjaWZpYyBmaWxlcy5cbiAgICAgKi9cbiAgICBjb250ZW50VHlwZT86IHN0cmluZyxcblxuICAgIC8qKlxuICAgICAqIFRoZSBjYWNoZSBzZXR0aW5ncyB0byB1c2UgZm9yIHRoZSB1cGxvYWRlZCBzb3VyY2UgZmlsZXMgd2hlbiBhY2Nlc3NpbmcgdGhlbSBvbiB0aGUgdGFyZ2V0IHBhdGggd2l0aCB0aGUgc3BlY2lmaWVkIHBhdHRlcm4uXG4gICAgICovXG4gICAgY2FjaGVDb250cm9sOiBDYWNoZUNvbnRyb2xbXSxcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwIHRoYXQgc2hhbGwgYmUgcHVibGljbHkgYXZhaWxhYmxlLlxuICpcbiAqIEBwYXJhbSByb290RGlyIFRoZSBwYXRoIHRvIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgTnV4dCBhcHAgYXQgd2hpY2ggdGhlIGAub3V0cHV0YCBidWlsZCBmb2xkZXIgaXMgbG9jYXRlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldE51eHRBcHBTdGF0aWNBc3NldENvbmZpZ3MgPSAocm9vdERpcjogc3RyaW5nID0gJy4nKTogU3RhdGljQXNzZXRDb25maWdbXSA9PiB7XG4gICAgY29uc3QgY3VzdG9tQXNzZXRzU291cmNlUGF0aCA9IGAke3Jvb3REaXJ9Ly5vdXRwdXQvcHVibGljYDtcbiAgICBjb25zdCBjdXN0b21Bc3NldHNUYXJnZXRQYXRoID0gJy8nO1xuICAgIGNvbnN0IGxhdGVzdEJ1aWxkTWFuaWZlc3RQYXR0ZXJuID0gJ19udXh0L2J1aWxkcy9sYXRlc3QuanNvbic7XG5cbiAgICBjb25zdCBjb25maWdzOiBTdGF0aWNBc3NldENvbmZpZ1tdID0gW1xuXG4gICAgICAgIC8vIEZpbGUgdG8gZGV0ZWN0IGN1cnJlbnQgZGVwbG95bWVudCByZXZpc2lvbiB0byBkZWxldGUgb3V0ZGF0ZWQgZmlsZXMgb2Ygb2xkIGRlcGxveW1lbnRzXG4gICAgICAgIHtcbiAgICAgICAgICAgIHBhdHRlcm46ICdhcHAtcmV2aXNpb24nLFxuICAgICAgICAgICAgc291cmNlOiBjdXN0b21Bc3NldHNTb3VyY2VQYXRoLFxuICAgICAgICAgICAgdGFyZ2V0OiBjdXN0b21Bc3NldHNUYXJnZXRQYXRoLFxuICAgICAgICAgICAgY29udGVudFR5cGU6ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04JyxcbiAgICAgICAgICAgIC8vIEludGVybmFsIGRlcGxveW1lbnQgbWFya2VyIHVzZWQgYnkgdGhlIGNsZWFudXAgam9iIHRvIGlkZW50aWZ5IHRoZSBuZXdlc3QgdXBsb2FkZWQgYXNzZXQgcmV2aXNpb24uXG4gICAgICAgICAgICBjYWNoZUNvbnRyb2w6IFtcbiAgICAgICAgICAgICAgICBDYWNoZUNvbnRyb2wuc2V0UHVibGljKCksXG4gICAgICAgICAgICAgICAgQ2FjaGVDb250cm9sLm1heEFnZShEdXJhdGlvbi5zZWNvbmRzKDEwKSksXG4gICAgICAgICAgICAgICAgQ2FjaGVDb250cm9sLnNNYXhBZ2UoRHVyYXRpb24uZGF5cygxNCkpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBOdXh0IHVzZXMgdGhpcyBmaWxlIHRvIGRldGVjdCB0aGF0IGEgbmV3ZXIgZGVwbG95bWVudCBleGlzdHMgb24gdGhlIGNsaWVudC5cbiAgICAgICAgLy8gSXQgaXMgbm90IGJ1aWxkLWhhc2hlZCBhbmQgdGhlcmVmb3JlIG11c3Qgbm90IGJlIHRyZWF0ZWQgYXMgaW1tdXRhYmxlLlxuICAgICAgICAvLyBObyBDbG91ZEZyb250IGludmFsaWRhdGlvbiBpcyBuZWVkZWQ6IHdpdGggcy1tYXhhZ2U9MCArIG11c3QtcmV2YWxpZGF0ZSwgZXZlcnkgZWRnZVxuICAgICAgICAvLyByZXF1ZXN0IHRyaWdnZXJzIGEgY29uZGl0aW9uYWwgR0VUIGFnYWluc3QgUzMgYW5kIHRoZSBuZXcgRVRhZyBpcyBwaWNrZWQgdXAgb24gdGhlXG4gICAgICAgIC8vIGZpcnN0IHJlcXVlc3QgYWZ0ZXIgdGhlIGRlcGxveW1lbnQuXG4gICAgICAgIHtcbiAgICAgICAgICAgIHBhdHRlcm46IGxhdGVzdEJ1aWxkTWFuaWZlc3RQYXR0ZXJuLFxuICAgICAgICAgICAgc291cmNlOiBjdXN0b21Bc3NldHNTb3VyY2VQYXRoLFxuICAgICAgICAgICAgdGFyZ2V0OiBjdXN0b21Bc3NldHNUYXJnZXRQYXRoLFxuICAgICAgICAgICAgY2FjaGVDb250cm9sOiBbXG4gICAgICAgICAgICAgICAgQ2FjaGVDb250cm9sLnNldFB1YmxpYygpLFxuICAgICAgICAgICAgICAgIENhY2hlQ29udHJvbC5tYXhBZ2UoRHVyYXRpb24uc2Vjb25kcygwKSksXG4gICAgICAgICAgICAgICAgQ2FjaGVDb250cm9sLnNNYXhBZ2UoRHVyYXRpb24uc2Vjb25kcygwKSksXG4gICAgICAgICAgICAgICAgQ2FjaGVDb250cm9sLmZyb21TdHJpbmcoJ211c3QtcmV2YWxpZGF0ZScpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBCdWlsZCBmaWxlc1xuICAgICAgICB7XG4gICAgICAgICAgICBwYXR0ZXJuOiAnX251eHQvKicsXG4gICAgICAgICAgICBzb3VyY2U6IGN1c3RvbUFzc2V0c1NvdXJjZVBhdGgsXG4gICAgICAgICAgICB0YXJnZXQ6IGN1c3RvbUFzc2V0c1RhcmdldFBhdGgsXG4gICAgICAgICAgICBleGNsdWRlOiBbbGF0ZXN0QnVpbGRNYW5pZmVzdFBhdHRlcm5dLFxuXG4gICAgICAgICAgICAvLyBCdWlsZCBhc3NldHMgYXJlIGhhc2hlZCB3aGVyZWJ5IHRoZXkgYXJlIGltbXV0YWJsZSBhbmQgY2FuIGJlIGNhY2hlZCBmb3IgYSBsb25nIHRpbWVcbiAgICAgICAgICAgIGNhY2hlQ29udHJvbDogW1xuICAgICAgICAgICAgICAgIENhY2hlQ29udHJvbC5zZXRQdWJsaWMoKSxcbiAgICAgICAgICAgICAgICBDYWNoZUNvbnRyb2wubWF4QWdlKER1cmF0aW9uLmRheXMoMzY1KSksXG4gICAgICAgICAgICAgICAgQ2FjaGVDb250cm9sLmZyb21TdHJpbmcoJ2ltbXV0YWJsZScpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBTZXJ2aWNlIHdvcmtlciBib290c3RyYXAgc2NyaXB0cyBlbWl0dGVkIGJ5IFBXQSBwbHVnaW5zIChlLmcuIEB2aXRlLXB3YS9udXh0KS5cbiAgICAgICAgLy8gVGhlc2UgZmlsZW5hbWVzIGFyZSBzdGFibGUgYWNyb3NzIGRlcGxveW1lbnRzIOKAlCB0aGV5IGFyZSBOT1QgY29udGVudC1oYXNoZWQg4oCUIGFuZFxuICAgICAgICAvLyB0aGV5IHJlZmVyZW5jZSB0aGUgaGFzaGVkIHByZWNhY2hlIG1hbmlmZXN0IGJha2VkIGludG8gdGhlbS4gVGhleSBNVVNUIE5PVCBiZSBjYWNoZWRcbiAgICAgICAgLy8gYnkgdGhlIGJyb3dzZXIgb3IgQ2xvdWRGcm9udCwgb3RoZXJ3aXNlOlxuICAgICAgICAvLyAgIC0gYnJvd3NlcnMga2VlcCByZWdpc3RlcmluZyB0aGUgb2xkIHNlcnZpY2Ugd29ya2VyIGZvciB1cCB0byBtYXgtYWdlLCBzbyB1c2Vyc1xuICAgICAgICAvLyAgICAgbmV2ZXIgcmVjZWl2ZSBuZXcgZGVwbG95bWVudHMgdW50aWwgdGhlIGNhY2hlIGV4cGlyZXMsXG4gICAgICAgIC8vICAgLSByZWdpc3RyYXRpb24udXBkYXRlKCkgYW5kIHBlcmlvZGljIHVwZGF0ZSBjaGVja3MgcmV2YWxpZGF0ZSBhZ2FpbnN0IGEgc3RhbGVcbiAgICAgICAgLy8gICAgIGVkZ2UgY29weSBhbmQgbmV2ZXIgb2JzZXJ2ZSBuZXcgYnVpbGRzLlxuICAgICAgICAvLyBUaGUgVzNDIHNlcnZpY2Ugd29ya2VyIHNwZWMgYWxyZWFkeSBjYXBzIGJyb3dzZXIgY2FjaGluZyBvZiB0aGUgU1cgc2NyaXB0IGF0IDI0IGgsXG4gICAgICAgIC8vIGJ1dCBleHBsaWNpdCBuby1jYWNoZSBpcyB0aGUgZG9jdW1lbnRlZCBiZXN0IHByYWN0aWNlICh3ZWIuZGV2LCBNRE4sIFdvcmtib3ggZG9jcykuXG4gICAgICAgIC8vIE5vIENsb3VkRnJvbnQgaW52YWxpZGF0aW9uIGlzIG5lZWRlZDogd2l0aCBzLW1heGFnZT0wICsgbXVzdC1yZXZhbGlkYXRlLCBldmVyeSBlZGdlXG4gICAgICAgIC8vIHJlcXVlc3QgdHJpZ2dlcnMgYSBjb25kaXRpb25hbCBHRVQgYWdhaW5zdCBTMyBhbmQgdGhlIG5ldyBFVGFnIGlzIHBpY2tlZCB1cCBvbiB0aGVcbiAgICAgICAgLy8gZmlyc3QgcmVxdWVzdCBhZnRlciB0aGUgZGVwbG95bWVudC5cbiAgICAgICAgLy8gVHdvIHNlcGFyYXRlIGVudHJpZXMgKG9uZSBwZXIgZmlsZSkgYmVjYXVzZSB0aGUgcGF0dGVybiBpcyBhbHNvIHVzZWQgYXMgYSBDbG91ZEZyb250XG4gICAgICAgIC8vIHBhdGggcGF0dGVybiBhbmQgQ2xvdWRGcm9udCBkb2VzIG5vdCBzdXBwb3J0IGJyYWNlIGV4cGFuc2lvbi5cbiAgICAgICAge1xuICAgICAgICAgICAgcGF0dGVybjogJ3N3LmpzJyxcbiAgICAgICAgICAgIHNvdXJjZTogY3VzdG9tQXNzZXRzU291cmNlUGF0aCxcbiAgICAgICAgICAgIHRhcmdldDogY3VzdG9tQXNzZXRzVGFyZ2V0UGF0aCxcbiAgICAgICAgICAgIGNhY2hlQ29udHJvbDogW1xuICAgICAgICAgICAgICAgIENhY2hlQ29udHJvbC5zZXRQdWJsaWMoKSxcbiAgICAgICAgICAgICAgICBDYWNoZUNvbnRyb2wubWF4QWdlKER1cmF0aW9uLnNlY29uZHMoMCkpLFxuICAgICAgICAgICAgICAgIENhY2hlQ29udHJvbC5zTWF4QWdlKER1cmF0aW9uLnNlY29uZHMoMCkpLFxuICAgICAgICAgICAgICAgIENhY2hlQ29udHJvbC5mcm9tU3RyaW5nKCdtdXN0LXJldmFsaWRhdGUnKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHBhdHRlcm46ICdyZWdpc3RlclNXLmpzJyxcbiAgICAgICAgICAgIHNvdXJjZTogY3VzdG9tQXNzZXRzU291cmNlUGF0aCxcbiAgICAgICAgICAgIHRhcmdldDogY3VzdG9tQXNzZXRzVGFyZ2V0UGF0aCxcbiAgICAgICAgICAgIGNhY2hlQ29udHJvbDogW1xuICAgICAgICAgICAgICAgIENhY2hlQ29udHJvbC5zZXRQdWJsaWMoKSxcbiAgICAgICAgICAgICAgICBDYWNoZUNvbnRyb2wubWF4QWdlKER1cmF0aW9uLnNlY29uZHMoMCkpLFxuICAgICAgICAgICAgICAgIENhY2hlQ29udHJvbC5zTWF4QWdlKER1cmF0aW9uLnNlY29uZHMoMCkpLFxuICAgICAgICAgICAgICAgIENhY2hlQ29udHJvbC5mcm9tU3RyaW5nKCdtdXN0LXJldmFsaWRhdGUnKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gRmlsZXMgZm9yIG5hdGl2ZSBhcHAgbGlua3NcbiAgICAgICAge1xuICAgICAgICAgICAgcGF0dGVybjogJy53ZWxsLWtub3duLyonLFxuICAgICAgICAgICAgc291cmNlOiBjdXN0b21Bc3NldHNTb3VyY2VQYXRoLFxuICAgICAgICAgICAgdGFyZ2V0OiBjdXN0b21Bc3NldHNUYXJnZXRQYXRoLFxuICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURi04JywgLy8gRXhwbGljaXRseSBwcm92aWRlZCBhcyB0aGVzZSBmaWxlIHVzdWFsbHkgaGF2ZSBubyBleHRlbnNpb25cbiAgICAgICAgICAgIGNhY2hlQ29udHJvbDogW1xuICAgICAgICAgICAgICAgIENhY2hlQ29udHJvbC5zZXRQdWJsaWMoKSxcbiAgICAgICAgICAgICAgICBDYWNoZUNvbnRyb2wubWF4QWdlKER1cmF0aW9uLmRheXMoMSkpLFxuICAgICAgICAgICAgICAgIENhY2hlQ29udHJvbC5zTWF4QWdlKER1cmF0aW9uLmhvdXJzKDEpKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH1cbiAgICBdO1xuXG4gICAgLy8gQWxsIGN1c3RvbSBmaWxlcyBmcm9tIHRoZSBwdWJsaWMgZGlyLCBlLmcuLCByb2JvdHMudHh0LCBhZHMudHh0LCBzaXRlbWFwLnhtbCwgKi5qcywgbWFuaWZlc3Qud2VibWFuaWZlc3QsIGV0Yy5cbiAgICBjb25maWdzLnB1c2goe1xuICAgICAgICBwYXR0ZXJuOiAnPyouKicsIC8vIGV4Y2x1ZGUgLmdpdGlnbm9yZSBhbmQgb3RoZXIgaGlkZGVuIGZpbGVzXG4gICAgICAgIGV4Y2x1ZGU6IGNvbmZpZ3MubWFwKGNvbmZpZyA9PiBjb25maWcucGF0dGVybiksIC8vIGV4Y2x1ZGUgb3VyIHNwZWNpZmljIGNvbmZpZ3NcbiAgICAgICAgc291cmNlOiBjdXN0b21Bc3NldHNTb3VyY2VQYXRoLFxuICAgICAgICB0YXJnZXQ6IGN1c3RvbUFzc2V0c1RhcmdldFBhdGgsXG5cbiAgICAgICAgLy8gQ3VzdG9tIGFzc2V0cyBtaWdodCBub3QgYmUgdmVyc2lvbmVkIHdoZXJlYnkgd2Ugd2FudCB0byBwcmV2ZW50IGFueSBjYWNoaW5nIGlzc3VlcyB3aGVuIHVwZGF0aW5nIHRoZW1cbiAgICAgICAgLy8gLT4gY2FjaGUgZm9yIG9ubHkgMSBkYXkgb24gQ0ROIGFuZCAxIGhvdXIgb24gYnJvd3NlclxuICAgICAgICBjYWNoZUNvbnRyb2w6IFtcbiAgICAgICAgICAgIENhY2hlQ29udHJvbC5zZXRQdWJsaWMoKSxcbiAgICAgICAgICAgIENhY2hlQ29udHJvbC5tYXhBZ2UoRHVyYXRpb24uZGF5cygxKSksXG4gICAgICAgICAgICBDYWNoZUNvbnRyb2wuc01heEFnZShEdXJhdGlvbi5ob3VycygxKSksXG4gICAgICAgIF0sXG4gICAgfSlcblxuICAgIHJldHVybiBjb25maWdzO1xufTtcbiJdfQ==
@@ -35,11 +35,6 @@ export interface StaticAssetConfig {
35
35
  * The cache settings to use for the uploaded source files when accessing them on the target path with the specified pattern.
36
36
  */
37
37
  cacheControl: CacheControl[],
38
-
39
- /**
40
- * Whether to invalidate the files matching the config's pattern in the distribution's edge caches after the files are uploaded to the destination bucket.
41
- */
42
- invalidateOnChange?: boolean;
43
38
  }
44
39
 
45
40
  /**
@@ -50,6 +45,7 @@ export interface StaticAssetConfig {
50
45
  export const getNuxtAppStaticAssetConfigs = (rootDir: string = '.'): StaticAssetConfig[] => {
51
46
  const customAssetsSourcePath = `${rootDir}/.output/public`;
52
47
  const customAssetsTargetPath = '/';
48
+ const latestBuildManifestPattern = '_nuxt/builds/latest.json';
53
49
 
54
50
  const configs: StaticAssetConfig[] = [
55
51
 
@@ -59,13 +55,29 @@ export const getNuxtAppStaticAssetConfigs = (rootDir: string = '.'): StaticAsset
59
55
  source: customAssetsSourcePath,
60
56
  target: customAssetsTargetPath,
61
57
  contentType: 'text/plain; charset=UTF-8',
62
- // Longer cache control since we automatically invalidate the revision file on every deployment
58
+ // Internal deployment marker used by the cleanup job to identify the newest uploaded asset revision.
63
59
  cacheControl: [
64
60
  CacheControl.setPublic(),
65
61
  CacheControl.maxAge(Duration.seconds(10)),
66
62
  CacheControl.sMaxAge(Duration.days(14)),
67
63
  ],
68
- invalidateOnChange: true
64
+ },
65
+
66
+ // Nuxt uses this file to detect that a newer deployment exists on the client.
67
+ // It is not build-hashed and therefore must not be treated as immutable.
68
+ // No CloudFront invalidation is needed: with s-maxage=0 + must-revalidate, every edge
69
+ // request triggers a conditional GET against S3 and the new ETag is picked up on the
70
+ // first request after the deployment.
71
+ {
72
+ pattern: latestBuildManifestPattern,
73
+ source: customAssetsSourcePath,
74
+ target: customAssetsTargetPath,
75
+ cacheControl: [
76
+ CacheControl.setPublic(),
77
+ CacheControl.maxAge(Duration.seconds(0)),
78
+ CacheControl.sMaxAge(Duration.seconds(0)),
79
+ CacheControl.fromString('must-revalidate'),
80
+ ],
69
81
  },
70
82
 
71
83
  // Build files
@@ -73,6 +85,7 @@ export const getNuxtAppStaticAssetConfigs = (rootDir: string = '.'): StaticAsset
73
85
  pattern: '_nuxt/*',
74
86
  source: customAssetsSourcePath,
75
87
  target: customAssetsTargetPath,
88
+ exclude: [latestBuildManifestPattern],
76
89
 
77
90
  // Build assets are hashed whereby they are immutable and can be cached for a long time
78
91
  cacheControl: [
@@ -82,6 +95,44 @@ export const getNuxtAppStaticAssetConfigs = (rootDir: string = '.'): StaticAsset
82
95
  ],
83
96
  },
84
97
 
98
+ // Service worker bootstrap scripts emitted by PWA plugins (e.g. @vite-pwa/nuxt).
99
+ // These filenames are stable across deployments — they are NOT content-hashed — and
100
+ // they reference the hashed precache manifest baked into them. They MUST NOT be cached
101
+ // by the browser or CloudFront, otherwise:
102
+ // - browsers keep registering the old service worker for up to max-age, so users
103
+ // never receive new deployments until the cache expires,
104
+ // - registration.update() and periodic update checks revalidate against a stale
105
+ // edge copy and never observe new builds.
106
+ // The W3C service worker spec already caps browser caching of the SW script at 24 h,
107
+ // but explicit no-cache is the documented best practice (web.dev, MDN, Workbox docs).
108
+ // No CloudFront invalidation is needed: with s-maxage=0 + must-revalidate, every edge
109
+ // request triggers a conditional GET against S3 and the new ETag is picked up on the
110
+ // first request after the deployment.
111
+ // Two separate entries (one per file) because the pattern is also used as a CloudFront
112
+ // path pattern and CloudFront does not support brace expansion.
113
+ {
114
+ pattern: 'sw.js',
115
+ source: customAssetsSourcePath,
116
+ target: customAssetsTargetPath,
117
+ cacheControl: [
118
+ CacheControl.setPublic(),
119
+ CacheControl.maxAge(Duration.seconds(0)),
120
+ CacheControl.sMaxAge(Duration.seconds(0)),
121
+ CacheControl.fromString('must-revalidate'),
122
+ ],
123
+ },
124
+ {
125
+ pattern: 'registerSW.js',
126
+ source: customAssetsSourcePath,
127
+ target: customAssetsTargetPath,
128
+ cacheControl: [
129
+ CacheControl.setPublic(),
130
+ CacheControl.maxAge(Duration.seconds(0)),
131
+ CacheControl.sMaxAge(Duration.seconds(0)),
132
+ CacheControl.fromString('must-revalidate'),
133
+ ],
134
+ },
135
+
85
136
  // Files for native app links
86
137
  {
87
138
  pattern: '.well-known/*',
@@ -113,4 +164,4 @@ export const getNuxtAppStaticAssetConfigs = (rootDir: string = '.'): StaticAsset
113
164
  })
114
165
 
115
166
  return configs;
116
- };
167
+ };
@@ -6,6 +6,18 @@ import { type NuxtServerAppStackProps } from "./NuxtServerAppStackProps";
6
6
  * CDK stack to deploy a dynamic Nuxt app (target=server) on AWS with Lambda, ApiGateway, S3 and CloudFront.
7
7
  */
8
8
  export declare class NuxtServerAppStack extends Stack {
9
+ /**
10
+ * The static asset pattern whose post-Lambda {@link BucketDeployment} acts as the carrier for
11
+ * consumer-supplied CloudFront invalidations (via {@link NuxtServerAppStackProps.invalidatePathsOnDeploy}).
12
+ *
13
+ * We attach {@link BucketDeployment.distributionPaths} to this specific deployment so that:
14
+ * - CDK reuses its built-in CloudFront invalidation mechanism (no new construct types),
15
+ * - the invalidation fires AFTER the new Lambda and hashed assets are in place, since this
16
+ * deployment is already part of the post-Lambda deployment phase in {@link configureDeployments},
17
+ * - the files managed by {@link StaticAssetConfig} entries themselves are never invalidated
18
+ * (they are either build-hashed immutable assets or served with `s-maxage=0, must-revalidate`).
19
+ */
20
+ private static readonly CONSUMER_INVALIDATION_CARRIER_PATTERN;
9
21
  /**
10
22
  * The identifier prefix of the resources created by the stack.
11
23
  *
@@ -19,6 +31,12 @@ export declare class NuxtServerAppStack extends Stack {
19
31
  * @private
20
32
  */
21
33
  private readonly deploymentRevision;
34
+ /**
35
+ * Additional CloudFront paths to invalidate after a deployment.
36
+ *
37
+ * @private
38
+ */
39
+ private readonly deployInvalidationPaths;
22
40
  /**
23
41
  * The identity to use for accessing the deployment assets on S3.
24
42
  *
@@ -137,6 +155,12 @@ export declare class NuxtServerAppStack extends Stack {
137
155
  * @private
138
156
  */
139
157
  private createCloudFrontDistribution;
158
+ /**
159
+ * Normalizes CloudFront invalidation paths by trimming whitespace, ensuring a leading slash, and removing duplicates.
160
+ *
161
+ * @private
162
+ */
163
+ private normalizeInvalidationPaths;
140
164
  /**
141
165
  * Creates the CloudFront distribution behavior origin to route incoming requests to the Nuxt render Lambda function (via API gateway).
142
166
  */
@@ -32,6 +32,7 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
32
32
  this.resourceIdPrefix = `${props.project}-${props.service}-${props.environment}`;
33
33
  // Nuxt app resources
34
34
  this.deploymentRevision = this.createDeploymentRevision(props);
35
+ this.deployInvalidationPaths = this.normalizeInvalidationPaths(props.invalidatePathsOnDeploy);
35
36
  this.staticAssetConfigs = (0, NuxtAppStaticAssets_1.getNuxtAppStaticAssetConfigs)((_b = props.rootDir) !== null && _b !== void 0 ? _b : '.');
36
37
  this.cdnAccessIdentity = this.createCdnAccessIdentity();
37
38
  this.staticAssetsBucket = this.createStaticAssetsBucket();
@@ -253,6 +254,17 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
253
254
  webAclId: props.webAclArn,
254
255
  });
255
256
  }
257
+ /**
258
+ * Normalizes CloudFront invalidation paths by trimming whitespace, ensuring a leading slash, and removing duplicates.
259
+ *
260
+ * @private
261
+ */
262
+ normalizeInvalidationPaths(paths) {
263
+ return Array.from(new Set((paths !== null && paths !== void 0 ? paths : [])
264
+ .map(path => path.trim())
265
+ .filter((path) => path.length > 0)
266
+ .map(path => path.startsWith('/') ? path : `/${path}`)));
267
+ }
256
268
  /**
257
269
  * Creates the CloudFront distribution behavior origin to route incoming requests to the Nuxt render Lambda function (via API gateway).
258
270
  */
@@ -467,9 +479,16 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
467
479
  retention: aws_logs_1.RetentionDays.ONE_DAY,
468
480
  removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
469
481
  });
470
- // Returns a deployment for every configured static asset type to respect the different cache settings
471
- return this.staticAssetConfigs.filter(asset => (0, fs_1.existsSync)(asset.source)).map((asset, assetIndex) => {
472
- return new aws_s3_deployment_1.BucketDeployment(this, `${this.resourceIdPrefix}-assets-deployment-${assetIndex}`, {
482
+ // Returns a deployment for every configured static asset type to respect the different cache settings.
483
+ // Consumer-supplied CloudFront invalidation paths (props.invalidatePathsOnDeploy) are attached to a
484
+ // single, specific deployment — the "carrier" identified by CONSUMER_INVALIDATION_CARRIER_PATTERN —
485
+ // so the invalidation piggybacks on CDK's existing BucketDeployment invalidation mechanism while
486
+ // firing at the correct point in the deployment phase (see the post-Lambda logic below).
487
+ const hasConsumerInvalidations = this.deployInvalidationPaths.length > 0;
488
+ const deployments = this.staticAssetConfigs.filter(asset => (0, fs_1.existsSync)(asset.source)).map((asset, assetIndex) => {
489
+ const isInvalidationCarrier = asset.pattern === NuxtServerAppStack.CONSUMER_INVALIDATION_CARRIER_PATTERN;
490
+ const attachConsumerInvalidations = isInvalidationCarrier && hasConsumerInvalidations;
491
+ const deployment = new aws_s3_deployment_1.BucketDeployment(this, `${this.resourceIdPrefix}-assets-deployment-${assetIndex}`, {
473
492
  sources: [aws_s3_deployment_1.Source.asset(asset.source, {
474
493
  exclude: asset.exclude,
475
494
  })],
@@ -481,8 +500,8 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
481
500
  include: [asset.pattern],
482
501
  cacheControl: asset.cacheControl,
483
502
  contentType: asset.contentType,
484
- distribution: asset.invalidateOnChange ? this.cdn : undefined,
485
- distributionPaths: asset.invalidateOnChange ? [`/${asset.pattern}`] : undefined,
503
+ distribution: attachConsumerInvalidations ? this.cdn : undefined,
504
+ distributionPaths: attachConsumerInvalidations ? this.deployInvalidationPaths : undefined,
486
505
  logGroup: logGroup,
487
506
  metadata: {
488
507
  // Store build revision on every asset to allow cleanup of outdated assets
@@ -492,7 +511,32 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
492
511
  // Additionally, a high memory limit might speed up deployments.
493
512
  memoryLimit: 1792
494
513
  });
514
+ return { asset, deployment };
495
515
  });
516
+ // Patterns that must be uploaded AFTER the new Lambda + hashed assets are in place.
517
+ // These are non-hashed "switchover" files that flip clients onto the new build:
518
+ // - latest.json: Nuxt's outdated-build manifest pointer
519
+ // - sw.js / registerSW.js: PWA service worker bootstrap; once a client picks up the
520
+ // new sw.js it will try to precache the new chunks, which must already exist
521
+ const postLambdaPatterns = new Set([
522
+ '_nuxt/builds/latest.json',
523
+ 'sw.js',
524
+ 'registerSW.js',
525
+ ]);
526
+ const postLambdaDeployments = deployments.filter(({ asset }) => postLambdaPatterns.has(asset.pattern));
527
+ const preLambdaDeployments = deployments
528
+ .filter(({ asset }) => !postLambdaPatterns.has(asset.pattern))
529
+ .map(({ deployment }) => deployment);
530
+ preLambdaDeployments.forEach(deployment => {
531
+ this.appLambdaFunction.node.addDependency(deployment);
532
+ });
533
+ postLambdaDeployments.forEach(({ deployment }) => {
534
+ preLambdaDeployments.forEach(preLambda => {
535
+ deployment.node.addDependency(preLambda);
536
+ });
537
+ deployment.node.addDependency(this.appLambdaFunction);
538
+ });
539
+ return deployments.map(({ deployment }) => deployment);
496
540
  }
497
541
  /**
498
542
  * Resolves the hosted zone at which the DNS records shall be created to access the Nuxt app on the internet.
@@ -610,4 +654,16 @@ class NuxtServerAppStack extends aws_cdk_lib_1.Stack {
610
654
  }
611
655
  }
612
656
  exports.NuxtServerAppStack = NuxtServerAppStack;
613
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dFNlcnZlckFwcFN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiTnV4dFNlcnZlckFwcFN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUEyRDtBQUUzRCwrRUFBK0Q7QUFDL0QsK0RBaUJvQztBQUNwQyx1REFBc0Y7QUFDdEYsK0NBTTRCO0FBQzVCLHlEQUF3RztBQUN4RyxxRUFBcUY7QUFDckYsK0VBQThFO0FBQzlFLHlFQUFpRTtBQUNqRSxtREFBK0Q7QUFDL0QsZ0VBQTRGO0FBQzVGLHVEQUF1RTtBQUN2RSx1RUFBOEQ7QUFDOUQsNkJBQTZCO0FBQzdCLDJCQUF3RDtBQUd4RCw2RkFBZ0Y7QUFDaEYsbUVBQTJHO0FBRTNHOztHQUVHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxtQkFBSztJQWtHekMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE4Qjs7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDYixHQUFHLEtBQUs7WUFFUix1RUFBdUU7WUFDdkUscUJBQXFCLEVBQUUsS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksQ0FBQSxNQUFBLEtBQUssQ0FBQyxHQUFHLDBDQUFFLE1BQU0sTUFBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLHFCQUFxQjtTQUNqSSxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRWpGLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFBLGtEQUE0QixFQUFDLE1BQUEsS0FBSyxDQUFDLE9BQU8sbUNBQUksR0FBRyxD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QUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3hDLFVBQVU7WUFDVixpQkFBaUIsRUFBRSwwQkFBaUIsQ0FBQyxTQUFTO1lBQzlDLGVBQWUsRUFBRSx3QkFBZSxDQUFDLHNCQUFzQjtZQUN2RCxrRUFBa0U7WUFDbEUsYUFBYSxFQUFFLDJCQUFhLENBQUMsT0FBTztZQUNwQyxpQkFBaUIsRUFBRSxJQUFJO1NBQzFCLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFOUMsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUdPLHdCQUF3QixDQUFDLEtBQThCOztRQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxNQUFNLEVBQUUsNEJBQTRCLEVBQUUsR0FBRyxPQUFPLENBQUMsc0RBQXNELENBQUMsQ0FBQztRQUV6RyxJQUFJLDRCQUE0QixDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsdUJBQXVCLEVBQUU7WUFDcEYsTUFBTSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDN0IsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixjQUFjO1lBQ3RELGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7WUFDeEMsaUJBQWlCLEVBQUUsTUFBQSxLQUFLLENBQUMsMEJBQTBCLG1DQUFJLElBQUk7WUFDM0Qsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLHNCQUFzQjtZQUNoRCwyQkFBMkIsRUFBRSxLQUFLLENBQUMsK0JBQStCO1lBQ2xFLDBCQUEwQixFQUFFLEtBQUssQ0FBQyw4QkFBOEI7U0FDbkUsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKO0FBeHZCRCxnREF3dkJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEdXJhdGlvbiwgUmVtb3ZhbFBvbGljeSwgU3RhY2t9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7Q29uc3RydWN0fSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7Q2VydGlmaWNhdGV9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCI7XG5pbXBvcnQge1xuICAgIEFsbG93ZWRNZXRob2RzLFxuICAgIHR5cGUgQmVoYXZpb3JPcHRpb25zLFxuICAgIENhY2hlQ29va2llQmVoYXZpb3IsXG4gICAgQ2FjaGVkTWV0aG9kcyxcbiAgICBDYWNoZUhlYWRlckJlaGF2aW9yLFxuICAgIENhY2hlUG9saWN5LFxuICAgIENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvcixcbiAgICBEaXN0cmlidXRpb24sIEh0dHBWZXJzaW9uLFxuICAgIHR5cGUgSU9yaWdpbkFjY2Vzc0lkZW50aXR5LFxuICAgIE9yaWdpbkFjY2Vzc0lkZW50aXR5LFxuICAgIE9yaWdpblByb3RvY29sUG9saWN5LCBPcmlnaW5SZXF1ZXN0UG9saWN5LFxuICAgIFByaWNlQ2xhc3MsXG4gICAgU2VjdXJpdHlQb2xpY3lQcm90b2NvbCxcbiAgICBWaWV3ZXJQcm90b2NvbFBvbGljeSwgT3JpZ2luUmVxdWVzdENvb2tpZUJlaGF2aW9yLCBPcmlnaW5SZXF1ZXN0SGVhZGVyQmVoYXZpb3IsIE9yaWdpblJlcXVlc3RRdWVyeVN0cmluZ0JlaGF2aW9yLFxuICAgIEZ1bmN0aW9uRXZlbnRUeXBlLCB0eXBlIEZ1bmN0aW9uQXNzb2NpYXRpb24sXG4gICAgRnVuY3Rpb24gYXMgQ2xvdWRGcm9udEZ1bmN0aW9uLFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnRcIjtcbmltcG9ydCB7QXJjaGl0ZWN0dXJlLCBDb2RlLCBGdW5jdGlvbiwgUnVudGltZSwgVHJhY2luZ30gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7XG4gICAgQmxvY2tQdWJsaWNBY2Nlc3MsXG4gICAgQnVja2V0LFxuICAgIEJ1Y2tldEFjY2Vzc0NvbnRyb2wsXG4gICAgQnVja2V0RW5jcnlwdGlvbixcbiAgICBPYmplY3RPd25lcnNoaXBcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiO1xuaW1wb3J0IHtBYWFhUmVjb3JkLCBBUmVjb3JkLCBIb3N0ZWRab25lLCB0eXBlIElIb3N0ZWRab25lLCBSZWNvcmRUYXJnZXR9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1M1wiO1xuaW1wb3J0IHtCdWNrZXREZXBsb3ltZW50LCBTb3VyY2UsIFN0b3JhZ2VDbGFzc30gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zMy1kZXBsb3ltZW50XCI7XG5pbXBvcnQge0h0dHBPcmlnaW4sIFMzQnVja2V0T3JpZ2lufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQtb3JpZ2luc1wiO1xuaW1wb3J0IHtDbG91ZEZyb250VGFyZ2V0fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTMtdGFyZ2V0c1wiO1xuaW1wb3J0IHsgTG9nR3JvdXAsIFJldGVudGlvbkRheXMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCB7Z2V0TnV4dEFwcFN0YXRpY0Fzc2V0Q29uZmlncywgdHlwZSBTdGF0aWNBc3NldENvbmZpZ30gZnJvbSBcIi4uL051eHRBcHBTdGF0aWNBc3NldHNcIjtcbmltcG9ydCB7UnVsZSwgUnVsZVRhcmdldElucHV0LCBTY2hlZHVsZX0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIjtcbmltcG9ydCB7TGFtYmRhRnVuY3Rpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7d3JpdGVGaWxlU3luYywgbWtkaXJTeW5jLCBleGlzdHNTeW5jfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7dHlwZSBOdXh0U2VydmVyQXBwU3RhY2tQcm9wc30gZnJvbSBcIi4vTnV4dFNlcnZlckFwcFN0YWNrUHJvcHNcIjtcbmltcG9ydCB7dHlwZSBOdXh0Q2xvdWRGcm9udEJlaGF2aW9yfSBmcm9tIFwiLi9OdXh0U2VydmVyQXBwU3RhY2tQcm9wc1wiO1xuaW1wb3J0IHtIdHRwTGFtYmRhSW50ZWdyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyLWludGVncmF0aW9uc1wiO1xuaW1wb3J0IHtEb21haW5OYW1lLCBFbmRwb2ludFR5cGUsIEh0dHBBcGksIEh0dHBNZXRob2QsIFNlY3VyaXR5UG9saWN5fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2MlwiO1xuXG4vKipcbiAqIENESyBzdGFjayB0byBkZXBsb3kgYSBkeW5hbWljIE51eHQgYXBwICh0YXJnZXQ9c2VydmVyKSBvbiBBV1Mgd2l0aCBMYW1iZGEsIEFwaUdhdGV3YXksIFMzIGFuZCBDbG91ZEZyb250LlxuICovXG5leHBvcnQgY2xhc3MgTnV4dFNlcnZlckFwcFN0YWNrIGV4dGVuZHMgU3RhY2sge1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgcHJlZml4IG9mIHRoZSByZXNvdXJjZXMgY3JlYXRlZCBieSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VJZFByZWZpeDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IGRlcGxveW1lbnQgdGhhdCBpcyB1c2VkIHRvIHRhZyB0aGUgc3RhdGljIGFzc2V0cyBvZiB0aGUgZGVwbG95bWVudFxuICAgICAqIHRvIGxhdGVyIGJlIGFibGUgdG8gY2xlYW4gdXAgb3V0ZGF0ZWQgYXNzZXRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlcGxveW1lbnRSZXZpc2lvbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aXR5IHRvIHVzZSBmb3IgYWNjZXNzaW5nIHRoZSBkZXBsb3ltZW50IGFzc2V0cyBvbiBTMy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZG5BY2Nlc3NJZGVudGl0eTogSU9yaWdpbkFjY2Vzc0lkZW50aXR5O1xuXG4gICAgLyoqXG4gICAgICogVGhlIFMzIGJ1Y2tldCB3aGVyZSB0aGUgZGVwbG95bWVudCBhc3NldHMgZ2V0cyBzdG9yZWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpY0Fzc2V0c0J1Y2tldDogQnVja2V0O1xuXG4gICAgLyoqXG4gICAgICogVGhlIFMzIGJ1Y2tldCB3aGVyZSB0aGUgYWNjZXNzIGxvZ3Mgb2YgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIGdldHMgc3RvcmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBhY2Nlc3NMb2dzQnVja2V0OiBCdWNrZXR8dW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogVGhlIFMzIGJ1Y2tldCB3aGVyZSB0aGUgc2l0ZW1hcCBhc3NldHMgZ2V0cyBzdG9yZWQuXG4gICAgICovXG4gICAgcHVibGljIHNpdGVtYXBCdWNrZXQ6IEJ1Y2tldHx1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIHRvIHJlbmRlciB0aGUgTnV4dCBhcHAgb24gdGhlIHNlcnZlciBzaWRlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcExhbWJkYUZ1bmN0aW9uOiBGdW5jdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCBjbGVhbnVwcyB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xlYW51cExhbWJkYUZ1bmN0aW9uOiBGdW5jdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBBUEkgZ2F0ZXdheSB0byBtYWtlIHRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gcmVuZGVyIHRoZSBOdXh0IGFwcCBwdWJsaWNseSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgYXBpR2F0ZXdheTogSHR0cEFwaTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb25maWdzIGZvciB0aGUgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAgdGhhdCBzaGFsbCBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljQXNzZXRDb25maWdzOiBTdGF0aWNBc3NldENvbmZpZ1tdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIG9yaWdpbiBmb3IgdGhlIEFQSSBnYXRld2F5IHRvIHJvdXRlIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGh0dHBPcmlnaW46IEh0dHBPcmlnaW47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY2FjaGUgcG9saWN5IHRoYXQgc3BlY2lmaWVzIHdoaWNoIEhUVFAgaGVhZGVycywgY29va2llcywgYW5kIHF1ZXJ5IHN0cmluZ3NcbiAgICAgKiBDbG91ZEZyb250IGZvcndhcmRzIHRvIHRoZSBOdXh0IGFwcCBhbmQgdXNlcyB0byBnZW5lcmF0ZSBhIGNhY2hlIGtleS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcENhY2hlUG9saWN5OiBDYWNoZVBvbGljeTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgdGhhdCBzcGVjaWZpZXMgd2hpY2ggSFRUUCBoZWFkZXJzLCBjb29raWVzLCBhbmQgcXVlcnkgc3RyaW5nc1xuICAgICAqIENsb3VkRnJvbnQgZm9yd2FyZHMgdG8gdGhlIE51eHQgYXBwIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjYWNoZSBrZXkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhcHBSZXF1ZXN0UG9saWN5OiBPcmlnaW5SZXF1ZXN0UG9saWN5IHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgaW5jb21pbmcgd2ViIHJlcXVlc3RzXG4gICAgICogdG8gdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uICh2aWEgQVBJIGdhdGV3YXkpLlxuICAgICAqL1xuICAgIHByaXZhdGUgbnV4dFNlcnZlclJvdXRlQmVoYXZpb3I6IEJlaGF2aW9yT3B0aW9ucztcblxuICAgIC8qKlxuICAgICAqIFRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBpbmNvbWluZyByZXF1ZXN0cyB0byB0aGUgTnV4dCBMYW1iZGEgZnVuY3Rpb24gKHZpYSB0aGUgQVBJIGdhdGV3YXkpXG4gICAgICogb3IgdGhlIFMzIGFzc2V0cyBmb2xkZXIgKHdpdGggY2FjaGluZykuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RuOiBEaXN0cmlidXRpb247XG5cbiAgICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpIHtcbiAgICAgICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICAgICAgICAuLi5wcm9wcyxcblxuICAgICAgICAgICAgLy8gRm9yY2UgY3Jvc3MtcmVnaW9uIHJlZmVyZW5jZXMgaWYgYSBXQUYgQUNMIGlzIHVzZWQgb3V0c2lkZSB1cy1lYXN0LTFcbiAgICAgICAgICAgIGNyb3NzUmVnaW9uUmVmZXJlbmNlczogcHJvcHMud2ViQWNsQXJuICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZW52Py5yZWdpb24gIT09ICd1cy1lYXN0LTEnID8gdHJ1ZSA6IHByb3BzLmNyb3NzUmVnaW9uUmVmZXJlbmNlcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZXNvdXJjZUlkUHJlZml4ID0gYCR7cHJvcHMucHJvamVjdH0tJHtwcm9wcy5zZXJ2aWNlfS0ke3Byb3BzLmVudmlyb25tZW50fWA7XG5cbiAgICAgICAgLy8gTnV4dCBhcHAgcmVzb3VyY2VzXG4gICAgICAgIHRoaXMuZGVwbG95bWVudFJldmlzaW9uID0gdGhpcy5jcmVhdGVEZXBsb3ltZW50UmV2aXNpb24ocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0Q29uZmlncyA9IGdldE51eHRBcHBTdGF0aWNBc3NldENvbmZpZ3MocHJvcHMucm9vdERpciA/PyAnLicpO1xuICAgICAgICB0aGlzLmNkbkFjY2Vzc0lkZW50aXR5ID0gdGhpcy5jcmVhdGVDZG5BY2Nlc3NJZGVudGl0eSgpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldCA9IHRoaXMuY3JlYXRlU3RhdGljQXNzZXRzQnVja2V0KCk7XG5cbiAgICAgICAgaWYgKHByb3BzLmVuYWJsZUFjY2Vzc0xvZ3NBbmFseXNpcykge1xuICAgICAgICAgICAgdGhpcy5hY2Nlc3NMb2dzQnVja2V0ID0gdGhpcy5jcmVhdGVBY2Nlc3NMb2dzQnVja2V0KCk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFjY2Vzc0xvZ3NBbmFseXNpcyhwcm9wcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlU2l0ZW1hcCkge1xuICAgICAgICAgICAgdGhpcy5zaXRlbWFwQnVja2V0ID0gdGhpcy5jcmVhdGVTaXRlbWFwQnVja2V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcExhbWJkYUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVBcHBMYW1iZGFGdW5jdGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuYXBpR2F0ZXdheSA9IHRoaXMuY3JlYXRlQXBpR2F0ZXdheShwcm9wcyk7XG4gICAgICAgIHRoaXMuaHR0cE9yaWdpbiA9IHRoaXMuY3JlYXRlTnV4dEFwcEh0dHBPcmlnaW4oKTtcbiAgICAgICAgdGhpcy5hcHBDYWNoZVBvbGljeSA9IHRoaXMuY3JlYXRlTnV4dEFwcENhY2hlUG9saWN5KHByb3BzKVxuICAgICAgICB0aGlzLmFwcFJlcXVlc3RQb2xpY3kgPSB0aGlzLmNyZWF0ZU51eHRBcHBSZXF1ZXN0UG9saWN5KHByb3BzKVxuICAgICAgICB0aGlzLm51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yID0gdGhpcy5jcmVhdGVOdXh0U2VydmVyUm91dGVCZWhhdmlvcigpXG5cbiAgICAgICAgdGhpcy5jZG4gPSB0aGlzLmNyZWF0ZUNsb3VkRnJvbnREaXN0cmlidXRpb24ocHJvcHMpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZURlcGxveW1lbnRzKCk7XG4gICAgICAgIHRoaXMuY3JlYXRlRG5zUmVjb3Jkcyhwcm9wcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlQXBwUGluZ1J1bGUocHJvcHMpO1xuXG4gICAgICAgIC8vIFN0YXRpYyBhc3NldHMgY2xlYW51cCByZXNvdXJjZXNcbiAgICAgICAgdGhpcy5jbGVhbnVwTGFtYmRhRnVuY3Rpb24gPSB0aGlzLmNyZWF0ZUNsZWFudXBMYW1iZGFGdW5jdGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2xlYW51cFRyaWdnZXJSdWxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgY3VycmVudCBkZXBsb3ltZW50IHJldmlzaW9uIGZpbGUgaW4gdGhlIHB1YmxpYyBmb2xkZXIgb2YgdGhlIE51eHQgYXBwIHRvIGJlIGFjY2Vzc2libGVcbiAgICAgKiBhbmQgcmV0dXJucyB0aGUgY3VycmVudCByZXZpc2lvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURlcGxveW1lbnRSZXZpc2lvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBhcHBSZXZpc2lvbiA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblxuICAgICAgICBjb25zdCBkaXIgPSBwYXRoLmpvaW4ocHJvcHMucm9vdERpciA/PyAnLicsICcub3V0cHV0JywgJ3B1YmxpYycpO1xuICAgICAgICBta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgd3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oZGlyLCAnYXBwLXJldmlzaW9uJyksIGFwcFJldmlzaW9uLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICAgIHJldHVybiBhcHBSZXZpc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBpZGVudGl0eSB0byBhY2Nlc3MgdGhlIFMzIGRlcGxveW1lbnQgYXNzZXQgZmlsZXMgdmlhIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVDZG5BY2Nlc3NJZGVudGl0eSgpOiBJT3JpZ2luQWNjZXNzSWRlbnRpdHkge1xuICAgICAgICBjb25zdCBvcmlnaW5BY2Nlc3NJZGVudGl0eU5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNkbi1zMy1hY2Nlc3NgO1xuICAgICAgICByZXR1cm4gbmV3IE9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMsIG9yaWdpbkFjY2Vzc0lkZW50aXR5TmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgYnVja2V0IHRvIHN0b3JlIHRoZSBzdGF0aWMgZGVwbG95bWVudCBhc3NldCBmaWxlcyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU3RhdGljQXNzZXRzQnVja2V0KCk6IEJ1Y2tldCB7XG4gICAgICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFzc2V0c2A7XG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQodGhpcywgYnVja2V0TmFtZSwge1xuICAgICAgICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IEJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgICAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAvLyBUaGUgYnVja2V0IGFuZCBhbGwgb2YgaXRzIG9iamVjdHMgY2FuIGJlIGRlbGV0ZWQsIGJlY2F1c2UgYWxsIHRoZSBjb250ZW50IGlzIG1hbmFnZWQgaW4gdGhpcyBwcm9qZWN0XG4gICAgICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgICAgICAgIG9iamVjdE93bmVyc2hpcDogT2JqZWN0T3duZXJzaGlwLkJVQ0tFVF9PV05FUl9FTkZPUkNFRCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMuY2RuQWNjZXNzSWRlbnRpdHkpO1xuXG4gICAgICAgIHJldHVybiBidWNrZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgYnVja2V0IHRvIHN0b3JlIHRoZSBzaXRlbWFwIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU2l0ZW1hcEJ1Y2tldCgpOiBCdWNrZXQge1xuICAgICAgICBjb25zdCBidWNrZXROYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1zaXRlbWFwYDtcbiAgICAgICAgY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCBidWNrZXROYW1lLCB7XG4gICAgICAgICAgICBidWNrZXROYW1lLFxuICAgICAgICAgICAgYWNjZXNzQ29udHJvbDogQnVja2V0QWNjZXNzQ29udHJvbC5QUklWQVRFLFxuICAgICAgICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IEJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgICAgICAgIGVuY3J5cHRpb246IEJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRCxcbiAgICAgICAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgICAgICAgICAvLyBUaGUgYnVja2V0IGFuZCBhbGwgb2YgaXRzIG9iamVjdHMgY2FuIGJlIGRlbGV0ZWQsIGJlY2F1c2UgYWxsIHRoZSBjb250ZW50IGlzIG1hbmFnZWQgaW4gdGhpcyBwcm9qZWN0XG4gICAgICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMuY2RuQWNjZXNzSWRlbnRpdHkpO1xuXG4gICAgICAgIHJldHVybiBidWNrZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRvIHJlbmRlciB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQXBwTGFtYmRhRnVuY3Rpb24ocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogRnVuY3Rpb24ge1xuICAgICAgICBjb25zdCBmdW5jTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tbnV4dGA7XG5cbiAgICAgICAgY29uc3QgYXBwTG9nR3JvdXAgPSBuZXcgTG9nR3JvdXAodGhpcywgYCR7ZnVuY05hbWV9LWxvZ3NgLCB7XG4gICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke2Z1bmNOYW1lfWAsXG4gICAgICAgICAgICByZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgICB9KTtcbiAgICAgICAgYXBwTG9nR3JvdXAuYXBwbHlSZW1vdmFsUG9saWN5KFJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbih0aGlzLCBmdW5jTmFtZSwge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgUmVuZGVycyB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IE51eHQgYXBwLmAsXG4gICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgICAgICAgaGFuZGxlcjogYCR7cHJvcHMuZW50cnlwb2ludCA/PyAnaW5kZXgnfS5oYW5kbGVyYCxcbiAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KGAke3Byb3BzLnJvb3REaXIgPz8gJy4nIH0vLm91dHB1dC9zZXJ2ZXJgLCB7XG4gICAgICAgICAgICAgICAgZXhjbHVkZTogWycqKi5zdmcnLCAnKiouaWNvJywgJyoqLnBuZycsICcqKi5qcGcnLCAnKiouanMubWFwJ10sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IHByb3BzLnRpbWVvdXQgPz8gRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplID8/IDE3OTIsXG4gICAgICAgICAgICBhbGxvd1B1YmxpY1N1Ym5ldDogZmFsc2UsXG4gICAgICAgICAgICB0cmFjaW5nOiBwcm9wcy5lbmFibGVUcmFjaW5nID8gVHJhY2luZy5BQ1RJVkUgOiBUcmFjaW5nLkRJU0FCTEVELFxuICAgICAgICAgICAgbG9nR3JvdXA6IGFwcExvZ0dyb3VwLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgICBOT0RFX09QVElPTlM6ICctLWVuYWJsZS1zb3VyY2UtbWFwcycsXG4gICAgICAgICAgICAgICAgLi4uSlNPTi5wYXJzZShwcm9wcy5lbnRyeXBvaW50RW52ID8/ICd7fScpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgY2xlYW51cHMgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqIE5vdGUgdGhhdCB3ZSB1c2UgdGhlIGJ1bmRsZWQgQVdTIFNESyBmb3IgTm9kZSB0byBhdm9pZCB0aGUgbmVlZCBmb3IgYSBjdXN0b20gbGF5ZXJcbiAgICAgKiB3aGljaCByZXN0cmljdHMgdGhlIGNvbnN1bWVyIHRvIGEgc3BlY2lmaWMgeWFybiBvciBucG0gdmVyc2lvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNsZWFudXBMYW1iZGFGdW5jdGlvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBGdW5jdGlvbiB7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZTogc3RyaW5nID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jbGVhbnVwYDtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25EaXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Z1bmN0aW9ucy9hc3NldHMtY2xlYW51cCcpO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXBMb2dHcm91cCA9IG5ldyBMb2dHcm91cCh0aGlzLCBgJHtmdW5jdGlvbk5hbWV9LWxvZ3NgLCB7XG4gICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gLFxuICAgICAgICAgICAgcmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLlRXT19XRUVLUyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNsZWFudXBMb2dHcm91cC5hcHBseVJlbW92YWxQb2xpY3koUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcblxuICAgICAgICBjb25zdCByZXN1bHQ6IEZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKHRoaXMsIGZ1bmN0aW9uTmFtZSwge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYEF1dG8tZGVsZXRlcyB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBpbiB0aGUgJHt0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lfSBTMyBidWNrZXQuYCxcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICAgICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChgJHtmdW5jdGlvbkRpclBhdGh9L2J1aWxkL2FwcGAsIHtcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBbJyouZC50cyddXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTUpLFxuICAgICAgICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgICBTVEFUSUNfQVNTRVRTX0JVQ0tFVDogdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICBPVVREQVRFRF9BU1NFVFNfUkVURU5USU9OX0RBWVM6IGAke3Byb3BzLm91dGRhdGVkQXNzZXRzUmV0ZW50aW9uRGF5cyA/PyAzMH1gLFxuICAgICAgICAgICAgICAgIEVOVklST05NRU5UOiBwcm9wcy5lbnZpcm9ubWVudCxcbiAgICAgICAgICAgICAgICBBV1NfTk9ERUpTX0NPTk5FQ1RJT05fUkVVU0VfRU5BQkxFRDogJzEnLFxuICAgICAgICAgICAgICAgIE5PREVfT1BUSU9OUzogJy0tZW5hYmxlLXNvdXJjZS1tYXBzJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb2dHcm91cDogY2xlYW51cExvZ0dyb3VwLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBncmFudCBmdW5jdGlvbiBhY2Nlc3MgdG8gUzMgYnVja2V0XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LmdyYW50UmVhZChyZXN1bHQpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5ncmFudERlbGV0ZShyZXN1bHQpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgQVBJIGdhdGV3YXkgdG8gbWFrZSB0aGUgTnV4dCBhcHAgcmVuZGVyIExhbWJkYSBmdW5jdGlvbiBwdWJsaWNseSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQXBpR2F0ZXdheShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBIdHRwQXBpIHtcbiAgICAgICAgY29uc3QgYXBpTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXBpYDtcbiAgICAgICAgY29uc3QgbGFtYmRhSW50ZWdyYXRpb24gPSBuZXcgSHR0cExhbWJkYUludGVncmF0aW9uKGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tbGFtYmRhLWludGVncmF0aW9uYCwgdGhpcy5hcHBMYW1iZGFGdW5jdGlvbik7XG5cbiAgICAgICAgLy8gV2Ugd2FudCB0aGUgQVBJIGdhdGV3YXkgdG8gYmUgYWNjZXNzaWJsZSBieSB0aGUgY3VzdG9tIGRvbWFpbiBuYW1lLlxuICAgICAgICAvLyBFdmVuIHRob3VnaCB3ZSBhY2Nlc3MgdGhlIGdhdGV3YXkgdmlhIENsb3VkRnJvbnQgKGZvciBhdXRvIGh0dHAgdG8gaHR0cHMgcmVkaXJlY3RzKSwgdGhpcyBpcyByZXF1aXJlZFxuICAgICAgICAvLyB0byBiZSBhYmxlIHRvIHJlZGlyZWN0IHRoZSBvcmlnaW5hbCAnSG9zdCcgaGVhZGVyIHRvIHRoZSBOdXh0IGFwcGxpY2F0aW9uLCBpZiByZXF1ZXN0ZWQuXG4gICAgICAgIGNvbnN0IGRvbWFpbk5hbWUgPSBuZXcgRG9tYWluTmFtZSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFwaS1kb21haW5gLCB7XG4gICAgICAgICAgICBkb21haW5OYW1lOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICBjZXJ0aWZpY2F0ZTogQ2VydGlmaWNhdGUuZnJvbUNlcnRpZmljYXRlQXJuKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tcmVnaW9uYWwtY2VydGlmaWNhdGVgLCBwcm9wcy5yZWdpb25hbFRsc0NlcnRpZmljYXRlQXJuKSxcbiAgICAgICAgICAgIGVuZHBvaW50VHlwZTogRW5kcG9pbnRUeXBlLlJFR0lPTkFMLFxuICAgICAgICAgICAgc2VjdXJpdHlQb2xpY3k6IFNlY3VyaXR5UG9saWN5LlRMU18xXzJcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgYXBpR2F0ZXdheSA9IG5ldyBIdHRwQXBpKHRoaXMsIGFwaU5hbWUsIHtcbiAgICAgICAgICAgIGFwaU5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYENvbm5lY3RzIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gd2l0aCB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IExhbWJkYSBmdW5jdGlvbiB0byBtYWtlIGl0IHB1YmxpY2x5IGF2YWlsYWJsZS5gLFxuICAgICAgICAgICAgLy8gVGhlIGFwcCBkb2VzIG5vdCBhbGxvdyBhbnkgY3Jvc3Mtb3JpZ2luIGFjY2VzcyBieSBwdXJwb3NlOiB0aGUgYXBwIHNob3VsZCBub3QgYmUgZW1iZWRkYWJsZSBhbnl3aGVyZVxuICAgICAgICAgICAgY29yc1ByZWZsaWdodDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGVmYXVsdEludGVncmF0aW9uOiBsYW1iZGFJbnRlZ3JhdGlvbixcbiAgICAgICAgICAgIGRlZmF1bHREb21haW5NYXBwaW5nOiB7XG4gICAgICAgICAgICAgICAgZG9tYWluTmFtZTogZG9tYWluTmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBhcGlHYXRld2F5LmFkZFJvdXRlcyh7XG4gICAgICAgICAgICBpbnRlZ3JhdGlvbjogbGFtYmRhSW50ZWdyYXRpb24sXG4gICAgICAgICAgICBwYXRoOiAnL3twcm94eSt9JyxcbiAgICAgICAgICAgIG1ldGhvZHM6IFtcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLkdFVCxcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLkhFQUQsXG4gICAgICAgICAgICAgICAgSHR0cE1ldGhvZC5PUFRJT05TLFxuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLlBVVCxcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLlBBVENILFxuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuREVMRVRFLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFwaUdhdGV3YXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdGhhdCByb3V0ZXMgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uICh2aWEgdGhlIEFQSSBnYXRld2F5KVxuICAgICAqIG9yIHRoZSBTMyBhc3NldHMgZm9sZGVyICh3aXRoIGNhY2hpbmcpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNsb3VkRnJvbnREaXN0cmlidXRpb24ocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogRGlzdHJpYnV0aW9uIHtcbiAgICAgICAgY29uc3QgY2RuTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2RuYDtcblxuICAgICAgICByZXR1cm4gbmV3IERpc3RyaWJ1dGlvbih0aGlzLCBjZG5OYW1lLCB7XG4gICAgICAgICAgICBkb21haW5OYW1lczogW3Byb3BzLmRvbWFpbl0sXG4gICAgICAgICAgICBjb21tZW50OiBjZG5OYW1lLFxuICAgICAgICAgICAgbWluaW11bVByb3RvY29sVmVyc2lvbjogU2VjdXJpdHlQb2xpY3lQcm90b2NvbC5UTFNfVjFfMl8yMDE4LFxuICAgICAgICAgICAgY2VydGlmaWNhdGU6IENlcnRpZmljYXRlLmZyb21DZXJ0aWZpY2F0ZUFybih0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWdsb2JhbC1jZXJ0aWZpY2F0ZWAsIHByb3BzLmdsb2JhbFRsc0NlcnRpZmljYXRlQXJuKSxcbiAgICAgICAgICAgIGh0dHBWZXJzaW9uOiBIdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgICAgICAgIGRlZmF1bHRCZWhhdmlvcjogdGhpcy5udXh0U2VydmVyUm91dGVCZWhhdmlvcixcbiAgICAgICAgICAgIGFkZGl0aW9uYWxCZWhhdmlvcnM6IHRoaXMuc2V0dXBDbG91ZEZyb250Um91dGluZyhwcm9wcyksXG4gICAgICAgICAgICBwcmljZUNsYXNzOiBQcmljZUNsYXNzLlBSSUNFX0NMQVNTXzEwMCwgLy8gVXNlIG9ubHkgTm9ydGggQW1lcmljYSBhbmQgRXVyb3BlXG4gICAgICAgICAgICBsb2dCdWNrZXQ6IHRoaXMuYWNjZXNzTG9nc0J1Y2tldCxcbiAgICAgICAgICAgIGxvZ0ZpbGVQcmVmaXg6IHByb3BzLmVuYWJsZUFjY2Vzc0xvZ3NBbmFseXNpcyA/ICd1bnByb2Nlc3NlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBsb2dJbmNsdWRlc0Nvb2tpZXM6IHByb3BzLmVuYWJsZUFjY2Vzc0xvZ3NBbmFseXNpcyxcbiAgICAgICAgICAgIHdlYkFjbElkOiBwcm9wcy53ZWJBY2xBcm4sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIGJlaGF2aW9yIG9yaWdpbiB0byByb3V0ZSBpbmNvbWluZyByZXF1ZXN0cyB0byB0aGUgTnV4dCByZW5kZXIgTGFtYmRhIGZ1bmN0aW9uICh2aWEgQVBJIGdhdGV3YXkpLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlTnV4dEFwcEh0dHBPcmlnaW4oKTogSHR0cE9yaWdpbiB7XG4gICAgICAgIHJldHVybiBuZXcgSHR0cE9yaWdpbihgJHt0aGlzLmFwaUdhdGV3YXkuaHR0cEFwaUlkfS5leGVjdXRlLWFwaS4ke3RoaXMucmVnaW9ufS5hbWF6b25hd3MuY29tYCwge1xuICAgICAgICAgICAgY29ubmVjdGlvbkF0dGVtcHRzOiAyLFxuICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMiksXG4gICAgICAgICAgICByZWFkVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICAgICAgICBwcm90b2NvbFBvbGljeTogT3JpZ2luUHJvdG9jb2xQb2xpY3kuSFRUUFNfT05MWSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgaW5jb21pbmcgd2ViIHJlcXVlc3RzXG4gICAgICogdG8gdGhlIE51eHQgcmVuZGVyIExhbWJkYSBmdW5jdGlvbiAodmlhIEFQSSBnYXRld2F5KS5cbiAgICAgKiBBZGRpdGlvbmFsbHksIHRoaXMgYXV0b21hdGljYWxseSByZWRpcmVjdHMgSFRUUCByZXF1ZXN0cyB0byBIVFRQUy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZU51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yKCk6IEJlaGF2aW9yT3B0aW9ucyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcmlnaW46IHRoaXMuaHR0cE9yaWdpbixcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRCxcbiAgICAgICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogdGhpcy5hcHBSZXF1ZXN0UG9saWN5LFxuICAgICAgICAgICAgY2FjaGVQb2xpY3k6IHRoaXMuYXBwQ2FjaGVQb2xpY3lcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwQ2xvdWRGcm9udFJvdXRpbmcocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGxldCByb3V0aW5nQmVoYXZpb3VyczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHtcblxuICAgICAgICAgICAgLy8gTnV4dCBJMThuIGZpbGVzIGFyZSBzZXJ2ZWQgdmlhIGEgc2VydmVyIHJvdXRlXG4gICAgICAgICAgICAnL19pMThuLyonOiB0aGlzLm51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFNwZWNpZmljIG9uZXMgZmlyc3RcbiAgICAgICAgaWYgKHByb3BzLmVuYWJsZUFwaSkge1xuICAgICAgICAgICAgcm91dGluZ0JlaGF2aW91cnMgPSB7Li4ucm91dGluZ0JlaGF2aW91cnMsIC4uLnRoaXMuY3JlYXRlQXBpUm91dGVCZWhhdmlvcigpfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlU2l0ZW1hcCkge1xuICAgICAgICAgICAgcm91dGluZ0JlaGF2aW91cnMgPSB7Li4ucm91dGluZ0JlaGF2aW91cnMsIC4uLnRoaXMuY3JlYXRlU2l0ZW1hcFJvdXRlQmVoYXZpb3IoKX07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgY3VzdG9tIHNlcnZlciByb3V0ZXMgYmVmb3JlIHN0YXRpYyBhc3NldHMgdG8gZW5zdXJlIHRoZXkgdGFrZSBwcmVjZWRlbmNlXG4gICAgICAgIGlmIChwcm9wcy5zZXJ2ZXJSb3V0ZXMgJiYgcHJvcHMuc2VydmVyUm91dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJvdXRpbmdCZWhhdmlvdXJzID0gey4uLnJvdXRpbmdCZWhhdmlvdXJzLCAuLi50aGlzLmNyZWF0ZVNlcnZlclJvdXRlQmVoYXZpb3IocHJvcHMuc2VydmVyUm91dGVzKX07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmplY3QgY3VzdG9tIGJlaGF2aW9ycyAoY2FjaGUgcG9saWN5IG92ZXJyaWRlcyBhbmQvb3IgQ2xvdWRGcm9udCBGdW5jdGlvbnMpIGJlZm9yZSBzdGF0aWMgYXNzZXQgYmVoYXZpb3JzXG4gICAgICAgIGlmIChwcm9wcy5hZGRpdGlvbmFsQmVoYXZpb3JzICYmIHByb3BzLmFkZGl0aW9uYWxCZWhhdmlvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcm91dGluZ0JlaGF2aW91cnMgPSB7Li4ucm91dGluZ0JlaGF2aW91cnMsIC4uLnRoaXMuY3JlYXRlQWRkaXRpb25hbEJlaGF2aW9ycyhwcm9wcy5hZGRpdGlvbmFsQmVoYXZpb3JzKX07XG4gICAgICAgIH1cblxuICAgICAgICByb3V0aW5nQmVoYXZpb3VycyA9IHsuLi5yb3V0aW5nQmVoYXZpb3VycywgLi4udGhpcy5jcmVhdGVTdGF0aWNBc3NldHNSb3V0ZUJlaGF2aW9yKCl9O1xuXG4gICAgICAgIHJldHVybiByb3V0aW5nQmVoYXZpb3VycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2FjaGUgcG9saWN5IGZvciB0aGUgTnV4dCBhcHAgcm91dGUgYmVoYXZpb3Igb2YgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlTnV4dEFwcENhY2hlUG9saWN5KHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IENhY2hlUG9saWN5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYWNoZVBvbGljeSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNhY2hlLXBvbGljeWAsIHtcbiAgICAgICAgICAgIGNhY2hlUG9saWN5TmFtZTogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jZG4tY2FjaGUtcG9saWN5YCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGBEZWZpbmVzIHdoaWNoIHJlcXVlc3QgZGF0YSB0byBwYXNzIHRvIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gb3JpZ2luIGFuZCBob3cgdGhlIGNhY2hlIGtleSBpcyBjYWxjdWxhdGVkLmAsXG4gICAgICAgICAgICBkZWZhdWx0VHRsOiBEdXJhdGlvbi5zZWNvbmRzKDApLFxuICAgICAgICAgICAgbWluVHRsOiBEdXJhdGlvbi5zZWNvbmRzKDApLFxuICAgICAgICAgICAgbWF4VHRsOiBEdXJhdGlvbi5kYXlzKDM2NSksXG4gICAgICAgICAgICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBwcm9wcy5jYWNoZUtleVF1ZXJ5UGFyYW1zPy5sZW5ndGggPyBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmNhY2hlS2V5UXVlcnlQYXJhbXMpIDogKHByb3BzLmRlbnlDYWNoZUtleVF1ZXJ5UGFyYW1zPy5sZW5ndGggPyBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuZGVueUxpc3QoLi4ucHJvcHMuZGVueUNhY2hlS2V5UXVlcnlQYXJhbXMpIDogKHByb3BzLmFsbG93UXVlcnlQYXJhbXM/Lmxlbmd0aCA/IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuYWxsb3dRdWVyeVBhcmFtcykgOiAocHJvcHMuZGVueVF1ZXJ5UGFyYW1zPy5sZW5ndGggPyBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuZGVueUxpc3QoLi4ucHJvcHMuZGVueVF1ZXJ5UGFyYW1zKSA6IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5hbGwoKSkpKSxcbiAgICAgICAgICAgIGhlYWRlckJlaGF2aW9yOiBwcm9wcy5jYWNoZUtleUhlYWRlcnM/Lmxlbmd0aCA/IENhY2hlSGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmNhY2hlS2V5SGVhZGVycykgOiAocHJvcHMuYWxsb3dIZWFkZXJzPy5sZW5ndGggPyBDYWNoZUhlYWRlckJlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5hbGxvd0hlYWRlcnMpIDogQ2FjaGVIZWFkZXJCZWhhdmlvci5ub25lKCkpLFxuICAgICAgICAgICAgY29va2llQmVoYXZpb3I6IHByb3BzLmNhY2hlS2V5Q29va2llcz8ubGVuZ3RoID8gQ2FjaGVDb29raWVCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuY2FjaGVLZXlDb29raWVzKSA6IChwcm9wcy5hbGxvd0Nvb2tpZXM/Lmxlbmd0aCA/IENhY2hlQ29va2llQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmFsbG93Q29va2llcykgOiBDYWNoZUNvb2tpZUJlaGF2aW9yLm5vbmUoKSksXG4gICAgICAgICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0Jyb3RsaTogdHJ1ZSxcbiAgICAgICAgICAgIGVuYWJsZUFjY2VwdEVuY29kaW5nR3ppcDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvcmlnaW4gcmVxdWVzdCBwb2xpY3kgZm9yIHRoZSBOdXh0IGFwcCByb3V0ZSBiZWhhdmlvciBvZiB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAgICogTm8gcG9saWN5IGlzIGNyZWF0ZWQgaWYgbm8gZXhwbGljaXQgY29uZmlnIGlzIHByb3ZpZGVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlTnV4dEFwcFJlcXVlc3RQb2xpY3kocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogT3JpZ2luUmVxdWVzdFBvbGljeXx1bmRlZmluZWQge1xuXG4gICAgICAgIC8vIElmIG5vIGV4cGxpY2l0IGNvbmZpZyBpcyBwcm92aWRlZCwgd2Ugd2FudCB0byB1c2UgdGhlIGRlZmF1bHQgZnJvbSBDbG91ZGZyb250XG4gICAgICAgIGNvbnN0IGhhc0FueUNvbmZpZyA9IHByb3BzLmZvcndhcmRRdWVyeVBhcmFtcz8ubGVuZ3RoIHx8IHByb3BzLmZvcndhcmRIZWFkZXJzPy5sZW5ndGggfHwgcHJvcHMuZm9yd2FyZENvb2tpZXM/Lmxlbmd0aDtcbiAgICAgICAgaWYgKCFoYXNBbnlDb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE9yaWdpblJlcXVlc3RQb2xpY3kodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1yZXF1ZXN0LXBvbGljeWAsIHtcbiAgICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3lOYW1lOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNkbi1yZXF1ZXN0LXBvbGljeWAsXG4gICAgICAgICAgICBjb21tZW50OiBgRGVmaW5lcyB3aGljaCByZXF1ZXN0IGRhdGEgdG8gcGFzcyB0byB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IG9yaWdpbiB3aXRob3V0IGFmZmVjdGluZyB0aGUgY2FjaGUga2V5LmAsXG4gICAgICAgICAgICBxdWVyeVN0cmluZ0JlaGF2aW9yOiBwcm9wcy5mb3J3YXJkUXVlcnlQYXJhbXM/Lmxlbmd0aCA/IE9yaWdpblJlcXVlc3RRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5mb3J3YXJkUXVlcnlQYXJhbXMpIDogT3JpZ2luUmVxdWVzdFF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsKCksXG4gICAgICAgICAgICBoZWFkZXJCZWhhdmlvcjogcHJvcHMuZm9yd2FyZEhlYWRlcnM/Lmxlbmd0aCA/IE9yaWdpblJlcXVlc3RIZWFkZXJCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuZm9yd2FyZEhlYWRlcnMpIDogT3JpZ2luUmVxdWVzdEhlYWRlckJlaGF2aW9yLm5vbmUoKSxcbiAgICAgICAgICAgIGNvb2tpZUJlaGF2aW9yOiBwcm9wcy5mb3J3YXJkQ29va2llcz8ubGVuZ3RoID8gT3JpZ2luUmVxdWVzdENvb2tpZUJlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5mb3J3YXJkQ29va2llcykgOiBPcmlnaW5SZXF1ZXN0Q29va2llQmVoYXZpb3Iubm9uZSgpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmVoYXZpb3IgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBtYXRjaGluZyBOdXh0IGFwcCBBUEkgcmVxdWVzdHMgdG8gdGhlIEFQSSBnYXRld2F5LlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQXBpUm91dGVCZWhhdmlvcigpOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgY29uc3QgYXBpQmVoYXZpb3I6IEJlaGF2aW9yT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG9yaWdpbjogdGhpcy5odHRwT3JpZ2luLFxuICAgICAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgICAgICBhbGxvd2VkTWV0aG9kczogQWxsb3dlZE1ldGhvZHMuQUxMT1dfQUxMLFxuICAgICAgICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVQb2xpY3k6IHRoaXMuYXBwQ2FjaGVQb2xpY3ksXG4gICAgICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5OiB0aGlzLmFwcFJlcXVlc3RQb2xpY3ksXG4gICAgICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuSFRUUFNfT05MWVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJ1bGVzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge307XG4gICAgICAgIHJ1bGVzWycvYXBpLyonXSA9IGFwaUJlaGF2aW9yO1xuXG4gICAgICAgIHJldHVybiBydWxlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGJlaGF2aW9ycyBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIHNwZWNpZmllZCBwYXRoIHBhdHRlcm5zIHRvIHRoZSBTU1Igb3JpZ2luLlxuICAgICAqIFRoaXMgYWxsb3dzIHNlcnZlciBlbmRwb2ludHMgdGhhdCB1c2UgZmlsZS1saWtlIFVSTHMgKGUuZy4sIC9zaXRlbWFwLnhtbCBmcm9tIEBudXh0anMvc2l0ZW1hcCkgXG4gICAgICogdG8gYmUgaGFuZGxlZCBieSB0aGUgTGFtYmRhIGZ1bmN0aW9uIGZvciBkeW5hbWljIGNvbnRlbnQgZ2VuZXJhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVNlcnZlclJvdXRlQmVoYXZpb3Ioc2VydmVyUm91dGVzOiBzdHJpbmdbXSk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBjb25zdCBydWxlczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuICAgICAgICBcbiAgICAgICAgc2VydmVyUm91dGVzLmZvckVhY2gocm91dGUgPT4ge1xuICAgICAgICAgICAgcnVsZXNbcm91dGVdID0gdGhpcy5udXh0U2VydmVyUm91dGVCZWhhdmlvcjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJ1bGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYmVoYXZpb3JzIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gYmFzZWQgb24gdGhlIGNvbnN1bWVyLXN1cHBsaWVkIHtAbGluayBOdXh0Q2xvdWRGcm9udEJlaGF2aW9yfSBsaXN0LlxuICAgICAqIEVhY2ggYmVoYXZpb3IgY2FuIG92ZXJyaWRlIHRoZSBjYWNoZSBwb2xpY3ksIGF0dGFjaCBhIENsb3VkRnJvbnQgRnVuY3Rpb24sIG9yIGJvdGguXG4gICAgICpcbiAgICAgKiBXaGVuIHtAbGluayBOdXh0Q2xvdWRGcm9udEJlaGF2aW9yLmZuQ29kZX0gaXMgcHJvdmlkZWQsIHRoaXMgbWV0aG9kIGNyZWF0ZXMgdGhlIGBjbG91ZGZyb250LkZ1bmN0aW9uYFxuICAgICAqIHJlc291cmNlIGluc2lkZSB0aGUgc3RhY2sgaXRzZWxmIHNvIHRoYXQgaXQgaXMgYWx3YXlzIGNvcnJlY3RseSBzY29wZWQuXG4gICAgICpcbiAgICAgKiBUaGUgcHJvdmlkZWQge0BsaW5rIE51eHRDbG91ZEZyb250QmVoYXZpb3IuY2FjaGVQb2xpY3l9IGlzIHVzZWQgd2hlbiBzcGVjaWZpZWQ7IG90aGVyd2lzZSB0aGVcbiAgICAgKiBkZWZhdWx0IE51eHQgYXBwIGNhY2hlIHBvbGljeSAoe0BsaW5rIGFwcENhY2hlUG9saWN5fSkgaXMgdXNlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUFkZGl0aW9uYWxCZWhhdmlvcnMoYmVoYXZpb3JzOiBOdXh0Q2xvdWRGcm9udEJlaGF2aW9yW10pOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7fTtcblxuICAgICAgICBiZWhhdmlvcnMuZm9yRWFjaCgoYmVoYXZpb3IsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBsZXQgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IEZ1bmN0aW9uQXNzb2NpYXRpb25bXSA9IFtdO1xuXG4gICAgICAgICAgICBpZiAoYmVoYXZpb3IuZm5Db2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBDbG91ZEZyb250IEZ1bmN0aW9uIGluc2lkZSB0aGUgc3RhY2sgc28gaXQgaXMgYWx3YXlzIGNvcnJlY3RseSBzY29wZWQuXG4gICAgICAgICAgICAgICAgY29uc3QgY2ZGdW5jdGlvbiA9IG5ldyBDbG91ZEZyb250RnVuY3Rpb24odGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1iZWhhdmlvci1mbi0ke2luZGV4fWAsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogYmVoYXZpb3IuZm5Db2RlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXNzb2NpYXRpb25zID0gW3tcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb246IGNmRnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogYmVoYXZpb3IuZXZlbnRUeXBlID8/IEZ1bmN0aW9uRXZlbnRUeXBlLlZJRVdFUl9SRVFVRVNULFxuICAgICAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBydWxlc1tiZWhhdmlvci5wYXRoUGF0dGVybl0gPSB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5udXh0U2VydmVyUm91dGVCZWhhdmlvcixcbiAgICAgICAgICAgICAgICBjYWNoZVBvbGljeTogYmVoYXZpb3IuY2FjaGVQb2xpY3kgPz8gdGhpcy5hcHBDYWNoZVBvbGljeSxcbiAgICAgICAgICAgICAgICAuLi4oZnVuY3Rpb25Bc3NvY2lhdGlvbnMubGVuZ3RoID4gMCA/IHtmdW5jdGlvbkFzc29jaWF0aW9uc30gOiB7fSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcnVsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgbWF0Y2hpbmcgaW5jb21pbmcgcmVxdWVzdHMgZm9yIHRoZSBzdGF0aWMgYXNzZXRzXG4gICAgICogdG8gdGhlIFMzIGJ1Y2tldCB0aGF0IGhvbGRzIHRoZXNlIHN0YXRpYyBhc3NldHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU3RhdGljQXNzZXRzUm91dGVCZWhhdmlvcigpOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgY29uc3Qgc3RhdGljQXNzZXRzQ2FjaGVDb25maWc6IEJlaGF2aW9yT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG9yaWdpbjogUzNCdWNrZXRPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LCB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbkF0dGVtcHRzOiAyLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMpLFxuICAgICAgICAgICAgICAgIG9yaWdpbkFjY2Vzc0lkZW50aXR5OiB0aGlzLmNkbkFjY2Vzc0lkZW50aXR5LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICAgICAgY2FjaGVQb2xpY3k6IENhY2hlUG9saWN5LkNBQ0hJTkdfT1BUSU1JWkVELFxuICAgICAgICAgICAgdmlld2VyUHJvdG9jb2xQb2xpY3k6IFZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJ1bGVzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge307XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRDb25maWdzLmZvckVhY2goYXNzZXQgPT4ge1xuICAgICAgICAgICAgcnVsZXNbYCR7YXNzZXQudGFyZ2V0fSR7YXNzZXQucGF0dGVybn1gXSA9IHN0YXRpY0Fzc2V0c0NhY2hlQ29uZmlnXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHJ1bGVzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGJlaGF2aW9yIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgbWF0Y2hpbmcgaW5jb21pbmcgcmVxdWVzdHMgZm9yIHRoZSBzaXRlbWFwIGFzc2V0c1xuICAgICAqIHRvIHRoZSBTMyBidWNrZXQgdGhhdCBob2xkcyB0aGVzZSBzaXRlbWFwIGFzc2V0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTaXRlbWFwUm91dGVCZWhhdmlvcigpOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgaWYgKCF0aGlzLnNpdGVtYXBCdWNrZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNpdGVtYXAgYnVja2V0IG11c3QgZXhpc3QgYmVmb3JlIGNyZWF0aW5nIHNpdGVtYXAgcm91dGUgYmVoYXZpb3IuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2l0ZW1hcENhY2hlQ29uZmlnOiBCZWhhdmlvck9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcmlnaW46IFMzQnVja2V0T3JpZ2luLndpdGhPcmlnaW5BY2Nlc3NJZGVudGl0eSh0aGlzLnNpdGVtYXBCdWNrZXQsIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uQXR0ZW1wdHM6IDIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMyksXG4gICAgICAgICAgICAgICAgb3JpZ2luQWNjZXNzSWRlbnRpdHk6IHRoaXMuY2RuQWNjZXNzSWRlbnRpdHksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogQ2FjaGVQb2xpY3kuQ0FDSElOR19PUFRJTUlaRUQsXG4gICAgICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFNcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBydWxlczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuICAgICAgICBydWxlc1snKnNpdGVtYXAueG1sJ10gPSBzaXRlbWFwQ2FjaGVDb25maWc7XG4gICAgICAgIHJ1bGVzWycqc2l0ZW1hcC1nb25lLnhtbCddID0gc2l0ZW1hcENhY2hlQ29uZmlnO1xuICAgICAgICBydWxlc1snL3NpdGVtYXBzLyonXSA9IHNpdGVtYXBDYWNoZUNvbmZpZztcblxuICAgICAgICByZXR1cm4gcnVsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBsb2FkcyB0aGUgc3RhdGljIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAgYXMgZGVmaW5lZCBpbiB7QHNlZSBnZXROdXh0QXBwU3RhdGljQXNzZXRDb25maWdzfSB0byB0aGUgc3RhdGljIGFzc2V0cyBTMyBidWNrZXQuXG4gICAgICogSW4gb3JkZXIgdG8gZW5hYmxlIGEgemVyby1kb3dudGltZSBkZXBsb3ltZW50IHdpdGggbWluaW1hbCBzdG9yYWdlIGxvYWQsXG4gICAgICogd2UgZGVwbG95IHRoZSBzdGF0aWMgYXNzZXRzIG9mIGV2ZXJ5IGRlcGxveW1lbnQgaW50byB0aGUgc2FtZSBmb2xkZXIgYnV0IG1hcmsgdGhlbSB3aXRoIGEgZGVwbG95bWVudCByZXZpc2lvbi5cbiAgICAgKiBCeSBkb2luZyBzbywgdGhlIGZpbGVzIG9mIHByZXZpb3VzIGRlcGxveW1lbnRzIGFyZSByZXRhaW5lZCB0byBhbGxvdyBjbGllbnRzIHRvIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBhbiBvbGRlciByZXZpc2lvblxuICAgICAqIGJ1dCBnZXRzIGNsZWFuZWQgdXAgYWZ0ZXIgYSBzcGVjaWZpZWQgcGVyaW9kIG9mIHRpbWUgdmlhIHRoZSBjbGVhbnVwIExhbWJkYSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbmZpZ3VyZURlcGxveW1lbnRzKCk6IEJ1Y2tldERlcGxveW1lbnRbXSB7XG4gICAgICAgIGNvbnN0IGxvZ0dyb3VwID0gbmV3IExvZ0dyb3VwKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXNzZXRzLWRlcGxveW1lbnQtbG9nc2AsIHtcbiAgICAgICAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hc3NldHMtZGVwbG95bWVudGAsXG4gICAgICAgICAgICByZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX0RBWSxcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmV0dXJucyBhIGRlcGxveW1lbnQgZm9yIGV2ZXJ5IGNvbmZpZ3VyZWQgc3RhdGljIGFzc2V0IHR5cGUgdG8gcmVzcGVjdCB0aGUgZGlmZmVyZW50IGNhY2hlIHNldHRpbmdzXG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRpY0Fzc2V0Q29uZmlncy5maWx0ZXIoYXNzZXQgPT4gZXhpc3RzU3luYyhhc3NldC5zb3VyY2UpKS5tYXAoKGFzc2V0LCBhc3NldEluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJ1Y2tldERlcGxveW1lbnQodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hc3NldHMtZGVwbG95bWVudC0ke2Fzc2V0SW5kZXh9YCwge1xuICAgICAgICAgICAgICAgIHNvdXJjZXM6IFtTb3VyY2UuYXNzZXQoYXNzZXQuc291cmNlLCB7XG4gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGU6IGFzc2V0LmV4Y2x1ZGUsXG4gICAgICAgICAgICAgICAgfSldLFxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQnVja2V0OiB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldCxcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogYXNzZXQudGFyZ2V0LnJlcGxhY2UoL15cXC8rL2csICcnKSwgLy8gUmVtb3ZlIGxlYWRpbmcgc2xhc2hcbiAgICAgICAgICAgICAgICBwcnVuZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc3RvcmFnZUNsYXNzOiBTdG9yYWdlQ2xhc3MuU1RBTkRBUkQsXG4gICAgICAgICAgICAgICAgZXhjbHVkZTogWycqJ10sXG4gICAgICAgICAgICAgICAgaW5jbHVkZTogW2Fzc2V0LnBhdHRlcm5dLFxuICAgICAgICAgICAgICAgIGNhY2hlQ29udHJvbDogYXNzZXQuY2FjaGVDb250cm9sLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBhc3NldC5jb250ZW50VHlwZSxcbiAgICAgICAgICAgICAgICBkaXN0cmlidXRpb246IGFzc2V0LmludmFsaWRhdGVPbkNoYW5nZSA/IHRoaXMuY2RuIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvblBhdGhzOiBhc3NldC5pbnZhbGlkYXRlT25DaGFuZ2UgPyBbYC8ke2Fzc2V0LnBhdHRlcm59YF0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbG9nR3JvdXA6IGxvZ0dyb3VwLFxuXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgYnVpbGQgcmV2aXNpb24gb24gZXZlcnkgYXNzZXQgdG8gYWxsb3cgY2xlYW51cCBvZiBvdXRkYXRlZCBhc3NldHNcbiAgICAgICAgICAgICAgICAgICAgcmV2aXNpb246IHRoaXMuZGVwbG95bWVudFJldmlzaW9uLFxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAvLyBTb21lIE51eHQgYXBwbGljYXRpb25zIGhhdmUgYSBsb3Qgb2YgYXNzZXRzIHRvIGRlcGxveSB3aGVyZWJ5IHRoZSBmdW5jdGlvbiBtaWdodCBydW4gb3V0IG9mIG1lbW9yeS5cbiAgICAgICAgICAgICAgICAvLyBBZGRpdGlvbmFsbHksIGEgaGlnaCBtZW1vcnkgbGltaXQgbWlnaHQgc3BlZWQgdXAgZGVwbG95bWVudHMuXG4gICAgICAgICAgICAgICAgbWVtb3J5TGltaXQ6IDE3OTJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIHRoZSBob3N0ZWQgem9uZSBhdCB3aGljaCB0aGUgRE5TIHJlY29yZHMgc2hhbGwgYmUgY3JlYXRlZCB0byBhY2Nlc3MgdGhlIE51eHQgYXBwIG9uIHRoZSBpbnRlcm5ldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kSG9zdGVkWm9uZShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBJSG9zdGVkWm9uZSB7XG4gICAgICAgIGNvbnN0IGRvbWFpblBhcnRzID0gcHJvcHMuZG9tYWluLnNwbGl0KCcuJyk7XG5cbiAgICAgICAgcmV0dXJuIEhvc3RlZFpvbmUuZnJvbUhvc3RlZFpvbmVBdHRyaWJ1dGVzKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0taG9zdGVkLXpvbmVgLCB7XG4gICAgICAgICAgICBob3N0ZWRab25lSWQ6IHByb3BzLmhvc3RlZFpvbmVJZCxcbiAgICAgICAgICAgIHpvbmVOYW1lOiBkb21haW5QYXJ0c1tkb21haW5QYXJ0cy5sZW5ndGggLSAxXSwgLy8gU3VwcG9ydCBzdWJkb21haW5zXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIEROUyByZWNvcmRzIHRvIGFjY2VzcyB0aGUgTnV4dCBhcHAgb24gdGhlIGludGVybmV0IHZpYSB0aGUgY3VzdG9tIGRvbWFpbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wc1xuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVEbnNSZWNvcmRzKHByb3BzOiBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyk6IHZvaWQge1xuICAgICAgICBjb25zdCBob3N0ZWRab25lID0gdGhpcy5maW5kSG9zdGVkWm9uZShwcm9wcyk7XG4gICAgICAgIGNvbnN0IGRuc1RhcmdldCA9IFJlY29yZFRhcmdldC5mcm9tQWxpYXMobmV3IENsb3VkRnJvbnRUYXJnZXQodGhpcy5jZG4pKTtcblxuICAgICAgICAvLyBDcmVhdGUgYSByZWNvcmQgZm9yIElQdjRcbiAgICAgICAgbmV3IEFSZWNvcmQodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1pcHY0LXJlY29yZGAsIHtcbiAgICAgICAgICAgIHJlY29yZE5hbWU6IHByb3BzLmRvbWFpbixcbiAgICAgICAgICAgIHpvbmU6IGhvc3RlZFpvbmUsXG4gICAgICAgICAgICB0YXJnZXQ6IGRuc1RhcmdldCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgcmVjb3JkIGZvciBJUHY2XG4gICAgICAgIG5ldyBBYWFhUmVjb3JkKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0taXB2Ni1yZWNvcmRgLCB7XG4gICAgICAgICAgICByZWNvcmROYW1lOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICB6b25lOiBob3N0ZWRab25lLFxuICAgICAgICAgICAgdGFyZ2V0OiBkbnNUYXJnZXQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzY2hlZHVsZWQgcnVsZSB0byBwaW5nIHRoZSBOdXh0IGFwcCBMYW1iZGEgZnVuY3Rpb24gZXZlcnkgNSBtaW51dGVzIGluIG9yZGVyIHRvIGtlZXAgaXQgd2FybVxuICAgICAqIGFuZCBzcGVlZCB1cCBpbml0aWFsIFNTUiByZXF1ZXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBcHBQaW5nUnVsZShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZmFrZUFwaUdhdGV3YXlFdmVudERhdGEgPSB7XG4gICAgICAgICAgICBcInZlcnNpb25cIjogXCIyLjBcIixcbiAgICAgICAgICAgIFwicm91dGVLZXlcIjogXCJHRVQgL3twcm94eSt9XCIsXG4gICAgICAgICAgICBcInJhd1BhdGhcIjogXCIvXCIsXG4gICAgICAgICAgICBcInJhd1F1ZXJ5U3RyaW5nXCI6IFwiXCIsXG4gICAgICAgICAgICBcImhlYWRlcnNcIjoge30sXG4gICAgICAgICAgICBcInJlcXVlc3RDb250ZXh0XCI6IHtcbiAgICAgICAgICAgICAgICBcImRvbWFpbk5hbWVcIjogcHJvcHMuZG9tYWluLFxuICAgICAgICAgICAgICAgIFwiaHR0cFwiOiB7XG4gICAgICAgICAgICAgICAgICAgIFwibWV0aG9kXCI6IFwiR0VUXCIsXG4gICAgICAgICAgICAgICAgICAgIFwicGF0aFwiOiBcIi9cIixcbiAgICAgICAgICAgICAgICAgICAgXCJwcm90b2NvbFwiOiBcIkhUVFAvMS4xXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbmV3IFJ1bGUodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1waW5nZXItcnVsZWAsIHtcbiAgICAgICAgICAgIHJ1bGVOYW1lOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXBpbmdlcmAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYFBpbmdzIHRoZSBMYW1iZGEgZnVuY3Rpb24gb2YgdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBhcHAgZXZlcnkgNSBtaW51dGVzIHRvIGtlZXAgaXQgd2FybS5gLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIHNjaGVkdWxlOiBTY2hlZHVsZS5yYXRlKER1cmF0aW9uLm1pbnV0ZXMoNSkpLFxuICAgICAgICAgICAgdGFyZ2V0czogW25ldyBMYW1iZGFGdW5jdGlvbih0aGlzLmFwcExhbWJkYUZ1bmN0aW9uLCB7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IFJ1bGVUYXJnZXRJbnB1dC5mcm9tT2JqZWN0KGZha2VBcGlHYXRld2F5RXZlbnREYXRhKVxuICAgICAgICAgICAgfSldLFxuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzY2hlZHVsZWQgcnVsZSB0aGF0IHJ1bnMgZXZlcnkgVHVlc2RheSBhdCAwMzozMCBBTSBHTVQgdG8gdHJpZ2dlclxuICAgICAqIG91ciBjbGVhbnVwIExhbWJkYSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVDbGVhbnVwVHJpZ2dlclJ1bGUoKTogdm9pZCB7XG4gICAgICAgIG5ldyBSdWxlKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tc2NoZWR1bGVyLXJ1bGVgLCB7XG4gICAgICAgICAgICBydWxlTmFtZTogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1zY2hlZHVsZXJgLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBUcmlnZ2VycyBhIGNsZWFudXAgb2YgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgYXQgdGhlICR7dGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZX0gUzMgYnVja2V0LmAsXG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLmNyb24oe3dlZWtEYXk6ICcyJywgaG91cjogJzMnLCBtaW51dGU6ICczMCd9KSxcbiAgICAgICAgICAgIHRhcmdldHM6IFtuZXcgTGFtYmRhRnVuY3Rpb24odGhpcy5jbGVhbnVwTGFtYmRhRnVuY3Rpb24pXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIFMzIGJ1Y2tldCB0byBzdG9yZSB0aGUgYWNjZXNzIGxvZ3Mgb2YgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQWNjZXNzTG9nc0J1Y2tldCgpOiBCdWNrZXQge1xuICAgICAgICBjb25zdCBidWNrZXROYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hY2Nlc3MtbG9nc2A7XG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQodGhpcywgYnVja2V0TmFtZSwge1xuICAgICAgICAgICAgYnVja2V0TmFtZSxcbiAgICAgICAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBCbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICAgICAgICBvYmplY3RPd25lcnNoaXA6IE9iamVjdE93bmVyc2hpcC5CVUNLRVRfT1dORVJfUFJFRkVSUkVELFxuICAgICAgICAgICAgLy8gV2hlbiB0aGUgc3RhY2sgaXMgZGVzdHJveWVkLCB3ZSBleHBlY3QgZXZlcnl0aGluZyB0byBiZSBkZWxldGVkXG4gICAgICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMuY2RuQWNjZXNzSWRlbnRpdHkpO1xuXG4gICAgICAgIHJldHVybiBidWNrZXQ7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGNyZWF0ZUFjY2Vzc0xvZ3NBbmFseXNpcyhwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjY2Vzc0xvZ3NCdWNrZXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWNjZXNzIGJ1Y2tldCBub3Qgc2V0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IENsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXMgfSA9IHJlcXVpcmUoJy4uL2FjY2Vzcy1sb2dzLWFuYWx5c2lzL0Nsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXMnKTtcblxuICAgICAgICBuZXcgQ2xvdWRGcm9udEFjY2Vzc0xvZ3NBbmFseXNpcyh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFjY2Vzcy1sb2dzLWFuYWx5c2lzYCwge1xuICAgICAgICAgICAgYnVja2V0OiB0aGlzLmFjY2Vzc0xvZ3NCdWNrZXQsXG4gICAgICAgICAgICByZXNvdXJjZVByZWZpeDogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hY2Nlc3MtbG9nc2AsXG4gICAgICAgICAgICBhY2Nlc3NMb2dDb29raWVzOiBwcm9wcy5hY2Nlc3NMb2dDb29raWVzLFxuICAgICAgICAgICAgYW5vbnltaXplQ2xpZW50SXA6IHByb3BzLmFub255bWl6ZUFjY2Vzc0xvZ0NsaWVudElwID8/IHRydWUsXG4gICAgICAgICAgICBleHBpcmVSYXdMb2dzQWZ0ZXI6IHByb3BzLmFjY2Vzc0xvZ3NSYXdSZXRlbnRpb24sXG4gICAgICAgICAgICBleHBpcmVJbnRlcm1lZGlhdGVMb2dzQWZ0ZXI6IHByb3BzLmFjY2Vzc0xvZ3NJbnRlcm1lZGlhdGVSZXRlbnRpb24sXG4gICAgICAgICAgICBleHBpcmVUcmFuc2Zvcm1lZExvZ3NBZnRlcjogcHJvcHMuYWNjZXNzTG9nc1RyYW5zZm9ybWVkUmV0ZW50aW9uLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
657
+ /**
658
+ * The static asset pattern whose post-Lambda {@link BucketDeployment} acts as the carrier for
659
+ * consumer-supplied CloudFront invalidations (via {@link NuxtServerAppStackProps.invalidatePathsOnDeploy}).
660
+ *
661
+ * We attach {@link BucketDeployment.distributionPaths} to this specific deployment so that:
662
+ * - CDK reuses its built-in CloudFront invalidation mechanism (no new construct types),
663
+ * - the invalidation fires AFTER the new Lambda and hashed assets are in place, since this
664
+ * deployment is already part of the post-Lambda deployment phase in {@link configureDeployments},
665
+ * - the files managed by {@link StaticAssetConfig} entries themselves are never invalidated
666
+ * (they are either build-hashed immutable assets or served with `s-maxage=0, must-revalidate`).
667
+ */
668
+ NuxtServerAppStack.CONSUMER_INVALIDATION_CARRIER_PATTERN = '_nuxt/builds/latest.json';
669
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dFNlcnZlckFwcFN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiTnV4dFNlcnZlckFwcFN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUEyRDtBQUUzRCwrRUFBK0Q7QUFDL0QsK0RBaUJvQztBQUNwQyx1REFBc0Y7QUFDdEYsK0NBTTRCO0FBQzVCLHlEQUF3RztBQUN4RyxxRUFBcUY7QUFDckYsK0VBQThFO0FBQzlFLHlFQUFpRTtBQUNqRSxtREFBK0Q7QUFDL0QsZ0VBQTRGO0FBQzVGLHVEQUF1RTtBQUN2RSx1RUFBOEQ7QUFDOUQsNkJBQTZCO0FBQzdCLDJCQUF3RDtBQUd4RCw2RkFBZ0Y7QUFDaEYsbUVBQTJHO0FBRTNHOztHQUVHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxtQkFBSztJQXFIekMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE4Qjs7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDYixHQUFHLEtBQUs7WUFFUix1RUFBdUU7WUFDdkUscUJBQXFCLEVBQUUsS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksQ0FBQSxNQUFBLEtBQUssQ0FBQyxHQUFHLDBDQUFFLE1BQU0sTUFBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLHFCQUFxQjtTQUNqSSxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRWpGLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7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LEVBQUUsMkJBQWEsQ0FBQyxPQUFPO1lBQ3BDLGlCQUFpQixFQUFFLElBQUk7U0FDMUIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUU5QyxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBR08sd0JBQXdCLENBQUMsS0FBOEI7O1FBQzNELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVELE1BQU0sRUFBRSw0QkFBNEIsRUFBRSxHQUFHLE9BQU8sQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1FBRXpHLElBQUksNEJBQTRCLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQix1QkFBdUIsRUFBRTtZQUNwRixNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUM3QixjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLGNBQWM7WUFDdEQsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtZQUN4QyxpQkFBaUIsRUFBRSxNQUFBLEtBQUssQ0FBQywwQkFBMEIsbUNBQUksSUFBSTtZQUMzRCxrQkFBa0IsRUFBRSxLQUFLLENBQUMsc0JBQXNCO1lBQ2hELDJCQUEyQixFQUFFLEtBQUssQ0FBQywrQkFBK0I7WUFDbEUsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLDhCQUE4QjtTQUNuRSxDQUFDLENBQUM7SUFDUCxDQUFDOztBQWwwQkwsZ0RBbTBCQztBQWwwQkc7Ozs7Ozs7Ozs7R0FVRztBQUNxQix3REFBcUMsR0FBRywwQkFBMEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFN0YWNrfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQge0NvbnN0cnVjdH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge0NlcnRpZmljYXRlfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgICBBbGxvd2VkTWV0aG9kcyxcbiAgICB0eXBlIEJlaGF2aW9yT3B0aW9ucyxcbiAgICBDYWNoZUNvb2tpZUJlaGF2aW9yLFxuICAgIENhY2hlZE1ldGhvZHMsXG4gICAgQ2FjaGVIZWFkZXJCZWhhdmlvcixcbiAgICBDYWNoZVBvbGljeSxcbiAgICBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IsXG4gICAgRGlzdHJpYnV0aW9uLCBIdHRwVmVyc2lvbixcbiAgICB0eXBlIElPcmlnaW5BY2Nlc3NJZGVudGl0eSxcbiAgICBPcmlnaW5BY2Nlc3NJZGVudGl0eSxcbiAgICBPcmlnaW5Qcm90b2NvbFBvbGljeSwgT3JpZ2luUmVxdWVzdFBvbGljeSxcbiAgICBQcmljZUNsYXNzLFxuICAgIFNlY3VyaXR5UG9saWN5UHJvdG9jb2wsXG4gICAgVmlld2VyUHJvdG9jb2xQb2xpY3ksIE9yaWdpblJlcXVlc3RDb29raWVCZWhhdmlvciwgT3JpZ2luUmVxdWVzdEhlYWRlckJlaGF2aW9yLCBPcmlnaW5SZXF1ZXN0UXVlcnlTdHJpbmdCZWhhdmlvcixcbiAgICBGdW5jdGlvbkV2ZW50VHlwZSwgdHlwZSBGdW5jdGlvbkFzc29jaWF0aW9uLFxuICAgIEZ1bmN0aW9uIGFzIENsb3VkRnJvbnRGdW5jdGlvbixcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCI7XG5pbXBvcnQge0FyY2hpdGVjdHVyZSwgQ29kZSwgRnVuY3Rpb24sIFJ1bnRpbWUsIFRyYWNpbmd9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQge1xuICAgIEJsb2NrUHVibGljQWNjZXNzLFxuICAgIEJ1Y2tldCxcbiAgICBCdWNrZXRBY2Nlc3NDb250cm9sLFxuICAgIEJ1Y2tldEVuY3J5cHRpb24sXG4gICAgT2JqZWN0T3duZXJzaGlwXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7QWFhYVJlY29yZCwgQVJlY29yZCwgSG9zdGVkWm9uZSwgdHlwZSBJSG9zdGVkWm9uZSwgUmVjb3JkVGFyZ2V0fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCB7QnVja2V0RGVwbG95bWVudCwgU291cmNlLCBTdG9yYWdlQ2xhc3N9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHtIdHRwT3JpZ2luLCBTM0J1Y2tldE9yaWdpbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnNcIjtcbmltcG9ydCB7Q2xvdWRGcm9udFRhcmdldH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIjtcbmltcG9ydCB7IExvZ0dyb3VwLCBSZXRlbnRpb25EYXlzIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQge2dldE51eHRBcHBTdGF0aWNBc3NldENvbmZpZ3MsIHR5cGUgU3RhdGljQXNzZXRDb25maWd9IGZyb20gXCIuLi9OdXh0QXBwU3RhdGljQXNzZXRzXCI7XG5pbXBvcnQge1J1bGUsIFJ1bGVUYXJnZXRJbnB1dCwgU2NoZWR1bGV9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzXCI7XG5pbXBvcnQge0xhbWJkYUZ1bmN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQge3dyaXRlRmlsZVN5bmMsIG1rZGlyU3luYywgZXhpc3RzU3luY30gZnJvbSBcImZzXCI7XG5pbXBvcnQge3R5cGUgTnV4dFNlcnZlckFwcFN0YWNrUHJvcHN9IGZyb20gXCIuL051eHRTZXJ2ZXJBcHBTdGFja1Byb3BzXCI7XG5pbXBvcnQge3R5cGUgTnV4dENsb3VkRnJvbnRCZWhhdmlvcn0gZnJvbSBcIi4vTnV4dFNlcnZlckFwcFN0YWNrUHJvcHNcIjtcbmltcG9ydCB7SHR0cExhbWJkYUludGVncmF0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2Mi1pbnRlZ3JhdGlvbnNcIjtcbmltcG9ydCB7RG9tYWluTmFtZSwgRW5kcG9pbnRUeXBlLCBIdHRwQXBpLCBIdHRwTWV0aG9kLCBTZWN1cml0eVBvbGljeX0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5djJcIjtcblxuLyoqXG4gKiBDREsgc3RhY2sgdG8gZGVwbG95IGEgZHluYW1pYyBOdXh0IGFwcCAodGFyZ2V0PXNlcnZlcikgb24gQVdTIHdpdGggTGFtYmRhLCBBcGlHYXRld2F5LCBTMyBhbmQgQ2xvdWRGcm9udC5cbiAqL1xuZXhwb3J0IGNsYXNzIE51eHRTZXJ2ZXJBcHBTdGFjayBleHRlbmRzIFN0YWNrIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdGljIGFzc2V0IHBhdHRlcm4gd2hvc2UgcG9zdC1MYW1iZGEge0BsaW5rIEJ1Y2tldERlcGxveW1lbnR9IGFjdHMgYXMgdGhlIGNhcnJpZXIgZm9yXG4gICAgICogY29uc3VtZXItc3VwcGxpZWQgQ2xvdWRGcm9udCBpbnZhbGlkYXRpb25zICh2aWEge0BsaW5rIE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzLmludmFsaWRhdGVQYXRoc09uRGVwbG95fSkuXG4gICAgICpcbiAgICAgKiBXZSBhdHRhY2gge0BsaW5rIEJ1Y2tldERlcGxveW1lbnQuZGlzdHJpYnV0aW9uUGF0aHN9IHRvIHRoaXMgc3BlY2lmaWMgZGVwbG95bWVudCBzbyB0aGF0OlxuICAgICAqICAgLSBDREsgcmV1c2VzIGl0cyBidWlsdC1pbiBDbG91ZEZyb250IGludmFsaWRhdGlvbiBtZWNoYW5pc20gKG5vIG5ldyBjb25zdHJ1Y3QgdHlwZXMpLFxuICAgICAqICAgLSB0aGUgaW52YWxpZGF0aW9uIGZpcmVzIEFGVEVSIHRoZSBuZXcgTGFtYmRhIGFuZCBoYXNoZWQgYXNzZXRzIGFyZSBpbiBwbGFjZSwgc2luY2UgdGhpc1xuICAgICAqICAgICBkZXBsb3ltZW50IGlzIGFscmVhZHkgcGFydCBvZiB0aGUgcG9zdC1MYW1iZGEgZGVwbG95bWVudCBwaGFzZSBpbiB7QGxpbmsgY29uZmlndXJlRGVwbG95bWVudHN9LFxuICAgICAqICAgLSB0aGUgZmlsZXMgbWFuYWdlZCBieSB7QGxpbmsgU3RhdGljQXNzZXRDb25maWd9IGVudHJpZXMgdGhlbXNlbHZlcyBhcmUgbmV2ZXIgaW52YWxpZGF0ZWRcbiAgICAgKiAgICAgKHRoZXkgYXJlIGVpdGhlciBidWlsZC1oYXNoZWQgaW1tdXRhYmxlIGFzc2V0cyBvciBzZXJ2ZWQgd2l0aCBgcy1tYXhhZ2U9MCwgbXVzdC1yZXZhbGlkYXRlYCkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ09OU1VNRVJfSU5WQUxJREFUSU9OX0NBUlJJRVJfUEFUVEVSTiA9ICdfbnV4dC9idWlsZHMvbGF0ZXN0Lmpzb24nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgcHJlZml4IG9mIHRoZSByZXNvdXJjZXMgY3JlYXRlZCBieSB0aGUgc3RhY2suXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzb3VyY2VJZFByZWZpeDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IGRlcGxveW1lbnQgdGhhdCBpcyB1c2VkIHRvIHRhZyB0aGUgc3RhdGljIGFzc2V0cyBvZiB0aGUgZGVwbG95bWVudFxuICAgICAqIHRvIGxhdGVyIGJlIGFibGUgdG8gY2xlYW4gdXAgb3V0ZGF0ZWQgYXNzZXRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlcGxveW1lbnRSZXZpc2lvbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBDbG91ZEZyb250IHBhdGhzIHRvIGludmFsaWRhdGUgYWZ0ZXIgYSBkZXBsb3ltZW50LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlcGxveUludmFsaWRhdGlvblBhdGhzOiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGl0eSB0byB1c2UgZm9yIGFjY2Vzc2luZyB0aGUgZGVwbG95bWVudCBhc3NldHMgb24gUzMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RuQWNjZXNzSWRlbnRpdHk6IElPcmlnaW5BY2Nlc3NJZGVudGl0eTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBTMyBidWNrZXQgd2hlcmUgdGhlIGRlcGxveW1lbnQgYXNzZXRzIGdldHMgc3RvcmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWNBc3NldHNCdWNrZXQ6IEJ1Y2tldDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBTMyBidWNrZXQgd2hlcmUgdGhlIGFjY2VzcyBsb2dzIG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiBnZXRzIHN0b3JlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWNjZXNzTG9nc0J1Y2tldDogQnVja2V0fHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBTMyBidWNrZXQgd2hlcmUgdGhlIHNpdGVtYXAgYXNzZXRzIGdldHMgc3RvcmVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBzaXRlbWFwQnVja2V0OiBCdWNrZXR8dW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogVGhlIExhbWJkYSBmdW5jdGlvbiB0byByZW5kZXIgdGhlIE51eHQgYXBwIG9uIHRoZSBzZXJ2ZXIgc2lkZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcHBMYW1iZGFGdW5jdGlvbjogRnVuY3Rpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgY2xlYW51cHMgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsZWFudXBMYW1iZGFGdW5jdGlvbjogRnVuY3Rpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgQVBJIGdhdGV3YXkgdG8gbWFrZSB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRvIHJlbmRlciB0aGUgTnV4dCBhcHAgcHVibGljbHkgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGFwaUdhdGV3YXk6IEh0dHBBcGk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29uZmlncyBmb3IgdGhlIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwIHRoYXQgc2hhbGwgYmUgcHVibGljbHkgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpY0Fzc2V0Q29uZmlnczogU3RhdGljQXNzZXRDb25maWdbXTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiBvcmlnaW4gZm9yIHRoZSBBUEkgZ2F0ZXdheSB0byByb3V0ZSBpbmNvbWluZyByZXF1ZXN0cyB0byB0aGUgTnV4dCBMYW1iZGEgZnVuY3Rpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBodHRwT3JpZ2luOiBIdHRwT3JpZ2luO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGNhY2hlIHBvbGljeSB0aGF0IHNwZWNpZmllcyB3aGljaCBIVFRQIGhlYWRlcnMsIGNvb2tpZXMsIGFuZCBxdWVyeSBzdHJpbmdzXG4gICAgICogQ2xvdWRGcm9udCBmb3J3YXJkcyB0byB0aGUgTnV4dCBhcHAgYW5kIHVzZXMgdG8gZ2VuZXJhdGUgYSBjYWNoZSBrZXkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhcHBDYWNoZVBvbGljeTogQ2FjaGVQb2xpY3k7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luIHJlcXVlc3QgcG9saWN5IHRoYXQgc3BlY2lmaWVzIHdoaWNoIEhUVFAgaGVhZGVycywgY29va2llcywgYW5kIHF1ZXJ5IHN0cmluZ3NcbiAgICAgKiBDbG91ZEZyb250IGZvcndhcmRzIHRvIHRoZSBOdXh0IGFwcCB3aXRob3V0IGFmZmVjdGluZyB0aGUgY2FjaGUga2V5LlxuICAgICAqL1xuICAgIHByaXZhdGUgYXBwUmVxdWVzdFBvbGljeTogT3JpZ2luUmVxdWVzdFBvbGljeSB8IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIGluY29taW5nIHdlYiByZXF1ZXN0c1xuICAgICAqIHRvIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbiAodmlhIEFQSSBnYXRld2F5KS5cbiAgICAgKi9cbiAgICBwcml2YXRlIG51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yOiBCZWhhdmlvck9wdGlvbnM7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uICh2aWEgdGhlIEFQSSBnYXRld2F5KVxuICAgICAqIG9yIHRoZSBTMyBhc3NldHMgZm9sZGVyICh3aXRoIGNhY2hpbmcpLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkbjogRGlzdHJpYnV0aW9uO1xuXG4gICAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKSB7XG4gICAgICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgICAgICAgLi4ucHJvcHMsXG5cbiAgICAgICAgICAgIC8vIEZvcmNlIGNyb3NzLXJlZ2lvbiByZWZlcmVuY2VzIGlmIGEgV0FGIEFDTCBpcyB1c2VkIG91dHNpZGUgdXMtZWFzdC0xXG4gICAgICAgICAgICBjcm9zc1JlZ2lvblJlZmVyZW5jZXM6IHByb3BzLndlYkFjbEFybiAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmVudj8ucmVnaW9uICE9PSAndXMtZWFzdC0xJyA/IHRydWUgOiBwcm9wcy5jcm9zc1JlZ2lvblJlZmVyZW5jZXMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVzb3VyY2VJZFByZWZpeCA9IGAke3Byb3BzLnByb2plY3R9LSR7cHJvcHMuc2VydmljZX0tJHtwcm9wcy5lbnZpcm9ubWVudH1gO1xuXG4gICAgICAgIC8vIE51eHQgYXBwIHJlc291cmNlc1xuICAgICAgICB0aGlzLmRlcGxveW1lbnRSZXZpc2lvbiA9IHRoaXMuY3JlYXRlRGVwbG95bWVudFJldmlzaW9uKHByb3BzKTtcbiAgICAgICAgdGhpcy5kZXBsb3lJbnZhbGlkYXRpb25QYXRocyA9IHRoaXMubm9ybWFsaXplSW52YWxpZGF0aW9uUGF0aHMocHJvcHMuaW52YWxpZGF0ZVBhdGhzT25EZXBsb3kpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0Q29uZmlncyA9IGdldE51eHRBcHBTdGF0aWNBc3NldENvbmZpZ3MocHJvcHMucm9vdERpciA/PyAnLicpO1xuICAgICAgICB0aGlzLmNkbkFjY2Vzc0lkZW50aXR5ID0gdGhpcy5jcmVhdGVDZG5BY2Nlc3NJZGVudGl0eSgpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldCA9IHRoaXMuY3JlYXRlU3RhdGljQXNzZXRzQnVja2V0KCk7XG5cbiAgICAgICAgaWYgKHByb3BzLmVuYWJsZUFjY2Vzc0xvZ3NBbmFseXNpcykge1xuICAgICAgICAgICAgdGhpcy5hY2Nlc3NMb2dzQnVja2V0ID0gdGhpcy5jcmVhdGVBY2Nlc3NMb2dzQnVja2V0KCk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFjY2Vzc0xvZ3NBbmFseXNpcyhwcm9wcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlU2l0ZW1hcCkge1xuICAgICAgICAgICAgdGhpcy5zaXRlbWFwQnVja2V0ID0gdGhpcy5jcmVhdGVTaXRlbWFwQnVja2V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcExhbWJkYUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVBcHBMYW1iZGFGdW5jdGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuYXBpR2F0ZXdheSA9IHRoaXMuY3JlYXRlQXBpR2F0ZXdheShwcm9wcyk7XG4gICAgICAgIHRoaXMuaHR0cE9yaWdpbiA9IHRoaXMuY3JlYXRlTnV4dEFwcEh0dHBPcmlnaW4oKTtcbiAgICAgICAgdGhpcy5hcHBDYWNoZVBvbGljeSA9IHRoaXMuY3JlYXRlTnV4dEFwcENhY2hlUG9saWN5KHByb3BzKVxuICAgICAgICB0aGlzLmFwcFJlcXVlc3RQb2xpY3kgPSB0aGlzLmNyZWF0ZU51eHRBcHBSZXF1ZXN0UG9saWN5KHByb3BzKVxuICAgICAgICB0aGlzLm51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yID0gdGhpcy5jcmVhdGVOdXh0U2VydmVyUm91dGVCZWhhdmlvcigpXG5cbiAgICAgICAgdGhpcy5jZG4gPSB0aGlzLmNyZWF0ZUNsb3VkRnJvbnREaXN0cmlidXRpb24ocHJvcHMpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZURlcGxveW1lbnRzKCk7XG4gICAgICAgIHRoaXMuY3JlYXRlRG5zUmVjb3Jkcyhwcm9wcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlQXBwUGluZ1J1bGUocHJvcHMpO1xuXG4gICAgICAgIC8vIFN0YXRpYyBhc3NldHMgY2xlYW51cCByZXNvdXJjZXNcbiAgICAgICAgdGhpcy5jbGVhbnVwTGFtYmRhRnVuY3Rpb24gPSB0aGlzLmNyZWF0ZUNsZWFudXBMYW1iZGFGdW5jdGlvbihwcm9wcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2xlYW51cFRyaWdnZXJSdWxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgY3VycmVudCBkZXBsb3ltZW50IHJldmlzaW9uIGZpbGUgaW4gdGhlIHB1YmxpYyBmb2xkZXIgb2YgdGhlIE51eHQgYXBwIHRvIGJlIGFjY2Vzc2libGVcbiAgICAgKiBhbmQgcmV0dXJucyB0aGUgY3VycmVudCByZXZpc2lvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURlcGxveW1lbnRSZXZpc2lvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBhcHBSZXZpc2lvbiA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblxuICAgICAgICBjb25zdCBkaXIgPSBwYXRoLmpvaW4ocHJvcHMucm9vdERpciA/PyAnLicsICcub3V0cHV0JywgJ3B1YmxpYycpO1xuICAgICAgICBta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgd3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oZGlyLCAnYXBwLXJldmlzaW9uJyksIGFwcFJldmlzaW9uLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICAgIHJldHVybiBhcHBSZXZpc2lvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBpZGVudGl0eSB0byBhY2Nlc3MgdGhlIFMzIGRlcGxveW1lbnQgYXNzZXQgZmlsZXMgdmlhIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVDZG5BY2Nlc3NJZGVudGl0eSgpOiBJT3JpZ2luQWNjZXNzSWRlbnRpdHkge1xuICAgICAgICBjb25zdCBvcmlnaW5BY2Nlc3NJZGVudGl0eU5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNkbi1zMy1hY2Nlc3NgO1xuICAgICAgICByZXR1cm4gbmV3IE9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMsIG9yaWdpbkFjY2Vzc0lkZW50aXR5TmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgYnVja2V0IHRvIHN0b3JlIHRoZSBzdGF0aWMgZGVwbG95bWVudCBhc3NldCBmaWxlcyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU3RhdGljQXNzZXRzQnVja2V0KCk6IEJ1Y2tldCB7XG4gICAgICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFzc2V0c2A7XG4gICAgICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQodGhpcywgYnVja2V0TmFtZSwge1xuICAgICAgICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IEJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgICAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAvLyBUaGUgYnVja2V0IGFuZCBhbGwgb2YgaXRzIG9iamVjdHMgY2FuIGJlIGRlbGV0ZWQsIGJlY2F1c2UgYWxsIHRoZSBjb250ZW50IGlzIG1hbmFnZWQgaW4gdGhpcyBwcm9qZWN0XG4gICAgICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgICAgICAgIG9iamVjdE93bmVyc2hpcDogT2JqZWN0T3duZXJzaGlwLkJVQ0tFVF9PV05FUl9FTkZPUkNFRCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMuY2RuQWNjZXNzSWRlbnRpdHkpO1xuXG4gICAgICAgIHJldHVybiBidWNrZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgYnVja2V0IHRvIHN0b3JlIHRoZSBzaXRlbWFwIGFzc2V0cyBvZiB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU2l0ZW1hcEJ1Y2tldCgpOiBCdWNrZXQge1xuICAgICAgICBjb25zdCBidWNrZXROYW1lID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1zaXRlbWFwYDtcbiAgICAgICAgY29uc3QgYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCBidWNrZXROYW1lLCB7XG4gICAgICAgICAgICBidWNrZXROYW1lLFxuICAgICAgICAgICAgYWNjZXNzQ29udHJvbDogQnVja2V0QWNjZXNzQ29udHJvbC5QUklWQVRFLFxuICAgICAgICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IEJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgICAgICAgIGVuY3J5cHRpb246IEJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRCxcbiAgICAgICAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgICAgICAgICAvLyBUaGUgYnVja2V0IGFuZCBhbGwgb2YgaXRzIG9iamVjdHMgY2FuIGJlIGRlbGV0ZWQsIGJlY2F1c2UgYWxsIHRoZSBjb250ZW50IGlzIG1hbmFnZWQgaW4gdGhpcyBwcm9qZWN0XG4gICAgICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnVja2V0LmdyYW50UmVhZFdyaXRlKHRoaXMuY2RuQWNjZXNzSWRlbnRpdHkpO1xuXG4gICAgICAgIHJldHVybiBidWNrZXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRvIHJlbmRlciB0aGUgTnV4dCBhcHAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQXBwTGFtYmRhRnVuY3Rpb24ocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogRnVuY3Rpb24ge1xuICAgICAgICBjb25zdCBmdW5jTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tbnV4dGA7XG5cbiAgICAgICAgY29uc3QgYXBwTG9nR3JvdXAgPSBuZXcgTG9nR3JvdXAodGhpcywgYCR7ZnVuY05hbWV9LWxvZ3NgLCB7XG4gICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke2Z1bmNOYW1lfWAsXG4gICAgICAgICAgICByZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgICB9KTtcbiAgICAgICAgYXBwTG9nR3JvdXAuYXBwbHlSZW1vdmFsUG9saWN5KFJlbW92YWxQb2xpY3kuREVTVFJPWSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbih0aGlzLCBmdW5jTmFtZSwge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgUmVuZGVycyB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IE51eHQgYXBwLmAsXG4gICAgICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgICAgICAgaGFuZGxlcjogYCR7cHJvcHMuZW50cnlwb2ludCA/PyAnaW5kZXgnfS5oYW5kbGVyYCxcbiAgICAgICAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KGAke3Byb3BzLnJvb3REaXIgPz8gJy4nIH0vLm91dHB1dC9zZXJ2ZXJgLCB7XG4gICAgICAgICAgICAgICAgZXhjbHVkZTogWycqKi5zdmcnLCAnKiouaWNvJywgJyoqLnBuZycsICcqKi5qcGcnLCAnKiouanMubWFwJ10sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IHByb3BzLnRpbWVvdXQgPz8gRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICAgICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplID8/IDE3OTIsXG4gICAgICAgICAgICBhbGxvd1B1YmxpY1N1Ym5ldDogZmFsc2UsXG4gICAgICAgICAgICB0cmFjaW5nOiBwcm9wcy5lbmFibGVUcmFjaW5nID8gVHJhY2luZy5BQ1RJVkUgOiBUcmFjaW5nLkRJU0FCTEVELFxuICAgICAgICAgICAgbG9nR3JvdXA6IGFwcExvZ0dyb3VwLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgICBOT0RFX09QVElPTlM6ICctLWVuYWJsZS1zb3VyY2UtbWFwcycsXG4gICAgICAgICAgICAgICAgLi4uSlNPTi5wYXJzZShwcm9wcy5lbnRyeXBvaW50RW52ID8/ICd7fScpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgY2xlYW51cHMgdGhlIG91dGRhdGVkIHN0YXRpYyBhc3NldHMgb2YgdGhlIE51eHQgYXBwLlxuICAgICAqIE5vdGUgdGhhdCB3ZSB1c2UgdGhlIGJ1bmRsZWQgQVdTIFNESyBmb3IgTm9kZSB0byBhdm9pZCB0aGUgbmVlZCBmb3IgYSBjdXN0b20gbGF5ZXJcbiAgICAgKiB3aGljaCByZXN0cmljdHMgdGhlIGNvbnN1bWVyIHRvIGEgc3BlY2lmaWMgeWFybiBvciBucG0gdmVyc2lvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNsZWFudXBMYW1iZGFGdW5jdGlvbihwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBGdW5jdGlvbiB7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZTogc3RyaW5nID0gYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1jbGVhbnVwYDtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25EaXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Z1bmN0aW9ucy9hc3NldHMtY2xlYW51cCcpO1xuXG4gICAgICAgIGNvbnN0IGNsZWFudXBMb2dHcm91cCA9IG5ldyBMb2dHcm91cCh0aGlzLCBgJHtmdW5jdGlvbk5hbWV9LWxvZ3NgLCB7XG4gICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke2Z1bmN0aW9uTmFtZX1gLFxuICAgICAgICAgICAgcmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLlRXT19XRUVLUyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNsZWFudXBMb2dHcm91cC5hcHBseVJlbW92YWxQb2xpY3koUmVtb3ZhbFBvbGljeS5ERVNUUk9ZKTtcblxuICAgICAgICBjb25zdCByZXN1bHQ6IEZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKHRoaXMsIGZ1bmN0aW9uTmFtZSwge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYEF1dG8tZGVsZXRlcyB0aGUgb3V0ZGF0ZWQgc3RhdGljIGFzc2V0cyBpbiB0aGUgJHt0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lfSBTMyBidWNrZXQuYCxcbiAgICAgICAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICAgICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICAgICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICAgICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChgJHtmdW5jdGlvbkRpclBhdGh9L2J1aWxkL2FwcGAsIHtcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBbJyouZC50cyddXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTUpLFxuICAgICAgICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgICAgICBTVEFUSUNfQVNTRVRTX0JVQ0tFVDogdGhpcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAgICAgICAgICBPVVREQVRFRF9BU1NFVFNfUkVURU5USU9OX0RBWVM6IGAke3Byb3BzLm91dGRhdGVkQXNzZXRzUmV0ZW50aW9uRGF5cyA/PyAzMH1gLFxuICAgICAgICAgICAgICAgIEVOVklST05NRU5UOiBwcm9wcy5lbnZpcm9ubWVudCxcbiAgICAgICAgICAgICAgICBBV1NfTk9ERUpTX0NPTk5FQ1RJT05fUkVVU0VfRU5BQkxFRDogJzEnLFxuICAgICAgICAgICAgICAgIE5PREVfT1BUSU9OUzogJy0tZW5hYmxlLXNvdXJjZS1tYXBzJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb2dHcm91cDogY2xlYW51cExvZ0dyb3VwLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBncmFudCBmdW5jdGlvbiBhY2Nlc3MgdG8gUzMgYnVja2V0XG4gICAgICAgIHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LmdyYW50UmVhZChyZXN1bHQpO1xuICAgICAgICB0aGlzLnN0YXRpY0Fzc2V0c0J1Y2tldC5ncmFudERlbGV0ZShyZXN1bHQpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgQVBJIGdhdGV3YXkgdG8gbWFrZSB0aGUgTnV4dCBhcHAgcmVuZGVyIExhbWJkYSBmdW5jdGlvbiBwdWJsaWNseSBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQXBpR2F0ZXdheShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBIdHRwQXBpIHtcbiAgICAgICAgY29uc3QgYXBpTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYXBpYDtcbiAgICAgICAgY29uc3QgbGFtYmRhSW50ZWdyYXRpb24gPSBuZXcgSHR0cExhbWJkYUludGVncmF0aW9uKGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tbGFtYmRhLWludGVncmF0aW9uYCwgdGhpcy5hcHBMYW1iZGFGdW5jdGlvbik7XG5cbiAgICAgICAgLy8gV2Ugd2FudCB0aGUgQVBJIGdhdGV3YXkgdG8gYmUgYWNjZXNzaWJsZSBieSB0aGUgY3VzdG9tIGRvbWFpbiBuYW1lLlxuICAgICAgICAvLyBFdmVuIHRob3VnaCB3ZSBhY2Nlc3MgdGhlIGdhdGV3YXkgdmlhIENsb3VkRnJvbnQgKGZvciBhdXRvIGh0dHAgdG8gaHR0cHMgcmVkaXJlY3RzKSwgdGhpcyBpcyByZXF1aXJlZFxuICAgICAgICAvLyB0byBiZSBhYmxlIHRvIHJlZGlyZWN0IHRoZSBvcmlnaW5hbCAnSG9zdCcgaGVhZGVyIHRvIHRoZSBOdXh0IGFwcGxpY2F0aW9uLCBpZiByZXF1ZXN0ZWQuXG4gICAgICAgIGNvbnN0IGRvbWFpbk5hbWUgPSBuZXcgRG9tYWluTmFtZSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFwaS1kb21haW5gLCB7XG4gICAgICAgICAgICBkb21haW5OYW1lOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICBjZXJ0aWZpY2F0ZTogQ2VydGlmaWNhdGUuZnJvbUNlcnRpZmljYXRlQXJuKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tcmVnaW9uYWwtY2VydGlmaWNhdGVgLCBwcm9wcy5yZWdpb25hbFRsc0NlcnRpZmljYXRlQXJuKSxcbiAgICAgICAgICAgIGVuZHBvaW50VHlwZTogRW5kcG9pbnRUeXBlLlJFR0lPTkFMLFxuICAgICAgICAgICAgc2VjdXJpdHlQb2xpY3k6IFNlY3VyaXR5UG9saWN5LlRMU18xXzJcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgYXBpR2F0ZXdheSA9IG5ldyBIdHRwQXBpKHRoaXMsIGFwaU5hbWUsIHtcbiAgICAgICAgICAgIGFwaU5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYENvbm5lY3RzIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gd2l0aCB0aGUgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9IExhbWJkYSBmdW5jdGlvbiB0byBtYWtlIGl0IHB1YmxpY2x5IGF2YWlsYWJsZS5gLFxuICAgICAgICAgICAgLy8gVGhlIGFwcCBkb2VzIG5vdCBhbGxvdyBhbnkgY3Jvc3Mtb3JpZ2luIGFjY2VzcyBieSBwdXJwb3NlOiB0aGUgYXBwIHNob3VsZCBub3QgYmUgZW1iZWRkYWJsZSBhbnl3aGVyZVxuICAgICAgICAgICAgY29yc1ByZWZsaWdodDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGVmYXVsdEludGVncmF0aW9uOiBsYW1iZGFJbnRlZ3JhdGlvbixcbiAgICAgICAgICAgIGRlZmF1bHREb21haW5NYXBwaW5nOiB7XG4gICAgICAgICAgICAgICAgZG9tYWluTmFtZTogZG9tYWluTmFtZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBhcGlHYXRld2F5LmFkZFJvdXRlcyh7XG4gICAgICAgICAgICBpbnRlZ3JhdGlvbjogbGFtYmRhSW50ZWdyYXRpb24sXG4gICAgICAgICAgICBwYXRoOiAnL3twcm94eSt9JyxcbiAgICAgICAgICAgIG1ldGhvZHM6IFtcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLkdFVCxcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLkhFQUQsXG4gICAgICAgICAgICAgICAgSHR0cE1ldGhvZC5PUFRJT05TLFxuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLlBVVCxcbiAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLlBBVENILFxuICAgICAgICAgICAgICAgIEh0dHBNZXRob2QuREVMRVRFLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFwaUdhdGV3YXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdGhhdCByb3V0ZXMgaW5jb21pbmcgcmVxdWVzdHMgdG8gdGhlIE51eHQgTGFtYmRhIGZ1bmN0aW9uICh2aWEgdGhlIEFQSSBnYXRld2F5KVxuICAgICAqIG9yIHRoZSBTMyBhc3NldHMgZm9sZGVyICh3aXRoIGNhY2hpbmcpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUNsb3VkRnJvbnREaXN0cmlidXRpb24ocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogRGlzdHJpYnV0aW9uIHtcbiAgICAgICAgY29uc3QgY2RuTmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2RuYDtcblxuICAgICAgICByZXR1cm4gbmV3IERpc3RyaWJ1dGlvbih0aGlzLCBjZG5OYW1lLCB7XG4gICAgICAgICAgICBkb21haW5OYW1lczogW3Byb3BzLmRvbWFpbl0sXG4gICAgICAgICAgICBjb21tZW50OiBjZG5OYW1lLFxuICAgICAgICAgICAgbWluaW11bVByb3RvY29sVmVyc2lvbjogU2VjdXJpdHlQb2xpY3lQcm90b2NvbC5UTFNfVjFfMl8yMDE4LFxuICAgICAgICAgICAgY2VydGlmaWNhdGU6IENlcnRpZmljYXRlLmZyb21DZXJ0aWZpY2F0ZUFybih0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWdsb2JhbC1jZXJ0aWZpY2F0ZWAsIHByb3BzLmdsb2JhbFRsc0NlcnRpZmljYXRlQXJuKSxcbiAgICAgICAgICAgIGh0dHBWZXJzaW9uOiBIdHRwVmVyc2lvbi5IVFRQMl9BTkRfMyxcbiAgICAgICAgICAgIGRlZmF1bHRCZWhhdmlvcjogdGhpcy5udXh0U2VydmVyUm91dGVCZWhhdmlvcixcbiAgICAgICAgICAgIGFkZGl0aW9uYWxCZWhhdmlvcnM6IHRoaXMuc2V0dXBDbG91ZEZyb250Um91dGluZyhwcm9wcyksXG4gICAgICAgICAgICBwcmljZUNsYXNzOiBQcmljZUNsYXNzLlBSSUNFX0NMQVNTXzEwMCwgLy8gVXNlIG9ubHkgTm9ydGggQW1lcmljYSBhbmQgRXVyb3BlXG4gICAgICAgICAgICBsb2dCdWNrZXQ6IHRoaXMuYWNjZXNzTG9nc0J1Y2tldCxcbiAgICAgICAgICAgIGxvZ0ZpbGVQcmVmaXg6IHByb3BzLmVuYWJsZUFjY2Vzc0xvZ3NBbmFseXNpcyA/ICd1bnByb2Nlc3NlZCcgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBsb2dJbmNsdWRlc0Nvb2tpZXM6IHByb3BzLmVuYWJsZUFjY2Vzc0xvZ3NBbmFseXNpcyxcbiAgICAgICAgICAgIHdlYkFjbElkOiBwcm9wcy53ZWJBY2xBcm4sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZXMgQ2xvdWRGcm9udCBpbnZhbGlkYXRpb24gcGF0aHMgYnkgdHJpbW1pbmcgd2hpdGVzcGFjZSwgZW5zdXJpbmcgYSBsZWFkaW5nIHNsYXNoLCBhbmQgcmVtb3ZpbmcgZHVwbGljYXRlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBub3JtYWxpemVJbnZhbGlkYXRpb25QYXRocyhwYXRoczogc3RyaW5nW10gfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKFxuICAgICAgICAgICAgbmV3IFNldChcbiAgICAgICAgICAgICAgICAocGF0aHMgPz8gW10pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAocGF0aCA9PiBwYXRoLnRyaW0oKSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigocGF0aCk6IHBhdGggaXMgc3RyaW5nID0+IHBhdGgubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgLm1hcChwYXRoID0+IHBhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aCA6IGAvJHtwYXRofWApXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gYmVoYXZpb3Igb3JpZ2luIHRvIHJvdXRlIGluY29taW5nIHJlcXVlc3RzIHRvIHRoZSBOdXh0IHJlbmRlciBMYW1iZGEgZnVuY3Rpb24gKHZpYSBBUEkgZ2F0ZXdheSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVOdXh0QXBwSHR0cE9yaWdpbigpOiBIdHRwT3JpZ2luIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIdHRwT3JpZ2luKGAke3RoaXMuYXBpR2F0ZXdheS5odHRwQXBpSWR9LmV4ZWN1dGUtYXBpLiR7dGhpcy5yZWdpb259LmFtYXpvbmF3cy5jb21gLCB7XG4gICAgICAgICAgICBjb25uZWN0aW9uQXR0ZW1wdHM6IDIsXG4gICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygyKSxcbiAgICAgICAgICAgIHJlYWRUaW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDEwKSxcbiAgICAgICAgICAgIHByb3RvY29sUG9saWN5OiBPcmlnaW5Qcm90b2NvbFBvbGljeS5IVFRQU19PTkxZLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmVoYXZpb3IgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBpbmNvbWluZyB3ZWIgcmVxdWVzdHNcbiAgICAgKiB0byB0aGUgTnV4dCByZW5kZXIgTGFtYmRhIGZ1bmN0aW9uICh2aWEgQVBJIGdhdGV3YXkpLlxuICAgICAqIEFkZGl0aW9uYWxseSwgdGhpcyBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0cyBIVFRQIHJlcXVlc3RzIHRvIEhUVFBTLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlTnV4dFNlcnZlclJvdXRlQmVoYXZpb3IoKTogQmVoYXZpb3JPcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9yaWdpbjogdGhpcy5odHRwT3JpZ2luLFxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFELFxuICAgICAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAgICAgICBvcmlnaW5SZXF1ZXN0UG9saWN5OiB0aGlzLmFwcFJlcXVlc3RQb2xpY3ksXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogdGhpcy5hcHBDYWNoZVBvbGljeVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBDbG91ZEZyb250Um91dGluZyhwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+IHtcbiAgICAgICAgbGV0IHJvdXRpbmdCZWhhdmlvdXJzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge1xuXG4gICAgICAgICAgICAvLyBOdXh0IEkxOG4gZmlsZXMgYXJlIHNlcnZlZCB2aWEgYSBzZXJ2ZXIgcm91dGVcbiAgICAgICAgICAgICcvX2kxOG4vKic6IHRoaXMubnV4dFNlcnZlclJvdXRlQmVoYXZpb3IsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU3BlY2lmaWMgb25lcyBmaXJzdFxuICAgICAgICBpZiAocHJvcHMuZW5hYmxlQXBpKSB7XG4gICAgICAgICAgICByb3V0aW5nQmVoYXZpb3VycyA9IHsuLi5yb3V0aW5nQmVoYXZpb3VycywgLi4udGhpcy5jcmVhdGVBcGlSb3V0ZUJlaGF2aW9yKCl9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wcy5lbmFibGVTaXRlbWFwKSB7XG4gICAgICAgICAgICByb3V0aW5nQmVoYXZpb3VycyA9IHsuLi5yb3V0aW5nQmVoYXZpb3VycywgLi4udGhpcy5jcmVhdGVTaXRlbWFwUm91dGVCZWhhdmlvcigpfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBjdXN0b20gc2VydmVyIHJvdXRlcyBiZWZvcmUgc3RhdGljIGFzc2V0cyB0byBlbnN1cmUgdGhleSB0YWtlIHByZWNlZGVuY2VcbiAgICAgICAgaWYgKHByb3BzLnNlcnZlclJvdXRlcyAmJiBwcm9wcy5zZXJ2ZXJSb3V0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcm91dGluZ0JlaGF2aW91cnMgPSB7Li4ucm91dGluZ0JlaGF2aW91cnMsIC4uLnRoaXMuY3JlYXRlU2VydmVyUm91dGVCZWhhdmlvcihwcm9wcy5zZXJ2ZXJSb3V0ZXMpfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluamVjdCBjdXN0b20gYmVoYXZpb3JzIChjYWNoZSBwb2xpY3kgb3ZlcnJpZGVzIGFuZC9vciBDbG91ZEZyb250IEZ1bmN0aW9ucykgYmVmb3JlIHN0YXRpYyBhc3NldCBiZWhhdmlvcnNcbiAgICAgICAgaWYgKHByb3BzLmFkZGl0aW9uYWxCZWhhdmlvcnMgJiYgcHJvcHMuYWRkaXRpb25hbEJlaGF2aW9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByb3V0aW5nQmVoYXZpb3VycyA9IHsuLi5yb3V0aW5nQmVoYXZpb3VycywgLi4udGhpcy5jcmVhdGVBZGRpdGlvbmFsQmVoYXZpb3JzKHByb3BzLmFkZGl0aW9uYWxCZWhhdmlvcnMpfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvdXRpbmdCZWhhdmlvdXJzID0gey4uLnJvdXRpbmdCZWhhdmlvdXJzLCAuLi50aGlzLmNyZWF0ZVN0YXRpY0Fzc2V0c1JvdXRlQmVoYXZpb3IoKX07XG5cbiAgICAgICAgcmV0dXJuIHJvdXRpbmdCZWhhdmlvdXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjYWNoZSBwb2xpY3kgZm9yIHRoZSBOdXh0IGFwcCByb3V0ZSBiZWhhdmlvciBvZiB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVOdXh0QXBwQ2FjaGVQb2xpY3kocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogQ2FjaGVQb2xpY3kge1xuICAgICAgICByZXR1cm4gbmV3IENhY2hlUG9saWN5KHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2FjaGUtcG9saWN5YCwge1xuICAgICAgICAgICAgY2FjaGVQb2xpY3lOYW1lOiBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWNkbi1jYWNoZS1wb2xpY3lgLFxuICAgICAgICAgICAgY29tbWVudDogYERlZmluZXMgd2hpY2ggcmVxdWVzdCBkYXRhIHRvIHBhc3MgdG8gdGhlICR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fSBvcmlnaW4gYW5kIGhvdyB0aGUgY2FjaGUga2V5IGlzIGNhbGN1bGF0ZWQuYCxcbiAgICAgICAgICAgIGRlZmF1bHRUdGw6IER1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgICAgICBtaW5UdGw6IER1cmF0aW9uLnNlY29uZHMoMCksXG4gICAgICAgICAgICBtYXhUdGw6IER1cmF0aW9uLmRheXMoMzY1KSxcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IHByb3BzLmNhY2hlS2V5UXVlcnlQYXJhbXM/Lmxlbmd0aCA/IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuY2FjaGVLZXlRdWVyeVBhcmFtcykgOiAocHJvcHMuZGVueUNhY2hlS2V5UXVlcnlQYXJhbXM/Lmxlbmd0aCA/IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5kZW55TGlzdCguLi5wcm9wcy5kZW55Q2FjaGVLZXlRdWVyeVBhcmFtcykgOiAocHJvcHMuYWxsb3dRdWVyeVBhcmFtcz8ubGVuZ3RoID8gQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5hbGxvd1F1ZXJ5UGFyYW1zKSA6IChwcm9wcy5kZW55UXVlcnlQYXJhbXM/Lmxlbmd0aCA/IENhY2hlUXVlcnlTdHJpbmdCZWhhdmlvci5kZW55TGlzdCguLi5wcm9wcy5kZW55UXVlcnlQYXJhbXMpIDogQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpKSkpLFxuICAgICAgICAgICAgaGVhZGVyQmVoYXZpb3I6IHByb3BzLmNhY2hlS2V5SGVhZGVycz8ubGVuZ3RoID8gQ2FjaGVIZWFkZXJCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuY2FjaGVLZXlIZWFkZXJzKSA6IChwcm9wcy5hbGxvd0hlYWRlcnM/Lmxlbmd0aCA/IENhY2hlSGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmFsbG93SGVhZGVycykgOiBDYWNoZUhlYWRlckJlaGF2aW9yLm5vbmUoKSksXG4gICAgICAgICAgICBjb29raWVCZWhhdmlvcjogcHJvcHMuY2FjaGVLZXlDb29raWVzPy5sZW5ndGggPyBDYWNoZUNvb2tpZUJlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5jYWNoZUtleUNvb2tpZXMpIDogKHByb3BzLmFsbG93Q29va2llcz8ubGVuZ3RoID8gQ2FjaGVDb29raWVCZWhhdmlvci5hbGxvd0xpc3QoLi4ucHJvcHMuYWxsb3dDb29raWVzKSA6IENhY2hlQ29va2llQmVoYXZpb3Iubm9uZSgpKSxcbiAgICAgICAgICAgIGVuYWJsZUFjY2VwdEVuY29kaW5nQnJvdGxpOiB0cnVlLFxuICAgICAgICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdHemlwOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9yaWdpbiByZXF1ZXN0IHBvbGljeSBmb3IgdGhlIE51eHQgYXBwIHJvdXRlIGJlaGF2aW9yIG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBObyBwb2xpY3kgaXMgY3JlYXRlZCBpZiBubyBleHBsaWNpdCBjb25maWcgaXMgcHJvdmlkZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVOdXh0QXBwUmVxdWVzdFBvbGljeShwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiBPcmlnaW5SZXF1ZXN0UG9saWN5fHVuZGVmaW5lZCB7XG5cbiAgICAgICAgLy8gSWYgbm8gZXhwbGljaXQgY29uZmlnIGlzIHByb3ZpZGVkLCB3ZSB3YW50IHRvIHVzZSB0aGUgZGVmYXVsdCBmcm9tIENsb3VkZnJvbnRcbiAgICAgICAgY29uc3QgaGFzQW55Q29uZmlnID0gcHJvcHMuZm9yd2FyZFF1ZXJ5UGFyYW1zPy5sZW5ndGggfHwgcHJvcHMuZm9yd2FyZEhlYWRlcnM/Lmxlbmd0aCB8fCBwcm9wcy5mb3J3YXJkQ29va2llcz8ubGVuZ3RoO1xuICAgICAgICBpZiAoIWhhc0FueUNvbmZpZykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgT3JpZ2luUmVxdWVzdFBvbGljeSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXJlcXVlc3QtcG9saWN5YCwge1xuICAgICAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeU5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tY2RuLXJlcXVlc3QtcG9saWN5YCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IGBEZWZpbmVzIHdoaWNoIHJlcXVlc3QgZGF0YSB0byBwYXNzIHRvIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gb3JpZ2luIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjYWNoZSBrZXkuYCxcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nQmVoYXZpb3I6IHByb3BzLmZvcndhcmRRdWVyeVBhcmFtcz8ubGVuZ3RoID8gT3JpZ2luUmVxdWVzdFF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmZvcndhcmRRdWVyeVBhcmFtcykgOiBPcmlnaW5SZXF1ZXN0UXVlcnlTdHJpbmdCZWhhdmlvci5hbGwoKSxcbiAgICAgICAgICAgIGhlYWRlckJlaGF2aW9yOiBwcm9wcy5mb3J3YXJkSGVhZGVycz8ubGVuZ3RoID8gT3JpZ2luUmVxdWVzdEhlYWRlckJlaGF2aW9yLmFsbG93TGlzdCguLi5wcm9wcy5mb3J3YXJkSGVhZGVycykgOiBPcmlnaW5SZXF1ZXN0SGVhZGVyQmVoYXZpb3Iubm9uZSgpLFxuICAgICAgICAgICAgY29va2llQmVoYXZpb3I6IHByb3BzLmZvcndhcmRDb29raWVzPy5sZW5ndGggPyBPcmlnaW5SZXF1ZXN0Q29va2llQmVoYXZpb3IuYWxsb3dMaXN0KC4uLnByb3BzLmZvcndhcmRDb29raWVzKSA6IE9yaWdpblJlcXVlc3RDb29raWVCZWhhdmlvci5ub25lKCksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBiZWhhdmlvciBmb3IgdGhlIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHRvIHJvdXRlIG1hdGNoaW5nIE51eHQgYXBwIEFQSSByZXF1ZXN0cyB0byB0aGUgQVBJIGdhdGV3YXkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVBcGlSb3V0ZUJlaGF2aW9yKCk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBjb25zdCBhcGlCZWhhdmlvcjogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgb3JpZ2luOiB0aGlzLmh0dHBPcmlnaW4sXG4gICAgICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzOiBBbGxvd2VkTWV0aG9kcy5BTExPV19BTEwsXG4gICAgICAgICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogdGhpcy5hcHBDYWNoZVBvbGljeSxcbiAgICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6IHRoaXMuYXBwUmVxdWVzdFBvbGljeSxcbiAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5IVFRQU19PTkxZXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7fTtcbiAgICAgICAgcnVsZXNbJy9hcGkvKiddID0gYXBpQmVoYXZpb3I7XG5cbiAgICAgICAgcmV0dXJuIHJ1bGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYmVoYXZpb3JzIGZvciB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdG8gcm91dGUgc3BlY2lmaWVkIHBhdGggcGF0dGVybnMgdG8gdGhlIFNTUiBvcmlnaW4uXG4gICAgICogVGhpcyBhbGxvd3Mgc2VydmVyIGVuZHBvaW50cyB0aGF0IHVzZSBmaWxlLWxpa2UgVVJMcyAoZS5nLiwgL3NpdGVtYXAueG1sIGZyb20gQG51eHRqcy9zaXRlbWFwKSBcbiAgICAgKiB0byBiZSBoYW5kbGVkIGJ5IHRoZSBMYW1iZGEgZnVuY3Rpb24gZm9yIGR5bmFtaWMgY29udGVudCBnZW5lcmF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlU2VydmVyUm91dGVCZWhhdmlvcihzZXJ2ZXJSb3V0ZXM6IHN0cmluZ1tdKTogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiB7XG4gICAgICAgIGNvbnN0IHJ1bGVzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge307XG4gICAgICAgIFxuICAgICAgICBzZXJ2ZXJSb3V0ZXMuZm9yRWFjaChyb3V0ZSA9PiB7XG4gICAgICAgICAgICBydWxlc1tyb3V0ZV0gPSB0aGlzLm51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcnVsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBiZWhhdmlvcnMgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiBiYXNlZCBvbiB0aGUgY29uc3VtZXItc3VwcGxpZWQge0BsaW5rIE51eHRDbG91ZEZyb250QmVoYXZpb3J9IGxpc3QuXG4gICAgICogRWFjaCBiZWhhdmlvciBjYW4gb3ZlcnJpZGUgdGhlIGNhY2hlIHBvbGljeSwgYXR0YWNoIGEgQ2xvdWRGcm9udCBGdW5jdGlvbiwgb3IgYm90aC5cbiAgICAgKlxuICAgICAqIFdoZW4ge0BsaW5rIE51eHRDbG91ZEZyb250QmVoYXZpb3IuZm5Db2RlfSBpcyBwcm92aWRlZCwgdGhpcyBtZXRob2QgY3JlYXRlcyB0aGUgYGNsb3VkZnJvbnQuRnVuY3Rpb25gXG4gICAgICogcmVzb3VyY2UgaW5zaWRlIHRoZSBzdGFjayBpdHNlbGYgc28gdGhhdCBpdCBpcyBhbHdheXMgY29ycmVjdGx5IHNjb3BlZC5cbiAgICAgKlxuICAgICAqIFRoZSBwcm92aWRlZCB7QGxpbmsgTnV4dENsb3VkRnJvbnRCZWhhdmlvci5jYWNoZVBvbGljeX0gaXMgdXNlZCB3aGVuIHNwZWNpZmllZDsgb3RoZXJ3aXNlIHRoZVxuICAgICAqIGRlZmF1bHQgTnV4dCBhcHAgY2FjaGUgcG9saWN5ICh7QGxpbmsgYXBwQ2FjaGVQb2xpY3l9KSBpcyB1c2VkLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQWRkaXRpb25hbEJlaGF2aW9ycyhiZWhhdmlvcnM6IE51eHRDbG91ZEZyb250QmVoYXZpb3JbXSk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBjb25zdCBydWxlczogUmVjb3JkPHN0cmluZywgQmVoYXZpb3JPcHRpb25zPiA9IHt9O1xuXG4gICAgICAgIGJlaGF2aW9ycy5mb3JFYWNoKChiZWhhdmlvciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGxldCBmdW5jdGlvbkFzc29jaWF0aW9uczogRnVuY3Rpb25Bc3NvY2lhdGlvbltdID0gW107XG5cbiAgICAgICAgICAgIGlmIChiZWhhdmlvci5mbkNvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIENsb3VkRnJvbnQgRnVuY3Rpb24gaW5zaWRlIHRoZSBzdGFjayBzbyBpdCBpcyBhbHdheXMgY29ycmVjdGx5IHNjb3BlZC5cbiAgICAgICAgICAgICAgICBjb25zdCBjZkZ1bmN0aW9uID0gbmV3IENsb3VkRnJvbnRGdW5jdGlvbih0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWJlaGF2aW9yLWZuLSR7aW5kZXh9YCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBiZWhhdmlvci5mbkNvZGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnMgPSBbe1xuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbjogY2ZGdW5jdGlvbixcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBiZWhhdmlvci5ldmVudFR5cGUgPz8gRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgICAgICAgICAgICAgfV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJ1bGVzW2JlaGF2aW9yLnBhdGhQYXR0ZXJuXSA9IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLm51eHRTZXJ2ZXJSb3V0ZUJlaGF2aW9yLFxuICAgICAgICAgICAgICAgIGNhY2hlUG9saWN5OiBiZWhhdmlvci5jYWNoZVBvbGljeSA/PyB0aGlzLmFwcENhY2hlUG9saWN5LFxuICAgICAgICAgICAgICAgIC4uLihmdW5jdGlvbkFzc29jaWF0aW9ucy5sZW5ndGggPiAwID8ge2Z1bmN0aW9uQXNzb2NpYXRpb25zfSA6IHt9KSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBydWxlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmVoYXZpb3IgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBtYXRjaGluZyBpbmNvbWluZyByZXF1ZXN0cyBmb3IgdGhlIHN0YXRpYyBhc3NldHNcbiAgICAgKiB0byB0aGUgUzMgYnVja2V0IHRoYXQgaG9sZHMgdGhlc2Ugc3RhdGljIGFzc2V0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVTdGF0aWNBc3NldHNSb3V0ZUJlaGF2aW9yKCk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBjb25zdCBzdGF0aWNBc3NldHNDYWNoZUNvbmZpZzogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgb3JpZ2luOiBTM0J1Y2tldE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzSWRlbnRpdHkodGhpcy5zdGF0aWNBc3NldHNCdWNrZXQsIHtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uQXR0ZW1wdHM6IDIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvblRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMyksXG4gICAgICAgICAgICAgICAgb3JpZ2luQWNjZXNzSWRlbnRpdHk6IHRoaXMuY2RuQWNjZXNzSWRlbnRpdHksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNvbXByZXNzOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZWRNZXRob2RzOiBDYWNoZWRNZXRob2RzLkNBQ0hFX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICBjYWNoZVBvbGljeTogQ2FjaGVQb2xpY3kuQ0FDSElOR19PUFRJTUlaRUQsXG4gICAgICAgICAgICB2aWV3ZXJQcm90b2NvbFBvbGljeTogVmlld2VyUHJvdG9jb2xQb2xpY3kuUkVESVJFQ1RfVE9fSFRUUFMsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcnVsZXM6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4gPSB7fTtcbiAgICAgICAgdGhpcy5zdGF0aWNBc3NldENvbmZpZ3MuZm9yRWFjaChhc3NldCA9PiB7XG4gICAgICAgICAgICBydWxlc1tgJHthc3NldC50YXJnZXR9JHthc3NldC5wYXR0ZXJufWBdID0gc3RhdGljQXNzZXRzQ2FjaGVDb25maWdcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcnVsZXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmVoYXZpb3IgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byByb3V0ZSBtYXRjaGluZyBpbmNvbWluZyByZXF1ZXN0cyBmb3IgdGhlIHNpdGVtYXAgYXNzZXRzXG4gICAgICogdG8gdGhlIFMzIGJ1Y2tldCB0aGF0IGhvbGRzIHRoZXNlIHNpdGVtYXAgYXNzZXRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZVNpdGVtYXBSb3V0ZUJlaGF2aW9yKCk6IFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz4ge1xuICAgICAgICBpZiAoIXRoaXMuc2l0ZW1hcEJ1Y2tldCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2l0ZW1hcCBidWNrZXQgbXVzdCBleGlzdCBiZWZvcmUgY3JlYXRpbmcgc2l0ZW1hcCByb3V0ZSBiZWhhdmlvci5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaXRlbWFwQ2FjaGVDb25maWc6IEJlaGF2aW9yT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG9yaWdpbjogUzNCdWNrZXRPcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0lkZW50aXR5KHRoaXMuc2l0ZW1hcEJ1Y2tldCwge1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25BdHRlbXB0czogMixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogRHVyYXRpb24uc2Vjb25kcygzKSxcbiAgICAgICAgICAgICAgICBvcmlnaW5BY2Nlc3NJZGVudGl0eTogdGhpcy5jZG5BY2Nlc3NJZGVudGl0eSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29tcHJlc3M6IHRydWUsXG4gICAgICAgICAgICBhbGxvd2VkTWV0aG9kczogQWxsb3dlZE1ldGhvZHMuQUxMT1dfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlZE1ldGhvZHM6IENhY2hlZE1ldGhvZHMuQ0FDSEVfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgIGNhY2hlUG9saWN5OiBDYWNoZVBvbGljeS5DQUNISU5HX09QVElNSVpFRCxcbiAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQU1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJ1bGVzOiBSZWNvcmQ8c3RyaW5nLCBCZWhhdmlvck9wdGlvbnM+ID0ge307XG4gICAgICAgIHJ1bGVzWycqc2l0ZW1hcC54bWwnXSA9IHNpdGVtYXBDYWNoZUNvbmZpZztcbiAgICAgICAgcnVsZXNbJypzaXRlbWFwLWdvbmUueG1sJ10gPSBzaXRlbWFwQ2FjaGVDb25maWc7XG4gICAgICAgIHJ1bGVzWycvc2l0ZW1hcHMvKiddID0gc2l0ZW1hcENhY2hlQ29uZmlnO1xuXG4gICAgICAgIHJldHVybiBydWxlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGxvYWRzIHRoZSBzdGF0aWMgYXNzZXRzIG9mIHRoZSBOdXh0IGFwcCBhcyBkZWZpbmVkIGluIHtAc2VlIGdldE51eHRBcHBTdGF0aWNBc3NldENvbmZpZ3N9IHRvIHRoZSBzdGF0aWMgYXNzZXRzIFMzIGJ1Y2tldC5cbiAgICAgKiBJbiBvcmRlciB0byBlbmFibGUgYSB6ZXJvLWRvd250aW1lIGRlcGxveW1lbnQgd2l0aCBtaW5pbWFsIHN0b3JhZ2UgbG9hZCxcbiAgICAgKiB3ZSBkZXBsb3kgdGhlIHN0YXRpYyBhc3NldHMgb2YgZXZlcnkgZGVwbG95bWVudCBpbnRvIHRoZSBzYW1lIGZvbGRlciBidXQgbWFyayB0aGVtIHdpdGggYSBkZXBsb3ltZW50IHJldmlzaW9uLlxuICAgICAqIEJ5IGRvaW5nIHNvLCB0aGUgZmlsZXMgb2YgcHJldmlvdXMgZGVwbG95bWVudHMgYXJlIHJldGFpbmVkIHRvIGFsbG93IGNsaWVudHMgdG8gY29udGludWUgdG8gd29yayB3aXRoIGFuIG9sZGVyIHJldmlzaW9uXG4gICAgICogYnV0IGdldHMgY2xlYW5lZCB1cCBhZnRlciBhIHNwZWNpZmllZCBwZXJpb2Qgb2YgdGltZSB2aWEgdGhlIGNsZWFudXAgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY29uZmlndXJlRGVwbG95bWVudHMoKTogQnVja2V0RGVwbG95bWVudFtdIHtcbiAgICAgICAgY29uc3QgbG9nR3JvdXAgPSBuZXcgTG9nR3JvdXAodGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hc3NldHMtZGVwbG95bWVudC1sb2dzYCwge1xuICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFzc2V0cy1kZXBsb3ltZW50YCxcbiAgICAgICAgICAgIHJldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfREFZLFxuICAgICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZXR1cm5zIGEgZGVwbG95bWVudCBmb3IgZXZlcnkgY29uZmlndXJlZCBzdGF0aWMgYXNzZXQgdHlwZSB0byByZXNwZWN0IHRoZSBkaWZmZXJlbnQgY2FjaGUgc2V0dGluZ3MuXG4gICAgICAgIC8vIENvbnN1bWVyLXN1cHBsaWVkIENsb3VkRnJvbnQgaW52YWxpZGF0aW9uIHBhdGhzIChwcm9wcy5pbnZhbGlkYXRlUGF0aHNPbkRlcGxveSkgYXJlIGF0dGFjaGVkIHRvIGFcbiAgICAgICAgLy8gc2luZ2xlLCBzcGVjaWZpYyBkZXBsb3ltZW50IOKAlCB0aGUgXCJjYXJyaWVyXCIgaWRlbnRpZmllZCBieSBDT05TVU1FUl9JTlZBTElEQVRJT05fQ0FSUklFUl9QQVRURVJOIOKAlFxuICAgICAgICAvLyBzbyB0aGUgaW52YWxpZGF0aW9uIHBpZ2d5YmFja3Mgb24gQ0RLJ3MgZXhpc3RpbmcgQnVja2V0RGVwbG95bWVudCBpbnZhbGlkYXRpb24gbWVjaGFuaXNtIHdoaWxlXG4gICAgICAgIC8vIGZpcmluZyBhdCB0aGUgY29ycmVjdCBwb2ludCBpbiB0aGUgZGVwbG95bWVudCBwaGFzZSAoc2VlIHRoZSBwb3N0LUxhbWJkYSBsb2dpYyBiZWxvdykuXG4gICAgICAgIGNvbnN0IGhhc0NvbnN1bWVySW52YWxpZGF0aW9ucyA9IHRoaXMuZGVwbG95SW52YWxpZGF0aW9uUGF0aHMubGVuZ3RoID4gMDtcbiAgICAgICAgY29uc3QgZGVwbG95bWVudHMgPSB0aGlzLnN0YXRpY0Fzc2V0Q29uZmlncy5maWx0ZXIoYXNzZXQgPT4gZXhpc3RzU3luYyhhc3NldC5zb3VyY2UpKS5tYXAoKGFzc2V0LCBhc3NldEluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpc0ludmFsaWRhdGlvbkNhcnJpZXIgPSBhc3NldC5wYXR0ZXJuID09PSBOdXh0U2VydmVyQXBwU3RhY2suQ09OU1VNRVJfSU5WQUxJREFUSU9OX0NBUlJJRVJfUEFUVEVSTjtcbiAgICAgICAgICAgIGNvbnN0IGF0dGFjaENvbnN1bWVySW52YWxpZGF0aW9ucyA9IGlzSW52YWxpZGF0aW9uQ2FycmllciAmJiBoYXNDb25zdW1lckludmFsaWRhdGlvbnM7XG5cbiAgICAgICAgICAgIGNvbnN0IGRlcGxveW1lbnQgPSBuZXcgQnVja2V0RGVwbG95bWVudCh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWFzc2V0cy1kZXBsb3ltZW50LSR7YXNzZXRJbmRleH1gLCB7XG4gICAgICAgICAgICAgICAgc291cmNlczogW1NvdXJjZS5hc3NldChhc3NldC5zb3VyY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgZXhjbHVkZTogYXNzZXQuZXhjbHVkZSxcbiAgICAgICAgICAgICAgICB9KV0sXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb25CdWNrZXQ6IHRoaXMuc3RhdGljQXNzZXRzQnVja2V0LFxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBhc3NldC50YXJnZXQucmVwbGFjZSgvXlxcLysvZywgJycpLCAvLyBSZW1vdmUgbGVhZGluZyBzbGFzaFxuICAgICAgICAgICAgICAgIHBydW5lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzdG9yYWdlQ2xhc3M6IFN0b3JhZ2VDbGFzcy5TVEFOREFSRCxcbiAgICAgICAgICAgICAgICBleGNsdWRlOiBbJyonXSxcbiAgICAgICAgICAgICAgICBpbmNsdWRlOiBbYXNzZXQucGF0dGVybl0sXG4gICAgICAgICAgICAgICAgY2FjaGVDb250cm9sOiBhc3NldC5jYWNoZUNvbnRyb2wsXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6IGFzc2V0LmNvbnRlbnRUeXBlLFxuICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbjogYXR0YWNoQ29uc3VtZXJJbnZhbGlkYXRpb25zID8gdGhpcy5jZG4gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uUGF0aHM6IGF0dGFjaENvbnN1bWVySW52YWxpZGF0aW9ucyA/IHRoaXMuZGVwbG95SW52YWxpZGF0aW9uUGF0aHMgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbG9nR3JvdXA6IGxvZ0dyb3VwLFxuXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgYnVpbGQgcmV2aXNpb24gb24gZXZlcnkgYXNzZXQgdG8gYWxsb3cgY2xlYW51cCBvZiBvdXRkYXRlZCBhc3NldHNcbiAgICAgICAgICAgICAgICAgICAgcmV2aXNpb246IHRoaXMuZGVwbG95bWVudFJldmlzaW9uLFxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAvLyBTb21lIE51eHQgYXBwbGljYXRpb25zIGhhdmUgYSBsb3Qgb2YgYXNzZXRzIHRvIGRlcGxveSB3aGVyZWJ5IHRoZSBmdW5jdGlvbiBtaWdodCBydW4gb3V0IG9mIG1lbW9yeS5cbiAgICAgICAgICAgICAgICAvLyBBZGRpdGlvbmFsbHksIGEgaGlnaCBtZW1vcnkgbGltaXQgbWlnaHQgc3BlZWQgdXAgZGVwbG95bWVudHMuXG4gICAgICAgICAgICAgICAgbWVtb3J5TGltaXQ6IDE3OTJcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4ge2Fzc2V0LCBkZXBsb3ltZW50fTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUGF0dGVybnMgdGhhdCBtdXN0IGJlIHVwbG9hZGVkIEFGVEVSIHRoZSBuZXcgTGFtYmRhICsgaGFzaGVkIGFzc2V0cyBhcmUgaW4gcGxhY2UuXG4gICAgICAgIC8vIFRoZXNlIGFyZSBub24taGFzaGVkIFwic3dpdGNob3ZlclwiIGZpbGVzIHRoYXQgZmxpcCBjbGllbnRzIG9udG8gdGhlIG5ldyBidWlsZDpcbiAgICAgICAgLy8gICAtIGxhdGVzdC5qc29uOiBOdXh0J3Mgb3V0ZGF0ZWQtYnVpbGQgbWFuaWZlc3QgcG9pbnRlclxuICAgICAgICAvLyAgIC0gc3cuanMgLyByZWdpc3RlclNXLmpzOiBQV0Egc2VydmljZSB3b3JrZXIgYm9vdHN0cmFwOyBvbmNlIGEgY2xpZW50IHBpY2tzIHVwIHRoZVxuICAgICAgICAvLyAgICAgbmV3IHN3LmpzIGl0IHdpbGwgdHJ5IHRvIHByZWNhY2hlIHRoZSBuZXcgY2h1bmtzLCB3aGljaCBtdXN0IGFscmVhZHkgZXhpc3RcbiAgICAgICAgY29uc3QgcG9zdExhbWJkYVBhdHRlcm5zID0gbmV3IFNldChbXG4gICAgICAgICAgICAnX251eHQvYnVpbGRzL2xhdGVzdC5qc29uJyxcbiAgICAgICAgICAgICdzdy5qcycsXG4gICAgICAgICAgICAncmVnaXN0ZXJTVy5qcycsXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGNvbnN0IHBvc3RMYW1iZGFEZXBsb3ltZW50cyA9IGRlcGxveW1lbnRzLmZpbHRlcigoe2Fzc2V0fSkgPT4gcG9zdExhbWJkYVBhdHRlcm5zLmhhcyhhc3NldC5wYXR0ZXJuKSk7XG4gICAgICAgIGNvbnN0IHByZUxhbWJkYURlcGxveW1lbnRzID0gZGVwbG95bWVudHNcbiAgICAgICAgICAgIC5maWx0ZXIoKHthc3NldH0pID0+ICFwb3N0TGFtYmRhUGF0dGVybnMuaGFzKGFzc2V0LnBhdHRlcm4pKVxuICAgICAgICAgICAgLm1hcCgoe2RlcGxveW1lbnR9KSA9PiBkZXBsb3ltZW50KTtcblxuICAgICAgICBwcmVMYW1iZGFEZXBsb3ltZW50cy5mb3JFYWNoKGRlcGxveW1lbnQgPT4ge1xuICAgICAgICAgICAgdGhpcy5hcHBMYW1iZGFGdW5jdGlvbi5ub2RlLmFkZERlcGVuZGVuY3koZGVwbG95bWVudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHBvc3RMYW1iZGFEZXBsb3ltZW50cy5mb3JFYWNoKCh7ZGVwbG95bWVudH0pID0+IHtcbiAgICAgICAgICAgIHByZUxhbWJkYURlcGxveW1lbnRzLmZvckVhY2gocHJlTGFtYmRhID0+IHtcbiAgICAgICAgICAgICAgICBkZXBsb3ltZW50Lm5vZGUuYWRkRGVwZW5kZW5jeShwcmVMYW1iZGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZXBsb3ltZW50Lm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLmFwcExhbWJkYUZ1bmN0aW9uKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRlcGxveW1lbnRzLm1hcCgoe2RlcGxveW1lbnR9KSA9PiBkZXBsb3ltZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyB0aGUgaG9zdGVkIHpvbmUgYXQgd2hpY2ggdGhlIEROUyByZWNvcmRzIHNoYWxsIGJlIGNyZWF0ZWQgdG8gYWNjZXNzIHRoZSBOdXh0IGFwcCBvbiB0aGUgaW50ZXJuZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgZmluZEhvc3RlZFpvbmUocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogSUhvc3RlZFpvbmUge1xuICAgICAgICBjb25zdCBkb21haW5QYXJ0cyA9IHByb3BzLmRvbWFpbi5zcGxpdCgnLicpO1xuXG4gICAgICAgIHJldHVybiBIb3N0ZWRab25lLmZyb21Ib3N0ZWRab25lQXR0cmlidXRlcyh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWhvc3RlZC16b25lYCwge1xuICAgICAgICAgICAgaG9zdGVkWm9uZUlkOiBwcm9wcy5ob3N0ZWRab25lSWQsXG4gICAgICAgICAgICB6b25lTmFtZTogZG9tYWluUGFydHNbZG9tYWluUGFydHMubGVuZ3RoIC0gMV0sIC8vIFN1cHBvcnQgc3ViZG9tYWluc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBETlMgcmVjb3JkcyB0byBhY2Nlc3MgdGhlIE51eHQgYXBwIG9uIHRoZSBpbnRlcm5ldCB2aWEgdGhlIGN1c3RvbSBkb21haW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcHNcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlRG5zUmVjb3Jkcyhwcm9wczogTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaG9zdGVkWm9uZSA9IHRoaXMuZmluZEhvc3RlZFpvbmUocHJvcHMpO1xuICAgICAgICBjb25zdCBkbnNUYXJnZXQgPSBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyBDbG91ZEZyb250VGFyZ2V0KHRoaXMuY2RuKSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgcmVjb3JkIGZvciBJUHY0XG4gICAgICAgIG5ldyBBUmVjb3JkKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0taXB2NC1yZWNvcmRgLCB7XG4gICAgICAgICAgICByZWNvcmROYW1lOiBwcm9wcy5kb21haW4sXG4gICAgICAgICAgICB6b25lOiBob3N0ZWRab25lLFxuICAgICAgICAgICAgdGFyZ2V0OiBkbnNUYXJnZXQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIHJlY29yZCBmb3IgSVB2NlxuICAgICAgICBuZXcgQWFhYVJlY29yZCh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LWlwdjYtcmVjb3JkYCwge1xuICAgICAgICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG9tYWluLFxuICAgICAgICAgICAgem9uZTogaG9zdGVkWm9uZSxcbiAgICAgICAgICAgIHRhcmdldDogZG5zVGFyZ2V0LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2NoZWR1bGVkIHJ1bGUgdG8gcGluZyB0aGUgTnV4dCBhcHAgTGFtYmRhIGZ1bmN0aW9uIGV2ZXJ5IDUgbWludXRlcyBpbiBvcmRlciB0byBrZWVwIGl0IHdhcm1cbiAgICAgKiBhbmQgc3BlZWQgdXAgaW5pdGlhbCBTU1IgcmVxdWVzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQXBwUGluZ1J1bGUocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZha2VBcGlHYXRld2F5RXZlbnREYXRhID0ge1xuICAgICAgICAgICAgXCJ2ZXJzaW9uXCI6IFwiMi4wXCIsXG4gICAgICAgICAgICBcInJvdXRlS2V5XCI6IFwiR0VUIC97cHJveHkrfVwiLFxuICAgICAgICAgICAgXCJyYXdQYXRoXCI6IFwiL1wiLFxuICAgICAgICAgICAgXCJyYXdRdWVyeVN0cmluZ1wiOiBcIlwiLFxuICAgICAgICAgICAgXCJoZWFkZXJzXCI6IHt9LFxuICAgICAgICAgICAgXCJyZXF1ZXN0Q29udGV4dFwiOiB7XG4gICAgICAgICAgICAgICAgXCJkb21haW5OYW1lXCI6IHByb3BzLmRvbWFpbixcbiAgICAgICAgICAgICAgICBcImh0dHBcIjoge1xuICAgICAgICAgICAgICAgICAgICBcIm1ldGhvZFwiOiBcIkdFVFwiLFxuICAgICAgICAgICAgICAgICAgICBcInBhdGhcIjogXCIvXCIsXG4gICAgICAgICAgICAgICAgICAgIFwicHJvdG9jb2xcIjogXCJIVFRQLzEuMVwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIG5ldyBSdWxlKHRoaXMsIGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tcGluZ2VyLXJ1bGVgLCB7XG4gICAgICAgICAgICBydWxlTmFtZTogYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1waW5nZXJgLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGBQaW5ncyB0aGUgTGFtYmRhIGZ1bmN0aW9uIG9mIHRoZSAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0gYXBwIGV2ZXJ5IDUgbWludXRlcyB0byBrZWVwIGl0IHdhcm0uYCxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICBzY2hlZHVsZTogU2NoZWR1bGUucmF0ZShEdXJhdGlvbi5taW51dGVzKDUpKSxcbiAgICAgICAgICAgIHRhcmdldHM6IFtuZXcgTGFtYmRhRnVuY3Rpb24odGhpcy5hcHBMYW1iZGFGdW5jdGlvbiwge1xuICAgICAgICAgICAgICAgIGV2ZW50OiBSdWxlVGFyZ2V0SW5wdXQuZnJvbU9iamVjdChmYWtlQXBpR2F0ZXdheUV2ZW50RGF0YSlcbiAgICAgICAgICAgIH0pXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2NoZWR1bGVkIHJ1bGUgdGhhdCBydW5zIGV2ZXJ5IFR1ZXNkYXkgYXQgMDM6MzAgQU0gR01UIHRvIHRyaWdnZXJcbiAgICAgKiBvdXIgY2xlYW51cCBMYW1iZGEgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlQ2xlYW51cFRyaWdnZXJSdWxlKCk6IHZvaWQge1xuICAgICAgICBuZXcgUnVsZSh0aGlzLCBgJHt0aGlzLnJlc291cmNlSWRQcmVmaXh9LXNjaGVkdWxlci1ydWxlYCwge1xuICAgICAgICAgICAgcnVsZU5hbWU6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tc2NoZWR1bGVyYCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgVHJpZ2dlcnMgYSBjbGVhbnVwIG9mIHRoZSBvdXRkYXRlZCBzdGF0aWMgYXNzZXRzIGF0IHRoZSAke3RoaXMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWV9IFMzIGJ1Y2tldC5gLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIHNjaGVkdWxlOiBTY2hlZHVsZS5jcm9uKHt3ZWVrRGF5OiAnMicsIGhvdXI6ICczJywgbWludXRlOiAnMzAnfSksXG4gICAgICAgICAgICB0YXJnZXRzOiBbbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMuY2xlYW51cExhbWJkYUZ1bmN0aW9uKV0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBTMyBidWNrZXQgdG8gc3RvcmUgdGhlIGFjY2VzcyBsb2dzIG9mIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUFjY2Vzc0xvZ3NCdWNrZXQoKTogQnVja2V0IHtcbiAgICAgICAgY29uc3QgYnVja2V0TmFtZSA9IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYWNjZXNzLWxvZ3NgO1xuICAgICAgICBjb25zdCBidWNrZXQgPSBuZXcgQnVja2V0KHRoaXMsIGJ1Y2tldE5hbWUsIHtcbiAgICAgICAgICAgIGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICBibG9ja1B1YmxpY0FjY2VzczogQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgICAgICAgb2JqZWN0T3duZXJzaGlwOiBPYmplY3RPd25lcnNoaXAuQlVDS0VUX09XTkVSX1BSRUZFUlJFRCxcbiAgICAgICAgICAgIC8vIFdoZW4gdGhlIHN0YWNrIGlzIGRlc3Ryb3llZCwgd2UgZXhwZWN0IGV2ZXJ5dGhpbmcgdG8gYmUgZGVsZXRlZFxuICAgICAgICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJ1Y2tldC5ncmFudFJlYWRXcml0ZSh0aGlzLmNkbkFjY2Vzc0lkZW50aXR5KTtcblxuICAgICAgICByZXR1cm4gYnVja2V0O1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBjcmVhdGVBY2Nlc3NMb2dzQW5hbHlzaXMocHJvcHM6IE51eHRTZXJ2ZXJBcHBTdGFja1Byb3BzKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5hY2Nlc3NMb2dzQnVja2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjY2VzcyBidWNrZXQgbm90IHNldCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBDbG91ZEZyb250QWNjZXNzTG9nc0FuYWx5c2lzIH0gPSByZXF1aXJlKCcuLi9hY2Nlc3MtbG9ncy1hbmFseXNpcy9DbG91ZEZyb250QWNjZXNzTG9nc0FuYWx5c2lzJyk7XG5cbiAgICAgICAgbmV3IENsb3VkRnJvbnRBY2Nlc3NMb2dzQW5hbHlzaXModGhpcywgYCR7dGhpcy5yZXNvdXJjZUlkUHJlZml4fS1hY2Nlc3MtbG9ncy1hbmFseXNpc2AsIHtcbiAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5hY2Nlc3NMb2dzQnVja2V0LFxuICAgICAgICAgICAgcmVzb3VyY2VQcmVmaXg6IGAke3RoaXMucmVzb3VyY2VJZFByZWZpeH0tYWNjZXNzLWxvZ3NgLFxuICAgICAgICAgICAgYWNjZXNzTG9nQ29va2llczogcHJvcHMuYWNjZXNzTG9nQ29va2llcyxcbiAgICAgICAgICAgIGFub255bWl6ZUNsaWVudElwOiBwcm9wcy5hbm9ueW1pemVBY2Nlc3NMb2dDbGllbnRJcCA/PyB0cnVlLFxuICAgICAgICAgICAgZXhwaXJlUmF3TG9nc0FmdGVyOiBwcm9wcy5hY2Nlc3NMb2dzUmF3UmV0ZW50aW9uLFxuICAgICAgICAgICAgZXhwaXJlSW50ZXJtZWRpYXRlTG9nc0FmdGVyOiBwcm9wcy5hY2Nlc3NMb2dzSW50ZXJtZWRpYXRlUmV0ZW50aW9uLFxuICAgICAgICAgICAgZXhwaXJlVHJhbnNmb3JtZWRMb2dzQWZ0ZXI6IHByb3BzLmFjY2Vzc0xvZ3NUcmFuc2Zvcm1lZFJldGVudGlvbixcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
@@ -46,6 +46,18 @@ import {DomainName, EndpointType, HttpApi, HttpMethod, SecurityPolicy} from "aws
46
46
  * CDK stack to deploy a dynamic Nuxt app (target=server) on AWS with Lambda, ApiGateway, S3 and CloudFront.
47
47
  */
48
48
  export class NuxtServerAppStack extends Stack {
49
+ /**
50
+ * The static asset pattern whose post-Lambda {@link BucketDeployment} acts as the carrier for
51
+ * consumer-supplied CloudFront invalidations (via {@link NuxtServerAppStackProps.invalidatePathsOnDeploy}).
52
+ *
53
+ * We attach {@link BucketDeployment.distributionPaths} to this specific deployment so that:
54
+ * - CDK reuses its built-in CloudFront invalidation mechanism (no new construct types),
55
+ * - the invalidation fires AFTER the new Lambda and hashed assets are in place, since this
56
+ * deployment is already part of the post-Lambda deployment phase in {@link configureDeployments},
57
+ * - the files managed by {@link StaticAssetConfig} entries themselves are never invalidated
58
+ * (they are either build-hashed immutable assets or served with `s-maxage=0, must-revalidate`).
59
+ */
60
+ private static readonly CONSUMER_INVALIDATION_CARRIER_PATTERN = '_nuxt/builds/latest.json';
49
61
 
50
62
  /**
51
63
  * The identifier prefix of the resources created by the stack.
@@ -62,6 +74,13 @@ export class NuxtServerAppStack extends Stack {
62
74
  */
63
75
  private readonly deploymentRevision: string;
64
76
 
77
+ /**
78
+ * Additional CloudFront paths to invalidate after a deployment.
79
+ *
80
+ * @private
81
+ */
82
+ private readonly deployInvalidationPaths: string[];
83
+
65
84
  /**
66
85
  * The identity to use for accessing the deployment assets on S3.
67
86
  *
@@ -155,6 +174,7 @@ export class NuxtServerAppStack extends Stack {
155
174
 
156
175
  // Nuxt app resources
157
176
  this.deploymentRevision = this.createDeploymentRevision(props);
177
+ this.deployInvalidationPaths = this.normalizeInvalidationPaths(props.invalidatePathsOnDeploy);
158
178
  this.staticAssetConfigs = getNuxtAppStaticAssetConfigs(props.rootDir ?? '.');
159
179
  this.cdnAccessIdentity = this.createCdnAccessIdentity();
160
180
  this.staticAssetsBucket = this.createStaticAssetsBucket();
@@ -404,6 +424,22 @@ export class NuxtServerAppStack extends Stack {
404
424
  });
405
425
  }
406
426
 
427
+ /**
428
+ * Normalizes CloudFront invalidation paths by trimming whitespace, ensuring a leading slash, and removing duplicates.
429
+ *
430
+ * @private
431
+ */
432
+ private normalizeInvalidationPaths(paths: string[] | undefined): string[] {
433
+ return Array.from(
434
+ new Set(
435
+ (paths ?? [])
436
+ .map(path => path.trim())
437
+ .filter((path): path is string => path.length > 0)
438
+ .map(path => path.startsWith('/') ? path : `/${path}`)
439
+ )
440
+ );
441
+ }
442
+
407
443
  /**
408
444
  * Creates the CloudFront distribution behavior origin to route incoming requests to the Nuxt render Lambda function (via API gateway).
409
445
  */
@@ -647,9 +683,17 @@ export class NuxtServerAppStack extends Stack {
647
683
  removalPolicy: RemovalPolicy.DESTROY,
648
684
  });
649
685
 
650
- // Returns a deployment for every configured static asset type to respect the different cache settings
651
- return this.staticAssetConfigs.filter(asset => existsSync(asset.source)).map((asset, assetIndex) => {
652
- return new BucketDeployment(this, `${this.resourceIdPrefix}-assets-deployment-${assetIndex}`, {
686
+ // Returns a deployment for every configured static asset type to respect the different cache settings.
687
+ // Consumer-supplied CloudFront invalidation paths (props.invalidatePathsOnDeploy) are attached to a
688
+ // single, specific deployment — the "carrier" identified by CONSUMER_INVALIDATION_CARRIER_PATTERN —
689
+ // so the invalidation piggybacks on CDK's existing BucketDeployment invalidation mechanism while
690
+ // firing at the correct point in the deployment phase (see the post-Lambda logic below).
691
+ const hasConsumerInvalidations = this.deployInvalidationPaths.length > 0;
692
+ const deployments = this.staticAssetConfigs.filter(asset => existsSync(asset.source)).map((asset, assetIndex) => {
693
+ const isInvalidationCarrier = asset.pattern === NuxtServerAppStack.CONSUMER_INVALIDATION_CARRIER_PATTERN;
694
+ const attachConsumerInvalidations = isInvalidationCarrier && hasConsumerInvalidations;
695
+
696
+ const deployment = new BucketDeployment(this, `${this.resourceIdPrefix}-assets-deployment-${assetIndex}`, {
653
697
  sources: [Source.asset(asset.source, {
654
698
  exclude: asset.exclude,
655
699
  })],
@@ -661,8 +705,8 @@ export class NuxtServerAppStack extends Stack {
661
705
  include: [asset.pattern],
662
706
  cacheControl: asset.cacheControl,
663
707
  contentType: asset.contentType,
664
- distribution: asset.invalidateOnChange ? this.cdn : undefined,
665
- distributionPaths: asset.invalidateOnChange ? [`/${asset.pattern}`] : undefined,
708
+ distribution: attachConsumerInvalidations ? this.cdn : undefined,
709
+ distributionPaths: attachConsumerInvalidations ? this.deployInvalidationPaths : undefined,
666
710
  logGroup: logGroup,
667
711
 
668
712
  metadata: {
@@ -673,8 +717,39 @@ export class NuxtServerAppStack extends Stack {
673
717
  // Some Nuxt applications have a lot of assets to deploy whereby the function might run out of memory.
674
718
  // Additionally, a high memory limit might speed up deployments.
675
719
  memoryLimit: 1792
676
- })
720
+ });
721
+
722
+ return {asset, deployment};
677
723
  });
724
+
725
+ // Patterns that must be uploaded AFTER the new Lambda + hashed assets are in place.
726
+ // These are non-hashed "switchover" files that flip clients onto the new build:
727
+ // - latest.json: Nuxt's outdated-build manifest pointer
728
+ // - sw.js / registerSW.js: PWA service worker bootstrap; once a client picks up the
729
+ // new sw.js it will try to precache the new chunks, which must already exist
730
+ const postLambdaPatterns = new Set([
731
+ '_nuxt/builds/latest.json',
732
+ 'sw.js',
733
+ 'registerSW.js',
734
+ ]);
735
+
736
+ const postLambdaDeployments = deployments.filter(({asset}) => postLambdaPatterns.has(asset.pattern));
737
+ const preLambdaDeployments = deployments
738
+ .filter(({asset}) => !postLambdaPatterns.has(asset.pattern))
739
+ .map(({deployment}) => deployment);
740
+
741
+ preLambdaDeployments.forEach(deployment => {
742
+ this.appLambdaFunction.node.addDependency(deployment);
743
+ });
744
+
745
+ postLambdaDeployments.forEach(({deployment}) => {
746
+ preLambdaDeployments.forEach(preLambda => {
747
+ deployment.node.addDependency(preLambda);
748
+ });
749
+ deployment.node.addDependency(this.appLambdaFunction);
750
+ });
751
+
752
+ return deployments.map(({deployment}) => deployment);
678
753
  }
679
754
 
680
755
  /**
@@ -130,6 +130,14 @@ export interface NuxtServerAppStackProps extends NuxtAppStackProps {
130
130
  * Defaults to 30 days.
131
131
  */
132
132
  readonly outdatedAssetsRetentionDays?: number;
133
+ /**
134
+ * CloudFront paths to invalidate after each deployment.
135
+ * Useful for long-lived cached HTML or shared shell responses that should switch to the new deployment immediately
136
+ * while keeping immutable `/_nuxt/*` assets cached for a long time.
137
+ *
138
+ * Example: `['/login', '/register']`
139
+ */
140
+ readonly invalidatePathsOnDeploy?: string[];
133
141
  /**
134
142
  * An array of HTTP headers to forward to the Nuxt app on origin requests without affecting the cache key at CloudFront edge locations.
135
143
  * This should only be used for headers that do not affect the response.
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJOdXh0U2VydmVyQXBwU3RhY2tQcm9wcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt0eXBlIE51eHRBcHBTdGFja1Byb3BzfSBmcm9tIFwiLi4vTnV4dEFwcFN0YWNrUHJvcHNcIjtcbmltcG9ydCB7RHVyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtGdW5jdGlvbkNvZGUsIEZ1bmN0aW9uRXZlbnRUeXBlLCBJQ2FjaGVQb2xpY3l9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiO1xuXG4vKipcbiAqIERlZmluZXMgYSBjdXN0b20gQ2xvdWRGcm9udCBiZWhhdmlvciBhdHRhY2hlZCB0byBhIHNwZWNpZmljIHBhdGggcGF0dGVybiB0YXJnZXRpbmcgdGhlIE51eHQgYXBwIG9yaWdpbi5cbiAqIFVzZSB0aGlzIHRvIG92ZXJyaWRlIHRoZSBjYWNoZSBwb2xpY3kgYW5kL29yIGF0dGFjaCBhIENsb3VkRnJvbnQgRnVuY3Rpb24gZm9yIHNwZWNpZmljIHJvdXRlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdXh0Q2xvdWRGcm9udEJlaGF2aW9yIHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiBiZWhhdmlvciBwYXRoIHBhdHRlcm4gdG8gd2hpY2ggdGhpcyBiZWhhdmlvciBzaGFsbCBiZSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgJy9wb3N0cy8qJ1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHBhdGhQYXR0ZXJuOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29kZSBvZiB0aGUgQ2xvdWRGcm9udCBGdW5jdGlvbiB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGJlaGF2aW9yLlxuICAgICAqIFRoZSBzdGFjayB3aWxsIGNyZWF0ZSB0aGUgQ2xvdWRGcm9udCBGdW5jdGlvbiByZXNvdXJjZSBpbnRlcm5hbGx5LlxuICAgICAqIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgb24gVklFV0VSX1JFUVVFU1QgZXZlbnRzIGJ5IGRlZmF1bHQuXG4gICAgICogSWYgb21pdHRlZCwgbm8gQ2xvdWRGcm9udCBGdW5jdGlvbiBpcyBhdHRhY2hlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGltcG9ydCB7IEZ1bmN0aW9uQ29kZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250JztcbiAgICAgKlxuICAgICAqIGZuQ29kZTogRnVuY3Rpb25Db2RlLmZyb21JbmxpbmUoYFxuICAgICAqICAgZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgICAqICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7XG4gICAgICogICAgIHJlcXVlc3QudXJpID0gcmVxdWVzdC51cmkucmVwbGFjZSgvXFwvKyQvLCAnJykgfHwgJy8nO1xuICAgICAqICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICAgKiAgIH1cbiAgICAgKiBgKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZuQ29kZT86IEZ1bmN0aW9uQ29kZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCB0eXBlIGF0IHdoaWNoIHRoZSBDbG91ZEZyb250IEZ1bmN0aW9uIHNoYWxsIGJlIGludm9rZWQuXG4gICAgICogT25seSByZWxldmFudCB3aGVuIHtAbGluayBmbkNvZGV9IGlzIHNwZWNpZmllZC5cbiAgICAgKiBEZWZhdWx0cyB0byB7QGxpbmsgRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1R9LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGV2ZW50VHlwZT86IEZ1bmN0aW9uRXZlbnRUeXBlO1xuXG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgY2FjaGUgcG9saWN5IHRvIHVzZSBmb3IgdGhpcyBiZWhhdmlvci5cbiAgICAgKiBGYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0IE51eHQgYXBwIGNhY2hlIHBvbGljeSBpZiBub3Qgc3BlY2lmaWVkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNhY2hlUG9saWN5PzogSUNhY2hlUG9saWN5O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHByb3BzIHJlcXVpcmVkIGZvciB0aGUge0BzZWUgTnV4dFNlcnZlckFwcFN0YWNrfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyBleHRlbmRzIE51eHRBcHBTdGFja1Byb3BzIHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBBUk4gb2YgdGhlIGNlcnRpZmljYXRlIHRvIHVzZSBhdCB0aGUgQXBpR2F0ZXdheSBmb3IgdGhlIE51eHQgYXBwIHRvIG1ha2UgaXQgYWNjZXNzaWJsZSB2aWEgdGhlIGN1c3RvbSBkb21haW5cbiAgICAgKiBhbmQgdG8gcHJvdmlkZSB0aGUgY3VzdG9tIGRvbWFpbiB0byB0aGUgTnV4dCBhcHAgdmlhIHRoZSAnSG9zdCcgaGVhZGVyIGZvciBzZXJ2ZXIgc2lkZSByZW5kZXJpbmcgdXNlIGNhc2VzLlxuICAgICAqIFRoZSBjZXJ0aWZpY2F0ZSBtdXN0IGJlIGlzc3VlZCBpbiB0aGUgc2FtZSByZWdpb24gYXMgc3BlY2lmaWVkIHZpYSAnZW52LnJlZ2lvbicgYXMgQXBpR2F0ZXdheSB3b3JrcyByZWdpb25hbGx5LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJlZ2lvbmFsVGxzQ2VydGlmaWNhdGVBcm46IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBmaWxlIG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKSBvZiB0aGUgTGFtYmRhIGVudHJ5cG9pbnQgd2l0aGluIHRoZSAnc2VydmVyJyBkaXJlY3RvcnkgZXhwb3J0aW5nIGEgaGFuZGxlci5cbiAgICAgKiBEZWZhdWx0cyB0byBcImluZGV4XCIuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW50cnlwb2ludD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgSlNPTiBzZXJpYWxpemVkIHN0cmluZyBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGFzcyB0byB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVudHJ5cG9pbnRFbnY/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWVtb3J5IHNpemUgdG8gYXBwbHkgdG8gdGhlIE51eHQgYXBwJ3MgTGFtYmRhLlxuICAgICAqIERlZmF1bHRzIHRvIDE3OTJNQiAob3B0aW1pemVkIGZvciBjb3N0cyBhbmQgcGVyZm9ybWFuY2UgZm9yIHN0YW5kYXJkIE51eHQgYXBwcykuXG4gICAgICovXG4gICAgcmVhZG9ubHkgbWVtb3J5U2l6ZT86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGV4ZWN1dGlvbiBkdXJhdGlvbiBmb3IgdGhlIE51eHQgYXBwJ3MgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqIEluY3JlYXNlIHRoaXMgaWYgeW91ciBhcHAgcGVyZm9ybXMgbG9uZy1ydW5uaW5nIFNTUiBvcGVyYXRpb25zIChlLmcuIGxhcmdlIGRhdGEgZmV0Y2hpbmcpLlxuICAgICAqIE5vdGU6IFRoZSBDbG91ZEZyb250IHJlYWQgdGltZW91dCBpcyBjYXBwZWQgYXQgNjAgc2Vjb25kcywgc28gdmFsdWVzIGFib3ZlIDYwIHNlY29uZHNcbiAgICAgKiBvbmx5IGJlbmVmaXQgZGlyZWN0IGludm9jYXRpb25zLCBub3QgcmVxdWVzdHMgYXJyaXZpbmcgdmlhIENsb3VkRnJvbnQuXG4gICAgICogRGVmYXVsdHMgdG8ge0BsaW5rIER1cmF0aW9uLnNlY29uZHMoMTApfS5cbiAgICAgKi9cbiAgICByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb247XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBBV1MgWC1SYXkgZm9yIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbmFibGVUcmFjaW5nPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIGEgZ2xvYmFsIFNpdGVtYXAgYnVja2V0IHdoaWNoIGlzIHBlcm1hbmVudGx5IGFjY2Vzc2libGUgdGhyb3VnaCBtdWx0aXBsZSBkZXBsb3ltZW50cy5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbmFibGVTaXRlbWFwPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIChIVFRQUyBvbmx5KSBBUEkgYWNjZXNzIHRvIHRoZSBOdXh0IGFwcCB2aWEgdGhlIGAvYXBpYCBwYXRoIHdoaWNoIHN1cHBvcnQgYWxsIEhUVFAgbWV0aG9kcy5cbiAgICAgKiBTZWUgaHR0cHM6Ly9udXh0LmNvbS9kb2NzL2d1aWRlL2RpcmVjdG9yeS1zdHJ1Y3R1cmUvc2VydmVyI3JlY2lwZXMgZm9yIGRldGFpbHMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW5hYmxlQXBpPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIHJlcG9ydGluZyBvZiBDbG91ZEZyb250IGFjY2VzcyBsb2dzIHZpYSBBdGhlbmEuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW5hYmxlQWNjZXNzTG9nc0FuYWx5c2lzPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGNvb2tpZSBuYW1lcyB0byBpbmNsdWRlIGluIHRoZSBhY2Nlc3MgbG9ncyAod2hpdGVsaXN0KS5cbiAgICAgKi9cbiAgICByZWFkb25seSBhY2Nlc3NMb2dDb29raWVzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGFub255bWl6ZSB0aGUgY2xpZW50IElQIGFkZHJlc3MgaW4gdGhlIGFjY2VzcyBsb2dzIGJ5IHJlcGxhY2luZyB0aGUgbGFzdCBvY3RldCAoSVB2NClcbiAgICAgKiBvciB0aGUgbGFzdCBncm91cCAoSVB2Nikgd2l0aCAneHh4Jy5cbiAgICAgKlxuICAgICAqICoqRFNHVk8vTGVnYWwgbm90ZToqKiBJUCBhZGRyZXNzZXMgYXJlIGNvbnNpZGVyZWQgcGVyc29uYWwgZGF0YSB1bmRlciB0aGUgR0RQUiAoY2YuIENKRVUganVkZ21lbnQgQ+KAkTU4Mi8xNCkuXG4gICAgICogSWYgeW91IHNldCB0aGlzIHRvIGBmYWxzZWAsIHlvdSBtdXN0IGVuc3VyZSBhIGxlZ2FsIGJhc2lzIHVuZGVyIEFydC4gNiBHRFBSIChlLmcuIGxlZ2l0aW1hdGUgaW50ZXJlc3QpLFxuICAgICAqIGRvY3VtZW50IGl0IGluIHlvdXIgcHJpdmFjeSBwb2xpY3ksIGFuZCBsaW1pdCB0aGUgcmV0ZW50aW9uIHBlcmlvZCB0byB3aGF0IGlzIHN0cmljdGx5IG5lY2Vzc2FyeS5cbiAgICAgKiBXaGVuIGluIGRvdWJ0LCBjb25zdWx0IGEgZGF0YSBwcm90ZWN0aW9uIG9mZmljZXIgb3IgbGVnYWwgY291bnNlbCBiZWZvcmUgZGlzYWJsaW5nIHRoaXMgb3B0aW9uLlxuICAgICAqXG4gICAgICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFub255bWl6ZUFjY2Vzc0xvZ0NsaWVudElwPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBhZnRlciB3aGljaCByYXcgKHVucHJvY2Vzc2VkKSBhY2Nlc3MgbG9ncyBhcmUgZGVsZXRlZCBmcm9tIFMzLlxuICAgICAqIERlZmF1bHRzIHRvIDcgZGF5cy5cbiAgICAgKi9cbiAgICByZWFkb25seSBhY2Nlc3NMb2dzUmF3UmV0ZW50aW9uPzogRHVyYXRpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gYWZ0ZXIgd2hpY2ggaW50ZXJtZWRpYXRlIChncm91cGVkLWJ5LWRhdGUpIGFjY2VzcyBsb2dzIGFyZSBkZWxldGVkIGZyb20gUzMuXG4gICAgICogRGVmYXVsdHMgdG8gNyBkYXlzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFjY2Vzc0xvZ3NJbnRlcm1lZGlhdGVSZXRlbnRpb24/OiBEdXJhdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBhZnRlciB3aGljaCB0cmFuc2Zvcm1lZCAoUGFycXVldCkgYWNjZXNzIGxvZ3MgYXJlIGRlbGV0ZWQgZnJvbSBTMy5cbiAgICAgKiBEZWZhdWx0cyB0byAxODAgZGF5cy5cbiAgICAgKi9cbiAgICByZWFkb25seSBhY2Nlc3NMb2dzVHJhbnNmb3JtZWRSZXRlbnRpb24/OiBEdXJhdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyB0byByZXRhaW4gc3RhdGljIGFzc2V0cyBvZiBvdXRkYXRlZCBkZXBsb3ltZW50cyBpbiB0aGUgUzMgYnVja2V0LlxuICAgICAqIFVzZWZ1bCB0byBhbGxvdyB1c2VycyB0byBzdGlsbCBhY2Nlc3Mgb2xkIGFzc2V0cyBhZnRlciBhIG5ldyBkZXBsb3ltZW50IHdoZW4gdGhleSBhcmUgc3RpbGwgYnJvd3Npbmcgb24gYW4gb2xkIHZlcnNpb24uXG4gICAgICogRGVmYXVsdHMgdG8gMzAgZGF5cy5cbiAgICAgKi9cbiAgICByZWFkb25seSBvdXRkYXRlZEFzc2V0c1JldGVudGlvbkRheXM/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBIVFRQIGhlYWRlcnMgdG8gZm9yd2FyZCB0byB0aGUgTnV4dCBhcHAgb24gb3JpZ2luIHJlcXVlc3RzIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjYWNoZSBrZXkgYXQgQ2xvdWRGcm9udCBlZGdlIGxvY2F0aW9ucy5cbiAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGhlYWRlcnMgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSByZXNwb25zZS5cbiAgICAgKlxuICAgICAqIE9ubHkgdGhlIENsb3VkZnJvbnQgZGVmYXVsdCBoZWFkZXJzIGFyZSBmb3J3YXJkZWQgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctb3JpZ2luLXJlcXVlc3RzLmh0bWx9XG4gICAgICovXG4gICAgcmVhZG9ubHkgZm9yd2FyZEhlYWRlcnM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEhUVFAgaGVhZGVycyB0byBmb3J3YXJkIHRvIHRoZSBOdXh0IGFwcCBhbmQgdG8gaW5jbHVkZSBpbiB0aGUgY2FjaGUga2V5IGZvciBvYmplY3RzIHRoYXQgYXJlIGNhY2hlZCBhdCBDbG91ZEZyb250IGVkZ2UgbG9jYXRpb25zLlxuICAgICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIGhlYWRlcnMgdGhhdCBtaWdodCBhZmZlY3QgdGhlIHJlc3BvbnNlLCBlLmcuLCAnQXV0aG9yaXphdGlvbicuXG4gICAgICpcbiAgICAgKiBPbmx5IHRoZSBDbG91ZGZyb250IGRlZmF1bHQgaGVhZGVycyBhcmUgZm9yd2FyZGVkLFxuICAgICAqIGJ1dCBubyBoZWFkZXJzIGFyZSBpbmNsdWRlZCBpbiB0aGUgY2FjaGUga2V5IGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbH1cbiAgICAgKi9cbiAgICByZWFkb25seSBjYWNoZUtleUhlYWRlcnM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGNvb2tpZXMgdG8gZm9yd2FyZCB0byB0aGUgTnV4dCBhcHAgb24gb3JpZ2luIHJlcXVlc3RzIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjYWNoZSBrZXkgYXQgQ2xvdWRGcm9udCBlZGdlIGxvY2F0aW9ucy5cbiAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNvb2tpZXMgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSByZXNwb25zZS5cbiAgICAgKlxuICAgICAqIE5vIGNvb2tpZXMgYXJlIGZvcndhcmRlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy1vcmlnaW4tcmVxdWVzdHMuaHRtbH1cbiAgICAgKi9cbiAgICByZWFkb25seSBmb3J3YXJkQ29va2llcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgY29va2llcyB0byBmb3J3YXJkIHRvIHRoZSBOdXh0IGFwcCBhbmQgdG8gaW5jbHVkZSBpbiB0aGUgY2FjaGUga2V5IGZvciBvYmplY3RzIHRoYXQgYXJlIGNhY2hlZCBhdCBDbG91ZEZyb250IGVkZ2UgbG9jYXRpb25zLlxuICAgICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIGNvb2tpZXMgdGhhdCBtaWdodCBhZmZlY3QgdGhlIHJlc3BvbnNlLCBlLmcuLCBhdXRoZW50aWNhdGlvbiBjb29raWVzLlxuICAgICAqXG4gICAgICogTm8gY29va2llcyBhcmUgZm9yd2FyZGVkIG9yIGluY2x1ZGVkIGluIHRoZSBjYWNoZSBrZXkgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctdGhlLWNhY2hlLWtleS5odG1sfVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNhY2hlS2V5Q29va2llcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcXVlcnkgcGFyYW1zIHRvIGZvcndhcmQgdG8gdGhlIE51eHQgYXBwIG9uIG9yaWdpbiByZXF1ZXN0cyB3aXRob3V0IGFmZmVjdGluZyB0aGUgY2FjaGUga2V5IGF0IENsb3VkRnJvbnQgZWRnZSBsb2NhdGlvbnMuXG4gICAgICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBxdWVyeSBwYXJhbXMgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSByZXNwb25zZSBhbmQgYXJlIHJlcXVpcmVkIG9uIFNTUiByZXF1ZXN0cy5cbiAgICAgKlxuICAgICAqIEFsbCBxdWVyeSBwYXJhbXMgYXJlIGZvcndhcmRlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy1vcmlnaW4tcmVxdWVzdHMuaHRtbH1cbiAgICAgKi9cbiAgICByZWFkb25seSBmb3J3YXJkUXVlcnlQYXJhbXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHF1ZXJ5IHBhcmFtcyB0byBmb3J3YXJkIHRvIHRoZSBOdXh0IGFwcCBhbmQgdG8gaW5jbHVkZSBpbiB0aGUgY2FjaGUga2V5IGZvciBvYmplY3RzIHRoYXQgYXJlIGNhY2hlZCBhdCBDbG91ZEZyb250IGVkZ2UgbG9jYXRpb25zLlxuICAgICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIHF1ZXJ5IHBhcmFtcyB0aGF0IGFmZmVjdCB0aGUgcmVzcG9uc2UgYW5kIGFyZSByZXF1aXJlZCBvbiBTU1IgcmVxdWVzdHMsIGUuZy4sIGZpbHRlcnMuXG4gICAgICpcbiAgICAgKiBBbGwgcXVlcnkgcGFyYW1zIGFyZSBmb3J3YXJkZWQgYW5kIGluY2x1ZGVkIGluIHRoZSBjYWNoZSBrZXkgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctdGhlLWNhY2hlLWtleS5odG1sfVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNhY2hlS2V5UXVlcnlQYXJhbXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHF1ZXJ5IHBhcmFtcyB0byBwcmV2ZW50IGZvcndhcmRpbmcgdG8gdGhlIE51eHQgYXBwIGFuZCB0byBub3QgaW5jbHVkZSBpbiB0aGUgY2FjaGUga2V5IGZvciBvYmplY3RzIHRoYXQgYXJlIGNhY2hlZCBhdCBDbG91ZEZyb250IGVkZ2UgbG9jYXRpb25zLlxuICAgICAqIFdoZW4gc2V0LCBhbGwgcXVlcnkgcGFyYW1zIHRoYXQgYXJlIG5vdCBzcGVjaWZpZWQgaW4gdGhpcyBhcnJheSB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgTnV4dCBhcHAgYW5kIGluY2x1ZGVkIGluIHRoZSBjYWNoZSBrZXkuXG4gICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgcXVlcnkgcGFyYW1zIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgcmVzcG9uc2UgYW5kIGFyZSBub3QgcmVxdWlyZWQgb24gU1NSIHJlcXVlc3RzLCBlLmcuLCAnZmJjbGlkJyBvciAndXRtX2NhbXBhaWduJy5cbiAgICAgKlxuICAgICAqIElmIGJvdGgge0BzZWUgY2FjaGVLZXlRdWVyeVBhcmFtc30gYW5kIHtAc2VlIGRlbnlDYWNoZUtleVF1ZXJ5UGFyYW1zfSBhcmUgc3BlY2lmaWVkLCB0aGUge0BzZWUgZGVueUNhY2hlS2V5UXVlcnlQYXJhbXN9IHdpbGwgYmUgaWdub3JlZC5cbiAgICAgKiBBbGwgcXVlcnkgcGFyYW1zIGFyZSBmb3J3YXJkZWQgYW5kIGluY2x1ZGVkIGluIHRoZSBjYWNoZSBrZXkgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctdGhlLWNhY2hlLWtleS5odG1sfVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRlbnlDYWNoZUtleVF1ZXJ5UGFyYW1zPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBoZWFkZXJzIHRvIHBhc3MgdG8gdGhlIE51eHQgYXBwIG9uIFNTUiByZXF1ZXN0cy5cbiAgICAgKiBUaGUgbW9yZSBoZWFkZXJzIGFyZSBwYXNzZWQsIHRoZSB3ZWFrZXIgdGhlIGNhY2hlIHBlcmZvcm1hbmNlIHdpbGwgYmUsIGFzIHRoZSBjYWNoZSBrZXlcbiAgICAgKiBpcyBiYXNlZCBvbiB0aGUgaGVhZGVycy5cbiAgICAgKiBObyBoZWFkZXJzIGFyZSBwYXNzZWQgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QHNlZSBjYWNoZUtleUhlYWRlcnN9IGluc3RlYWQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWxsb3dIZWFkZXJzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBjb29raWVzIHRvIHBhc3MgdG8gdGhlIE51eHQgYXBwIG9uIFNTUiByZXF1ZXN0cy5cbiAgICAgKiBUaGUgbW9yZSBjb29raWVzIGFyZSBwYXNzZWQsIHRoZSB3ZWFrZXIgdGhlIGNhY2hlIHBlcmZvcm1hbmNlIHdpbGwgYmUsIGFzIHRoZSBjYWNoZSBrZXlcbiAgICAgKiBpcyBiYXNlZCBvbiB0aGUgY29va2llcy5cbiAgICAgKiBObyBjb29raWVzIGFyZSBwYXNzZWQgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QHNlZSBjYWNoZUtleUNvb2tpZXN9IGluc3RlYWQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWxsb3dDb29raWVzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBxdWVyeSBwYXJhbSBrZXlzIHRvIHBhc3MgdG8gdGhlIE51eHQgYXBwIG9uIFNTUiByZXF1ZXN0cy5cbiAgICAgKiBUaGUgbW9yZSBxdWVyeSBwYXJhbXMgYXJlIHBhc3NlZCwgdGhlIHdlYWtlciB0aGUgY2FjaGUgcGVyZm9ybWFuY2Ugd2lsbCBiZSwgYXMgdGhlIGNhY2hlIGtleVxuICAgICAqIGlzIGJhc2VkIG9uIHRoZSBxdWVyeSBwYXJhbXMuXG4gICAgICogTm90ZSB0aGF0IHRoaXMgY29uZmlnIGNhbiBub3QgYmUgY29tYmluZWQgd2l0aCB7QHNlZSBkZW55UXVlcnlQYXJhbXN9LlxuICAgICAqIElmIGJvdGggYXJlIHNwZWNpZmllZCwgdGhlIHtAc2VlIGRlbnlRdWVyeVBhcmFtc30gd2lsbCBiZSBpZ25vcmVkLlxuICAgICAqIEFsbCBxdWVyeSBwYXJhbXMgYXJlIHBhc3NlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAc2VlIGNhY2hlS2V5UXVlcnlQYXJhbXN9IGluc3RlYWQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWxsb3dRdWVyeVBhcmFtcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcXVlcnkgcGFyYW0ga2V5cyB0byBkZW55IHBhc3NpbmcgdG8gdGhlIE51eHQgYXBwIG9uIFNTUiByZXF1ZXN0cy5cbiAgICAgKiBJdCBtaWdodCBiZSB1c2VmdWwgdG8gcHJldmVudCBzcGVjaWZpYyBleHRlcm5hbCBxdWVyeSBwYXJhbXMsIGUuZy4sIGZiY2xpZCwgdXRtX2NhbXBhaWduLCAuLi4sXG4gICAgICogdG8gaW1wcm92ZSBjYWNoZSBwZXJmb3JtYW5jZSwgYXMgdGhlIGNhY2hlIGtleSBpcyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHBhcmFtcy5cbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb25maWcgY2FuIG5vdCBiZSBjb21iaW5lZCB3aXRoIHtAc2VlIGFsbG93UXVlcnlQYXJhbXN9LlxuICAgICAqIElmIGJvdGggYXJlIHNwZWNpZmllZCwgdGhlIHtAc2VlIGRlbnlRdWVyeVBhcmFtc30gd2lsbCBiZSBpZ25vcmVkLlxuICAgICAqIEFsbCBxdWVyeSBwYXJhbXMgYXJlIHBhc3NlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAc2VlIGRlbnlDYWNoZUtleVF1ZXJ5UGFyYW1zfSBpbnN0ZWFkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRlbnlRdWVyeVBhcmFtcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGF0aCBwYXR0ZXJucyBmb3Igc2VydmVyIGVuZHBvaW50cyB0aGF0IHNob3VsZCBiZSByb3V0ZWQgdG8gdGhlIFNTUiBvcmlnaW4gKEFQSSBHYXRld2F5IOKGkiBMYW1iZGEpXG4gICAgICogaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBTMyBcImZpbGVcIiBiZWhhdmlvci5cbiAgICAgKiBcbiAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3Igc2VydmVyIHJvdXRlcyB0aGF0IGdlbmVyYXRlIGR5bmFtaWMgY29udGVudCBidXQgdXNlIGZpbGUtbGlrZSBVUkxzLlxuICAgICAqIEZvciBleGFtcGxlLCBgQG51eHRqcy9zaXRlbWFwYCBjcmVhdGVzIGEgYC9zaXRlbWFwLnhtbGAgZW5kcG9pbnQgdGhhdCBkeW5hbWljYWxseSBnZW5lcmF0ZXMgWE1MIGNvbnRlbnQsXG4gICAgICogYW5kIGBAbnV4dC9pbWFnZWAgdXNlcyBmaWxlLWxpa2UgVVJMcyB0byBzZXJ2ZSBkeW5hbWljYWxseSBwcm9jZXNzZWQgaW1hZ2VzLlxuICAgICAqIFxuICAgICAqIE5vdGU6IFRoaXMgaXMgZGlmZmVyZW50IGZyb20gYGVuYWJsZVNpdGVtYXBgIHdoaWNoIHNlcnZlcyBwcmUtZ2VuZXJhdGVkIHN0YXRpYyBzaXRlbWFwIGZpbGVzIGZyb20gUzMuXG4gICAgICogVXNlIGBzZXJ2ZXJSb3V0ZXNgIHdoZW4geW91IG5lZWQgdGhlIExhbWJkYSB0byBoYW5kbGUgcmVxdWVzdHMgYW5kIGdlbmVyYXRlIGNvbnRlbnQgb24tdGhlLWZseS5cbiAgICAgKiBcbiAgICAgKiBFeGFtcGxlczogYFsnL3NpdGVtYXAueG1sJywgJy9yb2JvdHMudHh0JywgJy9fX3NpdGVtYXBfXy8qJywgJy9faXB4LyonXWBcbiAgICAgKi9cbiAgICByZWFkb25seSBzZXJ2ZXJSb3V0ZXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGN1c3RvbSBDbG91ZEZyb250IGJlaGF2aW9ycyB0byBpbmplY3QgaW50byB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gZm9yIHNwZWNpZmljIHBhdGggcGF0dGVybnMgdGFyZ2V0aW5nIHRoZSBOdXh0IGFwcCBvcmlnaW4uXG4gICAgICogVXNlIHRoaXMgdG8gb3ZlcnJpZGUgdGhlIGNhY2hlIHBvbGljeSBhbmQvb3IgYXR0YWNoIGEgQ2xvdWRGcm9udCBGdW5jdGlvbiBmb3Igc3BlY2lmaWMgcm91dGVzLlxuICAgICAqXG4gICAgICogRWFjaCBlbnRyeSBjYW4gaW5kZXBlbmRlbnRseSBkZWZpbmU6XG4gICAgICogLSBBIGN1c3RvbSBjYWNoZSBwb2xpY3kgKGUuZy4sIHRvIGRpc2FibGUgY2FjaGluZyBmb3IgY2VydGFpbiBwYXRocylcbiAgICAgKiAtIEEgQ2xvdWRGcm9udCBGdW5jdGlvbiAoZS5nLiwgZm9yIFVSSSBub3JtYWxpemF0aW9uIGF0IHRoZSBlZGdlKVxuICAgICAqIC0gT3IgYm90aCBjb21iaW5lZFxuICAgICAqXG4gICAgICogVGhlIGJlaGF2aW9ycyBhcmUgYWRkZWQgdG8gdGhlIGRpc3RyaWJ1dGlvbiAqKmJlZm9yZSoqIHRoZSBzdGF0aWMtYXNzZXRzIGJlaGF2aW9ycyBhbmQgaW4gdGhlIG9yZGVyXG4gICAgICogcHJvdmlkZWQsIHNvIG1vcmUgc3BlY2lmaWMgcGF0dGVybnMgc2hvdWxkIGJlIGxpc3RlZCBmaXJzdC5cbiAgICAgKlxuICAgICAqICoqRXhhbXBsZSDigJMgY2FjaGUgcG9saWN5IG9ubHk6KipcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogaW1wb3J0IHsgQ2FjaGVQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG4gICAgICpcbiAgICAgKiBhZGRpdGlvbmFsQmVoYXZpb3JzOiBbXG4gICAgICogICB7IHBhdGhQYXR0ZXJuOiAnL2FwaS9yZWFsdGltZS8qJywgY2FjaGVQb2xpY3k6IENhY2hlUG9saWN5LkNBQ0hJTkdfRElTQUJMRUQgfSxcbiAgICAgKiBdXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiAqKkV4YW1wbGUg4oCTIENsb3VkRnJvbnQgRnVuY3Rpb24gb25seToqKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBpbXBvcnQgeyBGdW5jdGlvbiwgRnVuY3Rpb25Db2RlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuICAgICAqXG4gICAgICogY29uc3Qgbm9ybWFsaXplVXJpID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdOb3JtYWxpemVVcmknLCB7XG4gICAgICogICBjb2RlOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShgXG4gICAgICogICAgIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcbiAgICAgKiAgICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7XG4gICAgICogICAgICAgcmVxdWVzdC51cmkgPSByZXF1ZXN0LnVyaS5yZXBsYWNlKC9cXFxcLyskLywgJycpIHx8ICcvJztcbiAgICAgKiAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICAgKiAgICAgfVxuICAgICAqICAgYCksXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBhZGRpdGlvbmFsQmVoYXZpb3JzOiBbXG4gICAgICogICB7IHBhdGhQYXR0ZXJuOiAnL3VzZXJzLyonLCBmbjogbm9ybWFsaXplVXJpIH0sXG4gICAgICogXVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogKipFeGFtcGxlIOKAkyBib3RoIGNvbWJpbmVkOioqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGFkZGl0aW9uYWxCZWhhdmlvcnM6IFtcbiAgICAgKiAgIHsgcGF0aFBhdHRlcm46ICcvcG9zdHMvKicsIGZuOiBub3JtYWxpemVVcmksIGNhY2hlUG9saWN5OiBDYWNoZVBvbGljeS5DQUNISU5HX0RJU0FCTEVEIH0sXG4gICAgICogXVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFkZGl0aW9uYWxCZWhhdmlvcnM/OiBOdXh0Q2xvdWRGcm9udEJlaGF2aW9yW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgQVJOIG9mIGFuIGV4aXN0aW5nIEFXUyBXQUYgV2ViIEFDTCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCB3aXRoIGEgc2VwYXJhdGUgQ2xvdWRGcm9udFdhZlN0YWNrIGRlcGxveWVkIGluIHVzLWVhc3QtMS5cbiAgICAgKlxuICAgICAqIEV4YW1wbGU6ICdhcm46YXdzOndhZnYyOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6Z2xvYmFsL3dlYmFjbC9teS13ZWItYWNsL2ExYjJjM2Q0LTU2NzgtOTBhYi1jZGVmLUVYQU1QTEUxMTExMSdcbiAgICAgKi9cbiAgICByZWFkb25seSB3ZWJBY2xBcm4/OiBzdHJpbmc7XG59Il19
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnV4dFNlcnZlckFwcFN0YWNrUHJvcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJOdXh0U2VydmVyQXBwU3RhY2tQcm9wcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt0eXBlIE51eHRBcHBTdGFja1Byb3BzfSBmcm9tIFwiLi4vTnV4dEFwcFN0YWNrUHJvcHNcIjtcbmltcG9ydCB7RHVyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtGdW5jdGlvbkNvZGUsIEZ1bmN0aW9uRXZlbnRUeXBlLCBJQ2FjaGVQb2xpY3l9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiO1xuXG4vKipcbiAqIERlZmluZXMgYSBjdXN0b20gQ2xvdWRGcm9udCBiZWhhdmlvciBhdHRhY2hlZCB0byBhIHNwZWNpZmljIHBhdGggcGF0dGVybiB0YXJnZXRpbmcgdGhlIE51eHQgYXBwIG9yaWdpbi5cbiAqIFVzZSB0aGlzIHRvIG92ZXJyaWRlIHRoZSBjYWNoZSBwb2xpY3kgYW5kL29yIGF0dGFjaCBhIENsb3VkRnJvbnQgRnVuY3Rpb24gZm9yIHNwZWNpZmljIHJvdXRlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdXh0Q2xvdWRGcm9udEJlaGF2aW9yIHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiBiZWhhdmlvciBwYXRoIHBhdHRlcm4gdG8gd2hpY2ggdGhpcyBiZWhhdmlvciBzaGFsbCBiZSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgJy9wb3N0cy8qJ1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHBhdGhQYXR0ZXJuOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY29kZSBvZiB0aGUgQ2xvdWRGcm9udCBGdW5jdGlvbiB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGJlaGF2aW9yLlxuICAgICAqIFRoZSBzdGFjayB3aWxsIGNyZWF0ZSB0aGUgQ2xvdWRGcm9udCBGdW5jdGlvbiByZXNvdXJjZSBpbnRlcm5hbGx5LlxuICAgICAqIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgb24gVklFV0VSX1JFUVVFU1QgZXZlbnRzIGJ5IGRlZmF1bHQuXG4gICAgICogSWYgb21pdHRlZCwgbm8gQ2xvdWRGcm9udCBGdW5jdGlvbiBpcyBhdHRhY2hlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGltcG9ydCB7IEZ1bmN0aW9uQ29kZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZGZyb250JztcbiAgICAgKlxuICAgICAqIGZuQ29kZTogRnVuY3Rpb25Db2RlLmZyb21JbmxpbmUoYFxuICAgICAqICAgZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgICAqICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7XG4gICAgICogICAgIHJlcXVlc3QudXJpID0gcmVxdWVzdC51cmkucmVwbGFjZSgvXFwvKyQvLCAnJykgfHwgJy8nO1xuICAgICAqICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICAgKiAgIH1cbiAgICAgKiBgKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZuQ29kZT86IEZ1bmN0aW9uQ29kZTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCB0eXBlIGF0IHdoaWNoIHRoZSBDbG91ZEZyb250IEZ1bmN0aW9uIHNoYWxsIGJlIGludm9rZWQuXG4gICAgICogT25seSByZWxldmFudCB3aGVuIHtAbGluayBmbkNvZGV9IGlzIHNwZWNpZmllZC5cbiAgICAgKiBEZWZhdWx0cyB0byB7QGxpbmsgRnVuY3Rpb25FdmVudFR5cGUuVklFV0VSX1JFUVVFU1R9LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGV2ZW50VHlwZT86IEZ1bmN0aW9uRXZlbnRUeXBlO1xuXG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgY2FjaGUgcG9saWN5IHRvIHVzZSBmb3IgdGhpcyBiZWhhdmlvci5cbiAgICAgKiBGYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0IE51eHQgYXBwIGNhY2hlIHBvbGljeSBpZiBub3Qgc3BlY2lmaWVkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNhY2hlUG9saWN5PzogSUNhY2hlUG9saWN5O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHByb3BzIHJlcXVpcmVkIGZvciB0aGUge0BzZWUgTnV4dFNlcnZlckFwcFN0YWNrfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdXh0U2VydmVyQXBwU3RhY2tQcm9wcyBleHRlbmRzIE51eHRBcHBTdGFja1Byb3BzIHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBBUk4gb2YgdGhlIGNlcnRpZmljYXRlIHRvIHVzZSBhdCB0aGUgQXBpR2F0ZXdheSBmb3IgdGhlIE51eHQgYXBwIHRvIG1ha2UgaXQgYWNjZXNzaWJsZSB2aWEgdGhlIGN1c3RvbSBkb21haW5cbiAgICAgKiBhbmQgdG8gcHJvdmlkZSB0aGUgY3VzdG9tIGRvbWFpbiB0byB0aGUgTnV4dCBhcHAgdmlhIHRoZSAnSG9zdCcgaGVhZGVyIGZvciBzZXJ2ZXIgc2lkZSByZW5kZXJpbmcgdXNlIGNhc2VzLlxuICAgICAqIFRoZSBjZXJ0aWZpY2F0ZSBtdXN0IGJlIGlzc3VlZCBpbiB0aGUgc2FtZSByZWdpb24gYXMgc3BlY2lmaWVkIHZpYSAnZW52LnJlZ2lvbicgYXMgQXBpR2F0ZXdheSB3b3JrcyByZWdpb25hbGx5LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJlZ2lvbmFsVGxzQ2VydGlmaWNhdGVBcm46IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBmaWxlIG5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKSBvZiB0aGUgTGFtYmRhIGVudHJ5cG9pbnQgd2l0aGluIHRoZSAnc2VydmVyJyBkaXJlY3RvcnkgZXhwb3J0aW5nIGEgaGFuZGxlci5cbiAgICAgKiBEZWZhdWx0cyB0byBcImluZGV4XCIuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW50cnlwb2ludD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgSlNPTiBzZXJpYWxpemVkIHN0cmluZyBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGFzcyB0byB0aGUgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVudHJ5cG9pbnRFbnY/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbWVtb3J5IHNpemUgdG8gYXBwbHkgdG8gdGhlIE51eHQgYXBwJ3MgTGFtYmRhLlxuICAgICAqIERlZmF1bHRzIHRvIDE3OTJNQiAob3B0aW1pemVkIGZvciBjb3N0cyBhbmQgcGVyZm9ybWFuY2UgZm9yIHN0YW5kYXJkIE51eHQgYXBwcykuXG4gICAgICovXG4gICAgcmVhZG9ubHkgbWVtb3J5U2l6ZT86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGV4ZWN1dGlvbiBkdXJhdGlvbiBmb3IgdGhlIE51eHQgYXBwJ3MgTGFtYmRhIGZ1bmN0aW9uLlxuICAgICAqIEluY3JlYXNlIHRoaXMgaWYgeW91ciBhcHAgcGVyZm9ybXMgbG9uZy1ydW5uaW5nIFNTUiBvcGVyYXRpb25zIChlLmcuIGxhcmdlIGRhdGEgZmV0Y2hpbmcpLlxuICAgICAqIE5vdGU6IFRoZSBDbG91ZEZyb250IHJlYWQgdGltZW91dCBpcyBjYXBwZWQgYXQgNjAgc2Vjb25kcywgc28gdmFsdWVzIGFib3ZlIDYwIHNlY29uZHNcbiAgICAgKiBvbmx5IGJlbmVmaXQgZGlyZWN0IGludm9jYXRpb25zLCBub3QgcmVxdWVzdHMgYXJyaXZpbmcgdmlhIENsb3VkRnJvbnQuXG4gICAgICogRGVmYXVsdHMgdG8ge0BsaW5rIER1cmF0aW9uLnNlY29uZHMoMTApfS5cbiAgICAgKi9cbiAgICByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb247XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBBV1MgWC1SYXkgZm9yIHRoZSBOdXh0IExhbWJkYSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbmFibGVUcmFjaW5nPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIGEgZ2xvYmFsIFNpdGVtYXAgYnVja2V0IHdoaWNoIGlzIHBlcm1hbmVudGx5IGFjY2Vzc2libGUgdGhyb3VnaCBtdWx0aXBsZSBkZXBsb3ltZW50cy5cbiAgICAgKi9cbiAgICByZWFkb25seSBlbmFibGVTaXRlbWFwPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIChIVFRQUyBvbmx5KSBBUEkgYWNjZXNzIHRvIHRoZSBOdXh0IGFwcCB2aWEgdGhlIGAvYXBpYCBwYXRoIHdoaWNoIHN1cHBvcnQgYWxsIEhUVFAgbWV0aG9kcy5cbiAgICAgKiBTZWUgaHR0cHM6Ly9udXh0LmNvbS9kb2NzL2d1aWRlL2RpcmVjdG9yeS1zdHJ1Y3R1cmUvc2VydmVyI3JlY2lwZXMgZm9yIGRldGFpbHMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW5hYmxlQXBpPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIHJlcG9ydGluZyBvZiBDbG91ZEZyb250IGFjY2VzcyBsb2dzIHZpYSBBdGhlbmEuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW5hYmxlQWNjZXNzTG9nc0FuYWx5c2lzPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGNvb2tpZSBuYW1lcyB0byBpbmNsdWRlIGluIHRoZSBhY2Nlc3MgbG9ncyAod2hpdGVsaXN0KS5cbiAgICAgKi9cbiAgICByZWFkb25seSBhY2Nlc3NMb2dDb29raWVzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGFub255bWl6ZSB0aGUgY2xpZW50IElQIGFkZHJlc3MgaW4gdGhlIGFjY2VzcyBsb2dzIGJ5IHJlcGxhY2luZyB0aGUgbGFzdCBvY3RldCAoSVB2NClcbiAgICAgKiBvciB0aGUgbGFzdCBncm91cCAoSVB2Nikgd2l0aCAneHh4Jy5cbiAgICAgKlxuICAgICAqICoqRFNHVk8vTGVnYWwgbm90ZToqKiBJUCBhZGRyZXNzZXMgYXJlIGNvbnNpZGVyZWQgcGVyc29uYWwgZGF0YSB1bmRlciB0aGUgR0RQUiAoY2YuIENKRVUganVkZ21lbnQgQ+KAkTU4Mi8xNCkuXG4gICAgICogSWYgeW91IHNldCB0aGlzIHRvIGBmYWxzZWAsIHlvdSBtdXN0IGVuc3VyZSBhIGxlZ2FsIGJhc2lzIHVuZGVyIEFydC4gNiBHRFBSIChlLmcuIGxlZ2l0aW1hdGUgaW50ZXJlc3QpLFxuICAgICAqIGRvY3VtZW50IGl0IGluIHlvdXIgcHJpdmFjeSBwb2xpY3ksIGFuZCBsaW1pdCB0aGUgcmV0ZW50aW9uIHBlcmlvZCB0byB3aGF0IGlzIHN0cmljdGx5IG5lY2Vzc2FyeS5cbiAgICAgKiBXaGVuIGluIGRvdWJ0LCBjb25zdWx0IGEgZGF0YSBwcm90ZWN0aW9uIG9mZmljZXIgb3IgbGVnYWwgY291bnNlbCBiZWZvcmUgZGlzYWJsaW5nIHRoaXMgb3B0aW9uLlxuICAgICAqXG4gICAgICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFub255bWl6ZUFjY2Vzc0xvZ0NsaWVudElwPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBhZnRlciB3aGljaCByYXcgKHVucHJvY2Vzc2VkKSBhY2Nlc3MgbG9ncyBhcmUgZGVsZXRlZCBmcm9tIFMzLlxuICAgICAqIERlZmF1bHRzIHRvIDcgZGF5cy5cbiAgICAgKi9cbiAgICByZWFkb25seSBhY2Nlc3NMb2dzUmF3UmV0ZW50aW9uPzogRHVyYXRpb247XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gYWZ0ZXIgd2hpY2ggaW50ZXJtZWRpYXRlIChncm91cGVkLWJ5LWRhdGUpIGFjY2VzcyBsb2dzIGFyZSBkZWxldGVkIGZyb20gUzMuXG4gICAgICogRGVmYXVsdHMgdG8gNyBkYXlzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFjY2Vzc0xvZ3NJbnRlcm1lZGlhdGVSZXRlbnRpb24/OiBEdXJhdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBhZnRlciB3aGljaCB0cmFuc2Zvcm1lZCAoUGFycXVldCkgYWNjZXNzIGxvZ3MgYXJlIGRlbGV0ZWQgZnJvbSBTMy5cbiAgICAgKiBEZWZhdWx0cyB0byAxODAgZGF5cy5cbiAgICAgKi9cbiAgICByZWFkb25seSBhY2Nlc3NMb2dzVHJhbnNmb3JtZWRSZXRlbnRpb24/OiBEdXJhdGlvbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyB0byByZXRhaW4gc3RhdGljIGFzc2V0cyBvZiBvdXRkYXRlZCBkZXBsb3ltZW50cyBpbiB0aGUgUzMgYnVja2V0LlxuICAgICAqIFVzZWZ1bCB0byBhbGxvdyB1c2VycyB0byBzdGlsbCBhY2Nlc3Mgb2xkIGFzc2V0cyBhZnRlciBhIG5ldyBkZXBsb3ltZW50IHdoZW4gdGhleSBhcmUgc3RpbGwgYnJvd3Npbmcgb24gYW4gb2xkIHZlcnNpb24uXG4gICAgICogRGVmYXVsdHMgdG8gMzAgZGF5cy5cbiAgICAgKi9cbiAgICByZWFkb25seSBvdXRkYXRlZEFzc2V0c1JldGVudGlvbkRheXM/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBDbG91ZEZyb250IHBhdGhzIHRvIGludmFsaWRhdGUgYWZ0ZXIgZWFjaCBkZXBsb3ltZW50LlxuICAgICAqIFVzZWZ1bCBmb3IgbG9uZy1saXZlZCBjYWNoZWQgSFRNTCBvciBzaGFyZWQgc2hlbGwgcmVzcG9uc2VzIHRoYXQgc2hvdWxkIHN3aXRjaCB0byB0aGUgbmV3IGRlcGxveW1lbnQgaW1tZWRpYXRlbHlcbiAgICAgKiB3aGlsZSBrZWVwaW5nIGltbXV0YWJsZSBgL19udXh0LypgIGFzc2V0cyBjYWNoZWQgZm9yIGEgbG9uZyB0aW1lLlxuICAgICAqXG4gICAgICogRXhhbXBsZTogYFsnL2xvZ2luJywgJy9yZWdpc3RlciddYFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGludmFsaWRhdGVQYXRoc09uRGVwbG95Pzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBIVFRQIGhlYWRlcnMgdG8gZm9yd2FyZCB0byB0aGUgTnV4dCBhcHAgb24gb3JpZ2luIHJlcXVlc3RzIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjYWNoZSBrZXkgYXQgQ2xvdWRGcm9udCBlZGdlIGxvY2F0aW9ucy5cbiAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGhlYWRlcnMgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSByZXNwb25zZS5cbiAgICAgKlxuICAgICAqIE9ubHkgdGhlIENsb3VkZnJvbnQgZGVmYXVsdCBoZWFkZXJzIGFyZSBmb3J3YXJkZWQgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctb3JpZ2luLXJlcXVlc3RzLmh0bWx9XG4gICAgICovXG4gICAgcmVhZG9ubHkgZm9yd2FyZEhlYWRlcnM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEhUVFAgaGVhZGVycyB0byBmb3J3YXJkIHRvIHRoZSBOdXh0IGFwcCBhbmQgdG8gaW5jbHVkZSBpbiB0aGUgY2FjaGUga2V5IGZvciBvYmplY3RzIHRoYXQgYXJlIGNhY2hlZCBhdCBDbG91ZEZyb250IGVkZ2UgbG9jYXRpb25zLlxuICAgICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIGhlYWRlcnMgdGhhdCBtaWdodCBhZmZlY3QgdGhlIHJlc3BvbnNlLCBlLmcuLCAnQXV0aG9yaXphdGlvbicuXG4gICAgICpcbiAgICAgKiBPbmx5IHRoZSBDbG91ZGZyb250IGRlZmF1bHQgaGVhZGVycyBhcmUgZm9yd2FyZGVkLFxuICAgICAqIGJ1dCBubyBoZWFkZXJzIGFyZSBpbmNsdWRlZCBpbiB0aGUgY2FjaGUga2V5IGJ5IGRlZmF1bHQuXG4gICAgICpcbiAgICAgKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2NvbnRyb2xsaW5nLXRoZS1jYWNoZS1rZXkuaHRtbH1cbiAgICAgKi9cbiAgICByZWFkb25seSBjYWNoZUtleUhlYWRlcnM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGNvb2tpZXMgdG8gZm9yd2FyZCB0byB0aGUgTnV4dCBhcHAgb24gb3JpZ2luIHJlcXVlc3RzIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjYWNoZSBrZXkgYXQgQ2xvdWRGcm9udCBlZGdlIGxvY2F0aW9ucy5cbiAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNvb2tpZXMgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSByZXNwb25zZS5cbiAgICAgKlxuICAgICAqIE5vIGNvb2tpZXMgYXJlIGZvcndhcmRlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy1vcmlnaW4tcmVxdWVzdHMuaHRtbH1cbiAgICAgKi9cbiAgICByZWFkb25seSBmb3J3YXJkQ29va2llcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgY29va2llcyB0byBmb3J3YXJkIHRvIHRoZSBOdXh0IGFwcCBhbmQgdG8gaW5jbHVkZSBpbiB0aGUgY2FjaGUga2V5IGZvciBvYmplY3RzIHRoYXQgYXJlIGNhY2hlZCBhdCBDbG91ZEZyb250IGVkZ2UgbG9jYXRpb25zLlxuICAgICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIGNvb2tpZXMgdGhhdCBtaWdodCBhZmZlY3QgdGhlIHJlc3BvbnNlLCBlLmcuLCBhdXRoZW50aWNhdGlvbiBjb29raWVzLlxuICAgICAqXG4gICAgICogTm8gY29va2llcyBhcmUgZm9yd2FyZGVkIG9yIGluY2x1ZGVkIGluIHRoZSBjYWNoZSBrZXkgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctdGhlLWNhY2hlLWtleS5odG1sfVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNhY2hlS2V5Q29va2llcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcXVlcnkgcGFyYW1zIHRvIGZvcndhcmQgdG8gdGhlIE51eHQgYXBwIG9uIG9yaWdpbiByZXF1ZXN0cyB3aXRob3V0IGFmZmVjdGluZyB0aGUgY2FjaGUga2V5IGF0IENsb3VkRnJvbnQgZWRnZSBsb2NhdGlvbnMuXG4gICAgICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBxdWVyeSBwYXJhbXMgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSByZXNwb25zZSBhbmQgYXJlIHJlcXVpcmVkIG9uIFNTUiByZXF1ZXN0cy5cbiAgICAgKlxuICAgICAqIEFsbCBxdWVyeSBwYXJhbXMgYXJlIGZvcndhcmRlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICoge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9jb250cm9sbGluZy1vcmlnaW4tcmVxdWVzdHMuaHRtbH1cbiAgICAgKi9cbiAgICByZWFkb25seSBmb3J3YXJkUXVlcnlQYXJhbXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHF1ZXJ5IHBhcmFtcyB0byBmb3J3YXJkIHRvIHRoZSBOdXh0IGFwcCBhbmQgdG8gaW5jbHVkZSBpbiB0aGUgY2FjaGUga2V5IGZvciBvYmplY3RzIHRoYXQgYXJlIGNhY2hlZCBhdCBDbG91ZEZyb250IGVkZ2UgbG9jYXRpb25zLlxuICAgICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIHF1ZXJ5IHBhcmFtcyB0aGF0IGFmZmVjdCB0aGUgcmVzcG9uc2UgYW5kIGFyZSByZXF1aXJlZCBvbiBTU1IgcmVxdWVzdHMsIGUuZy4sIGZpbHRlcnMuXG4gICAgICpcbiAgICAgKiBBbGwgcXVlcnkgcGFyYW1zIGFyZSBmb3J3YXJkZWQgYW5kIGluY2x1ZGVkIGluIHRoZSBjYWNoZSBrZXkgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctdGhlLWNhY2hlLWtleS5odG1sfVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNhY2hlS2V5UXVlcnlQYXJhbXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHF1ZXJ5IHBhcmFtcyB0byBwcmV2ZW50IGZvcndhcmRpbmcgdG8gdGhlIE51eHQgYXBwIGFuZCB0byBub3QgaW5jbHVkZSBpbiB0aGUgY2FjaGUga2V5IGZvciBvYmplY3RzIHRoYXQgYXJlIGNhY2hlZCBhdCBDbG91ZEZyb250IGVkZ2UgbG9jYXRpb25zLlxuICAgICAqIFdoZW4gc2V0LCBhbGwgcXVlcnkgcGFyYW1zIHRoYXQgYXJlIG5vdCBzcGVjaWZpZWQgaW4gdGhpcyBhcnJheSB3aWxsIGJlIGZvcndhcmRlZCB0byB0aGUgTnV4dCBhcHAgYW5kIGluY2x1ZGVkIGluIHRoZSBjYWNoZSBrZXkuXG4gICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgcXVlcnkgcGFyYW1zIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgcmVzcG9uc2UgYW5kIGFyZSBub3QgcmVxdWlyZWQgb24gU1NSIHJlcXVlc3RzLCBlLmcuLCAnZmJjbGlkJyBvciAndXRtX2NhbXBhaWduJy5cbiAgICAgKlxuICAgICAqIElmIGJvdGgge0BzZWUgY2FjaGVLZXlRdWVyeVBhcmFtc30gYW5kIHtAc2VlIGRlbnlDYWNoZUtleVF1ZXJ5UGFyYW1zfSBhcmUgc3BlY2lmaWVkLCB0aGUge0BzZWUgZGVueUNhY2hlS2V5UXVlcnlQYXJhbXN9IHdpbGwgYmUgaWdub3JlZC5cbiAgICAgKiBBbGwgcXVlcnkgcGFyYW1zIGFyZSBmb3J3YXJkZWQgYW5kIGluY2x1ZGVkIGluIHRoZSBjYWNoZSBrZXkgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvY29udHJvbGxpbmctdGhlLWNhY2hlLWtleS5odG1sfVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRlbnlDYWNoZUtleVF1ZXJ5UGFyYW1zPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBoZWFkZXJzIHRvIHBhc3MgdG8gdGhlIE51eHQgYXBwIG9uIFNTUiByZXF1ZXN0cy5cbiAgICAgKiBUaGUgbW9yZSBoZWFkZXJzIGFyZSBwYXNzZWQsIHRoZSB3ZWFrZXIgdGhlIGNhY2hlIHBlcmZvcm1hbmNlIHdpbGwgYmUsIGFzIHRoZSBjYWNoZSBrZXlcbiAgICAgKiBpcyBiYXNlZCBvbiB0aGUgaGVhZGVycy5cbiAgICAgKiBObyBoZWFkZXJzIGFyZSBwYXNzZWQgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QHNlZSBjYWNoZUtleUhlYWRlcnN9IGluc3RlYWQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWxsb3dIZWFkZXJzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBjb29raWVzIHRvIHBhc3MgdG8gdGhlIE51eHQgYXBwIG9uIFNTUiByZXF1ZXN0cy5cbiAgICAgKiBUaGUgbW9yZSBjb29raWVzIGFyZSBwYXNzZWQsIHRoZSB3ZWFrZXIgdGhlIGNhY2hlIHBlcmZvcm1hbmNlIHdpbGwgYmUsIGFzIHRoZSBjYWNoZSBrZXlcbiAgICAgKiBpcyBiYXNlZCBvbiB0aGUgY29va2llcy5cbiAgICAgKiBObyBjb29raWVzIGFyZSBwYXNzZWQgYnkgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QHNlZSBjYWNoZUtleUNvb2tpZXN9IGluc3RlYWQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWxsb3dDb29raWVzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBxdWVyeSBwYXJhbSBrZXlzIHRvIHBhc3MgdG8gdGhlIE51eHQgYXBwIG9uIFNTUiByZXF1ZXN0cy5cbiAgICAgKiBUaGUgbW9yZSBxdWVyeSBwYXJhbXMgYXJlIHBhc3NlZCwgdGhlIHdlYWtlciB0aGUgY2FjaGUgcGVyZm9ybWFuY2Ugd2lsbCBiZSwgYXMgdGhlIGNhY2hlIGtleVxuICAgICAqIGlzIGJhc2VkIG9uIHRoZSBxdWVyeSBwYXJhbXMuXG4gICAgICogTm90ZSB0aGF0IHRoaXMgY29uZmlnIGNhbiBub3QgYmUgY29tYmluZWQgd2l0aCB7QHNlZSBkZW55UXVlcnlQYXJhbXN9LlxuICAgICAqIElmIGJvdGggYXJlIHNwZWNpZmllZCwgdGhlIHtAc2VlIGRlbnlRdWVyeVBhcmFtc30gd2lsbCBiZSBpZ25vcmVkLlxuICAgICAqIEFsbCBxdWVyeSBwYXJhbXMgYXJlIHBhc3NlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAc2VlIGNhY2hlS2V5UXVlcnlQYXJhbXN9IGluc3RlYWQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWxsb3dRdWVyeVBhcmFtcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcXVlcnkgcGFyYW0ga2V5cyB0byBkZW55IHBhc3NpbmcgdG8gdGhlIE51eHQgYXBwIG9uIFNTUiByZXF1ZXN0cy5cbiAgICAgKiBJdCBtaWdodCBiZSB1c2VmdWwgdG8gcHJldmVudCBzcGVjaWZpYyBleHRlcm5hbCBxdWVyeSBwYXJhbXMsIGUuZy4sIGZiY2xpZCwgdXRtX2NhbXBhaWduLCAuLi4sXG4gICAgICogdG8gaW1wcm92ZSBjYWNoZSBwZXJmb3JtYW5jZSwgYXMgdGhlIGNhY2hlIGtleSBpcyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHBhcmFtcy5cbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb25maWcgY2FuIG5vdCBiZSBjb21iaW5lZCB3aXRoIHtAc2VlIGFsbG93UXVlcnlQYXJhbXN9LlxuICAgICAqIElmIGJvdGggYXJlIHNwZWNpZmllZCwgdGhlIHtAc2VlIGRlbnlRdWVyeVBhcmFtc30gd2lsbCBiZSBpZ25vcmVkLlxuICAgICAqIEFsbCBxdWVyeSBwYXJhbXMgYXJlIHBhc3NlZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAc2VlIGRlbnlDYWNoZUtleVF1ZXJ5UGFyYW1zfSBpbnN0ZWFkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRlbnlRdWVyeVBhcmFtcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGF0aCBwYXR0ZXJucyBmb3Igc2VydmVyIGVuZHBvaW50cyB0aGF0IHNob3VsZCBiZSByb3V0ZWQgdG8gdGhlIFNTUiBvcmlnaW4gKEFQSSBHYXRld2F5IOKGkiBMYW1iZGEpXG4gICAgICogaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBTMyBcImZpbGVcIiBiZWhhdmlvci5cbiAgICAgKiBcbiAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3Igc2VydmVyIHJvdXRlcyB0aGF0IGdlbmVyYXRlIGR5bmFtaWMgY29udGVudCBidXQgdXNlIGZpbGUtbGlrZSBVUkxzLlxuICAgICAqIEZvciBleGFtcGxlLCBgQG51eHRqcy9zaXRlbWFwYCBjcmVhdGVzIGEgYC9zaXRlbWFwLnhtbGAgZW5kcG9pbnQgdGhhdCBkeW5hbWljYWxseSBnZW5lcmF0ZXMgWE1MIGNvbnRlbnQsXG4gICAgICogYW5kIGBAbnV4dC9pbWFnZWAgdXNlcyBmaWxlLWxpa2UgVVJMcyB0byBzZXJ2ZSBkeW5hbWljYWxseSBwcm9jZXNzZWQgaW1hZ2VzLlxuICAgICAqIFxuICAgICAqIE5vdGU6IFRoaXMgaXMgZGlmZmVyZW50IGZyb20gYGVuYWJsZVNpdGVtYXBgIHdoaWNoIHNlcnZlcyBwcmUtZ2VuZXJhdGVkIHN0YXRpYyBzaXRlbWFwIGZpbGVzIGZyb20gUzMuXG4gICAgICogVXNlIGBzZXJ2ZXJSb3V0ZXNgIHdoZW4geW91IG5lZWQgdGhlIExhbWJkYSB0byBoYW5kbGUgcmVxdWVzdHMgYW5kIGdlbmVyYXRlIGNvbnRlbnQgb24tdGhlLWZseS5cbiAgICAgKiBcbiAgICAgKiBFeGFtcGxlczogYFsnL3NpdGVtYXAueG1sJywgJy9yb2JvdHMudHh0JywgJy9fX3NpdGVtYXBfXy8qJywgJy9faXB4LyonXWBcbiAgICAgKi9cbiAgICByZWFkb25seSBzZXJ2ZXJSb3V0ZXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGN1c3RvbSBDbG91ZEZyb250IGJlaGF2aW9ycyB0byBpbmplY3QgaW50byB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gZm9yIHNwZWNpZmljIHBhdGggcGF0dGVybnMgdGFyZ2V0aW5nIHRoZSBOdXh0IGFwcCBvcmlnaW4uXG4gICAgICogVXNlIHRoaXMgdG8gb3ZlcnJpZGUgdGhlIGNhY2hlIHBvbGljeSBhbmQvb3IgYXR0YWNoIGEgQ2xvdWRGcm9udCBGdW5jdGlvbiBmb3Igc3BlY2lmaWMgcm91dGVzLlxuICAgICAqXG4gICAgICogRWFjaCBlbnRyeSBjYW4gaW5kZXBlbmRlbnRseSBkZWZpbmU6XG4gICAgICogLSBBIGN1c3RvbSBjYWNoZSBwb2xpY3kgKGUuZy4sIHRvIGRpc2FibGUgY2FjaGluZyBmb3IgY2VydGFpbiBwYXRocylcbiAgICAgKiAtIEEgQ2xvdWRGcm9udCBGdW5jdGlvbiAoZS5nLiwgZm9yIFVSSSBub3JtYWxpemF0aW9uIGF0IHRoZSBlZGdlKVxuICAgICAqIC0gT3IgYm90aCBjb21iaW5lZFxuICAgICAqXG4gICAgICogVGhlIGJlaGF2aW9ycyBhcmUgYWRkZWQgdG8gdGhlIGRpc3RyaWJ1dGlvbiAqKmJlZm9yZSoqIHRoZSBzdGF0aWMtYXNzZXRzIGJlaGF2aW9ycyBhbmQgaW4gdGhlIG9yZGVyXG4gICAgICogcHJvdmlkZWQsIHNvIG1vcmUgc3BlY2lmaWMgcGF0dGVybnMgc2hvdWxkIGJlIGxpc3RlZCBmaXJzdC5cbiAgICAgKlxuICAgICAqICoqRXhhbXBsZSDigJMgY2FjaGUgcG9saWN5IG9ubHk6KipcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogaW1wb3J0IHsgQ2FjaGVQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG4gICAgICpcbiAgICAgKiBhZGRpdGlvbmFsQmVoYXZpb3JzOiBbXG4gICAgICogICB7IHBhdGhQYXR0ZXJuOiAnL2FwaS9yZWFsdGltZS8qJywgY2FjaGVQb2xpY3k6IENhY2hlUG9saWN5LkNBQ0hJTkdfRElTQUJMRUQgfSxcbiAgICAgKiBdXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiAqKkV4YW1wbGUg4oCTIENsb3VkRnJvbnQgRnVuY3Rpb24gb25seToqKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBpbXBvcnQgeyBGdW5jdGlvbiwgRnVuY3Rpb25Db2RlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuICAgICAqXG4gICAgICogY29uc3Qgbm9ybWFsaXplVXJpID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdOb3JtYWxpemVVcmknLCB7XG4gICAgICogICBjb2RlOiBGdW5jdGlvbkNvZGUuZnJvbUlubGluZShgXG4gICAgICogICAgIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcbiAgICAgKiAgICAgICB2YXIgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7XG4gICAgICogICAgICAgcmVxdWVzdC51cmkgPSByZXF1ZXN0LnVyaS5yZXBsYWNlKC9cXFxcLyskLywgJycpIHx8ICcvJztcbiAgICAgKiAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICAgKiAgICAgfVxuICAgICAqICAgYCksXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBhZGRpdGlvbmFsQmVoYXZpb3JzOiBbXG4gICAgICogICB7IHBhdGhQYXR0ZXJuOiAnL3VzZXJzLyonLCBmbjogbm9ybWFsaXplVXJpIH0sXG4gICAgICogXVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogKipFeGFtcGxlIOKAkyBib3RoIGNvbWJpbmVkOioqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGFkZGl0aW9uYWxCZWhhdmlvcnM6IFtcbiAgICAgKiAgIHsgcGF0aFBhdHRlcm46ICcvcG9zdHMvKicsIGZuOiBub3JtYWxpemVVcmksIGNhY2hlUG9saWN5OiBDYWNoZVBvbGljeS5DQUNISU5HX0RJU0FCTEVEIH0sXG4gICAgICogXVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGFkZGl0aW9uYWxCZWhhdmlvcnM/OiBOdXh0Q2xvdWRGcm9udEJlaGF2aW9yW107XG5cbiAgICAvKipcbiAgICAgKiBUaGUgQVJOIG9mIGFuIGV4aXN0aW5nIEFXUyBXQUYgV2ViIEFDTCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24uXG4gICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCB3aXRoIGEgc2VwYXJhdGUgQ2xvdWRGcm9udFdhZlN0YWNrIGRlcGxveWVkIGluIHVzLWVhc3QtMS5cbiAgICAgKlxuICAgICAqIEV4YW1wbGU6ICdhcm46YXdzOndhZnYyOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6Z2xvYmFsL3dlYmFjbC9teS13ZWItYWNsL2ExYjJjM2Q0LTU2NzgtOTBhYi1jZGVmLUVYQU1QTEUxMTExMSdcbiAgICAgKi9cbiAgICByZWFkb25seSB3ZWJBY2xBcm4/OiBzdHJpbmc7XG59XG4iXX0=
@@ -152,6 +152,15 @@ export interface NuxtServerAppStackProps extends NuxtAppStackProps {
152
152
  */
153
153
  readonly outdatedAssetsRetentionDays?: number;
154
154
 
155
+ /**
156
+ * CloudFront paths to invalidate after each deployment.
157
+ * Useful for long-lived cached HTML or shared shell responses that should switch to the new deployment immediately
158
+ * while keeping immutable `/_nuxt/*` assets cached for a long time.
159
+ *
160
+ * Example: `['/login', '/register']`
161
+ */
162
+ readonly invalidatePathsOnDeploy?: string[];
163
+
155
164
  /**
156
165
  * An array of HTTP headers to forward to the Nuxt app on origin requests without affecting the cache key at CloudFront edge locations.
157
166
  * This should only be used for headers that do not affect the response.
@@ -340,4 +349,4 @@ export interface NuxtServerAppStackProps extends NuxtAppStackProps {
340
349
  * Example: 'arn:aws:wafv2:us-east-1:123456789012:global/webacl/my-web-acl/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111'
341
350
  */
342
351
  readonly webAclArn?: string;
343
- }
352
+ }
@@ -149,6 +149,14 @@ const appStackProps: NuxtServerAppStackProps = {
149
149
  */
150
150
  outdatedAssetsRetentionDays: 30,
151
151
 
152
+ /**
153
+ * CloudFront paths to invalidate after each deployment.
154
+ * Useful for long-lived cached HTML or shared shell responses that should immediately switch to the new deployment.
155
+ *
156
+ * Examples: ['/login', '/register']
157
+ */
158
+ invalidatePathsOnDeploy: [],
159
+
152
160
  /**
153
161
  * An array of HTTP headers to forward to the Nuxt app on origin requests without affecting the cache key at CloudFront edge locations.
154
162
  * This should only be used for headers that do not affect the response.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdk-nuxt",
3
- "version": "2.25.1",
3
+ "version": "2.26.1",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",