https://chat.bossmanjack.com/

Submitted URL:
https://chat.bossmanjack.com/
Report Finished:

The outgoing links identified from the page

JavaScript Variables · 35 found

Global JavaScript variables loaded on the window object of a page, are variables declared outside of functions and accessible from anywhere in the code within the current scope

Console log messages · 3 found

Messages logged to the web console

HTML

The raw HTML body of the page

<html><head>
    <meta charset="UTF-8">
    <meta name="description" content="BossmanJack Discord Bridge">
    <meta name="keywords" content="bossmanjack, austin, peterson, curtis, bmj, kf, discord, chat, discord server, curtis, bmj, server">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta property="og:image" content="https://chat.bossmanjack.com/assets/bmjclown.gif">
    <meta name="twitter:image" content="https://chat.bossmanjack.com/assets/bmjclown.gif">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/tokyo-night-dark.min.css">
    <link rel="icon" href="/favicon.ico">
    </head><body><svg style="display:none" xmlns="http://www.w3.org/2000/svg">
        <defs>
            <symbol id="attachment-icon" viewBox="0 0 720 960">
                <path fill="#f4f5fb" d="M50,935a25,25,0,0,1-25-25V50A25,25,0,0,1,50,25H519.6L695,201.32V910a25,25,0,0,1-25,25Z"></path>
                <path fill="#7789c4" d="M509.21,50,670,211.63V910H50V50H509.21M530,0H50A50,50,0,0,0,0,50V910a50,50,0,0,0,50,50H670a50,50,0,0,0,50-50h0V191Z"></path>
                <path fill="#f4f5fb" d="M530,215a25,25,0,0,1-25-25V50a25,25,0,0,1,16.23-23.41L693.41,198.77A25,25,0,0,1,670,215Z"></path>
                <path fill="#7789c4" d="M530,70.71,649.29,190H530V70.71M530,0a50,50,0,0,0-50,50V190a50,50,0,0,0,50,50H670a50,50,0,0,0,50-50Z"></path>
            </symbol>
            <symbol id="join-icon" viewBox="0 0 18 18">
                <path fill="#3ba55c" d="m0 8h14.2l-3.6-3.6 1.4-1.4 6 6-6 6-1.4-1.4 3.6-3.6h-14.2"></path>
            </symbol>
            <symbol id="leave-icon" viewBox="0 0 18 18">
                <path fill="#ed4245" d="m3.8 8 3.6-3.6-1.4-1.4-6 6 6 6 1.4-1.4-3.6-3.6h14.2v-2"></path>
            </symbol>
            <symbol id="call-icon" viewBox="0 0 18 18">
                <path fill="#3ba55c" fill-rule="evenodd" d="M17.7163041 15.36645368c-.0190957.02699568-1.9039523 2.6680735-2.9957762 2.63320406-3.0676659-.09785935-6.6733809-3.07188394-9.15694343-5.548738C3.08002193 9.9740657.09772497 6.3791404 0 3.3061316v-.024746C0 2.2060575 2.61386252.3152347 2.64082114.2972376c.7110335-.4971705 1.4917101-.3149497 1.80959713.1372281.19320342.2744561 2.19712724 3.2811005 2.42290565 3.6489167.09884826.1608492.14714912.3554431.14714912.5702838 0 .2744561-.07975258.5770327-.23701117.8751101-.1527655.2902036-.65262318 1.1664385-.89862055 1.594995.2673396.3768148.94804468 1.26429792 2.351016 2.66357424 1.39173858 1.39027775 2.28923588 2.07641807 2.67002628 2.34187563.4302146-.2452108 1.3086162-.74238132 1.5972981-.89423205.5447887-.28682915 1.0907006-.31944893 1.4568885-.08661115.3459689.2182151 3.3383754 2.21027167 3.6225641 2.41611376.2695862.19234426.4144887.5399137.4144887.91672846 0 .2969525-.089862.61190215-.2808189.88523346"></path>
            </symbol>
            <symbol id="pencil-icon" viewBox="0 0 18 18">
                <path fill="#99aab5" d="m0 14.25v3.75h3.75l11.06-11.06-3.75-3.75zm17.71-10.21c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75z"></path>
            </symbol>
            <symbol id="pin-icon" viewBox="0 0 18 18">
                <path fill="#b9bbbe" d="m16.908 8.39684-8.29587-8.295827-1.18584 1.184157 1.18584 1.18584-4.14834 4.1475v.00167l-1.18583-1.18583-1.185 1.18583 3.55583 3.55502-4.740831 4.74 1.185001 1.185 4.74083-4.74 3.55581 3.555 1.185-1.185-1.185-1.185 4.1475-4.14836h.0009l1.185 1.185z"></path>
            </symbol>
            <symbol id="channel-icon" viewBox="0 0 24 24">
                <path fill="#b9bbbe" d="M5.88657 21C5.57547 21 5.3399 20.7189 5.39427 20.4126L6.00001 17H2.59511C2.28449 17 2.04905 16.7198 2.10259 16.4138L2.27759 15.4138C2.31946 15.1746 2.52722 15 2.77011 15H6.35001L7.41001 9H4.00511C3.69449 9 3.45905 8.71977 3.51259 8.41381L3.68759 7.41381C3.72946 7.17456 3.93722 7 4.18011 7H7.76001L8.39677 3.41262C8.43914 3.17391 8.64664 3 8.88907 3H9.87344C10.1845 3 10.4201 3.28107 10.3657 3.58738L9.76001 7H15.76L16.3968 3.41262C16.4391 3.17391 16.6466 3 16.8891 3H17.8734C18.1845 3 18.4201 3.28107 18.3657 3.58738L17.76 7H21.1649C21.4755 7 21.711 7.28023 21.6574 7.58619L21.4824 8.58619C21.4406 8.82544 21.2328 9 20.9899 9H17.41L16.35 15H19.7549C20.0655 15 20.301 15.2802 20.2474 15.5862L20.0724 16.5862C20.0306 16.8254 19.8228 17 19.5799 17H16L15.3632 20.5874C15.3209 20.8261 15.1134 21 14.8709 21H13.8866C13.5755 21 13.3399 20.7189 13.3943 20.4126L14 17H8.00001L7.36325 20.5874C7.32088 20.8261 7.11337 21 6.87094 21H5.88657ZM9.41045 9L8.35045 15H14.3504L15.4104 9H9.41045Z"></path>
            </symbol>
            <symbol id="thread-icon" viewBox="0 0 24 24">
                <path fill="#b9bbbe" d="M5.43309 21C5.35842 21 5.30189 20.9325 5.31494 20.859L5.99991 17H2.14274C2.06819 17 2.01168 16.9327 2.02453 16.8593L2.33253 15.0993C2.34258 15.0419 2.39244 15 2.45074 15H6.34991L7.40991 9H3.55274C3.47819 9 3.42168 8.93274 3.43453 8.85931L3.74253 7.09931C3.75258 7.04189 3.80244 7 3.86074 7H7.75991L8.45234 3.09903C8.46251 3.04174 8.51231 3 8.57049 3H10.3267C10.4014 3 10.4579 3.06746 10.4449 3.14097L9.75991 7H15.7599L16.4523 3.09903C16.4625 3.04174 16.5123 3 16.5705 3H18.3267C18.4014 3 18.4579 3.06746 18.4449 3.14097L17.7599 7H21.6171C21.6916 7 21.7481 7.06725 21.7353 7.14069L21.4273 8.90069C21.4172 8.95811 21.3674 9 21.3091 9H17.4099L17.0495 11.04H15.05L15.4104 9H9.41035L8.35035 15H10.5599V17H7.99991L7.30749 20.901C7.29732 20.9583 7.24752 21 7.18934 21H5.43309Z"></path>
                <path fill="#b9bbbe" d="M13.4399 12.96C12.9097 12.96 12.4799 13.3898 12.4799 13.92V20.2213C12.4799 20.7515 12.9097 21.1813 13.4399 21.1813H14.3999C14.5325 21.1813 14.6399 21.2887 14.6399 21.4213V23.4597C14.6399 23.6677 14.8865 23.7773 15.0408 23.6378L17.4858 21.4289C17.6622 21.2695 17.8916 21.1813 18.1294 21.1813H22.5599C23.0901 21.1813 23.5199 20.7515 23.5199 20.2213V13.92C23.5199 13.3898 23.0901 12.96 22.5599 12.96H13.4399Z"></path>
            </symbol>
        </defs>
    </svg>
    <style type="text/css">@font-face {font-family:Roboto Mono;font-style:normal;font-weight:100 700;src:url(/cf-fonts/v/roboto-mono/5.0.16/latin-ext/wght/normal.woff2);unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;font-display:swap;}@font-face {font-family:Roboto Mono;font-style:normal;font-weight:100 700;src:url(/cf-fonts/v/roboto-mono/5.0.16/greek/wght/normal.woff2);unicode-range:U+0370-03FF;font-display:swap;}@font-face {font-family:Roboto Mono;font-style:normal;font-weight:100 700;src:url(/cf-fonts/v/roboto-mono/5.0.16/vietnamese/wght/normal.woff2);unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;font-display:swap;}@font-face {font-family:Roboto Mono;font-style:normal;font-weight:100 700;src:url(/cf-fonts/v/roboto-mono/5.0.16/cyrillic-ext/wght/normal.woff2);unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;font-display:swap;}@font-face {font-family:Roboto Mono;font-style:normal;font-weight:100 700;src:url(/cf-fonts/v/roboto-mono/5.0.16/cyrillic/wght/normal.woff2);unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;font-display:swap;}@font-face {font-family:Roboto Mono;font-style:normal;font-weight:100 700;src:url(/cf-fonts/v/roboto-mono/5.0.16/latin/wght/normal.woff2);unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;font-display:swap;}@font-face {font-family:Roboto Mono;font-style:italic;font-weight:100 700;src:url(/cf-fonts/v/roboto-mono/5.0.16/latin-ext/wght/italic.woff2);unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;font-display:swap;}@font-face {font-family:Roboto Mono;font-style:italic;font-weight:100 700;src:url(/cf-fonts/v/roboto-mono/5.0.16/greek/wght/italic.woff2);unicode-range:U+0370-03FF;font-display:swap;}@font-face {font-family:Roboto Mono;font-style:italic;font-weight:100 700;src:url(/cf-fonts/v/roboto-mono/5.0.16/cyrillic-ext/wght/italic.woff2);unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;font-display:swap;}@font-face {font-family:Roboto Mono;font-style:italic;font-weight:100 700;src:url(/cf-fonts/v/roboto-mono/5.0.16/latin/wght/italic.woff2);unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;font-display:swap;}@font-face {font-family:Roboto Mono;font-style:italic;font-weight:100 700;src:url(/cf-fonts/v/roboto-mono/5.0.16/vietnamese/wght/italic.woff2);unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;font-display:swap;}@font-face {font-family:Roboto Mono;font-style:italic;font-weight:100 700;src:url(/cf-fonts/v/roboto-mono/5.0.16/cyrillic/wght/italic.woff2);unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;font-display:swap;}</style>
    <link rel="preload" href="/assets/ggsans/ggsans-normal-400.woff2" as="font" type="font/woff2" crossorigin="">
    <link rel="preload" href="/assets/ggsans/ggsans-normal-500.woff2" as="font" type="font/woff2" crossorigin="">
    <link rel="preload" href="/assets/ggsans/ggsans-normal-600.woff2" as="font" type="font/woff2" crossorigin="">
    <link rel="preload" href="/assets/ggsans/ggsans-normal-700.woff2" as="font" type="font/woff2" crossorigin="">
    <link rel="preload" href="/assets/ggsans/ggsans-normal-800.woff2" as="font" type="font/woff2" crossorigin="">
    <meta name="viewport" content="width=device-width, initial-scale=1">


