Gaston's Diep stuff mod

This is a internal script for bigger project but it has its own custome theme auto upgrades/auto respawn as well as custom stats upgrades that can be request to be add to the builds list

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name Gaston's Diep stuff mod
// @namespace http://tampermonkey.net/
// @version 2.8
// @description This is a internal script for bigger project but it has its own custome theme auto upgrades/auto respawn as well as custom stats upgrades that can be request to be add to the builds list
// @author gaton1779
// @match *://diep.io/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=diep.io
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_info
// @grant GM_addStyle
// @grant GM_addValueChangeListener
// @grant GM_removeValueChangeListener
// @grant GM_xmlhttpRequest
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js
// @license MIT
// ==/UserScript==

//YT: https://www.youtube.com/channel/UCOA8lE9-0XnEIdHqjfQUz1A

_GM_getValue=GM_getValue;["http://code.createjs.com/easeljs-0.5.0.min.js","https://cdn.jsdelivr.net/gh/naquangaston/HostedFiles@master/JS_obf.js","https://cdn.jsdelivr.net/gh/naquangaston/HostedFiles@master/ResourceLoader_.js","https://cdn.jsdelivr.net/gh/naquangaston/HostedFiles@master/JS_Formatter_.js"].map(e => {let t = new URL(e);t.protocol = 'https:';return t.href}).map(e => ({name: new URL(e).pathname.split('/').pop(),id: new URL(e).pathname,url: e})).forEach(async e => {var t = _GM_getValue(e.id),l = falset ? (l = true,console.log(e.name,'Loaded',eval(t))) : console.warn(e.name, 'wasnt installed this Userscript may not Function as Intended.');console.log('Checking', e.name);await fetch(e.url).then(e => e.text(), b => ('Failed:', e.id, b)).then(b => (_GM_getValue(e.id) != b && (_GM_setValue(e.id, b), console.log(e.name,!l&&(eval(b))?'Has been updates':'Failed to update')), e))});
infothingy = {}, inf = {}, _upgrade = "", autoPlay_ = !1;
const Screens = {
        inGame: "in-game-screen",
        gameOver: "game-over-screen",
        home: "home-screen",
        loading: "loading-screen",
        nickname: "spawn-nickname"
    },
    Settings = GM_getValue("Settings") || {},
    extended = {
        update: function(e) {}
    },
    getV = function(e, t) {
        return 1 != arguments.length ? (GM_setValue(e, t), t) : GM_getValue(e)
    };

