@angular-devkit/build-angular 16.1.0-rc.0 → 16.1.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.
Files changed (250) hide show
  1. package/package.json +23 -23
  2. package/plugins/karma.js +2 -2
  3. package/src/builders/browser/index.d.ts +1 -1
  4. package/src/builders/browser/index.js +5 -5
  5. package/src/builders/browser-esbuild/index.js +27 -376
  6. package/src/builders/browser-esbuild/options.js +2 -2
  7. package/src/builders/dev-server/load-proxy-config.d.ts +1 -6
  8. package/src/builders/dev-server/load-proxy-config.js +52 -13
  9. package/src/builders/dev-server/vite-server.js +4 -7
  10. package/src/builders/dev-server/webpack-server.d.ts +1 -1
  11. package/src/builders/dev-server/webpack-server.js +6 -6
  12. package/src/builders/extract-i18n/index.js +3 -3
  13. package/src/builders/karma/index.js +2 -2
  14. package/src/builders/server/index.js +4 -4
  15. package/src/tools/babel/plugins/adjust-static-class-members.js +354 -0
  16. package/src/tools/babel/plugins/adjust-typescript-enums.js +124 -0
  17. package/src/tools/babel/plugins/elide-angular-metadata.js +68 -0
  18. package/src/tools/babel/plugins/pure-toplevel-functions.js +91 -0
  19. package/src/tools/babel/presets/application.js +197 -0
  20. package/src/{babel → tools/babel}/webpack-loader.d.ts +1 -1
  21. package/src/tools/babel/webpack-loader.js +189 -0
  22. package/src/tools/esbuild/angular/angular-compilation.js +51 -0
  23. package/src/tools/esbuild/angular/angular-host.js +60 -0
  24. package/src/tools/esbuild/angular/aot-compilation.js +211 -0
  25. package/src/tools/esbuild/angular/compiler-plugin.js +314 -0
  26. package/src/tools/esbuild/angular/diagnostics.js +75 -0
  27. package/src/tools/esbuild/angular/jit-compilation.js +106 -0
  28. package/src/tools/esbuild/angular/jit-plugin-callbacks.js +113 -0
  29. package/src/tools/esbuild/angular/jit-resource-transformer.js +185 -0
  30. package/src/tools/esbuild/angular/uri.js +75 -0
  31. package/src/tools/esbuild/application-code-bundle.d.ts +11 -0
  32. package/src/tools/esbuild/application-code-bundle.js +115 -0
  33. package/src/{builders/browser-esbuild/esbuild.d.ts → tools/esbuild/bundler-context.d.ts} +2 -12
  34. package/src/tools/esbuild/bundler-context.js +205 -0
  35. package/src/tools/esbuild/bundler-execution-result.d.ts +44 -0
  36. package/src/tools/esbuild/bundler-execution-result.js +57 -0
  37. package/src/tools/esbuild/commonjs-checker.js +141 -0
  38. package/src/tools/esbuild/external-packages-plugin.d.ts +17 -0
  39. package/src/tools/esbuild/external-packages-plugin.js +49 -0
  40. package/src/{builders/browser-esbuild → tools/esbuild}/global-scripts.d.ts +1 -1
  41. package/src/tools/esbuild/global-scripts.js +139 -0
  42. package/src/{builders/browser-esbuild → tools/esbuild}/global-styles.d.ts +1 -1
  43. package/src/tools/esbuild/global-styles.js +67 -0
  44. package/src/tools/esbuild/index-html-generator.d.ts +12 -0
  45. package/src/tools/esbuild/index-html-generator.js +70 -0
  46. package/src/tools/esbuild/javascript-transformer-worker.js +76 -0
  47. package/src/tools/esbuild/javascript-transformer.js +108 -0
  48. package/src/tools/esbuild/license-extractor.js +159 -0
  49. package/src/tools/esbuild/load-result-cache.js +69 -0
  50. package/src/tools/esbuild/profiling.js +79 -0
  51. package/src/tools/esbuild/sourcemap-ignorelist-plugin.js +74 -0
  52. package/src/tools/esbuild/stylesheets/bundle-options.js +159 -0
  53. package/src/tools/esbuild/stylesheets/css-language.js +16 -0
  54. package/src/tools/esbuild/stylesheets/css-resource-plugin.js +88 -0
  55. package/src/tools/esbuild/stylesheets/less-language.js +127 -0
  56. package/src/tools/esbuild/stylesheets/sass-language.js +169 -0
  57. package/src/tools/esbuild/stylesheets/stylesheet-plugin-factory.js +234 -0
  58. package/src/tools/esbuild/utils.d.ts +30 -0
  59. package/src/tools/esbuild/utils.js +192 -0
  60. package/src/tools/esbuild/virtual-module-plugin.js +43 -0
  61. package/src/tools/esbuild/watcher.js +107 -0
  62. package/src/tools/sass/rebasing-importer.js +445 -0
  63. package/src/tools/sass/sass-service-legacy.js +176 -0
  64. package/src/tools/sass/sass-service.js +214 -0
  65. package/src/tools/sass/worker-legacy.js +44 -0
  66. package/src/tools/sass/worker.js +158 -0
  67. package/src/{webpack → tools/webpack}/configs/common.d.ts +1 -1
  68. package/src/tools/webpack/configs/common.js +421 -0
  69. package/src/{webpack → tools/webpack}/configs/dev-server.d.ts +1 -1
  70. package/src/tools/webpack/configs/dev-server.js +304 -0
  71. package/src/{webpack → tools/webpack}/configs/index.js +1 -1
  72. package/src/{webpack → tools/webpack}/configs/styles.d.ts +1 -1
  73. package/src/tools/webpack/configs/styles.js +396 -0
  74. package/src/{webpack → tools/webpack}/plugins/any-component-style-budget-checker.d.ts +1 -1
  75. package/src/tools/webpack/plugins/any-component-style-budget-checker.js +92 -0
  76. package/src/tools/webpack/plugins/builder-watch-plugin.js +99 -0
  77. package/src/tools/webpack/plugins/common-js-usage-warn-plugin.js +121 -0
  78. package/src/tools/webpack/plugins/css-optimizer-plugin.js +123 -0
  79. package/src/tools/webpack/plugins/dedupe-module-resolve-plugin.js +75 -0
  80. package/src/tools/webpack/plugins/devtools-ignore-plugin.js +57 -0
  81. package/src/tools/webpack/plugins/esbuild-executor.js +121 -0
  82. package/src/tools/webpack/plugins/hmr/hmr-accept.js +185 -0
  83. package/src/tools/webpack/plugins/hmr/hmr-loader.js +25 -0
  84. package/src/{webpack → tools/webpack}/plugins/index-html-webpack-plugin.d.ts +1 -1
  85. package/src/tools/webpack/plugins/index-html-webpack-plugin.js +85 -0
  86. package/src/{webpack → tools/webpack}/plugins/index.js +1 -1
  87. package/src/tools/webpack/plugins/javascript-optimizer-plugin.js +166 -0
  88. package/src/tools/webpack/plugins/javascript-optimizer-worker.js +140 -0
  89. package/src/tools/webpack/plugins/json-stats-plugin.js +61 -0
  90. package/src/tools/webpack/plugins/karma/karma.js +270 -0
  91. package/src/tools/webpack/plugins/named-chunks-plugin.js +59 -0
  92. package/src/tools/webpack/plugins/occurrences-plugin.js +80 -0
  93. package/src/tools/webpack/plugins/postcss-cli-resources.js +176 -0
  94. package/src/tools/webpack/plugins/progress-plugin.js +39 -0
  95. package/src/tools/webpack/plugins/remove-hash-plugin.js +31 -0
  96. package/src/tools/webpack/plugins/scripts-webpack-plugin.js +180 -0
  97. package/src/tools/webpack/plugins/service-worker-plugin.js +46 -0
  98. package/src/tools/webpack/plugins/styles-webpack-plugin.js +73 -0
  99. package/src/tools/webpack/plugins/suppress-entry-chunks-webpack-plugin.js +52 -0
  100. package/src/tools/webpack/plugins/transfer-size-plugin.js +50 -0
  101. package/src/{webpack → tools/webpack}/plugins/typescript.d.ts +1 -1
  102. package/src/tools/webpack/plugins/typescript.js +51 -0
  103. package/src/tools/webpack/plugins/watch-files-logs-plugin.js +28 -0
  104. package/src/tools/webpack/utils/async-chunks.js +46 -0
  105. package/src/{webpack → tools/webpack}/utils/helpers.d.ts +2 -2
  106. package/src/tools/webpack/utils/helpers.js +293 -0
  107. package/src/{webpack → tools/webpack}/utils/stats.d.ts +2 -2
  108. package/src/tools/webpack/utils/stats.js +443 -0
  109. package/src/utils/bundle-calculator.js +2 -2
  110. package/src/utils/index-file/augment-index-html.d.ts +1 -1
  111. package/src/utils/index-file/augment-index-html.js +1 -1
  112. package/src/utils/normalize-asset-patterns.d.ts +1 -1
  113. package/src/utils/normalize-asset-patterns.js +1 -1
  114. package/src/utils/normalize-file-replacements.d.ts +1 -1
  115. package/src/utils/normalize-file-replacements.js +1 -1
  116. package/src/utils/package-chunk-sort.js +2 -2
  117. package/src/utils/webpack-browser-config.js +2 -2
  118. package/src/babel/plugins/adjust-static-class-members.js +0 -354
  119. package/src/babel/plugins/adjust-typescript-enums.js +0 -124
  120. package/src/babel/plugins/elide-angular-metadata.js +0 -68
  121. package/src/babel/plugins/pure-toplevel-functions.js +0 -91
  122. package/src/babel/presets/application.js +0 -197
  123. package/src/babel/webpack-loader.js +0 -189
  124. package/src/builders/browser-esbuild/angular/angular-compilation.js +0 -51
  125. package/src/builders/browser-esbuild/angular/angular-host.js +0 -60
  126. package/src/builders/browser-esbuild/angular/aot-compilation.js +0 -208
  127. package/src/builders/browser-esbuild/angular/compiler-plugin.js +0 -314
  128. package/src/builders/browser-esbuild/angular/diagnostics.js +0 -75
  129. package/src/builders/browser-esbuild/angular/jit-compilation.js +0 -106
  130. package/src/builders/browser-esbuild/angular/jit-plugin-callbacks.js +0 -113
  131. package/src/builders/browser-esbuild/angular/jit-resource-transformer.js +0 -185
  132. package/src/builders/browser-esbuild/angular/uri.js +0 -75
  133. package/src/builders/browser-esbuild/commonjs-checker.js +0 -141
  134. package/src/builders/browser-esbuild/esbuild.js +0 -206
  135. package/src/builders/browser-esbuild/global-scripts.js +0 -139
  136. package/src/builders/browser-esbuild/global-styles.js +0 -67
  137. package/src/builders/browser-esbuild/javascript-transformer-worker.js +0 -76
  138. package/src/builders/browser-esbuild/javascript-transformer.js +0 -108
  139. package/src/builders/browser-esbuild/license-extractor.js +0 -159
  140. package/src/builders/browser-esbuild/load-result-cache.js +0 -69
  141. package/src/builders/browser-esbuild/profiling.js +0 -79
  142. package/src/builders/browser-esbuild/sourcemap-ignorelist-plugin.js +0 -74
  143. package/src/builders/browser-esbuild/stylesheets/bundle-options.js +0 -159
  144. package/src/builders/browser-esbuild/stylesheets/css-language.js +0 -16
  145. package/src/builders/browser-esbuild/stylesheets/css-resource-plugin.js +0 -88
  146. package/src/builders/browser-esbuild/stylesheets/less-language.js +0 -127
  147. package/src/builders/browser-esbuild/stylesheets/sass-language.js +0 -169
  148. package/src/builders/browser-esbuild/stylesheets/stylesheet-plugin-factory.js +0 -218
  149. package/src/builders/browser-esbuild/virtual-module-plugin.js +0 -43
  150. package/src/builders/browser-esbuild/watcher.js +0 -105
  151. package/src/sass/rebasing-importer.js +0 -445
  152. package/src/sass/sass-service-legacy.js +0 -176
  153. package/src/sass/sass-service.js +0 -214
  154. package/src/sass/worker-legacy.js +0 -44
  155. package/src/sass/worker.js +0 -158
  156. package/src/webpack/configs/common.js +0 -421
  157. package/src/webpack/configs/dev-server.js +0 -304
  158. package/src/webpack/configs/styles.js +0 -396
  159. package/src/webpack/plugins/any-component-style-budget-checker.js +0 -92
  160. package/src/webpack/plugins/builder-watch-plugin.js +0 -99
  161. package/src/webpack/plugins/common-js-usage-warn-plugin.js +0 -121
  162. package/src/webpack/plugins/css-optimizer-plugin.js +0 -123
  163. package/src/webpack/plugins/dedupe-module-resolve-plugin.js +0 -75
  164. package/src/webpack/plugins/devtools-ignore-plugin.js +0 -57
  165. package/src/webpack/plugins/esbuild-executor.js +0 -121
  166. package/src/webpack/plugins/hmr/hmr-accept.js +0 -185
  167. package/src/webpack/plugins/hmr/hmr-loader.js +0 -25
  168. package/src/webpack/plugins/index-html-webpack-plugin.js +0 -85
  169. package/src/webpack/plugins/javascript-optimizer-plugin.js +0 -166
  170. package/src/webpack/plugins/javascript-optimizer-worker.js +0 -140
  171. package/src/webpack/plugins/json-stats-plugin.js +0 -61
  172. package/src/webpack/plugins/karma/karma.js +0 -270
  173. package/src/webpack/plugins/named-chunks-plugin.js +0 -59
  174. package/src/webpack/plugins/occurrences-plugin.js +0 -80
  175. package/src/webpack/plugins/postcss-cli-resources.js +0 -176
  176. package/src/webpack/plugins/progress-plugin.js +0 -39
  177. package/src/webpack/plugins/remove-hash-plugin.js +0 -31
  178. package/src/webpack/plugins/scripts-webpack-plugin.js +0 -180
  179. package/src/webpack/plugins/service-worker-plugin.js +0 -46
  180. package/src/webpack/plugins/styles-webpack-plugin.js +0 -73
  181. package/src/webpack/plugins/suppress-entry-chunks-webpack-plugin.js +0 -52
  182. package/src/webpack/plugins/transfer-size-plugin.js +0 -50
  183. package/src/webpack/plugins/typescript.js +0 -51
  184. package/src/webpack/plugins/watch-files-logs-plugin.js +0 -28
  185. package/src/webpack/utils/async-chunks.js +0 -46
  186. package/src/webpack/utils/helpers.js +0 -293
  187. package/src/webpack/utils/stats.js +0 -443
  188. /package/src/{babel → tools/babel}/babel-loader.d.ts +0 -0
  189. /package/src/{babel → tools/babel}/plugins/adjust-static-class-members.d.ts +0 -0
  190. /package/src/{babel → tools/babel}/plugins/adjust-typescript-enums.d.ts +0 -0
  191. /package/src/{babel → tools/babel}/plugins/elide-angular-metadata.d.ts +0 -0
  192. /package/src/{babel → tools/babel}/plugins/pure-toplevel-functions.d.ts +0 -0
  193. /package/src/{babel → tools/babel}/presets/application.d.ts +0 -0
  194. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/angular-compilation.d.ts +0 -0
  195. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/angular-host.d.ts +0 -0
  196. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/aot-compilation.d.ts +0 -0
  197. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/compiler-plugin.d.ts +0 -0
  198. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/diagnostics.d.ts +0 -0
  199. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/jit-compilation.d.ts +0 -0
  200. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/jit-plugin-callbacks.d.ts +0 -0
  201. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/jit-resource-transformer.d.ts +0 -0
  202. /package/src/{builders/browser-esbuild → tools/esbuild}/angular/uri.d.ts +0 -0
  203. /package/src/{builders/browser-esbuild → tools/esbuild}/commonjs-checker.d.ts +0 -0
  204. /package/src/{builders/browser-esbuild → tools/esbuild}/javascript-transformer-worker.d.ts +0 -0
  205. /package/src/{builders/browser-esbuild → tools/esbuild}/javascript-transformer.d.ts +0 -0
  206. /package/src/{builders/browser-esbuild → tools/esbuild}/license-extractor.d.ts +0 -0
  207. /package/src/{builders/browser-esbuild → tools/esbuild}/load-result-cache.d.ts +0 -0
  208. /package/src/{builders/browser-esbuild → tools/esbuild}/profiling.d.ts +0 -0
  209. /package/src/{builders/browser-esbuild → tools/esbuild}/sourcemap-ignorelist-plugin.d.ts +0 -0
  210. /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/bundle-options.d.ts +0 -0
  211. /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/css-language.d.ts +0 -0
  212. /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/css-resource-plugin.d.ts +0 -0
  213. /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/less-language.d.ts +0 -0
  214. /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/sass-language.d.ts +0 -0
  215. /package/src/{builders/browser-esbuild → tools/esbuild}/stylesheets/stylesheet-plugin-factory.d.ts +0 -0
  216. /package/src/{builders/browser-esbuild → tools/esbuild}/virtual-module-plugin.d.ts +0 -0
  217. /package/src/{builders/browser-esbuild → tools/esbuild}/watcher.d.ts +0 -0
  218. /package/src/{sass → tools/sass}/rebasing-importer.d.ts +0 -0
  219. /package/src/{sass → tools/sass}/sass-service-legacy.d.ts +0 -0
  220. /package/src/{sass → tools/sass}/sass-service.d.ts +0 -0
  221. /package/src/{sass → tools/sass}/worker-legacy.d.ts +0 -0
  222. /package/src/{sass → tools/sass}/worker.d.ts +0 -0
  223. /package/src/{webpack → tools/webpack}/configs/index.d.ts +0 -0
  224. /package/src/{webpack → tools/webpack}/plugins/builder-watch-plugin.d.ts +0 -0
  225. /package/src/{webpack → tools/webpack}/plugins/common-js-usage-warn-plugin.d.ts +0 -0
  226. /package/src/{webpack → tools/webpack}/plugins/css-optimizer-plugin.d.ts +0 -0
  227. /package/src/{webpack → tools/webpack}/plugins/dedupe-module-resolve-plugin.d.ts +0 -0
  228. /package/src/{webpack → tools/webpack}/plugins/devtools-ignore-plugin.d.ts +0 -0
  229. /package/src/{webpack → tools/webpack}/plugins/esbuild-executor.d.ts +0 -0
  230. /package/src/{webpack → tools/webpack}/plugins/hmr/hmr-accept.d.ts +0 -0
  231. /package/src/{webpack → tools/webpack}/plugins/hmr/hmr-loader.d.ts +0 -0
  232. /package/src/{webpack → tools/webpack}/plugins/index.d.ts +0 -0
  233. /package/src/{webpack → tools/webpack}/plugins/javascript-optimizer-plugin.d.ts +0 -0
  234. /package/src/{webpack → tools/webpack}/plugins/javascript-optimizer-worker.d.ts +0 -0
  235. /package/src/{webpack → tools/webpack}/plugins/json-stats-plugin.d.ts +0 -0
  236. /package/src/{webpack → tools/webpack}/plugins/karma/karma-context.html +0 -0
  237. /package/src/{webpack → tools/webpack}/plugins/karma/karma-debug.html +0 -0
  238. /package/src/{webpack → tools/webpack}/plugins/karma/karma.d.ts +0 -0
  239. /package/src/{webpack → tools/webpack}/plugins/named-chunks-plugin.d.ts +0 -0
  240. /package/src/{webpack → tools/webpack}/plugins/occurrences-plugin.d.ts +0 -0
  241. /package/src/{webpack → tools/webpack}/plugins/postcss-cli-resources.d.ts +0 -0
  242. /package/src/{webpack → tools/webpack}/plugins/progress-plugin.d.ts +0 -0
  243. /package/src/{webpack → tools/webpack}/plugins/remove-hash-plugin.d.ts +0 -0
  244. /package/src/{webpack → tools/webpack}/plugins/scripts-webpack-plugin.d.ts +0 -0
  245. /package/src/{webpack → tools/webpack}/plugins/service-worker-plugin.d.ts +0 -0
  246. /package/src/{webpack → tools/webpack}/plugins/styles-webpack-plugin.d.ts +0 -0
  247. /package/src/{webpack → tools/webpack}/plugins/suppress-entry-chunks-webpack-plugin.d.ts +0 -0
  248. /package/src/{webpack → tools/webpack}/plugins/transfer-size-plugin.d.ts +0 -0
  249. /package/src/{webpack → tools/webpack}/plugins/watch-files-logs-plugin.d.ts +0 -0
  250. /package/src/{webpack → tools/webpack}/utils/async-chunks.d.ts +0 -0
