// ==UserScript== // @name Cyberspace Atmospheric Modulator // @author https://z0m.bi/ (@z0ylent) // @license GPL-3.0-or-later // @namespace https://cyberspace.online/ // @version 0.2.8 // @description Usability features for cyberspace.online: undithered images on hover, colored usernames, and more // @match https://cyberspace.online/* // @match https://beta.cyberspace.online/* // @exclude https://page.cyberspace.online/* // @exclude https://*.page.cyberspace.online/* // @exclude https://terminal.cyberspace.online/* // @exclude https://*.terminal.cyberspace.online/* // @updateURL https://raw.githubusercontent.com/z0mbieparade/cyberspace-atmospheric-modulator/refs/heads/main/cyberspace-atmospheric-modulator.user.js // @downloadURL https://raw.githubusercontent.com/z0mbieparade/cyberspace-atmospheric-modulator/refs/heads/main/cyberspace-atmospheric-modulator.user.js // @grant GM_registerMenuCommand // @grant GM.registerMenuCommand // @grant GM_setValue // @grant GM_getValue // @grant GM.setValue // @grant GM.getValue // @grant GM_xmlhttpRequest // @grant GM.xmlHttpRequest // @grant unsafeWindow // @connect raw.githubusercontent.com // @connect api.cyberspace.online // @run-at document-start // @inject-into auto // ==/UserScript== !function(){"use strict";const e="0.2.8",t="https://raw.githubusercontent.com/z0mbieparade/cyberspace-atmospheric-modulator/refs/heads/main/cyberspace-atmospheric-modulator.user.js",o=["page.cyberspace.online","terminal.cyberspace.online"],a=["/terminal","/pages"],n="AtmoMod",i=`[${n}]`;function r(e){return`[${n}|${e}]`}const l="Atmospheric Modulator",s="AtmoMod",c="Atmospheric Modulator (Userscript settings)",d="Atmospheric Modulator Settings",h="Backup & Troubleshooting",p="atmosphericModulator_",u=["debugMode","featureConfig","dismissedUpdateVersion","settingsSectionsOpen","backupNote","nickFriends","unditherMissedPage","siteConfig","customNickColors","nickColorFor","nickNotes","worldClock","nickEffects","nickEffectsOwnUsername","emojiRecents"],g=(()=>{if("function"!=typeof GM_getValue||"function"!=typeof GM_setValue)return!1;try{return!((e=GM_getValue("__"+p+"api_probe",null))&&"function"==typeof e.then)}catch(e){return!1}var e})(),m="undefined"!=typeof GM&&"function"==typeof GM.getValue?e=>GM.getValue(e):"function"==typeof GM_getValue?e=>Promise.resolve(GM_getValue(e)):null,b="undefined"!=typeof GM&&"function"==typeof GM.setValue?(e,t)=>GM.setValue(e,t):"function"==typeof GM_setValue?(e,t)=>Promise.resolve(GM_setValue(e,t)):null,f=!g&&!!m&&!!b;let y={},v=!f;function w(){return v}const k=[];function x(e){v?e():k.push(e)}const S=g?GM_setValue:f?(e,t)=>{y[e]=t,Promise.resolve(b(e,t)).catch(t=>console.error(i+" Failed to save "+e+":",t))}:(e,t)=>localStorage.setItem(p+e,t),C=g?GM_getValue:f?(e,t)=>e in y?y[e]:t:(e,t)=>{const o=localStorage.getItem(p+e);return null!==o?o:t},$="_migratedFromLocalStorage";async function A(){if(!(f?await m($):C($,null))){for(const e of u){const t=p+e,o=localStorage.getItem(t);if(null!==o){null==(f?await m(e):C(e,null))&&(f?(await b(e,o),y[e]=o):g&&GM_setValue(e,o))}}f?await b($,"true"):g&&GM_setValue($,"true")}}function E(e){if(!e||0===e.length)return!1;const t=window.location.pathname.replace(/\/+$/,"");return e.some(e=>{const o=e.replace(/\/+$/,"");return!!o&&(t===o||t.startsWith(o+"/"))})}function L(e){if(!e||0===e.length)return!1;const t=window.location.hostname.toLowerCase();return e.some(e=>{const o=e.toLowerCase();return!!o&&(t===o||t.endsWith("."+o))})}function N(e){return window.location.pathname.replace(/\/+$/,"").toLowerCase()==="/"+e.toLowerCase()}f?async function(){if(f)try{for(const e of u){const t=await m(e);void 0!==t&&(y[e]=t)}}catch(e){console.error(i+" Failed to load GM cache:",e)}}().then(async()=>{try{await A()}catch(e){console.error(i+" Failed to migrate storage:",e)}}).finally(()=>{v=!0;try{$o="true"===C("debugMode","false"),jo(),sa(),qo()}catch(e){console.error(i+" Failed to start after loading GM storage:",e)}for(const e of k)try{e()}catch(e){console.error(i+" A step waiting for GM storage failed:",e)}k.length=0}):g&&A().catch(e=>console.error(i+" Failed to migrate storage:",e));const T="function"==typeof GM_registerMenuCommand?GM_registerMenuCommand:"undefined"!=typeof GM&&"function"==typeof GM.registerMenuCommand?GM.registerMenuCommand:null;function j({findTarget:e,getDuration:t,onHold:o,onPress:a,onRelease:n}){let i=null,r=null,l=null,s=!1;const c=()=>{i&&(clearTimeout(i),i=null);const e=r,t=s;r=null,l=null,s=!1,e&&n&&n(e,t)};document.addEventListener("touchstart",n=>{if(1!==n.touches.length)return void(i&&c());c();const d=e(n);d&&(r=d,l={x:n.touches[0].clientX,y:n.touches[0].clientY},a&&a(d),i=setTimeout(()=>{i=null,s=!0,o(d)},t()))},{passive:!0}),document.addEventListener("touchmove",e=>{if(!i||!l)return;const t=Math.abs(e.touches[0].clientX-l.x),o=Math.abs(e.touches[0].clientY-l.y);(t>10||o>10)&&c()},{passive:!0}),document.addEventListener("touchend",e=>{0===e.touches.length&&c()},{passive:!0}),document.addEventListener("touchcancel",c,{passive:!0})}const O="atmo",M=`${O}-${Math.random().toString(36).slice(2,8)}`;let D=0;function I(e){return`${M}-${e}-${++D}`}function F(...e){return e.map(e=>`${O}-${e}`).join(" ")}function z(e){return String(e??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function q(e){const{label:t="",id:o,type:a="text",value:n="",placeholder:i="",hint:r="",classes:l="",options:s,checked:c=!1,disabled:d=!1,state:h=null,defaultLabel:p="",buttonText:u="",stacked:g=!1,ariaLabel:m=""}=e,b=l?" "+l:"",f=!t&&m?` aria-label="${z(m)}"`:"";if("select"===a&&s&&!g)return`\n\t\t\t
\n\t\t\t\t${t?``:""}\n\t\t\t\t\n\t\t\t
\n\t\t\t${r?`
${r}
`:""}\n\t\t`;if(g||["text","textarea","select"].includes(a)){let e;return e="textarea"===a?``:"select"===a&&s?``:``,`\n\t\t\t
\n\t\t\t\t${t?``:""}\n\t\t\t\t${e}\n\t\t\t\t${r?`
${r}
`:""}\n\t\t\t
\n\t\t`}if("toggle"===a||"tristate"===a){const e="tristate"===a,n=e?!0===h:c,i=e?R(h):String(n),r=e?H(h):n?"pos-end":"pos-start";return`\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t`}return"button"===a?`\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\n\t\t\t
\n\t\t`:""}function R(e){return!0===e?"true":!1===e?"false":"auto"}function H(e){return!0===e?"pos-end":!1===e?"pos-start":"pos-middle"}function B(e){const t=e.closest("."+F("toggle"));if(!t)return;const o=e.checked;t.querySelector("."+F("toggle-value")).textContent=String(o),t.querySelector("."+F("toggle-track")).classList.toggle("active",o);const a=t.querySelector("."+F("toggle-thumb"));a.classList.toggle("pos-end",o),a.classList.toggle("pos-start",!o)}function V(e,t){e.checked=!0===t,e.indeterminate=null===t;const o=e.closest("."+F("tristate-toggle"));if(!o)return;o.querySelector("."+F("toggle-value")).textContent=R(t),o.querySelector("."+F("toggle-track")).classList.toggle("active",!0===t);const a=o.querySelector("."+F("toggle-thumb"));a.classList.remove("pos-start","pos-middle","pos-end"),a.classList.add(H(t))}const U=['created by @z0ylent','https://z0m.bi'];function P(e){return`
${e}
`}const G='';function W(e,t,o,a){const n=document.createElement("button");return n.type="button",n.className=a?F("icon-btn",a):F("icon-btn"),n.title=t,n.setAttribute("aria-label",t),n.innerHTML=e,n.addEventListener("click",o),n}function _(e,t){if(!e.length){const e=document.createElement("div");return e.className="hint",e.textContent=t,e}const o=document.createElement("ul");o.className=F("entry-list");for(const t of e){const e=document.createElement("li");e.dataset.entryKey=t.key,e.append(...t.parts),o.appendChild(e)}return o}function Z(e,t,o,a=null){const n=Array.from(e.querySelectorAll("li[data-entry-key]"),e=>e.dataset.entryKey),i=document.activeElement,r=!!i&&i!==document.body&&e.contains(i),l=!i||i===document.body,s=o??(r?i.closest("li[data-entry-key]")?.dataset.entryKey:void 0),c=r&&i.dataset.entryControl||null;if(t(),void 0===s||!r&&!l)return;const d=Array.from(e.querySelectorAll("li[data-entry-key]")),h=d.find(e=>e.dataset.entryKey===s)||d[Math.min(n.indexOf(s),d.length-1)],p=c&&h?.querySelector(`[data-entry-control="${c}"]`);(p||h?.querySelector("button")||a)?.focus()}function J({title:e,message:t,confirmLabel:o,tone:a="danger",onConfirm:n}){X({title:e,width:"400px",onHelp:null,warning:"",attribution:[],content:P(t),buttons:[{label:"CANCEL",class:"cancel",onClick:e=>e()},{label:o,class:F(a),onClick:e=>{e(),n()}}]})}function K(e){return e.length?`
${e.map(e=>`${e}`).join("")}
`:""}const Y=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])","[tabindex]"].map(e=>`${e}:not([tabindex="-1"])`).join(", ");function X(e){const t={warning:Pa,attribution:Ga()},{title:o,content:a,buttons:n=[],width:i="400px",header:r="",preview:l="",footerHtml:s="",warning:c="",attribution:d=[],onClose:h,onSettings:p,onHelp:u,onOpen:g}={...t,...e};ve();const m=[c?P(c):"",K(d),s].filter(Boolean).join(""),b=I("dialog-title"),f=document.createElement("div");f.className=F("dialog-overlay"),f.innerHTML=`\n\t\t\n\t`;const y=f.firstElementChild,v=document.activeElement;let w=!1;const k=()=>{w||(w=!0,f.remove(),v&&"function"==typeof v.focus&&v.isConnected&&v.focus(),h?.())},x=y.querySelectorAll(`.${F("dialog-footer")} .buttons > button`);n.forEach((e,t)=>{e.onClick&&x[t].addEventListener("click",()=>e.onClick(k))}),y.querySelector("."+F("header-close")).addEventListener("click",k),p&&y.querySelector("."+F("header-settings")).addEventListener("click",()=>{k(),p()}),u&&y.querySelector("."+F("header-help")).addEventListener("click",u);const S=y.querySelector("."+F("version-link"));S&&Ie(S);let C=!1;f.addEventListener("mousedown",e=>{C=e.target===f}),f.addEventListener("click",e=>{e.target===f&&C&&k(),C=!1}),f.addEventListener("keydown",e=>{if("Escape"===e.key)return e.stopPropagation(),void k();if("Tab"!==e.key)return;const t=Array.from(y.querySelectorAll(Y)).filter(e=>function(e,t){for(let o=e;o&&o!==t;o=o.parentElement)if(o.hidden||"none"===getComputedStyle(o).display)return!1;return!0}(e,y)&&"true"!==e.getAttribute("aria-hidden"));if(!t.length)return e.preventDefault(),void y.focus();const o=t[0],a=t[t.length-1];!e.shiftKey||document.activeElement!==o&&document.activeElement!==y?e.shiftKey||document.activeElement!==a||(e.preventDefault(),o.focus()):(e.preventDefault(),a.focus())}),document.body.appendChild(f),y.focus();const $={el:f,close:k,querySelector:e=>f.querySelector(e),querySelectorAll:e=>f.querySelectorAll(e)};return g?.($),$}const Q={"Full Spectrum":{colors:{fg:"#e0e0e0",bg:"#0a0a0a",fgDim:"#888888",border:"#333333",codeBg:"#222222"}},z0ylent:{colors:{fg:"#91ff00",bg:"#060f04",fgDim:"#12892d",border:"#12892d",codeBg:"#0c1c08"}},Dark:{colors:{fg:"#efe5c0",bg:"#000000",fgDim:"#a89984",border:"#3a3a3a",codeBg:"hsla(0,0%,100%,.07)"}},Light:{colors:{fg:"#000000",bg:"#efe5c0",fgDim:"#3a3a3a",border:"#a89984",codeBg:"rgba(0,0,0,.08)"}},LCD:{colors:{fg:"#000000",bg:"#eaeae4",fgDim:"#3a3a3a",border:"#9aa49d",codeBg:"#b4c2aa"}},C64:{colors:{fg:"hsla(0,0%,100%,.75)",bg:"#2a2ab8",fgDim:"hsla(0,0%,100%,.4)",border:"hsla(0,0%,100%,.3)",codeBg:"hsla(0,0%,100%,.08)"}},VT320:{colors:{fg:"#ff9a10",bg:"#170800",fgDim:"#ff9100",border:"rgba(255,155,0,.27)",codeBg:"rgba(255,155,0,.05)"}},Matrix:{colors:{fg:"rgba(160,224,68,.9)",bg:"#000000",fgDim:"rgba(160,224,68,.5)",border:"rgba(160,224,68,.4)",codeBg:"rgba(0,255,65,.08)"}},Poetry:{colors:{fg:"#222222",bg:"#fefaf8",fgDim:"#666666",border:"#cccccc",codeBg:"#f0e0dd"},logic:{invertedContainerBg:"codeBg",invertedContainerFg:"fg"}},Brutalist:{colors:{fg:"#c0d0e8",bg:"#080810",fgDim:"#99a9bf",border:"rgba(160,180,220,.18)",codeBg:"rgba(160,180,220,.06)"}},GRiD:{colors:{fg:"#fea813",bg:"#180f06",fgDim:"#d08c17",border:"rgba(245,169,28,.22)",codeBg:"rgba(245,169,28,.08)"}},Crypt:{colors:{fg:"#ee1100",bg:"#100202",fgDim:"rgba(255,0,0,.8)",border:"rgba(255,0,0,.3)",codeBg:"rgba(255,0,0,.05)"}},Bubblegum:{colors:{fg:"#6b1a4a",bg:"#ffe4f1",fgDim:"#b86b93",border:"#f5b5d1",codeBg:"#ffd0e5"}},Top8:{id:"myspace",colors:{fg:"#000000",bg:"#ffffff",fgDim:"#666666",border:"#6699cc",codeBg:"#e6f2ff"}},System:{colors:{fg:"#efe5c0",bg:"#000000",fgDim:"#a89984",border:"#3a3a3a",codeBg:"hsla(0,0%,100%,.07)"}}},ee="custom_theme";let te=null;function oe(){te=null;try{const e=localStorage.getItem(ee);e&&(te=JSON.parse(e))}catch(e){console.log(i+" Could not parse site custom_theme:",e)}}function ae(){return oe(),te}oe();const ne=/^[a-z][a-z0-9_]{0,31}$/i,ie=/^(#[0-9a-f]{3,8}|(rgba?|hsla?)\([\d\s.,%/]+\)|[a-z0-9-]{1,32})$/i;function re(e){if(!e||"object"!=typeof e||Array.isArray(e)||"string"!=typeof e.fg||"string"!=typeof e.bg)throw new Error("This is not a Cyberspace custom theme.");const t={};for(const[o,a]of Object.entries(e)){if(!ne.test(o)||!("boolean"==typeof a||"number"==typeof a&&Number.isFinite(a)||"string"==typeof a&&ie.test(a)))throw new Error(`This custom theme was not loaded. Its "${o}" setting is not one Cyberspace's Appearance settings can make.`);t[o]=a}return t}function le(e){const t=JSON.stringify(re(e));return localStorage.getItem(ee)!==t&&(localStorage.setItem(ee,t),oe(),!0)}function se(e,t){if(!t)return null;if(e[t])return e[t];const o=t.toLowerCase();for(const[t,a]of Object.entries(e))if(t.toLowerCase()===o||a.id?.toLowerCase()===o)return a;return null}function ce(e){const t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null}function de(e){const t=ce(e);if(!t)return null;let o=t.r/255,a=t.g/255,n=t.b/255;const i=Math.max(o,a,n),r=Math.min(o,a,n);let l,s,c=(i+r)/2;if(i===r)l=s=0;else{const e=i-r;switch(s=c>.5?e/(2-i-r):e/(i+r),i){case o:l=((a-n)/e+(a(o<0&&(o+=1),o>1&&(o-=1),o<1/6?e+6*(t-e)*o:o<.5?t:o<2/3?e+(t-e)*(2/3-o)*6:e),l=o<.5?o*(1+t):o+t-o*t,s=2*o-l;a=r(s,l,e+1/3),n=r(s,l,e),i=r(s,l,e-1/3)}return{r:Math.round(255*a),g:Math.round(255*n),b:Math.round(255*i)}}function pe({r:e,g:t,b:o}){const a=e=>Math.max(0,Math.min(255,Math.round(e))).toString(16).padStart(2,"0");return`#${a(e)}${a(t)}${a(o)}`}function ue(e,t="hsl"){if(!e)return null;let o,a,n;"string"==typeof e?(o=e.match(/hsla?\(([\d.]+),\s*([\d.]+)%?,\s*([\d.]+)%?(?:,\s*[\d.]+)?\)/),a=e.match(/rgba?\(([\d.]+),\s*([\d.]+),\s*([\d.]+)(?:,\s*[\d.]+)?\)/),n=e.match(/^#([a-f\d]{6}|[a-f\d]{3})$/i)):"object"==typeof e&&(void 0!==e.h&&void 0!==e.s&&void 0!==e.l?o=[null,e.h,e.s,e.l]:void 0!==e.r&&void 0!==e.g&&void 0!==e.b&&(a=[null,e.r,e.g,e.b]));const i=t.match("-string")?"string":"object";if("hsl"===(t=t.replace(/-string|-object$/,""))){if(o)return"string"===i?`hsl(${(+o[1]).toFixed(1)}, ${(+o[2]).toFixed(1)}%, ${(+o[3]).toFixed(1)}%)`:{h:+o[1],s:+o[2],l:+o[3]};if(a){const e=function(e,t,o){e/=255,t/=255,o/=255;const a=Math.max(e,t,o),n=Math.min(e,t,o);let i,r,l=(a+n)/2;if(a===n)i=r=0;else{const s=a-n;switch(r=l>.5?s/(2-a-n):s/(a+n),a){case e:i=((t-o)/s+(tt?r.l+=5:r.l-=5:t>e?l.l+=5:l.l-=5,n=me(r,l),s++,i.adjusted=!0}return i.colorAdjust=ue(l,a),i.colorCompare=ue(r,a),i.contrast=n,i.loopCount=s,i}function fe(e){return e.replace(/([A-Z])/g,"-$1").toLowerCase()}function ye(e=null,t=null){const o=document.documentElement,a=getComputedStyle(o),n=(e=e??o.dataset.theme??document.body?.dataset?.theme)?se(Q,e):null,i=te?{bg:te.bg,fg:te.fg,fgDim:te.fgDim||te.dim,border:te.border,codeBg:te.codeBg||te.code_bg}:null,r=Q["Full Spectrum"].colors;function l(e){return!(!e||"transparent"===e||"none"===e||!ce(e)&&!e.startsWith("rgb")&&!e.startsWith("hsl"))}function s(e,t){const o=a.getPropertyValue(e).trim();return l(o)?o:i&&l(i[t])?i[t]:n&&n.colors&&l(n.colors[t])?n.colors[t]:r[t]}let c=s("--color-fg","fg"),d=s("--color-bg","bg");if(n?.logic){const e=n.logic.invertedContainerBg??"fg",t=n.logic.invertedContainerFg??"bg",o="--color-"+fe(e),a="--color-"+fe(t);c=s(o,e),d=s(a,t)}const h={bg:s("--color-bg","bg"),fg:s("--color-fg","fg"),fgDim:s("--color-fg-dim","fgDim"),border:s("--color-border","border"),codeBg:s("--color-code-bg","codeBg"),invertedBg:c,invertedFg:d,error:"#ff6b6b",warn:"#ffd93d",success:"#6bcb77",info:"#4d96ff",errorBg:"#1a0d0d",warnBg:"#1a250d",successBg:"#152a15",infoBg:"#15152a"},p=de(h.fg)||ue(h.fg,"hsl"),u=de(h.bg)||ue(h.bg,"hsl");function g(e,t,o,a,n=4.5){let i=o,r=he(e,t,i),l=me(r,a);if(l>=n)return`hsl(${e}, ${t}%, ${i}%)`;const s=ge(a)>.5?-5:5;for(let o=0;o<15&&(i=Math.max(5,Math.min(95,i+s)),r=he(e,t,i),l=me(r,a),!(l>=n));o++);return`hsl(${e}, ${t}%, ${i}%)`}if(p&&u){let e=Math.max(p.s,50),t=p.l;(t<20||t>80)&&(t=50,e=Math.max(e,70));const o=he(u.h,u.s,u.l);h.error=g(0,e,t,o),h.warn=g(45,e,t,o),h.success=g(120,e,t,o),h.info=g(210,e,t,o)}if(u){let e=Math.max(u.s,20),t=u.l;if(t<5?(t=10,e=Math.max(e,30)):t>95&&(t=90,e=Math.max(e,30)),h.errorBg=`hsl(0, ${e}%, ${t}%)`,h.warnBg=`hsl(45, ${e}%, ${t}%)`,h.successBg=`hsl(120, ${e}%, ${t}%)`,h.infoBg=`hsl(210, ${e}%, ${t}%)`,h.error&&h.errorBg){const e=be(h.errorBg,h.error,4.5,"hsl-string");h.error=e.colorAdjust,h.errorBg=e.colorCompare}if(h.warn&&h.warnBg){const e=be(h.warnBg,h.warn,4.5,"hsl-string");h.warn=e.colorAdjust,h.warnBg=e.colorCompare}if(h.success&&h.successBg){const e=be(h.successBg,h.success,4.5,"hsl-string");h.success=e.colorAdjust,h.successBg=e.colorCompare}if(h.info&&h.infoBg){const e=be(h.infoBg,h.info,4.5,"hsl-string");h.info=e.colorAdjust,h.infoBg=e.colorCompare}}if(h.fgDim&&h.bg&&(h.fgMuted=function(e,t,o=4.5){const a=be(e,t,o,"hsl-string").colorAdjust;return me(e,a)>=o?a:me(e,"#000000")>=me(e,"#ffffff")?"#000000":"#ffffff"}(h.bg,h.fgDim)),t)for(const e in h){const o=ue(h[e],t);o&&(h[e]=o)}return h}function ve(e=null){const t=ye(e),o=document.documentElement;o.style.setProperty("--atmo-bg",t.bg),o.style.setProperty("--atmo-fg",t.fg),o.style.setProperty("--atmo-fg-dim",t.fgDim),o.style.setProperty("--atmo-fg-muted",t.fgMuted),o.style.setProperty("--atmo-border",t.border),o.style.setProperty("--atmo-code-bg",t.codeBg),o.style.setProperty("--atmo-inverted-bg",t.invertedBg),o.style.setProperty("--atmo-inverted-fg",t.invertedFg),o.style.setProperty("--atmo-error",t.error),o.style.setProperty("--atmo-warn",t.warn),o.style.setProperty("--atmo-success",t.success),o.style.setProperty("--atmo-info",t.info),o.style.setProperty("--atmo-error-bg",t.errorBg),o.style.setProperty("--atmo-warn-bg",t.warnBg),o.style.setProperty("--atmo-success-bg",t.successBg),o.style.setProperty("--atmo-info-bg",t.infoBg)}let we=null;const ke="undefined"!=typeof GM_xmlhttpRequest?GM_xmlhttpRequest:"undefined"!=typeof GM&&"function"==typeof GM.xmlHttpRequest?GM.xmlHttpRequest:null;function xe(e){return ke?new Promise((t,o)=>{ke({method:"GET",url:e,onload:e=>t(e.responseText),onerror:t=>o(t instanceof Error?t:new Error(`Request failed: ${e}`))})}):Promise.resolve().then(()=>fetch(e)).then(e=>e.text())}function Se(){const e="undefined"!=typeof GM_info&&GM_info.script?GM_info.script:null;return e&&(e.downloadURL||e.updateURL)||t}function Ce(e,t){const o=e=>String(e??"").trim().replace(/^v/i,"").split("."),a=o(e),n=o(t),i=Math.max(a.length,n.length);for(let e=0;e0}function Ae(t){const o=t.match(/@version\s+(\S+)/);if(!o)return;const a=o[1];we=!!$e(a,e)&&a}let Ee=null;function Le(){if(!Ee){const e=ke?Se():t;Ee=xe(e).then(Ae).catch(e=>Eo(i+" Update check failed:",e))}return Ee}let Ne=null;function Te(){if(!Ne){const e=new Promise(e=>setTimeout(()=>e(null),5e3));Ne=Promise.race([xe("https://raw.githubusercontent.com/z0mbieparade/cyberspace-atmospheric-modulator/refs/heads/main/CHANGELOG.md"),e]).then(e=>e?function(e,t=null,o=null){const a=[];let n=null;for(const[,i,r]of String(e).replace(/\r\n?/g,"\n").matchAll(/^## \[([^\]\n]+)\][^\n]*\n+(?:> ?([^\n]+))?/gm)){if(!/^\d+(\.\d+)*$/.test(i))continue;if(n&&$e(i,n))break;if(n=i,!r?.trim())continue;if(t&&!$e(i,t)||o&&$e(i,o))continue;const e=r.trim();a.push({version:i,summary:e.length>160?e.slice(0,159)+"…":e})}return a.sort((e,t)=>Ce(t.version,e.version))}(e):null).catch(e=>(Eo(i+" Changelog failed:",e),null))}return Ne}const je=`${O}-update-banners`,Oe=`${M}-update-banner`;function Me(t){return!!t&&$e(t,e)&&$e(t,C("dismissedUpdateVersion","")||"")&&!document.getElementById(Oe)}function De(){return Le().then(async()=>{var t;Me(we)&&function(t,o=[]){if(!Me(t))return null;ve();let a=document.getElementById(je);a||(a=document.createElement("div"),a.id=je,a.className=F("update-banners"),document.body.appendChild(a));const n=document.createElement("div");n.id=Oe,n.className=F("update-banner"),n.setAttribute("role","status"),n.innerHTML=`\n\t\t\n\t\t
\n\t\t\t${l} v${z(t)} is available — you're on v${e}\n\t\t\t${function(e){if(!e.length)return"";const t=e.slice(0,3).map(({version:e,summary:t})=>`
  • v${z(e)}: ${z(t)}
  • `),o=e.length-3;return o>0&&t.push(`
  • and ${o} more ${1===o?"update":"updates"}
  • `),`
      ${t.join("")}
    `}(o)}\n\t\t
    \n\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t`,a.appendChild(n),requestAnimationFrame(()=>n.classList.add(F("update-banner-visible")));const i=()=>{n.classList.remove(F("update-banner-visible")),setTimeout(()=>{n.remove(),a.children.length||a.remove()},400)};n.querySelector("."+F("update-banner-update")).addEventListener("click",()=>{window.open(Se(),"_blank"),i()}),n.querySelector("."+F("update-banner-later")).addEventListener("click",i),n.querySelector("."+F("update-banner-dismiss")).addEventListener("click",()=>{S("dismissedUpdateVersion",t),i()})}(we,await(t=we,Te().then(o=>(o||[]).filter(({version:o})=>$e(o,e)&&!$e(o,t)))))})}function Ie(e){const t=()=>{e.classList.toggle(F("update-available"),!!we),e.title=we?`Update available: v${we} (click to update)`:"Up to date"};t(),e.addEventListener("click",()=>{window.open(Se(),"_blank")}),Le().then(t)}const Fe="https://api.cyberspace.online/v1";class ze extends Error{}class qe extends Error{constructor(e,t){super(e),this.status=t}}async function Re(e,t,o){return(await He(e,t,o))?.data}async function He(e,t,o){const a=await new Promise(e=>{let t;try{t=indexedDB.open("firebaseLocalStorageDb")}catch(t){return void e(null)}t.onupgradeneeded=()=>{t.transaction.abort(),e(null)},t.onerror=()=>e(null),t.onsuccess=()=>{const o=t.result;let a;try{a=o.transaction("firebaseLocalStorage","readonly").objectStore("firebaseLocalStorage").getAll()}catch(t){return o.close(),void e(null)}a.onerror=()=>{o.close(),e(null)},a.onsuccess=()=>{o.close();const t=a.result.map(e=>e?.value?.stsTokenManager).filter(e=>"string"==typeof e?.accessToken&&Number(e.expirationTime)>Date.now()+6e4);e(t[0]?.accessToken??null)}}});if(!a)throw new Error("Not signed in to Cyberspace.");const n={Authorization:`Bearer ${a}`,"Content-Type":"application/json"},i=void 0===o?void 0:JSON.stringify(o),r=Fe+t,l=ke?await new Promise((t,o)=>{ke({method:e,url:r,headers:n,data:i,timeout:15e3,redirect:"error",onload:e=>{!e.finalUrl||e.finalUrl.startsWith(Fe)?t({status:e.status,text:e.responseText}):o(new ze("Cyberspace answered from another address, so the answer was ignored."))},onerror:()=>o(new ze("Could not reach Cyberspace.")),ontimeout:()=>o(new ze("Cyberspace did not answer."))})}):await fetch(r,{method:e,headers:n,body:i,redirect:"error",signal:AbortSignal.timeout(15e3)}).then(async e=>({status:e.status,text:await e.text()})).catch(()=>{throw new ze("Could not reach Cyberspace.")});let s=null;try{s=JSON.parse(l.text)}catch(e){}if(l.status<200||l.status>=300){const e=s?.error?.message||s?.message||`error ${l.status}`;throw new qe(`Cyberspace refused it: ${e}`,l.status)}return s}async function Be(){const e=await Re("GET","/users/me");if("string"!=typeof e?.username||!e.username)throw new Error("Cyberspace did not say who is signed in.");return e.username}async function Ve(e=null){const t=e?`?limit=50&cursor=${encodeURIComponent(e)}`:"?limit=50",o=await He("GET","/notes"+t);return{notes:Array.isArray(o?.data)?o.data:[],cursor:o?.cursor??null}}function Ue(e){const t=e?.noteId??e?.postId??e?.id;return"string"==typeof t&&t?t:null}async function Pe(e){return Re("GET",`/notes/${encodeURIComponent(e)}`)}class Ge extends Error{}async function We(e,t=Qe(16)){const o=await crypto.subtle.importKey("raw",(new TextEncoder).encode(e),"PBKDF2",!1,["deriveKey"]);return{salt:t,key:await crypto.subtle.deriveKey({name:"PBKDF2",hash:"SHA-256",salt:t,iterations:6e5},o,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"])}}async function _e(e){try{const t=tt(e.salt),o=await crypto.subtle.importKey("raw",tt(e.key),"AES-GCM",!0,["encrypt","decrypt"]);return 16===t.length?{salt:t,key:o}:null}catch(e){return console.error(i+" Could not use a kept key:",e),null}}function Ze(e){let t;try{t=tt(e.replace(/\s+/g,""))}catch(e){throw new Error("The locked text is damaged.")}if(t.length<=29||1!==t[0])throw new Error("The locked text is damaged, or from a newer version.");return{salt:t.subarray(1,17),iv:t.subarray(17,29),ciphertext:t.subarray(29)}}function Je(e){return Ze(e).salt}async function Ke(e,{key:t}){const{iv:o,ciphertext:a}=Ze(e);let n;try{n=await crypto.subtle.decrypt({name:"AES-GCM",iv:o,additionalData:new Uint8Array([1])},t,a)}catch(e){throw new Ge("That passphrase does not open it, or it was changed.")}try{return(new TextDecoder).decode(await Ye(Xe(n),new DecompressionStream("gzip")))}catch(e){throw new Error("The locked text opened, but is damaged.")}}async function Ye(e,t){const o=new Response(e).body.pipeThrough(t);return Xe(await new Response(o).arrayBuffer())}function Xe(e){const t=new Uint8Array(e),o=new Uint8Array(t.length);return o.set(t),o}function Qe(e){const t=new Uint8Array(e);return crypto.getRandomValues(t),t}function et(e){let t="";for(let o=0;oe.charCodeAt(0))}function ot(e){return`linear-gradient(to right, ${e.map(e=>{const[t,o,a,n=1,i=null]=e;return`hsla(${t}, ${o}%, ${a}%, ${n})${null!==i?` ${i}%`:""}`}).join(", ")})`}function at(e){const{type:t="single",simple:o=!1,inline:a=!1,min:n=0,max:i=100,step:r=1,onChange:l,label:s}=e,c="range"===t,d=I("slider"),h=c?2:1,p=c?["minimum","maximum"]:[""],u=c?["▶","◀"]:[""],g=document.createElement("div");a&&!c&&s&&(g.className=F("slider-inline"));const m=e=>[s?d:"",c?`${d}-name-${e}`:""].filter(Boolean);g.innerHTML=`\n\t\t${s?``:""}\n\t\t
    \n\t\t\t\n\t\t\t\n\t\t\t${p.map((e,t)=>`\n\t\t\t\t\n\t\t\t\t\n\t\t\t`).join("")}\n\t\t
    \n\t\t
    \n\t\t\t${p.map((e,t)=>``).join("")}\n\t\t
    \n\t\t\n\t\t${p.map((e,t)=>e?``:"").join("")}\n\t`;const b=g.querySelector("."+F("slider")),f=g.querySelector("."+F("slider-track")),y=g.querySelector("."+F("slider-track-mapped")),v=g.querySelectorAll("."+F("slider-input")),w=g.querySelectorAll("."+F("slider-thumb")),k=g.querySelectorAll("."+F("slider-labels")+" > button"),x=e=>(e=>Math.max(n,Math.min(i,e)))(Math.round((e-n)/r)*r+n);let S=c?[...e.values||[n,i]]:[e.value??n];const C=e=>(e-n)/(i-n)*100;function $(e,t){const o=C(t)/100;e.style.left=`calc(${100*o}% + var(--thumb-w) * ${.5-o})`}function A(){for(let e=0;el?.(c?[...S]:S[0]);function L(e){if(c){const t=C(S[0]),o=C(S[1]),a=t>o,n=(e,t,o)=>{const[a,n,i,r,l]=e,[s,c,d,h,p]=t,u=p===l?0:(o-l)/(p-l);return[Math.round(a+u*(s-a)),Math.round(n+u*(c-n)),Math.round(i+u*(d-i)),r+u*(h-r),o]},i=t=>{for(let o=0;o=e[o][4]&&t<=e[o+1][4])return[e[o],e[o+1]];return[e[0],e[e.length-1]]},r=[...new Set([...e.map(e=>e[4]),t,o])].sort((e,t)=>e-t),l=[];r.forEach(e=>{const r=n(...i(e),e),s=r.slice(0,3);if(e===t)l.push([...s,.5,e],[...s,1,e]);else if(e===o)l.push([...s,1,e],[...s,.5,e]);else{const n=a?e>=t||e<=o:e>=t&&e<=o;l.push([...s,n?r[3]:.5,e])}}),e=l}f.style.background=ot(e)}v.forEach((e,t)=>{e.addEventListener("input",()=>{S[t]=Number(e.value),A(),E()})}),c&&b.addEventListener("click",e=>{if(v[0].disabled||e.target.closest("."+F("slider-input")))return;const t=b.getBoundingClientRect();if(!t.width)return;const o=Math.max(0,Math.min(1,(e.clientX-t.left)/t.width)),a=x(n+o*(i-n)),r=Math.abs(a-S[0])<=Math.abs(a-S[1])?0:1;S[r]=a,A(),E()}),k.forEach((e,t)=>{e.addEventListener("click",()=>{const o=S[t],a=document.createElement("input");a.type="number",a.min=String(n),a.max=String(i),a.step=String(r),a.value=String(o),a.className=F("slider-value-input"),m(t).length?a.setAttribute("aria-labelledby",m(t).join(" ")):a.setAttribute("aria-label","value"),e.hidden=!0,e.after(a),a.focus(),a.select();let l=!1;a.addEventListener("blur",()=>{const n=Number(a.value);a.remove(),e.hidden=!1,S[t]=l||""===a.value||Number.isNaN(n)?o:x(n),A(),S[t]!==o&&E()}),a.addEventListener("keydown",t=>{"Enter"!==t.key&&"Escape"!==t.key||(t.preventDefault(),t.stopPropagation(),l="Escape"===t.key,e.hidden=!1,e.focus())})})});const N=[];function T(){const e=v[0].disabled;w.forEach((t,o)=>{t.style.background=e?`var(--${O}-fg-dim)`:N[o]||""})}return e.gradient&&L(e.gradient),A(),{el:g,getValue:()=>S[0],getValues:()=>[...S],setValue:e=>{S[0]=e,A()},setValues:e=>{S=[...e],A()},setGradient:L,setSplitGradient:function(e,t){if(!e)return b.classList.remove(F("slider-split")),void(y.style.background="");b.classList.add(F("slider-split")),y.style.background=ot(e),f.style.background=ot(t)},setThumbColor:function(e){(Array.isArray(e)?e:[e]).forEach((e,t)=>{e&&(N[t]=e)}),T()},setDisabled:function(e){v.forEach(t=>{t.disabled=e}),k.forEach(t=>{t.disabled=e}),b.classList.toggle(F("slider-disabled"),e),T()}}}function nt(e){const{schema:t,values:o={},defaults:a={},onChange:n,container:i,inlineSliders:r=!1}=e,l={},s={};function c(e){if(!e)return!0;if(void 0!==e.field){const t=l[e.field];return!t||t.value===e.is}return e.any?e.any.some(e=>c(e)):!e.all||e.all.every(e=>c(e))}function d(e){const t=l[e];if(!t||!t.definition.showWhen)return;const o=c(t.definition.showWhen);t.wrapper&&(t.wrapper.style.display=o?"":"none")}function h(e){(s[e]||[]).forEach(e=>d(e))}function p(e,t){if(!t)return;const o=t=>{t.field&&(s[t.field]||(s[t.field]=[]),s[t.field].includes(e)||s[t.field].push(e)),t.any&&t.any.forEach(o),t.all&&t.all.forEach(o)};o(t)}function u(e,t,o=!0){const a=l[e];a&&(a.value=t,function(e,t){const o=l[e];if(!o)return;const{definition:a,element:n,slider:i}=o;switch(a.type){case"toggle":n&&(n.checked=!!t,B(n));break;case"tristate":n&&V(n,t);break;case"slider":i&&i.setValue(t);break;case"range":i&&i.setValues(t);break;case"text":case"textarea":case"select":n&&(n.value=t||"")}}(e,t),o&&(h(e),a.definition.onChange?.(t,f),n?.(e,t,f)))}function g(e,t,a=""){const{key:n,type:i,label:s,hint:c,showWhen:d}=e,h=document.createElement("div");h.className=e.sub?F("settings-field","sub-setting"):F("settings-field"),n&&(h.dataset.fieldKey=n);const g=n?void 0!==o[n]?o[n]:e.default:void 0;let m=null,b=null;const y=I(`settings-${n||e.id}`),v=e.ariaLabel||(e.label?"":a);switch(i){case"toggle":h.innerHTML=q({type:"toggle",label:e.label,ariaLabel:v,id:y,checked:!!g,disabled:"function"==typeof e.disabled?e.disabled(o):e.disabled}),m=h.querySelector(`#${y}`),m&&m.addEventListener("change",()=>{u(n,m.checked)});break;case"tristate":h.innerHTML=q({type:"tristate",label:e.label,id:y,state:g??null,defaultLabel:e.defaultLabel||""}),m=h.querySelector(`#${y}`),m&&(V(m,g??null),m.addEventListener("change",()=>{const e=l[n].value;u(n,null===e||!0!==e&&null)}));break;case"slider":b=at({type:"single",simple:!1!==e.simple,inline:r,min:e.min??0,max:e.max??100,step:e.step??1,value:g??e.default??e.min??0,label:e.label,onChange:e=>u(n,e)}),h.appendChild(b.el);break;case"range":b=at({type:"range",min:e.min??0,max:e.max??100,step:e.step??1,values:g??e.default??[e.min??0,e.max??100],label:e.label,onChange:e=>u(n,e)}),h.appendChild(b.el);break;case"text":h.innerHTML=q({type:"text",label:e.label,ariaLabel:v,id:y,value:g||"",placeholder:e.placeholder||""}),m=h.querySelector(`#${y}`),m&&m.addEventListener("input",()=>{u(n,m.value)});break;case"textarea":h.innerHTML=q({type:"textarea",label:e.label,ariaLabel:v,id:y,value:g||"",placeholder:e.placeholder||""}),m=h.querySelector(`#${y}`),m&&m.addEventListener("input",()=>{u(n,m.value)});break;case"select":{const t=e.options.map(e=>{const{value:t,label:o}="string"==typeof e?{value:e,label:e}:e;return``}).join("");h.innerHTML=q({type:"select",label:e.label,ariaLabel:v,id:y,options:t}),m=h.querySelector(`#${y}`),m&&(m.value=g||"",m.addEventListener("change",()=>{u(n,m.value)}));break}case"button":h.innerHTML=q({type:"button",label:e.label,id:y,buttonText:e.buttonText||e.label,classes:e.danger?F("danger"):""}),m=h.querySelector(`#${y}`),m&&e.onClick&&m.addEventListener("click",()=>e.onClick(f));break;case"custom":if(e.render){const t=e.render(g,f);t&&h.appendChild(t)}break;case"hint":h.innerHTML=`
    ${e.text||e.label}
    `;break;case"hr":h.innerHTML="
    "}if(c&&"hint"!==i){const e=document.createElement("div");e.className="hint",e.innerHTML=c,h.appendChild(e)}return n&&(l[n]={value:g,element:m,slider:b,wrapper:h,definition:e},d&&p(n,d)),t.appendChild(h),h}function m(e,t){const o=e.label?e.label.replace(/<[^>]*>/g,"").trim():"",a=document.createElement("div");a.className=F("settings-section-wrapper");const n=document.createElement("div");if(n.className=F("settings-section"),e.label){const t=document.createElement("h4");t.innerHTML=e.label,n.appendChild(t)}if(e.hint){const t=document.createElement("div");t.className="hint",t.innerHTML=e.hint,n.appendChild(t)}if(e.fields&&e.fields.forEach(e=>{"section"===e.type?m(e,n):g(e,n,o)}),a.appendChild(n),!e.noHr){const e=document.createElement("hr");a.appendChild(e)}if(t.appendChild(a),e.showWhen){const t=`_section_${e.label||Math.random()}`;l[t]={value:null,element:null,slider:null,wrapper:a,definition:e},p(t,e.showWhen)}return a}function b(e,t=!1){Object.keys(e).forEach(o=>{l[o]&&u(o,e[o],t)}),Object.keys(l).forEach(e=>d(e))}const f={render:function(){i&&(t.forEach(e=>{"section"===e.type?m(e,i):g(e,i)}),Object.keys(l).forEach(e=>{d(e)}))},getValues:function(){const e={};return Object.keys(l).forEach(t=>{const o=l[t];o&&!["button","custom"].includes(o.definition.type)&&(e[t]=o.value)}),e},setValues:b,reset:function(){const e={...a},o=t=>{t.forEach(t=>{"section"===t.type&&t.fields?o(t.fields):t.key&&void 0!==t.default&&void 0===e[t.key]&&(e[t.key]=t.default)})};o(t),b(e,!0)},getField:function(e){const t=l[e];return t?{element:t.element,wrapper:t.wrapper,getValue:()=>t.value,setValue:t=>u(e,t),setGradient:t.slider?.setGradient,setSplitGradient:t.slider?.setSplitGradient,setThumbColor:t.slider?.setThumbColor,setDisabled:t.slider?.setDisabled,setValues:t.slider?.setValues,getValues:t.slider?.getValues}:null},destroy:function(){i&&(i.innerHTML=""),Object.keys(l).forEach(e=>delete l[e]),Object.keys(s).forEach(e=>delete s[e])},fields:l,setFieldValue:u,getFieldValue:function(e){const t=l[e];if(t)return t.value},updateDependencies:h};return f}const it=`${O}-settings-panel`,rt=`data-${O}-settings-tab`,lt=`data-${O}-settings-section`,st=`data-${O}-settings-section-order`,ct=`data-${O}-settings-hidden`,dt=`data-${O}-settings-class`,ht=[],pt=new Set,ut="settingsSectionsOpen",gt=`data-${O}-settings-fold-synced`,mt=new Set;let bt=!1;const ft=`data-${O}-settings-tab-label`,yt=`data-${O}-settings-tab-title`,vt=`data-${O}-settings-tab-hash`,wt="userscripts",kt=`data-${O}-settings-tab-warning`,xt=`data-${O}-settings-tab-attribution`,St=`data-${O}-settings-tab-owner`,Ct=`data-${O}-version-bound`,$t=`${O}-settings-notice`,At=`data-${O}-settings-notice-html`;function Et(){return"#"+(document.documentElement.getAttribute(vt)||wt)}function Lt(e,t,o){null===o?e.hasAttribute(t)&&e.removeAttribute(t):e.getAttribute(t)!==o&&e.setAttribute(t,o)}function Nt(e){ht.push(e),Vt(),Gt()}function Tt(){try{const e=JSON.parse(C(ut,"{}"));return e&&"object"==typeof e&&!Array.isArray(e)?e:{}}catch(e){return{}}}function jt(e){return mt.has(e.key)||function(e){const t=Tt();return"boolean"==typeof t[e.key]?t[e.key]:!!e.startsOpen}(e)}function Ot(e){return e.closest(`[${lt}]`)?.querySelector(":scope > h3 > button")??null}function Mt(e,t){Ot(e).setAttribute("aria-expanded",String(t)),e.querySelector(":scope > h3 + div").hidden=!t}function Dt(e,t){if(!w())return;const o=Tt();o[e]!==t&&(o[e]=t,S(ut,JSON.stringify(o)))}function It(e){for(const t of ht){const o=e.querySelector(`[${lt}="${t.key}"]`);if(t.isShown&&!t.isShown()){o?.remove();continue}if(o){!o.hasAttribute(gt)&&w()&&(Mt(o,jt(t)),o.setAttribute(gt,""));continue}const a=document.createElement("section");a.setAttribute(lt,t.key);const n=t.order??0;a.setAttribute(st,String(n)),a.className="terminal-box p-4 mb-3";const i=document.createElement("h3");i.className=`text-xs ${t.description?"mb-2":"mb-3"} uppercase tracking-wider`;const r=document.createElement("button");r.type="button",r.className=F("settings-fold");const l=document.createElement("span");l.className=F("settings-fold-marker"),l.setAttribute("aria-hidden","true");const s=document.createElement("span");s.textContent=t.title,r.append(l,s),t.icon&&s.insertAdjacentHTML("beforebegin",t.icon),i.append(r),a.append(i);const c=document.createElement("div");if(c.id=I("settings-fold"),r.setAttribute("aria-controls",c.id),t.description){const e=document.createElement("p");e.className="text-fg-dim text-sm mb-3",e.textContent=t.description,c.append(e)}const d=document.createElement("div");d.className=F("panel"),c.append(d),a.append(c),Mt(a,jt(t)),w()&&a.setAttribute(gt,""),r.addEventListener("click",()=>{mt.delete(t.key);const e="true"!==r.getAttribute("aria-expanded");Mt(a,e),Dt(t.key,e)});const h=Array.from(e.children).find(e=>{const o=e.getAttribute(lt);if(null===o)return!1;const a=Number(e.getAttribute(st))||0;return a>n||a===n&&o>t.key});e.insertBefore(a,h||null),t.render(d)}}function Ft(e){document.querySelectorAll(`[${lt}="${e}"]`).forEach(e=>e.remove()),Gt()}function zt(){const e=document.getElementById(it);if(!e)return;const t=new Set(ht.map(e=>e.key)),o=document.activeElement,a=e.contains(o)?o.closest(`[${lt}]`):null,n=a?.getAttribute(lt),i=a?o.closest("[data-field-key]")?.dataset.fieldKey:void 0;if(e.querySelectorAll(`[${lt}]`).forEach(e=>{t.has(e.getAttribute(lt))&&e.remove()}),Gt(),!n||!t.has(n))return;const r=e.querySelector(`[${lt}="${n}"]`),l=i&&r?.querySelector(`[data-field-key="${i}"] :is(input, select, textarea, button)`);(l||r&&Ot(r))?.focus()}const qt=`${O}-settings-focus`;function Rt(){location.hash!==Et()&&(location.hash=Et()),Gt()}function Ht(e){if(location.pathname.startsWith("/settings/")&&Ut().length>0)return Rt(),void Bt(e);sessionStorage.setItem(qt,JSON.stringify({key:e,expires:Date.now()+3e4})),location.assign(function(){const e=localStorage.getItem("lastSettingsTab");return(e&&/^\/settings\/[a-z]+$/.test(e)?e:"/settings/account")+Et()}())}function Bt(e,t=document){const o=t.querySelector(`[${lt}="${e}"] > h3`);if(!o||o.closest("[hidden]"))return!1;const a=o.parentElement;return mt.add(e),Mt(a,!0),x(()=>Dt(e,!0)),o.tabIndex=-1,o.scrollIntoView?.({block:"start"}),o.focus(),!0}function Vt(){if(bt)return;bt=!0;let e=!1;const t=()=>{e||(e=!0,setTimeout(()=>{e=!1,Gt()},0))};new MutationObserver(t).observe(document.body,{childList:!0,subtree:!0}),x(t),window.addEventListener("hashchange",t),window.addEventListener("popstate",t),document.addEventListener("click",e=>{const t=e.target.closest&&e.target.closest("a");if(t&&t.closest("main"))return t.hasAttribute(rt)?(e.preventDefault(),void Rt()):void(0!==e.button||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||/^\/settings\//.test(t.getAttribute("href")||"")&&Gt(!1))},!0)}function Ut(){return Array.from(document.querySelectorAll('main a[href="/settings/account"]')).map(e=>e.parentElement).filter((e,t,o)=>e&&o.indexOf(e)===t)}function Pt(e){return(e.getAttribute(dt)??e.className).split(/\s+/).filter(e=>e&&!e.startsWith("router-link")).join(" ")}function Gt(e=location.pathname.startsWith("/settings/")&&location.hash===Et()){for(const e of pt)e.isConnected?It(e):pt.delete(e);const t=Ut();if(!t.length)return;for(const o of t){const t=Array.from(o.querySelectorAll(`a[href^="/settings/"]:not([${rt}])`)),a=t.find(e=>"page"===e.getAttribute("aria-current")),n=t.filter(e=>e.hasAttribute(dt)),i=t.find(e=>e!==a&&!n.includes(e));if(!i)continue;let r=o.querySelector(`a[${rt}]`);r||(r=document.createElement("a"),r.setAttribute(rt,""),t[t.length-1].after(r)),r.href=location.pathname+Et();const l=document.documentElement.getAttribute(ft)||"Userscripts",s=document.documentElement.getAttribute(yt)||"";if(r.textContent!==l&&(r.textContent=l),Lt(r,"title",s||null),Lt(r,"aria-label",s?`${l}, ${s}`:null),e){const e=a||n[0];e&&(e.hasAttribute(dt)||e.setAttribute(dt,e.className),r.className=Pt(e),e.className=Pt(i),e.removeAttribute("aria-current")),r.setAttribute("aria-current","page")}else{for(const e of n)a||(e.className=e.getAttribute(dt),e.setAttribute("aria-current","page")),e.removeAttribute(dt);r.className=Pt(i),r.removeAttribute("aria-current")}}const o=t[0].parentElement;let a=document.getElementById(it),n=!1;a&&a.parentElement===o||(a?.remove(),a=document.createElement("div"),a.id=it,a.className="mb-6",t[t.length-1].after(a),n=!0),e&&(n||a.hidden)&&ve(),a.hidden=!e;const i=document.documentElement;let r=[];try{r=JSON.parse(i.getAttribute(xt)||"[]")}catch(e){}const l=(i.getAttribute(kt)?P(i.getAttribute(kt)):"")+K(r);let s=a.querySelector(":scope > ."+$t);if(l){s||(s=document.createElement("div"),s.className=`${$t} ${F("panel")} mb-3`),a.firstElementChild!==s&&a.prepend(s),s.getAttribute(At)!==l&&(s.setAttribute(At,l),s.innerHTML=l);const e=s.querySelector("."+F("version-link"));e&&i.getAttribute(St)===M&&!e.hasAttribute(Ct)&&(e.setAttribute(Ct,M),Ie(e))}else s?.remove();for(const n of Array.from(o.children))if(!t.includes(n)&&n!==a)if(e&&!n.hasAttribute(ct))n.setAttribute(ct,n.style.getPropertyValue("display")),n.style.setProperty("display","none","important");else if(!e&&n.hasAttribute(ct)){const e=n.getAttribute(ct);e?n.style.setProperty("display",e):n.style.removeProperty("display"),n.removeAttribute(ct)}It(a);const c=function(){const e=sessionStorage.getItem(qt);if(!e)return null;try{const{key:t,expires:o}=JSON.parse(e);if("string"==typeof t&&Date.now()e,accept:o=".json"}={}){const a=document.createElement("input");a.type="file",a.accept=o,a.addEventListener("change",()=>{const o=a.files[0];if(!o)return;const n=new FileReader;n.onload=()=>{let o;try{o=t(n.result)}catch(t){return void e(null,t)}e(o,null)},n.onerror=()=>e(null,new Error(`Could not read ${o.name}.`)),n.readAsText(o)}),a.click()}function Jt(e,{parse:t=e=>e,title:o="Paste Settings",label:a="Paste your settings below."}={}){const n=I("paste"),i=X({title:o,width:"400px",onHelp:null,warning:"",attribution:[],content:`\n\t\t\t\n\t\t\t\n\t\t`,buttons:[{label:"IMPORT",class:"import",onClick:o=>{const a=i.value.trim();if(!a)return void alert("Paste the settings first.");let n;try{n=t(a)}catch(t){return void e(null,t)}o(),e(n,null)}},{label:"CANCEL",class:"cancel",onClick:e=>e()}]}).querySelector("#"+n);i.focus()}const Kt=`${O}-open-compose`,Yt=`${O}-compose-message`;function Xt(e,t,o){"sent"===e?alert(o):"unsure"===e&&alert(`It may not have sent. Check your C-Mail with @${t} before sending it again.`)}async function Qt(e,t){try{return await async function(e,t){let o;try{o=await Re("POST","/cmail",{recipientUsername:e})}catch(e){throw e instanceof ze?new Error(e.message):e}if(!o?.conversationId)throw new Error("Cyberspace did not open the conversation.");await Re("POST",`/cmail/${encodeURIComponent(o.conversationId)}`,{content:t})}(e,t),"sent"}catch(o){return o instanceof ze?(Eo(i+" Sending through the API may have failed:",o.message),"unsure"):(Eo(i+" Sending through the API failed, opening C-Mail instead:",o.message),function(e,t=null){const o=`${window.location.origin}/${encodeURIComponent(e)}`;if(N(e))return Eo(i+" navigated to user profile, triggering compose shortcut"),document.dispatchEvent(new KeyboardEvent("keydown",{key:"c",code:"KeyC",bubbles:!0})),void(t&&setTimeout(()=>eo(t),300));sessionStorage.setItem(Kt,"true"),t&&sessionStorage.setItem(Yt,t),window.location.href=o}(e,t),"opened")}}function eo(e,t=0){Eo(i+` fillComposeMessage attempt ${t}`);const o=document.querySelector('input[placeholder="Type a message..."], textarea[placeholder="Type a message..."]');o?(Eo(i+" Found message input, filling it"),o.focus(),o.value=e,o.dispatchEvent(new Event("input",{bubbles:!0}))):t<20?setTimeout(()=>eo(e,t+1),200):Eo(i+" Could not find message input, giving up")}let to=null;function oo({returnFocus:e=!1}={}){if(!to)return;const{el:t,cleanup:o,opener:a}=to;to=null,o(),t.remove(),e&&a?.focus?.()}const ao=`data-${O}-user`,no=`data-${O}-mention`,io=`[${ao}]`,ro="beta.cyberspace.online"===window.location.hostname,lo=['a[href^="/"]',"span.cursor-pointer.hover\\:underline"],so=".circ-rail",co=ro?["#main-content-area",".space-y-1",so]:[".chat-main-content",".profile-box-inverted",so],ho=["/chat"],po=[".sidebar","footer",`.${O}-dialog-attribution`,`.${O}-update-banners`,".editor-wrapper","code","pre","script"];function uo(e){const t=po.map(t=>e.closest(t)).filter(Boolean);if(!t.length)return!1;const o=e.closest(so);return!o||t.some(e=>e!==o&&o.contains(e))}const go=["feed","topics","jukebox","notes","write","chat","messages","bookmarks","notifications","me","guilds","support","wiki","changelog","netiquette","faq","loading","error"],mo=[];function bo(e){return mo.some(t=>e.closest(t))}function fo(e){return!(!e||(e.startsWith("@")&&(e=e.slice(1)),e.trim()in Object.prototype||(e=e.trim().toLowerCase(),go.includes(e)||e.includes(" "))))}function yo(){if(L(o)||E(a))return[];const e=[];return document.querySelectorAll(lo.join(", ")).forEach(t=>{if(!function(e){if(e.hasAttribute(ao)||bo(e))return!1;const t=e.textContent.trim();if(t.includes(" ")){const e=t.split(" ");if(2!==e.length||e[1].includes(" ")||0===e[1].length)return!1}const o=e.getAttribute("href")||"";if((o.match(/\//g)||[]).length>1)return!1;const a=!!e.getAttribute("href");return!(co.length>0&&a&&!E(ho)&&!co.some(t=>e.closest(t)))&&(!uo(e)&&fo(o?o.startsWith("/")?o.slice(1):o:t))}(t))return;const o=function(e){const t=e.getAttribute("href");if(t&&t.startsWith("/")){const e=t.slice(1);if(!e.includes("/")&&!e.includes(".")){const e=t.match(/^\/([^\/\?#]+)/);if(e&&fo(e[1]))return e[1]}}if(e.dataset.username&&fo(e.dataset.username))return e.dataset.username;let o=e.textContent.trim();if(o.includes(" ")){const e=o.split(" ");o=e[e.length-1]}return o&&o.length<30&&(o.startsWith("@")&&(o=o.slice(1)),fo(o))?o:null}(t);o&&(t.setAttribute(ao,o),e.push(t))}),e.concat(function(){const e=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT,{acceptNode:e=>{const t=e.parentElement;return e.textContent.includes("@")&&t?t.closest(io)||bo(t)||t.closest(`.${O}-dialog-preview`)||["SCRIPT","STYLE","TEXTAREA","INPUT"].includes(t.tagName)||uo(t)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),t=[];let o;for(;o=e.nextNode();)t.push(o);const a=[];return t.forEach(e=>{const t=e.textContent,o=/@([a-zA-Z0-9_-]+)/g,n=[];let i;for(;null!==(i=o.exec(t));)i.index>0&&/[a-zA-Z0-9._-]/.test(t[i.index-1])||/^\.[a-zA-Z]/.test(t.slice(i.index+i[0].length))||fo(i[1])&&n.push({full:i[0],username:i[1],index:i.index});if(0===n.length)return;const r=document.createDocumentFragment();let l=0;n.forEach(e=>{e.index>l&&r.appendChild(document.createTextNode(t.slice(l,e.index)));const o=document.createElement("span");o.textContent=e.full,o.setAttribute(ao,e.username),o.setAttribute(no,""),r.appendChild(o),a.push(o),l=e.index+e.full.length}),l{if(!e.some(e=>e.addedNodes.length>0))return;const t=yo();t.length&&wo.forEach(e=>e(t))}),ko.observe(document.body,{childList:!0,subtree:!0}),yo());const t=Array.from(document.querySelectorAll(io));e&&t.length&&e(t)}function*So(e){if("function"==typeof Intl.Segmenter)for(const t of new Intl.Segmenter(void 0,{granularity:"grapheme"}).segment(e))yield t.segment;else yield*e}function Co(e){return Array.from(So(e))}let $o="true"===C("debugMode","false");function Ao(){S("debugMode",$o?"true":"false")}function Eo(...e){$o&&console.log(...e)}const Lo={unditherImages:!0,holdDuration:500,nickColors:!0,nickNotes:!0,worldClock:!1,nickEffects:!1,emojiPicker:!0,emojiPickerNsfw:!1};let No={...Lo};function To(){return!!document.getElementById("nc-styles")}function jo(){try{const e=C("featureConfig",null);e&&(No={...Lo,...JSON.parse(e)})}catch(e){console.error(i+" Failed to load feature config:",e)}}function Oo(){S("featureConfig",JSON.stringify(No))}jo();const Mo=[];let Do=!1;const Io={};function Fo(e){Mo.push({...e,booted:!1})}function zo(){if(Do&&w())for(const e of Mo)if(!e.booted&&No[e.key]){e.booted=!0;try{e.boot()}catch(t){console.error(i+` Failed to start ${e.key}:`,t)}}}function qo(){for(const e of Mo)try{e.onStorageReady?.(e.booted)}catch(t){console.error(i+` Failed to reload ${e.key}:`,t)}zo()}const Ro=[],Ho="edit",Bo=new WeakMap;function Vo(e){Ro.push(e),Ro.sort((e,t)=>(e.order??0)-(t.order??0))}function Uo(e){if(!(e.target instanceof Element))return null;for(let t=e.target;t;t=t.parentElement)if(Bo.has(t)||t.matches(io))return t;return null}function Po(e,t,o){const a=function(e){return Bo.get(e)??vo(e)}(e),n=e.getBoundingClientRect();!function({label:e,items:t,x:o,y:a,opener:n=null,focusFirst:i=!0}){oo(),ve();const r=document.createElement("div");r.className=F("menu"),r.setAttribute("role","menu"),r.setAttribute("aria-label",e),r.tabIndex=-1;const l=t.map((e,o)=>{if(o>0&&e.group!==t[o-1].group){const e=document.createElement("div");e.className=F("menu-separator"),e.setAttribute("role","separator"),r.append(e)}const a=document.createElement("button");return a.type="button",a.className=F("menu-item"),a.setAttribute("role",void 0===e.checked?"menuitem":"menuitemcheckbox"),a.tabIndex=-1,a.textContent=e.label,void 0!==e.checked&&a.setAttribute("aria-checked",String(e.checked)),a.addEventListener("mouseenter",()=>a.focus()),a.addEventListener("click",()=>{oo({returnFocus:!0}),e.onSelect()}),r.append(a),a});document.body.append(r);const s=r.getBoundingClientRect();r.style.left=Math.max(0,Math.min(o,window.innerWidth-s.width))+"px",r.style.top=Math.max(0,Math.min(a,window.innerHeight-s.height))+"px",r.addEventListener("keydown",e=>{const t=l.indexOf(document.activeElement),o={ArrowDown:(t+1)%l.length,ArrowUp:t<0?l.length-1:(t-1+l.length)%l.length,Home:0,End:l.length-1}[e.key];void 0!==o?(e.preventDefault(),l[o].focus()):"Escape"===e.key?(e.preventDefault(),e.stopPropagation(),oo({returnFocus:!0})):"Tab"===e.key&&oo({returnFocus:!0})});const c=e=>{r.contains(e.target)||oo()},d=()=>oo();document.addEventListener("pointerdown",c,!0),window.addEventListener("scroll",d,!0),window.addEventListener("resize",d),window.addEventListener("blur",d),to={el:r,opener:n,cleanup:()=>{document.removeEventListener("pointerdown",c,!0),window.removeEventListener("scroll",d,!0),window.removeEventListener("resize",d),window.removeEventListener("blur",d)}},i&&l.length?l[0].focus():r.focus()}({label:`@${a}`,items:Ro.filter(e=>!e.showFor||e.showFor(a)).map(t=>({label:t.label,group:t.group,checked:t.checkedFor?.(a),onSelect:()=>t.onSelect(a,e)})),x:t?t.x:n.left,y:t?t.y:n.bottom,opener:e,focusFirst:o})}const Go="atmospheric-modulator-users",Wo=[],_o=["mark","name","text","edit","delete"],Zo=new Set;function Jo(e){Wo.push(e),Wo.sort((e,t)=>(e.order??0)-(t.order??0)),Gt(),ea()}function Ko(e,t){return e.classList.add(F("user-col-"+t)),e}function Yo(e){const t=_o.findIndex(t=>e.classList.contains(F("user-col-"+t)));return-1===t?_o.length:t}function Xo(){return Wo.some(e=>e.isShown())}function Qo(e){Zo.add(e),e.textContent="";const t=Wo.filter(e=>e.isShown()),o=new Map;for(const e of t)for(const t of e.usernames()){const e=t.toLowerCase(),a=o.get(e);(!a||a===e&&t!==e)&&o.set(e,t)}const a=_(Array.from(o.values()).sort((e,t)=>e.localeCompare(t)).map(e=>{const o=t.find(e=>e.name);let a=o?.name(e);return a||(a=document.createElement("strong"),a.textContent=e),function(e,t){Bo.set(e,t)}(a,e),a.matches("a[href], button, [tabindex]")||(a.tabIndex=0),{key:e,parts:[Ko(a,"name"),...t.flatMap(t=>t.parts(e))].sort((e,t)=>Yo(e)-Yo(t))}}),"Nobody yet. Right-click or long-press a username to make them a choom, or give them a color or a note.");a.classList.add(F("user-list")),e.appendChild(a);const n=t.flatMap(e=>e.actions?.()??[]);if(n.length){const t=document.createElement("div");t.className=F("user-list-actions"),t.append(...n),e.appendChild(t)}}function ea(e){for(const t of Zo){if(!t.isConnected){Zo.delete(t);continue}const o=document.activeElement,a=t.contains(o)?o.dataset.userListAction:void 0;Z(t,()=>Qo(t),e,Ot(t)),a&&t.querySelector(`[data-user-list-action="${a}"]`)?.focus()}}const ta=[{value:"best",label:"★★ Best chooms",level:2},{value:"all",label:"Every ★ choom",level:1},{value:"everyone",label:"Everyone",level:0}];let oa={users:[],besties:[]};const aa=[];function na(e,t){return t>=ta.find(t=>t.value===e).level}function ia(e){return ta.some(t=>t.value===e)}function ra(e){if(!Array.isArray(e))return[];const t=e.filter(e=>"string"==typeof e).map(e=>e.trim().replace(/^@/,"")).filter(e=>fo(e)),o=new Set;return t.filter(e=>!o.has(e.toLowerCase())&&o.add(e.toLowerCase()))}function la(e){const t=ra(e?.users),o=new Map(t.map(e=>[e.toLowerCase(),e]));return{users:t,besties:ra(e?.besties).filter(e=>o.has(e.toLowerCase())).map(e=>o.get(e.toLowerCase()))}}function sa(){try{oa=la(JSON.parse(C("nickFriends","{}")))}catch(e){oa=la(null)}}function ca(e){oa=la(e),S("nickFriends",JSON.stringify(oa))}function da(){return{users:[...oa.users],besties:[...oa.besties]}}function ha(e){const t=String(e).toLowerCase();return oa.besties.some(e=>e.toLowerCase()===t)?2:oa.users.some(e=>e.toLowerCase()===t)?1:0}function pa(e,t){const o=String(e).toLowerCase(),a=oa.users.find(e=>e.toLowerCase()===o)??String(e),n=e=>e.filter(e=>e.toLowerCase()!==o),i=n(oa.users),r=n(oa.besties);t>=1&&i.push(a),2===t&&r.push(a),ca({users:i,besties:r}),aa.forEach(t=>t(e)),ea(e)}function ua(){return Mo.some(e=>e.usesChooms&&No[e.key])}function ga(e,t){return ha(e)>=("best"===t?2:1)}function ma(e,t){const o=ga(e,t);pa(e,"best"===t?o?1:2:o?0:1)}function ba(e){const t=document.createElement("span");return t.className=F("choom-stars"),t.append(fa(e,"Choom","friend",ga(e,"choom"),()=>ma(e,"choom"),e=>e?"Remove Choom":"Add Choom"),fa(e,"Best choom","best-friend",ga(e,"best"),()=>ma(e,"best"),e=>e?"Remove Best Choom":"Add Best Choom")),[Ko(t,"mark")]}function fa(e,t,o,a,n,i){const r=document.createElement("button");return r.type="button",r.className=F("choom-toggle"),r.setAttribute("aria-label",`${t} @${e}`),r.setAttribute("aria-pressed",String(a)),r.title=i(a),r.textContent=a?"★":"☆",r.dataset.entryControl=o,r.addEventListener("click",()=>n()),r}sa();const ya="data-atmo-sidebar-link";function va(e){return``}const wa=[{about:'aside.sidebar button[title="About Cyberspace"]',className:"atmo-sidebar-link no-underline hover:opacity-70 transition-opacity bg-transparent py-1 cursor-pointer w-full",iconClass:"atmo-sidebar-link-icon w-5 h-5",showsLabel:!0},{about:'aside.mobile-bottom-nav button[title="About Cyberspace"]',className:"atmo-mobile-nav-link h-full px-3 flex items-center justify-center hover:opacity-70 transition-opacity cursor-pointer bg-transparent",iconClass:"w-6 h-6",showsLabel:!1}];function ka(){for(const e of wa)for(const t of document.querySelectorAll(e.about))t.parentElement.querySelector(`[${ya}]`)||t.after(xa(e))}function xa(t){const o=document.createElement("button");o.type="button",o.setAttribute(ya,""),o.className=t.className,o.title=c,o.style.setProperty("border-width","1px","important"),o.style.setProperty("border-style","dashed","important"),o.style.setProperty("border-color","var(--color-border, currentColor)","important");const a=`${s} v${e}`;return o.setAttribute("aria-label",`${a}: ${c}`),o.innerHTML=va(t.iconClass)+(t.showsLabel?`${z(a)}`:""),o.addEventListener("click",()=>Ht(_a)),o}const Sa=r("image-undither"),Ca={mapped:"atmo:image-mapped",statsRequest:"atmo:stats-request",stats:"atmo:stats",originalAttr:"data-atmo-original"},$a=new Map;let Aa=!1,Ea="none";function La(e,t){const o=e.document,a=(t,a)=>o.dispatchEvent(new e.CustomEvent(t,{detail:JSON.stringify(a)}));let n=e.__atmoHookState;n||(n={pendingBlobs:new WeakMap,pendingGifs:[],gifOriginals:new Set,wrappers:{},pipelineStats:{drawImageHttp:0,drawImageBlob:0,drawImageOther:0,drawImageCanvas:0,gifFetched:0,gifTagged:0,texImage2DTagged:0,texImage2DUntagged:0,toBlobTagged:0,toBlobUntagged:0,createObjectURLMatched:0,createObjectURLMissed:0,mappedEmitFailed:0},firstStageStats:{srcSetHttp:0,srcLoadOk:0,srcLoadError:0,fetchTotal:0,fetchFailed:0},firstStageErrors:[]},e.__atmoHookState=n,o.addEventListener(t.statsRequest,()=>{const o=n.wrappers,i=e.HTMLImageElement&&Object.getOwnPropertyDescriptor(e.HTMLImageElement.prototype,"src"),r=(e,t)=>!!o[t]&&e===o[t];a(t.stats,{live:{drawImage:r(e.CanvasRenderingContext2D&&e.CanvasRenderingContext2D.prototype.drawImage,"drawImage"),texImage2D:r(e.WebGLRenderingContext&&e.WebGLRenderingContext.prototype.texImage2D,"texImage2D:WebGLRenderingContext"),toBlob:r(e.HTMLCanvasElement&&e.HTMLCanvasElement.prototype.toBlob,"toBlob"),createObjectURL:r(e.URL&&e.URL.createObjectURL,"createObjectURL"),src:r(i&&i.set,"src"),fetch:r(e.fetch,"fetch"),gifArrayBuffer:r(e.Response&&e.Response.prototype.arrayBuffer,"arrayBuffer")},pipelineStats:n.pipelineStats,firstStageStats:n.firstStageStats,firstStageErrors:n.firstStageErrors})}));const{pendingBlobs:i,pendingGifs:r,gifOriginals:l,wrappers:s,pipelineStats:c,firstStageStats:d,firstStageErrors:h}=n,p=e=>{h.push(e),h.length>8&&h.shift()},u=e.CanvasRenderingContext2D&&e.CanvasRenderingContext2D.prototype;if(u&&"function"==typeof u.drawImage&&u.drawImage!==s.drawImage){const e=u.drawImage;s.drawImage=u.drawImage=function(...o){const a=o[0],n=a&&"IMG"===a.tagName?a.src:null;if(this&&this.canvas){if("string"==typeof n&&/^https?:\/\//.test(n))this.canvas.__atmoSrc=n,c.drawImageHttp++;else if("string"==typeof n&&/^blob:/.test(n))this.canvas.__atmoSrc=n,c.drawImageBlob++;else if(a&&"CANVAS"===a.tagName){c.drawImageCanvas++;const e=this.canvas;if(a.__atmoSrc)e.__atmoSrc=a.__atmoSrc;else if(e.isConnected)delete e.__atmoSrc;else if(!l.has(e.__atmoSrc)){delete e.__atmoSrc;let t=r.length-1;for(;t>=0&&(r[t].width!==e.width||r[t].height!==e.height);)t--;-1!==t&&(e.__atmoSrc=r[t].url,l.add(e.__atmoSrc),r.splice(t,1),c.gifTagged++)}}else delete this.canvas.__atmoSrc,c.drawImageOther++;const e=this.canvas;if("function"==typeof e.getAttribute){const o=e.__atmoSrc;"string"==typeof o&&l.has(o)?e.getAttribute(t.originalAttr)!==o&&e.setAttribute(t.originalAttr,o):e.hasAttribute(t.originalAttr)&&e.removeAttribute(t.originalAttr)}}return e.apply(this,o)}}for(const t of["WebGLRenderingContext","WebGL2RenderingContext"]){const o=e[t],a="texImage2D:"+t;if(!o||!o.prototype||"function"!=typeof o.prototype.texImage2D)continue;if(o.prototype.texImage2D===s[a])continue;const n=o.prototype.texImage2D;s[a]=o.prototype.texImage2D=function(...e){const t=e[e.length-1],o=t&&t.__atmoSrc;return this&&this.canvas&&(o?(this.canvas.__atmoSrc=o,c.texImage2DTagged++):(delete this.canvas.__atmoSrc,c.texImage2DUntagged++)),n.apply(this,e)}}const g=e.HTMLCanvasElement&&e.HTMLCanvasElement.prototype;if(g&&"function"==typeof g.toBlob&&g.toBlob!==s.toBlob){const e=g.toBlob;s.toBlob=g.toBlob=function(t,...o){const a=this.__atmoSrc;return a?c.toBlobTagged++:c.toBlobUntagged++,e.call(this,function(e){e&&a&&i.set(e,a),t&&t(e)},...o)}}if(e.URL&&"function"==typeof e.URL.createObjectURL&&e.URL.createObjectURL!==s.createObjectURL){const o=e.URL.createObjectURL;s.createObjectURL=e.URL.createObjectURL=function(e,...n){const r=i.get(e),l=o.call(this,e,...n);if(r&&"string"==typeof l)try{a(t.mapped,[l,r]),c.createObjectURLMatched++}catch(e){c.mappedEmitFailed++}else c.createObjectURLMissed++;return l}}const m=e.HTMLImageElement&&e.HTMLImageElement.prototype,b=m&&Object.getOwnPropertyDescriptor(m,"src");if(b&&"function"==typeof b.set&&b.set!==s.src){const e=b.set,t=function(t){e.call(this,t);const o="string"==typeof t?t:"";if(!/^https?:\/\//.test(o)||this.__atmoFirstSrc===o)return;this.__atmoFirstSrc=o,d.srcSetHttp++,this.__atmoSrcOutcome&&(this.removeEventListener("load",this.__atmoSrcOutcome.ok),this.removeEventListener("error",this.__atmoSrcOutcome.fail));const a=()=>this.getAttribute("src")===o||this.src===o,n=()=>{a()&&d.srcLoadOk++},i=()=>{a()&&(d.srcLoadError++,p(o))};this.__atmoSrcOutcome={ok:n,fail:i},this.addEventListener("load",n,{once:!0}),this.addEventListener("error",i,{once:!0})};try{Object.defineProperty(m,"src",{configurable:b.configurable,enumerable:b.enumerable,get:b.get,set:t}),s.src=t}catch(e){}}const f=e.Response&&e.Response.prototype;if(f&&"function"==typeof f.arrayBuffer&&f.arrayBuffer!==s.arrayBuffer){const t=f.arrayBuffer;s.arrayBuffer=f.arrayBuffer=function(...o){const a=t.apply(this,o);let n=null;try{const t=new e.URL(this.url);t.origin===e.location.origin&&"/api/gif-proxy"===t.pathname&&(n=t.searchParams.get("url"))}catch(e){n=null}return n&&/^https?:\/\//.test(n)&&a&&"function"==typeof a.then?a.then(t=>{try{const o=new e.Uint8Array(t,0,10),a={url:n,width:o[6]|o[7]<<8,height:o[8]|o[9]<<8};r.push(a),c.gifFetched++,e.setTimeout(()=>{const e=r.indexOf(a);-1!==e&&r.splice(e,1)},0)}catch(e){}return t}):a}}if("function"==typeof e.fetch&&e.fetch!==s.fetch){const t=e.fetch;s.fetch=e.fetch=function(e,...o){let a="";try{a="string"==typeof e?e:e&&(e.url||e.href)||""}catch(e){a=""}if("string"!=typeof a||!/^https?:\/\//.test(a))return t.call(this,e,...o);d.fetchTotal++;const n=t.call(this,e,...o);return n&&"function"==typeof n.then&&n.then(e=>{e&&!1===e.ok&&(d.fetchFailed++,p(a+" ["+e.status+"]"))}).catch(()=>{p(a+" [fetch rejected]")}),n}}}function Na(e){let t=null;const o=e=>{try{t=JSON.parse(e.detail)}catch(e){t=null}};e.addEventListener(Ca.stats,o);try{e.dispatchEvent(new e.defaultView.CustomEvent(Ca.statsRequest))}finally{e.removeEventListener(Ca.stats,o)}return t}const Ta=new WeakMap;function ja(e){const t=Ta.get(e);t&&(Ta.delete(e),e.classList.remove("atmo-revealed"),t.onRevealError&&e.removeEventListener("error",t.onRevealError),t.srcObserver.disconnect(),t.lockedSize&&(e.style.width=t.lockedSize.width,e.style.height=t.lockedSize.height),e.getAttribute("src")===t.originalUrl&&e.setAttribute("src",t.blobSrc))}const Oa=new WeakMap;function Ma(e){const t=Oa.get(e);t&&(Oa.delete(e),t.revealObserver.disconnect(),t.overlay.remove(),t.parent.style.position=t.parentPosition)}function Da(e){"IMG"===e.tagName?function(e){const t=e.getAttribute("src"),o=Ta.get(e);if(o){if(t===o.originalUrl)return;ja(e)}const a=$a.get(t);if(!a)return void(/^blob:/.test(t||"")&&(n=e.ownerDocument,Va||(Va=!0,Ha(n)&&S(Ba,"true"))));var n;const i=()=>ja(e),r=function(e){const t=window.getComputedStyle(e);if(!(parseFloat(t.width)>0&&parseFloat(t.height)>0))return null;const o={width:e.style.width,height:e.style.height};return e.style.width=t.width,e.style.height=t.height,o}(e);e.setAttribute("src",a),e.classList.add("atmo-revealed"),e.addEventListener("error",i,{once:!0});const l=new MutationObserver(()=>{e.getAttribute("src")!==a&&ja(e)});l.observe(e,{attributes:!0,attributeFilter:["src"]}),Ta.set(e,{blobSrc:t,originalUrl:a,onRevealError:i,lockedSize:r,srcObserver:l})}(e):function(e){const t=e.getAttribute(Ca.originalAttr);if(!t||Oa.has(e)||!e.parentNode)return;const o=e.parentNode,a=o.style.position,n=e.ownerDocument.defaultView.getComputedStyle(o).position;n&&"static"!==n||(o.style.position="relative");const i=e.ownerDocument.createElement("img");i.alt="",i.className="atmo-revealed atmo-gif-overlay",i.style.left=e.offsetLeft+"px",i.style.top=e.offsetTop+"px",i.style.width=e.offsetWidth+"px",i.style.height=e.offsetHeight+"px",i.addEventListener("error",()=>{Oa.get(e)?.overlay===i&&Ma(e)},{once:!0}),i.src=t,e.after(i);const r=new MutationObserver(()=>{e.isConnected&&e.nextSibling===i&&e.getAttribute(Ca.originalAttr)===t||Ma(e)});r.observe(o,{childList:!0}),r.observe(e,{attributes:!0,attributeFilter:[Ca.originalAttr]}),Oa.set(e,{overlay:i,revealObserver:r,parent:o,parentPosition:a})}(e)}function Ia(e){"IMG"===e.tagName?ja(e):Ma(e)}function Fa(e){const t=e.target;return t&&t.tagName&&("IMG"===t.tagName||"CANVAS"===t.tagName&&t.hasAttribute(Ca.originalAttr))?t:null}function za(e){const t=No.unditherImages&&Fa(e);t&&Da(t)}function qa(e){const t=e.target;!t||"IMG"!==t.tagName&&"CANVAS"!==t.tagName||Ia(t)}function Ra(){return Math.max(Ja("holdDuration").min,Number(No.holdDuration)||Lo.holdDuration)}function Ha(e=document,t=Ea){if("none"===t||"page"===t)return!1;if(!e.querySelector('img[src^="blob:"]'))return!1;const o=Na(e);if(!o)return!0;if(!o.pipelineStats||"object"!=typeof o.pipelineStats)return!1;const{drawImageHttp:a,drawImageBlob:n,drawImageOther:i}=o.pipelineStats;return!a&&!n&&!i}const Ba="unditherMissedPage";let Va=!1;function Ua(){console.log(Sa+" diagnose: dither hooks installed =",Aa,", realm =",Ea),console.log(Sa+" diagnose: unsafeWindow =",typeof unsafeWindow,", shares document =","undefined"!=typeof unsafeWindow&&unsafeWindow.document===document);const e=Na(document);if(e){const{live:t,pipelineStats:o,firstStageStats:a,firstStageErrors:n}=e;console.log(Sa+" diagnose: hooks live (drawImage / texImage2D / toBlob / createObjectURL) =",t.drawImage,t.texImage2D,t.toBlob,t.createObjectURL),console.log(Sa+" diagnose: first-stage probes live (src / fetch / gif arrayBuffer) =",t.src,t.fetch,t.gifArrayBuffer),console.log(Sa+" diagnose: pipeline (drawImage-http / drawImage-blob -> texImage2D-tagged -> toBlob-tagged -> createObjectURL-matched) =",o.drawImageHttp,"/",o.drawImageBlob,"->",o.texImage2DTagged,"->",o.toBlobTagged,"->",o.createObjectURLMatched),console.log(Sa+" diagnose: pipeline misses (drawImage-other / texImage2D-untagged / toBlob-untagged / createObjectURL-missed / mapped-emit-failed) =",o.drawImageOther,o.texImage2DUntagged,o.toBlobUntagged,o.createObjectURLMissed,o.mappedEmitFailed),console.log(Sa+" diagnose: gifs (fetched / tagged / canvas draws), marked canvases =",o.gifFetched,"/",o.gifTagged,"/",o.drawImageCanvas,",",document.querySelectorAll("canvas["+Ca.originalAttr+"]").length),console.log(Sa+" diagnose: first stage (src-sets-http / load-ok / load-error, fetch-total / fetch-failed) =",a.srcSetHttp,"/",a.srcLoadOk,"/",a.srcLoadError,",",a.fetchTotal,"/",a.fetchFailed),console.log(Sa+" diagnose: recent load failures =",n.length?n.join(" | "):"(none)")}else console.log(Sa+" diagnose: page hooks = no answer");console.log(Sa+" diagnose: image map size =",$a.size);const t=Array.from(document.querySelectorAll('img[src^="blob:"]'));let o=0;for(const e of t)$a.has(e.getAttribute("src"))&&o++;const a=document.querySelectorAll("img").length;console.log(Sa+" diagnose: blob imgs in DOM = "+t.length+" of "+a+" imgs, mapped = "+o);const n=document.getElementById("__nuxt"),i=document.querySelectorAll("iframe");let r=0;for(const e of i)try{const t=e.contentDocument;t&&(r+=t.querySelectorAll("img").length)}catch(e){}console.log(Sa+" diagnose: env href =",document.location.href,", title =",JSON.stringify(document.title||null),", userAgent =",navigator.userAgent),console.log(Sa+" diagnose: env #__nuxt =",n?n.childElementCount+" children":"absent",", elements =",document.querySelectorAll("*").length,", iframes =",i.length+(i.length?" ("+r+" imgs inside)":""));for(const[e,t]of Array.from($a.entries()).slice(0,12))console.log(Sa+" diagnose: map "+e+" -> "+t)}{const Fn={minHue:[0,360],maxHue:[0,360],hueSpread:[0,180],minSaturation:[0,100],maxSaturation:[0,100],satSpread:[0,100],minLightness:[0,100],maxLightness:[0,100],litSpread:[0,100],singleColorHue:[0,360],singleColorSat:[0,100],singleColorLit:[0,100],contrastThreshold:[0,21]},zn=["color","backgroundColor","fontWeight","fontStyle","fontVariant","fontFamily","letterSpacing","textDecoration","prependIcon","appendIcon","invert"],qn=["position","inset","top","right","bottom","left","zindex","content","transform","translate","scale","rotate","filter","behavior","binding","data"];function Rn(e){const t=fe(e).toLowerCase().replace(/^-?(webkit|moz|ms|o)-/,"").replace(/-/g,"");return qn.includes(t)||t.startsWith("offset")||t.startsWith("inset")}const Hn=["prependIcon","appendIcon"],Bn=50,Vn=200,Un="url(), image-set(), expression(), javascript:, \\ ; { } < >, a line break or another control character",Pn=/url\s*\(|image-set\s*\(|expression\s*\(|javascript:|\\|[;{}<>\x00-\x08\x0a-\x1f]/i;function Gn(e){const t={};if(!e||"object"!=typeof e)return t;for(const[o,a]of Object.entries(hi)){const n=e[o];if(typeof n==typeof a)if("number"==typeof n){if(!Number.isFinite(n))continue;const e=Fn[o];t[o]=e?Math.min(e[1],Math.max(e[0],n)):n}else t[o]=n}return t}function Wn(e,t){if("string"==typeof e&&(e={color:e}),!e||"object"!=typeof e||Array.isArray(e))return null;const o={};for(const a of Object.keys(e)){const n="imported"===t;if(!(n?zn.includes(a):!Rn(a))||"__proto__"===a)continue;const i=e[a];if("boolean"==typeof i||"number"==typeof i&&Number.isFinite(i))o[a]=i;else{if("string"!=typeof i)continue;Hn.includes(a)?(!n||i.length<=Bn)&&(o[a]=i):n&&!(i.length<=Vn)||Pn.test(i)||(o[a]=i)}}return Object.keys(o).length?o:null}function _n(e,t){const o={};if(!e||"object"!=typeof e)return o;for(const[a,n]of Object.entries(e)){if(!fo(a))continue;const e=Wn(n,t);e&&(o[a]=e)}return o}function Zn(e,t){if(!e||"object"!=typeof e)return 0;let o=0;for(const[a,n]of Object.entries(e))if(n&&"object"==typeof n)for(const e of Object.keys(n))"userNotes"===e||t[a]&&e in t[a]||o++;return o}function Jn(e,t){return e?` ${1===e?"1 style was":`${e} styles were`} left out: ${"imported"===t?`an import keeps only color, background color, font, letter spacing, text decoration, inversion and icons, with icons up to ${Bn} characters and other values up to ${Vn}, and no CSS value holding ${Un}`:`Additional CSS cannot set position, offsets, z-index, transforms, filter, content or behavior, and a value cannot hold ${Un}`}.`:""}function Kn(e){const t=se(ui,e=e??mi??"Full Spectrum");return{theme:e,colors:ye(e),colorVariables:ye(e,"hsl"),settings:{...hi,...t?.settings||{}}}}function Yn(e){if(!se(ui,e))return null;const{minHue:t,maxHue:o,minSaturation:a,maxSaturation:n,minLightness:i,maxLightness:r,contrastThreshold:l}=Kn(e).settings;return{minHue:t,maxHue:o,minSaturation:a,maxSaturation:n,minLightness:i,maxLightness:r,contrastThreshold:l}}function Xn(){const e=mi||"";return!(!fi.followSiteTheme||fi.followedTheme===e||(Object.assign(fi,Yn(e)||{},{followedTheme:e}),vi(),0))}function Qn(e){return e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase())}function ei(e){const t={};return e.split(/[;\n]/).forEach(e=>{const o=e.trim();if(!o)return;const a=o.indexOf(":");if(-1===a)return;const n=o.slice(0,a).trim(),i=o.slice(a+1).trim();if(n&&i){const e=n.replace(/-([a-z])/g,(e,t)=>t.toUpperCase());t[e]=i}}),t}function ti(e,t="; "){return Object.entries(e).map(([e,t])=>`${fe(e)}: ${t}`).join(t)}function oi(e,t,o){if(0===t&&360===o)return e;const a=e/360;if(t<=o)return t+a*(o-t);{const e=t+a*(360-t+o);return e>=360?e-360:e}}function ai(e,t,o){return 0===t&&100===o?e:t+e/100*(o-t)}function ni(e,t="hsl",o={}){const a=ye((o={themeName:mi,isInverted:!1,...o}).themeName,"hsl");let n=o.isInverted?a.invertedBg:a.bg,i=o.isInverted?a.invertedFg:a.fg;return ue(me(n,e)>me(i,e)?n:i,t)}function ii(e,t="hsl",o={}){if(o={mapHue:!0,mapSat:!0,mapLit:!0,effectiveConfig:ri(),...o},!e)return null;const a=ue(e,"hsl");return a?ue({h:o.mapHue?oi(a.h,o.effectiveConfig.minHue??0,o.effectiveConfig.maxHue??360):a.h,s:o.mapSat?ai(a.s,o.effectiveConfig.minSaturation??0,o.effectiveConfig.maxSaturation??100):a.s,l:o.mapLit?ai(a.l,o.effectiveConfig.minLightness??0,o.effectiveConfig.maxLightness??100):a.l},t):null}function ri(){const e={...fi},t=ye(null,"hsl"),o=ue(t?.fg,"hsl")||{h:0,s:0,l:0};if(fi.useSiteThemeHue&&(e.minHue=(o.h-fi.hueSpread+360)%360,e.maxHue=(o.h+fi.hueSpread)%360),fi.useSiteThemeSat){const t=fi.satSpread||0;e.minSaturation=Math.max(0,o.s-t),e.maxSaturation=Math.min(100,o.s+t)}if(fi.useSiteThemeLit){const t=fi.litSpread||0;e.minLightness=Math.max(0,o.l-t),e.maxLightness=Math.min(100,o.l+t)}return e}function li(e){let t=0;const o=e.toLowerCase().trim();for(let e=0;e0?o:null}function Fi(){const e={version:Di,exportedAt:(new Date).toISOString()},t=Ii(fi,hi);t&&(e.siteConfig=t),Object.keys(wi).length>0&&(e.customNickColors=wi);const o=da();return(Ti()||o.users.length)&&(e.nickFriends={colorFor:Ai,...o}),e}const zi={useHueRange:"useSiteThemeHue",useSaturation:"useSiteThemeSat",useLightness:"useSiteThemeLit",saturationSpread:"satSpread",lightnessSpread:"litSpread"};function qi(e){const t={};for(const[o,a]of Object.entries(e)){const e=zi[o]||o;"excludeRanges"!==o&&(t[e]=a)}return t}function Ri(e){const t={version:2},o={};return e.cc&&Object.assign(o,qi(Gi(e.cc))),e.stc&&Object.assign(o,qi(Gi(e.stc))),e.sc&&Object.assign(o,qi(Gi(e.sc))),e.colorConfig&&Object.assign(o,qi(e.colorConfig)),e.siteThemeConfig&&Object.assign(o,qi(e.siteThemeConfig)),e.styleConfig&&Object.assign(o,qi(e.styleConfig)),Object.keys(o).length>0&&(t.siteConfig=o),e.cnc&&(t.customNickColors=Gi(e.cnc)),e.customNickColors&&(t.customNickColors=e.customNickColors),(e.at||e.exportedAt)&&(t.exportedAt=e.at||e.exportedAt),t}function Hi(e,t){if(!t||"object"!=typeof t)return e;for(const[o,a]of Object.entries(t))"string"==typeof a?.userNotes&&fo(o)&&(e[o]={...e[o],userNotes:a.userNotes});return e}function Bi(e,{recolor:t=!0,replaceAll:o=!1,keepFriends:a=!1}={}){try{if(!e||"object"!=typeof e)return{success:!1,message:"Invalid data format"};const n=1===e.v||1===e.version||e.cc||e.stc||e.colorConfig||e.siteThemeConfig||e.styleConfig;if((e=n?Ri(e):Gi(e)).version&&e.version>Di)return{success:!1,message:`Export version ${e.version} is newer than supported version ${Di}`};if(o&&(e.siteConfig=e.siteConfig??{},e.customNickColors=e.customNickColors??{},e.nickFriends=e.nickFriends??{}),e.siteConfig){for(const e in fi)delete fi[e];Object.assign(fi,hi,Gn(e.siteConfig)),vi()}let i=0;if(e.customNickColors){const t=_n(e.customNickColors,"imported");i=Zn(e.customNickColors,t),Ci(Hi(t,e.customNickColors)),xi()}return e.nickFriends&&!a&&(ca(e.nickFriends),ji(Ei(e.nickFriends))),t&&pr(),{success:!0,dropped:i,message:`Settings imported successfully${n?" (migrated from v1)":""}.${Jn(i,"imported")}`}}catch(e){return{success:!1,message:`Import failed: ${e.message}`}}}const Vi={minSaturation:"mS",maxSaturation:"xS",minLightness:"mL",maxLightness:"xL",minHue:"mH",maxHue:"xH",contrastThreshold:"cT",useSiteThemeHue:"uH",hueSpread:"hS",useSiteThemeSat:"uS",satSpread:"sS",useSiteThemeLit:"uL",litSpread:"lS",useSingleColor:"uSC",singleColorHue:"sCH",singleColorSat:"sCS",singleColorLit:"sCL",singleColorCustom:"sCC",varyWeight:"vW",varyItalic:"vI",varyCase:"vC",prependIcon:"pI",appendIcon:"aI",iconSet:"iS",color:"c",backgroundColor:"bg",fontWeight:"fW",fontStyle:"fS",fontVariant:"fV",fontFamily:"fF",customFontFamily:"cFF",userNotes:"un",invert:"inv",siteConfig:"sc",customNickColors:"cnc",nickFriends:"nf",version:"v",exportedAt:"at"},Ui=Object.fromEntries(Object.entries(Vi).map(([e,t])=>[t,e]));function Pi(e){if(null===e||"object"!=typeof e)return e;if(Array.isArray(e))return e.map(Pi);const t={};for(const[o,a]of Object.entries(e))t[Vi[o]||o]=Pi(a);return t}function Gi(e){if(null===e||"object"!=typeof e)return e;if(Array.isArray(e))return e.map(Gi);const t={};for(const[o,a]of Object.entries(e))t[Ui[o]||o]=Gi(a);return t}function Wi(e){try{return Gi(JSON.parse(e))}catch(e){throw new Error(`Failed to parse: ${e.message}`)}}function _i(e){const t=I("nick-colors-import");let o=null;const a=(t,a)=>{const n=a?{success:!1,message:a.message}:Bi(t,{replaceAll:!0,keepFriends:!0});if(!n.success){const e=document.createElement("div");return e.className=F("dialog-error"),e.textContent=n.message,void i.replaceChildren(e)}o.close(),qo(),e(),alert(n.message)};o=X({title:"Import from Nick Colors",width:"420px",onHelp:null,content:`\n\t\t\t
      \n\t\t\t\t
    1. In your Userscript extension (Greasemonkey, Tampermonkey, etc), locate the Nick Colors Settings option.
    2. \n\t\t\t\t
    3. Under Backup, choose Copy to Clipboard.
    4. \n\t\t\t\t
    5. Paste it below and choose Import. Or, if you saved a settings file there, choose Load Settings File.
    6. \n\t\t\t\t
    7. Then turn the Nick Colors userscript off, so the two do not recolor each other's names.
    8. \n\t\t\t
    \n\t\t\t
    This replaces the built-in nick colors' settings and custom colors.
    \n\t\t\t\n\t\t\t\n\t\t\t
    \n\t\t`,buttons:[{label:"IMPORT",class:"nc-import-btn",onClick:()=>{const e=n.value.trim();if(e)try{a(Wi(e),null)}catch(e){a(null,e)}else a(null,new Error("Paste the settings from Nick Colors first."))}},{label:"LOAD SETTINGS FILE",class:"nc-load-file-btn",onClick:()=>Zt(a,{parse:Wi})},{label:"CANCEL",class:"nc-cancel-btn",onClick:e=>e()}]});const n=o.querySelector("#"+t),i=o.querySelector('[role="status"]');n.focus()}function Zi(e,t=""){const o=$o?"":' style="display: none;"',a="nc-dialog-debug"+(t?" "+t:"");return"string"==typeof e?`
    ${e}
    `:(Eo(si,e),`
    \n${Object.entries(e).map(([e,t])=>"object"!=typeof t||void 0===t.txt&&void 0===t.elem?"string"==typeof t?`${e}:${t??"N/A"}`:void 0:`${e}:${t.txt??" N/A"}${t.elem?" "+t.elem:""}`).filter(e=>e&&""!==e.trim()).join("\n").trim()}\n
    `)}function Ji(e,t=""){let o=e.querySelector(".nc-dynamic-debug");return o||(o=document.createElement("div"),o.className="nc-dynamic-debug nc-dialog-debug"+(t?" "+t:""),e.appendChild(o)),o.style.display=$o?"":"none",o}function Ki(){const e=[],t=(t,o)=>{e.push("-".repeat(60),t,"-".repeat(60),o,"")};t("THEME INFO",[`Site Theme Name: ${mi||"none"}`,`Site Theme Object: ${gi?JSON.stringify(gi):"none"}`,`Site Custom Theme: ${te?JSON.stringify(te):"none"}`].join("\n")),t("THEME COLORS (resolved)",JSON.stringify(ye(null,"hsl"),null,2)),t("EFFECTIVE CONFIG (after site theme integration)",JSON.stringify(ri(),null,2)),t("SAVED SITE CONFIG",JSON.stringify(fi,null,2)),t(`CUSTOM NICK COLORS (${Object.keys(wi).length} total)`,JSON.stringify(wi,null,2));const o=da();t(`CHOOMS (colored: ${Ai})`,o.users.join(", ")||"none"),t(`BEST CHOOMS (${o.besties.length} total)`,o.besties.join(", ")||"none"),t(`MANUAL OVERRIDES (${Object.keys(di).length} total)`,JSON.stringify(di,null,2));const a=document.querySelectorAll(".nc-dialog-debug, .nc-dynamic-debug");return a.length>0&&t(`DEBUG ELEMENTS (${a.length} found)`,Array.from(a,(e,t)=>`[${t+1}] ${e.textContent.trim()}`).join("\n")),e.join("\n")}function Yi(){const e=ri(),t=Ti()?` | colored: ${Ai} (${da().users.length} chooms)`:"";return`${Object.keys(wi).length} custom${t} | H:${e.minHue}-${e.maxHue} S:${e.minSaturation}-${e.maxSaturation} L:${e.minLightness}-${e.maxLightness} | Settings: ${JSON.stringify(Pi({siteConfig:fi}))}`}function Xi(e){delete e.appendIcon,delete e.prependIcon,delete e.invert,delete e.userNotes;for(const t in e)if(t.startsWith("color")&&"string"!=typeof e[t]){const o=ue(e[t],"hsl");o?e[t]=o:delete e[t]}else t.startsWith("base")&&delete e[t];return e}function Qi(e,t="hsl",o={}){o={includeStyles:!1,effectiveConfig:ri(),debugData:!1,...o};let a={color:null},n=[];if(di[e]){const i=di[e],r="string"==typeof i?i:i.color;if(r){const e=ue(r,t);e&&(a.color=e),n.push(["Source","Override"])}o.includeStyles&&"object"==typeof i&&(a={...i,...a})}if(wi[e]){const i=wi[e],r="string"==typeof i?i:i.color;if(r){const e=ue(r,t);e&&(a.color=e),n.push(["Source","Custom"])}o.includeStyles&&"object"==typeof i&&(a={...a,...i})}if(o.effectiveConfig.useSingleColor){let e;e=o.effectiveConfig.singleColorCustom&&ue(o.effectiveConfig.singleColorCustom,"hsl")||{h:o.effectiveConfig.singleColorHue,s:o.effectiveConfig.singleColorSat,l:o.effectiveConfig.singleColorLit},a={...a,color:ue(e,t)},delete a.backgroundColor}if(null===a.color){const o={h:li(e)%360,s:li(e+"_sat")%101,l:li(e+"_lit")%101};a={...a,color:ue(o,t)},n.push(["Source","Hashed"])}if(o.includeStyles){const t=tr(e);if(o.effectiveConfig.varyWeight&&!a.fontWeight&&(a.fontWeight=t.fontWeight),o.effectiveConfig.varyItalic&&!a.fontStyle&&(a.fontStyle=t.fontStyle),o.effectiveConfig.varyCase&&!a.fontVariant&&(a.fontVariant=t.fontVariant),o.effectiveConfig.prependIcon||o.effectiveConfig.appendIcon){const t=er(e,{effectiveConfig:o.effectiveConfig});o.effectiveConfig.prependIcon&&void 0===a.prependIcon&&(a.prependIcon=t),o.effectiveConfig.appendIcon&&void 0===a.appendIcon&&(a.appendIcon=t)}}return o.debugData&&(a.debugData=n),o.includeStyles?a:a.color}function er(e,t={}){if(!(t={effectiveConfig:ri(),...t}).effectiveConfig.prependIcon&&!t.effectiveConfig.appendIcon||!t.effectiveConfig.iconSet)return null;const o=t.effectiveConfig.iconSet.split(/\s+/).filter(Boolean);return 0===o.length?null:o[li(e+"_icon")%o.length]}function tr(e){return{fontWeight:li(e+"_fontWeight")%2==0?"normal":"bold",fontStyle:li(e+"_fontStyle")%4==0?"italic":"normal",fontVariant:li(e+"_fontVariant")%4==1?"small-caps":"normal"}}function or(e){const t=Qi(e);let o={color:`hsl(${t.h}, ${t.s}%, ${t.l}%)`};if(di[e]&&"object"==typeof di[e]){const t={...di[e]};delete t.color,o={...o,...t}}if(wi[e]&&"object"==typeof wi[e]){const t={...wi[e]};delete t.color,delete t.invert,o={...o,...t}}return o}function ar(e,t="hsl",o={}){const a=Qi(e,t,o={includeStyles:!1,effectiveConfig:ri(),debugData:!1,...o});let n=null,i=[];const r=o.effectiveConfig.useSingleColor;if(!0===o.includeStyles){o.debugData&&(i=a.debugData||[],delete a.debugData),n={...a};for(const e in a)e.startsWith("color")&&(n[Qn("base-"+e)]=a[e],n[e]=r?a[e]:ii(a[e],t,{effectiveConfig:o.effectiveConfig}));o.debugData&&(n.debugData=i)}else n=r?a:ii(a,t,{effectiveConfig:o.effectiveConfig});return n}function nr(e,t={}){let o=[];const a=(t={themeName:mi,effectiveConfig:ri(),isInverted:!1,debugData:!1,...t}).effectiveConfig.contrastThreshold??4.5,n=ar(e,"hsl",{includeStyles:!0,effectiveConfig:t.effectiveConfig,debugData:t.debugData}),i=ye(t.themeName);t.debugData&&(o=n.debugData||[],delete n.debugData);let r=ue(n.color,"rgb"),l=t.isInverted?i.invertedBg:i.bg;const s=ue(l,"rgb");o.push(["Element BG",l?ue(s,"hsl-string"):"N/A"]);let c=ue(n.backgroundColor??l,"rgb");o.push(["Nick FG (raw)",r?ue(r,"hsl-string"):"N/A"]),o.push(["Nick BG (raw)",c?ue(c,"hsl-string"):"N/A"]);let d=me(r,c);o.push(["Contrast (raw)",+d.toFixed(2)]);let h=!1;!0===n.invert||!1===n.invert?(h=n.invert,o.push(["User Invert",n.invert])):a>0&&(h=d0&&pi.some(t=>e.closest(t)));let{styles:i,nickConfig:r,contrastRatio:l,debugData:s}=nr(t,{themeName:o.themeName,effectiveConfig:o.effectiveConfig,debugData:o.debugData,isInverted:n});a=[...a,...s||[]],i={...i,...o.mergeStyles},o.overrideStyles&&"object"==typeof o.overrideStyles&&(i={...o.overrideStyles}),e.closest(ir)&&(i.fontStyle="italic"),e.style.cssText="";for(const t in i){const o=fe(t);e.style.setProperty(o,i[t],"important")}e.dataset[`${o.matchType}Colored`]="true",e.dataset.username=t,"number"==typeof l&&(e.dataset.contrastRatio=l.toFixed(2));const c=r.prependIcon,d=r.appendIcon;if(c||d){e.dataset.iconApplied||(e.dataset.originalText=e.textContent,e.dataset.iconApplied="true");let t=e.dataset.originalText||e.textContent;c&&(t=c+" "+t),d&&(t=t+" "+d),e.textContent=t}else e.dataset.iconApplied&&(e.dataset.originalText&&(e.textContent=e.dataset.originalText),delete e.dataset.iconApplied,delete e.dataset.originalText);return o.debugData&&(e.dataset.ncDebug=JSON.stringify(a),e.classList.add("nc-has-debug"),e.addEventListener("mouseenter",sr),e.addEventListener("mouseleave",cr)),e}let lr=null;function sr(e){const t=e.currentTarget,o=JSON.parse(t.dataset.ncDebug||"[]");lr||(lr=document.createElement("div"),lr.className="nc-debug-tooltip",document.body.appendChild(lr)),lr.innerHTML=o.map(([e,t])=>`
    ${e}: ${"string"==typeof t&&t.startsWith("hsl")?`${t}`:t}
    `).join("");const a=t.getBoundingClientRect();lr.style.left=a.left+"px",lr.style.top=a.bottom+4+"px",lr.classList.add("visible")}function cr(){lr&&lr.classList.remove("visible")}const dr=`data-${O}-colored`;function hr(e){const t=vo(e),o=e.hasAttribute(no);o||function(e){if(e===e.toLowerCase())return;const t=oa.users.indexOf(e.toLowerCase());if(-1===t)return;const o=oa.users.slice();o[t]=e,ca({...oa,users:o})}(t),No.nickColors&&Ni(t)?(rr(e,t,{matchType:o?"mention":"nick"}),e.setAttribute(dr,"")):e.hasAttribute(dr)&&!To()&&ur(e)}function pr(){document.querySelectorAll(io).forEach(hr),jr()}function ur(e){e.dataset.originalText&&(e.textContent=e.dataset.originalText);for(const t of["nickColored","mentionColored","iconApplied","originalText","username","contrastRatio"])delete e.dataset[t];e.style.cssText="",e.removeAttribute(dr)}function gr(){document.querySelectorAll(io).forEach(ur),function(){document.querySelectorAll(`[${no}]`).forEach(e=>{e.replaceWith(document.createTextNode(`@${vo(e)}`))}),document.querySelectorAll(io).forEach(e=>e.removeAttribute(ao));const e=yo();e.length&&wo.forEach(t=>t(e))}()}function mr(){X({title:"Nick Colors - Help",width:"420px",onHelp:null,warning:"",attribution:[],buttons:[{label:"CLOSE",class:"nc-close-btn",onClick:e=>e()}],content:`\n\t\t\t
    \n\t\t\t\t

    What is this?

    \n\t\t\t\t

    A userscript that gives each username a unique, consistent color based on a hash of their name. Colors persist across sessions and pages.

    \n\n\t\t\t\t

    Quick Start

    \n\t\t\t\t
      \n\t\t\t\t\t
    • Right-click any username and ${$i} to customize its color, icon, or style
    • \n\t\t\t\t\t
    • Use the SETTINGS button to configure global color ranges and options
    • \n\t\t\t\t
    \n\n\t\t\t\t

    Settings Overview

    \n\t\t\t\t
      \n\t\t\t\t\t
    • Preset Themes - Match colors to site themes (VT320, Poetry, etc.)
    • \n\t\t\t\t\t
    • Monochrome Mode - Use one color for all usernames
    • \n\t\t\t\t\t
    • H/S/L Ranges - Limit hue, saturation, and lightness ranges
    • \n\t\t\t\t\t
    • Contrast Threshold - Auto-invert colors for readability (WCAG ratios)
    • \n\t\t\t\t\t
    • Style Variations - Add bold, italic, small-caps, or icons
    • \n\t\t\t\t
    \n\n\t\t\t\t

    Per-User Customization

    \n\t\t\t\t
      \n\t\t\t\t\t
    • Color - Set via sliders or custom hex/hsl value
    • \n\t\t\t\t\t
    • Icons - Prepend/append symbols (auto, custom, or disabled)
    • \n\t\t\t\t\t
    • Styles - Override weight, italic, small-caps per user
    • \n\t\t\t\t\t
    • Inversion - Force or prevent background inversion
    • \n\t\t\t\t\t
    • Custom CSS - Add any additional styles
    • \n\t\t\t\t
    \n\n\t\t\t\t

    Tips

    \n\t\t\t\t
      \n\t\t\t\t\t
    • Colors are mapped proportionally to your configured ranges
    • \n\t\t\t\t\t
    • Site-wide overrides are loaded in remote from github, but can be overridden locally
    • \n\t\t\t\t\t
    • Export your settings to back them up or share with others
    • \n\t\t\t\t
    \n\n\t\t\t\t

    Bugs

    \n\t\t\t\t
      \n\t\t\t\t\t
    • Report issues either on GitHub
    • \n\t\t\t\t\t
    • Or use Report Issue under Settings > ${z(s)} > ${z(h)}
    • \n\t\t\t\t
    \n\t\t\t
    \n\t\t`})}function br(e,t){const o=ri(),a=["color","icon","fontWeight","fontStyle","fontVariant","fontFamily","invert","userNotes"],n=ti(Object.fromEntries(Object.entries(Xi(t)).filter(([e])=>!a.includes(e))),";\n"),i=wi[e]||{},r=i.prependIcon??"",l=i.appendIcon??"",s="prependIcon"in i?!!r:null,c="appendIcon"in i?!!l:null,d=er(e,{effectiveConfig:o})||"",h="object"==typeof di[e]?di[e]:{},p=e=>e in h?h[e]||"":o[e]?d:"",u=p("prependIcon"),g=p("appendIcon"),m=tr(e),b=m.fontWeight,f=m.fontStyle,y=m.fontVariant,v=di[e]||{},w=wi[e]||{},k={..."object"==typeof v?v:{},...w},x=k.fontWeight,S=k.fontStyle,C=k.fontVariant,$=k.invert,A=k.fontFamily||"",E="fontFamily"in w,L=w.fontFamily,N=("object"==typeof v?v.fontFamily:null)||"",T=E?!!L:null,j=di[e];let O="";if(j){const t=di[e];O="string"==typeof t?`color: ${t}`:ti(t)}const M=0!==o.minHue||360!==o.maxHue,D=0!==o.minSaturation||100!==o.maxSaturation,I=0!==o.minLightness||100!==o.maxLightness,F=M||D||I,R=Qi(e,"hsl",{effectiveConfig:o}),H=ii(R,"hsl",{effectiveConfig:o});let B="hash-generated",V="";wi[e]?(B="customNickColors (local save)",V=z(JSON.stringify(wi[e]))):di[e]&&(B="MANUAL_OVERRIDES (remote)",V=z(JSON.stringify(di[e])));const U=li(e),P=li(e+"_sat"),G=li(e+"_lit"),W=li(e+"_style"),_=e=>fi.iconSet?`
    ${fi.iconSet.split(/\s+/).filter(Boolean).map(e=>``).join("")}
    `:"",Z=X({title:`Nick: ${z(e)}`,width:"350px",onHelp:mr,onSettings:()=>Ht(fr),preview:`
    <${z(e)}> Example chat message in cIRC
    Inline mention @${z(e)} example
    \n\t\t\t
    <${z(e)}> Inverted container preview
    `,content:`\n\t\t\t${Zi({"Color Source":B,"Saved Data":V,"Hash Values":`h:${U} s:${P} l:${G} style:${W}`,"Base Color (raw)":{txt:`H:${R.h.toFixed(1)} S:${R.s.toFixed(1)} L:${R.l.toFixed(1)}`,elem:`BASE`},"Mapped Color":{txt:`H:${H.h.toFixed(1)} S:${H.s.toFixed(1)} L:${H.l.toFixed(1)}`,elem:`MAPPED`},"Effective Config":{txt:`H:${o.minHue}-${o.maxHue} S:${o.minSaturation}-${o.maxSaturation} L:${o.minLightness}-${o.maxLightness}`,elem:`MIN-MAX`},"Style Variations":`weight:${b} italic:${f} case:${y}`})}\n\t\t\t${j?`
    Site-wide override: ${z(O)}
    Your changes will override this locally.
    `:""}\n\t\t\t${o.useSingleColor?'\n\t\t\t
    \n\t\t\t\tPer-user color customization is disabled. Monochrome mode is enabled.
    \n\t\t\t\t\n\t\t\t
    \n\t\t\t':`\n\t\t\t

    Nick Color

    \n\t\t\t
    \n\t\t\t${q({label:"Custom color value:",id:"picker-custom",placeholder:"#ff6b6b or hsl(280, 90%, 65%)",classes:"no-padding-bottom"})}\n\t\t\t${F?'
    Color range is restricted. Preview shows mapped result. Click SETTINGS to adjust.
    ':""}\n\t\t\t`}\n\t\t\t
    \n\t\t`,buttons:[{label:"Save",class:"save",onClick:t=>{const o=ce();wi[e]=Wn(o,"typed")??{};const a=Zn({[e]:o},wi);a&&alert(`Saved.${Jn(a,"typed")}`),Si(),pr(),t(),ea(e)}},{label:"Reset",class:"reset",onClick:t=>{delete wi[e],Si(),pr(),t(),ea(e)}},{label:"Cancel",class:"cancel",onClick:e=>e()}]}),J=Z.querySelector("#picker-preview"),K=Z.querySelector("#picker-preview-mention"),Y=Z.querySelector("#picker-preview-inverted-nick"),Q=Z.querySelector("#picker-custom"),ee=Z.querySelector("#picker-sliders"),te=Z.querySelector("#picker-engine-container");let oe=!1;const ae=nt({schema:[{type:"hr"},{type:"section",label:"Custom Icons",hint:"Prepend/Append a custom character or emoji to the nickname.",fields:[{key:"prependIconEnabled",type:"tristate",label:"Prepend icon",default:s,defaultLabel:u},{key:"prependIconPicker",type:"custom",showWhen:{field:"prependIconEnabled",is:!0},render:()=>{const e=document.createElement("div");return e.innerHTML=_("settings-prependIcon"),e}},{key:"prependIcon",type:"text",label:"",ariaLabel:"Custom icon before nickname",default:r,placeholder:"custom icon before nickname",showWhen:{field:"prependIconEnabled",is:!0}},{key:"appendIconEnabled",type:"tristate",label:"Append icon",default:c,defaultLabel:g},{key:"appendIconPicker",type:"custom",showWhen:{field:"appendIconEnabled",is:!0},render:()=>{const e=document.createElement("div");return e.innerHTML=_("settings-appendIcon"),e}},{key:"appendIcon",type:"text",label:"",ariaLabel:"Custom icon after nickname",default:l,placeholder:"custom icon after nickname",showWhen:{field:"appendIconEnabled",is:!0}}]},{type:"section",label:"Style Variations",hint:"Override the global style settings for this user to add some visual flair.",fields:[{key:"fontWeight",type:"tristate",label:"Bold",default:"bold"===x||"normal"!==x&&null,defaultLabel:b},{key:"fontStyle",type:"tristate",label:"Italic",default:"italic"===S||"normal"!==S&&null,defaultLabel:f},{key:"fontVariant",type:"tristate",label:"Small Caps",default:"small-caps"===C||"normal"!==C&&null,defaultLabel:y},{key:"invert",type:"tristate",label:"Invert",default:!0===$||!1!==$&&null,defaultLabel:"auto"},{key:"customFontFamily",type:"tristate",label:"Custom Font",default:T,defaultLabel:N||"site default"},{key:"fontFamily",type:"text",label:"",ariaLabel:"Custom font family",default:A,placeholder:"Comic Sans MS, cursive",showWhen:{field:"customFontFamily",is:!0}}]},{type:"section",label:"Additional CSS",fields:[{key:"customCss",type:"textarea",label:"",default:n,placeholder:"background-color: #1a1a2e;\ntext-decoration: underline;",hint:"CSS properties, one per line"}]},{type:"section",label:"Backup",fields:[{key:"exportFile",type:"button",label:"Export user settings to file",buttonText:"Save Settings File",onClick:()=>{const t={[e]:ce()},o=(new Date).toISOString().slice(0,10);var a,n;a=t,n=`nick-colors-${e}-${o}.json`,Wt(JSON.stringify(Pi(a),null,2),n,"application/json")}},{key:"exportCopy",type:"button",label:"Export user settings to clipboard",buttonText:"Copy to Clipboard",onClick:async()=>{const t={[e]:ce()};await _t(JSON.stringify(Pi(t)),"Copied to clipboard!")}},{key:"importFile",type:"button",label:"Import user settings from file",buttonText:"Load Settings File",onClick:()=>Zt(de("file"),{parse:Wi})},{key:"importPaste",type:"button",label:"Import user settings from clipboard",buttonText:"Paste from Clipboard",onClick:()=>Jt(de("clipboard"),{parse:Wi})}]},{type:"section",label:"Request Override",noHr:!0,hint:'Ask for this style to be the default everyone sees for this name. Anyone who set their own style for it keeps theirs. If C-Mail opens instead with no message filled in, choose Copy to Clipboard in Backup above and send the text to @z0ylent.',fields:[{key:"requestOverride",type:"button",label:"Send this style as a request",buttonText:"Request Override",onClick:async()=>{if(oe)return;oe=!0;const t=Z.querySelector('[data-field-key="requestOverride"] button');t.textContent="Sending…";const o={[e]:ce()},a=`Hi! I'd like to request a site-wide nick color override: ${JSON.stringify(Pi(o))}`;try{Xt(await Qt("z0ylent",a),"z0ylent","Request sent to @z0ylent.")}finally{oe=!1,t.textContent="Request Override"}}}]}],values:{},onChange:()=>se(),container:te});ae.render();let ne=null,ie=null,re=null;if(ee&&!o.useSingleColor){const e=M?`Hue → mapped to ${o.minHue}-${o.maxHue}`:'Hue ',t=D?`Sat → mapped to ${o.minSaturation}-${o.maxSaturation}`:'Sat ',a=I?`Lit → mapped to ${o.minLightness}-${o.maxLightness}`:'Lit ';ne=at({label:e,min:0,max:360,value:180,onChange:()=>{Q.value="",se()}}),ie=at({label:t,min:0,max:100,value:85,onChange:()=>{Q.value="",se()}}),re=at({label:a,min:0,max:100,value:65,onChange:()=>{Q.value="",se()}}),ee.append(ne.el,ie.el,re.el)}const le=Z.querySelector("#picker-open-settings");function se(){!function(){if(!ne||!ie||!re)return;const e=ne.getValue(),t=ie.getValue(),a=re.getValue(),n=oi(e,o.minHue,o.maxHue),i=ai(t,o.minSaturation,o.maxSaturation),r=ai(a,o.minLightness,o.maxLightness),l=Array.from({length:13},(e,o)=>{const n=30*o;return[n,t,a,1,n/360*100]});if(M){const e=[];for(let t=0;t<=36;t++){const a=10*t,n=oi(a,o.minHue,o.maxHue),l=a/360*100;e.push([n,i,r,1,l])}ne.setSplitGradient(e,l)}else ne.setSplitGradient(null),ne.setGradient(l);const s=[[e,0,a,1,0],[e,100,a,1,100]];if(D){const e=[[n,o.minSaturation,r,1,0],[n,o.maxSaturation,r,1,100]];ie.setSplitGradient(e,s)}else ie.setSplitGradient(null),ie.setGradient(s);const c=[[e,t,0,1,0],[e,t,50,1,50],[e,t,100,1,100]];if(I){const e=[[n,i,o.minLightness,1,0],[n,i,o.maxLightness,1,100]];re.setSplitGradient(e,c)}else re.setSplitGradient(null),re.setGradient(c);const d=`hsl(${n}, ${i}%, ${r}%)`;ne.setThumbColor(d),ie.setThumbColor(d),re.setThumbColor(d);const h=ne.el.querySelector(".nc-slider-values"),p=ie.el.querySelector(".nc-slider-values"),u=re.el.querySelector(".nc-slider-values");h&&(h.textContent=`[${Math.round(e)} → ${Math.round(n)}]`),p&&(p.textContent=`[${Math.round(t)} → ${Math.round(i)}]`),u&&(u.textContent=`[${Math.round(a)} → ${Math.round(r)}]`);const g=Ji(ne.el),m=Ji(ie.el),b=Ji(re.el),f=o.maxHue-o.minHue,y=e/360;g.textContent=`t=${y.toFixed(3)} | ${o.minHue} + ${y.toFixed(3)} * (${o.maxHue} - ${o.minHue}) = ${o.minHue} + ${y.toFixed(3)} * ${f} = ${(o.minHue+y*f).toFixed(1)}`;const v=o.maxSaturation-o.minSaturation,w=t/100;m.textContent=`t=${w.toFixed(3)} | ${o.minSaturation} + ${w.toFixed(3)} * (${o.maxSaturation} - ${o.minSaturation}) = ${(o.minSaturation+w*v).toFixed(1)}`;const k=o.maxLightness-o.minLightness,x=a/100;b.textContent=`t=${x.toFixed(3)} | ${o.minLightness} + ${x.toFixed(3)} * (${o.maxLightness} - ${o.minLightness}) = ${(o.minLightness+x*k).toFixed(1)}`}();const t=Wn(ce(),"typed")??{},a=wi[e];wi[e]=t;const n={...fi};Object.assign(fi,o),fi.useSiteThemeHue=!1,fi.useSiteThemeSat=!1,fi.useSiteThemeLit=!1;const i=(t,o,a=!1)=>{t.style.cssText="",rr(t,e,{matchType:o?"mention":"nick",isInverted:a,debugData:$o})};i(J,!1,!1),K&&i(K,!0,!1),Y&&i(Y,!1,!0),Object.assign(fi,n),void 0!==a?wi[e]=a:delete wi[e]}if(le&&le.addEventListener("click",()=>{Z.close(),Ht(fr)}),t.color&&ne&&ie&&re){const e=ue(t.color,"hsl");e?(ne.setValue(e.h),ie.setValue(e.s),re.setValue(e.l)):Q&&(Q.value=t.color)}function ce(){const e=o.useSingleColor||!ne?Q?.value?.trim()||null:Q.value.trim()||`hsl(${ne.getValue()}, ${ie.getValue()}%, ${re.getValue()}%)`,t=ae.getFieldValue("prependIconEnabled"),a=ae.getFieldValue("appendIconEnabled"),n=ae.getFieldValue("fontWeight"),i=ae.getFieldValue("fontStyle"),r=ae.getFieldValue("fontVariant"),l=ae.getFieldValue("invert"),s={...ei(ae.getFieldValue("customCss")||"")};e&&(s.color=e),!0===t?s.prependIcon=(ae.getFieldValue("prependIcon")||"").trim():!1===t&&(s.prependIcon=""),!0===a?s.appendIcon=(ae.getFieldValue("appendIcon")||"").trim():!1===a&&(s.appendIcon=""),null!==n&&(s.fontWeight=n?"bold":"normal"),null!==i&&(s.fontStyle=i?"italic":"normal"),null!==r&&(s.fontVariant=r?"small-caps":"normal"),null!==l&&(s.invert=l);const c=ae.getFieldValue("customFontFamily");return!0===c?s.fontFamily=ae.getFieldValue("fontFamily")?.trim()||"":!1===c&&(s.fontFamily=""),s}function de(t){return(o,a)=>{if(a)return void alert(a.message);const n=o&&"object"==typeof o?o[e]||Object.values(o)[0]:null,i=Wn(n,"imported");i?(function(e){if(e.color&&ne&&ie&&re){const t=ue(e.color,"hsl");t?(ne.setValue(t.h),ie.setValue(t.s),re.setValue(t.l)):Q&&(Q.value=e.color)}const t=[];if(e.backgroundColor&&t.push(`background-color: ${e.backgroundColor}`),e.letterSpacing&&t.push(`letter-spacing: ${e.letterSpacing}`),e.textDecoration&&t.push(`text-decoration: ${e.textDecoration}`),t.length>0&&ae.setFieldValue("customCss",t.join(";\n")),void 0!==e.prependIcon&&(""===e.prependIcon?ae.setFieldValue("prependIconEnabled",!1):(ae.setFieldValue("prependIconEnabled",!0),ae.setFieldValue("prependIcon",e.prependIcon))),void 0!==e.appendIcon&&(""===e.appendIcon?ae.setFieldValue("appendIconEnabled",!1):(ae.setFieldValue("appendIconEnabled",!0),ae.setFieldValue("appendIcon",e.appendIcon))),void 0!==e.fontWeight){const t="bold"===e.fontWeight||"normal"!==e.fontWeight&&null;ae.setFieldValue("fontWeight",t)}if(void 0!==e.fontStyle){const t="italic"===e.fontStyle||"normal"!==e.fontStyle&&null;ae.setFieldValue("fontStyle",t)}if(void 0!==e.fontVariant){const t="small-caps"===e.fontVariant||"normal"!==e.fontVariant&&null;ae.setFieldValue("fontVariant",t)}void 0!==e.fontFamily&&(""===e.fontFamily?ae.setFieldValue("customFontFamily",!1):(ae.setFieldValue("customFontFamily",!0),ae.setFieldValue("fontFamily",e.fontFamily))),void 0!==e.invert&&ae.setFieldValue("invert",e.invert),se()}(i),alert(`Settings imported!${Jn(Zn({[e]:n},{[e]:i}),"imported")}`)):alert(`No valid user settings found in ${t}`)}}Q&&Q.addEventListener("input",se),te.addEventListener("click",e=>{const t=e.target.closest(".nc-icon-option");if(t){const e=t.textContent,o=t.closest(".picker-icon-options"),a=o?.dataset.target;if(a){const t="settings-prependIcon"===a?"prependIcon":"appendIcon";ae.setFieldValue(t,e),se()}void 0===t.dataset.restingBackground&&(t.dataset.restingBackground=t.style.background),clearTimeout(t.flashTimer),t.style.background="var(--atmo-fg-dim)",t.flashTimer=setTimeout(()=>{t.style.background=t.dataset.restingBackground},150)}}),se()}const fr="atmospheric-modulator-nick-colors";function yr(e=4.5){return{contrastEnabled:e>0,contrastThreshold:e>0?e:4.5}}function vr(e){const t=se(ui,e),o=Object.keys(ui).find(e=>ui[e]===t);return o?o.toLowerCase():""}function wr(){const e=ri(),t=ye(null,"hsl");return{presets:kr(),preview:'
    \n\t\t\t
    ',content:`\n\t\t\t${Zi({"Site Theme":Object.entries(t).length?""+Object.entries(t).filter(([e,t])=>!e.match(/^info|error|warn|success/i)).map(([e,t])=>`${e}: ${ue(t,"hsl-string")+` ███`}`).join("
    ")+"":"not detected","Effective Config":`H:${e.minHue}-${e.maxHue} S:${e.minSaturation}-${e.maxSaturation} L:${e.minLightness}-${e.maxLightness}`,"Contrast Threshold":e.contrastThreshold,"Custom Colors Saved":Object.keys(wi).length})}\n\t\t\t
    \n\t\t\t
    \n\t\t`}}function kr(){const e=I("settings-preset"),t=Object.keys(ui).map(e=>{const t=se(Q,e)?.colors,o=t?` style="--${O}-chip-fg: ${z(t.fg)}; --${O}-chip-bg: ${z(t.bg)}"`:"";return`\n\t\t`}).join("");return`\n\t\t
    \n\t\t\t
    \n\t\t\t\tPreset theme\n\t\t\t\t${q({type:"toggle",id:I("settings-follow-theme"),label:"Follow site theme",checked:!!fi.followSiteTheme,classes:"nc-settings-follow-theme"})}\n\t\t\t
    \n\t\t\t
    ${t}
    \n\t\t
    `}function xr(e){const{presets:t,preview:o,content:a}=wr(),n=I("nick-colors-reset");e.innerHTML=`\n\t\t
    Changes save as you make them. Per-user colors: right-click a username and ${$i}.
    \n\t\t
    \n\t\tSelect a Preset theme below to create a starting point to adjust colors from, or toggle on "Follow site theme" to have the preset follow you when you change your site's theme.
    \n\t\t
    \n\t\t${t}\n\t\t
    Nick color examples on your theme's background and inverted, from your settings below.
    \n\t\t
    ${o}
    \n\t\t${a}\n\t\t
    \n\t\t
    \n\t\t\t

    Reset Nick Color Theme

    \n\t\t\t${q({type:"button",id:n,classes:F("caution"),label:"Put the color settings back to the selected preset, or with none selected to the site theme's. Chooms, per-user colors and notes stay.",buttonText:"Reset to Preset"})}\n\t\t
    \n\t`,nt({container:e.querySelector("[data-nick-color-for]"),values:{colorFor:Ai},schema:[{key:"colorFor",type:"select",label:"Whose nicks get colored",options:ta}],onChange:(e,t)=>{"colorFor"===e&&(ji(t),pr(),Oi()||Mi())}}).render();const i=Er(e,{onImported:()=>xr(e)});Sr(e);const r=e.querySelector("#"+n);r.addEventListener("click",()=>J({title:"Reset to preset?",message:`This puts the nick color settings back to the selected preset, or with none selected to the site theme's. Chooms, per-user colors, notes and the ${d} section stay.`,confirmLabel:"RESET",tone:"caution",onConfirm:()=>{i.reset(),r.isConnected||Ft(fr)}}))}function Sr(e){e.dataset.ncFocusClear||(e.dataset.ncFocusClear="true",e.addEventListener("focusin",t=>{const o=t.target;requestAnimationFrame(()=>{const t=e.querySelector(".nc-settings-preview");if(!t||document.activeElement!==o)return;if(!(t.compareDocumentPosition(o)&Node.DOCUMENT_POSITION_FOLLOWING))return;const a=o.closest("[data-field-key]")||o,n=t.getBoundingClientRect();if(a.getBoundingClientRect().bottom<=n.top)return;const i=n.bottom-Cr(a);i>0&&($r(o).scrollTop-=i)})}))}function Cr(e){let t=e.getBoundingClientRect().top;for(const o of[e,...e.querySelectorAll("*")]){const e=getComputedStyle(o);if(!e.outlineStyle||"none"===e.outlineStyle)continue;const a=(parseFloat(e.outlineWidth)||0)+(parseFloat(e.outlineOffset)||0);t=Math.min(t,o.getBoundingClientRect().top-a)}return t}function $r(e){for(let t=e.parentElement;t;t=t.parentElement){const{overflowY:e}=getComputedStyle(t);if(("auto"===e||"scroll"===e)&&t.scrollHeight>t.clientHeight)return t}return document.scrollingElement||document.documentElement}function Ar(){const e=Object.keys(wi).length;J({title:"Reset custom user styles?",message:`This removes the custom color, icons and style set for ${1===e?"1 user":`${e} users`}, and cannot be undone. A name with a site-wide override goes back to it. Notes stay. To keep a copy, choose Save Settings File under ${h} first.`,confirmLabel:"RESET CUSTOM SETTINGS",tone:"danger",onConfirm:()=>{Ci({}),pr(),ea()}})}function Er(e,{onImported:t}){const o=ri(),a=ye(null,"hsl"),{settings:n,colorVariables:i}=Kn();let r=!1;const l=e.querySelector("[data-settings-engine]"),s=Array.from(e.querySelectorAll(".nc-settings-preset [data-preset]")),c=e.querySelector('.nc-settings-follow-theme input[type="checkbox"]');let d=mi||"",h=!1,p="";const u=e=>{p=e;for(const t of s)t.setAttribute("aria-pressed",String(t.dataset.preset===e))},g=e.querySelector("[data-settings-preview]"),m=e.querySelector("[data-settings-preview-inverted]");function b(){if(c.checked&&(mi||"")!==d&&!h){d=mi||"",h=!0;try{S(vr(d))}finally{h=!1}}fi={...y.getValues(),followSiteTheme:c.checked,followedTheme:c.checked?d:""},vi(),pr()}const f=["z0ylent","fr33Kevin","triNity","an0nym0us","ZeR0C00L","l1sb3th","enki","genghis_khan","acidBurn","neo","N3tRuNn3r","ByteMe99","CyB3rPuNk"];f.forEach(e=>{const t=document.createElement("span");t.className="preview-nick",t.textContent=e,g.appendChild(t)}),f.forEach(e=>{const t=document.createElement("span");t.className="preview-nick",t.textContent=e,m.appendChild(t)});const y=nt({schema:[{type:"section",label:"Monochrome Mode",fields:[{key:"useSingleColor",type:"toggle",label:"Use monochrome mode",default:!1},{type:"hint",text:"All usernames will use the same color. Per-user color customization is disabled.",showWhen:{field:"useSingleColor",is:!0}},{key:"singleColorHue",type:"slider",label:"Hue",min:0,max:360,default:i.fg?.h??180,simple:!1,showWhen:{field:"useSingleColor",is:!0}},{key:"singleColorSat",type:"slider",label:"Saturation",min:0,max:100,default:i.fg?.s??85,simple:!1,showWhen:{field:"useSingleColor",is:!0}},{key:"singleColorLit",type:"slider",label:"Lightness",min:0,max:100,default:i.fg?.l??65,simple:!1,showWhen:{field:"useSingleColor",is:!0}},{key:"singleColorCustom",type:"text",label:"Or use a custom color:",placeholder:"#ff6b6b or hsl(280, 90%, 65%)",default:"",showWhen:{field:"useSingleColor",is:!0}}]},{type:"section",label:"Hue Range"+(a.fg?"":' (no site theme)'),showWhen:{field:"useSingleColor",is:!1},fields:[{key:"useSiteThemeHue",type:"toggle",label:"Use site theme foreground hue"+(a.fg?` (${a.fg.h}°)`:""),default:!1,disabled:!a.fg,showWhen:{field:"useSingleColor",is:!1}},{key:"hueSpread",type:"slider",label:"Hue spread (±°)",min:5,max:180,default:30,showWhen:{all:[{field:"useSingleColor",is:!1},{field:"useSiteThemeHue",is:!0}]}},{key:"hueRange",type:"range",label:"Hue Range",min:0,max:360,default:[0,360],showWhen:{field:"useSingleColor",is:!1}}]},{type:"section",label:"Saturation Range",showWhen:{field:"useSingleColor",is:!1},fields:[{key:"useSiteThemeSat",type:"toggle",label:"Use site theme foreground saturation"+(a?.fg?` (${a.fg.s}%)`:""),default:!1,disabled:!a.fg,showWhen:{field:"useSingleColor",is:!1}},{key:"satSpread",type:"slider",label:"Saturation spread (±%)",min:0,max:50,default:15,showWhen:{all:[{field:"useSingleColor",is:!1},{field:"useSiteThemeSat",is:!0}]}},{key:"satRange",type:"range",label:"Saturation Range",min:0,max:100,default:[70,100],showWhen:{field:"useSingleColor",is:!1}}]},{type:"section",label:"Lightness Range",showWhen:{field:"useSingleColor",is:!1},fields:[{key:"useSiteThemeLit",type:"toggle",label:"Use site theme foreground lightness"+(a?.fg?` (${a.fg.l}%)`:""),default:!1,disabled:!a.fg,showWhen:{field:"useSingleColor",is:!1}},{key:"litSpread",type:"slider",label:"Lightness spread (±%)",min:0,max:50,default:10,showWhen:{all:[{field:"useSingleColor",is:!1},{field:"useSiteThemeLit",is:!0}]}},{key:"litRange",type:"range",label:"Lightness Range",min:0,max:100,default:[55,75],showWhen:{field:"useSingleColor",is:!1}}]},{type:"section",label:"Contrast",fields:[{key:"contrastEnabled",type:"toggle",label:"Enable contrast auto-inversion",default:!0},{type:"hint",text:"Auto-invert colors when WCAG contrast ratio is below threshold (3 = large text, 4.5 = AA, 7 = AAA)",showWhen:{field:"contrastEnabled",is:!0}},{key:"contrastThreshold",type:"slider",label:"Contrast Threshold (WCAG ratio)",min:1,max:21,step:.5,default:4.5,showWhen:{field:"contrastEnabled",is:!0}}]},{type:"section",label:"Style Variation",fields:[{type:"hint",text:"Add non-color variation to usernames (useful for limited color ranges)"},{key:"varyWeight",type:"toggle",label:"Vary font weight",default:!1},{key:"varyItalic",type:"toggle",label:"Vary italic",default:!1},{key:"varyCase",type:"toggle",label:"Vary small-caps",default:!1},{key:"prependIcon",type:"toggle",label:"Prepend icon",default:!1},{key:"appendIcon",type:"toggle",label:"Append icon",default:!1},{key:"iconSet",type:"text",label:"Icon set (space-separated)",placeholder:"● ○ ◆ ◇ ■ □ ▲ △ ★ ☆",default:"● ○ ◆ ◇ ■ □ ▲ △ ★ ☆ ♦ ♠ ♣ ♥ ☢ ☣ ☠ ⚙ ⬡ ⬢ ♻ ⚛ ⚠ ⛒",showWhen:{any:[{field:"prependIcon",is:!0},{field:"appendIcon",is:!0}]}}]},{type:"section",label:"Moving from Nick Colors",noHr:!0,fields:[{type:"button",label:"Bring your colors and notes over from the separate Nick Colors userscript",id:"settings-import-nick-colors",buttonText:"Import from Nick Colors",onClick:()=>_i(t)}]}],values:{...o,hueRange:[o.minHue,o.maxHue],satRange:[o.minSaturation,o.maxSaturation],litRange:[o.minLightness,o.maxLightness],...yr(o.contrastThreshold)},defaults:n,onChange:(e,t)=>{"useSingleColor"===e&&t&&r&&function(){if(!a.fg||y.getFieldValue("singleColorCustom"))return;const e=["singleColorHue","singleColorSat","singleColorLit"].every(e=>y.getFieldValue(e)===hi[e]);e&&y.setValues({singleColorHue:Math.round(a.fg.h),singleColorSat:Math.round(a.fg.s),singleColorLit:Math.round(a.fg.l)})}(),"useSiteThemeHue"!==e&&"hueSpread"!==e||v("hue"),"useSiteThemeSat"!==e&&"satSpread"!==e||v("sat"),"useSiteThemeLit"!==e&&"litSpread"!==e||v("lit"),k(),x(),r&&b()},container:l});function v(e){if(!a.fg)return;if(!y.getFieldValue(`useSiteTheme${e.charAt(0).toUpperCase()+e.slice(1)}`))return;const t=y.getFieldValue(`${e}Spread`),o=y.getField(`${e}Range`);if("hue"===e){const e=(a.fg.h-t+360)%360,n=(a.fg.h+t)%360;o?.setValues([e,n])}else if("sat"===e){const e=Math.max(0,a.fg.s-t),n=Math.min(100,a.fg.s+t);o?.setValues([e,n])}else if("lit"===e){const e=Math.max(0,a.fg.l-t),n=Math.min(100,a.fg.l+t);o?.setValues([e,n])}}function w(e,t){y.getField(e)?.setDisabled?.(t)}function k(){const e=y.getField("hueRange"),t=y.getField("satRange"),o=y.getField("litRange"),a=y.getField("singleColorHue"),n=y.getField("singleColorSat"),i=y.getField("singleColorLit");if(!e||!t||!o)return;const[r,l]=e.getValues?.()||[0,360],[s,c]=t.getValues?.()||[70,100],[d,h]=o.getValues?.()||[55,75],p=(r+l)/2,u=(s+c)/2,g=(d+h)/2,m=Array.from({length:13},(e,t)=>[30*t,u,g,1,30*t/360*100]);if(e.setGradient?.(m),t.setGradient?.([[p,0,g,1,0],[p,100,g,1,100]]),o.setGradient?.([[p,u,0,1,0],[p,u,50,1,50],[p,u,100,1,100]]),e.setThumbColor?.([`hsl(${r}, ${u}%, ${g}%)`,`hsl(${l}, ${u}%, ${g}%)`]),t.setThumbColor?.([`hsl(${p}, ${s}%, ${g}%)`,`hsl(${p}, ${c}%, ${g}%)`]),o.setThumbColor?.([`hsl(${p}, ${u}%, ${d}%)`,`hsl(${p}, ${u}%, ${h}%)`]),a&&n&&i){const e=a.getValue?.()??180,t=n.getValue?.()??85,o=i.getValue?.()??65,r=Array.from({length:13},(e,a)=>{const n=30*a;return[n,t,o,1,n/360*100]});a.setGradient?.(r),n.setGradient?.([[e,0,o,1,0],[e,100,o,1,100]]),i.setGradient?.([[e,t,0,1,0],[e,t,50,1,50],[e,t,100,1,100]]),a.setThumbColor?.(`hsl(${e}, ${t}%, ${o}%)`),n.setThumbColor?.(`hsl(${e}, ${t}%, ${o}%)`),i.setThumbColor?.(`hsl(${e}, ${t}%, ${o}%)`)}w("hueRange",y.getFieldValue("useSiteThemeHue")),w("satRange",y.getFieldValue("useSiteThemeSat")),w("litRange",y.getFieldValue("useSiteThemeLit"))}function x(){k();const e=function(){const e=y.getValues(),t={...e};return e.hueRange&&(t.minHue=e.hueRange[0],t.maxHue=e.hueRange[1]),e.satRange&&(t.minSaturation=e.satRange[0],t.maxSaturation=e.satRange[1]),e.litRange&&(t.minLightness=e.litRange[0],t.maxLightness=e.litRange[1]),t}(),t=p||mi||"";g.querySelectorAll(".preview-nick").forEach((o,a)=>{rr(o,f[a],{effectiveConfig:e,themeName:t,isInverted:!1,debugData:$o})}),m.querySelectorAll(".preview-nick").forEach((o,a)=>{rr(o,f[a],{effectiveConfig:e,themeName:t,isInverted:!0,debugData:$o})})}y.render();const S=e=>{u(e);const t=Yn(e);t&&(y.setValues({hueRange:[t.minHue,t.maxHue],satRange:[t.minSaturation,t.maxSaturation],litRange:[t.minLightness,t.maxLightness],...yr(t.contrastThreshold)},!0),x())};for(const e of s)e.addEventListener("click",()=>{c.checked&&(c.checked=!1,B(c)),S(e.dataset.preset)});c.addEventListener("change",()=>{B(c),d=mi||"",c.checked&&S(vr(d)),r&&b()}),c.checked&&u(vr(mi));const C=y.getValues.bind(y);return y.getValues=()=>{const e=C(),t={...e};return e.hueRange&&(t.minHue=e.hueRange[0],t.maxHue=e.hueRange[1],delete t.hueRange),e.satRange&&(t.minSaturation=e.satRange[0],t.maxSaturation=e.satRange[1],delete t.satRange),e.litRange&&(t.minLightness=e.litRange[0],t.maxLightness=e.litRange[1],delete t.litRange),e.contrastEnabled||(t.contrastThreshold=0),delete t.contrastEnabled,t},v("hue"),v("sat"),v("lit"),x(),r=!0,{engine:y,save:b,reset:function(){c.checked&&(d=mi||"");const e=(c.checked?d:p)||mi||"",t=Kn(e),o=t.settings,a=t.colorVariables;y.setValues({...o,...yr(o.contrastThreshold),hueRange:[o.minHue,o.maxHue],satRange:[o.minSaturation,o.maxSaturation],litRange:[o.minLightness,o.maxLightness],singleColorHue:a.fg?.h??o.singleColorHue,singleColorSat:a.fg?.s??o.singleColorSat,singleColorLit:a.fg?.l??o.singleColorLit},!0),u(vr(e)),x()}}}function Lr(e){br(e,or(e))}function Nr(e){const t=document.createElement("button");t.type="button",t.className=F("color-name"),t.dataset.entryControl="color";const o=document.createElement("span");return o.className=F("color-preview"),o.dataset.previewUser=e,o.textContent=e,t.appendChild(o),Or(o,e),t.addEventListener("click",()=>Lr(e)),t}function Tr(){const e=document.createElement("div");e.className=F("settings-section"),e.innerHTML="

    Reset User Specific Styles

    "+q({type:"button",id:I("nick-colors-clear-custom"),classes:F("danger"),label:"Remove the custom color, icons and style set for each user. ★'s notes and other settings stay.",buttonText:"Reset Custom User Styles"});const t=e.querySelector("button");return t.dataset.userListAction="clear-custom-nick-colors",t.addEventListener("click",Ar),[e]}function jr(){document.querySelectorAll(`[${lt}="${Go}"] .${F("color-preview")}`).forEach(e=>{Or(e,e.dataset.previewUser)})}function Or(e,t){const o=Ni(t);o?rr(e,t):ur(e);const a=e.closest("button");a&&(a.title=o?"Edit color":"Edit color (shows once they are a choom)")}Fo({key:"nickColors",usesChooms:!0,onStorageReady(e){yi(),ki(),Li(),e&&pr()},exportBackup:()=>Pi(Fi()),importBackup(e,t){const o=Bi(e,{recolor:t,replaceAll:!0});return o.success&&(Ft(fr),ea()),{...o,notice:Jn(o.dropped,"imported").trim()}},resetSettings(e){const t=Bi({},{recolor:e,replaceAll:!0});if(Ft(fr),ea(),!t.success)throw new Error(t.message)},debugLog:Ki,reportSummary:Yi,onSwitch:()=>pr(),boot(){var e,t;mi=document.documentElement?.dataset?.theme||null,oe(),bi(),ve(),Xn(),Vo({label:"Edit Color",order:10,group:Ho,showFor:e=>No.nickColors&&Ni(e),onSelect:Lr}),e=()=>pr(),aa.push(e),t=()=>No.nickColors?ar(`sample-${Math.random()}`,"hsl-string"):null,Io.nickColorSample=t,Jo({order:10,isShown:()=>No.nickColors,usernames:()=>Object.keys(wi),name:Nr,parts:()=>[],actions:Tr}),T&&(T("Nick Colors Settings",()=>Ya(fr)),T("Refresh Nick Colors",gr),T("Clear All Custom Colors",Ar)),Nt({key:fr,title:"Nick Colors",isShown:()=>No.nickColors,render:xr}),(ci?xe(ci).then(e=>{const t=_n(JSON.parse(e),"imported");di={...t,...di},jr(),Eo(si+" Loaded remote overrides:",Object.keys(t).length)}).catch(e=>console.error(si+" Failed to load remote overrides:",e)):Promise.resolve()).then(()=>xo(e=>e.forEach(hr))),new MutationObserver(e=>{e.some(e=>"data-theme"===e.attributeName)&&(Eo(si+" Theme changed, refreshing colors"),mi=document.documentElement.getAttribute("data-theme")||null,oe(),bi(),ve(),Xn()&&Ft(fr),pr())}).observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),console.log(si+` Loaded. Right-click or long-press a username, then ${$i}, to customize it.`)}})}{const Dr=r("nick-notes");let Ir={};const Fr=300;function zr(){try{const e=JSON.parse(C("nickNotes","{}"));Ir=e&&"object"==typeof e?e:{}}catch(e){Ir={}}}function qr(){S("nickNotes",JSON.stringify(Ir))}function Rr(){let e;try{e=JSON.parse(C("customNickColors","{}"))}catch(e){return}if(!e||"object"!=typeof e)return;let t=0;for(const[o,a]of Object.entries(e))a&&"object"==typeof a&&"userNotes"in a&&("string"==typeof a.userNotes&&a.userNotes&&(Ir[o]=a.userNotes),delete a.userNotes,t++);t&&(qr(),S("customNickColors",JSON.stringify(e)),Eo(Dr+` Moved ${t} notes out of nick colors' storage`))}function Hr(){zr(),Rr()}function Br(e){const t=Yr(e),o=I("nick-notes"),a=X({title:`Notes: ${z(e)}`,width:"350px",onHelp:null,onSettings:()=>Ht(_a),content:q({type:"textarea",id:o,label:"Notes",hint:"Only you see these, when you hover their name.",value:Ir[t]||""}),buttons:[{label:"Save",class:"save",onClick:o=>{const n=a.value.trim();n?Ir[t]=n:delete Ir[t],qr(),o(),ea(e)}},{label:"Cancel",class:"cancel",onClick:e=>e()}]}).querySelector("#"+o);a.focus()}Hr();let Vr=null,Ur=null,Pr=null;function Gr(e){return e.target instanceof Element?e.target.closest(io):null}function Wr(e){_r();const t=Ir[Yr(vo(e))];e.classList.toggle("nn-has-notes",!!t),t&&(Pr=e,Ur=setTimeout(()=>{if(!e.isConnected)return void _r();const o=(Vr||(Vr=document.createElement("div"),Vr.className="nn-tooltip",Vr.id=I("nick-notes-tooltip"),Vr.setAttribute("role","tooltip"),Vr.addEventListener("mouseleave",e=>{Pr?.contains(e.relatedTarget)||_r()}),document.body.appendChild(Vr)),Vr);o.textContent=t;const a=e.getBoundingClientRect();o.style.left=a.left+"px",o.style.top=a.bottom+"px",o.classList.add("visible"),e.setAttribute("aria-describedby",o.id)},Fr))}function _r(){clearTimeout(Ur),Ur=null,Vr?.classList.remove("visible"),Pr?.removeAttribute("aria-describedby"),Pr=null}function Zr(){return null!==Pr}function Jr(){const e=Object.keys(Ir).length;return`${e} ${1===e?"note":"notes"}`}const Kr='';function Yr(e){const t=e.toLowerCase();return Object.keys(Ir).find(e=>e.toLowerCase()===t)??e}function Xr(e){const t=Yr(e),o=Ir[t];if(!o){const e=document.createElement("button");return e.type="button",e.className=F("note-add"),e.dataset.entryControl="note",e.textContent="add note",e.setAttribute("aria-label",`add note on @${t}`),e.addEventListener("click",()=>Br(t)),[Ko(e,"text")]}const a=document.createElement("p");a.className=F("entry-text","note-text"),a.textContent=o,a.title="Edit notes",a.addEventListener("click",()=>Br(t));const n=W(Kr,`Edit notes on @${t}`,()=>Br(t));n.dataset.entryControl="note";const i=W(G,`Delete notes on @${t}`,()=>Qr(t),"danger");return i.dataset.entryControl="trash",[Ko(a,"text"),Ko(n,"edit"),Ko(i,"delete")]}function Qr(e){J({title:"Delete these notes?",message:`This deletes your notes on @${z(e)}, and cannot be undone.`,confirmLabel:"DELETE",tone:"danger",onConfirm:()=>{delete Ir[e],qr(),ea(e)}})}Fo({key:"nickNotes",onStorageReady(){Hr(),ea()},exportBackup:()=>({...Ir}),importBackup:e=>e&&"object"==typeof e?(Ir=Object.fromEntries(Object.entries(e).filter(([,e])=>"string"==typeof e&&e)),qr(),ea(),{success:!0,message:"Notes imported."}):{success:!1,message:"The notes are not readable."},resetSettings(){Ir={},qr(),ea()},debugLog:Jr,reportSummary:Jr,boot(){Vo({label:"Edit Notes",order:12,group:Ho,showFor:()=>No.nickNotes,onSelect:Br}),Jo({order:20,isShown:()=>No.nickNotes,usernames:()=>Object.keys(Ir),parts:Xr}),xo(),document.addEventListener("mouseover",e=>{const t=Gr(e);t&&!t.contains(e.relatedTarget)&&Wr(t)}),document.addEventListener("mouseout",e=>{const t=Gr(e);!t||t.contains(e.relatedTarget)||Vr?.contains(e.relatedTarget)||_r()}),document.addEventListener("focusin",e=>{const t=Gr(e);t&&Wr(t)}),document.addEventListener("focusout",e=>{Gr(e)&&_r()}),document.addEventListener("pointerdown",e=>{Zr()&&!Vr?.contains(e.target)&&_r()},!0),document.addEventListener("keydown",e=>{"Escape"===e.key&&Zr()&&_r()})}})}{const el=r("world-clock"),tl='#circ-room-header, .circ-rail div[data-debug="header"]',ol=[{id:"utc",label:"UTC",timeZone:"UTC"},{id:"los-angeles",label:"LA",timeZone:"America/Los_Angeles"},{id:"chicago",label:"Chicago",timeZone:"America/Chicago"},{id:"new-york",label:"NYC",timeZone:"America/New_York"},{id:"sao-paulo",label:"São Paulo",timeZone:"America/Sao_Paulo"},{id:"london",label:"London",timeZone:"Europe/London"},{id:"paris",label:"Paris",timeZone:"Europe/Paris"},{id:"berlin",label:"Berlin",timeZone:"Europe/Berlin"},{id:"moscow",label:"Moscow",timeZone:"Europe/Moscow"},{id:"dubai",label:"Dubai",timeZone:"Asia/Dubai"},{id:"mumbai",label:"Mumbai",timeZone:"Asia/Kolkata"},{id:"singapore",label:"Singapore",timeZone:"Asia/Singapore"},{id:"hong-kong",label:"Hong Kong",timeZone:"Asia/Hong_Kong"},{id:"tokyo",label:"Tokyo",timeZone:"Asia/Tokyo"},{id:"sydney",label:"Sydney",timeZone:"Australia/Sydney"},{id:"auckland",label:"Auckland",timeZone:"Pacific/Auckland"}],al={cities:["new-york","london","sydney"],hour24:!0,showOffsets:!1,custom:[]},nl=20,il=40;let rl={...al};function ll(e){if(!e||"object"!=typeof e)return{...al,custom:[]};const t=new Set(ol.map(e=>e.id));return{cities:Array.isArray(e.cities)?[...new Set(e.cities.filter(e=>t.has(e)))]:[...al.cities],hour24:"boolean"==typeof e.hour24?e.hour24:al.hour24,showOffsets:"boolean"==typeof e.showOffsets?e.showOffsets:al.showOffsets,custom:sl(e.custom)}}function sl(e){if(!Array.isArray(e))return[];const t=new Set,o=[];for(const a of e){const e=hl(a?.timeZone),n=cl(a?.label),i=dl({label:n,timeZone:e});if(e&&n&&!t.has(i)&&(t.add(i),o.push({label:n,timeZone:e}),o.length===nl))break}return o}function cl(e){return"string"!=typeof e?"":e.replace(/[\u0000-\u001f\u007f]+/g," ").trim().slice(0,il).trim()}function dl(e){return`${e.timeZone}|${e.label}`}function hl(e){if("string"!=typeof e||!e)return null;let t;try{t=new Intl.DateTimeFormat("en-US",{timeZone:e}).resolvedOptions().timeZone}catch(e){return null}return pl(e)??t}function pl(e){const t=e.toLowerCase();return ul().find(e=>e.toLowerCase()===t)}function ul(){return"function"==typeof Intl.supportedValuesOf?Intl.supportedValuesOf("timeZone"):[]}function gl(e){const t=e.trim().replace(/ +/g,"_");if(!t)return null;const o=t.toLowerCase();return pl(t)??ul().find(e=>e.toLowerCase().split("/").pop()===o)??hl(t)}function ml(e){return e.split("/").pop().replace(/_/g," ")}function bl(){return rl.cities.length>0||rl.custom.length>0}function fl(){try{rl=ll(JSON.parse(C("worldClock","null")))}catch(e){rl=ll(null)}}function yl(e){rl=ll(e),S("worldClock",JSON.stringify(rl)),Ll()}function vl(e,t){const o=Object.fromEntries(new Intl.DateTimeFormat("en-US",{timeZone:e,hourCycle:"h23",year:"numeric",month:"numeric",day:"numeric",hour:"numeric",minute:"numeric"}).formatToParts(t).map(e=>[e.type,Number(e.value)])),a=Date.UTC(o.year,o.month-1,o.day,o.hour,o.minute),n=6e4*Math.floor(t.getTime()/6e4);return Math.round((a-n)/6e4)}function wl(e){const t=e<0?"-":"+",o=Math.floor(Math.abs(e)/60),a=Math.abs(e)%60;return`UTC${t}${o}${a?":"+String(a).padStart(2,"0"):""}`}function kl(e,t,o){return new Intl.DateTimeFormat("en-US",o?{timeZone:e,hourCycle:"h23",hour:"2-digit",minute:"2-digit"}:{timeZone:e,hour12:!0,hour:"numeric",minute:"2-digit"}).format(t)}function xl(e){const t=[...ol.filter(e=>rl.cities.includes(e.id)),...rl.custom].map(t=>({city:t,offset:vl(t.timeZone,e)})),o=({city:e,offset:t})=>"UTC"===e.timeZone?-1/0:t;return t.sort((e,t)=>o(e)-o(t)),t.map(({city:t,offset:o})=>{let a=kl(t.timeZone,e,rl.hour24);return rl.showOffsets&&"UTC"!==t.timeZone&&(a+=` (${wl(o)})`),{label:t.label,time:a}})}fl();let Sl=null,Cl=!1;const $l=F("world-clock");function Al(){return Array.from(document.querySelectorAll(tl))}function El(e){return!!e?.classList.contains($l)}function Ll(){const e=Cl&&No.worldClock&&bl()?Al():[];if(document.querySelectorAll("."+$l).forEach(t=>{e.includes(t.previousElementSibling)||t.remove()}),!e.length)return clearTimeout(Sl),void(Sl=null);const t=xl(new Date);for(const o of e){let e=o.nextElementSibling;El(e)||(e=document.createElement("div"),e.className=`${$l} border-b border-border`,e.setAttribute("role","group"),e.setAttribute("aria-label","World clock"),o.after(e)),Nl(e,t)}clearTimeout(Sl),Sl=setTimeout(Ll,6e4-Date.now()%6e4)}function Nl(e,t){e.textContent="",t.forEach((t,o)=>{if(o){const t=document.createElement("span");t.className=F("world-clock-divider"),t.setAttribute("aria-hidden","true"),t.textContent="|",e.append(t)}const a=document.createElement("span");a.className=F("world-clock-city"),a.textContent=`${t.label} ${t.time}`,e.append(a)})}function Tl(e){e.textContent="";const t=document.createElement("div");e.append(t),nt({container:t,values:{hour24:rl.hour24,showOffsets:rl.showOffsets},schema:[{type:"section",label:"Clock",noHr:!0,fields:[{key:"hour24",type:"toggle",label:"24-hour time",default:al.hour24},{key:"showOffsets",type:"toggle",label:"Show each city's UTC offset, as (UTC-4)",default:al.showOffsets}]}],onChange:(e,t)=>yl({...rl,[e]:t})}).render(),e.append(jl(),Ol())}function jl(){const e=document.createElement("fieldset");e.className=F("world-clock-cities","chip-row");const t=document.createElement("legend");t.textContent="Cities",e.append(t);for(const t of ol){const o=document.createElement("button");o.type="button",o.className=F("chip"),o.dataset.city=t.id,o.textContent=t.label;const a=()=>o.setAttribute("aria-pressed",String(rl.cities.includes(t.id)));a(),o.addEventListener("click",()=>{const e=rl.cities.includes(t.id)?rl.cities.filter(e=>e!==t.id):[...rl.cities,t.id];yl({...rl,cities:e}),a()}),e.append(o)}return e}function Ol(){const e=document.createElement("fieldset");e.className=F("world-clock-custom");const t=document.createElement("legend");t.textContent="Your cities";const o=document.createElement("div"),a=I("world-clock-name"),n=I("world-clock-zone"),i=I("world-clock-error"),r=I("world-clock-zones"),l=document.createElement("div");l.className=F("world-clock-add"),l.innerHTML=`\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t
    \n\t\t\t\n\t\t
    \n\t\t\n\t\t
    `;const s=l.querySelector("#"+a),c=l.querySelector("#"+n),d=l.querySelector("#"+i);l.querySelector("datalist").append(...ul().map(e=>{const t=document.createElement("option");return t.value=e,t}));const h=()=>{o.textContent="",o.append(_(rl.custom.map(e=>{const t=document.createElement("span");t.textContent=`${e.label} (${e.timeZone})`;const a=W(G,`Remove ${e.label}`,()=>{yl({...rl,custom:rl.custom.filter(t=>dl(t)!==dl(e))}),Z(o,h,dl(e),s)},"danger");return a.dataset.entryControl="remove",{key:dl(e),parts:[t,a]}}),"None yet. Add any city by its time zone."))},p=e=>{d.textContent=e,c.setAttribute("aria-invalid","true"),c.focus()},u=()=>{const e=gl(c.value);if(!e)return p("Pick a time zone from the suggestions, such as America/Denver.");if(rl.custom.length>=nl)return p(`You can add up to ${nl} cities. Remove one first.`);const t={label:cl(s.value)||ml(e),timeZone:e};if(rl.custom.some(e=>dl(e)===dl(t)))return p(`${t.label} is already on the list.`);yl({...rl,custom:[...rl.custom,t]}),h(),d.textContent="",c.removeAttribute("aria-invalid"),s.value="",c.value="",s.focus()};l.querySelector("button").addEventListener("click",u);for(const e of[s,c])e.addEventListener("keydown",e=>{"Enter"===e.key&&(e.preventDefault(),u())});return h(),e.append(t,o,l),e}const Ml="atmospheric-modulator-world-clock";Fo({key:"worldClock",onStorageReady(e){fl(),e&&(Ll(),Ft(Ml))},exportBackup:()=>({...rl}),importBackup:(e,t)=>e&&"object"==typeof e?(yl(e),t&&Ft(Ml),{success:!0,message:"World clock settings imported."}):{success:!1,message:"The world clock settings are not readable."},resetSettings(e){yl(null),e&&Ft(Ml)},reportSummary:()=>{const e=rl.cities.length+rl.custom.length;return`${e} ${1===e?"city":"cities"}`},onSwitch:()=>Ll(),boot(){Nt({key:Ml,title:"World Clock",isShown:()=>No.worldClock,render:Tl}),Cl=!0,new MutationObserver(()=>{if(!No.worldClock||!bl())return;const e=Al(),t=e.some(e=>!El(e.nextElementSibling)),o=Array.from(document.querySelectorAll("."+$l)).some(t=>!e.includes(t.previousElementSibling));(t||o)&&Ll()}).observe(document.documentElement,{childList:!0,subtree:!0}),Eo(el+" Watching for cIRC headers"),Ll()}})}{const Dl=r("nick-effects"),Il=/^Online \(\d+\)$/,Fl=/^→\s*(\S+)\s+joined$/,zl=40,ql=".toast-notification",Rl=6e4,Hl=".chat-message",Bl=3e3,Vl=3,Ul=/^(\d{2}):(\d{2}):(\d{2})$/,Pl=12e4,Gl=6e5,Wl=3,_l={amount:{min:5,max:150,step:5},size:{min:8,max:40,step:1},duration:{min:1,max:5,step:.5},spin:{min:0,max:720,step:30},drift:{min:0,max:200,step:10},stagger:{min:0,max:80,step:5},rockets:{min:1,max:5,step:1},rocketDistance:{min:20,max:80,step:5},sprayDistance:{min:20,max:80,step:5},wobble:{min:0,max:80,step:5},spread:{min:10,max:90,step:5}},Zl=[{value:"linear",label:"Linear",css:"linear"},{value:"ease",label:"Ease",css:"ease"},{value:"ease-in",label:"Ease in",css:"ease-in"},{value:"ease-out",label:"Ease out",css:"ease-out"},{value:"ease-in-out",label:"Ease in-out",css:"ease-in-out"},{value:"overshoot",label:"Overshoot",css:"cubic-bezier(0.34, 1.56, 0.64, 1)"}],Jl=[{value:"fall",label:"Fall/Rise",gravity:!0,fades:!0,spins:!0,drifts:!0},{value:"burst",label:"Burst from name",gravity:!0,fades:!0,spins:!0,drifts:!0},{value:"firework",label:"Firework",direction:"up",gravity:!0,fades:!0,spins:!0,drifts:!0},{value:"bubbles",label:"Bubbles",gravity:!0,fades:!1,spins:!0,drifts:!0},{value:"rain",label:"Rain",gravity:!0,fades:!1,spins:!1,drifts:!0},{value:"fountain",label:"Fountain",direction:"up",gravity:!0,fades:!0,spins:!0,drifts:!0},{value:"zoom",label:"Starfield zoom",gravity:!1,fades:!0,spins:!0,drifts:!1}],Kl=[{value:"down",label:"Down"},{value:"up",label:"Up"},{value:"left",label:"Left"},{value:"right",label:"Right"}],Yl={rockets:"firework",rocketDistance:"firework",sprayDistance:"fountain",wobble:"bubbles",splash:"rain",spread:"fountain"},Xl=24,Ql=16,es=12,ts=500,os=30,as=30,ns=1e4,is={Confetti:{glyphs:"▪●▲■◆",colors:["#ff4d4d","#ffd84d","#4dff88","#4dc3ff","#d24dff"],colorSource:"theme",useNickname:!1,motion:"fall",direction:"down",gravity:"down",amount:80,size:14,duration:3,easing:"linear",spin:360,drift:60,stagger:40,fadeOut:!1,rockets:4,rocketDistance:50,sprayDistance:50,wobble:30,splash:!0,spread:40},Snow:{glyphs:"❄❅❆•",colors:["#ffffff","#cfe8ff"],colorSource:"theme",useNickname:!1,motion:"fall",direction:"down",gravity:"down",amount:50,size:16,duration:5,easing:"linear",spin:90,drift:100,stagger:50,fadeOut:!1,rockets:4,rocketDistance:50,sprayDistance:50,wobble:30,splash:!0,spread:40},Stars:{glyphs:"★✦✧☆",colors:["#fff6a0","#ffd84d","#ffffff"],colorSource:"theme",useNickname:!1,motion:"burst",direction:"down",gravity:"down",amount:40,size:18,duration:3,easing:"ease-out",spin:360,drift:0,stagger:15,fadeOut:!0,rockets:4,rocketDistance:50,sprayDistance:50,wobble:30,splash:!0,spread:40},Hearts:{glyphs:"♥❤",colors:["#ff4d8d","#ff8fb8","#ff2d55"],colorSource:"theme",useNickname:!1,motion:"fall",direction:"down",gravity:"up",amount:30,size:20,duration:4,easing:"ease-in",spin:30,drift:60,stagger:40,fadeOut:!0,rockets:4,rocketDistance:50,sprayDistance:50,wobble:30,splash:!0,spread:40},Fireworks:{glyphs:"✦✧•*+",colors:["#ffd84d","#ff4d8d","#4dc3ff","#ffffff"],colorSource:"theme",useNickname:!1,motion:"firework",direction:"up",gravity:"down",amount:150,size:18,duration:2.5,easing:"ease-out",spin:180,drift:20,stagger:30,fadeOut:!0,rockets:4,rocketDistance:35,sprayDistance:50,wobble:30,splash:!0,spread:40},Bubbles:{glyphs:"○◯°o",colors:["#cfe8ff","#9fd4ff","#ffffff"],colorSource:"theme",useNickname:!1,motion:"bubbles",direction:"down",gravity:"down",amount:30,size:20,duration:5,easing:"ease-out",spin:0,drift:20,stagger:50,fadeOut:!1,rockets:4,rocketDistance:50,sprayDistance:50,wobble:30,splash:!0,spread:40},Rain:{glyphs:"│|,",colors:["#9fd4ff","#4dc3ff","#cfe8ff"],colorSource:"theme",useNickname:!1,motion:"rain",direction:"down",gravity:"down",amount:100,size:16,duration:3,easing:"ease-in",spin:0,drift:40,stagger:70,fadeOut:!1,rockets:4,rocketDistance:50,sprayDistance:50,wobble:30,splash:!0,spread:40},Fountain:{glyphs:"•∙·*",colors:["#4dc3ff","#9fd4ff","#ffffff"],colorSource:"theme",useNickname:!1,motion:"fountain",direction:"up",gravity:"down",amount:80,size:14,duration:4,easing:"linear",spin:90,drift:0,stagger:70,fadeOut:!1,rockets:4,rocketDistance:50,sprayDistance:50,wobble:30,splash:!0,spread:40},Starfield:{glyphs:"·•✦*",colors:["#ffffff","#fff6a0","#cfe8ff"],colorSource:"theme",useNickname:!1,motion:"zoom",direction:"down",gravity:"down",amount:80,size:12,duration:3,easing:"ease-in",spin:0,drift:0,stagger:60,fadeOut:!1,rockets:4,rocketDistance:50,sprayDistance:50,wobble:30,splash:!0,spread:40},"Matrix Rain":{glyphs:"01アイウエオカキクケコ",colors:["#00ff41","#00c832"],colorSource:"theme",useNickname:!1,motion:"fall",direction:"down",gravity:"down",amount:70,size:14,duration:3,easing:"ease-in",spin:0,drift:0,stagger:60,fadeOut:!1,rockets:4,rocketDistance:50,sprayDistance:50,wobble:30,splash:!0,spread:40}},rs="Confetti",ls=[{value:"theme",label:"Cyberspace theme"},{value:"nickTheme",label:"Nick colors theme"},{value:"nick",label:"Choom's nick color"},{value:"custom",label:"Custom"}],ss=12,cs="best";let ds=Cs(null);function hs(e){const t=Object.hasOwn(is,e)?is[e]:us(e).effect;return{...t,colors:[...t.colors]}}function ps(){return[...Object.keys(is),...ds.presets.map(e=>e.name)]}function us(e){return ds.presets.find(t=>t.name.toLowerCase()===e.toLowerCase())}function gs(e){return Object.keys(is).some(t=>t.toLowerCase()===e.toLowerCase())}function ms(e){return"string"==typeof e?e.replace(/[\s\u0000-\u001f\u007f]+/g," ").trim():""}function bs(e){return e?e.length>as?`Use ${as} characters or fewer.`:gs(e)?`${e} is a built-in preset. Pick another name.`:!us(e)&&ds.presets.length>=os?`You can save up to ${os} presets. Delete one first.`:null:"Type a name for the preset."}function fs(e,t,o){if("number"!=typeof e||!Number.isFinite(e))return o;const a=Math.round((e-t.min)/t.step)*t.step+t.min;return Math.min(t.max,Math.max(t.min,a))}function ys(e){if("string"!=typeof e)return"";const t=[];for(const o of So(e.replace(/[\s\u0000-\u001f\u007f]+/g,"")))if(o.length<=Ql&&t.push(o),t.length===Xl)break;return t.join("")}function vs(e){return"string"==typeof e&&/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(e)}function ws(e){return/^#[0-9a-f]{3}$/i.test(e)?"#"+e.slice(1).split("").map(e=>e+e).join(""):e}function ks(e){const t=hs(rs);if(!e||"object"!=typeof e)return t;const o="rise"===e.motion?"fall":Jl.some(t=>t.value===e.motion)?e.motion:t.motion;return{glyphs:ys(e.glyphs)||t.glyphs,colors:Array.isArray(e.colors)?e.colors.filter(vs).slice(0,es):t.colors,colorSource:ls.some(t=>t.value===e.colorSource)?e.colorSource:!0===e.useNickColor?"nick":!1===e.matchTheme?"custom":t.colorSource,useNickname:"boolean"==typeof e.useNickname?e.useNickname:t.useNickname,motion:o,direction:Ss(o).direction?xs(e.direction)?e.direction:Ss(o).direction:Kl[0].value,gravity:Ss(o).gravity?xs(e.gravity)?e.gravity:"rise"===e.motion?"up":"fall"===o&&xs(e.direction)?e.direction:Kl[0].value:Kl[0].value,amount:fs(e.amount,_l.amount,t.amount),size:fs(e.size,_l.size,t.size),duration:fs(e.duration,_l.duration,t.duration),easing:Zl.some(t=>t.value===e.easing)?e.easing:t.easing,spin:Ss(o).spins?fs(e.spin,_l.spin,t.spin):0,drift:Ss(o).drifts?fs(e.drift,_l.drift,t.drift):0,stagger:fs(e.stagger,_l.stagger,t.stagger),fadeOut:!!Ss(o).fades&&("boolean"==typeof e.fadeOut?e.fadeOut:t.fadeOut),...Object.fromEntries(Object.entries(Yl).map(([a,n])=>[a,n!==o?t[a]:"boolean"==typeof t[a]?"boolean"==typeof e[a]?e[a]:t[a]:fs(e[a],_l[a],t[a])]))}}function xs(e){return Kl.some(t=>t.value===e)}function Ss(e){return Jl.find(t=>t.value===e)}function Cs(e){const t={},o=e&&"object"==typeof e&&e.users&&"object"==typeof e.users?e.users:{};for(const[e,a]of Object.entries(o)){if(Object.keys(t).length===ts)break;const o=e.toLowerCase();fo(e)&&!(o in Object.prototype)&&a&&"object"==typeof a&&(t[o]=ks(a))}const a=[];for(const t of Array.isArray(e?.presets)?e.presets:[]){if(a.length===os)break;const e=ms(t?.name);!e||e.length>as||!t.effect||"object"!=typeof t.effect||a.some(t=>t.name.toLowerCase()===e.toLowerCase())||a.push({name:e,effect:ks(t.effect)})}const n=new Set(Object.keys(is).concat(a.map(e=>e.name)).map(e=>e.toLowerCase())),i=a.map(({name:e,effect:t})=>{if(!gs(e))return{name:e,effect:t};let o=e;for(let t=2;n.has(o.toLowerCase());t++)o=`${e.slice(0,as-String(t).length-1)} ${t}`;return n.add(o.toLowerCase()),{name:o,effect:t}});return{playFor:ia(e?.playFor)?e.playFor:cs,onNotify:"boolean"!=typeof e?.onNotify||e.onNotify,default:ks(e?.default),users:t,presets:i}}function $s(e){const t=e=>{const t=ks(e);return"custom"!==t.colorSource&&delete t.colors,JSON.stringify(t)},o=t(e);return ps().find(e=>t(hs(e))===o)??null}function As(){try{ds=Cs(JSON.parse(C("nickEffects","null")))}catch(e){ds=Cs(null)}}function Es(e){ds=Cs(e),S("nickEffects",JSON.stringify(ds))}function Ls(e){return na(ds.playFor,ha(e))}function Ns(e){const t=e.toLowerCase();return Object.hasOwn(ds.users,t)?ds.users[t]:ds.default}function Ts(){const e=Object.keys(ds.users).length;return`${e} ${1===e?"user":"users"} with their own effect`}As();const js=F("effect"),Os="choom",Ms=".messages-scroller",Ds=.55,Is=.35,Fs=.8,zs=1.2,qs=.6,Rs=.2,Hs=4e3;function Bs(e,t){return e+Math.random()*(t-e)}function Vs(e){const t=e.toLowerCase();return Array.from(document.querySelectorAll(io)).find(e=>vo(e).toLowerCase()===t)}function Us(e){return e?getComputedStyle(e).color:null}function Ps(e,t){const{width:o,height:a}=t,n="down"===e||"up"===e;return{length:n?a:o,breadth:n?o:a,point:{down:(e,t)=>({x:e,y:t}),up:(e,t)=>({x:e,y:a-t}),right:(e,t)=>({x:t,y:e}),left:(e,t)=>({x:o-t,y:e})}[e]}}function Gs(e,t,o,a){const n=1e3*e.duration,{width:i,height:r}=t,l=Bs(-e.spin,e.spin),s=Bs(-e.drift,e.drift),c=Bs(0,e.stagger/100)*n,d=(n-c)*Bs(Ds,1),h=Zl.find(t=>t.value===e.easing).css,p=e.fadeOut?0:1,u=Ws(e.gravity),g=(e,t,o)=>({x:e.x+u.x*t+u.y*o,y:e.y+u.y*t+u.x*o});if(a){const o=Ps(e.direction,t),c=Bs(0,2*Math.PI),d=Bs(.1,.3)*Math.min(i,r),p=o.point(a.across,a.peak),u={x:Math.cos(c)*d,y:Math.sin(c)*d},m=n-a.delay,b=Bs(Fs,1),f=Is/b,y=t=>{const o=1-(1-t)**3;return{transform:_s(g({x:p.x+u.x*o,y:p.y+u.y*o},d*zs*t*t,s*t),l*t,String(tt.classList.remove(e),Hs)}const r=t?.getBoundingClientRect(),l=r&&r.left+r.width/2-a.left,s=r&&r.top+r.height/2-a.top,c=r&&r.width&&l>=0&&l<=a.width&&s>=0&&s<=a.height?{x:l,y:s}:{x:a.width/2,y:a.height/2},d=Co(e.useNickname?n:e.glyphs),h=Zs(e,o),p=document.createElement("div");p.className=js,p.classList.toggle(F("effect-over-dialogs"),i),Object.assign(p.style,{left:`${a.left}px`,top:`${a.top}px`,width:`${a.width}px`,height:`${a.height}px`}),p.setAttribute("aria-hidden","true");const u="firework"===e.motion?hc(e,a):null,g=u&&h.length?gc(h):null;for(let t=0;to.remove())}document.body.append(p),setTimeout(()=>p.remove(),1e3*e.duration+100)}const Qs=.45,ec=.4,tc=.5,oc=10,ac=.7;function nc(e){return 2*e.size}function ic(e,t){return t.map(t=>{const{point:o,rotate:a,scale:n,opacity:i}=e(t);return{transform:_s(o,a,n),opacity:i,offset:t}})}function rc(e){return Array.from({length:e+1},(t,o)=>o/e)}const lc={fall:{speed:1,keyframes(e,t,{spin:o,drift:a,endOpacity:n}){const i=Ps(e.gravity,t),r=Bs(0,i.breadth),l=-nc(e),s=i.length+nc(e);return ic(e=>({point:i.point(r+a*e,l+(s-l)*e),rotate:o*e,scale:"1",opacity:e<1?1:n}),[0,ac,1])}},bubbles:{speed:1,keyframes(e,t,{spin:o,drift:a}){const n=Ps(e.gravity,t),i=Bs(0,n.breadth),r=n.length+nc(e),l=n.length*Bs(.1,.4),s=Bs(1.5,3),c=Bs(0,2*Math.PI);return ic(t=>{const d=Math.min(t/.9,1);return{point:n.point(i+a*d+e.wobble*Math.sin(c+d*s*Math.PI*2),r+(l-r)*d),rotate:o*d,scale:t<1?"1":"1.6",opacity:t<1?1:0}},[...rc(oc).map(e=>.9*e),1])}},rain:{speed:Qs,keyframes(e,t,{drift:o}){const a=Ps(e.gravity,t),n=Bs(0,a.breadth),i=-nc(e),r=e.splash?a.length-e.size:a.length+nc(e),l=a.point(n,i),s=a.point(n+o,r),c=-180*Math.atan2(s.x-l.x,s.y-l.y)/Math.PI,d=[[0,{point:l,rotate:c,scale:"1",opacity:1}]];e.splash?(d.push([.85,{point:s,rotate:c,scale:"1",opacity:1}]),d.push([1,{point:s,rotate:c,scale:"2, 0.2",opacity:0}])):d.push([1,{point:s,rotate:c,scale:"1",opacity:1}]);const h=new Map(d);return ic(e=>h.get(e),d.map(([e])=>e))}},fountain:{speed:1,keyframes(e,t,{spin:o,drift:a}){const n=Ps(e.direction,t),i=Ws(e.gravity),r=nc(e),l=-r,s=n.length*(e.sprayDistance/100+Bs(-cc,cc))-l,c=Bs(-e.spread/2,e.spread/2)*Math.PI/180,d=s/(ec*ec),h=2*d*ec,p=h*Math.tan(c)+a,u=e=>n.point(n.breadth/2+p*e,l+h*e),g=u(1),m=i.x?g.x*i.x:g.y*i.y,b=i.x?i.x>0?t.width:0:i.y>0?t.height:0,f=Math.max(d,b*(i.x||i.y)+r+1-m),y=e=>{const t=u(e);return{x:t.x+i.x*f*e*e,y:t.y+i.y*f*e*e}},v=rc(oc),w=v.find(e=>{return e>0&&((o=y(e)).x<=-r||o.y<=-r||o.x>=t.width+r||o.y>=t.height+r);var o})??1,k=w*tc;return ic(t=>({point:y(t),rotate:o*t,scale:"1",opacity:e.fadeOut?Math.min(1,Math.max(0,(w-t)/(w-k))):1}),v)}},zoom:{speed:1,keyframes(e,t,{spin:o,endOpacity:a}){const n=t.width/2,i=t.height/2,r=Bs(0,2*Math.PI),l=Math.hypot(t.width,t.height)/2+2*nc(e),s=Bs(0,.15)*l;return ic(e=>{const t=s+(l-s)*e;return{point:{x:n+Math.cos(r)*t,y:i+Math.sin(r)*t},rotate:o*e,scale:String(.1+1.9*e),opacity:0===e?0:e<1?1:a}},[0,.2,1])}}},sc=.1,cc=sc,dc=.3;function hc(e,t){const o=e.rockets,a=e.stagger/100*e.duration*1e3,n=Ps(e.direction,t),i=1===o?0:a/(o-1),r=gc(Array.from({length:o},(e,t)=>t));return Array.from({length:o},(t,l)=>({across:n.breadth*(l+Bs(.3,.7))/o,peak:n.length*Bs(-sc,sc)+n.length*e.rocketDistance/100,delay:Math.min(a,Math.max(0,i*(r[l]+Bs(-dc,dc))))}))}const pc={h:10,s:10,l:10};function uc(e){const t=ws(e),o=ue(t,"hsl");if(!o)return e;const a=String(t).match(/^(?:rgba|hsla)\([^)]*,\s*([\d.]+)\s*\)$/i)?.[1],n=(e,t,o)=>Math.min(o,Math.max(0,e+Bs(-t,t))),i=`${((o.h+Bs(-pc.h,pc.h)+360)%360).toFixed(1)}, ${n(o.s,pc.s,100).toFixed(1)}%, ${n(o.l,pc.l,100).toFixed(1)}%`;return void 0===a?`hsl(${i})`:`hsla(${i}, ${a})`}function gc(e){const t=e.slice();for(let e=t.length-1;e>0;e--){const o=Math.floor(Math.random()*(e+1));[t[e],t[o]]=[t[o],t[e]]}return t}function mc(e,t,o){Eo(Dl+" Playing for:",e);const a=Vs(e);Xs(Ns(e),t,Us(a),o,bc(e,a))}function bc(e,t){return t?vo(t):e}let fc=null,yc="",vc=new Set;const wc=new Map,kc=new Map,xc=new WeakMap;let Sc=-1/0;const Cc=new Map,$c=new WeakSet;let Ac=null;const Ec="nickEffectsOwnUsername";let Lc=null,Nc=-1/0;const Tc=6e4;function jc(){const e=C(Ec,null);Ac="string"==typeof e&&fo(e)?e.toLowerCase():null}function Oc(e,t,o){const a=t=>o-(t.get(e)??-1/0){fo(e)&&(Ac=e.toLowerCase(),C(Ec,null)!==Ac&&S(Ec,Ac))},e=>Eo(Dl+" Could not tell who is signed in:",e.message)).finally(()=>{Lc=null}))}function qc(){if(fc?.isConnected)return fc;const e=Array.from(document.querySelectorAll("div.uppercase")).find(e=>Il.test(e.textContent.trim()));return e?.nextElementSibling??null}function Rc(e){const t=new Map;for(const o of e.querySelectorAll("a[href]")){const e=o.getAttribute("href").match(/^\/([^/?#]+)$/);e&&fo(e[1])&&t.set(e[1].toLowerCase(),o)}return t}function Hc(){const e=qc();if(!e)return void(fc=null);const t=Rc(e),o=[...t.keys()].filter(e=>!vc.has(e)),a=e!==fc||location.pathname!==yc||!vc.size,n=Date.now();if(!a)for(const e of vc)t.has(e)||wc.set(e,n);if(fc=e,yc=location.pathname,vc=new Set(t.keys()),o.length&&No.nickEffects&&Eo(Dl+` New on the Online list: ${o.join(", ")}`+(a?" (first read of this list: already here)":o.length>Wl?" (too many at once: taken for a reload)":"")),!(a||o.length>Wl)&&No.nickEffects)for(const e of o)Oc(e,t.get(e),n)}function Bc(e,t){const o=e.closest(Hl);if(!o)return`not in a ${Hl} row`;if(o.querySelector("a[href]"))return"its row has a link, as a typed message does";const a=xc.get(o.parentElement);if(void 0===a)return"its chat is new";if(t-ae.textContent.trim().match(Ul)).find(Boolean);if(!n)return null;const[i,r,l]=n.slice(1).map(Number),s=1e3*(60*(60*i+r)+l),c=new Date(t),d=1e3*(60*(60*c.getHours()+c.getMinutes())+c.getSeconds()),h=Math.abs(d-s);return Math.min(h,864e5-h)>Pl?`stamped ${n[0]}, not about now`:null}function Vc(e,t){for(const o of e){if(!(o instanceof Element))continue;const e=o.matches(Hl)?[o]:o.querySelectorAll(Hl);for(const o of e)o.parentElement&&!xc.has(o.parentElement)&&xc.set(o.parentElement,t)}}function Uc(e,t,o){const a=new Map;for(const t of e){const e=Array.from(t.removedNodes).filter(e=>e instanceof Element&&e.matches(Hl)).length;e&&t.target instanceof Element&&a.set(t.target,(a.get(t.target)??0)+e)}const n=new Set(t);for(const[e,t]of a)(!Array.from(e.children).some(e=>e.matches(Hl)&&!n.has(e))||t>Vl)&&xc.set(e,o)}function Pc(e){const t=e.filter(e=>e instanceof Element),o=t.reduce((e,t)=>e+1+t.getElementsByTagName("*").length,0);if(!t.length)return[];if(o>zl)return $o&&t.some(e=>/ joined/.test(e.textContent))&&Eo(Dl+` A join line came in a change of ${o} elements, over ${zl}: taken for history`),[];const a=[];for(const e of t)for(const t of[e,...e.querySelectorAll("span")]){if("SPAN"!==t.tagName)continue;const e=t.textContent.trim().match(Fl);e&&fo(e[1])&&a.push({name:e[1].toLowerCase(),line:t})}if($o&&!a.length){const e=t.map(e=>e.textContent.trim()).find(e=>/ joined/.test(e));e&&Eo(Dl+' Text with "joined" that is not a join line:',JSON.stringify(e.slice(0,120)))}return a}function Gc(e){const t=Date.now(),o=e.flatMap(e=>Array.from(e.addedNodes));Uc(e,o,t);const a=No.nickEffects?Pc(o).filter(({name:e,line:o})=>{const a=Bc(o,t);return a&&Eo(Dl+` Join line for ${e} skipped: ${a}`),!a}):[];if(Vc(o,t),a.length>Wl)Eo(Dl+` ${a.length} join lines at once: taken for a reload`);else for(const{name:e,line:o}of a)Oc(e,o,t)}function Wc(){let e=!1,t=[];new MutationObserver(o=>{Gc(o),No.nickEffects&&t.push(...Fc(o.flatMap(e=>Array.from(e.addedNodes)))),e||(e=!0,setTimeout(()=>{e=!1,Hc();const o=Date.now();for(const e of t){const t=Ic(e);t&&Dc(t.name,t.element,o)}t=[]},0))}).observe(document.documentElement,{childList:!0,subtree:!0}),Vc([document.documentElement],Date.now()),Fc([document.documentElement]),Hc(),Eo(Dl+" Watching the cIRC user list, join lines and notifications")}function _c(e){return{any:Jl.filter(e).map(e=>({field:"motion",is:e.value}))}}function Zc(e,t){let o=[...e];const a=document.createElement("fieldset");a.className=F("effect-colors");const n=document.createElement("legend");n.textContent="Colors";const i=document.createElement("div"),r=document.createElement("div");r.className="hint",r.setAttribute("role","status"),r.setAttribute("aria-live","polite");const l=document.createElement("button");function s(){i.textContent="",i.append(_(o.map((e,a)=>{const n=`Color ${a+1}`,c=document.createElement("input");c.type="color",c.value=ws(e),c.setAttribute("aria-label",n),c.dataset.entryControl="picker";const d=document.createElement("input");d.type="text",d.value=e,d.spellcheck=!1,d.setAttribute("aria-label",`${n} hex code`),d.dataset.entryControl="hex";const h=e=>{o[a]=e,r.textContent="",t([...o])};c.addEventListener("input",()=>{d.value=c.value,h(c.value)}),d.addEventListener("change",()=>{const e=d.value.trim().replace(/^#?/,"#").toLowerCase();if(!vs(e))return r.textContent=`${n} kept ${o[a]}: "${d.value.trim()}" is not a hex code, such as #ff4d4d or #f00.`,void(d.value=o[a]);d.value=e,c.value=ws(e),h(e)});const p=W(G,`Remove ${n.toLowerCase()}`,()=>{o=o.filter((e,t)=>t!==a),r.textContent="",t([...o]),Z(i,s,String(a),l)},"danger");return p.dataset.entryControl="remove",{key:String(a),parts:[c,d,p]}}),"No colors.")),l.disabled=o.length>=es}return l.type="button",l.className=F("inline-btn"),l.textContent="+ Add color",l.addEventListener("click",()=>{o=[...o,o.at(-1)??is[rs].colors[0]],t([...o]),s(),i.querySelector('li:last-child [data-entry-control="picker"]').focus()}),a.append(n,i,r,l),s(),a}function Jc(e,t){return Array.from(e?.querySelectorAll("[data-effect-preset]")??[]).find(e=>e.dataset.effectPreset===t)}function Kc(e,t){const o=I("preset-name"),a=I("preset-name-error"),n=X({title:"Save Preset",width:"360px",onHelp:null,warning:"",attribution:[],content:`\n\t\t\t${q({type:"text",label:"Preset name",id:o,value:e,stacked:!0})}\n\t\t\t
    `,buttons:[{label:"CANCEL",class:"cancel",onClick:e=>e()},{label:"SAVE",class:"save",onClick:e=>{const o=ms(i.value),a=bs(o);if(a)return r.textContent=a,i.setAttribute("aria-invalid","true"),void i.focus();e(),t(o)}}]}),i=n.querySelector("#"+o),r=n.querySelector("#"+a);i.maxLength=as,i.setAttribute("aria-describedby",a),i.addEventListener("keydown",e=>{"Enter"===e.key&&(e.preventDefault(),n.querySelector(`.${F("dialog-footer")} button.save`).click())}),i.focus(),i.select()}function Yc(e,t,o){zc(Date.now());const a=o??(Ac&&bc(Ac,Vs(Ac)))??Os,n=t.closest("."+F("dialog")),i=(n&&Ys(n))??Ks(t);Xs(e,t,Us(Vs(a)),i,a,!0)}function Xc(e,t,o,a,{buttons:n=null,picked:i=null}={}){e.textContent="";let r=t;const l=(t,i)=>Xc(e,t,o,a,{buttons:n,picked:i}),s=(e,t)=>{const o=document.createElement("button");return o.type="button",o.className=F("inline-btn",`effect-${t}`),o.textContent=e,o},c=n?.preview??s("Preview","preview"),d=n?.savePreset??s("Save preset","save-preset"),h=document.createElement("fieldset");h.className=F("effect-presets","chip-row");const p=document.createElement("legend");p.textContent="Presets",h.append(p);const u=ps().map(t=>{const a=document.createElement("button");if(a.type="button",a.className=F("chip"),a.dataset.effectPreset=t,a.textContent=t,a.addEventListener("click",()=>{o(hs(t)),l(hs(t),t),Jc(e,t).focus()}),Object.hasOwn(is,t))return h.append(a),a;const n=document.createElement("span");return n.className=F("effect-saved-preset"),n.append(a,W(G,`Delete preset ${t}`,()=>J({title:"Delete Preset",message:`Delete the preset ${z(t)}? Effects already set from it keep their settings.`,confirmLabel:"DELETE",onConfirm:()=>{Es({...ds,presets:ds.presets.filter(e=>e.name!==t)}),g(null)}}),"danger")),h.append(n),a});function g(t){Ot(e)||Ft(od),l(r,t??i),(t&&Jc(e,t)||n?.savePreset||e.querySelector("."+F("effect-save-preset"))).focus()}d.onclick=()=>Kc(i&&us(i)?i:"",e=>{const t=()=>{const t=ds.presets.filter(t=>t.name.toLowerCase()!==e.toLowerCase()),o=ds.presets.findIndex(t=>t.name.toLowerCase()===e.toLowerCase()),a={name:e,effect:ks(r)};t.splice(-1===o?t.length:o,0,a),Es({...ds,presets:t}),g(e)};if(!us(e))return t();J({title:"Replace Preset",message:`Replace the preset ${z(us(e).name)} with these settings?`,confirmLabel:"REPLACE",tone:"caution",onConfirm:t})});const m=()=>{const e=$s(r);u.forEach(t=>t.setAttribute("aria-pressed",String(t.dataset.effectPreset===e)))};m(),c.onclick=()=>Yc(r,c,a);const b=document.createElement("div");b.className=F("effect-form"),e.append(h,b);const f=nt({container:b,inlineSliders:!0,values:r,schema:[{type:"section",label:"Effect",noHr:!0,fields:[{key:"useNickname",type:"toggle",label:"Use their nick name as the characters"},{key:"glyphs",type:"text",label:"Custom characters",placeholder:is[rs].glyphs,sub:!0,showWhen:{field:"useNickname",is:!1}},{key:"colorSource",type:"select",label:"Effect character colors match",options:ls},{key:"colors",type:"custom",sub:!0,showWhen:{field:"colorSource",is:"custom"},render:(e,t)=>Zc(e,e=>t.setFieldValue("colors",e))},{key:"motion",type:"select",label:"Animation effect",options:Jl},{key:"gravity",type:"select",label:"Gravity direction",options:Kl,sub:!0,showWhen:_c(e=>e.gravity)},{key:"direction",type:"select",label:"Launch direction",options:Kl,sub:!0,showWhen:_c(e=>e.direction)},{key:"rockets",type:"slider",label:"Rocket count",..._l.rockets,sub:!0,showWhen:{field:"motion",is:Yl.rockets}},{key:"rocketDistance",type:"slider",label:"Rocket distance (%)",..._l.rocketDistance,sub:!0,showWhen:{field:"motion",is:Yl.rocketDistance}},{key:"sprayDistance",type:"slider",label:"Spray distance (%)",..._l.sprayDistance,sub:!0,showWhen:{field:"motion",is:Yl.sprayDistance}},{key:"wobble",type:"slider",label:"Wobble (px)",..._l.wobble,sub:!0,showWhen:{field:"motion",is:Yl.wobble}},{key:"splash",type:"toggle",label:"Splash where it lands",sub:!0,showWhen:{field:"motion",is:Yl.splash}},{key:"spread",type:"slider",label:"Spread (degrees)",..._l.spread,sub:!0,showWhen:{field:"motion",is:Yl.spread}},{key:"amount",type:"slider",label:"Particle/Character count",..._l.amount},{key:"size",type:"slider",label:"Character Size (px)",..._l.size},{key:"duration",type:"slider",label:"Animation length (sec)",..._l.duration},{key:"easing",type:"select",label:"Animation easing",options:Zl},{key:"spin",type:"slider",label:"Character spin (degrees)",..._l.spin,showWhen:_c(e=>e.spins)},{key:"drift",type:"slider",label:"Drift sideways (px)",..._l.drift,showWhen:_c(e=>e.drifts)},{key:"stagger",type:"slider",label:"Stagger effects (%)",..._l.stagger},{key:"fadeOut",type:"toggle",label:"Fade out",showWhen:_c(e=>e.fades)},...n?[]:[{type:"custom",render:()=>{const e=document.createElement("div");return e.className=F("effect-actions"),e.append(c,d),e}}]]}],onChange:(e,t)=>{if(r=ks({...r,[e]:t}),o(r),m(),"motion"===e){const e={direction:Ss(t).direction??r.direction,gravity:r.gravity,fadeOut:r.fadeOut,spin:r.spin,drift:r.drift,...Object.fromEntries(Object.keys(Yl).map(e=>[e,r[e]]))};for(const[t,o]of Object.entries(e)){const e=f.getField(t);o===r[t]&&o===e.getValue()||e.setValue(o)}}}});f.render()}function Qc(e){ed(e),e.innerHTML='\n\t\t
    Changes save as you make them. Per-user effects: right-click or long-press a username and choose Edit Effect.
    \n\t\t
    \n\t\tAn effect plays when they join the cIRC room you have open. Using cIRC in the sidebar? Turn on Show joins and leaves in cIRC in the Settings > Content tab, or no effect will play. The effect below is your default effect: pick a preset to start from and customize to your heart\'s content.
    \n\t';const t=document.createElement("div"),o=document.createElement("div");e.append(t,o),nt({container:t,values:{playFor:ds.playFor,onNotify:ds.onNotify},schema:[{key:"playFor",type:"select",label:"Who animation effects play for",options:ta},{key:"onNotify",type:"toggle",label:"Also play when they send me a notification"}],onChange:(e,t)=>Es({...ds,[e]:t})}).render(),Xc(o,ds.default,e=>Es({...ds,default:e}),null)}function ed(e){const t=()=>zc(Date.now());e.addEventListener("pointerdown",t,{once:!0}),e.addEventListener("keydown",t,{once:!0})}function td(e){const t=e.toLowerCase();let o=Object.hasOwn(ds.users,t),a=o?ds.users[t]:ds.default;const n=X({title:`Nick Effect: ${z(e)}`,width:"400px",onHelp:null,onSettings:()=>Ht(od),content:`\n\t\t\t
    \n\t\t\t
    `,buttons:[{label:"Preview",class:"preview"},{label:"Save preset",class:"save-preset"},{label:"Save",class:"save",onClick:e=>{const n={...ds.users};o&&!Object.hasOwn(n,t)&&Object.keys(n).length>=ts?alert(`You can give up to ${ts} users a custom nick effect. Turn it off for someone first.`):(o?n[t]=a:delete n[t],Es({...ds,users:n}),e())}},{label:"Cancel",class:"cancel",onClick:e=>e()}]}),i=n.querySelector("."+F("effect-own")),r=e=>n.querySelector(`.${F("dialog-footer")} button.${e}`),l={preview:r("preview"),savePreset:r("save-preset")},s=()=>{i.hidden=!o,l.preview.hidden=!o,l.savePreset.hidden=!o},c=n.querySelector("."+F("effect-choice"));nt({container:c,values:{custom:o},schema:[{key:"custom",type:"toggle",label:"Custom nick effect",hint:`Off plays your default effect for @${z(e)}. On plays the effect below.`}],onChange:(e,t)=>{o=t,s()}}).render(),Xc(i,a,e=>{a=e},e,{buttons:l}),s(),ed(n.el),c.querySelector('input[type="checkbox"]').focus()}jc();const od="atmospheric-modulator-nick-effects";Fo({key:"nickEffects",usesChooms:!0,onStorageReady(e){As(),jc(),e&&Ft(od)},exportBackup:()=>({...ds}),importBackup:(e,t)=>e&&"object"==typeof e?(Es(e),t&&Ft(od),{success:!0,message:"Nick effects settings imported."}):{success:!1,message:"The nick effects settings are not readable."},resetSettings(e){Es(null),e&&Ft(od)},reportSummary:Ts,boot(){Nt({key:od,title:"Nick Effects",isShown:()=>No.nickEffects,render:Qc}),Vo({label:"Edit Effect",order:11,group:Ho,showFor:e=>No.nickEffects&&Ls(e),onSelect:td}),xo(),Wc()}})}{new Set(["☆","✧","✿","❁","♥","♡","♪","☞","◕","◉","☉","⊙","◐","◑","◣","◢","┻","━","┬","─","┼","╯","╭","╮","︵","⚡","■","︻","╦","╤","▽","▼"]);const ad=[{name:"Travel & Places",picks:"⌛ hourglass done|⏳ hourglass not done|⌚ watch|⏰ alarm clock|⏱️ stopwatch|⏲️ timer clock|⭐ star|⚡ high voltage"},{name:"Activities",picks:"♥️ heart suit|🃏 joker|🀄 mahjong red dragon"},{name:"Objects",picks:"⌨️ keyboard"},{name:"Symbols",picks:"↗️ up-right arrow|↘️ down-right arrow|↙️ down-left arrow|↖️ up-left arrow|⤴️ right arrow curving up|⤵️ right arrow curving down|▶️ play button|⏩ fast-forward button|⏭️ next track button|⏯️ play or pause button|◀️ reverse button|⏪ fast reverse button|⏮️ last track button|⏫ fast up button|⏬ fast down button|⏸️ pause button|⏹️ stop button|⏺️ record button|⏏️ eject button|‼️ double exclamation mark|⁉️ exclamation question mark|〰️ wavy dash|⭕ hollow red circle|〽️ part alternation mark|©️ copyright|®️ registered|™️ trade mark|#️⃣ keycap: #|🅰️ A button (blood type)|🆎 AB button (blood type)|🅱️ B button (blood type)|🆑 CL button|🆒 COOL button|🆓 FREE button|ℹ️ information|🆔 ID button|Ⓜ️ circled M|🆕 NEW button|🆖 NG button|🅾️ O button (blood type)|🆗 OK button|🅿️ P button|🆘 SOS button|🆙 UP! button|🆚 VS button|🈁 Japanese “here” button|🈂️ Japanese “service charge” button|🈷️ Japanese “monthly amount” button|🈶 Japanese “not free of charge” button|🈯 Japanese “reserved” button|🉐 Japanese “bargain” button|🈹 Japanese “discount” button|🈚 Japanese “free of charge” button|🈲 Japanese “prohibited” button|🉑 Japanese “acceptable” button|🈸 Japanese “application” button|🈴 Japanese “passing grade” button|🈳 Japanese “vacancy” button|㊗️ Japanese “congratulations” button|㊙️ Japanese “secret” button|🈺 Japanese “open for business” button|🈵 Japanese “no vacancy” button|⬜ white large square|◼️ black medium square|◻️ white medium square|◾ black medium-small square|◽ white medium-small square|▪️ black small square|▫️ white small square"}],nd=[{name:"Latin-1 Supplement",picks:"§ section sign|¶ pilcrow sign|÷ division sign"},{name:"Ogham",picks:"ᚏ ogham letter ruis|ᚙ ogham letter eamhancholl"},{name:"Runic",picks:"ᚠ runic letter fehu feoh fe f|ᚡ runic letter v|ᚢ runic letter uruz ur u|ᚣ runic letter yr|ᚤ runic letter y|ᚥ runic letter w|ᚦ runic letter thurisaz thurs thorn|ᚧ runic letter eth|ᚨ runic letter ansuz a|ᚩ runic letter os o|ᚪ runic letter ac a|ᚫ runic letter aesc|ᚬ runic letter long-branch-oss o|ᚭ runic letter short-twig-oss o|ᚮ runic letter o|ᚯ runic letter oe|ᚰ runic letter on|ᚱ runic letter raido rad reid r|ᚲ runic letter kauna|ᚳ runic letter cen|ᚴ runic letter kaun k|ᚵ runic letter g|ᚶ runic letter eng|ᚷ runic letter gebo gyfu g|ᚸ runic letter gar|ᚹ runic letter wunjo wynn w|ᚺ runic letter haglaz h|ᚻ runic letter haegl h|ᚼ runic letter long-branch-hagall h|ᚽ runic letter short-twig-hagall h|ᚾ runic letter naudiz nyd naud n|ᚿ runic letter short-twig-naud n|ᛀ runic letter dotted-n|ᛁ runic letter isaz is iss i|ᛂ runic letter e|ᛃ runic letter jeran j|ᛄ runic letter ger|ᛅ runic letter long-branch-ar ae|ᛆ runic letter short-twig-ar a|ᛇ runic letter iwaz eoh|ᛈ runic letter pertho peorth p|ᛉ runic letter algiz eolhx|ᛊ runic letter sowilo s|ᛋ runic letter sigel long-branch-sol s|ᛌ runic letter short-twig-sol s|ᛍ runic letter c|ᛎ runic letter z|ᛏ runic letter tiwaz tir tyr t|ᛐ runic letter short-twig-tyr t|ᛑ runic letter d|ᛒ runic letter berkanan beorc bjarkan b|ᛓ runic letter short-twig-bjarkan b|ᛔ runic letter dotted-p|ᛕ runic letter open-p|ᛖ runic letter ehwaz eh e|ᛗ runic letter mannaz man m|ᛘ runic letter long-branch-madr m|ᛙ runic letter short-twig-madr m|ᛚ runic letter laukaz lagu logr l|ᛛ runic letter dotted-l|ᛜ runic letter ingwaz|ᛝ runic letter ing|ᛞ runic letter dagaz daeg d|ᛟ runic letter othalan ethel o|ᛠ runic letter ear|ᛡ runic letter ior|ᛢ runic letter cweorth|ᛣ runic letter calc|ᛤ runic letter cealc|ᛥ runic letter stan|ᛦ runic letter long-branch-yr|ᛧ runic letter short-twig-yr|ᛨ runic letter icelandic-yr|ᛩ runic letter q|ᛪ runic letter x|᛫ runic single punctuation|᛬ runic multiple punctuation|᛭ runic cross punctuation|ᛮ runic arlaug symbol|ᛯ runic tvimadur symbol|ᛰ runic belgthor symbol|ᛱ runic letter k|ᛲ runic letter sh|ᛳ runic letter oo|ᛴ runic letter franks casket os|ᛵ runic letter franks casket is|ᛶ runic letter franks casket eh|ᛷ runic letter franks casket ac|ᛸ runic letter franks casket aesc"},{name:"General Punctuation",picks:"† dagger|‡ double dagger|‰ per mille sign|‱ per ten thousand sign"},{name:"Mathematical Operators",picks:"∂ partial differential|∆ increment|∇ nabla|∏ n-ary product|∑ n-ary summation|√ square root|∝ proportional to|∞ infinity|∠ angle|∫ integral|≠ not equal to"},{name:"Geometric Shapes",picks:"■ black square|□ white square|▲ black up-pointing triangle|△ white up-pointing triangle|▼ black down-pointing triangle|▽ white down-pointing triangle|◆ black diamond|◇ white diamond|◊ lozenge|○ white circle|● black circle|◐ circle with left half black|◑ circle with right half black|◒ circle with lower half black|◓ circle with upper half black|◧ square with left half black|◨ square with right half black|◩ square with upper left diagonal half black|◪ square with lower right diagonal half black|◫ white square with vertical bisecting line|◬ white up-pointing triangle with dot|◭ up-pointing triangle with left half black|◮ up-pointing triangle with right half black|◯ large circle|◰ white square with upper left quadrant|◱ white square with lower left quadrant|◲ white square with lower right quadrant|◳ white square with upper right quadrant|◴ white circle with upper left quadrant|◵ white circle with lower left quadrant|◶ white circle with lower right quadrant|◷ white circle with upper right quadrant|◸ upper left triangle|◹ upper right triangle|◺ lower left triangle|◿ lower right triangle"},{name:"Miscellaneous Symbols",picks:"☆ white star|☞ white right pointing index"},{name:"Dingbats",picks:"✧ white four pointed star|✿ black florette|❁ eight petalled outlined black florette"},{name:"Miscellaneous Mathematical Symbols-A",picks:"⟐ white diamond with centred dot|⟑ and with dot|⟒ element of opening upwards|⟕ left outer join|⟖ right outer join|⟗ full outer join|⟚ left and right double turnstile|⟛ left and right tack|⟟ up tack with circle above|⟠ lozenge divided by horizontal rule|⟡ white concave-sided diamond|⟢ white concave-sided diamond with leftwards tick|⟣ white concave-sided diamond with rightwards tick|⟤ white square with leftwards tick|⟥ white square with rightwards tick"},{name:"Miscellaneous Mathematical Symbols-B",picks:"⦀ triple vertical bar delimiter|⦁ z notation spot|⦂ z notation type colon|⦃ left white curly bracket|⦄ right white curly bracket|⦊ z notation right binding bracket|⦐ right square bracket with tick in top corner|⦑ left angle bracket with dot|⦒ right angle bracket with dot|⦓ left arc less-than bracket|⦔ right arc greater-than bracket|⦕ double left arc greater-than bracket|⦖ double right arc less-than bracket|⦚ vertical zigzag line|⦛ measured angle opening left|⦜ right angle variant with square|⦝ measured right angle with dot|⦞ angle with s inside|⦟ acute angle|⦠ spherical angle opening left|⦡ spherical angle opening up|⦢ turned angle|⦣ reversed angle|⦤ angle with underbar|⦥ reversed angle with underbar|⦦ oblique angle opening up|⦧ oblique angle opening down|⦨ measured angle with open arm ending in arrow pointing up and right|⦩ measured angle with open arm ending in arrow pointing up and left|⦪ measured angle with open arm ending in arrow pointing down and right|⦫ measured angle with open arm ending in arrow pointing down and left|⦬ measured angle with open arm ending in arrow pointing right and up|⦭ measured angle with open arm ending in arrow pointing left and up|⦮ measured angle with open arm ending in arrow pointing right and down|⦯ measured angle with open arm ending in arrow pointing left and down|⦰ reversed empty set|⦱ empty set with overbar|⦲ empty set with small circle above|⦳ empty set with right arrow above|⦴ empty set with left arrow above|⦵ circle with horizontal bar|⦶ circled vertical bar|⦷ circled parallel|⦸ circled reverse solidus|⦹ circled perpendicular|⦺ circle divided by horizontal bar and top half divided by vertical bar|⦻ circle with superimposed x|⦼ circled anticlockwise-rotated division sign|⦽ up arrow through circle|⦾ circled white bullet|⦿ circled bullet|⧀ circled less-than|⧁ circled greater-than|⧂ circle with small circle to the right|⧃ circle with two horizontal strokes to the right|⧄ squared rising diagonal slash|⧅ squared falling diagonal slash|⧆ squared asterisk|⧇ squared small circle|⧈ squared square|⧉ two joined squares|⧊ triangle with dot above|⧋ triangle with underbar|⧌ s in triangle|⧍ triangle with serifs at bottom|⧎ right triangle above left triangle|⧏ left triangle beside vertical bar|⧐ vertical bar beside right triangle|⧑ bowtie with left half black|⧒ bowtie with right half black|⧓ black bowtie|⧔ times with left half black|⧕ times with right half black|⧖ white hourglass|⧗ black hourglass|⧘ left wiggly fence|⧙ right wiggly fence|⧚ left double wiggly fence|⧛ right double wiggly fence|⧜ incomplete infinity|⧝ tie over infinity|⧞ infinity negated with vertical bar|⧠ square with contoured outline|⧡ increases as|⧢ shuffle product|⧣ equals sign and slanted parallel|⧤ equals sign and slanted parallel with tilde above|⧥ identical to and slanted parallel|⧦ gleich stark|⧧ thermodynamic|⧨ down-pointing triangle with left half black|⧩ down-pointing triangle with right half black|⧪ black diamond with down arrow|⧫ black lozenge|⧬ white circle with down arrow|⧭ black circle with down arrow|⧮ error-barred white square|⧯ error-barred black square|⧰ error-barred white diamond|⧱ error-barred black diamond|⧲ error-barred white circle|⧳ error-barred black circle|⧴ rule-delayed|⧺ double plus|⧻ triple plus|⧼ left-pointing curved angle bracket|⧽ right-pointing curved angle bracket"},{name:"Miscellaneous Symbols and Arrows",picks:"⬟ black pentagon|⬠ white pentagon|⬡ white hexagon|⬢ black hexagon|⬣ horizontal black hexagon|⬤ black large circle|⬥ black medium diamond|⬦ white medium diamond|⬧ black medium lozenge|⬨ white medium lozenge|⬫ white small lozenge|⬬ black horizontal ellipse|⬭ white horizontal ellipse|⬮ black vertical ellipse|⬯ white vertical ellipse|⬰ left arrow with small circle|⬱ three leftwards arrows|⬲ left arrow with circled plus|⬳ long leftwards squiggle arrow|⭅ leftwards quadruple arrow|⭆ rightwards quadruple arrow|⭒ white small star|⭓ black right-pointing pentagon|⭔ white right-pointing pentagon"},{name:"Glagolitic",picks:"Ⰰ glagolitic capital letter azu|Ⰱ glagolitic capital letter buky|Ⰲ glagolitic capital letter vede|Ⰳ glagolitic capital letter glagoli|Ⰴ glagolitic capital letter dobro|Ⰵ glagolitic capital letter yestu|Ⰶ glagolitic capital letter zhivete|Ⰷ glagolitic capital letter dzelo|Ⰸ glagolitic capital letter zemlja|Ⰹ glagolitic capital letter izhe|Ⰺ glagolitic capital letter initial izhe|Ⰻ glagolitic capital letter i|Ⰼ glagolitic capital letter djervi|Ⰽ glagolitic capital letter kako|Ⰾ glagolitic capital letter ljudije|Ⰿ glagolitic capital letter myslite|Ⱀ glagolitic capital letter nashi|Ⱁ glagolitic capital letter onu|Ⱂ glagolitic capital letter pokoji|Ⱃ glagolitic capital letter ritsi|Ⱄ glagolitic capital letter slovo|Ⱅ glagolitic capital letter tvrido|Ⱆ glagolitic capital letter uku|Ⱇ glagolitic capital letter fritu|Ⱈ glagolitic capital letter heru|Ⱉ glagolitic capital letter otu|Ⱊ glagolitic capital letter pe|Ⱋ glagolitic capital letter shta|Ⱌ glagolitic capital letter tsi|Ⱍ glagolitic capital letter chrivi|Ⱎ glagolitic capital letter sha|Ⱏ glagolitic capital letter yeru|Ⱐ glagolitic capital letter yeri|Ⱑ glagolitic capital letter yati|Ⱒ glagolitic capital letter spidery ha|Ⱓ glagolitic capital letter yu|Ⱔ glagolitic capital letter small yus|Ⱕ glagolitic capital letter small yus with tail|Ⱖ glagolitic capital letter yo|Ⱗ glagolitic capital letter iotated small yus|Ⱘ glagolitic capital letter big yus|Ⱙ glagolitic capital letter iotated big yus|Ⱚ glagolitic capital letter fita|Ⱛ glagolitic capital letter izhitsa|Ⱜ glagolitic capital letter shtapic|Ⱝ glagolitic capital letter trokutasti a|Ⱞ glagolitic capital letter latinate myslite"},{name:"Coptic",picks:"Ⲁ coptic capital letter alfa|ⲁ coptic small letter alfa|Ⲃ coptic capital letter vida|ⲃ coptic small letter vida|Ⲅ coptic capital letter gamma|ⲅ coptic small letter gamma|Ⲇ coptic capital letter dalda|ⲇ coptic small letter dalda|Ⲉ coptic capital letter eie|ⲉ coptic small letter eie|Ⲋ coptic capital letter sou|ⲋ coptic small letter sou|Ⲍ coptic capital letter zata|ⲍ coptic small letter zata|Ⲏ coptic capital letter hate|ⲏ coptic small letter hate|Ⲑ coptic capital letter thethe|ⲑ coptic small letter thethe|Ⲓ coptic capital letter iauda|ⲓ coptic small letter iauda|Ⲕ coptic capital letter kapa|ⲕ coptic small letter kapa|Ⲗ coptic capital letter laula|ⲗ coptic small letter laula|Ⲙ coptic capital letter mi|ⲙ coptic small letter mi|Ⲛ coptic capital letter ni|ⲛ coptic small letter ni|Ⲝ coptic capital letter ksi|ⲝ coptic small letter ksi|Ⲟ coptic capital letter o|ⲟ coptic small letter o|Ⲡ coptic capital letter pi|ⲡ coptic small letter pi|Ⲣ coptic capital letter ro|ⲣ coptic small letter ro|Ⲥ coptic capital letter sima|ⲥ coptic small letter sima|Ⲧ coptic capital letter tau|ⲧ coptic small letter tau|Ⲩ coptic capital letter ua|ⲩ coptic small letter ua|Ⲫ coptic capital letter fi|ⲫ coptic small letter fi|Ⲭ coptic capital letter khi|ⲭ coptic small letter khi|Ⲯ coptic capital letter psi|ⲯ coptic small letter psi|Ⲱ coptic capital letter oou|ⲱ coptic small letter oou|Ⲳ coptic capital letter dialect-p alef|ⲳ coptic small letter dialect-p alef|Ⲵ coptic capital letter old coptic ain|ⲵ coptic small letter old coptic ain|Ⲷ coptic capital letter cryptogrammic eie|ⲷ coptic small letter cryptogrammic eie|Ⲹ coptic capital letter dialect-p kapa|ⲹ coptic small letter dialect-p kapa|Ⲻ coptic capital letter dialect-p ni|ⲻ coptic small letter dialect-p ni|Ⲽ coptic capital letter cryptogrammic ni|ⲽ coptic small letter cryptogrammic ni|Ⲿ coptic capital letter old coptic oou|ⲿ coptic small letter old coptic oou|Ⳁ coptic capital letter sampi|ⳁ coptic small letter sampi|Ⳃ coptic capital letter crossed shei|ⳃ coptic small letter crossed shei|Ⳅ coptic capital letter old coptic shei|ⳅ coptic small letter old coptic shei|Ⳇ coptic capital letter old coptic esh|ⳇ coptic small letter old coptic esh|Ⳉ coptic capital letter akhmimic khei|ⳉ coptic small letter akhmimic khei|Ⳋ coptic capital letter dialect-p hori|ⳋ coptic small letter dialect-p hori|Ⳍ coptic capital letter old coptic hori|ⳍ coptic small letter old coptic hori|Ⳏ coptic capital letter old coptic ha|ⳏ coptic small letter old coptic ha|Ⳑ coptic capital letter l-shaped ha|ⳑ coptic small letter l-shaped ha|Ⳓ coptic capital letter old coptic hei|ⳓ coptic small letter old coptic hei|Ⳕ coptic capital letter old coptic hat|ⳕ coptic small letter old coptic hat|Ⳗ coptic capital letter old coptic gangia|ⳗ coptic small letter old coptic gangia|Ⳙ coptic capital letter old coptic dja|ⳙ coptic small letter old coptic dja|Ⳛ coptic capital letter old coptic shima|ⳛ coptic small letter old coptic shima|Ⳝ coptic capital letter old nubian shima|ⳝ coptic small letter old nubian shima|Ⳟ coptic capital letter old nubian ngi|ⳟ coptic small letter old nubian ngi|Ⳡ coptic capital letter old nubian nyi|ⳡ coptic small letter old nubian nyi|Ⳣ coptic capital letter old nubian wau|ⳣ coptic small letter old nubian wau|ⳤ coptic symbol kai|⳥ coptic symbol mi ro|⳦ coptic symbol pi ro|⳧ coptic symbol stauros|⳨ coptic symbol tau ro|⳩ coptic symbol khi ro|⳪ coptic symbol shima sima|Ⳬ coptic capital letter cryptogrammic shei|ⳬ coptic small letter cryptogrammic shei|Ⳮ coptic capital letter cryptogrammic gangia|ⳮ coptic small letter cryptogrammic gangia"},{name:"Linear B Syllabary",picks:"𐀀 linear b syllable b008 a|𐀁 linear b syllable b038 e|𐀂 linear b syllable b028 i|𐀃 linear b syllable b061 o|𐀄 linear b syllable b010 u|𐀅 linear b syllable b001 da|𐀆 linear b syllable b045 de|𐀇 linear b syllable b007 di|𐀈 linear b syllable b014 do|𐀉 linear b syllable b051 du|𐀊 linear b syllable b057 ja|𐀋 linear b syllable b046 je|𐀍 linear b syllable b036 jo|𐀎 linear b syllable b065 ju|𐀏 linear b syllable b077 ka|𐀐 linear b syllable b044 ke|𐀑 linear b syllable b067 ki|𐀒 linear b syllable b070 ko|𐀓 linear b syllable b081 ku|𐀔 linear b syllable b080 ma|𐀕 linear b syllable b013 me|𐀖 linear b syllable b073 mi|𐀗 linear b syllable b015 mo|𐀘 linear b syllable b023 mu|𐀙 linear b syllable b006 na|𐀚 linear b syllable b024 ne|𐀛 linear b syllable b030 ni|𐀜 linear b syllable b052 no|𐀝 linear b syllable b055 nu|𐀞 linear b syllable b003 pa|𐀟 linear b syllable b072 pe|𐀠 linear b syllable b039 pi|𐀡 linear b syllable b011 po|𐀢 linear b syllable b050 pu|𐀣 linear b syllable b016 qa|𐀤 linear b syllable b078 qe|𐀥 linear b syllable b021 qi|𐀦 linear b syllable b032 qo|𐀨 linear b syllable b060 ra|𐀩 linear b syllable b027 re|𐀪 linear b syllable b053 ri|𐀫 linear b syllable b002 ro|𐀬 linear b syllable b026 ru|𐀭 linear b syllable b031 sa|𐀮 linear b syllable b009 se|𐀯 linear b syllable b041 si|𐀰 linear b syllable b012 so|𐀱 linear b syllable b058 su|𐀲 linear b syllable b059 ta|𐀳 linear b syllable b004 te|𐀴 linear b syllable b037 ti|𐀵 linear b syllable b005 to|𐀶 linear b syllable b069 tu|𐀷 linear b syllable b054 wa|𐀸 linear b syllable b075 we|𐀹 linear b syllable b040 wi|𐀺 linear b syllable b042 wo|𐀼 linear b syllable b017 za|𐀽 linear b syllable b074 ze|𐀿 linear b syllable b020 zo|𐁀 linear b syllable b025 a2|𐁁 linear b syllable b043 a3|𐁂 linear b syllable b085 au|𐁃 linear b syllable b071 dwe|𐁄 linear b syllable b090 dwo|𐁅 linear b syllable b048 nwa|𐁆 linear b syllable b029 pu2|𐁇 linear b syllable b062 pte|𐁈 linear b syllable b076 ra2|𐁉 linear b syllable b033 ra3|𐁊 linear b syllable b068 ro2|𐁋 linear b syllable b066 ta2|𐁌 linear b syllable b087 twe|𐁍 linear b syllable b091 two|𐁐 linear b symbol b018|𐁑 linear b symbol b019|𐁒 linear b symbol b022|𐁓 linear b symbol b034|𐁔 linear b symbol b047|𐁕 linear b symbol b049|𐁖 linear b symbol b056|𐁗 linear b symbol b063|𐁘 linear b symbol b064|𐁙 linear b symbol b079|𐁚 linear b symbol b082|𐁛 linear b symbol b083|𐁜 linear b symbol b086|𐁝 linear b symbol b089"},{name:"Linear B Ideograms",picks:"𐂀 linear b ideogram b100 man|𐂁 linear b ideogram b102 woman|𐂂 linear b ideogram b104 deer|𐂃 linear b ideogram b105 equid|𐂄 linear b ideogram b105f mare|𐂅 linear b ideogram b105m stallion|𐂆 linear b ideogram b106f ewe|𐂇 linear b ideogram b106m ram|𐂈 linear b ideogram b107f she-goat|𐂉 linear b ideogram b107m he-goat|𐂊 linear b ideogram b108f sow|𐂋 linear b ideogram b108m boar|𐂌 linear b ideogram b109f cow|𐂍 linear b ideogram b109m bull|𐂎 linear b ideogram b120 wheat|𐂏 linear b ideogram b121 barley|𐂐 linear b ideogram b122 olive|𐂑 linear b ideogram b123 spice|𐂒 linear b ideogram b125 cyperus|𐂓 linear b monogram b127 kapo|𐂔 linear b monogram b128 kanako|𐂕 linear b ideogram b130 oil|𐂖 linear b ideogram b131 wine|𐂗 linear b ideogram b132|𐂘 linear b monogram b133 arepa|𐂙 linear b monogram b135 meri|𐂚 linear b ideogram b140 bronze|𐂛 linear b ideogram b141 gold|𐂜 linear b ideogram b142|𐂝 linear b ideogram b145 wool|𐂞 linear b ideogram b146|𐂟 linear b ideogram b150|𐂠 linear b ideogram b151 horn|𐂡 linear b ideogram b152|𐂢 linear b ideogram b153|𐂣 linear b ideogram b154|𐂤 linear b monogram b156 turo2|𐂥 linear b ideogram b157|𐂦 linear b ideogram b158|𐂧 linear b ideogram b159 cloth|𐂨 linear b ideogram b160|𐂩 linear b ideogram b161|𐂪 linear b ideogram b162 garment|𐂫 linear b ideogram b163 armour|𐂬 linear b ideogram b164|𐂭 linear b ideogram b165|𐂮 linear b ideogram b166|𐂯 linear b ideogram b167|𐂰 linear b ideogram b168|𐂱 linear b ideogram b169|𐂲 linear b ideogram b170|𐂳 linear b ideogram b171|𐂴 linear b ideogram b172|𐂵 linear b ideogram b173 month|𐂶 linear b ideogram b174|𐂷 linear b ideogram b176 tree|𐂸 linear b ideogram b177|𐂹 linear b ideogram b178|𐂺 linear b ideogram b179|𐂻 linear b ideogram b180|𐂼 linear b ideogram b181|𐂽 linear b ideogram b182|𐂾 linear b ideogram b183|𐂿 linear b ideogram b184|𐃀 linear b ideogram b185|𐃁 linear b ideogram b189|𐃂 linear b ideogram b190|𐃃 linear b ideogram b191 helmet|𐃄 linear b ideogram b220 footstool|𐃅 linear b ideogram b225 bathtub|𐃆 linear b ideogram b230 spear|𐃇 linear b ideogram b231 arrow|𐃈 linear b ideogram b232|𐃉 linear b ideogram b233 sword|𐃊 linear b ideogram b234|𐃋 linear b ideogram b236|𐃌 linear b ideogram b240 wheeled chariot|𐃍 linear b ideogram b241 chariot|𐃎 linear b ideogram b242 chariot frame|𐃏 linear b ideogram b243 wheel|𐃐 linear b ideogram b245|𐃑 linear b ideogram b246|𐃒 linear b monogram b247 dipte|𐃓 linear b ideogram b248|𐃔 linear b ideogram b249|𐃕 linear b ideogram b251|𐃖 linear b ideogram b252|𐃗 linear b ideogram b253|𐃘 linear b ideogram b254 dart|𐃙 linear b ideogram b255|𐃚 linear b ideogram b256|𐃛 linear b ideogram b257|𐃜 linear b ideogram b258|𐃝 linear b ideogram b259|𐃞 linear b ideogram vessel b155|𐃟 linear b ideogram vessel b200|𐃠 linear b ideogram vessel b201|𐃡 linear b ideogram vessel b202|𐃢 linear b ideogram vessel b203|𐃣 linear b ideogram vessel b204|𐃤 linear b ideogram vessel b205|𐃥 linear b ideogram vessel b206|𐃦 linear b ideogram vessel b207|𐃧 linear b ideogram vessel b208|𐃨 linear b ideogram vessel b209|𐃩 linear b ideogram vessel b210|𐃪 linear b ideogram vessel b211|𐃫 linear b ideogram vessel b212|𐃬 linear b ideogram vessel b213|𐃭 linear b ideogram vessel b214|𐃮 linear b ideogram vessel b215|𐃯 linear b ideogram vessel b216|𐃰 linear b ideogram vessel b217|𐃱 linear b ideogram vessel b218|𐃲 linear b ideogram vessel b219|𐃳 linear b ideogram vessel b221|𐃴 linear b ideogram vessel b222|𐃵 linear b ideogram vessel b226|𐃶 linear b ideogram vessel b227|𐃷 linear b ideogram vessel b228|𐃸 linear b ideogram vessel b229|𐃹 linear b ideogram vessel b250|𐃺 linear b ideogram vessel b305"},{name:"Ancient Symbols",picks:"𐆐 roman sextans sign|𐆑 roman uncia sign|𐆒 roman semuncia sign|𐆓 roman sextula sign|𐆔 roman dimidia sextula sign|𐆕 roman siliqua sign|𐆖 roman denarius sign|𐆗 roman quinarius sign|𐆘 roman sestertius sign|𐆙 roman dupondius sign|𐆚 roman as sign|𐆛 roman centurial sign|𐆜 ascia symbol|𐆠 greek symbol tau rho"},{name:"Old Italic",picks:"𐌀 old italic letter a|𐌁 old italic letter be|𐌂 old italic letter ke|𐌃 old italic letter de|𐌄 old italic letter e|𐌅 old italic letter ve|𐌆 old italic letter ze|𐌇 old italic letter he|𐌈 old italic letter the|𐌉 old italic letter i|𐌊 old italic letter ka|𐌋 old italic letter el|𐌌 old italic letter em|𐌍 old italic letter en|𐌎 old italic letter esh|𐌏 old italic letter o|𐌐 old italic letter pe|𐌑 old italic letter she|𐌒 old italic letter ku|𐌓 old italic letter er|𐌔 old italic letter es|𐌕 old italic letter te|𐌖 old italic letter u|𐌗 old italic letter eks|𐌘 old italic letter phe|𐌙 old italic letter khe|𐌚 old italic letter ef|𐌛 old italic letter ers|𐌜 old italic letter che|𐌝 old italic letter ii|𐌞 old italic letter uu|𐌟 old italic letter ess"},{name:"Gothic",picks:"𐌰 gothic letter ahsa|𐌱 gothic letter bairkan|𐌲 gothic letter giba|𐌳 gothic letter dags|𐌴 gothic letter aihvus|𐌵 gothic letter qairthra|𐌶 gothic letter iuja|𐌷 gothic letter hagl|𐌸 gothic letter thiuth|𐌹 gothic letter eis|𐌺 gothic letter kusma|𐌻 gothic letter lagus|𐌼 gothic letter manna|𐌽 gothic letter nauths|𐌾 gothic letter jer|𐌿 gothic letter urus|𐍀 gothic letter pairthra|𐍁 gothic letter ninety|𐍂 gothic letter raida|𐍃 gothic letter sauil|𐍄 gothic letter teiws|𐍅 gothic letter winja|𐍆 gothic letter faihu|𐍇 gothic letter iggws|𐍈 gothic letter hwair|𐍉 gothic letter othal|𐍊 gothic letter nine hundred"},{name:"Ugaritic",picks:"𐎀 ugaritic letter alpa|𐎁 ugaritic letter beta|𐎂 ugaritic letter gamla|𐎃 ugaritic letter kha|𐎄 ugaritic letter delta|𐎅 ugaritic letter ho|𐎆 ugaritic letter wo|𐎇 ugaritic letter zeta|𐎈 ugaritic letter hota|𐎉 ugaritic letter tet|𐎊 ugaritic letter yod|𐎋 ugaritic letter kaf|𐎌 ugaritic letter shin|𐎍 ugaritic letter lamda|𐎎 ugaritic letter mem|𐎏 ugaritic letter dhal|𐎐 ugaritic letter nun|𐎑 ugaritic letter zu|𐎒 ugaritic letter samka|𐎓 ugaritic letter ain|𐎔 ugaritic letter pu|𐎕 ugaritic letter sade|𐎖 ugaritic letter qopa|𐎗 ugaritic letter rasha|𐎘 ugaritic letter thanna|𐎙 ugaritic letter ghain|𐎚 ugaritic letter to|𐎛 ugaritic letter i|𐎜 ugaritic letter u|𐎝 ugaritic letter ssu|𐎟 ugaritic word divider"},{name:"Old Persian",picks:"𐎠 old persian sign a|𐎡 old persian sign i|𐎢 old persian sign u|𐎣 old persian sign ka|𐎤 old persian sign ku|𐎥 old persian sign ga|𐎦 old persian sign gu|𐎧 old persian sign xa|𐎨 old persian sign ca|𐎩 old persian sign ja|𐎪 old persian sign ji|𐎫 old persian sign ta|𐎬 old persian sign tu|𐎭 old persian sign da|𐎮 old persian sign di|𐎯 old persian sign du|𐎰 old persian sign tha|𐎱 old persian sign pa|𐎲 old persian sign ba|𐎳 old persian sign fa|𐎴 old persian sign na|𐎵 old persian sign nu|𐎶 old persian sign ma|𐎷 old persian sign mi|𐎸 old persian sign mu|𐎹 old persian sign ya|𐎺 old persian sign va|𐎻 old persian sign vi|𐎼 old persian sign ra|𐎽 old persian sign ru|𐎾 old persian sign la|𐎿 old persian sign sa|𐏀 old persian sign za|𐏁 old persian sign sha|𐏂 old persian sign ssa|𐏃 old persian sign ha|𐏈 old persian sign auramazdaa|𐏉 old persian sign auramazdaa-2|𐏊 old persian sign auramazdaaha|𐏋 old persian sign xshaayathiya|𐏌 old persian sign dahyaaush|𐏍 old persian sign dahyaaush-2|𐏎 old persian sign baga|𐏏 old persian sign buumish|𐏐 old persian word divider|𐏑 old persian number one|𐏒 old persian number two|𐏓 old persian number ten|𐏔 old persian number twenty|𐏕 old persian number hundred"},{name:"Deseret",picks:"𐐀 deseret capital letter long i|𐐁 deseret capital letter long e|𐐂 deseret capital letter long a|𐐃 deseret capital letter long ah|𐐄 deseret capital letter long o|𐐅 deseret capital letter long oo|𐐆 deseret capital letter short i|𐐇 deseret capital letter short e|𐐈 deseret capital letter short a|𐐉 deseret capital letter short ah|𐐊 deseret capital letter short o|𐐋 deseret capital letter short oo|𐐌 deseret capital letter ay|𐐍 deseret capital letter ow|𐐎 deseret capital letter wu|𐐏 deseret capital letter yee|𐐐 deseret capital letter h|𐐑 deseret capital letter pee|𐐒 deseret capital letter bee|𐐓 deseret capital letter tee|𐐔 deseret capital letter dee|𐐕 deseret capital letter chee|𐐖 deseret capital letter jee|𐐗 deseret capital letter kay|𐐘 deseret capital letter gay|𐐙 deseret capital letter ef|𐐚 deseret capital letter vee|𐐛 deseret capital letter eth|𐐜 deseret capital letter thee|𐐝 deseret capital letter es|𐐞 deseret capital letter zee|𐐟 deseret capital letter esh|𐐠 deseret capital letter zhee|𐐡 deseret capital letter er|𐐢 deseret capital letter el|𐐣 deseret capital letter em|𐐤 deseret capital letter en|𐐥 deseret capital letter eng|𐐦 deseret capital letter oi|𐐧 deseret capital letter ew|𐐨 deseret small letter long i|𐐩 deseret small letter long e|𐐪 deseret small letter long a|𐐫 deseret small letter long ah|𐐬 deseret small letter long o|𐐭 deseret small letter long oo|𐐮 deseret small letter short i|𐐯 deseret small letter short e|𐐰 deseret small letter short a|𐐱 deseret small letter short ah|𐐲 deseret small letter short o|𐐳 deseret small letter short oo|𐐴 deseret small letter ay|𐐵 deseret small letter ow|𐐶 deseret small letter wu|𐐷 deseret small letter yee|𐐸 deseret small letter h|𐐹 deseret small letter pee|𐐺 deseret small letter bee|𐐻 deseret small letter tee|𐐼 deseret small letter dee|𐐽 deseret small letter chee|𐐾 deseret small letter jee|𐐿 deseret small letter kay|𐑀 deseret small letter gay|𐑁 deseret small letter ef|𐑂 deseret small letter vee|𐑃 deseret small letter eth|𐑄 deseret small letter thee|𐑅 deseret small letter es|𐑆 deseret small letter zee|𐑇 deseret small letter esh|𐑈 deseret small letter zhee|𐑉 deseret small letter er|𐑊 deseret small letter el|𐑋 deseret small letter em|𐑌 deseret small letter en|𐑍 deseret small letter eng|𐑎 deseret small letter oi|𐑏 deseret small letter ew"},{name:"Shavian",picks:"𐑔 shavian letter thigh|𐑕 shavian letter so|𐑖 shavian letter sure|𐑗 shavian letter church|𐑜 shavian letter gag|𐑝 shavian letter vow|𐑞 shavian letter they|𐑟 shavian letter zoo|𐑣 shavian letter ha-ha|𐑤 shavian letter loll|𐑥 shavian letter mime|𐑦 shavian letter if|𐑧 shavian letter egg|𐑨 shavian letter ash|𐑩 shavian letter ado|𐑪 shavian letter on|𐑫 shavian letter wool|𐑬 shavian letter out|𐑭 shavian letter ah|𐑮 shavian letter roar|𐑯 shavian letter nun|𐑰 shavian letter eat|𐑱 shavian letter age|𐑲 shavian letter ice|𐑳 shavian letter up|𐑴 shavian letter oak|𐑵 shavian letter ooze|𐑶 shavian letter oil|𐑷 shavian letter awe|𐑸 shavian letter are|𐑹 shavian letter or|𐑺 shavian letter air|𐑻 shavian letter err|𐑼 shavian letter array|𐑽 shavian letter ear|𐑾 shavian letter ian|𐑿 shavian letter yew"},{name:"Phoenician",picks:"𐤀 phoenician letter alf|𐤁 phoenician letter bet|𐤂 phoenician letter gaml|𐤃 phoenician letter delt|𐤄 phoenician letter he|𐤅 phoenician letter wau|𐤆 phoenician letter zai|𐤇 phoenician letter het|𐤈 phoenician letter tet|𐤉 phoenician letter yod|𐤊 phoenician letter kaf|𐤋 phoenician letter lamd|𐤌 phoenician letter mem|𐤍 phoenician letter nun|𐤎 phoenician letter semk|𐤏 phoenician letter ain|𐤐 phoenician letter pe|𐤑 phoenician letter sade|𐤒 phoenician letter qof|𐤓 phoenician letter rosh|𐤔 phoenician letter shin|𐤕 phoenician letter tau|𐤖 phoenician number one|𐤗 phoenician number ten|𐤘 phoenician number twenty|𐤙 phoenician number one hundred|𐤚 phoenician number two|𐤛 phoenician number three|𐤟 phoenician word separator"},{name:"Hieroglyphs: Men",picks:"𓀀 men hieroglyph A001|𓀁 men hieroglyph A002|𓀂 men hieroglyph A003|𓀃 men hieroglyph A004|𓀄 men hieroglyph A005|𓀅 men hieroglyph A005A|𓀆 men hieroglyph A006|𓀇 men hieroglyph A006A|𓀈 men hieroglyph A006B|𓀉 men hieroglyph A007|𓀊 men hieroglyph A008|𓀋 men hieroglyph A009|𓀌 men hieroglyph A010|𓀍 men hieroglyph A011|𓀎 men hieroglyph A012|𓀏 men hieroglyph A013|𓀐 men hieroglyph A014|𓀑 men hieroglyph A014A|𓀒 men hieroglyph A015|𓀓 men hieroglyph A016|𓀔 men hieroglyph A017|𓀕 men hieroglyph A017A|𓀖 men hieroglyph A018|𓀗 men hieroglyph A019|𓀘 men hieroglyph A020|𓀙 men hieroglyph A021|𓀚 men hieroglyph A022|𓀛 men hieroglyph A023|𓀜 men hieroglyph A024|𓀝 men hieroglyph A025|𓀞 men hieroglyph A026|𓀟 men hieroglyph A027|𓀠 men hieroglyph A028|𓀡 men hieroglyph A029|𓀢 men hieroglyph A030|𓀣 men hieroglyph A031|𓀤 men hieroglyph A032|𓀥 men hieroglyph A032A|𓀦 men hieroglyph A033|𓀧 men hieroglyph A034|𓀨 men hieroglyph A035|𓀩 men hieroglyph A036|𓀪 men hieroglyph A037|𓀫 men hieroglyph A038|𓀬 men hieroglyph A039|𓀭 men hieroglyph A040|𓀮 men hieroglyph A040A|𓀯 men hieroglyph A041|𓀰 men hieroglyph A042|𓀱 men hieroglyph A042A|𓀲 men hieroglyph A043|𓀳 men hieroglyph A043A|𓀴 men hieroglyph A044|𓀵 men hieroglyph A045|𓀶 men hieroglyph A045A|𓀷 men hieroglyph A046|𓀸 men hieroglyph A047|𓀹 men hieroglyph A048|𓀺 men hieroglyph A049|𓀻 men hieroglyph A050|𓀼 men hieroglyph A051|𓀽 men hieroglyph A052|𓀾 men hieroglyph A053|𓀿 men hieroglyph A054|𓁀 men hieroglyph A055|𓁁 men hieroglyph A056|𓁂 men hieroglyph A057|𓁃 men hieroglyph A058|𓁄 men hieroglyph A059|𓁅 men hieroglyph A060|𓁆 men hieroglyph A061|𓁇 men hieroglyph A062|𓁈 men hieroglyph A063|𓁉 men hieroglyph A064|𓁊 men hieroglyph A065|𓁋 men hieroglyph A066|𓁌 men hieroglyph A067|𓁍 men hieroglyph A068|𓁎 men hieroglyph A069|𓁏 men hieroglyph A070"},{name:"Hieroglyphs: Women",picks:"𓁐 women hieroglyph B001|𓁑 women hieroglyph B002|𓁒 women hieroglyph B003|𓁓 women hieroglyph B004|𓁔 women hieroglyph B005|𓁕 women hieroglyph B005A|𓁖 women hieroglyph B006|𓁗 women hieroglyph B007|𓁘 women hieroglyph B008|𓁙 women hieroglyph B009"},{name:"Hieroglyphs: Deities",picks:"𓁚 deities hieroglyph C001|𓁛 deities hieroglyph C002|𓁜 deities hieroglyph C002A|𓁝 deities hieroglyph C002B|𓁞 deities hieroglyph C002C|𓁟 deities hieroglyph C003|𓁠 deities hieroglyph C004|𓁡 deities hieroglyph C005|𓁢 deities hieroglyph C006|𓁣 deities hieroglyph C007|𓁤 deities hieroglyph C008|𓁥 deities hieroglyph C009|𓁦 deities hieroglyph C010|𓁧 deities hieroglyph C010A|𓁨 deities hieroglyph C011|𓁩 deities hieroglyph C012|𓁪 deities hieroglyph C013|𓁫 deities hieroglyph C014|𓁬 deities hieroglyph C015|𓁭 deities hieroglyph C016|𓁮 deities hieroglyph C017|𓁯 deities hieroglyph C018|𓁰 deities hieroglyph C019|𓁱 deities hieroglyph C020|𓁲 deities hieroglyph C021|𓁳 deities hieroglyph C022|𓁴 deities hieroglyph C023|𓁵 deities hieroglyph C024"},{name:"Hieroglyphs: Parts of the body",picks:"𓁶 parts of the body hieroglyph D001|𓁷 parts of the body hieroglyph D002|𓁸 parts of the body hieroglyph D003|𓁹 parts of the body hieroglyph D004|𓁺 parts of the body hieroglyph D005|𓁻 parts of the body hieroglyph D006|𓁼 parts of the body hieroglyph D007|𓁽 parts of the body hieroglyph D008|𓁾 parts of the body hieroglyph D008A|𓁿 parts of the body hieroglyph D009|𓂀 parts of the body hieroglyph D010|𓂁 parts of the body hieroglyph D011|𓂂 parts of the body hieroglyph D012|𓂃 parts of the body hieroglyph D013|𓂄 parts of the body hieroglyph D014|𓂅 parts of the body hieroglyph D015|𓂆 parts of the body hieroglyph D016|𓂇 parts of the body hieroglyph D017|𓂈 parts of the body hieroglyph D018|𓂉 parts of the body hieroglyph D019|𓂊 parts of the body hieroglyph D020|𓂋 parts of the body hieroglyph D021|𓂌 parts of the body hieroglyph D022|𓂍 parts of the body hieroglyph D023|𓂎 parts of the body hieroglyph D024|𓂏 parts of the body hieroglyph D025|𓂐 parts of the body hieroglyph D026|𓂑 parts of the body hieroglyph D027|𓂒 parts of the body hieroglyph D027A|𓂓 parts of the body hieroglyph D028|𓂔 parts of the body hieroglyph D029|𓂕 parts of the body hieroglyph D030|𓂖 parts of the body hieroglyph D031|𓂗 parts of the body hieroglyph D031A|𓂘 parts of the body hieroglyph D032|𓂙 parts of the body hieroglyph D033|𓂚 parts of the body hieroglyph D034|𓂛 parts of the body hieroglyph D034A|𓂜 parts of the body hieroglyph D035|𓂝 parts of the body hieroglyph D036|𓂞 parts of the body hieroglyph D037|𓂟 parts of the body hieroglyph D038|𓂠 parts of the body hieroglyph D039|𓂡 parts of the body hieroglyph D040|𓂢 parts of the body hieroglyph D041|𓂣 parts of the body hieroglyph D042|𓂤 parts of the body hieroglyph D043|𓂥 parts of the body hieroglyph D044|𓂦 parts of the body hieroglyph D045|𓂧 parts of the body hieroglyph D046|𓂨 parts of the body hieroglyph D046A|𓂩 parts of the body hieroglyph D047|𓂪 parts of the body hieroglyph D048|𓂫 parts of the body hieroglyph D048A|𓂬 parts of the body hieroglyph D049|𓂭 parts of the body hieroglyph D050|𓂮 parts of the body hieroglyph D050A|𓂯 parts of the body hieroglyph D050B|𓂰 parts of the body hieroglyph D050C|𓂱 parts of the body hieroglyph D050D|𓂲 parts of the body hieroglyph D050E|𓂳 parts of the body hieroglyph D050F|𓂴 parts of the body hieroglyph D050G|𓂵 parts of the body hieroglyph D050H|𓂶 parts of the body hieroglyph D050I|𓂷 parts of the body hieroglyph D051|𓂸 parts of the body hieroglyph D052|𓂹 parts of the body hieroglyph D052A|𓂺 parts of the body hieroglyph D053|𓂻 parts of the body hieroglyph D054|𓂼 parts of the body hieroglyph D054A|𓂽 parts of the body hieroglyph D055|𓂾 parts of the body hieroglyph D056|𓂿 parts of the body hieroglyph D057|𓃀 parts of the body hieroglyph D058|𓃁 parts of the body hieroglyph D059|𓃂 parts of the body hieroglyph D060|𓃃 parts of the body hieroglyph D061|𓃄 parts of the body hieroglyph D062|𓃅 parts of the body hieroglyph D063|𓃆 parts of the body hieroglyph D064|𓃇 parts of the body hieroglyph D065|𓃈 parts of the body hieroglyph D066|𓃉 parts of the body hieroglyph D067|𓃊 parts of the body hieroglyph D067A|𓃋 parts of the body hieroglyph D067B|𓃌 parts of the body hieroglyph D067C|𓃍 parts of the body hieroglyph D067D|𓃎 parts of the body hieroglyph D067E|𓃏 parts of the body hieroglyph D067F|𓃐 parts of the body hieroglyph D067G|𓃑 parts of the body hieroglyph D067H"},{name:"Hieroglyphs: Mammals",picks:"𓃒 mammals hieroglyph E001|𓃓 mammals hieroglyph E002|𓃔 mammals hieroglyph E003|𓃕 mammals hieroglyph E004|𓃖 mammals hieroglyph E005|𓃗 mammals hieroglyph E006|𓃘 mammals hieroglyph E007|𓃙 mammals hieroglyph E008|𓃚 mammals hieroglyph E008A|𓃛 mammals hieroglyph E009|𓃜 mammals hieroglyph E009A|𓃝 mammals hieroglyph E010|𓃞 mammals hieroglyph E011|𓃟 mammals hieroglyph E012|𓃠 mammals hieroglyph E013|𓃡 mammals hieroglyph E014|𓃢 mammals hieroglyph E015|𓃣 mammals hieroglyph E016|𓃤 mammals hieroglyph E016A|𓃥 mammals hieroglyph E017|𓃦 mammals hieroglyph E017A|𓃧 mammals hieroglyph E018|𓃨 mammals hieroglyph E019|𓃩 mammals hieroglyph E020|𓃪 mammals hieroglyph E020A|𓃫 mammals hieroglyph E021|𓃬 mammals hieroglyph E022|𓃭 mammals hieroglyph E023|𓃮 mammals hieroglyph E024|𓃯 mammals hieroglyph E025|𓃰 mammals hieroglyph E026|𓃱 mammals hieroglyph E027|𓃲 mammals hieroglyph E028|𓃳 mammals hieroglyph E028A|𓃴 mammals hieroglyph E029|𓃵 mammals hieroglyph E030|𓃶 mammals hieroglyph E031|𓃷 mammals hieroglyph E032|𓃸 mammals hieroglyph E033|𓃹 mammals hieroglyph E034|𓃺 mammals hieroglyph E034A|𓃻 mammals hieroglyph E036|𓃼 mammals hieroglyph E037|𓃽 mammals hieroglyph E038"},{name:"Hieroglyphs: Parts of mammals",picks:"𓃾 parts of mammals hieroglyph F001|𓃿 parts of mammals hieroglyph F001A|𓄀 parts of mammals hieroglyph F002|𓄁 parts of mammals hieroglyph F003|𓄂 parts of mammals hieroglyph F004|𓄃 parts of mammals hieroglyph F005|𓄄 parts of mammals hieroglyph F006|𓄅 parts of mammals hieroglyph F007|𓄆 parts of mammals hieroglyph F008|𓄇 parts of mammals hieroglyph F009|𓄈 parts of mammals hieroglyph F010|𓄉 parts of mammals hieroglyph F011|𓄊 parts of mammals hieroglyph F012|𓄋 parts of mammals hieroglyph F013|𓄌 parts of mammals hieroglyph F013A|𓄍 parts of mammals hieroglyph F014|𓄎 parts of mammals hieroglyph F015|𓄏 parts of mammals hieroglyph F016|𓄐 parts of mammals hieroglyph F017|𓄑 parts of mammals hieroglyph F018|𓄒 parts of mammals hieroglyph F019|𓄓 parts of mammals hieroglyph F020|𓄔 parts of mammals hieroglyph F021|𓄕 parts of mammals hieroglyph F021A|𓄖 parts of mammals hieroglyph F022|𓄗 parts of mammals hieroglyph F023|𓄘 parts of mammals hieroglyph F024|𓄙 parts of mammals hieroglyph F025|𓄚 parts of mammals hieroglyph F026|𓄛 parts of mammals hieroglyph F027|𓄜 parts of mammals hieroglyph F028|𓄝 parts of mammals hieroglyph F029|𓄞 parts of mammals hieroglyph F030|𓄟 parts of mammals hieroglyph F031|𓄠 parts of mammals hieroglyph F031A|𓄡 parts of mammals hieroglyph F032|𓄢 parts of mammals hieroglyph F033|𓄣 parts of mammals hieroglyph F034|𓄤 parts of mammals hieroglyph F035|𓄥 parts of mammals hieroglyph F036|𓄦 parts of mammals hieroglyph F037|𓄧 parts of mammals hieroglyph F037A|𓄨 parts of mammals hieroglyph F038|𓄩 parts of mammals hieroglyph F038A|𓄪 parts of mammals hieroglyph F039|𓄫 parts of mammals hieroglyph F040|𓄬 parts of mammals hieroglyph F041|𓄭 parts of mammals hieroglyph F042|𓄮 parts of mammals hieroglyph F043|𓄯 parts of mammals hieroglyph F044|𓄰 parts of mammals hieroglyph F045|𓄱 parts of mammals hieroglyph F045A|𓄲 parts of mammals hieroglyph F046|𓄳 parts of mammals hieroglyph F046A|𓄴 parts of mammals hieroglyph F047|𓄵 parts of mammals hieroglyph F047A|𓄶 parts of mammals hieroglyph F048|𓄷 parts of mammals hieroglyph F049|𓄸 parts of mammals hieroglyph F050|𓄹 parts of mammals hieroglyph F051|𓄺 parts of mammals hieroglyph F051A|𓄻 parts of mammals hieroglyph F051B|𓄼 parts of mammals hieroglyph F051C|𓄽 parts of mammals hieroglyph F052|𓄾 parts of mammals hieroglyph F053"},{name:"Hieroglyphs: Birds",picks:"𓄿 birds hieroglyph G001|𓅀 birds hieroglyph G002|𓅁 birds hieroglyph G003|𓅂 birds hieroglyph G004|𓅃 birds hieroglyph G005|𓅄 birds hieroglyph G006|𓅅 birds hieroglyph G006A|𓅆 birds hieroglyph G007|𓅇 birds hieroglyph G007A|𓅈 birds hieroglyph G007B|𓅉 birds hieroglyph G008|𓅊 birds hieroglyph G009|𓅋 birds hieroglyph G010|𓅌 birds hieroglyph G011|𓅍 birds hieroglyph G011A|𓅎 birds hieroglyph G012|𓅏 birds hieroglyph G013|𓅐 birds hieroglyph G014|𓅑 birds hieroglyph G015|𓅒 birds hieroglyph G016|𓅓 birds hieroglyph G017|𓅔 birds hieroglyph G018|𓅕 birds hieroglyph G019|𓅖 birds hieroglyph G020|𓅗 birds hieroglyph G020A|𓅘 birds hieroglyph G021|𓅙 birds hieroglyph G022|𓅚 birds hieroglyph G023|𓅛 birds hieroglyph G024|𓅜 birds hieroglyph G025|𓅝 birds hieroglyph G026|𓅞 birds hieroglyph G026A|𓅟 birds hieroglyph G027|𓅠 birds hieroglyph G028|𓅡 birds hieroglyph G029|𓅢 birds hieroglyph G030|𓅣 birds hieroglyph G031|𓅤 birds hieroglyph G032|𓅥 birds hieroglyph G033|𓅦 birds hieroglyph G034|𓅧 birds hieroglyph G035|𓅨 birds hieroglyph G036|𓅩 birds hieroglyph G036A|𓅪 birds hieroglyph G037|𓅫 birds hieroglyph G037A|𓅬 birds hieroglyph G038|𓅭 birds hieroglyph G039|𓅮 birds hieroglyph G040|𓅯 birds hieroglyph G041|𓅰 birds hieroglyph G042|𓅱 birds hieroglyph G043|𓅲 birds hieroglyph G043A|𓅳 birds hieroglyph G044|𓅴 birds hieroglyph G045|𓅵 birds hieroglyph G045A|𓅶 birds hieroglyph G046|𓅷 birds hieroglyph G047|𓅸 birds hieroglyph G048|𓅹 birds hieroglyph G049|𓅺 birds hieroglyph G050|𓅻 birds hieroglyph G051|𓅼 birds hieroglyph G052|𓅽 birds hieroglyph G053|𓅾 birds hieroglyph G054"},{name:"Hieroglyphs: Parts of birds",picks:"𓅿 parts of birds hieroglyph H001|𓆀 parts of birds hieroglyph H002|𓆁 parts of birds hieroglyph H003|𓆂 parts of birds hieroglyph H004|𓆃 parts of birds hieroglyph H005|𓆄 parts of birds hieroglyph H006|𓆅 parts of birds hieroglyph H006A|𓆆 parts of birds hieroglyph H007|𓆇 parts of birds hieroglyph H008"},{name:"Hieroglyphs: Reptiles and amphibians",picks:"𓆈 reptiles and amphibians hieroglyph I001|𓆉 reptiles and amphibians hieroglyph I002|𓆊 reptiles and amphibians hieroglyph I003|𓆋 reptiles and amphibians hieroglyph I004|𓆌 reptiles and amphibians hieroglyph I005|𓆍 reptiles and amphibians hieroglyph I005A|𓆎 reptiles and amphibians hieroglyph I006|𓆏 reptiles and amphibians hieroglyph I007|𓆐 reptiles and amphibians hieroglyph I008|𓆑 reptiles and amphibians hieroglyph I009|𓆒 reptiles and amphibians hieroglyph I009A|𓆓 reptiles and amphibians hieroglyph I010|𓆔 reptiles and amphibians hieroglyph I010A|𓆕 reptiles and amphibians hieroglyph I011|𓆖 reptiles and amphibians hieroglyph I011A|𓆗 reptiles and amphibians hieroglyph I012|𓆘 reptiles and amphibians hieroglyph I013|𓆙 reptiles and amphibians hieroglyph I014|𓆚 reptiles and amphibians hieroglyph I015"},{name:"Hieroglyphs: Fish",picks:"𓆛 fish hieroglyph K001|𓆜 fish hieroglyph K002|𓆝 fish hieroglyph K003|𓆞 fish hieroglyph K004|𓆟 fish hieroglyph K005|𓆠 fish hieroglyph K006|𓆡 fish hieroglyph K007|𓆢 fish hieroglyph K008"},{name:"Hieroglyphs: Insects and small animals",picks:"𓆣 insects and small animals hieroglyph L001|𓆤 insects and small animals hieroglyph L002|𓆥 insects and small animals hieroglyph L002A|𓆦 insects and small animals hieroglyph L003|𓆧 insects and small animals hieroglyph L004|𓆨 insects and small animals hieroglyph L005|𓆩 insects and small animals hieroglyph L006|𓆪 insects and small animals hieroglyph L006A|𓆫 insects and small animals hieroglyph L007|𓆬 insects and small animals hieroglyph L008"},{name:"Hieroglyphs: Trees and plants",picks:"𓆭 trees and plants hieroglyph M001|𓆮 trees and plants hieroglyph M001A|𓆯 trees and plants hieroglyph M001B|𓆰 trees and plants hieroglyph M002|𓆱 trees and plants hieroglyph M003|𓆲 trees and plants hieroglyph M003A|𓆳 trees and plants hieroglyph M004|𓆴 trees and plants hieroglyph M005|𓆵 trees and plants hieroglyph M006|𓆶 trees and plants hieroglyph M007|𓆷 trees and plants hieroglyph M008|𓆸 trees and plants hieroglyph M009|𓆹 trees and plants hieroglyph M010|𓆺 trees and plants hieroglyph M010A|𓆻 trees and plants hieroglyph M011|𓆼 trees and plants hieroglyph M012|𓆽 trees and plants hieroglyph M012A|𓆾 trees and plants hieroglyph M012B|𓆿 trees and plants hieroglyph M012C|𓇀 trees and plants hieroglyph M012D|𓇁 trees and plants hieroglyph M012E|𓇂 trees and plants hieroglyph M012F|𓇃 trees and plants hieroglyph M012G|𓇄 trees and plants hieroglyph M012H|𓇅 trees and plants hieroglyph M013|𓇆 trees and plants hieroglyph M014|𓇇 trees and plants hieroglyph M015|𓇈 trees and plants hieroglyph M015A|𓇉 trees and plants hieroglyph M016|𓇊 trees and plants hieroglyph M016A|𓇋 trees and plants hieroglyph M017|𓇌 trees and plants hieroglyph M017A|𓇍 trees and plants hieroglyph M018|𓇎 trees and plants hieroglyph M019|𓇏 trees and plants hieroglyph M020|𓇐 trees and plants hieroglyph M021|𓇑 trees and plants hieroglyph M022|𓇒 trees and plants hieroglyph M022A|𓇓 trees and plants hieroglyph M023|𓇔 trees and plants hieroglyph M024|𓇕 trees and plants hieroglyph M024A|𓇖 trees and plants hieroglyph M025|𓇗 trees and plants hieroglyph M026|𓇘 trees and plants hieroglyph M027|𓇙 trees and plants hieroglyph M028|𓇚 trees and plants hieroglyph M028A|𓇛 trees and plants hieroglyph M029|𓇜 trees and plants hieroglyph M030|𓇝 trees and plants hieroglyph M031|𓇞 trees and plants hieroglyph M031A|𓇟 trees and plants hieroglyph M032|𓇠 trees and plants hieroglyph M033|𓇡 trees and plants hieroglyph M033A|𓇢 trees and plants hieroglyph M033B|𓇣 trees and plants hieroglyph M034|𓇤 trees and plants hieroglyph M035|𓇥 trees and plants hieroglyph M036|𓇦 trees and plants hieroglyph M037|𓇧 trees and plants hieroglyph M038|𓇨 trees and plants hieroglyph M039|𓇩 trees and plants hieroglyph M040|𓇪 trees and plants hieroglyph M040A|𓇫 trees and plants hieroglyph M041|𓇬 trees and plants hieroglyph M042|𓇭 trees and plants hieroglyph M043|𓇮 trees and plants hieroglyph M044"},{name:"Hieroglyphs: Sky, earth and water",picks:"𓇯 sky, earth and water hieroglyph N001|𓇰 sky, earth and water hieroglyph N002|𓇱 sky, earth and water hieroglyph N003|𓇲 sky, earth and water hieroglyph N004|𓇳 sky, earth and water hieroglyph N005|𓇴 sky, earth and water hieroglyph N006|𓇵 sky, earth and water hieroglyph N007|𓇶 sky, earth and water hieroglyph N008|𓇷 sky, earth and water hieroglyph N009|𓇸 sky, earth and water hieroglyph N010|𓇹 sky, earth and water hieroglyph N011|𓇺 sky, earth and water hieroglyph N012|𓇻 sky, earth and water hieroglyph N013|𓇼 sky, earth and water hieroglyph N014|𓇽 sky, earth and water hieroglyph N015|𓇾 sky, earth and water hieroglyph N016|𓇿 sky, earth and water hieroglyph N017|𓈀 sky, earth and water hieroglyph N018|𓈁 sky, earth and water hieroglyph N018A|𓈂 sky, earth and water hieroglyph N018B|𓈃 sky, earth and water hieroglyph N019|𓈄 sky, earth and water hieroglyph N020|𓈅 sky, earth and water hieroglyph N021|𓈆 sky, earth and water hieroglyph N022|𓈇 sky, earth and water hieroglyph N023|𓈈 sky, earth and water hieroglyph N024|𓈉 sky, earth and water hieroglyph N025|𓈊 sky, earth and water hieroglyph N025A|𓈋 sky, earth and water hieroglyph N026|𓈌 sky, earth and water hieroglyph N027|𓈍 sky, earth and water hieroglyph N028|𓈎 sky, earth and water hieroglyph N029|𓈏 sky, earth and water hieroglyph N030|𓈐 sky, earth and water hieroglyph N031|𓈑 sky, earth and water hieroglyph N032|𓈒 sky, earth and water hieroglyph N033|𓈓 sky, earth and water hieroglyph N033A|𓈔 sky, earth and water hieroglyph N034|𓈕 sky, earth and water hieroglyph N034A|𓈖 sky, earth and water hieroglyph N035|𓈗 sky, earth and water hieroglyph N035A|𓈘 sky, earth and water hieroglyph N036|𓈙 sky, earth and water hieroglyph N037|𓈚 sky, earth and water hieroglyph N037A|𓈛 sky, earth and water hieroglyph N038|𓈜 sky, earth and water hieroglyph N039|𓈝 sky, earth and water hieroglyph N040|𓈞 sky, earth and water hieroglyph N041|𓈟 sky, earth and water hieroglyph N042"},{name:"Hieroglyphs: Lower Egypt nomes",picks:"𓈠 lower egypt nomes hieroglyph NL001|𓈡 lower egypt nomes hieroglyph NL002|𓈢 lower egypt nomes hieroglyph NL003|𓈣 lower egypt nomes hieroglyph NL004|𓈤 lower egypt nomes hieroglyph NL005|𓈥 lower egypt nomes hieroglyph NL005A|𓈦 lower egypt nomes hieroglyph NL006|𓈧 lower egypt nomes hieroglyph NL007|𓈨 lower egypt nomes hieroglyph NL008|𓈩 lower egypt nomes hieroglyph NL009|𓈪 lower egypt nomes hieroglyph NL010|𓈫 lower egypt nomes hieroglyph NL011|𓈬 lower egypt nomes hieroglyph NL012|𓈭 lower egypt nomes hieroglyph NL013|𓈮 lower egypt nomes hieroglyph NL014|𓈯 lower egypt nomes hieroglyph NL015|𓈰 lower egypt nomes hieroglyph NL016|𓈱 lower egypt nomes hieroglyph NL017|𓈲 lower egypt nomes hieroglyph NL017A|𓈳 lower egypt nomes hieroglyph NL018|𓈴 lower egypt nomes hieroglyph NL019|𓈵 lower egypt nomes hieroglyph NL020"},{name:"Hieroglyphs: Upper Egypt nomes",picks:"𓈶 upper egypt nomes hieroglyph NU001|𓈷 upper egypt nomes hieroglyph NU002|𓈸 upper egypt nomes hieroglyph NU003|𓈹 upper egypt nomes hieroglyph NU004|𓈺 upper egypt nomes hieroglyph NU005|𓈻 upper egypt nomes hieroglyph NU006|𓈼 upper egypt nomes hieroglyph NU007|𓈽 upper egypt nomes hieroglyph NU008|𓈾 upper egypt nomes hieroglyph NU009|𓈿 upper egypt nomes hieroglyph NU010|𓉀 upper egypt nomes hieroglyph NU010A|𓉁 upper egypt nomes hieroglyph NU011|𓉂 upper egypt nomes hieroglyph NU011A|𓉃 upper egypt nomes hieroglyph NU012|𓉄 upper egypt nomes hieroglyph NU013|𓉅 upper egypt nomes hieroglyph NU014|𓉆 upper egypt nomes hieroglyph NU015|𓉇 upper egypt nomes hieroglyph NU016|𓉈 upper egypt nomes hieroglyph NU017|𓉉 upper egypt nomes hieroglyph NU018|𓉊 upper egypt nomes hieroglyph NU018A|𓉋 upper egypt nomes hieroglyph NU019|𓉌 upper egypt nomes hieroglyph NU020|𓉍 upper egypt nomes hieroglyph NU021|𓉎 upper egypt nomes hieroglyph NU022|𓉏 upper egypt nomes hieroglyph NU022A"},{name:"Hieroglyphs: Buildings",picks:"𓉐 buildings hieroglyph O001|𓉑 buildings hieroglyph O001A|𓉒 buildings hieroglyph O002|𓉓 buildings hieroglyph O003|𓉔 buildings hieroglyph O004|𓉕 buildings hieroglyph O005|𓉖 buildings hieroglyph O005A|𓉗 buildings hieroglyph O006|𓉘 buildings hieroglyph O006A|𓉙 buildings hieroglyph O006B|𓉚 buildings hieroglyph O006C|𓉛 buildings hieroglyph O006D|𓉜 buildings hieroglyph O006E|𓉝 buildings hieroglyph O006F|𓉞 buildings hieroglyph O007|𓉟 buildings hieroglyph O008|𓉠 buildings hieroglyph O009|𓉡 buildings hieroglyph O010|𓉢 buildings hieroglyph O010A|𓉣 buildings hieroglyph O010B|𓉤 buildings hieroglyph O010C|𓉥 buildings hieroglyph O011|𓉦 buildings hieroglyph O012|𓉧 buildings hieroglyph O013|𓉨 buildings hieroglyph O014|𓉩 buildings hieroglyph O015|𓉪 buildings hieroglyph O016|𓉫 buildings hieroglyph O017|𓉬 buildings hieroglyph O018|𓉭 buildings hieroglyph O019|𓉮 buildings hieroglyph O019A|𓉯 buildings hieroglyph O020|𓉰 buildings hieroglyph O020A|𓉱 buildings hieroglyph O021|𓉲 buildings hieroglyph O022|𓉳 buildings hieroglyph O023|𓉴 buildings hieroglyph O024|𓉵 buildings hieroglyph O024A|𓉶 buildings hieroglyph O025|𓉷 buildings hieroglyph O025A|𓉸 buildings hieroglyph O026|𓉹 buildings hieroglyph O027|𓉺 buildings hieroglyph O028|𓉻 buildings hieroglyph O029|𓉼 buildings hieroglyph O029A|𓉽 buildings hieroglyph O030|𓉾 buildings hieroglyph O030A|𓉿 buildings hieroglyph O031|𓊀 buildings hieroglyph O032|𓊁 buildings hieroglyph O033|𓊂 buildings hieroglyph O033A|𓊃 buildings hieroglyph O034|𓊄 buildings hieroglyph O035|𓊅 buildings hieroglyph O036|𓊆 buildings hieroglyph O036A|𓊇 buildings hieroglyph O036B|𓊈 buildings hieroglyph O036C|𓊉 buildings hieroglyph O036D|𓊊 buildings hieroglyph O037|𓊋 buildings hieroglyph O038|𓊌 buildings hieroglyph O039|𓊍 buildings hieroglyph O040|𓊎 buildings hieroglyph O041|𓊏 buildings hieroglyph O042|𓊐 buildings hieroglyph O043|𓊑 buildings hieroglyph O044|𓊒 buildings hieroglyph O045|𓊓 buildings hieroglyph O046|𓊔 buildings hieroglyph O047|𓊕 buildings hieroglyph O048|𓊖 buildings hieroglyph O049|𓊗 buildings hieroglyph O050|𓊘 buildings hieroglyph O050A|𓊙 buildings hieroglyph O050B|𓊚 buildings hieroglyph O051"},{name:"Hieroglyphs: Ships",picks:"𓊛 ships hieroglyph P001|𓊜 ships hieroglyph P001A|𓊝 ships hieroglyph P002|𓊞 ships hieroglyph P003|𓊟 ships hieroglyph P003A|𓊠 ships hieroglyph P004|𓊡 ships hieroglyph P005|𓊢 ships hieroglyph P006|𓊣 ships hieroglyph P007|𓊤 ships hieroglyph P008|𓊥 ships hieroglyph P009|𓊦 ships hieroglyph P010|𓊧 ships hieroglyph P011"},{name:"Hieroglyphs: Furniture",picks:"𓊨 furniture hieroglyph Q001|𓊩 furniture hieroglyph Q002|𓊪 furniture hieroglyph Q003|𓊫 furniture hieroglyph Q004|𓊬 furniture hieroglyph Q005|𓊭 furniture hieroglyph Q006|𓊮 furniture hieroglyph Q007"},{name:"Hieroglyphs: Temple things",picks:"𓊯 temple things hieroglyph R001|𓊰 temple things hieroglyph R002|𓊱 temple things hieroglyph R002A|𓊲 temple things hieroglyph R003|𓊳 temple things hieroglyph R003A|𓊴 temple things hieroglyph R003B|𓊵 temple things hieroglyph R004|𓊶 temple things hieroglyph R005|𓊷 temple things hieroglyph R006|𓊸 temple things hieroglyph R007|𓊹 temple things hieroglyph R008|𓊺 temple things hieroglyph R009|𓊻 temple things hieroglyph R010|𓊼 temple things hieroglyph R010A|𓊽 temple things hieroglyph R011|𓊾 temple things hieroglyph R012|𓊿 temple things hieroglyph R013|𓋀 temple things hieroglyph R014|𓋁 temple things hieroglyph R015|𓋂 temple things hieroglyph R016|𓋃 temple things hieroglyph R016A|𓋄 temple things hieroglyph R017|𓋅 temple things hieroglyph R018|𓋆 temple things hieroglyph R019|𓋇 temple things hieroglyph R020|𓋈 temple things hieroglyph R021|𓋉 temple things hieroglyph R022|𓋊 temple things hieroglyph R023|𓋋 temple things hieroglyph R024|𓋌 temple things hieroglyph R025|𓋍 temple things hieroglyph R026|𓋎 temple things hieroglyph R027|𓋏 temple things hieroglyph R028|𓋐 temple things hieroglyph R029"},{name:"Hieroglyphs: Crowns and clothing",picks:"𓋑 crowns and clothing hieroglyph S001|𓋒 crowns and clothing hieroglyph S002|𓋓 crowns and clothing hieroglyph S002A|𓋔 crowns and clothing hieroglyph S003|𓋕 crowns and clothing hieroglyph S004|𓋖 crowns and clothing hieroglyph S005|𓋗 crowns and clothing hieroglyph S006|𓋘 crowns and clothing hieroglyph S006A|𓋙 crowns and clothing hieroglyph S007|𓋚 crowns and clothing hieroglyph S008|𓋛 crowns and clothing hieroglyph S009|𓋜 crowns and clothing hieroglyph S010|𓋝 crowns and clothing hieroglyph S011|𓋞 crowns and clothing hieroglyph S012|𓋟 crowns and clothing hieroglyph S013|𓋠 crowns and clothing hieroglyph S014|𓋡 crowns and clothing hieroglyph S014A|𓋢 crowns and clothing hieroglyph S014B|𓋣 crowns and clothing hieroglyph S015|𓋤 crowns and clothing hieroglyph S016|𓋥 crowns and clothing hieroglyph S017|𓋦 crowns and clothing hieroglyph S017A|𓋧 crowns and clothing hieroglyph S018|𓋨 crowns and clothing hieroglyph S019|𓋩 crowns and clothing hieroglyph S020|𓋪 crowns and clothing hieroglyph S021|𓋫 crowns and clothing hieroglyph S022|𓋬 crowns and clothing hieroglyph S023|𓋭 crowns and clothing hieroglyph S024|𓋮 crowns and clothing hieroglyph S025|𓋯 crowns and clothing hieroglyph S026|𓋰 crowns and clothing hieroglyph S026A|𓋱 crowns and clothing hieroglyph S026B|𓋲 crowns and clothing hieroglyph S027|𓋳 crowns and clothing hieroglyph S028|𓋴 crowns and clothing hieroglyph S029|𓋵 crowns and clothing hieroglyph S030|𓋶 crowns and clothing hieroglyph S031|𓋷 crowns and clothing hieroglyph S032|𓋸 crowns and clothing hieroglyph S033|𓋹 crowns and clothing hieroglyph S034|𓋺 crowns and clothing hieroglyph S035|𓋻 crowns and clothing hieroglyph S035A|𓋼 crowns and clothing hieroglyph S036|𓋽 crowns and clothing hieroglyph S037|𓋾 crowns and clothing hieroglyph S038|𓋿 crowns and clothing hieroglyph S039|𓌀 crowns and clothing hieroglyph S040|𓌁 crowns and clothing hieroglyph S041|𓌂 crowns and clothing hieroglyph S042|𓌃 crowns and clothing hieroglyph S043|𓌄 crowns and clothing hieroglyph S044|𓌅 crowns and clothing hieroglyph S045|𓌆 crowns and clothing hieroglyph S046"},{name:"Hieroglyphs: Weapons and tools",picks:"𓌇 weapons and tools hieroglyph T001|𓌈 weapons and tools hieroglyph T002|𓌉 weapons and tools hieroglyph T003|𓌊 weapons and tools hieroglyph T003A|𓌋 weapons and tools hieroglyph T004|𓌌 weapons and tools hieroglyph T005|𓌍 weapons and tools hieroglyph T006|𓌎 weapons and tools hieroglyph T007|𓌏 weapons and tools hieroglyph T007A|𓌐 weapons and tools hieroglyph T008|𓌑 weapons and tools hieroglyph T008A|𓌒 weapons and tools hieroglyph T009|𓌓 weapons and tools hieroglyph T009A|𓌔 weapons and tools hieroglyph T010|𓌕 weapons and tools hieroglyph T011|𓌖 weapons and tools hieroglyph T011A|𓌗 weapons and tools hieroglyph T012|𓌘 weapons and tools hieroglyph T013|𓌙 weapons and tools hieroglyph T014|𓌚 weapons and tools hieroglyph T015|𓌛 weapons and tools hieroglyph T016|𓌜 weapons and tools hieroglyph T016A|𓌝 weapons and tools hieroglyph T017|𓌞 weapons and tools hieroglyph T018|𓌟 weapons and tools hieroglyph T019|𓌠 weapons and tools hieroglyph T020|𓌡 weapons and tools hieroglyph T021|𓌢 weapons and tools hieroglyph T022|𓌣 weapons and tools hieroglyph T023|𓌤 weapons and tools hieroglyph T024|𓌥 weapons and tools hieroglyph T025|𓌦 weapons and tools hieroglyph T026|𓌧 weapons and tools hieroglyph T027|𓌨 weapons and tools hieroglyph T028|𓌩 weapons and tools hieroglyph T029|𓌪 weapons and tools hieroglyph T030|𓌫 weapons and tools hieroglyph T031|𓌬 weapons and tools hieroglyph T032|𓌭 weapons and tools hieroglyph T032A|𓌮 weapons and tools hieroglyph T033|𓌯 weapons and tools hieroglyph T033A|𓌰 weapons and tools hieroglyph T034|𓌱 weapons and tools hieroglyph T035|𓌲 weapons and tools hieroglyph T036"},{name:"Hieroglyphs: Farming and crafts",picks:"𓌳 farming and crafts hieroglyph U001|𓌴 farming and crafts hieroglyph U002|𓌵 farming and crafts hieroglyph U003|𓌶 farming and crafts hieroglyph U004|𓌷 farming and crafts hieroglyph U005|𓌸 farming and crafts hieroglyph U006|𓌹 farming and crafts hieroglyph U006A|𓌺 farming and crafts hieroglyph U006B|𓌻 farming and crafts hieroglyph U007|𓌼 farming and crafts hieroglyph U008|𓌽 farming and crafts hieroglyph U009|𓌾 farming and crafts hieroglyph U010|𓌿 farming and crafts hieroglyph U011|𓍀 farming and crafts hieroglyph U012|𓍁 farming and crafts hieroglyph U013|𓍂 farming and crafts hieroglyph U014|𓍃 farming and crafts hieroglyph U015|𓍄 farming and crafts hieroglyph U016|𓍅 farming and crafts hieroglyph U017|𓍆 farming and crafts hieroglyph U018|𓍇 farming and crafts hieroglyph U019|𓍈 farming and crafts hieroglyph U020|𓍉 farming and crafts hieroglyph U021|𓍊 farming and crafts hieroglyph U022|𓍋 farming and crafts hieroglyph U023|𓍌 farming and crafts hieroglyph U023A|𓍍 farming and crafts hieroglyph U024|𓍎 farming and crafts hieroglyph U025|𓍏 farming and crafts hieroglyph U026|𓍐 farming and crafts hieroglyph U027|𓍑 farming and crafts hieroglyph U028|𓍒 farming and crafts hieroglyph U029|𓍓 farming and crafts hieroglyph U029A|𓍔 farming and crafts hieroglyph U030|𓍕 farming and crafts hieroglyph U031|𓍖 farming and crafts hieroglyph U032|𓍗 farming and crafts hieroglyph U032A|𓍘 farming and crafts hieroglyph U033|𓍙 farming and crafts hieroglyph U034|𓍚 farming and crafts hieroglyph U035|𓍛 farming and crafts hieroglyph U036|𓍜 farming and crafts hieroglyph U037|𓍝 farming and crafts hieroglyph U038|𓍞 farming and crafts hieroglyph U039|𓍟 farming and crafts hieroglyph U040|𓍠 farming and crafts hieroglyph U041|𓍡 farming and crafts hieroglyph U042"},{name:"Hieroglyphs: Rope and baskets",picks:"𓍢 rope and baskets hieroglyph V001|𓍣 rope and baskets hieroglyph V001A|𓍤 rope and baskets hieroglyph V001B|𓍥 rope and baskets hieroglyph V001C|𓍦 rope and baskets hieroglyph V001D|𓍧 rope and baskets hieroglyph V001E|𓍨 rope and baskets hieroglyph V001F|𓍩 rope and baskets hieroglyph V001G|𓍪 rope and baskets hieroglyph V001H|𓍫 rope and baskets hieroglyph V001I|𓍬 rope and baskets hieroglyph V002|𓍭 rope and baskets hieroglyph V002A|𓍮 rope and baskets hieroglyph V003|𓍯 rope and baskets hieroglyph V004|𓍰 rope and baskets hieroglyph V005|𓍱 rope and baskets hieroglyph V006|𓍲 rope and baskets hieroglyph V007|𓍳 rope and baskets hieroglyph V007A|𓍴 rope and baskets hieroglyph V007B|𓍵 rope and baskets hieroglyph V008|𓍶 rope and baskets hieroglyph V009|𓍷 rope and baskets hieroglyph V010|𓍸 rope and baskets hieroglyph V011|𓍹 rope and baskets hieroglyph V011A|𓍺 rope and baskets hieroglyph V011B|𓍻 rope and baskets hieroglyph V011C|𓍼 rope and baskets hieroglyph V012|𓍽 rope and baskets hieroglyph V012A|𓍾 rope and baskets hieroglyph V012B|𓍿 rope and baskets hieroglyph V013|𓎀 rope and baskets hieroglyph V014|𓎁 rope and baskets hieroglyph V015|𓎂 rope and baskets hieroglyph V016|𓎃 rope and baskets hieroglyph V017|𓎄 rope and baskets hieroglyph V018|𓎅 rope and baskets hieroglyph V019|𓎆 rope and baskets hieroglyph V020|𓎇 rope and baskets hieroglyph V020A|𓎈 rope and baskets hieroglyph V020B|𓎉 rope and baskets hieroglyph V020C|𓎊 rope and baskets hieroglyph V020D|𓎋 rope and baskets hieroglyph V020E|𓎌 rope and baskets hieroglyph V020F|𓎍 rope and baskets hieroglyph V020G|𓎎 rope and baskets hieroglyph V020H|𓎏 rope and baskets hieroglyph V020I|𓎐 rope and baskets hieroglyph V020J|𓎑 rope and baskets hieroglyph V020K|𓎒 rope and baskets hieroglyph V020L|𓎓 rope and baskets hieroglyph V021|𓎔 rope and baskets hieroglyph V022|𓎕 rope and baskets hieroglyph V023|𓎖 rope and baskets hieroglyph V023A|𓎗 rope and baskets hieroglyph V024|𓎘 rope and baskets hieroglyph V025|𓎙 rope and baskets hieroglyph V026|𓎚 rope and baskets hieroglyph V027|𓎛 rope and baskets hieroglyph V028|𓎜 rope and baskets hieroglyph V028A|𓎝 rope and baskets hieroglyph V029|𓎞 rope and baskets hieroglyph V029A|𓎟 rope and baskets hieroglyph V030|𓎠 rope and baskets hieroglyph V030A|𓎡 rope and baskets hieroglyph V031|𓎢 rope and baskets hieroglyph V031A|𓎣 rope and baskets hieroglyph V032|𓎤 rope and baskets hieroglyph V033|𓎥 rope and baskets hieroglyph V033A|𓎦 rope and baskets hieroglyph V034|𓎧 rope and baskets hieroglyph V035|𓎨 rope and baskets hieroglyph V036|𓎩 rope and baskets hieroglyph V037|𓎪 rope and baskets hieroglyph V037A|𓎫 rope and baskets hieroglyph V038|𓎬 rope and baskets hieroglyph V039|𓎭 rope and baskets hieroglyph V040|𓎮 rope and baskets hieroglyph V040A|𓐯 rope and baskets hieroglyph V011D"},{name:"Hieroglyphs: Vessels",picks:"𓎯 vessels hieroglyph W001|𓎰 vessels hieroglyph W002|𓎱 vessels hieroglyph W003|𓎲 vessels hieroglyph W003A|𓎳 vessels hieroglyph W004|𓎴 vessels hieroglyph W005|𓎵 vessels hieroglyph W006|𓎶 vessels hieroglyph W007|𓎷 vessels hieroglyph W008|𓎸 vessels hieroglyph W009|𓎹 vessels hieroglyph W009A|𓎺 vessels hieroglyph W010|𓎻 vessels hieroglyph W010A|𓎼 vessels hieroglyph W011|𓎽 vessels hieroglyph W012|𓎾 vessels hieroglyph W013|𓎿 vessels hieroglyph W014|𓏀 vessels hieroglyph W014A|𓏁 vessels hieroglyph W015|𓏂 vessels hieroglyph W016|𓏃 vessels hieroglyph W017|𓏄 vessels hieroglyph W017A|𓏅 vessels hieroglyph W018|𓏆 vessels hieroglyph W018A|𓏇 vessels hieroglyph W019|𓏈 vessels hieroglyph W020|𓏉 vessels hieroglyph W021|𓏊 vessels hieroglyph W022|𓏋 vessels hieroglyph W023|𓏌 vessels hieroglyph W024|𓏍 vessels hieroglyph W024A|𓏎 vessels hieroglyph W025"},{name:"Hieroglyphs: Loaves",picks:"𓏏 loaves hieroglyph X001|𓏐 loaves hieroglyph X002|𓏑 loaves hieroglyph X003|𓏒 loaves hieroglyph X004|𓏓 loaves hieroglyph X004A|𓏔 loaves hieroglyph X004B|𓏕 loaves hieroglyph X005|𓏖 loaves hieroglyph X006|𓏗 loaves hieroglyph X006A|𓏘 loaves hieroglyph X007|𓏙 loaves hieroglyph X008|𓏚 loaves hieroglyph X008A"},{name:"Hieroglyphs: Writing and music",picks:"𓏛 writing and music hieroglyph Y001|𓏜 writing and music hieroglyph Y001A|𓏝 writing and music hieroglyph Y002|𓏞 writing and music hieroglyph Y003|𓏟 writing and music hieroglyph Y004|𓏠 writing and music hieroglyph Y005|𓏡 writing and music hieroglyph Y006|𓏢 writing and music hieroglyph Y007|𓏣 writing and music hieroglyph Y008"},{name:"Hieroglyphs: Strokes and shapes",picks:"𓏤 strokes and shapes hieroglyph Z001|𓏥 strokes and shapes hieroglyph Z002|𓏦 strokes and shapes hieroglyph Z002A|𓏧 strokes and shapes hieroglyph Z002B|𓏨 strokes and shapes hieroglyph Z002C|𓏩 strokes and shapes hieroglyph Z002D|𓏪 strokes and shapes hieroglyph Z003|𓏫 strokes and shapes hieroglyph Z003A|𓏬 strokes and shapes hieroglyph Z003B|𓏭 strokes and shapes hieroglyph Z004|𓏮 strokes and shapes hieroglyph Z004A|𓏯 strokes and shapes hieroglyph Z005|𓏰 strokes and shapes hieroglyph Z005A|𓏱 strokes and shapes hieroglyph Z006|𓏲 strokes and shapes hieroglyph Z007|𓏳 strokes and shapes hieroglyph Z008|𓏴 strokes and shapes hieroglyph Z009|𓏵 strokes and shapes hieroglyph Z010|𓏶 strokes and shapes hieroglyph Z011|𓏷 strokes and shapes hieroglyph Z012|𓏸 strokes and shapes hieroglyph Z013|𓏹 strokes and shapes hieroglyph Z014|𓏺 strokes and shapes hieroglyph Z015|𓏻 strokes and shapes hieroglyph Z015A|𓏼 strokes and shapes hieroglyph Z015B|𓏽 strokes and shapes hieroglyph Z015C|𓏾 strokes and shapes hieroglyph Z015D|𓏿 strokes and shapes hieroglyph Z015E|𓐀 strokes and shapes hieroglyph Z015F|𓐁 strokes and shapes hieroglyph Z015G|𓐂 strokes and shapes hieroglyph Z015H|𓐃 strokes and shapes hieroglyph Z015I|𓐄 strokes and shapes hieroglyph Z016|𓐅 strokes and shapes hieroglyph Z016A|𓐆 strokes and shapes hieroglyph Z016B|𓐇 strokes and shapes hieroglyph Z016C|𓐈 strokes and shapes hieroglyph Z016D|𓐉 strokes and shapes hieroglyph Z016E|𓐊 strokes and shapes hieroglyph Z016F|𓐋 strokes and shapes hieroglyph Z016G|𓐌 strokes and shapes hieroglyph Z016H"},{name:"Hieroglyphs: Unclassified",picks:"𓐍 unclassified hieroglyph Aa001|𓐎 unclassified hieroglyph Aa002|𓐏 unclassified hieroglyph Aa003|𓐐 unclassified hieroglyph Aa004|𓐑 unclassified hieroglyph Aa005|𓐒 unclassified hieroglyph Aa006|𓐓 unclassified hieroglyph Aa007|𓐔 unclassified hieroglyph Aa007A|𓐕 unclassified hieroglyph Aa007B|𓐖 unclassified hieroglyph Aa008|𓐗 unclassified hieroglyph Aa009|𓐘 unclassified hieroglyph Aa010|𓐙 unclassified hieroglyph Aa011|𓐚 unclassified hieroglyph Aa012|𓐛 unclassified hieroglyph Aa013|𓐜 unclassified hieroglyph Aa014|𓐝 unclassified hieroglyph Aa015|𓐞 unclassified hieroglyph Aa016|𓐟 unclassified hieroglyph Aa017|𓐠 unclassified hieroglyph Aa018|𓐡 unclassified hieroglyph Aa019|𓐢 unclassified hieroglyph Aa020|𓐣 unclassified hieroglyph Aa021|𓐤 unclassified hieroglyph Aa022|𓐥 unclassified hieroglyph Aa023|𓐦 unclassified hieroglyph Aa024|𓐧 unclassified hieroglyph Aa025|𓐨 unclassified hieroglyph Aa026|𓐩 unclassified hieroglyph Aa027|𓐪 unclassified hieroglyph Aa028|𓐫 unclassified hieroglyph Aa029|𓐬 unclassified hieroglyph Aa030|𓐭 unclassified hieroglyph Aa031|𓐮 unclassified hieroglyph Aa032"},{name:"Musical Symbols",picks:"𝄀 musical symbol single barline|𝄁 musical symbol double barline|𝄂 musical symbol final barline|𝄃 musical symbol reverse final barline|𝄄 musical symbol dashed barline|𝄅 musical symbol short barline|𝄆 musical symbol left repeat sign|𝄇 musical symbol right repeat sign|𝄈 musical symbol repeat dots|𝄉 musical symbol dal segno|𝄊 musical symbol da capo|𝄋 musical symbol segno|𝄌 musical symbol coda|𝄍 musical symbol repeated figure-1|𝄎 musical symbol repeated figure-2|𝄏 musical symbol repeated figure-3|𝄐 musical symbol fermata|𝄑 musical symbol fermata below|𝄒 musical symbol breath mark|𝄓 musical symbol caesura|𝄔 musical symbol brace|𝄕 musical symbol bracket|𝄖 musical symbol one-line staff|𝄗 musical symbol two-line staff|𝄘 musical symbol three-line staff|𝄙 musical symbol four-line staff|𝄚 musical symbol five-line staff|𝄛 musical symbol six-line staff|𝄜 musical symbol six-string fretboard|𝄝 musical symbol four-string fretboard|𝄞 musical symbol g clef|𝄟 musical symbol g clef ottava alta|𝄠 musical symbol g clef ottava bassa|𝄡 musical symbol c clef|𝄢 musical symbol f clef|𝄣 musical symbol f clef ottava alta|𝄤 musical symbol f clef ottava bassa|𝄥 musical symbol drum clef-1|𝄦 musical symbol drum clef-2|𝄩 musical symbol multiple measure rest|𝄪 musical symbol double sharp|𝄫 musical symbol double flat|𝄬 musical symbol flat up|𝄭 musical symbol flat down|𝄮 musical symbol natural up|𝄯 musical symbol natural down|𝄰 musical symbol sharp up|𝄱 musical symbol sharp down|𝄲 musical symbol quarter tone sharp|𝄳 musical symbol quarter tone flat|𝄴 musical symbol common time|𝄵 musical symbol cut time|𝄶 musical symbol ottava alta|𝄷 musical symbol ottava bassa|𝄸 musical symbol quindicesima alta|𝄹 musical symbol quindicesima bassa|𝄺 musical symbol multi rest|𝄻 musical symbol whole rest|𝄼 musical symbol half rest|𝄽 musical symbol quarter rest|𝄾 musical symbol eighth rest|𝄿 musical symbol sixteenth rest|𝅀 musical symbol thirty-second rest|𝅁 musical symbol sixty-fourth rest|𝅂 musical symbol one hundred twenty-eighth rest|𝅃 musical symbol x notehead|𝅄 musical symbol plus notehead|𝅅 musical symbol circle x notehead|𝅆 musical symbol square notehead white|𝅇 musical symbol square notehead black|𝅈 musical symbol triangle notehead up white|𝅉 musical symbol triangle notehead up black|𝅊 musical symbol triangle notehead left white|𝅋 musical symbol triangle notehead left black|𝅌 musical symbol triangle notehead right white|𝅍 musical symbol triangle notehead right black|𝅎 musical symbol triangle notehead down white|𝅏 musical symbol triangle notehead down black|𝅐 musical symbol triangle notehead up right white|𝅑 musical symbol triangle notehead up right black|𝅒 musical symbol moon notehead white|𝅓 musical symbol moon notehead black|𝅔 musical symbol triangle-round notehead down white|𝅕 musical symbol triangle-round notehead down black|𝅖 musical symbol parenthesis notehead|𝅗 musical symbol void notehead|𝅘 musical symbol notehead black|𝅙 musical symbol null notehead|𝅚 musical symbol cluster notehead white|𝅛 musical symbol cluster notehead black|𝅜 musical symbol breve|𝅝 musical symbol whole note|𝅗𝅥 musical symbol half note|𝅘𝅥 musical symbol quarter note|𝅘𝅥𝅮 musical symbol eighth note|𝅘𝅥𝅯 musical symbol sixteenth note|𝅘𝅥𝅰 musical symbol thirty-second note|𝅘𝅥𝅱 musical symbol sixty-fourth note|𝅘𝅥𝅲 musical symbol one hundred twenty-eighth note|𝅪 musical symbol fingered tremolo-1|𝅫 musical symbol fingered tremolo-2|𝅬 musical symbol fingered tremolo-3|𝆃 musical symbol arpeggiato up|𝆄 musical symbol arpeggiato down|𝆌 musical symbol rinforzando|𝆍 musical symbol subito|𝆎 musical symbol z|𝆏 musical symbol piano|𝆐 musical symbol mezzo|𝆑 musical symbol forte|𝆒 musical symbol crescendo|𝆓 musical symbol decrescendo|𝆔 musical symbol grace note slash|𝆕 musical symbol grace note no slash|𝆖 musical symbol tr|𝆗 musical symbol turn|𝆘 musical symbol inverted turn|𝆙 musical symbol turn slash|𝆚 musical symbol turn up|𝆛 musical symbol ornament stroke-1|𝆜 musical symbol ornament stroke-2|𝆝 musical symbol ornament stroke-3|𝆞 musical symbol ornament stroke-4|𝆟 musical symbol ornament stroke-5|𝆠 musical symbol ornament stroke-6|𝆡 musical symbol ornament stroke-7|𝆢 musical symbol ornament stroke-8|𝆣 musical symbol ornament stroke-9|𝆤 musical symbol ornament stroke-10|𝆥 musical symbol ornament stroke-11|𝆦 musical symbol hauptstimme|𝆧 musical symbol nebenstimme|𝆨 musical symbol end of stimme|𝆩 musical symbol degree slash|𝆮 musical symbol pedal mark|𝆯 musical symbol pedal up mark|𝆰 musical symbol half pedal mark|𝆱 musical symbol glissando up|𝆲 musical symbol glissando down|𝆳 musical symbol with fingernails|𝆴 musical symbol damp|𝆵 musical symbol damp all|𝆶 musical symbol maxima|𝆷 musical symbol longa|𝆸 musical symbol brevis|𝆹 musical symbol semibrevis white|𝆺 musical symbol semibrevis black|𝆹𝅥 musical symbol minima|𝆺𝅥 musical symbol minima black|𝆹𝅥𝅮 musical symbol semiminima white|𝆺𝅥𝅮 musical symbol semiminima black|𝆹𝅥𝅯 musical symbol fusa white|𝆺𝅥𝅯 musical symbol fusa black|𝇁 musical symbol longa perfecta rest|𝇂 musical symbol longa imperfecta rest|𝇃 musical symbol brevis rest|𝇄 musical symbol semibrevis rest|𝇅 musical symbol minima rest|𝇆 musical symbol semiminima rest|𝇇 musical symbol tempus perfectum cum prolatione perfecta|𝇈 musical symbol tempus perfectum cum prolatione imperfecta|𝇉 musical symbol tempus perfectum cum prolatione perfecta diminution-1|𝇊 musical symbol tempus imperfectum cum prolatione perfecta|𝇋 musical symbol tempus imperfectum cum prolatione imperfecta|𝇌 musical symbol tempus imperfectum cum prolatione imperfecta diminution-1|𝇍 musical symbol tempus imperfectum cum prolatione imperfecta diminution-2|𝇎 musical symbol tempus imperfectum cum prolatione imperfecta diminution-3|𝇏 musical symbol croix|𝇐 musical symbol gregorian c clef|𝇑 musical symbol gregorian f clef|𝇒 musical symbol square b|𝇓 musical symbol virga|𝇔 musical symbol podatus|𝇕 musical symbol clivis|𝇖 musical symbol scandicus|𝇗 musical symbol climacus|𝇘 musical symbol torculus|𝇙 musical symbol porrectus|𝇚 musical symbol porrectus flexus|𝇛 musical symbol scandicus flexus|𝇜 musical symbol torculus resupinus|𝇝 musical symbol pes subpunctis|𝇞 musical symbol kievan c clef|𝇟 musical symbol kievan end of piece|𝇠 musical symbol kievan final note|𝇡 musical symbol kievan recitative mark|𝇢 musical symbol kievan whole note|𝇣 musical symbol kievan half note|𝇤 musical symbol kievan quarter note stem down|𝇥 musical symbol kievan quarter note stem up|𝇦 musical symbol kievan eighth note stem down|𝇧 musical symbol kievan eighth note stem up|𝇨 musical symbol kievan flat sign|𝇩 musical symbol sori|𝇪 musical symbol koron"},{name:"Mahjong Tiles",picks:"🀀 mahjong tile east wind|🀁 mahjong tile south wind|🀂 mahjong tile west wind|🀃 mahjong tile north wind|🀅 mahjong tile green dragon|🀆 mahjong tile white dragon|🀇 mahjong tile one of characters|🀈 mahjong tile two of characters|🀉 mahjong tile three of characters|🀊 mahjong tile four of characters|🀋 mahjong tile five of characters|🀌 mahjong tile six of characters|🀍 mahjong tile seven of characters|🀎 mahjong tile eight of characters|🀏 mahjong tile nine of characters|🀐 mahjong tile one of bamboos|🀑 mahjong tile two of bamboos|🀒 mahjong tile three of bamboos|🀓 mahjong tile four of bamboos|🀔 mahjong tile five of bamboos|🀕 mahjong tile six of bamboos|🀖 mahjong tile seven of bamboos|🀗 mahjong tile eight of bamboos|🀘 mahjong tile nine of bamboos|🀙 mahjong tile one of circles|🀚 mahjong tile two of circles|🀛 mahjong tile three of circles|🀜 mahjong tile four of circles|🀝 mahjong tile five of circles|🀞 mahjong tile six of circles|🀟 mahjong tile seven of circles|🀠 mahjong tile eight of circles|🀡 mahjong tile nine of circles|🀢 mahjong tile plum|🀣 mahjong tile orchid|🀤 mahjong tile bamboo|🀥 mahjong tile chrysanthemum|🀦 mahjong tile spring|🀧 mahjong tile summer|🀨 mahjong tile autumn|🀩 mahjong tile winter|🀪 mahjong tile joker|🀫 mahjong tile back"},{name:"Domino Tiles",picks:"🀰 domino tile horizontal back|🀱 domino tile horizontal-00-00|🀲 domino tile horizontal-00-01|🀳 domino tile horizontal-00-02|🀴 domino tile horizontal-00-03|🀵 domino tile horizontal-00-04|🀶 domino tile horizontal-00-05|🀷 domino tile horizontal-00-06|🀸 domino tile horizontal-01-00|🀹 domino tile horizontal-01-01|🀺 domino tile horizontal-01-02|🀻 domino tile horizontal-01-03|🀼 domino tile horizontal-01-04|🀽 domino tile horizontal-01-05|🀾 domino tile horizontal-01-06|🀿 domino tile horizontal-02-00|🁀 domino tile horizontal-02-01|🁁 domino tile horizontal-02-02|🁂 domino tile horizontal-02-03|🁃 domino tile horizontal-02-04|🁄 domino tile horizontal-02-05|🁅 domino tile horizontal-02-06|🁆 domino tile horizontal-03-00|🁇 domino tile horizontal-03-01|🁈 domino tile horizontal-03-02|🁉 domino tile horizontal-03-03|🁊 domino tile horizontal-03-04|🁋 domino tile horizontal-03-05|🁌 domino tile horizontal-03-06|🁍 domino tile horizontal-04-00|🁎 domino tile horizontal-04-01|🁏 domino tile horizontal-04-02|🁐 domino tile horizontal-04-03|🁑 domino tile horizontal-04-04|🁒 domino tile horizontal-04-05|🁓 domino tile horizontal-04-06|🁔 domino tile horizontal-05-00|🁕 domino tile horizontal-05-01|🁖 domino tile horizontal-05-02|🁗 domino tile horizontal-05-03|🁘 domino tile horizontal-05-04|🁙 domino tile horizontal-05-05|🁚 domino tile horizontal-05-06|🁛 domino tile horizontal-06-00|🁜 domino tile horizontal-06-01|🁝 domino tile horizontal-06-02|🁞 domino tile horizontal-06-03|🁟 domino tile horizontal-06-04|🁠 domino tile horizontal-06-05|🁡 domino tile horizontal-06-06|🁢 domino tile vertical back|🁣 domino tile vertical-00-00|🁤 domino tile vertical-00-01|🁥 domino tile vertical-00-02|🁦 domino tile vertical-00-03|🁧 domino tile vertical-00-04|🁨 domino tile vertical-00-05|🁩 domino tile vertical-00-06|🁪 domino tile vertical-01-00|🁫 domino tile vertical-01-01|🁬 domino tile vertical-01-02|🁭 domino tile vertical-01-03|🁮 domino tile vertical-01-04|🁯 domino tile vertical-01-05|🁰 domino tile vertical-01-06|🁱 domino tile vertical-02-00|🁲 domino tile vertical-02-01|🁳 domino tile vertical-02-02|🁴 domino tile vertical-02-03|🁵 domino tile vertical-02-04|🁶 domino tile vertical-02-05|🁷 domino tile vertical-02-06|🁸 domino tile vertical-03-00|🁹 domino tile vertical-03-01|🁺 domino tile vertical-03-02|🁻 domino tile vertical-03-03|🁼 domino tile vertical-03-04|🁽 domino tile vertical-03-05|🁾 domino tile vertical-03-06|🁿 domino tile vertical-04-00|🂀 domino tile vertical-04-01|🂁 domino tile vertical-04-02|🂂 domino tile vertical-04-03|🂃 domino tile vertical-04-04|🂄 domino tile vertical-04-05|🂅 domino tile vertical-04-06|🂆 domino tile vertical-05-00|🂇 domino tile vertical-05-01|🂈 domino tile vertical-05-02|🂉 domino tile vertical-05-03|🂊 domino tile vertical-05-04|🂋 domino tile vertical-05-05|🂌 domino tile vertical-05-06|🂍 domino tile vertical-06-00|🂎 domino tile vertical-06-01|🂏 domino tile vertical-06-02|🂐 domino tile vertical-06-03|🂑 domino tile vertical-06-04|🂒 domino tile vertical-06-05|🂓 domino tile vertical-06-06"},{name:"Playing Cards",picks:"🂠 playing card back|🂡 playing card ace of spades|🂢 playing card two of spades|🂣 playing card three of spades|🂤 playing card four of spades|🂥 playing card five of spades|🂦 playing card six of spades|🂧 playing card seven of spades|🂨 playing card eight of spades|🂩 playing card nine of spades|🂪 playing card ten of spades|🂫 playing card jack of spades|🂬 playing card knight of spades|🂭 playing card queen of spades|🂮 playing card king of spades|🂱 playing card ace of hearts|🂲 playing card two of hearts|🂳 playing card three of hearts|🂴 playing card four of hearts|🂵 playing card five of hearts|🂶 playing card six of hearts|🂷 playing card seven of hearts|🂸 playing card eight of hearts|🂹 playing card nine of hearts|🂺 playing card ten of hearts|🂻 playing card jack of hearts|🂼 playing card knight of hearts|🂽 playing card queen of hearts|🂾 playing card king of hearts|🂿 playing card red joker|🃁 playing card ace of diamonds|🃂 playing card two of diamonds|🃃 playing card three of diamonds|🃄 playing card four of diamonds|🃅 playing card five of diamonds|🃆 playing card six of diamonds|🃇 playing card seven of diamonds|🃈 playing card eight of diamonds|🃉 playing card nine of diamonds|🃊 playing card ten of diamonds|🃋 playing card jack of diamonds|🃌 playing card knight of diamonds|🃍 playing card queen of diamonds|🃎 playing card king of diamonds|🃑 playing card ace of clubs|🃒 playing card two of clubs|🃓 playing card three of clubs|🃔 playing card four of clubs|🃕 playing card five of clubs|🃖 playing card six of clubs|🃗 playing card seven of clubs|🃘 playing card eight of clubs|🃙 playing card nine of clubs|🃚 playing card ten of clubs|🃛 playing card jack of clubs|🃜 playing card knight of clubs|🃝 playing card queen of clubs|🃞 playing card king of clubs|🃟 playing card white joker|🃠 playing card fool|🃡 playing card trump-1|🃢 playing card trump-2|🃣 playing card trump-3|🃤 playing card trump-4|🃥 playing card trump-5|🃦 playing card trump-6|🃧 playing card trump-7|🃨 playing card trump-8|🃩 playing card trump-9|🃪 playing card trump-10|🃫 playing card trump-11|🃬 playing card trump-12|🃭 playing card trump-13|🃮 playing card trump-14|🃯 playing card trump-15|🃰 playing card trump-16|🃱 playing card trump-17|🃲 playing card trump-18|🃳 playing card trump-19|🃴 playing card trump-20|🃵 playing card trump-21"}],id=[{name:"Box Drawing",picks:"─ box drawings light horizontal|━ box drawings heavy horizontal|│ box drawings light vertical|┃ box drawings heavy vertical|┄ box drawings light triple dash horizontal|┅ box drawings heavy triple dash horizontal|┆ box drawings light triple dash vertical|┇ box drawings heavy triple dash vertical|┈ box drawings light quadruple dash horizontal|┉ box drawings heavy quadruple dash horizontal|┊ box drawings light quadruple dash vertical|┋ box drawings heavy quadruple dash vertical|┌ box drawings light down and right|┍ box drawings down light and right heavy|┎ box drawings down heavy and right light|┏ box drawings heavy down and right|┐ box drawings light down and left|┑ box drawings down light and left heavy|┒ box drawings down heavy and left light|┓ box drawings heavy down and left|└ box drawings light up and right|┕ box drawings up light and right heavy|┖ box drawings up heavy and right light|┗ box drawings heavy up and right|┘ box drawings light up and left|┙ box drawings up light and left heavy|┚ box drawings up heavy and left light|┛ box drawings heavy up and left|├ box drawings light vertical and right|┝ box drawings vertical light and right heavy|┞ box drawings up heavy and right down light|┟ box drawings down heavy and right up light|┠ box drawings vertical heavy and right light|┡ box drawings down light and right up heavy|┢ box drawings up light and right down heavy|┣ box drawings heavy vertical and right|┤ box drawings light vertical and left|┥ box drawings vertical light and left heavy|┦ box drawings up heavy and left down light|┧ box drawings down heavy and left up light|┨ box drawings vertical heavy and left light|┩ box drawings down light and left up heavy|┪ box drawings up light and left down heavy|┫ box drawings heavy vertical and left|┬ box drawings light down and horizontal|┭ box drawings left heavy and right down light|┮ box drawings right heavy and left down light|┯ box drawings down light and horizontal heavy|┰ box drawings down heavy and horizontal light|┱ box drawings right light and left down heavy|┲ box drawings left light and right down heavy|┳ box drawings heavy down and horizontal|┴ box drawings light up and horizontal|┵ box drawings left heavy and right up light|┶ box drawings right heavy and left up light|┷ box drawings up light and horizontal heavy|┸ box drawings up heavy and horizontal light|┹ box drawings right light and left up heavy|┺ box drawings left light and right up heavy|┻ box drawings heavy up and horizontal|┼ box drawings light vertical and horizontal|┽ box drawings left heavy and right vertical light|┾ box drawings right heavy and left vertical light|┿ box drawings vertical light and horizontal heavy|╀ box drawings up heavy and down horizontal light|╁ box drawings down heavy and up horizontal light|╂ box drawings vertical heavy and horizontal light|╃ box drawings left up heavy and right down light|╄ box drawings right up heavy and left down light|╅ box drawings left down heavy and right up light|╆ box drawings right down heavy and left up light|╇ box drawings down light and up horizontal heavy|╈ box drawings up light and down horizontal heavy|╉ box drawings right light and left vertical heavy|╊ box drawings left light and right vertical heavy|╋ box drawings heavy vertical and horizontal|╌ box drawings light double dash horizontal|╍ box drawings heavy double dash horizontal|╎ box drawings light double dash vertical|╏ box drawings heavy double dash vertical|═ box drawings double horizontal|║ box drawings double vertical|╒ box drawings down single and right double|╓ box drawings down double and right single|╔ box drawings double down and right|╕ box drawings down single and left double|╖ box drawings down double and left single|╗ box drawings double down and left|╘ box drawings up single and right double|╙ box drawings up double and right single|╚ box drawings double up and right|╛ box drawings up single and left double|╜ box drawings up double and left single|╝ box drawings double up and left|╞ box drawings vertical single and right double|╟ box drawings vertical double and right single|╠ box drawings double vertical and right|╡ box drawings vertical single and left double|╢ box drawings vertical double and left single|╣ box drawings double vertical and left|╤ box drawings down single and horizontal double|╥ box drawings down double and horizontal single|╦ box drawings double down and horizontal|╧ box drawings up single and horizontal double|╨ box drawings up double and horizontal single|╩ box drawings double up and horizontal|╪ box drawings vertical single and horizontal double|╫ box drawings vertical double and horizontal single|╬ box drawings double vertical and horizontal|╭ box drawings light arc down and right|╮ box drawings light arc down and left|╯ box drawings light arc up and left|╰ box drawings light arc up and right|╱ box drawings light diagonal upper right to lower left|╲ box drawings light diagonal upper left to lower right|╳ box drawings light diagonal cross|╴ box drawings light left|╵ box drawings light up|╶ box drawings light right|╷ box drawings light down|╸ box drawings heavy left|╹ box drawings heavy up|╺ box drawings heavy right|╻ box drawings heavy down|╼ box drawings light left and heavy right|╽ box drawings light up and heavy down|╾ box drawings heavy left and light right|╿ box drawings heavy up and light down"},{name:"Block Elements",picks:"▀ upper half block|▁ lower one eighth block|▂ lower one quarter block|▃ lower three eighths block|▄ lower half block|▅ lower five eighths block|▆ lower three quarters block|▇ lower seven eighths block|█ full block|▉ left seven eighths block|▊ left three quarters block|▋ left five eighths block|▌ left half block|▍ left three eighths block|▎ left one quarter block|▏ left one eighth block|▐ right half block|░ light shade|▒ medium shade|▓ dark shade|▔ upper one eighth block|▕ right one eighth block|▖ quadrant lower left|▗ quadrant lower right|▘ quadrant upper left|▙ quadrant upper left and lower left and lower right|▚ quadrant upper left and lower right|▛ quadrant upper left and upper right and lower left|▜ quadrant upper left and upper right and lower right|▝ quadrant upper right|▞ quadrant upper right and lower left|▟ quadrant upper right and lower left and lower right"},{name:"Braille Patterns",picks:"⠀ braille pattern blank|⠁ braille pattern dots-1|⠂ braille pattern dots-2|⠃ braille pattern dots-12|⠄ braille pattern dots-3|⠅ braille pattern dots-13|⠆ braille pattern dots-23|⠇ braille pattern dots-123|⠈ braille pattern dots-4|⠉ braille pattern dots-14|⠊ braille pattern dots-24|⠋ braille pattern dots-124|⠌ braille pattern dots-34|⠍ braille pattern dots-134|⠎ braille pattern dots-234|⠏ braille pattern dots-1234|⠐ braille pattern dots-5|⠑ braille pattern dots-15|⠒ braille pattern dots-25|⠓ braille pattern dots-125|⠔ braille pattern dots-35|⠕ braille pattern dots-135|⠖ braille pattern dots-235|⠗ braille pattern dots-1235|⠘ braille pattern dots-45|⠙ braille pattern dots-145|⠚ braille pattern dots-245|⠛ braille pattern dots-1245|⠜ braille pattern dots-345|⠝ braille pattern dots-1345|⠞ braille pattern dots-2345|⠟ braille pattern dots-12345|⠠ braille pattern dots-6|⠡ braille pattern dots-16|⠢ braille pattern dots-26|⠣ braille pattern dots-126|⠤ braille pattern dots-36|⠥ braille pattern dots-136|⠦ braille pattern dots-236|⠧ braille pattern dots-1236|⠨ braille pattern dots-46|⠩ braille pattern dots-146|⠪ braille pattern dots-246|⠫ braille pattern dots-1246|⠬ braille pattern dots-346|⠭ braille pattern dots-1346|⠮ braille pattern dots-2346|⠯ braille pattern dots-12346|⠰ braille pattern dots-56|⠱ braille pattern dots-156|⠲ braille pattern dots-256|⠳ braille pattern dots-1256|⠴ braille pattern dots-356|⠵ braille pattern dots-1356|⠶ braille pattern dots-2356|⠷ braille pattern dots-12356|⠸ braille pattern dots-456|⠹ braille pattern dots-1456|⠺ braille pattern dots-2456|⠻ braille pattern dots-12456|⠼ braille pattern dots-3456|⠽ braille pattern dots-13456|⠾ braille pattern dots-23456|⠿ braille pattern dots-123456|⡀ braille pattern dots-7|⡁ braille pattern dots-17|⡂ braille pattern dots-27|⡃ braille pattern dots-127|⡄ braille pattern dots-37|⡅ braille pattern dots-137|⡆ braille pattern dots-237|⡇ braille pattern dots-1237|⡈ braille pattern dots-47|⡉ braille pattern dots-147|⡊ braille pattern dots-247|⡋ braille pattern dots-1247|⡌ braille pattern dots-347|⡍ braille pattern dots-1347|⡎ braille pattern dots-2347|⡏ braille pattern dots-12347|⡐ braille pattern dots-57|⡑ braille pattern dots-157|⡒ braille pattern dots-257|⡓ braille pattern dots-1257|⡔ braille pattern dots-357|⡕ braille pattern dots-1357|⡖ braille pattern dots-2357|⡗ braille pattern dots-12357|⡘ braille pattern dots-457|⡙ braille pattern dots-1457|⡚ braille pattern dots-2457|⡛ braille pattern dots-12457|⡜ braille pattern dots-3457|⡝ braille pattern dots-13457|⡞ braille pattern dots-23457|⡟ braille pattern dots-123457|⡠ braille pattern dots-67|⡡ braille pattern dots-167|⡢ braille pattern dots-267|⡣ braille pattern dots-1267|⡤ braille pattern dots-367|⡥ braille pattern dots-1367|⡦ braille pattern dots-2367|⡧ braille pattern dots-12367|⡨ braille pattern dots-467|⡩ braille pattern dots-1467|⡪ braille pattern dots-2467|⡫ braille pattern dots-12467|⡬ braille pattern dots-3467|⡭ braille pattern dots-13467|⡮ braille pattern dots-23467|⡯ braille pattern dots-123467|⡰ braille pattern dots-567|⡱ braille pattern dots-1567|⡲ braille pattern dots-2567|⡳ braille pattern dots-12567|⡴ braille pattern dots-3567|⡵ braille pattern dots-13567|⡶ braille pattern dots-23567|⡷ braille pattern dots-123567|⡸ braille pattern dots-4567|⡹ braille pattern dots-14567|⡺ braille pattern dots-24567|⡻ braille pattern dots-124567|⡼ braille pattern dots-34567|⡽ braille pattern dots-134567|⡾ braille pattern dots-234567|⡿ braille pattern dots-1234567|⢀ braille pattern dots-8|⢁ braille pattern dots-18|⢂ braille pattern dots-28|⢃ braille pattern dots-128|⢄ braille pattern dots-38|⢅ braille pattern dots-138|⢆ braille pattern dots-238|⢇ braille pattern dots-1238|⢈ braille pattern dots-48|⢉ braille pattern dots-148|⢊ braille pattern dots-248|⢋ braille pattern dots-1248|⢌ braille pattern dots-348|⢍ braille pattern dots-1348|⢎ braille pattern dots-2348|⢏ braille pattern dots-12348|⢐ braille pattern dots-58|⢑ braille pattern dots-158|⢒ braille pattern dots-258|⢓ braille pattern dots-1258|⢔ braille pattern dots-358|⢕ braille pattern dots-1358|⢖ braille pattern dots-2358|⢗ braille pattern dots-12358|⢘ braille pattern dots-458|⢙ braille pattern dots-1458|⢚ braille pattern dots-2458|⢛ braille pattern dots-12458|⢜ braille pattern dots-3458|⢝ braille pattern dots-13458|⢞ braille pattern dots-23458|⢟ braille pattern dots-123458|⢠ braille pattern dots-68|⢡ braille pattern dots-168|⢢ braille pattern dots-268|⢣ braille pattern dots-1268|⢤ braille pattern dots-368|⢥ braille pattern dots-1368|⢦ braille pattern dots-2368|⢧ braille pattern dots-12368|⢨ braille pattern dots-468|⢩ braille pattern dots-1468|⢪ braille pattern dots-2468|⢫ braille pattern dots-12468|⢬ braille pattern dots-3468|⢭ braille pattern dots-13468|⢮ braille pattern dots-23468|⢯ braille pattern dots-123468|⢰ braille pattern dots-568|⢱ braille pattern dots-1568|⢲ braille pattern dots-2568|⢳ braille pattern dots-12568|⢴ braille pattern dots-3568|⢵ braille pattern dots-13568|⢶ braille pattern dots-23568|⢷ braille pattern dots-123568|⢸ braille pattern dots-4568|⢹ braille pattern dots-14568|⢺ braille pattern dots-24568|⢻ braille pattern dots-124568|⢼ braille pattern dots-34568|⢽ braille pattern dots-134568|⢾ braille pattern dots-234568|⢿ braille pattern dots-1234568|⣀ braille pattern dots-78|⣁ braille pattern dots-178|⣂ braille pattern dots-278|⣃ braille pattern dots-1278|⣄ braille pattern dots-378|⣅ braille pattern dots-1378|⣆ braille pattern dots-2378|⣇ braille pattern dots-12378|⣈ braille pattern dots-478|⣉ braille pattern dots-1478|⣊ braille pattern dots-2478|⣋ braille pattern dots-12478|⣌ braille pattern dots-3478|⣍ braille pattern dots-13478|⣎ braille pattern dots-23478|⣏ braille pattern dots-123478|⣐ braille pattern dots-578|⣑ braille pattern dots-1578|⣒ braille pattern dots-2578|⣓ braille pattern dots-12578|⣔ braille pattern dots-3578|⣕ braille pattern dots-13578|⣖ braille pattern dots-23578|⣗ braille pattern dots-123578|⣘ braille pattern dots-4578|⣙ braille pattern dots-14578|⣚ braille pattern dots-24578|⣛ braille pattern dots-124578|⣜ braille pattern dots-34578|⣝ braille pattern dots-134578|⣞ braille pattern dots-234578|⣟ braille pattern dots-1234578|⣠ braille pattern dots-678|⣡ braille pattern dots-1678|⣢ braille pattern dots-2678|⣣ braille pattern dots-12678|⣤ braille pattern dots-3678|⣥ braille pattern dots-13678|⣦ braille pattern dots-23678|⣧ braille pattern dots-123678|⣨ braille pattern dots-4678|⣩ braille pattern dots-14678|⣪ braille pattern dots-24678|⣫ braille pattern dots-124678|⣬ braille pattern dots-34678|⣭ braille pattern dots-134678|⣮ braille pattern dots-234678|⣯ braille pattern dots-1234678|⣰ braille pattern dots-5678|⣱ braille pattern dots-15678|⣲ braille pattern dots-25678|⣳ braille pattern dots-125678|⣴ braille pattern dots-35678|⣵ braille pattern dots-135678|⣶ braille pattern dots-235678|⣷ braille pattern dots-1235678|⣸ braille pattern dots-45678|⣹ braille pattern dots-145678|⣺ braille pattern dots-245678|⣻ braille pattern dots-1245678|⣼ braille pattern dots-345678|⣽ braille pattern dots-1345678|⣾ braille pattern dots-2345678|⣿ braille pattern dots-12345678"}],rd="⌛ sand time timer|⏳ flowing hours sand timer waiting yolo|⌚ clock time|⏰ hours hrs late time waiting|⏱️ clock time|⭐ astronomy medium stars white|⚡ danger electric electricity lightning nature thunder thunderbolt zap|♥️ card emotion game hearts|🃏 card game wildcard|🀄 game|⌨️ computer|↗️ direction intercardinal northeast|↘️ direction intercardinal southeast|↙️ direction intercardinal southwest|↖️ direction intercardinal northwest|▶️ arrow right triangle|⏩ arrow double|⏭️ arrow scene triangle|⏯️ arrow right triangle|◀️ arrow left triangle|⏪ arrow double rewind|⏮️ arrow previous scene triangle|⏫ arrow double|⏬ arrow double|⏸️ bar double vertical|⏹️ square|⏺️ circle|‼️ ! !! bangbang punctuation|⁉️ ! !? ? interrobang punctuation|〰️ punctuation|⭕ heavy large|™️ tm trademark|🆔 identity|🆗 okay|🅿️ parking|🆘 help|🆙 mark|🆚 versus|🈁 katakana|🈂️ katakana|🈷️ ideograph|🈶 ideograph|🈯 ideograph|🉐 ideograph|🈹 ideograph|🈚 ideograph|🈲 ideograph|🉑 ideograph|🈸 ideograph|🈴 ideograph|🈳 ideograph|㊗️ ideograph|㊙️ ideograph|🈺 ideograph|🈵 ideograph|⬜ geometric|◼️ geometric|◻️ geometric|◾ geometric|◽ geometric|▪️ geometric|▫️ geometric|§ paragraph part silcrow|¶ alinea mark paragraph paraph|÷ divide obelus|† obelisk obelus sign|‡ obelisk obelus sign|‰ permil permille|∆ triangle|∇ triangle|∏ logic|∑ mathematics|√ radical radix surd|∝ proportionality|∞ sign|∠ acute|∫ calculus|≠ inequality inequation|■ filled|□ hollow|▲ arrow filled|△ hollow|▼ arrow filled|▽ hollow|◆ filled|◇ hollow|◊ diamond rhombus|○ hollow ring|● filled|◐ filled|◑ filled|◒ filled|◓ filled|◯ hollow ring|◳ hollow|◷ hollow",ld=[{name:"Happy",picks:[["(^▽^)","beaming","joy grin"],["(◕‿◕)","smiling"],["(。◕‿◕。)","sweet smile"],["ヽ(・∀・)ノ","cheering"],["(ノ◕ヮ◕)ノ∗:・゚✧","sparkles","magic yay excited"],["\(^o^)/","hooray","yay celebrate"],["(≧▽≦)","delighted","excited"],["(^_^)","content"],["(∗^‿^∗)","blushing smile"],["ᕕ( ᐛ )ᕗ","happy walk"],["(•‿•)","small smile"],["ʘ‿ʘ","wide eyed smile"],["(☞゚ヮ゚)☞","finger guns","pointing ayy"],["(⌐■_■)","cool shades","sunglasses deal with it"],["┌(・。・)┘♪","dancing","disco music"],["♪~ ᕕ(ᐛ)ᕗ","strutting"],["^_^","happy"],["ヽ(ヅ)ノ","joyful"],["\\(ᵔᵕᵔ)/","arms up"],["(´∀`)ノ♪","singing"],["(^v^)","grinning"],["ヽ(>∀<☆)ノ","overjoyed"],["(≧∇≦)/","excited"],["(⌒‿⌒)","gentle smile"],["(✿◠‿◠)","flower smile"],["(✧ω✧)","starry eyed"],["(⁎˃ᆺ˂)","giggling"],["(❁´◡`❁)","shy smile"],["(⌒▽⌒)☆","cheerful"],["(´。• ᵕ •。`)","soft smile"],["(๑˃ᴗ˂)ﻭ","yay"],["(✧∀✧)","sparkling eyes"],["(´∇ノ`∗)","laughing behind a hand"],["(´・ᴗ・ ` )","bashful"],["(〃^∇^)〃","giddy"],["(≧∀≦)","thrilled"],["(≧ω≦)","squeeing"],["(◕‿◕✿)","sweet flower"],["(ᵕ・ᴗ・)","calm smile"],["(„• ֊ •„)","cute"],["ദ്ദി(ᵔᗜᵔ)","thumbs up grin"],["(⁎˃ᴗ˂⁎)","beaming blush"],["( ˉ͈̀꒳ˉ͈́ )✧","proud"],["(•̀ᴗ•́)و","you got this","encourage fighting"],["(。◕‿‿◕。)","big smile"],["(𓁹‿𓁹)","eye of Horus smile"]]},{name:"Love",picks:[["(♥‿♥)","heart eyes","crush"],["(。♥‿♥。)","in love"],["(づ。◕‿‿◕。)づ","hug","cuddle"],["(っ˘з(˘⌣˘ )","kiss","smooch"],["(´。• ω •。`) ♡","fond"],["♡(ӦvӦ。)","adoring"],["( ˘ ³˘)♥","blowing a kiss","smooch mwah"],["(♡˙︶˙♡)","lovestruck"],["(ღ˘⌣˘ღ)","dreamy love"],["(♥ω♥∗)","smitten"],["(づ ◕‿◕ )づ","open arms"],["( ̄▽ ̄)ノ彡(ꈍᴗꈍ✿)","sending love"]]},{name:"Sad",picks:[["(╥﹏╥)","crying","tears"],["(ಥ﹏ಥ)","sobbing","cry tears"],["(;﹏;)","teary"],["(T_T)","tears","cry"],["(._.)","glum"],["(。•́︿•̀。)","pouting sad"],["(◞‸◟;)","disappointed"],["( ´•̥̥̥ω•̥̥̥` )","about to cry"],["(っ˘̩╭╮˘̩)っ","sad hug"],["( •̯́ ₃ •̯̀)","sulking"],["(´;ω;`)","weeping"],["(;_;)","quiet tears"],["(╥_╥)","streaming tears"],["щ(ಥДಥщ)","why","despair"],["(ノ_<。)","hiding tears"],["(×_×;)","defeated"],["( ༎ຶ‿༎ຶ )","smiling through tears"],["(๑-﹏-๑)","dejected"],["༼;´༎ຶ ۝ ༎ຶ༽","wailing"]]},{name:"Angry",picks:[["(╬ಠ益ಠ)","furious","mad rage"],["ಠ_ಠ","look of disapproval","disapprove stare judging"],["(¬_¬)","side eye","suspicious sus"],["ヽ(`Д´)ノ","raging","mad rage"],["(ノಥ益ಥ)ノ","outraged"],["(`ε´)","grumpy"],["(•̀へ•́ ╮ )","annoyed"],["(ง'̀-'́)ง","ready to fight","boxing"],["(#`д´)","fuming"],["(╬ Ò﹏Ó)","livid"],["(¬`‸´¬)","scowling"],["( •̀ ᴖ •́ )","irritated"],["(◣_◢)","menacing"],["╭(ఠఠ益ఠఠ)╮","monster rage"],["(ง •̀_•́)ง","fists up","fight boxing"]]},{name:"Surprised",picks:[["(⊙_⊙)","stunned","shock omg"],["(°o°)","gasp"],["Σ(°ロ°)","shocked","omg wtf"],["(☉_☉)","staring"],["(O_O)","wide eyes"],["w(°o°)w","whoa","wow omg"],["(◎_◎;)","dizzy"],["(°ロ°) !","startled"],["(⊙_◎)","bewildered"],["(⊙ω⊙)","amazed"],["(⊙_☉)","confused"],["(⊙_ʖ⊙)","baffled"],["(⊙﹏⊙)","nervous"],["(°_°;)","uh oh","oops yikes"],["(ఠ్ఠ ˓̭ ఠ్ఠ)","aghast"],["( ꩜ ᯅ ꩜;)","spiraling"]]},{name:"Shrug & flip",picks:[["¯\\_(ツ)_/¯","shrug","idk dunno whatever meh"],["┐( ̄ヘ ̄)┌","whatever","idk meh"],["(╯°□°)╯︵ ┻━┻","table flip","rage angry tableflip"],["┬─┬ノ( º _ ºノ)","putting the table back","calm down unflip tableflip"],["(ノಠ益ಠ)ノ彡┻━┻","angry table flip","rage tableflip"],["┻━┻ ︵ヽ(`Д´)ノ︵ ┻━┻","double table flip","rage tableflip"],["(ʘ言ʘ╬)","seething"],["( ̄ー ̄)","smug","smirk"],["( ͡° ͜ʖ ͡° )","lenny face","suggestive smirk meme"],["(¬‿¬)","sly","smirk sus"],["(─‿‿─)","pleased"],["(=_=)","tired","bored sleepy meh"],["(-_-) zzZ","sleeping","zzz nap tired"],["(˘▾˘)","chill"],["(っ- ‸ - ς)","sleepy"],["( ̄ω ̄)","satisfied"],["(^_~)","wink","flirt"],["ԅ(‾⌣‾ԅ)","scheming"],["( ͡~ ͜ʖ ͡°)","lenny wink"],["( ಠ ʖ̯ ͡ಠ)","doubtful"],["ヽ༼ຈل͜ຈ༽ノ","raise your dongers","meme hype"],["(¬⤙¬ )","unimpressed","meh"],["( – ⤙ – )","deadpan"]]},{name:"Animals",picks:[["ʕ•ᴥ•ʔ","bear","teddy"],["ʕ´•ᴥ•`ʔ","sad bear"],["(=^・ω・^=)","cat","kitty meow"],["(=ↀωↀ=)","wide eyed cat"],["ฅ^•ﻌ•^ฅ","cat paws"],["▼・ᴥ・▼","dog","puppy doggo"],["(・⊝・)","bird"],["<( ̄︶ ̄)>","penguin"],["くコ:彡","squid"],["~>°)~~~","snake"],["∪・ω・∪","puppy","dog doggo"],["(•ө•)","chick"],["(ᵔᴥᵔ)","happy bear"],["(ↀДↀ)","startled cat"],["@(・o・)@","monkey"],["𐔌՞ ܸ.ˬ.ܸ՞","bunny","rabbit"],["૮₍ ´ ꒳ `₎ა","shy pup"],["₍ᐢ. .ᐢ₎","little bunny","rabbit"],["(=①ω①=)","big eyed cat"],["(=ↀ益ↀ=)","hissing cat"],["(=^-ω-^=)","sleepy cat"],["(=^・ェ・^=)","kitty"],["=^._.^= ∫","cat with tail"],["(ꀄꀾꀄ)","frog"],["(•˕ •マ.ᐟ","curious cat"],["≽(•⩊ •マ≼","happy cat"]]},{name:"Greetings",picks:[["(^_^)/~","wave","hi hello bye"],["(∗・ω・)ノ","hello","hi wave"],["( ̄▽ ̄)ノ","hi there","hello wave"],["ヾ(・ω・∗)","bye","goodbye wave"],["(ノ´ヮ`)ノ∗: ・゚✧","welcome"],["(o^▽^o)","glad to see you"],["m(_ _)m","bowing","sorry thanks please"],["( ̄^ ̄)ゞ","salute","yes sir"],["d(^_^)b","thumbs up","ok good approve"]]},{name:"Things",picks:[["( ^_^)o自自o(^_^ )","cheers","beer toast drink"],["~(˘▾˘~)","wiggle"],["(~˘▾˘)~","wiggle back"],["♪(┌・。・)┌","disco","dance music"],["(⌐▨_▨)","pixel shades","sunglasses cool"],["[̲̅$̲̅(̲̅ ͡° ͜ʖ ͡°̲̅)̲̅$̲̅]","money","dollar cash"],["ᕦ(ò_óˇ)ᕤ","flexing","strong muscles"],["(•_•) ( •_•)>⌐■-■ (⌐■_■)","deal with it","sunglasses shades cool meme"],["༼ つ ◕_◕ ༽つ","gimme","give want please"],["☆.𓋼𓍊 𓆏 𓍊𓋼𓍊.☆","frog in flowers"],["( ◡̀◡́)ᕤ","confident flex","strong muscles"],["♪~(´ε` )","whistling"],["(∩`-´)⊃━☆゚.∗・。゚","magic spell","wizard wand"],["(⌐■_■)–|==>","shades with a sword"],["[◉_◉]","robot"]]},{name:"NSFW",nsfw:!0,picks:[["(ง •̀_•́)ง︻╦̵̵̿╤──","armed","gun shoot rifle"],["╾━╤デ╦︻","rifle","gun shoot armed"],["( ๏ 人 ๏ )","boobs","tits tiddy breasts"],["( ͜.人 ͜.)","boobs natural","tits tiddy breasts"],["(‿ˠ‿)","butt","ass rear"],["Ɑ͞ ̶͞ ̶͞ ̶͞ ﻝﮞ͞","wiener","dick cock"],["⎛₎╰({})╯₍⎞","puss","pussy vagina"],["凸(`⌒´メ)凸","flipping off","fuck"],["┌∩┐(◣_◢)┌∩┐","double middle finger","fuck"],["( ͡° ͜ʖ ͡°)╭∩╮","lenny middle finger","fuck"],["( ͡ᵔ ͜ʖ ͡ᵔ )","lewd lenny"],["(╭☞ ͡ ͡° ͜ ʖ ͡ ͡°)╭☞","come here"],["(ಠ ͜ʖ ಠ)","leering"],["( • )( • )ԅ(‾⌣‾ԅ)","want tiddies","boobs tits breasts"],["(っ ́ཀ`)っ Ɑ͞ ̶͞ ̶͞ ̶͞ لں͞","want wiener","dick cock"]]}],sd=[{name:"Happy",picks:[[":)","smile","smiley"],[":-)","smile with a nose","smiley"],["=)","happy"],[":]","content"],[":))","very happy"],["C:","beaming"],[":D","grin","lol haha laugh"],[":-D","big grin","lol haha laugh"],["=D","wide grin","haha laugh"],["8D","goggle grin"],["XD","laughing","lol lmao rofl haha"],["xD","giggling","lol haha laugh"],[":'D","tears of joy","lol lmao laughing crying"],[":3","cat smile","cute uwu kitty"],["^^","happy eyes"],["^.^","cheerful"],["^-^","pleased"],["(:","backwards smile"],["\\o/","hooray","yay cheer celebrate"]]},{name:"Playful",picks:[[";)","wink","flirt"],[";-)","wink with a nose"],[";D","winking grin","flirt"],[":P","tongue out","silly cheeky joking"],[":-P","tongue out with a nose"],["=P","silly","tongue cheeky joking"],[";P","winking tongue"],["XP","tongue out laughing"],["B)","cool","sunglasses shades"],["B-)","cool with a nose","sunglasses shades"],["8-)","glasses"],["O:)","angel","innocent halo"],[">:)","evil grin","devious mischief"],[">;)","sneaky"],["}:)","devil","horns"],[":^)","smug"],["o/","wave","hi hello"],["\\o","wave back","hi hello bye"],["(y)","thumbs up","like yes ok approve"],["(n)","thumbs down","dislike no"]]},{name:"Love",picks:[["<3","heart"],["--","rose","flower"]]},{name:"Sad & cross",picks:[[":(","frown","unhappy"],[":-(","frown with a nose"],["=(","sad"],[":[","pouting"],[":c","very sad"],["):","backwards frown"],[":'(","crying","tears"],[":'-(","crying with a nose"],["T.T","teary eyes","cry"],["D:","dismay"],["D:<","horrified"],[":/","unsure","meh hmm"],[":-/","skeptical"],[":|","straight face","meh neutral"],[":-|","not amused"],[":S","confused","worried"],["-.-","annoyed","ugh unimpressed"],[">.<","wincing","ugh frustrated"],[">:(","angry","mad"],[">:[","mad"],["X(","furious"],[":<","sulking"],[":@","shouting","yell angry"]]},{name:"Surprised",picks:[[":O","surprised","wow omg shock"],[":-O","gasp"],[":o","oh"],["8O","wide eyed"],["O.O","staring"],["O.o","puzzled","huh weird"],["o.O","double take","huh what"],["@.@","dizzy eyes"],["%)","dizzy"]]},{name:"Characters & more",picks:[["<:-)","party hat","birthday celebrate"],[":o)","clown"],[":-{)","mustache"],["|-)","sleepy","tired zzz"],["|-O","yawning","tired bored"],[":-?","thinking","hmm"],[":-#","braces"],[":x","lips sealed","secret shh quiet"],[":-&","tongue tied"],["=^.^=","cat face","kitty meow"],['<(")',"penguin"],["><((('>","fish"],["~:>","chick"]]},{name:"NSFW",nsfw:!0,picks:[["(.)(.)","boobs","tits tiddy breasts"],["( o )( o )","big boobs","tits tiddy breasts"],["(.Y.)","cleavage","tits tiddy breasts"],["8=D","small wiener","dick cock"],["8==D","wiener","dick cock"],["8===D","big wiener","dick cock"],["({∗})","puss","pussy vagina"],["t(-.-t)","flipping off","fuck"],["t(>.