UNPKG

21.6 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.extractCSS = exports.injectCSS = exports.injectStyleLoader = exports.CSS = exports.img = exports.url = exports.markdown = exports.JS = exports.extractCSSPlugin = undefined;
7
8var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
9
10var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
11
12var _stringify = require('babel-runtime/core-js/json/stringify');
13
14var _stringify2 = _interopRequireDefault(_stringify);
15
16var _extends2 = require('babel-runtime/helpers/extends');
17
18var _extends3 = _interopRequireDefault(_extends2);
19
20exports.defaultConfig = defaultConfig;
21exports.mergeConfig = mergeConfig;
22exports.moduleRequest = moduleRequest;
23exports.loader = loader;
24exports.configureWebpack = configureWebpack;
25exports.readConfigSync = readConfigSync;
26
27var _invariant = require('invariant');
28
29var _invariant2 = _interopRequireDefault(_invariant);
30
31var _fs = require('fs');
32
33var _fs2 = _interopRequireDefault(_fs);
34
35var _path = require('path');
36
37var _path2 = _interopRequireDefault(_path);
38
39var _babelCore = require('babel-core');
40
41var _extractTextWebpackPlugin = require('extract-text-webpack-plugin');
42
43var _extractTextWebpackPlugin2 = _interopRequireDefault(_extractTextWebpackPlugin);
44
45var _minimatch = require('minimatch');
46
47var _utils = require('./compiler/utils');
48
49function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
50
51var BABEL_PRESET_ES2015 = require.resolve('babel-preset-es2015'); /**
52 * @copyright 2016-present, Sitegen team
53 */
54
55var BABEL_PRESET_STAGE_1 = require.resolve('babel-preset-stage-1');
56var BABEL_PRESET_REACT = require.resolve('babel-preset-react');
57
58function defaultConfig(_ref) {
59 var env = _ref.env;
60
61
62 var deployCSS = env.development ? injectCSS : extractCSS;
63
64 return {
65
66 devtool: env.development ? 'cheap-module-source-map' : undefined,
67
68 babel: {
69 presets: [BABEL_PRESET_ES2015, BABEL_PRESET_STAGE_1, BABEL_PRESET_REACT]
70 },
71
72 loaders: {
73 '**/*.js': JS,
74 '**/*.md': [JS, markdown]
75 },
76
77 globalLoaders: {
78 '**/*.css': deployCSS(CSS),
79 '**/*.png': img,
80 '**/*.jpg': img,
81 '**/*.jpeg': img,
82 '**/*.gif': img,
83 '**/*.ico': img
84 },
85
86 plugins: [(env.content || env.production) && extractCSSPlugin]
87 };
88}
89
90function mergeConfig() {
91 for (var _len = arguments.length, config = Array(_len), _key = 0; _key < _len; _key++) {
92 config[_key] = arguments[_key];
93 }
94
95 config = config.filter(Boolean);
96 (0, _invariant2.default)(config.length > 0, 'Trying to merge empty list of configurations');
97 if (config.length === 1) {
98 return config[0];
99 } else {
100 return config.reduce(mergeConfigImpl);
101 }
102}
103
104function mergeArray(a, b) {
105 return [].concat(a).concat(b).filter(Boolean);
106}
107
108function mergeConfigImpl(a, b) {
109 return (0, _extends3.default)({}, a, b, {
110 entry: mergeArray(a.entry, b.entry),
111 babel: (0, _extends3.default)({}, a.babel, b.babel, {
112 presets: mergeArray(a.presets, b.presets),
113 plugins: mergeArray(a.babel && a.babel.plugins, b.babel && b.babel.plugins)
114 }),
115 output: (0, _extends3.default)({}, a.output, b.output),
116 loaders: (0, _extends3.default)({}, a.loaders, b.loaders),
117 globalLoaders: (0, _extends3.default)({}, a.globalLoaders, b.globalLoaders),
118 plugins: mergeArray(a.plugins, b.plugins)
119 });
120}
121
122function moduleRequest(id) {
123 for (var _len2 = arguments.length, loader = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
124 loader[_key2 - 1] = arguments[_key2];
125 }
126
127 loader.reverse();
128 return normalizeLoader(loader) + '!' + id;
129}
130
131function loader(loader) {
132 return loaderImpl({ loader: loader });
133}
134
135function loaderImpl(config) {
136 var mergeQuery = config.mergeQuery || function (a, b) {
137 return (0, _extends3.default)({}, a, b);
138 };
139 var configurator = function configurator(query) {
140 return loaderImpl((0, _extends3.default)({}, config, {
141 query: mergeQuery(config.query, query)
142 }));
143 };
144 configurator.config = config;
145 configurator.toLoaderString = function toLoaderString() {
146 return normalizeLoader(config);
147 };
148 configurator.toString = configurator.toLoaderString;
149 return configurator;
150}
151
152function normalizeLoader(element) {
153 if (Array.isArray(element)) {
154 return element.map(normalizeLoader).join('!');
155 } else if (typeof element === 'string') {
156 return element;
157 } else if (element.toLoaderString) {
158 return element.toLoaderString();
159 } else {
160 if (element.query) {
161 return element.loader + '?' + (0, _stringify2.default)(element.query);
162 } else {
163 return element.loader;
164 }
165 }
166}
167
168function makePatterMatcher(pattern) {
169 var patterMatcher = new _minimatch.Minimatch(pattern);
170
171 var matcher = function matcher(filename) {
172 return patterMatcher.match(filename);
173 };
174 matcher.toString = function () {
175 return '[PatternMatcher ' + pattern + ']';
176 };
177 matcher.inspect = matcher.toString;
178
179 return matcher;
180}
181
182function configureWebpackLoader(context, pattern, loader, global) {
183 if (!global) {
184 pattern = _path2.default.join(context, pattern);
185 }
186 var test = makePatterMatcher(pattern);
187 return {
188 loader: normalizeLoader(loader),
189 test: test
190 };
191}
192
193function configureWebpackLoaderList(context, loaders, global) {
194 var result = [];
195 for (var pattern in loaders) {
196 var _loader = loaders[pattern];
197 result.push(configureWebpackLoader(context, pattern, _loader, global));
198 }
199 return result;
200}
201
202function configureWebpack(_ref2) {
203 var context = _ref2.context;
204 var loaders = _ref2.loaders;
205 var globalLoaders = _ref2.globalLoaders;
206 var config = (0, _objectWithoutProperties3.default)(_ref2, ['context', 'loaders', 'globalLoaders']);
207
208 loaders = configureWebpackLoaderList(context, loaders);
209 globalLoaders = configureWebpackLoaderList(context, globalLoaders, true);
210 return (0, _extends3.default)({}, config, {
211 context: context,
212 output: (0, _extends3.default)({}, config.output, {
213 path: _path2.default.resolve(config.context, config.output.path)
214 }),
215 module: {
216 loaders: loaders.concat(globalLoaders)
217 }
218 });
219}
220
221function readConfigSync(filename) {
222 var source = _fs2.default.readFileSync(filename, 'utf8');
223 source = (0, _babelCore.transform)(source, {
224 filename: filename,
225 presets: [BABEL_PRESET_ES2015, BABEL_PRESET_STAGE_1]
226 }).code;
227 return (0, _utils.evalAsModule)(source, filename);
228}
229
230var extractCSSPlugin = exports.extractCSSPlugin = new _extractTextWebpackPlugin2.default('bundle.css');
231
232var JS = exports.JS = loader(require.resolve('babel-loader'));
233
234var markdown = exports.markdown = loader(require.resolve('reactdown/webpack'));
235
236var url = exports.url = loader(require.resolve('url-loader'));
237
238var img = exports.img = url({ limit: 10000 });
239
240var CSS = exports.CSS = loader(require.resolve('css-loader'));
241
242var injectStyleLoader = exports.injectStyleLoader = loader(require.resolve('style-loader'));
243
244var injectCSS = exports.injectCSS = function injectCSS() {
245 for (var _len3 = arguments.length, loader = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
246 loader[_key3] = arguments[_key3];
247 }
248
249 return normalizeLoader([injectStyleLoader].concat(loader)).split('!');
250};
251
252var extractCSS = exports.extractCSS = function extractCSS() {
253 for (var _len4 = arguments.length, loader = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
254 loader[_key4] = arguments[_key4];
255 }
256
257 return extractCSSPlugin.extract(normalizeLoader(injectStyleLoader), normalizeLoader(loader)).split('!');
258};
259//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9hbmRyZXlwb3BwL1dvcmtzcGFjZS9zaXRlZ2VuL3NyYy9jb25maWcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQWdCZ0IsYSxHQUFBLGE7UUFvQ0EsVyxHQUFBLFc7UUE0Q0EsYSxHQUFBLGE7UUFLQSxNLEdBQUEsTTtRQWtFQSxnQixHQUFBLGdCO1FBZ0JBLGMsR0FBQSxjOztBQW5MaEI7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7OztBQUVBLElBQU0sc0JBQXNCLFFBQVEsT0FBUixDQUFnQixxQkFBaEIsQ0FBNUIsQzs7OztBQUNBLElBQU0sdUJBQXVCLFFBQVEsT0FBUixDQUFnQixzQkFBaEIsQ0FBN0I7QUFDQSxJQUFNLHFCQUFxQixRQUFRLE9BQVIsQ0FBZ0Isb0JBQWhCLENBQTNCOztBQUVPLFNBQVMsYUFBVCxPQUE4QjtBQUFBLE1BQU4sR0FBTSxRQUFOLEdBQU07OztBQUVuQyxNQUFJLFlBQVksSUFBSSxXQUFKLEdBQWtCLFNBQWxCLEdBQThCLFVBQTlDOztBQUVBLFNBQU87O0FBRUwsYUFBUyxJQUFJLFdBQUosR0FBa0IseUJBQWxCLEdBQThDLFNBRmxEOztBQUlMLFdBQU87QUFDTCxlQUFTLENBQ1AsbUJBRE8sRUFFUCxvQkFGTyxFQUdQLGtCQUhPO0FBREosS0FKRjs7QUFZTCxhQUFTO0FBQ1AsaUJBQVcsRUFESjtBQUVQLGlCQUFXLENBQUMsRUFBRCxFQUFLLFFBQUw7QUFGSixLQVpKOztBQWlCTCxtQkFBZTtBQUNiLGtCQUFZLFVBQVUsR0FBVixDQURDO0FBRWIsa0JBQVksR0FGQztBQUdiLGtCQUFZLEdBSEM7QUFJYixtQkFBYSxHQUpBO0FBS2Isa0JBQVksR0FMQztBQU1iLGtCQUFZO0FBTkMsS0FqQlY7O0FBMEJMLGFBQVMsQ0FDUCxDQUFDLElBQUksT0FBSixJQUFlLElBQUksVUFBcEIsS0FBbUMsZ0JBRDVCO0FBMUJKLEdBQVA7QUE4QkQ7O0FBRU0sU0FBUyxXQUFULEdBQWdDO0FBQUEsb0NBQVIsTUFBUTtBQUFSLFVBQVE7QUFBQTs7QUFDckMsV0FBUyxPQUFPLE1BQVAsQ0FBYyxPQUFkLENBQVQ7QUFDQSwyQkFDRSxPQUFPLE1BQVAsR0FBZ0IsQ0FEbEIsRUFFRSw4Q0FGRjtBQUlBLE1BQUksT0FBTyxNQUFQLEtBQWtCLENBQXRCLEVBQXlCO0FBQ3ZCLFdBQU8sT0FBTyxDQUFQLENBQVA7QUFDRCxHQUZELE1BRU87QUFDTCxXQUFPLE9BQU8sTUFBUCxDQUFjLGVBQWQsQ0FBUDtBQUNEO0FBQ0Y7O0FBRUQsU0FBUyxVQUFULENBQW9CLENBQXBCLEVBQXVCLENBQXZCLEVBQTBCO0FBQ3hCLFNBQU8sR0FBRyxNQUFILENBQVUsQ0FBVixFQUFhLE1BQWIsQ0FBb0IsQ0FBcEIsRUFBdUIsTUFBdkIsQ0FBOEIsT0FBOUIsQ0FBUDtBQUNEOztBQUVELFNBQVMsZUFBVCxDQUF5QixDQUF6QixFQUE0QixDQUE1QixFQUErQjtBQUM3QixvQ0FDSyxDQURMLEVBRUssQ0FGTDtBQUdFLFdBQU8sV0FBVyxFQUFFLEtBQWIsRUFBb0IsRUFBRSxLQUF0QixDQUhUO0FBSUUsc0NBQ0ssRUFBRSxLQURQLEVBRUssRUFBRSxLQUZQO0FBR0UsZUFBUyxXQUFXLEVBQUUsT0FBYixFQUFzQixFQUFFLE9BQXhCLENBSFg7QUFJRSxlQUFTLFdBQVcsRUFBRSxLQUFGLElBQVcsRUFBRSxLQUFGLENBQVEsT0FBOUIsRUFBdUMsRUFBRSxLQUFGLElBQVcsRUFBRSxLQUFGLENBQVEsT0FBMUQ7QUFKWCxNQUpGO0FBVUUsdUNBQ0ssRUFBRSxNQURQLEVBRUssRUFBRSxNQUZQLENBVkY7QUFjRSx3Q0FDSyxFQUFFLE9BRFAsRUFFSyxFQUFFLE9BRlAsQ0FkRjtBQWtCRSw4Q0FDSyxFQUFFLGFBRFAsRUFFSyxFQUFFLGFBRlAsQ0FsQkY7QUFzQkUsYUFBUyxXQUFXLEVBQUUsT0FBYixFQUFzQixFQUFFLE9BQXhCO0FBdEJYO0FBd0JEOztBQUVNLFNBQVMsYUFBVCxDQUF1QixFQUF2QixFQUFzQztBQUFBLHFDQUFSLE1BQVE7QUFBUixVQUFRO0FBQUE7O0FBQzNDLFNBQU8sT0FBUDtBQUNBLFNBQVUsZ0JBQWdCLE1BQWhCLENBQVYsU0FBcUMsRUFBckM7QUFDRDs7QUFFTSxTQUFTLE1BQVQsQ0FBZ0IsTUFBaEIsRUFBd0I7QUFDN0IsU0FBTyxXQUFXLEVBQUMsY0FBRCxFQUFYLENBQVA7QUFDRDs7QUFFRCxTQUFTLFVBQVQsQ0FBb0IsTUFBcEIsRUFBNEI7QUFDMUIsTUFBSSxhQUFhLE9BQU8sVUFBUCxJQUFzQixVQUFDLENBQUQsRUFBSSxDQUFKO0FBQUEsc0NBQWUsQ0FBZixFQUFxQixDQUFyQjtBQUFBLEdBQXZDO0FBQ0EsTUFBSSxlQUFlLFNBQVMsWUFBVCxDQUFzQixLQUF0QixFQUE2QjtBQUM5QyxXQUFPLHNDQUNGLE1BREU7QUFFTCxhQUFPLFdBQVcsT0FBTyxLQUFsQixFQUF5QixLQUF6QjtBQUZGLE9BQVA7QUFJRCxHQUxEO0FBTUEsZUFBYSxNQUFiLEdBQXNCLE1BQXRCO0FBQ0EsZUFBYSxjQUFiLEdBQThCLFNBQVMsY0FBVCxHQUEwQjtBQUN0RCxXQUFPLGdCQUFnQixNQUFoQixDQUFQO0FBQ0QsR0FGRDtBQUdBLGVBQWEsUUFBYixHQUF3QixhQUFhLGNBQXJDO0FBQ0EsU0FBTyxZQUFQO0FBQ0Q7O0FBRUQsU0FBUyxlQUFULENBQXlCLE9BQXpCLEVBQWtDO0FBQ2hDLE1BQUksTUFBTSxPQUFOLENBQWMsT0FBZCxDQUFKLEVBQTRCO0FBQzFCLFdBQU8sUUFBUSxHQUFSLENBQVksZUFBWixFQUE2QixJQUE3QixDQUFrQyxHQUFsQyxDQUFQO0FBQ0QsR0FGRCxNQUVPLElBQUksT0FBTyxPQUFQLEtBQW1CLFFBQXZCLEVBQWlDO0FBQ3RDLFdBQU8sT0FBUDtBQUNELEdBRk0sTUFFQSxJQUFJLFFBQVEsY0FBWixFQUE0QjtBQUNqQyxXQUFPLFFBQVEsY0FBUixFQUFQO0FBQ0QsR0FGTSxNQUVBO0FBQ0wsUUFBSSxRQUFRLEtBQVosRUFBbUI7QUFDakIsYUFBTyxRQUFRLE1BQVIsR0FBaUIsR0FBakIsR0FBdUIseUJBQWUsUUFBUSxLQUF2QixDQUE5QjtBQUNELEtBRkQsTUFFTztBQUNMLGFBQU8sUUFBUSxNQUFmO0FBQ0Q7QUFDRjtBQUNGOztBQUVELFNBQVMsaUJBQVQsQ0FBMkIsT0FBM0IsRUFBb0M7QUFDbEMsTUFBSSxnQkFBZ0IseUJBQWMsT0FBZCxDQUFwQjs7QUFFQSxNQUFJLFVBQVUsU0FBVixPQUFVO0FBQUEsV0FBWSxjQUFjLEtBQWQsQ0FBb0IsUUFBcEIsQ0FBWjtBQUFBLEdBQWQ7QUFDQSxVQUFRLFFBQVIsR0FBbUI7QUFBQSxnQ0FBeUIsT0FBekI7QUFBQSxHQUFuQjtBQUNBLFVBQVEsT0FBUixHQUFrQixRQUFRLFFBQTFCOztBQUVBLFNBQU8sT0FBUDtBQUNEOztBQUVELFNBQVMsc0JBQVQsQ0FBZ0MsT0FBaEMsRUFBeUMsT0FBekMsRUFBa0QsTUFBbEQsRUFBMEQsTUFBMUQsRUFBa0U7QUFDaEUsTUFBSSxDQUFDLE1BQUwsRUFBYTtBQUNYLGNBQVUsZUFBSyxJQUFMLENBQVUsT0FBVixFQUFtQixPQUFuQixDQUFWO0FBQ0Q7QUFDRCxNQUFJLE9BQU8sa0JBQWtCLE9BQWxCLENBQVg7QUFDQSxTQUFPO0FBQ0wsWUFBUSxnQkFBZ0IsTUFBaEIsQ0FESDtBQUVMO0FBRkssR0FBUDtBQUlEOztBQUVELFNBQVMsMEJBQVQsQ0FBb0MsT0FBcEMsRUFBNkMsT0FBN0MsRUFBc0QsTUFBdEQsRUFBOEQ7QUFDNUQsTUFBSSxTQUFTLEVBQWI7QUFDQSxPQUFLLElBQUksT0FBVCxJQUFvQixPQUFwQixFQUE2QjtBQUMzQixRQUFJLFVBQVMsUUFBUSxPQUFSLENBQWI7QUFDQSxXQUFPLElBQVAsQ0FBWSx1QkFBdUIsT0FBdkIsRUFBZ0MsT0FBaEMsRUFBeUMsT0FBekMsRUFBaUQsTUFBakQsQ0FBWjtBQUNEO0FBQ0QsU0FBTyxNQUFQO0FBQ0Q7O0FBRU0sU0FBUyxnQkFBVCxRQUF3RTtBQUFBLE1BQTdDLE9BQTZDLFNBQTdDLE9BQTZDO0FBQUEsTUFBcEMsT0FBb0MsU0FBcEMsT0FBb0M7QUFBQSxNQUEzQixhQUEyQixTQUEzQixhQUEyQjtBQUFBLE1BQVQsTUFBUzs7QUFDN0UsWUFBVSwyQkFBMkIsT0FBM0IsRUFBb0MsT0FBcEMsQ0FBVjtBQUNBLGtCQUFnQiwyQkFBMkIsT0FBM0IsRUFBb0MsYUFBcEMsRUFBbUQsSUFBbkQsQ0FBaEI7QUFDQSxvQ0FDSyxNQURMO0FBRUUsb0JBRkY7QUFHRSx1Q0FDSyxPQUFPLE1BRFo7QUFFRSxZQUFNLGVBQUssT0FBTCxDQUFhLE9BQU8sT0FBcEIsRUFBNkIsT0FBTyxNQUFQLENBQWMsSUFBM0M7QUFGUixNQUhGO0FBT0UsWUFBUTtBQUNOLGVBQVMsUUFBUSxNQUFSLENBQWUsYUFBZjtBQURIO0FBUFY7QUFXRDs7QUFFTSxTQUFTLGNBQVQsQ0FBd0IsUUFBeEIsRUFBa0M7QUFDdkMsTUFBSSxTQUFTLGFBQUcsWUFBSCxDQUFnQixRQUFoQixFQUEwQixNQUExQixDQUFiO0FBQ0EsV0FBUywwQkFBVSxNQUFWLEVBQWtCO0FBQ3pCLHNCQUR5QjtBQUV6QixhQUFTLENBQUMsbUJBQUQsRUFBc0Isb0JBQXRCO0FBRmdCLEdBQWxCLEVBR04sSUFISDtBQUlBLFNBQU8seUJBQWEsTUFBYixFQUFxQixRQUFyQixDQUFQO0FBQ0Q7O0FBRU0sSUFBSSw4Q0FBbUIsdUNBQXNCLFlBQXRCLENBQXZCOztBQUVBLElBQUksa0JBQUssT0FBTyxRQUFRLE9BQVIsQ0FBZ0IsY0FBaEIsQ0FBUCxDQUFUOztBQUVBLElBQUksOEJBQVcsT0FBTyxRQUFRLE9BQVIsQ0FBZ0IsbUJBQWhCLENBQVAsQ0FBZjs7QUFFQSxJQUFJLG9CQUFNLE9BQU8sUUFBUSxPQUFSLENBQWdCLFlBQWhCLENBQVAsQ0FBVjs7QUFFQSxJQUFJLG9CQUFNLElBQUksRUFBQyxPQUFPLEtBQVIsRUFBSixDQUFWOztBQUVBLElBQUksb0JBQU0sT0FBTyxRQUFRLE9BQVIsQ0FBZ0IsWUFBaEIsQ0FBUCxDQUFWOztBQUdBLElBQUksZ0RBQW9CLE9BQU8sUUFBUSxPQUFSLENBQWdCLGNBQWhCLENBQVAsQ0FBeEI7O0FBRUEsSUFBSSxnQ0FBWSxTQUFaLFNBQVk7QUFBQSxxQ0FBSSxNQUFKO0FBQUksVUFBSjtBQUFBOztBQUFBLFNBQ3JCLGdCQUFnQixDQUFDLGlCQUFELEVBQW9CLE1BQXBCLENBQTJCLE1BQTNCLENBQWhCLEVBQW9ELEtBQXBELENBQTBELEdBQTFELENBRHFCO0FBQUEsQ0FBaEI7O0FBR0EsSUFBSSxrQ0FBYSxTQUFiLFVBQWE7QUFBQSxxQ0FBSSxNQUFKO0FBQUksVUFBSjtBQUFBOztBQUFBLFNBQ3RCLGlCQUFpQixPQUFqQixDQUNFLGdCQUFnQixpQkFBaEIsQ0FERixFQUVFLGdCQUFnQixNQUFoQixDQUZGLEVBR0UsS0FIRixDQUdRLEdBSFIsQ0FEc0I7QUFBQSxDQUFqQiIsImZpbGUiOiJjb25maWcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBjb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBTaXRlZ2VuIHRlYW1cbiAqL1xuXG5pbXBvcnQgaW52YXJpYW50IGZyb20gJ2ludmFyaWFudCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQge3RyYW5zZm9ybX0gZnJvbSAnYmFiZWwtY29yZSc7XG5pbXBvcnQgRXh0cmFjdFRleHRQbHVnaW4gZnJvbSAnZXh0cmFjdC10ZXh0LXdlYnBhY2stcGx1Z2luJztcbmltcG9ydCB7TWluaW1hdGNofSBmcm9tICdtaW5pbWF0Y2gnO1xuaW1wb3J0IHtldmFsQXNNb2R1bGV9IGZyb20gJy4vY29tcGlsZXIvdXRpbHMnO1xuXG5jb25zdCBCQUJFTF9QUkVTRVRfRVMyMDE1ID0gcmVxdWlyZS5yZXNvbHZlKCdiYWJlbC1wcmVzZXQtZXMyMDE1Jyk7XG5jb25zdCBCQUJFTF9QUkVTRVRfU1RBR0VfMSA9IHJlcXVpcmUucmVzb2x2ZSgnYmFiZWwtcHJlc2V0LXN0YWdlLTEnKTtcbmNvbnN0IEJBQkVMX1BSRVNFVF9SRUFDVCA9IHJlcXVpcmUucmVzb2x2ZSgnYmFiZWwtcHJlc2V0LXJlYWN0Jyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0Q29uZmlnKHtlbnZ9KSB7XG5cbiAgbGV0IGRlcGxveUNTUyA9IGVudi5kZXZlbG9wbWVudCA/IGluamVjdENTUyA6IGV4dHJhY3RDU1M7XG5cbiAgcmV0dXJuIHtcblxuICAgIGRldnRvb2w6IGVudi5kZXZlbG9wbWVudCA/ICdjaGVhcC1tb2R1bGUtc291cmNlLW1hcCcgOiB1bmRlZmluZWQsXG5cbiAgICBiYWJlbDoge1xuICAgICAgcHJlc2V0czogW1xuICAgICAgICBCQUJFTF9QUkVTRVRfRVMyMDE1LFxuICAgICAgICBCQUJFTF9QUkVTRVRfU1RBR0VfMSxcbiAgICAgICAgQkFCRUxfUFJFU0VUX1JFQUNUXG4gICAgICBdXG4gICAgfSxcblxuICAgIGxvYWRlcnM6IHtcbiAgICAgICcqKi8qLmpzJzogSlMsXG4gICAgICAnKiovKi5tZCc6IFtKUywgbWFya2Rvd25dLFxuICAgIH0sXG5cbiAgICBnbG9iYWxMb2FkZXJzOiB7XG4gICAgICAnKiovKi5jc3MnOiBkZXBsb3lDU1MoQ1NTKSxcbiAgICAgICcqKi8qLnBuZyc6IGltZyxcbiAgICAgICcqKi8qLmpwZyc6IGltZyxcbiAgICAgICcqKi8qLmpwZWcnOiBpbWcsXG4gICAgICAnKiovKi5naWYnOiBpbWcsXG4gICAgICAnKiovKi5pY28nOiBpbWcsXG4gICAgfSxcblxuICAgIHBsdWdpbnM6IFtcbiAgICAgIChlbnYuY29udGVudCB8fCBlbnYucHJvZHVjdGlvbikgJiYgZXh0cmFjdENTU1BsdWdpbixcbiAgICBdLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb25maWcoLi4uY29uZmlnKSB7XG4gIGNvbmZpZyA9IGNvbmZpZy5maWx0ZXIoQm9vbGVhbik7XG4gIGludmFyaWFudChcbiAgICBjb25maWcubGVuZ3RoID4gMCxcbiAgICAnVHJ5aW5nIHRvIG1lcmdlIGVtcHR5IGxpc3Qgb2YgY29uZmlndXJhdGlvbnMnXG4gICk7XG4gIGlmIChjb25maWcubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGNvbmZpZ1swXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY29uZmlnLnJlZHVjZShtZXJnZUNvbmZpZ0ltcGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlQXJyYXkoYSwgYikge1xuICByZXR1cm4gW10uY29uY2F0KGEpLmNvbmNhdChiKS5maWx0ZXIoQm9vbGVhbik7XG59XG5cbmZ1bmN0aW9uIG1lcmdlQ29uZmlnSW1wbChhLCBiKSB7XG4gIHJldHVybiB7XG4gICAgLi4uYSxcbiAgICAuLi5iLFxuICAgIGVudHJ5OiBtZXJnZUFycmF5KGEuZW50cnksIGIuZW50cnkpLFxuICAgIGJhYmVsOiB7XG4gICAgICAuLi5hLmJhYmVsLFxuICAgICAgLi4uYi5iYWJlbCxcbiAgICAgIHByZXNldHM6IG1lcmdlQXJyYXkoYS5wcmVzZXRzLCBiLnByZXNldHMpLFxuICAgICAgcGx1Z2luczogbWVyZ2VBcnJheShhLmJhYmVsICYmIGEuYmFiZWwucGx1Z2lucywgYi5iYWJlbCAmJiBiLmJhYmVsLnBsdWdpbnMpLFxuICAgIH0sXG4gICAgb3V0cHV0OiB7XG4gICAgICAuLi5hLm91dHB1dCxcbiAgICAgIC4uLmIub3V0cHV0LFxuICAgIH0sXG4gICAgbG9hZGVyczoge1xuICAgICAgLi4uYS5sb2FkZXJzLFxuICAgICAgLi4uYi5sb2FkZXJzXG4gICAgfSxcbiAgICBnbG9iYWxMb2FkZXJzOiB7XG4gICAgICAuLi5hLmdsb2JhbExvYWRlcnMsXG4gICAgICAuLi5iLmdsb2JhbExvYWRlcnNcbiAgICB9LFxuICAgIHBsdWdpbnM6IG1lcmdlQXJyYXkoYS5wbHVnaW5zLCBiLnBsdWdpbnMpLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbW9kdWxlUmVxdWVzdChpZCwgLi4ubG9hZGVyKSB7XG4gIGxvYWRlci5yZXZlcnNlKCk7XG4gIHJldHVybiBgJHtub3JtYWxpemVMb2FkZXIobG9hZGVyKX0hJHtpZH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZGVyKGxvYWRlcikge1xuICByZXR1cm4gbG9hZGVySW1wbCh7bG9hZGVyfSk7XG59XG5cbmZ1bmN0aW9uIGxvYWRlckltcGwoY29uZmlnKSB7XG4gIGxldCBtZXJnZVF1ZXJ5ID0gY29uZmlnLm1lcmdlUXVlcnkgfHwgKChhLCBiKSA9PiAoey4uLmEsIC4uLmJ9KSk7XG4gIGxldCBjb25maWd1cmF0b3IgPSBmdW5jdGlvbiBjb25maWd1cmF0b3IocXVlcnkpIHtcbiAgICByZXR1cm4gbG9hZGVySW1wbCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBxdWVyeTogbWVyZ2VRdWVyeShjb25maWcucXVlcnksIHF1ZXJ5KSxcbiAgICB9KTtcbiAgfTtcbiAgY29uZmlndXJhdG9yLmNvbmZpZyA9IGNvbmZpZztcbiAgY29uZmlndXJhdG9yLnRvTG9hZGVyU3RyaW5nID0gZnVuY3Rpb24gdG9Mb2FkZXJTdHJpbmcoKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUxvYWRlcihjb25maWcpO1xuICB9O1xuICBjb25maWd1cmF0b3IudG9TdHJpbmcgPSBjb25maWd1cmF0b3IudG9Mb2FkZXJTdHJpbmc7XG4gIHJldHVybiBjb25maWd1cmF0b3I7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxvYWRlcihlbGVtZW50KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQubWFwKG5vcm1hbGl6ZUxvYWRlcikuam9pbignIScpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9IGVsc2UgaWYgKGVsZW1lbnQudG9Mb2FkZXJTdHJpbmcpIHtcbiAgICByZXR1cm4gZWxlbWVudC50b0xvYWRlclN0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIGlmIChlbGVtZW50LnF1ZXJ5KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5sb2FkZXIgKyAnPycgKyBKU09OLnN0cmluZ2lmeShlbGVtZW50LnF1ZXJ5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsZW1lbnQubG9hZGVyO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlUGF0dGVyTWF0Y2hlcihwYXR0ZXJuKSB7XG4gIGxldCBwYXR0ZXJNYXRjaGVyID0gbmV3IE1pbmltYXRjaChwYXR0ZXJuKTtcblxuICBsZXQgbWF0Y2hlciA9IGZpbGVuYW1lID0+IHBhdHRlck1hdGNoZXIubWF0Y2goZmlsZW5hbWUpO1xuICBtYXRjaGVyLnRvU3RyaW5nID0gKCkgPT4gYFtQYXR0ZXJuTWF0Y2hlciAke3BhdHRlcm59XWA7XG4gIG1hdGNoZXIuaW5zcGVjdCA9IG1hdGNoZXIudG9TdHJpbmc7XG5cbiAgcmV0dXJuIG1hdGNoZXI7XG59XG5cbmZ1bmN0aW9uIGNvbmZpZ3VyZVdlYnBhY2tMb2FkZXIoY29udGV4dCwgcGF0dGVybiwgbG9hZGVyLCBnbG9iYWwpIHtcbiAgaWYgKCFnbG9iYWwpIHtcbiAgICBwYXR0ZXJuID0gcGF0aC5qb2luKGNvbnRleHQsIHBhdHRlcm4pO1xuICB9XG4gIGxldCB0ZXN0ID0gbWFrZVBhdHRlck1hdGNoZXIocGF0dGVybik7XG4gIHJldHVybiB7XG4gICAgbG9hZGVyOiBub3JtYWxpemVMb2FkZXIobG9hZGVyKSxcbiAgICB0ZXN0LFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb25maWd1cmVXZWJwYWNrTG9hZGVyTGlzdChjb250ZXh0LCBsb2FkZXJzLCBnbG9iYWwpIHtcbiAgbGV0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGxldCBwYXR0ZXJuIGluIGxvYWRlcnMpIHtcbiAgICBsZXQgbG9hZGVyID0gbG9hZGVyc1twYXR0ZXJuXTtcbiAgICByZXN1bHQucHVzaChjb25maWd1cmVXZWJwYWNrTG9hZGVyKGNvbnRleHQsIHBhdHRlcm4sIGxvYWRlciwgZ2xvYmFsKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZVdlYnBhY2soe2NvbnRleHQsIGxvYWRlcnMsIGdsb2JhbExvYWRlcnMsIC4uLmNvbmZpZ30pIHtcbiAgbG9hZGVycyA9IGNvbmZpZ3VyZVdlYnBhY2tMb2FkZXJMaXN0KGNvbnRleHQsIGxvYWRlcnMpO1xuICBnbG9iYWxMb2FkZXJzID0gY29uZmlndXJlV2VicGFja0xvYWRlckxpc3QoY29udGV4dCwgZ2xvYmFsTG9hZGVycywgdHJ1ZSk7XG4gIHJldHVybiB7XG4gICAgLi4uY29uZmlnLFxuICAgIGNvbnRleHQsXG4gICAgb3V0cHV0OiB7XG4gICAgICAuLi5jb25maWcub3V0cHV0LFxuICAgICAgcGF0aDogcGF0aC5yZXNvbHZlKGNvbmZpZy5jb250ZXh0LCBjb25maWcub3V0cHV0LnBhdGgpXG4gICAgfSxcbiAgICBtb2R1bGU6IHtcbiAgICAgIGxvYWRlcnM6IGxvYWRlcnMuY29uY2F0KGdsb2JhbExvYWRlcnMpLFxuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRDb25maWdTeW5jKGZpbGVuYW1lKSB7XG4gIGxldCBzb3VyY2UgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZW5hbWUsICd1dGY4Jyk7XG4gIHNvdXJjZSA9IHRyYW5zZm9ybShzb3VyY2UsIHtcbiAgICBmaWxlbmFtZSxcbiAgICBwcmVzZXRzOiBbQkFCRUxfUFJFU0VUX0VTMjAxNSwgQkFCRUxfUFJFU0VUX1NUQUdFXzFdXG4gIH0pLmNvZGU7XG4gIHJldHVybiBldmFsQXNNb2R1bGUoc291cmNlLCBmaWxlbmFtZSk7XG59XG5cbmV4cG9ydCBsZXQgZXh0cmFjdENTU1BsdWdpbiA9IG5ldyBFeHRyYWN0VGV4dFBsdWdpbignYnVuZGxlLmNzcycpO1xuXG5leHBvcnQgbGV0IEpTID0gbG9hZGVyKHJlcXVpcmUucmVzb2x2ZSgnYmFiZWwtbG9hZGVyJykpO1xuXG5leHBvcnQgbGV0IG1hcmtkb3duID0gbG9hZGVyKHJlcXVpcmUucmVzb2x2ZSgncmVhY3Rkb3duL3dlYnBhY2snKSk7XG5cbmV4cG9ydCBsZXQgdXJsID0gbG9hZGVyKHJlcXVpcmUucmVzb2x2ZSgndXJsLWxvYWRlcicpKTtcblxuZXhwb3J0IGxldCBpbWcgPSB1cmwoe2xpbWl0OiAxMDAwMH0pO1xuXG5leHBvcnQgbGV0IENTUyA9IGxvYWRlcihyZXF1aXJlLnJlc29sdmUoJ2Nzcy1sb2FkZXInKSk7XG5cblxuZXhwb3J0IGxldCBpbmplY3RTdHlsZUxvYWRlciA9IGxvYWRlcihyZXF1aXJlLnJlc29sdmUoJ3N0eWxlLWxvYWRlcicpKTtcblxuZXhwb3J0IGxldCBpbmplY3RDU1MgPSAoLi4ubG9hZGVyKSA9PlxuICBub3JtYWxpemVMb2FkZXIoW2luamVjdFN0eWxlTG9hZGVyXS5jb25jYXQobG9hZGVyKSkuc3BsaXQoJyEnKTtcblxuZXhwb3J0IGxldCBleHRyYWN0Q1NTID0gKC4uLmxvYWRlcikgPT5cbiAgZXh0cmFjdENTU1BsdWdpbi5leHRyYWN0KFxuICAgIG5vcm1hbGl6ZUxvYWRlcihpbmplY3RTdHlsZUxvYWRlciksXG4gICAgbm9ybWFsaXplTG9hZGVyKGxvYWRlcilcbiAgKS5zcGxpdCgnIScpO1xuIl19
\No newline at end of file