<style>
    @font-face {
        src: url("/assets/ggsans/ggsans-normal-400.woff2");
        font-family: gg sans;
        font-weight: 400;
        font-style: normal
    }

    @font-face {
        src: url("/assets/ggsans/ggsans-normal-500.woff2");
        font-family: gg sans;
        font-weight: 500;
        font-style: normal
    }

    @font-face {
        src: url("/assets/ggsans/ggsans-normal-600.woff2");
        font-family: gg sans;
        font-weight: 600;
        font-style: normal
    }

    @font-face {
        src: url("/assets/ggsans/ggsans-normal-700.woff2");
        font-family: gg sans;
        font-weight: 700;
        font-style: normal
    }

    @font-face {
        src: url("/assets/ggsans/ggsans-normal-800.woff2");
        font-family: gg sans;
        font-weight: 800;
        font-style: normal
    }

    @font-face {
        src: url("/assets/ggsans/ggsans-italic-400.woff2");
        font-family: gg sans;
        font-weight: 400;
        font-style: italic
    }

    @font-face {
        src: url("/assets/ggsans/ggsans-italic-500.woff2");
        font-family: gg sans;
        font-weight: 500;
        font-style: italic
    }

    @font-face {
        src: url("/assets/ggsans/ggsans-italic-600.woff2");
        font-family: gg sans;
        font-weight: 600;
        font-style: italic
    }

    @font-face {
        src: url("/assets/ggsans/ggsans-italic-700.woff2");
        font-family: gg sans;
        font-weight: 700;
        font-style: italic
    }

    @font-face {
        src: url("/assets/ggsans/ggsans-italic-800.woff2");
        font-family: gg sans;
        font-weight: 800;
        font-style: italic
    }

    html,
    body {
        margin: 0;
        padding: 0;
        background-color: #36393e;
        color: #dcddde;
        font-family: "gg sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
        font-size: 17px;
        font-weight: 400;
    }

    .chatlog a {
        color: #00aff4;
        text-decoration: none
    }

    a:hover {
        text-decoration: underline
    }

    img {
        object-fit: contain;
        image-rendering: high-quality;
        image-rendering: -webkit-optimize-contrast
    }

    .preamble {
        display: grid;
        grid-template-columns: auto 1fr;
        max-width: 100%;
        padding: 1rem
    }

    .preamble__guild-icon-container {
        grid-column: 1
    }

    .preamble__guild-icon {
        max-width: 88px;
        max-height: 88px
    }

    .preamble__entries-container {
        grid-column: 2;
        margin-left: 1rem
    }

    .preamble__entry {
        margin-bottom: 0.15rem;
        color: #ffffff;
        font-size: 1.4rem
    }

    .preamble__entry--small {
        font-size: 1rem
    }

    .chatlog {
        width: 100%;
    }

    .chatlog__message-group {
        margin-bottom: 1rem
    }

    .chatlog__message-container {
        background-color: transparent;
        transition: background-color 1s ease
    }

    .chatlog__message-container--highlighted {
        background-color: rgba(114, 137, 218, 0.2)
    }

    .chatlog__message-container--pinned {
        background-color: rgba(249, 168, 37, 0.05)
    }

    .chatlog__message {
        display: grid;
        grid-template-columns: auto 1fr;
        padding: 0.15rem 0;
        direction: ltr;
        unicode-bidi: bidi-override
    }

    .chatlog__message:hover {
        background-color: #32353b
    }

    .chatlog__message-aside {
        grid-column: 1;
        width: 72px;
        padding: 0.15rem 0.15rem 0 0.15rem;
        text-align: center
    }

    .chatlog__reply-symbol {
        height: 10px;
        margin: 6px 4px 4px 36px;
        border-left: 2px solid #4f545c;
        border-top: 2px solid #4f545c;
        border-radius: 8px 0 0 0
    }

    .chatlog__avatar {
        width: 40px;
        height: 40px;
        border-radius: 50%
    }

    .chatlog__message:hover .chatlog__short-timestamp {
        display: block
    }

    .chatlog__short-timestamp {
        display: none;
        color: #a3a6aa;
        font-size: 0.75rem;
        font-weight: 500;
        direction: ltr;
        unicode-bidi: bidi-override
    }

    .chatlog__message-primary {
        grid-column: 2;
        min-width: 0
    }

    .chatlog__reply {
        display: flex;
        margin-bottom: 0.15rem;
        align-items: center;
        color: #b5b6b8;
        font-size: 0.875rem;
        white-space: nowrap;
        text-overflow: ellipsis
    }

    .chatlog__reply-avatar {
        width: 16px;
        height: 16px;
        margin-right: 0.25rem;
        border-radius: 50%
    }

    .chatlog__reply-author {
        margin-right: 0.3rem;
        font-weight: 600;
        cursor: pointer;
    }

    .chatlog__reply-author:hover {
        text-decoration: underline;
    }

    .chatlog__reply-content {
        text-overflow: ellipsis
    }

    .chatlog__reply-link {
        cursor: pointer
    }

    .chatlog__reply-link * {
        display: inline;
        pointer-events: none
    }

    .chatlog__reply-link .chatlog__markdown-quote {
        display: inline
    }

    .chatlog__reply-link .chatlog__markdown-pre {
        display: inline
    }

    .chatlog__reply-link:hover {
        color: #ffffff
    }

    .chatlog__reply-link:hover *:not(.chatlog__markdown-spoiler) {
        color: inherit
    }

    .chatlog__reply-edited-timestamp {
        margin-left: 0.25rem;
        color: #a3a6aa;
        font-size: 0.75rem;
        font-weight: 500;
        direction: ltr;
        unicode-bidi: bidi-override
    }

    .chatlog__system-notification-icon {
        width: 18px;
        height: 18px
    }

    .chatlog__system-notification-author {
        font-weight: 500;
        color: #ffffff
    }

    .chatlog__system-notification-content {
        color: #96989d
    }

    .chatlog__system-notification-link {
        font-weight: 500;
        color: #ffffff
    }

    .chatlog__system-notification-timestamp {
        margin-left: 0.3rem;
        color: #a3a6aa;
        font-size: 0.75rem;
        font-weight: 500;
        direction: ltr;
        unicode-bidi: bidi-override
    }

    .chatlog__system-notification-timestamp a {
        color: inherit
    }

    .chatlog__author {
        font-weight: 500;
        color: #ffffff;
        cursor: pointer;
    }

    .chatlog__author:hover {
        text-decoration: underline;
    }

    .chatlog__author-tag {
        position: relative;
        top: -0.1rem;
        margin-left: 0.3rem;
        padding: 0.05rem 0.3rem;
        border-radius: 3px;
        background-color: #5865F2;
        color: #ffffff;
        font-size: 0.625rem;
        font-weight: 500;
        line-height: 1.3
    }

    .chatlog__timestamp {
        margin-left: 0.3rem;
        color: #a3a6aa;
        font-size: 0.75rem;
        font-weight: 500;
        direction: ltr;
        unicode-bidi: bidi-override;
    }

    .chatlog__timestamp span {
        cursor: default;
    }

    .chatlog__timestamp a {
        color: inherit
    }

    .chatlog__content {
        padding-right: 1rem;
        font-size: 0.95rem;
        word-wrap: break-word;
        line-height: 1.2
    }

    .chatlog__edited-timestamp {
        margin-left: 0.15rem;
        color: #a3a6aa;
        font-size: 0.75rem;
        font-weight: 500
    }

    .chatlog__attachment {
        position: relative;
        width: fit-content;
        margin-top: 0.3rem;
        border-radius: 3px;
        overflow: hidden
    }

    .chatlog__attachment--hidden {
        cursor: pointer;
        box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.1)
    }

    .chatlog__attachment--hidden * {
        pointer-events: none
    }

    .chatlog__attachment-spoiler-caption {
        display: none;
        position: absolute;
        left: 50%;
        top: 50%;
        z-index: 999;
        padding: 0.4rem 0.8rem;
        border-radius: 20px;
        transform: translate(-50%, -50%);
        background-color: rgba(0, 0, 0, 0.9);
        color: #dcddde;
        font-size: 0.9rem;
        font-weight: 600;
        letter-spacing: 0.05rem
    }

    .chatlog__attachment--hidden .chatlog__attachment-spoiler-caption {
        display: block
    }

    .chatlog__attachment--hidden:hover .chatlog__attachment-spoiler-caption {
        color: #fff
    }

    .chatlog__attachment-media {
        max-width: 45vw;
        max-height: 500px;
        vertical-align: top;
        border-radius: 3px
    }

    .chatlog__attachment--hidden .chatlog__attachment-media {
        filter: blur(44px)
    }

    .chatlog__attachment-generic {
        max-width: 520px;
        width: 100%;
        height: 40px;
        padding: 10px;
        border: 1px solid #292b2f;
        border-radius: 3px;
        background-color: #2f3136;
        overflow: hidden
    }

    .chatlog__attachment--hidden .chatlog__attachment-generic {
        filter: blur(44px)
    }

    .chatlog__attachment-generic-icon {
        float: left;
        width: 30px;
        height: 100%;
        margin-right: 10px
    }

    .chatlog__attachment-generic-size {
        color: #72767d;
        font-size: 12px
    }

    .chatlog__attachment-generic-name {
        overflow: hidden;
        white-space: nowrap;
        text-overflow: ellipsis
    }

    .chatlog__embed {
        display: flex;
        margin-top: 0.3rem;
        max-width: 520px
    }

    .chatlog__embed-color-pill {
        flex-shrink: 0;
        width: 0.25rem;
        border-top-left-radius: 3px;
        border-bottom-left-radius: 3px
    }

    .chatlog__embed-color-pill--default {
        background-color: #202225
    }

    .chatlog__embed-content-container {
        display: flex;
        flex-direction: column;
        padding: 0.5rem 0.6rem;
        border: 1px solid rgba(46, 48, 54, 0.6);
        border-top-right-radius: 3px;
        border-bottom-right-radius: 3px;
        background-color: rgba(46, 48, 54, 0.3)
    }

    .chatlog__embed-content {
        display: flex;
        width: 100%
    }

    .chatlog__embed-text {
        flex: 1
    }

    .chatlog__embed-author-container {
        display: flex;
        margin-bottom: 0.5rem;
        align-items: center
    }

    .chatlog__embed-author-icon {
        width: 20px;
        height: 20px;
        margin-right: 0.5rem;
        border-radius: 50%
    }

    .chatlog__embed-author {
        color: #ffffff;
        font-size: 0.875rem;
        font-weight: 600;
        direction: ltr;
        unicode-bidi: bidi-override
    }

    a .chatlog__embed-title {
        color: rgb(0, 168, 252) !important
    }

    .chatlog__embed-author-link {
        color: #ffffff
    }

    .chatlog__embed-title {
        margin-bottom: 0.5rem;
        color: #ffffff;
        font-size: 0.875rem;
        font-weight: 600
    }

    .chatlog__embed-description {
        color: #dcddde;
        font-weight: 500;
        font-size: 0.85rem
    }

    .chatlog__embed-fields {
        display: flex;
        flex-wrap: wrap;
        gap: 0 0.5rem
    }

    .chatlog__embed-field {
        flex: 0;
        min-width: 100%;
        max-width: 506px;
        padding-top: 0.6rem;
        font-size: 0.875rem
    }

    .chatlog__embed-field--inline {
        flex: 1;
        flex-basis: 30%;
        min-width: 50px
    }

    .chatlog__embed-field-name {
        margin-bottom: 0.2rem;
        color: #ffffff;
        font-weight: 600
    }

    .chatlog__embed-field-value {
        color: #dcddde;
        font-weight: 500
    }

    .chatlog__embed-thumbnail {
        flex: 0;
        max-width: 80px;
        max-height: 80px;
        margin-left: 1.2rem;
        border-radius: 3px
    }

    .chatlog__embed-images {
        display: grid;
        margin-top: 0.6rem;
        grid-template-columns: repeat(2, 1fr);
        gap: 0.25rem
    }

    .chatlog__embed-images--single {
        display: block
    }

    .chatlog__embed-image {
        object-fit: cover;
        object-position: center;
        max-width: 500px;
        max-height: 400px;
        width: 100%;
        height: 100%;
        border-radius: 3px
    }

    .chatlog__embed-footer {
        margin-top: 0.6rem;
        color: #dcddde
    }

    .chatlog__embed-footer span {
        margin-left: 6px;
    }

    .chatlog__embed-footer-icon {
        width: 20px;
        height: 20px;
        margin-right: 0.2rem;
        border-radius: 50%;
        vertical-align: middle;

        display: inline-block !important;
    }

    .chatlog__embed-footer-text {
        vertical-align: middle;
        font-size: 0.75rem;
        font-weight: 500
    }

    .chatlog__embed-invite-container {
        min-width: 320px;
        padding: 0.6rem 0.7rem;
        border: 1px solid rgba(46, 48, 54, 0.6);
        border-radius: 3px;
        background-color: rgba(46, 48, 54, 0.3)
    }

    .chatlog__embed-invite-title {
        margin: 0 0 0.8rem 0;
        color: #b9bbbe;
        font-size: 0.75rem;
        font-weight: 700;
        text-transform: uppercase
    }

    .chatlog__embed-invite {
        display: flex
    }

    .chatlog__embed-invite-guild-icon {
        width: 50px;
        height: 50px;
        border-radius: 0.85rem
    }

    .chatlog__embed-invite-info {
        margin-left: 1rem
    }

    .chatlog__embed-invite-guild-name {
        color: #ffffff;
        font-weight: 600
    }

    .chatlog__embed-invite-guild-name a {
        color: inherit
    }

    .chatlog__embed-invite-channel-icon {
        width: 18px;
        height: 18px;
        vertical-align: bottom
    }

    .chatlog__embed-invite-channel-name {
        font-size: 0.9rem;
        font-weight: 600
    }

    .chatlog__embed-generic-image {
        object-fit: contain;
        object-position: left;
        max-width: 45vw;
        max-height: 500px;
        vertical-align: top;
        border-radius: 3px
    }

    .chatlog__embed-generic-video {
        object-fit: contain;
        object-position: left;
        max-width: 45vw;
        max-height: 500px;
        vertical-align: top;
        border-radius: 3px
    }

    .chatlog__embed-generic-gifv {
        object-fit: contain;
        object-position: left;
        max-width: 45vw;
        max-height: 500px;
        vertical-align: top;
        border-radius: 3px
    }

    .chatlog__embed-spotify {
        border: 0
    }

    .chatlog__embed-twitch {
        border: 0
    }

    .chatlog__embed-youtube-container {
        margin-top: 0.6rem
    }

    .chatlog__embed-youtube {
        border: 0;
        border-radius: 3px
    }

    .chatlog__sticker {
        width: 180px;
        height: 180px
    }

    .chatlog__sticker--media {
        max-width: 100%;
        max-height: 100%
    }

    .chatlog__reactions {
        display: flex;
        user-select: none;
        flex-wrap: wrap;
    }

    .chatlog__reaction {
        display: flex;
        margin: 0.35rem 0.1rem 0.1rem 0;
        padding: 0.125rem 0.375rem;
        border: 1px solid transparent;
        border-radius: 8px;
        background-color: #2f3136;
        align-items: center;
        cursor: pointer;
    }

    .chatlog__reaction:hover {
        border: 1px solid hsla(0, 0%, 100%, .2);
        background-color: transparent
    }

    .chatlog__reaction-count {
        min-width: 9px;
        margin-left: 0.35rem;
        color: #b9bbbe;
        font-size: 0.875rem
    }

    .chatlog__reaction:hover .chatlog__reaction-count {
        color: #dcddde
    }

    .chatlog__markdown {
        max-width: 100%;
        line-height: 1.3;
        overflow-wrap: break-word
    }

    .chatlog__markdown h1 {
        margin: 1rem 0 0.5rem;
        color: #f2f3f5;
        font-size: 1.5rem;
        line-height: 1
    }

    .chatlog__markdown h2 {
        margin: 1rem 0 0.5rem;
        color: #f2f3f5;
        font-size: 1.25rem;
        line-height: 1
    }

    .chatlog__markdown h3 {
        margin: 1rem 0 0.5rem;
        color: #f2f3f5;
        font-size: 1rem;
        line-height: 1
    }

    .chatlog__markdown h1:first-child,
    h2:first-child,
    h3:first-child {
        margin-top: 0.5rem
    }

    .chatlog__markdown ul,
    ol {
        margin: 0 0 0 1rem;
        padding: 0
    }

    .chatlog__markdown-preserve {
        white-space: pre-wrap
    }

    .chatlog__markdown-spoiler {
        background-color: rgba(255, 255, 255, 0.1);
        padding: 0 2px;
        border-radius: 3px
    }

    .chatlog__markdown-spoiler--hidden {
        cursor: pointer;
        background-color: #202225;
        color: rgba(0, 0, 0, 0)
    }

    .chatlog__markdown-spoiler--hidden:hover {
        background-color: rgba(32, 34, 37, 0.8)
    }

    .chatlog__markdown-spoiler--hidden::selection {
        color: rgba(0, 0, 0, 0)
    }

    .chatlog__markdown-quote {
        display: flex;
        margin: 0.05rem 0
    }

    .chatlog__markdown-quote-border {
        margin-right: 0.5rem;
        border: 2px solid #4f545c;
        border-radius: 3px
    }

    .chatlog__markdown-pre {
        background-color: #2f3136;
        font-family: "Consolas", "Courier New", Courier, monospace;
        font-size: 0.85rem;
        text-decoration: inherit
    }

    .chatlog__markdown-pre--multiline {
        display: block;
        margin-top: 0.25rem;
        padding: 0.5rem;
        border: 2px solid #282b30;
        border-radius: 5px;
        color: #b9bbbe
    }

    .chatlog__markdown-pre--multiline.hljs {
        background-color: #2f3136;
        color: #b9bbbe
    }

    .chatlog__markdown-pre--inline {
        display: inline-block;
        padding: 2px;
        border-radius: 3px
    }

    .chatlog__markdown-mention {
        border-radius: 3px;
        padding: 0 2px;
        background-color: rgba(88, 101, 242, .3);
        color: #dee0fc;
        font-weight: 500
    }

    .chatlog__markdown-mention:hover {
        background-color: #5865f2;
        color: #ffffff
    }

    .chatlog__markdown-timestamp {
        background-color: rgba(255, 255, 255, 0.1);
        padding: 0 2px;
        border-radius: 3px
    }

    .chatlog__emoji {
        width: 1.325rem;
        height: 1.325rem;
        margin: 0 0.06rem;
        vertical-align: -0.4rem
    }

    .chatlog__emoji--small {
        width: 1rem;
        height: 1rem
    }

    .chatlog__emoji--large {
        width: 2.8rem;
        height: 2.8rem
    }

    .postamble {
        padding: 1.25rem
    }

    .postamble__entry {
        color: #ffffff
    }
