Last active
July 10, 2023 02:25
-
-
Save KrunoSaho/0a1c8684b0c7a6cff0b24689d0d25418 to your computer and use it in GitHub Desktop.
Batcher Total JS
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { Task, getMyServers, getThreadCountForSimpleOps, makeColour } from "Util"; | |
function interleave(hack, grow, weaken) { | |
const result = []; | |
const max = Math.max(hack.length, grow.length, weaken.length); | |
for (let i = 0; i < max; i++) { | |
if (i < weaken.length) | |
result.push(weaken[i]); | |
if (i < grow.length) | |
result.push(grow[i]); | |
if (i < hack.length) | |
result.push(hack[i]); | |
} | |
return result; | |
} | |
export async function main(ns) { | |
if (ns.args.length < 1) | |
throw new Error("Missing hostname"); | |
const hostname = ns.args[0]; | |
let targetServer = ns.getServer(hostname); | |
const moneyAtTime = []; | |
const sleepTime = 5; | |
const sleepMul = Math.ceil(1000 / sleepTime); | |
ns.atExit(() => { | |
[...getMyServers()].forEach((s) => ns.killall(s)); | |
}); | |
ns.disableLog("ALL"); | |
ns.clearLog(); | |
ns.tail(); | |
ns.moveTail(1800, 250); | |
const { hack, grow, weaken } = { | |
hack: createTask(ns, targetServer, Task.Hack), | |
grow: createTask(ns, targetServer, Task.Grow), | |
weaken: createTask(ns, targetServer, Task.Weaken), | |
}; | |
const findLosses = () => countPeriodsOfLoss(getDeltaMoney(moneyAtTime)); | |
let iteration = 0; | |
while (true) { | |
const t0 = Date.now(); | |
// ui | |
ns.clearLog(); | |
displayUi(ns, targetServer); | |
plotMoneybar(ns, moneyAtTime); | |
ns.print(`Losses in period: ${findLosses()}`); | |
const totalHackThreads = getServersWithThreads(ns, getSourceServers(ns), Task.Hack); | |
const totalGrowThreads = getServersWithThreads(ns, getSourceServers(ns), Task.Grow); | |
const totalWeakenThreads = getServersWithThreads(ns, getSourceServers(ns), Task.Weaken); | |
const hackNoThreads = totalHackThreads.reduce((a, b) => a + b.threads, 0); | |
const growNoThreads = totalGrowThreads.reduce((a, b) => a + b.threads, 0); | |
const weakNoThreads = totalWeakenThreads.reduce((a, b) => a + b.threads, 0); | |
const serversToIgnore = []; | |
const weakenThreads = getServersForThreads(totalWeakenThreads, weakNoThreads, serversToIgnore); | |
const growThreads = getServersForThreads(totalGrowThreads, growNoThreads, serversToIgnore); | |
const hackThreads = getServersForThreads(totalHackThreads, hackNoThreads, serversToIgnore); | |
const processes = interleave(hackThreads, growThreads, weakenThreads).map((x) => { | |
switch (x.task) { | |
case Task.Hack: | |
return () => hack(x.server, x.threads); | |
case Task.Grow: | |
return () => grow(x.server, x.threads); | |
case Task.Weaken: | |
return () => weaken(x.server, x.threads); | |
} | |
}); | |
processes.sort(() => Math.random() - Math.random()).forEach((p) => p()); | |
// ending updates | |
targetServer = ns.getServer(hostname); | |
if (iteration % (2 * sleepMul) === 0) | |
push(moneyAtTime, ns.getPlayer().money); | |
iteration++; | |
await ns.sleep(sleepTime); | |
const dt = t0 - Date.now(); | |
ns.writePort(ns.pid, JSON.stringify({ type: "hack", start: t0, end: dt, batch: iteration })); | |
} | |
} | |
function getSourceServers(ns) { | |
const serverHasMemory = (s) => s.maxRam - s.ramUsed >= 1.75; | |
const servers = ["home", ...getMyServers()] | |
.filter((s) => ns.serverExists(s)) | |
.map(ns.getServer) | |
.filter(serverHasMemory); | |
return servers; | |
} | |
function getServersWithThreads(ns, servers, task) { | |
return servers.map((s) => { | |
return { server: s, threads: getThreadCountForSimpleOps(ns, s, task), task }; | |
}); | |
} | |
function getServersForThreads(servers, threadsRequired, serversToIgnore) { | |
const result = []; | |
for (const s of servers.filter((s) => !serversToIgnore.includes(s.server))) { | |
if (s.threads > 0) { | |
result.push(s); | |
threadsRequired -= s.threads; | |
if (threadsRequired > s.threads) { | |
serversToIgnore.push(s.server); | |
} | |
} | |
if (threadsRequired <= 0) { | |
return result; | |
} | |
} | |
return result; | |
} | |
function countPeriodsOfLoss(data) { | |
let result = 0; | |
for (let i = 0; i < data.length; i++) { | |
if (data[i] < 0) { | |
result++; | |
} | |
} | |
return result; | |
} | |
function getDeltaMoney(moneyAtTime) { | |
let result = []; | |
for (let i = 1; i < moneyAtTime.length; i++) { | |
result.push(moneyAtTime[i] - moneyAtTime[i - 1]); | |
} | |
return result; | |
} | |
function plotMoneybar(ns, moneyAtTime, maxItems = 25) { | |
const red = makeColour(255, 0, 0); | |
const green = makeColour(0, 255, 0); | |
const blue = makeColour(0, 0, 255); | |
let output = "Money: "; | |
for (let i = 1; i < moneyAtTime.length; i++) { | |
const m0 = moneyAtTime[i - 1]; | |
const m1 = moneyAtTime[i]; | |
const delta = m1 - m0; | |
if (delta > 0) { | |
output += `${blue}${"█"}`; | |
} | |
else if (delta < 0) { | |
output += `${red}${"█"}`; | |
} | |
else { | |
output += `${green}${"█"}`; | |
} | |
} | |
const gray = makeColour(100, 100, 100); | |
for (let i = 0; i < maxItems - moneyAtTime.length; i++) { | |
output += `${gray}${"█"}`; | |
} | |
ns.print(output); | |
} | |
function push(data, value, maxItems = 25) { | |
data.push(value); | |
if (data.length > maxItems) { | |
data.shift(); | |
} | |
} | |
function getHackWeakenGrowCounts(ns, hostname) { | |
const processes = ns.ps(hostname); | |
const hc = processes.filter((p) => p.filename === Task.Hack).length; | |
const wc = processes.filter((p) => p.filename === Task.Weaken).length; | |
const gc = processes.filter((p) => p.filename === Task.Grow).length; | |
return { hc, wc, gc }; | |
} | |
function createTask(ns, target, task) { | |
return (src, threads, additionTimeMs = 0) => { | |
ns.exec(task, src.hostname, threads, target.hostname, additionTimeMs); | |
}; | |
} | |
function displayUi(ns, targetServer) { | |
const srcServers = ["home", ...getMyServers()]; | |
const srcPs = srcServers.map((s) => ns.ps(s)).flat(); | |
const { hc, gc, wc } = srcPs | |
.filter((x) => x.filename.includes("Simple")) | |
.map((x) => { | |
const hc = x.filename.toLowerCase().includes("hack") ? 1 : 0; | |
const gc = x.filename.toLowerCase().includes("grow") ? 1 : 0; | |
const wc = x.filename.toLowerCase().includes("weaken") ? 1 : 0; | |
return { hc: hc, gc: gc, wc: wc }; | |
}) | |
.reduce((acc, x) => { | |
return { hc: acc.hc + x.hc, gc: acc.gc + x.gc, wc: acc.wc + x.wc }; | |
}, { hc: 0, gc: 0, wc: 0 }); | |
ns.print(`H: ${hc} G: ${gc} W: ${wc}`); | |
const randomColours = [ | |
makeColour(100, 100, 200), | |
makeColour(100, 200, 100), | |
makeColour(200, 100, 100), | |
makeColour(200, 100, 200), | |
makeColour(200, 200, 100), | |
makeColour(100, 100, 200), | |
makeColour(33, 88, 66), | |
makeColour(100, 190, 220), | |
makeColour(33, 220, 190), | |
]; | |
const defaultCol = makeColour(255, 255, 255); | |
ns.print(`${defaultCol}Target server: ${randomColours.pop()}${targetServer.hostname}`); | |
ns.print(`${defaultCol}Money: ${randomColours.pop()}$${targetServer.moneyAvailable?.toLocaleString("en-AU")} / $${targetServer.moneyMax?.toLocaleString("en-AU")}`); | |
ns.print(`${defaultCol}Security: ${randomColours.pop()}${targetServer.hackDifficulty?.toPrecision(2)} / 100 = ${(targetServer.hackDifficulty / 100).toPrecision(2)}`); | |
ns.print(`${defaultCol}Min security: ${randomColours.pop()}${targetServer.minDifficulty.toPrecision(2)}`); | |
} | |
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGVjdEhnd0RhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQ29sbGVjdEhnd0RhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsMEJBQTBCLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSWxGLFNBQVMsVUFBVSxDQUFDLElBQXlCLEVBQUUsSUFBeUIsRUFBRSxNQUEyQjtJQUNqRyxNQUFNLE1BQU0sR0FBRyxFQUF5QixDQUFDO0lBRXpDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU5RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzFCLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNO1lBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTTtZQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU07WUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzdDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsSUFBSSxDQUFDLEVBQU07SUFDN0IsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRTVELE1BQU0sUUFB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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
export function copyHackFilesToServers(ns, servers) { | |
const files = ["hacks/SimpleHack.js", "hacks/SimpleGrow.js", "hacks/SimpleWeaken.js"]; | |
for (const server of servers) { | |
if (!ns.scp(files, server.hostname, "home")) { | |
ns.print(`ERROR: copyHackFilesToServers => Failed to copy files to ${server}`); | |
} | |
} | |
} | |
export async function main(ns) { | |
const servers = JSON.parse(ns.args[0]); | |
copyHackFilesToServers(ns, servers.filter((s) => s.hostname !== "home")); | |
} | |
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29weUZpbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWwvQ29weUZpbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxFQUFNLEVBQUUsT0FBaUI7SUFDNUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBRXRGLEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO1FBQzFCLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ3pDLEVBQUUsQ0FBQyxLQUFLLENBQUMsNERBQTRELE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDbEY7S0FDSjtBQUNMLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLElBQUksQ0FBQyxFQUFNO0lBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQVcsQ0FBYSxDQUFDO0lBRTdELHNCQUFzQixDQUNsQixFQUFFLEVBQ0YsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsQ0FDL0MsQ0FBQztBQUNOLENBQUMifQ== |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { copyHackFilesToServers } from "CopyFiles"; | |
export var Task; | |
(function (Task) { | |
Task["Hack"] = "hacks/SimpleHack.js"; | |
Task["Grow"] = "hacks/SimpleGrow.js"; | |
Task["Weaken"] = "hacks/SimpleWeaken.js"; | |
})(Task || (Task = {})); | |
export var PortMessages; | |
(function (PortMessages) { | |
PortMessages["ServersBroken"] = "ServersBroken"; | |
})(PortMessages || (PortMessages = {})); | |
const PurchasedServerBaseName = "a"; | |
export function getCurrentDateTime() { | |
// Get the current date and time | |
let now = new Date(Date.now()); | |
// Extract the date and time components | |
let date = now.getDate(); | |
let month = now.getMonth() + 1; | |
let year = now.getFullYear(); | |
let hours = now.getHours(); | |
let minutes = now.getMinutes(); | |
let seconds = now.getSeconds(); | |
// Format the date and time components to have two digits | |
date = date < 10 ? "0" + date : date; | |
month = month < 10 ? "0" + month : month; | |
hours = hours < 10 ? "0" + hours : hours; | |
minutes = minutes < 10 ? "0" + minutes : minutes; | |
seconds = seconds < 10 ? "0" + seconds : seconds; | |
// Combine the date and time components into a string | |
let formattedDateTime = `${date}/${month}/${year} - ${hours}:${minutes}:${seconds}`; | |
return formattedDateTime; | |
} | |
export async function getPurchasedServers(ns, portNumber) { | |
const portHandle = ns.getPortHandle(portNumber); | |
portHandle.clear(); | |
ns.exec("scripts/GetMyServers.js", "home", 1, portNumber); | |
await portHandle.nextWrite(); | |
return JSON.parse(portHandle.read()); | |
} | |
export async function getTargetServersForHack(ns, portNumber, purchasedServers) { | |
const portHandle = ns.getPortHandle(portNumber); | |
const args = [JSON.stringify(purchasedServers), portNumber]; | |
portHandle.clear(); | |
ns.exec("scripts/GetTargetServers.js", "home", 1, ...args); | |
await portHandle.nextWrite(); | |
return JSON.parse(portHandle.read()); | |
} | |
export function makeColour(r, g, b, foreGround = true) { | |
return `\u001b[${foreGround ? 3 : 4}8;2;${r};${g};${b}m`; | |
} | |
export function buyAllTorStuff(ns) { | |
ns.singularity.purchaseTor(); | |
for (const prog of ns.singularity.getDarkwebPrograms()) { | |
ns.singularity.purchaseProgram(prog); | |
} | |
} | |
export function getServers(ns) { | |
const player = ns.getPlayer(); | |
const totalServers = getAllServers(ns.scan, "home", []).filter((s) => !s.includes("hacknet")); | |
// my servers | |
const boughtServers = getMyServers(); | |
const myServers = totalServers | |
.map(ns.getServer) | |
.filter((s) => s.hasAdminRights) | |
.filter((s) => boughtServers.includes(s.hostname)); | |
// attack | |
const targetServers = totalServers | |
.map(ns.getServer) | |
.filter((s) => !boughtServers.includes(s.hostname)) | |
.filter((s) => s.moneyMax > 0) | |
.filter((s) => Math.ceil(player.skills.hacking / 2) >= s.requiredHackingSkill) | |
.sort((a, b) => b.moneyMax - a.moneyMax); | |
myServers.unshift(ns.getServer("home")); | |
return { myServers, targetServers }; | |
} | |
export function getMyServers() { | |
return Array(25) | |
.fill(0) | |
.map((_, i) => { | |
if (i - 1 === -1) | |
return PurchasedServerBaseName; | |
return `${PurchasedServerBaseName}-${i - 1}`; | |
}); | |
} | |
export function buyServers(ns) { | |
const serversBought = ns.getPurchasedServers(); | |
const updateScripts = (server) => { | |
ns.scp(["hacks/SimpleGrow.js", "hacks/SimpleHack.js", "hacks/SimpleWeaken.js"], server, "home"); | |
}; | |
let boughtServers = false; | |
// upgrade servers | |
for (const server of serversBought) { | |
if (ns.getServerMaxRam(server) === ns.getPurchasedServerMaxRam()) { | |
continue; | |
} | |
const money = ns.getPlayer().money; | |
const memory = ns.getServerMaxRam(server); | |
const idx = Math.floor(Math.log2(memory)); | |
const ramQty = Math.floor(Math.pow(2, idx + 2)); | |
const cost = ns.getPurchasedServerUpgradeCost(server, ramQty); | |
if (cost < Math.floor(money * 0.33)) { | |
if (ns.upgradePurchasedServer(server, ramQty)) { | |
updateScripts(server); | |
ns.print(`Server ${server} upgraded => RAM: ${ramQty}`); | |
} | |
} | |
} | |
// Purchase server if server costs < 10% of money. | |
let purchaseServer = false; | |
let ramQty = 1; | |
const costPurchase = () => ns.getPurchasedServerCost(ramQty) < Math.floor(ns.getPlayer().money * 0.1); | |
const maxIdx = Math.floor(Math.log2(ns.getPurchasedServerMaxRam())); | |
for (let i = maxIdx; i > 0; i--) { | |
ramQty = Math.pow(2, i); | |
if (costPurchase()) { | |
purchaseServer = true; | |
break; | |
} | |
} | |
// buy server | |
if (serversBought.length < ns.getPurchasedServerLimit() && purchaseServer) { | |
const newServer = ns.purchaseServer(PurchasedServerBaseName, ramQty); | |
if (newServer != "") { | |
boughtServers = true; | |
serversBought.push(newServer); | |
ns.print(`Purchased new server, ${newServer}`); | |
updateScripts(newServer); | |
} | |
} | |
return boughtServers; | |
} | |
export function spendHashes(ns, action, targetServer, upgradeCount = 1) { | |
if (ns.hacknet.hashCost(action, upgradeCount) > ns.hacknet.numHashes()) { | |
action = "Increase Maximum Money"; | |
} | |
const hasFinished = ns.hacknet.spendHashes(action, targetServer, upgradeCount); | |
if (hasFinished) { | |
ns.print(`Spending hashes on ${action}`); | |
ns.print(`Bought ${action}`); | |
} | |
} | |
export function breakServers(ns, servers) { | |
const run = (file, host, program) => { | |
try { | |
program(host); | |
} | |
catch (e) { } | |
}; | |
for (const server of servers) { | |
copyHackFilesToServers(ns, [server]); | |
const host = server.hostname; | |
if (!server.sshPortOpen) | |
run("BruteSSH.exe", host, ns.brutessh); | |
if (!server.ftpPortOpen) | |
run("FTPCrack.exe", host, ns.ftpcrack); | |
if (!server.httpPortOpen) | |
run("HTTPWorm.exe", host, ns.httpworm); | |
if (!server.sqlPortOpen) | |
run("SQLInject.exe", host, ns.sqlinject); | |
if (!server.smtpPortOpen) | |
run("relaySMTP.exe", host, ns.relaysmtp); | |
const portsOpened = [ | |
server.sshPortOpen, | |
server.ftpPortOpen, | |
server.httpPortOpen, | |
server.sqlPortOpen, | |
server.smtpPortOpen, | |
].reduce((a, b) => a + Number(b), 0); | |
if (!server.hasAdminRights && server.numOpenPortsRequired <= portsOpened) { | |
ns.nuke(host); | |
} | |
} | |
} | |
export function getHoursSinceReset(ns) { | |
return (Date.now() - ns.getResetInfo().lastAugReset) / 3600000; | |
} | |
export function getAllServers(scan, server, existingServers) { | |
const newServers = scan(server) // pad | |
.filter((ss) => !existingServers.includes(ss)); | |
if (newServers.length === 0) { | |
return [server]; | |
} | |
existingServers.push(...newServers); | |
for (const s of newServers) { | |
const nextServers = getAllServers(scan, s, existingServers); | |
existingServers.push(...nextServers); | |
} | |
return [...new Set(existingServers)]; | |
} | |
export function getThreadCountForSimpleOps(ns, srcServer, script, percent = 0.99) { | |
const available = Math.ceil(srcServer.maxRam) - Math.ceil(srcServer.ramUsed); | |
let scriptUsage = script === "hacks/SimpleHack.js" ? 1.7 : 1.75; | |
if (available <= 0) { | |
return 0; | |
} | |
const threads = Math.floor((percent * available) / scriptUsage); | |
return threads; | |
} | |
export function getThreadCount(ns, srcServer, script, percent = 0.99) { | |
const available = Math.ceil(srcServer.maxRam) - Math.ceil(srcServer.ramUsed); | |
const scriptUsage = ns.getScriptRam(script, srcServer.hostname); | |
if (available === 0 || scriptUsage === 0) { | |
return 0; | |
} | |
const threads = Math.floor((percent * available) / scriptUsage); | |
return threads; | |
} | |
/*** | |
* Thanks to quacksouls for this: | |
* https://gist.github.com/quacksouls/dde4532740c2204425fa83bba3ceb8fa | |
*/ | |
export function shell(cmd) { | |
// Template code from the official documentation of Bitburner: | |
// | |
// https://bitburner.readthedocs.io/en/latest/netscript/advancedfunctions/inject_html.html | |
const input = globalThis["document"].getElementById("terminal-input"); | |
input.value = cmd; | |
const handler = Object.keys(input)[1]; | |
input[handler].onChange({ | |
target: input, | |
}); | |
input[handler].onKeyDown({ | |
key: "Enter", | |
preventDefault: () => null, | |
}); | |
} | |
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9VdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXhELE1BQU0sQ0FBTixJQUFZLElBSVg7QUFKRCxXQUFZLElBQUk7SUFDWixvQ0FBNEIsQ0FBQTtJQUM1QixvQ0FBNEIsQ0FBQTtJQUM1Qix3Q0FBZ0MsQ0FBQTtBQUNwQyxDQUFDLEVBSlcsSUFBSSxLQUFKLElBQUksUUFJZjtBQUVELE1BQU0sQ0FBTixJQUFZLFlBRVg7QUFGRCxXQUFZLFlBQVk7SUFDcEIsK0NBQStCLENBQUE7QUFDbkMsQ0FBQyxFQUZXLFlBQVksS0FBWixZQUFZLFFBRXZCO0FBSUQsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFFcEMsTUFBTSxVQUFVLGtCQUFrQjtJQUM5QixnQ0FBZ0M7SUFDaEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFFL0IsdUNBQXVDO0lBQ3ZDLElBQUksSUFBSSxHQUFvQixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDMUMsSUFBSSxLQUFLLEdBQW9CLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEQsSUFBSSxJQUFJLEdBQW9CLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUU5QyxJQUFJLEtBQUssR0FBb0IsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVDLElBQUksT0FBTyxHQUFvQixHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDaEQsSUFBSSxPQUFPLEdBQW9CLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUVoRCx5REFBeUQ7SUFDekQsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUks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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment