Infinite Craft Helper - No Text Challenge

Infinite craft No Text Challenge using Infinite Craft Helper

  1. // ==UserScript==
  2. // @name Infinite Craft Helper - No Text Challenge
  3. // @namespace mikarific.com
  4. // @match https://neal.fun/infinite-craft/*
  5. // @version 2.1.3
  6. // @author Mikarific / Modded by MultipleGaming
  7. // @description Infinite craft No Text Challenge using Infinite Craft Helper
  8. // @icon https://i.imgur.com/WlkWOkU.png
  9. // @grant GM.getValue
  10. // @grant GM.setValue
  11. // @grant GM.xmlHttpRequest
  12. // @grant unsafeWindow
  13. // @run-at document-end
  14. // @noframes
  15. // @inject-into page
  16. // @sandbox raw
  17. // @connect *
  18. // @supportURL https://discord.gg/NSMut3Wx3Y
  19. // @homepageURL https://discord.gg/NSMut3Wx3Y
  20. // @license MIT
  21. //
  22. // Created with love using Gorilla
  23. // ==/UserScript==
  24.  
  25. (function () {
  26. 'use strict';
  27.  
  28. const whiteFavicon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAQAAAAi5ZK2AAAFUWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgdGlmZjpJbWFnZUxlbmd0aD0iMjUwIgogICB0aWZmOkltYWdlV2lkdGg9IjI1MCIKICAgdGlmZjpSZXNvbHV0aW9uVW5pdD0iMiIKICAgdGlmZjpYUmVzb2x1dGlvbj0iNzIvMSIKICAgdGlmZjpZUmVzb2x1dGlvbj0iNzIvMSIKICAgZXhpZjpQaXhlbFhEaW1lbnNpb249IjI1MCIKICAgZXhpZjpQaXhlbFlEaW1lbnNpb249IjI1MCIKICAgZXhpZjpDb2xvclNwYWNlPSI2NTUzNSIKICAgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMSIKICAgcGhvdG9zaG9wOklD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';
  29. const closeIcon = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJhIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MDAgNjAwIj48cGF0aCBkPSJNMzAwLjAwMDAyLDM0OS44MzIzM0w2MC4xMDc4Miw1ODkuNzIzMzJjLTYuNTQ2ODksNi41NDc2OS0xNC43NzY0Myw5Ljg5NzE4LTI0LjY4ODYsMTAuMDQ4NTEtOS45MTEzOCwuMTUyMS0xOC4yOTIyNC0zLjE5NzQtMjUuMTQyNTYtMTAuMDQ4NTFDMy40MjU1Nyw1ODIuODcyOTgsLjAwMDAyLDU3NC41Njc4LDAsNTY0LjgwNzc0Yy4wMDAwMi05Ljc2MDA3LDMuNDI1NTctMTguMDY1MjYsMTAuMjc2NjYtMjQuOTE1NTZsMjM5Ljg5MTAxLTIzOS44OTIyTDEwLjI3NjY4LDYwLjEwNzc4QzMuNzI4OTksNTMuNTYwOTIsLjM3OTUsNDUuMzMxMzYsLjIyODE3LDM1LjQxOTIyLC4wNzYwNywyNS41MDc4OCwzLjQyNTU3LDE3LjEyNywxMC4yNzY2OCwxMC4yNzY2NiwxNy4xMjcwMiwzLjQyNTUzLDI1LjQzMjIsMCwzNS4xOTIyNiwwczE4LjA2NTI2LDMuNDI1NTMsMjQuOTE1NTYsMTAuMjc2NjZsMjM5Ljg5MjIsMjM5Ljg5MDk3TDUzOS44OTIyMiwxMC4yNzY1OWM2LjU0Njg2LTYuNTQ3NzIsMTQuNzc2NDMtOS44OTcyLDI0LjY4ODU2LTEwLjA0ODUxLDkuOTExMzQtLjE1MjE3LDE4LjI5MjIyLDMuMTk3MzgsMjUuMTQyNTYsMTAuMDQ4NTEsNi44NTExMyw2Ljg1MDI3LDEwLjI3NjY2LDE1LjE1NTUyLDEwLjI3NjY2LDI0LjkxNTU2cy0zLjQyNTUzLDE4LjA2NTIyLTEwLjI3NjY2LDI0LjkxNTU2bC0yMzkuODkwOTcsMjM5Ljg5MjI3LDIzOS44OTEwNSwyMzkuODkyMmM2LjU0NzcyLDYuNTQ2ODksOS44OTcyLDE0Ljc3NjQzLDEwLjA0ODUxLDI0LjY4ODYsLjE1MjE3LDkuOTExMzgtMy4xOTczOCwxOC4yOTIyNC0xMC4wNDg1MSwyNS4xNDI1Ni02Ljg1MDI3LDYuODUxMS0xNS4xNTU1MiwxMC4yNzY2NC0yNC45MTU1NiwxMC4yNzY2Ni05Ljc2MDA0LS4wMDAwMi0xOC4wNjUyMi0zLjQyNTU3LTI0LjkxNTU2LTEwLjI3NjY2bC0yMzkuODkyMjctMjM5Ljg5MTAxWiIvPjwvc3ZnPg==';
  30. const discoveriesIcon = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJhIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MDAgNTc5LjAyMTgyIj48cGF0aCBkPSJNMTE5Ljc1MDQzLDU3OS4wMjE4MmMtMTMuODM0NzUsMC0yNS4yOTQzOC04LjE5ODM3LTI4LjgyNjkxLTIwLjUwNzk4bC0xNy44Njc2Mi01Mi41NTM5NS01NS4zNzUxNi0xOC44MzIxMy0yLjAwNzM5LTEuMzM4MjZjLTEwLjEwOTMxLTYuNzE1NDMtMTUuNjczMzUtMTYuMTMxNS0xNS42NzMzNS0yNi41MjQxMywwLTEzLjgyODcyLDguMTkyMzQtMjUuMjk0MzgsMjAuNDg5ODktMjguODI2OTFsNTIuNTY2MDEtMTcuODc5NjgsMTguODMyMTMtNTUuMzg3MjEsMS4zNTAzMi0yLjAyNTQ4YzkuMDg0NTItMTMuNTk5NjUsMjAuNTA3OTgtMTUuNjM3MTgsMjYuNTEyMDgtMTUuNjM3MTgsMTMuODQ2OCwwLDI1LjMwMDQxLDguMTk4MzcsMjguODI2OTEsMjAuNDk1OTJsMTcuODY3NjIsNTIuNTUzOTUsNTIuNTY2MDEsMTcuODc5NjhjMTIuMjk3NTUsMy41MzI1MywyMC40OTU5MiwxNC45OTgxOSwyMC40OTU5MiwyOC44MjY5MSwwLDEzLjg0MDc3LTguMTk4MzcsMjUuMjk0MzgtMjAuNTA3OTgsMjguODI2OTFsLTUyLjU1Mzk1LDE3Ljg2NzYyLTE4LjgzMjEzLDU1LjM4NzIxLTEuMzM4MjYsMi4wMTM0MmMtOS4wODQ1MiwxMy42MjM3Ni0yMC41MTQwMSwxNS42NjEyOS0yNi41MjQxMywxNS42NjEyOVptLTY4Ljk4MDgzLTExOS43Njg1Mmw1MS40NzQ5LDE3LjUwNTkzLDE3LjUwNTkzLDUxLjQ4MDkzLDE3LjUwNTkzLTUxLjQ4MDkzLDUxLjQ3NDktMTcuNTA1OTMtNTEuNDc0OS0xNy40OTM4Ny0xNy41MDU5My01MS40ODA5My0xNy41MDU5Myw1MS40ODA5My01MS40NzQ5LDE3LjQ5Mzg3Wm0zNDUuNTI1MDYsNjIuOTcwN2MtMTMuOTAxMDYsMC0yNS40MDI4OS04LjI3MDcxLTI4Ljg2MzA4LTIwLjY2NDcxbC0zNy43MDA0NC0xMTYuNDc3MTEtMTE5LjM1ODYtMzguNjE2NzMtMi4xNDAwMi0xLjQzNDcxYy0xMy42MTE3LTkuMDc4NDktMTUuNjQzMjEtMjAuNTA3OTgtMTUuNjQzMjEtMjYuNTEyMDgsMC0xMy45MDEwNiw4LjI3MDcxLTI1LjQwMjg5LDIwLjY3MDc0LTI4Ljg2OTExbDExNi40NzEwOC0zNy42ODIzNSwzOC42Mjg3OC0xMTkuMzUyNTcsMS40MTA2LTIuMTIxOTNjNi43MTU0My0xMC4xMDkzMSwxNi4xMzE1LTE1LjY3OTM4LDI2LjUyNDEzLTE1LjY3OTM4LDE0LjE2NjMsMCwyNS44NDg5Nyw4LjYwMjI2LDI5LjA4MDA5LDIxLjQxMjIxbDM3LjQ4MzQyLDExNS43MzU2NCwxMTcuMDU1ODIsMzcuODgxMjhjMTEuNDUzNiwzLjgwMzgsMjAuMDg2LDE2LjEyNTQ3LDIwLjA4NiwyOC42NzYyLDAsMTQuMTY2My04LjU5NjIzLDI1Ljg0ODk3LTIxLjQwMDE1LDI5LjA2ODA0bC0xMTUuNzQxNjcsMzcuNDgzNDItMzguNjE2NzMsMTE5LjM4MjcxLTEuNDM0NzEsMi4xMzM5OWMtOS4wNzg0OSwxMy42MTE3LTIwLjUwNzk4LDE1LjYzNzE4LTI2LjUxMjA4LDE1LjYzNzE4Wm0tMTUxLjk1OTE3LTIwMy43MDUzNGwxMTQuODEzMzMsMzcuMTQ1ODQsMzcuMTQ1ODQsMTE0LjgxMzMzLDM3LjE0NTg0LTExNC44MTMzMywxMTQuODEzMzMtMzcuMTQ1ODQtMTE0LjgxMzMzLTM3LjE0NTg0LTM3LjE0NTg0LTExNC44MTMzMy0zNy4xNDU4NCwxMTQuODEzMzMtMTE0LjgxMzMzLDM3LjE0NTg0Wm0tNzguOTAzMjctOS44NzQyMWMtMTMuODUyODMsMC0yNS4zMTg0OS04LjIxMDQyLTI4LjgzMjk0LTIwLjUyNjA2bC0yNi41MTgxLTc4LjQ0NTEyLTc4Ljk2MzU1LTI2LjY5MjkyYy0xMi4xNTg5LTQuMDg3MTMtMjAuMDA3NjQtMTUuMzIzNzEtMjAuMDA3NjQtMjguNjU4MTIsMC0xMy44NDY4LDguMjA0NC0yNS4zMDY0MywyMC41MjAwMy0yOC44MzI5NGw3OC40NTExNS0yNi41MTgxLDI3LjQ3NjU5LTgxLjI3ODM4LDEuMzQ0MjktMi4wMTk0NUMxNDcuOTY4NDksMi4wMzc1NCwxNTkuNDE2MDcsMCwxNjUuNDMyMjIsMGMxMy44NDA3NywwLDI1LjMwNjQzLDguMjA0NCwyOC44MzI5NCwyMC41MjAwM2wyNi41MTgxLDc4LjQ1MTE1LDgxLjI4NDQxLDI3LjQ3NjU5LDIuMDI1NDgsMS4zNTAzMmMxMy42Mjk3OSw5LjA3ODQ5LDE1LjY2NzMyLDIwLjUxNDAxLDE1LjY2NzMyLDI2LjUyNDEzLDAsMTMuODQwNzctOC4yMTA0MiwyNS4zMDY0My0yMC41MjYwNiwyOC44MzI5NGwtNzguNDUxMTUsMjYuNTE4MS0yNy40NzY1OSw4MS4yODQ0MS0xLjM1NjM1LDIuMDMxNTFjLTkuMDc4NDksMTMuNjE3NzMtMjAuNTE0MDEsMTUuNjU1MjctMjYuNTE4MSwxNS42NTUyN1pNNjIuMDAwMTYsMTU0LjMyMjIzbDc3LjI5MzczLDI2LjEyNjI3LDI2LjEzODMzLDc3LjMwNTc5LDI2LjEyNjI3LTc3LjMwNTc5LDc3LjMwNTc5LTI2LjEyNjI3LTc3LjMwNTc5LTI2LjEyNjI3LTI2LjEyNjI3LTc3LjMwNTc5LTI2LjEzODMzLDc3LjMwNTc5LTc3LjI5MzczLDI2LjEyNjI3WiIvPjwvc3ZnPg==';
  31. const randomIcon = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJhIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MDAgNjAwIj48cGF0aCBkPSJNNjAuNTc2NTcsNjAwYy0xNy4yNTkzOCwwLTMxLjY3MDMyLTUuNzgxMjUtNDMuMjMyODItMTcuMzQzNzVTMCw1NTYuNjgyODEsMCw1MzkuNDIzNDN2LTEwOC4xNzM0M2MwLTUuMzM2MjQsMS43OTA5NC05Ljc5NTMxLDUuMzcyODItMTMuMzc3MiwzLjU4MTI2LTMuNTgxODksOC4wNDAzLTUuMzcyOCwxMy4zNzcxOC01LjM3MjgsNS4zMzYyNSwwLDkuNzk1MywxLjc5MDkxLDEzLjM3NzE4LDUuMzcyOCwzLjU4MTg3LDMuNTgxODYsNS4zNzI4Miw4LjA0MDkzLDUuMzcyODIsMTMuMzc3MnYxMDguMTczNDVjMCw1Ljc2ODc0LDIuNDAzNzYsMTEuMDU3MTgsNy4yMTEyNSwxNS44NjUzMiw0LjgwODEyLDQuODA3NDgsMTAuMDk2NTYsNy4yMTEyNCwxNS44NjUzMiw3LjIxMTI0aDEwOC4xNzM0M2M1LjMzNjI0LDAsOS43OTUzMSwxLjc5MDk0LDEzLjM3NzIsNS4zNzI4MiwzLjU4MTg5LDMuNTgxODksNS4zNzI4LDguMDQwOTMsNS4zNzI4LDEzLjM3NzE4LDAsNS4zMzY4OC0xLjc5MDkxLDkuNzk1OTMtNS4zNzI4LDEzLjM3NzE4LTMuNTgxODksMy41ODE4Ny04LjA0MDk2LDUuMzcyODItMTMuMzc3Miw1LjM3MjgySDYwLjU3NjU3Wm00NzguODQ2ODgsMGgtMTA4LjE3MzQ1Yy01LjMzNjI3LDAtOS43OTUyOC0xLjc5MDk0LTEzLjM3NzE3LTUuMzcyODItMy41ODE4OS0zLjU4MTI2LTUuMzcyODMtOC4wNDAzLTUuMzcyODMtMTMuMzc3MTgsMC01LjMzNjI1LDEuNzkwOTQtOS43OTUzLDUuMzcyODMtMTMuMzc3MTgsMy41ODE4OS0zLjU4MTg3LDguMDQwOTYtNS4zNzI4MiwxMy4zNzcxNy01LjM3MjgyaDEwOC4xNzM0NWM1Ljc2ODc0LDAsMTEuMDU3MjItMi40MDM3NiwxNS44NjUyOS03LjIxMTI1LDQuODA3NTUtNC44MDgxMiw3LjIxMTI3LTEwLjA5NjU2LDcuMjExMjctMTUuODY1MzJ2LTEwOC4xNzM0M2MwLTUuMzM2MjQsMS43OTA5NC05Ljc5NTMxLDUuMzcyODMtMTMuMzc3MiwzLjU4MTg5LTMuNTgxODksOC4wNDA5Ni01LjM3MjgsMTMuMzc3MTctNS4zNzI4LDUuMzM2ODksMCw5Ljc5NTkxLDEuNzkwOTEsMTMuMzc3MTcsNS4zNzI4LDMuNTgxODksMy41ODE4OSw1LjM3MjgzLDguMDQwOTYsNS4zNzI4MywxMy4zNzcydjEwOC4xNzM0NWMwLDE3LjI1OTM2LTUuNzgxMjcsMzEuNjcwMzEtMTcuMzQzNzUsNDMuMjMyOC0xMS41NjI0OCwxMS41NjI1LTI1Ljk3MzQ1LDE3LjM0Mzc1LTQzLjIzMjgsMTcuMzQzNzVaTTAsNjAuNTc2NTVDMCw0My4zMTcyLDUuNzgxMjUsMjguOTA2MjMsMTcuMzQzNzUsMTcuMzQzNzUsMjguOTA2MjUsNS43ODEyNyw0My4zMTcxOSwwLDYwLjU3NjU3LDBoMTA4LjE3MzQzYzUuMzM2MjQsMCw5Ljc5NTMxLDEuNzkwOTQsMTMuMzc3Miw1LjM3MjgzLDMuNTgxODksMy41ODEyNiw1LjM3MjgsOC4wNDAyOCw1LjM3MjgsMTMuMzc3MTcsMCw1LjMzNjMyLTEuNzkwOTEsOS43OTUyOC01LjM3MjgsMTMuMzc3MTctMy41ODE4NiwzLjU4MTgzLTguMDQwOTMsNS4zNzI4My0xMy4zNzcyLDUuMzcyODNINjAuNTc2NTdjLTUuNzY4NzUsMC0xMS4wNTcxOCwyLjQwMzcyLTE1Ljg2NTMyLDcuMjExMjctNC44MDc0OSw0LjgwODA2LTcuMjExMjUsMTAuMDk2NTUtNy4yMTEyNSwxNS44NjUyOXYxMDguMTczNDVjMCw1LjMzNjI3LTEuNzkwOTQsOS43OTUyOC01LjM3MjgyLDEzLjM3NzE3LTMuNTgxODksMy41ODE4My04LjA0MDkzLDUuMzcyNzctMTMuMzc3MTgsNS4zNzI4My01LjMzNjg4LDAtOS43OTU5My0xLjc5MDk0LTEzLjM3NzE4LTUuMzcyODMtMy41ODE4Ny0zLjU4MTg5LTUuMzcyODItOC4wNDA5LTUuMzcyODItMTMuMzc3MTdWNjAuNTc2NTVabTYwMCwwdjEwOC4xNzM0NWMwLDUuMzM2MjctMS43OTA5NCw5Ljc5NTI4LTUuMzcyODMsMTMuMzc3MTctMy41ODEyNiwzLjU4MTg5LTguMDQwMjgsNS4zNzI4My0xMy4zNzcxNyw1LjM3MjgzLTUuMzM2MzIsMC05Ljc5NTI4LTEuNzkwOTQtMTMuMzc3MTctNS4zNzI4My0zLjU4MTgzLTMuNTgxODktNS4zNzI4My04LjA0MDk2LTUuMzcyODMtMTMuMzc3MTdWNjAuNTc2NTVjMC01Ljc2ODc0LTIuNDAzNzItMTEuMDU3MjItNy4yMTEyNy0xNS44NjUyOS00LjgwODA2LTQuODA3NTUtMTAuMDk2NTUtNy4yMTEyNy0xNS44NjUyOS03LjIxMTI3aC0xMDguMTczNDVjLTUuMzM2MjcsMC05Ljc5NTI4LTEuNzkwOTQtMTMuMzc3MTctNS4zNzI4My0zLjU4MTgzLTMuNTgxODktNS4zNzI3Ny04LjA0MDk2LTUuMzcyODMtMTMuMzc3MTcsMC01LjMzNjg5LDEuNzkwOTQtOS43OTU5MSw1LjM3MjgzLTEzLjM3NzE3LDMuNTgxODktMy41ODE4OSw4LjA0MDktNS4zNzI4MywxMy4zNzcxNy01LjM3MjgzaDEwOC4xNzM0NWMxNy4yNTkzNSwwLDMxLjY3MDMyLDUuNzgxMjcsNDMuMjMyOCwxNy4zNDM3NXMxNy4zNDM3NSwyNS45NzM0NSwxNy4zNDM3NSw0My4yMzI4Wk0zMDEuNDQxODcsNDk1LjQzMzEzYzguMzE3NTEsMCwxNS4zMjUwMS0yLjg0ODc1LDIxLjAyMjUxLTguNTQ2MjUsNS42OTY5LTUuNjk2ODcsOC41NDUzMy0xMi43MDQwNiw4LjU0NTMzLTIxLjAyMTU3cy0yLjg0ODQzLTE1LjMyNDctOC41NDUzLTIxLjAyMTU3Yy01LjY5NzUzLTUuNjk2ODctMTIuNzA1LTguNTQ1My0yMS4wMjI1MS04LjU0NTMtOC4zMTY5MSwwLTE1LjMyNDA3LDIuODQ4NDMtMjEuMDIxNTcsOC41NDUzLTUuNjk2OSw1LjY5Njg3LTguNTQ1MzMsMTIuNzA0MDYtOC41NDUzMywyMS4wMjE1N3MyLjg0ODQzLDE1LjMyNDcsOC41NDUzLDIxLjAyMTU3YzUuNjk3NDcsNS42OTc1LDEyLjcwNDY5LDguNTQ2MjUsMjEuMDIxNTcsOC41NDYyNVptMC0zNTUuOTYyMTVjMTkuMTM0OTgsMCwzNS42Mzc1LDYuMDgxODUsNDkuNTA3NTEsMTguMjQ1NiwxMy44NzAwMSwxMi4xNjMxMiwyMC44MDUwMiwyNy40OTk2OSwyMC44MDUwMiw0Ni4wMDk3MSwwLDEzLjQxMzE2LTMuOTMwMywyNS42MjQ2OS0xMS43OTA5NiwzNi42MzQ3MS03Ljg2MDAzLDExLjAwOTM5LTE2Ljg2MjE4LDIwLjk2MTIzLTI3LjAwNjU3LDI5Ljg1NTYzLTE2LjI1MDAxLDE0Ljg1NTYtMjguMzUzNDUsMjguNjg5NjgtMzYuMzEwMyw0MS41MDIyLTcuOTU2ODgsMTIuODEyNDktMTIuNTYwMjksMjYuODM5MDYtMTMuODEwMyw0Mi4wNzk3LS42MjQ5OSw0LjkwMzc0LC44MTc0OCw5LjA3NDM5LDQuMzI3NSwxMi41MTE4OCwzLjUwOTM5LDMuNDM3NTIsNy43ODgxMSw1LjE1NjI1LDEyLjgzNjI0LDUuMTU2MjUsNC45MDM3NiwwLDkuMTQ2NTgtMS42ODI4LDEyLjcyODQzLTUuMDQ4NDUsMy41ODE4OS0zLjM2NTAyLDUuNzU3NTItNy41NzE1NSw2LjUyNjg4LTEyLjYxOTY5LDEuNzMwNjMtMTAuNjI1MDEsNS40ODA2My0yMC4xMjAzMiwxMS4yNS0yOC40ODU5NSw1Ljc2ODc0LTguMzY1NjMsMTQuODMxMi0xOC43MjYyNSwyNy4xODc1LTMxLjA4MTg3LDE4Ljk4OTk4LTE4Ljk5MDYxLDMyLjA3ODctMzQuOTY0MDgsMzkuMjY2MjItNDcuOTIwMzMsNy4xODc1Mi0xMi45NTY4OSwxMC43ODEyNS0yNy4zNjgxNCwxMC43ODEyNS00My4yMzM3OCwwLTI4Ljk0MTg4LTkuNzgzNzMtNTIuNTk1NjctMjkuMzUxMjMtNzAuOTYxMjctMTkuNTY2ODgtMTguMzY1NjUtNDQuNzM1MDEtMjcuNTQ4NDUtNzUuNTA0MzctMjcuNTQ4NDUtMjEuMjk4MTEsMC00MC43ODEyNSw0LjgxOTY4LTU4LjQ0OTM4LDE0LjQ1OTA0LTE3LjY2ODc2LDkuNjM5MzYtMzEuODE1NjEsMjMuNjQxODMtNDIuNDQwNjEsNDIuMDA3NDgtMi4zMDc1LDQuMTM1MDQtMi41ODM3Niw4LjU0NjI4LS44Mjg3NSwxMy4yMzM3OHM1LjAxMjIsNy44NzI1MSw5Ljc3MTU3LDkuNTU1MDJjNC4yNzg3NSwxLjY4MjUxLDguODM0MDcsMS44MDI4NSwxMy42NjU5MywuMzYwOTUsNC44MzE4Ny0xLjQ0MjQ3LDguNzg2MjMtNC4xNTkwNywxMS44NjMxMi04LjE0OTY4LDguMzE3NTEtMTAuNjczMTYsMTcuODQ4NzUtMTkuNDM1MDQsMjguNTkzNzUtMjYuMjg1NjUsMTAuNzQ0OTctNi44NTEyMywyMi44NzIxNi0xMC4yNzY4NSwzNi4zODE1Ny0xMC4yNzY4NVoiLz48L3N2Zz4=';
  32. const uploadIcon = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJhIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NzMuNjgzODcgNjAwIj48cGF0aCBkPSJNMjEzLjE1ODQ1LDM2MS41NzY3NXYxMTYuMzU4NDVjMCw2LjcyMDAxLDIuMjY3MTIsMTIuMzQ3NCw2LjgwMTMzLDE2Ljg4MjE1LDQuNTM0MjMsNC41MzQyMywxMC4xNjE1OCw2LjgwMTM0LDE2Ljg4MjE1LDYuODAxMzRzMTIuMzQ3OTItMi4yNjcxLDE2Ljg4MjE1LTYuODAxMzRjNC41MzQyMS00LjUzNDc1LDYuODAxMzMtMTAuMTYyMTQsNi44MDEzMy0xNi44ODIxNXYtMTE2LjM1ODQ1bDQxLjc4MzAyLDQxLjc4Mjk5YzIuMzQ3OSwyLjM0NzksNC45ODk0OSw0LjEwODk3LDcuOTI0NzgsNS4yODMxNiwyLjkzNTI4LDEuMTc0MjIsNS44NzAyOCwxLjY4MDI2LDguODA1MDMsMS41MTgxNywyLjkzNTI4LS4xNjIxMiw1Ljg0MDMxLS44MzAwMiw4LjcxNTAyLTIuMDAzNjgsMi44NzQyMy0xLjE3NDE5LDUuNDg1MjgtMi45MzU1Myw3LjgzMzE4LTUuMjgzOTYsNC41NzUyOS00Ljg5ODQ1LDYuOTQzNzEtMTAuNDQ0NzUsNy4xMDUyOC0xNi42Mzg5OCwuMTYyMS02LjE5NDIzLTIuMjA2MzMtMTEuNzQwNTYtNy4xMDUyOC0xNi42Mzg5OGwtNzguNzY1MTktNzguNzY1MjFjLTIuOTU1MjgtMi45NTU3OS02LjA3MjY0LTUuMDQwODEtOS4zNTIxNC02LjI1NTAyLTMuMjc4OTctMS4yMTQ3NC02LjgyMTM1LTEuODIyMTUtMTAuNjI3MTMtMS44MjIxMi0zLjgwNTc4LS4wMDAwMi03LjM0ODE5LC42MDczOC0xMC42MjcxMywxLjgyMjEyLTMuMjc5NDUsMS4yMTQyMS02LjM5Njg1LDMuMjk5MjMtOS4zNTIxNCw2LjI1NTAybC03OC43NjUxOSw3OC43NjUxOWMtNC42OTYzMSw0LjY5NTc4LTcuMDE0MjMsMTAuMTkxNi02Ljk1MzcxLDE2LjQ4NzQxLC4wNjA1Miw2LjI5NTI4LDIuNTQwMjgsMTEuODkyMTMsNy40MzkyMywxNi43OTA1Nyw0Ljg5ODQ1LDQuNTc1MjYsMTAuNDQ0NzUsNi45NDM2OSwxNi42Mzg5OCw3LjEwNTI4LDYuMTk0MjMsLjE2MjEyLDExLjc0MDgzLTIuMjA2MzEsMTYuNjM5NzgtNy4xMDUyOGw0MS4yOTY2NS00MS4yOTY2OFpNNTcuMDg1NDEsNTk5Ljk5OTk5Yy0xNS45NTE2MSwwLTI5LjQ1Mzc1LTUuNTI2MzMtNDAuNTA2NDItMTYuNTc4OTlDNS41MjYzNCw1NzIuMzY4MzQsLjAwMDAxLDU1OC44NjYyLDAsNTQyLjkxNDU5VjU3LjA4NTRjLjAwMDAxLTE1Ljk1MTU2LDUuNTI2MzQtMjkuNDUzNzUsMTYuNTc4OTktNDAuNTA2NDFDMjcuNjMxNjYsNS41MjYzMyw0MS4xMzM4LDAsNTcuMDg1NDEsMGgyMjcuMTg2NjRjNy42MTEwOSwwLDE0LjkyODcyLDEuNDc3OTEsMjEuOTUyOTYsNC40MzM3Miw3LjAyNDIzLDIuOTU1MjgsMTMuMTI3NjgsNy4wMjM5NCwxOC4zMTAzMSwxMi4yMDYwOGwxMzIuNTA4NzYsMTMyLjUwODc2YzUuMTgyMTQsNS4xODI2Miw5LjI1MDgsMTEuMjg2MDcsMTIuMjA2MDgsMTguMzEwMzEsMi45NTU4MSw3LjAyNDIzLDQuNDMzNzIsMTQuMzQxODcsNC40MzM3MiwyMS45NTI5NnYzNTMuNTAyNzdjMCwxNS45NTE2Mi01LjUyNjMzLDI5LjQ1Mzc2LTE2LjU3ODk5LDQwLjUwNjQyLTExLjA1MjY2LDExLjA1MjY1LTI0LjU1NDg0LDE2LjU3ODk4LTQwLjUwNjQxLDE2LjU3ODk5SDU3LjA4NTQxWk0yODQuMjExMjQsMTYwLjkyOTkzVjQ3LjM2Nzc3SDU3LjA4NTQxYy0yLjQyOTQ4LDAtNC42NTY1OCwxLjAxMjA5LTYuNjgxMzMsMy4wMzYzMy0yLjAyNDIsMi4wMjQ3Mi0zLjAzNjMyLDQuMjUxODYtMy4wMzYzMiw2LjY4MTM0djQ4NS44MjkxN2MwLDIuNDI5NDgsMS4wMTIxMiw0LjY1NjU5LDMuMDM2MzIsNi42ODEzMywyLjAyNDc1LDIuMDI0MjEsNC4yNTE4NSwzLjAzNjMyLDYuNjgxMzMsMy4wMzYzMkg0MTYuNTk4NDNjMi40Mjk0OCwwLDQuNjU2NjMtMS4wMTIxMSw2LjY4MTM0LTMuMDM2MzIsMi4wMjQyNC0yLjAyNDc0LDMuMDM2MzMtNC4yNTE4NSwzLjAzNjMzLTYuNjgxMzNWMTg5LjQ3MjYzaC0xMTMuNTYyMTFjLTguMTM3MzcsMC0xNC45Mjg3Mi0yLjcyMjg4LTIwLjM3NDAxLTguMTY4NjktNS40NDU4MS01LjQ0NTI4LTguMTY4NjktMTIuMjM2NjMtOC4xNjg3NC0yMC4zNzQwMVpNNDcuMzY3NzUsNDcuMzY3Nzd2MFoiLz48L3N2Zz4=';
  33. const downloadIcon = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJhIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1OTkuOTk5OTIgNjAwIj48cGF0aCBkPSJNMjk5Ljk5OTk4LDQzNi40NjE0NWMtNC44MjA2NiwuMDAwMDMtOS4zMDc2OC0uNzY5MzUtMTMuNDYxMDQtMi4zMDgwMi00LjE1NDAxLTEuNTM4LTguMTAyNjYtNC4xNzkwMy0xMS44NDYwNS03LjkyMzAzbC0xMjQuMzg0NDEtMTI0LjM4MzRjLTUuOTQ4NjktNS45NDg2OS04Ljg4NDM3LTEyLjkxMDA1LTguODA3MDQtMjAuODg0MDcsLjA3NjY2LTcuOTc0MDMsMy4wMTIzNC0xNS4wNjM2OCw4LjgwNzA0LTIxLjI2OTA4LDYuMjA1MzQtNi4yMDQ2NywxMy4zMzMzOS05LjQwOTcsMjEuMzg0MDctOS42MTUwMiw4LjA1MTMzLS4yMDUzMiwxNS4xNzk3MSwyLjc5NDY5LDIxLjM4NTA4LDkuMDAwMDNsNzYuOTIzMjYsNzYuOTIzMjZWMzAuMDAwMWMwLTguNTEyNzIsMi44NzE2OC0xNS42NDA2OCw4LjYxNTAyLTIxLjM4NDA0LDUuNzQzMzctNS43NDQwNCwxMi44NzEzNS04LjYxNjA2LDIxLjM4NDA3LTguNjE2MDZzMTUuNjQwNzEsMi44NzIwMiwyMS4zODQwNyw4LjYxNjA2YzUuNzQzMzQsNS43NDMzNyw4LjYxNTAyLDEyLjg3MTMyLDguNjE1MDIsMjEuMzg0MDRWMzM2LjAwMjExbDc2LjkyMzI2LTc2LjkyMzI2YzUuOTQ4NjktNS45NDg2OSwxMy4wMTI2OC04Ljg4NDY3LDIxLjE5MjA5LTguODA4MDEsOC4xNzkzNSwuMDc3MzMsMTUuMzcxNjksMy4yMTgzMywyMS41NzcxLDkuNDIzLDUuNzk0Nyw2LjIwNTQsOC43OTQ0LDEzLjIzMTAzLDguOTk5MDUsMjEuMDc3MDYsLjIwNTMyLDcuODQ2MDMtMi43OTQzOCwxNC44NzEzOS04Ljk5OTA1LDIxLjA3NjA2bC0xMjQuMzg0NDQsMTI0LjM4MzQ2Yy0zLjc0MzMzLDMuNzQ0LTcuNjkyMDQsNi4zODUtMTEuODQ2MDUsNy45MjMwMy00LjE1MzM2LDEuNTM4NjctOC42NDAzOCwyLjMwODAyLTEzLjQ2MTA0LDIuMzA3OTlabS0yMjcuNjkxNzQsMTYzLjUzODUzYy0yMC4yMDUzOS0uMDAwMDItMzcuMzA4MTEtNy4wMDAwNC01MS4zMDgxNy0yMS4wMDAwN0M3LjAwMDA0LDU2NC45OTk4NSwuMDAwMDIsNTQ3Ljg5NzE0LDAsNTI3LjY5MTc1di03OC40NjEyN2MuMDAwMDItOC41MTI2OSwyLjg3Mi0xNS42NDA3MSw4LjYxNjAzLTIxLjM4NDA3LDUuNzQzMzctNS43NDMzNCwxMi44NzEzOC04LjYxNTAyLDIxLjM4NDA3LTguNjE1MDJzMTUuNjQwNzIsMi44NzE2OCwyMS4zODQwNyw4LjYxNTAyYzUuNzQzMzUsNS43NDMzNyw4LjYxNTAyLDEyLjg3MTM4LDguNjE1MDIsMjEuMzg0MXY3OC40NjEyNmMwLDMuMDc3MzYsMS4yODIsNS44OTgzNSwzLjg0NjAxLDguNDYzMDMsMi41NjQ2OCwyLjU2NCw1LjM4NTY3LDMuODQ2MDEsOC40NjMwMywzLjg0NjAxaDQ1NS4zODM0OGMzLjA3NzM0LDAsNS44OTg0LTEuMjgyLDguNDYzMDQtMy44NDYwMSwyLjU2NDAzLTIuNTY0NjgsMy44NDYwMi01LjM4NTY3LDMuODQ2MDItOC40NjMwM3YtNzguNDYxMjZjMC04LjUxMjcyLDIuODcxNjUtMTUuNjQwNzEsOC42MTUwMi0yMS4zODQwNyw1Ljc0MzM3LTUuNzQzMzQsMTIuODcxMzgtOC42MTQ5OSwyMS4zODQwNC04LjYxNTAyLDguNTEyNzIsLjAwMDAzLDE1LjY0MDc0LDIuODcxNjgsMjEuMzg0MDQsOC42MTUwMiw1Ljc0NDA0LDUuNzQzMzcsOC42MTYwNiwxMi44NzEzNSw4LjYxNjA2LDIxLjM4NDA3djc4LjQ2MTI2YzAsMjAuMjA1NC03LjAwMDAyLDM3LjMwODEyLTIxLjAwMDA3LDUxLjMwODE3LTE0LjAwMDA1LDE0LjAwMDA1LTMxLjEwMjc2LDIxLjAwMDA3LTUxLjMwODE1LDIxLjAwMDA3bC00NTUuMzgzNDctLjAwMDAyWiIvPjwvc3ZnPg==';
  34. const settingsIcon = 'Unloaded';
  35. const contributeIcon = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJhIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MDAgNjAwLjAwMDAxIj48cGF0aCBkPSJNMjU1LjE4MjI3LDM2Ny43NzQxM2wtNzMuMzYxMjUtNzMuMzYwNDZjLTQuMzcyMTQtNC4zNzI2Ny05Ljg2NzkyLTYuNjA5NS0xNi40ODc0MS02LjcxMDU0LTYuNjE5NS0uMTAxNTgtMTIuMjE2NjEsMi4xMzUyOC0xNi43OTEzNyw2LjcxMDU0LTQuNTc0NzYsNC41NzQ3My02Ljg2MjExLDEwLjEyMTA5LTYuODYyMTEsMTYuNjM4OThzMi4yODczNSwxMi4wNjQyMiw2Ljg2MjExLDE2LjYzODk4bDg2LjY1OTk3LDg2LjY1OTk3YzUuNzA4NDUsNS43MDg0NSwxMi4zNjg0NSw4LjU2MjY2LDE5Ljk4MDA2LDguNTYyNjYsNy42MTEwOSwwLDE0LjI3MDg0LTIuODU0MjEsMTkuOTc5MjctOC41NjI2NmwxNzUuNjg4MzUtMTc1LjY4ODMzYzQuMzcyNjctNC4zNzIxNCw2LjYwOTUtOS44Njc5Miw2LjcxMDU0LTE2LjQ4NzM5LC4xMDE1OC02LjYxOTUyLTIuMTM1MjYtMTIuMjE2NjQtNi43MTA1NC0xNi43OTEzNS00LjU3NDc2LTQuNTc0NzYtMTAuMTIxMDktNi44NjIxNC0xNi42Mzg5OC02Ljg2MjE0cy0xMi4wNjQyMiwyLjI4NzM4LTE2LjYzODk4LDYuODYyMTRsLTE2Mi4zODk2NiwxNjIuMzg5NThabTQ0Ljg3MDY0LDIzMi4yMjU4OGMtNDEuNDkyNzUsMC04MC40OTM5MS03Ljg3MzcxLTExNy4wMDM0Ny0yMy42MjExMS0zNi41MTAxLTE1Ljc0NzQxLTY4LjI2ODYxLTM3LjExODUyLTk1LjI3NTUyLTY0LjExMzMzLTI3LjAwNzQ0LTI2Ljk5NTMyLTQ4LjM4ODI5LTU4LjczOTg4LTY0LjE0MjU0LTk1LjIzMzY3QzcuODc3MTMsMzgwLjUzODYyLDAsMzQxLjU0NTYzLDAsMzAwLjA1MjljMC00MS40OTI3NSw3Ljg3MzcxLTgwLjQ5Mzg4LDIzLjYyMTExLTExNy4wMDM0NywxNS43NDc0MS0zNi41MTAxMiwzNy4xMTg1Mi02OC4yNjg2LDY0LjExMzMyLTk1LjI3NTUyLDI2Ljk5NTMzLTI3LjAwNzQ1LDU4LjczOTg4LTQ4LjM4ODI1LDk1LjIzMzY3LTY0LjE0MjU0QzIxOS40NjEzNiw3Ljg3NzE3LDI1OC40NTQzNSwwLDI5OS45NDcxLDBzODAuNDkzODgsNy44NzM3LDExNy4wMDM0NywyMy42MjExYzM2LjUxMDEyLDE1Ljc0NzQsNjguMjY4NjQsMzcuMTE4NTYsOTUuMjc1NTIsNjQuMTEzMzQsMjcuMDA3NDUsMjYuOTk1MzYsNDguMzg4Myw1OC43Mzk5MSw2NC4xNDI1NCw5NS4yMzM2OSwxNS43NTQyNCwzNi40OTMyNiwyMy42MzEzNiw3NS40ODYyNSwyMy42MzEzNiwxMTYuOTc5cy03Ljg3MzcsODAuNDkzOTEtMjMuNjIxMSwxMTcuMDAzNDdjLTE1Ljc0NzQsMzYuNTEwMS0zNy4xMTg1Miw2OC4yNjg2MS02NC4xMTMzNCw5NS4yNzU1Mi0yNi45OTUzMSwyNy4wMDc0NC01OC43Mzk5MSw0OC4zODgyOS05NS4yMzM2NSw2NC4xNDI1NC0zNi40OTMyNiwxNS43NTQyNS03NS40ODYyNSwyMy42MzEzOC0xMTYuOTc5LDIzLjYzMTM0Wm0tLjA1Mjg4LTQ3LjM2Nzc1YzcwLjUyNjQ5LDAsMTMwLjI2MzUtMjQuNDczNzUsMTc5LjIxMS03My40MjEyNSw0OC45NDc1LTQ4Ljk0NzUsNzMuNDIxMjUtMTA4LjY4NDQ5LDczLjQyMTI1LTE3OS4yMTFzLTI0LjQ3Mzc1LTEzMC4yNjM1LTczLjQyMTI1LTE3OS4yMTEtMTA4LjY4NDUxLTczLjQyMTI1LTE3OS4yMTEtNzMuNDIxMjUtMTMwLjI2MzUsMjQuNDczNzUtMTc5LjIxMSw3My40MjEyNWMtNDguOTQ3NSw0OC45NDc1LTczLjQyMTI1LDEwOC42ODQ1MS03My40MjEyNSwxNzkuMjExczI0LjQ3Mzc1LDEzMC4yNjM1LDczLjQyMTI1LDE3OS4yMTFjNDguOTQ3NSw0OC45NDc1LDEwOC42ODQ0OSw3My40MjEyNSwxNzkuMjExLDczLjQyMTI1WiIvPjwvc3ZnPg==';
  36. const dontContributeIcon = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJhIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1OTkuOTk5OTggNjAwIj48cGF0aCBkPSJNMzAwLjA1MjksNjAwYy00MS40OTI3NSwwLTgwLjQ5MzktNy44NzM3MS0xMTcuMDAzNDctMjMuNjIxMTItMzYuNTEwMS0xNS43NDc0MS02OC4yNjg2MS0zNy4xMTg1MS05NS4yNzU1Mi02NC4xMTMzMy0yNy4wMDc0NC0yNi45OTUzMi00OC4zODgyOS01OC43Mzk4OC02NC4xNDI1NC05NS4yMzM2N0M3Ljg3NzEzLDM4MC41Mzg2LDAsMzQxLjU0NTYyLDAsMzAwLjA1Mjg5YzAtNDEuNDkyNzUsNy44NzM3MS04MC40OTM4OCwyMy42MjExMS0xMTcuMDAzNDcsMTUuNzQ3NDEtMzYuNTEwMTIsMzcuMTE4NTEtNjguMjY4NTksNjQuMTEzMzItOTUuMjc1NTIsMjYuOTk1MzMtMjcuMDA3NDUsNTguNzM5ODgtNDguMzg4MjUsOTUuMjMzNjctNjQuMTQyNTRDMjE5LjQ2MTM1LDcuODc3MTcsMjU4LjQ1NDM0LDAsMjk5Ljk0NzA5LDBzODAuNDkzODgsNy44NzM3LDExNy4wMDM0NywyMy42MjExYzM2LjUxMDEyLDE1Ljc0NzQsNjguMjY4NjQsMzcuMTE4NTYsOTUuMjc1NTIsNjQuMTEzMzQsMjcuMDA3NDUsMjYuOTk1MzYsNDguMzg4Myw1OC43Mzk5MSw2NC4xNDI1NCw5NS4yMzM2OSwxNS43NTQyNCwzNi40OTMyNiwyMy42MzEzNiw3NS40ODYyNCwyMy42MzEzNiwxMTYuOTc4OTlzLTcuODczNyw4MC40OTM5LTIzLjYyMTEsMTE3LjAwMzQ3Yy0xNS43NDc0LDM2LjUxMDEtMzcuMTE4NTEsNjguMjY4NjEtNjQuMTEzMzQsOTUuMjc1NTItMjYuOTk1MzEsMjcuMDA3NDQtNTguNzM5OTEsNDguMzg4MjktOTUuMjMzNjQsNjQuMTQyNTQtMzYuNDkzMjYsMTUuNzU0MjUtNzUuNDg2MjQsMjMuNjMxMzgtMTE2Ljk3ODk5LDIzLjYzMTM1Wm0tLjA1Mjg4LTQ3LjM2Nzc2YzI5LjYyNzk0LDAsNTguMTU4NTQtNS4wMTAyNyw4NS41OTE4MS0xNS4wMzA4MywyNy40MzMyMi0xMC4wMjAwMyw1Mi41MDYxNi0yNC41MjQwMSw3NS4yMTg4Ni00My41MTE5NkwxMDUuOTEwNTcsMTM5LjE4OTMzYy0xOC43ODUzMiwyMi43MTI3LTMzLjIzODc2LDQ3Ljc4NTY0LTQzLjM2MDM4LDc1LjIxODg2LTEwLjEyMTYsMjcuNDMzMjItMTUuMTgyNDEsNTUuOTYzODMtMTUuMTgyNDEsODUuNTkxODEsMCw3MC41MjY1MSwyNC40NzM3NSwxMzAuMjYzNSw3My40MjEyNCwxNzkuMjEwOTksNDguOTQ3NSw0OC45NDc1LDEwOC42ODQ0OSw3My40MjEyNCwxNzkuMjEwOTksNzMuNDIxMjRabTE5NC4wODk0Ni05MS44MjE1NmMxOC45ODc5OS0yMi43MTI2OCwzMy40OTE5Ni00Ny43ODU2NCw0My41MTE5NS03NS4yMTg4OSwxMC4wMjA1Mi0yNy40MzMyMiwxNS4wMzA4My01NS45NjM4MywxNS4wMzA4My04NS41OTE3OSwwLTcwLjUyNjQ4LTI0LjQ3Mzc1LTEzMC4yNjM1LTczLjQyMTI0LTE3OS4yMTA5OXMtMTA4LjY4NDUxLTczLjQyMTI0LTE3OS4yMTA5OS03My40MjEyNGMtMjkuNjk5MDEsMC01OC4yOTgwNCw0Ljk1OTQ3LTg1Ljc5NzA2LDE0Ljg3ODQ3LTI3LjQ5OTA0LDkuOTE5NDgtNTIuNTAzNTYsMjQuNDc0MjgtNzUuMDEzNjEsNDMuNjY0MzFMNDk0LjA4OTQ4LDQ2MC44MTA2OFoiLz48L3N2Zz4=';
  37. const shadowIcon = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJhIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1ODkuODEyMjYgNTkwLjIwNDEiPjxwYXRoIGQ9Ik01NzYuMzE4MzYsMjk3LjU3NTU2aC0uMTk1OTJjLTcuMDQwODMsLjExMDE3LTEyLjg4MTU5LDUuNzA2MTItMTMuMjg1NzEsMTIuNzM0NjItLjYwMDIyLDExLjAwOTk1LTEuODg2OSwyMS45NTU4MS0zLjgzMDU3LDMyLjc3ODkzLTIuNjk1MzcsMTUuMDA4NTQtNi42NjI3MiwyOS43Nzk0Mi0xMS44OTE4NSw0NC4xNDM1NS0uNTAyMDgsMS40NDQ4OS0uNzcxNDIsMi45NjMyNi0uNzcxNDIsNC40ODE2MywwLC41NTY1MiwuMDQ1MzUsMS4xMDIzNiwuMTEyMjQsMS42NDIwMywuODE5NTIsNi42MDg3LDYuNDkzMjMsMTEuODA0NjksMTMuMzA4MTcsMTEuODI3MzMsNS42ODE2NC0uMDEyMjEsMTAuNzYzMjQtMy42MjQ1MSwxMi42NDg5My04Ljk3NTUyLC4wMTIyNy0uMDEyMjEsLjAxMjI3LS4wMjQ0OCwuMDI0NTQtLjA0ODk1LDQuNzk4NC0xMy4xNTg1MSw4LjYzODM3LTI2LjYyNzc1LDExLjUxNDQ3LTQwLjI5ODk1LDMuMDE0MzQtMTQuMzI4MjUsNC45NjUyMS0yOC44Nzg5Nyw1LjgxNzYzLTQzLjUzMzg3LC4wMDkxNi0uMTU3OSwuMDIyMjItLjMxNTQzLC4wMzExMy0uNDczMzNsLjAxMjI3LS43NzE0MmMwLTcuNDA4MTQtNi4wODU2OS0xMy41MDYwNC0xMy40OTM5LTEzLjUwNjA0WiIvPjxwYXRoIGQ9Ik01MjUuOTY2ODYsNDUxLjEyODM2Yy0xLjYzOC0uNzE0NTQtMy40MzgyOS0xLjExNjA5LTUuMzI1OTktMS4xMTYwOS00LjMxMDI0LDAtOC4zNzU1NSwyLjA2OTQtMTAuOTEwMjgsNS41NzE0MS0uMDI0NDgsLjAzNjc0LS4wNjExNiwuMDczNDktLjA4NTY5LC4xMTAyMy01LjU0Njk0LDcuMTg3NzQtMTEuNDQ4OTcsMTQuMDgxNi0xNy42ODE2NCwyMC42NTcxLTEuMDA0MDMsMS4wNTMwNC0yLjQxMjIzLDEuNjA0MTMtMy44NDQ5MSwxLjUxODM3LTcuOTk5MTUtLjQ3MzM5LTE1Ljg5NzUyLTEuMzE4ODUtMjMuNjkxNzEtMi40ODQ1Ni0xMC41OTI3MS0xLjU4NDI5LTIwLjk4MDgzLTMuNzkyOTctMzEuMTI5NTgtNi41ODY2Ny05LjUyNTc2LTIuNjIyMTktMTguODQxLTUuNzUyODctMjcuOTExMzgtOS4zNzIzOC04LjgzODMyLTMuNTI2OTItMTcuNDQzNi03LjUxMzE4LTI1Ljc5MTE0LTExLjkyNTA1LTguMDQxNDQtNC4yNTAxMi0xNS44NDY1Ni04Ljg4OC0yMy4zODAxMy0xMy45MDM2OS03LjQ5NjctNC45OTEyMS0xNC43MjA5NS0xMC4zNTY5My0yMS42NjM4OC0xNi4wNTIzMS02LjgxMDc5LTUuNTg3MDQtMTMuMzQyNzEtMTEuNDk4MjMtMTkuNTcyMjctMTcuNzExNTUtNi4zMDM5Ni02LjI4NzU0LTEyLjMwNjctMTIuODczNjYtMTcuOTY2MDYtMTkuNzUwMTgtNS42NDI2NC02Ljg1NjE0LTEwLjk0NDc2LTEzLjk5NzAxLTE1Ljg5NzM0LTIxLjM4NjQxLTUuMDk2NjgtNy42MDQ0OS05LjgxMTE2LTE1LjQ3ODc2LTE0LjEyNDIxLTIzLjU5MTk4LTQuMzc5MjEtOC4yMzc0OS04LjM0Nzk2LTE2LjcxNzQxLTExLjg2MzU5LTI1LjQyMDIzLTMuNjk2NjYtOS4xNTA3Ni02Ljg5NzIyLTE4LjU0MzAzLTkuNTc1NDQtMjguMTQwNzUtMi43OTMwMy0xMC4wMDg5MS01LjAxMDA3LTIwLjI0MjU1LTYuNjIzMTctMzAuNjYwNjQtMS43NTcxNC0xMS4zNDg1MS0yLjgwMDg0LTIyLjkxMzMzLTMuMDY2MTYtMzQuNjUwMDktLjA0NTQ3LTIuMDExOTYtLjA3NDUyLTQuMDI3NTktLjA3NDUyLTYuMDQ5MTksMC0xMS4xNjg4OCwuNzEzNjgtMjIuMjY4ODYsMi4wODYzLTMzLjI0NjM0LDIuMDYwMTItMTYuNDc2MTQsNS42Mzk1OS0zMi42Njc0OCwxMC42NjExOS00OC4zNzczOCw4LjU1ODUzLTI2Ljc3NDksMjEuMjkwNDctNTIuMTQ5MzUsMzcuODM1NTctNzUuMTE5MzgsNi4wODg1LTguNDUyODIsMTIuNjkwMjUtMTYuNTgxMywxOS43ODgzMy0yNC4zMzQ0NywuOTkxODgtMS4wODk3OCwyLjQxMjI5LTEuNjY1MzQsMy44ODE2NS0xLjU5MTg2LC42NDIzMywuMDM0NzMsMS4zNTgwOSwuMDgwOTksMi4xMjEzNCwuMTM1MDEsOS43Mjc0OCwuNjg4ODQsMjguMjE2OCwyLjgxNjQ3LDI4LjYyNTYxLDMuMTM0NCw3LjE5OTk1LS4yNjk0MSwxMy4wMjg1Ni02LjI1NzE0LDEzLjAyODU2LTEzLjUxODM3LDAtNy4wMjg1Ni01LjQ4NTcyLTEyLjk0Mjg3LTEyLjQ4OTgxLTEzLjQ4MTYzLS4xMjI0NC0uMDEyMjctLjIzMjY3LS4wMjQ0OC0uMzU1MS0uMDM2NzQtMS40MjgwNC0uMjE2NDktMi44NTc2Ny0uNDIyNTUtNC4yODg2NC0uNjE4MjktOS45ODAyMi0xLjM2NTE3LTIwLjAyODI2LTIuMjI1NzEtMzAuMDk1MDMtMi41ODk5LS4zNTUxLS4wMTIyMS0uNjk3OTQtLjA2MTIyLTEuMDQwODMtLjE0NjkxLS44MzI2NC0uMjA4MTktMS42ODk3Ni0uMzQyODMtMi41NTkxNC0uMzkxODVoLTcuODg1NzRjLTEwLjgyOTI4LDAtMjEuNTI0OSwuNjE0NzUtMzIuMDY2MjIsMS43NzU2My0xNi4wMDI1NiwxLjc2MjI3LTMxLjYzNjg0LDQuODIyMDItNDYuNzk0MjUsOS4wNzgtMjIuMzEyOTMsNi4yNjUyLTQzLjU4NzA0LDE1LjExNTcyLTYzLjQ4MjEyLDI2LjE5ODM2LTQ4LjQ2MzIsMjYuOTk2Ny04OC43MTA2Myw2Ny4yNDQxNC0xMTUuNzA3MzQsMTE1LjcwNzM0LTExLjA4MjcsMTkuODk1MTQtMTkuOTMzMjksNDEuMTY5MzEtMjYuMTk4NDksNjMuNDgyMy00LjI1NTk4LDE1LjE1NzQxLTcuMzE1NzMsMzAuNzkxNjMtOS4wNzgsNDYuNzk0MTktMS4xNjA4OSwxMC41NDEzMi0xLjc3NTYzLDIxLjIzNjk0LTEuNzc1NjMsMzIuMDY2MjIsMCwyLjMwODA0LC4wMzQ4NSw0LjYwODQ2LC4wODg2OCw2LjkwNDU0LC4yNzYyNSwxMS43NzY5OCwxLjI3MSwyMy4zODc3LDIuOTE1MDQsMzQuODAxMTUsMS41MTg0MywxMC41NDEyLDMuNTg3NTIsMjAuOTE0MTIsNi4yMDU2MywzMS4wNzgxOSwyLjUxNjc4LDkuNzcwNjksNS41MjUzOSwxOS4zNTIzNiw5LjAwMDA2LDI4LjcxNjEzLDMuMzA3NjgsOC45MTM3LDcuMDMyOTYsMTcuNjMxNDcsMTEuMTU3OTYsMjYuMTI1ODUsNC4wNTkzOSw4LjM1OTEzLDguNTA2MSwxNi41MDA5MiwxMy4zMDk2MywyNC40MDY1Niw0LjY1OTEyLDcuNjY4MDMsOS42NjYxNCwxNS4xMDQyNSwxNC45ODE3NSwyMi4zMDIwNiw1LjMxNjQxLDcuMTk4ODUsMTAuOTUxNjYsMTQuMTQ4NzQsMTYuODgxODQsMjAuODM0MzUsNS44MzU1MSw2LjU3ODg2LDExLjk1MDkzLDEyLjkwMzY5LDE4LjMzOTQ4LDE4Ljk0NDM0LDYuNDc2MjYsNi4xMjM0MSwxMy4yMTk5MSwxMS45NjYwNiwyMC4yMjIxNywxNy40OTQwMiw2Ljk4NDgsNS41MTQyOCwxNC4yMjgyNywxMC43MTAyNywyMS42OTQxNSwxNS41ODk2Niw3LjY3NTYsNS4wMTY0OCwxNS41OTQ5Nyw5LjY4MjM3LDIzLjczMzcsMTMuOTgyNDgsOC4yNDI5Miw0LjM1NTE2LDE2LjcxMDYzLDguMzI5NzEsMjUuMzgxMjMsMTEuOTAyNTksOS4wNzI2OSwzLjczODY1LDE4LjM2NTA1LDcuMDM1MSwyNy44NTI0OCw5Ljg2MzcxLDkuODE1MTksMi45MjYyNywxOS44MzM2OCw1LjM1Nzk3LDMwLjAzMzE0LDcuMjUwNjcsMTAuOTc0MTIsMi4wMzY1LDIyLjE1NDI0LDMuNDQ4NjEsMzMuNTAwNDMsNC4yMTU3Niw2LjU1MDE3LC40NDI4NywxMy4xNTAzOSwuNjksMTkuODA0NjksLjY5LDUuNzkzNTIsMCwxMS41NjY3MS0uMTkxMjgsMTcuMzE4NzktLjUyOTcyLDE0LjcxNjEzLS44NjU5NywyOS4yNzI1Mi0yLjgyODYxLDQzLjU1OTk0LTUuODQzNjksMTguNjY5MzEtMy45Mzk4MiwzNi44NzcyNi05LjY2Mzc2LDU0LjM2OTM4LTE3LjA4NTU3LDM1LjU2MTQ2LTE1LjA4ODUsNjguMTcyNzktMzcuMTQ0MjMsOTUuNzA2OTctNjUuMjkyMDVsMi4wMjA0NS0yLjQ5NzkyYzguMjY1MzItOC41ODM2OCwxNi4wMDQwOS0xNy42NTcxNywyMy4xNjczLTI3LjE3MTQ1LC4wMTIyNy0uMDEyMjcsLjAyNDU0LS4wMzY3NCwuMDM2OC0uMDQ4OTUsMS44MzY2Ny0yLjM2MzI4LDIuODI4NTUtNS4yNjUzMiwyLjgyODU1LTguMjUzMTEsMC01LjUwNTA3LTMuMzc0MzktMTAuMjcyODktOC4xNDMzNy0xMi4zNTMyN1pNMTY4LjQ5NDA4LDU4LjYwMTE0TDU4LjY5Nzk0LDE2OC4zOTczNGMyNC45NjAwMi00Ni4yNzczNCw2My4xNjE2OC04NC43MDY0MiwxMDkuNzk2MTQtMTA5Ljc5NjJaTTM0LjcwNzE1LDIzMC4xMDQzMUwyMzAuMDM2NDQsMzQuNzc1MDJjOS44NTQzNy0yLjQ2MTA2LDE5LjkzMjA3LTQuMzgxMzUsMzAuMjA0NDEtNS43MTc5LDEuOTM0NjktLjI1NzE0LDMuODQ0OTEsLjY3MzUyLDQuODM2NzMsMi4zNTEwNywxLjAwNDA5LDEuNjg5NzYsLjkwNjEzLDMuODA4MTEtLjI0NDg3LDUuMzg3Ny0uMzg5MTYsLjUzNTY0LS43NjUyNiwxLjA3OTIyLTEuMTUwNTcsMS42MTcxOUwyNy40NTg1NiwyNzQuNjM2NzJjMS4xNjEzMi0xNS4xOTY3MiwzLjYxMzE2LTMwLjA3OTEsNy4yNDg2LTQ0LjUzMjQxWm0tNy40Mzg2LDgyLjQzODZMMjI0LjAwODMsMTE1LjgwMzE2Yy01LjQyNTE3LDE2LjA1MTMzLTkuNDcxOTgsMzIuNTYyODEtMTIuMDczNzksNDkuMzU3NkwzMS41NDEyLDM0NS41NTQwOGMtMi4wOTU3LTEwLjc5NjUxLTMuNTMzODctMjEuODEzOTYtNC4yNzI2NC0zMy4wMTExN1ptMTEuOTQ4MTIsNjMuMDUxODhMMjA4LjQ4NDgsMjA2LjMyNjY2Yy0uMDE4NDMsMS4zNDY1LS4wMzk5MiwyLjY5MjY5LS4wMzk5Miw0LjA0MDcxLDAsMTAuNjQ0MTcsLjU4ODUsMjEuMTc2NjQsMS43MTE1NSwzMS41NzE0N0w0OS40OTQyNiw0MDIuNjAxMDFjLTMuODkzMjUtOC43NzI0LTcuMzMyNzYtMTcuNzgyNDEtMTAuMjc3NTktMjcuMDA2MjNabTIyLjk3MzM5LDUyLjAyNjYxbDE1My4zMTE3MS0xNTMuMzExNzFjMi4yMTE5OCw5LjkwMjIyLDQuOTMwOTEsMTkuNjMxNDEsOC4xMjE1MiwyOS4xNjIyOUw3Ni43OTY5NCw0NTAuMjk4MzRjLTUuMjMyOTctNy4yOTk2Mi0xMC4xMTEzMy0xNC44NjYzMy0xNC42MDY4Ny0yMi42NzY5NFptMzEuMzA5NzUsNDMuNjkwMjVsMTQwLjcwNzI4LTE0MC43MDcyOGMzLjc5NTcyLDguNDU3MDksNy45OTI0OSwxNi43MDY3OSwxMi41NDM3NiwyNC43Mzk5OUwxMTEuODM2MTIsNDkwLjI1OTE2Yy02LjQxMjExLTYuMDE2Ni0xMi41MzMxNC0xMi4zMzg4MS0xOC4zMzYzLTE4Ljk0NzUxWm0zOC43MjQ0MywzNi4yNzU1N2wxMjkuMDg4NzUtMTI5LjA4ODc1YzUuMDY0NjQsNy4yODczNSwxMC40NDUwNywxNC4zNDcwNSwxNi4xMzQwOSwyMS4xNDk3MmwtMTIzLjIwMjIxLDEyMy4yMDIyMWMtNy41OTgwMi00LjcyNzY2LTE0Ljk0NTUtOS44MjQxNi0yMi4wMjA2My0xNS4yNjMxOFptNDYuMjk4NTgsMjguNzAxNDJsMTE2Ljk0NDk1LTExNi45NDQ5NWM2LjIyMDAzLDYuMjEzNjIsMTIuNzIzNzUsMTIuMTUwNTEsMTkuNDgzMDMsMTcuODAwNzJsLTExMC4yMjAyMSwxMTAuMjIwMjhjLTguOTU5OTYtMy4yMzgyMi0xNy43MDg0NC02LjkzMzktMjYuMjA3NzYtMTEuMDc2MDVabTU1LjI1OTg5LDE5Ljc0MDExbDEwMi41ODE2Ny0xMDIuNTgxNjdjNy4zOTcwOSw1LjEyMDYxLDE1LjA0MjkxLDkuOTE1NzcsMjIuOTIxNjMsMTQuMzYyMTJsLTkzLjcwNjg1LDkzLjcwNjkxYy0xMC43OTYyLTEuMTkzNzMtMjEuNDA5ODUtMy4wMzA0LTMxLjc5NjQ1LTUuNDg3MzdabTY3Ljk1Mzc0LDcuMDQ2MjZsODIuNjM0MDktODIuNjM0MDljOC43NDA0MiwzLjg4MzE4LDE3LjcyMDY0LDcuMzQxNjEsMjYuOTAzNjksMTAuMzgwMDdsLTY4LjEyMDQyLDY4LjEyMDQ4Yy0xMy42MiwyLjQ1MDItMjcuNDY2NjcsMy44MzY0OS00MS40MTczNiw0LjEzMzU0Wm05NC41NDIxMS0xOS41NDIxMWw0NC41OTktNDQuNTk5YzQuMTIyMDcsLjg5OTIzLDguMjc2MDYsMS43MTkzNiwxMi40NjUyNywyLjQ0NTY4LDEuOTIyNDksLjMzMDYzLDMuNDY1MzMsMS43NzU1MSwzLjkzMDYsMy42ODU3MywuNDUzMTIsMS44OTc5NS0uMjY5MzUsMy44OTM4Ni0xLjgzNjY3LDUuMDU3MTMtMTguMzIxNzgsMTMuNzA4NTYtMzguMjIxNjIsMjQuODk2NDgtNTkuMTU4MiwzMy40MTA0NloiLz48cGF0aCBkPSJNNTU1Ljg0NDkxLDIzMS44NjkzOGMuMTMyMzIsLjU0ODEsLjMwODExLDEuMDc2MDUsLjUwMzYsMS41OTM1NywxLjk1Nzc2LDUuMTgyMzcsNi45NTM5OCw4Ljc0MTE1LDEyLjU5ODQ1LDguNzQxMTVoLjAzNjc0YzcuMzgzNjcsMCwxMy40Njk0Mi02LjA4NTY5LDEzLjQ2OTQyLTEzLjQ2OTQyLDAtMS4wNTMwNC0uMTM0NzctMi4xMDYxNC0uMzc5NjQtMy4xMzQ3LTEuMTQxNDItNC43MjgyNy0yLjQwOTkxLTkuNDIwNDEtMy43ODMyLTE0LjA3ODgtMi43OTI5Ny05LjQ3NDE4LTYuMDU3NjItMTguNzk1ODQtOS43ODgzMy0yNy45Mjc4Ni01LjM1NjQ1LTEzLjExMTIxLTExLjY1ODg3LTI1LjgzNTYzLTE4Ljg3NzQ0LTM4LjA2MjY4bC0uMDYxMjItLjExMDIzYy0yLjYzMjYzLTMuNzQ2OTUtNy4wMDQwOS01LjkwMjA0LTExLjU5NTk1LTUuNzA2MTItNi43NTYxLC4yNzcxNi0xMi4yMzI0OCw1LjYyMDczLTEyLjgzMzc0LDEyLjI0NzMxLS4wMzYyNSwuMzk5MzUtLjA2MDEyLC44MDItLjA2MDEyLDEuMjA5ODQsMCwyLjA4MTYsLjQ3NzU0LDQuMTM4NzksMS40MDgxNCw2LDMuNjQ2OTEsNi4yMDEwNSw3LjAyNzE2LDEyLjU0NDE5LDEwLjE1MzY5LDE5LjAwNDcsNC4xMzk0Nyw4LjU1MzU5LDcuODIwNTYsMTcuMzE4NTQsMTEuMDIxMywyNi4yNjI0NSwzLjIxMzEzLDguOTc4NTgsNS45NTE4NCwxOC4xMzMsOC4xODgyOSwyNy40MzA3OVoiLz48cGF0aCBkPSJNNDEyLjE2MzI3LDUzLjUxMDE5di4wMTIyN2M1LjM2NjU4LDIuNTk2MDEsMTAuNjM0MjIsNS4zNzczOCwxNS44MDU3Myw4LjMyMDAxLDcuODMxMTIsNC40NTU5MywxNS40MzIxOSw5LjI5NywyMi43Njg2OCwxNC41MTUwOCw3LjI5MjYsNS4xODY4MywxNC4zMjE5LDEwLjc0NTczLDIxLjA2OTQ2LDE2LjY0Njc5LDEuNzkzODgsMS41Njg4NSwzLjU3NDcxLDMuMTUzNTYsNS4zMjc1OCw0Ljc3MTE4bC4wMjQ0OCwuMDI0NDhjMi40MjQ1LDIuMjY1MzIsOS4xOTU5MiwyLjk2MzI2LDkuMTk1OTIsMi45NjMyNiw3LjMyMjUxLS4wOTc5LDEzLjI4NTc3LTYuMTQ2OTEsMTMuMjg1NzctMTMuNDY5MzYsMC0zLjczNDY4LTEuNTU1MTgtNy4zMTAxOC00LjI5Nzk3LTkuODU3MTItMjEuMzE4NDItMTkuNDY5NDItNDUuMzc5NjQtMzUuNjkzOTEtNzEuNDAwMDItNDguMTcxNDUtLjAxMjI3LDAtLjAyNDQ4LDAtLjAyNDQ4LS4wMTIyNy0xLjc4Nzc4LS44NjkzOC0zLjc0Njk1LTEuMzIyNDUtNS43NDI4Ni0xLjM0NjkyaC0uMTU5MThjLTcuMzgzNjcsMC0xMy40Njk0Miw2LjA4NTY5LTEzLjQ2OTQyLDEzLjQ2OTM2LDAsMS43OTc2MSwuMzY1OTEsMy41Mzg1MSwxLjAyOTQ4LDUuMTQzMzEsMS4yNDQwMiwzLjAwODQyLDMuNTUyNDMsNS41MzAwOSw2LjU4Njg1LDYuOTkxMzlaIi8+PC9zdmc+';
  38. const logo = 'data:image/png;base64,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';
  39.  
  40. function semverCompare(current, latest) {
  41. if (current.startsWith(latest + '-'))
  42. return -1;
  43. if (latest.startsWith(current + '-'))
  44. return 1;
  45. return current.localeCompare(latest, undefined, { numeric: true, sensitivity: 'case', caseFirst: 'upper' }) === -1;
  46. }
  47. function init$d(elements) {
  48. GM.xmlHttpRequest({
  49. method: 'GET',
  50. url: `https://github.com/Mikarific/InfiniteCraftHelper/raw/main/gorilla.json`,
  51. onload: (response) => {
  52. if (response.status === 200) {
  53. const responseJSON = JSON.parse(response.responseText);
  54. if (semverCompare(GM.info.script.version, responseJSON.version)) {
  55. const outdatedModal = document.createElement('dialog');
  56. outdatedModal.classList.add('modal');
  57. elements.container.appendChild(outdatedModal);
  58. const outdatedHeader = document.createElement('div');
  59. outdatedHeader.classList.add('modal-header');
  60. const outdatedTitle = document.createElement('h1');
  61. outdatedTitle.classList.add('modal-title');
  62. outdatedTitle.appendChild(document.createTextNode('Infinite Craft Helper is out of date!'));
  63. outdatedHeader.appendChild(outdatedTitle);
  64. const closeButtonContainer = document.createElement('div');
  65. closeButtonContainer.classList.add('close-button-container');
  66. const closeButton = document.createElement('img');
  67. closeButton.src = closeIcon.trim();
  68. closeButton.classList.add('close-button');
  69. closeButtonContainer.appendChild(closeButton);
  70. outdatedHeader.appendChild(closeButtonContainer);
  71. outdatedModal.appendChild(outdatedHeader);
  72. const versionText = document.createElement('div');
  73. versionText.classList.add('modal-text');
  74. versionText.appendChild(document.createTextNode(`You are on v${GM.info.script.version}! The latest verion is v${responseJSON.version}!`));
  75. outdatedModal.appendChild(versionText);
  76. const buttonContainer = document.createElement('div');
  77. buttonContainer.classList.add('modal-button-container');
  78. const updateButton = document.createElement('a');
  79. updateButton.classList.add('item');
  80. updateButton.href = responseJSON.downloadURL;
  81. updateButton.appendChild(document.createTextNode('Update'));
  82. buttonContainer.appendChild(updateButton);
  83. const continueButton = document.createElement('button');
  84. continueButton.classList.add('item');
  85. continueButton.appendChild(document.createTextNode('Continue Anyways'));
  86. buttonContainer.appendChild(continueButton);
  87. outdatedModal.appendChild(buttonContainer);
  88. outdatedModal.showModal();
  89. closeButton.addEventListener('click', (e) => {
  90. outdatedModal.close();
  91. });
  92. continueButton.addEventListener('click', (e) => {
  93. outdatedModal.close();
  94. });
  95. }
  96. }
  97. },
  98. });
  99. }
  100.  
  101. function init$c(elements) {
  102. if (elements.favicon !== null) {
  103. const whiteFaviconLink = elements.favicon.cloneNode();
  104. elements.favicon.media = '(prefers-color-scheme:light)';
  105. whiteFaviconLink.media = '(prefers-color-scheme:dark)';
  106. whiteFaviconLink.href = whiteFavicon.trim();
  107. elements.favicon.after(whiteFaviconLink);
  108. }
  109. }
  110.  
  111. const css = `
  112. .dark-mode .site-title, .dark-mode .instruction-icon, .dark-mode .settings-button, .dark-mode .setting > img, .dark-mode .close-button {
  113. filter: invert(1);
  114. }
  115.  
  116. .dark-mode {
  117. scrollbar-color: var(--border-color) #262626;
  118. }
  119.  
  120. .item {
  121. margin: 4px;
  122. cursor: pointer;
  123. padding: 8px 8px 7px;
  124. border-radius: 5px;
  125. display: inline-block;
  126. -webkit-user-select: none;
  127. -moz-user-select: none;
  128. user-select: none;
  129. border: 1px solid var(--border-color);
  130. transition: background .15s linear;
  131. background: var(--item-bg);
  132. line-height: 1em;
  133. color: var(--text-color);
  134. white-space: nowrap;
  135. }
  136.  
  137. .item:hover {
  138. background: var(--instance-bg-hover);
  139. border: 1px solid var(--instance-border-hover);
  140. }
  141.  
  142. @media screen and (min-width: 1150px) {
  143. .item {
  144. font-size: 16.4px;
  145. padding: 9px 10px 8px;
  146. }
  147. }
  148.  
  149. .pinned {
  150. max-width: 900px;
  151. margin-left: auto;
  152. margin-right: auto;
  153. padding: 9px;
  154. border: 0px;
  155. border-bottom: 1px;
  156. border-style: solid;
  157. border-color: var(--border-color);
  158. }
  159.  
  160. .pinned-title {
  161. margin: 4px;
  162. font-size: 15px;
  163. font-family: Roboto, sans-serif;
  164. color: var(--text-color);
  165. -webkit-user-select: none;
  166. -moz-user-select: none;
  167. user-select: none;
  168. pointer-events: none;
  169. }
  170.  
  171. .sidebar {
  172. width: var(--sidebar-size) !important;
  173. }
  174.  
  175. .resize-bar {
  176. position: absolute;
  177. height: 100%;
  178. width: 5px;
  179. right: calc(var(--sidebar-size) - 3px);
  180. z-index: 10;
  181. cursor: ew-resize;
  182. }
  183.  
  184. .sidebar-header {
  185. display: flex;
  186. position: sticky;
  187. height: auto !important;
  188. top: 0px;
  189. background-color: var(--background-color) !important;
  190. max-width: 900px;
  191. margin-left: auto;
  192. margin-right: auto;
  193. padding: 9px;
  194. border: 0px;
  195. border-bottom: 1px;
  196. border-style: solid;
  197. border-color: var(--border-color);
  198. z-index: 1;
  199. }
  200.  
  201. .sidebar-search {
  202. width: 100%;
  203. }
  204.  
  205. .sidebar-input {
  206. height: 40px !important;
  207. margin: 4px;
  208. border-radius: 5px;
  209. border: 1px solid var(--border-color) !important;
  210. font-family: Roboto, sans-serif;
  211. background-size: 21px 21px !important;
  212. background-position: 10px 10px !important;
  213. color: var(--text-color);
  214. }
  215.  
  216.  
  217. .side-controls {
  218. right: calc(var(--sidebar-size) + 9px) !important;
  219. z-index: 1;
  220. }
  221.  
  222. .random, .discoveries-icon {
  223. width: 21px;
  224. cursor: pointer;
  225. opacity: .8;
  226. -webkit-user-select: none;
  227. -moz-user-select: none;
  228. user-select: none;
  229. }
  230.  
  231. .random:hover, .discoveries-icon:hover {
  232. transform: scale(1.05);
  233. }
  234.  
  235. .modal {
  236. max-width: 75%;
  237. max-height: 75%;
  238. margin: auto;
  239. padding-top: 0px;
  240. border: 1px solid var(--border-color);
  241. border-radius: 5px;
  242. background-color: var(--background-color);
  243. }
  244.  
  245. .modal::backdrop {
  246. background-color: rgb(0 0 0 / .5);
  247. }
  248.  
  249. .modal-header {
  250. position: sticky;
  251. top: 0;
  252. display: flex;
  253. gap: 1rem;
  254. padding-top: 16px;
  255. padding-bottom: 16px;
  256. justify-content: space-between;
  257. background-color: var(--background-color);
  258. }
  259.  
  260. .modal-title {
  261. font-size: 20px;
  262. font-family: Roboto, sans-serif;
  263. line-height: 35px;
  264. color: var(--text-color);
  265. -webkit-user-select: none;
  266. -moz-user-select: none;
  267. user-select: none;
  268. }
  269.  
  270. .modal-text {
  271. font-size: 15px;
  272. font-family: Roboto, sans-serif;
  273. color: var(--text-color);
  274. text-align: center;
  275. -webkit-user-select: none;
  276. -moz-user-select: none;
  277. user-select: none;
  278. pointer-events: none;
  279. }
  280.  
  281. .display-item {
  282. margin: 4px;
  283. padding: 8px 8px 7px;
  284. border-radius: 5px;
  285. display: inline-block;
  286. -webkit-user-select: none;
  287. -moz-user-select: none;
  288. user-select: none;
  289. border: 1px solid var(--border-color);
  290. background: var(--item-bg);
  291. line-height: 1em;
  292. white-space: nowrap;
  293. color: var(--text-color);
  294. }
  295.  
  296. @media screen and (min-width: 1150px) {
  297. .display-item {
  298. font-size: 16.4px;
  299. padding: 9px 10px 8px;
  300. }
  301. }
  302.  
  303. .recipe {
  304. display: flex;
  305. align-items: center;
  306. color: var(--text-color);
  307. -webkit-user-select: none;
  308. -moz-user-select: none;
  309. user-select: none;
  310. }
  311.  
  312. .modal-button-container {
  313. display: flex;
  314. align-items: center;
  315. justify-content: center;
  316. padding-top: 16px;
  317. color: var(--text-color);
  318. -webkit-user-select: none;
  319. -moz-user-select: none;
  320. user-select: none;
  321. }
  322.  
  323. .modal-button-container > .item {
  324. font-family: Roboto, sans-serif;
  325. font-size: 15.4px;
  326. text-decoration: auto;
  327. }
  328.  
  329. .close-button-container {
  330. display: flex;
  331. border: 1px solid var(--border-color);
  332. border-radius: 5px;
  333. }
  334.  
  335.  
  336. .instance-emoji {
  337. pointer-events: none;
  338. }
  339. `;
  340. function init$b(elements) {
  341. elements.styles.appendChild(document.createTextNode(css.trim()));
  342. document.getElementsByTagName('head')[0].appendChild(elements.styles);
  343. }
  344.  
  345. function setMiddleClickOnMutations(mutations, elements) {
  346. for (const mutation of mutations) {
  347. if (mutation.addedNodes.length > 0) {
  348. for (const node of mutation.addedNodes) {
  349. node.addEventListener('mousedown', (e) => {
  350. e.preventDefault();
  351. if (e instanceof MouseEvent &&
  352. e.button === 1 &&
  353. e.target instanceof HTMLElement &&
  354. (e.target.classList.contains('instance') ||
  355. e.target.classList.contains('instance-discovered-text') ||
  356. e.target.classList.contains('instance-discovered-emoji'))) {
  357. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].playInstanceSound();
  358. const targetElement = e.target.classList.contains('instance-discovered-emoji')
  359. ? e.target.parentElement?.parentElement
  360. : e.target.classList.contains('instance-discovered-text')
  361. ? e.target.parentElement
  362. : e.target;
  363. const { x, y, width, height } = targetElement.getBoundingClientRect();
  364. const data = {
  365. id: unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.instanceId++,
  366. text: targetElement.childNodes[1].textContent?.trim(),
  367. emoji: targetElement.childNodes[0].textContent?.trim(),
  368. discovered: targetElement.classList.contains('instance-discovered'),
  369. disabled: false,
  370. left: x,
  371. top: y,
  372. offsetX: 0.5,
  373. offsetY: 0.5,
  374. hasMoved: false,
  375. fromPanel: false,
  376. };
  377. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.selectedInstance = cloneInto(data, unsafeWindow);
  378. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.instances.push(unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.selectedInstance);
  379. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].$nextTick(exportFunction(() => {
  380. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].setInstancePosition(unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.selectedInstance, e.clientX - width / 2, e.clientY - height / 2);
  381. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].setInstanceZIndex(unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.selectedInstance, data.id);
  382. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.selectedInstance.elem.addEventListener('mouseup', exportFunction((e) => {
  383. if (!unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.selectedInstance.hasMoved) {
  384. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.selectedInstance.hasMoved =
  385. true;
  386. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].calcInstanceSize(unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.selectedInstance);
  387. }
  388. }, unsafeWindow));
  389. }, unsafeWindow));
  390. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.mouseDown = true;
  391. }
  392. });
  393. }
  394. }
  395. }
  396. }
  397. async function addElementToCrafts(first, second, result, loading = false) {
  398. const ingredients = [first, second].sort((a, b) => {
  399. return a.text.localeCompare(b.text);
  400. });
  401. if (recipes[result] === undefined)
  402. recipes[result] = [];
  403. if (recipes[result].find((recipe) => recipe[0].text === ingredients[0].text && recipe[1].text === ingredients[1].text) !== undefined)
  404. return;
  405. recipes[result].push([
  406. {
  407. text: ingredients[0].text,
  408. emoji: ingredients[0].emoji ?? '⬜',
  409. },
  410. {
  411. text: ingredients[1].text,
  412. emoji: ingredients[1].emoji ?? '⬜',
  413. },
  414. ]);
  415. if (!loading)
  416. await GM.setValue('recipes', JSON.stringify(recipes));
  417. }
  418. function openCraftsForElement(element) {
  419. craftsTitle.innerHTML = '';
  420. const titleEmoji = document.createElement('span');
  421. titleEmoji.classList.add('display-item-emoji');
  422. titleEmoji.appendChild(document.createTextNode(element.emoji ?? '⬜'));
  423. craftsTitle.appendChild(titleEmoji);
  424. craftsTitle.appendChild(document.createTextNode(` ${element.text} `));
  425. craftsContainer.innerHTML = '';
  426. const elementRecipes = recipes[element.text];
  427. if (elementRecipes === undefined) {
  428. const recipesEmpty = document.createElement('div');
  429. recipesEmpty.classList.add('modal-text');
  430. recipesEmpty.appendChild(document.createTextNode("I don't know how to craft this element!"));
  431. craftsContainer.appendChild(recipesEmpty);
  432. }
  433. else {
  434. const recipeKeys = Object.keys(recipes);
  435. for (const elementRecipe of elementRecipes) {
  436. const recipeDiv = document.createElement('div');
  437. recipeDiv.classList.add('recipe');
  438. const firstDiv = document.createElement('div');
  439. recipeKeys.includes(elementRecipe[0].text)
  440. ? firstDiv.classList.add('item')
  441. : firstDiv.classList.add('display-item');
  442. const firstEmoji = document.createElement('span');
  443. recipeKeys.includes(elementRecipe[0].text)
  444. ? firstEmoji.classList.add('item-emoji')
  445. : firstEmoji.classList.add('display-item-emoji');
  446. firstEmoji.appendChild(document.createTextNode(elementRecipe[0].emoji ?? '⬜'));
  447. firstDiv.appendChild(firstEmoji);
  448. firstDiv.appendChild(document.createTextNode(` ${elementRecipe[0].text} `));
  449. if (recipeKeys.includes(elementRecipe[0].text)) {
  450. firstDiv.addEventListener('click', () => {
  451. openCraftsForElement(elementRecipe[0]);
  452. });
  453. }
  454. recipeDiv.appendChild(firstDiv);
  455. recipeDiv.appendChild(document.createTextNode('+'));
  456. const secondDiv = document.createElement('div');
  457. recipeKeys.includes(elementRecipe[1].text)
  458. ? secondDiv.classList.add('item')
  459. : secondDiv.classList.add('display-item');
  460. const secondEmoji = document.createElement('span');
  461. recipeKeys.includes(elementRecipe[1].text)
  462. ? secondEmoji.classList.add('item-emoji')
  463. : secondEmoji.classList.add('display-item-emoji');
  464. secondEmoji.appendChild(document.createTextNode(elementRecipe[1].emoji ?? '⬜'));
  465. secondDiv.appendChild(secondEmoji);
  466. secondDiv.appendChild(document.createTextNode(` ${elementRecipe[1].text} `));
  467. if (recipeKeys.includes(elementRecipe[1].text)) {
  468. secondDiv.addEventListener('click', () => {
  469. openCraftsForElement(elementRecipe[1]);
  470. });
  471. }
  472. recipeDiv.appendChild(secondDiv);
  473. recipeDiv.appendChild(document.createTextNode('='));
  474. const resultDiv = document.createElement('div');
  475. resultDiv.classList.add('display-item');
  476. const resultEmoji = document.createElement('span');
  477. resultEmoji.classList.add('display-item-emoji');
  478. resultEmoji.appendChild(document.createTextNode(element.emoji ?? '⬜'));
  479. resultDiv.appendChild(resultEmoji);
  480. resultDiv.appendChild(document.createTextNode(` ${element.text} `));
  481. recipeDiv.appendChild(resultDiv);
  482. craftsContainer.appendChild(recipeDiv);
  483. }
  484. }
  485. craftsModal.showModal();
  486. }
  487. async function resetCrafts() {
  488. recipes = {};
  489. await GM.setValue('recipes', '{}');
  490. }
  491.  
  492. const discoveriesModal = document.createElement('dialog');
  493. const discoveriesHeader = document.createElement('div');
  494. const discoveriesEmpty = document.createElement('div');
  495. function init$9(elements) {
  496. const discoveriesImage = document.createElement('img');
  497. discoveriesImage.src = discoveriesIcon.trim();
  498. discoveriesImage.classList.add('discoveries-icon');
  499. elements.sideControls.appendChild(discoveriesImage);
  500. discoveriesModal.classList.add('modal');
  501. elements.container.appendChild(discoveriesModal);
  502. discoveriesHeader.classList.add('modal-header');
  503. const discoveriesTitle = document.createElement('h1');
  504. discoveriesTitle.classList.add('modal-title');
  505. discoveriesTitle.appendChild(document.createTextNode('Your First Discoveries'));
  506. discoveriesHeader.appendChild(discoveriesTitle);
  507. const closeButtonContainer = document.createElement('div');
  508. closeButtonContainer.classList.add('close-button-container');
  509. const closeButton = document.createElement('img');
  510. closeButton.src = closeIcon.trim();
  511. closeButton.classList.add('close-button');
  512. closeButtonContainer.appendChild(closeButton);
  513. discoveriesHeader.appendChild(closeButtonContainer);
  514. discoveriesModal.appendChild(discoveriesHeader);
  515. discoveriesEmpty.classList.add('modal-text');
  516. discoveriesEmpty.appendChild(document.createTextNode("You don't have any first discoveries!"));
  517. discoveriesModal.appendChild(discoveriesEmpty);
  518. const discoveredElements = cloneInto(unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.elements, unsafeWindow).filter((el) => el.discovered === true);
  519. for (const discoveredElement of discoveredElements) {
  520. addElementToDiscoveries(discoveredElement);
  521. }
  522. discoveriesImage.addEventListener('click', (e) => {
  523. discoveriesModal.showModal();
  524. });
  525. closeButton.addEventListener('click', (e) => {
  526. discoveriesModal.close();
  527. });
  528. }
  529. function addElementToDiscoveries(element) {
  530. const recipeKeys = Object.keys(recipes);
  531. const elementDiv = document.createElement('div');
  532. recipeKeys.includes(element.text) ? elementDiv.classList.add('item') : elementDiv.classList.add('display-item');
  533. const elementEmoji = document.createElement('span');
  534. recipeKeys.includes(element.text)
  535. ? elementEmoji.classList.add('item-emoji')
  536. : elementEmoji.classList.add('display-item-emoji');
  537. elementEmoji.appendChild(document.createTextNode(element.emoji ?? '⬜'));
  538. elementDiv.appendChild(elementEmoji);
  539. elementDiv.appendChild(document.createTextNode(` ${element.text} `));
  540. if (recipeKeys.includes(element.text)) {
  541. elementDiv.addEventListener('click', () => {
  542. openCraftsForElement(element);
  543. });
  544. }
  545. discoveriesModal.appendChild(elementDiv);
  546. discoveriesEmpty.style.display = 'none';
  547. }
  548. function resetDiscoveries() {
  549. discoveriesModal.innerHTML = '';
  550. discoveriesModal.appendChild(discoveriesHeader);
  551. discoveriesModal.appendChild(discoveriesEmpty);
  552. discoveriesEmpty.style.display = '';
  553. }
  554.  
  555. let contributeToDatabase = false;
  556. function init$8(elements) {
  557. const settingsDetails = document.createElement('details');
  558. settingsDetails.classList.add('settings-details');
  559. elements.sidebarHeader.appendChild(settingsDetails);
  560. elements.sidebarHeader.style.opacity = '0'
  561. const settingsSummary = document.createElement('summary');
  562. settingsSummary.classList.add('settings-summary');
  563. settingsDetails.appendChild(settingsSummary);
  564. document.addEventListener('click', function (e) {
  565. const target = e.target;
  566. });
  567. contributeToDatabase = localStorage.getItem('contributeToDatabase') === 'false' ? false : true;
  568. const contributeContainer = document.createElement('div');
  569. contributeContainer.classList.add('setting');
  570. const contributeText = document.createTextNode('Share Crafts?');
  571. contributeContainer.appendChild(contributeText);
  572. const contributeImage = document.createElement('img');
  573. if (!contributeToDatabase) {
  574. contributeImage.src = dontContributeIcon.trim();
  575. }
  576. else {
  577. contributeImage.src = contributeIcon.trim();
  578. }
  579. contributeContainer.appendChild(contributeImage);
  580. elements.settingsContent.appendChild(contributeContainer);
  581. contributeContainer.addEventListener('click', (e) => {
  582. if (!contributeToDatabase) {
  583. contributeToDatabase = true;
  584. contributeImage.src = contributeIcon.trim();
  585. localStorage.setItem('contributeToDatabase', 'true');
  586. }
  587. else {
  588. contributeToDatabase = false;
  589. contributeImage.src = dontContributeIcon.trim();
  590. localStorage.setItem('contributeToDatabase', 'false');
  591. }
  592. });
  593. }
  594.  
  595. const pinnedContainer = document.createElement('div');
  596. const pinnedTitle = document.createElement('div');
  597. let pinnedElements = [];
  598. async function init$7(elements) {
  599. pinnedContainer.classList.add('pinned');
  600. pinnedTitle.classList.add('pinned-title');
  601. pinnedTitle.appendChild(document.createTextNode('Pinned Elements'));
  602. pinnedContainer.appendChild(pinnedTitle);
  603. pinnedElements = JSON.parse((await GM.getValue('pinned')) ?? '[]');
  604. if (pinnedElements.length === 0)
  605. pinnedContainer.style.display = 'none';
  606. for (const pinnedElement of pinnedElements) {
  607. const elementDiv = document.createElement('div');
  608. elementDiv.classList.add('item');
  609. const elementEmoji = document.createElement('span');
  610. elementEmoji.classList.add('item-emoji');
  611. elementEmoji.appendChild(document.createTextNode(pinnedElement.emoji ?? '⬜'));
  612. elementDiv.appendChild(elementEmoji);
  613. elementDiv.appendChild(document.createTextNode(` ${pinnedElement.text} `));
  614. elementDiv.addEventListener('mousedown', (e) => {
  615. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].selectElement(e, cloneInto(pinnedElement, unsafeWindow));
  616. });
  617. pinnedContainer.appendChild(elementDiv);
  618. }
  619. elements.items.before(pinnedContainer);
  620. }
  621. async function pinElement(element, loading = false) {
  622. if (pinnedElements.find((el) => el.text === element.text) === undefined) {
  623. if (!loading)
  624. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].playInstanceSound();
  625. const elementDiv = document.createElement('div');
  626. elementDiv.classList.add('item');
  627. const elementEmoji = document.createElement('span');
  628. elementEmoji.classList.add('item-emoji');
  629. elementEmoji.appendChild(document.createTextNode(element.emoji ?? '⬜'));
  630. elementDiv.appendChild(elementEmoji);
  631. elementDiv.appendChild(document.createTextNode(` ${element.text} `));
  632. elementDiv.addEventListener('mousedown', (e) => {
  633. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].selectElement(e, element);
  634. });
  635. pinnedContainer.appendChild(elementDiv);
  636. if (pinnedElements.length === 0)
  637. pinnedContainer.style.display = '';
  638. pinnedElements.push(element);
  639. if (!loading)
  640. await GM.setValue('pinned', JSON.stringify(pinnedElements));
  641. }
  642. else {
  643. if (!loading)
  644. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.deleteSound.play();
  645. const elementDiv = Array.from(pinnedContainer.querySelectorAll('.item')).find((el) => el.childNodes[1].textContent?.trim() === element.text);
  646. elementDiv?.remove();
  647. if (pinnedElements.length === 1)
  648. pinnedContainer.style.display = 'none';
  649. pinnedElements = pinnedElements.filter((el) => el !== element);
  650. if (!loading)
  651. await GM.setValue('pinned', JSON.stringify(pinnedElements));
  652. }
  653. }
  654. async function resetPinnedElements() {
  655. pinnedContainer.innerHTML = '';
  656. pinnedContainer.appendChild(pinnedTitle);
  657. pinnedContainer.style.display = 'none';
  658. pinnedElements = [];
  659. await GM.setValue('pinned', '[]');
  660. }
  661.  
  662. function init$6(elements) {
  663. // Detect when fetch is monkeypatched because a certain someone made a tool to upload fake recipes.
  664. const iframe = document.createElement('iframe');
  665. document.body.appendChild(iframe);
  666. const cleanFetch = iframe.contentWindow?.fetch?.toString() ?? '';
  667. iframe.remove();
  668. // New Element Crafted
  669. const getCraftResponse = unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].getCraftResponse;
  670. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].getCraftResponse = exportFunction((...args) => new window.Promise(async (resolve) => {
  671. const response = await getCraftResponse(...args);
  672. const args0 = args[0].wrappedJSObject === undefined ? args[0] : args[0].wrappedJSObject;
  673. const args1 = args[1].wrappedJSObject === undefined ? args[1] : args[1].wrappedJSObject;
  674. const ingredients = args0.text.localeCompare(args1.text, 'en') === -1 ? [args0, args1] : [args1, args0];
  675. const first = ingredients[0];
  676. const second = ingredients[1];
  677. const result = {
  678. text: response.result,
  679. emoji: response.emoji,
  680. discovered: response.isNew,
  681. };
  682. if (first.text === '')
  683. return resolve(response);
  684. if (second.text === '')
  685. return resolve(response);
  686. if (result.text === '' || result.text === 'Nothing')
  687. return resolve(response);
  688. if (contributeToDatabase && unsafeWindow.fetch.toString() === cleanFetch) {
  689. GM.xmlHttpRequest({
  690. method: 'POST',
  691. url: `https://infinitecraft.mikarific.com/recipe`,
  692. data: JSON.stringify({
  693. first: {
  694. text: first.text,
  695. emoji: first.emoji,
  696. },
  697. second: {
  698. text: second.text,
  699. emoji: second.emoji,
  700. },
  701. result: {
  702. text: result.text,
  703. emoji: result.emoji,
  704. },
  705. }),
  706. headers: {
  707. 'Content-Type': 'application/json',
  708. Origin: 'https://neal.fun/infinite-craft/',
  709. },
  710. });
  711. }
  712. addElementToCrafts({
  713. text: first.text,
  714. emoji: first.emoji,
  715. }, {
  716. text: second.text,
  717. emoji: second.emoji,
  718. }, result.text);
  719. if (result.discovered) {
  720. addElementToDiscoveries(result);
  721. }
  722. console.log(`${first.text} + ${second.text} = ${result.text}`);
  723. resolve(response);
  724. }), unsafeWindow);
  725. const selectElement = unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].selectElement;
  726. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].selectElement = exportFunction((e, element) => {
  727. element = element.wrappedJSObject === undefined ? element : element.wrappedJSObject;
  728. if (e.button === 2) {
  729. openCraftsForElement(element);
  730. return;
  731. }
  732. if (e.altKey) {
  733. pinElement(element);
  734. return;
  735. }
  736. return selectElement(e, element);
  737. }, unsafeWindow);
  738. const instanceObserver = new MutationObserver((mutations) => {
  739. setMiddleClickOnMutations(mutations);
  740. });
  741. instanceObserver.observe(elements.instances, { childList: true, subtree: true });
  742. const oldResetButton = document.querySelector('.reset');
  743. const resetButton = oldResetButton.cloneNode(true);
  744. oldResetButton.parentNode?.replaceChild(resetButton, oldResetButton);
  745. resetButton.addEventListener('click', async () => {
  746. const confirmation = confirm('Are you sure? This will delete all your progress!');
  747. if (confirmation) {
  748. localStorage.removeItem('infinite-craft-data');
  749. await resetPinnedElements();
  750. await resetCrafts();
  751. location.reload();
  752. }
  753. });
  754. }
  755.  
  756. let sidebarSize = 0;
  757. let resizing = false;
  758. function onResize() {
  759. sidebarSize =
  760. window.innerWidth > 800 ? Math.min(Math.min(Math.max(sidebarSize, 305), 900), window.innerWidth - 100) : 0;
  761. document.documentElement.style.setProperty('--sidebar-size', `${sidebarSize}px`);
  762. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.sidebarSize = sidebarSize;
  763. for (const instance of unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.instances) {
  764. instance.width || unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].calcInstanceSize(instance),
  765. instance.left + instance.width + 10 > window.innerWidth - sidebarSize &&
  766. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].setInstancePosition(instance, window.innerWidth - sidebarSize - instance.width - 10, instance.top),
  767. instance.top + instance.height + 10 > window.innerHeight &&
  768. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].setInstancePosition(instance, instance.left, window.innerHeight - instance.height - 10);
  769. }
  770. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].checkControlsBlur();
  771. }
  772. function init$5(elements) {
  773. sidebarSize =
  774. window.innerWidth > 800
  775. ? unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.sidebarSize > 310
  776. ? 350
  777. : 305
  778. : 0;
  779. document.documentElement.style.setProperty('--sidebar-size', `${sidebarSize}px`);
  780. const resizeBar = document.createElement('div');
  781. resizeBar.classList.add('resize-bar');
  782. elements.sidebar.after(resizeBar);
  783. resizeBar.addEventListener('mousedown', () => {
  784. resizing = true;
  785. });
  786. window.addEventListener('mousemove', (e) => {
  787. if (resizing) {
  788. sidebarSize =
  789. window.innerWidth > 800
  790. ? Math.min(Math.min(Math.max(window.innerWidth - e.clientX, 305), 900), window.innerWidth - 100)
  791. : 13;
  792. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.sidebarSize = sidebarSize;
  793. document.documentElement.style.setProperty('--sidebar-size', `${sidebarSize}px`);
  794. onResize();
  795. }
  796. });
  797. window.addEventListener('mouseup', () => {
  798. resizing = false;
  799. });
  800. window.removeEventListener('resize', unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].onResize);
  801. window.addEventListener('resize', onResize);
  802. }
  803.  
  804. function init$4(elements) {
  805. const uploadContainer = document.createElement('label');
  806. uploadContainer.setAttribute('for', 'import-save');
  807. uploadContainer.classList.add('setting');
  808. const uploadInput = document.createElement('input');
  809. uploadInput.type = 'file';
  810. uploadInput.id = 'import-save';
  811. uploadContainer.appendChild(uploadInput);
  812. const uploadText = document.createTextNode('Import Save File');
  813. uploadContainer.appendChild(uploadText);
  814. const uploadImage = document.createElement('img');
  815. uploadImage.src = uploadIcon.trim();
  816. uploadContainer.appendChild(uploadImage);
  817. elements.settingsContent.appendChild(uploadContainer);
  818. uploadInput.addEventListener('change', async () => {
  819. const file = uploadInput.files !== null ? uploadInput.files[0] : null;
  820. if (file === null || file.type !== 'application/json')
  821. return;
  822. const fileContents = JSON.parse(await file.text());
  823. if (!Object.keys(fileContents).includes('elements'))
  824. return;
  825. const saveFile = [];
  826. for (const element of fileContents.elements) {
  827. if (!Object.keys(element).includes('text'))
  828. continue;
  829. const toPush = {
  830. text: element.text,
  831. discovered: !Object.keys(element).includes('discovered')
  832. ? Object.keys(fileContents).includes('discoveries')
  833. ? fileContents.discoveries.includes(element.text)
  834. : false
  835. : element.discovered,
  836. };
  837. if (Object.keys(element).includes('emoji'))
  838. toPush.emoji = element.emoji;
  839. saveFile.push(toPush);
  840. }
  841. localStorage.setItem('infinite-craft-data', JSON.stringify({
  842. elements: saveFile,
  843. }));
  844. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.elements = cloneInto(saveFile, unsafeWindow);
  845. await resetCrafts();
  846. if (Object.keys(fileContents).includes('recipes')) {
  847. for (const recipeKey of Object.keys(fileContents.recipes)) {
  848. if (recipeKey !== 'Nothing') {
  849. for (const recipe of fileContents.recipes[recipeKey]) {
  850. if (recipe[0].text !== recipeKey && recipe[1].text !== recipeKey) {
  851. addElementToCrafts({
  852. text: recipe[0].text,
  853. emoji: recipe[0].emoji,
  854. }, {
  855. text: recipe[1].text,
  856. emoji: recipe[1].emoji,
  857. }, recipeKey, true);
  858. }
  859. }
  860. }
  861. }
  862. await GM.setValue('recipes', JSON.stringify(fileContents.recipes));
  863. }
  864. await resetDiscoveries();
  865. const discoveredElements = cloneInto(unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.elements, unsafeWindow).filter((el) => el.discovered === true);
  866. for (const discoveredElement of discoveredElements) {
  867. addElementToDiscoveries(discoveredElement);
  868. }
  869. await resetPinnedElements();
  870. if (Object.keys(fileContents).includes('pinned')) {
  871. for (let pinnedElement of fileContents.pinned) {
  872. pinElement(cloneInto(pinnedElement, unsafeWindow), true);
  873. }
  874. await GM.setValue('pinned', JSON.stringify(fileContents.pinned));
  875. }
  876. });
  877. const downloadContainer = document.createElement('div');
  878. downloadContainer.classList.add('setting');
  879. const downloadText = document.createTextNode('Export Save File');
  880. downloadContainer.appendChild(downloadText);
  881. const downloadImage = document.createElement('img');
  882. downloadImage.src = downloadIcon.trim();
  883. downloadContainer.appendChild(downloadImage);
  884. elements.settingsContent.appendChild(downloadContainer);
  885. downloadContainer.addEventListener('click', (e) => {
  886. const saveFile = JSON.parse(localStorage.getItem('infinite-craft-data') ?? '');
  887. saveFile.pinned = pinnedElements;
  888. saveFile.recipes = recipes;
  889. const downloadLink = document.createElement('a');
  890. downloadLink.download = 'infinitecraft.json';
  891. downloadLink.href = URL.createObjectURL(new Blob([JSON.stringify(saveFile, null, '\t')], {
  892. type: 'application/json',
  893. }));
  894. downloadLink.dataset.downloadurl = ['application/json', downloadLink.download, downloadLink.href].join(':');
  895. downloadLink.style.display = 'none';
  896. document.body.appendChild(downloadLink);
  897. downloadLink.click();
  898. document.body.removeChild(downloadLink);
  899. setTimeout(function () {
  900. URL.revokeObjectURL(downloadLink.href);
  901. }, 1500);
  902. });
  903. }
  904.  
  905. /**
  906. * The MIT License (MIT)
  907. *
  908. * Copyright (c) 2015 Marin Atanasov
  909. *
  910. * Permission is hereby granted, free of charge, to any person obtaining a copy
  911. * of this software and associated documentation files (the "Software"), to deal
  912. * in the Software without restriction, including without limitation the rights
  913. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  914. * copies of the Software, and to permit persons to whom the Software is
  915. * furnished to do so, subject to the following conditions:
  916. *
  917. * The above copyright notice and this permission notice shall be included in all
  918. * copies or substantial portions of the Software.
  919. *
  920. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  921. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  922. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  923. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  924. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  925. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  926. * SOFTWARE.
  927. */
  928. const characterMap = {
  929. À: 'A',
  930. Á: 'A',
  931. Â: 'A',
  932. Ã: 'A',
  933. Ä: 'A',
  934. Å: 'A',
  935. Ấ: 'A',
  936. Ắ: 'A',
  937. Ẳ: 'A',
  938. Ẵ: 'A',
  939. Ặ: 'A',
  940. Æ: 'AE',
  941. Ầ: 'A',
  942. Ằ: 'A',
  943. Ȃ: 'A',
  944. Ả: 'A',
  945. Ạ: 'A',
  946. Ẩ: 'A',
  947. Ẫ: 'A',
  948. Ậ: 'A',
  949. Ç: 'C',
  950. Ḉ: 'C',
  951. È: 'E',
  952. É: 'E',
  953. Ê: 'E',
  954. Ë: 'E',
  955. Ế: 'E',
  956. Ḗ: 'E',
  957. Ề: 'E',
  958. Ḕ: 'E',
  959. Ḝ: 'E',
  960. Ȇ: 'E',
  961. Ẻ: 'E',
  962. Ẽ: 'E',
  963. Ẹ: 'E',
  964. Ể: 'E',
  965. Ễ: 'E',
  966. Ệ: 'E',
  967. Ì: 'I',
  968. Í: 'I',
  969. Î: 'I',
  970. Ï: 'I',
  971. Ḯ: 'I',
  972. Ȋ: 'I',
  973. Ỉ: 'I',
  974. Ị: 'I',
  975. Ð: 'D',
  976. Ñ: 'N',
  977. Ò: 'O',
  978. Ó: 'O',
  979. Ô: 'O',
  980. Õ: 'O',
  981. Ö: 'O',
  982. Ø: 'O',
  983. Ố: 'O',
  984. Ṍ: 'O',
  985. Ṓ: 'O',
  986. Ȏ: 'O',
  987. Ỏ: 'O',
  988. Ọ: 'O',
  989. Ổ: 'O',
  990. Ỗ: 'O',
  991. Ộ: 'O',
  992. Ờ: 'O',
  993. Ở: 'O',
  994. Ỡ: 'O',
  995. Ớ: 'O',
  996. Ợ: 'O',
  997. Ù: 'U',
  998. Ú: 'U',
  999. Û: 'U',
  1000. Ü: 'U',
  1001. Ủ: 'U',
  1002. Ụ: 'U',
  1003. Ử: 'U',
  1004. Ữ: 'U',
  1005. Ự: 'U',
  1006. Ý: 'Y',
  1007. à: 'a',
  1008. á: 'a',
  1009. â: 'a',
  1010. ã: 'a',
  1011. ä: 'a',
  1012. å: 'a',
  1013. ấ: 'a',
  1014. ắ: 'a',
  1015. ẳ: 'a',
  1016. ẵ: 'a',
  1017. ặ: 'a',
  1018. æ: 'ae',
  1019. ầ: 'a',
  1020. ằ: 'a',
  1021. ȃ: 'a',
  1022. ả: 'a',
  1023. ạ: 'a',
  1024. ẩ: 'a',
  1025. ẫ: 'a',
  1026. ậ: 'a',
  1027. ç: 'c',
  1028. ḉ: 'c',
  1029. è: 'e',
  1030. é: 'e',
  1031. ê: 'e',
  1032. ë: 'e',
  1033. ế: 'e',
  1034. ḗ: 'e',
  1035. ề: 'e',
  1036. ḕ: 'e',
  1037. ḝ: 'e',
  1038. ȇ: 'e',
  1039. ẻ: 'e',
  1040. ẽ: 'e',
  1041. ẹ: 'e',
  1042. ể: 'e',
  1043. ễ: 'e',
  1044. ệ: 'e',
  1045. ì: 'i',
  1046. í: 'i',
  1047. î: 'i',
  1048. ï: 'i',
  1049. ḯ: 'i',
  1050. ȋ: 'i',
  1051. ỉ: 'i',
  1052. ị: 'i',
  1053. ð: 'd',
  1054. ñ: 'n',
  1055. ò: 'o',
  1056. ó: 'o',
  1057. ô: 'o',
  1058. õ: 'o',
  1059. ö: 'o',
  1060. ø: 'o',
  1061. ố: 'o',
  1062. ṍ: 'o',
  1063. ṓ: 'o',
  1064. ȏ: 'o',
  1065. ỏ: 'o',
  1066. ọ: 'o',
  1067. ổ: 'o',
  1068. ỗ: 'o',
  1069. ộ: 'o',
  1070. ờ: 'o',
  1071. ở: 'o',
  1072. ỡ: 'o',
  1073. ớ: 'o',
  1074. ợ: 'o',
  1075. ù: 'u',
  1076. ú: 'u',
  1077. û: 'u',
  1078. ü: 'u',
  1079. ủ: 'u',
  1080. ụ: 'u',
  1081. ử: 'u',
  1082. ữ: 'u',
  1083. ự: 'u',
  1084. ý: 'y',
  1085. ÿ: 'y',
  1086. Ā: 'A',
  1087. ā: 'a',
  1088. Ă: 'A',
  1089. ă: 'a',
  1090. Ą: 'A',
  1091. ą: 'a',
  1092. Ć: 'C',
  1093. ć: 'c',
  1094. Ĉ: 'C',
  1095. ĉ: 'c',
  1096. Ċ: 'C',
  1097. ċ: 'c',
  1098. Č: 'C',
  1099. č: 'c',
  1100. C̆: 'C',
  1101. c̆: 'c',
  1102. Ď: 'D',
  1103. ď: 'd',
  1104. Đ: 'D',
  1105. đ: 'd',
  1106. Ē: 'E',
  1107. ē: 'e',
  1108. Ĕ: 'E',
  1109. ĕ: 'e',
  1110. Ė: 'E',
  1111. ė: 'e',
  1112. Ę: 'E',
  1113. ę: 'e',
  1114. Ě: 'E',
  1115. ě: 'e',
  1116. Ĝ: 'G',
  1117. Ǵ: 'G',
  1118. ĝ: 'g',
  1119. ǵ: 'g',
  1120. Ğ: 'G',
  1121. ğ: 'g',
  1122. Ġ: 'G',
  1123. ġ: 'g',
  1124. Ģ: 'G',
  1125. ģ: 'g',
  1126. Ĥ: 'H',
  1127. ĥ: 'h',
  1128. Ħ: 'H',
  1129. ħ: 'h',
  1130. Ḫ: 'H',
  1131. ḫ: 'h',
  1132. Ĩ: 'I',
  1133. ĩ: 'i',
  1134. Ī: 'I',
  1135. ī: 'i',
  1136. Ĭ: 'I',
  1137. ĭ: 'i',
  1138. Į: 'I',
  1139. į: 'i',
  1140. İ: 'I',
  1141. ı: 'i',
  1142. IJ: 'IJ',
  1143. ij: 'ij',
  1144. Ĵ: 'J',
  1145. ĵ: 'j',
  1146. Ķ: 'K',
  1147. ķ: 'k',
  1148. Ḱ: 'K',
  1149. ḱ: 'k',
  1150. K̆: 'K',
  1151. k̆: 'k',
  1152. Ĺ: 'L',
  1153. ĺ: 'l',
  1154. Ļ: 'L',
  1155. ļ: 'l',
  1156. Ľ: 'L',
  1157. ľ: 'l',
  1158. Ŀ: 'L',
  1159. ŀ: 'l',
  1160. Ł: 'l',
  1161. ł: 'l',
  1162. Ḿ: 'M',
  1163. ḿ: 'm',
  1164. M̆: 'M',
  1165. m̆: 'm',
  1166. Ń: 'N',
  1167. ń: 'n',
  1168. Ņ: 'N',
  1169. ņ: 'n',
  1170. Ň: 'N',
  1171. ň: 'n',
  1172. ʼn: 'n',
  1173. N̆: 'N',
  1174. n̆: 'n',
  1175. Ō: 'O',
  1176. ō: 'o',
  1177. Ŏ: 'O',
  1178. ŏ: 'o',
  1179. Ő: 'O',
  1180. ő: 'o',
  1181. Œ: 'OE',
  1182. œ: 'oe',
  1183. P̆: 'P',
  1184. p̆: 'p',
  1185. Ŕ: 'R',
  1186. ŕ: 'r',
  1187. Ŗ: 'R',
  1188. ŗ: 'r',
  1189. Ř: 'R',
  1190. ř: 'r',
  1191. R̆: 'R',
  1192. r̆: 'r',
  1193. Ȓ: 'R',
  1194. ȓ: 'r',
  1195. Ś: 'S',
  1196. ś: 's',
  1197. Ŝ: 'S',
  1198. ŝ: 's',
  1199. Ş: 'S',
  1200. Ș: 'S',
  1201. ș: 's',
  1202. ş: 's',
  1203. Š: 'S',
  1204. š: 's',
  1205. Ţ: 'T',
  1206. ţ: 't',
  1207. ț: 't',
  1208. Ț: 'T',
  1209. Ť: 'T',
  1210. ť: 't',
  1211. Ŧ: 'T',
  1212. ŧ: 't',
  1213. T̆: 'T',
  1214. t̆: 't',
  1215. Ũ: 'U',
  1216. ũ: 'u',
  1217. Ū: 'U',
  1218. ū: 'u',
  1219. Ŭ: 'U',
  1220. ŭ: 'u',
  1221. Ů: 'U',
  1222. ů: 'u',
  1223. Ű: 'U',
  1224. ű: 'u',
  1225. Ų: 'U',
  1226. ų: 'u',
  1227. Ȗ: 'U',
  1228. ȗ: 'u',
  1229. V̆: 'V',
  1230. v̆: 'v',
  1231. Ŵ: 'W',
  1232. ŵ: 'w',
  1233. Ẃ: 'W',
  1234. ẃ: 'w',
  1235. X̆: 'X',
  1236. x̆: 'x',
  1237. Ŷ: 'Y',
  1238. ŷ: 'y',
  1239. Ÿ: 'Y',
  1240. Y̆: 'Y',
  1241. y̆: 'y',
  1242. Ź: 'Z',
  1243. ź: 'z',
  1244. Ż: 'Z',
  1245. ż: 'z',
  1246. Ž: 'Z',
  1247. ž: 'z',
  1248. ſ: 's',
  1249. ƒ: 'f',
  1250. Ơ: 'O',
  1251. ơ: 'o',
  1252. Ư: 'U',
  1253. ư: 'u',
  1254. Ǎ: 'A',
  1255. ǎ: 'a',
  1256. Ǐ: 'I',
  1257. ǐ: 'i',
  1258. Ǒ: 'O',
  1259. ǒ: 'o',
  1260. Ǔ: 'U',
  1261. ǔ: 'u',
  1262. Ǖ: 'U',
  1263. ǖ: 'u',
  1264. Ǘ: 'U',
  1265. ǘ: 'u',
  1266. Ǚ: 'U',
  1267. ǚ: 'u',
  1268. Ǜ: 'U',
  1269. ǜ: 'u',
  1270. Ứ: 'U',
  1271. ứ: 'u',
  1272. Ṹ: 'U',
  1273. ṹ: 'u',
  1274. Ǻ: 'A',
  1275. ǻ: 'a',
  1276. Ǽ: 'AE',
  1277. ǽ: 'ae',
  1278. Ǿ: 'O',
  1279. ǿ: 'o',
  1280. Þ: 'TH',
  1281. þ: 'th',
  1282. Ṕ: 'P',
  1283. ṕ: 'p',
  1284. Ṥ: 'S',
  1285. ṥ: 's',
  1286. X́: 'X',
  1287. x́: 'x',
  1288. Ѓ: 'Г',
  1289. ѓ: 'г',
  1290. Ќ: 'К',
  1291. ќ: 'к',
  1292. A̋: 'A',
  1293. a̋: 'a',
  1294. E̋: 'E',
  1295. e̋: 'e',
  1296. I̋: 'I',
  1297. i̋: 'i',
  1298. Ǹ: 'N',
  1299. ǹ: 'n',
  1300. Ồ: 'O',
  1301. ồ: 'o',
  1302. Ṑ: 'O',
  1303. ṑ: 'o',
  1304. Ừ: 'U',
  1305. ừ: 'u',
  1306. Ẁ: 'W',
  1307. ẁ: 'w',
  1308. Ỳ: 'Y',
  1309. ỳ: 'y',
  1310. Ȁ: 'A',
  1311. ȁ: 'a',
  1312. Ȅ: 'E',
  1313. ȅ: 'e',
  1314. Ȉ: 'I',
  1315. ȉ: 'i',
  1316. Ȍ: 'O',
  1317. ȍ: 'o',
  1318. Ȑ: 'R',
  1319. ȑ: 'r',
  1320. Ȕ: 'U',
  1321. ȕ: 'u',
  1322. B̌: 'B',
  1323. b̌: 'b',
  1324. Č̣: 'C',
  1325. č̣: 'c',
  1326. Ê̌: 'E',
  1327. ê̌: 'e',
  1328. F̌: 'F',
  1329. f̌: 'f',
  1330. Ǧ: 'G',
  1331. ǧ: 'g',
  1332. Ȟ: 'H',
  1333. ȟ: 'h',
  1334. J̌: 'J',
  1335. ǰ: 'j',
  1336. Ǩ: 'K',
  1337. ǩ: 'k',
  1338. M̌: 'M',
  1339. m̌: 'm',
  1340. P̌: 'P',
  1341. p̌: 'p',
  1342. Q̌: 'Q',
  1343. q̌: 'q',
  1344. Ř̩: 'R',
  1345. ř̩: 'r',
  1346. Ṧ: 'S',
  1347. ṧ: 's',
  1348. V̌: 'V',
  1349. v̌: 'v',
  1350. W̌: 'W',
  1351. w̌: 'w',
  1352. X̌: 'X',
  1353. x̌: 'x',
  1354. Y̌: 'Y',
  1355. y̌: 'y',
  1356. A̧: 'A',
  1357. a̧: 'a',
  1358. B̧: 'B',
  1359. b̧: 'b',
  1360. Ḑ: 'D',
  1361. ḑ: 'd',
  1362. Ȩ: 'E',
  1363. ȩ: 'e',
  1364. Ɛ̧: 'E',
  1365. ɛ̧: 'e',
  1366. Ḩ: 'H',
  1367. ḩ: 'h',
  1368. I̧: 'I',
  1369. i̧: 'i',
  1370. Ɨ̧: 'I',
  1371. ɨ̧: 'i',
  1372. M̧: 'M',
  1373. m̧: 'm',
  1374. O̧: 'O',
  1375. o̧: 'o',
  1376. Q̧: 'Q',
  1377. q̧: 'q',
  1378. U̧: 'U',
  1379. u̧: 'u',
  1380. X̧: 'X',
  1381. x̧: 'x',
  1382. Z̧: 'Z',
  1383. z̧: 'z',
  1384. й: 'и',
  1385. Й: 'И',
  1386. ё: 'е',
  1387. Ё: 'Е',
  1388. };
  1389. const removeAccentsRegex = new RegExp(Object.keys(characterMap).join('|'), 'g');
  1390. function removeAccents(string) {
  1391. return string.replace(removeAccentsRegex, (char) => {
  1392. return characterMap[char];
  1393. });
  1394. }
  1395. const rankings = {
  1396. CASE_SENSITIVE_EQUAL: 7,
  1397. EQUAL: 6,
  1398. STARTS_WITH: 5,
  1399. WORD_STARTS_WITH: 4,
  1400. CONTAINS: 3,
  1401. ACRONYM: 2,
  1402. MATCHES: 1,
  1403. NO_MATCH: 0,
  1404. };
  1405. const defaultBaseSortFn = (a, b) => String(a.rankedValue).localeCompare(String(b.rankedValue));
  1406. function matchSorter(items, value, options = {}) {
  1407. const { keys, threshold = rankings.MATCHES, baseSort = defaultBaseSortFn, sorter = (matchedItems) => matchedItems.sort((a, b) => sortRankedValues(a, b, baseSort)), } = options;
  1408. const matchedItems = items.reduce(reduceItemsToRanked, []);
  1409. return sorter(matchedItems).map(({ item }) => item);
  1410. function reduceItemsToRanked(matches, item, index) {
  1411. const rankingInfo = getHighestRanking(item, keys, value, options);
  1412. const { rank, keyThreshold = threshold } = rankingInfo;
  1413. if (rank >= keyThreshold) {
  1414. matches.push({ ...rankingInfo, item, index });
  1415. }
  1416. return matches;
  1417. }
  1418. }
  1419. matchSorter.rankings = rankings;
  1420. function getHighestRanking(item, keys, value, options) {
  1421. if (!keys) {
  1422. const stringItem = item;
  1423. return {
  1424. rankedValue: stringItem,
  1425. rank: getMatchRanking(stringItem, value, options),
  1426. keyIndex: -1,
  1427. keyThreshold: options.threshold,
  1428. };
  1429. }
  1430. const valuesToRank = getAllValuesToRank(item, keys);
  1431. return valuesToRank.reduce(({ rank, rankedValue, keyIndex, keyThreshold }, { itemValue, attributes }, i) => {
  1432. let newRank = getMatchRanking(itemValue, value, options);
  1433. let newRankedValue = rankedValue;
  1434. const { minRanking, maxRanking, threshold } = attributes;
  1435. if (newRank < minRanking && newRank >= rankings.MATCHES) {
  1436. newRank = minRanking;
  1437. }
  1438. else if (newRank > maxRanking) {
  1439. newRank = maxRanking;
  1440. }
  1441. if (newRank > rank) {
  1442. rank = newRank;
  1443. keyIndex = i;
  1444. keyThreshold = threshold;
  1445. newRankedValue = itemValue;
  1446. }
  1447. return { rankedValue: newRankedValue, rank, keyIndex, keyThreshold };
  1448. }, {
  1449. rankedValue: item,
  1450. rank: rankings.NO_MATCH,
  1451. keyIndex: -1,
  1452. keyThreshold: options.threshold,
  1453. });
  1454. }
  1455. function getMatchRanking(testString, stringToRank, options) {
  1456. testString = prepareValueForComparison(testString, options);
  1457. stringToRank = prepareValueForComparison(stringToRank, options);
  1458. if (stringToRank.length > testString.length) {
  1459. return rankings.NO_MATCH;
  1460. }
  1461. if (testString === stringToRank) {
  1462. return rankings.CASE_SENSITIVE_EQUAL;
  1463. }
  1464. testString = testString.toLowerCase();
  1465. stringToRank = stringToRank.toLowerCase();
  1466. if (testString === stringToRank) {
  1467. return rankings.EQUAL;
  1468. }
  1469. if (testString.startsWith(stringToRank)) {
  1470. return rankings.STARTS_WITH;
  1471. }
  1472. if (testString.includes(` ${stringToRank}`)) {
  1473. return rankings.WORD_STARTS_WITH;
  1474. }
  1475. if (testString.includes(stringToRank)) {
  1476. return rankings.CONTAINS;
  1477. }
  1478. else if (stringToRank.length === 1) {
  1479. return rankings.NO_MATCH;
  1480. }
  1481. if (getAcronym(testString).includes(stringToRank)) {
  1482. return rankings.ACRONYM;
  1483. }
  1484. return getClosenessRanking(testString, stringToRank);
  1485. }
  1486. function getAcronym(string) {
  1487. let acronym = '';
  1488. const wordsInString = string.split(' ');
  1489. for (const wordInString of wordsInString) {
  1490. const splitByHyphenWords = wordInString.split('-');
  1491. for (const splitByHyphenWord of splitByHyphenWords) {
  1492. acronym += splitByHyphenWord.substr(0, 1);
  1493. }
  1494. }
  1495. return acronym;
  1496. }
  1497. function getClosenessRanking(testString, stringToRank) {
  1498. let matchingInOrderCharCount = 0;
  1499. let charNumber = 0;
  1500. function findMatchingCharacter(matchChar, string, index) {
  1501. for (let j = index, J = string.length; j < J; j++) {
  1502. const stringChar = string[j];
  1503. if (stringChar === matchChar) {
  1504. matchingInOrderCharCount += 1;
  1505. return j + 1;
  1506. }
  1507. }
  1508. return -1;
  1509. }
  1510. function getRanking(spread) {
  1511. const spreadPercentage = 1 / spread;
  1512. const inOrderPercentage = matchingInOrderCharCount / stringToRank.length;
  1513. const ranking = rankings.MATCHES + inOrderPercentage * spreadPercentage;
  1514. return ranking;
  1515. }
  1516. const firstIndex = findMatchingCharacter(stringToRank[0], testString, 0);
  1517. if (firstIndex < 0) {
  1518. return rankings.NO_MATCH;
  1519. }
  1520. charNumber = firstIndex;
  1521. for (let i = 1, I = stringToRank.length; i < I; i++) {
  1522. const matchChar = stringToRank[i];
  1523. charNumber = findMatchingCharacter(matchChar, testString, charNumber);
  1524. const found = charNumber > -1;
  1525. if (!found) {
  1526. return rankings.NO_MATCH;
  1527. }
  1528. }
  1529. const spread = charNumber - firstIndex;
  1530. return getRanking(spread);
  1531. }
  1532. function sortRankedValues(a, b, baseSort) {
  1533. const aFirst = -1;
  1534. const bFirst = 1;
  1535. const { rank: aRank, keyIndex: aKeyIndex } = a;
  1536. const { rank: bRank, keyIndex: bKeyIndex } = b;
  1537. const same = aRank === bRank;
  1538. if (same) {
  1539. if (aKeyIndex === bKeyIndex) {
  1540. return baseSort(a, b);
  1541. }
  1542. else {
  1543. return aKeyIndex < bKeyIndex ? aFirst : bFirst;
  1544. }
  1545. }
  1546. else {
  1547. return aRank > bRank ? aFirst : bFirst;
  1548. }
  1549. }
  1550. function prepareValueForComparison(value, { keepDiacritics }) {
  1551. value = `${value}`;
  1552. if (!keepDiacritics) {
  1553. value = removeAccents(value);
  1554. }
  1555. return value;
  1556. }
  1557. function getItemValues(item, key) {
  1558. if (typeof key === 'object') {
  1559. key = key.key;
  1560. }
  1561. let value;
  1562. if (typeof key === 'function') {
  1563. value = key(item);
  1564. }
  1565. else if (item == null) {
  1566. value = null;
  1567. }
  1568. else if (Object.hasOwn(item, key)) {
  1569. value = item[key];
  1570. }
  1571. else if (key.includes('.')) {
  1572. return getNestedValues(key, item);
  1573. }
  1574. else {
  1575. value = null;
  1576. }
  1577. if (value == null) {
  1578. return [];
  1579. }
  1580. if (Array.isArray(value)) {
  1581. return value;
  1582. }
  1583. return [String(value)];
  1584. }
  1585. function getNestedValues(path, item) {
  1586. const keys = path.split('.');
  1587. let values = [item];
  1588. for (let i = 0, I = keys.length; i < I; i++) {
  1589. const nestedKey = keys[i];
  1590. let nestedValues = [];
  1591. for (let j = 0, J = values.length; j < J; j++) {
  1592. const nestedItem = values[j];
  1593. if (nestedItem == null)
  1594. continue;
  1595. if (Object.hasOwn(nestedItem, nestedKey)) {
  1596. const nestedValue = nestedItem[nestedKey];
  1597. if (nestedValue != null) {
  1598. nestedValues.push(nestedValue);
  1599. }
  1600. }
  1601. else if (nestedKey === '*') {
  1602. nestedValues = nestedValues.concat(nestedItem);
  1603. }
  1604. }
  1605. values = nestedValues;
  1606. }
  1607. if (Array.isArray(values[0])) {
  1608. const result = [];
  1609. return result.concat(...values);
  1610. }
  1611. return values;
  1612. }
  1613. function getAllValuesToRank(item, keys) {
  1614. const allValues = [];
  1615. for (let j = 0, J = keys.length; j < J; j++) {
  1616. const key = keys[j];
  1617. const attributes = getKeyAttributes(key);
  1618. const itemValues = getItemValues(item, key);
  1619. for (let i = 0, I = itemValues.length; i < I; i++) {
  1620. allValues.push({
  1621. itemValue: itemValues[i],
  1622. attributes,
  1623. });
  1624. }
  1625. }
  1626. return allValues;
  1627. }
  1628. const defaultKeyAttributes = {
  1629. maxRanking: Infinity,
  1630. minRanking: -Infinity,
  1631. };
  1632. function getKeyAttributes(key) {
  1633. if (typeof key === 'string') {
  1634. return defaultKeyAttributes;
  1635. }
  1636. return { ...defaultKeyAttributes, ...key };
  1637. }
  1638.  
  1639. function init$3(elements) {
  1640. // Remove the searchbar element from the DOM
  1641. const searchbarElement = document.querySelector('div.sidebar-search');
  1642. if (searchbarElement) {
  1643. searchbarElement.remove();
  1644. }
  1645.  
  1646. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._computedWatchers.sortedElements.getter =
  1647. exportFunction(() => {
  1648. const elements = [...unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.elements];
  1649.  
  1650. if (unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.showDiscoveredOnly) {
  1651. return cloneInto(elements.filter((el) => el.discovered), unsafeWindow);
  1652. }
  1653.  
  1654. if (unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.sortBy === 'name') {
  1655. return cloneInto(elements, unsafeWindow).sort((a, b) => a.text.localeCompare(b.text, undefined, { numeric: true }));
  1656. }
  1657.  
  1658. if (unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.sortBy === 'emoji') {
  1659. return cloneInto(elements, unsafeWindow).sort((a, b) => {
  1660. const emojiA = a.emoji ?? '⬜';
  1661. const emojiB = b.emoji ?? '⬜';
  1662. return emojiA.localeCompare(emojiB);
  1663. });
  1664. }
  1665.  
  1666. return unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.elements;
  1667. }, unsafeWindow);
  1668.  
  1669. // If there was any code related to the random button, it would remain here
  1670. // Since the original code snippet didn't include any specific code for the random button,
  1671. // we assume it's handled elsewhere in the script
  1672. }
  1673. function init$2(elements) {
  1674. const randomImage = document.createElement('img');
  1675. randomImage.src = randomIcon.trim();
  1676. randomImage.classList.add('random');
  1677. elements.sideControls.appendChild(randomImage);
  1678. randomImage.addEventListener('click', (e) => {
  1679. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].playInstanceSound();
  1680. const randomElement = unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.elements[Math.floor(Math.random() * unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.elements.length)];
  1681. const data = {
  1682. id: unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.instanceId++,
  1683. text: randomElement.text,
  1684. emoji: randomElement.emoji,
  1685. discovered: randomElement.discovered,
  1686. disabled: false,
  1687. left: 0,
  1688. top: 0,
  1689. offsetX: 0.5,
  1690. offsetY: 0.5,
  1691. };
  1692. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.selectedInstance = cloneInto(data, unsafeWindow);
  1693. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.instances.push(unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.selectedInstance);
  1694. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].$nextTick(exportFunction(() => {
  1695. const randomPosition = Math.random() * Math.PI * 2;
  1696. const cos = 50 * Math.cos(randomPosition);
  1697. const sin = 50 * Math.sin(randomPosition);
  1698. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].setInstancePosition(unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.selectedInstance, (window.innerWidth - unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.sidebarSize) / 2 +
  1699. cos, window.innerHeight / 2 - 40 + sin);
  1700. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].setInstanceZIndex(unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.selectedInstance, data.id);
  1701. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].calcInstanceSize(unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.selectedInstance);
  1702. }, unsafeWindow));
  1703. });
  1704. }
  1705.  
  1706. let theme = 'shadow';
  1707. const shadowCSS = `
  1708. .container.dark-mode {
  1709. --border-color: #525252 !important;
  1710. --item-bg: #18181b !important;
  1711. --instance-bg: linear-gradient(180deg,#22252b,#18181b 80%) !important;
  1712. --instance-bg-hover: linear-gradient(180deg,#3d4249,#18181b 80%) !important;
  1713. --instance-border: #525252 !important;
  1714. --instance-border-hover: #a3a3a3 !important;
  1715. --sidebar-bg: #18181b !important;
  1716. --background-color: #18181b !important;
  1717. --discoveries-bg-active: #423a24 !important;
  1718. --text-color: #fff !important;
  1719. }
  1720.  
  1721. .dark-mode {
  1722. scrollbar-color: #525252 #262626 !important;
  1723. }
  1724.  
  1725. .dark-mode .sidebar-controls:after {
  1726. background: linear-gradient(180deg, rgba(24,24,27,0), rgba(24,24,27,.9)) !important;
  1727. }
  1728. `;
  1729. const shadowStyles = document.createElement('style');
  1730. shadowStyles.appendChild(document.createTextNode(shadowCSS.trim()));
  1731. async function init(elements) {
  1732. const oldTheme = localStorage.getItem('theme');
  1733. if (oldTheme !== null && oldTheme === 'light')
  1734. theme = 'light';
  1735. localStorage.removeItem('theme');
  1736. const storedTheme = await GM.getValue('theme');
  1737. if (storedTheme === 'light')
  1738. theme = 'light';
  1739. if (storedTheme === 'dark')
  1740. theme = 'dark';
  1741. await GM.setValue('theme', theme);
  1742. if (theme === 'light' && unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.isDarkMode) {
  1743. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].toggleDarkMode();
  1744. }
  1745. else if (theme === 'shadow' && !unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.isDarkMode) {
  1746. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].toggleDarkMode();
  1747. }
  1748. else if (theme === 'dark' && !unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0]._data.isDarkMode) {
  1749. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].toggleDarkMode();
  1750. }
  1751. if (theme === 'shadow') {
  1752. document.getElementsByTagName('head')[0].appendChild(shadowStyles);
  1753. }
  1754. const darkModeIcon = elements.darkModeIcon.cloneNode(true);
  1755. darkModeIcon.src = shadowIcon;
  1756. if (theme === 'light')
  1757. darkModeIcon.src = '/infinite-craft/dark-mode.svg';
  1758. if (theme === 'dark')
  1759. darkModeIcon.src = '/infinite-craft/dark-mode-on.svg';
  1760. elements.darkModeIcon.parentNode?.replaceChild(darkModeIcon, elements.darkModeIcon);
  1761. const toggleDarkMode = unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].toggleDarkMode;
  1762. unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].toggleDarkMode = exportFunction(async () => {
  1763. if (theme === 'light') {
  1764. toggleDarkMode();
  1765. darkModeIcon.src = shadowIcon;
  1766. document.getElementsByTagName('head')[0].appendChild(shadowStyles);
  1767. theme = 'shadow';
  1768. }
  1769. else if (theme === 'shadow') {
  1770. darkModeIcon.src = '/infinite-craft/dark-mode-on.svg';
  1771. shadowStyles.remove();
  1772. theme = 'dark';
  1773. }
  1774. else if (theme === 'dark') {
  1775. toggleDarkMode();
  1776. darkModeIcon.src = '/infinite-craft/dark-mode.svg';
  1777. theme = 'light';
  1778. }
  1779. await GM.setValue('theme', theme);
  1780. }, unsafeWindow);
  1781. darkModeIcon.addEventListener('click', unsafeWindow.$nuxt.$root.$children[2].$children[0].$children[0].toggleDarkMode);
  1782. }
  1783.  
  1784. window.addEventListener('load', async () => {
  1785. const sidebarHeader = document.createElement('div');
  1786. sidebarHeader.classList.add('sidebar-header');
  1787. const settingsContent = document.createElement('div');
  1788. settingsContent.classList.add('settings-content');
  1789. const elements = {
  1790. favicon: document.querySelector('link[rel="icon"]'),
  1791. container: document.querySelector('.container'),
  1792. instances: document.querySelector('.instances'),
  1793. styles: document.createElement('style'),
  1794. sideControls: document.querySelector('.side-controls'),
  1795. darkModeIcon: document.querySelector('.dark-mode-icon'),
  1796. sidebar: document.querySelector('.sidebar'),
  1797. sidebarHeader: sidebarHeader,
  1798. searchBar: document.querySelector('.sidebar-search'),
  1799. settingsContent: settingsContent,
  1800. items: document.querySelector('.items'),
  1801. getItems: () => {
  1802. return Array.from(document.querySelectorAll('.items div.item'));
  1803. },
  1804. instruction: document.querySelector('.instruction'),
  1805. sort: document.querySelector('.sort'),
  1806. particles: document.querySelector('.particles'),
  1807. logo: document.querySelector('.logo'),
  1808. };
  1809. elements.items.before(elements.sidebarHeader);
  1810. init$d(elements);
  1811. init$c(elements);
  1812. init$b(elements);
  1813. init$6(elements);
  1814. init$8(elements);
  1815. init$5(elements);
  1816. init$4(elements);
  1817. init$3(elements);
  1818. init$7(elements);
  1819. init$2(elements);
  1820. await init$a(elements);
  1821. init$9(elements);
  1822. init$1(elements);
  1823. init(elements);
  1824. }, false);
  1825. window.addEventListener('contextmenu', (e) => {
  1826. e.preventDefault();
  1827. });
  1828. const exemptClasses = ['preserve-latin', 'code', 'syntax'];
  1829.  
  1830. function hasExemptClass(element) {
  1831. if (!element || element === document.body) return false;
  1832.  
  1833. for (let cls of exemptClasses) {
  1834. if (element.classList.contains(cls)) return true;
  1835. }
  1836.  
  1837. return hasExemptClass(element.parentElement);
  1838. }
  1839.  
  1840. function removeLatin(node) {
  1841. if (node.nodeType === Node.ELEMENT_NODE && hasExemptClass(node)) {
  1842. return; // Skip this node and its children if it has an exempt class
  1843. }
  1844.  
  1845. if (node.nodeType === Node.TEXT_NODE) {
  1846. node.nodeValue = node.nodeValue.replace(/[A-Za-z]/g, '');
  1847. } else {
  1848. for (let child of node.childNodes) {
  1849. removeLatin(child);
  1850. }
  1851. }
  1852. }
  1853.  
  1854. // Run the function on the entire document body
  1855. removeLatin(document.body);
  1856.  
  1857. // Set up a MutationObserver to handle dynamically added content
  1858. const observer = new MutationObserver((mutations) => {
  1859. for (let mutation of mutations) {
  1860. for (let node of mutation.addedNodes) {
  1861. if (node.nodeType === Node.ELEMENT_NODE) {
  1862. removeLatin(node);
  1863. }
  1864. }
  1865. }
  1866. });
  1867.  
  1868. observer.observe(document.body, { childList: true, subtree: true });
  1869. })();