</style>
<style>
    pre {
        margin-top: 8px;
        margin-bottom: 8px;
        max-width: 640px;
        white-space: pre-wrap;
    }

    .d-spoiler {
        color: transparent;
        background-color: rgb(35, 35, 35);
        transition: 0.2s ease;
        border-radius: 4px;
        padding: 2px;
        cursor: pointer;
        user-select: none;
    }

    .d-spoiler:hover {
        background-color: rgb(45, 45, 45);
    }

    .d-spoiler.d-spoiler-reveal {
        color: #DCDDDE !important;
        background-color: rgb(65, 65, 65) !important;
        user-select: auto !important;
        cursor: auto;
    }

    .d-mention {
        border-radius: 3px;
        padding: 0 2px;
        color: #dee0fc;
        background: rgba(88, 101, 242, .3);
        font-weight: 500;
        cursor: pointer;
    }

    .d-mention:hover {
        background: rgba(88, 101, 242, .6);
    }

    .emoji,
    .d-emoji {
        position: relative;
        margin-top: 0px !important;
        display: inline !important;

        width: auto;
        width: 0.87rem;
    }

    /* i'm not a web developer i have no idea */
    span:not(.emojimsg) .emoji,
    span:not(.emojimsg) .d-emoji {
        position: relative;
        top: 2px;
        transform: scale(1.4);
        margin: 0 3px 0 3px;
    }

    .emojimsg .emoji,
    .emojimsg .d-emoji {
        width: 48px !important;
    }

    span.chatlog__reply-content {
        cursor: pointer;
        text-overflow: ellipsis;
        max-width: 97vw;
        overflow: hidden;
    }

    span.chatlog__reply-content:hover {
        color: #ffffff;
    }

    .chatlog__message--highlighted {
        background-color: rgba(114, 137, 218, 0.2) !important;
    }

    .chatlog__message-primary img {
        display: block;
    }

    code {
        background-color: rgb(35, 35, 35);
        padding: 2px;
    }

    .chatlog__message--deleted {
        color: rgb(255, 90, 90);
        background: rgba(255, 0, 0, 0.08);
    }

    .chatlog__message--deleted .chatlog__timestamp:after {
        content: " (deleted)";
        color: rgb(255, 90, 90);
    }

    .chatlog__message--edited .chatlog__markdown-preserve:after {
        content: " (edited)";
        font-size: 0.55rem;
        color: rgb(125, 125, 125);
    }

    .chatlog__message--deleted .chatlog__short-timestamp {
        display: block;
        color: transparent;
    }

    .chatlog__message--deleted .chatlog__short-timestamp:after {
        display: block;
        position: relative;
        top: -17px;
        left: 12px;
        width: 0px;
        height: 0px;
        content: " (deleted)";
        color: rgb(255, 90, 90);
    }

    pre code.hljs {
        padding: 0.5em;
    }

    /* lord please forgive me for the emojis stuff i do not know what i am doing */
    .chatlog__reaction .emoji,
    .chatlog__reaction .d-emoji {
        position: relative;
        bottom: 2px;
        margin-right: 4px;
    }

    .chatlog {
        height: 100%;
        overflow-y: scroll;
    }

    .nav {
        font-family: 'Roboto Mono', monospace;
        background: #1e1f28;
        box-sizing: border-box;

        width: 100%;
        padding: 2px;
    }

    .nav .accent {
        color: #babaff;
    }

    .nav scontainer {
        display: flex;
        align-items: center;
    }

    .nav a#title {
        color: #BABAFF;
        user-select: none;
    }

    .nav a {
        color: rgb(250, 250, 250);
        text-decoration: none;
        display: inline-block;
        padding: 6px;
    }

    .nav a:hover {
        color: #BABAFF;
        transition: 0.1s ease;
    }

    .nav .right {
        margin-left: auto;
        float: right;
    }

    #live-status {
        color: #ff7a7a
    }

    #live-status.live {
        color: #66ff73
    }

    ::-webkit-scrollbar {
        width: 10px;
    }

    /* Track */
    ::-webkit-scrollbar-track {
        background: #1E1F28;
    }

    /* Handle */
    ::-webkit-scrollbar-thumb {
        background: #4c4f66;
    }

    /* Handle on hover */
    ::-webkit-scrollbar-thumb:hover {
        background: #8c91c0;
    }

    .preload-overlay {
        position: fixed;
        top: 60px;
        left: 0;
        width: 350px;
        height: 35px;
        background: #1e1f28;
        z-index: 9999;
        display: flex;
        justify-content: center;
        align-items: center;
        left: 50%;
        transform: translateX(-50%);

        transition: 0.1s ease;
    }

    .preload-overlay .progress-bar {
        position: absolute;
        bottom: 0px;
        left: 0px;
        height: 3px;
        background: #BABAFF;

        transition: 0.2s ease;
    }

    .main {
        display: flex;
        flex-flow: column;
    }

    .pocketwatch-modal {
        position: fixed;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        z-index: 99999;

        width: 80%;
        height: 70%;
        background: #1E1F28;
        padding: 12px;

        display: flex;
        flex-direction: column;
        align-items: center;
        text-align: center;

        border: 1px solid #BABAFF;
    }

    .donation-modal {
        position: fixed;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        z-index: 99999;

        width: 550px;
        height: 450px;
        background: #1E1F28;
        padding: 12px;

        display: flex;
        flex-direction: column;
        align-items: center;
        text-align: center;
        word-wrap: break-word;

        border: 1px solid #BABAFF;
    }

    .contact-modal {
        position: fixed;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        z-index: 99999;

        width: 350px;
        height: 100px;
        background: #1E1F28;
        padding: 12px;

        display: flex;
        flex-direction: column;
        align-items: center;
        text-align: center;
        word-wrap: break-word;

        border: 1px solid #BABAFF;
    }

    .donation-modal iframe {
        border: none;
    }

    .modal .close {
        position: absolute;
        top: 0;
        right: 0;
        padding: 8px 9px 8px 9px;
        cursor: pointer;
    }

    .modal .close:after {
        content: "✖";
        color: #BABAFF;
    }

    .modal-title {
        font-size: 1.5rem;
    }

    #crypto-name {
        color: #BABAFF;
    }

    .modal-overlay {
        display: flex;
        position: fixed;
        top: 0px;
        left: 0px;
        width: 100%;
        height: 100%;
        z-index: 99;

        background: rgba(0, 0, 0, 0.5);
    }

    .modal {
        font-family: 'Roboto Mono', monospace;
        visibility: hidden;
    }

    .modal.shown,
    .modal-overlay.shown {
        visibility: visible;
    }

    a.link {
        color: #babaff;
        text-decoration-color: transparent;
        transition: text-decoration-color 0.1s ease;
    }

    a.link:hover {
        text-decoration-color: #babaff;
    }
