<!DOCTYPE html>
<html lang="zh-CN"><head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>领取邀请码</title>
<link rel="preconnect" href="" crossorigin="">
<style>
  :root {
    /* 色板：只有黑 / 灰 / 白 + 一个强调蓝 */
    --ink: #111418;
    --paper: #ffffff;
    --muted: #8b8f98;
    --line: #e7e8ea;
    --fill: #f6f7f9;
    --accent: #1f78d1;
    --danger: #d83931;

    /* 间距刻度 4 的倍数 */
    --s1: 4px;
    --s2: 8px;
    --s3: 12px;
    --s4: 16px;
    --s5: 24px;
    --s6: 32px;

    --r-card: 22px;
    --r-box: 14px;
    --ease: cubic-bezier(.22, 1, .36, 1);
  }

  * { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }

  body {
    margin: 0;
    min-height: 100svh;
    padding: var(--s5);
    position: relative;
    display: grid;
    place-items: center;
    background: radial-gradient(120% 90% at 50% 0%, #1b2340 0%, #0b0f18 55%, #07090d 100%);
    font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", sans-serif;
    color: var(--ink);
    -webkit-font-smoothing: antialiased;
  }

  /* 动态着色器背景（WebGL 不支持时回落到 body 渐变） */
  .bg-canvas {
    position: fixed;
    inset: 0;
    z-index: 0;
    display: block;
    width: 100%;
    height: 100%;
    pointer-events: none;
  }

  .card {
    position: relative;
    z-index: 1;
    width: 100%;
    max-width: 400px;
    padding: var(--s6) var(--s5) var(--s5);
    background: var(--paper);
    border-radius: var(--r-card);
    box-shadow: 0 30px 70px rgba(0, 0, 0, .45);
  }

  .logo {
    position: absolute;
    top: var(--s5);
    right: var(--s5);
    height: 54px;
    width: auto;
  }

  h1 {
    margin: 0;
    font-family: "Songti SC", "Noto Serif SC", "Source Han Serif SC", Georgia, serif;
    font-size: 30px;
    font-weight: 600;
    letter-spacing: -.02em;
    line-height: 1.15;
  }

  .rule {
    display: block;
    width: 28px;
    height: 2px;
    margin-top: var(--s3);
    background: var(--accent);
  }

  /* 表单 */
  form { margin-top: var(--s5); }

  .field + .field { margin-top: var(--s4); }

  .label {
    display: block;
    font-size: 11px;
    letter-spacing: .14em;
    color: var(--muted);
    margin-bottom: var(--s2);
  }

  input {
    width: 100%;
    height: 40px;
    padding: 0;
    border: 0;
    border-bottom: 1px solid var(--line);
    border-radius: 0;
    background: transparent;
    font-size: 16px;
    color: var(--ink);
    outline: none;
    transition: border-color .25s;
  }
  input::placeholder { color: #b4b8bf; font-size: 14px; }
  input:focus { border-bottom-color: var(--accent); }
  input.is-error { border-bottom-color: var(--danger); }

  .msg {
    min-height: 14px;
    margin: 10px 0 0;
    font-size: 12px;
    line-height: 1.4;
    color: var(--danger);
    opacity: 0;
    transition: opacity .2s;
  }
  .msg.show { opacity: 1; }

  .btn {
    width: 100%;
    height: 48px;
    margin-top: var(--s3);
    border: 0;
    border-radius: 999px;
    background: var(--ink);
    color: #fff;
    font-family: inherit;
    font-size: 15px;
    letter-spacing: .02em;
    cursor: pointer;
    transition: background .25s, transform .25s var(--ease), opacity .2s;
  }
  .btn:hover:enabled { background: var(--accent); }
  .btn:active:enabled { transform: scale(.985); }
  .btn:disabled { opacity: .5; cursor: default; }

  /* 结果 */
  .result { display: none; margin-top: var(--s5); }
  .result.show { display: block; animation: rise .4s var(--ease); }

  @keyframes rise { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }

  .note {
    display: none;
    margin: 0 0 var(--s3);
    font-size: 12px;
    color: var(--muted);
  }
  .note.show { display: block; }

  .code-box {
    padding: var(--s5) var(--s4);
    background: var(--fill);
    border: 1px solid var(--line);
    border-radius: var(--r-box);
    text-align: center;
  }

  .code {
    display: block;
    font-family: "SF Mono", Menlo, Consolas, monospace;
    font-size: 26px;
    font-weight: 600;
    letter-spacing: .1em;
    color: var(--ink);
    word-break: break-all;
  }

  /* 领码成功后的入群引导 */
  .join {
    margin-top: var(--s5);
    padding-top: var(--s5);
    border-top: 1px solid var(--line);
    text-align: center;
  }
  .join-title {
    margin: 0;
    font-size: 13px;
    line-height: 1.5;
    color: var(--muted);
  }
  .qr-box {
    display: inline-block;
    margin-top: var(--s3);
    padding: var(--s2);
    background: var(--paper);
    border: 1px solid var(--line);
    border-radius: var(--r-box);
    line-height: 0;
  }
  .qr { display: block; width: 140px; height: 140px; }

  @media (max-width: 380px) {
    .card { padding: var(--s5) var(--s4) var(--s4); }
    h1 { font-size: 26px; }
    .code { font-size: 22px; }
  }

  @media (prefers-reduced-motion: reduce) {
    .result, input, .btn, .msg { animation: none !important; transition-duration: .01s !important; }
  }
</style>
</head>
<body>
<canvas class="bg-canvas" id="bg" aria-hidden="true"></canvas>

<div class="card">
  <img class="logo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAACoCAYAAAAy/QYeAAAj7ElEQVR42u1de5BkVX3+7qN7njuzu7C7LBDwAeoCgV1dCKCoQDCQGKPGJKXGJMZEU6bUhFTeZRIrlVLzNFpRQxKTMlVJTDQVNfgA5CEI8lQey7Ki6AILCxuWZXdnd6a7773543zH+Tzc7j6ne6bnzkyfqls9j9v3cc7v/B7f7wUMx3AMx3AMx3AMx3AMx0KOaPh+wxEy4uFGedaoLzWhRRWesGKV7cKCmyQG0JK5KJy5KZbyIZOK77QCq4ujJgBqAFIAeRXfv2o7eIQTtxq4SyFr0ALQpMjZDGAviaYO4CiJJ+P5S0pIaYV2Vw7gXAD/xMlbLXpMBOAIgAcAPA7gIIBvANgN4BkAh0RErQHQ4Pzkq53DxOQw1wM4Z6jzowFgH4B7AFwD4CYS1UGZr0g4z6ohmIS7JebLXwbg86IErnRrKHdEFET5dcetAP6b87NTrhNTWiwZ5xn0xEViNqYAruYEtvi5Go+cR0sO+79DAD4D4Cdk3jZw7tLVxIZTiqVLAMyR4xTD4/sE1HLmJQdwFefLjmkSkG7I+kommrX8/F9OSpMTlA+J5vtcd47z0pC/fRrA6SLmExJLjZtwxY5Jfv6Yw5KHBNOegOzcHATwHsF0NgJYv5IhilFR+CJaB5bLDInDn3C+DOCHKgadLKg5vUZYaV1k7sWciKEu43dksrm+R4sTJTrNsh9JGwU4JS6z2i2m0KMpc/YOEfUTK8WXVLThPBHRzzcNQwJ6Qs4B4DUklCsBHM85nBXPd75SnI81Ygv3AtgO4BTZOfkKPdSHFi3QJswBXEBz+7+oBB8RMb+ixhg/z1ulSmw/kEIuTktrfn+wX0U4WgZW0zRf+I0ATuDP6QrzWFvF9AwAZ/LnTfI/yw3SPu5jveGXA/gbcvDmSvS1TFP2rpaxFsDJAF4P4MMA7neU2VYfSPEsP9/UK6epOoeZADAjOk1KMXVoBcjfhO8TEYmtA3iCC5qSMEb5vhcC+GUAl4qzNgpcv0wU4kMAzgewg/eeWym7bUQmZrVYSJHs/jWOYXIxgM+VmM++HEbhiTvIuTeLZ3xM7lcbGpvLmxtpuMM7YWJlekXB7Xc+6hCHhlUMIYwVEAJSAzDFv70AxgVQ0BDIA7lNg9zmUgcNTisOtwyHBwgXSaDUCOYdtGMAruiR01jR9ACAY4l51YbcZeXma8Xilf6wEE0ewG0s0byXCvaGkqC24VghxkCNnGYzF/cjPcQP2fCRp2jKu9xsOBZht8dLaEmth3GZWBH1qR7Ekz33A7zG+DA/eXFxook28cmDGmvkvmMAvimhDiEuhCcAnErii5cjh4krTKRpRZ21gMntagREKebCZf60GwKcVDwgPBJq9zmiDqES/RyJc+1uXKTu6AK9HL2kCo8D+C7v/0rPDNJIznsegE/CoOvRcgrT7OdhNw0gq6GTSIxEp1go5+u0ZyC3PX8K8z6ohod4Ui7zWt5rtMqpsjosG30LgFfB+DmSNudFkv0XA9gF44nV92sB+Flea5/4proN6+irwaSs3grgLv7Ncp1WGwvmKEwMyqv53TjAq1wH8CSAB3m/owGSYJZcZj/n4QpPvSoSTvPTAD5L3Wh2ueguKYBbeoC8P+RsBHutry9AfMpRAF/BvKe31mYhJ3jfKxfgnjsB/DaJaKwL59IMyBoJZ1eAAmw36kMA1lWhFg08XtYu8qkADkjuTbPD0eI5De7ouug/APBc7riG5PP4HC35ec4JK7hCIPTJEp3wOJjQ0pbH83e6t72fDa9MOjgFI9G1nsO//W6gmW2J5kernnEQS/hCBOAXAgO/cxLFicJeLbj1Vv5/bgGj4ApiHqPEQlLZ3SkVzlYg6totC2AX9bPRLpmMkeg7p5MzZgGYTA7gz9oRTFwhvaXJBS5gYnjhaSVknKQ7Yeqq1OR7TXIYjW/tFE8LzxiWo9SL3ktCrfO+ERf0PP7cKQa5CBDPTRhn48fJsaY7cJqCm6MGE+/yNSco3EeX2SZxN5UeNR73BMhe9YfUKOtjTmoE4G6Ex4z4wOkNAIcBnMb7qcy/OoCDhCKyl5GIXuhhYo8RW/EVS/b99ziAYKWsJLtr5/hwZ8H4NVqez2e55E38foN/a3LC9ohFE8vO1kmcpNwfk9Ij6KIr5FRw3wPg18TK2MS/3yeWnFu7D8Q8JuS5Yk+85F0AbvMo7dak8nqz3MN3TPH57g3g9AO3iuwO/VU+4GzADt0lcSKRExYQi5Uxzp0zDRM7Oy3hkecC+I5wEJ975+SGVtlcB+Ak/m7vZTGNGu8zyb9t5WL66mp29z9O4p7wLNB0IkzOtS8HzQTWeBa4G1dEf2lxAgpBKJOAqPt7OSkjQjSa55PJbm9K+m1L9KevU0GeCdhVkZi7BUXUk7y2pv3Wxe+U8/xvA/hJAI966hj2nTYAeBE5aeKBJc1R5wpZD3VCRlUjGOUI62BSLSKPyShkUa+S6yTCXSC7pkGuNUuiOMyJtGLpNOIeV3kqfJEEMY1KBa1ZqVv3DH8/IscsTBB2AuBpmBhdXzdAIVUZ1jrPEZVU5LQB348FbIJCUOPKIb2x7K4WzcAtHnqERsE3REluldR8yx3CaZeeu4f3PBCAykYkvkMl/8u61K+LxbscMl8tgmv7SnQyONZgSgJ9IpBrAiYK71nfiSuQyGXZ9zMwlZRqEgTUbbFSsvY7HeLoJZGswcXf4uFg1O89LRB6yP3rvN95AaIiAvAIN4jP/VKH24Zw/KiKIQSFKIgJLSR9UZ+iz18jgaV91vfNiXWc6XEdTWK/0pMjli3IsQDO9vSA2/e9kfqaj5M27cPKqRzBRBIANEr95QLP51Lg6zrnO0WPonGOBDvhmMPt7h+TK11f4gz1EWXPwBT92eJRMbQQAt0l3DXyMI9PIkzhG3Bm5+9Q1QimcJDJM6jI+cScWKV4lsAc2niOQ4n3gkAiOyDlTwtHEffBjrbyPTLP0IoGgC/xeX0sn2co4jf3EKE4U1UryYYPXMpJyTxezO7me2EqZqd9wNjW7J6GqavnMy+WKO4h0YQGO1ku8+Oeuog9/7vigc67fC/moh8nkEXI5mlWNQxyluLoooBnshN4XZ/RYSpCNvIIidn5IjlbEnhPixJv90xLtWDatXzfSQ8CSKVUiu9GdNelcgRjzdKpQDkbi8KLPrmLvd+P0MzNPBcj6vH+9tnPoqjwEWP2OW/m70c9rm/R5+f3YITMtrPElppgLAaznbu7FUAwByiS+mmTE0nC/yschLibOHyQeEgtkGDs4p/Deze7rIPFUw7AoNHdCNT+b44Gxct7iN8+SFEfVxGHgegOCChbcScMrD7WB8Gk4se60DNVpJD77w8APxPRlwoALwvsC7ULxtflU5euznO2wjgR80ALabf4nyolkuzu2erxPIWD2l6FeZ9HrwST8TgPxkmXB+TkXNchrrdMiZziUdCcvsATbbcb5HoP8zuSMNGIGE89oOOJnd/bpWJVZThMLG7+LR5gWeGkRNjwgQN9crgjJNgRTzwkpg5xq4c40V17WHSPH4ZxIvpgN/b6Xw9UWAuYokEIDNgCTO0YVI3D2Em6lDsi85i4nLt6L0wTqsgj7aObH6uAKdQTYg7fT4KNu9SJ0+fT1jRbPZVdq4Tug8kg6OYULQSjOcHhYpFnz8mDAG4gzNCqolm9vcT73Mk7HXEHPO54ZX0Vu8ipn7cJxlMdgr/c5ugKPm36AINoT5BAowARcTdBu7UenNi+wxZyMV+zX+/1PZhY5aRKBJNRYX1xlwLP7fQHq/wdlJdtBVoqswBeQrHYCsgSvFZcA93GnCxyi0DatkACvYZc9RmPebKlai9x9D54hovcwe/sLuOe8RJ3LHkRTEpJEZCK0nDidHvRW6yyfVjYdjdT2irE/wcTDjoRaE7bUIOzCFRmHjqbdQdcFxieMALjRLUulMJjPqxX+8slqT9LQjCR0wQKMPkvdWGb3Z4nhontuL1PwA7CHc7x9F3lIo6eILHBkyvpYl8YyE0PEj6oe7zvODnaJgAvdUJVfbzneySOt/Td4gESS+IEfY8TLPOts2LFzc0w6HDchzltv3sc9Zc8IJzijkBH46jgL2vI0fIueoWKkhtgCv744DXrOa8XkYtngWv0EEx0XtTOVxUPOFDKjicoa7cF+o9AcZD1+eyR+Fk2eV7Pxtvc4tFYoyy6roBxBZzi+T37/2slY7Pb8x3gsdWBIHwV3msdMVYsZYhmIY62We60jQHBRzah6xbqD0cXgGBeKvX4O+Eh9hkfJv4S0gUk424/TItwlO/RTrconES8G0Uvme1AaIkUvn5p4EZMSJRXd+Oc6RLhL2Mwzr7UM2fGLthOyvMR8VIXPdzfVmV4vfRHhEfXl53cwWlg/E2D932N5/3seIRiQnOoOlljCZXdUwKjDyOYbIf7uumG6RIV9MtkF4T4OO6iPB/pM/TQVtj+H1osGl8Stbn/CFl20sN9bUrIdwD8i4iXqIO+VoPxV8XEU/ahu/9oluJobUAioNWn7qSCHVctRbZOU/qpgGR167B7k1hZ/cTATLUpPBQ7pepjgQESpy9lP2XOYknjiJwjdZLUNnsWKLIJ+p8MLGRgOde7pSgCqsJhEu6206nRZ/DLP4q5e77FxT7Yh4Vku68elHtHHWR+IT6jSIA4X+wlk3cY50KOS8J8VPKuqTgNH/fwatsU4XFPmKAMH7qhStwlEXEEmMI/PiU4MqeZwgQJJlpGPQKiHqt/Rg4kEXu4A17MxW8FFgO4lRyvq88pHnCt/CYf7PyA4sG5VEQ44qH8VWlkHSyhkCD5TNDpTvN7sXjdQ9wBtzu57EtOMC0xRU+U3J/Es85+BhMOWQSCUd0Q52QAcxA5oi/u4zq1Lgt/XqA4soR2vW+fgaVwDWwV+ewDXqW0EG53IH0sUABXPkDQsujjfrbOnirQNal6MY35rE0fFNpCFfsJF4x64FEDIRgNJRiD8aL61rO3k/sgrap4gfssFsu0XH0iIs+WMzmL+EvWQXdyK2YApkrVDvGNdQy2igeI8M6SaC4OYJu5VGdoCZq5mkcmLfeUQ14i+VkhRsHNntUyBiqSxqXg8YbAdJKWpKMWngWOV9Ow1btODVjT2AnH7DVUBIuJ7o4B+JUeqmM+ARNuiGFbllKoos75eTSwTl9OjCcojTYekP5yDEXSjway3ogYwWNSHTMf0sr3vd9rSDCnSVJcFFA65F6YSD5vn1w6AP0lgqmhshFhXlRIeKIbzR/1UaVhpY2jMGXxY0/kXP1HN4sl2qoCwUDSMs4lBhNaHfPOBSi42OBObGDlKcA55rMbo8BKVreGWovpAM3ql/XAmR6mSe3Gv4SU3srFw/w88edU1b1QSK3hdphOJHFFkwiv/5JQzN8WGNszEIKxoNXLAxbbLvIXYOI01vRQrkKVPOsdvpLWRLPC4qnogKMUTuqKrZK5NlB/SWCQ8/0kvEZVCCaS2NmzAsqpwsn2mwkgmEQmU0XbOTDVs6Nl0Jc582jiYTnRmHCIEK55Uy8tB9MB6C8ZF+tYj1RUdfE/Q4KJSgiiExqZtQmpuFCi7apOMEkP4jtEf2mSw+ShlbvSAekv50ni2JiH9zSGiU77dgnLzD3ybOCAhjlMwtpK7MkcBfrOYphQzHtkQ1fGzLTxumd77pxIXuAWqa6AHvw/NXFWnoT5lNzVDPzZDXmXWKtRFQgmElDpxIDSXFqh4Svo3xOdwMTQbIcBDzOs3o7vhVPqrfBUEQZCMApRXwDjdMw9KwikMEDf1/v0KCtxnBtqPmLluhOeIYdBGw6+ZCLJtqN7SWCzLPCFnugzxtQSSC2g2vZK5zC2VMlOmZ8lF0mxLNi0UwrM1wy/z1OEoUvkf079ZYtwL6zisAjAhLpq9N6Si6RCqiycBlNtqQgsrf7FXkw+xwqy93tFu+I4q5C7WO6tTtysCgQzwt18akCla8sBHg9ovtBO2a075VRRxZiPRVRsy44IJmvzfqmYgV6Cb7DAVb2b0rQqNLougQno2SvX6hVdthvi/B7wiioTVyccqdvfvwbjn6v16ohNF+FFbFLVJhiHYxaIXN7YZ+2XXJpNbINpd1d4YA6Fg5pGyzTUIXcATrsex1DZnevn3dIFZocNsWyey8VqeUbKWcj6dphktQkY51ioiJ2FqWy1ByadZTIgwzLj7vsYgE9TtOYD4jZFl42YyRwXHSqCZk6SmnWHrIMpQza2AKk6i+IH+QPpVJIFNPsc5TXG0F9IaAzgPwNDQm1Ht+1OvbgqiqSoJA98XBqSxmIx1sXpWkOfAcSL8TKxFAvKPVvsAibf+jPkNL3G70YCe78swEKzOtSDPNIexGmIXlEEnFeUlD5rJ5LaYWKJAHWVyaG2BHMMrR3foOQqHJYLfQo/2CRzqg9OE0k9GD3i5ZyigAXODpilKbshsLUdFiHIO6TfoZY4XSe5P4cWsFQbVkJOy2LoL2dKHf4Qi2OpgptsYNchmMDoEWHvKx27WVKzOif7vrAH7GOpAS9bw24fuWTDU2/AastvWWgc4FinOma0TAgG5C4HyBnzVYIOLxnBJALFb+jFE7rEynoOUwW70SPCPCSYPsp5LCc2bsXREZgYnLRfrGJIMAgqeHjRMtJfVOQ8CIMs14diaPEJxkLXLyCHyZcB1lA4ZvxV1MGyoUhafIKxqR+v6rMH46D1llhiQq7HsxthDcci4zCn08JoLROiKSRR7oFlXpkKyy0vZhqmk1exDI/bljtkvxw5TAxThTp2HH5RhXZshB9Mr7AI7638HOouA9SFJpb5O0wNl3Fh0yx9HX11mCS2AxV1vI3wOOQUTx4qusMxHFjCKgGD5liD0t+GFtESEsxCPlc6oCrdwzHUr4ZjOIZjRXCAaIBdQYZjmQN3RUlrlki6tCo45tO5xIYVaEmxphBkMSBgLcJ8xzQLEzSlD+Mo2neEiyri6lj2RBl1wUXSihRl9rnHZMWNhajqroFRmPorMzxsaMMYd+Z9JdyocJokzMFUWRiHiadNpX3f8TAlzncs8mRb7nYSTBuZ/ZhvmtkgoeyBaQ3cTjynS8hlCsmXThYLNE372ImxVHn6KEwszIwzeYBpy3KjVOKuiXhJYGJQfhGmPW+78RMwjs1EUkXzNqKgG2qrqa+jvF4uLfIuA/BxvktN7jkGEzNzaZswiefDJOGNOOGpxSL51CKnlEcOk977QRik/XGPiqMYpO9IA7yvKElasyEOHy4hTqsbjMDkX+8TPSEX7tIC8C7MV8McWcBG6+AzrMN8ifkIJltyto1X+wA5noov+14/XxHP+5/I89UXWnymfVRIAIzDcQam4uWvOqml9gVOkYg89RYnFEV/BZNp0HSIMOa1T4HJkT4EUxV8DCal9qgQwCFJr1W9KYYpkW4j6R6CKbZ4lMTXkHbALV57B0y5kZOFU9hnnoTJiHjM0RtaMIWTcqeXQtRL4cHANdCEuQTzFUtH+Z5JlXQYK+N3cleOOO1VIpjWuOuoE9ieAeMwLeNeC+D18rJuSMQYTAPuhRw3A/gdmFoptspmJA3YvwVTo+ZkWWxbWbwGU6T6Ss5dTGJ/AiZ4LHbew77XVwH8nWMt5j1yxzkAP8Z5KUqanh6kSIqE01eGYA7B9Om5j8rgqaL02gfeyEm+hv8bIcFMAviAEFfcRpFcaBl8PkwPg4tJGDWp2b+Hi3obgJ92vNmxFKmuO7pYjRzG1adyaQTxkHSvzwN1FDi1dzIhSNcndg83b62q0P06PtwXZQIL5+f3iyJsWeSH+T/bmLu5gEerTRGAnByu4K4fk0WElMx4BQkod46Ci79OdKAUJhfraJt7NhZJV8nbFBP4qQE2HunJcTnNz98smSD7Ev/GFxjn994zIAUwL/nd9hhq0LIrU2DXUo8phPhUGX8dzx3ld99SslkW88gcIraf+wGcwTWJqobDWLZ4hJ+3icJXOGLmR2hdHMB8HZgPBDTbaodoRo6+ZEXHWi7qxpKUFzX7jwXwXUfep9QDbqGO1SQniUXEPEfyyEdg+jC1q1y5n5DAmoAWNe04eoOc7MVt7vUIRV/USx+BQYgk22jblojfX7KzbZ7PJSUI72KFRU5SV3myZCe2hBtsE+KpC9dIAfx5Cdew3/2ss+G+UFLpSrmrorC9HqlgUu2e698WO6c97bNQjvp2HoXJ7Xmdo4xZQGwrTFHhCbEe+sFVRqhnTEqT7rU8ToTpB/QXXHg191WZnHEICfL5XwAub+M6eAlMD6i9MMWTTi9ReK0f7ZW0yBYqgP2EDomCdwix5FUhmEg6mr5dEtdsI61C2KEuxhZ+xwaLv12IKepDJGVi2n+KRLS3TVHFSEp2PUDAcIxs/iKYMiXWNbFJCE0LA+W0DM/kfU7kuQ0hEjjnbsbCd4lRRNvO/0MCQmZVs46mqJN0KnKox5NUMsdgussuhjL4c3y2NeRAf10iKiwr/08BHwHg9z2KNurxB5yLd1YE4Z0Vwlw0CyntkbukUq3pEtmJyva/I00oC3KBKe7mTVKxMlmAcujW12Mttjn+bXuH5PtdjvL+vySCmugNNal7c72ENdRFL5oD8B/CYaIOBQ3hKOhYoPzwUW7IA5gvClkJgknEkmjBOOMucxpbWiL4FoA3lXw/ITtPS56hcAoSl4kgBQXt5zgX9QZx/m2EcQi6YQv2WjeIHjUL46yzQGRLRJElkL/gd3SsJyFd7RBC5EnooRvDdQtkfO/9FUwaLFX+zhbk0cUEHqe5OcGdWpPvfV52ZyfcpFMtXfc7u7nY6zlx20qul4l4PNmJFoyo6BYC7qk4ex/PnSQ3mwDwx/z/Ec5D2TEnP1tgsSHosj1nzjl3ls8xJ7835PvWxD4KU4h6bVXjYSLhKA+TME4qwUY2wHRxfUiUwYLi6Ow2EWoFgE8Qt0glXMKaxucTss9L4PfbqYSO8jrb5Luxw10eo1Wn/p6cltUbBPbX53spP2fFSnwlP0cXaKHyEj8UusTwNAD8GufsgyFd7gelw8RiNu+nnnJSiV8jgWl/8yXHlF0rHdpih+0e4K7d5zRP2Eiu0CLBZCVEsNfRIbZ2KCz9f07HNtsB5T7hWq4Z/lzJ6NzId3hemzp4RwSkbNGSikuAz3281xwtzHHZDHae92I+XLUm4RWuGD+mivVh1JSzlsj1HeTyOTKZiTj/RpwFs+fslw7264T9b+hQ3cpyr5vEqzxKDtNOF/qK+II0Of8BmE62blRgAeCHYJyrdmdPCwQfOSEc/0oY4cUA/qikn2VEg+FMcqmLSDxwiDgC8GbO40tgejW66LZ9xoNVLShUiKf6MEz4ZNSmX8+ZAtRZJ9/zS5pg2Wt+jy++G6bv42HK6B089wUlzx2Ll9Y6MafpU4lK3AKQWjAq2mZhvNW7JMRRdZ9UWunsJ0FMO4QfSdezGp/9BDEW9F33kNPN0EVxbIlnej856waYXo1nlGwYa8ndOYhA8H4Ce+ZoJj9EfSApiW19ESfWir9Jp3+0GzL5VbJz26sxlSDxs7jDNdTALvgO+lHW8PfTSKh5SfHmp2VyW3It+/zXi44SOZbZy8XMfmHJAtlwzu/x+bM2KLAl8Em+7zbZWBpOcRd1xCfpv9pQMncxxd+OPtsGDSQeJiIXuIk+jsMC9zckVOAO3muN7JKynb9TZDocqH6K12jKrrKLtZs79SRyvtNFIaw7ImEPF8AVaRYr2iGApI07rvOZTuZzzPC9yuKJY4qkjFxrixCrvvc7YMI664KWK2SQU6Rdw++uF/3FFeU7ADy1mMHfC+FLsmJphD6X95Fg6qKkjQjbXMvJXlfC5ezinE+wzVoI1jn5HVmguEQ3uZvnP4X50mkuUdrdeCMXMnZ8SFb0XEsrLuX71MgJnuZnk891jIQ7uAHppznKbaukv+Jz8OyOI+456ymq9JyoJGJgj4jNrIp5Rmtlx/h4nMfIbd5cArW7AUohcSAWI/lJEsAIn+uekvvYc38H80HlKCkq5PM+51Ss5NrlkmRXyczHGQe/OJ47Li+BwUE9Z6ZD0ecyfaZoY9IXTuzLIYokK8qsdVXWfCKj+IxLMI4avx+TQ7losm36dYDHFfzf0ZKdjwGkKMcinq/iOx+qIsG0hGuMcpK/wElWfKTFHf9VAK/m38/ukFOTdUk3zdsAdg/TsllLBfIM4h5lpesbtMJGJSTCEsQ0ifotMAHbTQkGU2Xyl6iT/bMTkYclcADbloX38/0r3Wpngkrsn7Xx6La4AJZIjqUu4p7bb1jjV53n+hlHBGmu952c2MmSHTtFK+yxNkFgFoWGBExV4bh/kPG7/Si9MwDOpfxsOeLCssr3USFdQwzl5JLcpYi7/h+565MALKEG4xD8PYrFOcz3qY5KFN57KE6mSsTVQfpkNjuhpvZZHobxZm/ku2QdxOdiQh4uSHin4xBGFYsKjpPD3F0Sb5IJ5Y8TuBoH8AslHMWe+01RWEPHb3nsQpsO+5ui8NackIyfcp7PVazfyPO2D5B7ZG0yF3Jx3F4uzt1KcRgr69dxN76bSK67G60X+u1cqKepW7yyDW4Bgm4Zd/4hD1f9KM8/GyaYvOHsvqRNTMo3BXTMxIM+BeBvSna2xXE+B+Df+fNumECtOQmD0NAGe90j/P+4ZFZmjp8okpRWNSYiWmJvk77bkWNKW9/X5wQkrNyY5MNtIVTdcijfppj8tVMaI6L/pl2g9B971tyzCzMN4/W+K2C3HhR0Nnai7T5SolvZ4PXH6M6YpP4DmGyCb8AUsv48TPDV1fz8NPWqKxw8ppNHez1+MNHuExSBc04f6qZsyPdzHkaJACdVTFyb4oN9oYNiuZNcaJqyPqJ+sc85T7//GlnI0S5Fou1if4jc6xHC54/x2MNP+7fdRHavw7Nb9dQI9x+VphTus71bRPFactMpAO/1FCmfgEnwn+T3JnmtMclrOoEi+7aS7zedXK/bxEWRVLGgduIkbf16iS6S07zTdBK1RraXLIjlTE85XuBEfFGdjtNhPMibOeHHS8D18fzbCTSxTyRrT4XwRzjZ98quzR1OYyP4ao4jU7vPaUhEU6pOtByd40oAb+UmiolJvZkcabczL82SQLFv0Z1Qd+bKbuaJKpSNi2VXRFyMvdIw2zWNP4750Aed2Ms7KMe7eP1+y3n4dK+1EXMn8PcPOs81J+92mJjOGphYFUtsIw4X3ADgb2l9NTuksKpovLsk2jBzMi3sde4G8BsERkfFtxVL4SabVRpVQQwlkrrw3yXpsJmESB5HAnNTTz/UwUL6nFRPKFvgWI5EPm0JeJtIN85jlIdl+eMSUzNOAohhkuqPSkhELim0BYA/FT1nXGD3EVFkp2HKkTwfpijSng6hpq2SPOuWcBOX8x6mODuP9ztOgqQSx3CZHBR3iTw4TJ3i5ucx74WNHG0ftBw+Q4I56JzzRSe7QMcjMEFLiRNXEjlIKxy4vl0l77gkdTbj4r6BO3aCSuq5gtFoFaqdtMBiLpxFtN/GeYgkVvkYLqY9r96hUGFRMvftAsczWk11Wo4t6mSHZcM1APwujLe6tpTNwSJnJ2+A6YnYThR9ugPYNAUTL+Mb5L1Yxz8IVvH7JeLCeq4PS6CUJTwbh3IlwgoBZI5O05TPRpdKEz7HAbGwlqy+XurU3wVMDbvCYd2WeKzSmjoEYxXeS53MAvdwJ3UhjwY/vyk5S2eSA7rP1HQggVEH16lTQW45GQBNhxhaMjdZAEDXbh6ykv/b+39DypINhGDSDslRFmq+mNp5XlKnDgD+kGJlRKL8LcB3mO6AWoe432gAJUn+kGw9JUGsKQkOTykaPyDVPFWkbePGSAIxj2/TrN8L0xd7hlz3MmJJx9OK66XV0A0knuNgwj2LpSCYTHwVmwH8JeW3em9tCOU1ZPXHSBCzfeinMR+9b3NrBgkuWQL/e+pQCUxi3fkEHZOSyLV3cHFrogtY8XyK+L1ivq8NdTgsuUlHiPk8yg23C/MZBDo+JhjVyeRopxHhtfjKpEAEseM5H5FUmcagEtgij4T7EyUXJ3dSX/fJLn26JL51jES3lA2sHibHOMgdPV5SDs3+/CgX4kgJwj0uYta++4wTTjri6H+HHKJLRQRGkkM10wVdX8+5TET3avHeY7RQW8uhY8gETNjCDCdnztH6p/m3o1jaCMG8Tf6QK77qzjvkjme8KShxQ64fixjXDdd0vNqxZBAUDnSQ8B5j5FizzjOPy3dzqf5Zd1SBJSeYpE1SeSETl0rMaSwTPepYI4NuBuom4NdF0S0LRsqcYOysxJ3QbKOPFQsYTZd3KY6YOgo1nHkfjuEY9pAajuEYjuEYjuGQ8f9WoNMaR10tEAAAAABJRU5ErkJggg==" alt="泡漫">
  <h1>领取邀请码</h1>
  <span class="rule"></span>

  <form id="form" novalidate="">
    <div class="field">
      <label class="label" for="phone">泡漫注册手机号</label>
      <input id="phone" type="tel" maxlength="11" inputmode="numeric" autocomplete="tel" placeholder="11 位手机号">
    </div>
    <div class="field">
      <label class="label" for="wechat">微信号</label>
      <input id="wechat" type="text" maxlength="40" autocomplete="off" placeholder="你的微信号">
    </div>
    <p class="msg" id="msg"></p>
    <button class="btn" id="submit" type="submit">领取</button>
  </form>

  <div class="result" id="result">
    <p class="note" id="note"></p>
    <div class="code-box"><span class="code" id="code"></span></div>
    <button class="btn" id="copy" type="button"><span id="copyText">复制邀请码</span></button>

    <div class="join">
      <p class="join-title">复制邀请码后，扫码加入社群</p>
      <div class="qr-box"><img class="qr" id="qr" src="data:image/png;base64,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" alt="泡漫社群二维码"></div>
    </div>
  </div>
</div>

<script>
(function () {
  var API = '';

  var form = document.getElementById('form');
  var phone = document.getElementById('phone');
  var wechat = document.getElementById('wechat');
  var submit = document.getElementById('submit');
  var msg = document.getElementById('msg');
  var result = document.getElementById('result');
  var note = document.getElementById('note');
  var codeEl = document.getElementById('code');
  var copyBtn = document.getElementById('copy');
  var copyText = document.getElementById('copyText');

  // 预热：填表期间提前唤醒云函数，避免提交时等冷启动
  fetch(API + '/health', { cache: 'no-store' }).catch(function () {});

  function showMsg(text, target) {
    msg.textContent = text;
    msg.classList.add('show');
    phone.classList.remove('is-error');
    wechat.classList.remove('is-error');
    if (target) target.classList.add('is-error');
  }

  function clearMsg() {
    msg.textContent = '';
    msg.classList.remove('show');
    phone.classList.remove('is-error');
    wechat.classList.remove('is-error');
  }

  function validate() {
    clearMsg();
    var p = phone.value.replace(/\s/g, '');
    var w = wechat.value.trim();
    if (!/^1[3-9]\d{9}$/.test(p)) {
      showMsg('请输入正确的 11 位手机号', phone);
      return null;
    }
    if (w.length < 2 || w.length > 40) {
      showMsg('请填写微信号', wechat);
      return null;
    }
    return { phone: p, wechat: w };
  }

  // 异步回写码池：keepalive 保证用户关页也能送达，失败重试一次
  function syncPool(recordId, retried) {
    fetch(API + '/bind', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ record_id: recordId }),
      keepalive: true
    })
      .then(function (r) { return r.json(); })
      .then(function (d) {
        if (!(d && d.ok) && !retried) {
          setTimeout(function () { syncPool(recordId, true); }, 1000);
        }
      })
      .catch(function () {
        if (!retried) setTimeout(function () { syncPool(recordId, true); }, 1000);
      });
  }

  form.addEventListener('submit', function (e) {
    e.preventDefault();
    var payload = validate();
    if (!payload) return;

    submit.disabled = true;
    submit.textContent = '领取中…';

    fetch(API + '/claim', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(payload)
    })
      .then(function (r) { return r.json(); })
      .then(function (data) {
        if (data && data.ok && data.code) {
          codeEl.textContent = data.code;
          if (data.repeat) {
            note.textContent = '你已领取过';
            note.classList.add('show');
          }
          form.style.display = 'none';
          result.classList.add('show');
          // 码池回写在后台完成，不影响用户看码
          if (data.record_id) syncPool(data.record_id, false);
        } else {
          showMsg((data && data.message) || '领取失败，请稍后重试');
        }
      })
      .catch(function () { showMsg('网络异常，请稍后重试'); })
      .finally(function () {
        submit.disabled = false;
        submit.textContent = '领取';
      });
  });

  copyBtn.addEventListener('click', function () {
    var text = codeEl.textContent;
    function done() {
      copyText.textContent = '已复制';
      setTimeout(function () { copyText.textContent = '复制邀请码'; }, 1600);
    }
    if (navigator.clipboard && navigator.clipboard.writeText) {
      navigator.clipboard.writeText(text).then(done).catch(function () {});
    } else {
      var input = document.createElement('input');
      input.value = text;
      document.body.appendChild(input);
      input.select();
      try { document.execCommand('copy'); done(); } catch (err) {}
      document.body.removeChild(input);
    }
  });
})();
</script>