function setElement(e) {
    return !(!String(e).match(/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?)|(shorts\/))\??v?=?([^#\&\?]*).*/) || 11 != String(e).match(/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?)|(shorts\/))\??v?=?([^#\&\?]*).*/)[8].length) && String(e).match(/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?)|(shorts\/))\??v?=?([^#\&\?]*).*/)[8]
}

function sleep(e) {
    return new Promise((t => setTimeout(t, e)))
}

function RemoveAds() {
    return [...document.getElementsByTagName("iframe")].forEach((e => e.remove()))
}

function checkWin(e = this.win1) {
    return !!e && !e.closed
}

function startwin(e, t = null, n, o) {
    var r;
    null == t && (t = e), console.log("attemp the close", e);
    try {
        n && window[e].close()
    } catch (t) {
        window[e] = null, console.warn("attemp the close", e, "Fail")
    }
    try {
        checkWin(window[e]) ? (globalRoot[t] = open("", "PROFILES", "width=256,height=305"), globalRoot[t].window.document.body.innerHTML = "", globalRoot[t].window.document.head.innerHTML = "") : (window[e] = r = open(o, "PROFILES", "width=256,height=305"), console.log("Making", e, "in", t), console.log(window[e]), console.log("writing defalt styles", "to", e, t), r.document.write(htmlContent.element.outerHTML))
    } catch (e) {
        console.warn(e)
    }
    return globalRoot[t] = globalRoot[e], console.log("complete win"), r
}

function get(e, t = document.body) {
    if (t.id === e) return t;
    if (t.shadowRoot) {
        const n = get(e, t.shadowRoot);
        if (n) return n
    }
    for (const n of t.children) {
        const t = get(e, n);
        if (t) return t
    }
    return null
}

function log_(e, t) {
    new CustomLog(e).log(t)
}
getClose = function(e) {
        return e.map((e => (e.dist = getDistance(...e._lineTo, canvas.width / 2, canvas.height / 2), e))).sort(((e, t) => e.dist - t.dist))[0]
    }, getMid = function(e = [{
        x: 0,
        y: 0
    }]) {
        var t = e.length,
            [n, o] = [0, 0];
        return e.forEach((e => {
            n += e.x, o += e.y
        })), {
            x: n / t,
            y: o / t
        }
    },
    function() {
        Object.assign(this || arguments[0], {
            CustomLog: class {
                constructor(e) {
                    this.title = {
                        body: e || "---",
                        color: "darkgrey",
                        size: "1rem"
                    }, this.body = {
                        color: "#008f68",
                        size: "1rem"
                    }
                }
                setTitleBody(e) {
                    this.title.body = e
                }
                setTitleStyle({
                    color: e,
                    size: t
                }) {
                    void 0 !== e && (this.title.color = e), void 0 !== t && (this.title.size = t)
                }
                setBodyStyle({
                    color: e,
                    size: t
                }) {
                    void 0 !== e && (this.body.color = e), void 0 !== t && (this.body.size = t)
                }
                log(e = "") {
                    console.log(`%c${this.title.body} | %c${e}`, `color: ${this.title.color}; font-weight: bold; font-size: ${this.title.size};`, `color: ${this.body.color}; font-weight: bold; font-size: ${this.body.size}; text-shadow: 0 0 5px rgba(0,0,0,0.2);`)
                }
            }
        })
    }(window.globalRoot || window), draw = function(e) {
        try {
            if (e.shape && "undefined" != e.shape && !e.custom) {
                var {
                    x: t,
                    y: n
                } = getMid(this._lineTo_.map((e => ({
                    x: e[0],
                    y: e[1]
                }))));
                let e = canvas.getContext("2d");
                e.beginPath(), e.custom = !0;
                var o = e.createLinearGradient(0, 0, 170, 0);
                o.addColorStop("0", "magenta"), o.addColorStop("0.5", "blue"), o.addColorStop("1.0", "red"), e.strokeStyle = o, e.lineWidth = 5, e.moveTo(t, n), e.arc(t, n, 50, 0, 2 * Math.PI), e.stroke(), e.custom = !1
            }
        } catch (e) {}
    }, MySrc = function() {
        const e = document.getElementById("chooseFile");

        function t(e, t) {
            a.src = e, t && a.addEventListener("ended", t)
        }
        Array.prototype.forEachAsync = async function(e = function() {}) {
            for (let t = 0; t < this.length; t++) await e(this[t], t, this.length);
            return null
        }, Array.prototype.mapAsync = async function(e = function() {}) {
            for (let t = 0; t < this.length; t++) this[t] = await e(this[t], t, this.length);
            return this
        };
        var n = 0;

        function o(e) {
            ! function o() {
                n + 1 === e.length ? (console.log("Now playing", e[n].name), t(e[n].sound, null)) : (console.log("Now playing", e[n].name), t(e[n].sound, (function() {
                    n++, o()
                })))
            }()
        }
        var r = document.getElementById("Songs_");
        const a = new Audio;
        var s = [];
        a.volume = .3, [
            ["Shuffle", () => (s.shuffle(), a.pause(), o(s))],
            ["play all", function() {
                o(s)
            }],
            ["Skip", () => {
                a.currentTime = a.duration - 10
            }],
            ["Previous", () => {
                n -= 2, a.currentTime = a.duration - 10
            }],
            ["play", () => a.play()],
            ["pause", () => a.pause()],
            ["loop", function(e) {
                a.loop = !a.loop, e.innerText = "loop:" + (a.loop ? "on" : "off")
            }],
            ["volume", () => {
                a.volume = prompt("Enter volume", "50") / 100
            }]
        ].forEach((e => {
            var t = "function" == typeof e[1] ? e[1] : function() {
                    alert(`The "${e[0]}" button is W.I.P`)
                },
                n = document.createElement("button");
            n.innerText = e[0], n.onclick = t, r.append(n), console.log(n)
        })), a.oncanplaythrough = e => {
            a.play()
        }, e.addEventListener("change", (t => {
            (async function(t, n, o = function() {
                return !0
            }) {
                var r = new class {
                    constructor() {
                        this.files = []
                    }
                    push(...e) {
                        this.files.push(...e)
                    }
                };
                const a = (e => {
                    var t = [];
                    for (const n of e) {
                        const e = n.name ? n.name : "NOT SUPPORTED",
                            o = n.type ? n.type : "NOT SUPPORTED",
                            r = n.size ? n.size : "NOT SUPPORTED";
                        t.push({
                            file: n,
                            name: e,
                            type: o,
                            size: r
                        })
                    }
                    return t
                })([...(t && t.files ? t.files : 0) || e.files]);
                return r.files = await a.filter(o).mapAsync((async(e, t, n) => {
                    const {
                        file: o,
                        name: r,
                        type: a,
                        size: s
                    } = e;
                    console.log("Unloading:" + r, "\nFiles left", n - t);
                    const i = new FileReader;
                    var l = await new Promise((e => {
                            var t = document.createElement("span");
                            t.className = "file", t.innerHTML = r, t.id = r;
                            var n = document.createElement("span");

                            function a(t) {
                                var n = [r, `${t.type}:`, (t.loaded / t.total * 100).toFixed(2) + "%"];
                                if (document.getElementById("TextAl").innerHTML = n[0], document.getElementById("myBar").style.width = n[2], console.log(...n), "error" == t.type && console.error(t.target.error), "load" === t.type) {
                                    var o = i.result;
                                    e(o)
                                }
                            }
                            n.className = "progress", n.innerHTML = "0%", n.id = r + "%",
                                function(e) {
                                    e.addEventListener("loadstart", a), e.addEventListener("load", a), e.addEventListener("loadend", a), e.addEventListener("progress", a), e.addEventListener("error", a), e.addEventListener("abort", a)
                                }(i), i.readAsDataURL(o)
                        })),
                        c = l.split(","),
                        d = l.match(/(data):([-\w]+\/[-\w]+);(\w+)/);
                    if (dt = c, "NOT SUPPORTED" == a) {
                        var u = r.split(".").pop().split("(")[0],
                            p = new Error(a + ' file extentsion:\n"' + u + '" is not a supported file extentsion');
                        p.name = a, console.warn(p)
                    }
                    return {
                        file: o,
                        name: r,
                        type: a,
                        size: s,
                        data: dt,
                        ecode: d,
                        b: e
                    }
                })), "function" == typeof n && n(r), {
                    files: r
                }
            })(!1, !1, (e => e.type.includes("audio"))).then((e => {
                e.files.files.forEach((e => {
                    var t = document.createElement("span");
                    t.innerHTML = e.name, t.href = "", t.onclick = function(t) {
                        a.pause(), a.src = e.ecode.input
                    }, Songs_2.append(document.createElement("br")), r.append(t), s.push({
                        name: e.name,
                        sound: e.ecode.input
                    })
                }))
            }), console.error)
        }))
    }, set_convar = function(e, t) {
        console.log("Set", e, t), input.set_convar(e, t)
    }, execute = function(e) {
        var t = (e.match(/(?<name>[\w_]+) ?(?<index>[0-9]+)? ?(?<value>(0x|#)[\w]+)\t?(?<for>.+)?/i) || {
                groups: {}
            }).groups,
            n = (e.split(" "), findColor(t));
        if (null != n) {
            colors[otherStuff.colors[n].for] = "#" + t.value.match(/(0x|#)(?<hex>[\w]+)/i).groups.hex, otherStuff.colors[n].prev = otherStuff.colors[n].new || otherStuff.colors[n].default, otherStuff.colors[n].new = t.value.toUpperCase();
            let e = otherStuff.colors[n];
            console.log("Set", e.for, "from", e.prev, "To", e.new, {
                item: e,
                res: t
            })
        }
        input.execute(e)
    };
class Build {
    buildSet(e) {
        this.Build = e;
        var t = 0;
        this.BuildPath = "";
        var n = e.regen,
            o = e.health,
            r = e.body,
            a = e.bspeed,
            s = e.pen,
            i = e.dmg,
            l = e.reloads,
            c = e.speed;
        for (let e = 0; e <= 7; e++) e < i && t < 34 && (this.BuildPath += "6", t++), e < a && t < 34 && (this.BuildPath += "4", t++), e < s && t < 34 && (this.BuildPath += "5", t++), e < l && t < 34 && (this.BuildPath += "7", t++);
        for (let e = 0; e <= 7; e++) e < c && t < 34 && (this.BuildPath += "8", t++);
        for (let e = 0; e <= 7; e++) e < n && t < 34 && (this.BuildPath += "1", t++), e < o && t < 34 && (this.BuildPath += "2", t++), e < r && t < 34 && (this.BuildPath += "3", t++)
    }
}
class bool {
    constructor(e) {
        e && this.toggle()
    }#e = !1;
    toggle() {
        this.#e = !this.#e
    }
    get status() {
        return this.#e
    }
    set status(e) {
        this.#e = !!e
    }
}
class element {
    static get br() {
        return new element("br")
    }
    constructor(e, t) {
        this.element = e.constructor.name.includes("HTML") && e || function() {
            for (let e in arguments[1]) arguments[0].setAttribute(e, arguments[1][e]);
            return arguments[0]
        }(document.createElement(arguments[0]), arguments[1])
    }
    style(e) {
        for (let t in e) this.element.style[t] = e[t];
        return this
    }
    append(e, ...t) {
        this.element.append(e.element || e), console.log("T:", {
            targets: t,
            fe: t && t.forEach
        });
        for (let e = 0; e < t.length; e++) {
            let n = t[e];
            console.log("Appending:", {
                element: n,
                target: this
            }), this.element.append(n.element || n)
        }
        return this
    }
    appendTo(e) {
        return (e.element || "string" == typeof e ? document.querySelector(e) : e).append(this.element), this
    }
    on(e, t) {
        return this.element[`on${e}`] = t, this
    }
    set(e, t) {
        return this.element[e] = t, this
    }
    remove() {
        return this.element.remove(), this
    }
    get() {
        return this.element[arguments[0]]
    }
    get children() {
        return new class {
            constructor(e) {
                for (var t = 0; t < e.length; t += 1) this[t] = e[t];
                Object.defineProperty(this, "length", {
                    get: function() {
                        return e.length
                    }
                }), Object.freeze(this)
            }
            item(e) {
                return null != this[e] ? this[e] : null
            }
            namedItem(e) {
                for (var t = 0; t < this.length; t += 1)
                    if (this[t].id === e || this[t].name === e) return this[t];
                return null
            }
            get toArray() {
                return [...this]
            }
        }([...this.element.children])
    }
}
const {
    win1: win1,
    win2: win2,
    win3: win3,
    win4: win4,
    hh: hh,
    jj: jj,
    dd: dd
} = [null, null, null, null, function(e, t) {
    localStorage.setItem(e, t)
}, function(e) {
    return localStorage.getItem(e)
}, function(e) {
    let t = {};
    return e.forEach((function(e) {
        t[e] || (t[e] = !0)
    })), Object.keys(t)
}], AutoUpgrade = new bool(1), AutoReload = new bool(1), Firing = new bool, AutoSpawn = new bool(1), A = {get screen() {
        return [...app.children].filter((e => [...e.classList].includes("active"))).map((e => e.id))[0]
    }
}, bootstrapCss = new element("link").set("rel", "stylesheet").set("href", "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"), jqueryUiCss = new element("link").set("rel", "stylesheet").set("href", "https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.css"), jqueryScript = new element("script", {
    integrity: "sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4=",
    crossorigin: "anonymous"
}).set("src", "https://code.jquery.com/jquery-3.7.1.js"), jqueryUiScript = new element("script").set("src", "https://code.jquery.com/ui/1.12.1/jquery-ui.js"), bootstrapScript = new element("script").set("src", "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"), jqueryMinScript = new element("script").set("src", "https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"), style = new element("style").set("innerHTML", "\n     .stat {\n            height: 100%;\n            width: 10%;\n\t\t\t\t\t\ttransition:width 2s\n        }\n\n        .stats {\n            height: 10px;\n            width: 50%;\n        }\n\n        body {\n            color: white;\n            -ms-overflow-style: none;\n            /* IE and Edge */\n            scrollbar-width: none;\n            /* Firefox */\n            background-color: rgb(54, 57, 63);\n            overflow-x: hidden;\n        }\n\n        img,\n        button,\n        .menu {\n            border: 2px solid red;\n            border-radius: 8px;\n            border-style: solid;\n            border-width: medium;\n        }\n        #MusicPlayer {\n            border-radius: 8px;\n            border-radius: 8px;\n            border-style: solid;\n        }\n        button {\n            color: rgb(27, 51, 99)\n        }\n\n        input {\n            /*border-width: 1px;*/\n            border: 2px dashed rgb(87, 167, 12);\n            color: white;\n            background: rgba(0, 0, 0, 0)\n        }\n\n        .name {\n            color: red\n        }\n\n        .Status {\n            color: blue\n        }\n\n        .server_nick {\n            color: white\n        }\n\n        body::-webkit-scrollbar {\n            display: none;\n        }\n\n        .hidden {\n            display: none;\n        }\n\n        .dropdown {\n            display: inline-block;\n            position: relative;\n        }\n\n        #Songs_2 {\n            max-height: 444px;\n        }\n\n        #thefile {\n            position: fixed;\n            top: 10px;\n            left: 10px;\n            z-index: 100;\n        }\n\n        #canvas {\n            position: fixed;\n            left: 0;\n            top: 0;\n            width: 100%;\n            height: 100%;\n            z-index: -1;\n        }\n\n        audio {\n            position: fixed;\n            left: 10px;\n            bottom: 10px;\n            width: calc(100% - 20px);\n        }\n\n        .center {\n            width: 100%;\n            color: red;\n            align-items: center;\n        }\n\n        input[type=button] {\n            border: 2px solid rgb(255, 255, 255);\n            color: white;\n        }\n\n        * {\n            box-sizing: border-box;\n        }\n\n        #myInput {\n            background-image: url('/css/searchicon.png');\n            background-position: 10px 12px;\n            background-repeat: no-repeat;\n            width: 100%;\n            font-size: 16px;\n            padding: 12px 20px 12px 40px;\n            border: 1px solid #ddd;\n            margin-bottom: 12px;\n        }\n\n        #myUL {\n            list-style-type: none;\n            padding: 0;\n            margin: 0;\n        }\n\n        #myUL li div {\n            border: 1px solid #ddd;\n            margin-top: -1px;\n            /* Prevent double borders */\n            background-color: rgba(238, 238, 238, 0.192);\n            ;\n            padding: 12px;\n            text-decoration: none;\n            font-size: 18px;\n            color: black;\n            display: block\n        }\n\n        #myUL li a {\n            border: 1px solid #ddd;\n            margin-top: -1px;\n            /* Prevent double borders */\n            background-color: rgba(238, 238, 238, 0.192);\n            ;\n            padding: 12px;\n            text-decoration: none;\n            font-size: 18px;\n            color: black;\n            display: block\n        }\n\n        #myUL li div {\n            cursor: pointer;\n            border: 1px solid #ddd;\n            margin-top: -1px;\n            /* Prevent double borders */\n            background-color: rgba(238, 238, 238, 0.192);\n            ;\n            padding: 12px;\n            text-decoration: none;\n            font-size: 18px;\n            color: black;\n            display: block\n        }\n\n        #myUL li a:hover:not(.header) {\n            background-color: rgb(238, 238, 238);\n        }\n        #myUL li div div input[type=button]:hover:not(.header) {\n            background-color: rgb(238, 238, 238);\n            color:black;\n        }\n"), bodyContent = new element("div").set("className", "my-game-container").append(new element("div", {
    id: "CustomSoungs"
}).set("className", "menu").append(new element("a").set("innerText", " "), new element("h2").set("innerText", "play custom songs"), new element("input").set("type", "file").set("multiple", "").set("id", "chooseFile"), new element("br"), new element("br"), new element("div").set("id", "myProgress").append(new element("div").set("id", "myBar").append(new element("span").set("id", "TextAl"))), new element("br"), new element("div").set("id", "Files_"), new element("div").set("id", "Songs_"), new element("div").set("id", "Songs_2"), new element("canvas").set("id", "canvas")), new element("br"), new element("hr"), new element("br"), new element("div", {
    id: "CustomSoungs"
}).set("className", "menu").append(new element("center").append(new element("iframe", {
    id: "MusicPlayer",
    src: getV("LP") || ""
}).set("allowfullscreen", !0), element.br, element.br, new element("input", {
    id: "playlistInput"
}), new element("script").set("innerHTML", `\n             ${setElement.toString()};\n             document.getElementById('playlistInput').onchange=\n             function({target,isTrusted,target:{parentNode:{getElementById}}}){\n                 console.log("Change")\n                 var url=\`https://www.youtube.com/embed/\${setElement(target.value)}?\${[...(new URL(target.value)).searchParams].map(e=>e.join('=')).join('&')}&autoplay=1\`\n                 document.getElementById('MusicPlayer').src=url\n                 window.getV('LP',url)\n             }`))), new element("hr"), new element("div").set("className", "menu").set("id", "menu").append(new element("h2").set("innerText", "Menu-")), new element("br"), new element("hr"), new element("br"), new element("div").set("className", "menu").set("id", "Builds_").append(new element("style").set("innerHTML", "\n            /* CSS styles for .regen, .health, .body, etc. */\n             .regen {\n                background: #EEB690;\n            }\n             .health {\n                background: #EC6CF0;\n            }\n             .body {\n                background: #9A6CF0;\n            }\n             .bspeed {\n                background: #6C96F0;\n            }\n             .pen {\n                background: #F0D96C;\n            }\n             .dmg {\n                background: #F06C6C;\n            }\n             .reloads {\n                background: rgb(152, 240, 108);\n            }\n             .speed {\n                background: #6CF0EC;\n            }\n        "), new element("h2").set("innerText", "Builds-"), new element("div").set("id", "stats_show").append(new element("div").append(new element("span").set("innerText", "Regen:"), new element("span").set("className", "regen_")).append(new element("div").set("className", "stats").append(new element("div").set("className", "stat regen"))), new element("div").append(new element("span").set("innerText", "Health:"), new element("span").set("className", "health_")).append(new element("div").set("className", "stats").append(new element("div").set("className", "stat health"))), new element("div").append(new element("span").set("innerText", "Body:"), new element("span").set("className", "body_")).append(new element("div").set("className", "stats").append(new element("div").set("className", "stat body"))), new element("div").append(new element("span").set("innerText", "BSpeed:"), new element("span").set("className", "bspeed_")).append(new element("div").set("className", "stats").append(new element("div").set("className", "stat bspeed"))), new element("div").append(new element("span").set("innerText", "Pen:"), new element("span").set("className", "pen_")).append(new element("div").set("className", "stats").append(new element("div").set("className", "stat pen"))), new element("div").append(new element("span").set("innerText", "Dmg:"), new element("span").set("className", "dmg_")).append(new element("div").set("className", "stats").append(new element("div").set("className", "stat dmg"))), new element("div").append(new element("span").set("innerText", "Reload:"), new element("span").set("className", "reloads_")).append(new element("div").set("className", "stats").append(new element("div").set("className", "stat reloads"))), new element("div").append(new element("span").set("innerText", "Speed:"), new element("span").set("className", "speed_")).append(new element("div").set("className", "stats").append(new element("div").set("className", "stat speed")))), new element("hr"), new element("input").set("id", "search_").set("placeholder", "Search for names..").set("title", "Type in a name"), new element("br"), new element("br"), new element("ul").set("id", "myUL"))), script = new element("script").set("innerHTML", '\n    console.log(\'Test Passed\')\n    document.getElementById(\'search_\').onkeyup=function () {\n        // Your function code here\n        var input, filter, ul, li, a, i, txtValue;\n        input = document.getElementById("search_");\n        filter = input.value.toUpperCase();\n        ul = document.getElementById("myUL");\n        li = ul.getElementsByTagName("li");\n        for (i = 0; i < li.length; i++) {\n            try{\n                a = li[i].getElementsByTagName("div")[0];\n                txtValue = a.textContent || a.innerText;\n                if (txtValue.toUpperCase().indexOf(filter) > -1) {\n                    li[i].style.display = "";\n                } else {\n                    li[i].style.display = "none";\n                }\n            }catch(err){console.log(a)}\n        }\n    };\n'), htmlContent = new element("html").append(new element("head").append(bootstrapCss, jqueryUiCss, jqueryScript, jqueryUiScript, bootstrapScript, jqueryMinScript, style), new element("body").append(bodyContent, script, new element("script").set("innerHTML", MySrc.toString() + "\nMySrc();")));

function download(e, t) {
    const n = new Blob([e], {
            type: `text/${t}`
        }),
        o = URL.createObjectURL(n),
        r = document.createElement("a");
    r.href = o, r.download = `file.${t}`, document.body.appendChild(r), r.click(), URL.revokeObjectURL(o), document.body.removeChild(r)
}
const _myWin = startwin("myWin_");

function updateFunction() {
    log_("Screen:", A.screen), extended.update && extended.update(A.screen)
}
globalRoot._myWin = _myWin, addEventListener("beforeunload", (function() {
        _myWin.close()
    })), globalRoot.startwin_ = startwin, globalRoot.checkWin_ = checkWin,
    function() {
        let e = "";
        ! function t() {
            const n = A.screen;
            n !== e && (updateFunction(), e = n), requestAnimationFrame(t)
        }()
    }(), updateFunction();
class Player {
    static down(e) {
        input.key_down(e)
    }
    static up(e) {
        input.key_up(e)
    }
    static get A() {
        return A
    }
    static send(e) {
        input.key_down(e), input.key_up(e)
    }
    static get getNN() {
        return get(Screens.nickname)
    }
    static get nickname() {
        return this.getNN.value
    }
    static set nickname(e) {
        this.getNN.value = e
    }
    static get onGame() {
        return this.A.screen == Screens.ingame
    }
    static get onStats() {
        return this.A.screen == Screens.gameOver
    }
    static get canSpawn() {
        return this.A.screen == Screens.home
    }
    static get screen() {
        return this.A.screen
    }
    static wfs(e) {
        let t = () => this.screen;
        return t == e || new Promise((n => {
            let o = setInterval((() => {
                t() == e && (n(!0), clearInterval(o))
            }), 1)
        }))
    }
    static async spawn(e) {
        return this.onStats && (this.send(13), await this.wfs(Screens.home)), input.try_spawn(this.nickname), await this.wfs(Screens.isGame), !0
    }
}
const keys = e => Object.keys(e || this);

function findColor(e) {
    const t = e.index,
        n = e.name;
    for (let e = 0; e < otherStuff.colors.length; e++) {
        let {
            index: o,
            name: r
        } = otherStuff.colors[e];
        if (o == t && n == r) return e
    }
}
_Player = Player, alert("OK"), otherStuff = {
    toggles: [{
        name: "net_predict_movement",
        bool: "true",
        for: "Enable clientside prediction for movement"
    }, {
        name: "ren_achievements",
        bool: "true",
        for: "Render achievements"
    }, {
        name: "ren_background",
        bool: "true",
        for: "Render background[6]"
    }, {
        name: "ren_cache_grid",
        bool: "true",
        for: "Cache grid on separate canvas"
    }, {
        name: "ren_context_reinitialization",
        bool: "true",
        for: "Reinitialize contexts if FPS is too low[7]"
    }, {
        name: "ren_debug_collisions",
        bool: "false",
        for: "Render collidable debug info[8]"
    }, {
        name: "ren_debug_info",
        bool: "false",
        for: "Render some debug info on the server stats test"
    }, {
        name: "ren_fps",
        bool: "false",
        for: "Render FPS"
    }, {
        name: "ren_health_bars",
        bool: "true",
        for: "Render health bars"
    }, {
        name: "ren_names",
        bool: "true",
        for: "Render names"
    }, {
        name: "ren_pattern_grid",
        bool: "true",
        for: "Use canvas createPattern for grid, it's faster but looks slightly worse"
    }, {
        name: "ren_raw_health_values",
        bool: "false",
        for: "Render raw health bar values"
    }, {
        name: "ren_scoreboard",
        bool: "true",
        for: "Render scoreboard"
    }, {
        name: "ren_scoreboard_names",
        bool: "true",
        for: "Render scoreboard names"
    }, {
        name: "ren_solid_background",
        bool: "true",
        for: "Render background as solid color, without the grid"
    }, {
        name: "ren_stats",
        bool: "true",
        for: "Render stat upgrades"
    }, {
        name: "ren_stroke_soft_color",
        bool: "true",
        for: "Renders strokes as a darker shade of fill color"
    }, {
        name: "ren_ui",
        bool: "true",
        for: "Render UI layer"
    }, {
        name: "ren_upgrades",
        bool: "true",
        for: "Render class upgrades"
    }, {
        name: "ui_prevent_right_click",
        bool: "true",
        for: "Prevent right click from triggering context menu"
    }],
    colors: [{
        name: "net_replace_color",
        index: "0",
        default: "0x555555",
        for: "Smasher and Dominator Bases"
    }, {
        name: "net_replace_color",
        index: "1",
        default: "0x999999",
        for: "Barrels"
    }, {
        name: "net_replace_color",
        index: "2",
        default: "0x00B1DE",
        for: "Body (You)"
    }, {
        name: "net_replace_color",
        index: "3",
        default: "0x00B1DE",
        for: "Blue Team"
    }, {
        name: "net_replace_color",
        index: "4",
        default: "0xF14E54",
        for: "Red Team"
    }, {
        name: "net_replace_color",
        index: "5",
        default: "0xBE7FF5",
        for: "Purple Team"
    }, {
        name: "net_replace_color",
        index: "6",
        default: "0x00F46C",
        for: "Green Team"
    }, {
        name: "net_replace_color",
        index: "6",
        default: "0xD68163",
        for: "Green Team (Making Green Team Brown, like it was formerly)"
    }, {
        name: "net_replace_color",
        index: "7",
        default: "0x89FF69",
        for: "Shiny Polygons"
    }, {
        name: "net_replace_color",
        index: "8",
        default: "0xFFE869",
        for: "Square"
    }, {
        name: "net_replace_color",
        index: "9",
        default: "0xFC7677",
        for: "Triangle"
    }, {
        name: "net_replace_color",
        index: "10",
        default: "0x768DFC",
        for: "Pentagon"
    }, {
        name: "net_replace_color",
        index: "11",
        default: "0xFF77DC",
        for: "Crashers"
    }, {
        name: "net_replace_color",
        index: "12",
        default: "0xFFE869",
        for: "Arena Closers/Neutral Dominators/Defender Ammo"
    }, {
        name: "net_replace_color",
        index: "13",
        default: "0x44FFA0",
        for: "Scoreboard"
    }, {
        name: "net_replace_color",
        index: "14",
        default: "0xBBBBBB",
        for: "Maze Walls"
    }, {
        name: "net_replace_color",
        index: "15",
        default: "0xF14E54",
        for: "Others (FFA)"
    }, {
        name: "net_replace_color",
        index: "16",
        default: "0xFBC477",
        for: "Summoned Squares (Necromancer)"
    }, {
        name: "net_replace_color",
        index: "17",
        default: "0xC0C0C0",
        for: "Fallen Bosses"
    }, {
        name: "ren_background_color",
        default: "0xCDCDCD",
        for: "Base color for the background"
    }, {
        name: "ren_border_color",
        default: "0x000000",
        for: "The area outside the map (overlayed on top of the inside the map color, semi-transparent)"
    }, {
        name: "ren_minimap_background_color",
        default: "0xCDCDCD",
        for: "Minimap"
    }, {
        name: "ren_minimap_border_color",
        default: "0x555555",
        for: "Minimap Border"
    }, {
        name: "ren_health_fill_color",
        default: "0x85E37D",
        for: "Health Bar"
    }, {
        name: "ren_health_background_color",
        default: "0x555555",
        for: "Health Bar Background"
    }, {
        name: "ren_xp_bar_fill_color",
        default: "0xFFDE43",
        for: "EXP Bar"
    }, {
        name: "ren_score_bar_fill_color",
        default: "0x43FF91",
        for: "Score Bar"
    }, {
        name: "ren_bar_background_color",
        default: "0x000000",
        for: "EXP/Score Bar/Scoreboard Background"
    }, {
        name: "ren_stroke_solid_color",
        default: "0x555555",
        for: "Outlines (For ren_stroke_soft_color false)"
    }, {
        name: "ren_grid_color",
        default: "0x000000",
        for: "Grid Lines (Note: Actual Results Vary, seeing as the border is different for each section)"
    }]
}, colors = {}, otherStuff.colors.forEach((e => {
    colors[e.for] = "#" + e.default.split("0x").pop()
})), async function() {
    alert("A");
    var e = class {
        constructor({
            type: e,
            default_: t,
            name: n,
            command: o
        }) {
            t = Settings[n] || t;
            var r = "";
            switch (e) {
                case "toggle":
                    r = "checkbox";
                    break;
                case "color":
                    r = "color"
            }
            var a = new element("label").set("for", n).set("innerText", n + ": "),
                s = new element("input", {
                    type: r,
                    id: n,
                    name: o
                }).set("onchange", (function(e) {
                    var t = e.target,
                        a = "checkbox" == r ? t.checked : e.target.value;
                    console.log({
                        name: n,
                        value: a,
                        target: t,
                        e: e,
                        type_: r,
                        command: o
                    }), Settings[n] = {
                        value: a
                    }, execute(`${o} ${a}`)
                }));
            t && ("checkbox" == r && s.set("checked", t), s.set("value", t)), this.input = s, this.label = a
        }
    };
    console.log("Loading builds");
    const t = await fetch("https://raw.githubusercontent.com/naquangaston/HostedFiles/main/builds.json").then((e => e.json()));
    console.log("Got Builds");
    const n = Object.keys(t).map((e => [...new Set(Object.keys(t[e]._builds).map((n => t[e]._builds[n].p)))]));

    function o(e = {}) {
        let t = e;
        var n = 0,
            o = [];
        for (let e in t) "MAX" == t[e] && (t[e] = "7"), Number.isNaN(1 * t[e]) ? (o.push(e), console.log("Skipping", e, "key")) : n += 1 * t[e];
        var r = 33 - n,
            a = Math.floor(r / o.length);
        o.forEach((e => {
            t[e] = a
        })), n = 0;
        for (let e in t) Number.isNaN(1 * t[e]) || (n += 1 * t[e]);
        if (0 != (r = 33 - n))
            for (let e = 0; e < r; e++)
                for (let e = 0; e < Object.keys(t).length; e++) {
                    r = 33 - n;
                    var s = Object.keys(t)[e];
                    t[s] < 7 && r && o.includes(s) && (n += 1, t[s] += 1, console.log("Added to", s))
                }
        return Object.keys(t).forEach((e => {
            t[e] = 1 * t[e]
        })), t
    }
    console.log({
            BuildsName: n,
            Builds: t
        }), console.log("Fixing Builds"),
        function() {
            var [e, n] = ["map", "build"];
            for (let a in t) {
                var r = t[a];
                for (let s in r) "object" == typeof t[a][s] && (t[a][s] = t[a][s][e]((e => (e[n] = o(e[n]), e))))
            }
        }(), console.log("EZ");

    function r(e, t, {
        desc: n,
        line: o,
        space: r,
        befors: a,
        afters: s
    }) {
        var i = document.createElement("button");
        i.innerText = e, i.onclick = t;
        var l, d = (l = "span", document.createElement(l));
        d.innerText = n || "No description.", d.className = "menuDesc", o && c.append(document.createElement("br")), c.append(i), c.append(d)
    }

    function a(e, t) {
        setTimeout((function() {
            input.key_down(32)
        }), 1e3 * e), setTimeout((function() {
            input.key_up(32)
        }), 1e3 * e + t)
    }

    function s(e, t, {
        defaut: n,
        desc: o,
        line: r,
        space: a,
        befors: s,
        afters: i
    }) {
        var l = document.createElement("label");
        l.innerText = e, l.for = e;
        var d = document.createElement("input");
        d.type = "checkbox", d.name = e, d.onclick = t, d.checked = !!n;
        var u, p = (u = "span", document.createElement(u));
        p.innerText = o || "No description.", p.className = "menuDesc", r && c.append(document.createElement("br")), c.append(l), c.append(d), c.append(p)
    }
    for (_myWin_ = globalRoot.myWin_; !_myWin_.window.document.getElementById("menu");) console.log("Menu not FOund!"), await sleep(1e3);
    _upgrade = GM_getValue("u") || "", console.log("ok"), await Player.wfs(Screens.home), console.log("WHy!!");
    var i, l, c = _myWin_.window.document.getElementById("menu");
    _myWin_.window.getV = getV,
        function() {
            Array.prototype.map_ = function(e) {
                const t = ["length"],
                    n = this;
                for (let o = 0; o < this[t[0]]; o++) n[o] = e(this[o], o);
                return n
            }, addEventListener("beforeunload", (function() {
                GM_setValue("Settings", Settings)
            }));
            var t = new element("div", {
                id: "toggles"
            }).append(new element("h1").set("innerText", "Toggles")).append(element.br);
            otherStuff.toggles.map((t => new e({
                name: t.for,
                type: "toggle",
                default_: "true" == t.bool,
                command: `${t.name} `
            }))).forEach((e => {
                t.append(e.label).append(e.input).append(element.br)
            }));
            var n = new element("div", {
                id: "colors"
            }).append(new element("h1").set("innerText", "Styles")).append(element.br);
            otherStuff.colors.map((t => new e({
                name: t.for,
                type: "color",
                default_: "#" + (t.new || t.default).match(/0x(?<o>.+)/i).groups.o,
                command: `${t.name}${t.index?" "+t.index:" "}`
            }))).forEach((e => {
                n.append(e.label).append(e.input).append(element.br)
            })), t.appendTo(c), n.appendTo(c)
        }(), r("Reset stats", (function() {
            GM_setValue("u", "")
        }), {
            desc: "Only use if your (game reloads without finish loading) or if game doesnt load."
        }), r("Fix Game", (function() {
            var e = function({
                gamemode: e,
                name: t
            }) {
                return {
                    gamemode: e,
                    name: t
                }
            }(localStorage);
            for (let e in localStorage) localStorage.removeItem(e);
            localStorage.clear();
            for (let t in e) localStorage.setItem(t, e[t]);
            location.href = location.href
        }), {
            desc: "Only use if your (game reloads without finish loading) or if game doesnt load."
        }), r("Remove-Ads", RemoveAds, {
            line: !0,
            desc: "Use to remove ads that may cause gae lag"
        }), r("Stack", (function() {
            a(0, 100), a(.75, 200), a(1.5, 750), setTimeout((function() {
                input.key_down(69)
            }), 2e3)
        }), {
            line: !0,
            desc: "stack preditor bullets max reload requried"
        }), s("AutoReload", (function() {
            AutoReload.toggle(), log_("AutoReloads", AutoReload.status)
        }), {
            defaut: AutoReload.status,
            line: !0,
            desc: "Auto Reloads page is loading take too long.(10 Seconds)"
        }), s("AutoUpgrade", (function() {
            AutoUpgrade.toggle(), log_("AutoUpgrade", AutoUpgrade.status)
        }), {
            defaut: AutoUpgrade.status,
            line: !0,
            desc: "AutoUpgrade you stats when you spawn into the game"
        }), s("AutoSpawn", (function() {
            AutoSpawn.toggle(), log_("AutoSpawn", AutoSpawn.status)
        }), {
            defaut: AutoSpawn.status,
            line: !0,
            desc: "Just auto respawn"
        }), console.log({
            AutoSpawn: AutoSpawn,
            AutoUpgrade: AutoUpgrade,
            AutoReload: AutoReload
        }), setInterval((() => {
            AutoReload.status && ["loading", "captcha"].includes(Player.screen) && (alert("Auto reload is on\n page will reload in 5 seconds"), setTimeout((() => {
                AutoReload.status && ["loading", "captcha"].includes(Player.screen) ? location.reload() : consolelog("Reload ABprted")
            }), 5e3))
        }), 1e4), _window = window;
    class d {
        static createCanvas() {
            const e = document.createElement("canvas");
            return e.className = "CanvasKit-bypass", e.style.pointerEvents = "none", e.style.position = "fixed", e.style["z-index"] = 1, e.style.top = "0px", e.style.left = "0px", e.style.right = "0px", e.style.bottom = "0px", e.style.width = "100%", e.style.height = "100%", e
        }
        static hookRAF(e) {
            requestAnimationFrame = new Proxy(requestAnimationFrame, {
                apply: (t, n, o) => (e(), Reflect.apply(t, n, o))
            })
        }
        static hookCtx(e, t) {
            const n = CanvasRenderingContext2D.prototype;
            n[e] = new Proxy(n[e], {
                apply: (e, n, o) => ("CanvasKit-bypass" !== n.canvas.className && t(e, n, o), Reflect.apply(e, n, o))
            })
        }
        static overrideCtx(e, t) {
            const n = CanvasRenderingContext2D.prototype;
            n[e] = new Proxy(n[e], {
                apply: (e, n, o) => "CanvasKit-bypass" !== n.canvas.className ? t(e, n, o) : Reflect.apply(e, n, o)
            })
        }
        static hookPolygon(e, t) {}
    }
    class u extends EventTarget {
        emit(e, ...t) {
            this.dispatchEvent(new CustomEvent(e, {
                detail: t
            }))
        }
        on(e, t) {
            this.addEventListener(e, (e => Reflect.apply(t, this, e.detail)))
        }
        once(e, t) {
            this.addEventListener(e, (e => Reflect.apply(t, this, e.detail)), {
                once: !0
            })
        }
        off(e, t) {
            this.removeEventListener(e, t)
        }
    }
    class p {
        x;
        y;
        constructor(e, t) {
            this.x = e, this.y = t
        }
        static len(e) {
            return Math.sqrt(e.x ** 2 + e.y ** 2)
        }
        static round(e) {
            return new p(Math.round(e.x), Math.round(e.y))
        }
        static scale(e, t) {
            return new p(e * t.x, e * t.y)
        }
        static unscale(e, t) {
            return new p(t.x / e, t.y / e)
        }
        static add(e, t) {
            return new p(e.x + t.x, e.y + t.y)
        }
        static subtract(e, t) {
            return new p(e.x - t.x, e.y - t.y)
        }
        static multiply(e, t) {
            return new p(e.x * t.x, e.y * t.y)
        }
        static divide(e, t) {
            return new p(e.x / t.x, e.y / t.y)
        }
        static distance(e, t) {
            return p.len(p.subtract(e, t))
        }
        static centroid(...e) {
            const t = e.reduce(((e, t) => p.add(e, t)), new p(0, 0));
            return p.scale(1 / e.length, t)
        }
        static radius(...e) {
            const t = p.centroid(...e);
            return e.reduce(((e, n) => e + p.distance(t, n)), 0) / e.length
        }
    }! function(e) {
        e[e.Player = 0] = "Player", e[e.Bullet = 1] = "Bullet", e[e.Drone = 2] = "Drone", e[e.Trap = 3] = "Trap", e[e.Square = 4] = "Square", e[e.Triangle = 5] = "Triangle", e[e.Pentagon = 6] = "Pentagon", e[e.AlphaPentagon = 7] = "AlphaPentagon", e[e.Crasher = 8] = "Crasher", e[e.UNKNOWN = 9] = "UNKNOWN"
    }(i || (i = {})),
    function(e) {
        e.TeamBlue = "#00b2e1", e.TeamRed = "#f14e54", e.TeamPurple = "#bf7ff5", e.TeamGreen = "#00e16e", e.Square = "#ffe869", e.Triangle = "#fc7677", e.Pentagon = "#768dfc", e.AlphaPentagon = "#768dfc", e.Crasher = "#f177dd", e.NecromancerDrone = "#fcc376"
    }(l || (l = {}));
    const m = new class extends u {#t = !1;#n;
            constructor() {
                super(), d.hookRAF((() => this.#o()))
            }#o() {
                this.#t || void 0 === input || (this.#t = !0, this.#r()), super.emit("frame"), super.emit("frame_end")
            }#r() {
                setTimeout((() => super.emit("ready")), 100), this.#n = document.querySelector("d-base").shadowRoot, new MutationObserver(((e, t) => {
                    e.forEach((e => {
                        0 !== e.addedNodes.length && (super.emit("state", this.state), super.emit(`s_${this.state}`))
                    }))
                })).observe(this.#n, {
                    childList: !0
                })
            }
            get state() {
                return _Player.screen
            }
            get inHome() {
                return this.state == Screens.loading
            }
            get inGame() {
                return this.state == Screens.inGame
            }
            get inStats() {
                return this.state == Screens.gameOver
            }
            get inLoading() {
                return this.state == Screens.loading
            }
            get isCaptcha() {
                return "captcha" == this.state
            }
        },
        h = new class {#a = 1;
            constructor() {
                setInterval((() => {
                    const e = p.divide(g.minimapDim, g.viewportDim),
                        t = p.multiply(e, f.screenToCanvas(new p(innerWidth, innerHeight))),
                        n = f.toArenaUnits(t);
                    this.#a = n.x
                }), 16)
            }
            get size() {
                return this.#a
            }
            scale(e) {
                const t = e => Math.round(this.#a * (e - .5));
                return new p(t(e.x), t(e.y))
            }
            unscale(e) {
                const t = e => e / this.#a + .5;
                return new p(t(e.x), t(e.y))
            }
        },
        f = new class {#s = 1;#i = !1;
            constructor() {
                Player.wfs(Screens.home).then((() => {
                    input.set_convar = new Proxy(input.set_convar, {
                        apply: (e, t, n) => {
                            "ren_solid_background" === n[0] ? this.#i = n[1] : Reflect.apply(e, t, n)
                        }
                    })
                }))
            }
            get windowRatio() {
                return Math.max(innerWidth / 1920, innerHeight / 1080)
            }
            get scalingFactor() {
                return this.#s
            }
            get fov() {
                return this.#s / this.windowRatio
            }
            toArenaUnits(e) {
                return p.round(p.unscale(this.#s, e))
            }
            toCanvasUnits(e) {
                return p.round(p.scale(this.#s, e))
            }
            toArenaPos(e) {
                const t = p.subtract(e, this.screenToCanvas(new p(innerWidth / 2, innerHeight / 2))),
                    n = this.toArenaUnits(t);
                return p.add(n, w.position)
            }
            toCanvasPos(e) {
                const t = p.subtract(e, w.position),
                    n = this.toCanvasUnits(t);
                return p.add(n, this.screenToCanvas(new p(innerWidth / 2, innerHeight / 2)))
            }
            screenToCanvasUnits(e) {
                return e * devicePixelRatio
            }
            canvasToScreenUnits(e) {
                return e / devicePixelRatio
            }
            screenToCanvas(e) {
                return p.scale(devicePixelRatio, e)
            }
            canvasToScreen(e) {
                return p.scale(1 / devicePixelRatio, e)
            }
        },
        g = new class {#l = new p(1, 1);#c = new p(0, 0);#d = new p(1, 1);#u = new p(1, 1);#p = new p(.5, .5);#m = !1;
            constructor() {
                Player.wfs(Screens.home).then((() => {
                    input.set_convar("ren_minimap_viewport", "true"), input.set_convar = new Proxy(input.set_convar, {
                        apply: (e, t, n) => {
                            if ("ren_minimap_viewport" !== n[0]) return Reflect.apply(e, t, n);
                            this.#m = n[1]
                        }
                    })
                })), this.#h(), this.#f(), this.#g()
            }
            get minimapDim() {
                return this.#l
            }
            get minimapPos() {
                return this.#c
            }
            get viewportDim() {
                return this.#d
            }
            get viewportPos() {
                return this.#u
            }
            get arrowPos() {
                return this.#p
            }#h() {
                d.hookCtx("strokeRect", ((e, t, n) => {
                    const o = t.getTransform();
                    this.#l = new p(o.a, o.d), this.#c = new p(o.e, o.f)
                }))
            }#f() {
                d.overrideCtx("fillRect", ((e, t, n) => {
                    const o = t.getTransform();
                    return .1 !== t.globalAlpha || Math.abs(o.a / o.d - innerWidth / innerHeight) > innerWidth / innerHeight * 5e-5 ? Reflect.apply(e, t, n) : (this.#d = new p(o.a, o.d), this.#u = new p(o.e, o.f), this.#m ? Reflect.apply(e, t, n) : void 0)
                }))
            }#g() {
                d.hookPolygon(3, ((e, t) => {
                    const n = Math.round(p.distance(e[0], e[1])),
                        o = Math.round(p.distance(e[0], e[2])),
                        r = Math.round(p.distance(e[1], e[2]));
                    if (n === o && o === r) return;
                    const a = p.centroid(...e),
                        s = p.subtract(a, this.#c),
                        i = p.divide(s, this.#l);
                    this.#p = i
                }))
            }
        },
        w = new class {#w;
            constructor() {
                m.on("frame_end", (() => {
                    const e = p.add(g.viewportPos, p.unscale(2, g.viewportDim)),
                        t = p.subtract(e, g.minimapPos),
                        n = p.divide(t, g.minimapDim);
                    this.#w = h.scale(n)
                }))
            }
            get position() {
                return this.#w
            }
        };
    const y = new Object;
    for (let e in t) try {
        t[e]._builds.forEach((e => {
            var t = e.p;
            const {
                name: n,
                desc: o,
                build: r
            } = e;
            y[t] || (y[t] = []), y[t].push({
                name: n,
                desc: o,
                build: r
            })
        }))
    } catch (e) {}
    var _ = window.myWin_.document.getElementById("myUL");
    await new Promise((e => {
            var t = setInterval((() => {
                (_ = window.myWin_.document.getElementById("myUL")) && (e(), clearInterval(t))
            }))
        })),
        function({
            obj: e,
            func: t = function() {}
        }) {
            if (!t) throw "func must be property of object";
            for (let n in e || this) t((e || this)[n], n)
        }({
            obj: y,
            func: function(e, t) {
                try {
                    function n(e) {
                        return document.createElement(e)
                    }
                    _ = window.myWin_.document.getElementById("myUL");
                    let l = _myWin_.window.$;
                    var o = n("span");
                    o.id = `dropDown_${t}`, o.className = "classBuild", o.innerText = t;
                    var r = `dropDown_${t.split(" ").join("_")}_div`;
                    o.onclick = function() {
                        console.log(l(`#dropDown_${t.split(" ").join("_")}_div`)), l(`#dropDown_${t.split(" ").join("_")}_div`).toggle(2e3, "swing")
                    };
                    var a = n("div");
                    a.id = r, console.log({
                        a: e,
                        b: t
                    }), e.forEach((e => {
                        var {
                            name: o,
                            build: r,
                            desc: s
                        } = e, i = n("div"), l = n("input");
                        l.type = "button", l.value = "Select Build";
                        var c = n("span");
                        c.innerText = `Name:${o}\nDesc:${s}`, i.append(l), i.append(n("br")), e.p = t, l.onclick = function() {
                            ! function(e) {
                                var t = new Build;
                                t.buildSet(e.build);
                                var n = "Tank:" + e.p + "\n\nPath:" + t.BuildPath + "\n\nName:" + e.name + "\nBuild:" + Object.keys(e.build).map((t => e.build[t])).join(" / ") + "\n\nDesc:" + e.desc;
                                upgrade = window.upgrade = t.BuildPath, _upgrade = t.BuildPath, console.log(n), console.log(e), console.log({
                                    _upgrade: _upgrade,
                                    upgrade: upgrade
                                }), GM_setValue("u", _upgrade);
                                for (let t in e.build) try {
                                    var o = e.build[t] / 7;
                                    o *= 100, _myWin_.document.getElementsByClassName(`${t}_`)[0].innerText = e.build[t], _myWin_.document.getElementsByClassName(t)[0].style.width = `${o}%`
                                } catch (e) {
                                    log_("Error", e.message), console.error({
                                        err: e,
                                        i: t,
                                        p: `${o}%`,
                                        text: `${t}_`
                                    })
                                }
                            }(e)
                        }, i.append(c), a.append(i), a.append(n("br"))
                    }));
                    var s = n("li"),
                        i = n("div");
                    i.append(o), s.append(i), s.append(a), _.append(s), l(`#dropDown_${t.split(" ").join("_")}_div`).toggle()
                } catch (c) {
                    log_("Warning", c.message)
                }
            }
        }), set_convar("ren_health_bars", !0), set_convar("ren_raw_health_values", !0), set_convar("ren_stroke_soft_color", !1), set_convar("ren_solid_background", !0), otherStuff.colors.map((e => `${e.name} ${e.index?`
            $ {
                e.index
            }
            $ {
                e.default
            }
            `:e.default}`)).forEach(execute), execute("net_replace_color 0 0x000000"), execute("net_force_secure true"), execute("net_replace_color 1 0x999999"), execute("net_replace_color 2 0x050505"), execute("net_replace_color 3 0x0000FF"), execute("net_replace_color 4 0xFF0000"), execute("net_replace_color 5 0x990099"), execute("net_replace_color 6 0x00FF00"), execute("net_replace_color 8 0xFFFF00"), execute("net_replace_color 9 0xFFBBBB"), execute("net_replace_color 10 0xCCCCFF"), execute("net_replace_color 11 0xFF69B4"), execute("net_replace_color 12 0xFFFF00"), execute("net_replace_color 14 0x888888"), execute("net_replace_color 16 0xBBBB00"), execute("net_replace_color 17 0x777777"), execute("ren_stroke_solid_color 0xFFFFFF"), execute("ren_stroke_soft_color_intensity .5"), execute("ren_health_background_color 0x8c8c8c"), execute("ren_minimap_background_color 0xFFFFFF"), execute("ren_background_color 0x333231"), execute("ren_border_color 0xffffff"), execute("ren_bar_background_color 0x8c8c8c"), execute("net_replace_color 14 0x595959"), execute("ren_stroke_solid_color 0xFFFFFF"), execute("net_replace_color 15 0x8B0000"), shapes = Object.keys(colors).map((e => [colors[e], e]));
    var b = Player.screen;

    function x(e, t) {
        const n = e[0] - t[0],
            o = e[1] - t[1];
        return [Math.hypot(n, o), n, o]
    }
    extended.update = async function(e) {
        "in-game-screen" == e && "users" != b && (AutoUpgrade.status && execute(`game_stats_build ${_upgrade}`), autoPlay && (Player.down(75), await sleep(4e3), Player.up(75))), "stats" == e && (Firing.status && (Firing.toggle(), log_("AutoFire", "off")), AutoSpawn.status && (log_("PlayerStatus", "Spawning into game"), await sleep(5e3), await Player.spawn()))
    }, testList = {
        f: {},
        s: {}
    }, Firing.status, aim = function(e, t, n = !1) {
        var o;
        input.mouse(e, t), o = n, !Firing.status && o ? (log_("AutoFire", "on"), Firing.toggle(), Player.send(69)) : !o && Firing.status && (Firing.toggle(), Player.send(69), log_("AutoFire", "off"))
    };
    playerPos = [0, 0], enemies = [], buttlets = [], enemies2 = [], TempotherList = {};
    let v = [],
        S = [],
        k = [];
    squares = [];
    let P = [];
    triangles = [];
    let F = [],
        C = [];
    crashers = [], pentagons = [], sortedShapes = [];
    let T = [];
    autoPlay = !1, setTimeout((function e() {
        window.requestAnimationFrame(e), squares = P, triangles = F, pentagons = T, enemies = v, enemies2 = k, otherList = infothingy, crashers = C, infothingy = {
            text: []
        }, P = [], F = [], T = [], v = [], k = [], C = [], O = 0, I = [], M = [], otherList["Others (FFA)"], sortedShapes = function(e) {
            if (!e.length) return e;

            function t(e) {
                const [t, n] = e[0], o = E.width / 2, r = E.height / 2;
                return Math.sqrt((t - o) ** 2 + (n - r) ** 2)
            }
            const n = e.filter((e => "BARRELS" === e[3].toUpperCase())).sort(((e, n) => t(e) - t(n))),
                o = e.filter((e => "PENTAGON" === e[3].toUpperCase())).sort(((e, n) => t(e) - t(n))),
                r = e.filter((e => "TRIANGLE" === e[3].toUpperCase())).sort(((e, n) => t(e) - t(n))),
                a = e.filter((e => "SQUARE" === e[3].toUpperCase())).sort(((e, n) => t(e) - t(n)));
            return [...n, ...o, ...r, ...a]
        }([...enemies, ...crashers, ...pentagons, ...triangles, ...squares]).filter((e => !e.shape || !e.shape[1].includes("Body (You)"))), rt = {
            Screens: Screens,
            screen: _Player || Player ? (window._Player || Player).screen : null,
            autoPlay_: !!autoPlay_,
            targetShape: sortedShapes && sortedShapes[0] ? sortedShapes[0] : [],
            shape: sortedShapes && sortedShapes[0] ? sortedShapes[0].shape : []
        }
    }), 100);
    const E = document.getElementById("canvas");
    E.getContext("2d");

    function B(e, t) {
        window.requestAnimationFrame((function n() {
            window.requestAnimationFrame(n);
            const o = CanvasRenderingContext2D.prototype[e];
            o.toString().includes(e) && (CanvasRenderingContext2D.prototype[e] = new Proxy(o, {
                apply: (e, n, o) => (t(n, o), Reflect.apply(e, n, o))
            }))
        }))
    }

    function R(e, t, n, o) {
        return t.getTransform().transformPoint(new DOMPoint(n, o))
    }
    determineDirection = function(e, t) {
        const [n, o] = e[0];
        innerWidth, innerHeight;
        const r = innerWidth / 2,
            a = innerHeight / 2;
        Math.sqrt((n - r) ** 2 + (o - a) ** 2) <= t ? (n < r && o < a || n > r && o < a ? Player.down(40) : (n < r && o > a || n > r && o > a) && Player.down(38), n < r && o < a ? Player.down(37) : n > r && o < a ? Player.down(39) : n < r && o > a ? Player.down(37) : n > r && o > a && Player.down(39)) : (Player.up(38), Player.up(40), Player.up(37), Player.up(39))
    }, logCtx = !1;
    let A = 0,
        N = [];
    var U = [],
        L = [],
        j = !1,
        D = [],
        M = [],
        O = 0,
        I = [];
    B("beginPath", (function(e, t) {
        M = [], pos_ = [], A = 1, N = [], U = [], L = [], shapes = Object.keys(colors).map((e => [colors[e], e]))
    })), B("fillText", (function(e, t) {
        var n = R(t, e, ...t);
        infothingy.text.push({
            args: t,
            x: n.x,
            y: n.y
        })
    })), B("fillRect", (function(e, t) {
        shapes = Object.keys(colors).map((e => [colors[e], e])), M.push(t)
    })), B("rect", (function(e, t) {
        L.push(t)
    })), B("moveTo", (function(e, t) {
        I.push(t), 1 == A ? (A += 1, N.push(t)) : A = 0, U.push(t)
    })), B("stroke", (function(e, t) {
        var n = {...e
        };
        shapes = Object.keys(colors).map((e => [colors[e], e])), n.x_y = M, n.arcs = O, n.lines = I;
        for (let r = 0; r < shapes.length; r++) {
            let a = shapes[r][0].includes(e.fillStyle) || shapes[r][0].toUpperCase().includes(e.fillStyle.toUpperCase());
            if (shapes[r][0].includes(e.strokeStyle) || shapes[r][0].toUpperCase().includes(e.strokeStyle.toUpperCase()) || a) {
                n.shape = shapes[r][1], n.calls = A;
                var o = R(n.shape, e, ...t);
                n.pos = {
                    x: o.x,
                    y: o.y
                }, "Barrels" != n.shape || 3 != O && 6 != O || (n.pos = D, n.calledEnemyLast = j), "Barrels" == n.shape && logCtx && (console.log({
                    _this: n
                }, n), logCtx = !1), infothingy[n.shape] || (infothingy[n.shape] = []), !n.custom && infothingy[n.shape].push({...n
                });
                break
            }
        }
        j = !1
    })), B("lineTo", (function(e, t) {
        I.push(t), A >= 2 && A <= 6 ? (A += 1, N.push(t)) : A = 0, U.push(t)
    })), B("fill", (function(e, t) {
        if (e.fillStyle, shapes = Object.keys(colors).map((e => [colors[e], e])), A >= 4 && A <= 6) {
            const t = function(e) {
                    let t = [0, 0];
                    return e.forEach((e => {
                        t[0] += e[0], t[1] += e[1]
                    })), t[0] /= e.length, t[1] /= e.length, t
                }(N),
                n = 4 == A ? triangles : 5 == A ? squares : pentagons;
            if (e.globalAlpha < 1) return;
            let o = [
                [0, 0], 0
            ];
            for (let e = 0; e < n.length; e++) {
                const r = x(o[0], t)[0];
                x(n[e][0], t)[0] < r && (o = n[e])
            }
            if (x(o[0], t)[0] < 50 && (o[2] && (o[2] == e.fillStyle ? o[1]++ : o[1] = 0), o[1] > 2)) return;
            let r = [t, o[1], e.fillStyle];
            if (r.shape = shapes.filter((t => t[0].toUpperCase() == e.fillStyle.toUpperCase()))[0], j = !1, 4 == A) {
                if (colors["Body (You)"].toUpperCase() == e.fillStyle.toUpperCase() || "#000000" == e.fillStyle) return;
                colors.Crashers.toUpperCase() == e.fillStyle.toUpperCase() ? (r.push("Crashers"), C.push(r)) : (r.push("triangle"), F.push(r))
            } else 5 == A ? (r.push("square"), P.push(r)) : (r.push("pentagon"), T.push(r))
        } else A = 0
    })), B("arc", (function(e, t) {
        const n = e.getTransform();
        $ = new p(n.e, n.f), W = n.a, z = i.Player;
        f.toArenaUnits(new p(W, W)).x;
        O++;
        const o = e.getTransform();
        shapes = Object.keys(colors).map((e => [colors[e], e]));
        let r = [
            [o.e, o.f], 0, e.fillStyle
        ];
        D = r[0], r.arcs = O, r.shape = shapes.filter((t => t[0].toUpperCase() == e.fillStyle.toUpperCase()))[0], r.shape && !r.shape[1].includes("You") && (W < 40 ? S.push([$, W, z, q]) : (r.calls = A, r.push("Barrels"), r.push(W), v.push(r), j = !0))
    }));
    var q, $, W, z;
    return "EZ"
}().then(console.log, console.warn).catch((e => console.warn(e)));
var mouseInteraction = 1;
document.onkeydown = function(e) {
    88 == e.keyCode && (mouseInteraction ? (document.body.style.pointerEvents = "none", mouseInteraction = !1) : (document.body.style.pointerEvents = "auto", mouseInteraction = !0))
}, window.s = A;