<div id="BehaviorTab" class="PrefTab">
    <fieldset class="settings">
        <legend>QBT_TR(Language)QBT_TR[CONTEXT=OptionsDialog]</legend>
        <label for="locale_select">QBT_TR(User interface language:)QBT_TR[CONTEXT=OptionsDialog]</label>
        <select id="locale_select">
            ${LANGUAGE_OPTIONS}
        </select>
    </fieldset>

    <fieldset class="settings">
        <legend>QBT_TR(Transfer list)QBT_TR[CONTEXT=OptionsDialog]</legend>
        <div class="formRow" style="margin-bottom: 3px;" title="QBT_TR(Shows a confirmation dialog upon torrent deletion)QBT_TR[CONTEXT=OptionsDialog]">
            <input type="checkbox" id="confirmTorrentDeletion">
            <label for="confirmTorrentDeletion">QBT_TR(Confirm when deleting torrents)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <div class="formRow" style="margin-bottom: 3px;">
            <input type="checkbox" id="useAltRowColorsInput">
            <label for="useAltRowColorsInput">QBT_TR(Use alternating row colors)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <fieldset class="settings">
            <legend>QBT_TR(Action on double-click)QBT_TR[CONTEXT=OptionsDialog]</legend>
            <table>
                <tbody>
                    <tr>
                        <td><label for="dblclickDownloadSelect">QBT_TR(Downloading torrents:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
                        <td>
                            <select id="dblclickDownloadSelect">
                                <option value="1" selected>QBT_TR(Start / stop torrent)QBT_TR[CONTEXT=OptionsDialog]</option>
                                <option value="0">QBT_TR(No action)QBT_TR[CONTEXT=OptionsDialog]</option>
                            </select>
                        </td>
                    </tr>
                    <tr>
                        <td><label for="dblclickCompleteSelect">QBT_TR(Completed torrents:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
                        <td>
                            <select id="dblclickCompleteSelect">
                                <option value="1" selected>QBT_TR(Start / stop torrent)QBT_TR[CONTEXT=OptionsDialog]</option>
                                <option value="0">QBT_TR(No action)QBT_TR[CONTEXT=OptionsDialog]</option>
                            </select>
                        </td>
                    </tr>
                </tbody>
            </table>
        </fieldset>
        <div class="formRow" style="margin-bottom: 3px;">
            <input type="checkbox" id="hideZeroFiltersCheckbox">
            <label for="hideZeroFiltersCheckbox">QBT_TR(Auto hide zero status filters)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
    </fieldset>

    <fieldset class="settings">
        <legend>
            <input type="checkbox" id="filelog_checkbox" onclick="qBittorrent.Preferences.updateFileLogEnabled();">
            <label for="filelog_checkbox">QBT_TR(Log Files)QBT_TR[CONTEXT=OptionsDialog]</label>
        </legend>
        <div class="formRow">
            <label for="filelog_save_path_input">QBT_TR(Save path:)QBT_TR[CONTEXT=OptionsDialog]</label>
            <input type="text" id="filelog_save_path_input" class="pathDirectory">
        </div>
        <table>
            <tbody>
                <tr>
                    <td><input type="checkbox" id="filelog_backup_checkbox" onclick="qBittorrent.Preferences.updateFileLogBackupEnabled();"></td>
                    <td><label id="filelogMaxSizeLabel" for="filelog_backup_checkbox">QBT_TR(Backup the log file after:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
                    <td><input id="filelog_max_size_input" type="number" min="1" max="1024000" value="65" onchange="qBittorrent.Preferences.numberInputLimiter(this);" aria-labelledby="filelogMaxSizeLabel">QBT_TR(KiB)QBT_TR[CONTEXT=OptionsDialog]</td>
                </tr>
                <tr>
                    <td><input type="checkbox" id="filelog_delete_old_checkbox" onclick="qBittorrent.Preferences.updateFileLogDeleteEnabled();"></td>
                    <td><label id="filelogDeleteOldLabel" for="filelog_delete_old_checkbox">QBT_TR(Delete backup logs older than:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
                    <td>
                        <input type="number" min="1" max="365" value="6" id="filelog_age_input" onchange="qBittorrent.Preferences.numberInputLimiter(this);" aria-labelledby="filelogDeleteOldLabel">
                        <select id="filelog_age_type_select" aria-labelledby="filelogDeleteOldLabel">
                            <option value="0">QBT_TR(days)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="1" selected>QBT_TR(months)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="2">QBT_TR(years)QBT_TR[CONTEXT=OptionsDialog]</option>
                        </select>
                    </td>
                </tr>
            </tbody>
        </table>
    </fieldset>

    <div class="formRow" style="margin-bottom: 5px;">
        <input type="checkbox" id="performanceWarning">
        <label for="performanceWarning">QBT_TR(Log performance warnings)QBT_TR[CONTEXT=OptionsDialog]</label>
    </div>

    <fieldset class="settings">
        <legend title="QBT_TR(Following settings are WebUI only)QBT_TR[CONTEXT=OptionsDialog]">QBT_TR(Custom WebUI settings)QBT_TR[CONTEXT=OptionsDialog]</legend>
        <div class="formRow" style="margin-bottom: 3px;">
            <input type="checkbox" id="displayFullURLTrackerColumn">
            <label for="displayFullURLTrackerColumn">QBT_TR(Display full announce URL in the Tracker column)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
    </fieldset>
</div>

<div id="DownloadsTab" class="PrefTab invisible">
    <fieldset class="settings">
        <legend>QBT_TR(When adding a torrent)QBT_TR[CONTEXT=OptionsDialog]</legend>
        <div class="formRow">
            <label for="contentlayout_select">QBT_TR(Torrent content layout:)QBT_TR[CONTEXT=OptionsDialog]</label>
            <select id="contentlayout_select">
                <option value="Original">QBT_TR(Original)QBT_TR[CONTEXT=OptionsDialog]</option>
                <option value="Subfolder">QBT_TR(Create subfolder)QBT_TR[CONTEXT=OptionsDialog]</option>
                <option value="NoSubfolder">QBT_TR(Don't create subfolder)QBT_TR[CONTEXT=OptionsDialog]</option>
            </select>
        </div>
        <div class="formRow">
            <input type="checkbox" id="addToTopOfQueueCheckbox">
            <label for="addToTopOfQueueCheckbox">QBT_TR(Add to top of queue)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <div class="formRow">
            <input type="checkbox" id="dontstartdownloads_checkbox">
            <label for="dontstartdownloads_checkbox">QBT_TR(Do not start the download automatically)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <div class="formRow">
            <label for="stopConditionSelect">QBT_TR(Torrent stop condition:)QBT_TR[CONTEXT=OptionsDialog]</label>
            <select id="stopConditionSelect">
                <option value="None">QBT_TR(None)QBT_TR[CONTEXT=OptionsDialog]</option>
                <option value="MetadataReceived">QBT_TR(Metadata received)QBT_TR[CONTEXT=OptionsDialog]</option>
                <option value="FilesChecked">QBT_TR(Files checked)QBT_TR[CONTEXT=OptionsDialog]</option>
            </select>
        </div>
        <fieldset class="settings">
            <legend>QBT_TR(When duplicate torrent is being added)QBT_TR[CONTEXT=OptionsDialog]</legend>
            <div class="formRow">
                <input type="checkbox" id="mergeTrackersInput">
                <label for="mergeTrackersInput">QBT_TR(Merge trackers to existing torrent)QBT_TR[CONTEXT=OptionsDialog]</label>
            </div>
        </fieldset>
        <div class="formRow">
            <input type="checkbox" id="deletetorrentfileafter_checkbox">
            <label for="deletetorrentfileafter_checkbox">QBT_TR(Delete .torrent files afterwards)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
    </fieldset>

    <div class="formRow">
        <input type="checkbox" id="preallocateall_checkbox">
        <label for="preallocateall_checkbox">QBT_TR(Pre-allocate disk space for all files)QBT_TR[CONTEXT=OptionsDialog]</label>
    </div>
    <div class="formRow">
        <span id="appendexttr">
            <input type="checkbox" id="appendext_checkbox">
            <label for="appendext_checkbox">QBT_TR(Append .!qB extension to incomplete files)QBT_TR[CONTEXT=OptionsDialog]</label>
        </span>
    </div>
    <div class="formRow">
        <span id="unwantedfoldertr">
            <input type="checkbox" id="unwantedfolder_checkbox">
            <label for="unwantedfolder_checkbox">QBT_TR(Keep unselected files in ".unwanted" folder)QBT_TR[CONTEXT=OptionsDialog]</label>
        </span>
    </div>

    <fieldset class="settings">
        <legend>QBT_TR(Saving Management)QBT_TR[CONTEXT=HttpServer]</legend>
        <table>
            <tbody>
                <tr>
                    <td>
                        <label for="default_tmm_combobox">QBT_TR(Default Torrent Management Mode:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <select id="default_tmm_combobox">
                            <option value="false" selected>QBT_TR(Manual)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="true">QBT_TR(Automatic)QBT_TR[CONTEXT=OptionsDialog]</option>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="torrent_changed_tmm_combobox">QBT_TR(When Torrent Category changed:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <select id="torrent_changed_tmm_combobox">
                            <option value="true">QBT_TR(Relocate torrent)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="false" selected>QBT_TR(Switch torrent to Manual Mode)QBT_TR[CONTEXT=OptionsDialog]</option>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="save_path_changed_tmm_combobox">QBT_TR(When Default Save Path changed:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <select id="save_path_changed_tmm_combobox">
                            <option value="true">QBT_TR(Relocate affected torrents)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="false" selected>QBT_TR(Switch affected torrents to Manual Mode)QBT_TR[CONTEXT=OptionsDialog]</option>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="category_changed_tmm_combobox">QBT_TR(When Category Save Path changed:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <select id="category_changed_tmm_combobox">
                            <option value="true">QBT_TR(Relocate affected torrents)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="false" selected>QBT_TR(Switch affected torrents to Manual Mode)QBT_TR[CONTEXT=OptionsDialog]</option>
                        </select>
                    </td>
                </tr>
            </tbody>
        </table>
        <div class="formRow">
            <input type="checkbox" id="use_subcategories_checkbox">
            <label for="use_subcategories_checkbox">QBT_TR(Use Subcategories)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <div class="formRow">
            <input type="checkbox" id="categoryPathsManualModeCheckbox" title="QBT_TR(Resolve relative Save Path against appropriate Category path instead of Default one)QBT_TR[CONTEXT=OptionsDialog]">
            <label for="categoryPathsManualModeCheckbox">QBT_TR(Use Category paths in Manual Mode)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <table>
            <tbody>
                <tr>
                    <td>
                        <label for="savepath_text">QBT_TR(Default Save Path:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="savepath_text" class="pathDirectory" autocorrect="off" autocapitalize="none">
                    </td>
                </tr>
                <tr>
                    <td>
                        <input type="checkbox" id="temppath_checkbox" onclick="qBittorrent.Preferences.updateTempDirEnabled();">
                        <label id="tempPathLabel" for="temppath_checkbox">QBT_TR(Keep incomplete torrents in:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="temppath_text" class="pathDirectory" autocorrect="off" autocapitalize="none" aria-labelledby="tempPathLabel">
                    </td>
                </tr>
                <tr>
                    <td>
                        <input type="checkbox" id="exportdir_checkbox" onclick="qBittorrent.Preferences.updateExportDirEnabled();">
                        <label id="exportDirLabel" for="exportdir_checkbox">QBT_TR(Copy .torrent files to:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="exportdir_text" class="pathDirectory" autocorrect="off" autocapitalize="none" aria-labelledby="exportDirLabel">
                    </td>
                </tr>
                <tr>
                    <td>
                        <input type="checkbox" id="exportdirfin_checkbox" onclick="qBittorrent.Preferences.updateExportDirFinEnabled();">
                        <label id="exportDirFinLabel" for="exportdirfin_checkbox">QBT_TR(Copy .torrent files for finished downloads to:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="exportdirfin_text" class="pathDirectory" autocorrect="off" autocapitalize="none" aria-labelledby="exportDirFinLabel">
                    </td>
                </tr>
            </tbody>
        </table>
    </fieldset>

    <fieldset class="settings">
        <legend>QBT_TR(Automatically add torrents from:)QBT_TR[CONTEXT=OptionsDialog]</legend>
        <table id="watched_folders_tab" style="border: 1px solid black;">
            <thead>
                <tr>
                    <th scope="col">QBT_TR(Monitored Folder)QBT_TR[CONTEXT=ScanFoldersModel]</th>
                    <th scope="col">QBT_TR(Override Save Location)QBT_TR[CONTEXT=ScanFoldersModel]</th>
                </tr>
            </thead>
            <tbody></tbody>
        </table>
    </fieldset>

    <fieldset class="settings">
        <legend>
            <input type="checkbox" id="excludedFileNamesCheckbox" onclick="qBittorrent.Preferences.updateExcludedFileNamesEnabled();">
            <label id="excludedFileNamesLabel" for="excludedFileNamesCheckbox">QBT_TR(Excluded file names)QBT_TR[CONTEXT=OptionsDialog]</label>
        </legend>
        <textarea id="excludedFileNamesTextarea" rows="6" cols="70" aria-labelledby="excludedFileNamesLabel"></textarea>
    </fieldset>

    <fieldset class="settings">
        <legend>
            <input type="checkbox" id="mail_notification_checkbox" onclick="qBittorrent.Preferences.updateMailNotification();">
            <label for="mail_notification_checkbox">QBT_TR(Email notification upon download completion)QBT_TR[CONTEXT=OptionsDialog]</label>
        </legend>
        <table>
            <tbody>
                <tr>
                    <td>
                        <label for="src_email_txt">QBT_TR(From:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="src_email_txt">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="dest_email_txt">QBT_TR(To:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="dest_email_txt">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="smtp_server_txt">QBT_TR(SMTP server:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="smtp_server_txt">
                    </td>
                </tr>
            </tbody>
        </table>
        <div class="formRow">
            <input type="checkbox" id="mail_ssl_checkbox"><label for="mail_ssl_checkbox">QBT_TR(This server requires a secure connection (SSL))QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <fieldset class="settings">
            <legend>
                <input type="checkbox" id="mail_auth_checkbox" onclick="qBittorrent.Preferences.updateMailAuthSettings();">
                <label for="mail_auth_checkbox">QBT_TR(Authentication)QBT_TR[CONTEXT=OptionsDialog]</label>
            </legend>
            <table>
                <tbody>
                    <tr>
                        <td>
                            <label for="mail_username_text">QBT_TR(Username:)QBT_TR[CONTEXT=OptionsDialog]</label>
                        </td>
                        <td>
                            <input type="text" id="mail_username_text">
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <label for="mail_password_text">QBT_TR(Password:)QBT_TR[CONTEXT=OptionsDialog]</label>
                        </td>
                        <td>
                            <input type="password" id="mail_password_text">
                        </td>
                    </tr>
                </tbody>
            </table>
        </fieldset>
        <div class="formRow">
            <input type="button" id="mail_test_button" value="QBT_TR(Send test email)QBT_TR[CONTEXT=OptionsDialog]" onclick="qBittorrent.Preferences.sendTestEmail();">
        </div>
    </fieldset>

    <fieldset class="settings">
        <legend>
            QBT_TR(Run external program)QBT_TR[CONTEXT=OptionsDialog]
        </legend>
        <div class="formRow">
            <input type="checkbox" id="autorunOnTorrentAddedCheckbox" onclick="qBittorrent.Preferences.updateAutoRunOnTorrentAdded();">
            <label id="autorunOnTorrentAddedLabel" for="autorunOnTorrentAddedCheckbox">QBT_TR(Run on torrent added:)QBT_TR[CONTEXT=OptionsDialog]</label>
            <input type="text" id="autorunOnTorrentAddedProgram" aria-labelledby="autorunOnTorrentAddedLabel" style="width: 100%;">
        </div>
        <div class="formRow">
            <input type="checkbox" id="autorun_checkbox" onclick="qBittorrent.Preferences.updateAutoRun();">
            <label id="autorunLabel" for="autorun_checkbox">QBT_TR(Run on torrent finished:)QBT_TR[CONTEXT=OptionsDialog]</label>
            <input type="text" id="autorunProg_txt" aria-labelledby="autorunLabel" style="width: 100%;">
        </div>
        <div style="font-style: italic;">QBT_TR(Supported parameters (case sensitive):)QBT_TR[CONTEXT=OptionsDialog]
            <ul>
                <li>QBT_TR(%N: Torrent name)QBT_TR[CONTEXT=OptionsDialog]</li>
                <li>QBT_TR(%L: Category)QBT_TR[CONTEXT=OptionsDialog]</li>
                <li>QBT_TR(%G: Tags (separated by comma))QBT_TR[CONTEXT=OptionsDialog]</li>
                <li>QBT_TR(%F: Content path (same as root path for multifile torrent))QBT_TR[CONTEXT=OptionsDialog]</li>
                <li>QBT_TR(%R: Root path (first torrent subdirectory path))QBT_TR[CONTEXT=OptionsDialog]</li>
                <li>QBT_TR(%D: Save path)QBT_TR[CONTEXT=OptionsDialog]</li>
                <li>QBT_TR(%C: Number of files)QBT_TR[CONTEXT=OptionsDialog]</li>
                <li>QBT_TR(%Z: Torrent size (bytes))QBT_TR[CONTEXT=OptionsDialog]</li>
                <li>QBT_TR(%T: Current tracker)QBT_TR[CONTEXT=OptionsDialog]</li>
                <li>QBT_TR(%I: Info hash v1)QBT_TR[CONTEXT=OptionsDialog]</li>
                <li>QBT_TR(%J: Info hash v2)QBT_TR[CONTEXT=OptionsDialog]</li>
                <li>QBT_TR(%K: Torrent ID)QBT_TR[CONTEXT=OptionsDialog]</li>
            </ul>
            QBT_TR(Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N"))QBT_TR[CONTEXT=OptionsDialog]
        </div>
    </fieldset>
</div>

<div id="ConnectionTab" class="PrefTab invisible">
    <div class="formRow">
        <label for="enable_protocol_combobox">QBT_TR(Peer connection protocol:)QBT_TR[CONTEXT=OptionsDialog]</label>
        <select id="enable_protocol_combobox">
            <option value="0" selected>QBT_TR(TCP and μTP)QBT_TR[CONTEXT=OptionsDialog]</option>
            <option value="1">TCP</option>
            <option value="2">μTP</option>
        </select>
    </div>
    <fieldset class="settings">
        <legend>QBT_TR(Listening Port)QBT_TR[CONTEXT=OptionsDialog]</legend>
        <div class="formRow">
            <label for="port_value">QBT_TR(Port used for incoming connections:)QBT_TR[CONTEXT=OptionsDialog]</label>
            <input type="text" id="port_value" style="width: 6em;" title="QBT_TR(Set to 0 to let your system pick an unused port)QBT_TR[CONTEXT=OptionsDialog]">
            <button type="button" onclick="qBittorrent.Preferences.generateRandomPort();">QBT_TR(Random)QBT_TR[CONTEXT=OptionsDialog]</button>
        </div>
        <div class="formRow">
            <input type="checkbox" id="upnp_checkbox">
            <label for="upnp_checkbox">QBT_TR(Use UPnP / NAT-PMP port forwarding from my router)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
    </fieldset>

    <fieldset class="settings">
        <legend>QBT_TR(Connections Limits)QBT_TR[CONTEXT=OptionsDialog]</legend>
        <table>
            <tbody>
                <tr>
                    <td>
                        <input type="checkbox" id="max_connec_checkbox" onclick="qBittorrent.Preferences.updateMaxConnecEnabled();">
                        <label id="maxConnectionsLabel" for="max_connec_checkbox">QBT_TR(Global maximum number of connections:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td><input type="text" id="max_connec_value" aria-labelledby="maxConnectionsLabel" style="width: 6em;"></td>
                </tr>
                <tr>
                    <td>
                        <input type="checkbox" id="max_connec_per_torrent_checkbox" onclick="qBittorrent.Preferences.updateMaxConnecPerTorrentEnabled();">
                        <label id="maxConnectionsPerTorrentLabel" for="max_connec_per_torrent_checkbox">QBT_TR(Maximum number of connections per torrent:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td><input type="text" id="max_connec_per_torrent_value" aria-labelledby="maxConnectionsPerTorrentLabel" style="width: 6em;"></td>
                </tr>
                <tr>
                    <td>
                        <input type="checkbox" id="max_uploads_checkbox" onclick="qBittorrent.Preferences.updateMaxUploadsEnabled();">
                        <label id="maxUploadsLabel" for="max_uploads_checkbox">QBT_TR(Global maximum number of upload slots:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td><input type="text" id="max_uploads_value" aria-labelledby="maxUploadsLabel" style="width: 6em;"></td>
                </tr>
                <tr>
                    <td>
                        <input type="checkbox" id="max_uploads_per_torrent_checkbox" onclick="qBittorrent.Preferences.updateMaxUploadsPerTorrentEnabled();">
                        <label id="maxUploadsPerTorrentLabel" for="max_uploads_per_torrent_checkbox">QBT_TR(Maximum number of upload slots per torrent:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td><input type="text" id="max_uploads_per_torrent_value" aria-labelledby="maxUploadsPerTorrentLabel" style="width: 6em;"></td>
                </tr>
            </tbody>
        </table>
    </fieldset>

    <fieldset class="settings" id="fieldsetI2p">
        <legend>
            <input type="checkbox" id="i2pEnabledCheckbox" onclick="qBittorrent.Preferences.updateI2PSettingsEnabled();">
            <label for="i2pEnabledCheckbox">QBT_TR(I2P (Experimental))QBT_TR[CONTEXT=OptionsDialog]</label>
        </legend>
        <table>
            <tbody>
                <tr>
                    <td>
                        <label for="i2pAddress">QBT_TR(Host:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="i2pAddress">
                    </td>
                    <td>
                        <label for="i2pPort">QBT_TR(Port:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="number" id="i2pPort" min="0" max="65535" onchange="qBittorrent.Preferences.numberInputLimiter(this);" style="width: 6em;">
                    </td>
                </tr>
            </tbody>
        </table>
        <div class="formRow">
            <input type="checkbox" id="i2pMixedMode" title="QBT_TR(If &quot;mixed mode&quot; is enabled, I2P torrents are allowed to also get peers from other sources than the tracker, and connect to regular IPs, not providing any anonymization. This may be useful if the user is not interested in the anonymization of I2P, but still wants to be able to connect to I2P peers.)QBT_TR[CONTEXT=OptionsDialog]">
            <label for="i2pMixedMode">QBT_TR(Mixed mode)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
    </fieldset>

    <fieldset class="settings">
        <legend>QBT_TR(Proxy Server)QBT_TR[CONTEXT=OptionsDialog]</legend>
        <table>
            <tbody>
                <tr>
                    <td>
                        <label for="peer_proxy_type_select">QBT_TR(Type:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <select id="peer_proxy_type_select" onchange="qBittorrent.Preferences.updatePeerProxySettings();">
                            <option value="None">QBT_TR((None))QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="SOCKS4">QBT_TR(SOCKS4)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="SOCKS5">QBT_TR(SOCKS5)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="HTTP">QBT_TR(HTTP)QBT_TR[CONTEXT=OptionsDialog]</option>
                        </select>
                    </td>
                    <td>
                        <label for="peer_proxy_host_text">QBT_TR(Host:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="peer_proxy_host_text">
                    </td>
                    <td>
                        <label for="peer_proxy_port_value">QBT_TR(Port:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="peer_proxy_port_value" style="width: 6em;">
                    </td>
                </tr>
            </tbody>
        </table>

        <div class="formRow">
            <input type="checkbox" id="proxyHostnameLookupCheckbox" title="QBT_TR(If checked, hostname lookups are done via the proxy.)QBT_TR[CONTEXT=OptionsDialog]">
            <label for="proxyHostnameLookupCheckbox">QBT_TR(Perform hostname lookup via proxy)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>

        <fieldset class="settings">
            <legend>
                <input type="checkbox" id="peer_proxy_auth_checkbox" onclick="qBittorrent.Preferences.updatePeerProxyAuthSettings();">
                <label for="peer_proxy_auth_checkbox">QBT_TR(Authentication)QBT_TR[CONTEXT=OptionsDialog]</label>
            </legend>
            <table>
                <tbody>
                    <tr>
                        <td>
                            <label for="peer_proxy_username_text">QBT_TR(Username:)QBT_TR[CONTEXT=OptionsDialog]</label>
                        </td>
                        <td>
                            <input type="text" id="peer_proxy_username_text">
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <label for="peer_proxy_password_text">QBT_TR(Password:)QBT_TR[CONTEXT=OptionsDialog]</label>
                        </td>
                        <td>
                            <input type="password" id="peer_proxy_password_text">
                        </td>
                    </tr>
                </tbody>
            </table>
            <div class="formRow">
                <span>QBT_TR(Info: The password is saved unencrypted)QBT_TR[CONTEXT=OptionsDialog]</span>
            </div>
        </fieldset>

        <fieldset class="settings">
            <legend>
                <input type="checkbox" id="proxy_bittorrent_checkbox" onclick="qBittorrent.Preferences.updatePeerProxySettings();">
                <label for="proxy_bittorrent_checkbox">QBT_TR(Use proxy for BitTorrent purposes)QBT_TR[CONTEXT=OptionsDialog]</label>
            </legend>
            <div class="formRow">
                <input type="checkbox" id="use_peer_proxy_checkbox">
                <label for="use_peer_proxy_checkbox">QBT_TR(Use proxy for peer connections)QBT_TR[CONTEXT=OptionsDialog]</label>
            </div>
        </fieldset>
        <div class="formRow">
            <input type="checkbox" id="proxy_rss_checkbox">
            <label for="proxy_rss_checkbox">QBT_TR(Use proxy for RSS purposes)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <div class="formRow">
            <input type="checkbox" id="proxy_misc_checkbox">
            <label for="proxy_misc_checkbox">QBT_TR(Use proxy for general purposes)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
    </fieldset>

    <fieldset class="settings">
        <legend>
            <label>QBT_TR(IP Filtering)QBT_TR[CONTEXT=OptionsDialog]</label>
        </legend>
        <div class="formRow">
            <input type="checkbox" id="ipfilter_text_checkbox" onclick="qBittorrent.Preferences.updateFilterSettings();">
            <label id="ipfilterTextLabel" for="ipfilter_text_checkbox">QBT_TR(Filter path (.dat, .p2p, .p2b):)QBT_TR[CONTEXT=OptionsDialog]</label>
            <input type="text" id="ipfilter_text" aria-labelledby="ipfilterTextLabel">
        </div>
        <div class="formRow">
            <input type="checkbox" id="ipfilter_trackers_checkbox">
            <label for="ipfilter_trackers_checkbox">QBT_TR(Apply to trackers)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <div class="formRow">
            <fieldset class="settings">
                <legend id="manuallyBannedIPAddressesLabel">QBT_TR(Manually banned IP addresses...)QBT_TR[CONTEXT=OptionsDialog]</legend>
                <textarea id="banned_IPs_textarea" aria-labelledby="manuallyBannedIPAddressesLabel" rows="5" cols="70"></textarea>
            </fieldset>
        </div>
    </fieldset>
</div>

<div id="SpeedTab" class="PrefTab invisible">
    <fieldset class="settings">
        <legend>QBT_TR(Global Rate Limits)QBT_TR[CONTEXT=OptionsDialog]</legend>
        <table>
            <tbody>
                <tr>
                    <td rowspan="2">
                        <img src="images/slow_off.svg" style="height: 2.5em;" alt="QBT_TR(Alternative speed limits)QBT_TR[CONTEXT=MainWindow]">
                    </td>
                    <td><label for="up_limit_value">QBT_TR(Upload:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
                    <td><input type="number" id="up_limit_value" style="width: 6em;" min="0">&nbsp;&nbsp;QBT_TR(KiB/s)QBT_TR[CONTEXT=OptionsDialog]</td>
                </tr>
                <tr>
                    <td><label for="dl_limit_value">QBT_TR(Download:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
                    <td><input type="number" id="dl_limit_value" style="width: 6em;" min="0">&nbsp;&nbsp;QBT_TR(KiB/s)QBT_TR[CONTEXT=OptionsDialog]</td>
                </tr>
            </tbody>
        </table>
        <i>QBT_TR(0 means unlimited)QBT_TR[CONTEXT=OptionsDialog]</i>
    </fieldset>

    <fieldset class="settings">
        <legend>QBT_TR(Alternative Rate Limits)QBT_TR[CONTEXT=OptionsDialog]</legend>
        <table>
            <tbody>
                <tr>
                    <td rowspan="2">
                        <img src="images/slow.svg" style="height: 2.5em;" alt="QBT_TR(Alternative speed limits)QBT_TR[CONTEXT=MainWindow]">
                    </td>
                    <td><label for="alt_up_limit_value">QBT_TR(Upload:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
                    <td><input type="number" id="alt_up_limit_value" style="width: 6em;" min="0">&nbsp;&nbsp;QBT_TR(KiB/s)QBT_TR[CONTEXT=OptionsDialog]</td>
                </tr>
                <tr>
                    <td><label for="alt_dl_limit_value">QBT_TR(Download:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
                    <td><input type="number" id="alt_dl_limit_value" style="width: 6em;" min="0">&nbsp;&nbsp;QBT_TR(KiB/s)QBT_TR[CONTEXT=OptionsDialog]</td>
                </tr>
            </tbody>
        </table>
        <i>QBT_TR(0 means unlimited)QBT_TR[CONTEXT=OptionsDialog]</i>

        <fieldset class="settings">
            <legend>
                <input type="checkbox" id="limitSchedulingCheckbox" onclick="qBittorrent.Preferences.updateSchedulingEnabled();">
                <label for="limitSchedulingCheckbox">QBT_TR(Schedule the use of alternative rate limits)QBT_TR[CONTEXT=OptionsDialog]</label>
            </legend>
            <div class="formRow">
                <label id="scheduleFromHourLabel">QBT_TR(From:)QBT_TR[CONTEXT=OptionsDialog]</label>
                <input type="text" id="schedule_from_hour" aria-labelledby="scheduleFromHourLabel" style="width: 3.6em;">:<input type="text" id="schedule_from_min" aria-labelledby="scheduleFromHourLabel" style="width: 3.6em;">
                <label id="scheduleToHourLabel">QBT_TR(To:)QBT_TR[CONTEXT=OptionsDialog]</label>
                <input type="text" id="schedule_to_hour" aria-labelledby="scheduleToHourLabel" style="width: 3.6em;">:<input type="text" id="schedule_to_min" aria-labelledby="scheduleToHourLabel" style="width: 3.6em;">
            </div>
            <div class="formRow">
                <label for="schedule_freq_select">QBT_TR(When:)QBT_TR[CONTEXT=OptionsDialog]</label>
                <select id="schedule_freq_select">
                    <option value="0">QBT_TR(Every day)QBT_TR[CONTEXT=OptionsDialog]</option>
                    <option value="1">QBT_TR(Weekdays)QBT_TR[CONTEXT=OptionsDialog]</option>
                    <option value="2">QBT_TR(Weekends)QBT_TR[CONTEXT=OptionsDialog]</option>
                    <option value="3">QBT_TR(Monday)QBT_TR[CONTEXT=HttpServer]</option>
                    <option value="4">QBT_TR(Tuesday)QBT_TR[CONTEXT=HttpServer]</option>
                    <option value="5">QBT_TR(Wednesday)QBT_TR[CONTEXT=HttpServer]</option>
                    <option value="6">QBT_TR(Thursday)QBT_TR[CONTEXT=HttpServer]</option>
                    <option value="7">QBT_TR(Friday)QBT_TR[CONTEXT=HttpServer]</option>
                    <option value="8">QBT_TR(Saturday)QBT_TR[CONTEXT=HttpServer]</option>
                    <option value="9">QBT_TR(Sunday)QBT_TR[CONTEXT=HttpServer]</option>
                </select>
            </div>
        </fieldset>
    </fieldset>

    <fieldset class="settings">
        <legend>QBT_TR(Rate Limits Settings)QBT_TR[CONTEXT=OptionsDialog]</legend>
        <div class="formRow">
            <input type="checkbox" id="limit_utp_rate_checkbox">
            <label for="limit_utp_rate_checkbox">QBT_TR(Apply rate limit to µTP protocol)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <div class="formRow">
            <input type="checkbox" id="limit_tcp_overhead_checkbox">
            <label for="limit_tcp_overhead_checkbox">QBT_TR(Apply rate limit to transport overhead)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <div class="formRow">
            <input type="checkbox" id="limit_lan_peers_checkbox">
            <label for="limit_lan_peers_checkbox">QBT_TR(Apply rate limit to peers on LAN)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
    </fieldset>
</div>

<div id="BittorrentTab" class="PrefTab invisible">
    <fieldset class="settings">
        <legend>QBT_TR(Privacy)QBT_TR[CONTEXT=OptionsDialog]</legend>
        <div class="formRow">
            <input type="checkbox" id="dht_checkbox">
            <label for="dht_checkbox">QBT_TR(Enable DHT (decentralized network) to find more peers)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <div class="formRow">
            <input type="checkbox" id="pex_checkbox">
            <label for="pex_checkbox">QBT_TR(Enable Peer Exchange (PeX) to find more peers)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <div class="formRow">
            <input type="checkbox" id="lsd_checkbox">
            <label for="lsd_checkbox">QBT_TR(Enable Local Peer Discovery to find more peers)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <div class="formRow">
            <label for="encryption_select">QBT_TR(Encryption mode:)QBT_TR[CONTEXT=OptionsDialog]</label>
            <select id="encryption_select">
                <option value="0">QBT_TR(Allow encryption)QBT_TR[CONTEXT=OptionsDialog]</option>
                <option value="1">QBT_TR(Require encryption)QBT_TR[CONTEXT=OptionsDialog]</option>
                <option value="2">QBT_TR(Disable encryption)QBT_TR[CONTEXT=OptionsDialog]</option>
            </select>
        </div>
        <div class="formRow">
            <input type="checkbox" id="anonymous_mode_checkbox">
            <label for="anonymous_mode_checkbox">QBT_TR(Enable anonymous mode)QBT_TR[CONTEXT=OptionsDialog] (<a target="_blank" href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">QBT_TR(More information)QBT_TR[CONTEXT=HttpServer]</a>)</label>
        </div>
    </fieldset>

    <div class="formRow">
        <label for="maxActiveCheckingTorrents">QBT_TR(Max active checking torrents:)QBT_TR[CONTEXT=OptionsDialog]</label>
        <input type="number" id="maxActiveCheckingTorrents" style="width: 6em;" min="-1">
    </div>

    <fieldset class="settings">
        <legend>
            <input type="checkbox" id="queueing_checkbox" onclick="qBittorrent.Preferences.updateQueueingSystem();">
            <label for="queueing_checkbox">QBT_TR(Torrent Queueing)QBT_TR[CONTEXT=OptionsDialog]</label>
        </legend>
        <table>
            <tbody>
                <tr>
                    <td>
                        <label for="max_active_dl_value">QBT_TR(Maximum active downloads:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="max_active_dl_value" style="width: 6em;">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="max_active_up_value">QBT_TR(Maximum active uploads:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="max_active_up_value" style="width: 6em;">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="max_active_to_value">QBT_TR(Maximum active torrents:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="max_active_to_value" style="width: 6em;">
                    </td>
                </tr>
            </tbody>
        </table>
        <fieldset class="settings">
            <legend>
                <input type="checkbox" id="dont_count_slow_torrents_checkbox" onclick="qBittorrent.Preferences.updateSlowTorrentsSettings();">
                <label for="dont_count_slow_torrents_checkbox">QBT_TR(Do not count slow torrents in these limits)QBT_TR[CONTEXT=OptionsDialog]</label>
            </legend>
            <table>
                <tbody>
                    <tr>
                        <td>
                            <label for="dl_rate_threshold">QBT_TR(Download rate threshold:)QBT_TR[CONTEXT=OptionsDialog]</label>
                        </td>
                        <td>
                            <input type="text" id="dl_rate_threshold" style="width: 6em;">&nbsp;&nbsp;QBT_TR(KiB/s)QBT_TR[CONTEXT=OptionsDialog]
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <label for="ul_rate_threshold">QBT_TR(Upload rate threshold:)QBT_TR[CONTEXT=OptionsDialog]</label>
                        </td>
                        <td>
                            <input type="text" id="ul_rate_threshold" style="width: 6em;">&nbsp;&nbsp;QBT_TR(KiB/s)QBT_TR[CONTEXT=OptionsDialog]
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <label for="torrent_inactive_timer">QBT_TR(Torrent inactivity timer:)QBT_TR[CONTEXT=OptionsDialog]</label>
                        </td>
                        <td>
                            <input type="text" id="torrent_inactive_timer" style="width: 6em;">&nbsp;&nbsp;QBT_TR(seconds)QBT_TR[CONTEXT=OptionsDialog]
                        </td>
                    </tr>
                </tbody>
            </table>
        </fieldset>
    </fieldset>

    <fieldset class="settings">
        <legend>QBT_TR(Seeding Limits)QBT_TR[CONTEXT=OptionsDialog]</legend>
        <table>
            <tbody>
                <tr>
                    <td>
                        <input type="checkbox" id="max_ratio_checkbox" onclick="qBittorrent.Preferences.updateMaxRatioTimeEnabled();">
                        <label id="maxRatioLabel" for="max_ratio_checkbox">QBT_TR(When ratio reaches)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="max_ratio_value" style="width: 6em;" aria-labelledby="maxRatioLabel">
                    </td>
                </tr>
                <tr>
                    <td>
                        <input type="checkbox" id="max_seeding_time_checkbox" onclick="qBittorrent.Preferences.updateMaxRatioTimeEnabled();">
                        <label id="maxSeedingTimeLabel" for="max_seeding_time_checkbox">QBT_TR(When total seeding time reaches)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="max_seeding_time_value" style="width: 6em;" aria-labelledby="maxSeedingTimeLabel">QBT_TR(minutes)QBT_TR[CONTEXT=OptionsDialog]
                    </td>
                </tr>
                <tr>
                    <td>
                        <input type="checkbox" id="max_inactive_seeding_time_checkbox" onclick="qBittorrent.Preferences.updateMaxRatioTimeEnabled();">
                        <label id="maxInactiveSeedingTimeLabel" for="max_inactive_seeding_time_checkbox">QBT_TR(When inactive seeding time reaches)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="max_inactive_seeding_time_value" style="width: 6em;" aria-labelledby="maxInactiveSeedingTimeLabel">QBT_TR(minutes)QBT_TR[CONTEXT=OptionsDialog]
                    </td>
                </tr>
                <tr>
                    <td style="text-align: right;"><label for="max_ratio_act">QBT_TR(then)QBT_TR[CONTEXT=OptionsDialog]</label></td>
                    <td>
                        <select id="max_ratio_act">
                            <option value="0">QBT_TR(Stop torrent)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="1">QBT_TR(Remove torrent)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="3">QBT_TR(Remove torrent and its files)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="2">QBT_TR(Enable super seeding for torrent)QBT_TR[CONTEXT=OptionsDialog]</option>
                        </select>
                    </td>
                </tr>
            </tbody>
        </table>
    </fieldset>

    <fieldset class="settings">
        <legend>
            <input type="checkbox" id="add_trackers_checkbox" onclick="qBittorrent.Preferences.updateAddTrackersEnabled();">
            <label id="addTrackersLabel" for="add_trackers_checkbox">QBT_TR(Automatically append these trackers to new downloads:)QBT_TR[CONTEXT=OptionsDialog]</label>
        </legend>
        <textarea id="add_trackers_textarea" rows="5" cols="70" aria-labelledby="addTrackersLabel"></textarea>
    </fieldset>
</div>

<div id="RSSTab" class="PrefTab invisible">
    <fieldset class="settings">
        <legend>QBT_TR(RSS Reader)QBT_TR[CONTEXT=OptionsDialog]</legend>
        <div class="formRow">
            <input type="checkbox" id="enable_fetching_rss_feeds_checkbox">
            <label for="enable_fetching_rss_feeds_checkbox">QBT_TR(Enable fetching RSS feeds)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <table>
            <tbody>
                <tr>
                    <td>
                        <label for="feed_refresh_interval">QBT_TR(Feeds refresh interval:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="feed_refresh_interval" style="width: 6em;">&nbsp;&nbsp;QBT_TR( min)QBT_TR[CONTEXT=OptionsDialog]
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="feedFetchDelay">QBT_TR(Same host request delay:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="feedFetchDelay" style="width: 6em;">&nbsp;&nbsp;QBT_TR( sec)QBT_TR[CONTEXT=OptionsDialog]
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="maximum_article_number">QBT_TR(Maximum number of articles per feed:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="maximum_article_number" style="width: 6em;">
                    </td>
                </tr>
            </tbody>
        </table>
    </fieldset>

    <fieldset class="settings">
        <legend>QBT_TR(RSS Torrent Auto Downloader)QBT_TR[CONTEXT=OptionsDialog]</legend>
        <div class="formRow">
            <input type="checkbox" id="enable_auto_downloading_rss_torrents_checkbox">
            <label for="enable_auto_downloading_rss_torrents_checkbox">QBT_TR(Enable auto downloading of RSS torrents)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <button type="button" style="margin: 0 1em; width: calc(100% - 2.2em)" onclick="window.qBittorrent.Rss.openRssDownloader();">QBT_TR(Edit auto downloading rules...)QBT_TR[CONTEXT=OptionsDialog]</button>
    </fieldset>

    <fieldset class="settings">
        <legend>QBT_TR(RSS Smart Episode Filter)QBT_TR[CONTEXT=OptionsDialog]</legend>
        <div class="formRow">
            <input type="checkbox" id="downlock_repack_proper_episodes">

            <label for="downlock_repack_proper_episodes">QBT_TR(Download REPACK/PROPER episodes)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <label for="rss_filter_textarea">QBT_TR(Filters:)QBT_TR[CONTEXT=OptionsDialog]</label><br>
        <textarea id="rss_filter_textarea" rows="6" cols="70"></textarea>
    </fieldset>
</div>

<div id="WebUITab" class="PrefTab invisible">
    <fieldset class="settings">
        <legend>QBT_TR(Web User Interface (Remote control))QBT_TR[CONTEXT=OptionsDialog]</legend>
        <table>
            <tbody>
                <tr>
                    <td>
                        <label for="webui_address_value">QBT_TR(IP address:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="webui_address_value">
                        <label for="webui_port_value" style="margin-left: 10px;">QBT_TR(Port:)QBT_TR[CONTEXT=OptionsDialog]</label>
                        <input type="text" id="webui_port_value" style="width: 6em;">
                    </td>
                </tr>
            </tbody>
        </table>
        <div class="formRow">
            <input type="checkbox" id="webui_upnp_checkbox">
            <label for="webui_upnp_checkbox">QBT_TR(Use UPnP / NAT-PMP to forward the port from my router)QBT_TR[CONTEXT=OptionsDialog]</label>
        </div>
        <fieldset class="settings">
            <legend>
                <input type="checkbox" id="use_https_checkbox" onclick="qBittorrent.Preferences.updateHttpsSettings();">
                <label for="use_https_checkbox">QBT_TR(Use HTTPS instead of HTTP)QBT_TR[CONTEXT=OptionsDialog]</label>
            </legend>
            <table>
                <tbody>
                    <tr>
                        <td>
                            <label for="ssl_cert_text">QBT_TR(Certificate:)QBT_TR[CONTEXT=OptionsDialog]</label>
                        </td>
                        <td>
                            <input type="text" id="ssl_cert_text" class="pathFile" style="width: 30em;">
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <label for="ssl_key_text">QBT_TR(Key:)QBT_TR[CONTEXT=OptionsDialog]</label>
                        </td>
                        <td>
                            <input type="text" id="ssl_key_text" class="pathFile" style="width: 30em;">
                        </td>
                    </tr>
                </tbody>
            </table>
            <div style="padding-left: 10px;"><a target="_blank" href="https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts">QBT_TR(Information about certificates)QBT_TR[CONTEXT=HttpServer]</a></div>
        </fieldset>

        <fieldset class="settings">
            <legend>QBT_TR(Authentication)QBT_TR[CONTEXT=OptionsDialog]</legend>
            <table>
                <tbody>
                    <tr>
                        <td>
                            <label for="webui_username_text">QBT_TR(Username:)QBT_TR[CONTEXT=OptionsDialog]</label>
                        </td>
                        <td>
                            <input type="text" id="webui_username_text">
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <label for="webui_password_text">QBT_TR(Password:)QBT_TR[CONTEXT=OptionsDialog]</label>
                        </td>
                        <td>
                            <input type="password" id="webui_password_text" placeholder="QBT_TR(Change current password)QBT_TR[CONTEXT=OptionsDialog]" autocomplete="new-password">
                        </td>
                    </tr>
                </tbody>
            </table>
            <div class="formRow">
                <input type="checkbox" id="bypass_local_auth_checkbox">
                <label for="bypass_local_auth_checkbox">QBT_TR(Bypass authentication for clients on localhost)QBT_TR[CONTEXT=OptionsDialog]</label>
            </div>
            <div class="formRow">
                <input type="checkbox" id="bypass_auth_subnet_whitelist_checkbox" onclick="qBittorrent.Preferences.updateBypasssAuthSettings();">
                <label id="bypassAuthSubnetWhitelistLabel" for="bypass_auth_subnet_whitelist_checkbox">QBT_TR(Bypass authentication for clients in whitelisted IP subnets)QBT_TR[CONTEXT=OptionsDialog]</label>
            </div>
            <div class="formRow" style="padding-left: 30px; padding-top: 5px;">
                <textarea id="bypass_auth_subnet_whitelist_textarea" rows="5" cols="48" placeholder="QBT_TR(Example: 172.17.32.0/24, fdff:ffff:c8::/40)QBT_TR[CONTEXT=OptionsDialog]" aria-labelledby="bypassAuthSubnetWhitelistLabel"></textarea>
            </div>
            <table>
                <tbody>
                    <tr>
                        <td><label for="webUIMaxAuthFailCountInput">QBT_TR(Ban client after consecutive failures:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
                        <td><input type="number" id="webUIMaxAuthFailCountInput" style="width: 6em;" min="0"></td>
                    </tr>
                    <tr>
                        <td style="text-align: right;"><label for="webUIBanDurationInput">QBT_TR(ban for:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
                        <td><input type="number" id="webUIBanDurationInput" style="width: 6em;" min="1">QBT_TR(seconds)QBT_TR[CONTEXT=OptionsDialog]</td>
                    </tr>
                </tbody>
            </table>
            <table>
                <tbody>
                    <tr>
                        <td><label for="webUISessionTimeoutInput">QBT_TR(Session timeout:)QBT_TR[CONTEXT=OptionsDialog]</label></td>
                        <td><input type="number" id="webUISessionTimeoutInput" style="width: 6em;" min="0">&nbsp;&nbsp;QBT_TR(seconds)QBT_TR[CONTEXT=OptionsDialog]</td>
                    </tr>
                </tbody>
            </table>
        </fieldset>

        <fieldset class="settings">
            <legend><input type="checkbox" id="use_alt_webui_checkbox" onclick="qBittorrent.Preferences.updateAlternativeWebUISettings();">
                <label for="use_alt_webui_checkbox">QBT_TR(Use alternative WebUI)QBT_TR[CONTEXT=OptionsDialog]</label>
            </legend>
            <div class="formRow">
                <label for="webui_files_location_textarea">QBT_TR(Files location:)QBT_TR[CONTEXT=OptionsDialog]</label>
                <input type="text" id="webui_files_location_textarea" class="pathDirectory">
            </div>
            <div class="formRow">
                <a href="https://github.com/qbittorrent/qBittorrent/wiki/List-of-known-alternate-WebUIs" target="_blank">QBT_TR(List of alternative WebUI)QBT_TR[CONTEXT=OptionsDialog]</a>
            </div>
        </fieldset>

        <fieldset class="settings">
            <legend>QBT_TR(Security)QBT_TR[CONTEXT=OptionsDialog]</legend>
            <div class="formRow">
                <input type="checkbox" id="clickjacking_protection_checkbox">
                <label for="clickjacking_protection_checkbox">QBT_TR(Enable clickjacking protection)QBT_TR[CONTEXT=OptionsDialog]</label>
            </div>
            <div class="formRow">
                <input type="checkbox" id="csrf_protection_checkbox">
                <label for="csrf_protection_checkbox">QBT_TR(Enable Cross-Site Request Forgery (CSRF) protection)QBT_TR[CONTEXT=OptionsDialog]</label>
            </div>
            <div class="formRow">
                <input type="checkbox" id="secureCookieCheckbox">
                <label for="secureCookieCheckbox">QBT_TR(Enable cookie Secure flag (requires HTTPS or localhost connection))QBT_TR[CONTEXT=OptionsDialog]</label>
            </div>

            <fieldset class="settings">
                <legend>
                    <input type="checkbox" id="host_header_validation_checkbox" onclick="qBittorrent.Preferences.updateHostHeaderValidationSettings();">
                    <label for="host_header_validation_checkbox">QBT_TR(Enable Host header validation)QBT_TR[CONTEXT=OptionsDialog]</label>
                </legend>
                <table>
                    <tbody>
                        <tr>
                            <td>
                                <label for="webui_domain_textarea">QBT_TR(Server domains:)QBT_TR[CONTEXT=OptionsDialog]</label>
                            </td>
                            <td>
                                <textarea id="webui_domain_textarea" rows="1" cols="60" title="QBT_TR(Whitelist for filtering HTTP Host header values.
In order to defend against DNS rebinding attack,
you should put in domain names used by WebUI server.

Use ';' to split multiple entries. Can use wildcard '*'.)QBT_TR[CONTEXT=OptionsDialog]"></textarea>
                            </td>
                        </tr>
                    </tbody>
                </table>
            </fieldset>
        </fieldset>

        <fieldset class="settings">
            <legend>
                <input type="checkbox" id="webUIUseCustomHTTPHeadersCheckbox" onclick="qBittorrent.Preferences.updateWebUICustomHTTPHeadersSettings();">
                <label id="webUIUseCustomHTTPHeadersLabel" for="webUIUseCustomHTTPHeadersCheckbox">QBT_TR(Add custom HTTP headers)QBT_TR[CONTEXT=OptionsDialog]</label>
            </legend>
            <textarea id="webUICustomHTTPHeadersTextarea" placeholder="QBT_TR(Header: value pairs, one per line)QBT_TR[CONTEXT=OptionsDialog]" aria-labelledby="webUIUseCustomHTTPHeadersLabel" style="width: 90%;"></textarea>
        </fieldset>

        <fieldset class="settings">
            <legend>
                <input type="checkbox" id="webUIReverseProxySupportCheckbox" onclick="qBittorrent.Preferences.updateWebUIReverseProxySettings();">
                <label for="webUIReverseProxySupportCheckbox">QBT_TR(Enable reverse proxy support)QBT_TR[CONTEXT=OptionsDialog]</label>
            </legend>
            <div class="formRow">
                <label for="webUIReverseProxiesListTextarea">QBT_TR(Trusted proxies list:)QBT_TR[CONTEXT=OptionsDialog]</label>
                <input type="text" id="webUIReverseProxiesListTextarea" title="QBT_TR(Specify reverse proxy IPs (or subnets, e.g. 0.0.0.0/24) in order to use forwarded client address (X-Forwarded-For header). Use ';' to split multiple entries.)QBT_TR[CONTEXT=OptionsDialog]">
            </div>
            <div class="formRow">
                <a href="https://github.com/qbittorrent/qBittorrent/wiki#reverse-proxy-setup-for-webui-access" target="_blank">QBT_TR(Reverse proxy setup examples)QBT_TR[CONTEXT=HttpServer]</a>
            </div>
        </fieldset>

    </fieldset>

    <fieldset class="settings">
        <legend>
            <input type="checkbox" id="use_dyndns_checkbox" onclick="qBittorrent.Preferences.updateDynDnsSettings();">
            <label id="UseDyndnsLabel" for="use_dyndns_checkbox">QBT_TR(Update my dynamic domain name)QBT_TR[CONTEXT=OptionsDialog]</label>
        </legend>
        <select id="dyndns_select" aria-labelledby="UseDyndnsLabel">
            <option value="0">DynDNS</option>
            <option value="1">NO-IP</option>
        </select>
        <input type="button" value="QBT_TR(Register)QBT_TR[CONTEXT=OptionsDialog]" onclick="qBittorrent.Preferences.registerDynDns();">
        <table style="margin-top: 10px;">
            <tbody>
                <tr>
                    <td>
                        <label for="dyndns_domain_text">QBT_TR(Domain name:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="dyndns_domain_text">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="dyndns_username_text">QBT_TR(Username:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="dyndns_username_text">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="dyndns_password_text">QBT_TR(Password:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="password" id="dyndns_password_text">
                    </td>
                </tr>
            </tbody>
        </table>
    </fieldset>
</div>

<div id="AdvancedTab" class="PrefTab invisible">
    <fieldset class="settings">
        <legend>QBT_TR(qBittorrent Section)QBT_TR[CONTEXT=OptionsDialog]&nbsp;(<a href="https://github.com/qbittorrent/qBittorrent/wiki/Explanation-of-Options-in-qBittorrent#Advanced" target="_blank">QBT_TR(Open documentation)QBT_TR[CONTEXT=HttpServer]</a>)</legend>
        <table>
            <tbody>
                <tr>
                    <td>
                        <label for="resumeDataStorageType">QBT_TR(Resume data storage type (requires restart):)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <select id="resumeDataStorageType" style="width: 15em;">
                            <option value="Legacy">QBT_TR(Fastresume files)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="SQLite">QBT_TR(SQLite database (experimental))QBT_TR[CONTEXT=OptionsDialog]</option>
                        </select>
                    </td>
                </tr>
                <tr id="rowTorrentContentRemoveOption">
                    <td>
                        <label for="torrentContentRemoveOption">QBT_TR(Torrent content removing mode:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <select id="torrentContentRemoveOption" style="width: 15em;">
                            <option value="Delete">QBT_TR(Delete files permanently)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="MoveToTrash">QBT_TR(Move files to trash (if possible))QBT_TR[CONTEXT=OptionsDialog]</option>
                        </select>
                    </td>
                </tr>
                <tr id="rowMemoryWorkingSetLimit">
                    <td>
                        <label for="memoryWorkingSetLimit">QBT_TR(Physical memory (RAM) usage limit:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://wikipedia.org/wiki/Working_set" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="memoryWorkingSetLimit" style="width: 15em;" title="QBT_TR(This option is less effective on Linux)QBT_TR[CONTEXT=OptionsDialog]">&nbsp;&nbsp;QBT_TR(MiB)QBT_TR[CONTEXT=OptionsDialog]
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="networkInterface">QBT_TR(Network interface:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <select id="networkInterface" style="width: 15em;">
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="optionalIPAddressToBind">QBT_TR(Optional IP address to bind to:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <select id="optionalIPAddressToBind" style="width: 15em;">
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="saveResumeDataInterval">QBT_TR(Save resume data interval:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="saveResumeDataInterval" style="width: 15em;">&nbsp;&nbsp;QBT_TR(min)QBT_TR[CONTEXT=OptionsDialog]
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="saveStatisticsInterval">QBT_TR(Save statistics interval:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="saveStatisticsInterval" style="width: 15em;">&nbsp;&nbsp;QBT_TR(min)QBT_TR[CONTEXT=OptionsDialog]
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="torrentFileSizeLimit">QBT_TR(.torrent file size limit:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="torrentFileSizeLimit" style="width: 15em;">&nbsp;&nbsp;QBT_TR(MiB)QBT_TR[CONTEXT=OptionsDialog]
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="confirmTorrentRecheck">QBT_TR(Confirm torrent recheck:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="checkbox" id="confirmTorrentRecheck">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="recheckTorrentsOnCompletion">QBT_TR(Recheck torrents on completion:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="checkbox" id="recheckTorrentsOnCompletion">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="appInstanceName">QBT_TR(Customize application instance name:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="appInstanceName" style="width: 15em;" title="QBT_TR(It appends the text to the window title to help distinguish qBittorent instances)QBT_TR[CONTEXT=OptionsDialog]">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="refreshInterval">QBT_TR(Refresh interval:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="refreshInterval" style="width: 15em;" title="QBT_TR(It controls the internal state update interval which in turn will affect UI updates)QBT_TR[CONTEXT=OptionsDialog]">&nbsp;&nbsp;QBT_TR(ms)QBT_TR[CONTEXT=OptionsDialog]
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="resolvePeerCountries">QBT_TR(Resolve peer countries:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="checkbox" id="resolvePeerCountries">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="reannounceWhenAddressChanged">QBT_TR(Reannounce to all trackers when IP or port changed:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="checkbox" id="reannounceWhenAddressChanged">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="enableEmbeddedTracker">QBT_TR(Enable embedded tracker:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="checkbox" id="enableEmbeddedTracker">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="embeddedTrackerPort">QBT_TR(Embedded tracker port:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="embeddedTrackerPort" style="width: 15em;">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="embeddedTrackerPortForwarding">QBT_TR(Enable port forwarding for embedded tracker:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="checkbox" id="embeddedTrackerPortForwarding">
                    </td>
                </tr>
                <tr id="rowMarkOfTheWeb">
                    <td>
                        <label for="markOfTheWeb">QBT_TR(Enable Mark-of-the-Web (MOTW) for downloaded files (require macOS or Windows):)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="checkbox" id="markOfTheWeb">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="ignoreSSLErrors">QBT_TR(Ignore SSL errors:)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="checkbox" id="ignoreSSLErrors">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="pythonExecutablePath">QBT_TR(Python executable path (may require restart):)QBT_TR[CONTEXT=OptionsDialog]</label>
                    </td>
                    <td>
                        <input type="text" id="pythonExecutablePath" class="pathFile" placeholder="QBT_TR((Auto detect if empty))QBT_TR[CONTEXT=OptionsDialog]" style="width: 15em;">
                    </td>
                </tr>
            </tbody>
        </table>
    </fieldset>
    <fieldset class="settings">
        <legend>QBT_TR(libtorrent Section)QBT_TR[CONTEXT=OptionsDialog]&nbsp;(<a href="https://www.libtorrent.org/reference-Settings.html" target="_blank">QBT_TR(Open documentation)QBT_TR[CONTEXT=HttpServer]</a>)</legend>
        <table>
            <tbody>
                <tr>
                    <td>
                        <label for="bdecodeDepthLimit">QBT_TR(Bdecode depth limit:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Bdecoding.html#bdecode()" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="bdecodeDepthLimit" style="width: 15em;">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="bdecodeTokenLimit">QBT_TR(Bdecode token limit:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Bdecoding.html#bdecode()" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="bdecodeTokenLimit" style="width: 15em;">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="asyncIOThreads">QBT_TR(Asynchronous I/O threads:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#aio_threads" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="asyncIOThreads" style="width: 15em;">
                    </td>
                </tr>
                <tr id="rowHashingThreads">
                    <td>
                        <label for="hashingThreads">QBT_TR(Hashing threads:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#hashing_threads" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="hashingThreads" style="width: 15em;">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="filePoolSize">QBT_TR(File pool size:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#file_pool_size" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="filePoolSize" style="width: 15em;">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="outstandMemoryWhenCheckingTorrents">QBT_TR(Outstanding memory when checking torrents:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#checking_mem_usage" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="outstandMemoryWhenCheckingTorrents" style="width: 15em;">&nbsp;&nbsp;QBT_TR(MiB)QBT_TR[CONTEXT=OptionsDialog]
                    </td>
                </tr>
                <tr id="rowDiskCache">
                    <td>
                        <label for="diskCache">QBT_TR(Disk cache:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#cache_size" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="diskCache" style="width: 15em;">&nbsp;&nbsp;QBT_TR(MiB)QBT_TR[CONTEXT=OptionsDialog]
                    </td>
                </tr>
                <tr id="rowDiskCacheExpiryInterval">
                    <td>
                        <label for="diskCacheExpiryInterval">QBT_TR(Disk cache expiry interval:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#cache_expiry" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="diskCacheExpiryInterval" style="width: 15em;">&nbsp;&nbsp;QBT_TR(s)QBT_TR[CONTEXT=OptionsDialog]
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="diskQueueSize">QBT_TR(Disk queue size:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#max_queued_disk_bytes" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="diskQueueSize" style="width: 15em;">&nbsp;&nbsp;QBT_TR(KiB)QBT_TR[CONTEXT=OptionsDialog]
                    </td>
                </tr>
                <tr id="rowDiskIOType">
                    <td>
                        <label for="diskIOType">QBT_TR(Disk IO type (requires restart):)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/single-page-ref.html#default-disk-io-constructor" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <select id="diskIOType" style="width: 15em;">
                            <option value="0">QBT_TR(Default)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="1">QBT_TR(Memory mapped files)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="2">QBT_TR(POSIX-compliant)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="3">QBT_TR(Simple pread/pwrite)QBT_TR[CONTEXT=OptionsDialog]</option>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="diskIOReadMode">QBT_TR(Disk IO read mode:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#disk_io_read_mode" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <select id="diskIOReadMode" style="width: 15em;">
                            <option value="0">QBT_TR(Disable OS cache)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="1">QBT_TR(Enable OS cache)QBT_TR[CONTEXT=OptionsDialog]</option>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="diskIOWriteMode">QBT_TR(Disk IO write mode:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#disk_io_write_mode" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <select id="diskIOWriteMode" style="width: 15em;">
                            <option value="0">QBT_TR(Disable OS cache)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="1">QBT_TR(Enable OS cache)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="2" id="diskIOWriteModeWriteThrough">QBT_TR(Write-through)QBT_TR[CONTEXT=OptionsDialog]</option>
                        </select>
                    </td>
                </tr>
                <tr id="rowCoalesceReadsAndWrites">
                    <td>
                        <label for="coalesceReadsAndWrites">QBT_TR(Coalesce reads &amp; writes:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#coalesce_reads" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="checkbox" id="coalesceReadsAndWrites">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="pieceExtentAffinity">QBT_TR(Use piece extent affinity:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://libtorrent.org/single-page-ref.html#piece_extent_affinity" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="checkbox" id="pieceExtentAffinity">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="sendUploadPieceSuggestions">QBT_TR(Send upload piece suggestions:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#suggest_mode" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="checkbox" id="sendUploadPieceSuggestions">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="sendBufferWatermark">QBT_TR(Send buffer watermark:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#send_buffer_watermark" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="sendBufferWatermark" style="width: 15em;">&nbsp;&nbsp;QBT_TR(KiB)QBT_TR[CONTEXT=OptionsDialog]
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="sendBufferLowWatermark">QBT_TR(Send buffer low watermark:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#send_buffer_low_watermark" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="sendBufferLowWatermark" style="width: 15em;">&nbsp;&nbsp;QBT_TR(KiB)QBT_TR[CONTEXT=OptionsDialog]
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="sendBufferWatermarkFactor">QBT_TR(Send buffer watermark factor:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#send_buffer_watermark_factor" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="sendBufferWatermarkFactor" style="width: 15em;">&nbsp;&nbsp;%
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="connectionSpeed">QBT_TR(Outgoing connections per second:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#connection_speed" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="connectionSpeed" style="width: 15em;">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="socketSendBufferSize">QBT_TR(Socket send buffer size [0: system default]:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#send_socket_buffer_size" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="socketSendBufferSize" style="width: 15em;">&nbsp;&nbsp;QBT_TR(KiB)QBT_TR[CONTEXT=OptionsDialog]
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="socketReceiveBufferSize">QBT_TR(Socket receive buffer size [0: system default]:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#recv_socket_buffer_size" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="socketReceiveBufferSize" style="width: 15em;">&nbsp;&nbsp;QBT_TR(KiB)QBT_TR[CONTEXT=OptionsDialog]
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="socketBacklogSize">QBT_TR(Socket backlog size:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#listen_queue_size" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="socketBacklogSize" style="width: 15em;">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="outgoingPortsMin">QBT_TR(Outgoing ports (Min) [0: disabled]:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#outgoing_port" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="outgoingPortsMin" style="width: 15em;">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="outgoingPortsMax">QBT_TR(Outgoing ports (Max) [0: disabled]:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#outgoing_port" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="outgoingPortsMax" style="width: 15em;">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="UPnPLeaseDuration">QBT_TR(UPnP lease duration [0: permanent lease]:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#upnp_lease_duration" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="UPnPLeaseDuration" style="width: 15em;">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="peerToS">QBT_TR(Type of service (ToS) for connections to peers)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#peer_tos" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="peerToS" style="width: 15em;">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="utpTCPMixedModeAlgorithm">QBT_TR(μTP-TCP mixed mode algorithm:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#mixed_mode_algorithm" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <select id="utpTCPMixedModeAlgorithm" style="width: 15em;">
                            <option value="0">QBT_TR(Prefer TCP)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="1">QBT_TR(Peer proportional (throttles TCP))QBT_TR[CONTEXT=OptionsDialog]</option>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="IDNSupportCheckbox">QBT_TR(Support internationalized domain name (IDN):)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#allow_idna" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="checkbox" id="IDNSupportCheckbox">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="allowMultipleConnectionsFromTheSameIPAddress">QBT_TR(Allow multiple connections from the same IP address:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#allow_multiple_connections_per_ip" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="checkbox" id="allowMultipleConnectionsFromTheSameIPAddress">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="validateHTTPSTrackerCertificate">QBT_TR(Validate HTTPS tracker certificate:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#validate_https_trackers" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="checkbox" id="validateHTTPSTrackerCertificate">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="mitigateSSRF">QBT_TR(Server-side request forgery (SSRF) mitigation:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#ssrf_mitigation" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="checkbox" id="mitigateSSRF">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="blockPeersOnPrivilegedPorts">QBT_TR(Disallow connection to peers on privileged ports:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://libtorrent.org/single-page-ref.html#no_connect_privileged_ports" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="checkbox" id="blockPeersOnPrivilegedPorts">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="uploadSlotsBehavior">QBT_TR(Upload slots behavior:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#choking_algorithm" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <select id="uploadSlotsBehavior" style="width: 15em;">
                            <option value="0">QBT_TR(Fixed slots)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="1">QBT_TR(Upload rate based)QBT_TR[CONTEXT=OptionsDialog]</option>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="uploadChokingAlgorithm">QBT_TR(Upload choking algorithm:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#seed_choking_algorithm" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <select id="uploadChokingAlgorithm" style="width: 15em;">
                            <option value="0">QBT_TR(Round-robin)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="1">QBT_TR(Fastest upload)QBT_TR[CONTEXT=OptionsDialog]</option>
                            <option value="2">QBT_TR(Anti-leech)QBT_TR[CONTEXT=OptionsDialog]</option>
                        </select>
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="announceAllTrackers">QBT_TR(Always announce to all trackers in a tier:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#announce_to_all_trackers" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="checkbox" id="announceAllTrackers">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="announceAllTiers">QBT_TR(Always announce to all tiers:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#announce_to_all_tiers" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="checkbox" id="announceAllTiers">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="announceIP">QBT_TR(IP address reported to trackers (requires restart):)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#announce_ip" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="announceIP" style="width: 15em;">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="maxConcurrentHTTPAnnounces">QBT_TR(Max concurrent HTTP announces:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#max_concurrent_http_announces" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="maxConcurrentHTTPAnnounces" style="width: 15em;">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="stopTrackerTimeout">QBT_TR(Stop tracker timeout [0: disabled]:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#stop_tracker_timeout" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="stopTrackerTimeout" style="width: 15em;">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="peerTurnover">QBT_TR(Peer turnover disconnect percentage:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#peer_turnover" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="peerTurnover" style="width: 15em;">&nbsp;&nbsp;%
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="peerTurnoverCutoff">QBT_TR(Peer turnover threshold percentage:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#peer_turnover" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="peerTurnoverCutoff" style="width: 15em;">&nbsp;&nbsp;%
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="peerTurnoverInterval">QBT_TR(Peer turnover disconnect interval:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#peer_turnover" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="peerTurnoverInterval" style="width: 15em;">&nbsp;&nbsp;s
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="requestQueueSize">QBT_TR(Maximum outstanding requests to a single peer:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#max_out_request_queue" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="requestQueueSize" style="width: 15em;">
                    </td>
                </tr>
                <tr>
                    <td>
                        <label for="dhtBootstrapNodes">QBT_TR(DHT bootstrap nodes:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#dht_bootstrap_nodes" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input type="text" id="dhtBootstrapNodes" placeholder="QBT_TR(Resets to default if empty)QBT_TR[CONTEXT=OptionsDialog]" style="width: 15em;">
                    </td>
                </tr>
                <tr id="rowI2pInboundQuantity">
                    <td>
                        <label for="i2pInboundQuantity">QBT_TR(I2P inbound quantity:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#i2p_inbound_quantity" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input id="i2pInboundQuantity" type="number" min="1" max="16" onchange="qBittorrent.Preferences.numberInputLimiter(this);" style="width: 15em;">
                    </td>
                </tr>
                <tr id="rowI2pOutboundQuantity">
                    <td>
                        <label for="i2pOutboundQuantity">QBT_TR(I2P outbound quantity:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#i2p_outbound_quantity" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input id="i2pOutboundQuantity" type="number" min="1" max="16" onchange="qBittorrent.Preferences.numberInputLimiter(this);" style="width: 15em;">
                    </td>
                </tr>
                <tr id="rowI2pInboundLength">
                    <td>
                        <label for="i2pInboundLength">QBT_TR(I2P inbound length:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#i2p_inbound_length" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input id="i2pInboundLength" type="number" min="0" max="7" onchange="qBittorrent.Preferences.numberInputLimiter(this);" style="width: 15em;">
                    </td>
                </tr>
                <tr id="rowI2pOutboundLength">
                    <td>
                        <label for="i2pOutboundLength">QBT_TR(I2P outbound length:)QBT_TR[CONTEXT=OptionsDialog]&nbsp;<a href="https://www.libtorrent.org/reference-Settings.html#i2p_outbound_length" target="_blank">(?)</a></label>
                    </td>
                    <td>
                        <input id="i2pOutboundLength" type="number" min="0" max="7" onchange="qBittorrent.Preferences.numberInputLimiter(this);" style="width: 15em;">
                    </td>
                </tr>
            </tbody>
        </table>
    </fieldset>
</div>

<div style="text-align: center; margin-top: 1em;"><input type="button" value="QBT_TR(Save)QBT_TR[CONTEXT=HttpServer]" onclick="qBittorrent.Preferences.applyPreferences();"></div>

<script>
    "use strict";

    window.qBittorrent ??= {};
    window.qBittorrent.Preferences ??= (() => {
        const exports = () => {
            return {
                setup: setup,
                numberInputLimiter: numberInputLimiter,
                updateFileLogEnabled: updateFileLogEnabled,
                updateFileLogBackupEnabled: updateFileLogBackupEnabled,
                updateFileLogDeleteEnabled: updateFileLogDeleteEnabled,
                updateTempDirEnabled: updateTempDirEnabled,
                updateExportDirEnabled: updateExportDirEnabled,
                updateExportDirFinEnabled: updateExportDirFinEnabled,
                addWatchFolder: addWatchFolder,
                updateExcludedFileNamesEnabled: updateExcludedFileNamesEnabled,
                changeWatchFolderSelect: changeWatchFolderSelect,
                updateMailNotification: updateMailNotification,
                updateMailAuthSettings: updateMailAuthSettings,
                sendTestEmail: sendTestEmail,
                updateAutoRun: updateAutoRun,
                updateAutoRunOnTorrentAdded: updateAutoRunOnTorrentAdded,
                generateRandomPort: generateRandomPort,
                updateMaxConnecEnabled: updateMaxConnecEnabled,
                updateMaxConnecPerTorrentEnabled: updateMaxConnecPerTorrentEnabled,
                updateMaxUploadsEnabled: updateMaxUploadsEnabled,
                updateMaxUploadsPerTorrentEnabled: updateMaxUploadsPerTorrentEnabled,
                updateI2PSettingsEnabled: updateI2PSettingsEnabled,
                updatePeerProxySettings: updatePeerProxySettings,
                updatePeerProxyAuthSettings: updatePeerProxyAuthSettings,
                updateFilterSettings: updateFilterSettings,
                updateSchedulingEnabled: updateSchedulingEnabled,
                updateQueueingSystem: updateQueueingSystem,
                updateSlowTorrentsSettings: updateSlowTorrentsSettings,
                updateMaxRatioTimeEnabled: updateMaxRatioTimeEnabled,
                updateAddTrackersEnabled: updateAddTrackersEnabled,
                updateHttpsSettings: updateHttpsSettings,
                updateBypasssAuthSettings: updateBypasssAuthSettings,
                updateAlternativeWebUISettings: updateAlternativeWebUISettings,
                updateHostHeaderValidationSettings: updateHostHeaderValidationSettings,
                updateWebUICustomHTTPHeadersSettings: updateWebUICustomHTTPHeadersSettings,
                updateWebUIReverseProxySettings: updateWebUIReverseProxySettings,
                updateDynDnsSettings: updateDynDnsSettings,
                updateWebuiLocaleSelect: updateWebuiLocaleSelect,
                registerDynDns: registerDynDns,
                applyPreferences: applyPreferences
            };
        };

        // Behavior tab
        const numberInputLimiter = (input) => {
            const min = input.getAttribute("min");
            const max = input.getAttribute("max");

            if (min && (input.value.toInt() < min.toInt()))
                input.value = min;

            if (max && (input.value.toInt() > max.toInt()))
                input.value = max;
        };

        const updateFileLogEnabled = () => {
            const isFileLogEnabled = $("filelog_checkbox").checked;
            $("filelog_save_path_input").disabled = !isFileLogEnabled;
            $("filelog_backup_checkbox").disabled = !isFileLogEnabled;
            $("filelog_delete_old_checkbox").disabled = !isFileLogEnabled;

            updateFileLogBackupEnabled();
            updateFileLogDeleteEnabled();
        };

        const updateFileLogBackupEnabled = () => {
            const pros = $("filelog_backup_checkbox").getProperties("disabled", "checked");
            $("filelog_max_size_input").disabled = pros.disabled || !pros.checked;
        };

        const updateFileLogDeleteEnabled = () => {
            const pros = $("filelog_delete_old_checkbox").getProperties("disabled", "checked");
            $("filelog_age_input").disabled = pros.disabled || !pros.checked;
            $("filelog_age_type_select").disabled = pros.disabled || !pros.checked;
        };

        // Downloads tab
        let watchedFoldersTable;

        const updateTempDirEnabled = () => {
            const isTempDirEnabled = $("temppath_checkbox").checked;
            $("temppath_text").disabled = !isTempDirEnabled;
        };

        const changeWatchFolderSelect = (item) => {
            if (item.value === "other") {
                item.nextElementSibling.hidden = false;
                item.nextElementSibling.value = "QBT_TR(Type folder here)QBT_TR[CONTEXT=ScanFoldersModel]";
                item.nextElementSibling.select();
            }
            else {
                item.nextElementSibling.hidden = true;
                const text = item.options[item.selectedIndex].textContent;
                item.nextElementSibling.value = text;
            }
        };

        const addWatchFolder = (folder = "", sel = "default_folder", other = "") => {
            const pos = $("watched_folders_tab").getChildren("tbody")[0].getChildren("tr").length;
            const myinput = "<input id='text_watch_" + pos + "' type='text' value='" + folder + "'>";
            const disableInput = (sel !== "other");
            const mycb = "<div class='select-watched-folder-editable'>"
                + "<select id ='cb_watch_" + pos + "' onchange='qBittorrent.Preferences.changeWatchFolderSelect(this)'>"
                + "<option value='watch_folder'>QBT_TR(Monitored folder)QBT_TR[CONTEXT=ScanFoldersModel]</option>"
                + "<option value='default_folder'>QBT_TR(Default save location)QBT_TR[CONTEXT=ScanFoldersModel]</option>"
                + "<option value='other'>QBT_TR(Other...)QBT_TR[CONTEXT=ScanFoldersModel]</option>"
                + "</select>"
                + "<input id='cb_watch_txt_" + pos + "' type='text' " + (disableInput ? "hidden " : "") + "/>"
                + "<img src='images/list-add.svg' id='addFolderImg_" + pos + "' alt='Add' style='padding-left:170px;width:16px;cursor:pointer;' onclick='qBittorrent.Preferences.addWatchFolder();'>"
                + "</div>";

            watchedFoldersTable.push([myinput, mycb]);
            $("cb_watch_" + pos).value = sel;
            if (disableInput) {
                const elt = $("cb_watch_" + pos);
                other = elt.options[elt.selectedIndex].textContent;
            }
            $("cb_watch_txt_" + pos).value = other;

            // hide previous img
            if (pos > 0)
                $("addFolderImg_" + (pos - 1)).style.display = "none";
        };

        const getWatchedFolders = () => {
            const nb_folders = $("watched_folders_tab").getChildren("tbody")[0].getChildren("tr").length;
            const folders = new Hash();
            for (let i = 0; i < nb_folders; ++i) {
                const fpath = $("text_watch_" + i).value.trim();
                if (fpath.length > 0) {
                    const sel = $("cb_watch_" + i).value.trim();

                    let other;
                    if (sel === "other")
                        other = $("cb_watch_txt_" + i).value.trim();
                    else
                        other = (sel === "watch_folder") ? 0 : 1;

                    folders.set(fpath, other);
                }
            }
            return folders;
        };

        const updateExcludedFileNamesEnabled = () => {
            const isAExcludedFileNamesEnabled = $("excludedFileNamesCheckbox").checked;
            $("excludedFileNamesTextarea").disabled = !isAExcludedFileNamesEnabled;
        };

        const updateExportDirEnabled = () => {
            const isExportDirEnabled = $("exportdir_checkbox").checked;
            $("exportdir_text").disabled = !isExportDirEnabled;
        };

        const updateExportDirFinEnabled = () => {
            const isExportDirFinEnabled = $("exportdirfin_checkbox").checked;
            $("exportdirfin_text").disabled = !isExportDirFinEnabled;
        };

        const updateMailNotification = () => {
            const isMailNotificationEnabled = $("mail_notification_checkbox").checked;
            $("src_email_txt").disabled = !isMailNotificationEnabled;
            $("dest_email_txt").disabled = !isMailNotificationEnabled;
            $("smtp_server_txt").disabled = !isMailNotificationEnabled;
            $("mail_ssl_checkbox").disabled = !isMailNotificationEnabled;
            $("mail_auth_checkbox").disabled = !isMailNotificationEnabled;
            $("mail_test_button").disabled = !isMailNotificationEnabled;

            if (!isMailNotificationEnabled) {
                $("mail_auth_checkbox").checked = !isMailNotificationEnabled;
                updateMailAuthSettings();
            }
        };

        const updateMailAuthSettings = () => {
            const isMailAuthEnabled = $("mail_auth_checkbox").checked;
            $("mail_username_text").disabled = !isMailAuthEnabled;
            $("mail_password_text").disabled = !isMailAuthEnabled;
        };

        const sendTestEmail = () => {
            new Request({
                url: "api/v2/app/sendTestEmail",
                method: "post",
                onFailure: () => {
                    alert("QBT_TR(Could not contact qBittorrent)QBT_TR[CONTEXT=HttpServer]");
                },
                onSuccess: () => {
                    alert("QBT_TR(Attempted to send email. Check your inbox to confirm success)QBT_TR[CONTEXT=OptionsDialog]");
                }
            }).send();
        };

        const updateAutoRunOnTorrentAdded = () => {
            const isAutoRunOnTorrentAddedEnabled = $("autorunOnTorrentAddedCheckbox").checked;
            $("autorunOnTorrentAddedProgram").disabled = !isAutoRunOnTorrentAddedEnabled;
        };

        const updateAutoRun = () => {
            const isAutoRunEnabled = $("autorun_checkbox").checked;
            $("autorunProg_txt").disabled = !isAutoRunEnabled;
        };

        // Connection tab

        const updateMaxConnecEnabled = () => {
            const isMaxConnecEnabled = $("max_connec_checkbox").checked;
            $("max_connec_value").disabled = !isMaxConnecEnabled;
        };

        const updateMaxConnecPerTorrentEnabled = () => {
            const isMaxConnecPerTorrentEnabled = $("max_connec_per_torrent_checkbox").checked;
            $("max_connec_per_torrent_value").disabled = !isMaxConnecPerTorrentEnabled;
        };

        const updateMaxUploadsEnabled = () => {
            const isMaxUploadsEnabled = $("max_uploads_checkbox").checked;
            $("max_uploads_value").disabled = !isMaxUploadsEnabled;
        };

        const updateMaxUploadsPerTorrentEnabled = () => {
            const isMaxUploadsPerTorrentEnabled = $("max_uploads_per_torrent_checkbox").checked;
            $("max_uploads_per_torrent_value").disabled = !isMaxUploadsPerTorrentEnabled;
        };

        const updateI2PSettingsEnabled = () => {
            const isI2PEnabled = $("i2pEnabledCheckbox").checked;
            $("i2pAddress").disabled = !isI2PEnabled;
            $("i2pPort").disabled = !isI2PEnabled;
            $("i2pMixedMode").disabled = !isI2PEnabled;
        };

        const updatePeerProxySettings = () => {
            const proxyType = $("peer_proxy_type_select").value;
            const isProxyDisabled = (proxyType === "None");
            const isProxySocks4 = (proxyType === "SOCKS4");

            $("peer_proxy_host_text").disabled = isProxyDisabled;
            $("peer_proxy_port_value").disabled = isProxyDisabled;

            $("peer_proxy_auth_checkbox").disabled = (isProxyDisabled || isProxySocks4);
            $("proxy_bittorrent_checkbox").disabled = isProxyDisabled;
            $("use_peer_proxy_checkbox").disabled = (isProxyDisabled || !$("proxy_bittorrent_checkbox").checked);
            $("proxyHostnameLookupCheckbox").disabled = (isProxyDisabled || isProxySocks4);
            $("proxy_rss_checkbox").disabled = (isProxyDisabled || isProxySocks4);
            $("proxy_misc_checkbox").disabled = (isProxyDisabled || isProxySocks4);

            updatePeerProxyAuthSettings();
        };

        const updatePeerProxyAuthSettings = () => {
            const proxyType = $("peer_proxy_type_select").value;
            const isProxyDisabled = (proxyType === "None");
            const isPeerProxyAuthEnabled = (!$("peer_proxy_auth_checkbox").disabled && $("peer_proxy_auth_checkbox").checked);
            $("peer_proxy_username_text").disabled = (isProxyDisabled || !isPeerProxyAuthEnabled);
            $("peer_proxy_password_text").disabled = (isProxyDisabled || !isPeerProxyAuthEnabled);
        };

        const updateFilterSettings = () => {
            const isIPFilterEnabled = $("ipfilter_text_checkbox").checked;
            $("ipfilter_text").disabled = !isIPFilterEnabled;
        };

        // Speed tab
        const updateSchedulingEnabled = () => {
            const isLimitSchedulingEnabled = $("limitSchedulingCheckbox").checked;
            $("schedule_from_hour").disabled = !isLimitSchedulingEnabled;
            $("schedule_from_min").disabled = !isLimitSchedulingEnabled;
            $("schedule_to_hour").disabled = !isLimitSchedulingEnabled;
            $("schedule_to_min").disabled = !isLimitSchedulingEnabled;
            $("schedule_freq_select").disabled = !isLimitSchedulingEnabled;
        };

        // Bittorrent tab
        const updateQueueingSystem = () => {
            const isQueueingEnabled = $("queueing_checkbox").checked;
            $("max_active_dl_value").disabled = !isQueueingEnabled;
            $("max_active_up_value").disabled = !isQueueingEnabled;
            $("max_active_to_value").disabled = !isQueueingEnabled;
            $("dont_count_slow_torrents_checkbox").disabled = !isQueueingEnabled;
            updateSlowTorrentsSettings();
        };

        const updateSlowTorrentsSettings = () => {
            const isDontCountSlowTorrentsEnabled = (!$("dont_count_slow_torrents_checkbox").disabled) && $("dont_count_slow_torrents_checkbox").checked;
            $("dl_rate_threshold").disabled = !isDontCountSlowTorrentsEnabled;
            $("ul_rate_threshold").disabled = !isDontCountSlowTorrentsEnabled;
            $("torrent_inactive_timer").disabled = !isDontCountSlowTorrentsEnabled;
        };

        const updateMaxRatioTimeEnabled = () => {
            const isMaxRatioEnabled = $("max_ratio_checkbox").checked;
            $("max_ratio_value").disabled = !isMaxRatioEnabled;

            const isMaxSeedingTimeEnabled = $("max_seeding_time_checkbox").checked;
            $("max_seeding_time_value").disabled = !isMaxSeedingTimeEnabled;

            const isMaxInactiveSeedingTimeEnabled = $("max_inactive_seeding_time_checkbox").checked;
            $("max_inactive_seeding_time_value").disabled = !isMaxInactiveSeedingTimeEnabled;

            $("max_ratio_act").disabled = !(isMaxRatioEnabled || isMaxSeedingTimeEnabled || isMaxInactiveSeedingTimeEnabled);
        };

        const updateAddTrackersEnabled = () => {
            const isAddTrackersEnabled = $("add_trackers_checkbox").checked;
            $("add_trackers_textarea").disabled = !isAddTrackersEnabled;
        };

        // WebUI tab
        const updateHttpsSettings = () => {
            const isUseHttpsEnabled = $("use_https_checkbox").checked;
            $("ssl_cert_text").disabled = !isUseHttpsEnabled;
            $("ssl_key_text").disabled = !isUseHttpsEnabled;
        };

        const updateBypasssAuthSettings = () => {
            const isBypassAuthSubnetWhitelistEnabled = $("bypass_auth_subnet_whitelist_checkbox").checked;
            $("bypass_auth_subnet_whitelist_textarea").disabled = !isBypassAuthSubnetWhitelistEnabled;
        };

        const updateAlternativeWebUISettings = () => {
            const isUseAlternativeWebUIEnabled = $("use_alt_webui_checkbox").checked;
            $("webui_files_location_textarea").disabled = !isUseAlternativeWebUIEnabled;
        };

        const updateHostHeaderValidationSettings = () => {
            const isHostHeaderValidationEnabled = $("host_header_validation_checkbox").checked;
            $("webui_domain_textarea").disabled = !isHostHeaderValidationEnabled;
        };

        const updateWebUICustomHTTPHeadersSettings = () => {
            const isEnabled = $("webUIUseCustomHTTPHeadersCheckbox").checked;
            $("webUICustomHTTPHeadersTextarea").disabled = !isEnabled;
        };

        const updateWebUIReverseProxySettings = () => {
            const isEnabled = $("webUIReverseProxySupportCheckbox").checked;
            $("webUIReverseProxiesListTextarea").disabled = !isEnabled;
        };

        const updateDynDnsSettings = () => {
            const isDynDnsEnabled = $("use_dyndns_checkbox").checked;
            $("dyndns_select").disabled = !isDynDnsEnabled;
            $("dyndns_domain_text").disabled = !isDynDnsEnabled;
            $("dyndns_username_text").disabled = !isDynDnsEnabled;
            $("dyndns_password_text").disabled = !isDynDnsEnabled;
        };

        const registerDynDns = () => {
            if ($("dyndns_select").value.toInt() === 1)
                window.open("http://www.no-ip.com/services/managed_dns/free_dynamic_dns.html", "NO-IP Registration");
            else
                window.open("https://www.dyndns.com/account/services/hosts/add.html", "DynDNS Registration");
        };

        const generateRandomPort = () => {
            const min = 1024;
            const max = 65535;
            const port = Math.floor(Math.random() * (max - min + 1) + min);
            $("port_value").value = port;
        };

        const time_padding = (val) => {
            let ret = val.toString();
            if (ret.length === 1)
                ret = "0" + ret;
            return ret;
        };

        // Advanced Tab
        const updateNetworkInterfaces = (default_iface, default_iface_name) => {
            const url = "api/v2/app/networkInterfaceList";
            $("networkInterface").getChildren().each(c => c.destroy());
            new Request.JSON({
                url: url,
                method: "get",
                noCache: true,
                onFailure: () => {
                    alert("Could not contact qBittorrent");
                },
                onSuccess: (ifaces) => {
                    if (!Array.isArray(ifaces))
                        return;

                    // add the current network interface to the options if needed
                    if (default_iface && !ifaces.some((item) => item.value === default_iface))
                        ifaces.push({ name: default_iface_name || default_iface, value: default_iface });

                    $("networkInterface").options.add(new Option("QBT_TR(Any interface)QBT_TR[CONTEXT=OptionsDialog]", ""));
                    ifaces.forEach((item, index) => {
                        $("networkInterface").options.add(new Option(item.name, item.value));
                    });
                    $("networkInterface").value = default_iface;
                }
            }).send();
        };

        const updateInterfaceAddresses = (iface, default_addr) => {
            const url = "api/v2/app/networkInterfaceAddressList";
            $("optionalIPAddressToBind").getChildren().each(c => c.destroy());
            new Request.JSON({
                url: url,
                method: "get",
                noCache: true,
                data: {
                    "iface": iface
                },
                onFailure: () => {
                    alert("Could not contact qBittorrent");
                },
                onSuccess: (addresses) => {
                    if (!addresses)
                        return;

                    $("optionalIPAddressToBind").options.add(new Option("QBT_TR(All addresses)QBT_TR[CONTEXT=OptionDialog]", ""));
                    $("optionalIPAddressToBind").options.add(new Option("QBT_TR(All IPv4 addresses)QBT_TR[CONTEXT=OptionDialog]", "0.0.0.0"));
                    $("optionalIPAddressToBind").options.add(new Option("QBT_TR(All IPv6 addresses)QBT_TR[CONTEXT=OptionDialog]", "::"));
                    addresses.forEach((item, index) => {
                        $("optionalIPAddressToBind").options.add(new Option(item, item));
                    });
                    $("optionalIPAddressToBind").value = default_addr;
                }
            }).send();
        };

        const updateWebuiLocaleSelect = (selected) => {
            const languages = [];
            for (let i = 0; i < $("locale_select").options.length; i++)
                languages.push($("locale_select").options[i].value);

            if (!languages.includes(selected)) {
                const lang = selected.slice(0, selected.indexOf("_"));
                selected = languages.includes(lang) ? lang : "en";
            }
            $("locale_select").value = selected;
        };

        const loadPreferences = () => {
            window.parent.qBittorrent.Cache.preferences.init({
                onSuccess: (pref) => {
                    // Behavior tab
                    document.getElementById("displayFullURLTrackerColumn").checked = (LocalPreferences.get("full_url_tracker_column", "false") === "true");
                    document.getElementById("hideZeroFiltersCheckbox").checked = (LocalPreferences.get("hide_zero_status_filters", "false") === "true");
                    $("dblclickDownloadSelect").value = LocalPreferences.get("dblclick_download", "1");
                    $("dblclickCompleteSelect").value = LocalPreferences.get("dblclick_complete", "1");
                    document.getElementById("confirmTorrentDeletion").checked = pref.confirm_torrent_deletion;
                    document.getElementById("useAltRowColorsInput").checked = (LocalPreferences.get("use_alt_row_colors", "true") === "true");
                    $("filelog_checkbox").checked = pref.file_log_enabled;
                    $("filelog_save_path_input").value = pref.file_log_path;
                    $("filelog_backup_checkbox").checked = pref.file_log_backup_enabled;
                    $("filelog_max_size_input").value = pref.file_log_max_size;
                    $("filelog_delete_old_checkbox").checked = pref.file_log_delete_old;
                    $("filelog_age_input").value = pref.file_log_age;
                    $("filelog_age_type_select").value = pref.file_log_age_type;
                    updateFileLogEnabled();

                    // Downloads tab
                    // When adding a torrent
                    let index = 0;
                    switch (pref.torrent_content_layout) {
                        case "Original":
                            index = 0;
                            break;
                        case "Subfolder":
                            index = 1;
                            break;
                        case "NoSubfolder":
                            index = 2;
                            break;
                    }
                    $("contentlayout_select").getChildren("option")[index].selected = true;
                    $("addToTopOfQueueCheckbox").checked = pref.add_to_top_of_queue;
                    $("dontstartdownloads_checkbox").checked = pref.add_stopped_enabled;
                    switch (pref.torrent_stop_condition) {
                        case "None":
                            index = 0;
                            break;
                        case "MetadataReceived":
                            index = 1;
                            break;
                        case "FilesChecked":
                            index = 2;
                            break;
                    }
                    $("stopConditionSelect").getChildren("option")[index].selected = true;
                    document.getElementById("mergeTrackersInput").checked = pref.merge_trackers;
                    $("deletetorrentfileafter_checkbox").checked = pref.auto_delete_mode;

                    $("preallocateall_checkbox").checked = pref.preallocate_all;
                    $("appendext_checkbox").checked = pref.incomplete_files_ext;
                    $("unwantedfolder_checkbox").checked = pref.use_unwanted_folder;

                    // Saving Management
                    $("default_tmm_combobox").value = pref.auto_tmm_enabled;
                    $("torrent_changed_tmm_combobox").value = pref.torrent_changed_tmm_enabled;
                    $("save_path_changed_tmm_combobox").value = pref.save_path_changed_tmm_enabled;
                    $("category_changed_tmm_combobox").value = pref.category_changed_tmm_enabled;
                    $("use_subcategories_checkbox").checked = pref.use_subcategories;
                    document.getElementById("categoryPathsManualModeCheckbox").checked = pref.use_category_paths_in_manual_mode;
                    $("savepath_text").value = pref.save_path;
                    $("temppath_checkbox").checked = pref.temp_path_enabled;
                    $("temppath_text").value = pref.temp_path;
                    updateTempDirEnabled();
                    if (pref.export_dir !== "") {
                        $("exportdir_checkbox").checked = true;
                        $("exportdir_text").value = pref.export_dir;
                    }
                    else {
                        $("exportdir_checkbox").checked = false;
                        $("exportdir_text").value = "";
                    }
                    updateExportDirEnabled();
                    if (pref.export_dir_fin !== "") {
                        $("exportdirfin_checkbox").checked = true;
                        $("exportdirfin_text").value = pref.export_dir_fin;
                    }
                    else {
                        $("exportdirfin_checkbox").checked = false;
                        $("exportdirfin_text").value = "";
                    }
                    updateExportDirFinEnabled();

                    // Automatically add torrents from
                    for (const folder in pref.scan_dirs) {
                        if (!Object.hasOwn(pref.scan_dirs, folder))
                            continue;

                        const folderType = pref.scan_dirs[folder];
                        let sel = "";
                        let other = "";
                        if (typeof folderType === "number") {
                            sel = (folderType === 0) ? "watch_folder" : "default_folder";
                        }
                        else {
                            sel = "other";
                            other = folderType;
                        }
                        addWatchFolder(folder, sel, other);
                    }
                    addWatchFolder();

                    // Excluded file names
                    $("excludedFileNamesCheckbox").checked = pref.excluded_file_names_enabled;
                    $("excludedFileNamesTextarea").value = pref.excluded_file_names;

                    // Email notification upon download completion
                    $("mail_notification_checkbox").checked = pref.mail_notification_enabled;
                    $("src_email_txt").value = pref.mail_notification_sender;
                    $("dest_email_txt").value = pref.mail_notification_email;
                    $("smtp_server_txt").value = pref.mail_notification_smtp;
                    $("mail_ssl_checkbox").checked = pref.mail_notification_ssl_enabled;
                    $("mail_auth_checkbox").checked = pref.mail_notification_auth_enabled;
                    $("mail_username_text").value = pref.mail_notification_username;
                    $("mail_password_text").value = pref.mail_notification_password;
                    updateMailNotification();
                    updateMailAuthSettings();

                    // Run an external program on torrent added
                    $("autorunOnTorrentAddedCheckbox").checked = pref.autorun_on_torrent_added_enabled;
                    $("autorunOnTorrentAddedProgram").value = pref.autorun_on_torrent_added_program;
                    updateAutoRunOnTorrentAdded();
                    // Run an external program on torrent finished
                    $("autorun_checkbox").checked = pref.autorun_enabled;
                    $("autorunProg_txt").value = pref.autorun_program;
                    updateAutoRun();

                    // Connection tab
                    // Listening Port
                    $("port_value").value = pref.listen_port.toInt();
                    $("upnp_checkbox").checked = pref.upnp;

                    // Connections Limits
                    const max_connec = pref.max_connec.toInt();
                    if (max_connec <= 0) {
                        $("max_connec_checkbox").checked = false;
                        $("max_connec_value").value = 500;
                    }
                    else {
                        $("max_connec_checkbox").checked = true;
                        $("max_connec_value").value = max_connec;
                    }
                    updateMaxConnecEnabled();
                    const max_connec_per_torrent = pref.max_connec_per_torrent.toInt();
                    if (max_connec_per_torrent <= 0) {
                        $("max_connec_per_torrent_checkbox").checked = false;
                        $("max_connec_per_torrent_value").value = 100;
                    }
                    else {
                        $("max_connec_per_torrent_checkbox").checked = true;
                        $("max_connec_per_torrent_value").value = max_connec_per_torrent;
                    }
                    updateMaxConnecPerTorrentEnabled();
                    const max_uploads = pref.max_uploads.toInt();
                    if (max_uploads <= 0) {
                        $("max_uploads_checkbox").checked = false;
                        $("max_uploads_value").value = 8;
                    }
                    else {
                        $("max_uploads_checkbox").checked = true;
                        $("max_uploads_value").value = max_uploads;
                    }
                    updateMaxUploadsEnabled();
                    const max_uploads_per_torrent = pref.max_uploads_per_torrent.toInt();
                    if (max_uploads_per_torrent <= 0) {
                        $("max_uploads_per_torrent_checkbox").checked = false;
                        $("max_uploads_per_torrent_value").value = 4;
                    }
                    else {
                        $("max_uploads_per_torrent_checkbox").checked = true;
                        $("max_uploads_per_torrent_value").value = max_uploads_per_torrent;
                    }
                    updateMaxUploadsPerTorrentEnabled();

                    // I2P
                    $("i2pEnabledCheckbox").checked = pref.i2p_enabled;
                    $("i2pAddress").value = pref.i2p_address;
                    $("i2pPort").value = pref.i2p_port;
                    $("i2pMixedMode").checked = pref.i2p_mixed_mode;
                    updateI2PSettingsEnabled();

                    // Proxy Server
                    $("peer_proxy_type_select").value = pref.proxy_type;
                    $("peer_proxy_host_text").value = pref.proxy_ip;
                    $("peer_proxy_port_value").value = pref.proxy_port;
                    $("peer_proxy_auth_checkbox").checked = pref.proxy_auth_enabled;
                    $("peer_proxy_username_text").value = pref.proxy_username;
                    $("peer_proxy_password_text").value = pref.proxy_password;
                    $("proxyHostnameLookupCheckbox").checked = pref.proxy_hostname_lookup;
                    $("proxy_bittorrent_checkbox").checked = pref.proxy_bittorrent;
                    $("use_peer_proxy_checkbox").checked = pref.proxy_peer_connections;
                    $("proxy_rss_checkbox").checked = pref.proxy_rss;
                    $("proxy_misc_checkbox").checked = pref.proxy_misc;
                    updatePeerProxySettings();

                    // IP Filtering
                    $("ipfilter_text_checkbox").checked = pref.ip_filter_enabled;
                    $("ipfilter_text").value = pref.ip_filter_path;
                    $("ipfilter_trackers_checkbox").checked = pref.ip_filter_trackers;
                    $("banned_IPs_textarea").value = pref.banned_IPs;
                    updateFilterSettings();

                    // Speed tab
                    // Global Rate Limits
                    $("up_limit_value").value = (pref.up_limit.toInt() / 1024);
                    $("dl_limit_value").value = (pref.dl_limit.toInt() / 1024);
                    // Alternative Global Rate Limits
                    $("alt_up_limit_value").value = (pref.alt_up_limit.toInt() / 1024);
                    $("alt_dl_limit_value").value = (pref.alt_dl_limit.toInt() / 1024);

                    $("enable_protocol_combobox").value = pref.bittorrent_protocol;
                    $("limit_utp_rate_checkbox").checked = pref.limit_utp_rate;
                    $("limit_tcp_overhead_checkbox").checked = pref.limit_tcp_overhead;
                    $("limit_lan_peers_checkbox").checked = pref.limit_lan_peers;

                    // Scheduling
                    $("limitSchedulingCheckbox").checked = pref.scheduler_enabled;
                    $("schedule_from_hour").value = time_padding(pref.schedule_from_hour);
                    $("schedule_from_min").value = time_padding(pref.schedule_from_min);
                    $("schedule_to_hour").value = time_padding(pref.schedule_to_hour);
                    $("schedule_to_min").value = time_padding(pref.schedule_to_min);
                    $("schedule_freq_select").value = pref.scheduler_days;
                    updateSchedulingEnabled();

                    // Bittorrent tab
                    // Privacy
                    $("dht_checkbox").checked = pref.dht;
                    $("pex_checkbox").checked = pref.pex;
                    $("lsd_checkbox").checked = pref.lsd;
                    const encryption = pref.encryption.toInt();
                    $("encryption_select").getChildren("option")[encryption].selected = true;
                    $("anonymous_mode_checkbox").checked = pref.anonymous_mode;

                    $("maxActiveCheckingTorrents").value = pref.max_active_checking_torrents;

                    // Torrent Queueing
                    $("queueing_checkbox").checked = pref.queueing_enabled;
                    $("max_active_dl_value").value = pref.max_active_downloads.toInt();
                    $("max_active_up_value").value = pref.max_active_uploads.toInt();
                    $("max_active_to_value").value = pref.max_active_torrents.toInt();
                    $("dont_count_slow_torrents_checkbox").checked = pref.dont_count_slow_torrents;
                    $("dl_rate_threshold").value = pref.slow_torrent_dl_rate_threshold.toInt();
                    $("ul_rate_threshold").value = pref.slow_torrent_ul_rate_threshold.toInt();
                    $("torrent_inactive_timer").value = pref.slow_torrent_inactive_timer.toInt();
                    updateQueueingSystem();

                    // Share Limiting
                    $("max_ratio_checkbox").checked = pref.max_ratio_enabled;
                    $("max_ratio_value").value = (pref.max_ratio_enabled ? pref.max_ratio : 1);
                    $("max_seeding_time_checkbox").checked = pref.max_seeding_time_enabled;
                    $("max_seeding_time_value").value = (pref.max_seeding_time_enabled ? pref.max_seeding_time.toInt() : 1440);
                    $("max_inactive_seeding_time_checkbox").checked = pref.max_inactive_seeding_time_enabled;
                    $("max_inactive_seeding_time_value").value = (pref.max_inactive_seeding_time_enabled ? pref.max_inactive_seeding_time.toInt() : 1440);
                    let maxRatioAct = 0;
                    switch (pref.max_ratio_act.toInt()) {
                        case 0: // Stop
                        default:
                            maxRatioAct = 0;
                            break;
                        case 1: // Remove
                            maxRatioAct = 1;
                            break;
                        case 2: // Enable super seeding
                            maxRatioAct = 3;
                            break;
                        case 3: // Remove torrent and files
                            maxRatioAct = 2;
                            break;
                    }
                    $("max_ratio_act").getChildren("option")[maxRatioAct].selected = true;
                    updateMaxRatioTimeEnabled();

                    // Add trackers
                    $("add_trackers_checkbox").checked = pref.add_trackers_enabled;
                    $("add_trackers_textarea").value = pref.add_trackers;
                    updateAddTrackersEnabled();

                    // RSS Tab
                    $("enable_fetching_rss_feeds_checkbox").checked = pref.rss_processing_enabled;
                    $("feed_refresh_interval").value = pref.rss_refresh_interval;
                    $("feedFetchDelay").value = pref.rss_fetch_delay;
                    $("maximum_article_number").value = pref.rss_max_articles_per_feed;
                    $("enable_auto_downloading_rss_torrents_checkbox").checked = pref.rss_auto_downloading_enabled;
                    $("downlock_repack_proper_episodes").checked = pref.rss_download_repack_proper_episodes;
                    $("rss_filter_textarea").value = pref.rss_smart_episode_filters;

                    // WebUI tab
                    // Language
                    updateWebuiLocaleSelect(pref.locale);
                    $("performanceWarning").checked = pref.performance_warning;

                    // HTTP Server
                    $("webui_domain_textarea").value = pref.web_ui_domain_list;
                    $("webui_address_value").value = pref.web_ui_address;
                    $("webui_port_value").value = pref.web_ui_port;
                    $("webui_upnp_checkbox").checked = pref.web_ui_upnp;
                    $("use_https_checkbox").checked = pref.use_https;
                    $("ssl_cert_text").value = pref.web_ui_https_cert_path;
                    $("ssl_key_text").value = pref.web_ui_https_key_path;
                    updateHttpsSettings();

                    // Authentication
                    $("webui_username_text").value = pref.web_ui_username;
                    $("bypass_local_auth_checkbox").checked = pref.bypass_local_auth;
                    $("bypass_auth_subnet_whitelist_checkbox").checked = pref.bypass_auth_subnet_whitelist_enabled;
                    $("bypass_auth_subnet_whitelist_textarea").value = pref.bypass_auth_subnet_whitelist;
                    updateBypasssAuthSettings();
                    $("webUIMaxAuthFailCountInput").value = pref.web_ui_max_auth_fail_count.toInt();
                    $("webUIBanDurationInput").value = pref.web_ui_ban_duration.toInt();
                    $("webUISessionTimeoutInput").value = pref.web_ui_session_timeout.toInt();

                    // Use alternative WebUI
                    $("use_alt_webui_checkbox").checked = pref.alternative_webui_enabled;
                    $("webui_files_location_textarea").value = pref.alternative_webui_path;
                    updateAlternativeWebUISettings();

                    // Security
                    $("clickjacking_protection_checkbox").checked = pref.web_ui_clickjacking_protection_enabled;
                    $("csrf_protection_checkbox").checked = pref.web_ui_csrf_protection_enabled;
                    $("secureCookieCheckbox").checked = pref.web_ui_secure_cookie_enabled;
                    $("host_header_validation_checkbox").checked = pref.web_ui_host_header_validation_enabled;
                    updateHostHeaderValidationSettings();

                    // Custom HTTP headers
                    $("webUIUseCustomHTTPHeadersCheckbox").checked = pref.web_ui_use_custom_http_headers_enabled;
                    $("webUICustomHTTPHeadersTextarea").value = pref.web_ui_custom_http_headers;
                    updateWebUICustomHTTPHeadersSettings();

                    // Reverse Proxy
                    $("webUIReverseProxySupportCheckbox").checked = pref.web_ui_reverse_proxy_enabled;
                    $("webUIReverseProxiesListTextarea").value = pref.web_ui_reverse_proxies_list;
                    updateWebUIReverseProxySettings();

                    // Update my dynamic domain name
                    $("use_dyndns_checkbox").checked = pref.dyndns_enabled;
                    $("dyndns_select").value = pref.dyndns_service;
                    $("dyndns_domain_text").value = pref.dyndns_domain;
                    $("dyndns_username_text").value = pref.dyndns_username;
                    $("dyndns_password_text").value = pref.dyndns_password;
                    updateDynDnsSettings();

                    // Advanced settings
                    // qBittorrent section
                    $("resumeDataStorageType").value = pref.resume_data_storage_type;
                    $("torrentContentRemoveOption").value = pref.torrent_content_remove_option;
                    $("memoryWorkingSetLimit").value = pref.memory_working_set_limit;
                    updateNetworkInterfaces(pref.current_network_interface, pref.current_interface_name);
                    updateInterfaceAddresses(pref.current_network_interface, pref.current_interface_address);
                    $("saveResumeDataInterval").value = pref.save_resume_data_interval;
                    $("saveStatisticsInterval").value = pref.save_statistics_interval;
                    $("torrentFileSizeLimit").value = (pref.torrent_file_size_limit / 1024 / 1024);
                    document.getElementById("confirmTorrentRecheck").checked = pref.confirm_torrent_recheck;
                    $("recheckTorrentsOnCompletion").checked = pref.recheck_completed_torrents;
                    $("appInstanceName").value = pref.app_instance_name;
                    $("refreshInterval").value = pref.refresh_interval;
                    $("resolvePeerCountries").checked = pref.resolve_peer_countries;
                    $("reannounceWhenAddressChanged").checked = pref.reannounce_when_address_changed;
                    $("enableEmbeddedTracker").checked = pref.enable_embedded_tracker;
                    $("embeddedTrackerPort").value = pref.embedded_tracker_port;
                    $("embeddedTrackerPortForwarding").checked = pref.embedded_tracker_port_forwarding;
                    $("markOfTheWeb").checked = pref.mark_of_the_web;
                    $("ignoreSSLErrors").checked = pref.ignore_ssl_errors;
                    $("pythonExecutablePath").value = pref.python_executable_path;
                    // libtorrent section
                    $("bdecodeDepthLimit").value = pref.bdecode_depth_limit;
                    $("bdecodeTokenLimit").value = pref.bdecode_token_limit;
                    $("asyncIOThreads").value = pref.async_io_threads;
                    $("hashingThreads").value = pref.hashing_threads;
                    $("filePoolSize").value = pref.file_pool_size;
                    $("outstandMemoryWhenCheckingTorrents").value = pref.checking_memory_use;
                    $("diskCache").value = pref.disk_cache;
                    $("diskCacheExpiryInterval").value = pref.disk_cache_ttl;
                    $("diskQueueSize").value = (pref.disk_queue_size / 1024);
                    $("diskIOType").value = pref.disk_io_type;
                    $("diskIOReadMode").value = pref.disk_io_read_mode;
                    $("diskIOWriteMode").value = pref.disk_io_write_mode;
                    $("coalesceReadsAndWrites").checked = pref.enable_coalesce_read_write;
                    $("pieceExtentAffinity").checked = pref.enable_piece_extent_affinity;
                    $("sendUploadPieceSuggestions").checked = pref.enable_upload_suggestions;
                    $("sendBufferWatermark").value = pref.send_buffer_watermark;
                    $("sendBufferLowWatermark").value = pref.send_buffer_low_watermark;
                    $("sendBufferWatermarkFactor").value = pref.send_buffer_watermark_factor;
                    $("connectionSpeed").value = pref.connection_speed;
                    $("socketSendBufferSize").value = (pref.socket_send_buffer_size / 1024);
                    $("socketReceiveBufferSize").value = (pref.socket_receive_buffer_size / 1024);
                    $("socketBacklogSize").value = pref.socket_backlog_size;
                    $("outgoingPortsMin").value = pref.outgoing_ports_min;
                    $("outgoingPortsMax").value = pref.outgoing_ports_max;
                    $("UPnPLeaseDuration").value = pref.upnp_lease_duration;
                    $("peerToS").value = pref.peer_tos;
                    $("utpTCPMixedModeAlgorithm").value = pref.utp_tcp_mixed_mode;
                    $("IDNSupportCheckbox").checked = pref.idn_support_enabled;
                    $("allowMultipleConnectionsFromTheSameIPAddress").checked = pref.enable_multi_connections_from_same_ip;
                    $("validateHTTPSTrackerCertificate").checked = pref.validate_https_tracker_certificate;
                    $("mitigateSSRF").checked = pref.ssrf_mitigation;
                    $("blockPeersOnPrivilegedPorts").checked = pref.block_peers_on_privileged_ports;
                    $("uploadSlotsBehavior").value = pref.upload_slots_behavior;
                    $("uploadChokingAlgorithm").value = pref.upload_choking_algorithm;
                    $("announceAllTrackers").checked = pref.announce_to_all_trackers;
                    $("announceAllTiers").checked = pref.announce_to_all_tiers;
                    $("announceIP").value = pref.announce_ip;
                    $("maxConcurrentHTTPAnnounces").value = pref.max_concurrent_http_announces;
                    $("stopTrackerTimeout").value = pref.stop_tracker_timeout;
                    $("peerTurnover").value = pref.peer_turnover;
                    $("peerTurnoverCutoff").value = pref.peer_turnover_cutoff;
                    $("peerTurnoverInterval").value = pref.peer_turnover_interval;
                    $("requestQueueSize").value = pref.request_queue_size;
                    $("dhtBootstrapNodes").value = pref.dht_bootstrap_nodes;
                    $("i2pInboundQuantity").value = pref.i2p_inbound_quantity;
                    $("i2pOutboundQuantity").value = pref.i2p_outbound_quantity;
                    $("i2pInboundLength").value = pref.i2p_inbound_length;
                    $("i2pOutboundLength").value = pref.i2p_outbound_length;
                }
            });
        };

        const applyPreferences = () => {
            const settings = {};
            // Validate form data

            // Behavior tab
            LocalPreferences.set("full_url_tracker_column", document.getElementById("displayFullURLTrackerColumn").checked.toString());
            LocalPreferences.set("hide_zero_status_filters", document.getElementById("hideZeroFiltersCheckbox").checked.toString());
            LocalPreferences.set("dblclick_download", $("dblclickDownloadSelect").value);
            LocalPreferences.set("dblclick_complete", $("dblclickCompleteSelect").value);
            settings["confirm_torrent_deletion"] = document.getElementById("confirmTorrentDeletion").checked;
            LocalPreferences.set("use_alt_row_colors", document.getElementById("useAltRowColorsInput").checked.toString());
            settings["file_log_enabled"] = $("filelog_checkbox").checked;
            settings["file_log_path"] = $("filelog_save_path_input").value;
            settings["file_log_backup_enabled"] = $("filelog_backup_checkbox").checked;
            settings["file_log_max_size"] = Number($("filelog_max_size_input").value);
            settings["file_log_delete_old"] = $("filelog_delete_old_checkbox").checked;
            settings["file_log_age"] = Number($("filelog_age_input").value);
            settings["file_log_age_type"] = Number($("filelog_age_type_select").value);

            // Downloads tab
            // When adding a torrent
            settings["torrent_content_layout"] = $("contentlayout_select").getSelected()[0].value;
            settings["add_to_top_of_queue"] = $("addToTopOfQueueCheckbox").checked;
            settings["add_stopped_enabled"] = $("dontstartdownloads_checkbox").checked;
            settings["torrent_stop_condition"] = $("stopConditionSelect").getSelected()[0].value;
            settings["merge_trackers"] = document.getElementById("mergeTrackersInput").checked;
            settings["auto_delete_mode"] = Number($("deletetorrentfileafter_checkbox").checked);

            settings["preallocate_all"] = $("preallocateall_checkbox").checked;
            settings["incomplete_files_ext"] = $("appendext_checkbox").checked;
            settings["use_unwanted_folder"] = $("unwantedfolder_checkbox").checked;

            // Saving Management
            settings["auto_tmm_enabled"] = ($("default_tmm_combobox").value === "true");
            settings["torrent_changed_tmm_enabled"] = ($("torrent_changed_tmm_combobox").value === "true");
            settings["save_path_changed_tmm_enabled"] = ($("save_path_changed_tmm_combobox").value === "true");
            settings["category_changed_tmm_enabled"] = ($("category_changed_tmm_combobox").value === "true");
            settings["use_subcategories"] = $("use_subcategories_checkbox").checked;
            settings["use_category_paths_in_manual_mode"] = document.getElementById("categoryPathsManualModeCheckbox").checked;
            settings["save_path"] = $("savepath_text").value;
            settings["temp_path_enabled"] = $("temppath_checkbox").checked;
            settings["temp_path"] = $("temppath_text").value;
            if ($("exportdir_checkbox").checked)
                settings["export_dir"] = $("exportdir_text").value;
            else
                settings["export_dir"] = "";
            if ($("exportdirfin_checkbox").checked)
                settings["export_dir_fin"] = $("exportdirfin_text").value;
            else
                settings["export_dir_fin"] = "";

            // Automatically add torrents from
            settings["scan_dirs"] = getWatchedFolders();

            // Excluded file names
            settings["excluded_file_names_enabled"] = $("excludedFileNamesCheckbox").checked;
            settings["excluded_file_names"] = $("excludedFileNamesTextarea").value;

            // Email notification upon download completion
            settings["mail_notification_enabled"] = $("mail_notification_checkbox").checked;
            settings["mail_notification_sender"] = $("src_email_txt").value;
            settings["mail_notification_email"] = $("dest_email_txt").value;
            settings["mail_notification_smtp"] = $("smtp_server_txt").value;
            settings["mail_notification_ssl_enabled"] = $("mail_ssl_checkbox").checked;
            settings["mail_notification_auth_enabled"] = $("mail_auth_checkbox").checked;
            settings["mail_notification_username"] = $("mail_username_text").value;
            settings["mail_notification_password"] = $("mail_password_text").value;

            // Run an external program on torrent added
            settings["autorun_on_torrent_added_enabled"] = $("autorunOnTorrentAddedCheckbox").checked;
            settings["autorun_on_torrent_added_program"] = $("autorunOnTorrentAddedProgram").value;
            // Run an external program on torrent finished
            settings["autorun_enabled"] = $("autorun_checkbox").checked;
            settings["autorun_program"] = $("autorunProg_txt").value;

            // Connection tab
            // Listening Port
            const listen_port = $("port_value").value.toInt();
            if (isNaN(listen_port) || (listen_port < 0) || (listen_port > 65535)) {
                alert("QBT_TR(The port used for incoming connections must be between 0 and 65535.)QBT_TR[CONTEXT=HttpServer]");
                return;
            }
            settings["listen_port"] = listen_port;
            settings["upnp"] = $("upnp_checkbox").checked;

            // Connections Limits
            let max_connec = -1;
            if ($("max_connec_checkbox").checked) {
                max_connec = $("max_connec_value").value.toInt();
                if (isNaN(max_connec) || (max_connec <= 0)) {
                    alert("QBT_TR(Maximum number of connections limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
                    return;
                }
            }
            settings["max_connec"] = max_connec;
            let max_connec_per_torrent = -1;
            if ($("max_connec_per_torrent_checkbox").checked) {
                max_connec_per_torrent = $("max_connec_per_torrent_value").value.toInt();
                if (isNaN(max_connec_per_torrent) || (max_connec_per_torrent <= 0)) {
                    alert("QBT_TR(Maximum number of connections per torrent limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
                    return;
                }
            }
            settings["max_connec_per_torrent"] = max_connec_per_torrent;
            let max_uploads = -1;
            if ($("max_uploads_checkbox").checked) {
                max_uploads = $("max_uploads_value").value.toInt();
                if (isNaN(max_uploads) || (max_uploads <= 0)) {
                    alert("QBT_TR(Global number of upload slots limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
                    return;
                }
            }
            settings["max_uploads"] = max_uploads;
            let max_uploads_per_torrent = -1;
            if ($("max_uploads_per_torrent_checkbox").checked) {
                max_uploads_per_torrent = $("max_uploads_per_torrent_value").value.toInt();
                if (isNaN(max_uploads_per_torrent) || (max_uploads_per_torrent <= 0)) {
                    alert("QBT_TR(Maximum number of upload slots per torrent limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
                    return;
                }
            }
            settings["max_uploads_per_torrent"] = max_uploads_per_torrent;

            // I2P
            settings["i2p_enabled"] = $("i2pEnabledCheckbox").checked;
            settings["i2p_address"] = $("i2pAddress").value;
            settings["i2p_port"] = $("i2pPort").value.toInt();
            settings["i2p_mixed_mode"] = $("i2pMixedMode").checked;

            // Proxy Server
            settings["proxy_type"] = $("peer_proxy_type_select").value;
            settings["proxy_ip"] = $("peer_proxy_host_text").value;
            settings["proxy_port"] = $("peer_proxy_port_value").value.toInt();
            settings["proxy_auth_enabled"] = $("peer_proxy_auth_checkbox").checked;
            settings["proxy_username"] = $("peer_proxy_username_text").value;
            settings["proxy_password"] = $("peer_proxy_password_text").value;
            settings["proxy_hostname_lookup"] = $("proxyHostnameLookupCheckbox").checked;
            settings["proxy_bittorrent"] = $("proxy_bittorrent_checkbox").checked;
            settings["proxy_peer_connections"] = $("use_peer_proxy_checkbox").checked;
            settings["proxy_rss"] = $("proxy_rss_checkbox").checked;
            settings["proxy_misc"] = $("proxy_misc_checkbox").checked;

            // IP Filtering
            settings["ip_filter_enabled"] = $("ipfilter_text_checkbox").checked;
            settings["ip_filter_path"] = $("ipfilter_text").value;
            settings["ip_filter_trackers"] = $("ipfilter_trackers_checkbox").checked;
            settings["banned_IPs"] = $("banned_IPs_textarea").value;

            // Speed tab
            // Global Rate Limits
            const up_limit = $("up_limit_value").value.toInt() * 1024;
            if (isNaN(up_limit) || (up_limit < 0)) {
                alert("QBT_TR(Global upload rate limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
                return;
            }
            settings["up_limit"] = up_limit;

            const dl_limit = $("dl_limit_value").value.toInt() * 1024;
            if (isNaN(dl_limit) || (dl_limit < 0)) {
                alert("QBT_TR(Global download rate limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
                return;
            }
            settings["dl_limit"] = dl_limit;

            // Alternative Global Rate Limits
            const alt_up_limit = $("alt_up_limit_value").value.toInt() * 1024;
            if (isNaN(alt_up_limit) || (alt_up_limit < 0)) {
                alert("QBT_TR(Alternative upload rate limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
                return;
            }
            settings["alt_up_limit"] = alt_up_limit;

            const alt_dl_limit = $("alt_dl_limit_value").value.toInt() * 1024;
            if (isNaN(alt_dl_limit) || (alt_dl_limit < 0)) {
                alert("QBT_TR(Alternative download rate limit must be greater than 0 or disabled.)QBT_TR[CONTEXT=HttpServer]");
                return;
            }
            settings["alt_dl_limit"] = alt_dl_limit;

            settings["bittorrent_protocol"] = Number($("enable_protocol_combobox").value);
            settings["limit_utp_rate"] = $("limit_utp_rate_checkbox").checked;
            settings["limit_tcp_overhead"] = $("limit_tcp_overhead_checkbox").checked;
            settings["limit_lan_peers"] = $("limit_lan_peers_checkbox").checked;

            // Scheduler
            const scheduling_enabled = $("limitSchedulingCheckbox").checked;
            settings["scheduler_enabled"] = scheduling_enabled;
            if (scheduling_enabled) {
                settings["schedule_from_hour"] = $("schedule_from_hour").value.toInt();
                settings["schedule_from_min"] = $("schedule_from_min").value.toInt();
                settings["schedule_to_hour"] = $("schedule_to_hour").value.toInt();
                settings["schedule_to_min"] = $("schedule_to_min").value.toInt();
                settings["scheduler_days"] = $("schedule_freq_select").value.toInt();
            }

            // Bittorrent tab
            // Privacy
            settings["dht"] = $("dht_checkbox").checked;
            settings["pex"] = $("pex_checkbox").checked;
            settings["lsd"] = $("lsd_checkbox").checked;
            settings["encryption"] = Number($("encryption_select").getSelected()[0].value);
            settings["anonymous_mode"] = $("anonymous_mode_checkbox").checked;

            settings["max_active_checking_torrents"] = Number($("maxActiveCheckingTorrents").value);

            // Torrent Queueing
            settings["queueing_enabled"] = $("queueing_checkbox").checked;
            if ($("queueing_checkbox").checked) {
                const max_active_downloads = $("max_active_dl_value").value.toInt();
                if (isNaN(max_active_downloads) || (max_active_downloads < -1)) {
                    alert("QBT_TR(Maximum active downloads must be greater than -1.)QBT_TR[CONTEXT=HttpServer]");
                    return;
                }
                settings["max_active_downloads"] = max_active_downloads;
                const max_active_uploads = $("max_active_up_value").value.toInt();
                if (isNaN(max_active_uploads) || (max_active_uploads < -1)) {
                    alert("QBT_TR(Maximum active uploads must be greater than -1.)QBT_TR[CONTEXT=HttpServer]");
                    return;
                }
                settings["max_active_uploads"] = max_active_uploads;
                const max_active_torrents = $("max_active_to_value").value.toInt();
                if (isNaN(max_active_torrents) || (max_active_torrents < -1)) {
                    alert("QBT_TR(Maximum active torrents must be greater than -1.)QBT_TR[CONTEXT=HttpServer]");
                    return;
                }
                settings["max_active_torrents"] = max_active_torrents;
                settings["dont_count_slow_torrents"] = $("dont_count_slow_torrents_checkbox").checked;
                const dl_rate_threshold = $("dl_rate_threshold").value.toInt();
                if (isNaN(dl_rate_threshold) || (dl_rate_threshold < 1)) {
                    alert("QBT_TR(Download rate threshold must be greater than 0.)QBT_TR[CONTEXT=HttpServer]");
                    return;
                }
                settings["slow_torrent_dl_rate_threshold"] = dl_rate_threshold;
                const ul_rate_threshold = $("ul_rate_threshold").value.toInt();
                if (isNaN(ul_rate_threshold) || (ul_rate_threshold < 1)) {
                    alert("QBT_TR(Upload rate threshold must be greater than 0.)QBT_TR[CONTEXT=HttpServer]");
                    return;
                }
                settings["slow_torrent_ul_rate_threshold"] = ul_rate_threshold;
                const torrent_inactive_timer = $("torrent_inactive_timer").value.toInt();
                if (isNaN(torrent_inactive_timer) || (torrent_inactive_timer < 1)) {
                    alert("QBT_TR(Torrent inactivity timer must be greater than 0.)QBT_TR[CONTEXT=HttpServer]");
                    return;
                }
                settings["slow_torrent_inactive_timer"] = torrent_inactive_timer;
            }

            // Share Ratio Limiting
            let max_ratio = -1;
            if ($("max_ratio_checkbox").checked) {
                max_ratio = $("max_ratio_value").value.toFloat();
                if (isNaN(max_ratio) || (max_ratio < 0) || (max_ratio > 9998)) {
                    alert("QBT_TR(Share ratio limit must be between 0 and 9998.)QBT_TR[CONTEXT=HttpServer]");
                    return;
                }
            }
            settings["max_ratio_enabled"] = $("max_ratio_checkbox").checked;
            settings["max_ratio"] = max_ratio;

            let max_seeding_time = -1;
            if ($("max_seeding_time_checkbox").checked) {
                max_seeding_time = $("max_seeding_time_value").value.toInt();
                if (isNaN(max_seeding_time) || (max_seeding_time < 0) || (max_seeding_time > 525600)) {
                    alert("QBT_TR(Seeding time limit must be between 0 and 525600 minutes.)QBT_TR[CONTEXT=HttpServer]");
                    return;
                }
            }
            settings["max_seeding_time_enabled"] = $("max_seeding_time_checkbox").checked;
            settings["max_seeding_time"] = max_seeding_time;
            settings["max_ratio_act"] = $("max_ratio_act").value.toInt();

            let max_inactive_seeding_time = -1;
            if ($("max_inactive_seeding_time_checkbox").checked) {
                max_inactive_seeding_time = $("max_inactive_seeding_time_value").value.toInt();
                if (isNaN(max_inactive_seeding_time) || (max_inactive_seeding_time < 0) || (max_inactive_seeding_time > 525600)) {
                    alert("QBT_TR(Seeding time limit must be between 0 and 525600 minutes.)QBT_TR[CONTEXT=HttpServer]");
                    return;
                }
            }
            settings["max_inactive_seeding_time_enabled"] = $("max_inactive_seeding_time_checkbox").checked;
            settings["max_inactive_seeding_time"] = max_inactive_seeding_time;
            settings["max_ratio_act"] = $("max_ratio_act").value.toInt();

            // Add trackers
            settings["add_trackers_enabled"] = $("add_trackers_checkbox").checked;
            settings["add_trackers"] = $("add_trackers_textarea").value;

            // RSS Tab
            settings["rss_processing_enabled"] = $("enable_fetching_rss_feeds_checkbox").checked;
            settings["rss_refresh_interval"] = Number($("feed_refresh_interval").value);
            settings["rss_fetch_delay"] = Number($("feedFetchDelay").value);
            settings["rss_max_articles_per_feed"] = Number($("maximum_article_number").value);
            settings["rss_auto_downloading_enabled"] = $("enable_auto_downloading_rss_torrents_checkbox").checked;
            settings["rss_download_repack_proper_episodes"] = $("downlock_repack_proper_episodes").checked;
            settings["rss_smart_episode_filters"] = $("rss_filter_textarea").value;

            // WebUI tab
            // Language
            settings["locale"] = $("locale_select").value;
            settings["performance_warning"] = $("performanceWarning").checked;

            // HTTP Server
            settings["web_ui_domain_list"] = $("webui_domain_textarea").value;
            const web_ui_address = $("webui_address_value").value.toString();
            const web_ui_port = $("webui_port_value").value.toInt();
            if (isNaN(web_ui_port) || (web_ui_port < 1) || (web_ui_port > 65535)) {
                alert("QBT_TR(The port used for the WebUI must be between 1 and 65535.)QBT_TR[CONTEXT=HttpServer]");
                return;
            }
            settings["web_ui_address"] = web_ui_address;
            settings["web_ui_port"] = web_ui_port;
            settings["web_ui_upnp"] = $("webui_upnp_checkbox").checked;

            const useHTTPS = $("use_https_checkbox").checked;
            settings["use_https"] = useHTTPS;

            const httpsCertificate = $("ssl_cert_text").value;
            settings["web_ui_https_cert_path"] = httpsCertificate;
            if (useHTTPS && (httpsCertificate.length === 0)) {
                alert("QBT_TR(HTTPS certificate should not be empty)QBT_TR[CONTEXT=OptionsDialog]");
                return;
            }

            const httpsKey = $("ssl_key_text").value;
            settings["web_ui_https_key_path"] = httpsKey;
            if (useHTTPS && (httpsKey.length === 0)) {
                alert("QBT_TR(HTTPS key should not be empty)QBT_TR[CONTEXT=OptionsDialog]");
                return;
            }

            // Authentication
            const web_ui_username = $("webui_username_text").value;
            if (web_ui_username.length < 3) {
                alert("QBT_TR(The WebUI username must be at least 3 characters long.)QBT_TR[CONTEXT=OptionsDialog]");
                return;
            }
            const web_ui_password = $("webui_password_text").value;
            if ((0 < web_ui_password.length) && (web_ui_password.length < 6)) {
                alert("QBT_TR(The WebUI password must be at least 6 characters long.)QBT_TR[CONTEXT=OptionsDialog]");
                return;
            }

            settings["web_ui_username"] = web_ui_username;
            if (web_ui_password.length > 0)
                settings["web_ui_password"] = web_ui_password;
            settings["bypass_local_auth"] = $("bypass_local_auth_checkbox").checked;
            settings["bypass_auth_subnet_whitelist_enabled"] = $("bypass_auth_subnet_whitelist_checkbox").checked;
            settings["bypass_auth_subnet_whitelist"] = $("bypass_auth_subnet_whitelist_textarea").value;
            settings["web_ui_max_auth_fail_count"] = Number($("webUIMaxAuthFailCountInput").value);
            settings["web_ui_ban_duration"] = Number($("webUIBanDurationInput").value);
            settings["web_ui_session_timeout"] = Number($("webUISessionTimeoutInput").value);

            // Use alternative WebUI
            const alternative_webui_enabled = $("use_alt_webui_checkbox").checked;
            const webui_files_location_textarea = $("webui_files_location_textarea").value;
            if (alternative_webui_enabled && (webui_files_location_textarea.trim() === "")) {
                alert("QBT_TR(The alternative WebUI files location cannot be blank.)QBT_TR[CONTEXT=OptionsDialog]");
                return;
            }
            settings["alternative_webui_enabled"] = alternative_webui_enabled;
            settings["alternative_webui_path"] = webui_files_location_textarea;

            // Security
            settings["web_ui_clickjacking_protection_enabled"] = $("clickjacking_protection_checkbox").checked;
            settings["web_ui_csrf_protection_enabled"] = $("csrf_protection_checkbox").checked;
            settings["web_ui_secure_cookie_enabled"] = $("secureCookieCheckbox").checked;
            settings["web_ui_host_header_validation_enabled"] = $("host_header_validation_checkbox").checked;

            // Custom HTTP headers
            settings["web_ui_use_custom_http_headers_enabled"] = $("webUIUseCustomHTTPHeadersCheckbox").checked;
            settings["web_ui_custom_http_headers"] = $("webUICustomHTTPHeadersTextarea").value;

            // Reverse Proxy
            settings["web_ui_reverse_proxy_enabled"] = $("webUIReverseProxySupportCheckbox").checked;
            settings["web_ui_reverse_proxies_list"] = $("webUIReverseProxiesListTextarea").value;

            // Update my dynamic domain name
            settings["dyndns_enabled"] = $("use_dyndns_checkbox").checked;
            settings["dyndns_service"] = Number($("dyndns_select").value);
            settings["dyndns_domain"] = $("dyndns_domain_text").value;
            settings["dyndns_username"] = $("dyndns_username_text").value;
            settings["dyndns_password"] = $("dyndns_password_text").value;

            // Update advanced settings
            // qBittorrent section
            settings["resume_data_storage_type"] = $("resumeDataStorageType").value;
            settings["torrent_content_remove_option"] = $("torrentContentRemoveOption").value;
            settings["memory_working_set_limit"] = Number($("memoryWorkingSetLimit").value);
            settings["current_network_interface"] = $("networkInterface").value;
            settings["current_interface_address"] = $("optionalIPAddressToBind").value;
            settings["save_resume_data_interval"] = Number($("saveResumeDataInterval").value);
            settings["save_statistics_interval"] = Number($("saveStatisticsInterval").value);
            settings["torrent_file_size_limit"] = ($("torrentFileSizeLimit").value * 1024 * 1024);
            settings["confirm_torrent_recheck"] = document.getElementById("confirmTorrentRecheck").checked;
            settings["recheck_completed_torrents"] = $("recheckTorrentsOnCompletion").checked;
            settings["app_instance_name"] = $("appInstanceName").value;
            settings["refresh_interval"] = Number($("refreshInterval").value);
            settings["resolve_peer_countries"] = $("resolvePeerCountries").checked;
            settings["reannounce_when_address_changed"] = $("reannounceWhenAddressChanged").checked;
            settings["enable_embedded_tracker"] = $("enableEmbeddedTracker").checked;
            settings["embedded_tracker_port"] = Number($("embeddedTrackerPort").value);
            settings["embedded_tracker_port_forwarding"] = $("embeddedTrackerPortForwarding").checked;
            settings["mark_of_the_web"] = $("markOfTheWeb").checked;
            settings["ignore_ssl_errors"] = $("ignoreSSLErrors").checked;
            settings["python_executable_path"] = $("pythonExecutablePath").value;

            // libtorrent section
            settings["bdecode_depth_limit"] = Number($("bdecodeDepthLimit").value);
            settings["bdecode_token_limit"] = Number($("bdecodeTokenLimit").value);
            settings["async_io_threads"] = Number($("asyncIOThreads").value);
            settings["hashing_threads"] = Number($("hashingThreads").value);
            settings["file_pool_size"] = Number($("filePoolSize").value);
            settings["checking_memory_use"] = Number($("outstandMemoryWhenCheckingTorrents").value);
            settings["disk_cache"] = Number($("diskCache").value);
            settings["disk_cache_ttl"] = Number($("diskCacheExpiryInterval").value);
            settings["disk_queue_size"] = (Number($("diskQueueSize").value) * 1024);
            settings["disk_io_type"] = Number($("diskIOType").value);
            settings["disk_io_read_mode"] = Number($("diskIOReadMode").value);
            settings["disk_io_write_mode"] = Number($("diskIOWriteMode").value);
            settings["enable_coalesce_read_write"] = $("coalesceReadsAndWrites").checked;
            settings["enable_piece_extent_affinity"] = $("pieceExtentAffinity").checked;
            settings["enable_upload_suggestions"] = $("sendUploadPieceSuggestions").checked;
            settings["send_buffer_watermark"] = Number($("sendBufferWatermark").value);
            settings["send_buffer_low_watermark"] = Number($("sendBufferLowWatermark").value);
            settings["send_buffer_watermark_factor"] = Number($("sendBufferWatermarkFactor").value);
            settings["connection_speed"] = Number($("connectionSpeed").value);
            settings["socket_send_buffer_size"] = ($("socketSendBufferSize").value * 1024);
            settings["socket_receive_buffer_size"] = ($("socketReceiveBufferSize").value * 1024);
            settings["socket_backlog_size"] = Number($("socketBacklogSize").value);
            settings["outgoing_ports_min"] = Number($("outgoingPortsMin").value);
            settings["outgoing_ports_max"] = Number($("outgoingPortsMax").value);
            settings["upnp_lease_duration"] = Number($("UPnPLeaseDuration").value);
            settings["peer_tos"] = Number($("peerToS").value);
            settings["utp_tcp_mixed_mode"] = Number($("utpTCPMixedModeAlgorithm").value);
            settings["idn_support_enabled"] = $("IDNSupportCheckbox").checked;
            settings["enable_multi_connections_from_same_ip"] = $("allowMultipleConnectionsFromTheSameIPAddress").checked;
            settings["validate_https_tracker_certificate"] = $("validateHTTPSTrackerCertificate").checked;
            settings["ssrf_mitigation"] = $("mitigateSSRF").checked;
            settings["block_peers_on_privileged_ports"] = $("blockPeersOnPrivilegedPorts").checked;
            settings["upload_slots_behavior"] = Number($("uploadSlotsBehavior").value);
            settings["upload_choking_algorithm"] = Number($("uploadChokingAlgorithm").value);
            settings["announce_to_all_trackers"] = $("announceAllTrackers").checked;
            settings["announce_to_all_tiers"] = $("announceAllTiers").checked;
            settings["announce_ip"] = $("announceIP").value;
            settings["max_concurrent_http_announces"] = Number($("maxConcurrentHTTPAnnounces").value);
            settings["stop_tracker_timeout"] = Number($("stopTrackerTimeout").value);
            settings["peer_turnover"] = Number($("peerTurnover").value);
            settings["peer_turnover_cutoff"] = Number($("peerTurnoverCutoff").value);
            settings["peer_turnover_interval"] = Number($("peerTurnoverInterval").value);
            settings["request_queue_size"] = Number($("requestQueueSize").value);
            settings["dht_bootstrap_nodes"] = $("dhtBootstrapNodes").value;
            settings["i2p_inbound_quantity"] = Number($("i2pInboundQuantity").value);
            settings["i2p_outbound_quantity"] = Number($("i2pOutboundQuantity").value);
            settings["i2p_inbound_length"] = Number($("i2pInboundLength").value);
            settings["i2p_outbound_length"] = Number($("i2pOutboundLength").value);

            // Send it to qBT
            window.parent.qBittorrent.Cache.preferences.set({
                data: settings,
                onFailure: () => {
                    alert("QBT_TR(Unable to save program preferences, qBittorrent is probably unreachable.)QBT_TR[CONTEXT=HttpServer]");
                    window.parent.qBittorrent.Client.closeWindows();
                },
                onSuccess: () => {
                    // Close window
                    window.parent.location.reload();
                    window.parent.qBittorrent.Client.closeWindows();
                }
            });
        };

        const setup = () => {
            watchedFoldersTable = new HtmlTable($("watched_folders_tab"));

            const buildInfo = window.qBittorrent.Cache.buildInfo.get();

            // hide entries
            const libtorrentVersion = window.qBittorrent.Misc.parseVersion(buildInfo.libtorrent);
            if (libtorrentVersion.valid) {
                if (libtorrentVersion.major >= 2) {
                    $("rowDiskCache").style.display = "none";
                    $("rowDiskCacheExpiryInterval").style.display = "none";
                    $("rowCoalesceReadsAndWrites").style.display = "none";
                }
                else {
                    $("fieldsetI2p").style.display = "none";
                    $("rowMemoryWorkingSetLimit").style.display = "none";
                    $("rowHashingThreads").style.display = "none";
                    $("rowDiskIOType").style.display = "none";
                    $("rowI2pInboundQuantity").style.display = "none";
                    $("rowI2pOutboundQuantity").style.display = "none";
                    $("rowI2pInboundLength").style.display = "none";
                    $("rowI2pOutboundLength").style.display = "none";
                }

                if (!((libtorrentVersion.major >= 2) && (libtorrentVersion.minor >= 0) && (libtorrentVersion.fix >= 6)))
                    $("diskIOWriteModeWriteThrough").style.display = "none";
            }

            if ((buildInfo.platform !== "macos") && (buildInfo.platform !== "windows"))
                $("rowMarkOfTheWeb").style.display = "none";

            $("networkInterface").addEventListener("change", function() {
                updateInterfaceAddresses($(this).value, "");
            });

            loadPreferences();

            window.qBittorrent.pathAutofill.attachPathAutofill();
        };

        return exports();
    })();
    Object.freeze(window.qBittorrent.Preferences);

    window.qBittorrent.Preferences.setup();
</script>
