UNPKG

idioma-cli

Version:

CLI for Idioma - Internationalization engine with smart defaults

115 lines (112 loc) 13.6 kB
#!/usr/bin/env node import { updateStatus } from "../shared/chunk-3acbb6gb.js"; // src/cli/worker.ts import { glob } from "glob"; import { loadConfig, loadLock, saveLock, translateFile } from "idioma-sdk"; async function runTranslation() { try { await updateStatus({ status: "running", startTime: new Date().toISOString() }); const args = process.argv.slice(2); const showCosts = args.includes("--costs"); const providerIndex = args.indexOf("--provider"); const modelIndex = args.indexOf("--model"); const providerOverride = providerIndex !== -1 ? args[providerIndex + 1] : undefined; const modelOverride = modelIndex !== -1 ? args[modelIndex + 1] : undefined; const config = await loadConfig(); if (providerOverride || modelOverride) { config.translation = { ...config.translation || {}, ...providerOverride ? { provider: providerOverride } : {}, ...modelOverride ? { model: modelOverride } : {} }; if (providerOverride) { config.provider = providerOverride; } if (modelOverride) { config.model = modelOverride; } } const lock = await loadLock(); const sourceLocale = config.locale.source; const targetLocales = config.locale.targets; const includePatterns = Array.isArray(config.files) ? config.files : config.files?.include || []; let allSourceFiles = []; for (const pattern of includePatterns) { const sourcePattern = pattern.replace(/\[locale\]/g, sourceLocale); const files = await glob(sourcePattern); allSourceFiles = [...allSourceFiles, ...files]; } const totalFiles = allSourceFiles.length * targetLocales.length; let processedFiles = 0; await updateStatus({ totalFiles, processedFiles: 0 }); for (const sourceFile of allSourceFiles) { for (const targetLocale of targetLocales) { try { const fileName = sourceFile.replace(/.*\//, ""); await updateStatus({ currentFile: `${fileName} -> ${targetLocale}`, processedFiles }); if (processedFiles > 0) { await new Promise((resolve) => setTimeout(resolve, 250)); } const _result = await translateFile(sourceFile, sourceLocale, targetLocale, lock, config, { showCosts }); processedFiles++; await updateStatus({ processedFiles }); if (processedFiles % 1 === 0) { await saveLock(lock); } } catch (error) { console.error(`Error translating ${sourceFile} to ${targetLocale}:`, error); processedFiles++; await updateStatus({ processedFiles, errors: [`${sourceFile} -> ${targetLocale}: ${error}`] }); } } } await saveLock(lock); await updateStatus({ status: "completed", endTime: new Date().toISOString(), currentFile: undefined, processedFiles: totalFiles }); console.log("✅ Translation completed successfully!"); process.exit(0); } catch (error) { console.error("Translation failed:", error); await updateStatus({ status: "failed", endTime: new Date().toISOString(), currentFile: undefined, errors: [`Fatal error: ${error}`] }); process.exit(1); } } process.on("SIGTERM", async () => { console.log("Received SIGTERM, shutting down gracefully..."); await updateStatus({ status: "failed", endTime: new Date().toISOString(), errors: ["Process terminated by user"] }); process.exit(0); }); runTranslation(); //# debugId=1D309EA2A857961564756E2164756E21 //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaS93b3JrZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuaW1wb3J0IHsgZ2xvYiB9IGZyb20gJ2dsb2InO1xuaW1wb3J0IHsgbG9hZENvbmZpZywgbG9hZExvY2ssIHNhdmVMb2NrLCB0cmFuc2xhdGVGaWxlIH0gZnJvbSAnaWRpb21hLXNkayc7XG5pbXBvcnQgeyB1cGRhdGVTdGF0dXMgfSBmcm9tICcuL2JhY2tncm91bmQnO1xuXG4vLyBXb3JrZXIgcHJvY2VzcyB0aGF0IHJ1bnMgdGhlIGFjdHVhbCB0cmFuc2xhdGlvblxuYXN5bmMgZnVuY3Rpb24gcnVuVHJhbnNsYXRpb24oKSB7XG4gIHRyeSB7XG4gICAgLy8gVXBkYXRlIHN0YXR1cyB0byBydW5uaW5nXG4gICAgYXdhaXQgdXBkYXRlU3RhdHVzKHtcbiAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgc3RhcnRUaW1lOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfSk7XG5cbiAgICAvLyBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzXG4gICAgY29uc3QgYXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcbiAgICBjb25zdCBzaG93Q29zdHMgPSBhcmdzLmluY2x1ZGVzKCctLWNvc3RzJyk7XG4gICAgY29uc3QgcHJvdmlkZXJJbmRleCA9IGFyZ3MuaW5kZXhPZignLS1wcm92aWRlcicpO1xuICAgIGNvbnN0IG1vZGVsSW5kZXggPSBhcmdzLmluZGV4T2YoJy0tbW9kZWwnKTtcbiAgICBjb25zdCBwcm92aWRlck92ZXJyaWRlID0gcHJvdmlkZXJJbmRleCAhPT0gLTEgPyBhcmdzW3Byb3ZpZGVySW5kZXggKyAxXSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtb2RlbE92ZXJyaWRlID0gbW9kZWxJbmRleCAhPT0gLTEgPyBhcmdzW21vZGVsSW5kZXggKyAxXSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIExvYWQgY29uZmlnIGFuZCBsb2NrXG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZygpO1xuICAgIGlmIChwcm92aWRlck92ZXJyaWRlIHx8IG1vZGVsT3ZlcnJpZGUpIHtcbiAgICAgIGNvbmZpZy50cmFuc2xhdGlvbiA9IHtcbiAgICAgICAgLi4uKGNvbmZpZy50cmFuc2xhdGlvbiB8fCB7fSksXG4gICAgICAgIC4uLihwcm92aWRlck92ZXJyaWRlID8geyBwcm92aWRlcjogcHJvdmlkZXJPdmVycmlkZSB9IDoge30pLFxuICAgICAgICAuLi4obW9kZWxPdmVycmlkZSA/IHsgbW9kZWw6IG1vZGVsT3ZlcnJpZGUgfSA6IHt9KSxcbiAgICAgIH07XG4gICAgICBpZiAocHJvdmlkZXJPdmVycmlkZSkge1xuICAgICAgICBjb25maWcucHJvdmlkZXIgPSBwcm92aWRlck92ZXJyaWRlO1xuICAgICAgfVxuICAgICAgaWYgKG1vZGVsT3ZlcnJpZGUpIHtcbiAgICAgICAgY29uZmlnLm1vZGVsID0gbW9kZWxPdmVycmlkZTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbG9jayA9IGF3YWl0IGxvYWRMb2NrKCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgYWN0dWFsIGZpbGVzIHRvIGJlIHByb2Nlc3NlZFxuICAgIGNvbnN0IHNvdXJjZUxvY2FsZSA9IGNvbmZpZy5sb2NhbGUuc291cmNlO1xuICAgIGNvbnN0IHRhcmdldExvY2FsZXMgPSBjb25maWcubG9jYWxlLnRhcmdldHM7XG4gICAgY29uc3QgaW5jbHVkZVBhdHRlcm5zID0gQXJyYXkuaXNBcnJheShjb25maWcuZmlsZXMpXG4gICAgICA/IGNvbmZpZy5maWxlc1xuICAgICAgOiBjb25maWcuZmlsZXM/LmluY2x1ZGUgfHwgW107XG5cbiAgICAvLyBHZXQgYWxsIHNvdXJjZSBmaWxlc1xuICAgIGxldCBhbGxTb3VyY2VGaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgaW5jbHVkZVBhdHRlcm5zKSB7XG4gICAgICBjb25zdCBzb3VyY2VQYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKC9cXFtsb2NhbGVcXF0vZywgc291cmNlTG9jYWxlKTtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZ2xvYihzb3VyY2VQYXR0ZXJuKTtcbiAgICAgIGFsbFNvdXJjZUZpbGVzID0gWy4uLmFsbFNvdXJjZUZpbGVzLCAuLi5maWxlc107XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIHRvdGFsIHRyYW5zbGF0aW9uIHRhc2tzIChmaWxlcyDDlyB0YXJnZXQgbG9jYWxlcylcbiAgICBjb25zdCB0b3RhbEZpbGVzID0gYWxsU291cmNlRmlsZXMubGVuZ3RoICogdGFyZ2V0TG9jYWxlcy5sZW5ndGg7XG4gICAgbGV0IHByb2Nlc3NlZEZpbGVzID0gMDtcblxuICAgIGF3YWl0IHVwZGF0ZVN0YXR1cyh7XG4gICAgICB0b3RhbEZpbGVzLFxuICAgICAgcHJvY2Vzc2VkRmlsZXM6IDAsXG4gICAgfSk7XG5cbiAgICAvLyBQcm9jZXNzIGZpbGVzIHdpdGggcHJvZ3Jlc3MgdHJhY2tpbmdcbiAgICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgYWxsU291cmNlRmlsZXMpIHtcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0TG9jYWxlIG9mIHRhcmdldExvY2FsZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBVcGRhdGUgY3VycmVudCBmaWxlIGJlaW5nIHByb2Nlc3NlZFxuICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gc291cmNlRmlsZS5yZXBsYWNlKC8uKlxcLy8sICcnKTsgLy8gR2V0IGp1c3QgZmlsZW5hbWVcbiAgICAgICAgICBhd2FpdCB1cGRhdGVTdGF0dXMoe1xuICAgICAgICAgICAgY3VycmVudEZpbGU6IGAke2ZpbGVOYW1lfSAtPiAke3RhcmdldExvY2FsZX1gLFxuICAgICAgICAgICAgcHJvY2Vzc2VkRmlsZXMsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBBZGQgZGVsYXkgdG8gYXZvaWQgcmF0ZSBsaW1pdHNcbiAgICAgICAgICBpZiAocHJvY2Vzc2VkRmlsZXMgPiAwKSB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyNTApKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUcmFuc2xhdGUgdGhlIGZpbGVcbiAgICAgICAgICBjb25zdCBfcmVzdWx0ID0gYXdhaXQgdHJhbnNsYXRlRmlsZShcbiAgICAgICAgICAgIHNvdXJjZUZpbGUsXG4gICAgICAgICAgICBzb3VyY2VMb2NhbGUsXG4gICAgICAgICAgICB0YXJnZXRMb2NhbGUsXG4gICAgICAgICAgICBsb2NrLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBzaG93Q29zdHMsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHByb2Nlc3NlZEZpbGVzKys7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgcHJvZ3Jlc3NcbiAgICAgICAgICBhd2FpdCB1cGRhdGVTdGF0dXMoe1xuICAgICAgICAgICAgcHJvY2Vzc2VkRmlsZXMsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBTYXZlIGxvY2sgZmlsZSBwZXJpb2RpY2FsbHlcbiAgICAgICAgICBpZiAocHJvY2Vzc2VkRmlsZXMgJSAxID09PSAwKSB7XG4gICAgICAgICAgICAvLyBTYXZlIGFmdGVyIGVhY2ggZmlsZSBmb3Igc2FmZXR5XG4gICAgICAgICAgICBhd2FpdCBzYXZlTG9jayhsb2NrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgdHJhbnNsYXRpbmcgJHtzb3VyY2VGaWxlfSB0byAke3RhcmdldExvY2FsZX06YCwgZXJyb3IpO1xuICAgICAgICAgIHByb2Nlc3NlZEZpbGVzKys7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgcHJvZ3Jlc3MgZXZlbiBvbiBlcnJvclxuICAgICAgICAgIGF3YWl0IHVwZGF0ZVN0YXR1cyh7XG4gICAgICAgICAgICBwcm9jZXNzZWRGaWxlcyxcbiAgICAgICAgICAgIGVycm9yczogW2Ake3NvdXJjZUZpbGV9IC0+ICR7dGFyZ2V0TG9jYWxlfTogJHtlcnJvcn1gXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNhdmUgZmluYWwgbG9jayBmaWxlXG4gICAgYXdhaXQgc2F2ZUxvY2sobG9jayk7XG5cbiAgICAvLyBVcGRhdGUgc3RhdHVzIHRvIGNvbXBsZXRlZFxuICAgIGF3YWl0IHVwZGF0ZVN0YXR1cyh7XG4gICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgZW5kVGltZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgY3VycmVudEZpbGU6IHVuZGVmaW5lZCxcbiAgICAgIHByb2Nlc3NlZEZpbGVzOiB0b3RhbEZpbGVzLFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coJ+KchSBUcmFuc2xhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IScpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdUcmFuc2xhdGlvbiBmYWlsZWQ6JywgZXJyb3IpO1xuXG4gICAgYXdhaXQgdXBkYXRlU3RhdHVzKHtcbiAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICBlbmRUaW1lOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBjdXJyZW50RmlsZTogdW5kZWZpbmVkLFxuICAgICAgZXJyb3JzOiBbYEZhdGFsIGVycm9yOiAke2Vycm9yfWBdLFxuICAgIH0pO1xuXG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8vIEhhbmRsZSBncmFjZWZ1bCBzaHV0ZG93blxucHJvY2Vzcy5vbignU0lHVEVSTScsIGFzeW5jICgpID0+IHtcbiAgY29uc29sZS5sb2coJ1JlY2VpdmVkIFNJR1RFUk0sIHNodXR0aW5nIGRvd24gZ3JhY2VmdWxseS4uLicpO1xuXG4gIGF3YWl0IHVwZGF0ZVN0YXR1cyh7XG4gICAgc3RhdHVzOiAnZmFpbGVkJyxcbiAgICBlbmRUaW1lOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgZXJyb3JzOiBbJ1Byb2Nlc3MgdGVybWluYXRlZCBieSB1c2VyJ10sXG4gIH0pO1xuXG4gIHByb2Nlc3MuZXhpdCgwKTtcbn0pO1xuXG4vLyBSdW4gdGhlIHRyYW5zbGF0aW9uXG5ydW5UcmFuc2xhdGlvbigpO1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7O0FBQ0E7QUFDQTtBQUlBLGVBQWUsY0FBYyxHQUFHO0FBQUEsRUFDOUIsSUFBSTtBQUFBLElBRUYsTUFBTSxhQUFhO0FBQUEsTUFDakIsUUFBUTtBQUFBLE1BQ1IsV0FBVyxJQUFJLEtBQUssRUFBRSxZQUFZO0FBQUEsSUFDcEMsQ0FBQztBQUFBLElBR0QsTUFBTSxPQUFPLFFBQVEsS0FBSyxNQUFNLENBQUM7QUFBQSxJQUNqQyxNQUFNLFlBQVksS0FBSyxTQUFTLFNBQVM7QUFBQSxJQUN6QyxNQUFNLGdCQUFnQixLQUFLLFFBQVEsWUFBWTtBQUFBLElBQy9DLE1BQU0sYUFBYSxLQUFLLFFBQVEsU0FBUztBQUFBLElBQ3pDLE1BQU0sbUJBQW1CLGtCQUFrQixLQUFLLEtBQUssZ0JBQWdCLEtBQUs7QUFBQSxJQUMxRSxNQUFNLGdCQUFnQixlQUFlLEtBQUssS0FBSyxhQUFhLEtBQUs7QUFBQSxJQUdqRSxNQUFNLFNBQVMsTUFBTSxXQUFXO0FBQUEsSUFDaEMsSUFBSSxvQkFBb0IsZUFBZTtBQUFBLE1BQ3JDLE9BQU8sY0FBYztBQUFBLFdBQ2YsT0FBTyxlQUFlLENBQUM7QUFBQSxXQUN2QixtQkFBbUIsRUFBRSxVQUFVLGlCQUFpQixJQUFJLENBQUM7QUFBQSxXQUNyRCxnQkFBZ0IsRUFBRSxPQUFPLGNBQWMsSUFBSSxDQUFDO0FBQUEsTUFDbEQ7QUFBQSxNQUNBLElBQUksa0JBQWtCO0FBQUEsUUFDcEIsT0FBTyxXQUFXO0FBQUEsTUFDcEI7QUFBQSxNQUNBLElBQUksZUFBZTtBQUFBLFFBQ2pCLE9BQU8sUUFBUTtBQUFBLE1BQ2pCO0FBQUEsSUFDRjtBQUFBLElBQ0EsTUFBTSxPQUFPLE1BQU0sU0FBUztBQUFBLElBRzVCLE1BQU0sZUFBZSxPQUFPLE9BQU87QUFBQSxJQUNuQyxNQUFNLGdCQUFnQixPQUFPLE9BQU87QUFBQSxJQUNwQyxNQUFNLGtCQUFrQixNQUFNLFFBQVEsT0FBTyxLQUFLLElBQzlDLE9BQU8sUUFDUCxPQUFPLE9BQU8sV0FBVyxDQUFDO0FBQUEsSUFHOUIsSUFBSSxpQkFBMkIsQ0FBQztBQUFBLElBQ2hDLFdBQVcsV0FBVyxpQkFBaUI7QUFBQSxNQUNyQyxNQUFNLGdCQUFnQixRQUFRLFFBQVEsZUFBZSxZQUFZO0FBQUEsTUFDakUsTUFBTSxRQUFRLE1BQU0sS0FBSyxhQUFhO0FBQUEsTUFDdEMsaUJBQWlCLENBQUMsR0FBRyxnQkFBZ0IsR0FBRyxLQUFLO0FBQUEsSUFDL0M7QUFBQSxJQUdBLE1BQU0sYUFBYSxlQUFlLFNBQVMsY0FBYztBQUFBLElBQ3pELElBQUksaUJBQWlCO0FBQUEsSUFFckIsTUFBTSxhQUFhO0FBQUEsTUFDakI7QUFBQSxNQUNBLGdCQUFnQjtBQUFBLElBQ2xCLENBQUM7QUFBQSxJQUdELFdBQVcsY0FBYyxnQkFBZ0I7QUFBQSxNQUN2QyxXQUFXLGdCQUFnQixlQUFlO0FBQUEsUUFDeEMsSUFBSTtBQUFBLFVBRUYsTUFBTSxXQUFXLFdBQVcsUUFBUSxRQUFRLEVBQUU7QUFBQSxVQUM5QyxNQUFNLGFBQWE7QUFBQSxZQUNqQixhQUFhLEdBQUcsZUFBZTtBQUFBLFlBQy9CO0FBQUEsVUFDRixDQUFDO0FBQUEsVUFHRCxJQUFJLGlCQUFpQixHQUFHO0FBQUEsWUFDdEIsTUFBTSxJQUFJLFFBQVEsQ0FBQyxZQUFZLFdBQVcsU0FBUyxHQUFHLENBQUM7QUFBQSxVQUN6RDtBQUFBLFVBR0EsTUFBTSxVQUFVLE1BQU0sY0FDcEIsWUFDQSxjQUNBLGNBQ0EsTUFDQSxRQUNBO0FBQUEsWUFDRTtBQUFBLFVBQ0YsQ0FDRjtBQUFBLFVBRUE7QUFBQSxVQUdBLE1BQU0sYUFBYTtBQUFBLFlBQ2pCO0FBQUEsVUFDRixDQUFDO0FBQUEsVUFHRCxJQUFJLGlCQUFpQixNQUFNLEdBQUc7QUFBQSxZQUU1QixNQUFNLFNBQVMsSUFBSTtBQUFBLFVBQ3JCO0FBQUEsVUFDQSxPQUFPLE9BQU87QUFBQSxVQUNkLFFBQVEsTUFBTSxxQkFBcUIsaUJBQWlCLGlCQUFpQixLQUFLO0FBQUEsVUFDMUU7QUFBQSxVQUdBLE1BQU0sYUFBYTtBQUFBLFlBQ2pCO0FBQUEsWUFDQSxRQUFRLENBQUMsR0FBRyxpQkFBaUIsaUJBQWlCLE9BQU87QUFBQSxVQUN2RCxDQUFDO0FBQUE7QUFBQSxNQUVMO0FBQUEsSUFDRjtBQUFBLElBR0EsTUFBTSxTQUFTLElBQUk7QUFBQSxJQUduQixNQUFNLGFBQWE7QUFBQSxNQUNqQixRQUFRO0FBQUEsTUFDUixTQUFTLElBQUksS0FBSyxFQUFFLFlBQVk7QUFBQSxNQUNoQyxhQUFhO0FBQUEsTUFDYixnQkFBZ0I7QUFBQSxJQUNsQixDQUFDO0FBQUEsSUFFRCxRQUFRLElBQUksdUNBQXNDO0FBQUEsSUFDbEQsUUFBUSxLQUFLLENBQUM7QUFBQSxJQUNkLE9BQU8sT0FBTztBQUFBLElBQ2QsUUFBUSxNQUFNLHVCQUF1QixLQUFLO0FBQUEsSUFFMUMsTUFBTSxhQUFhO0FBQUEsTUFDakIsUUFBUTtBQUFBLE1BQ1IsU0FBUyxJQUFJLEtBQUssRUFBRSxZQUFZO0FBQUEsTUFDaEMsYUFBYTtBQUFBLE1BQ2IsUUFBUSxDQUFDLGdCQUFnQixPQUFPO0FBQUEsSUFDbEMsQ0FBQztBQUFBLElBRUQsUUFBUSxLQUFLLENBQUM7QUFBQTtBQUFBO0FBS2xCLFFBQVEsR0FBRyxXQUFXLFlBQVk7QUFBQSxFQUNoQyxRQUFRLElBQUksK0NBQStDO0FBQUEsRUFFM0QsTUFBTSxhQUFhO0FBQUEsSUFDakIsUUFBUTtBQUFBLElBQ1IsU0FBUyxJQUFJLEtBQUssRUFBRSxZQUFZO0FBQUEsSUFDaEMsUUFBUSxDQUFDLDRCQUE0QjtBQUFBLEVBQ3ZDLENBQUM7QUFBQSxFQUVELFFBQVEsS0FBSyxDQUFDO0FBQUEsQ0FDZjtBQUdELGVBQWU7IiwKICAiZGVidWdJZCI6ICIxRDMwOUVBMkE4NTc5NjE1NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==