@nlabs/lex
Version:
253 lines (252 loc) • 30.2 kB
JavaScript
/**
* Copyright (c) 2018-Present, Nitrogen Labs, Inc.
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
*/ import findFileUp from 'find-file-up';
import { existsSync, readFileSync } from 'fs';
import { sync as globSync } from 'glob';
import { resolve as pathResolve, dirname } from 'path';
import { LexConfig } from '../LexConfig.js';
export const getDirName = ()=>{
try {
return eval('new URL(".", import.meta.url).pathname');
} catch {
return process.cwd();
}
};
export const getFilePath = (relativePath)=>{
try {
return eval('require("url").fileURLToPath(new URL(relativePath, import.meta.url))');
} catch {
if (relativePath === '../../../package.json') {
return pathResolve(process.cwd(), 'package.json');
}
return pathResolve(process.cwd(), relativePath);
}
};
export const getLexPackageJsonPath = ()=>{
const LEX_PACKAGE_NAME = '@nlabs/lex';
const lexInNodeModules = pathResolve(process.cwd(), 'node_modules/@nlabs/lex/package.json');
if (existsSync(lexInNodeModules)) {
return lexInNodeModules;
}
let startDir;
if (process.env.LEX_ROOT) {
startDir = process.env.LEX_ROOT;
} else {
try {
startDir = eval('new URL(".", import.meta.url).pathname');
} catch {
try {
startDir = eval('__filename ? require("path").dirname(__filename) : null');
if (!startDir) {
throw new Error('__filename not available');
}
} catch {
try {
if (process.argv[1] && !process.argv[1].includes('node')) {
startDir = dirname(process.argv[1]);
} else {
throw new Error('process.argv[1] not suitable');
}
} catch {
startDir = process.cwd();
}
}
}
}
let dir = startDir;
for(let i = 0; i < 8; i++){
const pkgPath = pathResolve(dir, 'package.json');
if (existsSync(pkgPath)) {
try {
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
if (pkg.name === LEX_PACKAGE_NAME) {
return pkgPath;
}
} catch {}
}
const parent = dirname(dir);
if (parent === dir) {
break;
}
dir = parent;
}
return pathResolve(process.cwd(), 'package.json');
};
export const relativeFilePath = (filename, dirPath = './', backUp = 0)=>{
const nestDepth = 10;
if (backUp) {
const filePath = findFileUp.sync(filename, dirPath, nestDepth);
const previousPath = Array(backUp).fill(null).map(()=>'../').join('');
return pathResolve(filePath, previousPath);
}
return findFileUp.sync(filename, dirPath, nestDepth);
};
export const relativeNodePath = (filename, dirPath = './', backUp = 0)=>{
const nestDepth = 10;
const modulePath = `node_modules/${filename}`;
if (dirPath !== './') {
const lexModulePath = pathResolve(dirPath, modulePath);
if (existsSync(lexModulePath)) {
return lexModulePath;
}
}
const projectPath = pathResolve(process.cwd(), modulePath);
if (existsSync(projectPath)) {
return projectPath;
}
if (backUp) {
const filePath = findFileUp.sync(modulePath, dirPath, nestDepth);
const previousPath = Array(nestDepth).fill(null).map(()=>'../').join('');
return pathResolve(filePath, previousPath);
}
return findFileUp.sync(modulePath, dirPath, nestDepth) || `/node_modules/${filename}`;
};
export const getNodePath = (moduleName)=>{
const dirName = getDirName();
const modulePath = `node_modules/${moduleName}`;
const projectPath = pathResolve(process.cwd(), modulePath);
if (existsSync(projectPath)) {
return projectPath;
}
const repoPath = findFileUp.sync(modulePath, dirName);
if (repoPath && existsSync(repoPath)) {
return repoPath;
}
const localPath = findFileUp.sync(modulePath, './', 10) || `./${modulePath}`;
return localPath;
};
export const resolveBinaryPath = (binaryName, packageName)=>{
const lexDir = LexConfig.getLexDir();
const lexBinPath = pathResolve(lexDir, `node_modules/.bin/${binaryName}`);
if (existsSync(lexBinPath)) {
return lexBinPath;
}
if (packageName) {
const lexPackageBinPath = pathResolve(lexDir, `node_modules/${packageName}/bin/${binaryName}`);
if (existsSync(lexPackageBinPath)) {
return lexPackageBinPath;
}
const lexPackageBinJsPath = pathResolve(lexDir, `node_modules/${packageName}/bin/${binaryName}.js`);
if (existsSync(lexPackageBinJsPath)) {
return lexPackageBinJsPath;
}
const lexPackageBinCjsPath = pathResolve(lexDir, `node_modules/${packageName}/bin/${binaryName}.cjs`);
if (existsSync(lexPackageBinCjsPath)) {
return lexPackageBinCjsPath;
}
}
const checkBinUp = (startDir)=>{
let checkDir = startDir;
for(let i = 0; i < 5; i++){
const monorepoBinPath = pathResolve(checkDir, `node_modules/.bin/${binaryName}`);
if (existsSync(monorepoBinPath)) {
return monorepoBinPath;
}
const parentDir = pathResolve(checkDir, '..');
if (parentDir === checkDir) {
break;
}
checkDir = parentDir;
}
return '';
};
const fromCwd = checkBinUp(process.cwd());
if (fromCwd) {
return fromCwd;
}
const fromLex = checkBinUp(lexDir);
if (fromLex) {
return fromLex;
}
return '';
};
export const findTailwindCssPath = ()=>{
const tailwindPatterns = [
'**/tailwind.css'
];
for (const pattern of tailwindPatterns){
const files = globSync(pattern, {
cwd: process.cwd(),
ignore: [
'**/node_modules/**',
'**/dist/**',
'**/lib/**',
'**/build/**',
'**/.storybook/**'
]
});
if (files.length > 0) {
return pathResolve(process.cwd(), files[0]);
}
}
return '';
};
export const resolveWebpackPaths = (currentDirname)=>{
const possibleWebpackPaths = [
pathResolve(process.cwd(), 'node_modules/webpack-cli/bin/cli.js'),
pathResolve(process.cwd(), 'node_modules/.bin/webpack'),
pathResolve(process.cwd(), 'node_modules/@nlabs/lex', 'node_modules/webpack-cli/bin/cli.js'),
pathResolve(process.cwd(), 'node_modules/@nlabs/lex', 'node_modules/.bin/webpack'),
pathResolve(currentDirname, 'node_modules/@nlabs/lex/node_modules/webpack-cli/bin/cli.js'),
pathResolve(currentDirname, 'node_modules/@nlabs/lex/node_modules/.bin/webpack'),
pathResolve(process.env.LEX_HOME || '/node_modules/@nlabs/lex', 'node_modules/webpack-cli/bin/cli.js'),
pathResolve(process.env.LEX_HOME || '/node_modules/@nlabs/lex', 'node_modules/.bin/webpack')
];
let webpackPath = '';
for (const path of possibleWebpackPaths){
if (existsSync(path)) {
webpackPath = path;
break;
}
}
if (!webpackPath) {
try {
const lexPackagePath = getLexPackageJsonPath();
const lexPackageDir = dirname(lexPackagePath);
const lexWebpackCli = pathResolve(lexPackageDir, 'node_modules/webpack-cli/bin/cli.js');
const lexWebpackBin = pathResolve(lexPackageDir, 'node_modules/.bin/webpack');
if (existsSync(lexWebpackCli)) {
webpackPath = lexWebpackCli;
} else if (existsSync(lexWebpackBin)) {
webpackPath = lexWebpackBin;
} else {
webpackPath = 'npx';
}
} catch {
webpackPath = 'npx';
}
}
const possibleWebpackConfigPaths = [
pathResolve(process.cwd(), 'webpack.config.js'),
pathResolve(process.cwd(), 'webpack.config.ts'),
pathResolve(process.cwd(), 'node_modules/@nlabs/lex/webpack.config.js'),
pathResolve(process.cwd(), 'node_modules/@nlabs/lex/webpack.config.ts'),
pathResolve(currentDirname, 'node_modules/@nlabs/lex/webpack.config.js'),
pathResolve(currentDirname, 'node_modules/@nlabs/lex/webpack.config.ts'),
pathResolve(process.env.LEX_HOME || '/node_modules/@nlabs/lex', 'webpack.config.js'),
pathResolve(process.env.LEX_HOME || '/node_modules/@nlabs/lex', 'webpack.config.ts')
];
let webpackConfig = '';
for (const path of possibleWebpackConfigPaths){
if (existsSync(path)) {
webpackConfig = path;
break;
}
}
if (!webpackConfig) {
const lexPackagePath = getLexPackageJsonPath();
const lexPackageDir = dirname(lexPackagePath);
const lexWebpackConfig = pathResolve(lexPackageDir, 'webpack.config.js');
if (existsSync(lexWebpackConfig)) {
webpackConfig = lexWebpackConfig;
} else {
webpackConfig = pathResolve(currentDirname, '../../webpack.config.js');
}
}
return {
webpackConfig,
webpackPath
};
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9maWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQgZmluZEZpbGVVcCBmcm9tICdmaW5kLWZpbGUtdXAnO1xuaW1wb3J0IHtleGlzdHNTeW5jLCByZWFkRmlsZVN5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCB7c3luYyBhcyBnbG9iU3luY30gZnJvbSAnZ2xvYic7XG5pbXBvcnQge3Jlc29sdmUgYXMgcGF0aFJlc29sdmUsIGRpcm5hbWV9IGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vTGV4Q29uZmlnLmpzJztcblxuZXhwb3J0IGNvbnN0IGdldERpck5hbWUgPSAoKTogc3RyaW5nID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZhbCgnbmV3IFVSTChcIi5cIiwgaW1wb3J0Lm1ldGEudXJsKS5wYXRobmFtZScpO1xuICB9IGNhdGNoe1xuICAgIHJldHVybiBwcm9jZXNzLmN3ZCgpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmlsZVBhdGggPSAocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBldmFsKCdyZXF1aXJlKFwidXJsXCIpLmZpbGVVUkxUb1BhdGgobmV3IFVSTChyZWxhdGl2ZVBhdGgsIGltcG9ydC5tZXRhLnVybCkpJyk7XG4gIH0gY2F0Y2h7XG4gICAgaWYocmVsYXRpdmVQYXRoID09PSAnLi4vLi4vLi4vcGFja2FnZS5qc29uJykge1xuICAgICAgcmV0dXJuIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICdwYWNrYWdlLmpzb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksIHJlbGF0aXZlUGF0aCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRMZXhQYWNrYWdlSnNvblBhdGggPSAoKTogc3RyaW5nID0+IHtcbiAgY29uc3QgTEVYX1BBQ0tBR0VfTkFNRSA9ICdAbmxhYnMvbGV4JztcblxuICBjb25zdCBsZXhJbk5vZGVNb2R1bGVzID0gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4L3BhY2thZ2UuanNvbicpO1xuXG4gIGlmKGV4aXN0c1N5bmMobGV4SW5Ob2RlTW9kdWxlcykpIHtcbiAgICByZXR1cm4gbGV4SW5Ob2RlTW9kdWxlcztcbiAgfVxuXG4gIGxldCBzdGFydERpcjogc3RyaW5nO1xuXG4gIGlmKHByb2Nlc3MuZW52LkxFWF9ST09UKSB7XG4gICAgc3RhcnREaXIgPSBwcm9jZXNzLmVudi5MRVhfUk9PVDtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgc3RhcnREaXIgPSBldmFsKCduZXcgVVJMKFwiLlwiLCBpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lJyk7XG4gICAgfSBjYXRjaHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0YXJ0RGlyID0gZXZhbCgnX19maWxlbmFtZSA/IHJlcXVpcmUoXCJwYXRoXCIpLmRpcm5hbWUoX19maWxlbmFtZSkgOiBudWxsJyk7XG4gICAgICAgIGlmKCFzdGFydERpcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignX19maWxlbmFtZSBub3QgYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2h7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYocHJvY2Vzcy5hcmd2WzFdICYmICFwcm9jZXNzLmFyZ3ZbMV0uaW5jbHVkZXMoJ25vZGUnKSkge1xuICAgICAgICAgICAgc3RhcnREaXIgPSBkaXJuYW1lKHByb2Nlc3MuYXJndlsxXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5hcmd2WzFdIG5vdCBzdWl0YWJsZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaHtcbiAgICAgICAgICBzdGFydERpciA9IHByb2Nlc3MuY3dkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgZGlyID0gc3RhcnREaXI7XG4gIGZvcihsZXQgaSA9IDA7IGkgPCA4OyBpKyspIHtcbiAgICBjb25zdCBwa2dQYXRoID0gcGF0aFJlc29sdmUoZGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYoZXhpc3RzU3luYyhwa2dQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGtnID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMocGtnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICAgIGlmKHBrZy5uYW1lID09PSBMRVhfUEFDS0FHRV9OQU1FKSB7XG4gICAgICAgICAgcmV0dXJuIHBrZ1BhdGg7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2h7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGRpcm5hbWUoZGlyKTtcbiAgICBpZihwYXJlbnQgPT09IGRpcikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRpciA9IHBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAncGFja2FnZS5qc29uJyk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVsYXRpdmVGaWxlUGF0aCA9IChmaWxlbmFtZTogc3RyaW5nLCBkaXJQYXRoOiBzdHJpbmcgPSAnLi8nLCBiYWNrVXA6IG51bWJlciA9IDApOiBzdHJpbmcgPT4ge1xuICBjb25zdCBuZXN0RGVwdGg6IG51bWJlciA9IDEwO1xuXG4gIGlmKGJhY2tVcCkge1xuICAgIGNvbnN0IGZpbGVQYXRoOiBzdHJpbmcgPSBmaW5kRmlsZVVwLnN5bmMoZmlsZW5hbWUsIGRpclBhdGgsIG5lc3REZXB0aCk7XG4gICAgY29uc3QgcHJldmlvdXNQYXRoOiBzdHJpbmcgPSBBcnJheShiYWNrVXApLmZpbGwobnVsbCkubWFwKCgpID0+ICcuLi8nKS5qb2luKCcnKTtcbiAgICByZXR1cm4gcGF0aFJlc29sdmUoZmlsZVBhdGgsIHByZXZpb3VzUGF0aCk7XG4gIH1cblxuICByZXR1cm4gZmluZEZpbGVVcC5zeW5jKGZpbGVuYW1lLCBkaXJQYXRoLCBuZXN0RGVwdGgpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbGF0aXZlTm9kZVBhdGggPSAoZmlsZW5hbWU6IHN0cmluZywgZGlyUGF0aDogc3RyaW5nID0gJy4vJywgYmFja1VwOiBudW1iZXIgPSAwKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbmVzdERlcHRoOiBudW1iZXIgPSAxMDtcbiAgY29uc3QgbW9kdWxlUGF0aCA9IGBub2RlX21vZHVsZXMvJHtmaWxlbmFtZX1gO1xuXG4gIGlmKGRpclBhdGggIT09ICcuLycpIHtcbiAgICBjb25zdCBsZXhNb2R1bGVQYXRoID0gcGF0aFJlc29sdmUoZGlyUGF0aCwgbW9kdWxlUGF0aCk7XG4gICAgaWYoZXhpc3RzU3luYyhsZXhNb2R1bGVQYXRoKSkge1xuICAgICAgcmV0dXJuIGxleE1vZHVsZVBhdGg7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvamVjdFBhdGggPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBtb2R1bGVQYXRoKTtcbiAgaWYoZXhpc3RzU3luYyhwcm9qZWN0UGF0aCkpIHtcbiAgICByZXR1cm4gcHJvamVjdFBhdGg7XG4gIH1cblxuICBpZihiYWNrVXApIHtcbiAgICBjb25zdCBmaWxlUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsIGRpclBhdGgsIG5lc3REZXB0aCk7XG4gICAgY29uc3QgcHJldmlvdXNQYXRoOiBzdHJpbmcgPSBBcnJheShuZXN0RGVwdGgpLmZpbGwobnVsbCkubWFwKCgpID0+ICcuLi8nKS5qb2luKCcnKTtcbiAgICByZXR1cm4gcGF0aFJlc29sdmUoZmlsZVBhdGgsIHByZXZpb3VzUGF0aCk7XG4gIH1cblxuICByZXR1cm4gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsIGRpclBhdGgsIG5lc3REZXB0aCkgfHwgYC9ub2RlX21vZHVsZXMvJHtmaWxlbmFtZX1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE5vZGVQYXRoID0gKG1vZHVsZU5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGRpck5hbWUgPSBnZXREaXJOYW1lKCk7XG4gIGNvbnN0IG1vZHVsZVBhdGg6IHN0cmluZyA9IGBub2RlX21vZHVsZXMvJHttb2R1bGVOYW1lfWA7XG5cbiAgY29uc3QgcHJvamVjdFBhdGggPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBtb2R1bGVQYXRoKTtcbiAgaWYoZXhpc3RzU3luYyhwcm9qZWN0UGF0aCkpIHtcbiAgICByZXR1cm4gcHJvamVjdFBhdGg7XG4gIH1cblxuICBjb25zdCByZXBvUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsIGRpck5hbWUpO1xuICBpZihyZXBvUGF0aCAmJiBleGlzdHNTeW5jKHJlcG9QYXRoKSkge1xuICAgIHJldHVybiByZXBvUGF0aDtcbiAgfVxuXG4gIGNvbnN0IGxvY2FsUGF0aDogc3RyaW5nID0gZmluZEZpbGVVcC5zeW5jKG1vZHVsZVBhdGgsICcuLycsIDEwKSB8fCBgLi8ke21vZHVsZVBhdGh9YDtcbiAgcmV0dXJuIGxvY2FsUGF0aDtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlQmluYXJ5UGF0aCA9IChiaW5hcnlOYW1lOiBzdHJpbmcsIHBhY2thZ2VOYW1lPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbGV4RGlyID0gTGV4Q29uZmlnLmdldExleERpcigpO1xuXG4gIGNvbnN0IGxleEJpblBhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsIGBub2RlX21vZHVsZXMvLmJpbi8ke2JpbmFyeU5hbWV9YCk7XG4gIGlmKGV4aXN0c1N5bmMobGV4QmluUGF0aCkpIHtcbiAgICByZXR1cm4gbGV4QmluUGF0aDtcbiAgfVxuXG4gIGlmKHBhY2thZ2VOYW1lKSB7XG4gICAgY29uc3QgbGV4UGFja2FnZUJpblBhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsIGBub2RlX21vZHVsZXMvJHtwYWNrYWdlTmFtZX0vYmluLyR7YmluYXJ5TmFtZX1gKTtcbiAgICBpZihleGlzdHNTeW5jKGxleFBhY2thZ2VCaW5QYXRoKSkge1xuICAgICAgcmV0dXJuIGxleFBhY2thZ2VCaW5QYXRoO1xuICAgIH1cblxuICAgIGNvbnN0IGxleFBhY2thZ2VCaW5Kc1BhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsIGBub2RlX21vZHVsZXMvJHtwYWNrYWdlTmFtZX0vYmluLyR7YmluYXJ5TmFtZX0uanNgKTtcbiAgICBpZihleGlzdHNTeW5jKGxleFBhY2thZ2VCaW5Kc1BhdGgpKSB7XG4gICAgICByZXR1cm4gbGV4UGFja2FnZUJpbkpzUGF0aDtcbiAgICB9XG5cbiAgICBjb25zdCBsZXhQYWNrYWdlQmluQ2pzUGF0aCA9IHBhdGhSZXNvbHZlKGxleERpciwgYG5vZGVfbW9kdWxlcy8ke3BhY2thZ2VOYW1lfS9iaW4vJHtiaW5hcnlOYW1lfS5janNgKTtcbiAgICBpZihleGlzdHNTeW5jKGxleFBhY2thZ2VCaW5DanNQYXRoKSkge1xuICAgICAgcmV0dXJuIGxleFBhY2thZ2VCaW5DanNQYXRoO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNoZWNrQmluVXAgPSAoc3RhcnREaXI6IHN0cmluZykgPT4ge1xuICAgIGxldCBjaGVja0RpciA9IHN0YXJ0RGlyO1xuICAgIGZvcihsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgIGNvbnN0IG1vbm9yZXBvQmluUGF0aCA9IHBhdGhSZXNvbHZlKGNoZWNrRGlyLCBgbm9kZV9tb2R1bGVzLy5iaW4vJHtiaW5hcnlOYW1lfWApO1xuICAgICAgaWYoZXhpc3RzU3luYyhtb25vcmVwb0JpblBhdGgpKSB7XG4gICAgICAgIHJldHVybiBtb25vcmVwb0JpblBhdGg7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnREaXIgPSBwYXRoUmVzb2x2ZShjaGVja0RpciwgJy4uJyk7XG4gICAgICBpZihwYXJlbnREaXIgPT09IGNoZWNrRGlyKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2hlY2tEaXIgPSBwYXJlbnREaXI7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfTtcblxuICBjb25zdCBmcm9tQ3dkID0gY2hlY2tCaW5VcChwcm9jZXNzLmN3ZCgpKTtcbiAgaWYoZnJvbUN3ZCkge1xuICAgIHJldHVybiBmcm9tQ3dkO1xuICB9XG5cbiAgY29uc3QgZnJvbUxleCA9IGNoZWNrQmluVXAobGV4RGlyKTtcbiAgaWYoZnJvbUxleCkge1xuICAgIHJldHVybiBmcm9tTGV4O1xuICB9XG5cbiAgcmV0dXJuICcnO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRUYWlsd2luZENzc1BhdGggPSAoKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdGFpbHdpbmRQYXR0ZXJucyA9IFsnKiovdGFpbHdpbmQuY3NzJ107XG5cbiAgZm9yKGNvbnN0IHBhdHRlcm4gb2YgdGFpbHdpbmRQYXR0ZXJucykge1xuICAgIGNvbnN0IGZpbGVzID0gZ2xvYlN5bmMocGF0dGVybiwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi9kaXN0LyoqJywgJyoqL2xpYi8qKicsICcqKi9idWlsZC8qKicsICcqKi8uc3Rvcnlib29rLyoqJ11cbiAgICB9KTtcblxuICAgIGlmKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBmaWxlc1swXSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVXZWJwYWNrUGF0aHMgPSAoY3VycmVudERpcm5hbWU6IHN0cmluZyk6IHt3ZWJwYWNrUGF0aDogc3RyaW5nOyB3ZWJwYWNrQ29uZmlnOiBzdHJpbmd9ID0+IHtcbiAgY29uc3QgcG9zc2libGVXZWJwYWNrUGF0aHMgPSBbXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcy93ZWJwYWNrLWNsaS9iaW4vY2xpLmpzJyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcy8uYmluL3dlYnBhY2snKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnbm9kZV9tb2R1bGVzL3dlYnBhY2stY2xpL2Jpbi9jbGkuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnbm9kZV9tb2R1bGVzLy5iaW4vd2VicGFjaycpLFxuICAgIHBhdGhSZXNvbHZlKGN1cnJlbnREaXJuYW1lLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgvbm9kZV9tb2R1bGVzL3dlYnBhY2stY2xpL2Jpbi9jbGkuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJ25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4L25vZGVfbW9kdWxlcy8uYmluL3dlYnBhY2snKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmVudi5MRVhfSE9NRSB8fCAnL25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4JywgJ25vZGVfbW9kdWxlcy93ZWJwYWNrLWNsaS9iaW4vY2xpLmpzJyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5lbnYuTEVYX0hPTUUgfHwgJy9ub2RlX21vZHVsZXMvQG5sYWJzL2xleCcsICdub2RlX21vZHVsZXMvLmJpbi93ZWJwYWNrJylcbiAgXTtcblxuICBsZXQgd2VicGFja1BhdGggPSAnJztcblxuICBmb3IoY29uc3QgcGF0aCBvZiBwb3NzaWJsZVdlYnBhY2tQYXRocykge1xuICAgIGlmKGV4aXN0c1N5bmMocGF0aCkpIHtcbiAgICAgIHdlYnBhY2tQYXRoID0gcGF0aDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmKCF3ZWJwYWNrUGF0aCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBsZXhQYWNrYWdlUGF0aCA9IGdldExleFBhY2thZ2VKc29uUGF0aCgpO1xuICAgICAgY29uc3QgbGV4UGFja2FnZURpciA9IGRpcm5hbWUobGV4UGFja2FnZVBhdGgpO1xuICAgICAgY29uc3QgbGV4V2VicGFja0NsaSA9IHBhdGhSZXNvbHZlKGxleFBhY2thZ2VEaXIsICdub2RlX21vZHVsZXMvd2VicGFjay1jbGkvYmluL2NsaS5qcycpO1xuICAgICAgY29uc3QgbGV4V2VicGFja0JpbiA9IHBhdGhSZXNvbHZlKGxleFBhY2thZ2VEaXIsICdub2RlX21vZHVsZXMvLmJpbi93ZWJwYWNrJyk7XG5cbiAgICAgIGlmKGV4aXN0c1N5bmMobGV4V2VicGFja0NsaSkpIHtcbiAgICAgICAgd2VicGFja1BhdGggPSBsZXhXZWJwYWNrQ2xpO1xuICAgICAgfSBlbHNlIGlmKGV4aXN0c1N5bmMobGV4V2VicGFja0JpbikpIHtcbiAgICAgICAgd2VicGFja1BhdGggPSBsZXhXZWJwYWNrQmluO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2VicGFja1BhdGggPSAnbnB4JztcbiAgICAgIH1cbiAgICB9IGNhdGNoe1xuICAgICAgd2VicGFja1BhdGggPSAnbnB4JztcbiAgICB9XG4gIH1cblxuICBjb25zdCBwb3NzaWJsZVdlYnBhY2tDb25maWdQYXRocyA9IFtcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnd2VicGFjay5jb25maWcuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnd2VicGFjay5jb25maWcudHMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgvd2VicGFjay5jb25maWcuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzL0BubGFicy9sZXgvd2VicGFjay5jb25maWcudHMnKSxcbiAgICBwYXRoUmVzb2x2ZShjdXJyZW50RGlybmFtZSwgJ25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4L3dlYnBhY2suY29uZmlnLmpzJyksXG4gICAgcGF0aFJlc29sdmUoY3VycmVudERpcm5hbWUsICdub2RlX21vZHVsZXMvQG5sYWJzL2xleC93ZWJwYWNrLmNvbmZpZy50cycpLFxuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuZW52LkxFWF9IT01FIHx8ICcvbm9kZV9tb2R1bGVzL0BubGFicy9sZXgnLCAnd2VicGFjay5jb25maWcuanMnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmVudi5MRVhfSE9NRSB8fCAnL25vZGVfbW9kdWxlcy9AbmxhYnMvbGV4JywgJ3dlYnBhY2suY29uZmlnLnRzJylcbiAgXTtcblxuICBsZXQgd2VicGFja0NvbmZpZyA9ICcnO1xuXG4gIGZvcihjb25zdCBwYXRoIG9mIHBvc3NpYmxlV2VicGFja0NvbmZpZ1BhdGhzKSB7XG4gICAgaWYoZXhpc3RzU3luYyhwYXRoKSkge1xuICAgICAgd2VicGFja0NvbmZpZyA9IHBhdGg7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZighd2VicGFja0NvbmZpZykge1xuICAgIGNvbnN0IGxleFBhY2thZ2VQYXRoID0gZ2V0TGV4UGFja2FnZUpzb25QYXRoKCk7XG4gICAgY29uc3QgbGV4UGFja2FnZURpciA9IGRpcm5hbWUobGV4UGFja2FnZVBhdGgpO1xuICAgIGNvbnN0IGxleFdlYnBhY2tDb25maWcgPSBwYXRoUmVzb2x2ZShsZXhQYWNrYWdlRGlyLCAnd2VicGFjay5jb25maWcuanMnKTtcblxuICAgIGlmKGV4aXN0c1N5bmMobGV4V2VicGFja0NvbmZpZykpIHtcbiAgICAgIHdlYnBhY2tDb25maWcgPSBsZXhXZWJwYWNrQ29uZmlnO1xuICAgIH0gZWxzZSB7XG4gICAgICB3ZWJwYWNrQ29uZmlnID0gcGF0aFJlc29sdmUoY3VycmVudERpcm5hbWUsICcuLi8uLi93ZWJwYWNrLmNvbmZpZy5qcycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7d2VicGFja0NvbmZpZywgd2VicGFja1BhdGh9O1xufTsiXSwibmFtZXMiOlsiZmluZEZpbGVVcCIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJzeW5jIiwiZ2xvYlN5bmMiLCJyZXNvbHZlIiwicGF0aFJlc29sdmUiLCJkaXJuYW1lIiwiTGV4Q29uZmlnIiwiZ2V0RGlyTmFtZSIsImV2YWwiLCJwcm9jZXNzIiwiY3dkIiwiZ2V0RmlsZVBhdGgiLCJyZWxhdGl2ZVBhdGgiLCJnZXRMZXhQYWNrYWdlSnNvblBhdGgiLCJMRVhfUEFDS0FHRV9OQU1FIiwibGV4SW5Ob2RlTW9kdWxlcyIsInN0YXJ0RGlyIiwiZW52IiwiTEVYX1JPT1QiLCJFcnJvciIsImFyZ3YiLCJpbmNsdWRlcyIsImRpciIsImkiLCJwa2dQYXRoIiwicGtnIiwiSlNPTiIsInBhcnNlIiwibmFtZSIsInBhcmVudCIsInJlbGF0aXZlRmlsZVBhdGgiLCJmaWxlbmFtZSIsImRpclBhdGgiLCJiYWNrVXAiLCJuZXN0RGVwdGgiLCJmaWxlUGF0aCIsInByZXZpb3VzUGF0aCIsIkFycmF5IiwiZmlsbCIsIm1hcCIsImpvaW4iLCJyZWxhdGl2ZU5vZGVQYXRoIiwibW9kdWxlUGF0aCIsImxleE1vZHVsZVBhdGgiLCJwcm9qZWN0UGF0aCIsImdldE5vZGVQYXRoIiwibW9kdWxlTmFtZSIsImRpck5hbWUiLCJyZXBvUGF0aCIsImxvY2FsUGF0aCIsInJlc29sdmVCaW5hcnlQYXRoIiwiYmluYXJ5TmFtZSIsInBhY2thZ2VOYW1lIiwibGV4RGlyIiwiZ2V0TGV4RGlyIiwibGV4QmluUGF0aCIsImxleFBhY2thZ2VCaW5QYXRoIiwibGV4UGFja2FnZUJpbkpzUGF0aCIsImxleFBhY2thZ2VCaW5DanNQYXRoIiwiY2hlY2tCaW5VcCIsImNoZWNrRGlyIiwibW9ub3JlcG9CaW5QYXRoIiwicGFyZW50RGlyIiwiZnJvbUN3ZCIsImZyb21MZXgiLCJmaW5kVGFpbHdpbmRDc3NQYXRoIiwidGFpbHdpbmRQYXR0ZXJucyIsInBhdHRlcm4iLCJmaWxlcyIsImlnbm9yZSIsImxlbmd0aCIsInJlc29sdmVXZWJwYWNrUGF0aHMiLCJjdXJyZW50RGlybmFtZSIsInBvc3NpYmxlV2VicGFja1BhdGhzIiwiTEVYX0hPTUUiLCJ3ZWJwYWNrUGF0aCIsInBhdGgiLCJsZXhQYWNrYWdlUGF0aCIsImxleFBhY2thZ2VEaXIiLCJsZXhXZWJwYWNrQ2xpIiwibGV4V2VicGFja0JpbiIsInBvc3NpYmxlV2VicGFja0NvbmZpZ1BhdGhzIiwid2VicGFja0NvbmZpZyIsImxleFdlYnBhY2tDb25maWciXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELE9BQU9BLGdCQUFnQixlQUFlO0FBQ3RDLFNBQVFDLFVBQVUsRUFBRUMsWUFBWSxRQUFPLEtBQUs7QUFDNUMsU0FBUUMsUUFBUUMsUUFBUSxRQUFPLE9BQU87QUFDdEMsU0FBUUMsV0FBV0MsV0FBVyxFQUFFQyxPQUFPLFFBQU8sT0FBTztBQUVyRCxTQUFRQyxTQUFTLFFBQU8sa0JBQWtCO0FBRTFDLE9BQU8sTUFBTUMsYUFBYTtJQUN4QixJQUFJO1FBQ0YsT0FBT0MsS0FBSztJQUNkLEVBQUUsT0FBSztRQUNMLE9BQU9DLFFBQVFDLEdBQUc7SUFDcEI7QUFDRixFQUFFO0FBRUYsT0FBTyxNQUFNQyxjQUFjLENBQUNDO0lBQzFCLElBQUk7UUFDRixPQUFPSixLQUFLO0lBQ2QsRUFBRSxPQUFLO1FBQ0wsSUFBR0ksaUJBQWlCLHlCQUF5QjtZQUMzQyxPQUFPUixZQUFZSyxRQUFRQyxHQUFHLElBQUk7UUFDcEM7UUFDQSxPQUFPTixZQUFZSyxRQUFRQyxHQUFHLElBQUlFO0lBQ3BDO0FBQ0YsRUFBRTtBQUVGLE9BQU8sTUFBTUMsd0JBQXdCO0lBQ25DLE1BQU1DLG1CQUFtQjtJQUV6QixNQUFNQyxtQkFBbUJYLFlBQVlLLFFBQVFDLEdBQUcsSUFBSTtJQUVwRCxJQUFHWCxXQUFXZ0IsbUJBQW1CO1FBQy9CLE9BQU9BO0lBQ1Q7SUFFQSxJQUFJQztJQUVKLElBQUdQLFFBQVFRLEdBQUcsQ0FBQ0MsUUFBUSxFQUFFO1FBQ3ZCRixXQUFXUCxRQUFRUSxHQUFHLENBQUNDLFFBQVE7SUFDakMsT0FBTztRQUNMLElBQUk7WUFDRkYsV0FBV1IsS0FBSztRQUNsQixFQUFFLE9BQUs7WUFDTCxJQUFJO2dCQUNGUSxXQUFXUixLQUFLO2dCQUNoQixJQUFHLENBQUNRLFVBQVU7b0JBQ1osTUFBTSxJQUFJRyxNQUFNO2dCQUNsQjtZQUNGLEVBQUUsT0FBSztnQkFDTCxJQUFJO29CQUNGLElBQUdWLFFBQVFXLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQ1gsUUFBUVcsSUFBSSxDQUFDLEVBQUUsQ0FBQ0MsUUFBUSxDQUFDLFNBQVM7d0JBQ3ZETCxXQUFXWCxRQUFRSSxRQUFRVyxJQUFJLENBQUMsRUFBRTtvQkFDcEMsT0FBTzt3QkFDTCxNQUFNLElBQUlELE1BQU07b0JBQ2xCO2dCQUNGLEVBQUUsT0FBSztvQkFDTEgsV0FBV1AsUUFBUUMsR0FBRztnQkFDeEI7WUFDRjtRQUNGO0lBQ0Y7SUFFQSxJQUFJWSxNQUFNTjtJQUNWLElBQUksSUFBSU8sSUFBSSxHQUFHQSxJQUFJLEdBQUdBLElBQUs7UUFDekIsTUFBTUMsVUFBVXBCLFlBQVlrQixLQUFLO1FBQ2pDLElBQUd2QixXQUFXeUIsVUFBVTtZQUN0QixJQUFJO2dCQUNGLE1BQU1DLE1BQU1DLEtBQUtDLEtBQUssQ0FBQzNCLGFBQWF3QixTQUFTO2dCQUM3QyxJQUFHQyxJQUFJRyxJQUFJLEtBQUtkLGtCQUFrQjtvQkFDaEMsT0FBT1U7Z0JBQ1Q7WUFDRixFQUFFLE9BQUssQ0FDUDtRQUNGO1FBQ0EsTUFBTUssU0FBU3hCLFFBQVFpQjtRQUN2QixJQUFHTyxXQUFXUCxLQUFLO1lBQ2pCO1FBQ0Y7UUFDQUEsTUFBTU87SUFDUjtJQUVBLE9BQU96QixZQUFZSyxRQUFRQyxHQUFHLElBQUk7QUFDcEMsRUFBRTtBQUVGLE9BQU8sTUFBTW9CLG1CQUFtQixDQUFDQyxVQUFrQkMsVUFBa0IsSUFBSSxFQUFFQyxTQUFpQixDQUFDO0lBQzNGLE1BQU1DLFlBQW9CO0lBRTFCLElBQUdELFFBQVE7UUFDVCxNQUFNRSxXQUFtQnJDLFdBQVdHLElBQUksQ0FBQzhCLFVBQVVDLFNBQVNFO1FBQzVELE1BQU1FLGVBQXVCQyxNQUFNSixRQUFRSyxJQUFJLENBQUMsTUFBTUMsR0FBRyxDQUFDLElBQU0sT0FBT0MsSUFBSSxDQUFDO1FBQzVFLE9BQU9wQyxZQUFZK0IsVUFBVUM7SUFDL0I7SUFFQSxPQUFPdEMsV0FBV0csSUFBSSxDQUFDOEIsVUFBVUMsU0FBU0U7QUFDNUMsRUFBRTtBQUVGLE9BQU8sTUFBTU8sbUJBQW1CLENBQUNWLFVBQWtCQyxVQUFrQixJQUFJLEVBQUVDLFNBQWlCLENBQUM7SUFDM0YsTUFBTUMsWUFBb0I7SUFDMUIsTUFBTVEsYUFBYSxDQUFDLGFBQWEsRUFBRVgsVUFBVTtJQUU3QyxJQUFHQyxZQUFZLE1BQU07UUFDbkIsTUFBTVcsZ0JBQWdCdkMsWUFBWTRCLFNBQVNVO1FBQzNDLElBQUczQyxXQUFXNEMsZ0JBQWdCO1lBQzVCLE9BQU9BO1FBQ1Q7SUFDRjtJQUVBLE1BQU1DLGNBQWN4QyxZQUFZSyxRQUFRQyxHQUFHLElBQUlnQztJQUMvQyxJQUFHM0MsV0FBVzZDLGNBQWM7UUFDMUIsT0FBT0E7SUFDVDtJQUVBLElBQUdYLFFBQVE7UUFDVCxNQUFNRSxXQUFtQnJDLFdBQVdHLElBQUksQ0FBQ3lDLFlBQVlWLFNBQVNFO1FBQzlELE1BQU1FLGVBQXVCQyxNQUFNSCxXQUFXSSxJQUFJLENBQUMsTUFBTUMsR0FBRyxDQUFDLElBQU0sT0FBT0MsSUFBSSxDQUFDO1FBQy9FLE9BQU9wQyxZQUFZK0IsVUFBVUM7SUFDL0I7SUFFQSxPQUFPdEMsV0FBV0csSUFBSSxDQUFDeUMsWUFBWVYsU0FBU0UsY0FBYyxDQUFDLGNBQWMsRUFBRUgsVUFBVTtBQUN2RixFQUFFO0FBRUYsT0FBTyxNQUFNYyxjQUFjLENBQUNDO0lBQzFCLE1BQU1DLFVBQVV4QztJQUNoQixNQUFNbUMsYUFBcUIsQ0FBQyxhQUFhLEVBQUVJLFlBQVk7SUFFdkQsTUFBTUYsY0FBY3hDLFlBQVlLLFFBQVFDLEdBQUcsSUFBSWdDO0lBQy9DLElBQUczQyxXQUFXNkMsY0FBYztRQUMxQixPQUFPQTtJQUNUO0lBRUEsTUFBTUksV0FBbUJsRCxXQUFXRyxJQUFJLENBQUN5QyxZQUFZSztJQUNyRCxJQUFHQyxZQUFZakQsV0FBV2lELFdBQVc7UUFDbkMsT0FBT0E7SUFDVDtJQUVBLE1BQU1DLFlBQW9CbkQsV0FBV0csSUFBSSxDQUFDeUMsWUFBWSxNQUFNLE9BQU8sQ0FBQyxFQUFFLEVBQUVBLFlBQVk7SUFDcEYsT0FBT087QUFDVCxFQUFFO0FBRUYsT0FBTyxNQUFNQyxvQkFBb0IsQ0FBQ0MsWUFBb0JDO0lBQ3BELE1BQU1DLFNBQVMvQyxVQUFVZ0QsU0FBUztJQUVsQyxNQUFNQyxhQUFhbkQsWUFBWWlELFFBQVEsQ0FBQyxrQkFBa0IsRUFBRUYsWUFBWTtJQUN4RSxJQUFHcEQsV0FBV3dELGFBQWE7UUFDekIsT0FBT0E7SUFDVDtJQUVBLElBQUdILGFBQWE7UUFDZCxNQUFNSSxvQkFBb0JwRCxZQUFZaUQsUUFBUSxDQUFDLGFBQWEsRUFBRUQsWUFBWSxLQUFLLEVBQUVELFlBQVk7UUFDN0YsSUFBR3BELFdBQVd5RCxvQkFBb0I7WUFDaEMsT0FBT0E7UUFDVDtRQUVBLE1BQU1DLHNCQUFzQnJELFlBQVlpRCxRQUFRLENBQUMsYUFBYSxFQUFFRCxZQUFZLEtBQUssRUFBRUQsV0FBVyxHQUFHLENBQUM7UUFDbEcsSUFBR3BELFdBQVcwRCxzQkFBc0I7WUFDbEMsT0FBT0E7UUFDVDtRQUVBLE1BQU1DLHVCQUF1QnRELFlBQVlpRCxRQUFRLENBQUMsYUFBYSxFQUFFRCxZQUFZLEtBQUssRUFBRUQsV0FBVyxJQUFJLENBQUM7UUFDcEcsSUFBR3BELFdBQVcyRCx1QkFBdUI7WUFDbkMsT0FBT0E7UUFDVDtJQUNGO0lBRUEsTUFBTUMsYUFBYSxDQUFDM0M7UUFDbEIsSUFBSTRDLFdBQVc1QztRQUNmLElBQUksSUFBSU8sSUFBSSxHQUFHQSxJQUFJLEdBQUdBLElBQUs7WUFDekIsTUFBTXNDLGtCQUFrQnpELFlBQVl3RCxVQUFVLENBQUMsa0JBQWtCLEVBQUVULFlBQVk7WUFDL0UsSUFBR3BELFdBQVc4RCxrQkFBa0I7Z0JBQzlCLE9BQU9BO1lBQ1Q7WUFDQSxNQUFNQyxZQUFZMUQsWUFBWXdELFVBQVU7WUFDeEMsSUFBR0UsY0FBY0YsVUFBVTtnQkFDekI7WUFDRjtZQUNBQSxXQUFXRTtRQUNiO1FBQ0EsT0FBTztJQUNUO0lBRUEsTUFBTUMsVUFBVUosV0FBV2xELFFBQVFDLEdBQUc7SUFDdEMsSUFBR3FELFNBQVM7UUFDVixPQUFPQTtJQUNUO0lBRUEsTUFBTUMsVUFBVUwsV0FBV047SUFDM0IsSUFBR1csU0FBUztRQUNWLE9BQU9BO0lBQ1Q7SUFFQSxPQUFPO0FBQ1QsRUFBRTtBQUVGLE9BQU8sTUFBTUMsc0JBQXNCO0lBQ2pDLE1BQU1DLG1CQUFtQjtRQUFDO0tBQWtCO0lBRTVDLEtBQUksTUFBTUMsV0FBV0QsaUJBQWtCO1FBQ3JDLE1BQU1FLFFBQVFsRSxTQUFTaUUsU0FBUztZQUM5QnpELEtBQUtELFFBQVFDLEdBQUc7WUFDaEIyRCxRQUFRO2dCQUFDO2dCQUFzQjtnQkFBYztnQkFBYTtnQkFBZTthQUFtQjtRQUM5RjtRQUVBLElBQUdELE1BQU1FLE1BQU0sR0FBRyxHQUFHO1lBQ25CLE9BQU9sRSxZQUFZSyxRQUFRQyxHQUFHLElBQUkwRCxLQUFLLENBQUMsRUFBRTtRQUM1QztJQUNGO0lBRUEsT0FBTztBQUNULEVBQUU7QUFFRixPQUFPLE1BQU1HLHNCQUFzQixDQUFDQztJQUNsQyxNQUFNQyx1QkFBdUI7UUFDM0JyRSxZQUFZSyxRQUFRQyxHQUFHLElBQUk7UUFDM0JOLFlBQVlLLFFBQVFDLEdBQUcsSUFBSTtRQUMzQk4sWUFBWUssUUFBUUMsR0FBRyxJQUFJLDJCQUEyQjtRQUN0RE4sWUFBWUssUUFBUUMsR0FBRyxJQUFJLDJCQUEyQjtRQUN0RE4sWUFBWW9FLGdCQUFnQjtRQUM1QnBFLFlBQVlvRSxnQkFBZ0I7UUFDNUJwRSxZQUFZSyxRQUFRUSxHQUFHLENBQUN5RCxRQUFRLElBQUksNEJBQTRCO1FBQ2hFdEUsWUFBWUssUUFBUVEsR0FBRyxDQUFDeUQsUUFBUSxJQUFJLDRCQUE0QjtLQUNqRTtJQUVELElBQUlDLGNBQWM7SUFFbEIsS0FBSSxNQUFNQyxRQUFRSCxxQkFBc0I7UUFDdEMsSUFBRzFFLFdBQVc2RSxPQUFPO1lBQ25CRCxjQUFjQztZQUNkO1FBQ0Y7SUFDRjtJQUVBLElBQUcsQ0FBQ0QsYUFBYTtRQUNmLElBQUk7WUFDRixNQUFNRSxpQkFBaUJoRTtZQUN2QixNQUFNaUUsZ0JBQWdCekUsUUFBUXdFO1lBQzlCLE1BQU1FLGdCQUFnQjNFLFlBQVkwRSxlQUFlO1lBQ2pELE1BQU1FLGdCQUFnQjVFLFlBQVkwRSxlQUFlO1lBRWpELElBQUcvRSxXQUFXZ0YsZ0JBQWdCO2dCQUM1QkosY0FBY0k7WUFDaEIsT0FBTyxJQUFHaEYsV0FBV2lGLGdCQUFnQjtnQkFDbkNMLGNBQWNLO1lBQ2hCLE9BQU87Z0JBQ0xMLGNBQWM7WUFDaEI7UUFDRixFQUFFLE9BQUs7WUFDTEEsY0FBYztRQUNoQjtJQUNGO0lBRUEsTUFBTU0sNkJBQTZCO1FBQ2pDN0UsWUFBWUssUUFBUUMsR0FBRyxJQUFJO1FBQzNCTixZQUFZSyxRQUFRQyxHQUFHLElBQUk7UUFDM0JOLFlBQVlLLFFBQVFDLEdBQUcsSUFBSTtRQUMzQk4sWUFBWUssUUFBUUMsR0FBRyxJQUFJO1FBQzNCTixZQUFZb0UsZ0JBQWdCO1FBQzVCcEUsWUFBWW9FLGdCQUFnQjtRQUM1QnBFLFlBQVlLLFFBQVFRLEdBQUcsQ0FBQ3lELFFBQVEsSUFBSSw0QkFBNEI7UUFDaEV0RSxZQUFZSyxRQUFRUSxHQUFHLENBQUN5RCxRQUFRLElBQUksNEJBQTRCO0tBQ2pFO0lBRUQsSUFBSVEsZ0JBQWdCO0lBRXBCLEtBQUksTUFBTU4sUUFBUUssMkJBQTRCO1FBQzVDLElBQUdsRixXQUFXNkUsT0FBTztZQUNuQk0sZ0JBQWdCTjtZQUNoQjtRQUNGO0lBQ0Y7SUFFQSxJQUFHLENBQUNNLGVBQWU7UUFDakIsTUFBTUwsaUJBQWlCaEU7UUFDdkIsTUFBTWlFLGdCQUFnQnpFLFFBQVF3RTtRQUM5QixNQUFNTSxtQkFBbUIvRSxZQUFZMEUsZUFBZTtRQUVwRCxJQUFHL0UsV0FBV29GLG1CQUFtQjtZQUMvQkQsZ0JBQWdCQztRQUNsQixPQUFPO1lBQ0xELGdCQUFnQjlFLFlBQVlvRSxnQkFBZ0I7UUFDOUM7SUFDRjtJQUVBLE9BQU87UUFBQ1U7UUFBZVA7SUFBVztBQUNwQyxFQUFFIn0=