grind-assets
Version:
Asset management for Grind
192 lines (146 loc) • 23.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.AssetsProvider = AssetsProvider;
var _AssetFactory = require("./AssetFactory.js");
var _PublishCommand = require("./Commands/PublishCommand.js");
var _UnpublishCommand = require("./Commands/UnpublishCommand.js");
var _BabelCompiler = require("./Compilers/BabelCompiler");
var _RawCompiler = require("./Compilers/RawCompiler.js");
var _ScssCompiler = require("./Compilers/ScssCompiler.js");
var _CssPostCssPostProcessor = require("./PostProcessors/CssPostCssPostProcessor.js");
var _CssMinifyPostProcessor = require("./PostProcessors/CssMinifyPostProcessor.js");
var _JavascriptMinifyPostProcessor = require("./PostProcessors/JavascriptMinifyPostProcessor.js");
var _SvgOptimizePostProcessor = require("./PostProcessors/SvgOptimizePostProcessor.js");
var _CompileController = require("./Controllers/CompileController.js");
var _AssetContainer = require("./View/AssetContainer.js");
var _NunjucksExtension = require("./View/NunjucksExtension.js");
var _StoneExtension = require("./View/StoneExtension.js");
function _isnil(val) { return val === null || typeof val === 'undefined'; }
const path = require('path');
const nodeModuleMacroPattern = new RegExp(`\\{\\{\\s*node_module:'(.+?)'\\s*\\}\\}`, 'g');
function expandMacros(config, macros) {
const isArray = Array.isArray(config);
let reindex = false;
for (const key of Object.keys(config)) {
let value = config[key];
if (typeof value === 'string' && nodeModuleMacroPattern.test(value)) {
try {
value = value.replace(nodeModuleMacroPattern, (_, name) => {
return path.dirname(require.resolve(`${name}/package.json`));
});
config[key] = value;
} catch (error) {
Log.warn(`WARNING: Could not resolve ${value}`);
}
}
if (typeof value === 'object' && value !== null) {
config[key] = expandMacros(value, macros);
continue;
} else if (typeof value !== 'string') {
continue;
}
for (const macro of macros) {
const pattern = macro[0];
const replacement = macro[1];
if (!_isnil(replacement)) {
config[key] = value.replace(pattern, replacement);
} else if (value.match(pattern)) {
reindex = isArray;
delete config[key];
}
}
}
if (reindex) {
config = Array.from(config).filter(value => _isnil(value) === false);
}
return config;
}
function AssetsProvider(app, parameters = {}) {
const preset = app.config.get('assets.preset');
if (!_isnil(preset)) {
app.config.loadDefault('assets', path.join(__dirname, `../config/presets/${preset}.json`));
}
app.config.loadDefault('assets', path.join(__dirname, '../config/assets.json'));
let config = Object.assign({}, app.config.get('assets'));
const macros = [['node_modules', config.node_modules || app.paths.base('node_modules')], ['app_path', app.paths.app()], ['base_path', app.paths.base()], ['public_path', app.paths.public()]];
for (const macro of macros) {
macro[0] = new RegExp(`\\{\\{\\s*${macro[0]}\\s*\\}\\}`, 'g');
}
config = expandMacros(config, macros);
app.config.set('assets', config);
const publishPath = app.paths.base(app.config.get('assets.paths.publish'), '/');
if (!publishPath.startsWith(app.paths.public('/'))) {
throw new Error('`assets.paths.publish` must be contained within the public path.');
}
const shouldOptimize = typeof config.should_optimize === 'boolean' ? config.should_optimize : !app.debug;
const liveReload = config.live_reload === true;
const sourceMaps = config.source_maps === 'auto' ? 'auto' : false;
const factory = new _AssetFactory.AssetFactory(app, shouldOptimize, sourceMaps, liveReload);
app.assets = factory;
factory.registerCompiler(_BabelCompiler.BabelCompiler);
factory.registerCompiler(_RawCompiler.RawCompiler);
factory.registerCompiler(_ScssCompiler.ScssCompiler);
factory.registerPostProcessor(_CssMinifyPostProcessor.CssMinifyPostProcessor);
factory.registerPostProcessor(_CssPostCssPostProcessor.CssPostCssPostProcessor);
factory.registerPostProcessor(_JavascriptMinifyPostProcessor.JavascriptMinifyPostProcessor);
factory.registerPostProcessor(_SvgOptimizePostProcessor.SvgOptimizePostProcessor);
app.assets.controller = new _CompileController.CompileController(app, factory);
const cors = (req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
return next();
};
app.routes.group({
prefix: 'assets',
controller: app.assets.controller
}, routes => {
routes.use(cors);
routes.get(':type/:a?/:b?/:c?/:d?/:e?', 'compile');
});
const dirs = new Set();
const published = app.config.get('assets-published', {});
for (const src of Object.keys(published)) {
dirs.add(published[src].replace(/^\//, '').split(/\//)[0]);
}
app.routes.group(routes => {
routes.use(cors);
for (const dir of dirs) {
routes.static(dir, dir, {
lastModified: true,
maxAge: 864000000
});
}
});
if (!_isnil(app.cli)) {
app.cli.register(_PublishCommand.PublishCommand);
app.cli.register(_UnpublishCommand.UnpublishCommand);
}
let hasAssetContainer = false;
if (!_isnil(app.view)) {
if (app.view.engineName === 'nunjucks') {
const nunjucksExtensionClass = parameters.nunjucksExtensionClass || _NunjucksExtension.NunjucksExtension;
app.view.extend('AssetExtension', new nunjucksExtensionClass());
} else if (app.view.engineName === 'stone') {
const stoneExtensionClass = parameters.stoneExtensionClass || _StoneExtension.StoneExtension;
stoneExtensionClass.extend(app.view);
} else {
Log.error('WARNING: Unsupported view engine, assets can not extend.');
}
const assetContainerClass = parameters.assetContainerClass || _AssetContainer.AssetContainer;
hasAssetContainer = true;
app.routes.use((req, res, next) => {
res.locals.assetPath = (path, secure) => factory.publishedPath(path, req, secure);
res.locals._assetContainer = new assetContainerClass(req, res, factory, app.view);
next();
});
}
if (liveReload) {
if (!hasAssetContainer) {
throw new Error('grind-asset’s live reload functionality must be used with grind-view.');
}
require('./Devtools/DevtoolsProvider').DevtoolsProvider(app);
}
}
AssetsProvider.priority = 10000;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Bc3NldHNQcm92aWRlci5qcyJdLCJuYW1lcyI6WyJwYXRoIiwicmVxdWlyZSIsIm5vZGVNb2R1bGVNYWNyb1BhdHRlcm4iLCJSZWdFeHAiLCJleHBhbmRNYWNyb3MiLCJjb25maWciLCJtYWNyb3MiLCJpc0FycmF5IiwiQXJyYXkiLCJyZWluZGV4Iiwia2V5IiwiT2JqZWN0Iiwia2V5cyIsInZhbHVlIiwidGVzdCIsInJlcGxhY2UiLCJfIiwibmFtZSIsImRpcm5hbWUiLCJyZXNvbHZlIiwiZXJyb3IiLCJMb2ciLCJ3YXJuIiwibWFjcm8iLCJwYXR0ZXJuIiwicmVwbGFjZW1lbnQiLCJtYXRjaCIsImZyb20iLCJmaWx0ZXIiLCJBc3NldHNQcm92aWRlciIsImFwcCIsInBhcmFtZXRlcnMiLCJwcmVzZXQiLCJnZXQiLCJsb2FkRGVmYXVsdCIsImpvaW4iLCJfX2Rpcm5hbWUiLCJhc3NpZ24iLCJub2RlX21vZHVsZXMiLCJwYXRocyIsImJhc2UiLCJwdWJsaWMiLCJzZXQiLCJwdWJsaXNoUGF0aCIsInN0YXJ0c1dpdGgiLCJFcnJvciIsInNob3VsZE9wdGltaXplIiwic2hvdWxkX29wdGltaXplIiwiZGVidWciLCJsaXZlUmVsb2FkIiwibGl2ZV9yZWxvYWQiLCJzb3VyY2VNYXBzIiwic291cmNlX21hcHMiLCJmYWN0b3J5IiwiQXNzZXRGYWN0b3J5IiwiYXNzZXRzIiwicmVnaXN0ZXJDb21waWxlciIsIkJhYmVsQ29tcGlsZXIiLCJSYXdDb21waWxlciIsIlNjc3NDb21waWxlciIsInJlZ2lzdGVyUG9zdFByb2Nlc3NvciIsIkNzc01pbmlmeVBvc3RQcm9jZXNzb3IiLCJDc3NQb3N0Q3NzUG9zdFByb2Nlc3NvciIsIkphdmFzY3JpcHRNaW5pZnlQb3N0UHJvY2Vzc29yIiwiU3ZnT3B0aW1pemVQb3N0UHJvY2Vzc29yIiwiY29udHJvbGxlciIsIkNvbXBpbGVDb250cm9sbGVyIiwiY29ycyIsInJlcSIsInJlcyIsIm5leHQiLCJoZWFkZXIiLCJyb3V0ZXMiLCJncm91cCIsInByZWZpeCIsInVzZSIsImRpcnMiLCJTZXQiLCJwdWJsaXNoZWQiLCJzcmMiLCJhZGQiLCJzcGxpdCIsImRpciIsInN0YXRpYyIsImxhc3RNb2RpZmllZCIsIm1heEFnZSIsImNsaSIsInJlZ2lzdGVyIiwiUHVibGlzaENvbW1hbmQiLCJVbnB1Ymxpc2hDb21tYW5kIiwiaGFzQXNzZXRDb250YWluZXIiLCJ2aWV3IiwiZW5naW5lTmFtZSIsIm51bmp1Y2tzRXh0ZW5zaW9uQ2xhc3MiLCJOdW5qdWNrc0V4dGVuc2lvbiIsImV4dGVuZCIsInN0b25lRXh0ZW5zaW9uQ2xhc3MiLCJTdG9uZUV4dGVuc2lvbiIsImFzc2V0Q29udGFpbmVyQ2xhc3MiLCJBc3NldENvbnRhaW5lciIsImxvY2FscyIsImFzc2V0UGF0aCIsInNlY3VyZSIsInB1Ymxpc2hlZFBhdGgiLCJfYXNzZXRDb250YWluZXIiLCJEZXZ0b29sc1Byb3ZpZGVyIiwicHJpb3JpdHkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlQSxNQUFNQSxJQUFJLEdBQUdDLE9BQU8sQ0FBQyxNQUFELENBQXBCOztBQUNBLE1BQU1DLHNCQUFzQixHQUFHLElBQUlDLE1BQUosQ0FBWSx5Q0FBWixFQUFzRCxHQUF0RCxDQUEvQjs7QUFFQSxTQUFTQyxZQUFULENBQXNCQyxNQUF0QixFQUE4QkMsTUFBOUIsRUFBc0M7QUFDckMsUUFBTUMsT0FBTyxHQUFHQyxLQUFLLENBQUNELE9BQU4sQ0FBY0YsTUFBZCxDQUFoQjtBQUNBLE1BQUlJLE9BQU8sR0FBRyxLQUFkOztBQUVBLE9BQUssTUFBTUMsR0FBWCxJQUFrQkMsTUFBTSxDQUFDQyxJQUFQLENBQVlQLE1BQVosQ0FBbEIsRUFBdUM7QUFDdEMsUUFBSVEsS0FBSyxHQUFHUixNQUFNLENBQUNLLEdBQUQsQ0FBbEI7O0FBRUEsUUFBSSxPQUFPRyxLQUFQLEtBQWlCLFFBQWpCLElBQTZCWCxzQkFBc0IsQ0FBQ1ksSUFBdkIsQ0FBNEJE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QUksQ0FBQ3lDLGlCQUFMLEVBQXdCO0FBQ3ZCLFlBQU0sSUFBSTdDLEtBQUosQ0FBVSx1RUFBVixDQUFOO0FBQ0E7O0FBRUQ1QyxJQUFBQSxPQUFPLENBQUMsNkJBQUQsQ0FBUCxDQUF1Q3dHLGdCQUF2QyxDQUF3RDNFLEdBQXhEO0FBQ0E7QUFDRDs7QUFFREQsY0FBYyxDQUFDNkUsUUFBZixHQUEwQixLQUExQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnLi9Bc3NldEZhY3RvcnknXG5pbXBvcnQgJy4vQ29tbWFuZHMvUHVibGlzaENvbW1hbmQnXG5pbXBvcnQgJy4vQ29tbWFuZHMvVW5wdWJsaXNoQ29tbWFuZCdcbmltcG9ydCAnLi9Db21waWxlcnMvQmFiZWxDb21waWxlcidcbmltcG9ydCAnLi9Db21waWxlcnMvUmF3Q29tcGlsZXInXG5pbXBvcnQgJy4vQ29tcGlsZXJzL1Njc3NDb21waWxlcidcbmltcG9ydCAnLi9Qb3N0UHJvY2Vzc29ycy9Dc3NQb3N0Q3NzUG9zdFByb2Nlc3NvcidcbmltcG9ydCAnLi9Qb3N0UHJvY2Vzc29ycy9Dc3NNaW5pZnlQb3N0UHJvY2Vzc29yJ1xuaW1wb3J0ICcuL1Bvc3RQcm9jZXNzb3JzL0phdmFzY3JpcHRNaW5pZnlQb3N0UHJvY2Vzc29yJ1xuaW1wb3J0ICcuL1Bvc3RQcm9jZXNzb3JzL1N2Z09wdGltaXplUG9zdFByb2Nlc3NvcidcbmltcG9ydCAnLi9Db250cm9sbGVycy9Db21waWxlQ29udHJvbGxlcidcbmltcG9ydCAnLi9WaWV3L0Fzc2V0Q29udGFpbmVyJ1xuaW1wb3J0ICcuL1ZpZXcvTnVuanVja3NFeHRlbnNpb24nXG5pbXBvcnQgJy4vVmlldy9TdG9uZUV4dGVuc2lvbidcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxuY29uc3Qgbm9kZU1vZHVsZU1hY3JvUGF0dGVybiA9IG5ldyBSZWdFeHAoYFxcXFx7XFxcXHtcXFxccypub2RlX21vZHVsZTonKC4rPyknXFxcXHMqXFxcXH1cXFxcfWAsICdnJylcblxuZnVuY3Rpb24gZXhwYW5kTWFjcm9zKGNvbmZpZywgbWFjcm9zKSB7XG5cdGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGNvbmZpZylcblx0bGV0IHJlaW5kZXggPSBmYWxzZVxuXG5cdGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpIHtcblx0XHRsZXQgdmFsdWUgPSBjb25maWdba2V5XVxuXG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgbm9kZU1vZHVsZU1hY3JvUGF0dGVybi50ZXN0KHZhbHVlKSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5vZGVNb2R1bGVNYWNyb1BhdHRlcm4sIChfLCBuYW1lKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHBhdGguZGlybmFtZShyZXF1aXJlLnJlc29sdmUoYCR7bmFtZX0vcGFja2FnZS5qc29uYCkpXG5cdFx0XHRcdH0pXG5cblx0XHRcdFx0Y29uZmlnW2tleV0gPSB2YWx1ZVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLndhcm4oYFdBUk5JTkc6IENvdWxkIG5vdCByZXNvbHZlICR7dmFsdWV9YClcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuXHRcdFx0Y29uZmlnW2tleV0gPSBleHBhbmRNYWNyb3ModmFsdWUsIG1hY3Jvcylcblx0XHRcdGNvbnRpbnVlXG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRjb250aW51ZVxuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgbWFjcm8gb2YgbWFjcm9zKSB7XG5cdFx0XHRjb25zdCBwYXR0ZXJuID0gbWFjcm9bMF1cblx0XHRcdGNvbnN0IHJlcGxhY2VtZW50ID0gbWFjcm9bMV1cblxuXHRcdFx0aWYgKCFyZXBsYWNlbWVudC5pc05pbCkge1xuXHRcdFx0XHRjb25maWdba2V5XSA9IHZhbHVlLnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnQpXG5cdFx0XHR9IGVsc2UgaWYgKHZhbHVlLm1hdGNoKHBhdHRlcm4pKSB7XG5cdFx0XHRcdHJlaW5kZXggPSBpc0FycmF5XG5cdFx0XHRcdGRlbGV0ZSBjb25maWdba2V5XVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmIChyZWluZGV4KSB7XG5cdFx0Y29uZmlnID0gQXJyYXkuZnJvbShjb25maWcpLmZpbHRlcih2YWx1ZSA9PiB2YWx1ZS5pc05pbCA9PT0gZmFsc2UpXG5cdH1cblxuXHRyZXR1cm4gY29uZmlnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBBc3NldHNQcm92aWRlcihhcHAsIHBhcmFtZXRlcnMgPSB7fSkge1xuXHRjb25zdCBwcmVzZXQgPSBhcHAuY29uZmlnLmdldCgnYXNzZXRzLnByZXNldCcpXG5cblx0aWYgKCFwcmVzZXQuaXNOaWwpIHtcblx0XHRhcHAuY29uZmlnLmxvYWREZWZhdWx0KCdhc3NldHMnLCBwYXRoLmpvaW4oX19kaXJuYW1lLCBgLi4vY29uZmlnL3ByZXNldHMvJHtwcmVzZXR9Lmpzb25gKSlcblx0fVxuXG5cdGFwcC5jb25maWcubG9hZERlZmF1bHQoJ2Fzc2V0cycsIHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9jb25maWcvYXNzZXRzLmpzb24nKSlcblxuXHRsZXQgY29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgYXBwLmNvbmZpZy5nZXQoJ2Fzc2V0cycpKVxuXG5cdGNvbnN0IG1hY3JvcyA9IFtcblx0XHRbJ25vZGVfbW9kdWxlcycsIGNvbmZpZy5ub2RlX21vZHVsZXMgfHwgYXBwLnBhdGhzLmJhc2UoJ25vZGVfbW9kdWxlcycpXSxcblx0XHRbJ2FwcF9wYXRoJywgYXBwLnBhdGhzLmFwcCgpXSxcblx0XHRbJ2Jhc2VfcGF0aCcsIGFwcC5wYXRocy5iYXNlKCldLFxuXHRcdFsncHVibGljX3BhdGgnLCBhcHAucGF0aHMucHVibGljKCldLFxuXHRdXG5cblx0Zm9yIChjb25zdCBtYWNybyBvZiBtYWNyb3MpIHtcblx0XHRtYWNyb1swXSA9IG5ldyBSZWdFeHAoYFxcXFx7XFxcXHtcXFxccyoke21hY3JvWzBdfVxcXFxzKlxcXFx9XFxcXH1gLCAnZycpXG5cdH1cblxuXHRjb25maWcgPSBleHBhbmRNYWNyb3MoY29uZmlnLCBtYWNyb3MpXG5cdGFwcC5jb25maWcuc2V0KCdhc3NldHMnLCBjb25maWcpXG5cblx0Y29uc3QgcHVibGlzaFBhdGggPSBhcHAucGF0aHMuYmFzZShhcHAuY29uZmlnLmdldCgnYXNzZXRzLnBhdGhzLnB1Ymxpc2gnKSwgJy8nKVxuXG5cdGlmICghcHVibGlzaFBhdGguc3RhcnRzV2l0aChhcHAucGF0aHMucHVibGljKCcvJykpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdgYXNzZXRzLnBhdGhzLnB1Ymxpc2hgIG11c3QgYmUgY29udGFpbmVkIHdpdGhpbiB0aGUgcHVibGljIHBhdGguJylcblx0fVxuXG5cdGNvbnN0IHNob3VsZE9wdGltaXplID1cblx0XHR0eXBlb2YgY29uZmlnLnNob3VsZF9vcHRpbWl6ZSA9PT0gJ2Jvb2xlYW4nID8gY29uZmlnLnNob3VsZF9vcHRpbWl6ZSA6ICFhcHAuZGVidWdcblx0Y29uc3QgbGl2ZVJlbG9hZCA9IGNvbmZpZy5saXZlX3JlbG9hZCA9PT0gdHJ1ZVxuXHRjb25zdCBzb3VyY2VNYXBzID0gY29uZmlnLnNvdXJjZV9tYXBzID09PSAnYXV0bycgPyAnYXV0bycgOiBmYWxzZVxuXHRjb25zdCBmYWN0b3J5ID0gbmV3IEFzc2V0RmFjdG9yeShhcHAsIHNob3VsZE9wdGltaXplLCBzb3VyY2VNYXBzLCBsaXZlUmVsb2FkKVxuXHRhcHAuYXNzZXRzID0gZmFjdG9yeVxuXG5cdGZhY3RvcnkucmVnaXN0ZXJDb21waWxlcihCYWJlbENvbXBpbGVyKVxuXHRmYWN0b3J5LnJlZ2lzdGVyQ29tcGlsZXIoUmF3Q29tcGlsZXIpXG5cdGZhY3RvcnkucmVnaXN0ZXJDb21waWxlcihTY3NzQ29tcGlsZXIpXG5cblx0ZmFjdG9yeS5yZWdpc3RlclBvc3RQcm9jZXNzb3IoQ3NzTWluaWZ5UG9zdFByb2Nlc3Nvcilcblx0ZmFjdG9yeS5yZWdpc3RlclBvc3RQcm9jZXNzb3IoQ3NzUG9zdENzc1Bvc3RQcm9jZXNzb3IpXG5cdGZhY3RvcnkucmVnaXN0ZXJQb3N0UHJvY2Vzc29yKEphdmFzY3JpcHRNaW5pZnlQb3N0UHJvY2Vzc29yKVxuXHRmYWN0b3J5LnJlZ2lzdGVyUG9zdFByb2Nlc3NvcihTdmdPcHRpbWl6ZVBvc3RQcm9jZXNzb3IpXG5cblx0YXBwLmFzc2V0cy5jb250cm9sbGVyID0gbmV3IENvbXBpbGVDb250cm9sbGVyKGFwcCwgZmFjdG9yeSlcblxuXHRjb25zdCBjb3JzID0gKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG5cdFx0cmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJywgJyonKVxuXHRcdHJldHVybiBuZXh0KClcblx0fVxuXG5cdGFwcC5yb3V0ZXMuZ3JvdXAoeyBwcmVmaXg6ICdhc3NldHMnLCBjb250cm9sbGVyOiBhcHAuYXNzZXRzLmNvbnRyb2xsZXIgfSwgcm91dGVzID0+IHtcblx0XHRyb3V0ZXMudXNlKGNvcnMpXG5cdFx0cm91dGVzLmdldCgnOnR5cGUvOmE/LzpiPy86Yz8vOmQ/LzplPycsICdjb21waWxlJylcblx0fSlcblxuXHRjb25zdCBkaXJzID0gbmV3IFNldCgpXG5cdGNvbnN0IHB1Ymxpc2hlZCA9IGFwcC5jb25maWcuZ2V0KCdhc3NldHMtcHVibGlzaGVkJywge30pXG5cdGZvciAoY29uc3Qgc3JjIG9mIE9iamVjdC5rZXlzKHB1Ymxpc2hlZCkpIHtcblx0XHRkaXJzLmFkZChwdWJsaXNoZWRbc3JjXS5yZXBsYWNlKC9eXFwvLywgJycpLnNwbGl0KC9cXC8vKVswXSlcblx0fVxuXG5cdGFwcC5yb3V0ZXMuZ3JvdXAocm91dGVzID0+IHtcblx0XHRyb3V0ZXMudXNlKGNvcnMpXG5cblx0XHRmb3IgKGNvbnN0IGRpciBvZiBkaXJzKSB7XG5cdFx0XHRyb3V0ZXMuc3RhdGljKGRpciwgZGlyLCB7XG5cdFx0XHRcdGxhc3RNb2RpZmllZDogdHJ1ZSxcblx0XHRcdFx0bWF4QWdlOiA4NjQwMDAwMDAsXG5cdFx0XHR9KVxuXHRcdH1cblx0fSlcblxuXHRpZiAoIWFwcC5jbGkuaXNOaWwpIHtcblx0XHRhcHAuY2xpLnJlZ2lzdGVyKFB1Ymxpc2hDb21tYW5kKVxuXHRcdGFwcC5jbGkucmVnaXN0ZXIoVW5wdWJsaXNoQ29tbWFuZClcblx0fVxuXG5cdGxldCBoYXNBc3NldENvbnRhaW5lciA9IGZhbHNlXG5cblx0aWYgKCFhcHAudmlldy5pc05pbCkge1xuXHRcdGlmIChhcHAudmlldy5lbmdpbmVOYW1lID09PSAnbnVuanVja3MnKSB7XG5cdFx0XHRjb25zdCBudW5qdWNrc0V4dGVuc2lvbkNsYXNzID0gcGFyYW1ldGVycy5udW5qdWNrc0V4dGVuc2lvbkNsYXNzIHx8IE51bmp1Y2tzRXh0ZW5zaW9uXG5cdFx0XHRhcHAudmlldy5leHRlbmQoJ0Fzc2V0RXh0ZW5zaW9uJywgbmV3IG51bmp1Y2tzRXh0ZW5zaW9uQ2xhc3MoKSlcblx0XHR9IGVsc2UgaWYgKGFwcC52aWV3LmVuZ2luZU5hbWUgPT09ICdzdG9uZScpIHtcblx0XHRcdGNvbnN0IHN0b25lRXh0ZW5zaW9uQ2xhc3MgPSBwYXJhbWV0ZXJzLnN0b25lRXh0ZW5zaW9uQ2xhc3MgfHwgU3RvbmVFeHRlbnNpb25cblx0XHRcdHN0b25lRXh0ZW5zaW9uQ2xhc3MuZXh0ZW5kKGFwcC52aWV3KVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRMb2cuZXJyb3IoJ1dBUk5JTkc6IFVuc3VwcG9ydGVkIHZpZXcgZW5naW5lLCBhc3NldHMgY2FuIG5vdCBleHRlbmQuJylcblx0XHR9XG5cblx0XHRjb25zdCBhc3NldENvbnRhaW5lckNsYXNzID0gcGFyYW1ldGVycy5hc3NldENvbnRhaW5lckNsYXNzIHx8IEFzc2V0Q29udGFpbmVyXG5cdFx0aGFzQXNzZXRDb250YWluZXIgPSB0cnVlXG5cblx0XHRhcHAucm91dGVzLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcblx0XHRcdHJlcy5sb2NhbHMuYXNzZXRQYXRoID0gKHBhdGgsIHNlY3VyZSkgPT4gZmFjdG9yeS5wdWJsaXNoZWRQYXRoKHBhdGgsIHJlcSwgc2VjdXJlKVxuXHRcdFx0cmVzLmxvY2Fscy5fYXNzZXRDb250YWluZXIgPSBuZXcgYXNzZXRDb250YWluZXJDbGFzcyhyZXEsIHJlcywgZmFjdG9yeSwgYXBwLnZpZXcpXG5cblx0XHRcdG5leHQoKVxuXHRcdH0pXG5cdH1cblxuXHRpZiAobGl2ZVJlbG9hZCkge1xuXHRcdGlmICghaGFzQXNzZXRDb250YWluZXIpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignZ3JpbmQtYXNzZXTigJlzIGxpdmUgcmVsb2FkIGZ1bmN0aW9uYWxpdHkgbXVzdCBiZSB1c2VkIHdpdGggZ3JpbmQtdmlldy4nKVxuXHRcdH1cblxuXHRcdHJlcXVpcmUoJy4vRGV2dG9vbHMvRGV2dG9vbHNQcm92aWRlcicpLkRldnRvb2xzUHJvdmlkZXIoYXBwKVxuXHR9XG59XG5cbkFzc2V0c1Byb3ZpZGVyLnByaW9yaXR5ID0gMTAwMDBcbiJdfQ==