<script>
(function () {
  var canvas = document.getElementById('bg');
  var gl = canvas.getContext('webgl', { antialias: false });
  if (!gl) { canvas.style.display = 'none'; return; }

  var VERT = `attribute vec2 a_position;
void main() {
  gl_Position = vec4(a_position, 0.0, 1.0);
}`;
  var FRAG = `#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif

uniform vec3 u_colors[8];
// Seven packed vectors + eight colour vectors = 15 fragment uniform vectors,
// one below WebGL1's guaranteed minimum. Macros preserve the public u_* API.
uniform vec4 u_scene;      // resolution.xy, time, colour count
uniform vec4 u_shape;      // scale, intensity, paramA, warp
uniform vec4 u_surface;    // detail, contrast, brightness, saturation
uniform vec4 u_finish;     // hue, vignette, blur, grain
uniform vec4 u_transform;  // seed, rotation, drift, OKLab toggle
uniform vec4 u_space;      // offset.xy, pointer.xy
uniform vec4 u_cursor;

#define u_resolution u_scene.xy
#define u_time u_scene.z
#define u_colorCount u_scene.w
#define u_scale u_shape.x
#define u_intensity u_shape.y
#define u_paramA u_shape.z
#define u_warp u_shape.w
#define u_detail u_surface.x
#define u_contrast u_surface.y
#define u_brightness u_surface.z
#define u_saturation u_surface.w
#define u_hue u_finish.x
#define u_vignette u_finish.y
#define u_blur u_finish.z
#define u_grain u_finish.w
#ifdef GL_FRAGMENT_PRECISION_HIGH
#define u_seed u_transform.x
#else
// Keep hash inputs inside mediump's guaranteed ±2^14 range.
#define u_seed mod(u_transform.x, 31.0)
#endif
#define u_rotate u_transform.y
#define u_drift u_transform.z
#define u_oklab u_transform.w
#define u_offset u_space.xy
#define u_mouse u_space.zw
#define u_cursorPresence u_cursor.x
#define u_cursorEffect u_cursor.y
#define u_cursorStrength u_cursor.z
#define u_cursorRadius u_cursor.w

float hash21(vec2 p) {
#ifndef GL_FRAGMENT_PRECISION_HIGH
  p = mod(p, 31.0);
#endif
  p = fract(p * vec2(234.34, 435.345));
  p += dot(p, p + 34.23);
  return fract(p.x * p.y);
}

// Even, un-structured white noise for film grain (Dave Hoskins hash12). The
// multiply hash above is fine for value noise but shows a faint axis-aligned
// mesh at integer fragment coords, which reads as a net over flat areas.
float grainHash(vec2 p) {
  vec3 p3 = fract(vec3(p.xyx) * 0.1031);
  p3 += dot(p3, p3.yzx + 33.33);
  return fract((p3.x + p3.y) * p3.z);
}

vec2 hash22(vec2 p) {
#ifndef GL_FRAGMENT_PRECISION_HIGH
  p = mod(p, 31.0);
#endif
  float n = sin(dot(p, vec2(41.0, 289.0)));
  return fract(vec2(15731.743, 7892.321) * n);
}

float noise(vec2 p) {
  vec2 i = floor(p);
  vec2 f = fract(p);
  vec2 u = f * f * (3.0 - 2.0 * f);
  return mix(
    mix(hash21(i), hash21(i + vec2(1.0, 0.0)), u.x),
    mix(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(1.0, 1.0)), u.x),
    u.y);
}

float fbm(vec2 p) {
  float v = 0.0;
  float a = 0.5;
  for (int i = 0; i < 5; i++) {
    v += a * noise(p);
    p = p * 2.03 + vec2(17.0, 9.2);
    a *= 0.5;
  }
  return v;
}

// --- OKLab colour mixing (perceptual), gated by u_oklab -----------------------
vec3 srgbToLinear(vec3 c) {
  return mix(c / 12.92, pow((c + 0.055) / 1.055, vec3(2.4)),
    step(0.04045, c));
}
vec3 linearToSrgb(vec3 c) {
  // max() guards the sRGB branch: out-of-gamut OKLab interpolations can send a
  // channel negative, and pow(negative, …) is NaN which mix()/step() would
  // then propagate. The linear branch clips such channels to 0 downstream.
  return mix(c * 12.92, 1.055 * pow(max(c, vec3(0.0)), vec3(1.0 / 2.4)) - 0.055,
    step(0.0031308, c));
}
vec3 linToOklab(vec3 c) {
  float l = 0.4122214708 * c.r + 0.5363325363 * c.g + 0.0514459929 * c.b;
  float m = 0.2119034982 * c.r + 0.6806995451 * c.g + 0.1073969566 * c.b;
  float s = 0.0883024619 * c.r + 0.2817188376 * c.g + 0.6299787005 * c.b;
  l = pow(max(l, 0.0), 1.0 / 3.0);
  m = pow(max(m, 0.0), 1.0 / 3.0);
  s = pow(max(s, 0.0), 1.0 / 3.0);
  return vec3(
    0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,
    1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,
    0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s);
}
vec3 oklabToLin(vec3 c) {
  float l = c.x + 0.3963377774 * c.y + 0.2158037573 * c.z;
  float m = c.x - 0.1055613458 * c.y - 0.0638541728 * c.z;
  float s = c.x - 0.0894841775 * c.y - 1.2914855480 * c.z;
  l = l * l * l; m = m * m * m; s = s * s * s;
  return vec3(
    4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,
    -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,
    -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s);
}
vec3 mixColour(vec3 a, vec3 b, float t) {
  if (u_oklab > 0.5) {
    vec3 la = linToOklab(srgbToLinear(a));
    vec3 lb = linToOklab(srgbToLinear(b));
    return clamp(linearToSrgb(oklabToLin(mix(la, lb, t))), 0.0, 1.0);
  }
  return mix(a, b, t);
}

// Mix through the recipe colours; x is clamped to 0..1. WebGL1 forbids
// dynamic uniform indexing in fragment shaders, hence the constant loop.
vec3 palette(float x) {
  float n = max(u_colorCount - 1.0, 1.0);
  float f = clamp(x, 0.0, 1.0) * n;
  vec3 col = u_colors[0];
  for (int i = 0; i < 7; i++) {
    if (float(i) < n)
      col = mixColour(col, u_colors[i + 1],
        smoothstep(0.0, 1.0, clamp(f - float(i), 0.0, 1.0)));
  }
  return col;
}

vec3 hueRotate(vec3 col, float a) {
  const mat3 toYIQ = mat3(0.299, 0.596, 0.211,
                          0.587, -0.274, -0.523,
                          0.114, -0.322, 0.312);
  const mat3 toRGB = mat3(1.0, 1.0, 1.0,
                          0.956, -0.272, -1.106,
                          0.621, -0.647, 1.703);
  vec3 yiq = toYIQ * col;
  float ca = cos(a), sa = sin(a);
  yiq = vec3(yiq.x, yiq.y * ca - yiq.z * sa, yiq.y * sa + yiq.z * ca);
  return toRGB * yiq;
}

vec3 shade(vec2 uv, vec2 p, float t) {
  float y = uv.y
    + sin(uv.x * (3.0 + u_intensity * 9.0) + t * 0.8) * 0.08
    + (fbm(p * 2.0 + t * 0.1) - 0.5) * u_intensity * 0.6;
  return palette(y);
}

void main() {
  vec2 uv = gl_FragCoord.xy / u_resolution.xy;
  vec2 screenUv = uv;
  vec2 p = (gl_FragCoord.xy - 0.5 * u_resolution.xy)
    / min(u_resolution.x, u_resolution.y);
  float cursorMask = 0.0;

  // Cursor modes 1–3 are local distortions. Push shifts the same screen-space
  // coordinates before field transforms, so Zoom/Rotate don't change its feel.
  if (u_cursorPresence > 0.001) {
    // u_mouse is normalized to -1..1 in canvas space. Convert it to the same
    // aspect-corrected screen space as p so effects stay under the cursor.
    vec2 cursor = (0.5 * u_mouse * u_resolution.xy)
      / min(u_resolution.x, u_resolution.y);
    vec2 cursorDelta = p - cursor;
    if (u_cursorEffect < 0.5) {
      p += cursor * u_cursorPresence * u_cursorStrength * 0.55;
    } else {
      float cursorDistance = length(cursorDelta);
      vec2 cursorDirection = cursorDelta / max(cursorDistance, 0.0001);
      cursorMask = u_cursorPresence
        * (1.0 - smoothstep(0.0, u_cursorRadius, cursorDistance));
      if (u_cursorEffect < 1.5) {
        p -= cursorDirection * cursorMask * u_cursorStrength * 0.24;
      } else if (u_cursorEffect < 2.5) {
        float cursorAngle = cursorMask * u_cursorStrength * 2.2;
        float cc = cos(cursorAngle), cs = sin(cursorAngle);
        p = cursor + mat2(cc, -cs, cs, cc) * cursorDelta;
      } else if (u_cursorEffect < 3.5) {
        float ripple = sin(
          cursorDistance / max(u_cursorRadius, 0.001) * 18.0 - u_time * 5.0);
        p -= cursorDirection * ripple * cursorMask * u_cursorStrength * 0.07;
      }
    }
  }

  // Keep presets that read uv (rather than p) in the same warped space.
  uv = p * min(u_resolution.x, u_resolution.y) / u_resolution.xy + 0.5;
  p *= u_scale;
  // Field transform: rotate, pan, pointer push, slow drift.
  if (abs(u_rotate) > 0.0001) {
    float cr = cos(u_rotate), sr = sin(u_rotate);
    p = mat2(cr, -sr, sr, cr) * p;
  }
  p += u_offset;
  if (u_drift > 0.0001)
    p += u_drift * vec2(sin(u_time * 0.31), cos(u_time * 0.23));
  // Organic domain warp.
  if (u_warp > 0.0) {
    p += u_warp * (vec2(
      fbm(p * u_detail + u_seed),
      fbm(p * u_detail + vec2(5.2, 1.3))) - 0.5);
  }
  // Shade, with an optional soft 5-tap blur.
  vec3 col;
  if (u_blur > 0.0) {
    float e = u_blur;
    float pe = e * u_scale;
    vec2 uvE = vec2(e) * min(u_resolution.x, u_resolution.y) / u_resolution.xy;
    col  = shade(uv, p, u_time) * 0.36;
    col += shade(uv + vec2(uvE.x, 0.0), p + vec2(pe, 0.0), u_time) * 0.16;
    col += shade(uv - vec2(uvE.x, 0.0), p - vec2(pe, 0.0), u_time) * 0.16;
    col += shade(uv + vec2(0.0, uvE.y), p + vec2(0.0, pe), u_time) * 0.16;
    col += shade(uv - vec2(0.0, uvE.y), p - vec2(0.0, pe), u_time) * 0.16;
  } else {
    col = shade(uv, p, u_time);
  }
  // Post: contrast, saturation, hue, brightness, vignette, grain.
  if (abs(u_contrast - 1.0) > 0.0001)
    col = (col - 0.5) * u_contrast + 0.5;
  if (abs(u_saturation - 1.0) > 0.0001) {
    float luma = dot(col, vec3(0.299, 0.587, 0.114));
    col = mix(vec3(luma), col, u_saturation);
  }
  if (abs(u_hue) > 0.0001)
    col = hueRotate(col, u_hue);
  if (abs(u_brightness) > 0.0001)
    col += u_brightness;
  if (u_vignette > 0.0001) {
    float vd = length(screenUv - 0.5) * 1.41421356;
    col *= 1.0 - u_vignette * smoothstep(0.35, 1.0, vd);
  }
  if (u_cursorPresence > 0.001 && u_cursorEffect > 3.5)
    col += (vec3(0.18) + col * 0.12) * cursorMask * u_cursorStrength;
  if (u_grain > 0.0001)
    col += (grainHash(
      gl_FragCoord.xy + vec2(u_seed * 17.0, u_seed * 31.0)) - 0.5) * u_grain;
  gl_FragColor = vec4(clamp(col, 0.0, 1.0), 1.0);
}
`;

  var COLORS = [
    [0.011764705882352941, 0.10980392156862745, 0.14901960784313725],
    [0.10588235294117647, 0.4235294117647059, 0.6588235294117647],
    [0.35294117647058826, 0.8235294117647058, 0.9568627450980393],
    [0.9176470588235294, 0.9764705882352941, 1],
    [0.9176470588235294, 0.9764705882352941, 1],
    [0.9176470588235294, 0.9764705882352941, 1],
    [0.9176470588235294, 0.9764705882352941, 1],
    [0.9176470588235294, 0.9764705882352941, 1]
  ];

  var P = {
    colorCount: 4,
    scale: 2.0,
    intensity: 0.54,
    paramA: 0.47,
    warp: 0.042,
    detail: 1.536,
    contrast: 1.158,
    brightness: 0.0,
    saturation: 1.0,
    hue: 0.0,
    vignette: 0.21,
    blur: 0.002,
    grain: 0.101,
    seed: 4012.0,
    rotate: 5.6549,
    offsetX: 0.11,
    offsetY: -0.19,
    drift: 0.116,
    timeScale: -0.727,
    cursorEffect: 2.0,
    cursorStrength: 0.65,
    cursorRadius: 0.46
  };

  function compile(type, src) {
    var s = gl.createShader(type);
    gl.shaderSource(s, src);
    gl.compileShader(s);
    if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) throw new Error(gl.getShaderInfoLog(s));
    return s;
  }

  var program = gl.createProgram();
  gl.attachShader(program, compile(gl.VERTEX_SHADER, VERT));
  gl.attachShader(program, compile(gl.FRAGMENT_SHADER, FRAG));
  gl.linkProgram(program);
  gl.useProgram(program);

  var buf = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, buf);
  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);
  var loc = gl.getAttribLocation(program, 'a_position');
  gl.enableVertexAttribArray(loc);
  gl.vertexAttribPointer(loc, 2, gl.FLOAT, false, 0, 0);

  var uni = {
    colors: gl.getUniformLocation(program, 'u_colors'),
    scene: gl.getUniformLocation(program, 'u_scene'),
    shape: gl.getUniformLocation(program, 'u_shape'),
    surface: gl.getUniformLocation(program, 'u_surface'),
    finish: gl.getUniformLocation(program, 'u_finish'),
    transform: gl.getUniformLocation(program, 'u_transform'),
    space: gl.getUniformLocation(program, 'u_space'),
    cursor: gl.getUniformLocation(program, 'u_cursor')
  };

  var flat = [];
  for (var i = 0; i < COLORS.length; i++) flat.push.apply(flat, COLORS[i]);

  gl.uniform3fv(uni.colors, new Float32Array(flat));
  gl.uniform4f(uni.shape, P.scale, P.intensity, P.paramA, P.warp);
  gl.uniform4f(uni.surface, P.detail, P.contrast, P.brightness, P.saturation);
  gl.uniform4f(uni.finish, P.hue, P.vignette, P.blur, P.grain);
  gl.uniform4f(uni.transform, P.seed, P.rotate, P.drift, 0);
  gl.uniform4f(uni.cursor, 0, P.cursorEffect, P.cursorStrength, P.cursorRadius);

  function resize() {
    var dpr = Math.min(window.devicePixelRatio || 1, 2);
    var w = Math.max(1, Math.round(canvas.clientWidth * dpr));
    var h = Math.max(1, Math.round(canvas.clientHeight * dpr));
    var k = Math.min(1, Math.sqrt(2000000 / Math.max(1, w * h)));
    w = Math.max(1, Math.round(w * k));
    h = Math.max(1, Math.round(h * k));
    if (canvas.width !== w || canvas.height !== h) {
      canvas.width = w;
      canvas.height = h;
      gl.viewport(0, 0, w, h);
    }
  }

  var start = performance.now();
  var raf = 0;
  var still = window.matchMedia('(prefers-reduced-motion: reduce)').matches;

  function draw(t) {
    resize();
    gl.uniform4f(uni.scene, canvas.width, canvas.height, t, P.colorCount);
    gl.uniform4f(uni.space, P.offsetX, P.offsetY, 0, 0);
    gl.drawArrays(gl.TRIANGLES, 0, 3);
    if (!still && document.visibilityState === 'visible') raf = requestAnimationFrame(frame);
  }

  function frame(now) {
    raf = 0;
    draw(((now - start) / 1000) * P.timeScale);
  }

  window.addEventListener('resize', function () {
    if (raf === 0) draw(still ? 0 : ((performance.now() - start) / 1000) * P.timeScale);
  });

  document.addEventListener('visibilitychange', function () {
    if (document.visibilityState === 'visible') {
      if (raf === 0 && !still) raf = requestAnimationFrame(frame);
    } else if (raf) {
      cancelAnimationFrame(raf);
      raf = 0;
    }
  });

  draw(0);
})();
</script>

</body></html>