@@ -1,421 +0,0 @@
1
- "use strict";
2
- /**
3
- * @license
4
- * Copyright Google LLC All Rights Reserved.
5
- *
6
- * Use of this source code is governed by an MIT-style license that can be
7
- * found in the LICENSE file at https://angular.io/license
8
- */
9
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- var desc = Object.getOwnPropertyDescriptor(m, k);
12
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
- desc = { enumerable: true, get: function() { return m[k]; } };
14
- }
15
- Object.defineProperty(o, k2, desc);
16
- }) : (function(o, m, k, k2) {
17
- if (k2 === undefined) k2 = k;
18
- o[k2] = m[k];
19
- }));
20
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
- Object.defineProperty(o, "default", { enumerable: true, value: v });
22
- }) : function(o, v) {
23
- o["default"] = v;
24
- });
25
- var __importStar = (this && this.__importStar) || function (mod) {
26
- if (mod && mod.__esModule) return mod;
27
- var result = {};
28
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
29
- __setModuleDefault(result, mod);
30
- return result;
31
- };
32
- var __importDefault = (this && this.__importDefault) || function (mod) {
33
- return (mod && mod.__esModule) ? mod : { "default": mod };
34
- };
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.getCommonConfig = void 0;
37
- const webpack_1 = require("@ngtools/webpack");
38
- const copy_webpack_plugin_1 = __importDefault(require("copy-webpack-plugin"));
39
- const path = __importStar(require("path"));
40
- const webpack_2 = require("webpack");
41
- const webpack_subresource_integrity_1 = require("webpack-subresource-integrity");
42
- const environment_options_1 = require("../../utils/environment-options");
43
- const load_esm_1 = require("../../utils/load-esm");
44
- const plugins_1 = require("../plugins");
45
- const devtools_ignore_plugin_1 = require("../plugins/devtools-ignore-plugin");
46
- const named_chunks_plugin_1 = require("../plugins/named-chunks-plugin");
47
- const occurrences_plugin_1 = require("../plugins/occurrences-plugin");
48
- const progress_plugin_1 = require("../plugins/progress-plugin");
49
- const transfer_size_plugin_1 = require("../plugins/transfer-size-plugin");
50
- const typescript_1 = require("../plugins/typescript");
51
- const watch_files_logs_plugin_1 = require("../plugins/watch-files-logs-plugin");
52
- const helpers_1 = require("../utils/helpers");
53
- const VENDORS_TEST = /[\\/]node_modules[\\/]/;
54
- // eslint-disable-next-line max-lines-per-function
55
- async function getCommonConfig(wco) {
56
- const { root, projectRoot, buildOptions, tsConfig, projectName, sourceRoot, tsConfigPath } = wco;
57
- const { cache, codeCoverage, crossOrigin = 'none', platform = 'browser', aot = true, codeCoverageExclude = [], main, sourceMap: { styles: stylesSourceMap, scripts: scriptsSourceMap, vendor: vendorSourceMap, hidden: hiddenSourceMap, }, optimization: { styles: stylesOptimization, scripts: scriptsOptimization }, commonChunk, vendorChunk, subresourceIntegrity, verbose, poll, webWorkerTsConfig, externalDependencies = [], allowedCommonJsDependencies, } = buildOptions;
58
- const isPlatformServer = buildOptions.platform === 'server';
59
- const extraPlugins = [];
60
- const extraRules = [];
61
- const entryPoints = {};
62
- // Load ESM `@angular/compiler-cli` using the TypeScript dynamic import workaround.
63
- // Once TypeScript provides support for keeping the dynamic import this workaround can be
64
- // changed to a direct dynamic import.
65
- const { GLOBAL_DEFS_FOR_TERSER, GLOBAL_DEFS_FOR_TERSER_WITH_AOT, VERSION: NG_VERSION, } = await (0, load_esm_1.loadEsmModule)('@angular/compiler-cli');
66
- // determine hashing format
67
- const hashFormat = (0, helpers_1.getOutputHashFormat)(buildOptions.outputHashing);
68
- if (buildOptions.progress) {
69
- extraPlugins.push(new progress_plugin_1.ProgressPlugin(platform));
70
- }
71
- const localizePackageInitEntryPoint = '@angular/localize/init';
72
- const hasLocalizeType = tsConfig.options.types?.some((t) => t === '@angular/localize' || t === localizePackageInitEntryPoint);
73
- if (hasLocalizeType) {
74
- entryPoints['main'] = [localizePackageInitEntryPoint];
75
- }
76
- if (buildOptions.main) {
77
- const mainPath = path.resolve(root, buildOptions.main);
78
- if (Array.isArray(entryPoints['main'])) {
79
- entryPoints['main'].push(mainPath);
80
- }
81
- else {
82
- entryPoints['main'] = [mainPath];
83
- }
84
- }
85
- if (isPlatformServer) {
86
- // Fixes Critical dependency: the request of a dependency is an expression
87
- extraPlugins.push(new webpack_2.ContextReplacementPlugin(/@?hapi|express[\\/]/));
88
- if ((0, helpers_1.isPlatformServerInstalled)(wco.root) && Array.isArray(entryPoints['main'])) {
89
- // This import must come before any imports (direct or transitive) that rely on DOM built-ins being
90
- // available, such as `@angular/elements`.
91
- entryPoints['main'].unshift('@angular/platform-server/init');
92
- }
93
- }
94
- const polyfills = [...buildOptions.polyfills];
95
- if (!aot) {
96
- polyfills.push('@angular/compiler');
97
- }
98
- if (polyfills.length) {
99
- // `zone.js/testing` is a **special** polyfill because when not imported in the main it fails with the below errors:
100
- // `Error: Expected to be running in 'ProxyZone', but it was not found.`
101
- // This was also the reason why previously it was imported in `test.ts` as the first module.
102
- // From Jia li:
103
- // This is because the jasmine functions such as beforeEach/it will not be patched by zone.js since
104
- // jasmine will not be loaded yet, so the ProxyZone will not be there. We have to load zone-testing.js after
105
- // jasmine is ready.
106
- // We could force loading 'zone.js/testing' prior to jasmine by changing the order of scripts in 'karma-context.html'.
107
- // But this has it's own problems as zone.js needs to be loaded prior to jasmine due to patching of timing functions
108
- // See: https://github.com/jasmine/jasmine/issues/1944
109
- // Thus the correct order is zone.js -> jasmine -> zone.js/testing.
110
- const zoneTestingEntryPoint = 'zone.js/testing';
111
- const polyfillsExludingZoneTesting = polyfills.filter((p) => p !== zoneTestingEntryPoint);
112
- if (Array.isArray(entryPoints['polyfills'])) {
113
- entryPoints['polyfills'].push(...polyfillsExludingZoneTesting);
114
- }
115
- else {
116
- entryPoints['polyfills'] = polyfillsExludingZoneTesting;
117
- }
118
- if (polyfillsExludingZoneTesting.length !== polyfills.length) {
119
- if (Array.isArray(entryPoints['main'])) {
120
- entryPoints['main'].unshift(zoneTestingEntryPoint);
121
- }
122
- else {
123
- entryPoints['main'] = [zoneTestingEntryPoint];
124
- }
125
- }
126
- }
127
- if (allowedCommonJsDependencies) {
128
- // When this is not defined it means the builder doesn't support showing common js usages.
129
- // When it does it will be an array.
130
- extraPlugins.push(new plugins_1.CommonJsUsageWarnPlugin({
131
- allowedDependencies: allowedCommonJsDependencies,
132
- }));
133
- }
134
- // process global scripts
135
- // Add a new asset for each entry.
136
- for (const { bundleName, inject, paths } of (0, helpers_1.globalScriptsByBundleName)(buildOptions.scripts)) {
137
- // Lazy scripts don't get a hash, otherwise they can't be loaded by name.
138
- const hash = inject ? hashFormat.script : '';
139
- extraPlugins.push(new plugins_1.ScriptsWebpackPlugin({
140
- name: bundleName,
141
- sourceMap: scriptsSourceMap,
142
- scripts: paths,
143
- filename: `${path.basename(bundleName)}${hash}.js`,
144
- basePath: root,
145
- }));
146
- }
147
- // process asset entries
148
- if (buildOptions.assets.length) {
149
- extraPlugins.push(new copy_webpack_plugin_1.default({
150
- patterns: (0, helpers_1.assetPatterns)(root, buildOptions.assets),
151
- }));
152
- }
153
- if (buildOptions.extractLicenses) {
154
- const LicenseWebpackPlugin = require('license-webpack-plugin').LicenseWebpackPlugin;
155
- extraPlugins.push(new LicenseWebpackPlugin({
156
- stats: {
157
- warnings: false,
158
- errors: false,
159
- },
160
- perChunkOutput: false,
161
- outputFilename: '3rdpartylicenses.txt',
162
- skipChildCompilers: true,
163
- }));
164
- }
165
- if (scriptsSourceMap || stylesSourceMap) {
166
- const include = [];
167
- if (scriptsSourceMap) {
168
- include.push(/js$/);
169
- }
170
- if (stylesSourceMap) {
171
- include.push(/css$/);
172
- }
173
- extraPlugins.push(new devtools_ignore_plugin_1.DevToolsIgnorePlugin());
174
- extraPlugins.push(new webpack_2.SourceMapDevToolPlugin({
175
- filename: '[file].map',
176
- include,
177
- // We want to set sourceRoot to `webpack:///` for non
178
- // inline sourcemaps as otherwise paths to sourcemaps will be broken in browser
179
- // `webpack:///` is needed for Visual Studio breakpoints to work properly as currently
180
- // there is no way to set the 'webRoot'
181
- sourceRoot: 'webpack:///',
182
- moduleFilenameTemplate: '[resource-path]',
183
- append: hiddenSourceMap ? false : undefined,
184
- }));
185
- }
186
- if (verbose) {
187
- extraPlugins.push(new watch_files_logs_plugin_1.WatchFilesLogsPlugin());
188
- }
189
- if (buildOptions.statsJson) {
190
- extraPlugins.push(new plugins_1.JsonStatsPlugin(path.resolve(root, buildOptions.outputPath, 'stats.json')));
191
- }
192
- if (subresourceIntegrity) {
193
- extraPlugins.push(new webpack_subresource_integrity_1.SubresourceIntegrityPlugin({
194
- hashFuncNames: ['sha384'],
195
- }));
196
- }
197
- if (scriptsSourceMap || stylesSourceMap) {
198
- extraRules.push({
199
- test: /\.[cm]?jsx?$/,
200
- enforce: 'pre',
201
- loader: require.resolve('source-map-loader'),
202
- options: {
203
- filterSourceMappingUrl: (_mapUri, resourcePath) => {
204
- if (vendorSourceMap) {
205
- // Consume all sourcemaps when vendor option is enabled.
206
- return true;
207
- }
208
- // Don't consume sourcemaps in node_modules when vendor is disabled.
209
- // But, do consume local libraries sourcemaps.
210
- return !resourcePath.includes('node_modules');
211
- },
212
- },
213
- });
214
- }
215
- if (main || polyfills) {
216
- extraRules.push({
217
- test: tsConfig.options.allowJs ? /\.[cm]?[tj]sx?$/ : /\.[cm]?tsx?$/,
218
- loader: webpack_1.AngularWebpackLoaderPath,
219
- // The below are known paths that are not part of the TypeScript compilation even when allowJs is enabled.
220
- exclude: [
221
- /[\\/]node_modules[/\\](?:css-loader|mini-css-extract-plugin|webpack-dev-server|webpack)[/\\]/,
222
- ],
223
- });
224
- extraPlugins.push((0, typescript_1.createIvyPlugin)(wco, aot, tsConfigPath));
225
- }
226
- if (webWorkerTsConfig) {
227
- extraPlugins.push((0, typescript_1.createIvyPlugin)(wco, false, path.resolve(wco.root, webWorkerTsConfig)));
228
- }
229
- const extraMinimizers = [];
230
- if (scriptsOptimization) {
231
- extraMinimizers.push(new plugins_1.JavaScriptOptimizerPlugin({
232
- define: buildOptions.aot ? GLOBAL_DEFS_FOR_TERSER_WITH_AOT : GLOBAL_DEFS_FOR_TERSER,
233
- sourcemap: scriptsSourceMap,
234
- supportedBrowsers: buildOptions.supportedBrowsers,
235
- keepIdentifierNames: !environment_options_1.allowMangle || isPlatformServer,
236
- keepNames: isPlatformServer,
237
- removeLicenses: buildOptions.extractLicenses,
238
- advanced: buildOptions.buildOptimizer,
239
- }));
240
- }
241
- if (platform === 'browser' && (scriptsOptimization || stylesOptimization.minify)) {
242
- extraMinimizers.push(new transfer_size_plugin_1.TransferSizePlugin());
243
- }
244
- let crossOriginLoading = false;
245
- if (subresourceIntegrity && crossOrigin === 'none') {
246
- crossOriginLoading = 'anonymous';
247
- }
248
- else if (crossOrigin !== 'none') {
249
- crossOriginLoading = crossOrigin;
250
- }
251
- return {
252
- mode: scriptsOptimization || stylesOptimization.minify ? 'production' : 'development',
253
- devtool: false,
254
- target: [isPlatformServer ? 'node' : 'web', 'es2015'],
255
- profile: buildOptions.statsJson,
256
- resolve: {
257
- roots: [projectRoot],
258
- extensions: ['.ts', '.tsx', '.mjs', '.js'],
259
- symlinks: !buildOptions.preserveSymlinks,
260
- modules: [tsConfig.options.baseUrl || projectRoot, 'node_modules'],
261
- mainFields: isPlatformServer
262
- ? ['es2020', 'es2015', 'module', 'main']
263
- : ['es2020', 'es2015', 'browser', 'module', 'main'],
264
- conditionNames: ['es2020', 'es2015', '...'],
265
- },
266
- resolveLoader: {
267
- symlinks: !buildOptions.preserveSymlinks,
268
- },
269
- context: root,
270
- entry: entryPoints,
271
- externals: externalDependencies,
272
- output: {
273
- uniqueName: projectName,
274
- hashFunction: 'xxhash64',
275
- clean: buildOptions.deleteOutputPath ?? true,
276
- path: path.resolve(root, buildOptions.outputPath),
277
- publicPath: buildOptions.deployUrl ?? '',
278
- filename: `[name]${hashFormat.chunk}.js`,
279
- chunkFilename: `[name]${hashFormat.chunk}.js`,
280
- libraryTarget: isPlatformServer ? 'commonjs' : undefined,
281
- crossOriginLoading,
282
- trustedTypes: 'angular#bundler',
283
- scriptType: 'module',
284
- },
285
- watch: buildOptions.watch,
286
- watchOptions: {
287
- poll,
288
- // The below is needed as when preserveSymlinks is enabled we disable `resolve.symlinks`.
289
- followSymlinks: buildOptions.preserveSymlinks,
290
- ignored: poll === undefined ? undefined : '**/node_modules/**',
291
- },
292
- snapshot: {
293
- module: {
294
- // Use hash of content instead of timestamp because the timestamp of the symlink will be used
295
- // instead of the referenced files which causes changes in symlinks not to be picked up.
296
- hash: buildOptions.preserveSymlinks,
297
- },
298
- },
299
- performance: {
300
- hints: false,
301
- },
302
- ignoreWarnings: [
303
- // https://github.com/webpack-contrib/source-map-loader/blob/b2de4249c7431dd8432da607e08f0f65e9d64219/src/index.js#L83
304
- /Failed to parse source map from/,
305
- // https://github.com/webpack-contrib/postcss-loader/blob/bd261875fdf9c596af4ffb3a1a73fe3c549befda/src/index.js#L153-L158
306
- /Add postcss as project dependency/,
307
- // esbuild will issue a warning, while still hoists the @charset at the very top.
308
- // This is caused by a bug in css-loader https://github.com/webpack-contrib/css-loader/issues/1212
309
- /"@charset" must be the first rule in the file/,
310
- ],
311
- module: {
312
- // Show an error for missing exports instead of a warning.
313
- strictExportPresence: true,
314
- parser: {
315
- javascript: {
316
- requireContext: false,
317
- // Disable auto URL asset module creation. This doesn't effect `new Worker(new URL(...))`
318
- // https://webpack.js.org/guides/asset-modules/#url-assets
319
- url: false,
320
- worker: !!webWorkerTsConfig,
321
- },
322
- },
323
- rules: [
324
- {
325
- test: /\.?(svg|html)$/,
326
- // Only process HTML and SVG which are known Angular component resources.
327
- resourceQuery: /\?ngResource/,
328
- type: 'asset/source',
329
- },
330
- {
331
- // Mark files inside `rxjs/add` as containing side effects.
332
- // If this is fixed upstream and the fixed version becomes the minimum
333
- // supported version, this can be removed.
334
- test: /[/\\]rxjs[/\\]add[/\\].+\.js$/,
335
- sideEffects: true,
336
- },
337
- {
338
- test: /\.[cm]?[tj]sx?$/,
339
- // The below is needed due to a bug in `@babel/runtime`. See: https://github.com/babel/babel/issues/12824
340
- resolve: { fullySpecified: false },
341
- exclude: [
342
- /[\\/]node_modules[/\\](?:core-js|@babel|tslib|web-animations-js|web-streams-polyfill|whatwg-url)[/\\]/,
343
- ],
344
- use: [
345
- {
346
- loader: require.resolve('../../babel/webpack-loader'),
347
- options: {
348
- cacheDirectory: (cache.enabled && path.join(cache.path, 'babel-webpack')) || false,
349
- aot: buildOptions.aot,
350
- optimize: buildOptions.buildOptimizer,
351
- supportedBrowsers: buildOptions.supportedBrowsers,
352
- instrumentCode: codeCoverage
353
- ? {
354
- includedBasePath: sourceRoot ?? projectRoot,
355
- excludedPaths: (0, helpers_1.getInstrumentationExcludedPaths)(root, codeCoverageExclude),
356
- }
357
- : undefined,
358
- },
359
- },
360
- ],
361
- },
362
- ...extraRules,
363
- ],
364
- },
365
- experiments: {
366
- backCompat: false,
367
- syncWebAssembly: true,
368
- asyncWebAssembly: true,
369
- topLevelAwait: false,
370
- },
371
- infrastructureLogging: {
372
- debug: verbose,
373
- level: verbose ? 'verbose' : 'error',
374
- },
375
- stats: (0, helpers_1.getStatsOptions)(verbose),
376
- cache: (0, helpers_1.getCacheSettings)(wco, NG_VERSION.full),
377
- optimization: {
378
- minimizer: extraMinimizers,
379
- moduleIds: 'deterministic',
380
- chunkIds: buildOptions.namedChunks ? 'named' : 'deterministic',
381
- emitOnErrors: false,
382
- runtimeChunk: isPlatformServer ? false : 'single',
383
- splitChunks: {
384
- maxAsyncRequests: Infinity,
385
- cacheGroups: {
386
- default: !!commonChunk && {
387
- chunks: 'async',
388
- minChunks: 2,
389
- priority: 10,
390
- },
391
- common: !!commonChunk && {
392
- name: 'common',
393
- chunks: 'async',
394
- minChunks: 2,
395
- enforce: true,
396
- priority: 5,
397
- },
398
- vendors: false,
399
- defaultVendors: !!vendorChunk && {
400
- name: 'vendor',
401
- chunks: (chunk) => chunk.name === 'main',
402
- enforce: true,
403
- test: VENDORS_TEST,
404
- },
405
- },
406
- },
407
- },
408
- plugins: [
409
- new named_chunks_plugin_1.NamedChunksPlugin(),
410
- new occurrences_plugin_1.OccurrencesPlugin({
411
- aot,
412
- scriptsOptimization,
413
- }),
414
- new plugins_1.DedupeModuleResolvePlugin({ verbose }),
415
- ...extraPlugins,
416
- ],
417
- node: false,
418
- };
419
- }
420
- exports.getCommonConfig = getCommonConfig;
421
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhcl9kZXZraXQvYnVpbGRfYW5ndWxhci9zcmMvd2VicGFjay9jb25maWdzL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDhDQUE0RDtBQUM1RCw4RUFBb0Q7QUFDcEQsMkNBQTZCO0FBQzdCLHFDQU1pQjtBQUNqQixpRkFBMkU7QUFHM0UseUVBQThEO0FBQzlELG1EQUFxRDtBQUNyRCx3Q0FNb0I7QUFDcEIsOEVBQXlFO0FBQ3pFLHdFQUFtRTtBQUNuRSxzRUFBa0U7QUFDbEUsZ0VBQTREO0FBQzVELDBFQUFxRTtBQUNyRSxzREFBd0Q7QUFDeEQsZ0ZBQTBFO0FBQzFFLDhDQVEwQjtBQUUxQixNQUFNLFlBQVksR0FBRyx3QkFBd0IsQ0FBQztBQUU5QyxrREFBa0Q7QUFDM0MsS0FBSyxVQUFVLGVBQWUsQ0FBQyxHQUF5QjtJQUM3RCxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBQ2pHLE1BQU0sRUFDSixLQUFLLEVBQ0wsWUFBWSxFQUNaLFdBQVcsR0FBRyxNQUFNLEVBQ3BCLFFBQVEsR0FBRyxTQUFTLEVBQ3BCLEdBQUcsR0FBRyxJQUFJLEVBQ1YsbUJBQW1CLEdBQUcsRUFBRSxFQUN4QixJQUFJLEVBQ0osU0FBUyxFQUFFLEVBQ1QsTUFBTSxFQUFFLGVBQWUsRUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUN6QixNQUFNLEVBQUUsZUFBZSxFQUN2QixNQUFNLEVBQUUsZUFBZSxHQUN4QixFQUNELFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsbUJBQW1C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QUFXLEVBQUU7b0JBQ1gsT0FBTyxFQUFFLENBQUMsQ0FBQyxXQUFXLElBQUk7d0JBQ3hCLE1BQU0sRUFBRSxPQUFPO3dCQUNmLFNBQVMsRUFBRSxDQUFDO3dCQUNaLFFBQVEsRUFBRSxFQUFFO3FCQUNiO29CQUNELE1BQU0sRUFBRSxDQUFDLENBQUMsV0FBVyxJQUFJO3dCQUN2QixJQUFJLEVBQUUsUUFBUTt3QkFDZCxNQUFNLEVBQUUsT0FBTzt3QkFDZixTQUFTLEVBQUUsQ0FBQzt3QkFDWixPQUFPLEVBQUUsSUFBSTt3QkFDYixRQUFRLEVBQUUsQ0FBQztxQkFDWjtvQkFDRCxPQUFPLEVBQUUsS0FBSztvQkFDZCxjQUFjLEVBQUUsQ0FBQyxDQUFDLFdBQVcsSUFBSTt3QkFDL0IsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU07d0JBQ3hDLE9BQU8sRUFBRSxJQUFJO3dCQUNiLElBQUksRUFBRSxZQUFZO3FCQUNuQjtpQkFDRjthQUNGO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUCxJQUFJLHVDQUFpQixFQUFFO1lBQ3ZCLElBQUksc0NBQWlCLENBQUM7Z0JBQ3BCLEdBQUc7Z0JBQ0gsbUJBQW1CO2FBQ3BCLENBQUM7WUFDRixJQUFJLG1DQUF5QixDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDMUMsR0FBRyxZQUFZO1NBQ2hCO1FBQ0QsSUFBSSxFQUFFLEtBQUs7S0FDWixDQUFDO0FBQ0osQ0FBQztBQXRiRCwwQ0FzYkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHsgQW5ndWxhcldlYnBhY2tMb2FkZXJQYXRoIH0gZnJvbSAnQG5ndG9vbHMvd2VicGFjayc7XG5pbXBvcnQgQ29weVdlYnBhY2tQbHVnaW4gZnJvbSAnY29weS13ZWJwYWNrLXBsdWdpbic7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtcbiAgQ29tcGlsZXIsXG4gIENvbmZpZ3VyYXRpb24sXG4gIENvbnRleHRSZXBsYWNlbWVudFBsdWdpbixcbiAgUnVsZVNldFJ1bGUsXG4gIFNvdXJjZU1hcERldlRvb2xQbHVnaW4sXG59IGZyb20gJ3dlYnBhY2snO1xuaW1wb3J0IHsgU3VicmVzb3VyY2VJbnRlZ3JpdHlQbHVnaW4gfSBmcm9tICd3ZWJwYWNrLXN1YnJlc291cmNlLWludGVncml0eSc7XG5pbXBvcnQgeyBBbmd1bGFyQmFiZWxMb2FkZXJPcHRpb25zIH0gZnJvbSAnLi4vLi4vYmFiZWwvd2VicGFjay1sb2FkZXInO1xuaW1wb3J0IHsgV2VicGFja0NvbmZpZ09wdGlvbnMgfSBmcm9tICcuLi8uLi91dGlscy9idWlsZC1vcHRpb25zJztcbmltcG9ydCB7IGFsbG93TWFuZ2xlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZW52aXJvbm1lbnQtb3B0aW9ucyc7XG5pbXBvcnQgeyBsb2FkRXNtTW9kdWxlIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9hZC1lc20nO1xuaW1wb3J0IHtcbiAgQ29tbW9uSnNVc2FnZVdhcm5QbHVnaW4sXG4gIERlZHVwZU1vZHVsZVJlc29sdmVQbHVnaW4sXG4gIEphdmFTY3JpcHRPcHRpbWl6ZXJQbHVnaW4sXG4gIEpzb25TdGF0c1BsdWdpbixcbiAgU2NyaXB0c1dlYnBhY2tQbHVnaW4sXG59IGZyb20gJy4uL3BsdWdpbnMnO1xuaW1wb3J0IHsgRGV2VG9vbHNJZ25vcmVQbHVnaW4gfSBmcm9tICcuLi9wbHVnaW5zL2RldnRvb2xzLWlnbm9yZS1wbHVnaW4nO1xuaW1wb3J0IHsgTmFtZWRDaHVua3NQbHVnaW4gfSBmcm9tICcuLi9wbHVnaW5zL25hbWVkLWNodW5rcy1wbHVnaW4nO1xuaW1wb3J0IHsgT2NjdXJyZW5jZXNQbHVnaW4gfSBmcm9tICcuLi9wbHVnaW5zL29jY3VycmVuY2VzLXBsdWdpbic7XG5pbXBvcnQgeyBQcm9ncmVzc1BsdWdpbiB9IGZyb20gJy4uL3BsdWdpbnMvcHJvZ3Jlc3MtcGx1Z2luJztcbmltcG9ydCB7IFRyYW5zZmVyU2l6ZVBsdWdpbiB9IGZyb20gJy4uL3BsdWdpbnMvdHJhbnNmZXItc2l6ZS1wbHVnaW4nO1xuaW1wb3J0IHsgY3JlYXRlSXZ5UGx1Z2luIH0gZnJvbSAnLi4vcGx1Z2lucy90eXBlc2NyaXB0JztcbmltcG9ydCB7IFdhdGNoRmlsZXNMb2dzUGx1Z2luIH0gZnJvbSAnLi4vcGx1Z2lucy93YXRjaC1maWxlcy1sb2dzLXBsdWdpbic7XG5pbXBvcnQge1xuICBhc3NldFBhdHRlcm5zLFxuICBnZXRDYWNoZVNldHRpbmdzLFxuICBnZXRJbnN0cnVtZW50YXRpb25FeGNsdWRlZFBhdGhzLFxuICBnZXRPdXRwdXRIYXNoRm9ybWF0LFxuICBnZXRTdGF0c09wdGlvbnMsXG4gIGdsb2JhbFNjcmlwdHNCeUJ1bmRsZU5hbWUsXG4gIGlzUGxhdGZvcm1TZXJ2ZXJJbnN0YWxsZWQsXG59IGZyb20gJy4uL3V0aWxzL2hlbHBlcnMnO1xuXG5jb25zdCBWRU5ET1JTX1RFU1QgPSAvW1xcXFwvXW5vZGVfbW9kdWxlc1tcXFxcL10vO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxpbmVzLXBlci1mdW5jdGlvblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbW1vbkNvbmZpZyh3Y286IFdlYnBhY2tDb25maWdPcHRpb25zKTogUHJvbWlzZTxDb25maWd1cmF0aW9uPiB7XG4gIGNvbnN0IHsgcm9vdCwgcHJvamVjdFJvb3QsIGJ1aWxkT3B0aW9ucywgdHNDb25maWcsIHByb2plY3ROYW1lLCBzb3VyY2VSb290LCB0c0NvbmZpZ1BhdGggfSA9IHdjbztcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIGNvZGVDb3ZlcmFnZSxcbiAgICBjcm9zc09yaWdpbiA9ICdub25lJyxcbiAgICBwbGF0Zm9ybSA9ICdicm93c2VyJyxcbiAgICBhb3QgPSB0cnVlLFxuICAgIGNvZGVDb3ZlcmFnZUV4Y2x1ZGUgPSBbXSxcbiAgICBtYWluLFxuICAgIHNvdXJjZU1hcDoge1xuICAgICAgc3R5bGVzOiBzdHlsZXNTb3VyY2VNYXAsXG4gICAgICBzY3JpcHRzOiBzY3JpcHRzU291cmNlTWFwLFxuICAgICAgdmVuZG9yOiB2ZW5kb3JTb3VyY2VNYXAsXG4gICAgICBoaWRkZW46IGhpZGRlblNvdXJjZU1hcCxcbiAgICB9LFxuICAgIG9wdGltaXphdGlvbjogeyBzdHlsZXM6IHN0eWxlc09wdGltaXphdGlvbiwgc2NyaXB0czogc2NyaXB0c09wdGltaXphdGlvbiB9LFxuICAgIGNvbW1vbkNodW5rLFxuICAgIHZlbmRvckNodW5rLFxuICAgIHN1YnJlc291cmNlSW50ZWdyaXR5LFxuICAgIHZlcmJvc2UsXG4gICAgcG9sbCxcbiAgICB3ZWJXb3JrZXJUc0NvbmZpZyxcbiAgICBleHRlcm5hbERlcGVuZGVuY2llcyA9IFtdLFxuICAgIGFsbG93ZWRDb21tb25Kc0RlcGVuZGVuY2llcyxcbiAgfSA9IGJ1aWxkT3B0aW9ucztcblxuICBjb25zdCBpc1BsYXRmb3JtU2VydmVyID0gYnVpbGRPcHRpb25zLnBsYXRmb3JtID09PSAnc2VydmVyJztcbiAgY29uc3QgZXh0cmFQbHVnaW5zOiB7IGFwcGx5KGNvbXBpbGVyOiBDb21waWxlcik6IHZvaWQgfVtdID0gW107XG4gIGNvbnN0IGV4dHJhUnVsZXM6IFJ1bGVTZXRSdWxlW10gPSBbXTtcbiAgY29uc3QgZW50cnlQb2ludHM6IENvbmZpZ3VyYXRpb25bJ2VudHJ5J10gPSB7fTtcblxuICAvLyBMb2FkIEVTTSBgQGFuZ3VsYXIvY29tcGlsZXItY2xpYCB1c2luZyB0aGUgVHlwZVNjcmlwdCBkeW5hbWljIGltcG9ydCB3b3JrYXJvdW5kLlxuICAvLyBPbmNlIFR5cGVTY3JpcHQgcHJvdmlkZXMgc3VwcG9ydCBmb3Iga2VlcGluZyB0aGUgZHluYW1pYyBpbXBvcnQgdGhpcyB3b3JrYXJvdW5kIGNhbiBiZVxuICAvLyBjaGFuZ2VkIHRvIGEgZGlyZWN0IGR5bmFtaWMgaW1wb3J0LlxuICBjb25zdCB7XG4gICAgR0xPQkFMX0RFRlNfRk9SX1RFUlNFUixcbiAgICBHTE9CQUxfREVGU19GT1JfVEVSU0VSX1dJVEhfQU9ULFxuICAgIFZFUlNJT046IE5HX1ZFUlNJT04sXG4gIH0gPSBhd2FpdCBsb2FkRXNtTW9kdWxlPHR5cGVvZiBpbXBvcnQoJ0Bhbmd1bGFyL2NvbXBpbGVyLWNsaScpPignQGFuZ3VsYXIvY29tcGlsZXItY2xpJyk7XG5cbiAgLy8gZGV0ZXJtaW5lIGhhc2hpbmcgZm9ybWF0XG4gIGNvbnN0IGhhc2hGb3JtYXQgPSBnZXRPdXRwdXRIYXNoRm9ybWF0KGJ1aWxkT3B0aW9ucy5vdXRwdXRIYXNoaW5nKTtcblxuICBpZiAoYnVpbGRPcHRpb25zLnByb2dyZXNzKSB7XG4gICAgZXh0cmFQbHVnaW5zLnB1c2gobmV3IFByb2dyZXNzUGx1Z2luKHBsYXRmb3JtKSk7XG4gIH1cblxuICBjb25zdCBsb2NhbGl6ZVBhY2thZ2VJbml0RW50cnlQb2ludCA9ICdAYW5ndWxhci9sb2NhbGl6ZS9pbml0JztcbiAgY29uc3QgaGFzTG9jYWxpemVUeXBlID0gdHNDb25maWcub3B0aW9ucy50eXBlcz8uc29tZShcbiAgICAodCkgPT4gdCA9PT0gJ0Bhbmd1bGFyL2xvY2FsaXplJyB8fCB0ID09PSBsb2NhbGl6ZVBhY2thZ2VJbml0RW50cnlQb2ludCxcbiAgKTtcblxuICBpZiAoaGFzTG9jYWxpemVUeXBlKSB7XG4gICAgZW50cnlQb2ludHNbJ21haW4nXSA9IFtsb2NhbGl6ZVBhY2thZ2VJbml0RW50cnlQb2ludF07XG4gIH1cblxuICBpZiAoYnVpbGRPcHRpb25zLm1haW4pIHtcbiAgICBjb25zdCBtYWluUGF0aCA9IHBhdGgucmVzb2x2ZShyb290LCBidWlsZE9wdGlvbnMubWFpbik7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZW50cnlQb2ludHNbJ21haW4nXSkpIHtcbiAgICAgIGVudHJ5UG9pbnRzWydtYWluJ10ucHVzaChtYWluUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudHJ5UG9pbnRzWydtYWluJ10gPSBbbWFpblBhdGhdO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc1BsYXRmb3JtU2VydmVyKSB7XG4gICAgLy8gRml4ZXMgQ3JpdGljYWwgZGVwZW5kZW5jeTogdGhlIHJlcXVlc3Qgb2YgYSBkZXBlbmRlbmN5IGlzIGFuIGV4cHJlc3Npb25cbiAgICBleHRyYVBsdWdpbnMucHVzaChuZXcgQ29udGV4dFJlcGxhY2VtZW50UGx1Z2luKC9AP2hhcGl8ZXhwcmVzc1tcXFxcL10vKSk7XG5cbiAgICBpZiAoaXNQbGF0Zm9ybVNlcnZlckluc3RhbGxlZCh3Y28ucm9vdCkgJiYgQXJyYXkuaXNBcnJheShlbnRyeVBvaW50c1snbWFpbiddKSkge1xuICAgICAgLy8gVGhpcyBpbXBvcnQgbXVzdCBjb21lIGJlZm9yZSBhbnkgaW1wb3J0cyAoZGlyZWN0IG9yIHRyYW5zaXRpdmUpIHRoYXQgcmVseSBvbiBET00gYnVpbHQtaW5zIGJlaW5nXG4gICAgICAvLyBhdmFpbGFibGUsIHN1Y2ggYXMgYEBhbmd1bGFyL2VsZW1lbnRzYC5cbiAgICAgIGVudHJ5UG9pbnRzWydtYWluJ10udW5zaGlmdCgnQGFuZ3VsYXIvcGxhdGZvcm0tc2VydmVyL2luaXQnKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwb2x5ZmlsbHMgPSBbLi4uYnVpbGRPcHRpb25zLnBvbHlmaWxsc107XG4gIGlmICghYW90KSB7XG4gICAgcG9seWZpbGxzLnB1c2goJ0Bhbmd1bGFyL2NvbXBpbGVyJyk7XG4gIH1cblxuICBpZiAocG9seWZpbGxzLmxlbmd0aCkge1xuICAgIC8vIGB6b25lLmpzL3Rlc3RpbmdgIGlzIGEgKipzcGVjaWFsKiogcG9seWZpbGwgYmVjYXVzZSB3aGVuIG5vdCBpbXBvcnRlZCBpbiB0aGUgbWFpbiBpdCBmYWlscyB3aXRoIHRoZSBiZWxvdyBlcnJvcnM6XG4gICAgLy8gYEVycm9yOiBFeHBlY3RlZCB0byBiZSBydW5uaW5nIGluICdQcm94eVpvbmUnLCBidXQgaXQgd2FzIG5vdCBmb3VuZC5gXG4gICAgLy8gVGhpcyB3YXMgYWxzbyB0aGUgcmVhc29uIHdoeSBwcmV2aW91c2x5IGl0IHdhcyBpbXBvcnRlZCBpbiBgdGVzdC50c2AgYXMgdGhlIGZpcnN0IG1vZHVsZS5cbiAgICAvLyBGcm9tIEppYSBsaTpcbiAgICAvLyBUaGlzIGlzIGJlY2F1c2UgdGhlIGphc21pbmUgZnVuY3Rpb25zIHN1Y2ggYXMgYmVmb3JlRWFjaC9pdCB3aWxsIG5vdCBiZSBwYXRjaGVkIGJ5IHpvbmUuanMgc2luY2VcbiAgICAvLyBqYXNtaW5lIHdpbGwgbm90IGJlIGxvYWRlZCB5ZXQsIHNvIHRoZSBQcm94eVpvbmUgd2lsbCBub3QgYmUgdGhlcmUuIFdlIGhhdmUgdG8gbG9hZCB6b25lLXRlc3RpbmcuanMgYWZ0ZXJcbiAgICAvLyBqYXNtaW5lIGlzIHJlYWR5LlxuICAgIC8vIFdlIGNvdWxkIGZvcmNlIGxvYWRpbmcgJ3pvbmUuanMvdGVzdGluZycgcHJpb3IgdG8gamFzbWluZSBieSBjaGFuZ2luZyB0aGUgb3JkZXIgb2Ygc2NyaXB0cyBpbiAna2FybWEtY29udGV4dC5odG1sJy5cbiAgICAvLyBCdXQgdGhpcyBoYXMgaXQncyBvd24gcHJvYmxlbXMgYXMgem9uZS5qcyBuZWVkcyB0byBiZSBsb2FkZWQgcHJpb3IgdG8gamFzbWluZSBkdWUgdG8gcGF0Y2hpbmcgb2YgdGltaW5nIGZ1bmN0aW9uc1xuICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2phc21pbmUvamFzbWluZS9pc3N1ZXMvMTk0NFxuICAgIC8vIFRodXMgdGhlIGNvcnJlY3Qgb3JkZXIgaXMgem9uZS5qcyAtPiBqYXNtaW5lIC0+IHpvbmUuanMvdGVzdGluZy5cbiAgICBjb25zdCB6b25lVGVzdGluZ0VudHJ5UG9pbnQgPSAnem9uZS5qcy90ZXN0aW5nJztcbiAgICBjb25zdCBwb2x5ZmlsbHNFeGx1ZGluZ1pvbmVUZXN0aW5nID0gcG9seWZpbGxzLmZpbHRlcigocCkgPT4gcCAhPT0gem9uZVRlc3RpbmdFbnRyeVBvaW50KTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5UG9pbnRzWydwb2x5ZmlsbHMnXSkpIHtcbiAgICAgIGVudHJ5UG9pbnRzWydwb2x5ZmlsbHMnXS5wdXNoKC4uLnBvbHlmaWxsc0V4bHVkaW5nWm9uZVRlc3RpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRyeVBvaW50c1sncG9seWZpbGxzJ10gPSBwb2x5ZmlsbHNFeGx1ZGluZ1pvbmVUZXN0aW5nO1xuICAgIH1cblxuICAgIGlmIChwb2x5ZmlsbHNFeGx1ZGluZ1pvbmVUZXN0aW5nLmxlbmd0aCAhPT0gcG9seWZpbGxzLmxlbmd0aCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZW50cnlQb2ludHNbJ21haW4nXSkpIHtcbiAgICAgICAgZW50cnlQb2ludHNbJ21haW4nXS51bnNoaWZ0KHpvbmVUZXN0aW5nRW50cnlQb2ludCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnRyeVBvaW50c1snbWFpbiddID0gW3pvbmVUZXN0aW5nRW50cnlQb2ludF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGFsbG93ZWRDb21tb25Kc0RlcGVuZGVuY2llcykge1xuICAgIC8vIFdoZW4gdGhpcyBpcyBub3QgZGVmaW5lZCBpdCBtZWFucyB0aGUgYnVpbGRlciBkb2Vzbid0IHN1cHBvcnQgc2hvd2luZyBjb21tb24ganMgdXNhZ2VzLlxuICAgIC8vIFdoZW4gaXQgZG9lcyBpdCB3aWxsIGJlIGFuIGFycmF5LlxuICAgIGV4dHJhUGx1Z2lucy5wdXNoKFxuICAgICAgbmV3IENvbW1vbkpzVXNhZ2VXYXJuUGx1Z2luKHtcbiAgICAgICAgYWxsb3dlZERlcGVuZGVuY2llczogYWxsb3dlZENvbW1vbkpzRGVwZW5kZW5jaWVzLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8vIHByb2Nlc3MgZ2xvYmFsIHNjcmlwdHNcbiAgLy8gQWRkIGEgbmV3IGFzc2V0IGZvciBlYWNoIGVudHJ5LlxuICBmb3IgKGNvbnN0IHsgYnVuZGxlTmFtZSwgaW5qZWN0LCBwYXRocyB9IG9mIGdsb2JhbFNjcmlwdHNCeUJ1bmRsZU5hbWUoYnVpbGRPcHRpb25zLnNjcmlwdHMpKSB7XG4gICAgLy8gTGF6eSBzY3JpcHRzIGRvbid0IGdldCBhIGhhc2gsIG90aGVyd2lzZSB0aGV5IGNhbid0IGJlIGxvYWRlZCBieSBuYW1lLlxuICAgIGNvbnN0IGhhc2ggPSBpbmplY3QgPyBoYXNoRm9ybWF0LnNjcmlwdCA6ICcnO1xuXG4gICAgZXh0cmFQbHVnaW5zLnB1c2goXG4gICAgICBuZXcgU2NyaXB0c1dlYnBhY2tQbHVnaW4oe1xuICAgICAgICBuYW1lOiBidW5kbGVOYW1lLFxuICAgICAgICBzb3VyY2VNYXA6IHNjcmlwdHNTb3VyY2VNYXAsXG4gICAgICAgIHNjcmlwdHM6IHBhdGhzLFxuICAgICAgICBmaWxlbmFtZTogYCR7cGF0aC5iYXNlbmFtZShidW5kbGVOYW1lKX0ke2hhc2h9LmpzYCxcbiAgICAgICAgYmFzZVBhdGg6IHJvb3QsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLy8gcHJvY2VzcyBhc3NldCBlbnRyaWVzXG4gIGlmIChidWlsZE9wdGlvbnMuYXNzZXRzLmxlbmd0aCkge1xuICAgIGV4dHJhUGx1Z2lucy5wdXNoKFxuICAgICAgbmV3IENvcHlXZWJwYWNrUGx1Z2luKHtcbiAgICAgICAgcGF0dGVybnM6IGFzc2V0UGF0dGVybnMocm9vdCwgYnVpbGRPcHRpb25zLmFzc2V0cyksXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgaWYgKGJ1aWxkT3B0aW9ucy5leHRyYWN0TGljZW5zZXMpIHtcbiAgICBjb25zdCBMaWNlbnNlV2VicGFja1BsdWdpbiA9IHJlcXVpcmUoJ2xpY2Vuc2Utd2VicGFjay1wbHVnaW4nKS5MaWNlbnNlV2VicGFja1BsdWdpbjtcbiAgICBleHRyYVBsdWdpbnMucHVzaChcbiAgICAgIG5ldyBMaWNlbnNlV2VicGFja1BsdWdpbih7XG4gICAgICAgIHN0YXRzOiB7XG4gICAgICAgICAgd2FybmluZ3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yczogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHBlckNodW5rT3V0cHV0OiBmYWxzZSxcbiAgICAgICAgb3V0cHV0RmlsZW5hbWU6ICczcmRwYXJ0eWxpY2Vuc2VzLnR4dCcsXG4gICAgICAgIHNraXBDaGlsZENvbXBpbGVyczogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBpZiAoc2NyaXB0c1NvdXJjZU1hcCB8fCBzdHlsZXNTb3VyY2VNYXApIHtcbiAgICBjb25zdCBpbmNsdWRlID0gW107XG4gICAgaWYgKHNjcmlwdHNTb3VyY2VNYXApIHtcbiAgICAgIGluY2x1ZGUucHVzaCgvanMkLyk7XG4gICAgfVxuXG4gICAgaWYgKHN0eWxlc1NvdXJjZU1hcCkge1xuICAgICAgaW5jbHVkZS5wdXNoKC9jc3MkLyk7XG4gICAgfVxuXG4gICAgZXh0cmFQbHVnaW5zLnB1c2gobmV3IERldlRvb2xzSWdub3JlUGx1Z2luKCkpO1xuXG4gICAgZXh0cmFQbHVnaW5zLnB1c2goXG4gICAgICBuZXcgU291cmNlTWFwRGV2VG9vbFBsdWdpbih7XG4gICAgICAgIGZpbGVuYW1lOiAnW2ZpbGVdLm1hcCcsXG4gICAgICAgIGluY2x1ZGUsXG4gICAgICAgIC8vIFdlIHdhbnQgdG8gc2V0IHNvdXJjZVJvb3QgdG8gIGB3ZWJwYWNrOi8vL2AgZm9yIG5vblxuICAgICAgICAvLyBpbmxpbmUgc291cmNlbWFwcyBhcyBvdGhlcndpc2UgcGF0aHMgdG8gc291cmNlbWFwcyB3aWxsIGJlIGJyb2tlbiBpbiBicm93c2VyXG4gICAgICAgIC8vIGB3ZWJwYWNrOi8vL2AgaXMgbmVlZGVkIGZvciBWaXN1YWwgU3R1ZGlvIGJyZWFrcG9pbnRzIHRvIHdvcmsgcHJvcGVybHkgYXMgY3VycmVudGx5XG4gICAgICAgIC8vIHRoZXJlIGlzIG5vIHdheSB0byBzZXQgdGhlICd3ZWJSb290J1xuICAgICAgICBzb3VyY2VSb290OiAnd2VicGFjazovLy8nLFxuICAgICAgICBtb2R1bGVGaWxlbmFtZVRlbXBsYXRlOiAnW3Jlc291cmNlLXBhdGhdJyxcbiAgICAgICAgYXBwZW5kOiBoaWRkZW5Tb3VyY2VNYXAgPyBmYWxzZSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBpZiAodmVyYm9zZSkge1xuICAgIGV4dHJhUGx1Z2lucy5wdXNoKG5ldyBXYXRjaEZpbGVzTG9nc1BsdWdpbigpKTtcbiAgfVxuXG4gIGlmIChidWlsZE9wdGlvbnMuc3RhdHNKc29uKSB7XG4gICAgZXh0cmFQbHVnaW5zLnB1c2goXG4gICAgICBuZXcgSnNvblN0YXRzUGx1Z2luKHBhdGgucmVzb2x2ZShyb290LCBidWlsZE9wdGlvbnMub3V0cHV0UGF0aCwgJ3N0YXRzLmpzb24nKSksXG4gICAgKTtcbiAgfVxuXG4gIGlmIChzdWJyZXNvdXJjZUludGVncml0eSkge1xuICAgIGV4dHJhUGx1Z2lucy5wdXNoKFxuICAgICAgbmV3IFN1YnJlc291cmNlSW50ZWdyaXR5UGx1Z2luKHtcbiAgICAgICAgaGFzaEZ1bmNOYW1lczogWydzaGEzODQnXSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBpZiAoc2NyaXB0c1NvdXJjZU1hcCB8fCBzdHlsZXNTb3VyY2VNYXApIHtcbiAgICBleHRyYVJ1bGVzLnB1c2goe1xuICAgICAgdGVzdDogL1xcLltjbV0/anN4PyQvLFxuICAgICAgZW5mb3JjZTogJ3ByZScsXG4gICAgICBsb2FkZXI6IHJlcXVpcmUucmVzb2x2ZSgnc291cmNlLW1hcC1sb2FkZXInKSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgZmlsdGVyU291cmNlTWFwcGluZ1VybDogKF9tYXBVcmk6IHN0cmluZywgcmVzb3VyY2VQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAodmVuZG9yU291cmNlTWFwKSB7XG4gICAgICAgICAgICAvLyBDb25zdW1lIGFsbCBzb3VyY2VtYXBzIHdoZW4gdmVuZG9yIG9wdGlvbiBpcyBlbmFibGVkLlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRG9uJ3QgY29uc3VtZSBzb3VyY2VtYXBzIGluIG5vZGVfbW9kdWxlcyB3aGVuIHZlbmRvciBpcyBkaXNhYmxlZC5cbiAgICAgICAgICAvLyBCdXQsIGRvIGNvbnN1bWUgbG9jYWwgbGlicmFyaWVzIHNvdXJjZW1hcHMuXG4gICAgICAgICAgcmV0dXJuICFyZXNvdXJjZVBhdGguaW5jbHVkZXMoJ25vZGVfbW9kdWxlcycpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChtYWluIHx8IHBvbHlmaWxscykge1xuICAgIGV4dHJhUnVsZXMucHVzaCh7XG4gICAgICB0ZXN0OiB0c0NvbmZpZy5vcHRpb25zLmFsbG93SnMgPyAvXFwuW2NtXT9bdGpdc3g/JC8gOiAvXFwuW2NtXT90c3g/JC8sXG4gICAgICBsb2FkZXI6IEFuZ3VsYXJXZWJwYWNrTG9hZGVyUGF0aCxcbiAgICAgIC8vIFRoZSBiZWxvdyBhcmUga25vd24gcGF0aHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIFR5cGVTY3JpcHQgY29tcGlsYXRpb24gZXZlbiB3aGVuIGFsbG93SnMgaXMgZW5hYmxlZC5cbiAgICAgIGV4Y2x1ZGU6IFtcbiAgICAgICAgL1tcXFxcL11ub2RlX21vZHVsZXNbL1xcXFxdKD86Y3NzLWxvYWRlcnxtaW5pLWNzcy1leHRyYWN0LXBsdWdpbnx3ZWJwYWNrLWRldi1zZXJ2ZXJ8d2VicGFjaylbL1xcXFxdLyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZXh0cmFQbHVnaW5zLnB1c2goY3JlYXRlSXZ5UGx1Z2luKHdjbywgYW90LCB0c0NvbmZpZ1BhdGgpKTtcbiAgfVxuXG4gIGlmICh3ZWJXb3JrZXJUc0NvbmZpZykge1xuICAgIGV4dHJhUGx1Z2lucy5wdXNoKGNyZWF0ZUl2eVBsdWdpbih3Y28sIGZhbHNlLCBwYXRoLnJlc29sdmUod2NvLnJvb3QsIHdlYldvcmtlclRzQ29uZmlnKSkpO1xuICB9XG5cbiAgY29uc3QgZXh0cmFNaW5pbWl6ZXJzID0gW107XG4gIGlmIChzY3JpcHRzT3B0aW1pemF0aW9uKSB7XG4gICAgZXh0cmFNaW5pbWl6ZXJzLnB1c2goXG4gICAgICBuZXcgSmF2YVNjcmlwdE9wdGltaXplclBsdWdpbih7XG4gICAgICAgIGRlZmluZTogYnVpbGRPcHRpb25zLmFvdCA/IEdMT0JBTF9ERUZTX0ZPUl9URVJTRVJfV0lUSF9BT1QgOiBHTE9CQUxfREVGU19GT1JfVEVSU0VSLFxuICAgICAgICBzb3VyY2VtYXA6IHNjcmlwdHNTb3VyY2VNYXAsXG4gICAgICAgIHN1cHBvcnRlZEJyb3dzZXJzOiBidWlsZE9wdGlvbnMuc3VwcG9ydGVkQnJvd3NlcnMsXG4gICAgICAgIGtlZXBJZGVudGlmaWVyTmFtZXM6ICFhbGxvd01hbmdsZSB8fCBpc1BsYXRmb3JtU2VydmVyLFxuICAgICAgICBrZWVwTmFtZXM6IGlzUGxhdGZvcm1TZXJ2ZXIsXG4gICAgICAgIHJlbW92ZUxpY2Vuc2VzOiBidWlsZE9wdGlvbnMuZXh0cmFjdExpY2Vuc2VzLFxuICAgICAgICBhZHZhbmNlZDogYnVpbGRPcHRpb25zLmJ1aWxkT3B0aW1pemVyLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIGlmIChwbGF0Zm9ybSA9PT0gJ2Jyb3dzZXInICYmIChzY3JpcHRzT3B0aW1pemF0aW9uIHx8IHN0eWxlc09wdGltaXphdGlvbi5taW5pZnkpKSB7XG4gICAgZXh0cmFNaW5pbWl6ZXJzLnB1c2gobmV3IFRyYW5zZmVyU2l6ZVBsdWdpbigpKTtcbiAgfVxuXG4gIGxldCBjcm9zc09yaWdpbkxvYWRpbmc6IE5vbk51bGxhYmxlPENvbmZpZ3VyYXRpb25bJ291dHB1dCddPlsnY3Jvc3NPcmlnaW5Mb2FkaW5nJ10gPSBmYWxzZTtcbiAgaWYgKHN1YnJlc291cmNlSW50ZWdyaXR5ICYmIGNyb3NzT3JpZ2luID09PSAnbm9uZScpIHtcbiAgICBjcm9zc09yaWdpbkxvYWRpbmcgPSAnYW5vbnltb3VzJztcbiAgfSBlbHNlIGlmIChjcm9zc09yaWdpbiAhPT0gJ25vbmUnKSB7XG4gICAgY3Jvc3NPcmlnaW5Mb2FkaW5nID0gY3Jvc3NPcmlnaW47XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1vZGU6IHNjcmlwdHNPcHRpbWl6YXRpb24gfHwgc3R5bGVzT3B0aW1pemF0aW9uLm1pbmlmeSA/ICdwcm9kdWN0aW9uJyA6ICdkZXZlbG9wbWVudCcsXG4gICAgZGV2dG9vbDogZmFsc2UsXG4gICAgdGFyZ2V0OiBbaXNQbGF0Zm9ybVNlcnZlciA/ICdub2RlJyA6ICd3ZWInLCAnZXMyMDE1J10sXG4gICAgcHJvZmlsZTogYnVpbGRPcHRpb25zLnN0YXRzSnNvbixcbiAgICByZXNvbHZlOiB7XG4gICAgICByb290czogW3Byb2plY3RSb290XSxcbiAgICAgIGV4dGVuc2lvbnM6IFsnLnRzJywgJy50c3gnLCAnLm1qcycsICcuanMnXSxcbiAgICAgIHN5bWxpbmtzOiAhYnVpbGRPcHRpb25zLnByZXNlcnZlU3ltbGlua3MsXG4gICAgICBtb2R1bGVzOiBbdHNDb25maWcub3B0aW9ucy5iYXNlVXJsIHx8IHByb2plY3RSb290LCAnbm9kZV9tb2R1bGVzJ10sXG4gICAgICBtYWluRmllbGRzOiBpc1BsYXRmb3JtU2VydmVyXG4gICAgICAgID8gWydlczIwMjAnLCAnZXMyMDE1JywgJ21vZHVsZScsICdtYWluJ11cbiAgICAgICAgOiBbJ2VzMjAyMCcsICdlczIwMTUnLCAnYnJvd3NlcicsICdtb2R1bGUnLCAnbWFpbiddLFxuICAgICAgY29uZGl0aW9uTmFtZXM6IFsnZXMyMDIwJywgJ2VzMjAxNScsICcuLi4nXSxcbiAgICB9LFxuICAgIHJlc29sdmVMb2FkZXI6IHtcbiAgICAgIHN5bWxpbmtzOiAhYnVpbGRPcHRpb25zLnByZXNlcnZlU3ltbGlua3MsXG4gICAgfSxcbiAgICBjb250ZXh0OiByb290LFxuICAgIGVudHJ5OiBlbnRyeVBvaW50cyxcbiAgICBleHRlcm5hbHM6IGV4dGVybmFsRGVwZW5kZW5jaWVzLFxuICAgIG91dHB1dDoge1xuICAgICAgdW5pcXVlTmFtZTogcHJvamVjdE5hbWUsXG4gICAgICBoYXNoRnVuY3Rpb246ICd4eGhhc2g2NCcsIC8vIHRvZG86IHJlbW92ZSBpbiB3ZWJwYWNrIDYuIFRoaXMgaXMgcGFydCBvZiBgZnV0dXJlRGVmYXVsdHNgLlxuICAgICAgY2xlYW46IGJ1aWxkT3B0aW9ucy5kZWxldGVPdXRwdXRQYXRoID8/IHRydWUsXG4gICAgICBwYXRoOiBwYXRoLnJlc29sdmUocm9vdCwgYnVpbGRPcHRpb25zLm91dHB1dFBhdGgpLFxuICAgICAgcHVibGljUGF0aDogYnVpbGRPcHRpb25zLmRlcGxveVVybCA/PyAnJyxcbiAgICAgIGZpbGVuYW1lOiBgW25hbWVdJHtoYXNoRm9ybWF0LmNodW5rfS5qc2AsXG4gICAgICBjaHVua0ZpbGVuYW1lOiBgW25hbWVdJHtoYXNoRm9ybWF0LmNodW5rfS5qc2AsXG4gICAgICBsaWJyYXJ5VGFyZ2V0OiBpc1BsYXRmb3JtU2VydmVyID8gJ2NvbW1vbmpzJyA6IHVuZGVmaW5lZCxcbiAgICAgIGNyb3NzT3JpZ2luTG9hZGluZyxcbiAgICAgIHRydXN0ZWRUeXBlczogJ2FuZ3VsYXIjYnVuZGxlcicsXG4gICAgICBzY3JpcHRUeXBlOiAnbW9kdWxlJyxcbiAgICB9LFxuICAgIHdhdGNoOiBidWlsZE9wdGlvbnMud2F0Y2gsXG4gICAgd2F0Y2hPcHRpb25zOiB7XG4gICAgICBwb2xsLFxuICAgICAgLy8gVGhlIGJlbG93IGlzIG5lZWRlZCBhcyB3aGVuIHByZXNlcnZlU3ltbGlua3MgaXMgZW5hYmxlZCB3ZSBkaXNhYmxlIGByZXNvbHZlLnN5bWxpbmtzYC5cbiAgICAgIGZvbGxvd1N5bWxpbmtzOiBidWlsZE9wdGlvbnMucHJlc2VydmVTeW1saW5rcyxcbiAgICAgIGlnbm9yZWQ6IHBvbGwgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICcqKi9ub2RlX21vZHVsZXMvKionLFxuICAgIH0sXG4gICAgc25hcHNob3Q6IHtcbiAgICAgIG1vZHVsZToge1xuICAgICAgICAvLyBVc2UgaGFzaCBvZiBjb250ZW50IGluc3RlYWQgb2YgdGltZXN0YW1wIGJlY2F1c2UgdGhlIHRpbWVzdGFtcCBvZiB0aGUgc3ltbGluayB3aWxsIGJlIHVzZWRcbiAgICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgcmVmZXJlbmNlZCBmaWxlcyB3aGljaCBjYXVzZXMgY2hhbmdlcyBpbiBzeW1saW5rcyBub3QgdG8gYmUgcGlja2VkIHVwLlxuICAgICAgICBoYXNoOiBidWlsZE9wdGlvbnMucHJlc2VydmVTeW1saW5rcyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBwZXJmb3JtYW5jZToge1xuICAgICAgaGludHM6IGZhbHNlLFxuICAgIH0sXG4gICAgaWdub3JlV2FybmluZ3M6IFtcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJwYWNrLWNvbnRyaWIvc291cmNlLW1hcC1sb2FkZXIvYmxvYi9iMmRlNDI0OWM3NDMxZGQ4NDMyZGE2MDdlMDhmMGY2NWU5ZDY0MjE5L3NyYy9pbmRleC5qcyNMODNcbiAgICAgIC9GYWlsZWQgdG8gcGFyc2Ugc291cmNlIG1hcCBmcm9tLyxcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJwYWNrLWNvbnRyaWIvcG9zdGNzcy1sb2FkZXIvYmxvYi9iZDI2MTg3NWZkZjljNTk2YWY0ZmZiM2ExYTczZmUzYzU0OWJlZmRhL3NyYy9pbmRleC5qcyNMMTUzLUwxNThcbiAgICAgIC9BZGQgcG9zdGNzcyBhcyBwcm9qZWN0IGRlcGVuZGVuY3kvLFxuICAgICAgLy8gZXNidWlsZCB3aWxsIGlzc3VlIGEgd2FybmluZywgd2hpbGUgc3RpbGwgaG9pc3RzIHRoZSBAY2hhcnNldCBhdCB0aGUgdmVyeSB0b3AuXG4gICAgICAvLyBUaGlzIGlzIGNhdXNlZCBieSBhIGJ1ZyBpbiBjc3MtbG9hZGVyIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJwYWNrLWNvbnRyaWIvY3NzLWxvYWRlci9pc3N1ZXMvMTIxMlxuICAgICAgL1wiQGNoYXJzZXRcIiBtdXN0IGJlIHRoZSBmaXJzdCBydWxlIGluIHRoZSBmaWxlLyxcbiAgICBdLFxuICAgIG1vZHVsZToge1xuICAgICAgLy8gU2hvdyBhbiBlcnJvciBmb3IgbWlzc2luZyBleHBvcnRzIGluc3RlYWQgb2YgYSB3YXJuaW5nLlxuICAgICAgc3RyaWN0RXhwb3J0UHJlc2VuY2U6IHRydWUsXG4gICAgICBwYXJzZXI6IHtcbiAgICAgICAgamF2YXNjcmlwdDoge1xuICAgICAgICAgIHJlcXVpcmVDb250ZXh0OiBmYWxzZSxcbiAgICAgICAgICAvLyBEaXNhYmxlIGF1dG8gVVJMIGFzc2V0IG1vZHVsZSBjcmVhdGlvbi4gVGhpcyBkb2Vzbid0IGVmZmVjdCBgbmV3IFdvcmtlcihuZXcgVVJMKC4uLikpYFxuICAgICAgICAgIC8vIGh0dHBzOi8vd2VicGFjay5qcy5vcmcvZ3VpZGVzL2Fzc2V0LW1vZHVsZXMvI3VybC1hc3NldHNcbiAgICAgICAgICB1cmw6IGZhbHNlLFxuICAgICAgICAgIHdvcmtlcjogISF3ZWJXb3JrZXJUc0NvbmZpZyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBydWxlczogW1xuICAgICAgICB7XG4gICAgICAgICAgdGVzdDogL1xcLj8oc3ZnfGh0bWwpJC8sXG4gICAgICAgICAgLy8gT25seSBwcm9jZXNzIEhUTUwgYW5kIFNWRyB3aGljaCBhcmUga25vd24gQW5ndWxhciBjb21wb25lbnQgcmVzb3VyY2VzLlxuICAgICAgICAgIHJlc291cmNlUXVlcnk6IC9cXD9uZ1Jlc291cmNlLyxcbiAgICAgICAgICB0eXBlOiAnYXNzZXQvc291cmNlJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIC8vIE1hcmsgZmlsZXMgaW5zaWRlIGByeGpzL2FkZGAgYXMgY29udGFpbmluZyBzaWRlIGVmZmVjdHMuXG4gICAgICAgICAgLy8gSWYgdGhpcyBpcyBmaXhlZCB1cHN0cmVhbSBhbmQgdGhlIGZpeGVkIHZlcnNpb24gYmVjb21lcyB0aGUgbWluaW11bVxuICAgICAgICAgIC8vIHN1cHBvcnRlZCB2ZXJzaW9uLCB0aGlzIGNhbiBiZSByZW1vdmVkLlxuICAgICAgICAgIHRlc3Q6IC9bL1xcXFxdcnhqc1svXFxcXF1hZGRbL1xcXFxdLitcXC5qcyQvLFxuICAgICAgICAgIHNpZGVFZmZlY3RzOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGVzdDogL1xcLltjbV0/W3RqXXN4PyQvLFxuICAgICAgICAgIC8vIFRoZSBiZWxvdyBpcyBuZWVkZWQgZHVlIHRvIGEgYnVnIGluIGBAYmFiZWwvcnVudGltZWAuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JhYmVsL2JhYmVsL2lzc3Vlcy8xMjgyNFxuICAgICAgICAgIHJlc29sdmU6IHsgZnVsbHlTcGVjaWZpZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgZXhjbHVkZTogW1xuICAgICAgICAgICAgL1tcXFxcL11ub2RlX21vZHVsZXNbL1xcXFxdKD86Y29yZS1qc3xAYmFiZWx8dHNsaWJ8d2ViLWFuaW1hdGlvbnMtanN8d2ViLXN0cmVhbXMtcG9seWZpbGx8d2hhdHdnLXVybClbL1xcXFxdLyxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHVzZTogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsb2FkZXI6IHJlcXVpcmUucmVzb2x2ZSgnLi4vLi4vYmFiZWwvd2VicGFjay1sb2FkZXInKSxcbiAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgIGNhY2hlRGlyZWN0b3J5OiAoY2FjaGUuZW5hYmxlZCAmJiBwYXRoLmpvaW4oY2FjaGUucGF0aCwgJ2JhYmVsLXdlYnBhY2snKSkgfHwgZmFsc2UsXG4gICAgICAgICAgICAgICAgYW90OiBidWlsZE9wdGlvbnMuYW90LFxuICAgICAgICAgICAgICAgIG9wdGltaXplOiBidWlsZE9wdGlvbnMuYnVpbGRPcHRpbWl6ZXIsXG4gICAgICAgICAgICAgICAgc3VwcG9ydGVkQnJvd3NlcnM6IGJ1aWxkT3B0aW9ucy5zdXBwb3J0ZWRCcm93c2VycyxcbiAgICAgICAgICAgICAgICBpbnN0cnVtZW50Q29kZTogY29kZUNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZEJhc2VQYXRoOiBzb3VyY2VSb290ID8/IHByb2plY3RSb290LFxuICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVkUGF0aHM6IGdldEluc3RydW1lbnRhdGlvbkV4Y2x1ZGVkUGF0aHMocm9vdCwgY29kZUNvdmVyYWdlRXhjbHVkZSksXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB9IGFzIEFuZ3VsYXJCYWJlbExvYWRlck9wdGlvbnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmV4dHJhUnVsZXMsXG4gICAgICBdLFxuICAgIH0sXG4gICAgZXhwZXJpbWVudHM6IHtcbiAgICAgIGJhY2tDb21wYXQ6IGZhbHNlLFxuICAgICAgc3luY1dlYkFzc2VtYmx5OiB0cnVlLFxuICAgICAgYXN5bmNXZWJBc3NlbWJseTogdHJ1ZSxcbiAgICAgIHRvcExldmVsQXdhaXQ6IGZhbHNlLFxuICAgIH0sXG4gICAgaW5mcmFzdHJ1Y3R1cmVMb2dnaW5nOiB7XG4gICAgICBkZWJ1ZzogdmVyYm9zZSxcbiAgICAgIGxldmVsOiB2ZXJib3NlID8gJ3ZlcmJvc2UnIDogJ2Vycm9yJyxcbiAgICB9LFxuICAgIHN0YXRzOiBnZXRTdGF0c09wdGlvbnModmVyYm9zZSksXG4gICAgY2FjaGU6IGdldENhY2hlU2V0dGluZ3Mod2NvLCBOR19WRVJTSU9OLmZ1bGwpLFxuICAgIG9wdGltaXphdGlvbjoge1xuICAgICAgbWluaW1pemVyOiBleHRyYU1pbmltaXplcnMsXG4gICAgICBtb2R1bGVJZHM6ICdkZXRlcm1pbmlzdGljJyxcbiAgICAgIGNodW5rSWRzOiBidWlsZE9wdGlvbnMubmFtZWRDaHVua3MgPyAnbmFtZWQnIDogJ2RldGVybWluaXN0aWMnLFxuICAgICAgZW1pdE9uRXJyb3JzOiBmYWxzZSxcbiAgICAgIHJ1bnRpbWVDaHVuazogaXNQbGF0Zm9ybVNlcnZlciA/IGZhbHNlIDogJ3NpbmdsZScsXG4gICAgICBzcGxpdENodW5rczoge1xuICAgICAgICBtYXhBc3luY1JlcXVlc3RzOiBJbmZpbml0eSxcbiAgICAgICAgY2FjaGVHcm91cHM6IHtcbiAgICAgICAgICBkZWZhdWx0OiAhIWNvbW1vbkNodW5rICYmIHtcbiAgICAgICAgICAgIGNodW5rczogJ2FzeW5jJyxcbiAgICAgICAgICAgIG1pbkNodW5rczogMixcbiAgICAgICAgICAgIHByaW9yaXR5OiAxMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbW1vbjogISFjb21tb25DaHVuayAmJiB7XG4gICAgICAgICAgICBuYW1lOiAnY29tbW9uJyxcbiAgICAgICAgICAgIGNodW5rczogJ2FzeW5jJyxcbiAgICAgICAgICAgIG1pbkNodW5rczogMixcbiAgICAgICAgICAgIGVuZm9yY2U6IHRydWUsXG4gICAgICAgICAgICBwcmlvcml0eTogNSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZlbmRvcnM6IGZhbHNlLFxuICAgICAgICAgIGRlZmF1bHRWZW5kb3JzOiAhIXZlbmRvckNodW5rICYmIHtcbiAgICAgICAgICAgIG5hbWU6ICd2ZW5kb3InLFxuICAgICAgICAgICAgY2h1bmtzOiAoY2h1bmspID0+IGNodW5rLm5hbWUgPT09ICdtYWluJyxcbiAgICAgICAgICAgIGVuZm9yY2U6IHRydWUsXG4gICAgICAgICAgICB0ZXN0OiBWRU5ET1JTX1RFU1QsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBwbHVnaW5zOiBbXG4gICAgICBuZXcgTmFtZWRDaHVua3NQbHVnaW4oKSxcbiAgICAgIG5ldyBPY2N1cnJlbmNlc1BsdWdpbih7XG4gICAgICAgIGFvdCxcbiAgICAgICAgc2NyaXB0c09wdGltaXphdGlvbixcbiAgICAgIH0pLFxuICAgICAgbmV3IERlZHVwZU1vZHVsZVJlc29sdmVQbHVnaW4oeyB2ZXJib3NlIH0pLFxuICAgICAgLi4uZXh0cmFQbHVnaW5zLFxuICAgIF0sXG4gICAgbm9kZTogZmFsc2UsXG4gIH07XG59XG4iXX0=