</style>
<script>
    const DONATION_WIDGET = "https://trocador.app/anonpay/?ticker_to=xmr&network_to=Mainnet&address=8BmuHRgaP1WMnp3CPSgv8YidinjBUePEFUKq2B4d3VuuVcTB3yt2epKW43VZzFxQY1VjG3kGFBMbscTL8dsrVNmH98b8SKi&fiat_equiv=USD&name=bossmanjack.com&description=donation&buttonbgcolor=B0B0F1&bgcolor=#1E1F28";
    const COLOR_ERROR = "#ff7a7a";
    const COLOR_DANGER = "#ffe666";
    const COLOR_SUCCESS = "#66ff73";

    function set_status_text(text) {
        document.querySelector(".nav #status").innerText = text;
    }

    function set_status_color(clr) {
        document.querySelector(".nav #status").style.color = clr;
    }

    const messages = [];
    const users = [];
    let socket;
    let SCROLL_TO_MESSAGE;
    let PRELOAD_LOCK = false;
    let first_conn = true;
    let CHANNEL;
    window.onload = () => {
        fetch("/api/general").then(res => res.text()).then((text) => {
            CHANNEL = text;
            set_status_color(COLOR_DANGER);
            set_status_text("connecting");
            setup_vitals(first_conn);
        });
    }

    function setup_vitals(first_conn) {
        socket = new WebSocket(location.href.includes("localhost") ? "/ws" : "wss://chat.bossmanjack.com/ws");

        // 😈
        const og_send = socket.send;
        socket.send = (data) => {
            og_send.call(socket, typeof (data) == "object" ? JSON.stringify(data) : data);
        }

        socket.onopen = (e) => {
            console.log("[open] Connection established");
            if (first_conn) {
                first_conn = false;
                request_messages(CHANNEL, 0);
            }

            subscribe_channel(CHANNEL);
            request_balances();
            request_live();
        }

        socket.onclose = () => {
            set_status_color(COLOR_DANGER);
            set_status_text("reconnecting");
            setTimeout(() => { setup_vitals(first_conn); }, 500);
        }

        socket.onmessage = (msg) => {
            const event = JSON.parse(msg.data);
            switch (event.type) {
                case "new_chat_message": {
                    const message = event.data;

                    messages.push(message);

                    const was_bottom = chat_scrolled_to_bottom();

                    const msg = render_message(message, document.querySelector(".chatlog"));

                    if (was_bottom) {
                        for (let img of msg.querySelectorAll("img")) {
                            img.onload = () => {
                                scroll_chat_to_bottom();
                            }
                        }

                        scroll_chat_to_bottom();
                        setTimeout(() => {
                            scroll_chat_to_bottom();
                        }, 50)
                    }

                    break;
                }

                case "chat_message_bulk": {
                    const new_messages = event.data;
                    if (new_messages.length == 0) {
                        return;
                    }

                    // run the loop twice to ensure mentions work
                    let messages_temp = [];
                    for (const message of new_messages) {
                        messages.push(message);
                    }

                    const to = document.createElement("div");
                    to.style.display = "none";
                    for (const message of new_messages) {
                        render_message(message, to);
                    }

                    // get all images and videos and preload them, once preloaded prepend the elem, also handle errors in case bad links
                    const media_elems = to.querySelectorAll("img");
                    let loaded = 0;

                    document.querySelector(".preload-overlay").style.opacity = 1;

                    const on_loaded = () => {
                        loaded++;

                        document.querySelector(".preload-overlay #preload-progress").style.width = `${(loaded / media_elems.length) * 100}%`;
                        document.querySelector(".preload-overlay #preload-count").innerText = `${loaded}/${media_elems.length}`;

                        if (loaded == media_elems.length) {
                            PRELOAD_LOCK = false;
                            to.style.display = "block";

                            document.querySelector(".preload-overlay").style.opacity = 0;
                            document.querySelector(".preload-overlay #preload-progress").style.width = `0%`;
                            get_chat_element().scrollTop = to.scrollHeight;

                            setTimeout(() => { // weird issue idk
                                get_chat_element().scrollTop = to.scrollHeight;
                            }, 20);
                        }
                    }

                    for (const media_elem of media_elems) {
                        if (media_elem.complete) {
                            on_loaded()
                        } else {
                            media_elem.onerror = on_loaded;
                            media_elem.onload = on_loaded;
                            media_elem.onabort = on_loaded;
                        }
                    }

                    document.querySelector(".chatlog").prepend(to);
                    break;
                }

                case "deleted_chat_message": {
                    const message_id = event.data;

                    const message_element = document.getElementById(`message-${message_id}`);
                    if (message_element) {
                        message_element.classList.add("chatlog__message--deleted");
                    }

                    break;
                }

                case "edited_chat_message": {
                    const data = event.data;
                    const message_element = document.getElementById(`message-${data.id}`);
                    if (message_element) {
                        message_element.classList.add("chatlog__message--edited");
                        const content = message_element.querySelector(".chatlog__markdown-preserve");
                        const was_bottom = chat_scrolled_to_bottom();

                        content.innerHTML = DOMPurify.sanitize(discordMarkdown.toHTML(data.new_text), { USE_PROFILES: { html: true } });

                        post_text_message_event(message_element, content);

                        if (was_bottom)
                            scroll_chat_to_bottom();
                    }

                    break;
                }

                case "update_reactions": {
                    const data = event.data;
                    const message_element = document.getElementById(`message-${data.id}`);
                    if (message_element) {
                        const was_bottom = chat_scrolled_to_bottom();

                        const reactions_container = message_element.querySelector(".chatlog__reactions");
                        reactions_container.remove();
                        message_element.querySelector(".chatlog__message-primary").appendChild(render_reactions(data.new_reactions));

                        if (was_bottom)
                            scroll_chat_to_bottom();
                    }

                    break;
                }

                case "update_balances": {
                    const data = event.data;

                    if (data.LTC)
                        document.getElementById("ltc-balance").innerText = data.LTC;

                    if (data.ETH)
                        document.getElementById("eth-balance").innerText = data.ETH;

                    if (data.USDT)
                        document.getElementById("usdt-balance").innerText = data.USDT;
                    break;
                }

                case "update_live": {
                    const data = event.data;
                    const live_status = document.getElementById("live-status");
                    if (data) {
                        live_status.innerText = "live";
                        live_status.classList.add("live");
                    } else {
                        live_status.innerText = "offline";
                        live_status.classList.remove("live");
                    }

                    break;
                }

                case "update_lurkers": {
                    const data = event.data;
                    set_status_text(`(${data} lurker${data == 1 ? "" : "s"})`);
                    set_status_color(COLOR_SUCCESS);
                    break;
                }

                case "user": {
                    const user = event.data;
                    if (!event.data)
                        return;

                    users.push(event.data);

                    const mentions_to_update = document.querySelectorAll(`.d-mention[data-userid="${user.author_userid}"]`);
                    for (let mention of mentions_to_update) {
                        mention.innerText = "@" + user.author_name;
                    }

                    break;
                }

                case "chart": {
                    const data = event.data;
                    if (!event.data)
                        return;

                    crypto_data[data.crypto] = data.data;
                    show_pocketwatch_modal(data.crypto);
                    break;
                }

                case "channel_created": {
                    location.reload();
                }
            }
        }
    }

    function request_messages(channel, page) {
        socket.send({
            type: "request_chat_message_bulk",
            data: {
                channel,
                page
            }
        });
    }

    function request_user(channel, userid) {
        socket.send({
            type: "request_user",
            data: {
                channel,
                userid
            }
        });
    }

    function subscribe_channel(channel) {
        socket.send({
            type: "subscribe_channel",
            data: {
                channel
            }
        });
    }

    function request_balances() {
        socket.send({
            type: "request_balances"
        });
    }

    function request_live() {
        socket.send({
            type: "request_live"
        });
    }

    function request_chart(crypto) {
        socket.send({
            type: "request_chart",
            data: {
                crypto
            }
        });
    }
