@anansi/webpack-config
Version:
Production ready webpack for React
228 lines (227 loc) • 29.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
exports.__esModule = true;
exports.default = makeBaseConfig;
exports.getStyleRules = void 0;
var _miniCssExtractPlugin = _interopRequireDefault(require("mini-css-extract-plugin"));
var _path = _interopRequireDefault(require("path"));
var _tsconfigPathsWebpackPlugin = _interopRequireDefault(require("tsconfig-paths-webpack-plugin"));
var _webpackStatsPlugin = require("webpack-stats-plugin");
var _constants = require("./constants");
exports.ROOT_PATH = _constants.ROOT_PATH;
var _generateBabelLoader = require("./generateBabelLoader");
var _nodePolyfill = require("./node-polyfill");
var _package = require("../../package.json");
var _css = _interopRequireDefault(require("./css"));
exports.getStyleRules = _css.default;
function makeBaseConfig({
rootPath,
basePath,
libraryInclude,
libraryExclude,
babelRoot,
buildDir,
mode,
manifestFilename,
babelLoader: babelLoaderOptions,
extraJsLoaders,
inJSOptions,
tsconfigPathsOptions,
svgoOptions,
svgrOptions,
globalStyleDir,
nohash,
argv,
env,
cssExtractOptions,
library
}) {
const WEBPACK_PUBLIC_HOST = process.env.WEBPACK_PUBLIC_HOST || '';
const WEBPACK_PUBLIC_PATH = process.env.WEBPACK_PUBLIC_PATH || '/';
const modules = [_path.default.join(rootPath, basePath), 'node_modules'];
if (globalStyleDir) {
modules.splice(1, 0, _path.default.join(rootPath, basePath, globalStyleDir));
}
const resolve = {
modules,
extensions: ['.ts', '.tsx', '.mts', '.cts', '...'],
extensionAlias: {
'.js': ['.js', '.ts', '.tsx', '.jsx'],
'.mjs': ['.mjs', '.mts'],
'.cjs': ['.cjs', '.cts']
},
fallback: _nodePolyfill.NODE_ALIAS,
plugins: tsconfigPathsOptions !== false ? [new _tsconfigPathsWebpackPlugin.default(tsconfigPathsOptions)] : []
};
const mainBabelLoader = (0, _generateBabelLoader.generateBabelLoader)({
rootPath,
babelRoot,
target: argv?.target,
mode,
babelLoaderOptions,
library
});
const inJSBabelOptions = {
...mainBabelLoader.options
};
delete inJSBabelOptions.cacheDirectory;
delete inJSBabelOptions.cacheIdentifier;
delete inJSBabelOptions.cacheCompression;
if (inJSOptions !== false) {
if (inJSOptions === undefined) {
inJSOptions = {
sourceMap: mode !== 'production'
};
}
extraJsLoaders = [{
loader: require.resolve('@wyw-in-js/webpack-loader'),
options: {
// `resolveOptions` was dropped in https://github.com/callstack/linaria/pull/1001 as it uses webpack directly
//resolveOptions: { ...resolve },
babelOptions: inJSBabelOptions,
...inJSOptions
}
}, ...extraJsLoaders];
}
const plugins = [new _webpackStatsPlugin.StatsWriterPlugin({
filename: manifestFilename,
stats: {
chunkModules: false,
source: false,
chunks: false,
modules: false,
assets: true
}
})];
if (cssExtractOptions !== false) {
plugins.push(new _miniCssExtractPlugin.default({
filename: mode !== 'production' | nohash ? '[name].css' : '[name].[contenthash].css',
chunkFilename: mode !== 'production' | nohash ? '[name].css' : '[name].[contenthash].css',
...cssExtractOptions
}));
}
const assetModuleFilename = nohash || mode !== 'production' ? '[name].[ext][query]' : '[contenthash].[ext][query]';
const config = {
context: rootPath,
entry: {
[env?.name || 'App']: [env?.entrypath || `./${basePath}`]
},
output: {
path: _path.default.join(rootPath, buildDir),
publicPath: WEBPACK_PUBLIC_HOST + WEBPACK_PUBLIC_PATH,
filename: nohash || mode !== 'production' ? '[name].js' : '[name]-[contenthash].js',
chunkFilename: nohash || mode !== 'production' ? '[name].chunk.js' : '[name]-[contenthash].chunk.js',
assetModuleFilename,
globalObject: "(typeof self !== 'undefined' ? self : this)",
// this improves performance and makes this compatible across node 16 and 18 at the same time.
hashFunction: 'xxhash64'
},
cache: {
type: 'filesystem',
buildDependencies: {
config: [__filename] // you may omit this when your CLI automatically adds it
},
// Environment variables that affect webpack output
version: JSON.stringify({
version: _package.version,
target: argv?.target,
mode,
envVars: [process.env.NODE_ENV, process.env.BROWSERSLIST_ENV, process.env.BABEL_ENV, WEBPACK_PUBLIC_HOST, WEBPACK_PUBLIC_PATH, process.env.WEBPACK_ANALYZE, process.env.DEBUG, process.env.NODE_DEBUG
// avoid collisions while being minimal and performant
].join('\0')
})
},
plugins: plugins,
module: {
rules: [{
test: /\.(t|j)sx?$/,
include: [_path.default.join(rootPath, basePath), _path.default.join(rootPath, 'stories'), /\.storybook/, libraryInclude],
exclude: libraryExclude,
oneOf: [/* TODO(deprecated): Drop this once people have a chance to migrate */
{
test: /\.worker\.(t|j)s$/,
include: [new RegExp(basePath), libraryInclude],
use: [{
loader: require.resolve('worker-loader'),
options: {
inline: 'fallback',
filename: nohash ? '[name].js' : mode === 'production' ? '[name]-[contenthash].js' : '[name].js'
}
}, (0, _generateBabelLoader.generateBabelLoader)({
rootPath,
babelRoot,
target: argv?.target,
mode,
babelLoaderOptions,
noHotReload: true
})]
}, {
test: /\.(t|j)sx?$/,
use: [mainBabelLoader, ...extraJsLoaders].filter(l => l)
}]
}, {
test: /\.html$/,
use: [{
loader: require.resolve('html-loader')
}]
}, {
test: /\.(md|txt)$/,
type: 'asset/source'
}, {
test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
oneOf: [{
issuer: /\.(j|t)sx?$/,
use: [{
loader: require.resolve('@svgr/webpack'),
options: {
svgoConfig: svgoOptions,
...svgrOptions
}
}, {
loader: require.resolve('file-loader'),
options: {
name: nohash || mode !== 'production' ? '[name].[ext][query]' : '[md5:contenthash:base64:8].[ext][query]'
}
}],
type: 'javascript/auto'
},
// for non-js files always use file-loader
{
type: 'asset',
generator: {
emit: !argv?.target?.includes?.('node')
}
}]
}, {
test: /\.(apng|png|jpg|gif|ico|webp|avif|cur|ani|otf|eot|woff2|woff|ttf)(\?v=\d+\.\d+\.\d+)?$/,
type: 'asset',
generator: {
emit: !argv?.target?.includes?.('node')
}
}, {
test: /\.(pdf|mp4|webm|wav|mp3|m4a|aac|oga)(\?v=\d+\.\d+\.\d+)?$/,
type: 'asset/resource',
generator: {
emit: !argv?.target?.includes?.('node')
}
}]
},
resolve,
devtool: 'source-map',
stats: {
children: false,
chunks: false,
excludeAssets: [/\.map/]
}
};
if (env?.name) config.name = env.name;
if (process.env.WEBPACK_NO_CACHE === true || process.env.WEBPACK_NO_CACHE === 'true' || process.env.WEBPACK_CACHE === 'none') {
delete config.cache;
} else if (process.env.WEBPACK_CACHE === 'memory') {
config.cache = true;
} else if (process.env.WEBPACK_CACHE === 'filesystem') {
config.cache.type = 'filesystem';
}
return config;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWluaUNzc0V4dHJhY3RQbHVnaW4iLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9wYXRoIiwiX3RzY29uZmlnUGF0aHNXZWJwYWNrUGx1Z2luIiwiX3dlYnBhY2tTdGF0c1BsdWdpbiIsIl9jb25zdGFudHMiLCJleHBvcnRzIiwiUk9PVF9QQVRIIiwiX2dlbmVyYXRlQmFiZWxMb2FkZXIiLCJfbm9kZVBvbHlmaWxsIiwiX3BhY2thZ2UiLCJfY3NzIiwiZ2V0U3R5bGVSdWxlcyIsImRlZmF1bHQiLCJtYWtlQmFzZUNvbmZpZyIsInJvb3RQYXRoIiwiYmFzZVBhdGgiLCJsaWJyYXJ5SW5jbHVkZSIsImxpYnJhcnlFeGNsdWRlIiwiYmFiZWxSb290IiwiYnVpbGREaXIiLCJtb2RlIiwibWFuaWZlc3RGaWxlbmFtZSIsImJhYmVsTG9hZGVyIiwiYmFiZWxMb2FkZXJPcHRpb25zIiwiZXh0cmFKc0xvYWRlcnMiLCJpbkpTT3B0aW9ucyIsInRzY29uZmlnUGF0aHNPcHRpb25zIiwic3Znb09wdGlvbnMiLCJzdmdyT3B0aW9ucyIsImdsb2JhbFN0eWxlRGlyIiwibm9oYXNoIiwiYXJndiIsImVudiIsImNzc0V4dHJhY3RPcHRpb25zIiwibGlicmFyeSIsIldFQlBBQ0tfUFVCTElDX0hPU1QiLCJwcm9jZXNzIiwiV0VCUEFDS19QVUJMSUNfUEFUSCIsIm1vZHVsZXMiLCJwYXRoIiwiam9pbiIsInNwbGljZSIsInJlc29sdmUiLCJleHRlbnNpb25zIiwiZXh0ZW5zaW9uQWxpYXMiLCJmYWxsYmFjayIsIk5PREVfQUxJQVMiLCJwbHVnaW5zIiwiVHNjb25maWdQYXRoc1BsdWdpbiIsIm1haW5CYWJlbExvYWRlciIsImdlbmVyYXRlQmFiZWxMb2FkZXIiLCJ0YXJnZXQiLCJpbkpTQmFiZWxPcHRpb25zIiwib3B0aW9ucyIsImNhY2hlRGlyZWN0b3J5IiwiY2FjaGVJZGVudGlmaWVyIiwiY2FjaGVDb21wcmVzc2lvbiIsInVuZGVmaW5lZCIsInNvdXJjZU1hcCIsImxvYWRlciIsImJhYmVsT3B0aW9ucyIsIlN0YXRzV3JpdGVyUGx1Z2luIiwiZmlsZW5hbWUiLCJzdGF0cyIsImNodW5rTW9kdWxlcyIsInNvdXJjZSIsImNodW5rcyIsImFzc2V0cyIsInB1c2giLCJNaW5pQ3NzRXh0cmFjdFBsdWdpbiIsImNodW5rRmlsZW5hbWUiLCJhc3NldE1vZHVsZUZpbGVuYW1lIiwiY29uZmlnIiwiY29udGV4dCIsImVudHJ5IiwibmFtZSIsImVudHJ5cGF0aCIsIm91dHB1dCIsInB1YmxpY1BhdGgiLCJnbG9iYWxPYmplY3QiLCJoYXNoRnVuY3Rpb24iLCJjYWNoZSIsInR5cGUiLCJidWlsZERlcGVuZGVuY2llcyIsIl9fZmlsZW5hbWUiLCJ2ZXJzaW9uIiwiSlNPTiIsInN0cmluZ2lmeSIsImVudlZhcnMiLCJOT0RFX0VOViIsIkJST1dTRVJTTElTVF9FTlYiLCJCQUJFTF9FTlYiLCJXRUJQQUNLX0FOQUxZWkUiLCJERUJVRyIsIk5PREVfREVCVUciLCJtb2R1bGUiLCJydWxlcyIsInRlc3QiLCJpbmNsdWRlIiwiZXhjbHVkZSIsIm9uZU9mIiwiUmVnRXhwIiwidXNlIiwiaW5saW5lIiwibm9Ib3RSZWxvYWQiLCJmaWx0ZXIiLCJsIiwiaXNzdWVyIiwic3Znb0NvbmZpZyIsImdlbmVyYXRvciIsImVtaXQiLCJpbmNsdWRlcyIsImRldnRvb2wiLCJjaGlsZHJlbiIsImV4Y2x1ZGVBc3NldHMiLCJXRUJQQUNLX05PX0NBQ0hFIiwiV0VCUEFDS19DQUNIRSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYXNlL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNaW5pQ3NzRXh0cmFjdFBsdWdpbiBmcm9tICdtaW5pLWNzcy1leHRyYWN0LXBsdWdpbic7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBUc2NvbmZpZ1BhdGhzUGx1Z2luIGZyb20gJ3RzY29uZmlnLXBhdGhzLXdlYnBhY2stcGx1Z2luJztcbmltcG9ydCB7IFN0YXRzV3JpdGVyUGx1Z2luIH0gZnJvbSAnd2VicGFjay1zdGF0cy1wbHVnaW4nO1xuXG5pbXBvcnQgeyBST09UX1BBVEggfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUJhYmVsTG9hZGVyIH0gZnJvbSAnLi9nZW5lcmF0ZUJhYmVsTG9hZGVyJztcbmltcG9ydCB7IE5PREVfQUxJQVMgfSBmcm9tICcuL25vZGUtcG9seWZpbGwnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uLy4uL3BhY2thZ2UuanNvbic7XG5cbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ2V0U3R5bGVSdWxlcyB9IGZyb20gJy4vY3NzJztcbmV4cG9ydCB7IFJPT1RfUEFUSCB9O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYWtlQmFzZUNvbmZpZyh7XG4gIHJvb3RQYXRoLFxuICBiYXNlUGF0aCxcbiAgbGlicmFyeUluY2x1ZGUsXG4gIGxpYnJhcnlFeGNsdWRlLFxuICBiYWJlbFJvb3QsXG4gIGJ1aWxkRGlyLFxuICBtb2RlLFxuICBtYW5pZmVzdEZpbGVuYW1lLFxuICBiYWJlbExvYWRlcjogYmFiZWxMb2FkZXJPcHRpb25zLFxuICBleHRyYUpzTG9hZGVycyxcbiAgaW5KU09wdGlvbnMsXG4gIHRzY29uZmlnUGF0aHNPcHRpb25zLFxuICBzdmdvT3B0aW9ucyxcbiAgc3Znck9wdGlvbnMsXG4gIGdsb2JhbFN0eWxlRGlyLFxuICBub2hhc2gsXG4gIGFyZ3YsXG4gIGVudixcbiAgY3NzRXh0cmFjdE9wdGlvbnMsXG4gIGxpYnJhcnksXG59KSB7XG4gIGNvbnN0IFdFQlBBQ0tfUFVCTElDX0hPU1QgPSBwcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19IT1NUIHx8ICcnO1xuICBjb25zdCBXRUJQQUNLX1BVQkxJQ19QQVRIID0gcHJvY2Vzcy5lbnYuV0VCUEFDS19QVUJMSUNfUEFUSCB8fCAnLyc7XG5cbiAgY29uc3QgbW9kdWxlcyA9IFtwYXRoLmpvaW4ocm9vdFBhdGgsIGJhc2VQYXRoKSwgJ25vZGVfbW9kdWxlcyddO1xuICBpZiAoZ2xvYmFsU3R5bGVEaXIpIHtcbiAgICBtb2R1bGVzLnNwbGljZSgxLCAwLCBwYXRoLmpvaW4ocm9vdFBhdGgsIGJhc2VQYXRoLCBnbG9iYWxTdHlsZURpcikpO1xuICB9XG4gIGNvbnN0IHJlc29sdmUgPSB7XG4gICAgbW9kdWxlcyxcbiAgICBleHRlbnNpb25zOiBbJy50cycsICcudHN4JywgJy5tdHMnLCAnLmN0cycsICcuLi4nXSxcbiAgICBleHRlbnNpb25BbGlhczoge1xuICAgICAgJy5qcyc6IFsnLmpzJywgJy50cycsICcudHN4JywgJy5qc3gnXSxcbiAgICAgICcubWpzJzogWycubWpzJywgJy5tdHMnXSxcbiAgICAgICcuY2pzJzogWycuY2pzJywgJy5jdHMnXSxcbiAgICB9LFxuICAgIGZhbGxiYWNrOiBOT0RFX0FMSUFTLFxuICAgIHBsdWdpbnM6XG4gICAgICB0c2NvbmZpZ1BhdGhzT3B0aW9ucyAhPT0gZmFsc2UgP1xuICAgICAgICBbbmV3IFRzY29uZmlnUGF0aHNQbHVnaW4odHNjb25maWdQYXRoc09wdGlvbnMpXVxuICAgICAgOiBbXSxcbiAgfTtcblxuICBjb25zdCBtYWluQmFiZWxMb2FkZXIgPSBnZW5lcmF0ZUJhYmVsTG9hZGVyKHtcbiAgICByb290UGF0aCxcbiAgICBiYWJlbFJvb3QsXG4gICAgdGFyZ2V0OiBhcmd2Py50YXJnZXQsXG4gICAgbW9kZSxcbiAgICBiYWJlbExvYWRlck9wdGlvbnMsXG4gICAgbGlicmFyeSxcbiAgfSk7XG4gIGNvbnN0IGluSlNCYWJlbE9wdGlvbnMgPSB7XG4gICAgLi4ubWFpbkJhYmVsTG9hZGVyLm9wdGlvbnMsXG4gIH07XG4gIGRlbGV0ZSBpbkpTQmFiZWxPcHRpb25zLmNhY2hlRGlyZWN0b3J5O1xuICBkZWxldGUgaW5KU0JhYmVsT3B0aW9ucy5jYWNoZUlkZW50aWZpZXI7XG4gIGRlbGV0ZSBpbkpTQmFiZWxPcHRpb25zLmNhY2hlQ29tcHJlc3Npb247XG5cbiAgaWYgKGluSlNPcHRpb25zICE9PSBmYWxzZSkge1xuICAgIGlmIChpbkpTT3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbkpTT3B0aW9ucyA9IHtcbiAgICAgICAgc291cmNlTWFwOiBtb2RlICE9PSAncHJvZHVjdGlvbicsXG4gICAgICB9O1xuICAgIH1cbiAgICBleHRyYUpzTG9hZGVycyA9IFtcbiAgICAgIHtcbiAgICAgICAgbG9hZGVyOiByZXF1aXJlLnJlc29sdmUoJ0B3eXctaW4tanMvd2VicGFjay1sb2FkZXInKSxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIC8vIGByZXNvbHZlT3B0aW9uc2Agd2FzIGRyb3BwZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL2NhbGxzdGFjay9saW5hcmlhL3B1bGwvMTAwMSBhcyBpdCB1c2VzIHdlYnBhY2sgZGlyZWN0bHlcbiAgICAgICAgICAvL3Jlc29sdmVPcHRpb25zOiB7IC4uLnJlc29sdmUgfSxcbiAgICAgICAgICBiYWJlbE9wdGlvbnM6IGluSlNCYWJlbE9wdGlvbnMsXG4gICAgICAgICAgLi4uaW5KU09wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgLi4uZXh0cmFKc0xvYWRlcnMsXG4gICAgXTtcbiAgfVxuXG4gIGNvbnN0IHBsdWdpbnMgPSBbXG4gICAgbmV3IFN0YXRzV3JpdGVyUGx1Z2luKHtcbiAgICAgIGZpbGVuYW1lOiBtYW5pZmVzdEZpbGVuYW1lLFxuICAgICAgc3RhdHM6IHtcbiAgICAgICAgY2h1bmtNb2R1bGVzOiBmYWxzZSxcbiAgICAgICAgc291cmNlOiBmYWxzZSxcbiAgICAgICAgY2h1bmtzOiBmYWxzZSxcbiAgICAgICAgbW9kdWxlczogZmFsc2UsXG4gICAgICAgIGFzc2V0czogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSksXG4gIF07XG5cbiAgaWYgKGNzc0V4dHJhY3RPcHRpb25zICE9PSBmYWxzZSkge1xuICAgIHBsdWdpbnMucHVzaChcbiAgICAgIG5ldyBNaW5pQ3NzRXh0cmFjdFBsdWdpbih7XG4gICAgICAgIGZpbGVuYW1lOlxuICAgICAgICAgIChtb2RlICE9PSAncHJvZHVjdGlvbicpIHwgbm9oYXNoID9cbiAgICAgICAgICAgICdbbmFtZV0uY3NzJ1xuICAgICAgICAgIDogJ1tuYW1lXS5bY29udGVudGhhc2hdLmNzcycsXG4gICAgICAgIGNodW5rRmlsZW5hbWU6XG4gICAgICAgICAgKG1vZGUgIT09ICdwcm9kdWN0aW9uJykgfCBub2hhc2ggP1xuICAgICAgICAgICAgJ1tuYW1lXS5jc3MnXG4gICAgICAgICAgOiAnW25hbWVdLltjb250ZW50aGFzaF0uY3NzJyxcbiAgICAgICAgLi4uY3NzRXh0cmFjdE9wdGlvbnMsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgYXNzZXRNb2R1bGVGaWxlbmFtZSA9XG4gICAgbm9oYXNoIHx8IG1vZGUgIT09ICdwcm9kdWN0aW9uJyA/XG4gICAgICAnW25hbWVdLltleHRdW3F1ZXJ5XSdcbiAgICA6ICdbY29udGVudGhhc2hdLltleHRdW3F1ZXJ5XSc7XG4gIGNvbnN0IGNvbmZpZyA9IHtcbiAgICBjb250ZXh0OiByb290UGF0aCxcbiAgICBlbnRyeToge1xuICAgICAgW2Vudj8ubmFtZSB8fCAnQXBwJ106IFtlbnY/LmVudHJ5cGF0aCB8fCBgLi8ke2Jhc2VQYXRofWBdLFxuICAgIH0sXG4gICAgb3V0cHV0OiB7XG4gICAgICBwYXRoOiBwYXRoLmpvaW4ocm9vdFBhdGgsIGJ1aWxkRGlyKSxcbiAgICAgIHB1YmxpY1BhdGg6IFdFQlBBQ0tfUFVCTElDX0hPU1QgKyBXRUJQQUNLX1BVQkxJQ19QQVRILFxuICAgICAgZmlsZW5hbWU6XG4gICAgICAgIG5vaGFzaCB8fCBtb2RlICE9PSAncHJvZHVjdGlvbicgP1xuICAgICAgICAgICdbbmFtZV0uanMnXG4gICAgICAgIDogJ1tuYW1lXS1bY29udGVudGhhc2hdLmpzJyxcbiAgICAgIGNodW5rRmlsZW5hbWU6XG4gICAgICAgIG5vaGFzaCB8fCBtb2RlICE9PSAncHJvZHVjdGlvbicgP1xuICAgICAgICAgICdbbmFtZV0uY2h1bmsuanMnXG4gICAgICAgIDogJ1tuYW1lXS1bY29udGVudGhhc2hdLmNodW5rLmpzJyxcbiAgICAgIGFzc2V0TW9kdWxlRmlsZW5hbWUsXG4gICAgICBnbG9iYWxPYmplY3Q6IFwiKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzKVwiLFxuICAgICAgLy8gdGhpcyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBhbmQgbWFrZXMgdGhpcyBjb21wYXRpYmxlIGFjcm9zcyBub2RlIDE2IGFuZCAxOCBhdCB0aGUgc2FtZSB0aW1lLlxuICAgICAgaGFzaEZ1bmN0aW9uOiAneHhoYXNoNjQnLFxuICAgIH0sXG4gICAgY2FjaGU6IHtcbiAgICAgIHR5cGU6ICdmaWxlc3lzdGVtJyxcbiAgICAgIGJ1aWxkRGVwZW5kZW5jaWVzOiB7XG4gICAgICAgIGNvbmZpZzogW19fZmlsZW5hbWVdLCAvLyB5b3UgbWF5IG9taXQgdGhpcyB3aGVuIHlvdXIgQ0xJIGF1dG9tYXRpY2FsbHkgYWRkcyBpdFxuICAgICAgfSxcbiAgICAgIC8vIEVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IGFmZmVjdCB3ZWJwYWNrIG91dHB1dFxuICAgICAgdmVyc2lvbjogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICB0YXJnZXQ6IGFyZ3Y/LnRhcmdldCxcbiAgICAgICAgbW9kZSxcbiAgICAgICAgZW52VmFyczogW1xuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WLFxuICAgICAgICAgIHByb2Nlc3MuZW52LkJST1dTRVJTTElTVF9FTlYsXG4gICAgICAgICAgcHJvY2Vzcy5lbnYuQkFCRUxfRU5WLFxuICAgICAgICAgIFdFQlBBQ0tfUFVCTElDX0hPU1QsXG4gICAgICAgICAgV0VCUEFDS19QVUJMSUNfUEFUSCxcbiAgICAgICAgICBwcm9jZXNzLmVudi5XRUJQQUNLX0FOQUxZWkUsXG4gICAgICAgICAgcHJvY2Vzcy5lbnYuREVCVUcsXG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyxcbiAgICAgICAgICAvLyBhdm9pZCBjb2xsaXNpb25zIHdoaWxlIGJlaW5nIG1pbmltYWwgYW5kIHBlcmZvcm1hbnRcbiAgICAgICAgXS5qb2luKCdcXDAnKSxcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgcGx1Z2luczogcGx1Z2lucyxcbiAgICBtb2R1bGU6IHtcbiAgICAgIHJ1bGVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXN0OiAvXFwuKHR8ailzeD8kLyxcbiAgICAgICAgICBpbmNsdWRlOiBbXG4gICAgICAgICAgICBwYXRoLmpvaW4ocm9vdFBhdGgsIGJhc2VQYXRoKSxcbiAgICAgICAgICAgIHBhdGguam9pbihyb290UGF0aCwgJ3N0b3JpZXMnKSxcbiAgICAgICAgICAgIC9cXC5zdG9yeWJvb2svLFxuICAgICAgICAgICAgbGlicmFyeUluY2x1ZGUsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBleGNsdWRlOiBsaWJyYXJ5RXhjbHVkZSxcbiAgICAgICAgICBvbmVPZjogW1xuICAgICAgICAgICAgLyogVE9ETyhkZXByZWNhdGVkKTogRHJvcCB0aGlzIG9uY2UgcGVvcGxlIGhhdmUgYSBjaGFuY2UgdG8gbWlncmF0ZSAqL1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0ZXN0OiAvXFwud29ya2VyXFwuKHR8ailzJC8sXG4gICAgICAgICAgICAgIGluY2x1ZGU6IFtuZXcgUmVnRXhwKGJhc2VQYXRoKSwgbGlicmFyeUluY2x1ZGVdLFxuICAgICAgICAgICAgICB1c2U6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBsb2FkZXI6IHJlcXVpcmUucmVzb2x2ZSgnd29ya2VyLWxvYWRlcicpLFxuICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICBpbmxpbmU6ICdmYWxsYmFjaycsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOlxuICAgICAgICAgICAgICAgICAgICAgIG5vaGFzaCA/ICdbbmFtZV0uanMnXG4gICAgICAgICAgICAgICAgICAgICAgOiBtb2RlID09PSAncHJvZHVjdGlvbicgPyAnW25hbWVdLVtjb250ZW50aGFzaF0uanMnXG4gICAgICAgICAgICAgICAgICAgICAgOiAnW25hbWVdLmpzJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUJhYmVsTG9hZGVyKHtcbiAgICAgICAgICAgICAgICAgIHJvb3RQYXRoLFxuICAgICAgICAgICAgICAgICAgYmFiZWxSb290LFxuICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBhcmd2Py50YXJnZXQsXG4gICAgICAgICAgICAgICAgICBtb2RlLFxuICAgICAgICAgICAgICAgICAgYmFiZWxMb2FkZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgbm9Ib3RSZWxvYWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0ZXN0OiAvXFwuKHR8ailzeD8kLyxcbiAgICAgICAgICAgICAgdXNlOiBbbWFpbkJhYmVsTG9hZGVyLCAuLi5leHRyYUpzTG9hZGVyc10uZmlsdGVyKGwgPT4gbCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXN0OiAvXFwuaHRtbCQvLFxuICAgICAgICAgIHVzZTogW3sgbG9hZGVyOiByZXF1aXJlLnJlc29sdmUoJ2h0bWwtbG9hZGVyJykgfV0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXN0OiAvXFwuKG1kfHR4dCkkLyxcbiAgICAgICAgICB0eXBlOiAnYXNzZXQvc291cmNlJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRlc3Q6IC9cXC5zdmcoXFw/dj1cXGQrXFwuXFxkK1xcLlxcZCspPyQvLFxuICAgICAgICAgIG9uZU9mOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlzc3VlcjogL1xcLihqfHQpc3g/JC8sXG4gICAgICAgICAgICAgIHVzZTogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGxvYWRlcjogcmVxdWlyZS5yZXNvbHZlKCdAc3Znci93ZWJwYWNrJyksXG4gICAgICAgICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIHN2Z29Db25maWc6IHN2Z29PcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAuLi5zdmdyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBsb2FkZXI6IHJlcXVpcmUucmVzb2x2ZSgnZmlsZS1sb2FkZXInKSxcbiAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTpcbiAgICAgICAgICAgICAgICAgICAgICBub2hhc2ggfHwgbW9kZSAhPT0gJ3Byb2R1Y3Rpb24nID9cbiAgICAgICAgICAgICAgICAgICAgICAgICdbbmFtZV0uW2V4dF1bcXVlcnldJ1xuICAgICAgICAgICAgICAgICAgICAgIDogJ1ttZDU6Y29udGVudGhhc2g6YmFzZTY0OjhdLltleHRdW3F1ZXJ5XScsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHR5cGU6ICdqYXZhc2NyaXB0L2F1dG8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIGZvciBub24tanMgZmlsZXMgYWx3YXlzIHVzZSBmaWxlLWxvYWRlclxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAnYXNzZXQnLFxuICAgICAgICAgICAgICBnZW5lcmF0b3I6IHtcbiAgICAgICAgICAgICAgICBlbWl0OiAhYXJndj8udGFyZ2V0Py5pbmNsdWRlcz8uKCdub2RlJyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXN0OiAvXFwuKGFwbmd8cG5nfGpwZ3xnaWZ8aWNvfHdlYnB8YXZpZnxjdXJ8YW5pfG90Znxlb3R8d29mZjJ8d29mZnx0dGYpKFxcP3Y9XFxkK1xcLlxcZCtcXC5cXGQrKT8kLyxcbiAgICAgICAgICB0eXBlOiAnYXNzZXQnLFxuICAgICAgICAgIGdlbmVyYXRvcjoge1xuICAgICAgICAgICAgZW1pdDogIWFyZ3Y/LnRhcmdldD8uaW5jbHVkZXM/Lignbm9kZScpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXN0OiAvXFwuKHBkZnxtcDR8d2VibXx3YXZ8bXAzfG00YXxhYWN8b2dhKShcXD92PVxcZCtcXC5cXGQrXFwuXFxkKyk/JC8sXG4gICAgICAgICAgdHlwZTogJ2Fzc2V0L3Jlc291cmNlJyxcbiAgICAgICAgICBnZW5lcmF0b3I6IHtcbiAgICAgICAgICAgIGVtaXQ6ICFhcmd2Py50YXJnZXQ/LmluY2x1ZGVzPy4oJ25vZGUnKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHJlc29sdmUsXG4gICAgZGV2dG9vbDogJ3NvdXJjZS1tYXAnLFxuICAgIHN0YXRzOiB7XG4gICAgICBjaGlsZHJlbjogZmFsc2UsXG4gICAgICBjaHVua3M6IGZhbHNlLFxuICAgICAgZXhjbHVkZUFzc2V0czogWy9cXC5tYXAvXSxcbiAgICB9LFxuICB9O1xuICBpZiAoZW52Py5uYW1lKSBjb25maWcubmFtZSA9IGVudi5uYW1lO1xuXG4gIGlmIChcbiAgICBwcm9jZXNzLmVudi5XRUJQQUNLX05PX0NBQ0hFID09PSB0cnVlIHx8XG4gICAgcHJvY2Vzcy5lbnYuV0VCUEFDS19OT19DQUNIRSA9PT0gJ3RydWUnIHx8XG4gICAgcHJvY2Vzcy5lbnYuV0VCUEFDS19DQUNIRSA9PT0gJ25vbmUnXG4gICkge1xuICAgIGRlbGV0ZSBjb25maWcuY2FjaGU7XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuV0VCUEFDS19DQUNIRSA9PT0gJ21lbW9yeScpIHtcbiAgICBjb25maWcuY2FjaGUgPSB0cnVlO1xuICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52LldFQlBBQ0tfQ0FDSEUgPT09ICdmaWxlc3lzdGVtJykge1xuICAgIGNvbmZpZy5jYWNoZS50eXBlID0gJ2ZpbGVzeXN0ZW0nO1xuICB9XG4gIHJldHVybiBjb25maWc7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLHFCQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxLQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSwyQkFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsbUJBQUEsR0FBQUgsT0FBQTtBQUVBLElBQUFJLFVBQUEsR0FBQUosT0FBQTtBQUF3Q0ssT0FBQSxDQUFBQyxTQUFBLEdBQUFGLFVBQUEsQ0FBQUUsU0FBQTtBQUN4QyxJQUFBQyxvQkFBQSxHQUFBUCxPQUFBO0FBQ0EsSUFBQVEsYUFBQSxHQUFBUixPQUFBO0FBQ0EsSUFBQVMsUUFBQSxHQUFBVCxPQUFBO0FBRUEsSUFBQVUsSUFBQSxHQUFBWCxzQkFBQSxDQUFBQyxPQUFBO0FBQWlESyxPQUFBLENBQUFNLGFBQUEsR0FBQUQsSUFBQSxDQUFBRSxPQUFBO0FBR2xDLFNBQVNDLGNBQWNBLENBQUM7RUFDckNDLFFBQVE7RUFDUkMsUUFBUTtFQUNSQyxjQUFjO0VBQ2RDLGNBQWM7RUFDZEMsU0FBUztFQUNUQyxRQUFRO0VBQ1JDLElBQUk7RUFDSkMsZ0JBQWdCO0VBQ2hCQyxXQUFXLEVBQUVDLGtCQUFrQjtFQUMvQkMsY0FBYztFQUNkQyxXQUFXO0VBQ1hDLG9CQUFvQjtFQUNwQkMsV0FBVztFQUNYQyxXQUFX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