master b0587d0aaf77 cached
354 files
1.9 MB
782.0k tokens
129 symbols
1 requests
Download .txt
Showing preview only (2,163K chars total). Download the full file or copy to clipboard to get everything.
Repository: Mantan21/Genshin-Impact-Wish-Simulator
Branch: master
Commit: b0587d0aaf77
Files: 354
Total size: 1.9 MB

Directory structure:
gitextract_4a1kin_z/

├── .browserslistrc
├── .eslintrc.cjs
├── .github/
│   ├── FUNDING.yml
│   └── workflows/
│       └── codeql-analysis.yml
├── .gitignore
├── .prettierrc
├── LICENSE
├── README.md
├── jsconfig.json
├── package.json
├── postcss.config.js
├── src/
│   ├── app.css
│   ├── app.html
│   ├── global.d.ts
│   ├── lib/
│   │   ├── components/
│   │   │   ├── ButtonGeneral.svelte
│   │   │   ├── ButtonModal.svelte
│   │   │   ├── CheckBox.svelte
│   │   │   ├── Icon.svelte
│   │   │   ├── Iklan.svelte
│   │   │   ├── ModalTpl.svelte
│   │   │   ├── MyFund.svelte
│   │   │   ├── NoticeMark.svelte
│   │   │   ├── ObtainedItem.svelte
│   │   │   ├── RandomBackground.svelte
│   │   │   ├── Range.svelte
│   │   │   ├── SVGIcon.svelte
│   │   │   ├── Toast.svelte
│   │   │   ├── Toasts.svelte
│   │   │   ├── ToolTip.svelte
│   │   │   ├── chat/
│   │   │   │   ├── MainChat.svelte
│   │   │   │   ├── _changeAvatar.svelte
│   │   │   │   ├── _changeNick.svelte
│   │   │   │   ├── _chats.svelte
│   │   │   │   ├── _loader-chat.svelte
│   │   │   │   ├── _messagebox.svelte
│   │   │   │   └── _sidebar.svelte
│   │   │   └── svgs/
│   │   │       ├── Anemo.svelte
│   │   │       ├── Bow.svelte
│   │   │       ├── Catalyst.svelte
│   │   │       ├── Claymore.svelte
│   │   │       ├── Cryo.svelte
│   │   │       ├── Dendro.svelte
│   │   │       ├── Electro.svelte
│   │   │       ├── Geo.svelte
│   │   │       ├── Hydro.svelte
│   │   │       ├── Polearm.svelte
│   │   │       ├── Pyro.svelte
│   │   │       └── Sword.svelte
│   │   ├── data/
│   │   │   ├── banners/
│   │   │   │   ├── beginner.json
│   │   │   │   ├── events/
│   │   │   │   │   ├── 1.0.json
│   │   │   │   │   ├── 1.1.json
│   │   │   │   │   ├── 1.2.json
│   │   │   │   │   ├── 1.3.json
│   │   │   │   │   ├── 1.4.json
│   │   │   │   │   ├── 1.5.json
│   │   │   │   │   ├── 1.6.json
│   │   │   │   │   ├── 2.0.json
│   │   │   │   │   ├── 2.1.json
│   │   │   │   │   ├── 2.2.json
│   │   │   │   │   ├── 2.3.json
│   │   │   │   │   ├── 2.4.json
│   │   │   │   │   ├── 2.5.json
│   │   │   │   │   ├── 2.6.json
│   │   │   │   │   ├── 2.7.json
│   │   │   │   │   ├── 2.8.json
│   │   │   │   │   ├── 3.0.json
│   │   │   │   │   ├── 3.1.json
│   │   │   │   │   ├── 3.2.json
│   │   │   │   │   ├── 3.3.json
│   │   │   │   │   ├── 3.4.json
│   │   │   │   │   ├── 3.5.json
│   │   │   │   │   ├── 3.6.json
│   │   │   │   │   ├── 3.7.json
│   │   │   │   │   ├── 3.8.json
│   │   │   │   │   ├── 4.0.json
│   │   │   │   │   ├── 4.1.json
│   │   │   │   │   ├── 4.2.json
│   │   │   │   │   ├── 4.3.json
│   │   │   │   │   ├── 4.4.json
│   │   │   │   │   ├── 4.5.json
│   │   │   │   │   ├── 4.6.json
│   │   │   │   │   ├── 4.7.json
│   │   │   │   │   ├── 4.8.json
│   │   │   │   │   ├── 5.0.json
│   │   │   │   │   ├── 5.1.json
│   │   │   │   │   ├── 5.2.json
│   │   │   │   │   ├── 5.3.json
│   │   │   │   │   ├── 5.4.json
│   │   │   │   │   ├── 5.5.json
│   │   │   │   │   ├── 5.6.json
│   │   │   │   │   ├── 5.7.json
│   │   │   │   │   ├── 5.8.json
│   │   │   │   │   ├── 6.0.json
│   │   │   │   │   ├── 6.1.json
│   │   │   │   │   ├── 6.2.json
│   │   │   │   │   ├── 6.3.json
│   │   │   │   │   ├── 6.4.json
│   │   │   │   │   └── 6.5.json
│   │   │   │   └── standard.json
│   │   │   ├── characters.json
│   │   │   ├── country.json
│   │   │   ├── outfits.json
│   │   │   ├── paimon-bargain-characters.json
│   │   │   ├── pricelist.json
│   │   │   ├── updates.json
│   │   │   ├── weapons.json
│   │   │   └── wish-setup.json
│   │   ├── env.js
│   │   ├── helpers/
│   │   │   ├── accessKey.js
│   │   │   ├── assets.js
│   │   │   ├── audio/
│   │   │   │   ├── audio.js
│   │   │   │   ├── bookflip.js
│   │   │   │   ├── camera.js
│   │   │   │   ├── changebanner.js
│   │   │   │   ├── click.js
│   │   │   │   ├── click2.js
│   │   │   │   ├── close.js
│   │   │   │   ├── collectionitem.js
│   │   │   │   ├── exchange.js
│   │   │   │   ├── history.js
│   │   │   │   ├── inventory.js
│   │   │   │   ├── modal.js
│   │   │   │   ├── obtain.js
│   │   │   │   ├── prevbanner.js
│   │   │   │   ├── roll.js
│   │   │   │   ├── shopnav.js
│   │   │   │   ├── shopopen.js
│   │   │   │   └── shopsubnav.js
│   │   │   ├── banner-custom.js
│   │   │   ├── banner-loader.js
│   │   │   ├── browserState.js
│   │   │   ├── chat/
│   │   │   │   ├── badword-list.js
│   │   │   │   ├── badwords.js
│   │   │   │   └── firebaseApp.js
│   │   │   ├── cssPosition.js
│   │   │   ├── currencies.js
│   │   │   ├── dataAPI/
│   │   │   │   ├── api-cookie.js
│   │   │   │   ├── api-filesystem.js
│   │   │   │   ├── api-google.js
│   │   │   │   ├── api-indexeddb.js
│   │   │   │   ├── api-localstore.js
│   │   │   │   ├── data-merger.js
│   │   │   │   ├── export-import.js
│   │   │   │   ├── storage-reader.js
│   │   │   │   ├── storage-reset.js
│   │   │   │   └── sync.js
│   │   │   ├── donation.js
│   │   │   ├── gacha/
│   │   │   │   ├── Wish.js
│   │   │   │   ├── itemdrop-base.js
│   │   │   │   ├── probabilities.js
│   │   │   │   ├── roll.js
│   │   │   │   ├── wishBase.js
│   │   │   │   ├── wishBeginner.js
│   │   │   │   ├── wishCharacter.js
│   │   │   │   ├── wishChronicled.js
│   │   │   │   ├── wishStandard.js
│   │   │   │   └── wishWeapon.js
│   │   │   ├── i18n.js
│   │   │   ├── lazyload.js
│   │   │   ├── meteor-loader.js
│   │   │   ├── migrator/
│   │   │   │   ├── IDBUpdater.js
│   │   │   │   └── collect-old-data.js
│   │   │   ├── mobileDetect.js
│   │   │   ├── nameText.js
│   │   │   ├── noticeMark.js
│   │   │   ├── outfit.js
│   │   │   ├── shareable-link.js
│   │   │   ├── timeago.js
│   │   │   ├── toast.js
│   │   │   ├── transition.js
│   │   │   └── wakeLock.js
│   │   └── store/
│   │       ├── app-stores.js
│   │       ├── drive-store.js
│   │       └── filesystem-store.js
│   ├── locales/
│   │   ├── README.md
│   │   ├── de-DE.json
│   │   ├── en-US.json
│   │   ├── fr-FR.json
│   │   ├── id-ID.json
│   │   ├── it-IT.json
│   │   ├── items/
│   │   │   ├── de-DE.json
│   │   │   ├── en-US.json
│   │   │   ├── it-IT.json
│   │   │   ├── ja-JP.json
│   │   │   ├── ko-KR.json
│   │   │   ├── pt-BR.json
│   │   │   ├── ru-RU.json
│   │   │   ├── vi-VN.json
│   │   │   ├── zh-CN.json
│   │   │   └── zh-TW.json
│   │   ├── ja-JP.json
│   │   ├── ko-KR.json
│   │   ├── pt-BR.json
│   │   ├── ru-RU.json
│   │   ├── th-TH.json
│   │   ├── vi-VN.json
│   │   ├── zh-CN.json
│   │   └── zh-TW.json
│   ├── post/
│   │   ├── banner-guidelines.md
│   │   ├── install-android.md
│   │   ├── install-windows.md
│   │   └── privacy.md
│   ├── routes/
│   │   ├── +error.svelte
│   │   ├── +layout.js
│   │   ├── +layout.svelte
│   │   ├── +page.svelte
│   │   ├── _allbanners/
│   │   │   ├── _form-box.svelte
│   │   │   ├── _item-banner.svelte
│   │   │   └── index.svelte
│   │   ├── _custom-banner/
│   │   │   ├── BannerEditor/
│   │   │   │   ├── BannerArt.svelte
│   │   │   │   ├── RateUpArt.svelte
│   │   │   │   ├── _details-editor.svelte
│   │   │   │   ├── _info-face-button.svelte
│   │   │   │   ├── _preview-generator.svelte
│   │   │   │   ├── _rateup-picker.svelte
│   │   │   │   ├── _splashart-form.svelte
│   │   │   │   └── _vision-picker.svelte
│   │   │   ├── CustomEditor.svelte
│   │   │   ├── ModalDelete.svelte
│   │   │   ├── ModalInitBanner.svelte
│   │   │   ├── Publisher.svelte
│   │   │   └── SplashArtEditor/
│   │   │       ├── SplashArt.svelte
│   │   │       └── _result-card.svelte
│   │   ├── _feedback/
│   │   │   ├── _sidebar.svelte
│   │   │   └── index.svelte
│   │   ├── _gachainfo/
│   │   │   ├── _book-bg.svelte
│   │   │   ├── _title.svelte
│   │   │   ├── details/
│   │   │   │   ├── Details.svelte
│   │   │   │   ├── _description.svelte
│   │   │   │   ├── _list.svelte
│   │   │   │   ├── _promotional-v1.svelte
│   │   │   │   └── _promotional-v2.svelte
│   │   │   ├── history/
│   │   │   │   ├── History.svelte
│   │   │   │   ├── _filter.svelte
│   │   │   │   ├── _legends.svelte
│   │   │   │   ├── _list.svelte
│   │   │   │   ├── _pagination.svelte
│   │   │   │   ├── _report.svelte
│   │   │   │   ├── _reset.svelte
│   │   │   │   └── _select-banner.svelte
│   │   │   └── index.svelte
│   │   ├── _index/
│   │   │   ├── InitialLoader.svelte
│   │   │   ├── ModalConvert.svelte
│   │   │   ├── ModalWelcome.svelte
│   │   │   ├── PreloadMeteor.svelte
│   │   │   ├── ScreenshotShare.svelte
│   │   │   ├── WelkinCheckin.svelte
│   │   │   └── _screenshot-result.svelte
│   │   ├── _inventory/
│   │   │   ├── _background.svelte
│   │   │   ├── _footer.svelte
│   │   │   ├── _header.svelte
│   │   │   ├── _inventory-detail.svelte
│   │   │   ├── _inventory-item.svelte
│   │   │   ├── _inventory-list.svelte
│   │   │   ├── _navlink.svelte
│   │   │   ├── _order.svelte
│   │   │   ├── _outfit-toggle.svelte
│   │   │   └── index.svelte
│   │   ├── _menu/
│   │   │   ├── BackupRestore.svelte
│   │   │   ├── CustomBanner.svelte
│   │   │   ├── ProAccess.svelte
│   │   │   ├── Settings.svelte
│   │   │   ├── Updates.svelte
│   │   │   ├── _options.svelte
│   │   │   ├── _sidebar.svelte
│   │   │   ├── backup-restore/
│   │   │   │   ├── _auto-export.svelte
│   │   │   │   ├── _drop-import.svelte
│   │   │   │   ├── _modal-import.svelte
│   │   │   │   ├── _sync-cloud.svelte
│   │   │   │   └── _sync-local.svelte
│   │   │   └── index.svelte
│   │   ├── _shop/
│   │   │   ├── _aside.svelte
│   │   │   ├── _header.svelte
│   │   │   ├── _modal-balance.svelte
│   │   │   ├── _modal-exchange.svelte
│   │   │   ├── _navlink-top-button.svelte
│   │   │   ├── _navlink-top.svelte
│   │   │   ├── _shop-group-item.svelte
│   │   │   ├── _shop-group.svelte
│   │   │   ├── character-outfit/
│   │   │   │   ├── CharacterOutfits.svelte
│   │   │   │   └── _modal-confirm.svelte
│   │   │   ├── donate/
│   │   │   │   └── Donate.svelte
│   │   │   ├── genesis-topup/
│   │   │   │   ├── GenesisTopup.svelte
│   │   │   │   └── _modal-topup.svelte
│   │   │   ├── index.svelte
│   │   │   ├── paimon-bargains/
│   │   │   │   ├── PaimonBargains.svelte
│   │   │   │   └── _character-item.svelte
│   │   │   └── recomended/
│   │   │       ├── Recomended.svelte
│   │   │       ├── _item-outfit.svelte
│   │   │       ├── _item-welkin.svelte
│   │   │       └── _modal-welkin.svelte
│   │   ├── _wish/
│   │   │   ├── _banner-button.svelte
│   │   │   ├── _banner-item.svelte
│   │   │   ├── _footer.svelte
│   │   │   ├── _header.svelte
│   │   │   ├── _out-of-primogem.svelte
│   │   │   ├── banner-card/
│   │   │   │   ├── BannerCard.svelte
│   │   │   │   ├── __dropnotes.svelte
│   │   │   │   ├── _banner-image.svelte
│   │   │   │   ├── _chronicled/
│   │   │   │   │   ├── _epitomized.svelte
│   │   │   │   │   ├── _rateup-item.svelte
│   │   │   │   │   ├── _rateuplist-horizontal.svelte
│   │   │   │   │   ├── artwork.svelte
│   │   │   │   │   ├── bannerSpace.svelte
│   │   │   │   │   ├── rateupSelector.svelte
│   │   │   │   │   └── textLayer.svelte
│   │   │   │   ├── _frame-beginner.svelte
│   │   │   │   ├── _frame-character.svelte
│   │   │   │   ├── _frame-custom.svelte
│   │   │   │   ├── _frame-standard.svelte
│   │   │   │   ├── _frame-weapon.svelte
│   │   │   │   └── _probability-editor.svelte
│   │   │   ├── epitomized-path/
│   │   │   │   ├── EpitomizedPath.svelte
│   │   │   │   ├── WeaponButton.svelte
│   │   │   │   ├── _chronicled-details.svelte
│   │   │   │   ├── _description.svelte
│   │   │   │   ├── _icon.svelte
│   │   │   │   ├── _item-selection.svelte
│   │   │   │   └── _svg-background.svelte
│   │   │   ├── index.svelte
│   │   │   └── wish-result/
│   │   │       ├── ResultList.svelte
│   │   │       ├── WishResult.svelte
│   │   │       ├── _item-info.svelte
│   │   │       ├── _meteor.svelte
│   │   │       ├── _result-list-item.svelte
│   │   │       ├── _splash-art.svelte
│   │   │       ├── _splash-light.svelte
│   │   │       └── _weapon-bonus.svelte
│   │   ├── adkey/
│   │   │   └── +page.svelte
│   │   ├── bnlist/
│   │   │   ├── +page.svelte
│   │   │   └── _list.svelte
│   │   ├── install/
│   │   │   └── +page.svelte
│   │   ├── privacy-policy/
│   │   │   └── +page.svelte
│   │   └── screen/
│   │       ├── +page.svelte
│   │       ├── chars/
│   │       │   └── +page.svelte
│   │       ├── wishitem/
│   │       │   └── +page.svelte
│   │       └── wishlist/
│   │           └── +page.svelte
│   └── sw.js
├── static/
│   ├── .nojekyll
│   ├── .well-known/
│   │   └── assetlinks.json
│   ├── browserconfig.xml
│   ├── google77966abbed90508f.html
│   ├── icons.css
│   ├── robots.txt
│   ├── sfx/
│   │   ├── result-list.ogg
│   │   ├── reveal-3star.ogg
│   │   ├── reveal-4star.ogg
│   │   ├── reveal-5star.ogg
│   │   └── wish-backsound.ogg
│   ├── sitemap.xml
│   └── videos/
│       └── bg.webm
├── svelte.config.js
├── vite.config.js
└── vite.config.js.timestamp-1760945763883.mjs

================================================
FILE CONTENTS
================================================

================================================
FILE: .browserslistrc
================================================
# Browsers that we support

last 4 version
>0.3%
not ie <= 8
not dead

================================================
FILE: .eslintrc.cjs
================================================
module.exports = {
	root: true,
	extends: ['eslint:recommended', 'prettier'],
	plugins: ['svelte3'],
	overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }],
	parserOptions: {
		sourceType: 'module',
		ecmaVersion: 2021
	},
	env: {
		browser: true,
		es2017: true,
		node: true
	}
};


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: #
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: mantan21
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
custom: ['https://trakteer.id/mantan21', 'https://saweria.co/AguzzTN54']


================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"

on:
  push:
    branches: [ "master" ]
  pull_request:
    # The branches below must be a subset of the branches above
    branches: [ "master" ]
  schedule:
    - cron: '39 11 * * 0'

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write

    strategy:
      fail-fast: false
      matrix:
        language: [ 'javascript' ]
        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
        # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support

    steps:
    - name: Checkout repository
      uses: actions/checkout@v3

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v2
      with:
        languages: ${{ matrix.language }}
        # If you wish to specify custom queries, you can do so here or in a config file.
        # By default, queries listed here will override any specified in a config file.
        # Prefix the list here with "+" to use these queries and those in the config file.
        
        # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
        # queries: security-extended,security-and-quality

        
    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
    # If this step fails, then you should remove it and run the build manually (see below)
    - name: Autobuild
      uses: github/codeql-action/autobuild@v2

    # ℹ️ Command-line programs to run using the OS shell.
    # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun

    #   If the Autobuild fails above, remove it and uncomment the following three lines. 
    #   modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.

    # - run: |
    #   echo "Run, Build Application using script"
    #   ./location_of_script_within_repo/buildscript.sh

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v2


================================================
FILE: .gitignore
================================================
.DS_Store
node_modules
/build
/dist
/.svelte-kit
/package
/static/g

.vercel_build_output
.vercel
.env

README.html

CNAME

### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*

ads.txt

================================================
FILE: .prettierrc
================================================
{
	"useTabs": true,
	"singleQuote": true,
	"trailingComma": "none",
	"printWidth": 100,
	"endOfLine": "crlf"
}


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2022 WishSImulator.App

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# Realistic Genshin Impact Wish Simulator

![License](https://badgen.net/github/license/Mantan21/Genshin-Impact-Wish-Simulator?icon:github) ![Repo Size](https://img.shields.io/github/repo-size/Mantan21/Genshin-Impact-Wish-Simulator?color=fa0) [![CodeFactor](https://www.codefactor.io/repository/github/mantan21/genshin-impact-wish-simulator/badge)](https://www.codefactor.io/repository/github/Mantan21/genshin-impact-wish-simulator) ![Status](https://badgen.net/github/checks/Mantan21/Genshin-Impact-Wish-Simulator) ![Code Standard](https://badgen.net/badge/code%20style/standard/f2a) [![Trakteer](https://badgen.net/badge/Trakteer/Mantan21/BE1E2D)](https://trakteer.id/mantan21)

I'm not an expert, and I may not write the cleanest code, but I've tried to create this Genshin Impact Wish Simulator. I believe it's the most realistic one for the web version. However, I still need your feedback to improve the wishing experience. If you enjoy this simulator, please consider giving a star to this repository.

## Screenshots

#### Main Banner

![Main Banner](static/meta-picture.jpg)

#### Layout on Mobile Version

![Weapon Banner](screenshot/mobile-weapon.jpg)

#### Epitomized Path

![Epitomized Path](screenshot/epitomized-path.jpg)

#### Inventory

![Weapon Banner](screenshot/inventory.jpg)

#### Switch banner

![Weapon Banner](screenshot/switch-banner.jpg)

#### Shop

![Buying Welkin](https://user-images.githubusercontent.com/13815468/212980583-7539f527-c6bb-4005-8322-8996b59937fe.gif)

> For more preview, please visit the live version at [https://wishsimulator.app](https://wishsimulator.app)

---

## Features

1. **All banner types are available** ( Beginner, Standard, Event and Weapon Banner )
2. Dual or Single Character Event Banner.
3. **Epitomized Path System** for Weapon Banner start from version 2.0 - latest.
4. **Custom Banner Maker**, Users can create their own banners and share them to other travelers over the internet
5. The Pity System is designed to mimic the mechanics of the real game closely.
6. **The most complete set of banners** among all existing simulators. Users can switch and engage in gacha on every banner, starting from version 1.0 to the latest.
7. The Gacha Milestone Bonus, Starglitter, and Stardust can be exchanged for Acquaint or Intertwined Fate at the Shop section.
8. **Shop** serves Gacha currencies, outfits, and Welkin.
9. Users can purchase outfits and the Blessing of the Welkin Moon.
10. Pity is shared with the previous banner, allowing users to continuously engage in gacha on different patches without resetting the pity counter.
11. **Wish Details** for each banner.
12. Different banner type has different **Gacha History**
13. **Inventory** to show all items ( Weapons, Characters and Outfits ) that already owned by gacha or purchasement
14. Screenshot and download wish result as Image localy.
15. Pity Counter, Users can track their current information and history of their pity
16. Site Localization: I hope this Wish Simulator can reach more people, even those who aren't English speakers.
17. Mobile Friendly, responsive layout both landscape and portrait orientation.
18. LLink generator is available if users want to share their gacha results on the internet.
19. All user data will be saved to local storage and indexedDB.

## Pity System

I don't know how HoyoVerse's algorithm is, so I tried to create mine as realistic as possible with the following points based on in-game wish details.

> In order to get the same experience with the game when doing gacha, I tried to use the following formula for determining the gacha rates according to the current pity
>
> `baseRate + ((CurrentPity - HardPity) * additionalRate)`
>
> To get the number of `additionalRate`, I calculated `100% - baseRate` and divide it by the difference between `HardPity` to `MaxPity`.
> [Check here](https://github.com/Mantan21/Genshin-Impact-Wish-Simulator/blob/master/src/lib/helpers/gacha/probabilities.js#L4-L19) to see how I implemented it as code

Based on the formula above, it can be concluded that the probability table is as follows:

1. Probability for 4★ item on Character Event Wish

   - 4★ item guaranteed at `10` roll and promoted 4★ item guaranteed at `20` roll.
   - Base rate to get 4★ item is `5.1%`, guaranteed to get 4★ item at pity `10`

   | **Pity** |  1   |  2   |  3   |  4   |  5   |  6   |  7   |  8   |   9    | ≥10  |
   | -------: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :----: | :--: |
   | **Rate** | 5.1% | 5.1% | 5.1% | 5.1% | 5.1% | 5.1% | 5.1% | 5.1% | 52.55% | 100% |

2. Probability for 4★ item on Weapon Event Wish

   - 4★ item guaranteed at `10` roll and promoted 4★ item guaranteed at `20` roll.
   - Base rate to get 4★ item is `6.6%`, guaranteed to get 4★ item at pity `10`

   | **Pity** |  1   |  2   |  3   |  4   |  5   |  6   |  7   |  8   |   9   | ≥10  |
   | -------: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :---: | :--: |
   | **Rate** | 6.0% | 6.0% | 6.0% | 6.0% | 6.0% | 6.0% | 6.0% | 6.0% | 53.0% | 100% |

3. Weapon Wish Probability

   - 5★ Item guaranteed at `80` roll and promoted 5★ item guaranteed at `160` roll.
   - Probability to get 5★ item is `0.7%`, the rate starts to increase at pity 63 and then guaranteed at pity `80`.

   | **Pity** | ≤62  |  63   |   64   |   65   |   66   |   67   |   68   |   69   |   70   |   71   |   72   |   73   |  74   |   75   |   76   |   77   |   78   |   79   | ≥80  |
   | -------: | :--: | :---: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :---: | :----: | :----: | :----: | :----: | :----: | :--: |
   | **Rate** | 0.7% | 6.21% | 11.77% | 17.25% | 22.76% | 28.28% | 33.80% | 39.31% | 44.83% | 50.35% | 55.86% | 61.38% | 66.9% | 72.41% | 77.93% | 83.45% | 88.96% | 94.48% | 100% |

4. Character Event and Standard Wish Probability

   - 5★ Item guaranteed at `90` roll and promoted 5★ item guaranteed at `180` roll.
   - Probability to get 5★ item is `0.6%`, the rate starts to increase at pity 74 and then guaranteed at pity `90`.

   | **Pity** | ≤73  |  74   |  75   |   76   |   77   |   78   |   79   |   80   |   81   |   82   |   83   |   84   |   85   |   86   |   87   |   88   |   89   | ≥90  |
   | -------: | :--: | :---: | :---: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :--: |
   | **Rate** | 0.6% | 6.45% | 12.3% | 18.14% | 23.99% | 29.83% | 35.68% | 41.53% | 47.38% | 53.22% | 59.07% | 64.92% | 70.76% | 76.61% | 82.46% | 88.30% | 94.15% | 100% |

5. When you guaranteed for *5 and *4 item at the same time, your next pull priority is *5 item and *4 item will appear next at pity 11. For example: On Character Event Banner, you doesn't get *5 item until pity 89 and your *4 pity is 9, So your next pull will looks like screenshot below.

   ![double guaranteed](screenshot/double-guaranteed.png)

## Development

This app build with [Svelte-Kit](https://kit.svelte.dev/) based on Javascript programming language.

Once you've cloned this project, install all dependencies with `npm install` (or `pnpm install` or `yarn`). Once all dependencies already installed, then you can start a development server or build for production:

```bash
npm run dev

# or start the server and open the app in a new browser tab
npm run dev -- --open
```

### How to Update new banner

- The guide to Add New Banner are moved to Wiki, [Read Here](https://github.com/Mantan21/Genshin-Impact-Wish-Simulator/wiki/How-to-Add-more-Banner)

## Building

Before creating a production version of your app, install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment, then run the command below. As default, this project use [Vercel Adapter](https://github.com/sveltejs/kit/tree/master/packages/adapter-vercel) and can be deployed to [Vercel.com](https://vercel.com)

```bash
npm run build
```

## Deployment

Before Deploy to online server, please setup the environment variables by renaming file `.env.example` to `.env` and change the variables if needed.

\*\* You can still deploy the app without even set the environment variables

---

## Contributing

I'm welcome to all contributors! Feel free to [open new Issue](https://github.com/Mantan21/Genshin-Impact-Wish-Simulator/issues/new) if you find any problem or just want to give any suggestions.

### Thank You to all Contributors

[![Contributor](https://contrib.rocks/image?repo=Mantan21/Genshin-Impact-Wish-Simulator)](https://github.com/Mantan21/Genshin-Impact-Wish-Simulator/graphs/contributors)

> **Notes :**
>
> The data and assets used for this Project are taken from [Hoyo Wiki](https://wiki.hoyolab.com/), [Genshin Fandom Wiki](https://genshin-impact.fandom.com/wiki/Genshin_Impact_Wiki), [Honey Impact](https://genshin.honeyhunterworld.com/) and recorded from the game itself with several modification. <br/> **Important thing**: This App is not affiliated with Hoyoverse, all assets used for this application belongs to [Hoyoverse](http://hoyoverse.com/), so if you want to use assets from this repository, please credit them too.


================================================
FILE: jsconfig.json
================================================
{
	"compilerOptions": {
		"baseUrl": ".",
		"paths": {
			"$lib": ["src/lib"],
			"$lib/*": ["src/lib/*"],
			"$post": ["src/post"],
			"$post/*": ["src/post/*"]
		},
		"preserveValueImports": false,
		"allowJs": true,
		"esModuleInterop": true,
		"forceConsistentCasingInFileNames": true,
		"resolveJsonModule": true,
		"skipLibCheck": true,
		"sourceMap": true,
		"strict": true,
		"ignoreDeprecations": "5.0"
	},
	"include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.svelte"],
	"extends": "./.svelte-kit/tsconfig.json"
}


================================================
FILE: package.json
================================================
{
	"name": "wishsimulator.app",
	"description": "Realistic Genshin Impact Wish Simulator, Unlimited Gacha, 100% running on browser",
	"version": "2.0.0",
	"author": {
		"name": "AguzzTN54",
		"email": "admin@wishsimulator.app",
		"url": "https://github.com/AguzzTN54"
	},
	"repository": {
		"url": "https://github.com/AguzzTN54/Genshin-Impact-Wish-Simulator"
	},
	"license": "MIT",
	"homepage": "https://wishsimulator.app",
	"scripts": {
		"dev": "vite dev",
		"build": "vite build",
		"preview": "vite preview",
		"check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json",
		"check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch",
		"lint": "prettier --plugin-search-dir . --check . && eslint .",
		"format": "prettier --plugin-search-dir . --write ."
	},
	"type": "module",
	"devDependencies": {
		"@sveltejs/adapter-vercel": "^1.0.0-next.66",
		"@sveltejs/kit": "^1.0.0-next.551",
		"autoprefixer": "^10.4.8",
		"dotenv": "^16.3.1",
		"eslint": "^8.16.0",
		"eslint-config-prettier": "^8.3.0",
		"eslint-plugin-svelte3": "^4.0.0",
		"postcss": "^8.4.16",
		"postcss-load-config": "^4.0.1",
		"postcss-nested": "^5.0.6",
		"prettier": "^2.6.2",
		"prettier-plugin-svelte": "^2.7.0",
		"svelte": "^3.47.0",
		"svelte-check": "^2.9.2",
		"svelte-preprocess": "^4.10.6",
		"uuid": "^9.0.0",
		"vite": "^3.1.8",
		"vite-imagetools": "^6.2.3",
		"vite-plugin-markdown": "^2.1.0",
		"vite-plugin-pwa": "^0.13.1",
		"workbox-cacheable-response": "^6.5.4",
		"workbox-core": "^6.5.4",
		"workbox-precaching": "^6.5.4",
		"workbox-routing": "^6.5.4"
	},
	"dependencies": {
		"file-saver": "^2.0.5",
		"firebase": "^9.19.1",
		"hotkeys-js": "^3.12.0",
		"howler": "^2.2.3",
		"html-to-image": "^1.8.5",
		"idb": "^6.1.2",
		"overlayscrollbars": "^1.13.1",
		"svelte-i18n": "^3.4.0",
		"zoomist": "^2.0.10"
	}
}


================================================
FILE: postcss.config.js
================================================
import postcssNested from 'postcss-nested';
import autoprefixer from 'autoprefixer';

export default {
	plugins: [postcssNested, autoprefixer]
};


================================================
FILE: src/app.css
================================================
:root {
	letter-spacing: -0.02rem;
	--gi-global-font: 'GI_Global_Web', 'GI_JA_Web', 'GI_TH_Web', 'GI_TH_Web', 'GI_ZH_Web', Arial,
		-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans',
		'Helvetica Neue', sans-serif;
	--gi-ja-font: 'GI_JA_Web', Arial, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
		Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
	--gi-ko-font: 'GI_KO_Web', Arial, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
		Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
	--gi-th-font: 'GI_TH_Web', Arial, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
		Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
	--gi-zh-font: 'GI_ZH_Web', Arial, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
		Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
	--secondary-color: #4f6d95;
	--tertiary-color: #f7f3d8;
	--text-color: #444444;
}

* {
	margin: 0;
	padding: 0;
	box-sizing: border-box;
}
::-webkit-scrollbar {
	width: 5px;
}
::-webkit-scrollbar-thumb {
	background-color: rgba(210, 198, 156, 0.5);
	border-radius: 5px;
	transition: all 0.2s;
}
::-webkit-scrollbar-thumb:hover {
	background-color: rgba(210, 198, 156, 1);
}

body {
	overflow: hidden;
	margin: 0;
}

body,
button:hover,
input,
label,
a:hover {
	user-select: none;
	-moz-user-select: -moz-none;
	-khtml-user-select: none;
	-webkit-user-select: none;
	-ms-user-select: none;
	-webkit-user-drag: none;
	cursor: url(data:image/png;base64,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),
		auto;
}

.icon-gradient {
	background-clip: text;
	text-fill-color: transparent;
	-webkit-background-clip: text;
	-webkit-text-fill-color: transparent;
}

.icon-gradient.dendro {
	background-image: linear-gradient(to right, #a6d138 30%, #aaef3a 45%, #a6d138 75%);
}
.icon-gradient.hydro {
	background-image: linear-gradient(to right, #06bbff, #06bbff, #10e2ff, #06bbff, #06bbff);
}
.icon-gradient.geo {
	background-image: linear-gradient(to right, #f9aa02, #f9aa02, #fcd260, #f9aa02, #f9aa02);
}
.icon-gradient.pyro {
	background-image: linear-gradient(to right, #fe6606, #fe6606, #fea76b, #fe6606, #fe6606);
}
.icon-gradient.anemo {
	background-image: linear-gradient(to right, #32d9a1, #32d9a1, #aef2cd, #32d9a1, #32d9a1);
}
.icon-gradient.electro {
	background-image: linear-gradient(to right, #ca82fc, #ca82fc, #deb5fe, #ca82fc, #ca82fc);
}
.icon-gradient.cryo {
	background-image: linear-gradient(to right, #7cfeff, #7cfeff, #c6fffd, #7cfeff, #7cfeff);
}

.filter-drop.dendro {
	filter: drop-shadow(0 0 6px rgba(114, 255, 6, 0.6));
}
.filter-drop.hydro {
	filter: drop-shadow(0 0 6px rgba(6, 187, 255, 0.6));
}
.filter-drop.geo {
	filter: drop-shadow(0 0 6px rgba(249, 170, 2, 0.6));
}
.filter-drop.pyro {
	filter: drop-shadow(0 0 6px rgba(254, 102, 6, 0.6));
}
.filter-drop.anemo {
	filter: drop-shadow(0 0 6px rgba(50, 217, 161, 0.6));
}
.filter-drop.electro {
	filter: drop-shadow(0 0 6px rgba(202, 130, 252, 0.6));
}
.filter-drop.cryo {
	filter: drop-shadow(0 0 6px rgba(124, 254, 255, 0.6));
}

.dendro-flat {
	color: #64ad15;
}
.hydro-flat {
	color: #3f8ed1;
}
.geo-flat {
	color: #cb8f46;
}
.pyro-flat {
	color: #ee6c4c;
}
.anemo-flat {
	color: #359697;
}
.electro-flat {
	color: #7d67c5;
}
.cryo-flat {
	color: #46c2d8;
}
.wanderlust-flat {
	color: #757acdff;
}
.epitome-flat {
	color: #ef7c1aff;
}

.bg-dendro {
	background-color: #64ad15;
}
.bg-hydro {
	background-color: #3d6db5;
}
.bg-geo {
	background-color: #b88f47;
}
.bg-pyro {
	background-color: #c45b31;
}
.bg-anemo {
	background-color: #359697;
}
.bg-electro {
	background-color: #8246ba;
}
.bg-cryo {
	background-color: #5cd2e3;
}
.bg-wanderlust {
	background-color: #757acdff;
}
.bg-epitome {
	background-color: #ef7c1aff;
}

.card-stroke {
	/* prettier-ignore */
	text-shadow:
	-0.03rem -0.03rem 0 #f7f3eb,
	 0   		 -0.03rem 0 #f7f3eb,
	 0.03rem -0.03rem 0 #f7f3eb,
	 0.03rem  0 		  0 #f7f3eb,
	 0.03rem  0.03rem 0 #f7f3eb,
	 0    		0.03rem 0 #f7f3eb,
	-0.03rem  0.03rem 0 #f7f3eb,
	-0.03rem  0		    0 #f7f3eb;
}

#svelte {
	display: flex;
	flex-direction: column;
}

h1,
h2,
p {
	font-weight: 400;
}

p {
	line-height: 1.5;
}

a {
	color: var(--accent-color);
	text-decoration: none;
}

a:hover {
	text-decoration: underline;
}

h1 {
	font-size: 2rem;
	text-align: center;
}

h2 {
	font-size: 1rem;
}

pre {
	font-size: 16px;
	font-family: var(--font-mono);
	background-color: rgba(255, 255, 255, 0.45);
	border-radius: 3px;
	box-shadow: 2px 2px 6px rgb(255 255 255 / 25%);
	padding: 0.5em;
	overflow-x: auto;
	color: var(--text-color);
}

img {
	object-fit: cover;
	-webkit-user-drag: none;
	-khtml-user-drag: none;
	-moz-user-drag: none;
	-o-user-drag: none;
	user-drag: none;
}

input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
	-webkit-appearance: none;
	margin: 0;
}
input[type='number'] {
	-moz-appearance: textfield;
}

input:focus {
	border: none;
	outline: none;
}

input,
button {
	font-size: inherit;
	font-family: inherit;
	letter-spacing: -0.03rem;
}

button:focus:not(:focus-visible) {
	outline: none;
}

button {
	background-color: transparent;
	border: 0;
	outline: 0;
	font-size: 1rem;
}

input.wishinput {
	height: 2.3rem;
	font-size: 90%;
	width: 100%;
	border-radius: 10rem;
	outline: none;
	padding: 2% 6%;
	font-family: var(--gi-global-font);
	color: #3b4255;
	border: 0;
	transition: 0.2s;
}
input.wishinput:focus,
input.wishinput:hover {
	border-color: #fff;
	box-shadow: rgb(160 175 190 / 60%) 0px 0px 7px 5px;
}
:global(.mobile) input.wishinput {
	height: 2.1rem;
}

input.wishinput.error {
	border: #ee6c4c 2px solid;
}
input.wishinput.error:focus,
input.wishinput.error {
	box-shadow: rgba(222, 47, 34, 0.7) 0px 0px 7px 5px;
}

h1 {
	font-size: 1.3rem;
}

.mobile,
.mobile button {
	font-size: 0.85rem;
}

.gi-close {
	line-height: 0;
}

.close {
	display: inline-flex;
	justify-content: center;
	align-items: center;
	aspect-ratio: 1/1;
	width: 35px;
	height: 35px;
	color: rgba(0, 0, 0, 0.7);
	background-color: #e0ddd4;
	border: 3.5px solid #abbcc6;
	padding: 0;
	line-height: 0;
	overflow: hidden;
	border-radius: 50px;
	transition: all 0.2s;
}

.close:active {
	transform: scale(0.9);
	color: #fff;
	border-color: darkgray !important;
}

.close:hover {
	border-color: #fff;
	box-shadow: rgb(160 175 190 / 60%) 0px 0px 7px 5px;
}

.mobile .close {
	width: 2rem;
	height: 2rem;
}

/* Select Option */
.selector {
	color: #3a4156;
	margin: 0 0.5rem;
	display: inline-block;
	width: 240px;
	max-width: 40%;
	position: relative;
	text-transform: capitalize;
	font-size: 0.85rem;
}

.selected-option {
	background-color: #ede5d8;
	padding: 0.45rem 2rem 0.45rem 1.5rem;
	border-radius: 10rem;
	transition: all 0.2s;
	text-align: left;
}

.selected-option i {
	display: inline-block;
	position: absolute;
	right: 1rem;
}

.sort-button:active,
.selected-option:active {
	color: #fff;
	border-color: darkgray;
}

.sort-button:hover,
.selected-option:hover {
	border-color: #fff;
	box-shadow: rgb(160 175 190 / 60%) 0px 0px 7px 5px;
}

.option-list {
	position: absolute;
	display: flex;
	flex-direction: column;
	width: 100%;
	background-color: #565a64;
	border-radius: 1rem;
	padding: 1% 1.5%;
	z-index: +10;
	overflow: hidden;
}

.option-list.above {
	top: -10%;
	transform: translateY(-100%);
}

.option-list.below {
	top: 110%;
}

.option-list button {
	position: relative;
	padding: 0.85rem 1rem;
	margin: 0.5% 0;
	text-decoration: none;
	color: #eee;
	transition: all 0.2s;
	text-align: left;
}

.option-list button.selected,
.option-list button:hover {
	background-color: #717887;
	border-radius: 2rem;
}

.option-list button.selected::after {
	content: '✔';
	color: #eee;
	position: absolute;
	display: block;
	top: 50%;
	right: 8%;
	font-size: 170%;
	line-height: 0;
	transform: translateY(-50%);
}

/* Button */
.btn {
	display: inline-flex;
	justify-content: center;
	align-items: center;
	width: 1.8rem;
	height: 1.8rem;
	line-height: 0rem;
	color: #3a4156;
	background-color: #ede5d8;
	font-size: 1rem;
	border-radius: 100%;
	transition: 0.2s;
}

.btn:active {
	color: #fff;
	border-color: darkgray;
}

.btn:hover {
	border-color: #fff;
	box-shadow: rgb(160 175 190 / 60%) 0px 0px 7px 5px;
}

.gi-exchange {
	transform: rotate(90deg);
}

.btn:active {
	transform: scale(0.9);
}
@media screen and (max-width: 900px) {
	body,
	html {
		font-size: 0.8rem;
	}

	.close {
		width: 2.5rem;
		height: 2.5rem;
		margin: 3px;
	}
}

@media screen and (max-width: 700px) {
	input.wishinput {
		font-size: 150%;
	}
}

@media screen and (max-width: 400px) {
	body,
	html {
		font-size: 0.7rem;
	}
	h1 {
		font-size: 1.5rem;
	}
}


================================================
FILE: src/app.html
================================================
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="utf-8" />
		<meta
			name="viewport"
			content="width=device-width,initial-scale=1,shrink-to-fit=no,user-scalable=no"
		/>
		<meta name="a.validate.02" content="gc8Hcbkq-w-3WEWF_q38cMwWsDdHhE5icT8F" />
		<meta name="google-site-verification" content="zn73VlG6JLf_oG3P8jQVbKGlDkQ9s6JcR6qZLzT2tVI" />
		<meta name="google-adsense-account" content="ca-pub-1874822310102113" />

		<meta property="og:type" content="profile" />
		<meta property="profile:username" content="AguzzTN54" />
		<meta property="twitter:card" content="summary_large_image" />
		<meta name="author" content="AguzzTN54" />
		<meta name="robots" content="index, follow" />

		<meta name="language" content="English" />
		<meta property="og:locale" content="en_US" />
		<meta property="og:locale:alternate" content="id_ID" />
		<meta property="og:locale:alternate" content="it_IT" />
		<meta property="og:locale:alternate" content="ja_JP" />
		<meta property="og:locale:alternate" content="pt_BR" />
		<meta property="og:locale:alternate" content="ru_RU" />
		<meta property="og:locale:alternate" content="th_TH" />
		<meta property="og:locale:alternate" content="vi_VN" />
		<meta property="og:locale:alternate" content="zh_CN" />
		<title>Genshin Impact Wish Simulator</title>

		<link rel="stylesheet" href="/icons.css" />
		<link rel="icon" href="/favicon.ico" />
		<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
		<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5" />
		<meta name="msapplication-TileColor" content="#2d89ef" />
		<meta name="theme-color" content="#ffffff" />

		%sveltekit.head%

		<script async src="https://www.googletagmanager.com/gtag/js?id=UA-211756322-1"></script>
		<script>
			window.dataLayer = window.dataLayer || [];
			function gtag() {
				dataLayer.push(arguments);
			}
			gtag('js', new Date());
			gtag('config', 'UA-211756322-1');
		</script>
	</head>
	<body>
		<div id="svelte" class="svelte">%sveltekit.body%</div>
	</body>
</html>


================================================
FILE: src/global.d.ts
================================================
/// <reference types="@sveltejs/kit" />


================================================
FILE: src/lib/components/ButtonGeneral.svelte
================================================
<script>
	import { createEventDispatcher } from 'svelte';
	export let disabled = false;
	export let dark = false;

	const dispatch = createEventDispatcher();
	const click = () => dispatch('click');
</script>

<button on:click|preventDefault|stopPropagation={click} {disabled} class:dark>
	<slot />
</button>

<style>
	button {
		position: relative;
		border: 3.5px solid transparent;
		border-radius: 50px;
		background-color: #e0ddd4;
		box-shadow: 0 2px 2px 0 rgba(100, 100, 100, 0.2), 0 2px 2px 0 rgba(100, 100, 100, 0.19);
		padding: 0.25rem 1.5rem;
		margin: 2px 5px;
		transition: all 0.2s;
		border: solid transparent;
		font-size: 90%;
	}

	button.dark {
		color: white;
		background-color: #4a5265;
	}

	button:hover:not(:disabled) {
		border-color: #fff;
	}

	button:active:not(:disabled) {
		animation-name: colourchange;
		animation-duration: 0.2s;
		animation-fill-mode: forwards;
		transform: scale(0.95);
	}

	@keyframes colourchange {
		50% {
			color: #ffffda;
			background: #ede9cc;
		}
		100% {
			border-color: darkgray;
			color: white;
			background: linear-gradient(rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05)), #e0ddd4;
		}
	}

	:global(.mobile) button {
		margin: 1px 2px;
		padding: 0.15rem 1.3rem;
		font-size: 90%;
	}

	@media screen and (max-width: 900px) {
		button {
			margin: 2px 5px;
		}
	}

	@media screen and (max-width: 400px) {
		button {
			font-size: 120%;
			margin: 1px 2px;
		}
	}
</style>


================================================
FILE: src/lib/components/ButtonModal.svelte
================================================
<script>
	import { createEventDispatcher } from 'svelte';
	import { t } from 'svelte-i18n';

	const isSlotpresent = $$props.$$slots;
	export let type = 'confirm';
	export let text = '';
	export let disabled = false;
	export let light = false;
	export let width = '';
	export let icon = '';

	const dispatch = createEventDispatcher();
	const click = () => dispatch('click');
</script>

<button
	on:click|preventDefault={click}
	{disabled}
	class:light
	style={width ? `width:${width}` : ''}
>
	{#if icon}
		<i class="gi-{icon}" />
	{:else if type === 'confirm'}
		<i class="gi-circle-o" />
	{:else}
		<i class="gi-times" />
	{/if}

	{#if isSlotpresent}
		<slot />
	{:else}
		<span>
			{text || (type === 'confirm' ? $t('confirmButton') : $t('cancelButton'))}
		</span>
	{/if}
</button>

<style>
	button {
		border-radius: 40px;
		align-items: center;
		padding: 0 0 0 0.3em;
		max-width: 100%;
		height: 2.3rem;
		transition: all 0.2s;
		position: relative;
		text-align: center;
		border: 3.5px solid transparent;
		transition: all 0.2s;
		width: 200px;
	}
	button.light {
		background-color: #ece5d8;
		color: #4a5265;
	}

	button:not(.light) {
		color: white;
		background-color: #4a5265;
	}

	button:active:not(:disabled) {
		transform: scale(0.9);
		background-color: #e0ddd4 !important;
		border-color: rgb(195, 195, 195) !important;
		box-shadow: rgb(160 175 190 / 60%) 0px 0px 7px 5px;
		color: #fff;
	}

	button:disabled {
		opacity: 0.7;
	}

	button i {
		width: 1.7rem;
		height: 1.7rem;
		background-color: #353533;
		border-radius: 100%;
		display: inline-flex;
		justify-content: center;
		align-items: center;
		font-size: 0.8rem;
		position: absolute;
		left: 2%;
		top: 50%;
		transform: translateY(-50%);
	}
	button:hover:not(:disabled) {
		background-color: rgb(51, 57, 71);
	}

	button.light:hover:not(:disabled) {
		background-color: #c3b8a1;
	}

	button i {
		color: #ffc107;
	}
	button i.gi-times {
		color: #3f9ad1;
	}

	:global(.mobile) button {
		height: 2.1rem;
	}
	:global(.mobile) button:not(.light) {
		width: 130px;
	}

	@media screen and (max-width: 700px) {
		:global(main):not(.mobile) button {
			font-size: 0.85rem;
		}
		:global(main):not(.mobile) button:not(.light) {
			width: 120px;
		}
	}
</style>


================================================
FILE: src/lib/components/CheckBox.svelte
================================================
<script>
	import { playSfx } from '$lib/helpers/audio/audio';
	import { createEventDispatcher } from 'svelte';

	export let checked = false;
	export let id = '_0';

	const dispatch = createEventDispatcher();
	const change = (e) => {
		const { checked } = e.target;
		dispatch('change', { checked });
		playSfx('click2');
	};
</script>

<div class="checkbox">
	<input type="checkbox" name="check{id}" id="check{id}" {checked} on:change={change} />
	<label for="check{id}">
		<i>✔</i>
		<slot />
	</label>
</div>

<style>
	.checkbox {
		margin: 1%;
	}

	label {
		cursor: inherit;
	}
	.checkbox input + label i {
		color: white;
		display: inline-block;
		width: 1.1rem;
		aspect-ratio: 1/1;
		line-height: 1rem;
		background-color: #fff;
		border: 1px solid #aaa;
		transition: all 0.2s;
		text-align: center;
	}

	.checkbox input:checked + label i {
		background-color: #06bbff;
		border-color: transparent;
	}

	.checkbox:hover input + label i {
		border: 1px solid #06bbff;
		box-shadow: rgba(106, 168, 230, 0.6) 0px 0px 7px 5px;
	}

	.checkbox input {
		display: none;
	}
</style>


================================================
FILE: src/lib/components/Icon.svelte
================================================
<script>
	import { assets } from '$lib/store/app-stores';

	export let type = '';
	export let width = '20px';
	export let height = 'auto';
	export let style = '';

	$: pic = {
		acquaint: $assets['acquaint-fate.webp'],
		intertwined: $assets['intertwined-fate.webp'],
		stardust: $assets['masterless-stardust.webp'],
		starglitter: $assets['masterless-starglitter.webp'],
		primogem: $assets['primogem.webp'],
		genesis: $assets['genesis.webp']
	};
</script>

{#if type !== 'loader'}
	<img src={pic[type]} alt={type} {width} {height} {style} />
{:else}
	<div class="loader-icon" style="--width:{width};width: {width};">
		<span />
	</div>
{/if}

<style>
	.loader-icon {
		position: relative;
		aspect-ratio: 1/1;
	}
	span {
		display: block;
		position: absolute;
		top: 0;
		left: 0;
		width: 100%;
		height: 100%;
	}
	span::before,
	span::after {
		content: '';
		display: block;
		position: absolute;
		left: 0;
		top: 0;
		margin: auto;
		width: 100%;
		height: 100%;
		border: calc(0.15 * var(--width)) solid var(--text-color);
		border-radius: 50%;
		opacity: 0.5;
	}
	span::before {
		animation: loaderAnim1 1.5s cubic-bezier(0.075, 0.82, 0.165, 1) infinite;
	}

	span::after {
		animation: loaderAnim2 1.5s cubic-bezier(0.075, 0.82, 0.165, 1) 0.25s infinite;
	}

	@keyframes loaderAnim1 {
		0% {
			transform: scale(0);
			opacity: 1;
		}
		20% {
			opacity: 1;
		}
		100% {
			transform: scale(1.5);
			opacity: 0;
		}
	}

	@keyframes loaderAnim2 {
		0% {
			transform: scale(0);
			opacity: 1;
		}
		20% {
			opacity: 1;
		}
		100% {
			transform: scale(1);
			opacity: 0;
		}
	}
</style>


================================================
FILE: src/lib/components/Iklan.svelte
================================================
<script>
	import { dev } from '$app/environment';
	import { onMount } from 'svelte';
	import { isMobile, isPWA, showAd } from '$lib/store/app-stores';
	import { randomNumber } from '$lib/helpers/gacha/itemdrop-base';

	export let type = '';
	export let head = false;
	export let size = 'wide';

	const show = randomNumber(1, 2) === 1;

	const adSize = {
		square: 6247038092,
		wide: 6827309798
	};

	onMount(() => {
		if (type !== 'banner' || head || (type === 'banner' && !show)) return;
		try {
			// Google Ads
			(window.adsbygoogle = window.adsbygoogle || []).push({});
			// End Google Ads
		} catch (e) {
			console.error(e);
		}
	});

	let addcashLoaded = false;
	const loadAdcash = () => {
		if (addcashLoaded) return;
		addcashLoaded = true;

		const sc = document.createElement('script');
		sc.setAttribute('id', 'aclib');
		sc.setAttribute('type', 'text/javascript');
		sc.src = '//acscdn.com/script/aclib.js';
		document.head.appendChild(sc);
		sc.addEventListener('load', () => window.aclib.runAutoTag({ zoneId: 'v1xd6wvvpe' }));
	};

	const loadHeaderAds = () => {
		loadAdcash();
		// Ezoic
		window.ezstandalone = window.ezstandalone || {};
		window.ezstandalone.cmd = window.ezstandalone.cmd || [];
		window.ezstandalone.cmd.push(function () {
			window.ezstandalone.showAds();
		});
		// End Ezoic
	};

	$: if ($showAd && !dev && head && !type && !($isPWA && $isMobile)) loadHeaderAds();
</script>

{#if dev && type === 'banner' && show}
	<div class="row">
		<div class="banner" />
	</div>
{/if}

{#if $showAd && !dev}
	{#if type === 'banner' && show}
		<ins
			data-ad-slot={adSize[size]}
			class="adsbygoogle"
			style="display:block"
			data-ad-client="ca-pub-1874822310102113"
			data-ad-format="auto"
			data-full-width-responsive="true"
		/>
	{/if}

	{#if head && !type}
		<!-- Google Ad -->
		<script
			async
			src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1874822310102113"
			crossorigin="anonymous"></script>
		<!-- Google Ad -->

		<!-- Ezoic -->
		<script src="https://the.gatekeeperconsent.com/cmp.min.js" data-cfasync="false"></script>
		<script src="https://the.gatekeeperconsent.com/ccpa/v2/standalone.js" async></script>
		<script async src="//www.ezojs.com/ezoic/sa.min.js"></script>
		<!-- Ezoic -->

		<!-- Autotag -->
		<!-- don't show autotag if PWA -->
		{#if !($isPWA && $isMobile)}
			<!-- <script
				data-cfasync="false"
				type="text/javascript"
				data-adel="atag"
				src="//acacdn.com/script/atg.js"
				czid="v1xd6wvvpe"></script> -->
		{/if}
		<!-- Autotag -->

		<!-- Desktop Only -->
		<!-- {#if !$isMobile} -->
		<!-- PopAds -->
		<!-- {#if randomNumber(1, 2) === 1}
				<script
					type="text/javascript"
					src="//pl17416355.profitablecpmgate.com/3e/70/98/3e7098724a8a6321d737e1bd39d9ffed.js"></script>
			{/if} -->
		<!-- PopAds -->

		<!-- In-Push Page -->
		<!-- <script
				type="text/javascript"
				src="//pl17419889.profitablecpmgate.com/fb/35/45/fb3545e433a3f40f53c83f80f24037ec.js"></script> -->
		<!-- In-Push Page -->
		<!-- {/if} -->
	{/if}
{/if}

<style>
	ins::-webkit-scrollbar,
	.row::-webkit-scrollbar {
		display: none;
	}

	.row {
		width: 100%;
		overflow: auto;
		display: flex;
	}

	ins {
		margin: auto;
		overflow: auto;
		max-width: 100%;
	}

	:global(ins.adsbygoogle[data-ad-status='unfilled']) {
		display: none !important;
	}

	.banner {
		margin: auto;
		width: 100%;
		max-width: 728px;
		height: 280px;
		aspect-ratio: 728/90;
		background-image: linear-gradient(40deg, #00aaff, pink 50%);
		background-size: cover;
	}
</style>


================================================
FILE: src/lib/components/ModalTpl.svelte
================================================
<script>
	import { createEventDispatcher, onDestroy, onMount } from 'svelte';
	import { fade, fly } from 'svelte/transition';
	import { t } from 'svelte-i18n';
	import OverlayScrollbars from 'overlayscrollbars';
	import hotkeys from 'hotkeys-js';

	import { assets } from '$lib/store/app-stores';
	import ButtonModal from './ButtonModal.svelte';

	export let title = '';
	export let dark = false;
	export let blank = false;
	export let disabled = false;
	export let confirmOnly = false;
	export let noDimiss = false;

	let content;
	onMount(() =>
		OverlayScrollbars(content, { sizeAutoCapable: false, className: 'os-theme-light' })
	);

	const dispatch = createEventDispatcher();
	const confirmClick = () => dispatch('confirm');
	const cancelClik = () => dispatch('cancel');

	const dimiss = () => {
		if (confirmOnly || noDimiss) return;
		dispatch('cancel');
	};

	// Shortcut
	hotkeys('enter', 'modal', (e) => {
		e.preventDefault();
		if (disabled) return;
		confirmClick();
	});

	hotkeys('esc', 'modal', (e) => {
		e.preventDefault();
		cancelClik();
	});

	const currentScope = hotkeys.getScope();
	hotkeys.setScope('modal');
	onDestroy(() => hotkeys.deleteScope('modal', currentScope));
</script>

<div
	class="modal"
	class:dark
	in:fade={{ duration: 200 }}
	out:fade={{ duration: 80 }}
	on:mousedown|self={dimiss}
>
	<div
		class="modal-content"
		in:fly={{ y: 20, duration: 250, opacity: 1 }}
		out:fly={{ y: 50, duration: 100, opacity: 1 }}
	>
		<span class="corner top-left" />
		<span class="corner top-right" />
		<span class="corner bottom-left" />
		<span class="corner bottom-right" />
		<div class="container" style="--bg-icon:url({$assets['modal-bg-icon.png']})">
			{#if blank}
				<slot />
			{:else}
				{#if title}
					<h1 class="pop-header">{title}</h1>
				{/if}
				<div class="pop-body" bind:this={content}>
					<slot />
				</div>

				<div class="pop-footer">
					{#if !confirmOnly}
						<ButtonModal light={dark} type="cancel" on:click={cancelClik} />
					{/if}

					<ButtonModal light={dark} type="confirm" {disabled} on:click={confirmClick}>
						{#if $$slots.confirmtext}
							<slot name="confirmtext" />
						{:else}
							{$t('confirmButton')}
						{/if}
					</ButtonModal>
				</div>
			{/if}
		</div>
	</div>
</div>

<style>
	.modal {
		position: fixed;
		top: 0;
		left: 0;
		width: 100vw;
		height: var(--screen-height);
		background-color: rgba(0, 0, 0, 0.5);
		z-index: 997;
		display: flex;
		justify-content: center;
		align-items: center;
		backdrop-filter: blur(2px);
	}

	.modal-content {
		width: 35rem;
		max-width: 90%;
		background-color: #fbf6ee;
		padding: 8px;
		text-align: center;
		color: #383b40;
		position: relative;
		border-radius: 0.8rem;
	}

	.dark .modal-content {
		background-color: #4a5265;
	}

	:global(.mobile) .modal-content {
		max-width: 110vh;
	}

	.container {
		width: 100%;
		height: 100%;
		border: 2px solid #ddd5c8;
		background-image: var(--bg-icon);
		background-repeat: no-repeat;
		background-size: 50%;
		background-position: 50%;
	}

	.corner {
		background-image: url('data:image/webp;base64,UklGRkgFAABXRUJQVlA4WAoAAAAQAAAANgAAMQAAQUxQSAUDAAABCbRt2wYS0Kny/w+3P0T0fwL4Fh3ZUFn3RQqxyZuhoG0bpuZPuzsQImICIhX+jrAkyW7bzKp0//s6YRwAcOH8GTEBE0C5tm1FknPu+xCQWdBiZpZGclsGyAB0QONmZkqIiB/vDRpNiIgJIP6144LOBIQAaStmAqCN0E4AUphAwoCQXtEIPIiISeCiIWUUwkwECbAXfA0Pj8BSW4GwsJqTeU7uMjoa3Qtdmtt8nIH4ELgYhOx9U1hpxZw2KNQFUH23+mFBoKxI326+3UyLToG6iejNu6E8X7f3/vKHwywQsRchX96fP/74Yy5GQCVFkDI10f/wh55IHwDhYnjcvvP7u2dPao+ZXFFiTVoiVtWf/32Gvrdv/nw2/qLTFCsERiDhJu+QevH4duXe83Khb94AUskCw7CM6KmtwbiZl7ufnLJiHiJBKNy5i/gQDWjL9pu4++6wu1ffxRMEO0SsT5gHuql7P3386+P7bbPsvxodw6MRWtYVEOryej6c2/hOd9fL8vF7KfvRD4hCCMsoIKvjeH5Sx/fKbvlshHUvmlAQiJkaYNuuH8ahnPLSaYI5KDXjbNCNfS2lppc9DdRCQQcIgFrEVAsphfTCwzufEEh21t/gaCgwRfbCi7fyHtDqJAABRIvUkOV56/YCPHUpzPWC0BewVmDqEbx7e9gn97BYhGVUME+hECJcpMfD/+4W7B8PE6GsgnT0dvQzgy59fnU44EGrgQAQta4/Lq65LA+r0dZ4GLckwgMQALVsWMZ5fmZT6QDbPP/w3k0aVg3CQeWTPO8X2hNqlqVuyc82d06KUghnNjFNd8szSxF9l3Uy5/7Kb6ZIAKIm5eTH3f5xZlLe1FF9/e6mcracJaglyQ/Xdm32VopsSKUrwztD/37RcVDg7PJwHd1CRk5Zdfs8n6xr/+nzAQcleRzdBCAJcmbl0vjJnc8HTVQBwlcBBAjApnlu7//3/bCIjniLa5uu3v+m9i9m6iAKGIYHDzTgK4YUUsz0eWLQCyE0gz4NAAlfMRR7+jR/bwBWUDggHAIAAHAKAJ0BKjcAMgA+KQ6FQqGHfAYAoSygDgHbI3I4tdhHQL88A1kA2ozja3RezMIbWU3XuF8+/h9ILAYHndhrUbZy5B81xTHr3sWw+e1DsBqahnwk8nvegFg3CiwAAP7/KvhRIfulyVvAM+kd25h7/f9q48lj/8TP6ceUoTF8V1L0D7kxK/RYzWsE2gM84nd8zXc9QGLEFOT/sLorw3Yjn9KVTdhjeYf/JPghddPdW0LE5XY55VYd6No1Np9IqEu9k4ZHiHsClwKB9XL+sZKxaOfPkAx9tBWSX/EaPi0L0FT+Ia2LsLUt7Gv/94HKXgfgqAY3Dc3mrgA9914RrLuW9+/4muOcWZqBrbww2hfhuvV6OzfAOs9mDbeSCYCL8K3CPHvdT0wItSZ53JuxG9FLZCIfp0b8LJkq1OMW6TeGE5KKpvYCamNksDv1s+pAa2J18XKje5sj8hSQhZjIqh9uPJX7FZXFqLIxObNJPebhHE3gvZWar0ojALZ+1hmoJKVuJVetIsSw8Nqfb9drEU81Na8myzoyvPFjWzeCiZoWF+PHkNkeaySoSlxjDHlbQS8zky28ygG5RGkzIURZol88xyDcVVvHW05Bq5d79tZ9Nbk/ofOfzl0+Un6lPuZpn0zhr9YSAvne330OxW3f5DbKZyT+YPZstc2H5QaDYWBcyVMJ2TCXOSCq+L28GLxA8V82mMeS122MP/qzwAAAAA==');
		background-size: cover;
		width: 2.35rem;
		aspect-ratio: 1/1;
		font-size: 1.5rem;
		display: inline-block;
		position: absolute;
	}

	.top-left {
		top: -0.9rem;
		left: -0.9rem;
		transform: rotate(-90deg);
	}
	.top-right {
		top: -0.9rem;
		right: -0.9rem;
	}
	.bottom-left {
		bottom: -0.9rem;
		left: -0.9rem;
		transform: rotate(-180deg);
	}
	.bottom-right {
		bottom: -0.9rem;
		right: -0.9rem;
		transform: rotate(90deg);
	}

	.pop-header {
		font-size: 130%;
		margin: 0.4rem 7%;
		padding-bottom: 0.4rem;
		border-bottom: 0.2rem solid #ddd5c8;
		position: relative;
		z-index: +1;
	}

	.dark .pop-header {
		color: rgba(210, 198, 156, 1);
	}

	:global(.mobile) .pop-header {
		font-size: 1rem;
	}

	.pop-body {
		height: 15rem;
		max-height: 45vh;
		position: relative;
		z-index: +1;
		font-size: 1.1rem;
		display: flex;
		justify-content: center;
	}

	.dark .pop-body {
		color: #fbf6ee;
	}

	:global(.mobile) .pop-body {
		height: 12rem;
		font-size: 0.9rem;
	}

	.pop-footer {
		display: flex;
		padding: 0.7rem 0;
		justify-content: space-around;
		position: relative;
		z-index: +1;
	}
	.pop-footer::before {
		width: 80%;
		content: '';
		display: block;
		border-top: 0.2rem solid #ddd5c8;
		position: absolute;
		top: 0;
		left: 50%;
		transform: translateX(-50%);
	}

	.dark .container,
	.dark .pop-header,
	.dark .pop-footer::before {
		border-color: rgba(210, 198, 156, 0.6);
	}
</style>


================================================
FILE: src/lib/components/MyFund.svelte
================================================
<script>
	import { getContext } from 'svelte';
	import { playSfx } from '$lib/helpers/audio/audio';
	import Icon from './Icon.svelte';

	export let type = 'primogem';
	export let plusbutton = false;
	const allowAddition = type === 'primogem' && plusbutton;

	const openConvertModal = getContext('openConvertModal');
	const openModal = () => {
		if (!allowAddition) return;
		openConvertModal();
		playSfx('modal');
	};
</script>

<button class={type} class:increament={allowAddition} on:click={openModal}>
	<Icon
		{type}
		height="80%"
		width="auto"
		style="position: absolute; left: 5px;top: 50%; transform: translateY(-50%);"
	/>
	<slot />
	{#if allowAddition}
		<span> <i class="gi-plus" /> </span>
	{/if}
</button>

<style>
	.primogem span {
		width: 1.2rem;
		height: 1.2rem;
		color: rgba(0, 0, 0, 0.7);
		background-color: #e0ddd4;
		border-radius: 100%;
		position: absolute;
		right: 3px;
		top: 50%;
		font-size: 110%;
		line-height: 0;
		display: inline-flex;
		justify-content: center;
		align-items: center;
		transform: translateY(-50%);
		transition: all 0.2s;
	}

	.primogem.increament {
		padding-right: 2rem !important;
	}

	.primogem:active span {
		transform: translateY(-50%) scale(0.9);
		color: #fff;
		border-color: darkgray;
	}

	.primogem:hover span {
		border-color: #fff;
		box-shadow: rgb(160 175 190 / 60%) 0px 0px 7px 5px;
	}

	button {
		display: inline-block;
		height: 25px;
		overflow: hidden;
		background-color: rgba(0, 0, 0, 0.3);
		border-radius: 50px;
		color: #fff;
		vertical-align: middle;
		text-align: center;
		position: relative;
		margin: 0 10px 0 0;
		padding: 0 1rem 0 1.85rem;
		border: 0.7px solid #656565;
	}

	@media screen and (max-width: 900px) {
		button {
			height: 20px;
			margin: 0 3px;
		}
	}

	@media screen and (max-width: 400px) {
		.primogem {
			margin-bottom: 2px;
		}
	}
</style>


================================================
FILE: src/lib/components/NoticeMark.svelte
================================================
<script>
	import { notice } from '$lib/store/app-stores';

	export let name = '';
	export let style = '';

	let active = false;

	$: {
		if (!Array.isArray(name)) {
			active = !$notice.includes(name);
		} else {
			const tmp = [];
			name.forEach((n) => tmp.push($notice.includes(n)));
			active = tmp.includes(false);
		}
	}
</script>

{#if active}
	<div class="notice" {style}>
		<span>!</span>
	</div>
{/if}

<style>
	.notice {
		position: absolute;
		right: 0.5rem;
		z-index: +1;
	}

	span {
		color: #fff;
		background-color: #de2f22;
		display: inline-flex;
		justify-content: center;
		align-items: center;
		border-radius: 100%;
		aspect-ratio: 1/1;
		font-size: xx-small;
		padding: 0.3rem;
		line-height: 0;
	}

	:global(.mobile) span {
		font-size: 0.4rem;
		padding: 0.25rem;
	}
</style>


================================================
FILE: src/lib/components/ObtainedItem.svelte
================================================
<script>
	import { getContext, onDestroy, onMount } from 'svelte';
	import { scale } from 'svelte/transition';
	import { t } from 'svelte-i18n';
	import hotkeys from 'hotkeys-js';

	import { assets } from '$lib/store/app-stores';
	import { playSfx } from '$lib/helpers/audio/audio';
	import Icon from './Icon.svelte';

	export let data = [{ item: 'primogem', qty: 0 }];

	const checkRarity = (item) => {
		return item === 'stardust' ? 4 : 5;
	};
	const closeObtained = getContext('closeObtained');
	onMount(() => playSfx('obtain'));

	// Shortcut;
	const currentScope = hotkeys.getScope();
	hotkeys('*', 'obtain', (e) => {
		e.preventDefault();
		closeObtained();
	});

	hotkeys.setScope('obtain');
	onDestroy(() => hotkeys.deleteScope('obtain', currentScope));
</script>

<section on:mousedown={closeObtained}>
	<div class="container">
		<div class="bg" />
		<div class="content" in:scale={{ start: 0, duration: 200 }}>
			<h3 class="title">
				{$t('obtained')}
				<i class="gi-primo-star" />
			</h3>

			<h4>{$t('extra')}</h4>
			<div class="milestone">
				{#each data as { item, qty }}
					{#if qty > 0}
						<div class="item {item}" on:mousedown|stopPropagation>
							<div class="body">
								<div
									class="pic"
									style="--bg: url('{$assets[`${checkRarity(item)}star-bg.webp`]}');"
								>
									<Icon width="100%" type={item} />
									<div class="star">
										{#each Array(checkRarity(item)) as _}
											<i class="gi-star" />
										{/each}
									</div>
								</div>
								<span>{qty}</span>
							</div>
							<div class="name">
								{$t(`shop.item.${item}`)}
							</div>
						</div>
					{/if}
				{/each}
			</div>

			<h4 class="msg">{$t('pressToContinue')}</h4>
		</div>
	</div>
</section>

<style>
	section {
		position: fixed;
		top: 0;
		left: 0;
		width: 100%;
		height: 100%;
		z-index: 999;
		color: #000;
	}
	.container {
		width: 100%;
		height: 100%;
		display: flex;
		justify-content: center;
		align-items: center;
	}

	.bg {
		min-width: 100vw;
		min-height: 100%;
		position: absolute;
		z-index: -1;
		left: 0;
		background-image: linear-gradient(to top, rgba(136, 132, 133, 0.93), rgba(39, 34, 54, 0.93));
	}

	.content {
		display: flex;
		flex-direction: column;
		max-width: 80%;
		width: 35rem;
		text-align: center;
	}

	:global(.mobile) .content {
		transform: scale(0.85);
	}

	h3 {
		color: #beb99c;
		font-weight: 100;
		padding: 0.5rem;
		border-bottom: 0.01rem solid #959187;
	}
	h4 {
		color: #ede5d8;
		padding: 0.8rem;
		font-weight: 100;
	}
	h4.msg {
		border-top: 0.01rem solid #959187;
		margin-top: 1.5rem;
	}
	i.gi-primo-star {
		font-size: 0.7rem;
		vertical-align: top;
	}

	.milestone {
		display: flex;
		width: 100%;
		justify-content: center;
	}

	.item {
		margin: 0.25rem;
	}
	.item,
	.body {
		display: block;
		border-radius: 0.4rem;
		overflow: hidden;
		width: 5rem;
	}
	.body {
		background-color: #fff;
	}

	.acquaint .pic,
	.intertwined .pic {
		padding: 0.55rem;
	}

	.pic {
		background-image: var(--bg);
		background-size: cover;
		position: relative;
		border-bottom-right-radius: 0.8em;
	}
	.star {
		position: absolute;
		left: 50%;
		bottom: -0.6rem;
		transform: translateX(-50%);
	}
	.gi-star {
		color: #eac343;
		font-size: 0.9rem;
	}
	span {
		font-size: 0.7rem;
		display: block;
		line-height: 1rem;
	}
	.name {
		font-size: 0.7rem;
		white-space: pre-wrap;
		width: 5rem;
		color: #ede5d8;
		line-height: 0.9rem;
		margin-top: 0.3rem;
	}
</style>


================================================
FILE: src/lib/components/RandomBackground.svelte
================================================
<script>
	import { assets } from '$lib/store/app-stores';

	const random = (min, max) => {
		min = Math.ceil(min);
		max = Math.floor(max);
		return Math.floor(Math.random() * (max - min + 1)) + min;
	};
</script>

<img class="bg" src={$assets[`bg${random(1, 20)}.webp`]} alt="background" />

<style>
	.bg {
		width: 100vw;
		height: 100%;
		object-fit: cover;
		position: fixed;
		top: 50%;
		left: 50%;
		transform: translate(-50%, -50%) scale(1.1);
		filter: blur(10px);
		-webkit-filter: blur(10px);
		z-index: +1;
	}
</style>


================================================
FILE: src/lib/components/Range.svelte
================================================
<script>
	import { getContext } from 'svelte';
	import { playSfx } from '$lib/helpers/audio/audio';

	export let max;
	export let min;
	export let value;
	export let disabled = false;

	const setValue = getContext('setValue');
	const changeRange = (e) => {
		const { value } = e.target;
		setValue(parseInt(value));
	};

	let timeout;
	let interval;
	const rangeControl = (plusOrMinus = 'plus') => {
		const change = plusOrMinus === 'plus' ? plus : minus;
		change();
		timeout = setTimeout(() => {
			interval = setInterval(change, 50);
		}, 500);

		const isMinRange = plusOrMinus === 'min' && value <= 1;
		const isMaxRange = plusOrMinus === 'plus' && value >= max;
		if (isMinRange || isMaxRange) return;
		playSfx();
	};

	const plus = () => {
		if (value >= max) return clearTimers();
		changeRange({ target: { value: value + 1 } });
	};

	const minus = () => {
		if (value <= 1) return clearTimers();
		changeRange({ target: { value: value - 1 } });
	};

	const clearTimers = () => {
		clearTimeout(timeout);
		clearInterval(interval);
	};
</script>

<div class="input">
	<button
		class="min"
		disabled={isNaN(value) || value <= 1}
		on:touchstart|preventDefault|nonpassive={() => rangeControl('min')}
		on:mousedown|preventDefault={() => rangeControl('min')}
		on:mouseleave={clearTimers}
		on:mouseup={clearTimers}
		on:touchend={clearTimers}
	>
		<i class="gi-min" />
	</button>
	<div class="control">
		<span style="pointer-events:none">{min}</span>
		<input
			style="--min:{min || 0}; --max:{max || 0}; --val:{value || 0}"
			class="range"
			type="range"
			max={max || 0}
			min={min || 0}
			value={value || 0}
			on:input={changeRange}
			{disabled}
		/>
		<span style="pointer-events:none">{max}</span>
	</div>
	<button
		class="plus"
		disabled={isNaN(value) || value >= max}
		on:touchstart|preventDefault|nonpassive={() => rangeControl('plus')}
		on:mousedown|preventDefault={() => rangeControl('plus')}
		on:mouseleave={clearTimers}
		on:mouseup={clearTimers}
		on:touchend={clearTimers}
	>
		<i class="gi-plus" />
	</button>
</div>

<style>
	.control,
	.input {
		display: flex;
		justify-content: center;
		flex-direction: column;
		align-items: center;
		width: 100%;
		position: relative;
		font-size: 1rem;
	}

	.control {
		flex-direction: row;
		margin: 0 3rem;
	}

	.control > span {
		width: 2.2em;
		height: 2em;
		line-height: 0;
		display: flex;
		justify-content: center;
		align-items: center;
		font-size: larger;
	}

	/* range */
	[type='range'] {
		--range: calc(var(--max) - var(--min));
		--ratio: calc((var(--val) - var(--min)) / var(--range));
		--sx: calc(0.5 * 1.5em + var(--ratio) * (100% - 1.5em));
		margin: 0;
		padding: 0;
		width: 55%;
		height: 1.5em;
		background: transparent;
		font: 1em/1 arial, sans-serif;
	}
	[type='range'],
	[type='range']::-webkit-slider-thumb {
		-webkit-appearance: none;
	}
	[type='range']::-webkit-slider-runnable-track {
		box-sizing: border-box;
		border: none;
		width: 100%;
		height: 0.4em;
		background: #ccc;
	}
	[type='range']::-webkit-slider-runnable-track {
		background: linear-gradient(#4a5265, #4a5265) 0 / var(--sx) 100% no-repeat #ccc;
		border-radius: 10px;
	}
	[type='range']::-moz-range-track {
		box-sizing: border-box;
		border-radius: 10px;
		width: 100%;
		height: 0.4em;
		background: #ccc;
	}

	/* duplicated because browsers ignore
	 * the whole selector when they see
	 * non-standard rules
	 * (FF 96, Chrome 97)
	 */
	[type='range']::-ms-track {
		box-sizing: border-box;
		border: none;
		width: 100%;
		height: 0.4em;
		background: #ccc;
	}

	[type='range']::-moz-range-progress {
		height: 0.4em;
		border-radius: 10px;
		background: #4a5265;
	}

	[type='range']::-ms-fill-lower {
		height: 0.4em;
		background: #ccc;
	}

	[type='range']::-webkit-slider-thumb {
		box-sizing: border-box;
		border: none;
		border-radius: 0;
		width: 0.75em;
		height: 0.75em;
		background: #4a5265;
		margin-top: -0.22rem;
		transform: rotate(45deg);
		border: 0.15em solid #ece6de;
		outline: 0.15em solid #4a5265;
		box-shadow: 0 0 6px #ece6de;
	}

	[type='range']::-moz-range-thumb {
		box-sizing: border-box;
		border: none;
		border-radius: 0;
		width: 0.75em;
		height: 0.75em;
		background: #4a5265;
		margin-top: -0.22rem;
		transform: rotate(45deg);
		border: 0.15em solid #ece6de;
		outline: 0.15em solid #4a5265;
		box-shadow: 0 0 6px #ece6de;
	}

	[type='range']::-ms-tooltip {
		display: none;
	}

	button:active:not(:disabled) {
		transform: scale(0.9) translateY(-50%);
		background-color: #e0ddd4 !important;
		border-color: rgb(195, 195, 195) !important;
		box-shadow: rgb(160 175 190 / 60%) 0px 0px 4px 2px;
	}

	button:hover:not(:disabled) {
		background-color: rgb(51, 57, 71);
	}

	button.plus:disabled,
	button.min:disabled {
		background-color: rgb(173, 179, 192);
	}

	button.plus,
	button.min {
		background-color: #4a5265;
		display: inline-flex;
		justify-content: center;
		align-items: center;
		line-height: 0;
		position: absolute;
		width: 2rem;
		height: 2rem;
		color: #fff;
		border-radius: 100%;
		border: 0.2rem solid transparent;
		top: 50%;
		transform: translateY(-50%);
		transition: all 0.2s;
	}

	button.plus {
		right: 7%;
	}
	button.min {
		left: 7%;
		z-index: +3;
	}
</style>


================================================
FILE: src/lib/components/SVGIcon.svelte
================================================
<script>
	// Vision
	import Anemo from './svgs/Anemo.svelte';
	import Cryo from './svgs/Cryo.svelte';
	import Dendro from './svgs/Dendro.svelte';
	import Electro from './svgs/Electro.svelte';
	import Geo from './svgs/Geo.svelte';
	import Hydro from './svgs/Hydro.svelte';
	import Pyro from './svgs/Pyro.svelte';

	// Weapon
	import Bow from './svgs/Bow.svelte';
	import Catalyst from './svgs/Catalyst.svelte';
	import Claymore from './svgs/Claymore.svelte';
	import Polearm from './svgs/Polearm.svelte';
	import Sword from './svgs/Sword.svelte';

	export let name = '';

	const icons = {
		anemo: Anemo,
		cryo: Cryo,
		dendro: Dendro,
		electro: Electro,
		geo: Geo,
		hydro: Hydro,
		pyro: Pyro,
		bow: Bow,
		catalyst: Catalyst,
		claymore: Claymore,
		polearm: Polearm,
		sword: Sword
	};
</script>

{#if name in icons}
	<svelte:component this={icons[name]} />
{/if}


================================================
FILE: src/lib/components/Toast.svelte
================================================
<script>
	import { createEventDispatcher } from 'svelte';
	import { fade, fly } from 'svelte/transition';

	export let type = 'info';
	export let dismissible = false;
	export let timeout = 0;
	export let autoclose = true;

	const dispatch = createEventDispatcher();
	const duration = timeout ? `${timeout / 1000}s` : '0s';
</script>

<div
	class="toast {type}"
	class:dismissible
	class:autoclose={autoclose && timeout > 0}
	role="alert"
	style="--duration: {duration}"
	in:fly|local={{ y: -20 }}
	out:fade={{ duration: 200 }}
>
	<div class="text">
		<slot />
	</div>

	{#if dismissible}
		<button class="dismiss" on:click={() => dispatch('dismiss')}>
			<i class="gi-times" />
		</button>
	{/if}
</div>

<style>
	.toast {
		pointer-events: initial;
		padding: 0.5rem 1.5rem 0.7rem;
		text-align: center;
		border-top-right-radius: 0.3rem;
		border-top-left-radius: 0.3rem;
		min-width: 10rem;
		max-width: 20rem;
		margin: 0.2rem;
		background-color: var(--tertiary-color);
		color: #4a5265;
		font-size: 80%;
		display: flex;
		align-items: center;
		justify-content: center;
		position: relative;
		box-shadow: 0 0 1rem rgba(0, 0, 0, 0.4);
	}

	.toast.autoclose::after {
		content: '';
		position: absolute;
		bottom: 0;
		left: 0;
		width: 100%;
		border-bottom: #4a5265 0.2rem solid;
		animation: scaleX forwards linear;
		transform-origin: 0%;
		animation-duration: var(--duration);
	}

	.toast.dismissible {
		padding-right: 0.75rem;
	}

	.toast.error {
		color: #d14a29;
	}
	.toast.error::after {
		border-color: #d14a29;
	}

	.toast.success {
		color: #359697;
	}
	.toast.success::after {
		border-color: #359697;
	}

	button {
		color: inherit;
		background: transparent;
		border: 0 none;
		padding: 0;
		line-height: 0;
		font-size: 80%;
		margin-left: auto;
		aspect-ratio: 1/1;
		padding: 0.25rem;
		transform: scale(1.2);
	}

	@keyframes scaleX {
		0% {
			transform: scaleX(100%);
		}
		100% {
			transform: scaleX(0%);
		}
	}
</style>


================================================
FILE: src/lib/components/Toasts.svelte
================================================
<script lang="ts">
	import { flip } from 'svelte/animate';
	import { dismissToast } from '$lib/helpers/toast';
	import { toastMsg } from '$lib/store/app-stores';
	import Toast from './Toast.svelte';
</script>

{#if $toastMsg}
	<div class="toasts">
		{#each $toastMsg as { type, id, dismissible, message, autoclose, timeout } (id)}
			<div class="toast-item" animate:flip={{ duration: (i) => 25 * Math.sqrt(i) }}>
				<Toast {type} {dismissible} {autoclose} {timeout} on:dismiss={() => dismissToast(id)}>
					{message}
				</Toast>
			</div>
		{/each}
	</div>
{/if}

<style>
	.toasts {
		position: fixed;
		top: 0;
		left: 0;
		right: 0;
		width: 100%;
		display: flex;
		margin-top: 1rem;
		justify-content: center;
		align-items: center;
		flex-direction: column;
		pointer-events: none;
		z-index: 1000;
	}
</style>


================================================
FILE: src/lib/components/ToolTip.svelte
================================================
<script>
	export let position = 'bottom';
</script>

<div class="tooltip {position}">
	<i>i</i>
	<span class="tooltiptext">
		<slot />
	</span>
</div>

<style>
	.tooltip {
		position: relative;
		display: inline-block;
	}
	.tooltip i {
		display: inline-flex;
		justify-content: center;
		align-items: center;
		aspect-ratio: 1/1;
		width: 1.2rem;
		transform: translateY(-20%);
		font-size: small;
		border: 1px solid var(--text-color);
		font-style: normal;
		text-align: center;
		line-height: 100%;
		border-radius: 100%;
	}

	.tooltip .tooltiptext {
		display: block;
		width: 200px;
		background-color: rgba(0, 0, 0, 0.75);
		color: #fff;
		text-align: center;
		padding: 0.5rem;
		border-radius: 6px;
		position: absolute;
		z-index: +10;
		opacity: 0;
		transition: opacity 0.25s;
		pointer-events: none;
		font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode',
			Geneva, Verdana, sans-serif;
	}

	.tooltip:hover .tooltiptext {
		opacity: 1;
	}

	.tooltip .tooltiptext::after {
		content: ' ';
		position: absolute;
		margin-top: -5px;
		border-width: 5px;
		border-style: solid;
	}

	/* right position */
	.right.tooltip .tooltiptext {
		top: -5px;
		left: 105%;
	}
	.right.tooltip .tooltiptext::after {
		top: 50%;
		right: 100%;
		border-color: transparent rgba(0, 0, 0, 0.75) transparent transparent;
	}

	/* Left Position */
	.left.tooltip .tooltiptext {
		top: -5px;
		right: 105%;
	}
	.left.tooltip .tooltiptext::after {
		top: 50%;
		left: 100%;
		border-color: transparent transparent transparent rgba(0, 0, 0, 0.75);
	}

	/* Top Position */
	.top.tooltip .tooltiptext {
		bottom: 100%;
		left: 50%;
	}
	.top.tooltip .tooltiptext::after {
		top: 100%;
		left: 50%;
		border-color: rgba(0, 0, 0, 0.75) transparent transparent transparent;
	}

	/* bottom position */
	.bottom.tooltip .tooltiptext {
		top: 100%;
		left: 50%;
		transform: translateX(-50%);
	}
	.bottom.tooltip .tooltiptext::after {
		position: absolute;
		bottom: 100%;
		left: 50%;
		border-color: transparent transparent rgba(0, 0, 0, 0.75) transparent;
	}
</style>


================================================
FILE: src/lib/components/chat/MainChat.svelte
================================================
<script>
	import { getContext, onMount, setContext } from 'svelte';
	import { fade, fly } from 'svelte/transition';
	import { ref, query, limitToLast, onChildAdded } from 'firebase/database';
	import { db } from '$lib/helpers/chat/firebaseApp';
	import { mobileMode, viewportWidth } from '$lib/store/app-stores';
	import { getCredential } from '$lib/helpers/chat/firebaseApp';
	import { playSfx } from '$lib/helpers/audio/audio';
	import { adKey } from '$lib/helpers/accessKey';

	import ButtonGeneral from '../ButtonGeneral.svelte';
	import Chats from './_chats.svelte';
	import Sidebar from './_sidebar.svelte';
	import ChangeNick from './_changeNick.svelte';
	import ChangeAvatar from './_changeAvatar.svelte';
	import LoaderChat from './_loader-chat.svelte';

	export let show = false;

	let userId;
	let clientHeight;
	let pro = false;
	let showSetting = false;
	let changeNick = false;
	let changePic = false;

	const close = getContext('chatToggle');
	const loadCredential = async () => (userId = await getCredential());
	const toggleSetting = (op) => {
		const isDimiss = op === 'dimiss';
		if (isDimiss && !showSetting) return;
		showSetting = isDimiss ? false : !showSetting;
		playSfx(isDimiss ? 'close' : 'click');
	};

	const toggleNick = () => (changeNick = !changeNick);
	const togglePic = () => (changePic = !changePic);
	setContext('toggleNick', toggleNick);
	setContext('togglePic', togglePic);

	const toggle = (op) => {
		playSfx();
		if (op === 'nick') return toggleNick();
		return togglePic();
	};

	$: if (show && !userId) loadCredential();
	$: if (!show) showSetting = false;

	let messages = [
		{
			uid: 'nang441',
			name: 'nang441',
			pic: 'nahida',
			pro: false,
			message:
				'Welcome to the WishSimulator.App! Please be polite in this chat room! Everything in here will be cleaned every 3 hours.'
		}
	];

	// Read & Listen DB
	const dataRef = query(ref(db, 'wishsim-chatroom'), limitToLast(5));
	onChildAdded(dataRef, (data) => {
		const { uid, name, pic, pro, message } = data.toJSON();
		const key = data.key.split('-')[1];
		messages = [...messages, { uid, name, pic, pro, message, key }];
	});

	onMount(async () => {
		const { validity } = await adKey.checkLocal();
		pro = validity;
	});
</script>

{#if show}
	<section>
		<div
			class="container"
			transition:fly={{ x: -200, duration: 200 }}
			on:click={() => toggleSetting('dimiss')}
		>
			{#if $viewportWidth > 640 || $mobileMode}
				<Sidebar />
			{/if}
			<div
				class="room"
				class:full={$viewportWidth <= 640}
				on:click|stopPropagation={() => toggleSetting('dimiss')}
				style="--height:{clientHeight}px"
				transition:fly={{ x: -50, duration: 200, delay: 150 }}
			>
				<div class="top" bind:clientHeight>
					<div class="col">
						<button class="close dimiss" on:click={close}>
							<i class="gi-reply" />
						</button>
					</div>
					<span> Chatroom is an experimental feature </span>
					<div class="col" style="position:relative">
						<button class="close" on:click|stopPropagation={toggleSetting}>
							<i class="gi-dot-3" />
						</button>
						{#if showSetting}
							<div class="setting" transition:fade={{ duration: 250 }} on:click|stopPropagation>
								<ButtonGeneral on:click={() => toggle('nick')}>Edit Nickname</ButtonGeneral>
								<ButtonGeneral on:click={toggle}>Change Avatar</ButtonGeneral>
							</div>
						{/if}
					</div>
				</div>

				<div class="chats">
					{#if !userId || messages.length < 2}
						<div class="loading" transition:fade|local={{ duration: 300 }}>
							<LoaderChat />
						</div>
					{:else}
						<Chats {userId} {messages} {pro} />
					{/if}
				</div>
			</div>

			<div class="close-div" on:click={close} />
		</div>
		{#if changeNick} <ChangeNick />{/if}
		{#if changePic} <ChangeAvatar /> {/if}
	</section>
{/if}

<style>
	section {
		position: fixed;
		top: 0;
		left: 0;
		width: 100%;
		height: 100%;
		z-index: 10;
	}

	.container {
		background-image: linear-gradient(
			to right,
			rgba(32, 36, 49, 0.9) 50%,
			rgba(32, 36, 49, 0.3) 80%,
			rgba(32, 36, 49, 0)
		);
		background-position: left;
		background-repeat: no-repeat;
		height: 100%;
		display: flex;
	}

	.close-div {
		width: 25%;
		margin-left: auto;
	}

	.top {
		width: 100%;
		height: 60px;
		color: rgba(210, 198, 156, 0.8);
		display: flex;
		align-items: center;
		text-align: center;
		border-bottom: 1px solid rgba(210, 198, 156, 0.5);
	}

	:global(.mobile) .top {
		height: 40px;
		margin-bottom: -10px;
	}
	.top .close {
		transform: scale(0.8);
	}

	.top .dimiss {
		display: none;
	}
	.setting {
		position: absolute;
		top: 0;
		left: 150%;
		display: flex;
		flex-direction: column;
		background-color: #454b5d;
		border: 1px solid rgba(210, 198, 156, 0.5);
		border-radius: 1.1rem;
		padding: 20% 10%;
		z-index: +1;
	}
	.setting :global(button) {
		font-size: 80%;
		white-space: nowrap;
	}

	.loading {
		width: 100%;
		height: 100%;
		position: absolute;
		top: 0;
		left: 0;
	}

	.room {
		height: 100%;
		width: 50%;
		min-width: 300px;
		max-width: 500px;
	}
	.room.full,
	.top span {
		width: 100%;
	}

	.chats {
		padding: 5%;
		display: flex;
		flex-direction: column;
		height: calc(100% - var(--height));
		position: relative;
	}

	@media screen and (min-width: 1200px) {
		.container {
			background-size: 1400px;
		}
	}

	@media screen and (max-width: 1200px) {
		.container {
			background-size: 120%;
		}
	}

	@media screen and (max-width: 850px) {
		.container {
			background-size: 140%;
		}
	}

	@media screen and (max-width: 640px) {
		.container {
			background-size: 180%;
		}
		.close-div {
			display: none;
		}
		.top {
			height: unset;
			padding: 3%;
			font-size: 120%;
		}
		.top .dimiss {
			display: unset;
		}
		.gi-reply {
			font-size: large;
		}

		.setting {
			left: unset;
			top: 100%;
			right: 0;
		}

		.room {
			width: 100%;
			min-width: unset;
			max-width: unset;
		}
	}
</style>


================================================
FILE: src/lib/components/chat/_changeAvatar.svelte
================================================
<script>
	import { getContext, onMount } from 'svelte';
	import { t } from 'svelte-i18n';
	import OverlayScrollbars from 'overlayscrollbars';
	import { cookie } from '$lib/helpers/dataAPI/api-cookie';
	import { HistoryManager } from '$lib/helpers/dataAPI/api-indexeddb';
	import { assets } from '$lib/store/app-stores';
	import { playSfx } from '$lib/helpers/audio/audio';
	import { checkActiveOutfit } from '$lib/helpers/outfit';

	import ModalTpl from '../ModalTpl.svelte';
	import ButtonModal from '../ButtonModal.svelte';

	let scrollable;
	let characters = [];
	let selectedChar = {};
	let activeAvatar = cookie.get('avatar') || {};
	$: avatarName = selectedChar?.name || activeAvatar?.name;

	const { getAllHistories } = HistoryManager;
	const togglePic = getContext('togglePic');

	const previewAvatar = (charData) => {
		selectedChar = charData;
		playSfx();
	};

	const setAvatar = () => {
		cookie.set('avatar', selectedChar);
		playSfx();
		togglePic();
	};

	const getCharacter = async () => {
		const data = await getAllHistories();
		const chars = data.filter(({ type }) => type === 'character');
		const tmp = [];

		chars.forEach(({ name }) => {
			if (tmp.findIndex((c) => c?.name === name) > -1) return;
			const outfit = checkActiveOutfit(name)?.name;
			tmp.push({ name, outfit });
		});
		characters = tmp;
	};

	onMount(async () => {
		getCharacter();
		OverlayScrollbars(scrollable, { sizeAutoCapable: false, className: 'os-theme-light' });
	});
</script>

<ModalTpl dark wide confirm={false} on:cancel={togglePic} title="Change Avatar">
	<div class="changeAvatar">
		<div class="avatars" bind:this={scrollable}>
			{#if characters.length < 1}
				<div class="no-char">
					<span> No Character to show</span>
				</div>
			{:else}
				<div class="avatar-list">
					{#each characters as { name, outfit }}
						<div
							class="item"
							class:selected={avatarName === name}
							on:click={() => previewAvatar({ name, outfit })}
						>
							<figure>
								<img src={$assets[`face/${outfit || name}`]} alt={outfit || name} />
							</figure>
							{#if activeAvatar?.name === name}
								<span>Current</span>
							{/if}
						</div>
					{/each}
				</div>
			{/if}
		</div>
		<div class="preview">
			<div class="selected">
				<div class="item">
					<figure>
						{#if avatarName}
							<img
								src={$assets[
									`face/${
										selectedChar.outfit ||
										selectedChar.name ||
										activeAvatar?.outfit ||
										activeAvatar?.name
									}`
								]}
								alt={avatarName}
							/>
						{:else}
							<i class="gi-user" />
						{/if}
					</figure>
				</div>
			</div>
			<div class="info">
				<div class="name">
					<caption>
						{#if avatarName}
							<span>{$t(`${avatarName}.name`)}</span>
						{:else}
							<span> Choose Avatar</span>
						{/if}
					</caption>
				</div>
				<ButtonModal
					light
					disabled={selectedChar?.name === activeAvatar?.name || !selectedChar?.name}
					on:click={setAvatar}
				>
					Use
				</ButtonModal>
			</div>
		</div>
	</div>
</ModalTpl>

<style>
	.changeAvatar {
		width: 100%;
		height: 100%;
		display: flex;
		padding: 0 4% 3%;
	}

	.avatars {
		width: 70%;
		background-color: #41495b;
		padding: 2%;
	}
	.avatar-list {
		display: flex;
		flex-wrap: wrap;
		justify-content: flex-start;
		align-items: flex-start;
	}

	.no-char {
		width: 100%;
		height: 100%;
		display: flex;
		justify-content: center;
		align-items: center;
	}

	.item {
		width: 24%;
		aspect-ratio: 1/1;
		border-radius: 0.3rem;
		margin: 0.2%;
		padding: 3.5%;
		display: flex;
		justify-content: center;
		align-items: center;
		position: relative;
		transition: 0.2s;
	}

	.item.selected,
	.item:hover {
		background-color: #ece5d8;
	}

	.item span {
		position: absolute;
		bottom: 5%;
		color: #ece5d8;
		background-color: #41495b;
		font-size: small;
		transition: 0.2s;
	}

	.item.selected span,
	.item:hover span {
		background-color: #ece5d8;
		color: #383b40;
	}

	figure,
	img {
		width: 100%;
		height: 100%;
		display: block;
	}

	figure {
		border-radius: 100%;
		overflow: hidden;
		display: flex;
		justify-content: center;
		align-items: center;
		background-color: #d19d78;
		box-shadow: rgb(0 0 0 / 15%) 0px 0px 5px 5px;
		border: 0.15rem solid #f1ebe1;
	}

	figure i {
		font-size: 400%;
		opacity: 0.8;
	}

	img {
		border-radius: 100%;
		overflow: hidden;
	}

	.preview {
		width: 30%;
		display: flex;
		flex-direction: column;
	}

	.preview .selected {
		height: 70%;
		display: flex;
		justify-content: center;
		align-items: center;
	}
	.selected .item {
		width: 70%;
	}
	.selected .item:hover {
		background-color: unset;
	}

	.preview .info {
		height: 40%;
		padding: 0 10% 10%;
		display: flex;
		flex-direction: column;
		justify-content: flex-end;
	}

	.preview .name caption {
		display: block;
		color: #d3bd8f;
		background-image: linear-gradient(
			to right,
			rgba(51, 57, 71, 0),
			rgba(51, 57, 71, 1),
			rgba(51, 57, 71, 0)
		);
		padding: 3%;
		margin-bottom: 10%;
		width: 100%;
		border-top: 1px solid rgba(210, 198, 156, 0.6);
		border-bottom: 1px solid rgba(210, 198, 156, 0.6);
	}

	@media screen and (max-width: 620px) {
		.changeAvatar {
			flex-direction: column;
		}
		.avatars {
			width: 100%;
			height: 70%;
		}

		.preview {
			flex-direction: row;
			width: 100%;
			height: 30%;
		}

		.preview .selected {
			height: unset;
			width: 50%;
		}

		.preview .info {
			height: 100%;
			width: 100%;
		}

		.preview .name {
			height: 100%;
			display: flex;
			align-items: center;
		}
		.preview .name caption {
			margin-bottom: -10%;
		}

		.info :global(button) {
			width: unset;
		}
	}
</style>


================================================
FILE: src/lib/components/chat/_changeNick.svelte
================================================
<script>
	import { getContext } from 'svelte';
	import { fade } from 'svelte/transition';
	import { cookie } from '$lib/helpers/dataAPI/api-cookie';
	import Badwords from '$lib/helpers/chat/badwords';
	import ModalTpl from '../ModalTpl.svelte';

	let error = false;
	let errorMsg = '';
	let newName = cookie.get('nickName') || cookie.get('travelerID');
	const toggleNick = getContext('toggleNick');

	const setName = () => {
		let newNick = newName.trim();
		if (newNick === '') return;
		if (/[,./\\=+#@~` *":;_$^?$%&<>[\]{}()|]/.test(newNick)) {
			error = true;
			errorMsg = 'Illegal character detected';
			return;
		}
		if (Badwords.hasBadword(newNick)) {
			error = true;
			errorMsg = 'Badword Detected, Use different Name!';
			return;
		}
		toggleNick();
		cookie.set('nickName', newNick);
	};
</script>

<ModalTpl show dark on:cancel={toggleNick} title="Edit Nickname" on:confirm={setName}>
	<div class="input">
		<input
			type="text"
			class="wishinput"
			placeholder="Input Nickname"
			maxlength="15"
			class:error
			bind:value={newName}
			on:input={() => (error = false)}
		/>
		{#if error}
			<div class="warning" transition:fade={{ duration: 250 }}>{errorMsg}</div>
		{/if}
	</div>
</ModalTpl>

<style>
	.input {
		width: 100%;
		height: 100%;
		display: flex;
		justify-content: center;
		align-items: center;
		position: relative;
	}

	input {
		width: 70%;
		text-align: center;
	}

	.warning {
		position: absolute;
		top: 65%;
		left: 50%;
		transform: translateX(-50%);
		color: #fff;
		background-color: #ee6c4c;
		font-size: x-small;
		padding: 1% 3%;
		border-radius: 0.3rem;
	}
</style>


================================================
FILE: src/lib/components/chat/_chats.svelte
================================================
<script>
	import { afterUpdate, beforeUpdate, onMount } from 'svelte';
	import { fade } from 'svelte/transition';
	import { assets } from '$lib/store/app-stores';
	import Messagebox from './_messagebox.svelte';

	export let userId;
	export let messages = [];
	export let pro = false;

	let chatlist;
	let autoscroll;
	let newUpdate = false;

	const isAdmin = (id, nick) => id === 'nang441' && nick === 'nang441';
	const scrollToBottom = (behavior) => {
		const last = messages[messages.length - 1]?.key;
		const el = chatlist.querySelector(`#${last}`);
		el.scrollIntoView({ behavior });
	};

	const autoscrollCheck = () => {
		const chatListHeight = chatlist.offsetHeight + chatlist.scrollTop;
		autoscroll = chatListHeight > chatlist.scrollHeight - 20;
		if (chatListHeight <= chatlist.scrollHeight) {
			newUpdate = false;
		}
	};
	onMount(() => scrollToBottom('instant'));

	beforeUpdate(() => {
		if (!chatlist) return;
		autoscrollCheck();
		if (autoscroll) return;
		newUpdate = true;
	});

	afterUpdate(() => {
		if (autoscroll) scrollToBottom('smooth');
	});
</script>

<div class="messages" in:fade={{ duration: 300 }} bind:this={chatlist} on:scroll={autoscrollCheck}>
	{#each messages as { uid, name, pic, pro, message, key }, i}
		<div
			class="group"
			class:nopic={!pic}
			class:me={uid === userId}
			class:special={isAdmin(uid, name)}
			id={key}
		>
			<div class="picture">
				<figure>
					{#if isAdmin(uid, name)}
						<img src="/images/utility/admin.webp" alt="Admin" />
					{:else if pic}
						<img src={$assets[`face/${pic}`]} alt="Profile" />
					{:else}
						<i class="gi-user" />
					{/if}
				</figure>
			</div>

			<div class="message">
				<div class="sender reverse">
					{#if isAdmin(uid, name)}
						<span class="name">Admin</span>
					{:else}
						<span class="name">{name || uid}</span>
					{/if}
					{#if pro || isAdmin(uid, name)}
						<span class="pro"><i class="gi-win" /></span>
					{/if}
				</div>
				<div class="text">
					<p>{message}</p>
				</div>
			</div>
		</div>

		{#if i === 0}
			<div class="divider">
				<span />
			</div>
		{/if}
	{/each}
</div>
{#if newUpdate}
	<div class="jump">
		<button transition:fade on:click={() => scrollToBottom('smooth')}>
			<i class="gi-arrow-right" />
		</button>
	</div>
{/if}
<Messagebox {userId} {pro} />

<style>
	.messages {
		overflow-y: auto;
		height: 100%;
		position: relative;
	}

	.messages::-webkit-scrollbar {
		display: none;
	}

	.group {
		display: flex;
		width: 100%;
		height: fit-content;
		margin-bottom: 4%;
	}

	.group.me {
		flex-direction: row-reverse;
		justify-content: right;
	}

	.picture {
		width: 14%;
	}
	figure {
		width: 100%;
		aspect-ratio: 1/1;
		background-color: #3b4255;
		border-radius: 100%;
		display: flex;
		justify-content: center;
		align-items: center;
		overflow: hidden;
	}
	.nopic figure {
		background-color: rgba(210, 198, 156, 1);
	}
	.special .name {
		background-color: #0087cb;
		padding: 0 4%;
		font-size: 80%;
		color: #fff;
		border-radius: 2rem;
	}
	.special .pro {
		background-color: #f9aa02;
	}
	.special figure {
		border: rgba(210, 198, 156, 1) solid 0.1rem;
	}

	figure i {
		font-size: x-large;
		color: #3b4255;
	}

	figure img {
		width: 100%;
		height: auto;
	}

	.message {
		padding: 0 5%;
		width: 86%;
	}
	.message span {
		margin-right: 3%;
	}
	.sender {
		display: flex;
	}
	.me .sender {
		flex-direction: row-reverse;
		justify-content: right;
	}
	.pro {
		background-color: #0087cb;
		color: #fff;
		aspect-ratio: 1/1;
		width: 1.3rem;
		line-height: 0;
		display: inline-flex;
		justify-content: center;
		align-items: center;
		transform: rotate(45deg) scale(0.7);
	}
	.pro i {
		transform: rotate(-45deg);
	}
	.name {
		color: #bbbcc1;
		font-size: 90%;
		display: inline-flex;
		align-items: center;
	}

	.text {
		display: flex;
	}
	.me .text {
		justify-content: right;
	}

	.text p {
		background-color: #454b5d;
		color: #fff;
		padding: 2.3% 4%;
		margin-top: 2%;
		font-size: 80%;
		border-radius: 0.9rem;
		border-top-left-radius: 0;
		display: inline-block;
		position: relative;
		word-wrap: break-word;
		white-space: pre-wrap;
		max-width: 100%;
		font-family: var(--gi-global-font);
	}

	.me .text p {
		background-color: #d7d1c7;
		color: #3b4255;
		border-top-left-radius: 0.9rem;
		border-top-right-radius: 0;
	}

	.divider {
		display: flex;
		justify-content: center;
		margin-bottom: 5%;
	}

	.divider span {
		border-bottom: rgba(210, 198, 156, 1) solid 0.5px;
		width: 20%;
	}

	.jump {
		height: 0;
		position: relative;
	}
	.jump button {
		border-radius: 100%;
		aspect-ratio: 1/1;
		width: 9%;
		position: absolute;
		color: #d7d1c7;
		left: 50%;
		bottom: 0;
		display: inline-flex;
		justify-self: center;
		align-items: center;
		transform: translateX(-50%) translateY(-20%) rotate(90deg);
		line-height: 0;
		transition: 0.4s;
	}
	.jump i {
		animation: alternate 1s arrow infinite;
		font-size: 170%;
	}

	.jump button:hover {
		color: #fff;
	}
	.jump button:active {
		transform: translateX(-50%) translateY(-20%) rotate(90deg) scale(0.8);
	}

	@keyframes arrow {
		0% {
			transform: translateX(0%);
		}

		100% {
			transform: translateX(50%);
		}
	}

	@media screen and (max-width: 640px) {
		.text p {
			font-size: 120%;
			margin-top: 0%;
		}
		.name {
			font-size: 110%;
		}
		.pro {
			transform: rotate(45deg) scale(0.6);
			font-size: medium;
		}
	}
</style>


================================================
FILE: src/lib/components/chat/_loader-chat.svelte
================================================
<script>
	let activeIconIndex = 0;
	const iconList = ['pyro', 'hydro', 'anemo', 'electro', 'dendro', 'cryo', 'geo'];

	setInterval(() => {
		activeIconIndex = activeIconIndex === iconList.length - 1 ? 0 : activeIconIndex + 1;
	}, 1500);
</script>

<div class="initializing">
	<div class="icons">
		{#each iconList as element, i}
			<span class="icon" class:active={activeIconIndex === i}>
				<i class="gi-{element} {element}-flat" />
			</span>
		{/each}
	</div>
	<caption>
		<span>Initializing</span>
	</caption>
</div>

<style>
	.initializing {
		width: 100%;
		height: 100%;
		display: flex;
		justify-content: center;
		align-items: center;
		position: relative;
	}

	i {
		font-size: 300%;
	}

	span.icon {
		position: absolute;
		top: 50%;
		left: 50%;
		transform: translateX(-50%) translateY(-50%);
		opacity: 0;
		transition: 1s;
	}

	span.icon.active {
		opacity: 1;
	}

	caption {
		color: rgba(210, 198, 156, 1);
		font-size: 80%;
		position: absolute;
		top: 57%;
		left: 50%;
		transform: translateX(-50%);
	}

	caption span::after {
		content: '';
		padding-left: 2%;
		animation: infinite dot 2s;
	}

	@keyframes dot {
		0% {
			content: '';
		}
		25% {
			content: '.';
		}
		50% {
			content: '..';
		}
		75% {
			content: '...';
		}
		100% {
			content: '...';
		}
	}
</style>


================================================
FILE: src/lib/components/chat/_messagebox.svelte
================================================
<script>
	import { push, ref } from 'firebase/database';
	import { db } from '$lib/helpers/chat/firebaseApp';
	import { playSfx } from '$lib/helpers/audio/audio';
	import { cookie } from '$lib/helpers/dataAPI/api-cookie';
	import Badwords from '$lib/helpers/chat/badwords';
	import ButtonModal from '../ButtonModal.svelte';

	export let userId;
	export let pro = false;
	let isOnline = true;

	// Write to DB
	const writeUserData = (userId, message) => {
		const char = cookie.get('avatar');
		push(ref(db, 'wishsim-chatroom'), {
			uid: userId,
			name: cookie.get('nickName'),
			pic: char.outfit || char.name,
			pro,
			message
		});
	};

	const removeUrl = (text) => {
		let urlRegex =
			/(https?:\/\/)?[\w\-~]+(\.[\w\-~]+)+(\/[\w\-~@:%]*)*(#[\w-]*)?(\?[^\s]*)?(\.[\w\-~]+)?/gi;
		return text.replace(urlRegex, '~𝘣𝘭𝘰𝘤𝘬𝘦𝘥 𝘭𝘪𝘯𝘬~');
	};

	let msgInput;
	const send = () => {
		if (!msgInput || !isOnline) return;
		const urlRemoved = removeUrl(msgInput);
		writeUserData(userId, Badwords.clean(urlRemoved));
		msgInput = '';
		playSfx();
	};

	const offlineHandle = () => {
		isOnline = !isOnline;
	};
</script>

<svelte:window on:offline={offlineHandle} on:online={offlineHandle} />

<form class="message-box" on:submit|preventDefault>
	<div class="input">
		<input
			type="text"
			class="wishinput"
			placeholder="Click to Enter"
			maxlength="200"
			bind:value={msgInput}
		/>
	</div>
	<div class="col" style="margin-left: 2%">
		<ButtonModal light width="100px" on:click={send} disabled={!isOnline}>
			{#if isOnline}
				<span style="margin-right: -20%;">Send</span>
			{:else}
				<span style="margin-right: -20%;"> ... </span>
			{/if}
		</ButtonModal>
	</div>
</form>

<style>
	.message-box {
		display: flex;
		width: 100%;
		border-top: 1px solid rgba(210, 198, 156, 0.5);
		padding-top: 4%;
	}
	.input {
		width: 100%;
	}

	span {
		width: fit-content;
	}
</style>


================================================
FILE: src/lib/components/chat/_sidebar.svelte
================================================
<script>
	import { getContext } from 'svelte';
	import { fly } from 'svelte/transition';

	const close = getContext('chatToggle');
</script>

<div class="sidebar" on:click|stopPropagation transition:fly={{ x: -50, duration: 100 }}>
	<div class="top">
		<button class="close" on:click={close}>
			<i class="gi-reply" />
		</button>
	</div>
	<div class="nav-item">
		<a href="#chat" class="link active" on:click|preventDefault>
			<span>
				<i class="gi-team" />
				WishSimulator.App
			</span>
		</a>
	</div>
</div>

<style>
	.sidebar {
		max-width: 220px;
		width: 15%;
		min-width: 170px;
		height: 100%;
		display: block;
		background-color: rgba(32, 36, 49, 0.6);
		border-right: 1px solid rgba(210, 198, 156, 0.6);
		border-left: 1px solid rgba(210, 198, 156, 0.6);
		color: #d2c69c;
		position: relative;
	}

	@media screen and (max-width: 454px) {
		.sidebar {
			display: none;
		}
	}

	.top {
		width: 100%;
		height: 60px;
		background-color: #3b4255;
		padding: 0 20px 10px;
		display: flex;
		align-items: flex-end;
	}
	:global(.mobile) .top {
		height: 40px;
		padding: 0 20px 0px;
		margin-bottom: -10px;
	}

	.gi-reply {
		font-size: x-large;
	}

	:global(.mobile) .gi-reply {
		font-size: large;
	}

	.nav-item {
		margin-top: 20px;
		display: flex;
		flex-direction: column;
		color: #f0e4d4;
	}

	.link {
		position: relative;
		transition: all 0.2s;
		text-decoration: none;
		color: #f0e4d4;
		aspect-ratio: 70/17.5;
		display: flex;
		align-items: center;
		padding-left: 5%;
		z-index: 1;
	}

	@media screen and (min-width: 900px) {
		.link {
			font-size: 80%;
		}
	}

	.link i {
		font-size: 1.3rem;
		display: inline-block;
		margin-right: 10px;
		opacity: 0.8;
	}
	:global(.mobile) .link i {
		font-size: 1.4rem;
	}

	.link.active,
	.link:hover {
		background-color: #414856;
		border-radius: 0.25rem;
	}

	.link::after,
	.link::before,
	span::after,
	span::before {
		content: '';
		position: absolute;
		background-size: contain;
		display: block;
	}

	.link.active::before {
		top: 50%;
		right: -3%;
		height: 100%;
		aspect-ratio: 1/1;
		transform: translateY(-50%) rotate(180deg);
		z-index: -1;
		line-height: 120%;
		background-color: #414856;
		border-radius: 100%;
	}

	.link.active::after {
		top: 50%;
		right: -1%;
		width: 100%;
		aspect-ratio: 708/156;
		transform: translateY(-50%) rotate(180deg);
		background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsQAAACcCAMAAABPyU0CAAAAOVBMVEUAAADTu4vUvI7Uuo3TvI7TvI7UvI7TvozTu43TvI7Su47Pv4/fv43TvI7Tu43SvIzVuo3UvI/TvI7Io+VzAAAAEnRSTlMAQL9goL/eIHDvsBAQkIBQML8hIpUyAAADO0lEQVR42uzd22oCMRSG0dixM2oVZb//wzaOhzoWerjzh7VAxfuPkExibD9ZF7yg97YgYvKImHj/jHho8FJWIiadiIknYuKJmHgiJp6IiSdi4omYeL9G/FYLIublrOqZiAkjYuL9JeJVgxwiJp6IiSdi4omYeCImnoiJJ2LiiZh4IiaeiIknYuKJmHgiJp6IiSdi4omYeCImnoiJJ2LiiZh4Iibet4inrYjJ8hzxfqwaPxrkeI74ULWdGgR5injo3zcNkiwjnsaqdYMoy4jXVaPJBGEWEQ+uDyTQImKTCRI9RrwxmSDRQ8TTaDJBoh7x46quQZyviCerOjL1cg3EZLtHPG0NxGS6RzwYiAl1j9ijCVLdIj4aiEl1i3hns45U14in/mmzjkzXiIeq9waRrhG/WdYRq0dsNkG2Xq/ZBNkuEe/8so5cl4jHqlODTHPEJzsdBJsjHqp2DULNEa9NiQk2Rzy6fo1gPeL5bd8gVO/Xuo5s54iPtjpIdo54U3VokOoc8cHDCZKdI95VHRuk6hH7lw6y9YidnCDbHLHDxCTrEc8viCVi4omYeCImnoiJJ2LiecRGPBETz7Yz8eYDQO6wIpmjmMT7bO8OU1oHwgCKpiCtIdDHy/4XKxOjOFUQ//XCOWu4hJkk34yf4sk7xpMcO0HZiPhmUJQyI/vkOTyFPMdYkXdE/GpnR9gR8W3f1wWijoiX1agoXSNii2LSXDxD3nvEmzfFdJ1THf+tJ8g6I361niDrjHhzpShZI+JzPXFfoOgj4su+r7Z2JI2ID6sZJaI+I77b2hH1GfG2+h+TphGxRzFpI2KPYtJGxKe7UTuSvkS8rb49UzQi/nD3rpii6VjX676/LBAzRXzZ7e3omSIeRwteLSiImSPeVgsKcuaIl3+7NxTUPEQ8jnld/VhMymPE29WymJgR8eTm6zMx3yJ2gwc1IiZPxOSJmDwRkydi8kRMnojJEzF5IiZPxOSJmDwRkydi8kRMnojJEzF5IiZPxOSJmDwRkydi8n6KeOJSJZ7OZZ+ImB4Rk/drxLMXEfN0Lt9u+hIxMSImT8TkiZg8EZMnYvJETJ6IyftzxPCEREyeiMl7iPgNPx9ffAKGWGIAAAAASUVORK5CYII=');
		background-repeat: no-repeat;
		opacity: 0.5;
	}

	span {
		display: flex;
		align-items: center;
		width: 100%;
		height: 95%;
		position: relative;
		overflow: hidden;
	}
	span :global(i) {
		line-height: 0;
	}
</style>


================================================
FILE: src/lib/components/svgs/Anemo.svelte
================================================
<svg
	viewBox="0 0 400 420"
	version="1.1"
	xmlns="http://www.w3.org/2000/svg"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xml:space="preserve"
	xmlns:serif="http://www.serif.com/"
	style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
>
	<g transform="matrix(1,0,0,1,-5.68434e-14,10)">
		<circle cx="200" cy="200" r="200" style="fill:url(#_RadialAnemo);" />
	</g>
	<path
		d="M200.023,249.356C201.285,221.689 254.948,199.235 287.064,181.699C338.894,153.398 346.889,76.826 346.889,76.826C346.889,76.826 364.313,105.277 364.313,140.952C364.313,196.476 299.029,208 271.459,211.97C243.89,215.94 206.396,236.893 206.396,270.417C206.396,303.941 244.13,309.656 244.13,309.303C256.481,297.305 269.714,304.892 269.538,305.069C235.674,324.592 201.454,397.068 200.045,400.075L200.045,400.171L200.023,400.123L200,400.171L200,400.075C198.591,397.068 164.371,324.592 130.507,305.069C130.331,304.892 143.564,297.305 155.915,309.303C155.915,309.656 193.649,303.941 193.649,270.417C193.649,236.893 156.155,215.94 128.586,211.97C101.017,208 35.733,196.476 35.733,140.952C35.733,105.277 53.156,76.826 53.156,76.826C53.156,76.826 61.151,153.398 112.982,181.699C145.097,199.235 198.761,221.689 200.023,249.356ZM200.023,327.478C199.597,328.03 193.149,336.189 183.025,338.109C183.025,338.109 199.341,356.361 200.023,373.342C200.704,356.361 217.02,338.109 217.02,338.109C206.896,336.189 200.448,328.03 200.023,327.478ZM200.023,294.038C199.292,305.884 181.001,321.411 169.67,321.411C169.67,321.501 174.368,323.85 179.788,323.85C185.19,323.85 195.746,320.351 200,314.428L200,314.364L200.023,314.396L200.045,314.364L200.045,314.428C204.299,320.351 214.856,323.85 220.257,323.85C225.677,323.85 230.375,321.501 230.375,321.411C219.044,321.411 200.753,305.884 200.023,294.038ZM263.096,280.004C246.299,280.004 231.619,274.781 231.619,259.113C231.619,243.445 243.335,236.81 253.639,236.81C269.589,236.81 297.397,259.96 327.604,259.96C357.811,259.96 392.045,231.658 392.045,184.68C392.045,167.698 386.752,153.803 386.752,153.803C386.752,153.803 360.065,195.046 340.656,206.294C321.247,217.543 306.911,219.969 285.297,219.969C263.683,219.969 220.013,227.027 220.013,267.167C220.013,283.709 232.364,296.06 246.7,296.06C265.666,296.06 263.096,280.342 263.096,280.004ZM136.949,280.004C153.746,280.004 168.426,274.781 168.426,259.113C168.426,243.445 156.711,236.81 146.406,236.81C130.456,236.81 102.648,259.96 72.441,259.96C42.234,259.96 8,231.658 8,184.68C8,167.698 13.293,153.803 13.293,153.803C13.293,153.803 39.98,195.046 59.389,206.294C78.798,217.543 93.134,219.969 114.748,219.969C136.362,219.969 180.032,227.027 180.032,267.167C180.032,283.709 167.681,296.06 153.345,296.06C134.379,296.06 136.949,280.342 136.949,280.004ZM217.303,199.715C217.303,199.715 312.651,128.929 263.975,21.808C263.614,21.447 323.1,37.66 323.1,103.998C325.684,181.537 217.303,199.715 217.303,199.715ZM182.742,199.715C182.742,199.715 87.394,128.929 136.071,21.808C136.431,21.447 76.945,37.66 76.945,103.998C74.361,181.537 182.742,199.715 182.742,199.715Z"
		style="fill:rgb(166,243,203);"
	/>
	<defs>
		<radialGradient
			id="_RadialAnemo"
			cx="0"
			cy="0"
			r="1"
			gradientUnits="userSpaceOnUse"
			gradientTransform="matrix(200,0,0,200,200,200)"
		>
			<stop offset="0" style="stop-color:rgb(68,183,136);stop-opacity:1" />
			<stop offset="0.48" style="stop-color:rgb(68,185,137);stop-opacity:0.73" />
			<stop offset="1" style="stop-color:rgb(69,191,141);stop-opacity:0" />
		</radialGradient>
	</defs>
</svg>


================================================
FILE: src/lib/components/svgs/Bow.svelte
================================================
<svg
	viewBox="0 0 128 128"
	version="1.1"
	xmlns="http://www.w3.org/2000/svg"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xml:space="preserve"
	style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;"
>
	<g transform="matrix(0.94442,0,0,0.94442,4.27757,-0.4701)">
		<g transform="matrix(1.05885,-0,-0,1.05885,-4.52931,0.497767)">
			<use
				xlink:href="#_ImageBow1"
				x="20.069"
				y="20.019"
				width="45.409px"
				height="45.382px"
				transform="matrix(0.987158,0,0,0.986573,0,0)"
			/>
		</g>
	</g>
	<g transform="matrix(0.94442,0,0,0.94442,4.27757,-0.4701)">
		<g transform="matrix(1.05885,-0,-0,1.05885,-4.52931,0.497767)">
			<use
				xlink:href="#_ImageBow2"
				x="39.941"
				y="60.407"
				width="68.523px"
				height="48.243px"
				transform="matrix(0.993092,0,0,0.984541,0,0)"
			/>
		</g>
	</g>
	<g transform="matrix(0.954497,0,0,0.954497,4.40699,-0.764803)">
		<g transform="matrix(1.04767,-0,-0,1.04767,-4.61708,0.801263)">
			<use
				xlink:href="#_ImageBow3"
				x="72.762"
				y="44.826"
				width="17.055px"
				height="17.055px"
				transform="matrix(0.947507,0,0,0.947507,0,0)"
			/>
		</g>
	</g>
	<g transform="matrix(0.667805,-0.667805,0.667805,0.667805,-24.1918,61.0036)">
		<path
			d="M4,64L7,67L10,64L7,61L10,58L12,60L19.942,60L22,58L30,66L100,66L102,64L100,62L105,57L128,68.934L105,80.868L100,75.868L102,73.868L100,71.868L30,71.868L22,79.868L20,78L12,78L10,80L7,77L10,73.868L7,70.868L4,73.868L-1,68.934L4,64Z"
			style="fill:rgb(255,253,255);stroke:rgb(125,129,134);stroke-width:1.06px;"
		/>
	</g>
	<defs>
		<image
			id="_ImageBow1"
			width="46px"
			height="46px"
			xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAYAAABXuSs3AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFJUlEQVRogdWYS2wbRRjH/9/MxGsndRLbaZun0qRNQ+IEyVQp9ElLERceKvTAAYTgUvXCBQmkWtpaG6urilIOcOCCxAUJhITgiEQrHgda0VatkFLaRGrjtKlKorzIw7G9M8OhSaidNLbzsNPfbXd25vvp8+zs54+wzpiWLQA0AtjJOW9jjNUBCCitKpRUZQBo7lGttf40Ggn/lMu6Yh1ECUAH5/wIMQpJR9a6XK5Upa8Sfr/f4/F4YLgNuA03XIYLBIKGxs2/b6pYfyyQa5w1EZ+T7eScv6i1PmQYhqirrzM2b97MKioqIEpE1jic87xirkrctGw3ER0jojcNw+D1DfXu2rpa5vV6V7NsTqxI3LRsg4iOEtE7VVVVvLWt1aioqFhrt2XJS9y0bBcRvUpE7/oDftHW3uYutPA8OYublt3JOOv2VfrcbcE2d2Vl5Xp6ZSWruGnZxBh7i4jeDu0KGdXV1YXwysqy4qZll3PBrVJP6VNdz3YZpaWlhfLKymPFTcsOMsZONzQ0lLYH20sYY4X0ysqS4pHomTeI6HjomZBRXbMxtkYmi8RNy36Jc358/8H9RllZWTGcciLt9zctu4tz/sHefXs3tDTwSMZNy25ljEV3P7fb8Jav/5dvpcwVbS+IuYs6xti50K6QEQjkXOcUBc75CSnlMWZato9z/ll7sN1TU1NTbK9lMS17DzF6BQAYF/xcU3NT+bambRvrvMvAtOwtjDGzq6vLAAAhHdnYsrOl6NJEBMbYa9322T1LjSulana07HD5A34AWb6cWmuMjIxgYnwCo6Oj8Xg8rlYj5/f7RUdnh7HUWHNzM/P7/VsAbFlqnHOOQNX/799jxePxOC7/eXl2ZnpmXGt9VUrZA+AfAHqF3vWpZOpER2fHkoOG28DW6q1ZF9H6YfglxcfHxnHxj4tJrfU3Sqmvo5HwqjINAKZlT612jUdZJC6lxJUrVxJSyk+ikfD5tQy2lix6Kft6+xwn5fwF4EIRfHImTVwrjf47/cpxnM+jkfBK93JBSBMfHh4GgAfRSPhucXRyJ018aGjIcRxnQ2+RedLEJycnkwAGiuSSF2ni09PTADBYHJX8WBDXWiMxmzDwhIgvnOPJRBJElOo+dXKmmEK5spBxpRWIyCmmTD6kn+NaF71KzJUFUVpoUz8ZPDEZzmTNG/vLkUqlSvp6+/KawxhD47ZGiIwWeyHFB6WU3/Xe6s0rJhG9HAgENlX60pus+XRrmzjnR+evpZQ/RCPh/lznRyPhGQBf5vr8PN322f0ANmXez1lcCPF+TW1NyOv1YmBgwJmanLoFoD9fkbUiJ3HTsquUUp3BYBCiRODe3XtJAEPr7AYA0Fqrnp6ehMvlevgv7GGx7VmuW1sKwE9Ee4jove07titRIiClxOTkpAHgRiHEHcc5MzY6Vp9x+1/BOY/Pzs6Wcc6hlPJYpz/+Xkrp1Vpzl8uVLC8v18GOoGe+LTc2NgYu+GAk/FFBSoNoJHwDSyRJENGl+4P3D7fsbGH7DuwjIYTfbbhR4ioBAHfmhN5bvQkl1c8FcF4W5jjOj7dv304lZhPw+Xzwer3z0ouI9cf0xPjEsFLq2wJ7LoL//uuFoYOHjhiD9wZba+tqReZBP8/U1BSuXr6alFJ+GI2ERwrsuQgOAL/9cv7agecP81gs1ialZIILIiIopTAxMYHYnZi8fu26A+CL7lMnLxXZGQDSKyvTsls5568T0dNKKZ/WWnDBH2ilb0gpv4pGwg+KJZrJf37ysujOFyKWAAAAAElFTkSuQmCC"
		/>
		<image
			id="_ImageBow2"
			width="69px"
			height="49px"
			xlink:href="data:image/png;base64,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"
		/>
		<image
			id="_ImageBow3"
			width="18px"
			height="18px"
			xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAW0lEQVQ4je3UsQ2AMBBDURs5XcYKa1HQMBBlbqx0RDoKlAVyElV+71eax3nd7p4RiGSTu+eyFyhpCulPh1XLAgAlQZqDRltovaAFLeh3SMB3BbONrUg2qxY+theCJRmnxjtu3QAAAABJRU5ErkJggg=="
		/>
	</defs>
</svg>


================================================
FILE: src/lib/components/svgs/Catalyst.svelte
================================================
<svg
	viewBox="0 0 128 128"
	version="1.1"
	xmlns="http://www.w3.org/2000/svg"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xml:space="preserve"
	xmlns:serif="http://www.serif.com/"
	style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;"
>
	<g>
		<g transform="matrix(1.2822,0,0,1.2822,-28.2205,-18.909)">
			<circle cx="70.545" cy="64.661" r="9.273" style="fill:rgb(201,207,210);fill-opacity:0.75;" />
		</g>
		<g transform="matrix(1.14367,0,0,1.14367,-11.8482,-9.37487)">
			<g transform="matrix(0.874382,-0,-0,0.874382,10.3599,8.19722)">
				<use
					xlink:href="#_ImageCatalyst1"
					x="2.102"
					y="0"
					width="123.803px"
					height="128px"
					transform="matrix(0.99841,0,0,1,0,0)"
				/>
			</g>
		</g>
		<g transform="matrix(1.14367,0,0,1.14367,-11.8482,-9.37487)">
			<path
				d="M48.349,46.587C52.573,42.417 58.375,39.841 64.774,39.841C77.681,39.841 88.159,50.319 88.159,63.226C88.159,76.132 77.681,86.61 64.774,86.61C51.868,86.61 41.39,76.132 41.39,63.226C41.39,58.303 42.914,53.734 45.516,49.964"
				style="fill:none;stroke:rgb(125,129,134);stroke-opacity:0.75;stroke-width:0.87px;"
			/>
		</g>
		<g transform="matrix(1.14367,0,0,1.14367,-11.8482,-9.37487)">
			<g transform="matrix(1.51228,0,0,1.51228,52.5281,5.03589)">
				<path
					d="M34.246,14.195C32.915,12.864 25.757,18.944 21.513,18.944C17.268,18.944 10.22,12.864 8.779,14.195C7.339,15.526 14.807,22.914 12.868,26.928C8.9,35.14 -10.377,57.377 -15.026,63.467C-8.936,58.818 13.301,39.541 21.513,35.574C25.527,33.634 32.915,41.102 34.246,39.662C35.577,38.221 29.497,31.173 29.497,26.928C29.497,22.684 35.577,15.526 34.246,14.195Z"
					style="fill:rgb(255,253,255);stroke:rgb(125,129,134);stroke-width:0.58px;"
				/>
			</g>
			<g transform="matrix(6.12323e-17,-1,1,6.12323e-17,-15.2923,185.711)">
				<path
					d="M97.754,88.041L92.041,88.041L76.892,78.041L86.892,93.754L86.892,98.903L97.754,98.903L97.754,88.041Z"
					style="fill:rgb(255,253,255);stroke:rgb(125,129,134);stroke-width:0.87px;"
				/>
			</g>
			<g transform="matrix(6.12323e-17,-1,1,6.12323e-17,-56.3179,145.506)">
				<path
					d="M97.754,88.041L92.041,88.041L76.892,78.041L86.892,93.754L86.892,98.903L97.754,98.903L97.754,88.041Z"
					style="fill:rgb(255,253,255);stroke:rgb(125,129,134);stroke-width:0.87px;"
				/>
			</g>
		</g>
		<defs>
			<image
				id="_ImageCatalyst1"
				width="124px"
				height="128px"
				xlink:href="data:image/png;base64,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"
			/>
		</defs>
	</g>
</svg>


================================================
FILE: src/lib/components/svgs/Claymore.svelte
================================================
<svg
	viewBox="0 0 128 128"
	version="1.1"
	xmlns="http://www.w3.org/2000/svg"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xml:space="preserve"
	xmlns:serif="http://www.serif.com/"
	style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;"
>
	<g transform="matrix(1.05467,0,0,1.05467,-3.23384,2.85124)">
		<g transform="matrix(0.948159,-0,-0,0.948159,3.06619,-2.70343)">
			<use
				xlink:href="#_ImageClaymore1"
				x="13.668"
				y="15.996"
				width="100.736px"
				height="112.128px"
				transform="matrix(0.997389,0,0,0.992283,0,0)"
			/>
		</g>
	</g>
	<g transform="matrix(1.05467,0,0,1.05467,-3.23384,2.85124)">
		<g opacity="0.75">
			<path
				d="M45.856,32.338C50.013,29.817 54.708,28.091 59.725,27.374"
				style="fill:none;stroke:rgb(125,129,134);stroke-width:0.95px;"
			/>
			<path
				d="M70.275,27.374C86.569,29.703 99.455,42.668 101.664,59"
				style="fill:none;stroke:rgb(125,129,134);stroke-width:0.95px;"
			/>
			<path
				d="M101.664,69C100.152,80.182 93.635,89.785 84.447,95.476"
				style="fill:none;stroke:rgb(125,129,134);stroke-width:0.95px;"
			/>
			<path
				d="M54.406,99.459C39.14,94.897 28,80.739 28,64C28,57.543 29.658,51.47 32.571,46.183"
				style="fill:none;stroke:rgb(125,129,134);stroke-width:0.95px;"
			/>
		</g>
	</g>
	<g transform="matrix(0.745768,-0.745768,0.745768,0.745768,-20.5657,49.2825)">
		<path
			d="M19,64L19,58C19,58 87.41,61.748 91.781,61.988C91.925,61.996 92.065,62.037 92.191,62.107C93.642,62.923 102.964,68.167 106.575,70.198C106.864,70.361 107.044,70.668 107.044,71C107.044,71.332 106.864,71.639 106.575,71.802C102.964,73.833 93.642,79.077 92.191,79.893C92.065,79.963 91.925,80.004 91.781,80.012C87.41,80.252 19,84 19,84L19,78L26,71L19,64Z"
			style="fill:rgb(255,253,255);stroke:rgb(125,129,134);stroke-width:0.95px;"
		/>
		<g transform="matrix(0.707107,0.707107,-0.707107,0.707107,42.75,-19.5097)">
			<path
				d="M42.651,78.319L93.875,29.882L98.118,29.882L98.118,34.125L49.681,85.349L49.681,86.804L60.288,97.411L57.459,100.239L53.217,100.239L53.217,97.411L43.317,87.511L29.882,100.946L29.882,106.603L17.861,110.139L21.397,98.118L27.054,98.118L40.489,84.683L30.589,74.783L27.761,74.783L27.761,70.541L30.589,67.712L41.196,78.319L42.651,78.319Z"
				style="fill:rgb(255,253,255);stroke:rgb(125,129,134);stroke-width:0.95px;"
			/>
		</g>
	</g>
	<defs>
		<image
			id="_ImageClaymore1"
			width="101px"
			height="113px"
			xlink:href="data:image/png;base64,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"
		/>
	</defs>
</svg>


================================================
FILE: src/lib/components/svgs/Cryo.svelte
================================================
<svg
	viewBox="0 0 400 420"
	version="1.1"
	xmlns="http://www.w3.org/2000/svg"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xml:space="preserve"
	xmlns:serif="http://www.serif.com/"
	style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
>
	<g transform="matrix(1,0,0,1,0,10)">
		<circle cx="200" cy="200" r="200" style="fill:url(#_RadialCryo);" />
	</g>
	<path
		d="M199.472,229.418C199.6,232.009 202.185,274.232 235.394,318.921L235.882,318.692C240.929,316.336 246.335,314.425 251.995,313.293C251.996,313.292 251.997,313.291 251.998,313.291L252,313.292L251.995,313.293C251.489,313.577 217.449,359.788 199.423,405.219L199,406.292C199,406.292 181,358.292 146,313.292L146.073,313.299C146.831,313.374 153.406,314.114 163.025,318.602L163.422,318.063C197.094,272.252 199.466,229.292 199.466,229.292L199.472,229.418ZM199.091,268.62L199,269.292C194.101,305.222 183.199,323.148 179.366,328.514C185.591,333.196 192.266,339.311 199,347.292L199.103,347.17C200.058,346.043 207.532,337.289 219.036,328.818C215.416,323.848 204.179,305.93 199.183,269.292L199.091,268.62ZM314.684,216.483C314.677,217.064 337.677,269.649 368.008,307.975L368.726,308.878C368.726,308.878 345.896,305.08 313.79,304.958L312.666,304.955C297.631,304.938 280.625,305.735 263.008,308.097L261.685,308.277C261.669,308.306 265.521,302.68 274.797,296.189C251.974,243.693 215.672,219.975 215.672,219.975L215.784,220.033C217.757,221.045 245.706,234.982 288.332,235.001L288.936,235C295.997,234.981 303.454,234.579 311.258,233.674C311.719,227.951 312.775,222.127 314.684,216.483C314.683,216.48 314.684,216.479 314.685,216.479L314.684,216.483ZM84.071,216.081C84.385,216.775 87.032,222.839 87.954,233.414C95.95,234.325 103.587,234.721 110.812,234.729L111.412,234.729C155.202,234.646 183.519,220.317 183.519,220.317L183.413,220.385C181.234,221.792 145.96,245.142 123.862,296.247C128.587,299.508 133.103,303.334 137.037,307.809C137.038,307.81 137.039,307.811 137.04,307.811L137.04,307.813L137.037,307.809C136.718,307.62 113.402,304.959 84.005,304.899L82.913,304.898C66.502,304.901 48.276,305.726 31.141,308.243L30,308.414C30,308.414 62.569,268.825 84.04,216.014L84.071,216.081ZM149.273,239.657L148.645,239.914C122.42,250.635 103.881,252.688 93.897,252.769L93.309,252.772C90.994,252.773 89.173,252.669 87.858,252.551L87.54,252.521C86.598,260.253 84.64,269.092 81.095,278.914C81.204,278.943 93.151,280.919 107.112,287.029L107.234,286.756C109.92,280.824 119.961,262.365 148.737,240.072L149.273,239.657ZM249.544,239.963L250.08,240.378C278.747,262.586 288.821,280.99 291.551,286.993L292.227,286.708C299.259,283.774 307.672,281.162 317.63,279.378C317.601,279.271 313.471,268.286 311.731,253.497L311.65,252.789C310.408,252.921 308.546,253.059 306.08,253.076L305.501,253.078C295.664,253.071 276.914,251.152 250.171,240.22L249.544,239.963ZM203.297,208.258L240,197.414L261,210.414L240,223.414L202.588,212.36L231.258,239.605L230.5,264.292L208.742,252.605L199.5,214.229L190.258,252.605L168.5,264.292L167.742,239.605L195.64,213.093L158.726,224L137.726,211L158.726,198L196.956,209.295L167.467,181.273L168.226,156.586L189.984,168.273L199.413,207.426L208.742,168.687L230.5,157L231.258,181.687L203.297,208.258ZM368.632,113.115C366.72,115.464 335.99,153.611 315.19,204.164L314.685,205.399C314.702,205.428 311.756,199.279 310.772,188C302.997,187.114 295.562,186.715 288.517,186.686L287.914,186.685C245.389,186.638 217.307,200.063 215.319,201.041L215.206,201.097C215.206,201.097 252.054,177.917 274.863,125.167C270.138,121.906 265.622,118.08 261.689,113.604C261.686,113.603 261.685,113.602 261.685,113.601L261.689,113.604C262.011,113.796 285.902,116.521 315.812,116.516L316.909,116.514C333.031,116.475 350.83,115.632 367.585,113.17L368.726,113L368.632,113.115ZM30.147,112.024C32.165,112.349 54.865,115.888 86.06,115.923L87.191,115.922C102.322,115.898 119.393,115.042 137.04,112.601L136.998,112.66C136.554,113.279 132.625,118.604 123.929,124.689C146.04,175.547 180.802,199.395 182.949,200.834L183.054,200.903C183.054,200.903 154.878,186.031 110.996,185.878L110.394,185.877C103.154,185.874 95.495,186.273 87.468,187.204C87.006,192.926 85.951,198.75 84.042,204.395C84.042,204.396 84.042,204.397 84.042,204.398L84.04,204.399L84.042,204.395C84.049,203.809 60.686,150.399 30,112L30.147,112.024ZM200.053,15.139C201.131,17.969 218.802,63.655 252.183,106.945L253,108C253.032,108 246.445,107.493 236.454,102.911L235.975,102.689C202.987,147.267 199.714,189.296 199.542,191.874L199.534,192C199.534,192 197.897,148.838 164.006,102.911L163.606,102.371C158.419,104.832 152.847,106.83 147.005,107.999L147.002,108C147.001,108.001 147,108 147,108L147.005,107.999C147.515,107.712 182.088,60.775 200,15L200.053,15.139ZM291.614,134.385C289.119,140.006 279.221,158.696 249.989,181.342L249.452,181.757L250.08,181.5C276.829,170.565 295.582,168.647 305.417,168.642L305.985,168.644C308.217,168.659 309.955,168.773 311.186,168.893L311.277,168.164C312.251,160.608 314.196,152.016 317.63,142.5C317.523,142.471 305.944,140.556 292.266,134.668L291.614,134.385ZM107.174,133.885C100.007,136.935 91.374,139.659 81.095,141.5C81.125,141.609 85.387,152.943 87.076,168.088L87.374,168.058C88.711,167.926 90.667,167.798 93.225,167.8L93.826,167.803C103.818,167.887 122.349,169.945 148.554,180.658L149.182,180.915L148.645,180.5C120.426,158.638 110.224,140.463 107.308,134.175L107.174,133.885ZM200,74C199.92,74.08 192.236,83.438 179.964,92.474C183.585,97.444 194.821,115.361 199.817,152L199.909,152.672L200,152C204.9,116.07 215.801,98.144 219.634,92.777C213.507,88.169 206.942,82.171 200.316,74.373L200,74Z"
		style="fill:rgb(197,251,253);"
	/>
	<defs>
		<radialGradient
			id="_RadialCryo"
			cx="0"
			cy="0"
			r="1"
			gradientUnits="userSpaceOnUse"
			gradientTransform="matrix(200,0,0,200,200,200)"
		>
			<stop offset="0" style="stop-color:rgb(129,207,220);stop-opacity:1" />
			<stop offset="0.48" style="stop-color:rgb(129,206,219);stop-opacity:0.74" />
			<stop offset="1" style="stop-color:rgb(128,205,218);stop-opacity:0" />
		</radialGradient>
	</defs>
</svg>


================================================
FILE: src/lib/components/svgs/Dendro.svelte
================================================
<svg
	viewBox="0 0 400 420"
	version="1.1"
	xmlns="http://www.w3.org/2000/svg"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xml:space="preserve"
	xmlns:serif="http://www.serif.com/"
	style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
>
	<g transform="matrix(1,0,0,1,0.5,10.915)">
		<circle style="fill:url(#_RadialDendro)" cx="200" cy="200" r="200" />
	</g>
	<path
		d="M235.79 83.68c-4.46,5.09 -8.45,10.79 -11.98,17.11 -6.75,3.9 -13.02,8.46 -18.82,13.69 -15,-7.22 -25.26,-18.62 -30.79,-34.21 2.99,-24.23 13.26,-44.76 30.79,-61.58 18.54,17.7 28.8,39.37 30.79,65.01zm-215.54 280.55c-2.28,2.28 -2.28,2.28 0,0zm-17.11 -20.53c0.45,2.53 -0.12,4.81 -1.71,6.84 -2.37,-3.2 -1.8,-5.48 1.71,-6.84zm249.76 -198.44c36.58,-1.62 54.26,15.49 53.03,51.32 -4.71,7.71 -9.84,15.12 -15.4,22.24 10.32,1.73 18.3,6.86 23.95,15.4 -0.57,1.14 -1.14,2.28 -1.71,3.42 -9.01,-5.68 -18.7,-7.39 -29.08,-5.13 -19.49,6.6 -37.17,16.3 -53.03,29.08 -2.28,-2.28 -2.28,-4.56 0,-6.84 15.11,-12.82 27.66,-27.64 37.63,-44.48 6.5,-28.06 -4.34,-45.16 -32.5,-51.32 5.18,-5.41 10.88,-9.97 17.11,-13.69zm-119.75 -0c11.67,-0.15 23.07,1.57 34.21,5.13 2.93,2.36 5.21,5.21 6.84,8.55 -34.91,10.94 -43.47,32.61 -25.66,65.01 10.26,10.26 20.53,20.53 30.79,30.79 2.28,2.28 2.28,4.56 0,6.84 -21.14,-18.86 -45.66,-28.55 -73.56,-29.08 -11.8,6.09 -12.94,3.81 -3.42,-6.84 5.43,-2.95 11.13,-5.23 17.11,-6.84 -25.56,-30.14 -21,-54.66 13.69,-73.56zm0 -44.48c26.09,-4.91 47.19,3.08 63.3,23.95 2.66,8.23 -0.19,13.94 -8.55,17.11 -33.16,-28.08 -65.67,-26.94 -97.51,3.42 -25.64,55.38 -12.52,99.28 39.34,131.72 30.38,8.89 55.47,25.43 75.27,49.61 7.36,-9.07 15.34,-17.62 23.95,-25.66 24.6,-11.72 48.55,-24.27 71.85,-37.63 39.47,-39.75 42.89,-81.94 10.26,-126.59 -31.38,-22 -61.04,-20.29 -88.95,5.13 -8.37,-3.17 -11.22,-8.87 -8.55,-17.11 12.37,-15 27.77,-24.12 46.19,-27.37 26.43,0.44 49.24,9.56 68.43,27.37 6.03,-32.71 25.42,-44.12 58.16,-34.21 -3.3,15.1 -10.14,28.21 -20.53,39.35 -10.26,1.14 -20.53,2.28 -30.79,3.42 17.23,23.85 24.64,50.65 22.24,80.4 15.08,-10.13 28.2,-7.84 39.34,6.84 -14.7,17.57 -28.95,17.57 -42.77,0 -5.74,28.56 -20,51.94 -42.77,70.14 -21.94,13.92 -44.75,26.46 -68.43,37.63 -16.34,15.01 -28.88,32.68 -37.63,53.03 -8.75,-20.35 -21.3,-38.03 -37.63,-53.03 -34.04,-14.43 -64.26,-34.39 -90.67,-59.87 -9.49,-14.76 -16.33,-30.73 -20.53,-47.9 -13.98,17.5 -28.23,17.5 -42.77,0 11.15,-14.69 24.26,-16.97 39.35,-6.84 -2.41,-29.75 5.01,-56.55 22.24,-80.4 -10.26,-1.14 -20.53,-2.28 -30.79,-3.42 -34.95,-40.59 -26.97,-52.56 23.95,-35.92 7.07,9.09 11.64,19.35 13.69,30.79 14.32,-13.9 31.42,-21.88 51.32,-23.95zm263.44 -37.63c4.56,2.28 4.56,2.28 0,0m-17.1 -20.53c4.56,2.28 4.56,2.28 0,0m-13.69 -13.69c4.56,2.28 4.56,2.28 0,0z"
		style="fill:rgb(180, 218,68)"
	/>
	<defs>
		<radialGradient
			xmlns="http://www.w3.org/2000/svg"
			id="_RadialDendro"
			cx="0"
			cy="0"
			r="1"
			gradientUnits="userSpaceOnUse"
			gradientTransform="matrix(200,0,0,200,200,200)"
		>
			<stop offset="0" style="stop-color: rgb(209 245 105);stop-opacity: 1;" />
			<stop offset="0" style="stop-color: rgb(209 245 105);stop-opacity: .73;" />
			<stop offset="1" style="stop-color: rgb(209 245 105);stop-opacity: 0;" />
		</radialGradient>
	</defs>
</svg>


================================================
FILE: src/lib/components/svgs/Electro.svelte
================================================
<svg
	viewBox="0 0 400 420"
	version="1.1"
	xmlns="http://www.w3.org/2000/svg"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xml:space="preserve"
	xmlns:serif="http://www.serif.com/"
	style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
>
	<g transform="matrix(1,0,0,1,0.5,10.915)">
		<circle cx="200" cy="200" r="200" style="fill:url(#_RadialElectro);" />
	</g>
	<path
		d="M194.787,192.333C188.262,188.035 181.657,181.753 176.358,172.574C174.261,168.942 172.763,165.383 171.774,161.936C171.27,159.158 171,156.182 171,153C171,141.784 174.066,133.949 178.481,128.479C180.861,125.649 183.561,123.381 186.303,121.799C194.691,116.956 201.706,117.239 209.796,115.988L210,116C210,116 209.931,115.995 209.797,115.988C210.059,115.947 210.323,115.905 210.587,115.861C210.639,115.831 158.035,68.837 95.681,104.837C68.834,120.337 50.317,140.265 50.317,140.265C50.317,140.265 48.21,112.615 81.341,60C47.981,79.261 -32.672,188.524 35.679,306.911C35.679,306.911 19.588,203.04 80.21,168.04C140.831,133.04 179.662,190.296 179.662,190.296C179.662,190.296 187.318,204.66 188.697,221.705C188.721,230.311 186.816,240.478 180.701,251.069C177.506,256.604 173.76,260.851 169.745,264.014C168.781,264.66 167.776,265.285 166.726,265.892C161.405,268.964 156.503,270.732 152.019,271.523C144.304,272.509 136.988,270.865 131.756,267.844C123.514,263.086 120.221,257.001 115.244,250.738L115.183,250.617C115.183,250.617 115.203,250.657 115.242,250.735C114.99,250.418 114.733,250.1 114.472,249.782C114.42,249.752 100.024,318.806 162.378,354.806C189.225,370.306 215.742,376.378 215.742,376.378C215.742,376.378 192.849,392.028 130.718,389.643C164.078,408.904 299.029,424.119 367.38,305.732C367.38,305.732 285.471,371.603 224.849,336.603C164.227,301.603 194.397,239.347 194.397,239.347C194.397,239.347 202.025,227.112 214.656,217.57C222.394,212.435 233.1,208 247,208C252.203,208 256.849,208.743 260.96,210.042C262.729,210.806 264.521,211.706 266.333,212.751C286.892,224.621 287.466,240.815 284.535,252.017C283.477,255.584 281.983,258.795 280.527,262.218C279.828,263.528 279.267,264.425 279.017,264.812L278.875,265.026C278.875,265.026 278.926,264.953 279.017,264.812L280.167,263.07C279.769,264.024 279.376,264.996 279,266C279,266.06 346,244 346,172C346,141 338,115 338,115C338,115 363,127 392,182C392,143.479 337.702,19 201,19C201,19 299,57 299,127C299,197 230,202 230,202C220.742,202 211.172,201.362 194.787,192.333Z"
		style="fill:rgb(222,186,255);"
	/>
	<defs>
		<radialGradient
			id="_RadialElectro"
			cx="0"
			cy="0"
			r="1"
			gradientUnits="userSpaceOnUse"
			gradientTransform="matrix(200,0,0,200,200,199.085)"
		>
			<stop offset="0" style="stop-color:rgb(194,121,224);stop-opacity:1" />
			<stop offset="0.48" style="stop-color:rgb(195,121,225);stop-opacity:0.73" />
			<stop offset="1" style="stop-color:rgb(196,122,227);stop-opacity:0" />
		</radialGradient>
	</defs>
</svg>


================================================
FILE: src/lib/components/svgs/Geo.svelte
================================================
<svg
	viewBox="0 0 400 420"
	version="1.1"
	xmlns="http://www.w3.org/2000/svg"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xml:space="preserve"
	xmlns:serif="http://www.serif.com/"
	style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
>
	<g transform="matrix(1,0,0,1,0,10)">
		<circle cx="200" cy="200" r="200" style="fill:url(#_RadialGeo);" />
	</g>
	<path
		d="M200.197,412.606C200.197,412.606 81.644,332.209 10.517,210.212C10.409,210.027 30.803,174.081 51.742,155.411C51.687,155.411 85.883,266.425 200.72,393.589C200.562,393.589 281.709,306.03 286.765,259.194C285.983,259.194 200.72,331.358 200.72,331.358C200.72,331.358 145.359,276.973 121.128,225.819C121.128,225.819 141.114,200.187 189.195,166.001C189.195,166.001 201.104,175.926 205.074,184.969L158.758,230.182C158.758,230.182 169.552,259.697 201.699,285.658C201.987,285.37 254.123,256.933 298.579,203.862C299.268,203.862 321.323,238.668 330.972,285.536C330.628,285.536 276.707,358.322 200.197,412.606ZM200.523,8.008C200.523,8.008 319.076,88.405 390.203,210.402C390.31,210.587 369.916,246.532 348.978,265.202C349.033,265.202 314.837,154.188 200,27.024C200.158,27.024 119.011,114.583 113.955,161.419C114.737,161.419 200,89.256 200,89.256C200,89.256 255.361,143.64 279.592,194.794C279.592,194.794 259.606,220.426 211.525,254.612C211.525,254.612 199.615,244.687 195.645,235.645L241.962,190.431C241.962,190.431 231.168,160.916 199.021,134.955C198.732,135.244 146.596,163.68 102.141,216.751C101.452,216.751 79.397,181.945 69.747,135.077C70.092,135.077 124.012,62.291 200.523,8.008Z"
		style="fill:rgb(243,214,97);"
	/>
	<defs>
		<radialGradient
			id="_RadialGeo"
			cx="0"
			cy="0"
			r="1"
			gradientUnits="userSpaceOnUse"
			gradientTransform="matrix(200,0,0,200,200,200)"
		>
			<stop offset="0" style="stop-color:rgb(207,137,19);stop-opacity:1" />
			<stop offset="0.48" style="stop-color:rgb(206,137,19);stop-opacity:0.73" />
			<stop offset="1" style="stop-color:rgb(205,136,19);stop-opacity:0" />
		</radialGradient>
	</defs>
</svg>


================================================
FILE: src/lib/components/svgs/Hydro.svelte
================================================
<svg
	viewBox="0 0 400 420"
	version="1.1"
	xmlns="http://www.w3.org/2000/svg"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xml:space="preserve"
	xmlns:serif="http://www.serif.com/"
	style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
>
	<g transform="matrix(1,0,0,1,0,10)">
		<circle cx="200" cy="200" r="200" style="fill:url(#_RadialHydro);" />
	</g>
	<path
		d="M44.747,121.48C50.257,112.511 101.866,33 200,33C304,33 377,117 377,210C377,303 302,387 200,387C124.277,387 95,343 95,343C95,343 141,371 200,371C259,371 296,318 296,274C296,230 254.64,181 200,181C184.467,181 169.115,188 162.5,188C148.978,188 138,177.022 138,163.5C138,153.346 144.19,144.627 153,140.913L153.063,140.886C153.264,140.802 171.051,132 202,132C260.878,132 324,183.305 324,253C324,338.409 246,369 246,369C246,369 343,337 343,238C343,139 262,90 200,90C133.257,90 92.818,138.996 85.764,148.267C85.414,148.781 79.037,159 65.5,159C51.978,159 41,148.022 41,134.5C41,130.059 42.184,125.893 44.253,122.3L44.747,121.48ZM213.035,289.278C211.408,282.792 206.389,272 191,272C173.411,272 158,288 158,308C158,328 177,350 205,350C233,350 254,327 254,327C254,327 238,358 200,358C162,358 136,330 136,295C136,260 165.951,231.525 199.475,231.525C233,231.525 259,259 259,286L258.915,286.015C258.971,286.669 259,287.331 259,288C259,300.694 248.694,311 236,311C225.402,311 216.468,303.816 213.807,294.056L213.807,294.056C213.389,292.521 213.125,290.923 213.035,289.278ZM79,274C88.383,274 96,281.617 96,291C96,300.383 88.383,308 79,308C69.617,308 62,300.383 62,291C62,281.617 69.617,274 79,274ZM46.5,189C60.022,189 71,199.978 71,213.5C71,227.022 60.022,238 46.5,238C32.978,238 22,227.022 22,213.5C22,199.978 32.978,189 46.5,189Z"
		style="fill:rgb(7,229,254);"
	/>
	<defs>
		<radialGradient
			id="_RadialHydro"
			cx="0"
			cy="0"
			r="1"
			gradientUnits="userSpaceOnUse"
			gradientTransform="matrix(200,0,0,200,200,200)"
		>
			<stop offset="0" style="stop-color:rgb(8,158,222);stop-opacity:1" />
			<stop offset="0.48" style="stop-color:rgb(8,158,223);stop-opacity:0.73" />
			<stop offset="1" style="stop-color:rgb(8,159,224);stop-opacity:0" />
		</radialGradient>
	</defs>
</svg>


================================================
FILE: src/lib/components/svgs/Polearm.svelte
================================================
<svg
	viewBox="0 0 128 128"
	version="1.1"
	xmlns="http://www.w3.org/2000/svg"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xml:space="preserve"
	xmlns:serif="http://www.serif.com/"
	style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;"
>
	<g transform="matrix(0.689873,-0.689873,0.689873,0.689873,-23.6139,57.1013)">
		<g transform="matrix(0.724771,0.724771,-0.724771,0.724771,58.5,-24.2706)">
			<use xlink:href="#_ImagePolearm1" x="9" y="9" width="110px" height="110px" />
		</g>
	</g>
	<g transform="matrix(0.851562,0,0,0.851562,11.7741,13.7254)">
		<g transform="matrix(1.14569,0,0,1.14569,-9.32429,-9.32429)">
			<path
				d="M47,47.898L47,42L35,42L35,54L41.789,54L67,79.211L67,86L79,86L79,74L73.102,74L47,47.898Z"
				style="fill:rgb(255,253,255);stroke:rgb(125,129,134);stroke-width:1.02px;"
			/>
		</g>
		<g transform="matrix(0.810127,-0.810127,0.810127,0.810127,-50.468,59.0381)">
			<path
				d="M6,66L23,66L24,65L51,67L53,65L59,65L63,61L68,66L81,66L85,62L77,54L135,69L77,84L85,76L81,72L68,72L63,77L59,73L53,73L51,71L24,73L23,72L6,72L3,69L6,66Z"
				style="fill:rgb(255,253,255);stroke:rgb(125,129,134);stroke-width:1.02px;"
			/>
		</g>
	</g>
	<defs>
		<image
			id="_ImagePolearm1"
			width="110px"
			height="110px"
			xlink:href="data:image/png;base64,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"
		/>
	</defs>
</svg>


================================================
FILE: src/lib/components/svgs/Pyro.svelte
================================================
<svg
	viewBox="0 0 400 420"
	version="1.1"
	xmlns="http://www.w3.org/2000/svg"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xml:space="preserve"
	xmlns:serif="http://www.serif.com/"
	style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
>
	<g transform="matrix(1,0,0,1,0,11)">
		<circle cx="199.5" cy="199.5" r="199.5" style="fill:url(#_RadialPyro);" />
	</g>
	<path
		d="M196,22C196,22 231,59 231,83C231,107 189,116 189,153C189,172.638 212,186 212,186C212,186 198,174 198,158C198,142 210,122 240,103C240.207,103.207 232,128.445 232,144C232,184.962 271,214 271,214C271,196.725 249,189.293 249,164C249,138.707 269,121 269,121C269,121 271,155 296,177C321,199 355,229 355,264C355,299 316,324 281,344C234.697,368.135 203,399 203,399C203,399 151,358 121,342C91,326 45,303 45,271C45,239 70,207 95,175C120,143 128,124 128,124C128,124 116,171 203,198C203.138,198.138 118,200 118,272C118,302.646 137,317 137,317C137,317 82,293 82,254C82,222.237 103,203 103,203C103,203 65,222 65,258C65,294 91,308 132,329C173,350 203,372 203,372C203,372 263,328 295,315C327,302 342,275 342,262C342,231.08 306,210.5 306,210.5C306,210.5 317,235 317,256C317,277 293,338 209,338C179.256,338 155,325 145,313C135,301 137,291 137,291C137,291 138,263 169,263C177.724,263 184,266 184,266C184,266 164,275 164,298C164,321 189,330 209,330C229,330 281,319 281,270C281,221 231,203 209,194C187,185 146,171 146,132C146,93 196,72 196,22Z"
		style="fill:rgb(253,169,113);"
	/>
	<path
		d="M154,252C154,252 188,232 212,256C236,280 217,304 216,305C215,306 256,295 256,266C256,237 230,218 200,218C170,218 154,246 154,252Z"
		style="fill:rgb(253,169,113);"
	/>
	<defs>
		<radialGradient
			id="_RadialPyro"
			cx="0"
			cy="0"
			r="1"
			gradientUnits="userSpaceOnUse"
			gradientTransform="matrix(200,0,0,200,200,199)"
		>
			<stop offset="0" style="stop-color:rgb(212,84,22);stop-opacity:1" />
			<stop offset="0.48" style="stop-color:rgb(213,84,22);stop-opacity:0.73" />
			<stop offset="1" style="stop-color:rgb(214,85,22);stop-opacity:0" />
		</radialGradient>
	</defs>
</svg>


================================================
FILE: src/lib/components/svgs/Sword.svelte
================================================
<svg
	viewBox="0 0 128 128"
	version="1.1"
	xmlns="http://www.w3.org/2000/svg"
	xmlns:xlink="http://www.w3.org/1999/xlink"
	xml:space="preserve"
	xmlns:serif="http://www.serif.com/"
	style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;"
>
	<g transform="matrix(0.865166,0,0,0.865166,8.62938,9.92713)">
		<g opacity="0.75">
			<path
				d="M95.5,94L95.5,91.104L106.5,80.104L106.5,105L61.952,105L50.952,94L95.5,94"
				style="fill:rgb(201,207,210);stroke:rgb(125,129,134);stroke-width:1.16px;"
			/>
			<path
				d="M32.5,91.104L32.5,94L35.396,94L46.396,105L21.5,105L21.5,60.452L32.5,49.452L32.5,91.104"
				style="fill:rgb(201,207,210);stroke:rgb(125,129,134);stroke-width:1.16px;"
			/>
			<path
				d="M106.5,20L106.5,64.548L95.5,75.548L95.5,31L92.604,31L81.604,20L106.5,20Z"
				style="fill:rgb(201,207,210);stroke:rgb(125,129,134);stroke-width:1.16px;"
			/>
			<path
				d="M32.5,31L32.5,33.896L21.5,44.896L21.5,20L66.048,20L77.048,31L32.5,31Z"
				style="fill:rgb(201,207,210);stroke:rgb(125,129,134);stroke-width:1.16px;"
			/>
			<path
				d="M32.5,91.104L32.5,75.548L64,107.048L66.048,105L81.604,105L64,122.604L32.5,91.104Z"
				style="fill:rgb(201,207,210);stroke:rgb(125,129,134);stroke-width:1.16px;"
			/>
			<path
				d="M92.604,94L77.048,94L108.548,62.5L106.5,60.452L106.5,44.896L124.104,62.5L92.604,94Z"
				style="fill:rgb(201,207,210);stroke:rgb(125,129,134);stroke-width:1.16px;"
			/>
			<path
				d="M64,17.952L61.952,20L46.396,20L64,2.396L95.5,33.896L95.5,49.452L64,17.952Z"
				style="fill:rgb(201,207,210);stroke:rgb(125,129,134);stroke-width:1.16px;"
			/>
			<path
				d="M19.452,62.5L21.5,64.548L21.5,80.104L3.896,62.5L35.396,31L50.952,31L19.452,62.5Z"
				style="fill:rgb(201,207,210);stroke:rgb(125,129,134);stroke-width:1.16px;"
			/>
		</g>
	</g>
	<g transform="matrix(0.611765,-0.611765,0.611765,0.611765,-12.1886,31.6507)">
		<g opacity="0.75">
			<g transform="matrix(1,0,0,1,0,40)">
				<path
					d="M28,116L33.454,110.546L33.454,91L30.433,87.978L20,87.978L17.498,90.481L9.021,82.004L11.018,80.007L30,80.007L36,69.031L42,80.007L60.982,80.007L62.809,81.834L54.332,90.311L52,87.978L41.567,87.978L38.546,91L38.546,110.546L44,116L36,127L28,116Z"
					style="fill:rgb(199,205,210);stroke:rgb(125,129,134);stroke-width:1.16px;"
				/>
			</g>
			<path
				d="M26.161,120.007L19,114C19,114 19,114 19,114C23.614,109.386 26.08,103.047 25.796,96.528C25.186,82.497 24.165,59 24.165,59C24.165,59 23,34 36,15L36.076,15.111C48.995,34.1 47.835,59 47.835,59C47.835,59 46.814,82.497 46.204,96.528C45.92,103.047 48.386,109.386 53,114C53,114 53,114 53,114L45.839,120.007L26.161,120.007Z"
				style="fill:rgb(199,205,210);stroke:rgb(125,129,134);stroke-width:1.16px;"
			/>
		</g>
	</g>
	<g transform="matrix(0.611765,0.611765,-0.611765,0.611765,96.557,-12.3964)">
		<path
			d="M26.161,120.007L19,114C19,114 19,114 19.001,113.999C23.637,109.363 26.241,103.075 26.241,96.519L26.241,90.752C26.241,90.752 23,34 36,15L36.076,15.111C46.013,29.717 46.392,76.075 46.038,96.699C45.909,103.172 48.423,109.419 53.002,113.997C53,114 53,114 53,114L45.839,120.007L26.161,120.007Z"
			style="fill:rgb(255,253,255);stroke:rgb(125,129,134);stroke-width:1.16px;"
		/>
		<g transform="matrix(1,0,0,1,0,40)">
			<path
				d="M28,116L33.454,110.546L33.454,91L30.433,87.978L20,87.978L17.328,90.65L8.851,82.174L11.018,80.007L30,80.007L36,69.031L42,80.007L60.982,80.007L62.979,82.004L54.502,90.481L52,87.978L41.567,87.978L38.546,91L38.546,110.546L44,116L36,127L28,116Z"
				style="fill:rgb(255,253,255);stroke:rgb(125,129,134);stroke-width:1.16px;"
			/>
		</g>
	</g>
</svg>


================================================
FILE: src/lib/data/banners/beginner.json
================================================
{
	"beginner": {
		"featured": {
			"bannerName": "beginner",
			"character": "noelle",
			"vision": "geo"
		}
	}
}


================================================
FILE: src/lib/data/banners/events/1.0.json
================================================
{
	"patch": 1.0,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 1,
				"events": {
					"featured": [
						{
							"bannerName": "ballad-in-goblets-1",
							"character": "venti",
							"textOffset": { "l": 57.5, "b": 5.8 }
						}
					],
					"rateup": ["xiangling", "fischl", "barbara"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-1",
					"fatepointsystem": false,
					"featured": [{ "name": "amos-bow" }, { "name": "aquila-favonia" }],
					"rateup": ["the-flute", "the-stringless", "favonius-lance", "the-bell", "the-widsith"],
					"textOffset": {
						"featured": { "l": 41, "t": 76 },
						"rateup": { "l": 75, "b": 18 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 1,
				"events": {
					"featured": [
						{
							"bannerName": "sparkling-steps-1",
							"character": "klee",
							"textOffset": { "l": 60 }
						}
					],
					"rateup": ["sucrose", "xingqiu", "noelle"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-2",
					"fatepointsystem": false,
					"featured": [
						{ "name": "lost-prayer-to-the-sacred-winds" },
						{ "name": "wolf_s-gravestone" }
					],
					"rateup": [
						"sacrificial-greatsword",
						"sacrificial-sword",
						"sacrificial-fragments",
						"dragon_s-bane",
						"sacrificial-bow"
					],
					"textOffset": {
						"featured": { "l": 41, "t": 78, "w": 20 },
						"rateup": { "l": 76, "b": 17 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/1.1.json
================================================
{
	"patch": 1.1,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 1,
				"events": {
					"featured": [
						{
							"bannerName": "farewell-of-snezhnaya-1",
							"character": "tartaglia",
							"textOffset": { "l": 44.5, "b": 11 }
						}
					],
					"rateup": ["beidou", "ningguang", "diona"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-3",
					"fatepointsystem": false,
					"featured": [{ "name": "skyward-harp" }, { "name": "memory-of-dust" }],
					"rateup": ["rust", "favonius-lance", "rainslasher", "the-flute", "eye-of-perception"],
					"textOffset": {
						"featured": { "l": 41, "t": 76 },
						"rateup": { "l": 76.5, "b": 19 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 1,
				"events": {
					"featured": [
						{
							"bannerName": "gentry-of-hermitage-1",
							"character": "zhongli",
							"textOffset": { "l": 52 }
						}
					],
					"rateup": ["razor", "xinyan", "chongyun"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-4",
					"fatepointsystem": false,
					"featured": [{ "name": "vortex-vanquisher" }, { "name": "the-unforged" }],
					"rateup": [
						"favonius-warbow",
						"the-bell",
						"favonius-codex",
						"dragon_s-bane",
						"lion_s-roar"
					],
					"textOffset": {
						"featured": { "l": 41.5, "t": 75 },
						"rateup": { "l": 77, "b": 17 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/1.2.json
================================================
{
	"patch": 1.2,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 1,
				"events": {
					"featured": [
						{
							"bannerName": "secretum-secretorum-1",
							"character": "albedo",
							"textOffset": { "l": 56.5, "b": 5.5 }
						}
					],
					"rateup": ["bennett", "sucrose", "fischl"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-5",
					"fatepointsystem": false,
					"featured": [{ "name": "summit-shaper" }, { "name": "skyward-atlas" }],
					"rateup": [
						"the-stringless",
						"favonius-lance",
						"favonius-greatsword",
						"lion_s-roar",
						"the-widsith"
					],
					"textOffset": {
						"featured": { "l": 46, "t": 76 },
						"rateup": { "l": 76, "b": 18.5 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 1,
				"events": {
					"featured": [
						{
							"bannerName": "adrift-in-the-harbor-1",
							"character": "ganyu",
							"textOffset": { "l": 59.5, "b": 12 }
						}
					],
					"rateup": ["beidou", "xinyan", "xingqiu"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-6",
					"fatepointsystem": false,
					"featured": [{ "name": "amos-bow" }, { "name": "skyward-pride" }],
					"rateup": [
						"favonius-warbow",
						"the-bell",
						"eye-of-perception",
						"dragon_s-bane",
						"sacrificial-sword"
					],
					"textOffset": {
						"featured": { "l": 46, "t": 77 },
						"rateup": { "l": 75, "b": 17 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/1.3.json
================================================
{
	"patch": 1.3,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "invitation-to-mundane-life-1",
							"character": "xiao",
							"textOffset": { "l": 57.5, "b": 5 }
						}
					],
					"rateup": ["xinyan", "beidou", "diona"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-7",
					"fatepointsystem": false,
					"featured": [
						{ "name": "primordial-jade-winged-spear" },
						{ "name": "primordial-jade-cutter" }
					],
					"rateup": [
						"rust",
						"the-flute",
						"favonius-lance",
						"sacrificial-greatsword",
						"eye-of-perception"
					],
					"textOffset": {
						"featured": { "l": 44.5, "t": 72 },
						"rateup": { "l": 73.5, "b": 16 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "dance-of-lantern-1",
							"character": "keqing",
							"textOffset": { "l": 57.5, "b": 4.5 }
						}
					],
					"rateup": ["barbara", "bennett", "ningguang"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-8",
					"fatepointsystem": false,
					"featured": [
						{
							"name": "wolf_s-gravestone",
							"buttonPosition": { "l": 35 }
						},
						{ "name": "staff-of-homa" }
					],
					"rateup": [
						"lion_s-roar",
						"lithic-blade",
						"lithic-spear",
						"sacrificial-bow",
						"the-widsith"
					],
					"textOffset": {
						"featured": { "l": 45, "t": 77 },
						"rateup": { "l": 75, "b": 14 }
					}
				}
			}
		},
		{
			"phase": 3,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "moment-of-bloom-1",
							"character": "hu-tao",
							"textOffset": { "l": 57.5, "b": 4.5 }
						}
					],
					"rateup": ["xiangling", "chongyun", "xingqiu"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-8",
					"fatepointsystem": false,
					"featured": [
						{
							"name": "wolf_s-gravestone",
							"buttonPosition": { "l": 35 }
						},
						{ "name": "staff-of-homa" }
					],
					"rateup": [
						"lion_s-roar",
						"lithic-blade",
						"lithic-spear",
						"sacrificial-bow",
						"the-widsith"
					],
					"textOffset": {
						"featured": { "l": 45, "t": 77 },
						"rateup": { "l": 75, "b": 14 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/1.4.json
================================================
{
	"patch": 1.4,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "ballad-in-goblets-2",
							"character": "venti",
							"textOffset": { "l": 57, "b": 6 }
						}
					],
					"rateup": ["razor", "sucrose", "noelle"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-9",
					"fatepointsystem": false,
					"featured": [{ "name": "elegy-for-the-end" }, { "name": "skyward-blade" }],
					"rateup": [
						"favonius-warbow",
						"wine-and-song",
						"dragon_s-bane",
						"favonius-greatsword",
						"the-alley-flash"
					],
					"textOffset": {
						"featured": { "l": 40, "t": 72 },
						"rateup": { "l": 74, "b": 18 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "farewell-of-snezhnaya-2",
							"character": "tartaglia",
							"textOffset": { "l": 57.5, "b": 6 }
						}
					],
					"rateup": ["barbara", "fischl", "rosaria"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-10",
					"fatepointsystem": false,
					"featured": [
						{ "name": "skyward-harp" },
						{ "name": "lost-prayer-to-the-sacred-winds", "buttonPosition": { "l": 70 } }
					],
					"rateup": [
						"alley-hunter",
						"favonius-codex",
						"sacrificial-greatsword",
						"favonius-lance",
						"favonius-sword"
					],
					"textOffset": {
						"featured": { "l": 44, "t": 72 },
						"rateup": { "l": 75, "b": 16 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/1.5.json
================================================
{
	"patch": 1.5,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "gentry-of-hermitage-2",
							"character": "zhongli"
						}
					],
					"rateup": ["yanfei", "noelle", "diona"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-11",
					"fatepointsystem": false,
					"featured": [{ "name": "summit-shaper" }, { "name": "memory-of-dust" }],
					"rateup": [
						"sacrificial-bow",
						"eye-of-perception",
						"lithic-blade",
						"lithic-spear",
						"the-flute"
					],
					"textOffset": {
						"featured": { "l": 43, "t": 71 },
						"rateup": { "l": 75, "b": 18 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "born-of-ocean-swell-1",
							"character": "eula"
						}
					],
					"rateup": ["beidou", "xinyan", "xingqiu"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-12",
					"fatepointsystem": false,
					"featured": [{ "name": "song-of-broken-pines" }, { "name": "aquila-favonia" }],
					"rateup": [
						"sacrificial-sword",
						"rust",
						"sacrificial-fragments",
						"rainslasher",
						"dragon_s-bane"
					],
					"textOffset": {
						"featured": { "l": 39.5, "t": 71 },
						"rateup": { "l": 71, "b": 19 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/1.6.json
================================================
{
	"patch": 1.6,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "sparkling-steps-2",
							"character": "klee"
						}
					],
					"rateup": ["fischl", "barbara", "sucrose"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-13",
					"fatepointsystem": false,
					"featured": [{ "name": "lost-prayer-to-the-sacred-winds" }, { "name": "skyward-pride" }],
					"rateup": [
						"mitternachts-waltz",
						"the-widsith",
						"the-bell",
						"favonius-lance",
						"lion_s-roar"
					],
					"textOffset": {
						"featured": { "l": 42.5 },
						"rateup": { "l": 71.5, "b": 18 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "leaves-in-the-wind-1",
							"character": "kaedehara-kazuha",
							"textOffset": { "w": 25 }
						}
					],
					"rateup": ["rosaria", "bennett", "razor"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-14",
					"fatepointsystem": false,
					"featured": [{ "name": "freedom-sworn" }, { "name": "skyward-atlas" }],
					"rateup": [
						"alley-hunter",
						"wine-and-song",
						"favonius-greatsword",
						"dragon_s-bane",
						"the-alley-flash"
					],
					"textOffset": {
						"featured": { "l": 41, "t": 71 },
						"rateup": { "l": 72, "b": 18 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/2.0.json
================================================
{
	"patch": 2.0,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "the-heron_s-court-1",
							"character": "kamisato-ayaka",
							"textOffset": { "l": 51, "w": 28 }
						}
					],
					"rateup": ["yanfei", "chongyun", "ningguang"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-15",
					"fatepointsystem": true,
					"featured": [{ "name": "mistsplitter-reforged" }, { "name": "skyward-spine" }],
					"rateup": [
						"the-stringless",
						"favonius-codex",
						"sacrificial-greatsword",
						"favonius-lance",
						"favonius-sword"
					],
					"textOffset": {
						"featured": { "l": 42, "w": 30 },
						"rateup": { "l": 79, "b": 16 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "tapestry-of-golden-flames-1",
							"character": "yoimiya",
							"textOffset": { "l": 50 }
						}
					],
					"rateup": ["sayu", "xinyan", "diona"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-16",
					"fatepointsystem": true,
					"featured": [{ "name": "thundering-pulse" }, { "name": "skyward-blade" }],
					"rateup": [
						"sacrificial-sword",
						"sacrificial-fragments",
						"favonius-warbow",
						"rainslasher",
						"dragon_s-bane"
					],
					"textOffset": {
						"featured": { "l": 43, "t": 66 },
						"rateup": { "l": 76, "b": 18 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/2.1.json
================================================
{
	"patch": 2.1,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "reign-of-serenity-1",
							"character": "raiden-shogun",
							"textOffset": { "l": 61, "b": 13 }
						}
					],
					"rateup": ["xiangling", "sucrose", "kujou-sara"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-17",
					"fatepointsystem": true,
					"featured": [{ "name": "engulfing-lightning" }, { "name": "the-unforged" }],
					"rateup": ["the-bell", "sacrificial-bow", "favonius-lance", "the-widsith", "lion_s-roar"],
					"textOffset": {
						"featured": { "l": 39.5, "w": 30 },
						"rateup": { "l": 76 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "drifting-luminescence-1",
							"character": "sangonomiya-kokomi",
							"textOffset": { "w": 23, "l": 51 }
						}
					],
					"rateup": ["rosaria", "xingqiu", "beidou"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-18",
					"fatepointsystem": true,
					"featured": [
						{ "name": "primordial-jade-cutter", "buttonPosition": { "l": 25 } },
						{ "name": "everlasting-moonglow" }
					],
					"rateup": [
						"dragon_s-bane",
						"the-stringless",
						"favonius-codex",
						"favonius-greatsword",
						"the-flute"
					],
					"textOffset": {
						"featured": { "l": 42, "w": 30, "t": 66 },
						"rateup": { "l": 75.5 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/2.2.json
================================================
{
	"patch": 2.2,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "farewell-of-snezhnaya-3",
							"character": "tartaglia",
							"textOffset": { "l": 50.5 }
						}
					],
					"rateup": ["yanfei", "chongyun", "ningguang"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-19",
					"fatepointsystem": true,
					"featured": [{ "name": "polar-star" }, { "name": "memory-of-dust" }],
					"rateup": ["favonius-lance", "rust", "eye-of-perception", "akuoumaru", "favonius-sword"],
					"textOffset": {
						"featured": { "l": 42.2, "t": 67 },
						"rateup": { "l": 76.5, "b": 19 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "moment-of-bloom-2",
							"character": "hu-tao",
							"textOffset": { "l": 56 }
						}
					],
					"rateup": ["thoma", "diona", "sayu"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-20",
					"fatepointsystem": true,
					"featured": [{ "name": "elegy-for-the-end" }, { "name": "staff-of-homa" }],
					"rateup": [
						"wavebreaker_s-fin",
						"mouun_s-moon",
						"the-widsith",
						"rainslasher",
						"sacrificial-sword"
					],
					"textOffset": {
						"featured": { "l": 38.5, "t": 68 },
						"rateup": { "l": 74, "b": 18 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/2.3.json
================================================
{
	"patch": 2.3,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "secretum-secretorum-2",
							"character": "albedo",
							"textOffset": { "l": 55.5, "b": 9 }
						},
						{
							"bannerName": "born-of-ocean-swell-2",
							"character": "eula",
							"textOffset": { "l": 57, "b": 11 }
						}
					],
					"rateup": ["bennett", "noelle", "rosaria"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-21",
					"fatepointsystem": true,
					"featured": [
						{ "name": "freedom-sworn" },
						{
							"name": "song-of-broken-pines",
							"buttonPosition": { "l": 60 }
						}
					],
					"rateup": [
						"lion_s-roar",
						"alley-hunter",
						"wine-and-song",
						"dragon_s-bane",
						"sacrificial-greatsword"
					],
					"textOffset": {
						"featured": { "t": 68, "w": 30 },
						"rateup": { "l": 71, "b": 19 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "oni_s-royale-1",
							"character": "arataki-itto",
							"textOffset": { "l": 50, "b": 9.5 }
						}
					],
					"rateup": ["barbara", "xiangling", "gorou"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-22",
					"fatepointsystem": true,
					"featured": [{ "name": "skyward-harp" }, { "name": "redhorn-stonethresher" }],
					"rateup": [
						"the-alley-flash",
						"mitternachts-waltz",
						"sacrificial-fragments",
						"favonius-lance",
						"the-bell"
					],
					"textOffset": {
						"featured": { "t": 67, "w": 30 },
						"rateup": { "b": 19, "l": 71 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/2.4.json
================================================
{
	"patch": 2.4,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "the-transcendent-one-returns-1",
							"character": "shenhe",
							"textOffset": { "l": 57, "b": 11 }
						},
						{
							"bannerName": "invitation-to-mundane-life-2",
							"character": "xiao",
							"textOffset": { "l": 57, "b": 12.5 }
						}
					],
					"rateup": ["yun-jin", "ningguang", "chongyun"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-23",
					"fatepointsystem": true,
					"featured": [{ "name": "calamity-queller" }, { "name": "primordial-jade-winged-spear" }],
					"rateup": [
						"favonius-warbow",
						"the-widsith",
						"favonius-greatsword",
						"lithic-spear",
						"the-flute"
					],
					"textOffset": {
						"featured": { "l": 41.5, "t": 68.5 },
						"rateup": { "l": 78 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "gentry-of-hermitage-3",
							"character": "zhongli",
							"textOffset": { "l": 57, "b": 12 }
						},
						{
							"bannerName": "adrift-in-the-harbor-2",
							"character": "ganyu",
							"textOffset": { "l": 57, "b": 12 }
						}
					],
					"rateup": ["xingqiu", "yanfei", "beidou"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-24",
					"fatepointsystem": true,
					"featured": [
						{ "name": "vortex-vanquisher" },
						{
							"name": "amos-bow",
							"buttonPosition": { "l": 70 }
						}
					],
					"rateup": [
						"sacrificial-bow",
						"lithic-blade",
						"favonius-codex",
						"favonius-sword",
						"dragon_s-bane"
					],
					"textOffset": {
						"featured": { "l": 41.5, "t": 68, "w": 27 },
						"rateup": { "l": 78 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/2.5.json
================================================
{
	"patch": 2.5,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "everbloom-violet-1",
							"character": "yae-miko",
							"textOffset": { "l": 61, "b": 12 }
						}
					],
					"rateup": ["thoma", "diona", "fischl"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-25",
					"fatepointsystem": true,
					"featured": [{ "name": "kagura_s-verity" }, { "name": "primordial-jade-cutter" }],
					"rateup": [
						"rainslasher",
						"eye-of-perception",
						"the-stringless",
						"wavebreaker_s-fin",
						"sacrificial-sword"
					],
					"textOffset": {
						"featured": { "w": 31, "l": 35, "t": 68 },
						"rateup": { "b": 23 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "reign-of-serenity-2",
							"character": "raiden-shogun",
							"textOffset": { "l": 61.5, "b": 13 }
						},
						{
							"bannerName": "drifting-luminescence-2",
							"character": "sangonomiya-kokomi",
							"textOffset": { "l": 51, "b": 8, "w": 23 }
						}
					],
					"rateup": ["bennett", "kujou-sara", "xinyan"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-26",
					"fatepointsystem": true,
					"featured": [{ "name": "engulfing-lightning" }, { "name": "everlasting-moonglow" }],
					"rateup": [
						"akuoumaru",
						"favonius-lance",
						"lion_s-roar",
						"mouun_s-moon",
						"sacrificial-fragments"
					],
					"textOffset": {
						"featured": { "w": 34, "l": 35.5, "t": 67.5 },
						"rateup": { "l": 74.5, "b": 23 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/2.6.json
================================================
{
	"patch": 2.6,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "azure-excursion-1",
							"character": "kamisato-ayato",
							"textOffset": { "l": 48, "b": 11 }
						},
						{
							"bannerName": "ballad-in-goblets-3",
							"character": "venti",
							"textOffset": { "l": 53.5, "b": 11 }
						}
					],
					"rateup": ["sucrose", "xiangling", "yun-jin"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-27",
					"fatepointsystem": true,
					"featured": [{ "name": "elegy-for-the-end" }, { "name": "haran-geppaku-futsu" }],
					"rateup": ["the-flute", "rust", "dragon_s-bane", "the-widsith", "sacrificial-greatsword"],
					"textOffset": {
						"featured": { "w": 33, "l": 39.5, "t": 67 },
						"rateup": { "l": 79 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "the-heron_s-court-2",
							"character": "kamisato-ayaka",
							"textOffset": { "l": 44, "b": 10, "w": 32 }
						}
					],
					"rateup": ["razor", "rosaria", "sayu"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-28",
					"fatepointsystem": true,
					"featured": [{ "name": "mistsplitter-reforged" }, { "name": "the-unforged" }],
					"rateup": [
						"favonius-codex",
						"favonius-lance",
						"favonius-warbow",
						"favonius-sword",
						"the-bell"
					],
					"textOffset": {
						"featured": { "w": 32, "l": 39, "t": 67 },
						"rateup": { "l": 76.5 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/2.7.json
================================================
{
	"patch": 2.7,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "discerner-of-enigmas-1",
							"character": "yelan",
							"textOffset": { "l": 49, "b": 11 }
						},
						{
							"bannerName": "invitation-to-mundane-life-3",
							"character": "xiao",
							"textOffset": { "l": 49, "b": 11 }
						}
					],
					"rateup": ["yanfei", "barbara", "noelle"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-29",
					"fatepointsystem": true,
					"featured": [
						{ "name": "aqua-simulacra" },
						{
							"name": "primordial-jade-winged-spear",
							"buttonPosition": { "l": 60 }
						}
					],
					"rateup": [
						"lithic-spear",
						"sacrificial-bow",
						"sacrificial-sword",
						"eye-of-perception",
						"favonius-greatsword"
					],
					"textOffset": {
						"featured": { "l": 44, "t": 68 },
						"rateup": { "l": 76, "b": 22 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "oni_s-royale-2",
							"character": "arataki-itto",
							"textOffset": { "w": 30, "l": 49, "b": 11 }
						}
					],
					"rateup": ["kuki-shinobu", "chongyun", "gorou"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-30",
					"fatepointsystem": true,
					"featured": [
						{ "name": "redhorn-stonethresher" },
						{ "name": "memory-of-dust", "buttonPosition": { "l": 35 } }
					],
					"rateup": [
						"lithic-blade",
						"the-stringless",
						"sacrificial-fragments",
						"dragon_s-bane",
						"lion_s-roar"
					],
					"textOffset": {
						"featured": { "w": 28, "l": 41.5, "t": 67.5 },
						"rateup": { "l": 76, "b": 22 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/2.8.json
================================================
{
	"patch": 2.8,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "leaves-in-the-wind-2",
							"character": "kaedehara-kazuha"
						},
						{
							"bannerName": "sparkling-steps-3",
							"character": "klee"
						}
					],
					"rateup": ["shikanoin-heizou", "thoma", "ningguang"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-31",
					"fatepointsystem": true,
					"featured": [
						{ "name": "freedom-sworn" },
						{
							"name": "lost-prayer-to-the-sacred-winds",
							"buttonPosition": { "l": 65 }
						}
					],
					"rateup": [
						"the-alley-flash",
						"mitternachts-waltz",
						"the-widsith",
						"favonius-lance",
						"rainslasher"
					]
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "tapestry-of-golden-flames-2",
							"character": "yoimiya",
							"textOffset": { "l": 50 }
						}
					],
					"rateup": ["bennett", "xinyan", "yun-jin"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-32",
					"fatepointsystem": true,
					"featured": [
						{ "name": "thundering-pulse" },
						{ "name": "summit-shaper", "buttonPosition": { "l": 60 } }
					],
					"rateup": [
						"wine-and-song",
						"alley-hunter",
						"the-flute",
						"sacrificial-greatsword",
						"dragon_s-bane"
					],
					"textOffset": {
						"featured": { "l": 35, "t": 68 },
						"rateup": { "l": 70, "b": 22 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/3.0.json
================================================
{
	"patch": 3.0,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "viridescent-vigil-1",
							"character": "tighnari"
						},
						{
							"bannerName": "gentry-of-hermitage-4",
							"character": "zhongli",
							"textOffset": { "l": 57, "b": 13 }
						}
					],

					"rateup": ["collei", "fischl", "diona"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-33",
					"fatepointsystem": true,
					"featured": [
						{ "name": "hunter_s-path" },
						{
							"name": "vortex-vanquisher",
							"buttonPosition": { "l": 60 }
						}
					],
					"rateup": [
						"favonius-sword",
						"the-stringless",
						"the-bell",
						"favonius-codex",
						"favonius-lance"
					],
					"textOffset": {
						"featured": { "l": 42, "t": 68, "w": 32 },
						"rateup": { "l": 75.5, "b": 20, "w": 15 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 2,
				"events": {
					"featured": [
						{
							"bannerName": "drifting-luminescence-3",
							"character": "sangonomiya-kokomi",
							"textOffset": { "l": 51, "b": 8 }
						},
						{
							"bannerName": "adrift-in-the-harbor-3",
							"character": "ganyu",
							"textOffset": { "l": 57, "b": 12.8 }
						}
					],

					"rateup": ["dori", "xingqiu", "sucrose"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-34",
					"fatepointsystem": true,
					"featured": [{ "name": "amos-bow" }, { "name": "everlasting-moonglow" }],
					"rateup": [
						"sacrificial-sword",
						"rust",
						"dragon_s-bane",
						"favonius-greatsword",
						"eye-of-perception"
					],
					"textOffset": {
						"featured": { "l": 44, "t": 71, "w": 28 },
						"rateup": { "l": 78.5, "b": 19, "w": 15 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/3.1.json
================================================
{
	"patch": 3.1,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 3,
				"events": {
					"featured": [
						{
							"bannerName": "twilight-arbiter-1",
							"character": "cyno",
							"textOffset": { "l": 55, "b": 10 }
						},
						{
							"bannerName": "ballad-in-goblets-4",
							"character": "venti",
							"textOffset": { "l": 55, "b": 10.5 }
						}
					],

					"rateup": ["candace", "kuki-shinobu", "sayu"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-35",
					"fatepointsystem": true,
					"featured": [{ "name": "elegy-for-the-end" }, { "name": "staff-of-the-scarlet-sands" }],
					"rateup": [
						"makhaira-aquamarine",
						"lion_s-roar",
						"sacrificial-fragments",
						"favonius-lance",
						"favonius-warbow"
					],
					"textOffset": {
						"featured": { "l": 41, "t": 66, "w": 30 },
						"rateup": { "l": 73.5, "b": 17, "w": 20 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 3,
				"events": {
					"featured": [
						{
							"bannerName": "twirling-lotus-1",
							"character": "nilou",
							"textOffset": { "l": 55, "b": 10 }
						},
						{
							"bannerName": "secretum-secretorum-3",
							"character": "albedo",
							"textOffset": { "l": 55, "b": 10.5 }
						}
					],

					"rateup": ["beidou", "barbara", "xiangling"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-36",
					"fatepointsystem": true,
					"featured": [{ "name": "key-of-khaj-nisut" }, { "name": "primordial-jade-cutter" }],
					"rateup": [
						"xiphos-moonlight",
						"dragon_s-bane",
						"sacrificial-bow",
						"rainslasher",
						"wandering-evenstar"
					],
					"textOffset": {
						"featured": { "l": 41, "t": 66 },
						"rateup": { "l": 73.5, "b": 17, "w": 20 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/3.2.json
================================================
{
	"patch": 3.2,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 3,
				"events": {
					"featured": [
						{
							"bannerName": "the-moongrass-enlightenment-1",
							"character": "nahida",
							"textOffset": { "l": 48, "b": 8.5 }
						},
						{
							"bannerName": "tapestry-of-golden-flames-3",
							"character": "yoimiya",
							"textOffset": { "l": 50 }
						}
					],

					"rateup": ["bennett", "razor", "noelle"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-37",
					"fatepointsystem": true,
					"featured": [{ "name": "a-thousand-floating-dreams" }, { "name": "thundering-pulse" }],
					"rateup": [
						"rust",
						"favonius-lance",
						"the-widsith",
						"the-flute",
						"sacrificial-greatsword"
					],
					"textOffset": {
						"featured": { "l": 42.5, "t": 62 },
						"rateup": { "l": 79, "b": 22 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 3,
				"events": {
					"featured": [
						{
							"bannerName": "everbloom-violet-2",
							"character": "yae-miko",
							"textOffset": {
								"l": 46.6,
								"b": 13
							}
						},
						{
							"bannerName": "farewell-of-snezhnaya-4",
							"character": "tartaglia",
							"textOffset": {
								"l": 47,
								"b": 9
							}
						}
					],

					"rateup": ["layla", "thoma", "shikanoin-heizou"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-38",
					"fatepointsystem": true,
					"featured": [
						{
							"name": "kagura_s-verity",
							"buttonPosition": { "l": 64 }
						},
						{ "name": "polar-star" }
					],
					"rateup": [
						"favonius-sword",
						"the-stringless",
						"dragon_s-bane",
						"the-bell",
						"favonius-codex"
					],
					"textOffset": {
						"featured": { "l": 42.5, "t": 67 },
						"rateup": { "l": 70.5, "b": 22 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/3.3.json
================================================
{
	"patch": 3.3,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 3,
				"events": {
					"featured": [
						{
							"bannerName": "from-ashes-reborn-1",
							"character": "wanderer",
							"textOffset": { "l": 58.5, "b": 10.5 }
						},
						{
							"bannerName": "oni_s-royale-3",
							"character": "arataki-itto",
							"textOffset": {
								"w": 30,
								"l": 56,
								"b": 10
							}
						}
					],

					"rateup": ["faruzan", "gorou", "yanfei"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-39",
					"fatepointsystem": true,
					"featured": [
						{ "name": "tulaytullah_s-remembrance" },
						{ "name": "redhorn-stonethresher" }
					],
					"rateup": [
						"eye-of-perception",
						"favonius-warbow",
						"wavebreaker_s-fin",
						"favonius-greatsword",
						"sacrificial-sword"
					],
					"textOffset": {
						"featured": { "l": 42.5, "t": 65, "w": 30.5 },
						"rateup": { "l": 78, "w": 18, "b": 26 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 3,
				"events": {
					"featured": [
						{
							"bannerName": "reign-of-serenity-3",
							"character": "raiden-shogun",
							"textOffset": { "l": 47, "b": 8.5 }
						},
						{
							"bannerName": "azure-excursion-2",
							"character": "kamisato-ayato",
							"textOffset": { "l": 47, "b": 8.5 }
						}
					],

					"rateup": ["rosaria", "sayu", "kujou-sara"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-40",
					"fatepointsystem": true,
					"featured": [{ "name": "engulfing-lightning" }, { "name": "haran-geppaku-futsu" }],
					"rateup": [
						"akuoumaru",
						"favonius-lance",
						"lion_s-roar",
						"mouun_s-moon",
						"sacrificial-fragments"
					],
					"textOffset": {
						"featured": { "w": 34, "l": 35.5, "t": 67.5 },
						"rateup": { "l": 75, "b": 19 }
					}
				}
			}
		}
	]
}



================================================
FILE: src/lib/data/banners/events/3.4.json
================================================
{
	"patch": 3.4,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 3,
				"events": {
					"featured": [
						{
							"bannerName": "caution-in-confidence-1",
							"character": "alhaitham",
							"textOffset": { "l": 48.5 }
						},
						{
							"bannerName": "invitation-to-mundane-life-4",
							"character": "xiao",
							"textOffset": { "l": 48.5 }
						}
					],
					"rateup": ["yaoyao", "xinyan", "yun-jin"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-41",
					"fatepointsystem": true,
					"featured": [
						{ "name": "light-of-foliar-incision" },
						{ "name": "primordial-jade-winged-spear", "buttonPosition": { "l": 60 } }
					],
					"rateup": ["lithic-spear", "the-widsith", "the-flute", "rainslasher", "sacrificial-bow"],
					"textOffset": {
						"featured": { "l": 38.5, "t": 62, "w": 30.5 },
						"rateup": { "l": 72.5, "b": 22.5 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 3,
				"events": {
					"featured": [
						{
							"bannerName": "moment-of-bloom-3",
							"character": "hu-tao",
							"textOffset": { "l": 51 }
						},
						{
							"bannerName": "discerner-of-enigmas-2",
							"character": "yelan",
							"textOffset": { "l": 51 }
						}
					],

					"rateup": ["xingqiu", "ningguang", "beidou"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-42",
					"fatepointsystem": true,
					"featured": [{ "name": "staff-of-homa" }, { "name": "aqua-simulacra" }],
					"rateup": ["lithic-blade", "rust", "favonius-sword", "favonius-codex", "dragon_s-bane"],
					"textOffset": {
						"featured": { "l": 38.5, "t": 67 },
						"rateup": { "l": 72.5, "b": 22.5 }
					}
				}
			}
		}
	]
}



================================================
FILE: src/lib/data/banners/events/3.5.json
================================================
{
	"patch": 3.5,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 3,
				"events": {
					"featured": [
						{
							"bannerName": "auric-blaze-1",
							"character": "dehya",
							"textOffset": { "l": 48.5 }
						},
						{
							"bannerName": "twilight-arbiter-2",
							"character": "cyno",
							"textOffset": { "l": 48.5 }
						}
					],
					"rateup": ["barbara", "collei", "bennett"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-43",
					"fatepointsystem": true,
					"featured": [
						{ "name": "beacon-of-the-reed-sea" },
						{ "name": "staff-of-the-scarlet-sands" }
					],
					"rateup": [
						"the-alley-flash",
						"alley-hunter",
						"dragon_s-bane",
						"eye-of-perception",
						"sacrificial-greatsword"
					],
					"textOffset": {
						"featured": { "l": 34.5, "t": 67, "w": 30.5 },
						"rateup": { "l": 72.5, "b": 24 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 3,
				"events": {
					"featured": [
						{
							"bannerName": "the-transcendent-one-returns-2",
							"character": "shenhe",
							"textOffset": {
								"t": 67,
								"l": 50.5
							}
						},
						{
							"bannerName": "the-heron_s-court-3",
							"character": "kamisato-ayaka",
							"textOffset": { "l": 48.5 }
						}
					],

					"rateup": ["diona", "sucrose", "mika"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-44",
					"fatepointsystem": true,
					"featured": [{ "name": "calamity-queller" }, { "name": "mistsplitter-reforged" }],
					"rateup": [
						"wine-and-song",
						"the-bell",
						"favonius-warbow",
						"sacrificial-sword",
						"favonius-lance"
					],
					"textOffset": {
						"featured": { "l": 38.5, "t": 67, "w": 30 },
						"rateup": { "l": 72.5, "b": 22.5 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/3.6.json
================================================
{
	"patch": 3.6,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 4,
				"events": {
					"featured": [
						{
							"bannerName": "the-moongrass-enlightenment-2",
							"character": "nahida",
							"textOffset": { "l": 50.5, "b": 10 }
						},
						{
							"bannerName": "twirling-lotus-2",
							"character": "nilou",
							"textOffset": { "l": 50.5, "b": 10.5 }
						}
					],

					"rateup": ["dori", "kuki-shinobu", "layla"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-45",
					"fatepointsystem": true,
					"featured": [{ "name": "key-of-khaj-nisut" }, { "name": "a-thousand-floating-dreams" }],
					"rateup": [
						"xiphos-moonlight",
						"the-stringless",
						"dragon_s-bane",
						"favonius-greatsword",
						"sacrificial-fragments"
					],
					"textOffset": {
						"featured": { "l": 52.5, "t": 71, "w": 23 },
						"rateup": { "l": 74.5, "b": 19 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 4,
				"events": {
					"featured": [
						{
							"bannerName": "immaculate-pulse-1",
							"character": "baizhu",
							"textOffset": { "l": 50.5, "b": 9 }
						},
						{
							"bannerName": "adrift-in-the-harbor-4",
							"character": "ganyu",
							"textOffset": { "l": 50.5, "b": 10.5 }
						}
					],

					"rateup": ["kaveh", "candace", "fischl"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-46",
					"fatepointsystem": true,
					"featured": [{ "name": "amos-bow" }, { "name": "jadefall-splendor" }],
					"rateup": [
						"makhaira-aquamarine",
						"wandering-evenstar",
						"lion_s-roar",
						"favonius-lance",
						"sacrificial-bow"
					],
					"textOffset": {
						"featured": { "l": 50, "t": 73 },
						"rateup": { "l": 74, "b": 19 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/3.7.json
================================================
{
	"patch": 3.7,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 4,
				"events": {
					"featured": [
						{
							"bannerName": "tapestry-of-golden-flames-4",
							"character": "yoimiya",
							"textOffset": { "l": 48.5 }
						},
						{
							"bannerName": "everbloom-violet-3",
							"character": "yae-miko",
							"textOffset": { "l": 48.6, "b": 8 }
						}
					],

					"rateup": ["kirara", "yun-jin", "chongyun"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-47",
					"fatepointsystem": true,
					"featured": [
						{ "name": "thundering-pulse" },
						{
							"name": "kagura_s-verity",
							"buttonPosition": { "l": 64 }
						}
					],
					"rateup": ["akuoumaru", "the-flute", "dragon_s-bane", "rust", "the-widsith"],
					"textOffset": {
						"featured": { "l": 52.5, "t": 71, "w": 23 },
						"rateup": { "l": 74.5, "b": 19 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 4,
				"events": {
					"featured": [
						{
							"bannerName": "caution-in-confidence-2",
							"character": "alhaitham",
							"textOffset": { "l": 50.5, "b": 10 }
						},
						{
							"bannerName": "leaves-in-the-wind-3",
							"character": "kaedehara-kazuha",
							"textOffset": { "l": 46, "b": 12 }
						}
					],
					"rateup": ["yaoyao", "shikanoin-heizou", "xiangling"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-48",
					"fatepointsystem": true,
					"featured": [
						{ "name": "light-of-foliar-incision" },
						{ "name": "freedom-sworn", "buttonPosition": { "l": 60 } }
					],
					"rateup": [
						"wavebreaker_s-fin",
						"favonius-codex",
						"favonius-sword",
						"mouun_s-moon",
						"sacrificial-greatsword"
					],
					"textOffset": {
						"featured": { "l": 52, "t": 72, "w": 27 },
						"rateup": { "l": 80, "b": 18.5 }
					}
				}
			}
		}
	]
}


================================================
FILE: src/lib/data/banners/events/3.8.json
================================================
{
	"patch": 3.8,
	"data": [
		{
			"phase": 1,
			"banners": {
				"standardVersion": 4,
				"events": {
					"featured": [
						{
							"bannerName": "born-of-ocean-swell-3",
							"character": "eula",
							"textOffset": { "l": 50, "b": 10.5 }
						},
						{
							"bannerName": "sparkling-steps-4",
							"character": "klee",
							"textOffset": { "l": 50, "b": 11.5 }
						}
					],

					"rateup": ["mika", "thoma", "razor"]
				},
				"weapons": {
					"bannerName": "epitome-invocation-49",
					"fatepointsystem": true,
					"featured": [
						{ "name": "song-of-broken-pines" },
						{
							"name": "lost-prayer-to-the-sacred-winds",
							"buttonPosition": { "l": 70, "t": 65 }
						}
					],
					"rateup": [
						"the-alley-flash",
						"alley-hunter",
						"eye-of-perception",
						"favonius-lance",
						"rainslasher"
					],
					"textOffset": {
						"featured": { "l": 49, "t": 71.5, "w": 23 },
						"rateup": { "l": 79, "b": 20.5 }
					}
				}
			}
		},
		{
			"phase": 2,
			"banners": {
				"standardVersion": 4,
				"events": {
					"featured": [
						{
				
Download .txt
gitextract_4a1kin_z/

├── .browserslistrc
├── .eslintrc.cjs
├── .github/
│   ├── FUNDING.yml
│   └── workflows/
│       └── codeql-analysis.yml
├── .gitignore
├── .prettierrc
├── LICENSE
├── README.md
├── jsconfig.json
├── package.json
├── postcss.config.js
├── src/
│   ├── app.css
│   ├── app.html
│   ├── global.d.ts
│   ├── lib/
│   │   ├── components/
│   │   │   ├── ButtonGeneral.svelte
│   │   │   ├── ButtonModal.svelte
│   │   │   ├── CheckBox.svelte
│   │   │   ├── Icon.svelte
│   │   │   ├── Iklan.svelte
│   │   │   ├── ModalTpl.svelte
│   │   │   ├── MyFund.svelte
│   │   │   ├── NoticeMark.svelte
│   │   │   ├── ObtainedItem.svelte
│   │   │   ├── RandomBackground.svelte
│   │   │   ├── Range.svelte
│   │   │   ├── SVGIcon.svelte
│   │   │   ├── Toast.svelte
│   │   │   ├── Toasts.svelte
│   │   │   ├── ToolTip.svelte
│   │   │   ├── chat/
│   │   │   │   ├── MainChat.svelte
│   │   │   │   ├── _changeAvatar.svelte
│   │   │   │   ├── _changeNick.svelte
│   │   │   │   ├── _chats.svelte
│   │   │   │   ├── _loader-chat.svelte
│   │   │   │   ├── _messagebox.svelte
│   │   │   │   └── _sidebar.svelte
│   │   │   └── svgs/
│   │   │       ├── Anemo.svelte
│   │   │       ├── Bow.svelte
│   │   │       ├── Catalyst.svelte
│   │   │       ├── Claymore.svelte
│   │   │       ├── Cryo.svelte
│   │   │       ├── Dendro.svelte
│   │   │       ├── Electro.svelte
│   │   │       ├── Geo.svelte
│   │   │       ├── Hydro.svelte
│   │   │       ├── Polearm.svelte
│   │   │       ├── Pyro.svelte
│   │   │       └── Sword.svelte
│   │   ├── data/
│   │   │   ├── banners/
│   │   │   │   ├── beginner.json
│   │   │   │   ├── events/
│   │   │   │   │   ├── 1.0.json
│   │   │   │   │   ├── 1.1.json
│   │   │   │   │   ├── 1.2.json
│   │   │   │   │   ├── 1.3.json
│   │   │   │   │   ├── 1.4.json
│   │   │   │   │   ├── 1.5.json
│   │   │   │   │   ├── 1.6.json
│   │   │   │   │   ├── 2.0.json
│   │   │   │   │   ├── 2.1.json
│   │   │   │   │   ├── 2.2.json
│   │   │   │   │   ├── 2.3.json
│   │   │   │   │   ├── 2.4.json
│   │   │   │   │   ├── 2.5.json
│   │   │   │   │   ├── 2.6.json
│   │   │   │   │   ├── 2.7.json
│   │   │   │   │   ├── 2.8.json
│   │   │   │   │   ├── 3.0.json
│   │   │   │   │   ├── 3.1.json
│   │   │   │   │   ├── 3.2.json
│   │   │   │   │   ├── 3.3.json
│   │   │   │   │   ├── 3.4.json
│   │   │   │   │   ├── 3.5.json
│   │   │   │   │   ├── 3.6.json
│   │   │   │   │   ├── 3.7.json
│   │   │   │   │   ├── 3.8.json
│   │   │   │   │   ├── 4.0.json
│   │   │   │   │   ├── 4.1.json
│   │   │   │   │   ├── 4.2.json
│   │   │   │   │   ├── 4.3.json
│   │   │   │   │   ├── 4.4.json
│   │   │   │   │   ├── 4.5.json
│   │   │   │   │   ├── 4.6.json
│   │   │   │   │   ├── 4.7.json
│   │   │   │   │   ├── 4.8.json
│   │   │   │   │   ├── 5.0.json
│   │   │   │   │   ├── 5.1.json
│   │   │   │   │   ├── 5.2.json
│   │   │   │   │   ├── 5.3.json
│   │   │   │   │   ├── 5.4.json
│   │   │   │   │   ├── 5.5.json
│   │   │   │   │   ├── 5.6.json
│   │   │   │   │   ├── 5.7.json
│   │   │   │   │   ├── 5.8.json
│   │   │   │   │   ├── 6.0.json
│   │   │   │   │   ├── 6.1.json
│   │   │   │   │   ├── 6.2.json
│   │   │   │   │   ├── 6.3.json
│   │   │   │   │   ├── 6.4.json
│   │   │   │   │   └── 6.5.json
│   │   │   │   └── standard.json
│   │   │   ├── characters.json
│   │   │   ├── country.json
│   │   │   ├── outfits.json
│   │   │   ├── paimon-bargain-characters.json
│   │   │   ├── pricelist.json
│   │   │   ├── updates.json
│   │   │   ├── weapons.json
│   │   │   └── wish-setup.json
│   │   ├── env.js
│   │   ├── helpers/
│   │   │   ├── accessKey.js
│   │   │   ├── assets.js
│   │   │   ├── audio/
│   │   │   │   ├── audio.js
│   │   │   │   ├── bookflip.js
│   │   │   │   ├── camera.js
│   │   │   │   ├── changebanner.js
│   │   │   │   ├── click.js
│   │   │   │   ├── click2.js
│   │   │   │   ├── close.js
│   │   │   │   ├── collectionitem.js
│   │   │   │   ├── exchange.js
│   │   │   │   ├── history.js
│   │   │   │   ├── inventory.js
│   │   │   │   ├── modal.js
│   │   │   │   ├── obtain.js
│   │   │   │   ├── prevbanner.js
│   │   │   │   ├── roll.js
│   │   │   │   ├── shopnav.js
│   │   │   │   ├── shopopen.js
│   │   │   │   └── shopsubnav.js
│   │   │   ├── banner-custom.js
│   │   │   ├── banner-loader.js
│   │   │   ├── browserState.js
│   │   │   ├── chat/
│   │   │   │   ├── badword-list.js
│   │   │   │   ├── badwords.js
│   │   │   │   └── firebaseApp.js
│   │   │   ├── cssPosition.js
│   │   │   ├── currencies.js
│   │   │   ├── dataAPI/
│   │   │   │   ├── api-cookie.js
│   │   │   │   ├── api-filesystem.js
│   │   │   │   ├── api-google.js
│   │   │   │   ├── api-indexeddb.js
│   │   │   │   ├── api-localstore.js
│   │   │   │   ├── data-merger.js
│   │   │   │   ├── export-import.js
│   │   │   │   ├── storage-reader.js
│   │   │   │   ├── storage-reset.js
│   │   │   │   └── sync.js
│   │   │   ├── donation.js
│   │   │   ├── gacha/
│   │   │   │   ├── Wish.js
│   │   │   │   ├── itemdrop-base.js
│   │   │   │   ├── probabilities.js
│   │   │   │   ├── roll.js
│   │   │   │   ├── wishBase.js
│   │   │   │   ├── wishBeginner.js
│   │   │   │   ├── wishCharacter.js
│   │   │   │   ├── wishChronicled.js
│   │   │   │   ├── wishStandard.js
│   │   │   │   └── wishWeapon.js
│   │   │   ├── i18n.js
│   │   │   ├── lazyload.js
│   │   │   ├── meteor-loader.js
│   │   │   ├── migrator/
│   │   │   │   ├── IDBUpdater.js
│   │   │   │   └── collect-old-data.js
│   │   │   ├── mobileDetect.js
│   │   │   ├── nameText.js
│   │   │   ├── noticeMark.js
│   │   │   ├── outfit.js
│   │   │   ├── shareable-link.js
│   │   │   ├── timeago.js
│   │   │   ├── toast.js
│   │   │   ├── transition.js
│   │   │   └── wakeLock.js
│   │   └── store/
│   │       ├── app-stores.js
│   │       ├── drive-store.js
│   │       └── filesystem-store.js
│   ├── locales/
│   │   ├── README.md
│   │   ├── de-DE.json
│   │   ├── en-US.json
│   │   ├── fr-FR.json
│   │   ├── id-ID.json
│   │   ├── it-IT.json
│   │   ├── items/
│   │   │   ├── de-DE.json
│   │   │   ├── en-US.json
│   │   │   ├── it-IT.json
│   │   │   ├── ja-JP.json
│   │   │   ├── ko-KR.json
│   │   │   ├── pt-BR.json
│   │   │   ├── ru-RU.json
│   │   │   ├── vi-VN.json
│   │   │   ├── zh-CN.json
│   │   │   └── zh-TW.json
│   │   ├── ja-JP.json
│   │   ├── ko-KR.json
│   │   ├── pt-BR.json
│   │   ├── ru-RU.json
│   │   ├── th-TH.json
│   │   ├── vi-VN.json
│   │   ├── zh-CN.json
│   │   └── zh-TW.json
│   ├── post/
│   │   ├── banner-guidelines.md
│   │   ├── install-android.md
│   │   ├── install-windows.md
│   │   └── privacy.md
│   ├── routes/
│   │   ├── +error.svelte
│   │   ├── +layout.js
│   │   ├── +layout.svelte
│   │   ├── +page.svelte
│   │   ├── _allbanners/
│   │   │   ├── _form-box.svelte
│   │   │   ├── _item-banner.svelte
│   │   │   └── index.svelte
│   │   ├── _custom-banner/
│   │   │   ├── BannerEditor/
│   │   │   │   ├── BannerArt.svelte
│   │   │   │   ├── RateUpArt.svelte
│   │   │   │   ├── _details-editor.svelte
│   │   │   │   ├── _info-face-button.svelte
│   │   │   │   ├── _preview-generator.svelte
│   │   │   │   ├── _rateup-picker.svelte
│   │   │   │   ├── _splashart-form.svelte
│   │   │   │   └── _vision-picker.svelte
│   │   │   ├── CustomEditor.svelte
│   │   │   ├── ModalDelete.svelte
│   │   │   ├── ModalInitBanner.svelte
│   │   │   ├── Publisher.svelte
│   │   │   └── SplashArtEditor/
│   │   │       ├── SplashArt.svelte
│   │   │       └── _result-card.svelte
│   │   ├── _feedback/
│   │   │   ├── _sidebar.svelte
│   │   │   └── index.svelte
│   │   ├── _gachainfo/
│   │   │   ├── _book-bg.svelte
│   │   │   ├── _title.svelte
│   │   │   ├── details/
│   │   │   │   ├── Details.svelte
│   │   │   │   ├── _description.svelte
│   │   │   │   ├── _list.svelte
│   │   │   │   ├── _promotional-v1.svelte
│   │   │   │   └── _promotional-v2.svelte
│   │   │   ├── history/
│   │   │   │   ├── History.svelte
│   │   │   │   ├── _filter.svelte
│   │   │   │   ├── _legends.svelte
│   │   │   │   ├── _list.svelte
│   │   │   │   ├── _pagination.svelte
│   │   │   │   ├── _report.svelte
│   │   │   │   ├── _reset.svelte
│   │   │   │   └── _select-banner.svelte
│   │   │   └── index.svelte
│   │   ├── _index/
│   │   │   ├── InitialLoader.svelte
│   │   │   ├── ModalConvert.svelte
│   │   │   ├── ModalWelcome.svelte
│   │   │   ├── PreloadMeteor.svelte
│   │   │   ├── ScreenshotShare.svelte
│   │   │   ├── WelkinCheckin.svelte
│   │   │   └── _screenshot-result.svelte
│   │   ├── _inventory/
│   │   │   ├── _background.svelte
│   │   │   ├── _footer.svelte
│   │   │   ├── _header.svelte
│   │   │   ├── _inventory-detail.svelte
│   │   │   ├── _inventory-item.svelte
│   │   │   ├── _inventory-list.svelte
│   │   │   ├── _navlink.svelte
│   │   │   ├── _order.svelte
│   │   │   ├── _outfit-toggle.svelte
│   │   │   └── index.svelte
│   │   ├── _menu/
│   │   │   ├── BackupRestore.svelte
│   │   │   ├── CustomBanner.svelte
│   │   │   ├── ProAccess.svelte
│   │   │   ├── Settings.svelte
│   │   │   ├── Updates.svelte
│   │   │   ├── _options.svelte
│   │   │   ├── _sidebar.svelte
│   │   │   ├── backup-restore/
│   │   │   │   ├── _auto-export.svelte
│   │   │   │   ├── _drop-import.svelte
│   │   │   │   ├── _modal-import.svelte
│   │   │   │   ├── _sync-cloud.svelte
│   │   │   │   └── _sync-local.svelte
│   │   │   └── index.svelte
│   │   ├── _shop/
│   │   │   ├── _aside.svelte
│   │   │   ├── _header.svelte
│   │   │   ├── _modal-balance.svelte
│   │   │   ├── _modal-exchange.svelte
│   │   │   ├── _navlink-top-button.svelte
│   │   │   ├── _navlink-top.svelte
│   │   │   ├── _shop-group-item.svelte
│   │   │   ├── _shop-group.svelte
│   │   │   ├── character-outfit/
│   │   │   │   ├── CharacterOutfits.svelte
│   │   │   │   └── _modal-confirm.svelte
│   │   │   ├── donate/
│   │   │   │   └── Donate.svelte
│   │   │   ├── genesis-topup/
│   │   │   │   ├── GenesisTopup.svelte
│   │   │   │   └── _modal-topup.svelte
│   │   │   ├── index.svelte
│   │   │   ├── paimon-bargains/
│   │   │   │   ├── PaimonBargains.svelte
│   │   │   │   └── _character-item.svelte
│   │   │   └── recomended/
│   │   │       ├── Recomended.svelte
│   │   │       ├── _item-outfit.svelte
│   │   │       ├── _item-welkin.svelte
│   │   │       └── _modal-welkin.svelte
│   │   ├── _wish/
│   │   │   ├── _banner-button.svelte
│   │   │   ├── _banner-item.svelte
│   │   │   ├── _footer.svelte
│   │   │   ├── _header.svelte
│   │   │   ├── _out-of-primogem.svelte
│   │   │   ├── banner-card/
│   │   │   │   ├── BannerCard.svelte
│   │   │   │   ├── __dropnotes.svelte
│   │   │   │   ├── _banner-image.svelte
│   │   │   │   ├── _chronicled/
│   │   │   │   │   ├── _epitomized.svelte
│   │   │   │   │   ├── _rateup-item.svelte
│   │   │   │   │   ├── _rateuplist-horizontal.svelte
│   │   │   │   │   ├── artwork.svelte
│   │   │   │   │   ├── bannerSpace.svelte
│   │   │   │   │   ├── rateupSelector.svelte
│   │   │   │   │   └── textLayer.svelte
│   │   │   │   ├── _frame-beginner.svelte
│   │   │   │   ├── _frame-character.svelte
│   │   │   │   ├── _frame-custom.svelte
│   │   │   │   ├── _frame-standard.svelte
│   │   │   │   ├── _frame-weapon.svelte
│   │   │   │   └── _probability-editor.svelte
│   │   │   ├── epitomized-path/
│   │   │   │   ├── EpitomizedPath.svelte
│   │   │   │   ├── WeaponButton.svelte
│   │   │   │   ├── _chronicled-details.svelte
│   │   │   │   ├── _description.svelte
│   │   │   │   ├── _icon.svelte
│   │   │   │   ├── _item-selection.svelte
│   │   │   │   └── _svg-background.svelte
│   │   │   ├── index.svelte
│   │   │   └── wish-result/
│   │   │       ├── ResultList.svelte
│   │   │       ├── WishResult.svelte
│   │   │       ├── _item-info.svelte
│   │   │       ├── _meteor.svelte
│   │   │       ├── _result-list-item.svelte
│   │   │       ├── _splash-art.svelte
│   │   │       ├── _splash-light.svelte
│   │   │       └── _weapon-bonus.svelte
│   │   ├── adkey/
│   │   │   └── +page.svelte
│   │   ├── bnlist/
│   │   │   ├── +page.svelte
│   │   │   └── _list.svelte
│   │   ├── install/
│   │   │   └── +page.svelte
│   │   ├── privacy-policy/
│   │   │   └── +page.svelte
│   │   └── screen/
│   │       ├── +page.svelte
│   │       ├── chars/
│   │       │   └── +page.svelte
│   │       ├── wishitem/
│   │       │   └── +page.svelte
│   │       └── wishlist/
│   │           └── +page.svelte
│   └── sw.js
├── static/
│   ├── .nojekyll
│   ├── .well-known/
│   │   └── assetlinks.json
│   ├── browserconfig.xml
│   ├── google77966abbed90508f.html
│   ├── icons.css
│   ├── robots.txt
│   ├── sfx/
│   │   ├── result-list.ogg
│   │   ├── reveal-3star.ogg
│   │   ├── reveal-4star.ogg
│   │   ├── reveal-5star.ogg
│   │   └── wish-backsound.ogg
│   ├── sitemap.xml
│   └── videos/
│       └── bg.webm
├── svelte.config.js
├── vite.config.js
└── vite.config.js.timestamp-1760945763883.mjs
Download .txt
SYMBOL INDEX (129 symbols across 20 files)

FILE: src/lib/env.js
  constant HOST (line 2) | const HOST = host.replace(/^\/|\/$/g, '');
  constant APP_TITLE (line 4) | const APP_TITLE = import.meta.env.VITE_APP_TITLE || 'Genshin Impact Wish...
  constant DESCRIPTION (line 5) | const DESCRIPTION = import.meta.env.VITE_DESCRIPTION || '';
  constant KEYWORDS (line 6) | const KEYWORDS = import.meta.env.VITE_KEYWORDS || '';
  constant API_HOST (line 10) | const API_HOST = apihost.replace(/^\/|\/$/g, '');
  constant IBB_KEY (line 11) | const IBB_KEY = import.meta.env.VITE_IBB_KEY || '';
  constant GOOGLE_API_KEY (line 13) | const GOOGLE_API_KEY = import.meta.env.VITE_GOOGLE_API_KEY || '';
  constant GOOGLE_CLIENT_ID (line 14) | const GOOGLE_CLIENT_ID = import.meta.env.VITE_GOOGLE_CLIENT_ID || '';

FILE: src/lib/helpers/accessKey.js
  method _set (line 30) | _set(key) {
  method clear (line 35) | clear() {
  method initialLoad (line 39) | async initialLoad() {
  method verify (line 51) | async verify(key) {

FILE: src/lib/helpers/banner-custom.js
  method _postData (line 48) | async _postData({ action, data = {}, id }) {
  method getData (line 63) | async getData(shareID, multi = false) {
  method updateData (line 82) | async updateData(localID) {
  method deleteBanner (line 123) | async deleteBanner(itemID) {
  method deleteImage (line 150) | async deleteImage({ hash, id } = {}) {
  method block (line 170) | async block(id, db) {

FILE: src/lib/helpers/browserState.js
  method set (line 2) | set(page) {
  method back (line 5) | back() {

FILE: src/lib/helpers/chat/badwords.js
  method _filterWord (line 4) | _filterWord(badword, stringToFilter) {
  method _isProfane (line 8) | _isProfane(stringToFilter) {
  method _replaceWord (line 12) | _replaceWord(string) {
  method hasBadword (line 17) | hasBadword(string) {
  method clean (line 21) | clean(string) {

FILE: src/lib/helpers/currencies.js
  method init (line 10) | init(currency = null) {
  method checkUsedCurrency (line 25) | checkUsedCurrency(curr) {
  method formatPrice (line 36) | formatPrice(price) {
  method getTotalSpend (line 42) | getTotalSpend(totalPull) {

FILE: src/lib/helpers/dataAPI/api-cookie.js
  method get (line 16) | get(cname) {
  method set (line 20) | set(cname, cvalue) {
  method remove (line 25) | remove(cname) {
  method clean (line 31) | clean() {

FILE: src/lib/helpers/dataAPI/api-google.js
  constant TOKEN (line 9) | let TOKEN = '';
  constant DISCOVERY_DOCS (line 10) | const DISCOVERY_DOCS = ['https://www.googleapis.com/discovery/v1/apis/dr...
  constant SCOPES (line 11) | const SCOPES = 'https://www.googleapis.com/auth/drive.appdata';
  constant GSI (line 81) | const GSI = {
  method scriptLoaded (line 82) | scriptLoaded() {
  method _getToken (line 94) | async _getToken(response) {
  method _refreshToken (line 115) | async _refreshToken() {
  constant DRIVEAPI (line 135) | const DRIVEAPI = {
  method sync (line 136) | sync() {

FILE: src/lib/helpers/dataAPI/api-indexeddb.js
  method upgrade (line 11) | async upgrade(db, oldVer, newVer, transaction) {
  method historyCount (line 46) | async historyCount() {
  method getListByBanner (line 49) | async getListByBanner(banner) {
  method countItem (line 53) | async countItem(name) {
  method getByID (line 57) | async getByID(itemID) {
  method clearHistory (line 61) | async clearHistory(banner) {
  method clearIDB (line 74) | async clearIDB() {
  method getAllHistories (line 81) | async getAllHistories() {
  method addHistory (line 85) | async addHistory(data) {
  method delete (line 93) | async delete(id) {
  method put (line 103) | async put(data) {
  method get (line 109) | async get(key) {
  method delete (line 114) | async delete(key) {
  method getAll (line 122) | async getAll() {
  method put (line 126) | async put(data = {}) {
  method get (line 135) | async get(itemID) {
  method getListByStatus (line 140) | async getListByStatus(status) {
  method delete (line 144) | async delete(key) {
  method clear (line 152) | async clear() {

FILE: src/lib/helpers/dataAPI/api-localstore.js
  method getData (line 2) | getData() {
  method get (line 9) | get(key) {
  method set (line 14) | set(key, value) {
  method initEvent (line 20) | initEvent() {
  method get (line 34) | get(pityBanner) {
  method set (line 39) | set(pityBanner, value) {
  method all (line 47) | all() {
  method get (line 51) | get(currency) {
  method set (line 56) | set(currency, value) {
  method get (line 64) | get(banner) {
  method set (line 68) | set(banner, rollNumber) {
  method put (line 74) | put(banner) {
  method get (line 84) | get(banner) {
  method set (line 88) | set(banner, value) {
  method get (line 96) | get(key) {
  method set (line 101) | set(key, value) {
  method getAll (line 109) | getAll() {
  method get (line 114) | get(itemID) {
  method put (line 123) | put({ itemID, source = 'wish', qty = 1 }) {
  method getAll (line 137) | getAll() {
  method restore (line 143) | restore(data) {
  method init (line 149) | init({ version, phase, banner = 'weapon-event' } = {}) {
  method set (line 161) | set(point, selectedIndex, type = 'weapon') {
  method getInfo (line 172) | getInfo() {
  method remove (line 179) | remove() {
  method getData (line 187) | getData() {
  method checkin (line 198) | checkin(action = 'checkin') {
  method getAll (line 232) | getAll() {
  method get (line 237) | get(outfitName) {
  method getByChar (line 242) | getByChar(charName) {
  method set (line 247) | set({ outfitName, isSet = true, characterName = null } = {}) {
  method get (line 265) | get(key) {
  method set (line 270) | set(key, value) {
  method reset (line 275) | reset(key) {

FILE: src/lib/helpers/gacha/Wish.js
  constant WISH (line 20) | const WISH = {
  method init (line 21) | async init(version, phase, customData) {
  method _initCustom (line 41) | _initCustom(customData) {
  method _characterWish (line 52) | _characterWish(rarity, indexOfBanner) {
  method _weaponWish (line 69) | _weaponWish(rarity) {
  method _chronicledWish (line 84) | _chronicledWish(rarity) {
  method _beginnerWish (line 100) | _beginnerWish(rarity) {
  method _standardWish (line 106) | _standardWish(rarity) {
  method getItem (line 114) | getItem(rarity, banner, indexOfBanner) {

FILE: src/lib/helpers/gacha/wishCharacter.js
  method init (line 13) | init({ indexOfBanner, featured, rateup, version, phase, stdver, customDa...
  method get (line 24) | get(rarity) {

FILE: src/lib/helpers/gacha/wishChronicled.js
  method init (line 7) | init({ version, phase }) {
  method check (line 12) | check() {
  method verify (line 17) | verify(result) {
  method init (line 37) | init({ version, phase, stdver, characters, weapons, region } = {}) {
  method get (line 49) | get(rarity) {

FILE: src/lib/helpers/gacha/wishStandard.js
  method init (line 4) | init({ stdver, version, phase }) {
  method get (line 11) | get(rarity) {

FILE: src/lib/helpers/gacha/wishWeapon.js
  method init (line 15) | init({ version, phase, featured, fatesystemON }) {
  method check (line 24) | check() {
  method verify (line 29) | verify(result) {
  method init (line 54) | init({ rateup, version, phase, featured, fatesystemON } = {}) {
  method get (line 64) | get(rarity) {

FILE: src/lib/helpers/lazyload.js
  method destroy (line 31) | destroy() {

FILE: src/lib/helpers/meteor-loader.js
  method start (line 76) | start(controller) {

FILE: src/lib/helpers/noticeMark.js
  method openNotice (line 8) | openNotice(key) {
  method onLoadCheck (line 18) | onLoadCheck() {

FILE: src/lib/helpers/shareable-link.js
  method _read (line 8) | _read(decoded) {
  method single (line 20) | single(encoded) {
  method multi (line 25) | multi(encoded) {
  method _createStringData (line 34) | _createStringData(data) {
  method single (line 41) | single(data) {
  method multi (line 46) | multi(data) {

FILE: src/lib/helpers/timeago.js
  function get_format (line 58) | function get_format(diff, tense) {
Condensed preview — 354 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,364K chars).
[
  {
    "path": ".browserslistrc",
    "chars": 69,
    "preview": "# Browsers that we support\n\nlast 4 version\n>0.3%\nnot ie <= 8\nnot dead"
  },
  {
    "path": ".eslintrc.cjs",
    "chars": 296,
    "preview": "module.exports = {\n\troot: true,\n\textends: ['eslint:recommended', 'prettier'],\n\tplugins: ['svelte3'],\n\toverrides: [{ file"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 690,
    "preview": "# These are supported funding model platforms\n\ngithub: #\npatreon: # Replace with a single Patreon username\nopen_collecti"
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "chars": 2729,
    "preview": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# Y"
  },
  {
    "path": ".gitignore",
    "chars": 210,
    "preview": ".DS_Store\nnode_modules\n/build\n/dist\n/.svelte-kit\n/package\n/static/g\n\n.vercel_build_output\n.vercel\n.env\n\nREADME.html\n\nCNA"
  },
  {
    "path": ".prettierrc",
    "chars": 111,
    "preview": "{\n\t\"useTabs\": true,\n\t\"singleQuote\": true,\n\t\"trailingComma\": \"none\",\n\t\"printWidth\": 100,\n\t\"endOfLine\": \"crlf\"\n}\n"
  },
  {
    "path": "LICENSE",
    "chars": 1074,
    "preview": "MIT License\n\nCopyright (c) 2022 WishSImulator.App\n\nPermission is hereby granted, free of charge, to any person obtaining"
  },
  {
    "path": "README.md",
    "chars": 9150,
    "preview": "# Realistic Genshin Impact Wish Simulator\n\n![License](https://badgen.net/github/license/Mantan21/Genshin-Impact-Wish-Sim"
  },
  {
    "path": "jsconfig.json",
    "chars": 525,
    "preview": "{\n\t\"compilerOptions\": {\n\t\t\"baseUrl\": \".\",\n\t\t\"paths\": {\n\t\t\t\"$lib\": [\"src/lib\"],\n\t\t\t\"$lib/*\": [\"src/lib/*\"],\n\t\t\t\"$post\": ["
  },
  {
    "path": "package.json",
    "chars": 1844,
    "preview": "{\n\t\"name\": \"wishsimulator.app\",\n\t\"description\": \"Realistic Genshin Impact Wish Simulator, Unlimited Gacha, 100% running "
  },
  {
    "path": "postcss.config.js",
    "chars": 146,
    "preview": "import postcssNested from 'postcss-nested';\nimport autoprefixer from 'autoprefixer';\n\nexport default {\n\tplugins: [postcs"
  },
  {
    "path": "src/app.css",
    "chars": 11037,
    "preview": ":root {\n\tletter-spacing: -0.02rem;\n\t--gi-global-font: 'GI_Global_Web', 'GI_JA_Web', 'GI_TH_Web', 'GI_TH_Web', 'GI_ZH_Web"
  },
  {
    "path": "src/app.html",
    "chars": 2047,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<meta\n\t\t\tname=\"viewport\"\n\t\t\tcontent=\"width=device-"
  },
  {
    "path": "src/global.d.ts",
    "chars": 40,
    "preview": "/// <reference types=\"@sveltejs/kit\" />\n"
  },
  {
    "path": "src/lib/components/ButtonGeneral.svelte",
    "chars": 1431,
    "preview": "<script>\n\timport { createEventDispatcher } from 'svelte';\n\texport let disabled = false;\n\texport let dark = false;\n\n\tcons"
  },
  {
    "path": "src/lib/components/ButtonModal.svelte",
    "chars": 2238,
    "preview": "<script>\n\timport { createEventDispatcher } from 'svelte';\n\timport { t } from 'svelte-i18n';\n\n\tconst isSlotpresent = $$pr"
  },
  {
    "path": "src/lib/components/CheckBox.svelte",
    "chars": 1084,
    "preview": "<script>\n\timport { playSfx } from '$lib/helpers/audio/audio';\n\timport { createEventDispatcher } from 'svelte';\n\n\texport "
  },
  {
    "path": "src/lib/components/Icon.svelte",
    "chars": 1599,
    "preview": "<script>\n\timport { assets } from '$lib/store/app-stores';\n\n\texport let type = '';\n\texport let width = '20px';\n\texport le"
  },
  {
    "path": "src/lib/components/Iklan.svelte",
    "chars": 3560,
    "preview": "<script>\n\timport { dev } from '$app/environment';\n\timport { onMount } from 'svelte';\n\timport { isMobile, isPWA, showAd }"
  },
  {
    "path": "src/lib/components/ModalTpl.svelte",
    "chars": 6327,
    "preview": "<script>\n\timport { createEventDispatcher, onDestroy, onMount } from 'svelte';\n\timport { fade, fly } from 'svelte/transit"
  },
  {
    "path": "src/lib/components/MyFund.svelte",
    "chars": 1853,
    "preview": "<script>\n\timport { getContext } from 'svelte';\n\timport { playSfx } from '$lib/helpers/audio/audio';\n\timport Icon from '."
  },
  {
    "path": "src/lib/components/NoticeMark.svelte",
    "chars": 802,
    "preview": "<script>\n\timport { notice } from '$lib/store/app-stores';\n\n\texport let name = '';\n\texport let style = '';\n\n\tlet active ="
  },
  {
    "path": "src/lib/components/ObtainedItem.svelte",
    "chars": 3481,
    "preview": "<script>\n\timport { getContext, onDestroy, onMount } from 'svelte';\n\timport { scale } from 'svelte/transition';\n\timport {"
  },
  {
    "path": "src/lib/components/RandomBackground.svelte",
    "chars": 531,
    "preview": "<script>\n\timport { assets } from '$lib/store/app-stores';\n\n\tconst random = (min, max) => {\n\t\tmin = Math.ceil(min);\n\t\tmax"
  },
  {
    "path": "src/lib/components/Range.svelte",
    "chars": 5221,
    "preview": "<script>\n\timport { getContext } from 'svelte';\n\timport { playSfx } from '$lib/helpers/audio/audio';\n\n\texport let max;\n\te"
  },
  {
    "path": "src/lib/components/SVGIcon.svelte",
    "chars": 871,
    "preview": "<script>\n\t// Vision\n\timport Anemo from './svgs/Anemo.svelte';\n\timport Cryo from './svgs/Cryo.svelte';\n\timport Dendro fro"
  },
  {
    "path": "src/lib/components/Toast.svelte",
    "chars": 1952,
    "preview": "<script>\n\timport { createEventDispatcher } from 'svelte';\n\timport { fade, fly } from 'svelte/transition';\n\n\texport let t"
  },
  {
    "path": "src/lib/components/Toasts.svelte",
    "chars": 819,
    "preview": "<script lang=\"ts\">\n\timport { flip } from 'svelte/animate';\n\timport { dismissToast } from '$lib/helpers/toast';\n\timport {"
  },
  {
    "path": "src/lib/components/ToolTip.svelte",
    "chars": 2086,
    "preview": "<script>\n\texport let position = 'bottom';\n</script>\n\n<div class=\"tooltip {position}\">\n\t<i>i</i>\n\t<span class=\"tooltiptex"
  },
  {
    "path": "src/lib/components/chat/MainChat.svelte",
    "chars": 5912,
    "preview": "<script>\n\timport { getContext, onMount, setContext } from 'svelte';\n\timport { fade, fly } from 'svelte/transition';\n\timp"
  },
  {
    "path": "src/lib/components/chat/_changeAvatar.svelte",
    "chars": 5679,
    "preview": "<script>\n\timport { getContext, onMount } from 'svelte';\n\timport { t } from 'svelte-i18n';\n\timport OverlayScrollbars from"
  },
  {
    "path": "src/lib/components/chat/_changeNick.svelte",
    "chars": 1620,
    "preview": "<script>\n\timport { getContext } from 'svelte';\n\timport { fade } from 'svelte/transition';\n\timport { cookie } from '$lib/"
  },
  {
    "path": "src/lib/components/chat/_chats.svelte",
    "chars": 5394,
    "preview": "<script>\n\timport { afterUpdate, beforeUpdate, onMount } from 'svelte';\n\timport { fade } from 'svelte/transition';\n\timpor"
  },
  {
    "path": "src/lib/components/chat/_loader-chat.svelte",
    "chars": 1297,
    "preview": "<script>\n\tlet activeIconIndex = 0;\n\tconst iconList = ['pyro', 'hydro', 'anemo', 'electro', 'dendro', 'cryo', 'geo'];\n\n\ts"
  },
  {
    "path": "src/lib/components/chat/_messagebox.svelte",
    "chars": 1883,
    "preview": "<script>\n\timport { push, ref } from 'firebase/database';\n\timport { db } from '$lib/helpers/chat/firebaseApp';\n\timport { "
  },
  {
    "path": "src/lib/components/chat/_sidebar.svelte",
    "chars": 3928,
    "preview": "<script>\n\timport { getContext } from 'svelte';\n\timport { fly } from 'svelte/transition';\n\n\tconst close = getContext('cha"
  },
  {
    "path": "src/lib/components/svgs/Anemo.svelte",
    "chars": 3496,
    "preview": "<svg\n\tviewBox=\"0 0 400 420\"\n\tversion=\"1.1\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\txmlns:xlink=\"http://www.w3.org/1999/xlin"
  },
  {
    "path": "src/lib/components/svgs/Bow.svelte",
    "chars": 7012,
    "preview": "<svg\n\tviewBox=\"0 0 128 128\"\n\tversion=\"1.1\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\txmlns:xlink=\"http://www.w3.org/1999/xlin"
  },
  {
    "path": "src/lib/components/svgs/Catalyst.svelte",
    "chars": 10781,
    "preview": "<svg\n\tviewBox=\"0 0 128 128\"\n\tversion=\"1.1\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\txmlns:xlink=\"http://www.w3.org/1999/xlin"
  },
  {
    "path": "src/lib/components/svgs/Claymore.svelte",
    "chars": 10943,
    "preview": "<svg\n\tviewBox=\"0 0 128 128\"\n\tversion=\"1.1\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\txmlns:xlink=\"http://www.w3.org/1999/xlin"
  },
  {
    "path": "src/lib/components/svgs/Cryo.svelte",
    "chars": 5988,
    "preview": "<svg\n\tviewBox=\"0 0 400 420\"\n\tversion=\"1.1\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\txmlns:xlink=\"http://www.w3.org/1999/xlin"
  },
  {
    "path": "src/lib/components/svgs/Dendro.svelte",
    "chars": 3206,
    "preview": "<svg\n\tviewBox=\"0 0 400 420\"\n\tversion=\"1.1\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\txmlns:xlink=\"http://www.w3.org/1999/xlin"
  },
  {
    "path": "src/lib/components/svgs/Electro.svelte",
    "chars": 2887,
    "preview": "<svg\n\tviewBox=\"0 0 400 420\"\n\tversion=\"1.1\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\txmlns:xlink=\"http://www.w3.org/1999/xlin"
  },
  {
    "path": "src/lib/components/svgs/Geo.svelte",
    "chars": 2030,
    "preview": "<svg\n\tviewBox=\"0 0 400 420\"\n\tversion=\"1.1\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\txmlns:xlink=\"http://www.w3.org/1999/xlin"
  },
  {
    "path": "src/lib/components/svgs/Hydro.svelte",
    "chars": 2175,
    "preview": "<svg\n\tviewBox=\"0 0 400 420\"\n\tversion=\"1.1\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\txmlns:xlink=\"http://www.w3.org/1999/xlin"
  },
  {
    "path": "src/lib/components/svgs/Polearm.svelte",
    "chars": 4115,
    "preview": "<svg\n\tviewBox=\"0 0 128 128\"\n\tversion=\"1.1\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\txmlns:xlink=\"http://www.w3.org/1999/xlin"
  },
  {
    "path": "src/lib/components/svgs/Pyro.svelte",
    "chars": 2068,
    "preview": "<svg\n\tviewBox=\"0 0 400 420\"\n\tversion=\"1.1\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\txmlns:xlink=\"http://www.w3.org/1999/xlin"
  },
  {
    "path": "src/lib/components/svgs/Sword.svelte",
    "chars": 3624,
    "preview": "<svg\n\tviewBox=\"0 0 128 128\"\n\tversion=\"1.1\"\n\txmlns=\"http://www.w3.org/2000/svg\"\n\txmlns:xlink=\"http://www.w3.org/1999/xlin"
  },
  {
    "path": "src/lib/data/banners/beginner.json",
    "chars": 116,
    "preview": "{\n\t\"beginner\": {\n\t\t\"featured\": {\n\t\t\t\"bannerName\": \"beginner\",\n\t\t\t\"character\": \"noelle\",\n\t\t\t\"vision\": \"geo\"\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/lib/data/banners/events/1.0.json",
    "chars": 1484,
    "preview": "{\n\t\"patch\": 1.0,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 1,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/1.1.json",
    "chars": 1428,
    "preview": "{\n\t\"patch\": 1.1,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 1,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/1.2.json",
    "chars": 1484,
    "preview": "{\n\t\"patch\": 1.2,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 1,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/1.3.json",
    "chars": 2392,
    "preview": "{\n\t\"patch\": 1.3,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 2,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/1.4.json",
    "chars": 1567,
    "preview": "{\n\t\"patch\": 1.4,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 2,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/1.5.json",
    "chars": 1397,
    "preview": "{\n\t\"patch\": 1.5,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 2,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/1.6.json",
    "chars": 1443,
    "preview": "{\n\t\"patch\": 1.6,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 2,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/2.0.json",
    "chars": 1512,
    "preview": "{\n\t\"patch\": 2.0,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 2,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/2.1.json",
    "chars": 1526,
    "preview": "{\n\t\"patch\": 2.1,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 2,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/2.2.json",
    "chars": 1423,
    "preview": "{\n\t\"patch\": 2.2,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 2,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/2.3.json",
    "chars": 1710,
    "preview": "{\n\t\"patch\": 2.3,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 2,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/2.4.json",
    "chars": 1852,
    "preview": "{\n\t\"patch\": 2.4,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 2,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/2.5.json",
    "chars": 1688,
    "preview": "{\n\t\"patch\": 2.5,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 2,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/2.6.json",
    "chars": 1604,
    "preview": "{\n\t\"patch\": 2.6,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 2,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/2.7.json",
    "chars": 1805,
    "preview": "{\n\t\"patch\": 2.7,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 2,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/2.8.json",
    "chars": 1577,
    "preview": "{\n\t\"patch\": 2.8,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 2,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/3.0.json",
    "chars": 1834,
    "preview": "{\n\t\"patch\": 3.0,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 2,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/3.1.json",
    "chars": 1825,
    "preview": "{\n\t\"patch\": 3.1,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 3,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/3.2.json",
    "chars": 1892,
    "preview": "{\n\t\"patch\": 3.2,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 3,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/3.3.json",
    "chars": 1908,
    "preview": "{\n\t\"patch\": 3.3,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 3,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/3.4.json",
    "chars": 1732,
    "preview": "{\n\t\"patch\": 3.4,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 3,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/3.5.json",
    "chars": 1844,
    "preview": "{\n\t\"patch\": 3.5,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 3,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/3.6.json",
    "chars": 1814,
    "preview": "{\n\t\"patch\": 3.6,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 4,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/3.7.json",
    "chars": 1891,
    "preview": "{\n\t\"patch\": 3.7,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 4,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/3.8.json",
    "chars": 1902,
    "preview": "{\n\t\"patch\": 3.8,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 4,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/4.0.json",
    "chars": 1897,
    "preview": "{\n\t\"patch\": 4.0,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 4,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/4.1.json",
    "chars": 1905,
    "preview": "{\n\t\"patch\": 4.1,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 4,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/4.2.json",
    "chars": 1879,
    "preview": "{\n\t\"patch\": 4.2,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 4,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/4.3.json",
    "chars": 1884,
    "preview": "{\n\t\"patch\": 4.3,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 4,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/4.4.json",
    "chars": 1975,
    "preview": "{\n\t\"patch\": 4.4,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 4,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/4.5.json",
    "chars": 2523,
    "preview": "{\n\t\"patch\": 4.5,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 4,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/4.6.json",
    "chars": 1885,
    "preview": "{\n\t\"patch\": 4.6,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 4,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/4.7.json",
    "chars": 1972,
    "preview": "{\n\t\"patch\": 4.7,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 4,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/4.8.json",
    "chars": 1849,
    "preview": "{\n\t\"patch\": 4.8,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 4,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/5.0.json",
    "chars": 1926,
    "preview": "{\n\t\"patch\": 5.0,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 4,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/5.1.json",
    "chars": 1944,
    "preview": "{\n\t\"patch\": 5.1,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 4,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/5.2.json",
    "chars": 1943,
    "preview": "{\n\t\"patch\": 5.2,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 4,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/5.3.json",
    "chars": 2553,
    "preview": "{\n\t\"patch\": 5.3,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 4,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/5.4.json",
    "chars": 1923,
    "preview": "{\n\t\"patch\": 5.4,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 4,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/5.5.json",
    "chars": 1923,
    "preview": "{\n\t\"patch\": 5.5,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 5,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/5.6.json",
    "chars": 2676,
    "preview": "{\n\t\"patch\": 5.6,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 5,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/5.7.json",
    "chars": 1884,
    "preview": "{\n\t\"patch\": 5.7,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 5,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/5.8.json",
    "chars": 2037,
    "preview": "{\n\t\"patch\": 5.8,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 5,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/6.0.json",
    "chars": 2901,
    "preview": "{\n\t\"patch\": 6.0,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 5,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/6.1.json",
    "chars": 1988,
    "preview": "{\n\t\"patch\": 6.1,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 5,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/6.2.json",
    "chars": 1915,
    "preview": "{\n\t\"patch\": 6.2,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 5,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/6.3.json",
    "chars": 1959,
    "preview": "{\n\t\"patch\": 6.3,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 5,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/6.4.json",
    "chars": 2531,
    "preview": "{\n\t\"patch\": 6.4,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 5,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/events/6.5.json",
    "chars": 2971,
    "preview": "{\n\t\"patch\": 6.5,\n\t\"data\": [\n\t\t{\n\t\t\t\"phase\": 1,\n\t\t\t\"banners\": {\n\t\t\t\t\"standardVersion\": 5,\n\t\t\t\t\"events\": {\n\t\t\t\t\t\"featured\""
  },
  {
    "path": "src/lib/data/banners/standard.json",
    "chars": 1029,
    "preview": "{\n\t\"standard\": [\n\t\t{\n\t\t\t\"version\": 1,\n\t\t\t\"characters\": [\"qiqi\", \"keqing\", \"diluc\", \"mona\", \"jean\"],\n\t\t\t\"featured\": {\n\t\t\t"
  },
  {
    "path": "src/lib/data/characters.json",
    "chars": 38491,
    "preview": "{\n\t\"onlyStandard\": [\"amber\", \"kaeya\", \"lisa\"],\n\t\"data\": [\n\t\t{\n\t\t\t\"itemID\": 10000130,\n\t\t\t\"name\": \"linnea\",\n\t\t\t\"vision\": \""
  },
  {
    "path": "src/lib/data/country.json",
    "chars": 24085,
    "preview": "{\n\t\"localeName\": {\n\t\t\"zh-CN\": \"简体中文 (CHS)\",\n\t\t\"zh-TW\": \"繁體中文 (CHT)\",\n\t\t\"de-DE\": \"Deutsch (DE)\",\n\t\t\"en-US\": \"English (EN)"
  },
  {
    "path": "src/lib/data/outfits.json",
    "chars": 8636,
    "preview": "{\n\t\"outfits\": [\n\t\t{\n\t\t\t\"name\": \"5-star-outrider\",\n\t\t\t\"characterName\": \"amber\",\n\t\t\t\"rarity\": 4,\n\t\t\t\"offset\": {\n\t\t\t\t\"splas"
  },
  {
    "path": "src/lib/data/paimon-bargain-characters.json",
    "chars": 954,
    "preview": "{\n    \"paimonBargainCharacters\": [\n\t\t{\n\t\t\t\"name\": \"amber\",\n\t\t\t\"price\": 34,\n\t\t\t\"rarity\": 4,\n\t\t\t\"month\": 4\n\t\t},\n\t\t{\n\t\t\t\"na"
  },
  {
    "path": "src/lib/data/pricelist.json",
    "chars": 3857,
    "preview": "{\n\t\"genesisBonus\": {\n\t\t\"versionReset\": [1.0, 2.1, 3.1, 4.1, 5.0, 6.0],\n\t\t\"topupBonus\": {\n\t\t\t\"300\": 30,\n\t\t\t\"980\": 110,\n\t\t"
  },
  {
    "path": "src/lib/data/updates.json",
    "chars": 23381,
    "preview": "{\n\t\"data\": [\n\t\t{\n\t\t\t\"date\": \"01-Sep-2021\",\n\t\t\t\"description\": [\n\t\t\t\t\"<strong> Raiden Shogun and Kujou Sara </strong> Bann"
  },
  {
    "path": "src/lib/data/weapons.json",
    "chars": 21379,
    "preview": "{\n\t\"data\": [\n\t\t{\n\t\t\t\"itemID\": 15516,\n\t\t\t\"name\": \"golden-frostbound-oath\",\n\t\t\t\"rarity\": 5,\n\t\t\t\"weaponType\": \"bow\",\n\t\t\t\"li"
  },
  {
    "path": "src/lib/data/wish-setup.json",
    "chars": 1201,
    "preview": "{\n\t\"version\": \"6.5\",\n\t\"wishPhase\": 2,\n\t\"storageVersion\": \"6.5.2\",\n\t\"allPatch\": [\n\t\t1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2."
  },
  {
    "path": "src/lib/env.js",
    "chars": 645,
    "preview": "const host = import.meta.env.VITE_HOST || '';\nexport const HOST = host.replace(/^\\/|\\/$/g, '');\n\nexport const APP_TITLE "
  },
  {
    "path": "src/lib/helpers/accessKey.js",
    "chars": 2585,
    "preview": "import { proUser, showAd } from '$lib/store/app-stores';\nimport { cookie } from './dataAPI/api-cookie';\n\nconst digestMes"
  },
  {
    "path": "src/lib/helpers/assets.js",
    "chars": 4964,
    "preview": "import { API_HOST, HOST } from '$lib/env';\n\nconst imageModules = import.meta.glob(['@images/**/*'], {\n\tquery: { as: 'pic"
  },
  {
    "path": "src/lib/helpers/audio/audio.js",
    "chars": 1928,
    "preview": "import { browser } from '$app/environment';\nimport { Howl } from 'howler';\nimport { localConfig } from '../dataAPI/api-l"
  },
  {
    "path": "src/lib/helpers/audio/bookflip.js",
    "chars": 34750,
    "preview": "export default 'data:audio/mpeg;base64,SUQzAwAAAAAxJVBSSVYAABCbAABYTVAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpS"
  },
  {
    "path": "src/lib/helpers/audio/camera.js",
    "chars": 24769,
    "preview": "export default 'data:audio/ogg;base64,T2dnUwACAAAAAAAAAAB/g1YyAAAAALMVrUEBHgF2b3JiaXMAAAAAAoC7AAAAAAAAgLUBAAAAAAC4AU9nZ1"
  },
  {
    "path": "src/lib/helpers/audio/changebanner.js",
    "chars": 11357,
    "preview": "export default 'data:audio/ogg;base64,T2dnUwACAAAAAAAAAABxw1SAAAAAAD72xQUBHgF2b3JiaXMAAAAAAUSsAAAAAAAAgDgBAAAAAAC4AU9nZ1"
  },
  {
    "path": "src/lib/helpers/audio/click.js",
    "chars": 9969,
    "preview": "export default 'data:audio/ogg;base64,T2dnUwACAAAAAAAAAAA+6JBpAAAAAKhXSy0BHgF2b3JiaXMAAAAAAUSsAAAAAAAAgDgBAAAAAAC4AU9nZ1"
  },
  {
    "path": "src/lib/helpers/audio/click2.js",
    "chars": 16318,
    "preview": "export default 'data:audio/mpeg;base64,SUQzAwAAAAAxJVBSSVYAABCbAABYTVAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpS"
  },
  {
    "path": "src/lib/helpers/audio/close.js",
    "chars": 6165,
    "preview": "export default 'data:audio/ogg;base64,T2dnUwACAAAAAAAAAADbZvJaAAAAAEeUs7MBHgF2b3JiaXMAAAAAAUSsAAAAAAAAgDgBAAAAAAC4AU9nZ1"
  },
  {
    "path": "src/lib/helpers/audio/collectionitem.js",
    "chars": 16950,
    "preview": "export default 'data:audio/mpeg;base64,SUQzAwAAAAA5PlBSSVYAABS0AABYTVAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpS"
  },
  {
    "path": "src/lib/helpers/audio/exchange.js",
    "chars": 10981,
    "preview": "export default 'data:audio/ogg;base64,T2dnUwACAAAAAAAAAAA5/OJTAAAAAFSLcjEBHgF2b3JiaXMAAAAAAUSsAAAAAAAAgDgBAAAAAAC4AU9nZ1"
  },
  {
    "path": "src/lib/helpers/audio/history.js",
    "chars": 8625,
    "preview": "export default 'data:audio/ogg;base64,T2dnUwACAAAAAAAAAADsoZSAAAAAADy2XagBHgF2b3JiaXMAAAAAAoC7AAAAAAAAgLUBAAAAAAC4AU9nZ1"
  },
  {
    "path": "src/lib/helpers/audio/inventory.js",
    "chars": 14153,
    "preview": "export default 'data:audio/ogg;base64,T2dnUwACAAAAAAAAAADzq3C/AAAAAHyco1EBHgF2b3JiaXMAAAAAAoC7AAAAAAAAgLUBAAAAAAC4AU9nZ1"
  },
  {
    "path": "src/lib/helpers/audio/modal.js",
    "chars": 8501,
    "preview": "export default 'data:audio/ogg;base64,T2dnUwACAAAAAAAAAACRAl+pAAAAAMAoF/IBHgF2b3JiaXMAAAAAAUSsAAAAAAAAgDgBAAAAAAC4AU9nZ1"
  },
  {
    "path": "src/lib/helpers/audio/obtain.js",
    "chars": 16957,
    "preview": "export default 'data:audio/ogg;base64,T2dnUwACAAAAAAAAAABX3phkAAAAAP5r5MYBE09wdXNIZWFkAQI4AYC7AAAAAABPZ2dTAAAAAAAAAAAAAF"
  },
  {
    "path": "src/lib/helpers/audio/prevbanner.js",
    "chars": 21698,
    "preview": "export default 'data:audio/mpeg;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjY1LjEwMQAAAAAAAAAAAAAA//tgAAAAAAAAAAAAAAAAA"
  },
  {
    "path": "src/lib/helpers/audio/roll.js",
    "chars": 9693,
    "preview": "export default 'data:audio/ogg;base64,T2dnUwACAAAAAAAAAADh48kgAAAAAIeVuEABHgF2b3JiaXMAAAAAAUSsAAAAAAAAgDgBAAAAAAC4AU9nZ1"
  },
  {
    "path": "src/lib/helpers/audio/shopnav.js",
    "chars": 7822,
    "preview": "export default 'data:audio/mpeg;base64,//uQxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAXAAAWywAEBAQECQkJCQ4ODg4ONjY2Nk5OTk5gY"
  },
  {
    "path": "src/lib/helpers/audio/shopopen.js",
    "chars": 17193,
    "preview": "export default 'data:audio/ogg;base64,T2dnUwACAAAAAAAAAABmEtb2AAAAAMfoGFABHgF2b3JiaXMAAAAAAUSsAAAAAAAAgDgBAAAAAAC4AU9nZ1"
  },
  {
    "path": "src/lib/helpers/audio/shopsubnav.js",
    "chars": 15422,
    "preview": "export default 'data:audio/mpeg;base64,SUQzAwAAAAA5RFBSSVYAABS6AABYTVAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpS"
  },
  {
    "path": "src/lib/helpers/banner-custom.js",
    "chars": 8031,
    "preview": "import { API_HOST } from '$lib/env';\nimport { BannerManager } from './dataAPI/api-indexeddb';\nimport { initCDNURL } from"
  },
  {
    "path": "src/lib/helpers/banner-loader.js",
    "chars": 3333,
    "preview": "import { beginner } from '$lib/data/banners/beginner.json';\nimport { standard } from '$lib/data/banners/standard.json';\n"
  },
  {
    "path": "src/lib/helpers/browserState.js",
    "chars": 218,
    "preview": "const browserState = {\n\tset(page) {\n\t\thistory.pushState({ page }, null, null);\n\t},\n\tback() {\n\t\tconst currentPage = histo"
  },
  {
    "path": "src/lib/helpers/chat/badword-list.js",
    "chars": 30310,
    "preview": "export const wordlist = [\n\t'4r5e',\n\t'5h1t',\n\t'5hit',\n\t'a55',\n\t'anal',\n\t'anus',\n\t'ar5e',\n\t'arrse',\n\t'arse',\n\t'ass',\n\t'ass"
  },
  {
    "path": "src/lib/helpers/chat/badwords.js",
    "chars": 886,
    "preview": "import { wordlist } from './badword-list';\n\nconst Badwords = {\n\t_filterWord(badword, stringToFilter) {\n\t\tconst wordExp ="
  },
  {
    "path": "src/lib/helpers/chat/firebaseApp.js",
    "chars": 1073,
    "preview": "import { initializeApp } from 'firebase/app';\nimport { initializeAppCheck, ReCaptchaV3Provider } from 'firebase/app-chec"
  },
  {
    "path": "src/lib/helpers/cssPosition.js",
    "chars": 1540,
    "preview": "export const positionToStyle = (position) => {\n\tif (!position) return '';\n\tconst cssProps = ['width', 'height', 'top', '"
  },
  {
    "path": "src/lib/helpers/currencies.js",
    "chars": 1670,
    "preview": "import { currencies } from '$lib/data/pricelist.json';\nimport { pricelist } from '$lib/store/app-stores';\nimport { cooki"
  },
  {
    "path": "src/lib/helpers/dataAPI/api-cookie.js",
    "chars": 1050,
    "preview": "const _getAllCookies = () => {\n\tconst splitted = document.cookie.split('; ');\n\tconst cuuid = splitted.find((row) => row."
  },
  {
    "path": "src/lib/helpers/dataAPI/api-filesystem.js",
    "chars": 5363,
    "preview": "import { AssetManager } from './api-indexeddb';\nimport {\n\tautoExport,\n\tfileData,\n\tfileHandle as storeHandle,\n\tsavingToSy"
  },
  {
    "path": "src/lib/helpers/dataAPI/api-google.js",
    "chars": 4505,
    "preview": "import { API_HOST, GOOGLE_API_KEY, GOOGLE_CLIENT_ID } from '$lib/env';\nimport { cookie } from './api-cookie';\nimport { i"
  },
  {
    "path": "src/lib/helpers/dataAPI/api-indexeddb.js",
    "chars": 3856,
    "preview": "import { browser } from '$app/environment';\nimport { openDB } from 'idb';\n\nconst version = 3;\nconst DBName = 'WishSimula"
  },
  {
    "path": "src/lib/helpers/dataAPI/api-localstore.js",
    "chars": 7423,
    "preview": "export const storageLocal = {\n\tgetData() {\n\t\tconst data = localStorage.getItem('WishSimulator.App');\n\t\tif (!data) return"
  },
  {
    "path": "src/lib/helpers/dataAPI/data-merger.js",
    "chars": 6282,
    "preview": "import { initialAmount, version, wishPhase } from '$lib/data/wish-setup.json';\nimport * as stores from '$lib/store/app-s"
  },
  {
    "path": "src/lib/helpers/dataAPI/export-import.js",
    "chars": 2296,
    "preview": "import { BannerManager, HistoryManager } from './api-indexeddb';\nimport { cookie } from './api-cookie';\nimport { storage"
  },
  {
    "path": "src/lib/helpers/dataAPI/storage-reader.js",
    "chars": 1909,
    "preview": "import { storageVersion, version as siteVersion, wishPhase } from '$lib/data/wish-setup.json';\nimport {\n\tautoskip,\n\tbegi"
  },
  {
    "path": "src/lib/helpers/dataAPI/storage-reset.js",
    "chars": 2286,
    "preview": "import { wishPhase, version, initialAmount, storageVersion } from '$lib/data/wish-setup.json';\nimport { HistoryManager }"
  },
  {
    "path": "src/lib/helpers/dataAPI/sync.js",
    "chars": 725,
    "preview": "import { renewSavedFile } from './api-filesystem';\n\nexport const updateRemoteStorage = ({ to } = {}) => {\n\tif (to === 'l"
  },
  {
    "path": "src/lib/helpers/donation.js",
    "chars": 1047,
    "preview": "const getFromSheet = async () => {\n\ttry {\n\t\tconst data = await fetch(\n\t\t\t'https://opensheet.elk.sh/1qQZXxfa8pKrjFkCh4cLY"
  },
  {
    "path": "src/lib/helpers/gacha/Wish.js",
    "chars": 4094,
    "preview": "import { standard } from '$lib/data/banners/standard.json';\nimport { fatepointManager } from '../dataAPI/api-localstore'"
  },
  {
    "path": "src/lib/helpers/gacha/itemdrop-base.js",
    "chars": 7289,
    "preview": "import { standard } from '$lib/data/banners/standard.json';\nimport { data as weaponsDB } from '$lib/data/weapons.json';\n"
  },
  {
    "path": "src/lib/helpers/gacha/probabilities.js",
    "chars": 1672,
    "preview": "import { probabilityRates } from '$lib/data/wish-setup.json';\nimport { localrate } from '../dataAPI/api-localstore';\n\nex"
  },
  {
    "path": "src/lib/helpers/gacha/roll.js",
    "chars": 3776,
    "preview": "import { beginnerRemaining, showBeginner } from '$lib/store/app-stores';\nimport { HistoryManager } from '../dataAPI/api-"
  },
  {
    "path": "src/lib/helpers/gacha/wishBase.js",
    "chars": 2247,
    "preview": "import weaponsDB from '$lib/data/weapons.json';\nimport charsDB from '$lib/data/characters.json';\n\nconst rand = (array) ="
  },
  {
    "path": "src/lib/helpers/gacha/wishBeginner.js",
    "chars": 837,
    "preview": "import { guaranteedStatus } from '../dataAPI/api-localstore';\nimport { get3StarItem, get4StarItem, get5StarItem, rand } "
  },
  {
    "path": "src/lib/helpers/gacha/wishCharacter.js",
    "chars": 2652,
    "preview": "import { guaranteedStatus, rollCounter } from '../dataAPI/api-localstore';\nimport { prob } from './probabilities';\nimpor"
  },
  {
    "path": "src/lib/helpers/gacha/wishChronicled.js",
    "chars": 3084,
    "preview": "import { chronicledCourse } from '$lib/store/app-stores';\nimport { fatepointManager } from '../dataAPI/api-localstore';\n"
  },
  {
    "path": "src/lib/helpers/gacha/wishStandard.js",
    "chars": 693,
    "preview": "import { get3StarItem, get4StarItem, get5StarItem, rand } from './itemdrop-base';\n\nconst standardWish = {\n\tinit({ stdver"
  },
  {
    "path": "src/lib/helpers/gacha/wishWeapon.js",
    "chars": 4105,
    "preview": "// import { fatePoint, selectedCourse } from '$lib/store/stores';\nimport { course } from '$lib/store/app-stores';\nimport"
  },
  {
    "path": "src/lib/helpers/i18n.js",
    "chars": 1132,
    "preview": "import { browser } from '$app/environment';\nimport { init, register, getLocaleFromNavigator } from 'svelte-i18n';\nimport"
  },
  {
    "path": "src/lib/helpers/lazyload.js",
    "chars": 712,
    "preview": "const options = {\n\troot: null,\n\trootMargin: '0px',\n\tthreshold: 0\n};\n\nexport const lazyLoad = (image, src) => {\n\timage.st"
  },
  {
    "path": "src/lib/helpers/meteor-loader.js",
    "chars": 2717,
    "preview": "import { writable } from 'svelte/store';\nimport { assets } from '$lib/store/app-stores';\nimport { AssetManager } from '."
  },
  {
    "path": "src/lib/helpers/migrator/IDBUpdater.js",
    "chars": 1642,
    "preview": "// import { deleteDB } from 'idb';\nimport { data as charDB } from '$lib/data/characters.json';\nimport { data as wpDB } f"
  },
  {
    "path": "src/lib/helpers/migrator/collect-old-data.js",
    "chars": 4557,
    "preview": "import { HistoryManager } from '../dataAPI/api-indexeddb';\nimport {\n\tguaranteedStatus,\n\tlocalBalance,\n\towneditem,\n\tstora"
  },
  {
    "path": "src/lib/helpers/mobileDetect.js",
    "chars": 3869,
    "preview": "const regex1 = new RegExp(\n\t/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|"
  },
  {
    "path": "src/lib/helpers/nameText.js",
    "chars": 2139,
    "preview": "const getBannerName = (banner) => {\n\tconst split = banner.split('-');\n\treturn { name: split.slice(0, -1).join('-'), numb"
  },
  {
    "path": "src/lib/helpers/noticeMark.js",
    "chars": 562,
    "preview": "import { notice } from '$lib/store/app-stores';\nimport { cookie } from './dataAPI/api-cookie';\n\nconst getNotices = () =>"
  },
  {
    "path": "src/lib/helpers/outfit.js",
    "chars": 1481,
    "preview": "import { outfits } from '$lib/data/outfits.json';\nimport { ownedOutfits } from './dataAPI/api-localstore';\n\nexport const"
  },
  {
    "path": "src/lib/helpers/shareable-link.js",
    "chars": 1644,
    "preview": "const encodeAndMakeLink = (string, path = 'wishitem') => {\n\tconst encoded = window.btoa(string);\n\tconst link = `${window"
  },
  {
    "path": "src/lib/helpers/timeago.js",
    "chars": 2598,
    "preview": "//Date Formats must be be ordered smallest -> largest and must end in a format with ceiling of null\nconst date_formats ="
  },
  {
    "path": "src/lib/helpers/toast.js",
    "chars": 579,
    "preview": "import { toastMsg } from '$lib/store/app-stores';\n\nexport const pushToast = ({\n\ttype = 'info',\n\tdismissible = false,\n\tau"
  },
  {
    "path": "src/lib/helpers/transition.js",
    "chars": 337,
    "preview": "import { crossfade } from 'svelte/transition';\nimport { cubicOut } from 'svelte/easing';\n\nexport const [morphOut, morphI"
  },
  {
    "path": "src/lib/helpers/wakeLock.js",
    "chars": 553,
    "preview": "let screenLock;\n\nconst wakelockHandle = async ({ release = false } = {}) => {\n\ttry {\n\t\tif (!release) {\n\t\t\tscreenLock = a"
  },
  {
    "path": "src/lib/store/app-stores.js",
    "chars": 1765,
    "preview": "import { writable } from 'svelte/store';\nimport { initialAmount, version, wishPhase } from '$lib/data/wish-setup.json';\n"
  },
  {
    "path": "src/lib/store/drive-store.js",
    "chars": 214,
    "preview": "import { writable } from 'svelte/store';\n\nexport const isSignedIn = writable(false);\nexport const syncProccess = writabl"
  },
  {
    "path": "src/lib/store/filesystem-store.js",
    "chars": 213,
    "preview": "import { writable } from 'svelte/store';\n\nexport const fileData = writable({});\nexport const fileHandle = writable(null)"
  },
  {
    "path": "src/locales/README.md",
    "chars": 6741,
    "preview": "# Guide to Add new Locale\n\n1. To add a language, just duplicate `en-US.json`, rename to your locale then edit it, change"
  },
  {
    "path": "src/locales/de-DE.json",
    "chars": 42812,
    "preview": "{\n\t\"title\": \"Genshin Impact Gebets-Simulator\",\n\t\"item\": \"Item\",\n\t\"character\": \"Charakter\",\n\t\"weapon\": \"Waffe\",\n\t\"vision\""
  },
  {
    "path": "src/locales/en-US.json",
    "chars": 39564,
    "preview": "{\n\t\"title\": \"Genshin Impact Wish Simulator\",\n\t\"item\": \"Item\",\n\t\"character\": \"Character\",\n\t\"weapon\": \"Weapon\",\n\t\"vision\":"
  },
  {
    "path": "src/locales/fr-FR.json",
    "chars": 41408,
    "preview": "{\n\t\"title\": \"Simulateur de vœux Genshin Impact\",\n\t\"item\": \"Item\",\n\t\"character\": \"Personnage\",\n\t\"weapon\": \"Arme\",\n\t\"visio"
  },
  {
    "path": "src/locales/id-ID.json",
    "chars": 40810,
    "preview": "{\n\t\"title\": \"Simulator Permohonan Genshin Impact\",\n\t\"item\": \"Item\",\n\t\"character\": \"Karakter\",\n\t\"weapon\": \"Senjata\",\n\t\"vi"
  },
  {
    "path": "src/locales/it-IT.json",
    "chars": 41297,
    "preview": "{\n\t\"title\": \"Genshin Impact Wish Simulator\",\n\t\"item\": \"Oggetto\",\n\t\"character\": \"Personaggio\",\n\t\"weapon\": \"Arma\",\n\t\"visio"
  },
  {
    "path": "src/locales/items/de-DE.json",
    "chars": 13652,
    "preview": "{\n\t\"a-thousand-blazing-suns\": \"Die tausend flammenden Sonnen\",\n\t\"a-thousand-floating-dreams\": \"Fließende Träume von taus"
  },
  {
    "path": "src/locales/items/en-US.json",
    "chars": 13225,
    "preview": "{\n\t\"a-thousand-blazing-suns\": \"A Thousand Blazing Suns\",\n\t\"a-thousand-floating-dreams\": \"A Thousand Floating Dreams\",\n\t\""
  },
  {
    "path": "src/locales/items/it-IT.json",
    "chars": 14266,
    "preview": "{\r\n\t\"a-thousand-blazing-suns\": \"Mille soli ardenti\",\r\n\t\"a-thousand-floating-dreams\": \"Mille sogni fluttuanti\",\r\n\t\"absolu"
  },
  {
    "path": "src/locales/items/ja-JP.json",
    "chars": 9975,
    "preview": "{\n\t\"a-thousand-blazing-suns\": \"千烈の日輪\",\n\t\"a-thousand-floating-dreams\": \"千夜に浮かぶ夢\",\n\t\"absolution\": \"赦罪\",\n\t\"akuoumaru\": \"惡王丸"
  },
  {
    "path": "src/locales/items/ko-KR.json",
    "chars": 10292,
    "preview": "{\n\t\"a-thousand-blazing-suns\": \"타오르는 천 개의 태양\",\n\t\"a-thousand-floating-dreams\": \"떠오르는 천일 밤의 꿈\",\n\t\"absolution\": \"사면\",\n\t\"akuo"
  },
  {
    "path": "src/locales/items/pt-BR.json",
    "chars": 13732,
    "preview": "{\n\t\"a-thousand-blazing-suns\": \"Mil Sóis Ardentes\",\n\t\"a-thousand-floating-dreams\": \"Sonhos Flutuantes das Mil Noites\",\n\t\""
  },
  {
    "path": "src/locales/items/ru-RU.json",
    "chars": 13007,
    "preview": "{\n\t\"a-thousand-blazing-suns\": \"Тысяча ослепительных солнц\",\n\t\"a-thousand-floating-dreams\": \"Сновидения тысячи ночей\",\n\t\""
  },
  {
    "path": "src/locales/items/vi-VN.json",
    "chars": 12923,
    "preview": "{\n\t\"a-thousand-blazing-suns\": \"Thiên Dương Rực Lửa\",\n\t\"a-thousand-floating-dreams\": \"Cõi Mộng Ngàn Đêm\",\n\t\"absolution\": "
  },
  {
    "path": "src/locales/items/zh-CN.json",
    "chars": 9536,
    "preview": "{\n\t\"a-thousand-blazing-suns\": \"焚曜千阳\",\n\t\"a-thousand-floating-dreams\": \"千夜浮梦\",\n\t\"absolution\": \"赦罪\",\n\t\"akuoumaru\": \"恶王丸\",\n\t"
  },
  {
    "path": "src/locales/items/zh-TW.json",
    "chars": 9540,
    "preview": "{\n\t\"a-thousand-blazing-suns\": \"焚曜千陽\",\n\t\"a-thousand-floating-dreams\": \"千夜浮夢\",\n\t\"absolution\": \"赦罪\",\n\t\"akuoumaru\": \"惡王丸\",\n\t"
  },
  {
    "path": "src/locales/ja-JP.json",
    "chars": 24458,
    "preview": "{\n\t\"title\": \"原神祈願シミュ\",\n\t\"item\": \"アイテム\",\n\t\"character\": \"キャラクター\",\n\t\"weapon\": \"武器\",\n\t\"vision\": \"神の目\",\n\t\"anemo\": \"風\",\n\t\"cryo"
  },
  {
    "path": "src/locales/ko-KR.json",
    "chars": 32495,
    "preview": "{\n\t\"title\": \"원신 기원 시뮬레이터\",\n\t\"item\": \"아이템\",\n\t\"character\": \"캐릭터\",\n\t\"weapon\": \"무기\",\n\t\"vision\": \"신의 눈\",\n\t\"anemo\": \"바람\",\n\t\"cr"
  },
  {
    "path": "src/locales/pt-BR.json",
    "chars": 40686,
    "preview": "{\n\t\"title\": \"Simulador De Orações Do Genshin Impact\",\n\t\"item\": \"Item\",\n\t\"character\": \"Personagem\",\n\t\"weapon\": \"Arma\",\n\t\""
  },
  {
    "path": "src/locales/ru-RU.json",
    "chars": 38755,
    "preview": "{\n\t\"title\": \"Симулятор молитв Genshin Impact\",\n\t\"item\": \"Предмет\",\n\t\"character\": \"персонажей\",\n\t\"weapon\": \"Оружие\",\n\t\"vi"
  },
  {
    "path": "src/locales/th-TH.json",
    "chars": 37723,
    "preview": "{\n\t\"title\": \"Genshin Impact Wish Simulator\",\n\t\"item\": \"สิ่งของ\",\n\t\"character\": \"ตัวละคร\",\n\t\"weapon\": \"อาวุธ\",\n\t\"vision\":"
  },
  {
    "path": "src/locales/vi-VN.json",
    "chars": 39017,
    "preview": "{\n\t\"title\": \"Giả Lập Cầu Nguyện Genshin Impact\",\n\t\"item\": \"Item\",\n\t\"character\": \"Nhân Vật\",\n\t\"weapon\": \"Vũ Khí\",\n\t\"visio"
  },
  {
    "path": "src/locales/zh-CN.json",
    "chars": 26497,
    "preview": "{\n\t\"title\": \"原神祈愿模拟器\",\n\t\"item\": \"物品\",\n\t\"character\": \"角色\",\n\t\"weapon\": \"武器\",\n\t\"vision\": \"神之眼\",\n\t\"anemo\": \"风\",\n\t\"cryo\": \"冰\""
  },
  {
    "path": "src/locales/zh-TW.json",
    "chars": 26584,
    "preview": "{\n\t\"title\": \"原神祈願模擬器\",\n\t\"item\": \"物品\",\n\t\"character\": \"角色\",\n\t\"weapon\": \"武器\",\n\t\"vision\": \"神之眼\",\n\t\"anemo\": \"風\",\n\t\"cryo\": \"冰\""
  },
  {
    "path": "src/post/banner-guidelines.md",
    "chars": 2338,
    "preview": "As I expected, after a period of monitoring Custom Banner features, I found that a lot of users shared inappropriate con"
  },
  {
    "path": "src/post/install-android.md",
    "chars": 2044,
    "preview": "# How To Install WishSimulator.App to your <span> Android Phone</span>\n\n## Why I need to Install it ?\n\nYou are not requi"
  }
]

// ... and 154 more files (download for full content)

About this extraction

This page contains the full source code of the Mantan21/Genshin-Impact-Wish-Simulator GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 354 files (1.9 MB), approximately 782.0k tokens, and a symbol index with 129 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!