</script>
<script src="/assets/discord-markdown.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dompurify/3.1.5/purify.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/hammer.js/2.0.8/hammer.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/chartjs-plugin-zoom/2.0.1/chartjs-plugin-zoom.min.js"></script>
<script src="/assets/twemoji.js"></script>


    <title>bmj hq</title>
    <div class="main" style="height:100%;">
        <div class="nav">
            <a id="title" href="javascript:;">bmj hq</a>
            <span>
                <a href="https://mines.expert/BossmanJack/Kees/?C=M&amp;O=D" target="_blank">vods</a>
            </span>

            <div class="right">
                <a id="status" style="color: rgb(255, 230, 102);" )="">connecting</a>
            </div>

            <div class="right">
                <a href="javascript:;" onclick="show_pocketwatch_modal('ETH')" id="eth">ETH: $<span id="eth-balance">0</span></a>
            </div>

            <div class="right">
                <a href="javascript:;" onclick="show_pocketwatch_modal('USDT')" id="usdt">USDT: $<span id="usdt-balance">0</span></a>
            </div>
            <!-- <a href="javascript:;" id="ltc">LTC: <span id="ltc-balance">$0</span></a> -->

            <div class="right">
                <a target="_blank" href="https://www.twitch.tv/thebossmanjack" id="twitch">twitch: <span id="live-status">offline</span></a>
            </div>
        </div>

        <div class="preload-overlay" style="opacity: 0">
            <span>preloading media (<span id="preload-count">0/0</span>)</span>
            <div class="progress-bar" id="preload-progress"></div>
        </div>

        <div class="loading-overlay" style="opacity: 0">
            <span id="loading-title"></span>
            <div class="progress-bar" id="loading-progress"></div>
        </div>

        <div class="modal-overlay modal" onclick="close_all_modals(event)">
            <div class="pocketwatch-modal modal">
                <span class="modal-title">bmj pocketwatch - <a class="link" href="https://3xpl.com/ethereum/transaction/0x147703cb2acd5a4768f3fca3598a4c38871519c26d74bb466653f0e4dfde5cbe" target="_blank" id="crypto-name">USDT</a></span>
                <div class="close" onclick="close_all_modals()"></div>
                <div style="height: 100%; width: 100%; overflow: hidden;">
                    <canvas id="chart"></canvas>
                </div>
                <span style="font-size: 0.5rem">historical data from <a class="link" target="_blank" href="https://3xpl.com">3xpl.com</a>, price data from <a class="link" target="_blank" href="https://coingecko.com/">coingecko</a></span>
                <span>this chart does not auto-update</span>
            </div>

            <div class="donation-modal modal">
                <span class="modal-title">donate</span>
                <div class="close" onclick="close_all_modals()"></div>
                <span>xmr</span>
                <div style="width: 100%;">
                    <span>8BmuHRgaP1WMnp3CPSgv8YidinjBUePEFUKq2B4d3VuuVcTB3yt2epKW43VZzFxQY1VjG3kGFBMbscTL8dsrVNmH98b8SKi</span>
                </div>

                <span id="other-widget-title">other (loading widget)</span>
                <iframe src="" width="400px" height="420px" loading="lazy"></iframe>
            </div>

            <div class="contact-modal modal">
                <span class="modal-title">contact</span>
                <div class="close" onclick="close_all_modals()"></div>
                <div style="width: 100%">
                    <span>feature request? other inquiry? email us</span>
                </div>
                <span>[email protected] </span>
            </div>
        </div>

        <div class="chatlog">

        </div>

        <div class="nav">
            <a href="javascript:;" onclick="show_donation_modal()">donate</a>
            <span class="right">
                <a href="javascript:;" onclick="show_contact_modal()">contact</a>
            </span>
        </div>
    </div>

    <script>
        Chart.defaults.font.family = "'Roboto Mono', monospace";
        Chart.defaults.font.size = 18;
        Chart.defaults.color = "rgb(165, 165, 165)";


        //Chart.defaults.font.lineHeight = 20;
        let crypto_data = {};

        function close_all_modals(e) {
            if (e && !e.target.classList.contains('modal-overlay'))
                return;

            document.querySelectorAll('.modal').forEach(modal => {
                modal.classList.remove('shown');
            });
        }

        let last_chart;
        function show_pocketwatch_modal(crypto_name) {
            console.log(crypto_name);
            if (!crypto_data[crypto_name]) {
                request_chart(crypto_name);
                return;
            }

            document.querySelector(".modal-overlay").classList.add("shown");
            document.querySelector(".pocketwatch-modal").classList.add("shown");

            const data = crypto_data[crypto_name];

            document.querySelector("#crypto-name").innerText = crypto_name;
            const labels = data.map(item => format_date(new Date(item.time)));
            const balances = data.map(item => parseFloat(item.balance_fiat).toFixed(2));

            if (last_chart)
                last_chart.destroy();

            const ctx = document.querySelector('.pocketwatch-modal #chart').getContext('2d');
            const chart = new Chart(ctx, {
                type: 'line',
                data: {
                    labels: labels,
                    datasets: [{
                        label: 'fiat',
                        data: balances,
                        borderColor: 'rgba(176, 176, 255, 1)',
                        backgroundColor: 'rgba(176, 176, 255, 0.2)',
                        fill: true,
                        tension: 0.02
                    }]
                },
                options: {
                    responsive: true,
                    maintainAspectRatio: false,
                    interaction: {
                        intersect: false,
                    },
                    scales: {
                        x: { // hide the scale
                            display: false,
                        },
                    },
                    plugins: {
                        legend: {
                            display: false,
                        },
                        zoom: {
                            zoom: {
                                wheel: {
                                    enabled: true,
                                },
                                pinch: {
                                    enabled: true
                                },
                                mode: 'x',
                            },
                            pan: {
                                wheel: {
                                    enabled: true,
                                },
                                pinch: {
                                    enabled: true
                                },
                                mode: 'x',
                                enabled: true
                            },
                        }
                    }
                }
            });
            last_chart = chart;
        }

        let load_widget_once = false;
        function show_donation_modal() {
            document.querySelector(".modal-overlay").classList.add("shown");
            document.querySelector(".donation-modal").classList.add("shown");

            if (!load_widget_once) {
                load_widget_once = true;
                const frame = document.querySelector(".donation-modal iframe");
                frame.src = DONATION_WIDGET;

                frame.onload = () => { document.querySelector("#other-widget-title").innerText = "other" };
            }
        }

        function show_contact_modal() {
            document.querySelector(".modal-overlay").classList.add("shown");
            document.querySelector(".contact-modal").classList.add("shown");
        }

        // infinite scroll
        let page = 1;
        get_chat_element().onscroll = (ev) => {
            if (get_chat_element().scrollTop == 0 && !PRELOAD_LOCK) {
                PRELOAD_LOCK = true;
                request_messages(CHANNEL, page++);
            }
        };


        function get_chat_element() {
            return document.querySelector(".chatlog");
        }

        function scroll_elem_to_bottom(elem) {
            elem.scrollTop = elem.scrollHeight;
        }

        function chat_scrolled_to_bottom() {
            const elem = get_chat_element();
            return elem.scrollHeight - elem.clientHeight <= elem.scrollTop + 1;
        }

        function scroll_chat_to_bottom() {
            const elem = get_chat_element();
            scroll_elem_to_bottom(elem);
        }

        function scroll_to_message(id, instant) {
            const obj = document.getElementById(`message-${id}`);

            if (obj) {
                if (instant)
                    return obj.scrollIntoView();

                obj.scrollIntoView({
                    behavior: "smooth",
                    block: "center",
                    inline: "nearest"
                });
            }
        }

        function highlight_message(id) {
            const obj = document.getElementById(`message-${id}`);

            if (obj) {
                obj.parentNode.classList.add('chatlog__message-container--highlighted');

                setTimeout(() => {
                    obj.parentNode.classList.remove('chatlog__message-container--highlighted');
                }, 2000);
            }
        }

        function format_date(date) {
            return date.toLocaleDateString([], {
                year: 'numeric',
                month: '2-digit',
                day: '2-digit',
                hour: '2-digit',
                minute: '2-digit'
            });
        }

        function format_time(date) {
            return date.toLocaleTimeString([], {
                hour: '2-digit',
                minute: '2-digit'
            });
        }

        function render_reactions(reactions) {
            const reactions_container = document.createElement('div');
            reactions_container.classList.add('chatlog__reactions');

            for (let [reaction, count] of Object.entries(reactions)) {
                console.log(reaction, count);
                const reaction_elem = document.createElement('div');
                reaction_elem.classList.add('chatlog__reaction');
                reactions_container.appendChild(reaction_elem);

                if (reaction.charCodeAt(0) < 255) {
                    reaction = `<:a:${reaction}>`;
                }

                const reaction_emoji = document.createElement('span');
                reaction_emoji.classList.add('emoji');
                reaction_emoji.innerHTML = discordMarkdown.toHTML(reaction);
                reaction_elem.appendChild(reaction_emoji);

                twemoji.parse(reaction_elem)

                const reaction_count = document.createElement('span');
                reaction_count.classList.add('chatlog__reaction-count');
                reaction_count.innerText = count;
                reaction_elem.appendChild(reaction_count);
            }

            return reactions_container;
        }

        function post_text_message_event(message, content) {
            // wack but i dont care enough, post callbacks
            for (let spoiler of content.querySelectorAll(".d-spoiler")) {
                spoiler.addEventListener("click", () => {
                    spoiler.classList.add("d-spoiler-reveal");
                });
            }

            // set all a[href] to blank
            for (let a of content.querySelectorAll("a")) {
                a.target = "_blank";
            }

            twemoji.parse(content);

            for (let twemoji of content.querySelectorAll(".emoji")) {
                twemoji.draggable = true;
            }

            for (let mention of message.querySelectorAll(".d-mention")) {
                const type = mention.innerText[0];
                switch (type) {
                    case "@": /* user */ {
                        const id = mention.innerText.slice(1);
                        mention.setAttribute("data-userid", id);

                        if (id == "everyone" || id == "here")
                            continue;

                        let mentioned_user = messages.find(m => m.author_userid == id);
                        if (!mentioned_user)
                            mentioned_user = users.find(u => u.id == id);

                        if (mentioned_user) {
                            mention.innerText = "@" + mentioned_user.author_name;
                        } else {
                            mention.innerText += " (invalid user)";
                            request_user(CHANNEL, id);
                        }
                        break;
                    }

                    case "#": /* channel */ {
                        mention.innerText += " (channel)";
                        break;
                    }
                }
            }

            if (content.innerText.trim() == "" && content.querySelectorAll(".emoji,.d-emoji").length != 0)
                content.classList.add("emojimsg");
        }

        let current_chatlog_group = null;
        let last_author = null;
        let last_message_time;
        let last_to;
        function render_message(msg, to) {
            const should_render_author =
                !current_chatlog_group ||
                last_author !== msg.author_name ||
                msg.reply_id != 0 ||
                msg.timestamp - last_message_time > 10 * 60 * 1000 ||
                to != last_to;

            last_to = to;
            if (should_render_author) {
                current_chatlog_group = document.createElement('div');
                current_chatlog_group.classList.add('chatlog__message-group');
                to.appendChild(current_chatlog_group);
            }

            last_message_time = msg.timestamp;

            const message_container = document.createElement('div');
            message_container.classList.add('chatlog__message-container');
            current_chatlog_group.appendChild(message_container);

            const message = document.createElement('div');
            message.id = `message-${msg.message_id}`;
            message.classList.add('chatlog__message');
            if (msg.deleted)
                message.classList.add('chatlog__message--deleted');
            if (msg.edited)
                message.classList.add('chatlog__message--edited');

            message_container.appendChild(message);

            const aside = document.createElement('div');
            aside.classList.add('chatlog__message-aside');
            message.appendChild(aside);

            if (msg.reply_id != 0) {
                const reply_symbol = document.createElement('div');
                reply_symbol.classList.add('chatlog__reply-symbol');
                aside.appendChild(reply_symbol);
            }

            if (should_render_author) {
                const avatar = document.createElement('img');
                avatar.classList.add('chatlog__avatar');
                avatar.src = msg.author_pfp;
                aside.appendChild(avatar);
            } else {
                const short_timestamp = document.createElement('span');
                short_timestamp.classList.add('chatlog__short-timestamp');
                short_timestamp.innerText = format_time(new Date(msg.timestamp));
                aside.appendChild(short_timestamp);
            }

            const primary = document.createElement('div');
            primary.classList.add('chatlog__message-primary');
            message.appendChild(primary);

            if (msg.reply_id != 0) {
                const replied_message = messages.find(m => m.message_id == msg.reply_id);
                const reply = document.createElement('div');
                reply.classList.add('chatlog__reply');
                primary.appendChild(reply);

                if (!replied_message) {
                    const reply_avatar = document.createElement('img');
                    reply_avatar.classList.add('chatlog__reply-avatar');
                    reply_avatar.style.backgroundColor = "black";
                    reply.appendChild(reply_avatar);

                    const reply_author = document.createElement('div');
                    reply_author.classList.add('chatlog__reply-author');
                    reply_author.innerText = "unknown user";
                    reply.appendChild(reply_author);

                    const reply_content = document.createElement('span');
                    reply_content.classList.add('chatlog__reply-content');
                    reply_content.innerText = "unknown message";
                    reply.appendChild(reply_content);
                } else {
                    const reply_avatar = document.createElement('img');
                    reply_avatar.classList.add('chatlog__reply-avatar');
                    reply_avatar.src = replied_message.author_pfp;
                    reply.appendChild(reply_avatar);

                    const reply_author = document.createElement('div');
                    reply_author.classList.add('chatlog__reply-author');
                    reply_author.innerText = replied_message.author_name;
                    reply_author.style.color = replied_message.author_color;
                    reply.appendChild(reply_author);

                    const reply_content = document.createElement('span');
                    reply_content.classList.add('chatlog__reply-content');
                    reply_content.onclick = () => {
                        scroll_to_message(replied_message.message_id);
                        highlight_message(replied_message.message_id);
                    }
                    reply_content.innerHTML = replied_message.content_json.text.length ?
                        DOMPurify.sanitize(discordMarkdown.toHTML(replied_message.content_json.text.replaceAll("\n", " ").trim()), { USE_PROFILES: { html: true } }) :
                        "no text content";

                    twemoji.parse(reply_content);

                    for (let a of reply_content.querySelectorAll("a")) {
                        console.log(reply_content);
                        a.removeAttribute("href");
                    }
                    reply.appendChild(reply_content);
                }
            }

            if (should_render_author) {
                const header = document.createElement('div');
                header.classList.add('chatlog__header');
                primary.appendChild(header);

                const author = document.createElement('span');
                author.classList.add('chatlog__author');
                author.innerText = msg.author_name;
                author.style.color = msg.author_color;
                header.appendChild(author);

                const timestamp_container = document.createElement('span');
                timestamp_container.classList.add('chatlog__timestamp');
                header.appendChild(timestamp_container);

                const timestamp = document.createElement('span');
                timestamp.innerText = format_date(new Date(msg.timestamp));
                timestamp_container.appendChild(timestamp);
            }

            let text = msg.content_json.text;
            const links = text.match(/https?:\/\/[^\s]+/g) || [];
            for (let link of links) {
                const url = new URL(link);
                const has_media = url.pathname.endsWith(".gif") || url.pathname.endsWith(".png");
                const is_video = url.pathname.endsWith(".mp4") || url.pathname.endsWith(".webm") || url.pathname.endsWith(".mov");
                const is_sound = url.pathname.endsWith(".mp3") || url.pathname.endsWith(".wav") || url.pathname.endsWith(".ogg");
                if (!has_media && !is_video && !link.startsWith("https://tenor.com") && !link.startsWith("https://gyazo.com"))
                    continue;

                const embed = msg.content_json.embeds.find(e => e.url.startsWith(link));
                let link_embed;

                if (is_video) {
                    console.log("we got video")
                    link_embed = document.createElement('video');
                    link_embed.controls = true;

                    if (embed) {
                        link_embed.src = embed.url;
                    } else if (link.startsWith("https://media.discordapp.net")) {
                        link_embed.src = link;
                    } else {
                        link_embed.remove();
                        link_embed = null;
                        continue;
                    }
                } else {
                    link_embed = document.createElement('img');
                    link_embed.classList.add("chatlog__attachment-media");

                    if (link.startsWith("https://tenor.com")) {
                        link_embed.src = "/api/tenor/" + link;
                    } else if (link.startsWith("https://gyazo.com")) {
                        link_embed.src = "/api/gyazo/" + link;
                    }
                    else if (embed) {
                        link_embed.src = embed.thumbnail.url;
                    }
                    else if (link.startsWith("https://media.discordapp.net")) {
                        link_embed.src = link;
                    }
                    else {
                        link_embed.remove();
                        link_embed = null;
                        continue;
                    }
                }

                if (link_embed) {
                    msg.content_json.embeds = msg.content_json.embeds.filter(e => e != embed);
                    text = text.replace(link, "");
                    primary.appendChild(link_embed);
                }
            }

            // render content with markdown
            const content_container = document.createElement('div');
            content_container.classList.add('chatlog__content');
            content_container.classList.add('chatlog__markdown');
            primary.appendChild(content_container);

            const content = document.createElement("span");
            content.classList.add("chatlog__markdown-preserve");
            content.innerHTML = DOMPurify.sanitize(discordMarkdown.toHTML(text.trim()), { USE_PROFILES: { html: true } });
            content_container.appendChild(content);

            for (let attachment of msg.content_json.attachments) {
                const attachment_container = document.createElement('div');
                attachment_container.classList.add('chatlog__attachment');
                primary.appendChild(attachment_container);

                if (attachment.content_type.startsWith('image')) {
                    const attachment_media = document.createElement('img');
                    attachment_media.classList.add('chatlog__attachment-media');
                    attachment_media.src = attachment.proxy_url;
                    attachment_container.appendChild(attachment_media);
                }

                else if (attachment.content_type.startsWith('video')) {
                    const attachment_media = document.createElement('video');
                    attachment_media.classList.add('chatlog__attachment-media');
                    attachment_media.src = attachment.proxy_url;
                    attachment_media.controls = true;
                    attachment_container.appendChild(attachment_media);
                }

                else if (attachment.content_type.startsWith('audio')) {
                    const attachment_media = document.createElement('audio');
                    attachment_media.classList.add('chatlog__attachment-media');
                    attachment_media.src = attachment.proxy_url;
                    attachment_media.controls = true;
                    attachment_container.appendChild(attachment_media);
                }

                else {
                    const warning = document.createElement('span');
                    warning.innerText = "THIS MESSAGE CONTAINS UNSUPPORTED ATTACHMENT TYPE " + attachment.content_type;
                    content.appendChild(warning);
                }
            }

            // purge tenor embeds
            msg.content_json.embeds = msg.content_json.embeds.filter((a) => { return !(a.url && a.url.includes("tenor.com")) });

            for (let embed of msg.content_json.embeds) {
                const embed_elem = document.createElement('div');
                embed_elem.classList.add('chatlog__embed');
                primary.appendChild(embed_elem);

                const color_pill = document.createElement('div');
                color_pill.classList.add('chatlog__embed-color-pill');
                if (embed.color != null) {
                    console.log(embed, embed.color);
                    color_pill.style.backgroundColor = "#" + embed.color.toString("16").padStart(6, '0');
                } else {
                    color_pill.classList.add('chatlog__embed-color-pill--default');
                }
                embed_elem.appendChild(color_pill);

                const content_container = document.createElement('div');
                content_container.classList.add('chatlog__embed-content-container');
                embed_elem.appendChild(content_container);

                const content = document.createElement('div');
                content.classList.add('chatlog__embed-content');
                content_container.appendChild(content);

                const text_content = document.createElement('div');
                text_content.classList.add('chatlog__embed-text');
                content.appendChild(text_content);

                if (embed.author) {
                    const author = document.createElement('div');
                    author.classList.add('chatlog__embed-author');
                    text_content.appendChild(author);

                    const author_name = document.createElement('span');
                    author_name.innerText = embed.author.name;
                    author.appendChild(author_name);
                }

                if (embed.title) {
                    const title = document.createElement('div');
                    title.classList.add('chatlog__embed-title');
                    title.innerHTML = DOMPurify.sanitize(discordMarkdown.toHTML(embed.title), { USE_PROFILES: { html: true } });

                    if (embed.url) {
                        const url_container = document.createElement('a');
                        url_container.href = embed.url;
                        url_container.target = "_blank";
                        url_container.appendChild(title);

                        text_content.appendChild(url_container);
                    } else {
                        text_content.appendChild(title);
                    }
                }

                if (embed.description) {
                    const description = document.createElement('div');
                    description.classList.add('chatlog__embed-description');
                    description.innerHTML = DOMPurify.sanitize(discordMarkdown.toHTML(embed.description), { USE_PROFILES: { html: true } });
                    text_content.appendChild(description);
                }

                if (embed.fields && embed.fields.length) {
                    const fields_container = document.createElement('div');
                    fields_container.classList.add('chatlog__embed-fields');
                    text_content.appendChild(fields_container);

                    for (let field of embed.fields) {
                        const field_elem = document.createElement('div');
                        field_elem.classList.add('chatlog__embed-field');
                        fields_container.appendChild(field_elem);

                        const field_name = document.createElement('div');
                        field_name.classList.add('chatlog__embed-field-name');
                        field_name.innerHTML = DOMPurify.sanitize(discordMarkdown.toHTML(field.name), { USE_PROFILES: { html: true } });
                        field_elem.appendChild(field_name);

                        const field_value = document.createElement('div');
                        field_value.classList.add('chatlog__embed-field-value');
                        field_value.innerHTML = DOMPurify.sanitize(discordMarkdown.toHTML(field.value), { USE_PROFILES: { html: true } });
                        field_elem.appendChild(field_value);

                        if (field.inline) {
                            field_elem.classList.add('chatlog__embed-field--inline');
                        }
                    }
                }

                if (embed.thumbnail && embed.thumbnail.proxyURL) {
                    const thumbnail = document.createElement('img');
                    thumbnail.classList.add('chatlog__embed-thumbnail');
                    thumbnail.src = embed.thumbnail.proxyURL;
                    content.appendChild(thumbnail);
                }

                if (embed.image && embed.image.proxyURL) {
                    const image = document.createElement('img');
                    image.classList.add('chatlog__embed-images--single');
                    image.src = embed.image.proxyURL;
                    text_content.appendChild(image);
                }

                if (embed.footer) {
                    const footer = document.createElement('div');
                    footer.classList.add('chatlog__embed-footer');
                    text_content.appendChild(footer);

                    if (embed.footer.icon_url) {
                        const footer_icon = document.createElement('img');
                        footer_icon.classList.add('chatlog__embed-footer-icon');
                        footer_icon.src = embed.footer.icon_url;
                        footer.appendChild(footer_icon);
                    }

                    const footer_text = document.createElement('span');
                    footer_text.classList.add('chatlog__embed-footer-text');
                    footer_text.innerText = embed.footer.text;
                    footer.appendChild(footer_text);

                    if (embed.timestamp) {
                        const footer_timestamp = document.createElement('span');
                        footer_timestamp.classList.add('chatlog__embed-footer-text');
                        footer_timestamp.innerText = format_date(new Date(embed.timestamp));
                        footer.appendChild(footer_timestamp);
                    }
                }
            }

            // reactions
            if (Object.keys(msg.content_json.reactions)) {
                primary.appendChild(render_reactions(msg.content_json.reactions));
            }


            // wack but i dont care enough, post callbacks
            post_text_message_event(message, content);

            last_author = msg.author_name;

            return message_container;
        }
    </script>

<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'8d391468f8732154',t:'MTcyOTA5MjUxNy4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script><iframe height="1" width="1" style="position: absolute; top: 0px; left: 0px; border: none; visibility: hidden;"></iframe>
</body></html>