UNPKG

egg-ts-helper

Version:
514 lines 41 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.TS_CONFIG = exports.JS_CONFIG = void 0; exports.getEggInfo = getEggInfo; exports.convertString = convertString; exports.isIdentifierName = isIdentifierName; exports.loadFiles = loadFiles; exports.writeJsConfig = writeJsConfig; exports.writeTsConfig = writeTsConfig; exports.checkMaybeIsTsProj = checkMaybeIsTsProj; exports.checkMaybeIsJsProj = checkMaybeIsJsProj; exports.loadModules = loadModules; exports.strToFn = strToFn; exports.pickFields = pickFields; exports.log = log; exports.getImportStr = getImportStr; exports.writeFileSync = writeFileSync; exports.cleanJs = cleanJs; exports.getModuleObjByPath = getModuleObjByPath; exports.formatPath = formatPath; exports.toArray = toArray; exports.removeSameNameJs = removeSameNameJs; exports.resolveModule = resolveModule; exports.moduleExist = moduleExist; exports.requireFile = requireFile; exports.extend = extend; exports.parseJson = parseJson; exports.getPkgInfo = getPkgInfo; exports.readJson = readJson; exports.readJson5 = readJson5; exports.formatProp = formatProp; exports.camelProp = camelProp; exports.loadTsConfig = loadTsConfig; exports.findExportNode = findExportNode; exports.isClass = isClass; exports.modifierHas = modifierHas; exports.cleanEmpty = cleanEmpty; const node_fs_1 = __importDefault(require("node:fs")); const globby_1 = __importDefault(require("globby")); const node_path_1 = __importDefault(require("node:path")); const typescript_1 = __importDefault(require("typescript")); const yn_1 = __importDefault(require("yn")); const node_child_process_1 = require("node:child_process"); const json5_1 = __importDefault(require("json5")); const config_1 = require("./config"); exports.JS_CONFIG = { include: ['**/*'], }; exports.TS_CONFIG = { compilerOptions: { target: typescript_1.default.ScriptTarget.ES2017, module: typescript_1.default.ModuleKind.CommonJS, strict: true, noImplicitAny: false, experimentalDecorators: true, emitDecoratorMetadata: true, allowSyntheticDefaultImports: true, allowJs: false, pretty: true, lib: ['es6'], noEmitOnError: false, noUnusedLocals: true, noUnusedParameters: true, allowUnreachableCode: false, allowUnusedLabels: false, strictPropertyInitialization: false, noFallthroughCasesInSwitch: true, skipLibCheck: true, skipDefaultLibCheck: true, inlineSourceMap: true, }, }; const cacheEggInfo = {}; function getEggInfo(option) { const { cacheIndex, cwd, customLoader } = option; const cacheKey = cacheIndex ? `${cacheIndex}${cwd}` : undefined; const caches = cacheKey ? (cacheEggInfo[cacheKey] = cacheEggInfo[cacheKey] || {}) : undefined; const end = (json) => { if (caches) { caches.eggInfo = json; caches.cacheTime = Date.now(); } if (option.callback) { return option.callback(json); } return json; }; // check cache if (caches) { if (caches.cacheTime && (Date.now() - caches.cacheTime) < 1000) { return end(caches.eggInfo); } else if (caches.runningPromise) { return caches.runningPromise; } } // get egg info from customLoader if (customLoader) { return end({ config: customLoader.config, plugins: customLoader.plugins, eggPaths: customLoader.eggPaths, }); } // prepare options const cmd = 'node'; const args = [node_path_1.default.resolve(__dirname, './scripts/eggInfo')]; const opt = { cwd, env: { ...process.env, TS_NODE_TYPE_CHECK: 'false', TS_NODE_TRANSPILE_ONLY: 'true', TS_NODE_FILES: 'false', EGG_TYPESCRIPT: 'true', CACHE_REQUIRE_PATHS_FILE: node_path_1.default.resolve(config_1.tmpDir, './requirePaths.json'), ...option.env, }, }; if (option.async) { // cache promise caches.runningPromise = new Promise((resolve, reject) => { (0, node_child_process_1.execFile)(cmd, args, opt, err => { caches.runningPromise = null; if (err) reject(err); resolve(end(parseJson(node_fs_1.default.readFileSync(config_1.eggInfoPath, 'utf-8')))); }); }); return caches.runningPromise; } try { (0, node_child_process_1.execFileSync)(cmd, args, opt); return end(parseJson(node_fs_1.default.readFileSync(config_1.eggInfoPath, 'utf-8'))); } catch (e) { return end({}); } } // convert string to same type with default value function convertString(val, defaultVal) { if (val === undefined) return defaultVal; switch (typeof defaultVal) { case 'boolean': return (0, yn_1.default)(val, { default: defaultVal }); case 'number': const num = +val; return (isNaN(num) ? defaultVal : num); case 'string': return val; default: return defaultVal; } } function isIdentifierName(s) { return /^[$A-Z_][0-9A-Z_$]*$/i.test(s); } // load ts/js files function loadFiles(cwd, pattern) { pattern = pattern || '**/*.(js|ts)'; pattern = Array.isArray(pattern) ? pattern : [pattern]; const fileList = globby_1.default.sync(pattern.concat(['!**/*.d.ts']), { cwd }); return fileList.filter(f => { // filter same name js/ts return !(f.endsWith('.js') && fileList.includes(f.substring(0, f.length - 2) + 'ts')); }); } // write jsconfig.json to cwd function writeJsConfig(cwd) { const jsconfigUrl = node_path_1.default.resolve(cwd, './jsconfig.json'); if (!node_fs_1.default.existsSync(jsconfigUrl)) { node_fs_1.default.writeFileSync(jsconfigUrl, JSON.stringify(exports.JS_CONFIG, null, 2)); return jsconfigUrl; } } // write tsconfig.json to cwd function writeTsConfig(cwd) { const tsconfigUrl = node_path_1.default.resolve(cwd, './tsconfig.json'); if (!node_fs_1.default.existsSync(tsconfigUrl)) { node_fs_1.default.writeFileSync(tsconfigUrl, JSON.stringify(exports.TS_CONFIG, null, 2)); return tsconfigUrl; } } function checkMaybeIsTsProj(cwd, pkgInfo) { pkgInfo = pkgInfo || getPkgInfo(cwd); return (pkgInfo.egg && pkgInfo.egg.typescript) || node_fs_1.default.existsSync(node_path_1.default.resolve(cwd, './tsconfig.json')) || node_fs_1.default.existsSync(node_path_1.default.resolve(cwd, './config/config.default.ts')) || node_fs_1.default.existsSync(node_path_1.default.resolve(cwd, './config/config.ts')); } function checkMaybeIsJsProj(cwd, pkgInfo) { pkgInfo = pkgInfo || getPkgInfo(cwd); const isJs = !checkMaybeIsTsProj(cwd, pkgInfo) && (node_fs_1.default.existsSync(node_path_1.default.resolve(cwd, './config/config.default.js')) || node_fs_1.default.existsSync(node_path_1.default.resolve(cwd, './jsconfig.json'))); return isJs; } // load modules to object function loadModules(cwd, loadDefault, preHandle) { const modules = {}; preHandle = preHandle || (fn => fn); node_fs_1.default .readdirSync(cwd) .filter(f => f.endsWith('.js')) .forEach(f => { const name = f.substring(0, f.lastIndexOf('.')); const obj = require(node_path_1.default.resolve(cwd, name)); if (loadDefault && obj.default) { modules[name] = preHandle(obj.default); } else { modules[name] = preHandle(obj); } }); return modules; } // convert string to function function strToFn(fn) { if (typeof fn === 'string') { return (...args) => fn.replace(/{{\s*(\d+)\s*}}/g, (_, index) => args[index]); } return fn; } // pick fields from object function pickFields(obj, fields) { const newObj = {}; fields.forEach(f => (newObj[f] = obj[f])); return newObj; } // log function log(msg, prefix = true) { console.info(`${prefix ? '[egg-ts-helper] ' : ''}${msg}`); } // get import context function getImportStr(from, to, moduleName, importStar) { const extname = node_path_1.default.extname(to); const toPathWithoutExt = to.substring(0, to.length - extname.length); const importPath = node_path_1.default.relative(from, toPathWithoutExt).replace(/\/|\\/g, '/'); const isTS = extname === '.ts' || node_fs_1.default.existsSync(`${toPathWithoutExt}.d.ts`); const importStartStr = isTS && importStar ? '* as ' : ''; const fromStr = isTS ? `from '${importPath}.js'` : `= require('${importPath}')`; return `import ${importStartStr}${moduleName} ${fromStr};`; } // write file, using fs.writeFileSync to block io that d.ts can create before egg app started. function writeFileSync(fileUrl, content) { node_fs_1.default.mkdirSync(node_path_1.default.dirname(fileUrl), { recursive: true }); node_fs_1.default.writeFileSync(fileUrl, content); } // clean same name js/ts function cleanJs(cwd) { const fileList = []; globby_1.default .sync(['**/*.ts', '**/*.tsx', '!**/*.d.ts', '!**/node_modules', '!**/.sff'], { cwd }) .forEach(f => { const jf = removeSameNameJs(node_path_1.default.resolve(cwd, f)); if (jf) fileList.push(node_path_1.default.relative(cwd, jf)); }); if (fileList.length) { console.info('[egg-ts-helper] These file was deleted because the same name ts file was exist!\n'); console.info(' ' + fileList.join('\n ') + '\n'); } } // get moduleName by file path function getModuleObjByPath(f) { const props = f.substring(0, f.lastIndexOf('.')).split('/'); // composing moduleName const moduleName = props.map(prop => camelProp(prop, 'upper')).join(''); return { props, moduleName, }; } // format path sep to / function formatPath(str) { return str.replace(/\/|\\/g, '/'); } function toArray(pattern) { return pattern ? (Array.isArray(pattern) ? pattern : [pattern]) : []; } // remove same name js function removeSameNameJs(f) { if (!f.match(/\.tsx?$/) || f.endsWith('.d.ts')) { return; } const jf = f.replace(/tsx?$/, 'js'); if (node_fs_1.default.existsSync(jf)) { node_fs_1.default.unlinkSync(jf); return jf; } } // resolve module function resolveModule(url, cwd) { try { return require.resolve(url, cwd ? { paths: [cwd] } : undefined); } catch { return undefined; } } // check whether module is exist function moduleExist(mod, cwd) { const nodeModulePath = node_path_1.default.resolve(cwd || process.cwd(), 'node_modules', mod); return node_fs_1.default.existsSync(nodeModulePath) || resolveModule(mod); } // require modules function requireFile(url) { url = url && resolveModule(url); if (!url) { return undefined; } let exp = require(url); if (exp.__esModule && 'default' in exp) { exp = exp.default; } return exp; } // extend function extend(obj, ...args) { args.forEach(source => { let descriptor, prop; if (source) { for (prop in source) { descriptor = Object.getOwnPropertyDescriptor(source, prop); Object.defineProperty(obj, prop, descriptor); } } }); return obj; } // parse json function parseJson(jsonStr) { if (jsonStr) { try { return JSON.parse(jsonStr); } catch (e) { return {}; } } else { return {}; } } // load package.json function getPkgInfo(cwd) { return readJson(node_path_1.default.resolve(cwd, 'package.json')); } // read json file function readJson(jsonUrl) { if (!node_fs_1.default.existsSync(jsonUrl)) return {}; return parseJson(node_fs_1.default.readFileSync(jsonUrl, 'utf-8')); } function readJson5(jsonUrl) { if (!node_fs_1.default.existsSync(jsonUrl)) return {}; return json5_1.default.parse(node_fs_1.default.readFileSync(jsonUrl, 'utf-8')); } // format property function formatProp(prop) { return prop.replace(/[._-][a-z]/gi, s => s.substring(1).toUpperCase()); } // like egg-core/file-loader function camelProp(property, caseStyle) { if (typeof caseStyle === 'function') { return caseStyle(property); } // camel transfer property = formatProp(property); let first = property[0]; // istanbul ignore next switch (caseStyle) { case 'lower': first = first.toLowerCase(); break; case 'upper': first = first.toUpperCase(); break; case 'camel': break; default: break; } return first + property.substring(1); } // load tsconfig.json function loadTsConfig(tsconfigPath) { tsconfigPath = node_path_1.default.extname(tsconfigPath) === '.json' ? tsconfigPath : `${tsconfigPath}.json`; const tsConfig = readJson5(tsconfigPath); if (tsConfig.extends) { const extendPattern = tsConfig.extends; const tsconfigDirName = node_path_1.default.dirname(tsconfigPath); const maybeRealExtendPath = [ node_path_1.default.resolve(tsconfigDirName, extendPattern), node_path_1.default.resolve(tsconfigDirName, `${extendPattern}.json`), ]; const isExtendFromNodeModules = !extendPattern.startsWith('.') && !extendPattern.startsWith('/'); if (isExtendFromNodeModules) { const DEFAULT_TS_CONFIG_FILE_NAME = 'tsconfig.json'; const extendTsConfigPath = !node_path_1.default.extname(extendPattern) ? DEFAULT_TS_CONFIG_FILE_NAME : ''; maybeRealExtendPath.push(node_path_1.default.resolve(tsconfigDirName, 'node_modules', extendPattern, extendTsConfigPath), node_path_1.default.resolve(process.cwd(), 'node_modules', extendPattern, extendTsConfigPath)); } const extendRealPath = maybeRealExtendPath.find(f => node_fs_1.default.existsSync(f)); if (extendRealPath) { const extendTsConfig = loadTsConfig(extendRealPath); return { ...tsConfig.compilerOptions, ...extendTsConfig, }; } } return tsConfig.compilerOptions || {}; } /** * ts ast utils */ // find export node from sourcefile. function findExportNode(code) { const sourceFile = typescript_1.default.createSourceFile('file.ts', code, typescript_1.default.ScriptTarget.ES2017, true); const cache = new Map(); const exportNodeList = []; let exportDefaultNode; sourceFile.statements.forEach(node => { // each node in root scope if (modifierHas(node, typescript_1.default.SyntaxKind.ExportKeyword)) { if (modifierHas(node, typescript_1.default.SyntaxKind.DefaultKeyword)) { // export default exportDefaultNode = node; } else { // export variable if (typescript_1.default.isVariableStatement(node)) { node.declarationList.declarations.forEach(declare => exportNodeList.push(declare)); } else { exportNodeList.push(node); } } } else if (typescript_1.default.isVariableStatement(node)) { // cache variable statement for (const declaration of node.declarationList.declarations) { if (typescript_1.default.isIdentifier(declaration.name) && declaration.initializer) { cache.set(declaration.name.escapedText, declaration.initializer); } } } else if ((typescript_1.default.isFunctionDeclaration(node) || typescript_1.default.isClassDeclaration(node)) && node.name) { // cache function declaration and class declaration cache.set(node.name.escapedText, node); } else if (typescript_1.default.isExportAssignment(node)) { // export default {} exportDefaultNode = node.expression; } else if (typescript_1.default.isExpressionStatement(node) && typescript_1.default.isBinaryExpression(node.expression)) { if (typescript_1.default.isPropertyAccessExpression(node.expression.left)) { const obj = node.expression.left.expression; const prop = node.expression.left.name; if (typescript_1.default.isIdentifier(obj)) { if (obj.escapedText === 'exports') { // exports.xxx = {} exportNodeList.push(node.expression); } else if (obj.escapedText === 'module' && typescript_1.default.isIdentifier(prop) && prop.escapedText === 'exports') { // module.exports = {} exportDefaultNode = node.expression.right; } } } else if (typescript_1.default.isIdentifier(node.expression.left)) { // let exportData; // exportData = {}; // export exportData cache.set(node.expression.left.escapedText, node.expression.right); } } }); while (exportDefaultNode && typescript_1.default.isIdentifier(exportDefaultNode) && cache.size) { const mid = cache.get(exportDefaultNode.escapedText); cache.delete(exportDefaultNode.escapedText); exportDefaultNode = mid; } return { exportDefaultNode, exportNodeList, }; } function isClass(v) { return typeof v === 'function' && /^\s*class\s+/.test(v.toString()); } // check kind in node.modifiers. function modifierHas(node, kind) { return node.modifiers && node.modifiers.find(mod => kind === mod.kind); } function cleanEmpty(data) { const clearData = {}; Object.keys(data).forEach(k => { const dataValue = data[k]; if (dataValue !== undefined && dataValue !== null) { clearData[k] = data[k]; } }); return clearData; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBb0VBLGdDQXNFQztBQUdELHNDQWFDO0FBRUQsNENBRUM7QUFHRCw4QkFXQztBQUdELHNDQU1DO0FBR0Qsc0NBTUM7QUFFRCxnREFNQztBQUVELGdEQVNDO0FBR0Qsa0NBZ0JDO0FBR0QsMEJBTUM7QUFHRCxnQ0FJQztBQUdELGtCQUVDO0FBR0Qsb0NBYUM7QUFHRCxzQ0FHQztBQUdELDBCQWFDO0FBR0QsZ0RBVUM7QUFHRCxnQ0FFQztBQUVELDBCQUVDO0FBR0QsNENBVUM7QUFHRCxzQ0FNQztBQUdELGtDQUdDO0FBR0Qsa0NBWUM7QUFHRCx3QkFhQztBQUdELDhCQVVDO0FBR0QsZ0NBRUM7QUFHRCw0QkFHQztBQUVELDhCQUdDO0FBR0QsZ0NBRUM7QUFHRCw4QkEwQkM7QUFHRCxvQ0E4QkM7QUFPRCx3Q0F1RUM7QUFFRCwwQkFFQztBQUdELGtDQUVDO0FBRUQsZ0NBU0M7QUFsakJELHNEQUF5QjtBQUN6QixvREFBMEI7QUFDMUIsMERBQTZCO0FBQzdCLDREQUE0QjtBQUM1Qiw0Q0FBb0I7QUFDcEIsMkRBQTZFO0FBQzdFLGtEQUEwQjtBQUMxQixxQ0FBK0M7QUFFbEMsUUFBQSxTQUFTLEdBQUc7SUFDdkIsT0FBTyxFQUFFLENBQUUsTUFBTSxDQUFFO0NBQ3BCLENBQUM7QUFFVyxRQUFBLFNBQVMsR0FBMEI7SUFDOUMsZUFBZSxFQUFFO1FBQ2YsTUFBTSxFQUFFLG9CQUFFLENBQUMsWUFBWSxDQUFDLE1BQU07UUFDOUIsTUFBTSxFQUFFLG9CQUFFLENBQUMsVUFBVSxDQUFDLFFBQVE7UUFDOUIsTUFBTSxFQUFFLElBQUk7UUFDWixhQUFhLEVBQUUsS0FBSztRQUNwQixzQkFBc0IsRUFBRSxJQUFJO1FBQzVCLHFCQUFxQixFQUFFLElBQUk7UUFDM0IsNEJBQTRCLEVBQUUsSUFBSTtRQUNsQyxPQUFPLEVBQUUsS0FBSztRQUNkLE1BQU0sRUFBRSxJQUFJO1FBQ1osR0FBRyxFQUFFLENBQUUsS0FBSyxDQUFFO1FBQ2QsYUFBYSxFQUFFLEtBQUs7UUFDcEIsY0FBYyxFQUFFLElBQUk7UUFDcEIsa0JBQWtCLEVBQUUsSUFBSTtRQUN4QixvQkFBb0IsRUFBRSxLQUFLO1FBQzNCLGlCQUFpQixFQUFFLEtBQUs7UUFDeEIsNEJBQTRCLEVBQUUsS0FBSztRQUNuQywwQkFBMEIsRUFBRSxJQUFJO1FBQ2hDLFlBQVksRUFBRSxJQUFJO1FBQ2xCLG1CQUFtQixFQUFFLElBQUk7UUFDekIsZUFBZSxFQUFFLElBQUk7S0FDdEI7Q0FDRixDQUFDO0FBK0JGLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUN4QixTQUFnQixVQUFVLENBQXNDLE1BQXFCO0lBQ25GLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUNqRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM5RixNQUFNLEdBQUcsR0FBRyxDQUFDLElBQW1CLEVBQUUsRUFBRTtRQUNsQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDdEIsTUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDaEMsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUM7SUFFRixjQUFjO0lBQ2QsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLElBQUksTUFBTSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDL0QsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLENBQUM7YUFBTSxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNqQyxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7SUFFRCxpQ0FBaUM7SUFDakMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQixPQUFPLEdBQUcsQ0FBQztZQUNULE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTTtZQUMzQixPQUFPLEVBQUUsWUFBWSxDQUFDLE9BQU87WUFDN0IsUUFBUSxFQUFFLFlBQVksQ0FBQyxRQUFRO1NBQ2hDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sSUFBSSxHQUFHLENBQUUsbUJBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLG1CQUFtQixDQUFDLENBQUUsQ0FBQztJQUM5RCxNQUFNLEdBQUcsR0FBb0I7UUFDM0IsR0FBRztRQUNILEdBQUcsRUFBRTtZQUNILEdBQUcsT0FBTyxDQUFDLEdBQUc7WUFDZCxrQkFBa0IsRUFBRSxPQUFPO1lBQzNCLHNCQUFzQixFQUFFLE1BQU07WUFDOUIsYUFBYSxFQUFFLE9BQU87WUFDdEIsY0FBYyxFQUFFLE1BQU07WUFDdEIsd0JBQXdCLEVBQUUsbUJBQUksQ0FBQyxPQUFPLENBQUMsZUFBTSxFQUFFLHFCQUFxQixDQUFDO1lBQ3JFLEdBQUcsTUFBTSxDQUFDLEdBQUc7U0FDZDtLQUNGLENBQUM7SUFFRixJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQixnQkFBZ0I7UUFDaEIsTUFBTSxDQUFDLGNBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN0RCxJQUFBLDZCQUFRLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQzdCLE1BQU0sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUM3QixJQUFJLEdBQUc7b0JBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQixPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxpQkFBRSxDQUFDLFlBQVksQ0FBQyxvQkFBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILElBQUEsaUNBQVksRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQVUsQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxpQkFBRSxDQUFDLFlBQVksQ0FBQyxvQkFBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pCLENBQUM7QUFDSCxDQUFDO0FBRUQsaURBQWlEO0FBQ2pELFNBQWdCLGFBQWEsQ0FBSSxHQUF1QixFQUFFLFVBQWE7SUFDckUsSUFBSSxHQUFHLEtBQUssU0FBUztRQUFFLE9BQU8sVUFBVSxDQUFDO0lBQ3pDLFFBQVEsT0FBTyxVQUFVLEVBQUUsQ0FBQztRQUMxQixLQUFLLFNBQVM7WUFDWixPQUFPLElBQUEsWUFBRSxFQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBUSxDQUFDO1FBQ2pELEtBQUssUUFBUTtZQUNYLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ2pCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFRLENBQUM7UUFDaEQsS0FBSyxRQUFRO1lBQ1gsT0FBTyxHQUFVLENBQUM7UUFDcEI7WUFDRSxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQWdCLGdCQUFnQixDQUFDLENBQVM7SUFDeEMsT0FBTyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVELG1CQUFtQjtBQUNuQixTQUFnQixTQUFTLENBQUMsR0FBVyxFQUFFLE9BQTJCO0lBQ2hFLE9BQU8sR0FBRyxPQUFPLElBQUksY0FBYyxDQUFDO0lBQ3BDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUUsT0FBTyxDQUFFLENBQUM7SUFDekQsTUFBTSxRQUFRLEdBQUcsZ0JBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFFLFlBQVksQ0FBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN6Qix5QkFBeUI7UUFDekIsT0FBTyxDQUFDLENBQ04sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDakIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUN2RCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsNkJBQTZCO0FBQzdCLFNBQWdCLGFBQWEsQ0FBQyxHQUFXO0lBQ3ZDLE1BQU0sV0FBVyxHQUFHLG1CQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3pELElBQUksQ0FBQyxpQkFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQ2hDLGlCQUFFLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztBQUNILENBQUM7QUFFRCw2QkFBNkI7QUFDN0IsU0FBZ0IsYUFBYSxDQUFDLEdBQVc7SUFDdkMsTUFBTSxXQUFXLEdBQUcsbUJBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDekQsSUFBSSxDQUFDLGlCQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDaEMsaUJBQUUsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRSxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQWdCLGtCQUFrQixDQUFDLEdBQVcsRUFBRSxPQUFhO0lBQzNELE9BQU8sR0FBRyxPQUFPLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQzVDLGlCQUFFLENBQUMsVUFBVSxDQUFDLG1CQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ25ELGlCQUFFLENBQUMsVUFBVSxDQUFDLG1CQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO1FBQzlELGlCQUFFLENBQUMsVUFBVSxDQUFDLG1CQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVELFNBQWdCLGtCQUFrQixDQUFDLEdBQVcsRUFBRSxPQUFhO0lBQzNELE9BQU8sR0FBRyxPQUFPLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sSUFBSSxHQUFHLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztRQUM1QyxDQUNFLGlCQUFFLENBQUMsVUFBVSxDQUFDLG1CQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO1lBQzlELGlCQUFFLENBQUMsVUFBVSxDQUFDLG1CQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQ3BELENBQUM7SUFFSixPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCx5QkFBeUI7QUFDekIsU0FBZ0IsV0FBVyxDQUFVLEdBQVcsRUFBRSxXQUFxQixFQUFFLFNBQTRCO0lBQ25HLE1BQU0sT0FBTyxHQUF5QixFQUFFLENBQUM7SUFDekMsU0FBUyxHQUFHLFNBQVMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEMsaUJBQUU7U0FDQyxXQUFXLENBQUMsR0FBRyxDQUFDO1NBQ2hCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDOUIsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ1gsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxtQkFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM3QyxJQUFJLFdBQVcsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCw2QkFBNkI7QUFDN0IsU0FBZ0IsT0FBTyxDQUFDLEVBQUU7SUFDeEIsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMzQixPQUFPLENBQUMsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUM7QUFFWixDQUFDO0FBRUQsMEJBQTBCO0FBQzFCLFNBQWdCLFVBQVUsQ0FBNEIsR0FBZ0IsRUFBRSxNQUFXO0lBQ2pGLE1BQU0sTUFBTSxHQUFnQixFQUFFLENBQUM7SUFDL0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU07QUFDTixTQUFnQixHQUFHLENBQUMsR0FBVyxFQUFFLE1BQU0sR0FBRyxJQUFJO0lBQzVDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBRUQscUJBQXFCO0FBQ3JCLFNBQWdCLFlBQVksQ0FDMUIsSUFBWSxFQUNaLEVBQVUsRUFDVixVQUFtQixFQUNuQixVQUFvQjtJQUVwQixNQUFNLE9BQU8sR0FBRyxtQkFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sVUFBVSxHQUFHLG1CQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEYsTUFBTSxJQUFJLEdBQUcsT0FBTyxLQUFLLEtBQUssSUFBSSxpQkFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLGdCQUFnQixPQUFPLENBQUMsQ0FBQztJQUM1RSxNQUFNLGNBQWMsR0FBRyxJQUFJLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN6RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsVUFBVSxNQUFNLENBQUMsQ0FBQyxDQUFDLGNBQWMsVUFBVSxJQUFJLENBQUM7SUFDaEYsT0FBTyxVQUFVLGNBQWMsR0FBRyxVQUFVLElBQUksT0FBTyxHQUFHLENBQUM7QUFDN0QsQ0FBQztBQUVELDhGQUE4RjtBQUM5RixTQUFnQixhQUFhLENBQUMsT0FBTyxFQUFFLE9BQU87SUFDNUMsaUJBQUUsQ0FBQyxTQUFTLENBQUMsbUJBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6RCxpQkFBRSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELHdCQUF3QjtBQUN4QixTQUFnQixPQUFPLENBQUMsR0FBVztJQUNqQyxNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7SUFDOUIsZ0JBQUk7U0FDRCxJQUFJLENBQUMsQ0FBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxVQUFVLENBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDO1NBQ3RGLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNYLE1BQU0sRUFBRSxHQUFHLGdCQUFnQixDQUFDLG1CQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELElBQUksRUFBRTtZQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQyxDQUFDLENBQUM7SUFFTCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNwQixPQUFPLENBQUMsSUFBSSxDQUFDLG1GQUFtRixDQUFDLENBQUM7UUFDbEcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDO0FBQ0gsQ0FBQztBQUVELDhCQUE4QjtBQUM5QixTQUFnQixrQkFBa0IsQ0FBQyxDQUFTO0lBQzFDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFNUQsdUJBQXVCO0lBQ3ZCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXhFLE9BQU87UUFDTCxLQUFLO1FBQ0wsVUFBVTtLQUNYLENBQUM7QUFDSixDQUFDO0FBRUQsdUJBQXVCO0FBQ3ZCLFNBQWdCLFVBQVUsQ0FBQyxHQUFXO0lBQ3BDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELFNBQWdCLE9BQU8sQ0FBQyxPQUEyQjtJQUNqRCxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUUsT0FBTyxDQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3pFLENBQUM7QUFFRCxzQkFBc0I7QUFDdEIsU0FBZ0IsZ0JBQWdCLENBQUMsQ0FBUztJQUN4QyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDL0MsT0FBTztJQUNULENBQUM7SUFFRCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwQyxJQUFJLGlCQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDdEIsaUJBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0FBQ0gsQ0FBQztBQUVELGlCQUFpQjtBQUNqQixTQUFnQixhQUFhLENBQUMsR0FBRyxFQUFFLEdBQVk7SUFDN0MsSUFBSSxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUUsR0FBRyxDQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDO0FBRUQsZ0NBQWdDO0FBQ2hDLFNBQWdCLFdBQVcsQ0FBQyxHQUFXLEVBQUUsR0FBWTtJQUNuRCxNQUFNLGNBQWMsR0FBRyxtQkFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMvRSxPQUFPLGlCQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQsa0JBQWtCO0FBQ2xCLFNBQWdCLFdBQVcsQ0FBQyxHQUFHO0lBQzdCLEdBQUcsR0FBRyxHQUFHLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNULE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkIsSUFBSSxHQUFHLENBQUMsVUFBVSxJQUFJLFNBQVMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN2QyxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQztJQUNwQixDQUFDO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBUztBQUNULFNBQWdCLE1BQU0sQ0FBVSxHQUFHLEVBQUUsR0FBRyxJQUF1QjtJQUM3RCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3BCLElBQUksVUFBVSxFQUNaLElBQUksQ0FBQztRQUNQLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxLQUFLLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDcEIsVUFBVSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzNELE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMvQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsYUFBYTtBQUNiLFNBQWdCLFNBQVMsQ0FBQyxPQUFlO0lBQ3ZDLElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixJQUFJLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztBQUNILENBQUM7QUFFRCxvQkFBb0I7QUFDcEIsU0FBZ0IsVUFBVSxDQUFDLEdBQVc7SUFDcEMsT0FBTyxRQUFRLENBQUMsbUJBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVELGlCQUFpQjtBQUNqQixTQUFnQixRQUFRLENBQUMsT0FBZTtJQUN0QyxJQUFJLENBQUMsaUJBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDdkMsT0FBTyxTQUFTLENBQUMsaUJBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVELFNBQWdCLFNBQVMsQ0FBQyxPQUFlO0lBQ3ZDLElBQUksQ0FBQyxpQkFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN2QyxPQUFPLGVBQUssQ0FBQyxLQUFLLENBQUMsaUJBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVELGtCQUFrQjtBQUNsQixTQUFnQixVQUFVLENBQUMsSUFBWTtJQUNyQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRCw0QkFBNEI7QUFDNUIsU0FBZ0IsU0FBUyxDQUN2QixRQUFnQixFQUNoQixTQUFnRDtJQUVoRCxJQUFJLE9BQU8sU0FBUyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3BDLE9BQU8sU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxpQkFBaUI7SUFDakIsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoQyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUUsQ0FBQyxDQUFFLENBQUM7SUFDMUIsdUJBQXVCO0lBQ3ZCLFFBQVEsU0FBUyxFQUFFLENBQUM7UUFDbEIsS0FBSyxPQUFPO1lBQ1YsS0FBSyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QixNQUFNO1FBQ1IsS0FBSyxPQUFPO1lBQ1YsS0FBSyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QixNQUFNO1FBQ1IsS0FBSyxPQUFPO1lBQ1YsTUFBTTtRQUNSO1lBQ0UsTUFBTTtJQUNWLENBQUM7SUFFRCxPQUFPLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFFRCxxQkFBcUI7QUFDckIsU0FBZ0IsWUFBWSxDQUFDLFlBQW9CO0lBQy9DLFlBQVksR0FBRyxtQkFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLE9BQU8sQ0FBQztJQUM5RixNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFpQixDQUFDO0lBQ3pELElBQUksUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFDdkMsTUFBTSxlQUFlLEdBQUcsbUJBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkQsTUFBTSxtQkFBbUIsR0FBYTtZQUNwQyxtQkFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDO1lBQzVDLG1CQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxHQUFHLGFBQWEsT0FBTyxDQUFDO1NBQ3ZELENBQUM7UUFDRixNQUFNLHVCQUF1QixHQUFHLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1lBQzVCLE1BQU0sMkJBQTJCLEdBQUcsZUFBZSxDQUFDO1lBQ3BELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxtQkFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzRixtQkFBbUIsQ0FBQyxJQUFJLENBQ3RCLG1CQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixDQUFDLEVBQ2hGLG1CQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixDQUFDLENBQy9FLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsaUJBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNwRCxPQUFPO2dCQUNMLEdBQUcsUUFBUSxDQUFDLGVBQWU7Z0JBQzNCLEdBQUcsY0FBYzthQUNsQixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDO0FBQ3hDLENBQUM7QUFFRDs7R0FFRztBQUVILG9DQUFvQztBQUNwQyxTQUFnQixjQUFjLENBQUMsSUFBWTtJQUN6QyxNQUFNLFVBQVUsR0FBRyxvQkFBRSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsb0JBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RGLE1BQU0sS0FBSyxHQUE4QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ25ELE1BQU0sY0FBYyxHQUFjLEVBQUUsQ0FBQztJQUNyQyxJQUFJLGlCQUFzQyxDQUFDO0lBRTNDLFVBQVUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ25DLDBCQUEwQjtRQUMxQixJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsb0JBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNuRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsb0JBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDcEQsaUJBQWlCO2dCQUNqQixpQkFBaUIsR0FBRyxJQUFJLENBQUM7WUFDM0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGtCQUFrQjtnQkFDbEIsSUFBSSxvQkFBRSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUNsRCxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUM3QixDQUFDO2dCQUNKLENBQUM7cUJBQU0sQ0FBQztvQkFDTixjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM1QixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLG9CQUFFLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN4QywyQkFBMkI7WUFDM0IsS0FBSyxNQUFNLFdBQVcsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUM1RCxJQUFJLG9CQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ2pFLEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNuRSxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLENBQUMsb0JBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxvQkFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hGLG1EQUFtRDtZQUNuRCxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pDLENBQUM7YUFBTSxJQUFJLG9CQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxvQkFBb0I7WUFDcEIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN0QyxDQUFDO2FBQU0sSUFBSSxvQkFBRSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLG9CQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDcEYsSUFBSSxvQkFBRSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDeEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUM1QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZDLElBQUksb0JBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxHQUFHLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUNsQyxtQkFBbUI7d0JBQ25CLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO29CQUN2QyxDQUFDO3lCQUFNLElBQ0wsR0FBRyxDQUFDLFdBQVcsS0FBSyxRQUFRO3dCQUM1QixvQkFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7d0JBQ3JCLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUM5QixDQUFDO3dCQUNELHNCQUFzQjt3QkFDdEIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7b0JBQzVDLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFBSSxvQkFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2pELGtCQUFrQjtnQkFDbEIsbUJBQW1CO2dCQUNuQixvQkFBb0I7Z0JBQ3BCLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckUsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8saUJBQWlCLElBQUksb0JBQUUsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0UsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRCxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztJQUMxQixDQUFDO0lBRUQsT0FBTztRQUNMLGlCQUFpQjtRQUNqQixjQUFjO0tBQ2YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQixPQUFPLENBQUMsQ0FBQztJQUN2QixPQUFPLE9BQU8sQ0FBQyxLQUFLLFVBQVUsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRCxnQ0FBZ0M7QUFDaEMsU0FBZ0IsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJO0lBQ3BDLE9BQU8sSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELFNBQWdCLFVBQVUsQ0FBQyxJQUFJO0lBQzdCLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUM1QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxTQUFTLEtBQUssU0FBUyxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNsRCxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMifQ==