<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Admin</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    <script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js"></script>
        <style>
        a.navbar-item:hover { background-color: rgba(255,255,255,0.1) !important; }
        .navbar-end .navbar-item {
            min-width: 150px;
            justify-content: center;
        }
        </style>
    <style>
        :root { 
            --header-font-color: {{ data.settings.header_font_color|default('#FFFFFF') }};
            --header-inactive-font-color: {{ data.settings.header_inactive_font_color|default('#C0C0C0') }};
        }
        body { 
            background-color: #333; min-height: 100vh;
            {% if data.settings.bg_image %}
            background-image: url('/static/uploads/{{ data.settings.bg_image }}');
            background-size: cover; background-position: center; background-attachment: fixed;
            {% endif %}
        }
        .body-overlay { background-color: rgba(255, 255, 255, {{ data.settings.overlay_opacity }}); min-height: 100vh; }

        .box-nested { border-left: 4px solid var(--theme-color, #3273dc); background-color: #fafafa; }
        .box-link { border-left: 4px solid #48c774; margin-bottom: 0.5rem; background: white; cursor: grab; }
        .box-link:active { cursor: grabbing; }
        .card-header { cursor: grab; }
        .card-header:active { cursor: grabbing; }
        
        /* Admin Main Tabs Styling */
        #main-admin-tabs.is-boxed a {
            color: var(--header-inactive-font-color); /* Inactive tabs get inactive header color */
        }
        #main-admin-tabs.is-boxed li.is-active a {
            color: var(--theme-color); /* Use theme color for active tab text for better contrast */
        }
        
        /* Bunte Icons Grid */
        .icon-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(80px, 1fr)); gap: 10px; max-height: 400px; overflow-y: auto; padding: 10px; }
        .icon-option { cursor: pointer; border: 1px solid #ddd; border-radius: 4px; padding: 10px; text-align: center; display: flex; flex-direction: column; align-items: center; justify-content: center; height: 80px; }
        .icon-option:hover { background-color: #f0f0f0; border-color: #aaa; }
        .icon-option img { max-height: 40px; margin-bottom: 5px; }
        .icon-option i { font-size: 2rem; margin-bottom: 5px; color: #555; }
        .icon-option span { font-size: 0.7rem; color: #666; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; width: 100%; }
        
        /* Modals */
        #editModal { z-index: 1000; }
        #iconModal { z-index: 2000; } 
    </style>
</head>
<body style="--theme-color: {{ data.settings.theme_color }}">
    <div class="body-overlay">
    
    <nav class="navbar" style="background-color: {{ data.settings.header_color }}; box-shadow: 0 2px 10px rgba(0,0,0,0.3);">
        <div class="navbar-brand">
            <a class="navbar-item" href="/" style="color: {{ data.settings.header_font_color|default('#FFFFFF') }}">
                {% if data.settings.logo_image %}
                <img src="/static/uploads/{{ data.settings.logo_image }}" style="max-height: 2.5rem; margin-right: 10px;">
                {% endif %}
                <strong>{{ data.settings.title }} - Admin</strong>
            </a>
        </div>
        <div class="navbar-end">
            <a href="/" class="navbar-item" style="color: {{ data.settings.header_font_color|default('#FFFFFF') }}">Zum Dashboard</a>
            <a href="/logout" class="navbar-item" style="color: {{ data.settings.header_font_color|default('#FFFFFF') }}">Abmelden</a>
        </div>
    </nav>

    <section class="section">
        <div class="container">
            <div class="tabs is-boxed" id="main-admin-tabs">
                <ul>
                    <li class="{% if not request.args.get('tab') == 'settings' and not request.args.get('tab') == 'media' %}is-active{% endif %}"><a href="#" onclick="switchTab(event, 'tab-pages')">Seiten</a></li>
                    <li class="{% if request.args.get('tab') == 'settings' %}is-active{% endif %}"><a href="#" onclick="switchTab(event, 'tab-settings')">Einstellungen</a></li>
                    <li class="{% if request.args.get('tab') == 'media' %}is-active{% endif %}"><a href="#" onclick="switchTab(event, 'tab-media')">Medien</a></li>
                </ul>
            </div>

            <div id="tab-settings" class="tab-content {% if not request.args.get('tab') == 'settings' %}is-hidden{% endif %}">
                <div class="box">
                    <form action="/admin/update_settings" method="POST" enctype="multipart/form-data">
                        <div class="columns">
                            <div class="column">
                                <label class="label">Titel</label><input class="input mb-3" type="text" name="title" value="{{ data.settings.title }}">
                                <label class="label">Header Farbe</label><input class="input mb-3" type="color" name="header_color" value="{{ data.settings.header_color }}">
                                <label class="label">Header Schriftfarbe</label><input class="input mb-3" type="color" name="header_font_color" value="{{ data.settings.header_font_color|default('#FFFFFF') }}">
                                <label class="label">Header Schriftfarbe (Inaktiv)</label><input class="input mb-3" type="color" name="header_inactive_font_color" value="{{ data.settings.header_inactive_font_color|default('#C0C0C0') }}">
                                <label class="label">Logo Upload</label>
                                <div class="file has-name mb-3"><label class="file-label"><input class="file-input" type="file" name="logo_file" accept="image/*"><span class="file-cta"><i class="fas fa-upload"></i></span><span class="file-label">Logo...</span></label></div>
                                {% if data.settings.logo_image %}
                                <div class="mb-3"><img src="/static/uploads/{{ data.settings.logo_image }}" style="max-height: 50px; border: 1px solid #ddd; padding: 2px;"></div>
                                {% endif %}
                            </div>
                            <div class="column">
                                <label class="label">Hintergrundbild</label>
                                <div class="file has-name mb-3"><label class="file-label"><input class="file-input" type="file" name="bg_file" accept="image/*"><span class="file-cta"><i class="fas fa-upload"></i></span><span class="file-label">BG...</span></label></div>
                                {% if data.settings.bg_image %}
                                <div class="mb-3"><img src="/static/uploads/{{ data.settings.bg_image }}" style="max-height: 100px; max-width: 100%; border: 1px solid #ddd; padding: 2px;"></div>
                                {% endif %}
                                <label class="label">Hintergrund Deckkraft</label>
                                <input type="range" name="overlay_opacity" min="0" max="1" step="0.05" value="{{ data.settings.overlay_opacity }}" style="width: 100%;">
                                <p class="help mb-3">Links: Klar | Rechts: Weiß</p>
                                <label class="label">Spaltenbreite</label>
                                <div class="select is-fullwidth mb-3"><select name="columns">
                                    <option value="is-one-third-desktop" {% if data.settings.columns == 'is-one-third-desktop' %}selected{% endif %}>3 Spalten</option>
                                    <option value="is-one-quarter-desktop" {% if data.settings.columns == 'is-one-quarter-desktop' %}selected{% endif %}>4 Spalten</option>
                                    <option value="is-one-fifth-desktop" {% if data.settings.columns == 'is-one-fifth-desktop' %}selected{% endif %}>5 Spalten</option>
                                </select></div>
                                <label class="label">Theme Farbe</label><input class="input" type="color" name="theme_color" value="{{ data.settings.theme_color }}">
                                <label class="label">Glas Effekt</label>
                                <input type="range" name="box_glassiness" min="0" max="1" step="0.05" value="{{ data.settings.box_glassiness|default(0.5) }}" style="width: 100%;">
                                <p class="help mb-3">Links: Klar | Rechts: Voll</p>
                                <label class="label">Gruppen Hintergrundfarbe</label><input class="input mb-3" type="color" name="group_bg_color" value="{{ data.settings.group_bg_color|default('#FFFFFF') }}">
                                <label class="label">Gruppentitel Schriftfarbe</label><input class="input mb-3" type="color" name="group_title_font_color" value="{{ data.settings.group_title_font_color|default('#FFFFFF') }}">
                            </div>
                        </div>
                        <button class="button is-primary">Speichern</button>
                    </form>
                </div>

            </div>

            <div id="tab-media" class="tab-content {% if not request.args.get('tab') == 'media' %}is-hidden{% endif %}">
                <div class="box">
                    <h2 class="title is-5">Medienverwaltung</h2>
                    <table class="table is-fullwidth is-striped">
                        <thead>
                            <tr><th>Vorschau</th><th>Dateiname</th><th>Größe</th><th>Typ</th><th>Aktion</th></tr>
                        </thead>
                        <tbody id="mediaTableBody">
                            <tr><td colspan="5" class="has-text-centered">Wird geladen...</td></tr>
                        </tbody>
                    </table>
                </div>
            </div>
            
            <div id="tab-pages" class="tab-content {% if request.args.get('tab') == 'settings' or request.args.get('tab') == 'media' %}is-hidden{% endif %}">
                <div class="box">
                    <form action="{{ url_for('add_page') }}" method="POST" enctype="multipart/form-data" class="field has-addons">
                        <div class="control is-expanded"><input class="input" type="text" name="name" placeholder="Neue Seite" required></div>
                        <div class="control"><input class="input" type="text" name="icon_text" placeholder="Icon URL" style="width:130px"></div>
                        <div class="control"><button type="button" class="button" onclick="openIconModal(this)"><i class="fas fa-search"></i></button></div>
                        <div class="control"><div class="file is-primary"><label class="file-label"><input class="file-input" type="file" name="icon_file"><span class="file-cta"><i class="fas fa-upload"></i></span></label></div></div>
                        <div class="control"><button class="button is-primary">Hinzufügen</button></div>
                    </form>
                </div>

                <div id="pages-list">
                {% for page in data.pages %}
                <div class="card mb-5 page-item" data-id="{{ page.id }}">
                    <header class="card-header has-background-light">
                        <p class="card-header-title">
                            <i class="fas fa-grip-lines mr-3 has-text-grey-light"></i>
                            {% if page.icon %}
                                {% if '.' in page.icon or '/' in page.icon %}
                                    <img src="{{ url_for('static', filename='uploads/' + page.icon) if not page.icon.startswith('http') else page.icon }}" style="max-height:20px; margin-right: 8px;">
                                {% else %}
                                    <i class="{{ page.icon }} mr-2"></i>
                                {% endif %}
                            {% endif %}
                            {{ page.name }}
                        </p>
                        <a href="#" class="card-header-icon" onclick="openPageEditModal(event, {{ page.id }}, '{{ page.name }}', '{{ page.icon|default('') }}')">
                            <span class="icon"><i class="fas fa-pen"></i></span>
                        </a>
                        <a href="{{ url_for('delete_page', page_id=page.id) }}" class="card-header-icon has-text-danger" onclick="return confirm('Sicher, dass du diese Seite löschen willst?')"><i class="fas fa-trash"></i></a>
                    </header>
                    <div class="card-content">
                        <!-- Page Widgets -->
                        <div class="mb-5 pb-4" style="border-bottom: 1px solid #eee;">
                            <h6 class="subtitle is-6 has-text-grey mb-2">Seiten-Widgets</h6>
                            <div class="widgets-list mb-3">
                                {% for widget in page.widgets %}
                                {% set w_config = widget.config | json_loads %}
                                <div class="notification is-light is-warning py-2 px-3 mb-2">
                                    <div class="level is-mobile">
                                        <div class="level-left">
                                            <div>
                                                <strong>{{ widget.type }}</strong>
                                                <small class="has-text-grey-light"> (ID: {{ widget.id }})</small>
                                            </div>
                                        </div>
                                        <div class="level-right">
                                            {% if widget.type == 'pihole_status' %}
                                                <a href="#" class="mr-3 has-text-info" onclick="openEditWidgetModal(event, {{ widget.id }}, '{{ widget.type }}', '{{ w_config.api_url|default('') }}', '{{ w_config.api_key|default('') }}')"><i class="fas fa-pen"></i></a>
                                            {% elif widget.type == 'openmeteo_weather' %}
                                                <a href="#" class="mr-3 has-text-info" onclick="openEditWidgetModal(event, {{ widget.id }}, '{{ widget.type }}', '{{ w_config.latitude|default('') }}', '{{ w_config.longitude|default('') }}')"><i class="fas fa-pen"></i></a>
                                            {% elif widget.type == 'iframe_widget' %}
                                                <a href="#" class="mr-3 has-text-info" onclick="openEditWidgetModal(event, {{ widget.id }}, '{{ widget.type }}', '{{ w_config.url|default('') }}', '{{ w_config.height|default('300') }}')"><i class="fas fa-pen"></i></a>
                                            {% endif %}
                                            <a href="{{ url_for('delete_widget', widget_id=widget.id) }}" class="has-text-danger" onclick="return confirm('Sicher, dass du dieses Widget löschen willst?')"><i class="fas fa-times"></i></a>
                                        </div>
                                    </div>
                                </div>
                                {% endfor %}
                            </div>

                            <form action="{{ url_for('add_widget', page_id=page.id) }}" method="POST" onsubmit="return handleWidgetForm(this);">
                                <div class="field has-addons">
                                    <div class="control">
                                        <div class="select is-small">
                                            <select name="type" onchange="toggleWidgetFields(this)">
                                                <option value="">-- Widget hinzufügen --</option>
                                                                                            <option value="pihole_status">Pi-hole Status</option>
                                                                                            <option value="openmeteo_weather">Wetter (OpenMeteo)</option>
                                                                                            <option value="iframe_widget">Iframe</option>
                                                                                        </select>
                                                                                    </div>
                                                                                </div>
                                                                                <div class="control">
                                                                                    <button class="button is-warning is-small" type="submit">Hinzufügen</button>
                                                                                </div>
                                                                            </div>
                                                                            <div class="widget-fields mt-2" data-widget-type="pihole_status" style="display: none;">
                                                                                <div class="field">
                                                                                    <p class="control"><input class="input is-small" type="text" name="pihole_api_url" placeholder="Pi-hole API URL (z.B. http://pi.hole/api)"></p>
                                                                                </div>
                                                                                <div class="field">
                                                                                    <p class="control"><input class="input is-small" type="text" name="pihole_api_key" placeholder="Pi-hole API Key (optional)"></p>
                                                                                </div>
                                                                            </div>
                                                                            <div class="widget-fields mt-2" data-widget-type="openmeteo_weather" style="display: none;">
                                                                                <div class="field has-addons">
                                                                                    <p class="control"><input class="input is-small" type="text" name="weather_lat" placeholder="Breitengrad (Lat)"></p>
                                                                                    <p class="control"><input class="input is-small" type="text" name="weather_lon" placeholder="Längengrad (Lon)"></p>
                                                                                </div>
                                                                            </div>
                                                                            <div class="widget-fields mt-2" data-widget-type="iframe_widget" style="display: none;">
                                                                                <div class="field has-addons">
                                                                                    <p class="control is-expanded"><input class="input is-small" type="text" name="iframe_url" placeholder="URL (https://...)"></p>
                                                                                    <p class="control"><input class="input is-small" type="text" name="iframe_height" placeholder="Höhe (z.B. 300)" value="300"></p>
                                                                                </div>
                                                                            </div>
                                                                        </form>                        </div>

                        <form action="{{ url_for('add_group', page_id=page.id) }}" method="POST" enctype="multipart/form-data" class="mb-4">
                            <div class="field has-addons">
                                <div class="control is-expanded"><input class="input is-small" type="text" name="name" placeholder="Neue Gruppe" required></div>
                                <div class="control"><input class="input is-small" type="text" name="icon_text" placeholder="Icon Class/URL" style="width: 120px;"></div>
                                <div class="control"><button type="button" class="button is-small" onclick="openIconModal(this)"><i class="fas fa-search"></i></button></div>
                                <div class="control"><button class="button is-info is-small is-outlined">Add</button></div>
                            </div>
                        </form>

                        <div class="groups-list" id="groups-list-{{ page.id }}" data-page-id="{{ page.id }}">
                        {% for group in page.groups %}
                        <div class="box box-nested group-item" data-id="{{ group.id }}">
                            <div class="level is-mobile mb-2" style="cursor: grab;">
                                <div class="level-left">
                                    <i class="fas fa-grip-lines mr-2 has-text-grey-light"></i>
                                    {% if group.icon %}
                                        {% if '.' in group.icon or '/' in group.icon %}
                                            <img src="{{ url_for('static', filename='uploads/' + group.icon) if not group.icon.startswith('http') else group.icon }}" style="max-height:20px; margin-right: 8px;">
                                        {% else %}
                                            <i class="{{ group.icon }} mr-2"></i>
                                        {% endif %}
                                    {% endif %}
                                    <strong>{{ group.name }}</strong>
                                </div>
                                <div class="level-right">
                                    <a href="#" class="is-size-7 mr-2" onclick="openGroupEditModal(event, {{ group.id }}, '{{ group.name }}', '{{ group.icon|default('') }}', {{ group.page_id }})">
                                        <span class="icon"><i class="fas fa-pen"></i></span>
                                    </a>
                                    <a href="{{ url_for('delete_group', group_id=group.id) }}" class="has-text-danger is-size-7" onclick="return confirm('Sicher?')"><i class="fas fa-trash"></i></a>
                                </div>
                            </div>

                            <div class="links-list" id="links-list-{{ group.id }}" data-group-id="{{ group.id }}">
                            {% for link in group.links %}
                            <div class="notification box-link py-2 px-3 link-item" data-id="{{ link.id }}">
                                <div class="level is-mobile mb-0">
                                    <div class="level-left">
                                        <div style="display:flex; align-items:center;">
                                            <span class="mr-2 has-text-grey-light"><i class="fas fa-grip-vertical"></i></span>
                                            <span class="mr-3" style="width:24px; text-align:center;">
                                                {% if link.icon %}
                                                    {% if '.' in link.icon or '/' in link.icon %}
                                                        <img src="{{ url_for('static', filename='uploads/' + link.icon) if not link.icon.startswith('http') else link.icon }}" style="max-height:20px;">
                                                    {% else %}
                                                        <i class="{{ link.icon }}"></i>
                                                    {% endif %}
                                                {% endif %}
                                            </span>
                                            <div>
                                                <strong>{{ link.name }}</strong>
                                                {% if link.subtitle %}<br><small class="has-text-grey-light">{{ link.subtitle }}</small>{% endif %}
                                            </div>
                                        </div>
                                    </div>
                                    <div class="level-right">
                                        <a href="#" class="mr-3 has-text-info" onclick="openEditModal(event, {{ link.id }}, '{{ link.name }}', '{{ link.url }}', '{{ link.icon }}', '{{ link.subtitle }}', '{{ link.target }}', {{ group.id }})"><i class="fas fa-pen"></i></a>
                                        <a href="{{ url_for('delete_link', link_id=link.id) }}" class="has-text-danger" onclick="return confirm('Sicher?')"><i class="fas fa-times"></i></a>
                                    </div>
                                </div>
                            </div>
                            {% endfor %}
                            </div> <!-- End Links List -->

                            <form action="{{ url_for('add_link', group_id=group.id) }}" method="POST" enctype="multipart/form-data" class="mt-3">
                                <div class="field is-grouped is-grouped-multiline">
                                    <div class="control is-expanded"><input class="input is-small" type="text" name="name" placeholder="Name" required></div>
                                    <div class="control is-expanded"><input class="input is-small" type="text" name="url" placeholder="URL" required></div>
                                    <div class="control is-expanded"><input class="input is-small" type="text" name="subtitle" placeholder="Beschreibung"></div>
                                    <div class="control">
                                        <div class="select is-small">
                                            <select name="target">
                                                <option value="_self" selected>Gleicher Tab</option>
                                                <option value="_blank">Neuer Tab</option>
                                            </select>
                                        </div>
                                    </div>
                                    <div class="control">
                                        <div class="field has-addons">
                                            <div class="control"><input class="input is-small icon-input-text" type="text" name="icon_text" placeholder="Icon/URL"></div>
                                            <div class="control"><button type="button" class="button is-small" onclick="openIconModal(this)"><i class="fas fa-search"></i></button></div>
                                        </div>
                                    </div>
                                    <div class="control">
                                         <div class="file is-small">
                                            <label class="file-label"><input class="file-input" type="file" name="icon_file"><span class="file-cta"><i class="fas fa-upload"></i></span></label>
                                        </div>
                                    </div>
                                    <div class="control"><button class="button is-success is-small">+</button></div>
                                </div>
                            </form>

                        </div>
                        {% endfor %}
                        </div> <!-- End Groups List -->
                    </div>
                </div>
                {% endfor %}
                </div> <!-- End Pages List -->
            </div>
        </div>
    </section>
        </div>
    </section>

    <div class="modal" id="iconModal">
        <div class="modal-background" onclick="closeModal('iconModal')"></div>
        <div class="modal-card" style="width: 800px; max-width: 95%;">
            <header class="modal-card-head"><p class="modal-card-title">Icon Manager</p><button class="delete" onclick="closeModal('iconModal')"></button></header>
            <section class="modal-card-body">
                <div class="tabs is-boxed">
                    <ul>
                        <li class="is-active"><a href="#" onclick="switchIconTab(event, 'tab-preset')">Homelab Icons</a></li>
                        <li><a href="#" onclick="switchIconTab(event, 'tab-fontawesome')">Fontawesome</a></li>
                        <li><a href="#" onclick="switchIconTab(event, 'tab-custom')">Eigene Uploads</a></li>
                    </ul>
                </div>
                
                <input class="input mb-3" type="text" id="iconSearch" placeholder="Suche..." onkeyup="filterIcons()">

                <div id="tab-preset" class="icon-tab-content icon-grid"></div>
                <div id="tab-fontawesome" class="icon-tab-content icon-grid is-hidden"></div>
                <div id="tab-custom" class="icon-tab-content icon-grid is-hidden"><p class="has-text-grey-light p-4" id="custom-loader">Lade eigene Icons...</p></div>
            </section>
        </div>
    </div>

    <div class="modal" id="editModal">
        <div class="modal-background" onclick="closeModal('editModal')"></div>
        <div class="modal-card">
            <header class="modal-card-head"><p class="modal-card-title">Bearbeiten</p><button class="delete" onclick="closeModal('editModal')"></button></header>
            <form id="editForm" method="POST" enctype="multipart/form-data">
                <section class="modal-card-body">
                    <div class="field"><label class="label">Name</label><div class="control"><input class="input" type="text" name="name" id="editName" required></div></div>
                    <div class="field"><label class="label">URL</label><div class="control"><input class="input" type="text" name="url" id="editUrl" required></div></div>
                    <div class="field"><label class="label">Beschreibung</label><div class="control"><input class="input" type="text" name="subtitle" id="editSubtitle"></div></div>
                    
                    <div class="field">
                        <label class="label">Gruppe (Verschieben)</label>
                        <div class="select is-fullwidth">
                            <select name="group_id" id="editGroupId">
                                <!-- Populated by JS -->
                            </select>
                        </div>
                    </div>

                    <div class="field">
                        <label class="label">Icon (Text/URL oder Upload)</label>
                        <div class="field has-addons">
                            <div class="control is-expanded"><input class="input" type="text" name="icon_text" id="editIcon"></div>
                            <div class="control"><button type="button" class="button" onclick="openIconModal(this)"><i class="fas fa-search"></i></button></div>
                        </div>
                        <div class="file is-fullwidth mt-2">
                            <label class="file-label"><input class="file-input" type="file" name="icon_file"><span class="file-cta"><span class="file-icon"><i class="fas fa-upload"></i></span><span class="file-label">Neues Bild hochladen (optional)</span></span></label>
                        </div>
                    </div>

                    <div class="field"><label class="label">Ziel</label><div class="select is-fullwidth"><select name="target" id="editTarget"><option value="_self">Gleicher Tab</option><option value="_blank">Neuer Tab</option></select></div></div>
                </section>
                <footer class="modal-card-foot"><button class="button is-success">Speichern</button><button type="button" class="button" onclick="closeModal('editModal')">Abbrechen</button></footer>
            </form>
        </div>
    </div>

    <div class="modal" id="editPageModal">
        <div class="modal-background" onclick="closeModal('editPageModal')"></div>
        <div class="modal-card">
            <header class="modal-card-head">
                <p class="modal-card-title">Seite bearbeiten</p>
                <button class="delete" onclick="closeModal('editPageModal')"></button>
            </header>
            <form id="editPageForm" method="POST" enctype="multipart/form-data">
                <section class="modal-card-body">
                    <div class="field">
                        <label class="label">Seitenname</label>
                        <div class="control"><input class="input" type="text" name="name" id="editPageName" required></div>
                    </div>
                    
                    <div class="field">
                        <label class="label">Icon (Text/URL oder Upload)</label>
                        <div class="field has-addons">
                            <div class="control is-expanded"><input class="input" type="text" name="icon_text" id="editPageIcon"></div>
                            <div class="control"><button type="button" class="button" onclick="openIconModal(this)"><i class="fas fa-search"></i></button></div>
                        </div>
                        <div class="file is-fullwidth mt-2">
                            <label class="file-label">
                                <input class="file-input" type="file" name="icon_file">
                                <span class="file-cta">
                                    <span class="file-icon"><i class="fas fa-upload"></i></span>
                                    <span class="file-label">Neues Icon hochladen...</span>
                                </span>
                            </label>
                        </div>
                    </div>
                </section>
                <footer class="modal-card-foot">
                    <button class="button is-success">Speichern</button>
                    <button type="button" class="button" onclick="closeModal('editPageModal')">Abbrechen</button>
                </footer>
            </form>
        </div>
    </div>

    <div class="modal" id="editGroupModal">
        <div class="modal-background" onclick="closeModal('editGroupModal')"></div>
        <div class="modal-card">
            <header class="modal-card-head">
                <p class="modal-card-title">Gruppe bearbeiten</p>
                <button class="delete" onclick="closeModal('editGroupModal')"></button>
            </header>
            <form id="editGroupForm" method="POST" enctype="multipart/form-data">
                <section class="modal-card-body">
                    <div class="field">
                        <label class="label">Gruppenname</label>
                        <div class="control"><input class="input" type="text" name="name" id="editGroupName" required></div>
                    </div>
                    
                    <div class="field">
                        <label class="label">Seite (Verschieben)</label>
                        <div class="select is-fullwidth">
                            <select name="page_id" id="editGroupPageId">
                                <!-- Populated by JS -->
                            </select>
                        </div>
                    </div>
                    
                    <div class="field">
                        <label class="label">Icon (Text/URL oder Upload)</label>
                        <div class="field has-addons">
                            <div class="control is-expanded"><input class="input" type="text" name="icon_text" id="editGroupIcon"></div>
                            <div class="control"><button type="button" class="button" onclick="openIconModal(this)"><i class="fas fa-search"></i></button></div>
                        </div>
                        <div class="file is-fullwidth mt-2">
                            <label class="file-label">
                                <input class="file-input" type="file" name="icon_file">
                                <span class="file-cta">
                                    <span class="file-icon"><i class="fas fa-upload"></i></span>
                                    <span class="file-label">Neues Icon hochladen...</span>
                                </span>
                            </label>
                        </div>
                    </div>
                </section>
                <footer class="modal-card-foot">
                    <button class="button is-success">Speichern</button>
                    <button type="button" class="button" onclick="closeModal('editGroupModal')">Abbrechen</button>
                </footer>
            </form>
        </div>
    </div>

    <!-- Edit Widget Modal -->
    <div class="modal" id="editWidgetModal">
        <div class="modal-background" onclick="closeModal('editWidgetModal')"></div>
        <div class="modal-card">
            <header class="modal-card-head">
                <p class="modal-card-title">Widget bearbeiten</p>
                <button class="delete" onclick="closeModal('editWidgetModal')"></button>
            </header>
            <form id="editWidgetForm" method="POST">
                <section class="modal-card-body">
                    <input type="hidden" name="type" id="editWidgetType">
                    <!-- Currently only Pi-hole supported -->
                    <div id="editWidgetPiholeFields" style="display: none;">
                        <div class="field">
                            <label class="label">Pi-hole API URL</label>
                            <div class="control"><input class="input" type="text" name="pihole_api_url" id="editWidgetApiUrl" placeholder="http://pi.hole/api"></div>
                        </div>
                        <div class="field">
                            <label class="label">Pi-hole API Key / Password</label>
                            <div class="control"><input class="input" type="text" name="pihole_api_key" id="editWidgetApiKey"></div>
                        </div>
                    </div>
                    <div id="editWidgetWeatherFields" style="display: none;">
                        <div class="field">
                            <label class="label">Position</label>
                            <div class="field has-addons">
                                <div class="control is-expanded"><input class="input" type="text" name="weather_lat" id="editWidgetWeatherLat" placeholder="Latitude"></div>
                                <div class="control is-expanded"><input class="input" type="text" name="weather_lon" id="editWidgetWeatherLon" placeholder="Longitude"></div>
                            </div>
                        </div>
                    </div>
                    <div id="editWidgetIframeFields" style="display: none;">
                        <div class="field">
                            <label class="label">Iframe Konfiguration</label>
                            <div class="field has-addons">
                                <div class="control is-expanded"><input class="input" type="text" name="iframe_url" id="editWidgetIframeUrl" placeholder="URL"></div>
                                <div class="control"><input class="input" type="text" name="iframe_height" id="editWidgetIframeHeight" placeholder="Höhe" style="width: 80px;"></div>
                            </div>
                        </div>
                    </div>
                </section>
                <footer class="modal-card-foot">
                    <button class="button is-success">Speichern</button>
                    <button type="button" class="button" onclick="closeModal('editWidgetModal')">Abbrechen</button>
                </footer>
            </form>
        </div>
    </div>

        <script>
            // --- Data for Moving Items ---
            const allPages = [
                {% for p in data.pages %}
                { id: {{ p.id }}, name: "{{ p.name }}" },
                {% endfor %}
            ];
            
            const allGroups = [
                {% for p in data.pages %}
                    {% for g in p.groups %}
                    { id: {{ g.id }}, name: "{{ g.name }}", pageId: {{ p.id }} },
                    {% endfor %}
                {% endfor %}
            ];
    
            // --- Scroll Position Preservation ---
            document.addEventListener("DOMContentLoaded", function(event) { 
                var scrollpos = localStorage.getItem('scrollpos');
                if (scrollpos) window.scrollTo(0, scrollpos);
            });
    
            window.onbeforeunload = function(e) {
                localStorage.setItem('scrollpos', window.scrollY);
            };
    
            // --- SortableJS Initialization ---
            document.addEventListener('DOMContentLoaded', function() {
                // Sort Pages
                var elPages = document.getElementById('pages-list');
                if(elPages) {
                    new Sortable(elPages, {
                        handle: '.card-header', 
                        animation: 150,
                        onEnd: function (evt) {
                            let order = [];
                            document.querySelectorAll('.page-item').forEach(el => order.push(el.getAttribute('data-id')));
                            fetch('/admin/reorder_pages', {
                                method: 'POST',
                                headers: {'Content-Type': 'application/json'},
                                body: JSON.stringify({order: order})
                            });
                        }
                    });
                }
    
                            // Sort Groups (within pages)
                            document.querySelectorAll('.groups-list').forEach(el => {
                                new Sortable(el, {
                                    group: 'groups', // Allows moving between pages
                                    handle: '.level-left',
                                    animation: 150,
                                    onEnd: function (evt) {
                                        let order = [];
                                        evt.to.querySelectorAll('.group-item').forEach(el => order.push(el.getAttribute('data-id')));
                                        
                                        // Get the ID of the page we dropped into
                                        let targetPageId = evt.to.getAttribute('data-page-id');
                                        
                                        fetch('/admin/reorder_groups', {
                                            method: 'POST',
                                            headers: {'Content-Type': 'application/json'},
                                            body: JSON.stringify({
                                                order: order,
                                                page_id: targetPageId // Send new parent ID
                                            })
                                        });
                                    }
                                });
                            });    
                            // Sort Links (within groups)
                            document.querySelectorAll('.links-list').forEach(el => {
                                new Sortable(el, {
                                    group: 'links', // Allows dragging between groups!
                                    handle: '.level-left', // Drag by the left part
                                    animation: 150,
                                    onEnd: function (evt) {
                                        let order = [];
                                        evt.to.querySelectorAll('.link-item').forEach(el => order.push(el.getAttribute('data-id')));
                                        
                                        // Get the ID of the group we dropped into (or stayed in)
                                        let targetGroupId = evt.to.getAttribute('data-group-id');
                
                                        fetch('/admin/reorder_links', {
                                            method: 'POST',
                                            headers: {'Content-Type': 'application/json'},
                                            body: JSON.stringify({
                                                order: order,
                                                group_id: targetGroupId // Send new parent ID
                                            })
                                        });
                                    }
                                });
                            });            });
    
            const homelabIcons = [            "1337x", "13ft", "1panel", "1password-dark", "1password", "20i-dark", "20i", "2fauth-light", "2fauth", "3cx-light", "3cx", "4chan", "5etools-dark", "5etools", "7zip", "a-mule", "aboard", "act", "action1", "activepieces", "actual-budget", "adblock", "adguard-home-sync", "adguard-home", "adminer", "adobe", "ads-b-exchange", "adsb", "advanzia", "adventure-log", "affine-light", "affine", "agile-freaks", "agregarr", "air-trail", "airsonic", "airtable", "airtel", "airvpn", "akamai", "akaunting", "akkoma-light", "akkoma", "alarmpi", "albert-heijn", "alertmanager", "alexa", "algo", "ali-mail", "aliexpress", "alist", "aliyun", "alloy", "alltube-light", "alltube", "alma-linux", "alpine-linux", "amazon-light", "amazon-prime", "amazon-web-services-light", "amazon-web-services", "amazon", "amcrest-cloud", "amcrest", "amd-light", "amd", "ami-alt-light", "ami-alt", "ami", "amp", "ampache", "android-auto-dark", "android-auto", "android-robot", "android", "anghami", "angular", "anime-kai", "anonaddy", "ansible-light", "ansible", "any-listen", "anything-llm-light", "anything-llm", "apache-airflow", "apache-answer", "apache-cassandra", "apache-cloudstack", "apache-druid", "apache-openoffice", "apache-solr", "apache-subversion", "apache-tomcat-light", "apache-tomcat", "apache", "apc", "apiscp", "app-store", "appdaemon", "appflowy", "apple-alt", "apple-light", "apple-maps", "apple-music", "apple-podcasts", "apple-tv-plus-light", "apple-tv-plus", "apple", "apprise", "appwrite", "ara-records-ansible", "arcane", "arch-linux", "archidekt", "archisteamfarm", "archivebox", "archiveteam-warrior-light", "archiveteam-warrior", "arduino", "argo-cd", "ariang", "arm", "arris-light", "arris", "artifacthub", "artifactory", "aruba", "asana", "asciinema", "asrock-rack-ipmi", "asrock-rack", "assetgrid", "asterisk", "astral", "astuto-light", "astuto", "asus-full", "asus-rog", "asus-router", "asus", "asustor", "at-t", "atlassian-bamboo", "atlassian-bitbucket", "atlassian-confluence", "atlassian-jira", "atlassian-opsgenie", "atlassian-trello", "atlassian", "atuin-light", "atuin", "audacity", "audiobookshelf", "aura", "auracast", "authelia", "authentik", "authman", "auto-cad", "auto-mcs", "autobangumi-dark", "autobangumi", "autobrr", "automad-light", "automad", "avg", "avigilon", "avm-fritzbox-light", "avm-fritzbox", "aws-ecs", "aws-light", "aws", "awtrix", "awwesome", "awx", "axis", "aya", "azuracast", "azure-container-instances", "azure-container-service", "azure-devops", "azure-dns", "azure", "bab-technologie-dark", "bab-technologie", "babybuddy", "backblaze", "backrest-light", "backrest", "bacula", "badge", "baikal", "bale", "balena-cloud", "balena-etcher", "ballerina", "bandcamp", "bar-assistant", "barcodebuddy", "baserow", "basilisk", "bastillion", "batocera-linux", "bazarr-dark", "bazarr", "bazecor", "be-quiet", "beaver-habit-tracker-light", "beaver-habit-tracker", "bechtle", "beef-light", "beef", "beets", "benotes", "bentopdf", "beszel-light", "beszel", "betanin", "bewcloud", "bible-gateway", "bibliogram", "biblioreads-light", "biblioreads", "biedronka", "bigcapital", "bilibili", "bing", "binner-dark", "binner", "birdnet", "bitbucket", "bitcoin", "bithumen", "bitmagnet", "bitwarden", "bitwig-studio-dark", "bitwig-studio", "blocky", "blogger", "blue-iris", "blue-letter-bible", "bluesky", "bluetooth", "bluewallet", "bobcat-miner", "boinc", "book-lore", "booklogr-light", "booklogr", "booksonic", "bookstack", "bootstrap", "borg", "borgmatic-light", "borgmatic", "bottom-dark", "bottom", "boundary", "box", "boxarr", "brave-dev", "brave", "brewpi", "brick-tracker", "bright-move", "brillcam", "broad-link", "broadcastchannel-light", "broadcastchannel", "brocade", "brother", "browserless-light", "browserless", "browsh", "btcpay-server", "buddy", "budget-board", "budget-zero", "budgetbee-light", "budgetbee", "budibase", "buffalo", "build-better-dark", "build-better", "buildium", "bunkerweb", "bunny", "buxfer", "bytestash", "c", "cabernet", "cabot", "cachyos-linux", "cacti", "caddy", "cadvisor", "cal-com-light", "cal-com", "calckey", "caldera", "calibre-web-automated-book-downloader", "calibre-web", "calibre", "camera-ui", "canonical", "canvas-lms", "cap-cut-dark", "cap-cut", "capacities-dark", "capacities", "caprover", "cardigann-light", "cardigann", "carrefour", "casaos", "castopod", "cc-light", "cc", "centos", "ceph", "cert-manager", "cert-warden-light", "cert-warden", "cessna", "chainguard", "changedetection", "channels-dvr", "chaptarr", "chart-db", "chatbetter", "chatgpt", "chatpad-ai", "chatwoot", "check-cle", "checkmate", "checkmk", "cherry", "chess", "chevereto", "chhoto-url", "chibisafe", "chiefonboarding", "chirpy", "chowdown", "chroma", "chrome-beta", "chrome-canary", "chrome-dev", "chrome-devtools", "chrome-remote-desktop", "chrome", "chromecast-light", "chromecast", "chromium", "chronograf", "cilium-light", "cilium", "cinny-light", "cinny", "ciphermail", "cisco", "clam-av", "clash", "claude-ai-light", "claude-ai", "cleanuperr", "clickhouse", "clickup", "cloud66", "cloud9-light", "cloud9", "cloudbeaver", "cloudcmd", "cloudflare-pages", "cloudflare-zero-trust", "cloudflare", "cloudpanel", "cloudreve", "cloudstream", "cobalt-dark", "cobalt", "cockpit-cms-light", "cockpit-cms", "cockpit-light", "cockpit", "code-cademy-dark", "code-cademy", "code-server", "code", "codeberg", "codellm", "coder-light", "coder", "codestats-light", "codestats", "codex-light", "codex", "codimd-light", "codimd", "collabora-online", "comfy-ui", "commafeed-light", "commafeed", "commento-light", "commento", "compreface", "concourse", "confix", "confluence", "consul", "contabo", "control-d-dark", "control-d", "converse-light", "converse", "convertx", "convex", "cooler-control", "coolify", "copyparty", "copyq", "core-control", "coredns", "coreos", "cosign", "cosmos-cloud", "costco", "couchdb", "couchpotato", "counter-analytics", "counter-strike-2", "counter-strike-global-offensive", "coursera", "cozy", "cpanel", "cpp", "crafty-controller", "crater-invoice", "crazydomains", "cribl-light", "cribl", "cron-master", "cronicle", "cross-seed-square", "cross-seed", "crowdin-dark", "crowdin", "crowdsec", "crunchyroll", "cryptomator", "cryptpad", "csharp", "css-light", "css", "ctfreak", "cup", "cups-light", "cups", "cura", "cyber-power-full", "cyberchef", "czkawka", "d-link", "dagster-dark", "dagster-light", "dahua", "dalibo", "daps", "dart", "dashboard-icons-dark", "dashboard-icons", "dashdot", "dashwise", "dashy", "datadog", "davical", "davis", "dawarich", "dc-os", "dd-wrt-light", "dd-wrt", "ddclient", "ddns-updater", "debian-linux", "deemix", "deepl-dark", "deepl", "deepseek", "deezer", "defguard", "dell", "deluge", "deno-light", "deno", "denodo", "denon-light", "denon", "deployarr", "develancacheui", "devtooly-light", "devtooly", "dia", "diagrams-net", "diamond-aircraft", "dietpi", "digi-kam", "digikey", "digital-ocean", "dilg", "dillinger-light", "dillinger", "dim-light", "dim", "diners-club", "directadmin", "directus", "discord", "discourse-light", "discourse", "diskover", "disney-plus", "dispatcharr", "distribution", "diun", "dixa", "diyhue", "dlna", "docassemble-light", "docassemble", "docker-amd", "docker-amvd", "docker-compose", "docker-engine", "docker-gc", "docker-mailserver-light", "docker-mailserver", "docker-moby", "docker-volume-backup", "docker", "dockge", "docking-station", "dockpeek-dark", "dockpeek", "dockstarter", "dockwatch", "docmost", "docsify", "docspell", "documenso", "docusaurus", "docuseal", "dogpile", "dokemon", "dokploy-dark", "dokploy", "dokuwiki", "dolibarr", "dolphin", "domainmod", "domoticz", "donetick", "doplarr", "doppler", "dopplertask", "double-commander", "double-take-dark", "double-take", "dovecot", "dozzle", "dragon-ruby", "draw-io", "draytek", "dream-host-dark", "dream-host", "drone", "drop", "dropbox", "dropout-light", "dropout", "droppy-dark", "droppy", "dub-light", "dub", "duckdns-light", "duckdns", "duckduckgo", "dumbassets", "dumbpad", "duo", "duplicacy", "duplicati", "dynmap", "easy-gate-light", "easy-gate", "ebay", "eblocker", "edge-dev", "edge", "edgeos-light", "edgeos", "eitaa", "elastic-beats", "elastic-kibana", "elastic-logstash", "elastic", "elasticsearch", "electron", "electronic-arts", "electrum", "element", "eleventy-light", "eleventy", "elgato-wave-link", "eliza-os", "elysian", "emacs", "embraer", "emby", "embystat", "emq-light", "emq", "emqx", "emsesp", "emulatorjs", "enbizcard", "enclosed-light", "enclosed", "endeavouros-linux", "endless-light", "endless", "endurain", "enhance", "enshrouded", "ente-photos", "entergy", "epic-games-light", "epic-games", "epson-iprint", "ersatztv", "erste-george", "erste", "esphome-alt-light", "esphome-alt", "esphome-light", "esphome", "espocrm", "espressif", "etcd", "etesync", "ethereum", "etherpad", "evcc", "evebox", "evernote", "eweka", "excalidraw", "exercism-dark", "exercism", "expense-owl", "ezbookkeeping", "f-droid", "f1-dash", "f5-networks", "facebook-messenger", "facebook", "falcon-christmas", "falcon-player-dark", "falcon-player", "fast-com-light", "fast-com", "fasten-health", "fastmail", "fedora-alt", "fedora", "feedbase-light", "feedbase", "feedbin-light", "feedbin", "feedly", "feedlynx-light", "feedlynx", "feishin", "fenrus-light", "fenrus", "ferdi", "ferdium", "fermentrack", "ferretdb", "fibaro", "fidelity", "fider", "figma", "filebot", "filebrowser-quantum", "filebrowser", "filecloud", "fileflows", "filegator", "filepizza", "filerun", "files-community", "files", "filestash", "filezilla", "finamp", "findroid", "fios-light", "fios", "firebase", "firefly-iii", "firefly", "firefox-beta", "firefox-developer-edition", "firefox-lite", "firefox-nightly", "firefox-reality", "firefox-send", "firefox", "fireshare", "firewalla", "fittrackee", "fl-studio", "fladder", "flame", "flaresolverr", "flarum", "flat-notes", "flathub-dark", "flathub", "flatnotes", "flatpak", "fleetdm", "flexget", "flightaware", "flightradar24-light", "flightradar24", "floatplane", "flogo", "flood", "floorp", "flowise", "flowtunes", "fluent-reader", "fluffychat-dark", "fluffychat", "fluidd", "flux-cd", "fly-io", "fmd", "fnos", "focalboard", "foldingathome", "fontawesome", "foreflight-dark", "foreflight", "forgejo", "forte-light", "forte", "fortinet", "foscam", "fossil", "foundry-vtt", "franz", "free-dns", "free-sas", "freebox-delta", "freebox-pop", "freebox-revolution", "freedombox", "freeipa", "freenas", "freenom", "freepbx", "freescout", "freshping-dark", "freshping", "freshrss", "friendica", "frigate-light", "frigate", "fritzbox-light", "fritzbox", "fronius", "frp", "fulcio", "funkwhale-light", "funkwhale", "fusionauth-light", "fusionauth", "fusionpbx", "gamevault", "gameyfin-light", "gameyfin", "gaps", "garage", "garmin-connect", "garuda-linux", "gaseous", "gatsby", "gatus", "gboard", "geckoview", "genius", "gentoo-linux", "geo-guessr", "gerbera", "gerrit", "get-iplayer", "ghost-light", "ghost", "ghostfolio", "ghostty", "gigaset", "gimp", "git", "gitbook", "gitea", "gitee", "github-light", "github", "gitlab", "gitsign", "gladys-assistant", "glance", "glances-light", "glances", "glinet-dark", "glinet", "glitchtip", "glpi", "gluetun", "gmail", "go", "go2rtc", "goaccess-light", "goaccess", "godaddy-alt", "godaddy", "godot", "gogs", "golink-dark", "golink", "gollum", "gomft", "gone-man-switch", "gonic", "goodreads", "google-admin", "google-admob", "google-alerts", "google-analytics", "google-assistant", "google-calendar", "google-chat", "google-chrome", "google-classroom", "google-cloud-platform", "google-cloud-print", "google-colab", "google-compute-engine", "google-contacts", "google-docs", "google-domains", "google-drive", "google-earth", "google-fi", "google-finance", "google-fit", "google-fonts", "google-forms", "google-gemini", "google-home", "google-jules", "google-keep", "google-lens", "google-maps", "google-meet", "google-messages", "google-news", "google-one", "google-pay", "google-photos", "google-play-books", "google-play-games", "google-play", "google-podcasts", "google-scholar", "google-search-console", "google-sheets", "google-shopping", "google-sites", "google-slides", "google-street-view", "google-tag-manager", "google-translate", "google-tv", "google-voice", "google-wallet", "google-wifi", "google", "gopeed", "gose", "gotenberg", "gotify", "gotosocial", "gpt4free", "grafana", "gramps-web", "gramps", "grandstream", "grav-light", "grav", "gravity", "graylog", "greenbone-light", "greenbone", "greenlight", "grimoire", "grist", "grocy", "grok-dark", "grok", "grype", "guacamole-light", "guacamole", "habit-trove", "habitica-dark", "habitica", "hacker-news", "hammond-light", "hammond", "handbrake", "haproxy", "haptic-light", "haptic", "harbor", "hard-forum", "harvester", "hasheous", "hashicorp-boundary", "hashicorp-consul", "hashicorp-nomad", "hashicorp-packer", "hashicorp-terraform", "hashicorp-vagrant", "hashicorp-vault", "hashicorp-waypoint", "hastypaste", "hasura", "hathway", "hatsh-light", "hatsh", "hbo-light", "hbo", "hdhomerun-light", "hdhomerun", "headlamp-dark", "headlamp", "headphones", "headscale", "healthchecks", "hedgedoc", "heimdall-light", "heimdall", "helium-token", "helm", "helper-scripts", "hemmelig-light", "hemmelig", "hetzner-h", "hetzner", "hexo", "hexos", "heyform", "hi-anime", "hifiberry", "hikvision", "hilook", "hivedav", "hl-audiomuse-ai", "hoarder-light", "hoarder", "hollo-light", "hollo", "homarr", "home-assistant-alt", "home-assistant", "homebox", "homebridge", "homelabids", "homepage", "homer", "homeseer", "homey", "honda-jet", "honeygain", "hoobs", "hoppscotch", "hortusfox", "hostinger", "hotio", "hp", "html-light", "html", "huawei", "hubitat", "hubzilla", "hugging-face", "huginn", "hugo", "hulu", "humhub", "huntarr", "hydra", "hyperion", "hyperpipe-light", "hyperpipe", "hyprland", "i-librarian", "i2p-light", "i2p", "i2pd", "ical", "icecast", "icinga-full-light", "icinga-full", "icinga-light", "icinga", "icloud", "idealo", "ideco", "idrac", "idrive", "ihatemoney", "ikuai", "ilo", "image-maid", "immich-frame-light", "immich-frame", "immich-kiosk-light", "immich-kiosk", "immich-power-tools", "immich-public-proxy", "immich", "incus", "infinite-craft", "infisical", "influxdb", "infoblox", "infomaniak-k", "infomaniak-kdrive-dark", "infomaniak-kdrive-light", "infomaniak-kmeet-dark", "infomaniak-kmeet-light", "infomaniak-swisstransfer-dark", "infomaniak-swisstransfer-light", "inoreader", "insanelymac", "instagram", "intellij", "inventree", "invidious", "invisioncommunity", "invoice-ninja-light", "invoice-ninja", "invoiceninja-light", "invoiceninja", "invoke-ai", "iobroker", "ionos", "ipboard", "ipcamtalk", "ipfs-light", "ipfs", "irc", "iredmail", "ispconfig", "ispy", "issabel-pbx-dark", "issabel-pbx-wordmark-dark", "issabel-pbx-wordmark", "issabel-pbx", "it-tools-light", "it-tools", "italki", "itau", "jackett-light", "jackett", "jaeger", "jamf", "jamstack", "java", "javascript-light", "javascript", "jdownloader", "jdownloader2", "jeedom", "jekyll", "jellyfin-vue", "jellyfin", "jellyseerr", "jellystat-dark", "jellystat", "jelu", "jenkins", "jetbrains-fleet", "jetbrains-toolbox", "jetbrains-youtrack", "jetkvm-full", "jetkvm", "jfrog", "jio", "jiohotstar", "jira", "jitsi-meet", "jitsi", "joal", "joomla", "joplin", "jotty", "jujutsu-vcs", "julia", "jupyter", "jwt-io-light", "jwt-io", "k-speeder", "kagi", "kaizoku", "kali-linux", "kamatera", "kanboard-light", "kanboard", "kanidm", "kapacitor", "kapowarr", "karakeep-dark", "karakeep", "karaoke-eternal", "kasm-workspaces", "kasm", "kasten-k10", "kaufland", "kavita", "kbin", "keenetic-alt", "keenetic-new", "keenetic", "keepassxc", "keila", "kerberos", "kestra", "keycloak", "keyoxide-alt", "keyoxide", "kibana", "kick-light", "kick", "kimai", "kimi-ai", "kinto", "kitana", "kitchenowl", "kiwix-light", "kiwix", "kleinanzeigen", "kleopatra", "klipper", "knx", "ko-fi", "ko-insight", "koboldcpp", "kodi", "koel", "koillection-light", "koillection", "koito", "kokoro-web", "kometa", "komga", "komodo", "kontoj", "kook", "kopia", "kotlin", "kpn", "krakend", "krusader", "ksuite", "kubecraft", "kubernetes-dashboard", "kubernetes", "kubuntu-linux", "kutt", "kyoo", "lancache", "lancommander-light", "lancommander", "lanraragi", "laravel", "lark", "lastpass", "lazylibrarian", "ldap-account-manager", "leanote", "leantime", "leargas-security", "leetcode-dark", "leetcode", "lemmy-light", "lemmy", "lemonldap-ng", "lets-encrypt", "lexmark", "libation", "librechat", "libreddit-light", "libreddit", "libremdb", "librenms", "libreoffice-light", "libreoffice", "librephotos-light", "librephotos", "librespeed-light", "librespeed", "librewolf", "librex", "librey", "librum", "lichess-dark", "lichess", "lidarr", "lidl", "lightning-terminal", "lighttpd", "limesurvey", "linear-dark", "linear", "linguacafe", "linkace", "linkding", "linkedin", "linkstack", "linksys", "linkwarden", "linode", "linux-mint", "linux", "linuxdo", "linuxgsm", "linuxserver-io", "liremdb", "listenbrainz", "listmonk", "lite-speed", "littlelink-custom", "livebook", "lldap-dark", "lldap", "lms-mixtape", "lnbits", "lobe-chat", "local-content-share", "local-xpose", "locals-light", "locals", "lodestone", "logitech-gaming", "logitech-legacy", "logitech-light", "logitech", "logseq", "logstash", "logto", "loki", "longhorn", "lostack", "loxone-full", "loxone", "lsio", "lua", "lubelogger", "lubuntu-linux", "ludus-dark", "ludus", "lunalytics", "lunasea", "luxriot", "lychee", "lynx-light", "lynx", "lyrion-dark", "lyrion", "macmon", "mail-in-a-box", "mailchimp-light", "mailchimp", "mailcow", "mailcowsogo", "mailfence", "mailgun", "mailhog", "mailjet", "mailpit", "mailu", "mainsail", "maintainerr", "mak", "makemkv", "maker-world-dark", "maker-world", "maloja", "manga-dex", "mango", "manjaro-linux", "mantisbt", "many-notes", "manyfold", "maptiler", "marginalia", "mariadb", "marimo", "marktplaats", "marzban", "mastodon", "matomo", "matrix-light", "matrix-synapse-light", "matrix-synapse", "matrix", "matter-light", "matter", "matterbridge", "mattermost", "mautic", "max", "mayan-edms-light", "mayan-edms", "maybe", "mazanoke", "mbin", "mcmyadmin", "mealie", "medama", "media-manager", "mediathekview", "mediawiki", "medium-dark", "medium-light", "mediux", "medusa-light", "medusa", "mega-nz-dark", "mega-nz", "meilisearch", "mem-ai", "memories-light", "memories", "memos", "mempool", "meraki", "mercusys", "mergeable-dark", "mergeable", "meshcentral", "meshping-light", "meshping", "meshtastic", "meta", "metabase", "metabrainz", "metallb", "metube", "microbin", "microsoft-365-admin-center", "microsoft-365", "microsoft-access", "microsoft-azure", "microsoft-bing", "microsoft-copilot", "microsoft-defender", "microsoft-edge", "microsoft-excel", "microsoft-exchange", "microsoft-intune", "microsoft-office", "microsoft-onedrive", "microsoft-onenote", "microsoft-outlook", "microsoft-power-automate", "microsoft-powerpoint", "microsoft-remote-desktop", "microsoft-sharepoint", "microsoft-sql-server-light", "microsoft-sql-server", "microsoft-teams", "microsoft-to-do", "microsoft-windows", "microsoft-word", "microsoft", "midjourney-light", "midjourney", "mikrotik-light", "mikrotik", "minecraft", "mineos", "miniflux-light", "miniflux", "minimserver", "minio-light", "minio", "miro", "misp", "misskey-light", "misskey", "mistral-ai", "mitra", "mixpost", "mkdocs-light", "mkdocs", "mkvtoolnix", "ml-flow-wordmark-dark", "ml-flow-wordmark", "mobaxterm", "mobilizon", "mobotix-light", "mobotix", "mochahost", "modrinth", "mojeek", "molecule", "monero", "mongodb", "monica-light", "monica", "monit", "monkeytype", "moode-audio", "moodist-dark", "moodist", "moodle-light", "moodle", "morphos", "morss", "mosquitto", "motioneye-dark", "motioneye", "mousehole-dark", "mousehole", "movie-pilot", "mpm", "mqtt", "mstream", "mtlynch-picoshare", "mullvad-browser", "mullvad-vpn", "mullvad", "multi-scrobbler", "mumble-light", "mumble", "musescore", "music-assistant-light", "music-assistant", "musicbrainz", "my-guitar-tabs", "myheats-light", "myheats", "mylar", "mympd", "myspeed", "mysql", "mysterium", "n8n", "nagios", "name-silo", "namecheap", "nasa", "nastool", "natwest", "nautical-backup", "navidrome-light", "navidrome", "ncore", "neko-light", "neko", "neo4j", "neocities", "neodb", "neon-tech", "neonlink", "netalertx-light", "netalertx", "netapp-light", "netapp", "netatmo", "netbird", "netboot", "netbootxyz", "netbox-dark", "netbox-full-dark", "netbox-full", "netbox", "netcam-studio", "netdata", "netflix", "netgear-light", "netgear-orbi", "netgear", "netlify", "netmaker", "netsurf-light", "netsurf", "netvisor", "network-ups-tools", "network-weathermap", "networking-toolbox-dark", "networking-toolbox", "newegg", "newsblur", "newshosting-dark", "newshosting", "nextcloud-blue", "nextcloud-calendar", "nextcloud-contacts", "nextcloud-cookbook", "nextcloud-cospend", "nextcloud-deck", "nextcloud-files", "nextcloud-ncdownloader", "nextcloud-news", "nextcloud-notes", "nextcloud-photos", "nextcloud-social", "nextcloud-tables", "nextcloud-talk", "nextcloud-tasks", "nextcloud-timemanager", "nextcloud-white", "nextcloud", "nextcloudpi", "nextdns", "nexterm", "nextjs-light", "nextjs", "nextpvr", "nexus-dark", "nexus", "nezha", "nginx-proxy-manager", "nginx", "nicotine-plus", "nightscout-light", "nightscout", "nintendo-switch", "nitter", "nixos", "no-ip", "nocobase-light", "nocobase", "nocodb", "node-red", "nodebb", "nodejs-alt", "nodejs", "noisedash", "nomad", "nomie", "nordvpn", "note-mark", "notebook-lm-dark", "notebook-lm", "notesnook-light", "notesnook", "notifiarr", "notion-calendar", "notion-light", "notion-mail", "notion", "nowshowing", "npm", "ntfy", "ntop", "ntopng", "nu-nl", "nut-webgui", "nut", "nutanix", "nvidia", "nxfilter", "nxlog", "nzbgeek", "nzbget", "nzbhydra", "nzbhydra2-light", "nzbhydra2", "oauth2-proxy", "obico", "obitalk", "observium", "observo-ai", "obsidian", "obtainium", "octoeverywhere", "octoprint", "ocular", "oculus-light", "oculus", "odoo", "odysee-full-dark", "odysee-full-light", "odysee", "office-365", "oh-my-posh-dark", "oh-my-posh", "olivetin-light", "olivetin", "ollama-dark", "ollama", "omada", "ombi", "omni-tools-full", "omni-tools", "omnic-forge-dark", "omnic-forge", "omnidb", "omnivore", "onedev-light", "onedev", "oneuptime-light", "oneuptime", "onlyfans-dark", "onlyfans", "onlyoffice", "onshape-dark", "onshape", "ookla-speedtest", "open-classrooms", "open-cloud-dark", "open-cloud", "open-observe", "open-regex", "open-resume", "open-router-dark", "open-router", "open-source-initiative", "open-wb", "open-webui-light", "open-webui", "openai-light", "openai", "openaudible", "openchangelog-light", "openchangelog", "opencode-dark", "opencode", "opencost", "openeats-light", "openeats", "openemr-light", "openemr", "opengarage", "opengist-light", "opengist", "openhab", "openldap", "openlist", "openmaptiles", "openmediavault", "openoffice", "openpanel-light", "openpanel", "openproject", "openreads", "opensearch", "openshift-dark", "openshift", "openspeedtest", "opensprinkler", "openstack", "openstreetmap", "opensuse", "opentalk", "opentofu", "openvas", "openvpn", "openwebrx-plus-dark", "openwebrx-plus", "openwrt", "openziti", "opera-beta", "opera-developer", "opera-mini-beta", "opera-mini", "opera-neon", "opera-touch", "opera", "opnform", "opnsense", "oracle-cloud", "oracle", "orange", "orb", "orcaslicer", "oreilly-dark", "oreilly", "organizr", "origin", "oscarr-light", "oscarr", "osticket", "osu", "otter-wiki-dark", "otter-wiki", "our-shopping-list", "outline-light", "outline", "overclockers", "overleaf", "overseerr", "ovh", "ovirt-light", "ovirt", "owasp-zap", "owncast", "owncloud", "ownphotos-light", "ownphotos", "owntone", "owntracks", "oxker-light", "oxker", "p-cal", "p1ib", "packetfence-dark", "packetfence-full-dark", "packetfence-full", "packetfence", "pagerduty", "pairdrop", "palemoon", "palmr", "palo-alto", "pangolin", "paperless-ng", "paperless-ngx", "paperless", "papermark-light", "papermark", "papermerge-light", "papermerge", "papra", "parseable", "part-db-light", "part-db", "partkeepr", "passbolt", "passwordpusher-light", "passwordpusher", "passwork", "pastatool-light", "pastatool", "pastebin-dark", "pastebin", "pastey", "patchmon", "patreon-light", "patreon", "payload-light", "payload", "paymenter", "paypal", "pdfding-light", "pdfding", "peacock-light", "peacock", "peanut-light", "peanut", "peertube", "pelican-panel", "penpot-light", "penpot", "peppermint", "pepperminty-wiki", "perlite", "perplexity-book-dark", "perplexity-book-light", "perplexity-dark", "perplexity-light", "petio", "pfsense-light", "pfsense", "pg-back-web", "pgadmin", "pgbackweb-dark", "pgbackweb-light", "phanpy", "phantombot", "phase-dark", "phase", "phoneinfoga-light", "phoneinfoga", "phorge-light", "phorge", "phoscon-light", "phoscon", "photonix-light", "photonix", "photopea", "photoprism-light", "photoprism", "photostructure-dark", "photostructure", "photoview", "php-light", "php", "phpipam", "phpldapadmin", "phpmyadmin", "pi-alert", "pi-hole-unbound", "pi-hole", "pia", "piaware", "picsur-light", "picsur", "pigallery2-dark", "pigallery2", "pikapods", "pikvm-light", "pikvm", "pinchflat", "pinepods", "pingdom-light", "pingdom", "pingvin-dark", "pingvin-share-dark", "pingvin-share", "pingvin", "pinkary", "pinry", "pinterest", "pioneer-light", "pioneer", "piped", "pirate-proxy", "pivpn", "piwigo", "pixelfed", "plane", "planka-dark", "planka", "plant-it", "plantuml", "platzi", "plausible", "playstation", "pleroma", "plesk", "plex-alt-light", "plex-alt", "plex-light", "plex-meta-manager-light", "plex-meta-manager", "plex-rewind", "plex", "plexdrive", "plexrequests-light", "plexrequests", "plexripper", "plume", "pluralsight", "pocket-casts-dark", "pocket-casts", "pocket-id-light", "pocket-id", "pocketbase-dark", "pocketbase", "podfetch-light", "podfetch", "podgrab", "podify", "podman", "podnapisi", "policycontroller", "poly", "polywork", "porkbun", "port-note", "portainer-alt", "portainer-be-dark", "portainer-be", "portainer-dark", "portainer", "portracker-dark", "portracker", "portus", "postal", "poste", "posterizarr", "postgres", "postgresql", "postgresus", "posthog-light", "posthog", "postiz-dark", "postiz", "powerbi", "powerdns", "powerpanel", "premium-mobile", "premiumize", "pretix", "price-buddy", "primal", "prime-video-alt-dark", "prime-video-alt", "prime-video-light", "prime-video", "printables", "printer", "pritunl", "privacyidea", "private-internet-access", "privatebin", "profilarr", "projection-lab", "projectsend", "prometheus", "proton-calendar", "proton-docs", "proton-drive", "proton-lumo", "proton-mail", "proton-pass", "proton-vpn", "proton-wallet", "prowlarr", "proxmox-light", "proxmox", "prtg", "prusa-research", "psitransfer", "pterodactyl", "public-pool", "pufferpanel", "pulsarr", "pulse", "purelymail", "pushfish", "pushover", "putty", "pve-scripts-local", "pwndrop-light", "pwndrop", "pwpush-light", "pwpush", "pydio", "pyload", "python", "qbittorrent", "qd-today", "qdirstat", "qdrant", "qinglong", "qnap", "quant-ux", "quay", "questdb", "quetre", "qui", "quickshare", "quickwit", "quizlet", "qutebrowser", "qwen", "qwik", "r", "rabbitmq", "racknerd-dark", "racknerd", "radarr-4k", "radarr", "radicale", "rainloop", "rallly", "ramp-dark", "ramp", "rancher", "raneto", "raritan-light", "raritan", "raspberry-pi-light", "raspberry-pi", "raspberrymatic", "rathole", "rclone", "rdt-client", "reactive-resume-light", "reactive-resume", "reactjs", "readarr", "readeck", "readthedocs-light", "readthedocs", "readwise-reader-dark", "readwise-reader", "real-debrid", "realhosting", "recalbox", "receipt-wrangler", "recipesage", "recipya", "recomendarr", "recyclarr", "reddit", "redhat-linux", "redict", "redis", "redlib-light", "redlib", "redmine", "rekor", "release-argus", "remmina", "remnawave", "remnote", "remotely", "renovate", "reolink", "reposilite-dark", "reposilite", "requestly", "requestrr", "resiliosync-full-dark", "resiliosync-full", "resiliosync", "restic", "restreamer", "retrom", "revanced-manager", "revolt-light", "revolt", "rhasspy-dark", "rhasspy", "rhodecode", "richy", "rimgo-light", "rimgo", "riot", "ripe", "riverside-fm-light", "riverside-fm", "robinhood", "rocket-chat", "rocky-linux", "romm", "rompya", "rook", "root-me-dark", "root-me", "rotki", "roundcube", "router", "rozetkaua", "rpi-monitor", "rport", "rspamd", "rss-bridge", "rss-translator", "rsshub", "rstudio", "rstudioserver", "ruby", "ruckus-unleashed", "rumble", "rundeck", "runeaudio", "runonflux", "runson-light", "runson", "rust-dark", "rust", "rustdesk", "rutorrent", "ryot-light", "ryot", "sabnzbd-light", "sabnzbd", "safari-ios", "safari", "safeline", "sagemcom", "salad", "salt-project", "saltcorn", "samba-server", "samsung-internet", "sandstorm", "satisfactory", "scanservjs", "schedulearn-dark", "schedulearn", "schneider", "scraperr", "scrcpy", "screenconnect", "scrutiny-light", "scrutiny", "scrypted", "seafile", "searx", "searxng", "secureai-tools-light", "secureai-tools", "security-onion-dark", "security-onion", "seelf", "selenium", "self-hosted-gateway", "selfh-st-light", "selfh-st", "selfhosted-light", "selfhosted", "semaphore-dark", "semaphore", "send", "sendgrid", "sendinblue", "sensu", "sentry-light", "sentry", "seq", "series-troxide", "serpbear", "servarr-light", "servarr", "serviio-light", "serviio", "session", "seznam", "sftpgo", "shaarli", "shell-light", "shell-tips-light", "shell-tips", "shell", "shellhub", "shellngn", "shelly", "shinkro", "shinobi", "shiori", "shlink", "shoko-server", "shoko", "shopify", "shortcut", "sickbeard", "sickchill", "sickgear", "signal", "signoz", "sigstore", "silae", "silverbullet", "simplelogin", "simplex-chat", "sinusbot", "sipeed", "siyuan", "sketchup-make", "skylink-fibernet", "skype", "slaanesh", "slack", "slash-light", "slash", "slice", "slidev", "slink-light", "slink", "slskd", "slurpit-dark", "slurpit", "smartfox", "smlight", "smokeping", "snapcast", "snapchat-dark", "snapchat", "snapdrop", "snappymail-light", "snappymail", "snibox", "snikket", "snipe-it", "snippetbox", "socialhome", "sogo", "solaar", "solid-invoice", "solidtime-light", "solidtime", "sonarqube", "sonarr-4k", "sonarr-dark", "sonarr", "sophos-dark", "sophos", "soulseek", "sourcegraph", "spamassassin", "spark", "sparkleshare", "sparky-fitness", "specifically-clementines", "specter-desktop", "speedtest-tracker", "sphinx-doc", "sphinx-relay", "sphinx", "spiceworks", "spiderfoot", "spliit", "splunk", "spoolman", "spotify", "spotnet", "spree-dark", "spree", "springboot-initializer", "sqlitebrowser", "squeezebox-server", "squidex", "squirrel-servers-manager", "sshwifty", "sst-dev-dark", "sst-dev", "stalwart-mail-server", "stalwart", "standard-notes", "startpage", "stash", "statping-ng", "statping", "stb-proxy", "steam", "step-ca", "stirling-pdf", "storj", "storm", "stormkit", "strapi", "strava", "stream-harvestarr", "streama", "stremio", "stump-alt", "stump", "sub-store", "subatic", "subdl", "substreamer", "suggest-arr", "sun-panel", "sunsama", "sunshine", "supabase", "superlist", "supermicro", "surveymonkey", "suwayomi-light", "suwayomi", "svelte", "swagger", "swarmpit", "swift", "swizzin", "syft", "symedia", "symmetricom-light", "symmetricom", "sympa", "synapse-light", "synapse", "syncany", "synclounge-light", "synclounge", "syncplay", "syncthing-dark", "syncthing", "synology-audio-station", "synology-calendar", "synology-chat", "synology-cloud-sync", "synology-contacts", "synology-document-viewer", "synology-download-station", "synology-drive-server", "synology-drive", "synology-dsm", "synology-file-station", "synology-light", "synology-mail-plus", "synology-mail-station", "synology-note-station", "synology-office", "synology-pdfviewer", "synology-photo-station", "synology-photos", "synology-surveillance-station", "synology-text-editor", "synology-video-station", "synology-vmm", "synology-webstation", "synology", "sysreptor", "t3-chat", "tabula", "tacticalrmm", "taiga", "tailscale-light", "tailscale", "tailwind", "talos", "tandoor-recipes", "tangerine-ui", "tanoshi", "tar1090", "taskcafe", "tasmoadmin", "tasmocompiler", "tasmota-light", "tasmota", "tautulli", "tdarr", "team-viewer", "teamcity-light", "teamcity", "teamspeak", "teamtailor", "technitium", "teddy-cloud", "teedy", "telegraf", "telegram", "telekom", "teleport", "tenable-dark", "tenable", "tenda", "terminal", "termix", "terraform", "terraria", "teslamate-light", "teslamate", "thanos", "the-onion", "the-pirate-bay", "the-proxy-bay", "theia-light", "theia", "thelounge", "themepark", "theodinproject", "thin-linc", "thingsboard", "threadfin", "threads-light", "threads", "thunderbird", "thunderhub-light", "thunderhub", "tianji-light", "tianji", "ticky", "tidal-dark", "tidal", "tiddlywiki-light", "tiddlywiki", "tiktok-light", "tiktok", "timemachines-light", "timemachines", "timetagger-light", "timetagger", "ting-isp", "tiny-media-manager", "tinyauth", "tinypilot", "tinytinyrss", "tipi", "tmdb", "todoist-dark", "todoist", "toggl-dark", "toggl", "tolgee", "tooljet-dark", "tooljet", "topdesk", "tor", "torrserver", "touitomamout", "tp-link", "tpdb", "traccar-dark", "traccar", "trading-view-dark", "trading-view", "traefik-proxy", "traefik", "traggo", "trailarr", "trakt", "transmission", "trash-guides", "trellix-dark", "trellix", "trilium", "triliumnext", "trivy", "trmnl-android", "trmnl", "troddit", "trudesk", "truecommand", "truenas-core", "truenas-enterprise", "truenas-scale", "truenas", "tryhackme", "tsd-proxy", "tube-archivist-light", "tube-archivist", "tubesync-light", "tubesync", "tugtainer", "tumblr", "tunarr", "tunnelix", "turbopack-light", "turbopack", "tuta", "tux", "tvdb", "tvheadend", "tvp-vod", "tweakers", "twingate-light", "twingate", "twitch", "twitter", "txlog", "typemill-light", "typemill", "typescript", "typesense", "typo3", "ubiquiti-networks", "ubiquiti-unifi", "ubiquiti", "ubooquity", "ubuntu-linux-alt", "ubuntu-linux", "uc-browser", "udemy-light", "udemy", "ugreen-nas", "ugreen", "ultimate-guitar-light", "ultimate-guitar", "umami-light", "umami", "umbrel", "unbound", "uncomplicated-alert-receiver", "undb", "unifi-controller", "unifi-dark", "unifi-drive", "unifi-protect", "unifi-voucher-site", "unifi", "unimus", "unity-dark", "unity", "universal-media-server", "university-applied-sciences-brandenburg", "unmanic", "unraid", "untangle", "updog", "ups", "upsnap", "uptime-kuma", "uptimerobot", "upvote-rss", "upwork", "urbackup-server", "urbackup", "usermin", "valetudo", "valkey", "vault-light", "vault", "vaultwarden-light", "vaultwarden", "vector", "veeam", "vera-crypt", "vercel-light", "vercel", "verizon", "verriflo-dark", "verriflo", "vertiv-dark", "vertiv", "vi", "viber", "victorialogs", "victoriametrics-light", "victoriametrics", "victron-energy", "vidzy", "viewtube", "vikunja", "vinchin-backup", "virgin-media", "virtualmin", "virtualradarserver", "viseron-light", "viseron", "visual-studio-code", "vitalpbx", "vite", "vitest", "vito-deploy", "vivaldi", "vmware-esxi", "vmware-horizon", "vmware-vcenter", "vmware-workstation", "vmware", "vn-stat", "vodafone", "voilib", "voip-info", "voip-ms", "voltaserve-light", "voltaserve", "volumio-light", "volumio", "voron", "vouchervault", "vscode", "vtvgo", "vuetorrent", "vultr", "vuplus", "wakapi", "wakatime-light", "wakatime", "wallabag-light", "wallabag", "wallos", "wanderer-light", "wanderer", "wanikani", "ward", "warpgate", "warracker", "watcharr-light", "watcharr", "watcher", "watchlistarr", "watchtower", "watchyourlan", "watchyourports", "wavelog", "waze", "wazuh", "wbo", "wd-mycloud", "web-check-dark", "web-check", "web-whisper", "webdav", "webdb", "webex", "webhook", "webhookd", "webkit", "webmin", "webtools", "webtop", "webtorrent", "webtrees", "wekan", "wero-dark", "wero", "western-digital", "wetty", "wevr-labs", "wg-gen-web-light", "wg-gen-web", "wger", "whatnot", "whats-up-docker", "whatsapp", "whisparr", "whodb", "whoogle", "wifiman", "wiki-go", "wikidocs", "wikijs-alt", "wikijs", "wikipedia-light", "wikipedia", "willow", "windmill", "windows-10", "windows-11", "windows-7", "windows-95-light", "windows-95", "windows-98", "windows-retro-light", "windows-retro", "windows-vista", "windows-xp", "wireguard", "wirenboard", "wireshark", "wizarr", "wled", "wolfi-light", "wolfi", "woocommerce", "woodpecker-ci", "wooting-dark", "wooting", "wordpress", "workadventure", "worklenz", "wotdle-light", "wotdle", "wownero", "writefreely-light", "writefreely", "wsz", "x-light", "x", "xbackbone", "xbox-game-pass", "xbox", "xbrowsersync", "xcp-ng", "xen-orchestra", "xiaomi-global", "xigmanas", "xmr", "xmrig", "xpipe", "xteve", "xubuntu-linux", "xwiki", "yaade", "yac-reader", "yacd-blue", "yacd", "yacht", "yahoo-mail", "yahoo", "yamtrack-light", "yamtrack", "yandex", "yarn-social", "yarr-light", "yarr", "yazi", "ycombinator-dark", "ycombinator", "ymarks", "ynab", "your-spotify", "yourls", "youtarr", "youtube-dl", "youtube-kids", "youtube-music", "youtube-tv", "youtube", "yt-dlp", "yts", "yuno-host-light", "yunohost", "z-ai", "z-wave-js-ui", "zabbix", "zabka", "zalo", "zammad", "zapier-dark", "zapier", "zashboard-dark", "zashboard", "zen-browser-dark", "zen-browser", "zenarmor", "zendesk", "zerotier-light", "zerotier", "zigbee2mqtt-light", "zigbee2mqtt", "zima-os", "zimbra", "zipcaptions", "zipline-diced", "zipline-light", "zipline", "zitadel-light", "zitadel", "znc", "zohomail", "zomro", "zoneminder", "zoom-alt", "zoom", "zoraxy", "zorin-linux", "zot-registry", "zulip", "zwavejs2mqtt", "zyxel-communications-light", "zyxel-communications", "zyxel-networks-light", "zyxel-networks"
        ];

        const fontawesomeIcons = [
            "fa-brands fa-500px", "fa-brands fa-accessible-icon", "fa-brands fa-accusoft", "fa-brands fa-acquisitions-incorporated", "fa-solid fa-ad", "fa-solid fa-address-book", "fa-regular fa-address-book", "fa-solid fa-address-card", "fa-regular fa-address-card", "fa-solid fa-adjust", "fa-brands fa-adn", "fa-brands fa-adversal", "fa-brands fa-affiliatetheme", "fa-solid fa-air-freshener", "fa-brands fa-airbnb", "fa-brands fa-algolia", "fa-solid fa-align-center", "fa-solid fa-align-justify", "fa-solid fa-align-left", "fa-solid fa-align-right", "fa-brands fa-alipay", "fa-solid fa-allergies", "fa-brands fa-amazon", "fa-brands fa-amazon-pay", "fa-solid fa-ambulance", "fa-solid fa-american-sign-language-interpreting", "fa-brands fa-amilia", "fa-solid fa-anchor", "fa-brands fa-android", "fa-brands fa-angellist", "fa-solid fa-angle-double-down", "fa-solid fa-angle-double-left", "fa-solid fa-angle-double-right", "fa-solid fa-angle-double-up", "fa-solid fa-angle-down", "fa-solid fa-angle-left", "fa-solid fa-angle-right", "fa-solid fa-angle-up", "fa-solid fa-angry", "fa-regular fa-angry", "fa-brands fa-angrycreative", "fa-brands fa-angular", "fa-solid fa-ankh", "fa-brands fa-app-store", "fa-brands fa-app-store-ios", "fa-brands fa-apper", "fa-brands fa-apple", "fa-solid fa-apple-alt", "fa-brands fa-apple-pay", "fa-solid fa-archive", "fa-solid fa-archway", "fa-solid fa-arrow-alt-circle-down", "fa-regular fa-arrow-alt-circle-down", "fa-solid fa-arrow-alt-circle-left", "fa-regular fa-arrow-alt-circle-left", "fa-solid fa-arrow-alt-circle-right", "fa-regular fa-arrow-alt-circle-right", "fa-solid fa-arrow-alt-circle-up", "fa-regular fa-arrow-alt-circle-up", "fa-solid fa-arrow-circle-down", "fa-solid fa-arrow-circle-left", "fa-solid fa-arrow-circle-right", "fa-solid fa-arrow-circle-up", "fa-solid fa-arrow-down", "fa-solid fa-arrow-left", "fa-solid fa-arrow-right", "fa-solid fa-arrow-up", "fa-solid fa-arrows-alt", "fa-solid fa-arrows-alt-h", "fa-solid fa-arrows-alt-v", "fa-brands fa-artstation", "fa-solid fa-assistive-listening-systems", "fa-solid fa-asterisk", "fa-brands fa-asymmetrik", "fa-solid fa-at", "fa-solid fa-atlas", "fa-brands fa-atlassian", "fa-solid fa-atom", "fa-brands fa-audible", "fa-solid fa-audio-description", "fa-brands fa-autoprefixer", "fa-brands fa-avianex", "fa-brands fa-aviato", "fa-solid fa-award", "fa-brands fa-aws", "fa-solid fa-baby", "fa-solid fa-baby-carriage", "fa-solid fa-backspace", "fa-solid fa-backward", "fa-solid fa-bacon", "fa-solid fa-bacteria", "fa-solid fa-bacterium", "fa-solid fa-bahai", "fa-solid fa-balance-scale", "fa-solid fa-balance-scale-left", "fa-solid fa-balance-scale-right", "fa-solid fa-ban", "fa-solid fa-band-aid", "fa-brands fa-bandcamp", "fa-solid fa-barcode", "fa-solid fa-bars", "fa-solid fa-baseball-ball", "fa-solid fa-basketball-ball", "fa-solid fa-bath", "fa-solid fa-battery-empty", "fa-solid fa-battery-full", "fa-solid fa-battery-half", "fa-solid fa-battery-quarter", "fa-solid fa-battery-three-quarters", "fa-brands fa-battle-net", "fa-solid fa-bed", "fa-solid fa-beer", "fa-brands fa-behance", "fa-brands fa-behance-square", "fa-solid fa-bell", "fa-regular fa-bell", "fa-solid fa-bell-slash", "fa-regular fa-bell-slash", "fa-solid fa-bezier-curve", "fa-solid fa-bible", "fa-solid fa-bicycle", "fa-solid fa-biking", "fa-brands fa-bimobject", "fa-solid fa-binoculars", "fa-solid fa-biohazard", "fa-solid fa-birthday-cake", "fa-brands fa-bitbucket", "fa-brands fa-bitcoin", "fa-brands fa-bity", "fa-brands fa-black-tie", "fa-brands fa-blackberry", "fa-solid fa-blender", "fa-solid fa-blender-phone", "fa-solid fa-blind", "fa-solid fa-blog", "fa-brands fa-blogger", "fa-brands fa-blogger-b", "fa-brands fa-bluetooth", "fa-brands fa-bluetooth-b", "fa-solid fa-bold", "fa-solid fa-bolt", "fa-solid fa-bomb", "fa-solid fa-bone", "fa-solid fa-bong", "fa-solid fa-book", "fa-solid fa-book-dead", "fa-solid fa-book-medical", "fa-solid fa-book-open", "fa-solid fa-book-reader", "fa-solid fa-bookmark", "fa-regular fa-bookmark", "fa-brands fa-bootstrap", "fa-solid fa-border-all", "fa-solid fa-border-none", "fa-solid fa-border-style", "fa-solid fa-bowling-ball", "fa-solid fa-box", "fa-solid fa-box-open", "fa-solid fa-box-tissue", "fa-solid fa-boxes", "fa-solid fa-braille", "fa-solid fa-brain", "fa-solid fa-bread-slice", "fa-solid fa-briefcase", "fa-solid fa-briefcase-medical", "fa-solid fa-broadcast-tower", "fa-solid fa-broom", "fa-solid fa-brush", "fa-brands fa-btc", "fa-brands fa-buffer", "fa-solid fa-bug", "fa-solid fa-building", "fa-regular fa-building", "fa-solid fa-bullhorn", "fa-solid fa-bullseye", "fa-solid fa-burn", "fa-brands fa-buromobelexperte", "fa-solid fa-bus", "fa-solid fa-bus-alt", "fa-solid fa-business-time", "fa-brands fa-buy-n-large", "fa-brands fa-buysellads", "fa-solid fa-calculator", "fa-solid fa-calendar", "fa-regular fa-calendar", "fa-solid fa-calendar-alt", "fa-regular fa-calendar-alt", "fa-solid fa-calendar-check", "fa-regular fa-calendar-check", "fa-solid fa-calendar-day", "fa-solid fa-calendar-minus", "fa-regular fa-calendar-minus", "fa-solid fa-calendar-plus", "fa-regular fa-calendar-plus", "fa-solid fa-calendar-times", "fa-regular fa-calendar-times", "fa-solid fa-calendar-week", "fa-solid fa-camera", "fa-solid fa-camera-retro", "fa-solid fa-campground", "fa-brands fa-canadian-maple-leaf", "fa-solid fa-candy-cane", "fa-solid fa-cannabis", "fa-solid fa-capsules", "fa-solid fa-car", "fa-solid fa-car-alt", "fa-solid fa-car-battery", "fa-solid fa-car-crash", "fa-solid fa-car-side", "fa-solid fa-caravan", "fa-solid fa-caret-down", "fa-solid fa-caret-left", "fa-solid fa-caret-right", "fa-solid fa-caret-square-down", "fa-regular fa-caret-square-down", "fa-solid fa-caret-square-left", "fa-regular fa-caret-square-left", "fa-solid fa-caret-square-right", "fa-regular fa-caret-square-right", "fa-solid fa-caret-square-up", "fa-regular fa-caret-square-up", "fa-solid fa-caret-up", "fa-solid fa-carrot", "fa-solid fa-cart-arrow-down", "fa-solid fa-cart-plus", "fa-solid fa-cash-register", "fa-solid fa-cat", "fa-brands fa-cc-amazon-pay", "fa-brands fa-cc-amex", "fa-brands fa-cc-apple-pay", "fa-brands fa-cc-diners-club", "fa-brands fa-cc-discover", "fa-brands fa-cc-jcb", "fa-brands fa-cc-mastercard", "fa-brands fa-cc-paypal", "fa-brands fa-cc-stripe", "fa-brands fa-cc-visa", "fa-brands fa-centercode", "fa-brands fa-centos", "fa-solid fa-certificate", "fa-solid fa-chair", "fa-solid fa-chalkboard", "fa-solid fa-chalkboard-teacher", "fa-solid fa-charging-station", "fa-solid fa-chart-area", "fa-solid fa-chart-bar", "fa-regular fa-chart-bar", "fa-solid fa-chart-line", "fa-solid fa-chart-pie", "fa-solid fa-check", "fa-solid fa-check-circle", "fa-regular fa-check-circle", "fa-solid fa-check-double", "fa-solid fa-check-square", "fa-regular fa-check-square", "fa-solid fa-cheese", "fa-solid fa-chess", "fa-solid fa-chess-bishop", "fa-solid fa-chess-board", "fa-solid fa-chess-king", "fa-solid fa-chess-knight", "fa-solid fa-chess-pawn", "fa-solid fa-chess-queen", "fa-solid fa-chess-rook", "fa-solid fa-chevron-circle-down", "fa-solid fa-chevron-circle-left", "fa-solid fa-chevron-circle-right", "fa-solid fa-chevron-circle-up", "fa-solid fa-chevron-down", "fa-solid fa-chevron-left", "fa-solid fa-chevron-right", "fa-solid fa-chevron-up", "fa-solid fa-child", "fa-brands fa-chrome", "fa-brands fa-chromecast", "fa-solid fa-church", "fa-solid fa-circle", "fa-regular fa-circle", "fa-solid fa-circle-notch", "fa-solid fa-city", "fa-solid fa-clinic-medical", "fa-solid fa-clipboard", "fa-regular fa-clipboard", "fa-solid fa-clipboard-check", "fa-solid fa-clipboard-list", "fa-solid fa-clock", "fa-regular fa-clock", "fa-solid fa-clone", "fa-regular fa-clone", "fa-solid fa-closed-captioning", "fa-regular fa-closed-captioning", "fa-solid fa-cloud", "fa-solid fa-cloud-download-alt", "fa-solid fa-cloud-meatball", "fa-solid fa-cloud-moon", "fa-solid fa-cloud-moon-rain", "fa-solid fa-cloud-rain", "fa-solid fa-cloud-showers-heavy", "fa-solid fa-cloud-sun", "fa-solid fa-cloud-sun-rain", "fa-solid fa-cloud-upload-alt", "fa-brands fa-cloudflare", "fa-brands fa-cloudscale", "fa-brands fa-cloudsmith", "fa-brands fa-cloudversify", "fa-solid fa-cocktail", "fa-solid fa-code", "fa-solid fa-code-branch", "fa-brands fa-codepen", "fa-brands fa-codiepie", "fa-solid fa-coffee", "fa-solid fa-cog", "fa-solid fa-cogs", "fa-solid fa-coins", "fa-solid fa-columns", "fa-solid fa-comment", "fa-regular fa-comment", "fa-solid fa-comment-alt", "fa-regular fa-comment-alt", "fa-solid fa-comment-dollar", "fa-solid fa-comment-dots", "fa-regular fa-comment-dots", "fa-solid fa-comment-medical", "fa-solid fa-comment-slash", "fa-solid fa-comments", "fa-regular fa-comments", "fa-solid fa-comments-dollar", "fa-solid fa-compact-disc", "fa-solid fa-compass", "fa-regular fa-compass", "fa-solid fa-compress", "fa-solid fa-compress-alt", "fa-solid fa-compress-arrows-alt", "fa-solid fa-concierge-bell", "fa-brands fa-confluence", "fa-brands fa-connectdevelop", "fa-brands fa-contao", "fa-solid fa-cookie", "fa-solid fa-cookie-bite", "fa-solid fa-copy", "fa-regular fa-copy", "fa-solid fa-copyright", "fa-regular fa-copyright", "fa-brands fa-cotton-bureau", "fa-solid fa-couch", "fa-brands fa-cpanel", "fa-brands fa-creative-commons", "fa-brands fa-creative-commons-by", "fa-brands fa-creative-commons-nc", "fa-brands fa-creative-commons-nc-eu", "fa-brands fa-creative-commons-nc-jp", "fa-brands fa-creative-commons-nd", "fa-brands fa-creative-commons-pd", "fa-brands fa-creative-commons-pd-alt", "fa-brands fa-creative-commons-remix", "fa-brands fa-creative-commons-sa", "fa-brands fa-creative-commons-sampling", "fa-brands fa-creative-commons-sampling-plus", "fa-brands fa-creative-commons-share", "fa-brands fa-creative-commons-zero", "fa-solid fa-credit-card", "fa-regular fa-credit-card", "fa-brands fa-critical-role", "fa-solid fa-crop", "fa-solid fa-crop-alt", "fa-solid fa-cross", "fa-solid fa-crosshairs", "fa-solid fa-crow", "fa-solid fa-crown", "fa-solid fa-crutch", "fa-brands fa-css3", "fa-brands fa-css3-alt", "fa-solid fa-cube", "fa-solid fa-cubes", "fa-solid fa-cut", "fa-brands fa-cuttlefish", "fa-brands fa-d-and-d", "fa-brands fa-d-and-d-beyond", "fa-brands fa-dailymotion", "fa-brands fa-dashcube", "fa-solid fa-database", "fa-solid fa-deaf", "fa-brands fa-deezer", "fa-brands fa-delicious", "fa-solid fa-democrat", "fa-brands fa-deploydog", "fa-brands fa-deskpro", "fa-solid fa-desktop", "fa-brands fa-dev", "fa-brands fa-deviantart", "fa-solid fa-dharmachakra", "fa-brands fa-dhl", "fa-solid fa-diagnoses", "fa-brands fa-diaspora", "fa-solid fa-dice", "fa-solid fa-dice-d20", "fa-solid fa-dice-d6", "fa-solid fa-dice-five", "fa-solid fa-dice-four", "fa-solid fa-dice-one", "fa-solid fa-dice-six", "fa-solid fa-dice-three", "fa-solid fa-dice-two", "fa-brands fa-digg", "fa-brands fa-digital-ocean", "fa-solid fa-digital-tachograph", "fa-solid fa-directions", "fa-brands fa-discord", "fa-brands fa-discourse", "fa-solid fa-disease", "fa-solid fa-divide", "fa-solid fa-dizzy", "fa-regular fa-dizzy", "fa-solid fa-dna", "fa-brands fa-dochub", "fa-brands fa-docker", "fa-solid fa-dog", "fa-solid fa-dollar-sign", "fa-solid fa-dolly", "fa-solid fa-dolly-flatbed", "fa-solid fa-donate", "fa-solid fa-door-closed", "fa-solid fa-door-open", "fa-solid fa-dot-circle", "fa-regular fa-dot-circle", "fa-solid fa-dove", "fa-solid fa-download", "fa-brands fa-draft2digital", "fa-solid fa-drafting-compass", "fa-solid fa-dragon", "fa-solid fa-draw-polygon", "fa-brands fa-dribbble", "fa-brands fa-dribbble-square", "fa-brands fa-dropbox", "fa-solid fa-drum", "fa-solid fa-drum-steelpan", "fa-solid fa-drumstick-bite", "fa-brands fa-drupal", "fa-solid fa-dumbbell", "fa-solid fa-dumpster", "fa-solid fa-dumpster-fire", "fa-solid fa-dungeon", "fa-brands fa-dyalog", "fa-brands fa-earlybirds", "fa-brands fa-ebay", "fa-brands fa-edge", "fa-brands fa-edge-legacy", "fa-solid fa-edit", "fa-regular fa-edit", "fa-solid fa-egg", "fa-solid fa-eject", "fa-brands fa-elementor", "fa-solid fa-ellipsis-h", "fa-solid fa-ellipsis-v", "fa-brands fa-ello", "fa-brands fa-ember", "fa-brands fa-empire", "fa-solid fa-envelope", "fa-regular fa-envelope", "fa-solid fa-envelope-open", "fa-regular fa-envelope-open", "fa-solid fa-envelope-open-text", "fa-solid fa-envelope-square", "fa-brands fa-envira", "fa-solid fa-equals", "fa-solid fa-eraser", "fa-brands fa-erlang", "fa-brands fa-ethereum", "fa-solid fa-ethernet", "fa-brands fa-etsy", "fa-solid fa-euro-sign", "fa-brands fa-evernote", "fa-solid fa-exchange-alt", "fa-solid fa-exclamation", "fa-solid fa-exclamation-circle", "fa-solid fa-exclamation-triangle", "fa-solid fa-expand", "fa-solid fa-expand-alt", "fa-solid fa-expand-arrows-alt", "fa-brands fa-expeditedssl", "fa-solid fa-external-link-alt", "fa-solid fa-external-link-square-alt", "fa-solid fa-eye", "fa-regular fa-eye", "fa-solid fa-eye-dropper", "fa-solid fa-eye-slash", "fa-regular fa-eye-slash", "fa-brands fa-facebook", "fa-brands fa-facebook-f", "fa-brands fa-facebook-messenger", "fa-brands fa-facebook-square", "fa-solid fa-fan", "fa-brands fa-fantasy-flight-games", "fa-solid fa-fast-backward", "fa-solid fa-fast-forward", "fa-solid fa-faucet", "fa-solid fa-fax", "fa-solid fa-feather", "fa-solid fa-feather-alt", "fa-brands fa-fedex", "fa-brands fa-fedora", "fa-solid fa-female", "fa-solid fa-fighter-jet", "fa-brands fa-figma", "fa-solid fa-file", "fa-regular fa-file", "fa-solid fa-file-alt", "fa-regular fa-file-alt", "fa-solid fa-file-archive", "fa-regular fa-file-archive", "fa-solid fa-file-audio", "fa-regular fa-file-audio", "fa-solid fa-file-code", "fa-regular fa-file-code", "fa-solid fa-file-contract", "fa-solid fa-file-csv", "fa-solid fa-file-download", "fa-solid fa-file-excel", "fa-regular fa-file-excel", "fa-solid fa-file-export", "fa-solid fa-file-image", "fa-regular fa-file-image", "fa-solid fa-file-import", "fa-solid fa-file-invoice", "fa-solid fa-file-invoice-dollar", "fa-solid fa-file-medical", "fa-solid fa-file-medical-alt", "fa-solid fa-file-pdf", "fa-regular fa-file-pdf", "fa-solid fa-file-powerpoint", "fa-regular fa-file-powerpoint", "fa-solid fa-file-prescription", "fa-solid fa-file-signature", "fa-solid fa-file-upload", "fa-solid fa-file-video", "fa-regular fa-file-video", "fa-solid fa-file-word", "fa-regular fa-file-word", "fa-solid fa-fill", "fa-solid fa-fill-drip", "fa-solid fa-film", "fa-solid fa-filter", "fa-solid fa-fingerprint", "fa-solid fa-fire", "fa-solid fa-fire-alt", "fa-solid fa-fire-extinguisher", "fa-brands fa-firefox", "fa-brands fa-firefox-browser", "fa-solid fa-first-aid", "fa-brands fa-first-order", "fa-brands fa-first-order-alt", "fa-brands fa-firstdraft", "fa-solid fa-fish", "fa-solid fa-fist-raised", "fa-solid fa-flag", "fa-regular fa-flag", "fa-solid fa-flag-checkered", "fa-solid fa-flag-usa", "fa-solid fa-flask", "fa-brands fa-flickr", "fa-brands fa-flipboard", "fa-solid fa-flushed", "fa-regular fa-flushed", "fa-brands fa-fly", "fa-solid fa-folder", "fa-regular fa-folder", "fa-solid fa-folder-minus", "fa-solid fa-folder-open", "fa-regular fa-folder-open", "fa-solid fa-folder-plus", "fa-solid fa-font", "fa-brands fa-font-awesome", "fa-brands fa-font-awesome-alt", "fa-brands fa-font-awesome-flag", "fa-regular fa-font-awesome-logo-full", "fa-solid fa-font-awesome-logo-full", "fa-brands fa-font-awesome-logo-full", "fa-brands fa-fonticons", "fa-brands fa-fonticons-fi", "fa-solid fa-football-ball", "fa-brands fa-fort-awesome", "fa-brands fa-fort-awesome-alt", "fa-brands fa-forumbee", "fa-solid fa-forward", "fa-brands fa-foursquare", "fa-brands fa-free-code-camp", "fa-brands fa-freebsd", "fa-solid fa-frog", "fa-solid fa-frown", "fa-regular fa-frown", "fa-solid fa-frown-open", "fa-regular fa-frown-open", "fa-brands fa-fulcrum", "fa-solid fa-funnel-dollar", "fa-solid fa-futbol", "fa-regular fa-futbol", "fa-brands fa-galactic-republic", "fa-brands fa-galactic-senate", "fa-solid fa-gamepad", "fa-solid fa-gas-pump", "fa-solid fa-gavel", "fa-solid fa-gem", "fa-regular fa-gem", "fa-solid fa-genderless", "fa-brands fa-get-pocket", "fa-brands fa-gg", "fa-brands fa-gg-circle", "fa-solid fa-ghost", "fa-solid fa-gift", "fa-solid fa-gifts", "fa-brands fa-git", "fa-brands fa-git-alt", "fa-brands fa-git-square", "fa-brands fa-github", "fa-brands fa-github-alt", "fa-brands fa-github-square", "fa-brands fa-gitkraken", "fa-brands fa-gitlab", "fa-brands fa-gitter", "fa-solid fa-glass-cheers", "fa-solid fa-glass-martini", "fa-solid fa-glass-martini-alt", "fa-solid fa-glass-whiskey", "fa-solid fa-glasses", "fa-brands fa-glide", "fa-brands fa-glide-g", "fa-solid fa-globe", "fa-solid fa-globe-africa", "fa-solid fa-globe-americas", "fa-solid fa-globe-asia", "fa-solid fa-globe-europe", "fa-brands fa-gofore", "fa-solid fa-golf-ball", "fa-brands fa-goodreads", "fa-brands fa-goodreads-g", "fa-brands fa-google", "fa-brands fa-google-drive", "fa-brands fa-google-pay", "fa-brands fa-google-play", "fa-brands fa-google-plus", "fa-brands fa-google-plus-g", "fa-brands fa-google-plus-square", "fa-brands fa-google-wallet", "fa-solid fa-gopuram", "fa-solid fa-graduation-cap", "fa-brands fa-gratipay", "fa-brands fa-grav", "fa-solid fa-greater-than", "fa-solid fa-greater-than-equal", "fa-solid fa-grimace", "fa-regular fa-grimace", "fa-solid fa-grin", "fa-regular fa-grin", "fa-solid fa-grin-alt", "fa-regular fa-grin-alt", "fa-solid fa-grin-beam", "fa-regular fa-grin-beam", "fa-solid fa-grin-beam-sweat", "fa-regular fa-grin-beam-sweat", "fa-solid fa-grin-hearts", "fa-regular fa-grin-hearts", "fa-solid fa-grin-squint", "fa-regular fa-grin-squint", "fa-solid fa-grin-squint-tears", "fa-regular fa-grin-squint-tears", "fa-solid fa-grin-stars", "fa-regular fa-grin-stars", "fa-solid fa-grin-tears", "fa-regular fa-grin-tears", "fa-solid fa-grin-tongue", "fa-regular fa-grin-tongue", "fa-solid fa-grin-tongue-squint", "fa-regular fa-grin-tongue-squint", "fa-solid fa-grin-tongue-wink", "fa-regular fa-grin-tongue-wink", "fa-solid fa-grin-wink", "fa-regular fa-grin-wink", "fa-solid fa-grip-horizontal", "fa-solid fa-grip-lines", "fa-solid fa-grip-lines-vertical", "fa-solid fa-grip-vertical", "fa-brands fa-gripfire", "fa-brands fa-grunt", "fa-brands fa-guilded", "fa-solid fa-guitar", "fa-brands fa-gulp", "fa-solid fa-h-square", "fa-brands fa-hacker-news", "fa-brands fa-hacker-news-square", "fa-brands fa-hackerrank", "fa-solid fa-hamburger", "fa-solid fa-hammer", "fa-solid fa-hamsa", "fa-solid fa-hand-holding", "fa-solid fa-hand-holding-heart", "fa-solid fa-hand-holding-medical", "fa-solid fa-hand-holding-usd", "fa-solid fa-hand-holding-water", "fa-solid fa-hand-lizard", "fa-regular fa-hand-lizard", "fa-solid fa-hand-middle-finger", "fa-solid fa-hand-paper", "fa-regular fa-hand-paper", "fa-solid fa-hand-peace", "fa-regular fa-hand-peace", "fa-solid fa-hand-point-down", "fa-regular fa-hand-point-down", "fa-solid fa-hand-point-left", "fa-regular fa-hand-point-left", "fa-solid fa-hand-point-right", "fa-regular fa-hand-point-right", "fa-solid fa-hand-point-up", "fa-regular fa-hand-point-up", "fa-solid fa-hand-pointer", "fa-regular fa-hand-pointer", "fa-solid fa-hand-rock", "fa-regular fa-hand-rock", "fa-solid fa-hand-scissors", "fa-regular fa-hand-scissors", "fa-solid fa-hand-sparkles", "fa-solid fa-hand-spock", "fa-regular fa-hand-spock", "fa-solid fa-hands", "fa-solid fa-hands-helping", "fa-solid fa-hands-wash", "fa-solid fa-handshake", "fa-regular fa-handshake", "fa-solid fa-handshake-alt-slash", "fa-solid fa-handshake-slash", "fa-solid fa-hanukiah", "fa-solid fa-hard-hat", "fa-solid fa-hashtag", "fa-solid fa-hat-cowboy", "fa-solid fa-hat-cowboy-side", "fa-solid fa-hat-wizard", "fa-solid fa-hdd", "fa-regular fa-hdd", "fa-solid fa-head-side-cough", "fa-solid fa-head-side-cough-slash", "fa-solid fa-head-side-mask", "fa-solid fa-head-side-virus", "fa-solid fa-heading", "fa-solid fa-headphones", "fa-solid fa-headphones-alt", "fa-solid fa-headset", "fa-solid fa-heart", "fa-regular fa-heart", "fa-solid fa-heart-broken", "fa-solid fa-heartbeat", "fa-solid fa-helicopter", "fa-solid fa-highlighter", "fa-solid fa-hiking", "fa-solid fa-hippo", "fa-brands fa-hips", "fa-brands fa-hire-a-helper", "fa-solid fa-history", "fa-brands fa-hive", "fa-solid fa-hockey-puck", "fa-solid fa-holly-berry", "fa-solid fa-home", "fa-brands fa-hooli", "fa-brands fa-hornbill", "fa-solid fa-horse", "fa-solid fa-horse-head", "fa-solid fa-hospital", "fa-regular fa-hospital", "fa-solid fa-hospital-alt", "fa-solid fa-hospital-symbol", "fa-solid fa-hospital-user", "fa-solid fa-hot-tub", "fa-solid fa-hotdog", "fa-solid fa-hotel", "fa-brands fa-hotjar", "fa-solid fa-hourglass", "fa-regular fa-hourglass", "fa-solid fa-hourglass-end", "fa-solid fa-hourglass-half", "fa-solid fa-hourglass-start", "fa-solid fa-house-damage", "fa-solid fa-house-user", "fa-brands fa-houzz", "fa-solid fa-hryvnia", "fa-brands fa-html5", "fa-brands fa-hubspot", "fa-solid fa-i-cursor", "fa-solid fa-ice-cream", "fa-solid fa-icicles", "fa-solid fa-icons", "fa-solid fa-id-badge", "fa-regular fa-id-badge", "fa-solid fa-id-card", "fa-regular fa-id-card", "fa-solid fa-id-card-alt", "fa-brands fa-ideal", "fa-solid fa-igloo", "fa-solid fa-image", "fa-regular fa-image", "fa-solid fa-images", "fa-regular fa-images", "fa-brands fa-imdb", "fa-solid fa-inbox", "fa-solid fa-indent", "fa-solid fa-industry", "fa-solid fa-infinity", "fa-solid fa-info", "fa-solid fa-info-circle", "fa-brands fa-innosoft", "fa-brands fa-instagram", "fa-brands fa-instagram-square", "fa-brands fa-instalod", "fa-brands fa-intercom", "fa-brands fa-internet-explorer", "fa-brands fa-invision", "fa-brands fa-ioxhost", "fa-solid fa-italic", "fa-brands fa-itch-io", "fa-brands fa-itunes", "fa-brands fa-itunes-note", "fa-brands fa-java", "fa-solid fa-jedi", "fa-brands fa-jedi-order", "fa-brands fa-jenkins", "fa-brands fa-jira", "fa-brands fa-joget", "fa-solid fa-joint", "fa-brands fa-joomla", "fa-solid fa-journal-whills", "fa-brands fa-js", "fa-brands fa-js-square", "fa-brands fa-jsfiddle", "fa-solid fa-kaaba", "fa-brands fa-kaggle", "fa-solid fa-key", "fa-brands fa-keybase", "fa-solid fa-keyboard", "fa-regular fa-keyboard", "fa-brands fa-keycdn", "fa-solid fa-khanda", "fa-brands fa-kickstarter", "fa-brands fa-kickstarter-k", "fa-solid fa-kiss", "fa-regular fa-kiss", "fa-solid fa-kiss-beam", "fa-regular fa-kiss-beam", "fa-solid fa-kiss-wink-heart", "fa-regular fa-kiss-wink-heart", "fa-solid fa-kiwi-bird", "fa-brands fa-korvue", "fa-solid fa-landmark", "fa-solid fa-language", "fa-solid fa-laptop", "fa-solid fa-laptop-code", "fa-solid fa-laptop-house", "fa-solid fa-laptop-medical", "fa-brands fa-laravel", "fa-brands fa-lastfm", "fa-brands fa-lastfm-square", "fa-solid fa-laugh", "fa-regular fa-laugh", "fa-solid fa-laugh-beam", "fa-regular fa-laugh-beam", "fa-solid fa-laugh-squint", "fa-regular fa-laugh-squint", "fa-solid fa-laugh-wink", "fa-regular fa-laugh-wink", "fa-solid fa-layer-group", "fa-solid fa-leaf", "fa-brands fa-leanpub", "fa-solid fa-lemon", "fa-regular fa-lemon", "fa-brands fa-less", "fa-solid fa-less-than", "fa-solid fa-less-than-equal", "fa-solid fa-level-down-alt", "fa-solid fa-level-up-alt", "fa-solid fa-life-ring", "fa-regular fa-life-ring", "fa-solid fa-lightbulb", "fa-regular fa-lightbulb", "fa-brands fa-line", "fa-solid fa-link", "fa-brands fa-linkedin", "fa-brands fa-linkedin-in", "fa-brands fa-linode", "fa-brands fa-linux", "fa-solid fa-lira-sign", "fa-solid fa-list", "fa-solid fa-list-alt", "fa-regular fa-list-alt", "fa-solid fa-list-ol", "fa-solid fa-list-ul", "fa-solid fa-location-arrow", "fa-solid fa-lock", "fa-solid fa-lock-open", "fa-solid fa-long-arrow-alt-down", "fa-solid fa-long-arrow-alt-left", "fa-solid fa-long-arrow-alt-right", "fa-solid fa-long-arrow-alt-up", "fa-solid fa-low-vision", "fa-solid fa-luggage-cart", "fa-solid fa-lungs", "fa-solid fa-lungs-virus", "fa-brands fa-lyft", "fa-brands fa-magento", "fa-solid fa-magic", "fa-solid fa-magnet", "fa-solid fa-mail-bulk", "fa-brands fa-mailchimp", "fa-solid fa-male", "fa-brands fa-mandalorian", "fa-solid fa-map", "fa-regular fa-map", "fa-solid fa-map-marked", "fa-solid fa-map-marked-alt", "fa-solid fa-map-marker", "fa-solid fa-map-marker-alt", "fa-solid fa-map-pin", "fa-solid fa-map-signs", "fa-brands fa-markdown", "fa-solid fa-marker", "fa-solid fa-mars", "fa-solid fa-mars-double", "fa-solid fa-mars-stroke", "fa-solid fa-mars-stroke-h", "fa-solid fa-mars-stroke-v", "fa-solid fa-mask", "fa-brands fa-mastodon", "fa-brands fa-maxcdn", "fa-brands fa-mdb", "fa-solid fa-medal", "fa-brands fa-medapps", "fa-brands fa-medium", "fa-brands fa-medium-m", "fa-solid fa-medkit", "fa-brands fa-medrt", "fa-brands fa-meetup", "fa-brands fa-megaport", "fa-solid fa-meh", "fa-regular fa-meh", "fa-solid fa-meh-blank", "fa-regular fa-meh-blank", "fa-solid fa-meh-rolling-eyes", "fa-regular fa-meh-rolling-eyes", "fa-solid fa-memory", "fa-brands fa-mendeley", "fa-solid fa-menorah", "fa-solid fa-mercury", "fa-solid fa-meteor", "fa-brands fa-microblog", "fa-solid fa-microchip", "fa-solid fa-microphone", "fa-solid fa-microphone-alt", "fa-solid fa-microphone-alt-slash", "fa-solid fa-microphone-slash", "fa-solid fa-microscope", "fa-brands fa-microsoft", "fa-solid fa-minus", "fa-solid fa-minus-circle", "fa-solid fa-minus-square", "fa-regular fa-minus-square", "fa-solid fa-mitten", "fa-brands fa-mix", "fa-brands fa-mixcloud", "fa-brands fa-mixer", "fa-brands fa-mizuni", "fa-solid fa-mobile", "fa-solid fa-mobile-alt", "fa-brands fa-modx", "fa-brands fa-monero", "fa-solid fa-money-bill", "fa-solid fa-money-bill-alt", "fa-regular fa-money-bill-alt", "fa-solid fa-money-bill-wave", "fa-solid fa-money-bill-wave-alt", "fa-solid fa-money-check", "fa-solid fa-money-check-alt", "fa-solid fa-monument", "fa-solid fa-moon", "fa-regular fa-moon", "fa-solid fa-mortar-pestle", "fa-solid fa-mosque", "fa-solid fa-motorcycle", "fa-solid fa-mountain", "fa-solid fa-mouse", "fa-solid fa-mouse-pointer", "fa-solid fa-mug-hot", "fa-solid fa-music", "fa-brands fa-napster", "fa-brands fa-neos", "fa-solid fa-network-wired", "fa-solid fa-neuter", "fa-solid fa-newspaper", "fa-regular fa-newspaper", "fa-brands fa-nimblr", "fa-brands fa-node", "fa-brands fa-node-js", "fa-solid fa-not-equal", "fa-solid fa-notes-medical", "fa-brands fa-npm", "fa-brands fa-ns8", "fa-brands fa-nutritionix", "fa-solid fa-object-group", "fa-regular fa-object-group", "fa-solid fa-object-ungroup", "fa-regular fa-object-ungroup", "fa-brands fa-octopus-deploy", "fa-brands fa-odnoklassniki", "fa-brands fa-odnoklassniki-square", "fa-solid fa-oil-can", "fa-brands fa-old-republic", "fa-solid fa-om", "fa-brands fa-opencart", "fa-brands fa-openid", "fa-brands fa-opera", "fa-brands fa-optin-monster", "fa-brands fa-orcid", "fa-brands fa-osi", "fa-solid fa-otter", "fa-solid fa-outdent", "fa-brands fa-page4", "fa-brands fa-pagelines", "fa-solid fa-pager", "fa-solid fa-paint-brush", "fa-solid fa-paint-roller", "fa-solid fa-palette", "fa-brands fa-palfed", "fa-solid fa-pallet", "fa-solid fa-paper-plane", "fa-regular fa-paper-plane", "fa-solid fa-paperclip", "fa-solid fa-parachute-box", "fa-solid fa-paragraph", "fa-solid fa-parking", "fa-solid fa-passport", "fa-solid fa-pastafarianism", "fa-solid fa-paste", "fa-brands fa-patreon", "fa-solid fa-pause", "fa-solid fa-pause-circle", "fa-regular fa-pause-circle", "fa-solid fa-paw", "fa-brands fa-paypal", "fa-solid fa-peace", "fa-solid fa-pen", "fa-solid fa-pen-alt", "fa-solid fa-pen-fancy", "fa-solid fa-pen-nib", "fa-solid fa-pen-square", "fa-solid fa-pencil-alt", "fa-solid fa-pencil-ruler", "fa-brands fa-penny-arcade", "fa-solid fa-people-arrows", "fa-solid fa-people-carry", "fa-solid fa-pepper-hot", "fa-brands fa-perbyte", "fa-solid fa-percent", "fa-solid fa-percentage", "fa-brands fa-periscope", "fa-solid fa-person-booth", "fa-brands fa-phabricator", "fa-brands fa-phoenix-framework", "fa-brands fa-phoenix-squadron", "fa-solid fa-phone", "fa-solid fa-phone-alt", "fa-solid fa-phone-slash", "fa-solid fa-phone-square", "fa-solid fa-phone-square-alt", "fa-solid fa-phone-volume", "fa-solid fa-photo-video", "fa-brands fa-php", "fa-brands fa-pied-piper", "fa-brands fa-pied-piper-alt", "fa-brands fa-pied-piper-hat", "fa-brands fa-pied-piper-pp", "fa-brands fa-pied-piper-square", "fa-solid fa-piggy-bank", "fa-solid fa-pills", "fa-brands fa-pinterest", "fa-brands fa-pinterest-p", "fa-brands fa-pinterest-square", "fa-solid fa-pizza-slice", "fa-solid fa-place-of-worship", "fa-solid fa-plane", "fa-solid fa-plane-arrival", "fa-solid fa-plane-departure", "fa-solid fa-plane-slash", "fa-solid fa-play", "fa-solid fa-play-circle", "fa-regular fa-play-circle", "fa-brands fa-playstation", "fa-solid fa-plug", "fa-solid fa-plus", "fa-solid fa-plus-circle", "fa-solid fa-plus-square", "fa-regular fa-plus-square", "fa-solid fa-podcast", "fa-solid fa-poll", "fa-solid fa-poll-h", "fa-solid fa-poo", "fa-solid fa-poo-storm", "fa-solid fa-poop", "fa-solid fa-portrait", "fa-solid fa-pound-sign", "fa-solid fa-power-off", "fa-solid fa-pray", "fa-solid fa-praying-hands", "fa-solid fa-prescription", "fa-solid fa-prescription-bottle", "fa-solid fa-prescription-bottle-alt", "fa-solid fa-print", "fa-solid fa-procedures", "fa-brands fa-product-hunt", "fa-solid fa-project-diagram", "fa-solid fa-pump-medical", "fa-solid fa-pump-soap", "fa-brands fa-pushed", "fa-solid fa-puzzle-piece", "fa-brands fa-python", "fa-brands fa-qq", "fa-solid fa-qrcode", "fa-solid fa-question", "fa-solid fa-question-circle", "fa-regular fa-question-circle", "fa-solid fa-quidditch", "fa-brands fa-quinscape", "fa-brands fa-quora", "fa-solid fa-quote-left", "fa-solid fa-quote-right", "fa-solid fa-quran", "fa-brands fa-r-project", "fa-solid fa-radiation", "fa-solid fa-radiation-alt", "fa-solid fa-rainbow", "fa-solid fa-random", "fa-brands fa-raspberry-pi", "fa-brands fa-ravelry", "fa-brands fa-react", "fa-brands fa-reacteurope", "fa-brands fa-readme", "fa-brands fa-rebel", "fa-solid fa-receipt", "fa-solid fa-record-vinyl", "fa-solid fa-recycle", "fa-brands fa-red-river", "fa-brands fa-reddit", "fa-brands fa-reddit-alien", "fa-brands fa-reddit-square", "fa-brands fa-redhat", "fa-solid fa-redo", "fa-solid fa-redo-alt", "fa-solid fa-registered", "fa-regular fa-registered", "fa-solid fa-remove-format", "fa-brands fa-renren", "fa-solid fa-reply", "fa-solid fa-reply-all", "fa-brands fa-replyd", "fa-solid fa-republican", "fa-brands fa-researchgate", "fa-brands fa-resolving", "fa-solid fa-restroom", "fa-solid fa-retweet", "fa-brands fa-rev", "fa-solid fa-ribbon", "fa-solid fa-ring", "fa-solid fa-road", "fa-solid fa-robot", "fa-solid fa-rocket", "fa-brands fa-rocketchat", "fa-brands fa-rockrms", "fa-solid fa-route", "fa-solid fa-rss", "fa-solid fa-rss-square", "fa-solid fa-ruble-sign", "fa-solid fa-ruler", "fa-solid fa-ruler-combined", "fa-solid fa-ruler-horizontal", "fa-solid fa-ruler-vertical", "fa-solid fa-running", "fa-solid fa-rupee-sign", "fa-brands fa-rust", "fa-solid fa-sad-cry", "fa-regular fa-sad-cry", "fa-solid fa-sad-tear", "fa-regular fa-sad-tear", "fa-brands fa-safari", "fa-brands fa-salesforce", "fa-brands fa-sass", "fa-solid fa-satellite", "fa-solid fa-satellite-dish", "fa-solid fa-save", "fa-regular fa-save", "fa-brands fa-schlix", "fa-solid fa-school", "fa-solid fa-screwdriver", "fa-brands fa-scribd", "fa-solid fa-scroll", "fa-solid fa-sd-card", "fa-solid fa-search", "fa-solid fa-search-dollar", "fa-solid fa-search-location", "fa-solid fa-search-minus", "fa-solid fa-search-plus", "fa-brands fa-searchengin", "fa-solid fa-seedling", "fa-brands fa-sellcast", "fa-brands fa-sellsy", "fa-solid fa-server", "fa-brands fa-servicestack", "fa-solid fa-shapes", "fa-solid fa-share", "fa-solid fa-share-alt", "fa-solid fa-share-alt-square", "fa-solid fa-share-square", "fa-regular fa-share-square", "fa-solid fa-shekel-sign", "fa-solid fa-shield-alt", "fa-solid fa-shield-virus", "fa-solid fa-ship", "fa-solid fa-shipping-fast", "fa-brands fa-shirtsinbulk", "fa-solid fa-shoe-prints", "fa-brands fa-shopify", "fa-solid fa-shopping-bag", "fa-solid fa-shopping-basket", "fa-solid fa-shopping-cart", "fa-brands fa-shopware", "fa-solid fa-shower", "fa-solid fa-shuttle-van", "fa-solid fa-sign", "fa-solid fa-sign-in-alt", "fa-solid fa-sign-language", "fa-solid fa-sign-out-alt", "fa-solid fa-signal", "fa-solid fa-signature", "fa-solid fa-sim-card", "fa-brands fa-simplybuilt", "fa-solid fa-sink", "fa-brands fa-sistrix", "fa-solid fa-sitemap", "fa-brands fa-sith", "fa-solid fa-skating", "fa-brands fa-sketch", "fa-solid fa-skiing", "fa-solid fa-skiing-nordic", "fa-solid fa-skull", "fa-solid fa-skull-crossbones", "fa-brands fa-skyatlas", "fa-brands fa-skype", "fa-brands fa-slack", "fa-brands fa-slack-hash", "fa-solid fa-slash", "fa-solid fa-sleigh", "fa-solid fa-sliders-h", "fa-brands fa-slideshare", "fa-solid fa-smile", "fa-regular fa-smile", "fa-solid fa-smile-beam", "fa-regular fa-smile-beam", "fa-solid fa-smile-wink", "fa-regular fa-smile-wink", "fa-solid fa-smog", "fa-solid fa-smoking", "fa-solid fa-smoking-ban", "fa-solid fa-sms", "fa-brands fa-snapchat", "fa-brands fa-snapchat-ghost", "fa-brands fa-snapchat-square", "fa-solid fa-snowboarding", "fa-solid fa-snowflake", "fa-regular fa-snowflake", "fa-solid fa-snowman", "fa-solid fa-snowplow", "fa-solid fa-soap", "fa-solid fa-socks", "fa-solid fa-solar-panel", "fa-solid fa-sort", "fa-solid fa-sort-alpha-down", "fa-solid fa-sort-alpha-down-alt", "fa-solid fa-sort-alpha-up", "fa-solid fa-sort-alpha-up-alt", "fa-solid fa-sort-amount-down", "fa-solid fa-sort-amount-down-alt", "fa-solid fa-sort-amount-up", "fa-solid fa-sort-amount-up-alt", "fa-solid fa-sort-down", "fa-solid fa-sort-numeric-down", "fa-solid fa-sort-numeric-down-alt", "fa-solid fa-sort-numeric-up", "fa-solid fa-sort-numeric-up-alt", "fa-solid fa-sort-up", "fa-brands fa-soundcloud", "fa-brands fa-sourcetree", "fa-solid fa-spa", "fa-solid fa-space-shuttle", "fa-brands fa-speakap", "fa-brands fa-speaker-deck", "fa-solid fa-spell-check", "fa-solid fa-spider", "fa-solid fa-spinner", "fa-solid fa-splotch", "fa-brands fa-spotify", "fa-solid fa-spray-can", "fa-solid fa-square", "fa-regular fa-square", "fa-solid fa-square-full", "fa-solid fa-square-root-alt", "fa-brands fa-squarespace", "fa-brands fa-stack-exchange", "fa-brands fa-stack-overflow", "fa-brands fa-stackpath", "fa-solid fa-stamp", "fa-solid fa-star", "fa-regular fa-star", "fa-solid fa-star-and-crescent", "fa-solid fa-star-half", "fa-regular fa-star-half", "fa-solid fa-star-half-alt", "fa-solid fa-star-of-david", "fa-solid fa-star-of-life", "fa-brands fa-staylinked", "fa-brands fa-steam", "fa-brands fa-steam-square", "fa-brands fa-steam-symbol", "fa-solid fa-step-backward", "fa-solid fa-step-forward", "fa-solid fa-stethoscope", "fa-brands fa-sticker-mule", "fa-solid fa-sticky-note", "fa-regular fa-sticky-note", "fa-solid fa-stop", "fa-solid fa-stop-circle", "fa-regular fa-stop-circle", "fa-solid fa-stopwatch", "fa-solid fa-stopwatch-20", "fa-solid fa-store", "fa-solid fa-store-alt", "fa-solid fa-store-alt-slash", "fa-solid fa-store-slash", "fa-brands fa-strava", "fa-solid fa-stream", "fa-solid fa-street-view", "fa-solid fa-strikethrough", "fa-brands fa-stripe", "fa-brands fa-stripe-s", "fa-solid fa-stroopwafel", "fa-brands fa-studiovinari", "fa-brands fa-stumbleupon", "fa-brands fa-stumbleupon-circle", "fa-solid fa-subscript", "fa-solid fa-subway", "fa-solid fa-suitcase", "fa-solid fa-suitcase-rolling", "fa-solid fa-sun", "fa-regular fa-sun", "fa-brands fa-superpowers", "fa-solid fa-superscript", "fa-brands fa-supple", "fa-solid fa-surprise", "fa-regular fa-surprise", "fa-brands fa-suse", "fa-solid fa-swatchbook", "fa-brands fa-swift", "fa-solid fa-swimmer", "fa-solid fa-swimming-pool", "fa-brands fa-symfony", "fa-solid fa-synagogue", "fa-solid fa-sync", "fa-solid fa-sync-alt", "fa-solid fa-syringe", "fa-solid fa-table", "fa-solid fa-table-tennis", "fa-solid fa-tablet", "fa-solid fa-tablet-alt", "fa-solid fa-tablets", "fa-solid fa-tachometer-alt", "fa-solid fa-tag", "fa-solid fa-tags", "fa-solid fa-tape", "fa-solid fa-tasks", "fa-solid fa-taxi", "fa-brands fa-teamspeak", "fa-solid fa-teeth", "fa-solid fa-teeth-open", "fa-brands fa-telegram", "fa-brands fa-telegram-plane", "fa-solid fa-temperature-high", "fa-solid fa-temperature-low", "fa-brands fa-tencent-weibo", "fa-solid fa-tenge", "fa-solid fa-terminal", "fa-solid fa-text-height", "fa-solid fa-text-width", "fa-solid fa-th", "fa-solid fa-th-large", "fa-solid fa-th-list", "fa-brands fa-the-red-yeti", "fa-solid fa-theater-masks", "fa-brands fa-themeco", "fa-brands fa-themeisle", "fa-solid fa-thermometer", "fa-solid fa-thermometer-empty", "fa-solid fa-thermometer-full", "fa-solid fa-thermometer-half", "fa-solid fa-thermometer-quarter", "fa-solid fa-thermometer-three-quarters", "fa-brands fa-think-peaks", "fa-solid fa-thumbs-down", "fa-regular fa-thumbs-down", "fa-solid fa-thumbs-up", "fa-regular fa-thumbs-up", "fa-solid fa-thumbtack", "fa-solid fa-ticket-alt", "fa-brands fa-tiktok", "fa-solid fa-times", "fa-solid fa-times-circle", "fa-regular fa-times-circle", "fa-solid fa-tint", "fa-solid fa-tint-slash", "fa-solid fa-tired", "fa-regular fa-tired", "fa-solid fa-toggle-off", "fa-solid fa-toggle-on", "fa-solid fa-toilet", "fa-solid fa-toilet-paper", "fa-solid fa-toilet-paper-slash", "fa-solid fa-toolbox", "fa-solid fa-tools", "fa-solid fa-tooth", "fa-solid fa-torah", "fa-solid fa-torii-gate", "fa-solid fa-tractor", "fa-brands fa-trade-federation", "fa-solid fa-trademark", "fa-solid fa-traffic-light", "fa-solid fa-trailer", "fa-solid fa-train", "fa-solid fa-tram", "fa-solid fa-transgender", "fa-solid fa-transgender-alt", "fa-solid fa-trash", "fa-solid fa-trash-alt", "fa-regular fa-trash-alt", "fa-solid fa-trash-restore", "fa-solid fa-trash-restore-alt", "fa-solid fa-tree", "fa-brands fa-trello", "fa-solid fa-trophy", "fa-solid fa-truck", "fa-solid fa-truck-loading", "fa-solid fa-truck-monster", "fa-solid fa-truck-moving", "fa-solid fa-truck-pickup", "fa-solid fa-tshirt", "fa-solid fa-tty", "fa-brands fa-tumblr", "fa-brands fa-tumblr-square", "fa-solid fa-tv", "fa-brands fa-twitch", "fa-brands fa-twitter", "fa-brands fa-twitter-square", "fa-brands fa-typo3", "fa-brands fa-uber", "fa-brands fa-ubuntu", "fa-brands fa-uikit", "fa-brands fa-umbraco", "fa-solid fa-umbrella", "fa-solid fa-umbrella-beach", "fa-brands fa-uncharted", "fa-solid fa-underline", "fa-solid fa-undo", "fa-solid fa-undo-alt", "fa-brands fa-uniregistry", "fa-brands fa-unity", "fa-solid fa-universal-access", "fa-solid fa-university", "fa-solid fa-unlink", "fa-solid fa-unlock", "fa-solid fa-unlock-alt", "fa-brands fa-unsplash", "fa-brands fa-untappd", "fa-solid fa-upload", "fa-brands fa-ups", "fa-brands fa-usb", "fa-solid fa-user", "fa-regular fa-user", "fa-solid fa-user-alt", "fa-solid fa-user-alt-slash", "fa-solid fa-user-astronaut", "fa-solid fa-user-check", "fa-solid fa-user-circle", "fa-regular fa-user-circle", "fa-solid fa-user-clock", "fa-solid fa-user-cog", "fa-solid fa-user-edit", "fa-solid fa-user-friends", "fa-solid fa-user-graduate", "fa-solid fa-user-injured", "fa-solid fa-user-lock", "fa-solid fa-user-md", "fa-solid fa-user-minus", "fa-solid fa-user-ninja", "fa-solid fa-user-nurse", "fa-solid fa-user-plus", "fa-solid fa-user-secret", "fa-solid fa-user-shield", "fa-solid fa-user-slash", "fa-solid fa-user-tag", "fa-solid fa-user-tie", "fa-solid fa-user-times", "fa-solid fa-users", "fa-solid fa-users-cog", "fa-solid fa-users-slash", "fa-brands fa-usps", "fa-brands fa-ussunnah", "fa-solid fa-utensil-spoon", "fa-solid fa-utensils", "fa-brands fa-vaadin", "fa-solid fa-vector-square", "fa-solid fa-venus", "fa-solid fa-venus-double", "fa-solid fa-venus-mars", "fa-solid fa-vest", "fa-solid fa-vest-patches", "fa-brands fa-viacoin", "fa-brands fa-viadeo", "fa-brands fa-viadeo-square", "fa-solid fa-vial", "fa-solid fa-vials", "fa-brands fa-viber", "fa-solid fa-video", "fa-solid fa-video-slash", "fa-solid fa-vihara", "fa-brands fa-vimeo", "fa-brands fa-vimeo-square", "fa-brands fa-vimeo-v", "fa-brands fa-vine", "fa-solid fa-virus", "fa-solid fa-virus-slash", "fa-solid fa-viruses", "fa-brands fa-vk", "fa-brands fa-vnv", "fa-solid fa-voicemail", "fa-solid fa-volleyball-ball", "fa-solid fa-volume-down", "fa-solid fa-volume-mute", "fa-solid fa-volume-off", "fa-solid fa-volume-up", "fa-solid fa-vote-yea", "fa-solid fa-vr-cardboard", "fa-brands fa-vuejs", "fa-solid fa-walking", "fa-solid fa-wallet", "fa-solid fa-warehouse", "fa-brands fa-watchman-monitoring", "fa-solid fa-water", "fa-solid fa-wave-square", "fa-brands fa-waze", "fa-brands fa-weebly", "fa-brands fa-weibo", "fa-solid fa-weight", "fa-solid fa-weight-hanging", "fa-brands fa-weixin", "fa-brands fa-whatsapp", "fa-brands fa-whatsapp-square", "fa-solid fa-wheelchair", "fa-brands fa-whmcs", "fa-solid fa-wifi", "fa-brands fa-wikipedia-w", "fa-solid fa-wind", "fa-solid fa-window-close", "fa-regular fa-window-close", "fa-solid fa-window-maximize", "fa-regular fa-window-maximize", "fa-solid fa-window-minimize", "fa-regular fa-window-minimize", "fa-solid fa-window-restore", "fa-regular fa-window-restore", "fa-brands fa-windows", "fa-solid fa-wine-bottle", "fa-solid fa-wine-glass", "fa-solid fa-wine-glass-alt", "fa-brands fa-wix", "fa-brands fa-wizards-of-the-coast", "fa-brands fa-wodu", "fa-brands fa-wolf-pack-battalion", "fa-solid fa-won-sign", "fa-brands fa-wordpress", "fa-brands fa-wordpress-simple", "fa-brands fa-wpbeginner", "fa-brands fa-wpexplorer", "fa-brands fa-wpforms", "fa-brands fa-wpressr", "fa-solid fa-wrench", "fa-solid fa-x-ray", "fa-brands fa-xbox", "fa-brands fa-xing", "fa-brands fa-xing-square", "fa-brands fa-y-combinator", "fa-brands fa-yahoo", "fa-brands fa-yammer", "fa-brands fa-yandex", "fa-brands fa-yandex-international", "fa-brands fa-yarn", "fa-brands fa-yelp", "fa-solid fa-yen-sign", "fa-solid fa-yin-yang", "fa-brands fa-yoast", "fa-brands fa-youtube", "fa-brands fa-youtube-square", "fa-brands fa-zhihu"
        ]
        
        const baseUrl = "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/";

        let currentIconInput = null;

        function closeModal(modalId) {
            document.getElementById(modalId).classList.remove('is-active');
        }

        function switchTab(evt, tabId) {
            evt.preventDefault();
            document.querySelectorAll('#main-admin-tabs li').forEach(li => li.classList.remove('is-active')); // Fixed selector
            document.querySelectorAll('.tab-content').forEach(tc => tc.classList.add('is-hidden'));
            evt.currentTarget.parentElement.classList.add('is-active');
            document.getElementById(tabId).classList.remove('is-hidden');
            if (tabId === 'tab-media') loadMediaTable(); 
        }

        function switchIconTab(evt, tabId) {
            evt.preventDefault();
            document.querySelectorAll('#iconModal .tabs li').forEach(li => li.classList.remove('is-active'));
            document.querySelectorAll('.icon-tab-content').forEach(tc => tc.classList.add('is-hidden'));
            evt.currentTarget.parentElement.classList.add('is-active');
            document.getElementById(tabId).classList.remove('is-hidden');
            if (tabId === 'tab-custom') loadCustomIcons();
        }

        function openIconModal(btn) {
            const fieldContainer = btn.closest('.field');
            currentIconInput = fieldContainer.querySelector('input[name="icon_text"]') || document.getElementById('editIcon') || document.getElementById('editPageIcon') || document.getElementById('editGroupIcon'); 
            
            const presetGrid = document.getElementById('tab-preset');
            if (presetGrid.innerHTML === '') { 
                homelabIcons.forEach(name => {
                    const url = baseUrl + name + ".png";
                    const div = document.createElement('div');
                    div.className = 'icon-option';
                    div.innerHTML = `<img src="${url}" loading="lazy"><span>${name}</span>`;
                    div.onclick = () => { currentIconInput.value = url; closeModal('iconModal'); };
                    div.setAttribute('data-s', name);
                    presetGrid.appendChild(div);
                });
            }

            const faGrid = document.getElementById('tab-fontawesome');
            if (faGrid.innerHTML === '') {
                fontawesomeIcons.forEach(cls => {
                    const div = document.createElement('div');
                    div.className = 'icon-option';
                    div.innerHTML = `<i class="${cls}"></i><span>${cls.replace('fa-solid fa-', '').replace('fa-brands fa-', '')}</span>`;
                    div.onclick = () => { currentIconInput.value = cls; closeModal('iconModal'); };
                    div.setAttribute('data-s', cls);
                    faGrid.appendChild(div);
                });
            }
            
            document.getElementById('iconModal').classList.add('is-active');
            
            // Force reset tabs to default (Homelab Icons)
            const tabs = document.querySelectorAll('#iconModal .tabs li');
            tabs.forEach(li => li.classList.remove('is-active'));
            tabs[0].classList.add('is-active');
            
            document.querySelectorAll('.icon-tab-content').forEach(tc => tc.classList.add('is-hidden'));
            document.getElementById('tab-preset').classList.remove('is-hidden');

            document.getElementById('iconSearch').value = '';
            document.getElementById('iconSearch').focus();
        }

        function loadCustomIcons() {
            const customGrid = document.getElementById('tab-custom');
            customGrid.innerHTML = ''; 
            customGrid.innerHTML = '<p class="has-text-grey">Lade...</p>';
            
            fetch('/admin/local_icons')
                .then(response => response.json())
                .then(icons => {
                    customGrid.innerHTML = '';
                    if (icons.length === 0) {
                        customGrid.innerHTML = '<p class="has-text-grey">Noch keine Icons hochgeladen.</p>';
                        return;
                    }
                    icons.forEach(filename => {
                        const url = `/static/uploads/${filename}`;
                        const div = document.createElement('div');
                        div.className = 'icon-option';
                        div.innerHTML = `<img src="${url}"><span>${filename.substring(0, 10)}...</span>`;
                        div.onclick = () => { currentIconInput.value = filename; closeModal('iconModal'); };
                        div.setAttribute('data-s', filename);
                        customGrid.appendChild(div);
                    });
                });
        }
        
        function filterIcons() {
            const term = document.getElementById('iconSearch').value.toLowerCase();
            document.querySelectorAll('.icon-tab-content.icon-grid').forEach(grid => {
                grid.querySelectorAll('.icon-option').forEach(el => el.style.display = el.getAttribute('data-s').includes(term) ? 'flex' : 'none');
            });
        }
        
        function openEditModal(evt, linkId, name, url, icon, sub, target, currentGroupId) {
            evt.preventDefault();
            document.getElementById('editForm').action = `/admin/edit_link/${linkId}`;
            document.getElementById('editName').value = name;
            document.getElementById('editUrl').value = url;
            document.getElementById('editIcon').value = icon || '';
            document.getElementById('editSubtitle').value = sub === 'None' || sub === 'null' ? '' : sub;
            document.getElementById('editTarget').value = target === 'None' || target === 'null' ? '_blank' : target;
            
            // Populate Group Dropdown
            const groupSelect = document.getElementById('editGroupId');
            groupSelect.innerHTML = '';
            allGroups.forEach(g => {
                const opt = document.createElement('option');
                opt.value = g.id;
                opt.text = g.name;
                if (g.id === currentGroupId) opt.selected = true;
                groupSelect.appendChild(opt);
            });

            document.getElementById('editModal').classList.add('is-active');
        }

        function openPageEditModal(evt, pageId, pageName, pageIcon) {
            evt.preventDefault();
            document.getElementById('editPageForm').action = `/admin/edit_page/${pageId}`;
            document.getElementById('editPageName').value = pageName;
            document.getElementById('editPageIcon').value = pageIcon === 'None' || pageIcon === 'null' ? '' : pageIcon;
            document.getElementById('editPageModal').classList.add('is-active');
        }

        function openGroupEditModal(evt, groupId, groupName, groupIcon, currentPageId) {
            evt.preventDefault();
            document.getElementById('editGroupForm').action = `/admin/edit_group/${groupId}`;
            document.getElementById('editGroupName').value = groupName;
            document.getElementById('editGroupIcon').value = groupIcon === 'None' || groupIcon === 'null' ? '' : groupIcon;
            
            // Populate Page Dropdown
            const pageSelect = document.getElementById('editGroupPageId');
            pageSelect.innerHTML = '';
            allPages.forEach(p => {
                const opt = document.createElement('option');
                opt.value = p.id;
                opt.text = p.name;
                if (p.id === currentPageId) opt.selected = true;
                pageSelect.appendChild(opt);
            });

            document.getElementById('editGroupModal').classList.add('is-active');
        }

        function openEditWidgetModal(evt, widgetId, type, p1, p2) {
            evt.preventDefault();
            document.getElementById('editWidgetForm').action = `/admin/edit_widget/${widgetId}`;
            document.getElementById('editWidgetType').value = type;
            
            document.getElementById('editWidgetPiholeFields').style.display = 'none';
            document.getElementById('editWidgetWeatherFields').style.display = 'none';
            document.getElementById('editWidgetIframeFields').style.display = 'none';

            if (type === 'pihole_status') {
                document.getElementById('editWidgetPiholeFields').style.display = 'block';
                document.getElementById('editWidgetApiUrl').value = p1;
                document.getElementById('editWidgetApiKey').value = p2;
            } else if (type === 'openmeteo_weather') {
                document.getElementById('editWidgetWeatherFields').style.display = 'block';
                document.getElementById('editWidgetWeatherLat').value = p1;
                document.getElementById('editWidgetWeatherLon').value = p2;
            } else if (type === 'iframe_widget') {
                document.getElementById('editWidgetIframeFields').style.display = 'block';
                document.getElementById('editWidgetIframeUrl').value = p1;
                document.getElementById('editWidgetIframeHeight').value = p2;
            }
            
            document.getElementById('editWidgetModal').classList.add('is-active');
        }

        // MEDIA MANAGER LOGIC
        function loadMediaTable() {
            const tbody = document.getElementById('mediaTableBody');
            tbody.innerHTML = '<tr><td colspan="5" class="has-text-centered">Lade...</td></tr>';

            fetch('/admin/media_manager')
                .then(response => response.text())
                .then(html => {
                    const tempTable = document.createElement('table');
                    tempTable.innerHTML = html; 
                    const newTBody = tempTable.querySelector('#mediaTableBody');

                    if (newTBody) {
                        tbody.innerHTML = newTBody.innerHTML; 
                    } else {
                        tbody.innerHTML = '<tr><td colspan="5" class="has-text-centered has-text-danger">Fehler beim Laden der Mediendateien (Antwort war fehlerhaft).</td></tr>';
                    }
                })
                .catch(error => {
                    console.error("Media-Manager Ladefehler:", error);
                    tbody.innerHTML = '<tr><td colspan="5" class="has-text-centered has-text-danger">Netzwerk- oder Serverfehler.</td></tr>';
                });
        }
    </script>
    <script>
        function toggleWidgetFields(selectElement) {
            const form = selectElement.closest('form');
            const selectedType = selectElement.value;
            
            // Hide all widget-specific field groups in the current form
            form.querySelectorAll('.widget-fields').forEach(div => {
                div.style.display = 'none';
            });

            // Show the one for the selected type
            if (selectedType) {
                const fieldsToShow = form.querySelector(`.widget-fields[data-widget-type="${selectedType}"]`);
                if (fieldsToShow) {
                    fieldsToShow.style.display = 'block';
                }
            }
        }

        function handleWidgetForm(form) {
            const select = form.querySelector('select[name="type"]');
            if (!select.value) {
                alert('Bitte einen Widget-Typ auswählen.');
                return false;
            }
            return true;
        }
    </script>
    </div>
</body>
</html>
