@nlabs/lex
Version:
203 lines (202 loc) • 28.6 kB
JavaScript
/**
* Copyright (c) 2018-Present, Nitrogen Labs, Inc.
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
*/ import { existsSync, readFileSync, renameSync, writeFileSync } from 'fs';
import { resolve as pathResolve } from 'path';
import { createChangelog } from '../../create/changelog.js';
import { LexConfig } from '../../LexConfig.js';
import { copyFolderRecursiveSync, getFilenames, removeFiles, updateTemplateName } from '../../utils/app.js';
import { getDirName } from '../../utils/file.js';
import { log } from '../../utils/log.js';
export const create = async (type, cmd, callback = ()=>({}))=>{
const { cliName = 'Lex', outputFile = '', outputName = '', quiet } = cmd;
const cwd = process.cwd();
log(`${cliName} creating ${type}...`, 'info', quiet);
// Get custom configuration
await LexConfig.parseConfig(cmd, false);
const { outputPath = '', sourcePath = '', useTypescript } = LexConfig.config;
if (useTypescript) {
// Make sure tsconfig.json exists
LexConfig.checkTypescriptConfig();
}
const { config } = LexConfig;
const dirName = getDirName();
switch(type){
case 'changelog':
{
const statusChangelog = await createChangelog({
cliName,
config,
outputFile,
quiet
});
callback(statusChangelog);
return statusChangelog;
}
case 'store':
{
try {
const result = getFilenames({
cliName,
name: outputName,
quiet,
type,
useTypescript
});
if (!result) {
return 1;
}
const { nameCaps, templateExt, templatePath } = result;
const storePath = `${cwd}/${nameCaps}Store`;
if (!existsSync(storePath)) {
// Copy store files
copyFolderRecursiveSync(pathResolve(dirName, templatePath, './.SampleStore'), cwd);
// Rename directory
renameSync(`${cwd}/.SampleStore`, storePath);
// Rename test
const storeTestPath = `${storePath}/${nameCaps}Store.test${templateExt}`;
renameSync(`${storePath}/SampleStore.test${templateExt}.txt`, storeTestPath);
// Search and replace store name
updateTemplateName(storeTestPath, outputName, nameCaps);
// Rename source file
const storeFilePath = `${storePath}/${nameCaps}Store${templateExt}`;
renameSync(`${storePath}/SampleStore${templateExt}.txt`, storeFilePath);
// Search and replace store name
updateTemplateName(storeFilePath, outputName, nameCaps);
} else {
log(`\n${cliName} Error: Cannot create new ${type}. Directory, ${storePath} already exists.`, 'error', quiet);
callback(1);
return 1;
}
} catch (error) {
log(`\n${cliName} Error: Cannot create new ${type}. ${error.message}`, 'error', quiet);
callback(1);
return 1;
}
break;
}
case 'tsconfig':
{
// Remove existing file
await removeFiles('tsconfig.json', true);
// Get tsconfig template
const templatePath = pathResolve(dirName, '../../../tsconfig.template.json');
let data = readFileSync(templatePath, 'utf8');
// Update Lex tsconfig template with source and output directories
data = data.replace(/.\/src/g, sourcePath);
data = data.replace(/.\/lib/g, outputPath);
// Save new tsconfig to app
const destPath = pathResolve(cwd, './tsconfig.json');
writeFileSync(destPath, data, 'utf8');
break;
}
case 'view':
{
const result = getFilenames({
cliName,
name: outputName,
quiet,
type,
useTypescript
});
if (!result) {
return 1;
}
const { nameCaps, templatePath, templateReact } = result;
const viewPath = `${cwd}/${nameCaps}View`;
try {
if (!existsSync(viewPath)) {
// Copy view files
copyFolderRecursiveSync(pathResolve(dirName, templatePath, './.SampleView'), cwd);
// Rename directory
renameSync(`${cwd}/.SampleView`, viewPath);
// Rename CSS
const viewStylePath = `${viewPath}/${outputName}View.css`;
renameSync(`${viewPath}/sampleView.css`, viewStylePath);
// Search and replace view name
updateTemplateName(viewStylePath, outputName, nameCaps);
// Rename test
const viewTestPath = `${viewPath}/${nameCaps}View.test${templateReact}`;
renameSync(`${viewPath}/SampleView.test${templateReact}.txt`, viewTestPath);
// Search and replace view name
updateTemplateName(viewTestPath, outputName, nameCaps);
// Rename source file
const viewFilePath = `${viewPath}/${nameCaps}View${templateReact}`;
renameSync(`${viewPath}/SampleView${templateReact}.txt`, viewFilePath);
// Search and replace view name
updateTemplateName(viewFilePath, outputName, nameCaps);
} else {
log(`\n${cliName} Error: Cannot create new ${type}. Directory, ${viewPath} already exists.`, 'error', quiet);
callback(1);
return 1;
}
} catch (error) {
log(`\n${cliName} Error: Cannot create new ${type}. ${error.message}`, 'error', quiet);
callback(1);
return 1;
}
break;
}
case 'vscode':
{
// Remove existing directory
await removeFiles('.vscode', true);
// Copy vscode configuration
copyFolderRecursiveSync(pathResolve(dirName, '../../../.vscode'), cwd);
break;
}
case 'datalayer':
{
try {
const result = getFilenames({
cliName,
name: outputName,
quiet,
type,
useTypescript
});
if (!result) {
return 1;
}
const { nameCaps, templateExt, templatePath } = result;
const dataLayerPath = `${cwd}/${nameCaps}DataLayer`;
if (!existsSync(dataLayerPath)) {
// Create data layer directory
const fs = await import('fs');
fs.mkdirSync(dataLayerPath, {
recursive: true
});
// Copy and rename main data layer file
const sourceFile = pathResolve(dirName, templatePath, `./DataLayer${templateExt}.txt`);
const targetFile = `${dataLayerPath}/${nameCaps}DataLayer${templateExt}`;
if (existsSync(sourceFile)) {
const content = readFileSync(sourceFile, 'utf8');
const updatedContent = content.replace(/DataLayer/g, nameCaps);
writeFileSync(targetFile, updatedContent);
}
// Copy and rename test file
const sourceTestFile = pathResolve(dirName, templatePath, `./DataLayer.test${templateExt}.txt`);
const targetTestFile = `${dataLayerPath}/${nameCaps}DataLayer.test${templateExt}`;
if (existsSync(sourceTestFile)) {
const testContent = readFileSync(sourceTestFile, 'utf8');
const updatedTestContent = testContent.replace(/DataLayer/g, nameCaps);
writeFileSync(targetTestFile, updatedTestContent);
}
log(`\n${cliName} Success: Created ${nameCaps}DataLayer with test files.`, 'info', quiet);
} else {
log(`\n${cliName} Error: Cannot create new ${type}. Directory, ${dataLayerPath} already exists.`, 'error', quiet);
callback(1);
return 1;
}
} catch (error) {
log(`\n${cliName} Error: Cannot create new ${type}. ${error.message}`, 'error', quiet);
callback(1);
return 1;
}
break;
}
}
callback(0);
return 0;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9jcmVhdGUvY3JlYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2V4aXN0c1N5bmMsIHJlYWRGaWxlU3luYywgcmVuYW1lU3luYywgd3JpdGVGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtyZXNvbHZlIGFzIHBhdGhSZXNvbHZlfSBmcm9tICdwYXRoJztcblxuaW1wb3J0IHtjcmVhdGVDaGFuZ2Vsb2d9IGZyb20gJy4uLy4uL2NyZWF0ZS9jaGFuZ2Vsb2cuanMnO1xuaW1wb3J0IHtMZXhDb25maWd9IGZyb20gJy4uLy4uL0xleENvbmZpZy5qcyc7XG5pbXBvcnQge2NvcHlGb2xkZXJSZWN1cnNpdmVTeW5jLCBnZXRGaWxlbmFtZXMsIHJlbW92ZUZpbGVzLCB1cGRhdGVUZW1wbGF0ZU5hbWV9IGZyb20gJy4uLy4uL3V0aWxzL2FwcC5qcyc7XG5pbXBvcnQge2dldERpck5hbWV9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG91dHB1dEZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG91dHB1dE5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgQ3JlYXRlQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpPT4gdm9pZDtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZSA9IGFzeW5jIChcbiAgdHlwZTogc3RyaW5nLFxuICBjbWQ6IENyZWF0ZU9wdGlvbnMsXG4gIGNhbGxiYWNrOiBDcmVhdGVDYWxsYmFjayA9ICgpID0+ICh7fSlcbik6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHtjbGlOYW1lID0gJ0xleCcsIG91dHB1dEZpbGUgPSAnJywgb3V0cHV0TmFtZSA9ICcnLCBxdWlldH0gPSBjbWQ7XG4gIGNvbnN0IGN3ZDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKTtcbiAgbG9nKGAke2NsaU5hbWV9IGNyZWF0aW5nICR7dHlwZX0uLi5gLCAnaW5mbycsIHF1aWV0KTtcblxuICAvLyBHZXQgY3VzdG9tIGNvbmZpZ3VyYXRpb25cbiAgYXdhaXQgTGV4Q29uZmlnLnBhcnNlQ29uZmlnKGNtZCwgZmFsc2UpO1xuICBjb25zdCB7b3V0cHV0UGF0aCA9ICcnLCBzb3VyY2VQYXRoID0gJycsIHVzZVR5cGVzY3JpcHR9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICBpZih1c2VUeXBlc2NyaXB0KSB7XG4gICAgLy8gTWFrZSBzdXJlIHRzY29uZmlnLmpzb24gZXhpc3RzXG4gICAgTGV4Q29uZmlnLmNoZWNrVHlwZXNjcmlwdENvbmZpZygpO1xuICB9XG5cbiAgY29uc3Qge2NvbmZpZ30gPSBMZXhDb25maWc7XG4gIGNvbnN0IGRpck5hbWUgPSBnZXREaXJOYW1lKCk7XG5cbiAgc3dpdGNoKHR5cGUpIHtcbiAgICBjYXNlICdjaGFuZ2Vsb2cnOiB7XG4gICAgICBjb25zdCBzdGF0dXNDaGFuZ2Vsb2c6IG51bWJlciA9IGF3YWl0IGNyZWF0ZUNoYW5nZWxvZyh7Y2xpTmFtZSwgY29uZmlnLCBvdXRwdXRGaWxlLCBxdWlldH0pO1xuICAgICAgY2FsbGJhY2soc3RhdHVzQ2hhbmdlbG9nKTtcbiAgICAgIHJldHVybiBzdGF0dXNDaGFuZ2Vsb2c7XG4gICAgfVxuICAgIGNhc2UgJ3N0b3JlJzoge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0RmlsZW5hbWVzKHtcbiAgICAgICAgICBjbGlOYW1lLFxuICAgICAgICAgIG5hbWU6IG91dHB1dE5hbWUsXG4gICAgICAgICAgcXVpZXQsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICB1c2VUeXBlc2NyaXB0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmKCFyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHtuYW1lQ2FwcywgdGVtcGxhdGVFeHQsIHRlbXBsYXRlUGF0aH0gPSByZXN1bHQ7XG4gICAgICAgIGNvbnN0IHN0b3JlUGF0aDogc3RyaW5nID0gYCR7Y3dkfS8ke25hbWVDYXBzfVN0b3JlYDtcblxuICAgICAgICBpZighZXhpc3RzU3luYyhzdG9yZVBhdGgpKSB7XG4gICAgICAgIC8vIENvcHkgc3RvcmUgZmlsZXNcbiAgICAgICAgICBjb3B5Rm9sZGVyUmVjdXJzaXZlU3luYyhwYXRoUmVzb2x2ZShkaXJOYW1lLCB0ZW1wbGF0ZVBhdGgsICcuLy5TYW1wbGVTdG9yZScpLCBjd2QpO1xuXG4gICAgICAgICAgLy8gUmVuYW1lIGRpcmVjdG9yeVxuICAgICAgICAgIHJlbmFtZVN5bmMoYCR7Y3dkfS8uU2FtcGxlU3RvcmVgLCBzdG9yZVBhdGgpO1xuXG4gICAgICAgICAgLy8gUmVuYW1lIHRlc3RcbiAgICAgICAgICBjb25zdCBzdG9yZVRlc3RQYXRoOiBzdHJpbmcgPSBgJHtzdG9yZVBhdGh9LyR7bmFtZUNhcHN9U3RvcmUudGVzdCR7dGVtcGxhdGVFeHR9YDtcbiAgICAgICAgICByZW5hbWVTeW5jKGAke3N0b3JlUGF0aH0vU2FtcGxlU3RvcmUudGVzdCR7dGVtcGxhdGVFeHR9LnR4dGAsIHN0b3JlVGVzdFBhdGgpO1xuXG4gICAgICAgICAgLy8gU2VhcmNoIGFuZCByZXBsYWNlIHN0b3JlIG5hbWVcbiAgICAgICAgICB1cGRhdGVUZW1wbGF0ZU5hbWUoc3RvcmVUZXN0UGF0aCwgb3V0cHV0TmFtZSwgbmFtZUNhcHMpO1xuXG4gICAgICAgICAgLy8gUmVuYW1lIHNvdXJjZSBmaWxlXG4gICAgICAgICAgY29uc3Qgc3RvcmVGaWxlUGF0aDogc3RyaW5nID0gYCR7c3RvcmVQYXRofS8ke25hbWVDYXBzfVN0b3JlJHt0ZW1wbGF0ZUV4dH1gO1xuICAgICAgICAgIHJlbmFtZVN5bmMoYCR7c3RvcmVQYXRofS9TYW1wbGVTdG9yZSR7dGVtcGxhdGVFeHR9LnR4dGAsIHN0b3JlRmlsZVBhdGgpO1xuXG4gICAgICAgICAgLy8gU2VhcmNoIGFuZCByZXBsYWNlIHN0b3JlIG5hbWVcbiAgICAgICAgICB1cGRhdGVUZW1wbGF0ZU5hbWUoc3RvcmVGaWxlUGF0aCwgb3V0cHV0TmFtZSwgbmFtZUNhcHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogQ2Fubm90IGNyZWF0ZSBuZXcgJHt0eXBlfS4gRGlyZWN0b3J5LCAke3N0b3JlUGF0aH0gYWxyZWFkeSBleGlzdHMuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogQ2Fubm90IGNyZWF0ZSBuZXcgJHt0eXBlfS4gJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgY2FsbGJhY2soMSk7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3RzY29uZmlnJzoge1xuICAgIC8vIFJlbW92ZSBleGlzdGluZyBmaWxlXG4gICAgICBhd2FpdCByZW1vdmVGaWxlcygndHNjb25maWcuanNvbicsIHRydWUpO1xuXG4gICAgICAvLyBHZXQgdHNjb25maWcgdGVtcGxhdGVcbiAgICAgIGNvbnN0IHRlbXBsYXRlUGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUoZGlyTmFtZSwgJy4uLy4uLy4uL3RzY29uZmlnLnRlbXBsYXRlLmpzb24nKTtcbiAgICAgIGxldCBkYXRhOiBzdHJpbmcgPSByZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoLCAndXRmOCcpO1xuXG4gICAgICAvLyBVcGRhdGUgTGV4IHRzY29uZmlnIHRlbXBsYXRlIHdpdGggc291cmNlIGFuZCBvdXRwdXQgZGlyZWN0b3JpZXNcbiAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoLy5cXC9zcmMvZywgc291cmNlUGF0aCk7XG4gICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKC8uXFwvbGliL2csIG91dHB1dFBhdGgpO1xuXG4gICAgICAvLyBTYXZlIG5ldyB0c2NvbmZpZyB0byBhcHBcbiAgICAgIGNvbnN0IGRlc3RQYXRoOiBzdHJpbmcgPSBwYXRoUmVzb2x2ZShjd2QsICcuL3RzY29uZmlnLmpzb24nKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoZGVzdFBhdGgsIGRhdGEsICd1dGY4Jyk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndmlldyc6IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEZpbGVuYW1lcyh7XG4gICAgICAgIGNsaU5hbWUsXG4gICAgICAgIG5hbWU6IG91dHB1dE5hbWUsXG4gICAgICAgIHF1aWV0LFxuICAgICAgICB0eXBlLFxuICAgICAgICB1c2VUeXBlc2NyaXB0XG4gICAgICB9KTtcblxuICAgICAgaWYoIXJlc3VsdCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge25hbWVDYXBzLCB0ZW1wbGF0ZVBhdGgsIHRlbXBsYXRlUmVhY3R9ID0gcmVzdWx0O1xuICAgICAgY29uc3Qgdmlld1BhdGg6IHN0cmluZyA9IGAke2N3ZH0vJHtuYW1lQ2Fwc31WaWV3YDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYoIWV4aXN0c1N5bmModmlld1BhdGgpKSB7XG4gICAgICAgIC8vIENvcHkgdmlldyBmaWxlc1xuICAgICAgICAgIGNvcHlGb2xkZXJSZWN1cnNpdmVTeW5jKHBhdGhSZXNvbHZlKGRpck5hbWUsIHRlbXBsYXRlUGF0aCwgJy4vLlNhbXBsZVZpZXcnKSwgY3dkKTtcblxuICAgICAgICAgIC8vIFJlbmFtZSBkaXJlY3RvcnlcbiAgICAgICAgICByZW5hbWVTeW5jKGAke2N3ZH0vLlNhbXBsZVZpZXdgLCB2aWV3UGF0aCk7XG5cbiAgICAgICAgICAvLyBSZW5hbWUgQ1NTXG4gICAgICAgICAgY29uc3Qgdmlld1N0eWxlUGF0aDogc3RyaW5nID0gYCR7dmlld1BhdGh9LyR7b3V0cHV0TmFtZX1WaWV3LmNzc2A7XG4gICAgICAgICAgcmVuYW1lU3luYyhgJHt2aWV3UGF0aH0vc2FtcGxlVmlldy5jc3NgLCB2aWV3U3R5bGVQYXRoKTtcblxuICAgICAgICAgIC8vIFNlYXJjaCBhbmQgcmVwbGFjZSB2aWV3IG5hbWVcbiAgICAgICAgICB1cGRhdGVUZW1wbGF0ZU5hbWUodmlld1N0eWxlUGF0aCwgb3V0cHV0TmFtZSwgbmFtZUNhcHMpO1xuXG4gICAgICAgICAgLy8gUmVuYW1lIHRlc3RcbiAgICAgICAgICBjb25zdCB2aWV3VGVzdFBhdGg6IHN0cmluZyA9IGAke3ZpZXdQYXRofS8ke25hbWVDYXBzfVZpZXcudGVzdCR7dGVtcGxhdGVSZWFjdH1gO1xuICAgICAgICAgIHJlbmFtZVN5bmMoYCR7dmlld1BhdGh9L1NhbXBsZVZpZXcudGVzdCR7dGVtcGxhdGVSZWFjdH0udHh0YCwgdmlld1Rlc3RQYXRoKTtcblxuICAgICAgICAgIC8vIFNlYXJjaCBhbmQgcmVwbGFjZSB2aWV3IG5hbWVcbiAgICAgICAgICB1cGRhdGVUZW1wbGF0ZU5hbWUodmlld1Rlc3RQYXRoLCBvdXRwdXROYW1lLCBuYW1lQ2Fwcyk7XG5cbiAgICAgICAgICAvLyBSZW5hbWUgc291cmNlIGZpbGVcbiAgICAgICAgICBjb25zdCB2aWV3RmlsZVBhdGg6IHN0cmluZyA9IGAke3ZpZXdQYXRofS8ke25hbWVDYXBzfVZpZXcke3RlbXBsYXRlUmVhY3R9YDtcbiAgICAgICAgICByZW5hbWVTeW5jKGAke3ZpZXdQYXRofS9TYW1wbGVWaWV3JHt0ZW1wbGF0ZVJlYWN0fS50eHRgLCB2aWV3RmlsZVBhdGgpO1xuXG4gICAgICAgICAgLy8gU2VhcmNoIGFuZCByZXBsYWNlIHZpZXcgbmFtZVxuICAgICAgICAgIHVwZGF0ZVRlbXBsYXRlTmFtZSh2aWV3RmlsZVBhdGgsIG91dHB1dE5hbWUsIG5hbWVDYXBzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IENhbm5vdCBjcmVhdGUgbmV3ICR7dHlwZX0uIERpcmVjdG9yeSwgJHt2aWV3UGF0aH0gYWxyZWFkeSBleGlzdHMuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogQ2Fubm90IGNyZWF0ZSBuZXcgJHt0eXBlfS4gJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgY2FsbGJhY2soMSk7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3ZzY29kZSc6IHtcbiAgICAvLyBSZW1vdmUgZXhpc3RpbmcgZGlyZWN0b3J5XG4gICAgICBhd2FpdCByZW1vdmVGaWxlcygnLnZzY29kZScsIHRydWUpO1xuXG4gICAgICAvLyBDb3B5IHZzY29kZSBjb25maWd1cmF0aW9uXG4gICAgICBjb3B5Rm9sZGVyUmVjdXJzaXZlU3luYyhwYXRoUmVzb2x2ZShkaXJOYW1lLCAnLi4vLi4vLi4vLnZzY29kZScpLCBjd2QpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ2RhdGFsYXllcic6IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGdldEZpbGVuYW1lcyh7XG4gICAgICAgICAgY2xpTmFtZSxcbiAgICAgICAgICBuYW1lOiBvdXRwdXROYW1lLFxuICAgICAgICAgIHF1aWV0LFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgdXNlVHlwZXNjcmlwdFxuICAgICAgICB9KTtcblxuICAgICAgICBpZighcmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7bmFtZUNhcHMsIHRlbXBsYXRlRXh0LCB0ZW1wbGF0ZVBhdGh9ID0gcmVzdWx0O1xuICAgICAgICBjb25zdCBkYXRhTGF5ZXJQYXRoOiBzdHJpbmcgPSBgJHtjd2R9LyR7bmFtZUNhcHN9RGF0YUxheWVyYDtcblxuICAgICAgICBpZighZXhpc3RzU3luYyhkYXRhTGF5ZXJQYXRoKSkge1xuICAgICAgICAgIC8vIENyZWF0ZSBkYXRhIGxheWVyIGRpcmVjdG9yeVxuICAgICAgICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgICAgICAgIGZzLm1rZGlyU3luYyhkYXRhTGF5ZXJQYXRoLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG5cbiAgICAgICAgICAvLyBDb3B5IGFuZCByZW5hbWUgbWFpbiBkYXRhIGxheWVyIGZpbGVcbiAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlID0gcGF0aFJlc29sdmUoZGlyTmFtZSwgdGVtcGxhdGVQYXRoLCBgLi9EYXRhTGF5ZXIke3RlbXBsYXRlRXh0fS50eHRgKTtcbiAgICAgICAgICBjb25zdCB0YXJnZXRGaWxlID0gYCR7ZGF0YUxheWVyUGF0aH0vJHtuYW1lQ2Fwc31EYXRhTGF5ZXIke3RlbXBsYXRlRXh0fWA7XG5cbiAgICAgICAgICBpZihleGlzdHNTeW5jKHNvdXJjZUZpbGUpKSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKHNvdXJjZUZpbGUsICd1dGY4Jyk7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkQ29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvRGF0YUxheWVyL2csIG5hbWVDYXBzKTtcbiAgICAgICAgICAgIHdyaXRlRmlsZVN5bmModGFyZ2V0RmlsZSwgdXBkYXRlZENvbnRlbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENvcHkgYW5kIHJlbmFtZSB0ZXN0IGZpbGVcbiAgICAgICAgICBjb25zdCBzb3VyY2VUZXN0RmlsZSA9IHBhdGhSZXNvbHZlKGRpck5hbWUsIHRlbXBsYXRlUGF0aCwgYC4vRGF0YUxheWVyLnRlc3Qke3RlbXBsYXRlRXh0fS50eHRgKTtcbiAgICAgICAgICBjb25zdCB0YXJnZXRUZXN0RmlsZSA9IGAke2RhdGFMYXllclBhdGh9LyR7bmFtZUNhcHN9RGF0YUxheWVyLnRlc3Qke3RlbXBsYXRlRXh0fWA7XG5cbiAgICAgICAgICBpZihleGlzdHNTeW5jKHNvdXJjZVRlc3RGaWxlKSkge1xuICAgICAgICAgICAgY29uc3QgdGVzdENvbnRlbnQgPSByZWFkRmlsZVN5bmMoc291cmNlVGVzdEZpbGUsICd1dGY4Jyk7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkVGVzdENvbnRlbnQgPSB0ZXN0Q29udGVudC5yZXBsYWNlKC9EYXRhTGF5ZXIvZywgbmFtZUNhcHMpO1xuICAgICAgICAgICAgd3JpdGVGaWxlU3luYyh0YXJnZXRUZXN0RmlsZSwgdXBkYXRlZFRlc3RDb250ZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gU3VjY2VzczogQ3JlYXRlZCAke25hbWVDYXBzfURhdGFMYXllciB3aXRoIHRlc3QgZmlsZXMuYCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBDYW5ub3QgY3JlYXRlIG5ldyAke3R5cGV9LiBEaXJlY3RvcnksICR7ZGF0YUxheWVyUGF0aH0gYWxyZWFkeSBleGlzdHMuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogQ2Fubm90IGNyZWF0ZSBuZXcgJHt0eXBlfS4gJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgY2FsbGJhY2soMSk7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soMCk7XG4gIHJldHVybiAwO1xufTsiXSwibmFtZXMiOlsiZXhpc3RzU3luYyIsInJlYWRGaWxlU3luYyIsInJlbmFtZVN5bmMiLCJ3cml0ZUZpbGVTeW5jIiwicmVzb2x2ZSIsInBhdGhSZXNvbHZlIiwiY3JlYXRlQ2hhbmdlbG9nIiwiTGV4Q29uZmlnIiwiY29weUZvbGRlclJlY3Vyc2l2ZVN5bmMiLCJnZXRGaWxlbmFtZXMiLCJyZW1vdmVGaWxlcyIsInVwZGF0ZVRlbXBsYXRlTmFtZSIsImdldERpck5hbWUiLCJsb2ciLCJjcmVhdGUiLCJ0eXBlIiwiY21kIiwiY2FsbGJhY2siLCJjbGlOYW1lIiwib3V0cHV0RmlsZSIsIm91dHB1dE5hbWUiLCJxdWlldCIsImN3ZCIsInByb2Nlc3MiLCJwYXJzZUNvbmZpZyIsIm91dHB1dFBhdGgiLCJzb3VyY2VQYXRoIiwidXNlVHlwZXNjcmlwdCIsImNvbmZpZyIsImNoZWNrVHlwZXNjcmlwdENvbmZpZyIsImRpck5hbWUiLCJzdGF0dXNDaGFuZ2Vsb2ciLCJyZXN1bHQiLCJuYW1lIiwibmFtZUNhcHMiLCJ0ZW1wbGF0ZUV4dCIsInRlbXBsYXRlUGF0aCIsInN0b3JlUGF0aCIsInN0b3JlVGVzdFBhdGgiLCJzdG9yZUZpbGVQYXRoIiwiZXJyb3IiLCJtZXNzYWdlIiwiZGF0YSIsInJlcGxhY2UiLCJkZXN0UGF0aCIsInRlbXBsYXRlUmVhY3QiLCJ2aWV3UGF0aCIsInZpZXdTdHlsZVBhdGgiLCJ2aWV3VGVzdFBhdGgiLCJ2aWV3RmlsZVBhdGgiLCJkYXRhTGF5ZXJQYXRoIiwiZnMiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJzb3VyY2VGaWxlIiwidGFyZ2V0RmlsZSIsImNvbnRlbnQiLCJ1cGRhdGVkQ29udGVudCIsInNvdXJjZVRlc3RGaWxlIiwidGFyZ2V0VGVzdEZpbGUiLCJ0ZXN0Q29udGVudCIsInVwZGF0ZWRUZXN0Q29udGVudCJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsVUFBVSxFQUFFQyxZQUFZLEVBQUVDLFVBQVUsRUFBRUMsYUFBYSxRQUFPLEtBQUs7QUFDdkUsU0FBUUMsV0FBV0MsV0FBVyxRQUFPLE9BQU87QUFFNUMsU0FBUUMsZUFBZSxRQUFPLDRCQUE0QjtBQUMxRCxTQUFRQyxTQUFTLFFBQU8scUJBQXFCO0FBQzdDLFNBQVFDLHVCQUF1QixFQUFFQyxZQUFZLEVBQUVDLFdBQVcsRUFBRUMsa0JBQWtCLFFBQU8scUJBQXFCO0FBQzFHLFNBQVFDLFVBQVUsUUFBTyxzQkFBc0I7QUFDL0MsU0FBUUMsR0FBRyxRQUFPLHFCQUFxQjtBQVd2QyxPQUFPLE1BQU1DLFNBQVMsT0FDcEJDLE1BQ0FDLEtBQ0FDLFdBQTJCLElBQU8sQ0FBQSxDQUFDLENBQUEsQ0FBRTtJQUVyQyxNQUFNLEVBQUNDLFVBQVUsS0FBSyxFQUFFQyxhQUFhLEVBQUUsRUFBRUMsYUFBYSxFQUFFLEVBQUVDLEtBQUssRUFBQyxHQUFHTDtJQUNuRSxNQUFNTSxNQUFjQyxRQUFRRCxHQUFHO0lBQy9CVCxJQUFJLEdBQUdLLFFBQVEsVUFBVSxFQUFFSCxLQUFLLEdBQUcsQ0FBQyxFQUFFLFFBQVFNO0lBRTlDLDJCQUEyQjtJQUMzQixNQUFNZCxVQUFVaUIsV0FBVyxDQUFDUixLQUFLO0lBQ2pDLE1BQU0sRUFBQ1MsYUFBYSxFQUFFLEVBQUVDLGFBQWEsRUFBRSxFQUFFQyxhQUFhLEVBQUMsR0FBR3BCLFVBQVVxQixNQUFNO0lBRTFFLElBQUdELGVBQWU7UUFDaEIsaUNBQWlDO1FBQ2pDcEIsVUFBVXNCLHFCQUFxQjtJQUNqQztJQUVBLE1BQU0sRUFBQ0QsTUFBTSxFQUFDLEdBQUdyQjtJQUNqQixNQUFNdUIsVUFBVWxCO0lBRWhCLE9BQU9HO1FBQ0wsS0FBSztZQUFhO2dCQUNoQixNQUFNZ0Isa0JBQTBCLE1BQU16QixnQkFBZ0I7b0JBQUNZO29CQUFTVTtvQkFBUVQ7b0JBQVlFO2dCQUFLO2dCQUN6RkosU0FBU2M7Z0JBQ1QsT0FBT0E7WUFDVDtRQUNBLEtBQUs7WUFBUztnQkFDWixJQUFJO29CQUNGLE1BQU1DLFNBQVN2QixhQUFhO3dCQUMxQlM7d0JBQ0FlLE1BQU1iO3dCQUNOQzt3QkFDQU47d0JBQ0FZO29CQUNGO29CQUVBLElBQUcsQ0FBQ0ssUUFBUTt3QkFDVixPQUFPO29CQUNUO29CQUVBLE1BQU0sRUFBQ0UsUUFBUSxFQUFFQyxXQUFXLEVBQUVDLFlBQVksRUFBQyxHQUFHSjtvQkFDOUMsTUFBTUssWUFBb0IsR0FBR2YsSUFBSSxDQUFDLEVBQUVZLFNBQVMsS0FBSyxDQUFDO29CQUVuRCxJQUFHLENBQUNsQyxXQUFXcUMsWUFBWTt3QkFDM0IsbUJBQW1CO3dCQUNqQjdCLHdCQUF3QkgsWUFBWXlCLFNBQVNNLGNBQWMsbUJBQW1CZDt3QkFFOUUsbUJBQW1CO3dCQUNuQnBCLFdBQVcsR0FBR29CLElBQUksYUFBYSxDQUFDLEVBQUVlO3dCQUVsQyxjQUFjO3dCQUNkLE1BQU1DLGdCQUF3QixHQUFHRCxVQUFVLENBQUMsRUFBRUgsU0FBUyxVQUFVLEVBQUVDLGFBQWE7d0JBQ2hGakMsV0FBVyxHQUFHbUMsVUFBVSxpQkFBaUIsRUFBRUYsWUFBWSxJQUFJLENBQUMsRUFBRUc7d0JBRTlELGdDQUFnQzt3QkFDaEMzQixtQkFBbUIyQixlQUFlbEIsWUFBWWM7d0JBRTlDLHFCQUFxQjt3QkFDckIsTUFBTUssZ0JBQXdCLEdBQUdGLFVBQVUsQ0FBQyxFQUFFSCxTQUFTLEtBQUssRUFBRUMsYUFBYTt3QkFDM0VqQyxXQUFXLEdBQUdtQyxVQUFVLFlBQVksRUFBRUYsWUFBWSxJQUFJLENBQUMsRUFBRUk7d0JBRXpELGdDQUFnQzt3QkFDaEM1QixtQkFBbUI0QixlQUFlbkIsWUFBWWM7b0JBQ2hELE9BQU87d0JBQ0xyQixJQUFJLENBQUMsRUFBRSxFQUFFSyxRQUFRLDBCQUEwQixFQUFFSCxLQUFLLGFBQWEsRUFBRXNCLFVBQVUsZ0JBQWdCLENBQUMsRUFBRSxTQUFTaEI7d0JBQ3ZHSixTQUFTO3dCQUNULE9BQU87b0JBQ1Q7Z0JBQ0YsRUFBRSxPQUFNdUIsT0FBTztvQkFDYjNCLElBQUksQ0FBQyxFQUFFLEVBQUVLLFFBQVEsMEJBQTBCLEVBQUVILEtBQUssRUFBRSxFQUFFeUIsTUFBTUMsT0FBTyxFQUFFLEVBQUUsU0FBU3BCO29CQUNoRkosU0FBUztvQkFDVCxPQUFPO2dCQUNUO2dCQUNBO1lBQ0Y7UUFDQSxLQUFLO1lBQVk7Z0JBQ2pCLHVCQUF1QjtnQkFDckIsTUFBTVAsWUFBWSxpQkFBaUI7Z0JBRW5DLHdCQUF3QjtnQkFDeEIsTUFBTTBCLGVBQXVCL0IsWUFBWXlCLFNBQVM7Z0JBQ2xELElBQUlZLE9BQWV6QyxhQUFhbUMsY0FBYztnQkFFOUMsa0VBQWtFO2dCQUNsRU0sT0FBT0EsS0FBS0MsT0FBTyxDQUFDLFdBQVdqQjtnQkFDL0JnQixPQUFPQSxLQUFLQyxPQUFPLENBQUMsV0FBV2xCO2dCQUUvQiwyQkFBMkI7Z0JBQzNCLE1BQU1tQixXQUFtQnZDLFlBQVlpQixLQUFLO2dCQUMxQ25CLGNBQWN5QyxVQUFVRixNQUFNO2dCQUM5QjtZQUNGO1FBQ0EsS0FBSztZQUFRO2dCQUNYLE1BQU1WLFNBQVN2QixhQUFhO29CQUMxQlM7b0JBQ0FlLE1BQU1iO29CQUNOQztvQkFDQU47b0JBQ0FZO2dCQUNGO2dCQUVBLElBQUcsQ0FBQ0ssUUFBUTtvQkFDVixPQUFPO2dCQUNUO2dCQUVBLE1BQU0sRUFBQ0UsUUFBUSxFQUFFRSxZQUFZLEVBQUVTLGFBQWEsRUFBQyxHQUFHYjtnQkFDaEQsTUFBTWMsV0FBbUIsR0FBR3hCLElBQUksQ0FBQyxFQUFFWSxTQUFTLElBQUksQ0FBQztnQkFFakQsSUFBSTtvQkFDRixJQUFHLENBQUNsQyxXQUFXOEMsV0FBVzt3QkFDMUIsa0JBQWtCO3dCQUNoQnRDLHdCQUF3QkgsWUFBWXlCLFNBQVNNLGNBQWMsa0JBQWtCZDt3QkFFN0UsbUJBQW1CO3dCQUNuQnBCLFdBQVcsR0FBR29CLElBQUksWUFBWSxDQUFDLEVBQUV3Qjt3QkFFakMsYUFBYTt3QkFDYixNQUFNQyxnQkFBd0IsR0FBR0QsU0FBUyxDQUFDLEVBQUUxQixXQUFXLFFBQVEsQ0FBQzt3QkFDakVsQixXQUFXLEdBQUc0QyxTQUFTLGVBQWUsQ0FBQyxFQUFFQzt3QkFFekMsK0JBQStCO3dCQUMvQnBDLG1CQUFtQm9DLGVBQWUzQixZQUFZYzt3QkFFOUMsY0FBYzt3QkFDZCxNQUFNYyxlQUF1QixHQUFHRixTQUFTLENBQUMsRUFBRVosU0FBUyxTQUFTLEVBQUVXLGVBQWU7d0JBQy9FM0MsV0FBVyxHQUFHNEMsU0FBUyxnQkFBZ0IsRUFBRUQsY0FBYyxJQUFJLENBQUMsRUFBRUc7d0JBRTlELCtCQUErQjt3QkFDL0JyQyxtQkFBbUJxQyxjQUFjNUIsWUFBWWM7d0JBRTdDLHFCQUFxQjt3QkFDckIsTUFBTWUsZUFBdUIsR0FBR0gsU0FBUyxDQUFDLEVBQUVaLFNBQVMsSUFBSSxFQUFFVyxlQUFlO3dCQUMxRTNDLFdBQVcsR0FBRzRDLFNBQVMsV0FBVyxFQUFFRCxjQUFjLElBQUksQ0FBQyxFQUFFSTt3QkFFekQsK0JBQStCO3dCQUMvQnRDLG1CQUFtQnNDLGNBQWM3QixZQUFZYztvQkFDL0MsT0FBTzt3QkFDTHJCLElBQUksQ0FBQyxFQUFFLEVBQUVLLFFBQVEsMEJBQTBCLEVBQUVILEtBQUssYUFBYSxFQUFFK0IsU0FBUyxnQkFBZ0IsQ0FBQyxFQUFFLFNBQVN6Qjt3QkFDdEdKLFNBQVM7d0JBQ1QsT0FBTztvQkFDVDtnQkFDRixFQUFFLE9BQU11QixPQUFPO29CQUNiM0IsSUFBSSxDQUFDLEVBQUUsRUFBRUssUUFBUSwwQkFBMEIsRUFBRUgsS0FBSyxFQUFFLEVBQUV5QixNQUFNQyxPQUFPLEVBQUUsRUFBRSxTQUFTcEI7b0JBQ2hGSixTQUFTO29CQUNULE9BQU87Z0JBQ1Q7Z0JBQ0E7WUFDRjtRQUNBLEtBQUs7WUFBVTtnQkFDZiw0QkFBNEI7Z0JBQzFCLE1BQU1QLFlBQVksV0FBVztnQkFFN0IsNEJBQTRCO2dCQUM1QkYsd0JBQXdCSCxZQUFZeUIsU0FBUyxxQkFBcUJSO2dCQUNsRTtZQUNGO1FBQ0EsS0FBSztZQUFhO2dCQUNoQixJQUFJO29CQUNGLE1BQU1VLFNBQVN2QixhQUFhO3dCQUMxQlM7d0JBQ0FlLE1BQU1iO3dCQUNOQzt3QkFDQU47d0JBQ0FZO29CQUNGO29CQUVBLElBQUcsQ0FBQ0ssUUFBUTt3QkFDVixPQUFPO29CQUNUO29CQUVBLE1BQU0sRUFBQ0UsUUFBUSxFQUFFQyxXQUFXLEVBQUVDLFlBQVksRUFBQyxHQUFHSjtvQkFDOUMsTUFBTWtCLGdCQUF3QixHQUFHNUIsSUFBSSxDQUFDLEVBQUVZLFNBQVMsU0FBUyxDQUFDO29CQUUzRCxJQUFHLENBQUNsQyxXQUFXa0QsZ0JBQWdCO3dCQUM3Qiw4QkFBOEI7d0JBQzlCLE1BQU1DLEtBQUssTUFBTSxNQUFNLENBQUM7d0JBQ3hCQSxHQUFHQyxTQUFTLENBQUNGLGVBQWU7NEJBQUNHLFdBQVc7d0JBQUk7d0JBRTVDLHVDQUF1Qzt3QkFDdkMsTUFBTUMsYUFBYWpELFlBQVl5QixTQUFTTSxjQUFjLENBQUMsV0FBVyxFQUFFRCxZQUFZLElBQUksQ0FBQzt3QkFDckYsTUFBTW9CLGFBQWEsR0FBR0wsY0FBYyxDQUFDLEVBQUVoQixTQUFTLFNBQVMsRUFBRUMsYUFBYTt3QkFFeEUsSUFBR25DLFdBQVdzRCxhQUFhOzRCQUN6QixNQUFNRSxVQUFVdkQsYUFBYXFELFlBQVk7NEJBQ3pDLE1BQU1HLGlCQUFpQkQsUUFBUWIsT0FBTyxDQUFDLGNBQWNUOzRCQUNyRC9CLGNBQWNvRCxZQUFZRTt3QkFDNUI7d0JBRUEsNEJBQTRCO3dCQUM1QixNQUFNQyxpQkFBaUJyRCxZQUFZeUIsU0FBU00sY0FBYyxDQUFDLGdCQUFnQixFQUFFRCxZQUFZLElBQUksQ0FBQzt3QkFDOUYsTUFBTXdCLGlCQUFpQixHQUFHVCxjQUFjLENBQUMsRUFBRWhCLFNBQVMsY0FBYyxFQUFFQyxhQUFhO3dCQUVqRixJQUFHbkMsV0FBVzBELGlCQUFpQjs0QkFDN0IsTUFBTUUsY0FBYzNELGFBQWF5RCxnQkFBZ0I7NEJBQ2pELE1BQU1HLHFCQUFxQkQsWUFBWWpCLE9BQU8sQ0FBQyxjQUFjVDs0QkFDN0QvQixjQUFjd0QsZ0JBQWdCRTt3QkFDaEM7d0JBRUFoRCxJQUFJLENBQUMsRUFBRSxFQUFFSyxRQUFRLGtCQUFrQixFQUFFZ0IsU0FBUywwQkFBMEIsQ0FBQyxFQUFFLFFBQVFiO29CQUNyRixPQUFPO3dCQUNMUixJQUFJLENBQUMsRUFBRSxFQUFFSyxRQUFRLDBCQUEwQixFQUFFSCxLQUFLLGFBQWEsRUFBRW1DLGNBQWMsZ0JBQWdCLENBQUMsRUFBRSxTQUFTN0I7d0JBQzNHSixTQUFTO3dCQUNULE9BQU87b0JBQ1Q7Z0JBQ0YsRUFBRSxPQUFNdUIsT0FBTztvQkFDYjNCLElBQUksQ0FBQyxFQUFFLEVBQUVLLFFBQVEsMEJBQTBCLEVBQUVILEtBQUssRUFBRSxFQUFFeUIsTUFBTUMsT0FBTyxFQUFFLEVBQUUsU0FBU3BCO29CQUNoRkosU0FBUztvQkFDVCxPQUFPO2dCQUNUO2dCQUNBO1lBQ0Y7SUFDRjtJQUVBQSxTQUFTO0lBQ1QsT0FBTztBQUNULEVBQUUifQ==