Page MenuHomeWMGMC Issues

No OneTemporary

This file is larger than 256 KB, so syntax highlighting was skipped.
diff --git a/data/web/lang/lang.cs.php b/data/web/lang/lang.cs.php
index a0910534..ad532eaa 100644
--- a/data/web/lang/lang.cs.php
+++ b/data/web/lang/lang.cs.php
@@ -1,909 +1,909 @@
<?php
/*
* Czech language file for mailcow
*
* Author: radek@fastlinux.eu (www.fastlinux.eu)
* Author: filip@hajny.net
*
*/
$lang['header']['apps'] = 'Aplikace';
$lang['footer']['loading'] = "Prosím čekejte...";
$lang['header']['restart_sogo'] = 'Restartovat SOGo';
$lang['header']['restart_netfilter'] = 'Restartovat netfilter';
$lang['footer']['restart_container'] = 'Restartovat kontejner';
$lang['footer']['restart_now'] = 'Restartovat nyní';
$lang['footer']['restarting_container'] = 'Restartuje se kontejner, může to chvilku trvat...';
$lang['footer']['restart_container_info'] = '<b>Důležité:</b> Šetrný restart může chvíli trvat, prosím čekejte...';
$lang['footer']['confirm_delete'] = 'Potvdit smazání';
$lang['footer']['delete_these_items'] = 'Prosím potvrďte vaše změny objektu id:';
$lang['footer']['delete_now'] = 'Smazat';
$lang['footer']['cancel'] = 'Zrušit';
$lang['footer']['hibp_nok'] = 'Nalezeno! Toto je potenciálně nebezpečné heslo!';
$lang['footer']['hibp_ok'] = 'Nebyla nalezena žádná shoda.';
$lang['danger']['transport_dest_exists'] = 'Transportní cíl "%s" již existuje';
$lang['danger']['unlimited_quota_acl'] = "Neomeznou kvótu nepovoluje seznam oprávnění ACL";
$lang['danger']['mysql_error'] = "Chyba MySQL: %s";
$lang['danger']['redis_error'] = "Chyba Redis: %s";
$lang['danger']['unknown_tfa_method'] = "Neznámá TFA metoda";
$lang['danger']['totp_verification_failed'] = "TOTP ověření selhalo";
$lang['success']['verified_totp_login'] = "TOTP přihlášení ověřeno";
$lang['danger']['u2f_verification_failed'] = "U2F ověření selhalo: %s";
$lang['success']['verified_u2f_login'] = "U2F přihlášení ověřeno";
$lang['success']['verified_yotp_login'] = "Yubico OTP přihlášení ověřeno";
$lang['danger']['yotp_verification_failed'] = "Yubico OTP ověření selhalo: %s";
$lang['danger']['ip_list_empty'] = "Seznam povolených IP nesmí být prázdný";
$lang['danger']['invalid_destination'] = "Formát cíle je neplatný";
$lang['danger']['invalid_nexthop'] = "Formát skoku (Next hop) je neplatný";
$lang['danger']['invalid_nexthop_authenticated'] = "Skok (Next hop) již existuje s rozdílnými přihlašovacími údaji, nejdříve prosím aktualizujte existující přihlašovací údaje tohoto skoku.";
$lang['danger']['next_hop_interferes'] = "%s koliduje se skokem %s";
$lang['danger']['next_hop_interferes_any'] = "Existující skok koliduje s %s";
$lang['danger']['rspamd_ui_pw_length'] = "Heslo pro Rspamd UI musí mít alespoň 6 znaků";
$lang['success']['rspamd_ui_pw_set'] = "Heslo k Rspamd UI nastaveno";
$lang['success']['queue_command_success'] = "Příkaz pro frontu úspěšně dokončen";
$lang['danger']['unknown'] = "Došlo k neznámé chybě";
$lang['danger']['malformed_username'] = "Neplatné uživatelské jméno";
$lang['info']['awaiting_tfa_confirmation'] = "Čeká se na potvrzení TFA";
$lang['success']['logged_in_as'] = "Přihlášen jako %s";
$lang['danger']['login_failed'] = "Přihlášení selhalo";
$lang['danger']['set_acl_failed'] = "Chyba při nastavení ACL";
$lang['danger']['no_user_defined'] = "Žádný uživatel není definován";
$lang['danger']['script_empty'] = "Skript nesmí být prázdný";
$lang['danger']['sieve_error'] = "Chyba Sieve parseru: %s";
$lang['danger']['value_missing'] = "Prosím, uveďte všechny hodnoty";
$lang['danger']['filter_type'] = "Špatný typ filtru";
$lang['danger']['domain_cannot_match_hostname'] = "Doména a hostname nesmí být stejné";
$lang['warning']['domain_added_sogo_failed'] = "Doména přidána, ale selhal restart SOGo kontejneru, prosím zkontrolujte logy serveru.";
$lang['danger']['rl_timeframe'] = "Nesprávný časový rámec omezení provozu";
$lang['success']['rl_saved'] = "Omezení provozu pro objekt %s uloženo";
$lang['success']['acl_saved'] = "ACL pro objekt %s uloženo";
$lang['success']['deleted_syncjobs'] = "Smazány synchronizační úlohy: %s";
$lang['success']['deleted_syncjob'] = "Smazán synchronizační úloha ID %s";
$lang['success']['delete_filters'] = "Smazané filtry: %s";
$lang['success']['delete_filter'] = "Smazané filtry ID %s";
$lang['danger']['invalid_bcc_map_type'] = "Špatný typ BCC mapování";
$lang['danger']['bcc_empty'] = "BCC cíl nesmí být prázdný";
$lang['danger']['bcc_must_be_email'] = "BCC mapování %s není správná email adresa";
$lang['danger']['bcc_exists'] = "BCC mapování %s již existuje pro typ %s";
$lang['success']['bcc_saved'] = "Položka BCC mapování uložena";
$lang['success']['bcc_edited'] = "Položka BCC mapování %s upravena";
$lang['success']['bcc_deleted'] = "Smazané položky BCC mapování: %s";
$lang['danger']['private_key_error'] = "Chyba soukroméhop klíče: %s";
$lang['danger']['map_content_empty'] = "Obsah mapování nesmí být prázdný";
$lang['success']['settings_map_added'] = "Přidána položka mapování nastavení";
$lang['danger']['settings_map_invalid'] = "Položka mapování nastavení ID %s je špatná";
$lang['danger']['settings_map_removed'] = "Položka mapování nastavení: %s smazána";
$lang['danger']['invalid_host'] = "Zadán neplatný hostitel: %s";
$lang['danger']['relayhost_invalid'] = "Nadřazený SMTP server (Relayhost) %s je neplatný";
$lang['success']['saved_settings'] = "Nastavení uložena";
$lang['success']['db_init_complete'] = "Inicializace databáze dokončena";
$lang['warning']['session_ua'] = "Token formuláře není platný: User-Agent validation error";
$lang['warning']['session_token'] = "Token formuláře není platný: Token mismatch";
$lang['danger']['dkim_domain_or_sel_invalid'] = "DKIM nebo selektor doménu je neplatný: %s";
$lang['success']['dkim_removed'] = "DKIM klíč %s odebrán";
$lang['success']['dkim_added'] = "DKIM klíč %s uložen";
$lang['success']['dkim_duplicated'] = "DKIM klíč domény %s zkopírován do %s";
$lang['danger']['access_denied'] = "Přístup odepřen nebo jsou neplatná data ve formuláři";
$lang['danger']['domain_invalid'] = "Název domény je prázdný nebo neplatný";
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = "Max. kvóta překročila limit domény";
$lang['danger']['object_is_not_numeric'] = "Hodnota %s není číslo";
$lang['success']['domain_added'] = "Přidána doména %s";
$lang['success']['items_deleted'] = "Položka %s úspěšně smazána";
$lang['success']['item_deleted'] = "Položka %s úspěšně smazána";
$lang['danger']['alias_empty'] = "Adresa aliasu nesmí být prázdná";
$lang['danger']['last_key'] = 'Nelze smazat poslední klíč';
$lang['danger']['goto_empty'] = "Cílová adresa nesmí být prázdná";
$lang['danger']['policy_list_from_exists'] = "Záznam s daným jménem již existuje";
$lang['danger']['policy_list_from_invalid'] = "Záznam má neplatný formát";
$lang['danger']['alias_invalid'] = "Adresa aliasu %s je neplatná";
$lang['danger']['goto_invalid'] = "Cílová adresa %s je neplatná";
$lang['danger']['alias_domain_invalid'] = "Doménový alias %s je neplatný";
$lang['danger']['target_domain_invalid'] = "Cílová doména %s je neplatná";
$lang['danger']['object_exists'] = "Objekt %s již existuje";
$lang['danger']['domain_exists'] = "Doména %s již existuje";
$lang['danger']['alias_goto_identical'] = "Alias a cílová adresa nesmějí být stejné";
$lang['danger']['aliasd_targetd_identical'] = "Doménový alias nesmí být stejný jako cílová doména: %s";
$lang['danger']['maxquota_empty'] = 'Max. kvóta poštovní schránky nesmí být 0.';
$lang['success']['alias_added'] = "Byl přidán alias %s";
$lang['success']['alias_modified'] = "Změny aliasu %s uloženy";
$lang['success']['mailbox_modified'] = "Změny poštovní schránky %s uloženy";
$lang['success']['resource_modified'] = "Změny poštovní schránky %s uloženy";
$lang['success']['object_modified'] = "Změny objektu %s uloženy";
$lang['success']['f2b_modified'] = "Změny parametrů Fail2ban uloženy";
$lang['danger']['targetd_not_found'] = "Cílová doména %s nenalezena";
$lang['danger']['targetd_relay_domain'] = "Cílová doména %s je přesměrovaná";
$lang['success']['aliasd_added'] = "Přidán doménový alias %s";
$lang['success']['aliasd_modified'] = "Změny aliasu domény %s uloženy";
$lang['success']['domain_modified'] = "Změny domény %s uloženy";
$lang['success']['domain_admin_modified'] = "Změny správce domény %s uloženy";
$lang['success']['domain_admin_added'] = "Správce domény %s přidán";
$lang['success']['admin_added'] = "Správce %s přidán";
$lang['success']['admin_modified'] = "Změny správce uloženy";
$lang['success']['admin_api_modified'] = "Změna API uložena";
$lang['success']['license_modified'] = "Změny licence uloženy";
$lang['danger']['username_invalid'] = "Uživatelské jméno %s nelze použít";
$lang['danger']['password_mismatch'] = "Potvrzení hesla nesouhlasí";
$lang['danger']['password_complexity'] = "Heslo nesplňuje pravidla";
$lang['danger']['password_empty'] = "Heslo nesmí být prázdné";
$lang['danger']['login_failed'] = "Přihlášení selhalo";
$lang['danger']['mailbox_invalid'] = "Název poštovní chránky je neplatný";
$lang['danger']['description_invalid'] = 'Popis zdroje %s je neplatný';
$lang['danger']['resource_invalid'] = "Název zdroje %s je neplatný";
$lang['danger']['is_alias'] = "%s je již známa jako adresa aliasu";
$lang['danger']['is_alias_or_mailbox'] = "%s je již známa jako adresa aliasu, poštovní schránky nebo aliasu rozvedeného z aliasu domény.";
$lang['danger']['is_spam_alias'] = "%s je již známa jako adresa spamového aliasu";
$lang['danger']['quota_not_0_not_numeric'] = "Kvóta musí být číslo >= 0";
$lang['danger']['domain_not_found'] = 'Doména %s nebyla nalezena';
$lang['danger']['max_mailbox_exceeded'] = "Max. počet poštovních schránek překročen (%d z %d)";
$lang['danger']['max_alias_exceeded'] = 'Překročeno max. množství aliasů';
$lang['danger']['mailbox_quota_exceeded'] = "Kvóta překročila limit domény (max. %d MiB)";
$lang['danger']['mailbox_quota_left_exceeded'] = "Není dost volného místa (zbývá: %d MiB)";
$lang['success']['mailbox_added'] = "Poštovní schránka %s přidána";
$lang['success']['resource_added'] = "Zdroj %s přidán";
$lang['success']['domain_removed'] = "Doména %s odebrána";
$lang['success']['alias_removed'] = "Alias %s odebrán";
$lang['success']['alias_domain_removed'] = "Doménový alias %s odebrán";
$lang['success']['domain_admin_removed'] = "Správce domény %s odebrán";
$lang['success']['admin_removed'] = "Správce %s odebrán";
$lang['success']['mailbox_removed'] = "Poštovní schránka %s odebrána";
$lang['success']['eas_reset'] = "ActiveSync zařízení uživatele %s vyresetováno";
$lang['success']['sogo_profile_reset'] = "SOGo profil uživatele %s vyresetován";
$lang['success']['resource_removed'] = "Zdroj %s odebrán";
$lang['warning']['cannot_delete_self'] = "Nelze smazat právě přihlášeného uživatele";
$lang['warning']['no_active_admin'] = "Nelze deaktivovat posledního aktivního správce";
$lang['danger']['max_quota_in_use'] = "Kvóta poštovní schránky musí být větší nebo rovna %d MiB";
$lang['danger']['domain_quota_m_in_use'] = "Kvóta domény musí být větší nebo rovna %s MiB";
$lang['danger']['mailboxes_in_use'] = "Max. počet poštovních schránek musí být větší nebo roven %d";
$lang['danger']['aliases_in_use'] = "Max. počet aliasů musí být větší nebo roven %d";
$lang['danger']['sender_acl_invalid'] = "Hodnota ACL odesílatele %s je neplatná";
$lang['danger']['domain_not_empty'] = "Nelze odebrat doménu, která není prázdná";
$lang['danger']['validity_missing'] = 'Zdejte dobu platnosti';
$lang['user']['loading'] = "Načítá se...";
$lang['user']['force_pw_update'] = 'Pro přístup k groupware funkcím <b>musíte změnit heslo</b>.';
$lang['user']['active_sieve'] = "Aktivní filtr";
$lang['user']['show_sieve_filters'] = "Zobrazit aktivní sieve filtr uživatele";
$lang['user']['no_active_filter'] = "Není k dispozici žádný aktivní filtr";
$lang['user']['messages'] = "zpráv"; // "123 messages"
$lang['user']['in_use'] = "Obsazeno";
$lang['user']['user_change_fn'] = "";
$lang['user']['user_settings'] = 'Uživatelské nastavení';
$lang['user']['mailbox_details'] = 'Podrobnosti poštovní schránky';
$lang['user']['change_password'] = 'Změnit heslo';
$lang['user']['client_configuration'] = 'Zobrazit průvodce nastavením e-mailových klientů a smartphonů';
$lang['user']['new_password'] = 'Nové heslo';
$lang['user']['save_changes'] = 'Uložit změny';
$lang['user']['password_now'] = 'Současné heslo (pro potvrzení změny)';
$lang['user']['new_password_repeat'] = 'Potvrzení nového hesla (opakujte)';
$lang['user']['new_password_description'] = 'Požadavek: min. délka 6 znaků, písmena a čísla.';
$lang['user']['spam_aliases'] = 'Dočasné e-mailové aliasy';
$lang['user']['alias'] = 'Alias';
$lang['user']['shared_aliases'] = 'Sdílené aliasy';
$lang['user']['shared_aliases_desc'] = 'Na sdílené aliasy se neuplatňuje uživatelské nastavení jako filtr spamu nebo pravidla šifrování. Nastavení filtrování spamu může provádět jen správce pro celou doménu.';
$lang['user']['direct_aliases'] = 'Přímé aliasy';
$lang['user']['direct_aliases_desc'] = 'Na přímé aliasy se uplatňuje filtr spamu a nastavení pravidel TLS';
$lang['user']['is_catch_all'] = 'Catch-all pro doménu/y';
$lang['user']['aliases_also_send_as'] = 'Smí odesílat tako jako uživatel';
$lang['user']['aliases_send_as_all'] = 'Nekontrolovat přístup odesílatele pro následující doménu(y) a jejich aliasy domény:';
$lang['user']['alias_create_random'] = 'Generovat náhodný alias';
$lang['user']['alias_extend_all'] = 'Prodloužit aliasy o 1 hodinu';
$lang['user']['alias_valid_until'] = 'Platný do';
$lang['user']['alias_remove_all'] = 'Odstranit všechny aliasy';
$lang['user']['alias_time_left'] = 'Zbývající čas';
$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
$lang['user']['alias_select_validity'] = 'Doba platnosti';
$lang['user']['sync_jobs'] = 'Synchronizační úlohy';
$lang['user']['expire_in'] = 'Vyprší za';
$lang['user']['hour'] = 'hodinu';
$lang['user']['hours'] = 'hodin';
$lang['user']['day'] = 'den';
$lang['user']['week'] = 'týden';
$lang['user']['weeks'] = 'týdny';
$lang['user']['spamfilter'] = 'Filtr spamu';
$lang['admin']['spamfilter'] = 'Filtr spamu';
$lang['user']['spamfilter_wl'] = 'Seznam povolených adres (whitelist)';
$lang['user']['spamfilter_wl_desc'] = 'Povolené emailové adresy <b>nebudou nikdy klasifikovány jako spam</b>. Lze použít zástupné znaky (*). Filtr se použije pouze na přímé aliasy (s jednou cílovou poštovní schránkou), s výjimkou aliasů typu catch-all a samotné poštovní schránky.';
$lang['user']['spamfilter_bl'] = 'Seznam zakázaných adres (blacklist)';
$lang['user']['spamfilter_bl_desc'] = 'Zakázané emailové adresy <b>budou vždy klasifikovány jako spam a odmítnuté</b>. Lze použít zástupné znaky (*). Filtr se použije pouze na přímé aliasy (s jednou cílovou poštovní schránkou), s výjimkou aliasů typu catch-all a samotné poštovní schránky.';
$lang['user']['spamfilter_behavior'] = 'Hodnocení';
$lang['user']['spamfilter_table_rule'] = 'Pravidlo';
$lang['user']['spamfilter_table_action'] = 'Akce';
$lang['user']['spamfilter_table_empty'] = 'Žádná data k zobrazení';
$lang['user']['spamfilter_table_remove'] = 'smazat';
$lang['user']['spamfilter_table_add'] = 'Přidat položku';
$lang['user']['spamfilter_green'] = 'Zelená: tato zpráva není spam';
$lang['user']['spamfilter_yellow'] = 'Žlutá: tato zpráva může být spam, bude označena jako spam a přesunuta do složky nevyžádané pošty';
$lang['user']['spamfilter_red'] = 'Červená: Tato zpráva je spam a server ji odmítne';
$lang['user']['spamfilter_default_score'] = 'Výchozí hodnoty:';
$lang['user']['spamfilter_hint'] = 'První hodnota představuje "nízké spam skóre" a druhá "vysoké spam skóre".';
$lang['user']['spamfilter_table_domain_policy'] = "n/a (doménová politika)";
$lang['user']['waiting'] = "Čekání";
$lang['user']['status'] = "Stav";
$lang['user']['running'] = "Běží";
$lang['user']['tls_policy_warning'] = '<strong>Varování:</strong> Pokud se rozhodnete vynutit šifrovaný přenos pošty, může dojít ke ztrátě e-mailů.<br>Zprávy, které nesplňují tuto politiku, budou poštovním systémem odmítnuty.<br>Tato volba ovlivňuje vaši primární e-mailovou adresu (přihlašovací jméno), všechny adresy odvozené z doménových aliasů i aliasy, jež mají tuto poštovní chránku jako cíl.';
$lang['user']['tls_policy'] = 'Politika šifrování';
$lang['user']['tls_enforce_in'] = 'Vynutit TLS pro příchozí poštu ';
$lang['user']['tls_enforce_out'] = 'Vynutit TLS pro odchozí poštu';
$lang['user']['no_record'] = 'Žádný záznam';
$lang['user']['tag_handling'] = 'Zacházení s označkovanou poštou';
$lang['user']['tag_in_subfolder'] = 'V podsložce';
$lang['user']['tag_in_subject'] = 'V předmětu';
$lang['user']['tag_in_none'] = 'Nedělat nic';
$lang['user']['tag_help_explain'] = 'V podsložce: v doručené poště bude vytvořena nová podsložka pojmenovaná po značce zprávy ("INBOX / Facebook").<br>
V předmětu: název značky bude přidáván k předmětu mailu, například: "[Facebook] Moje zprávy".';
$lang['user']['tag_help_example'] = 'Příklad e-mailové adresy se značkou: me<b>+Facebook</b>@example.org';
$lang['user']['eas_reset'] = 'Smazat mezipaměť zařízení ActiveSync';
$lang['user']['eas_reset_now'] = 'Smazat';
$lang['user']['eas_reset_help'] = 'Obnovení mezipaměti zařízení pomůže zpravidla obnovit poškozený profil služby ActiveSync.<br><b>Upozornění:</b> Všechna data budou opětovně stažena!';
$lang['user']['sogo_profile_reset'] = 'Resetovat profil SOGo';
$lang['user']['sogo_profile_reset_now'] = 'Resetovat profil';
$lang['user']['sogo_profile_reset_help'] = 'Tato volba odstraní uživatelský profil SOGo a <b>nenávratně vymaže všechna data</b>.';
$lang['user']['encryption'] = 'Šifrování';
$lang['user']['username'] = 'Uživatelské jméno';
$lang['user']['last_run'] = 'Naposledy spuštěno';
$lang['user']['excludes'] = 'Vyloučené';
$lang['user']['interval'] = 'Interval';
$lang['user']['active'] = 'Aktivní';
$lang['user']['action'] = 'Akce';
$lang['user']['edit'] = 'Upravit';
$lang['user']['remove'] = 'Smazat';
$lang['user']['create_syncjob'] = 'Vytvořit novou synchronizační úlohu';
$lang['start']['mailcow_apps_detail'] = 'Použijte aplikace pro přístup k vašim e-mailům, kalendáři, kontaktům atd.';
$lang['start']['mailcow_panel_detail'] = '<b>Správci domén</b> mohou vytvářet, upravovat nebo mazat schránky a aliasy, upravovat parametry domén a zobrazovat další informace o svých přidělených doménách.<br>
<b>Uživatelé</b> mohou vytvářet dočasné aliasy (spam aliases), měnit svá hesla a nastavovat filtr spamu.';
$lang['start']['imap_smtp_server_auth_info'] = 'Použijte vaši celou e-mailovou adresu a zvolte způsob ověřování PLAIN.<br>
Vaše přihlašovací údaje budou zašifrovány na straně serveru.';
$lang['start']['help'] = 'Zobrazit/skrýt panel nápovědy';
$lang['header']['mailcow_settings'] = 'Nastavení';
$lang['header']['administration'] = 'Hlavní nastavení';
$lang['header']['mailboxes'] = 'Nastavení pošty';
$lang['header']['user_settings'] = 'Uživatelská nastavení';
$lang['header']['quarantine'] = "Karanténa";
$lang['header']['debug'] = "Systémové informace";
$lang['quarantine']['disabled_by_config'] = "Funkce karanténa je momentálně vypnuta v nastavení systému.";
$lang['mailbox']['tls_policy_maps'] = 'Mapování TLS pravidel';
$lang['mailbox']['tls_policy_maps_long'] = 'Přepisování pravidel odchozího TLS';
$lang['mailbox']['tls_policy_maps_info'] = 'Tato mapa přepisuje pravidla odchozího TLS na transportech nezávisle na TLS nastavení uživatele.<br>
Pro více informací prosím prostudujte <a href="http://www.postfix.org/postconf.5.html#smtp_tls_policy_maps" target="_blank">dokumentaci k "smtp_tls_policy_maps"</a>.';
$lang['mailbox']['tls_enforce_in'] = 'Vynutit TLS pro příchozí';
$lang['mailbox']['tls_enforce_out'] = 'Vynutit TLS pro odchozí';
$lang['mailbox']['tls_map_dest'] = 'Cíl';
-$lang['mailbox']['tls_map_dest_info'] = 'Příklady: example.org, .example.org, mail@example.org, [mail.example.org]:25';
+$lang['mailbox']['tls_map_dest_info'] = 'Příklady: example.org, .example.org, [mail.example.org]:25';
$lang['mailbox']['tls_map_policy'] = 'Pravidlo';
$lang['mailbox']['tls_map_parameters'] = 'Parametry';
$lang['mailbox']['tls_map_parameters_info'] = 'Prázdné nebo parametry, například: protocols=!SSLv2 ciphers=medium exclude=3DES';
$lang['mailbox']['booking_0'] = 'Vždy ukazovat jako volný';
$lang['mailbox']['booking_lt0'] = 'Neomezený, ale po rezervaci se ukazuje jako zabraný';
$lang['mailbox']['booking_custom'] = 'Pevný limit na určitý počet rezervací';
$lang['mailbox']['booking_0_short'] = 'Vždy volný';
$lang['mailbox']['booking_lt0_short'] = 'Volný limit';
$lang['mailbox']['booking_custom_short'] = 'Pevný limit';
$lang['mailbox']['domain'] = 'Doména';
$lang['mailbox']['spam_aliases'] = 'Dočasný alias';
$lang['mailbox']['multiple_bookings'] = 'Vícenásobné rezervace';
$lang['mailbox']['kind'] = 'Druh';
$lang['mailbox']['description'] = 'Popis';
$lang['mailbox']['alias'] = 'Alias';
$lang['mailbox']['aliases'] = 'Aliasy';
$lang['mailbox']['domains'] = 'Domény';
$lang['admin']['domain'] = 'Doména';
$lang['admin']['domain_s'] = 'Doména/y';
$lang['mailbox']['mailboxes'] = 'Poštovní schránky';
$lang['mailbox']['mailbox'] = 'Poštovní schránka';
$lang['mailbox']['resources'] = 'Zdroje';
$lang['mailbox']['mailbox_quota'] = 'Max. velikost poštovní schránky';
$lang['mailbox']['domain_quota'] = 'Kvóta';
$lang['mailbox']['active'] = 'Aktivní';
$lang['mailbox']['action'] = 'Akce';
$lang['mailbox']['backup_mx'] = 'Záložní MX';
$lang['mailbox']['domain_aliases'] = 'Doménové aliasy';
$lang['mailbox']['target_domain'] = 'Cílová doména';
$lang['mailbox']['target_address'] = 'Cílová adresa';
$lang['mailbox']['username'] = 'Uživatelské jméno';
$lang['mailbox']['fname'] = 'Celé jméno';
$lang['mailbox']['filter_table'] = 'Tabulka filtrů';
$lang['mailbox']['yes'] = '&#10003;';
$lang['mailbox']['no'] = '&#10005;';
$lang['mailbox']['in_use'] = 'Obsazeno (%)';
$lang['mailbox']['msg_num'] = 'Zpráva #';
$lang['mailbox']['remove'] = 'Smazat';
$lang['mailbox']['edit'] = 'Upravit';
$lang['mailbox']['no_record'] = 'Žádný záznam pro objekt %s';
$lang['mailbox']['no_record_single'] = 'Žádný záznam';
$lang['mailbox']['add_domain'] = 'Přidat doménu';
$lang['mailbox']['add_domain_alias'] = 'Přidat doménový alias';
$lang['mailbox']['add_mailbox'] = 'Přidat poštovní schránku';
$lang['mailbox']['add_resource'] = 'Přidat zdroj';
$lang['mailbox']['add_alias'] = 'Přidat alias';
$lang['mailbox']['add_domain_record_first'] = 'Prosím nejdříve vytvořte doménu';
$lang['mailbox']['empty'] = 'Žádné výsledky';
$lang['mailbox']['toggle_all'] = 'Označit vše';
$lang['mailbox']['quick_actions'] = 'Akce';
$lang['mailbox']['activate'] = 'Zapnout';
$lang['mailbox']['deactivate'] = 'Vypnout';
$lang['mailbox']['owner'] = 'Vlastník';
$lang['mailbox']['mins_interval'] = 'Interval (min)';
$lang['mailbox']['last_run'] = 'Naposledy spuštěno';
$lang['mailbox']['excludes'] = 'Vyloučené';
$lang['mailbox']['last_run_reset'] = 'Plánovat další';
$lang['mailbox']['sieve_info'] = 'Můžete uložit více filtrů pro každého uživatele, ale současně může být aktivní pouze jeden prefilter a jeden postfilter.<br>
Každý filtr bude proveden v daném pořadí. Ani chyba při vykonávání skriptu nebo snaha o pozdržení nezastaví vykonání dalších skriptů.<br>
<a href="https://github.com/mailcow/mailcow-dockerized/blob/master/data/conf/dovecot/global_sieve_before" target="_blank">Global sieve prefilter</a> → Prefilter → Uživatelské skripty → Postfilter → <a href="https://github.com/mailcow/mailcow-dockerized/blob/master/data/conf/dovecot/global_sieve_after" target="_blank">Global sieve postfilter</a>';
$lang['info']['no_action'] = 'Žádná použitelná akce';
$lang['edit']['syncjob'] = 'Upravit synchronizační úlohu';
$lang['edit']['client_id'] = 'ID klienta';
$lang['edit']['client_secret'] = 'Client secret';
$lang['edit']['scope'] = 'Rozsah';
$lang['edit']['grant_types'] = 'Typy udělení';
$lang['edit']['redirect_uri'] = 'URL pro přesměrování/callback';
$lang['edit']['hostname'] = 'Jméno hostitele';
$lang['edit']['encryption'] = 'Šifrování';
$lang['edit']['maxage'] = 'Maximální stáří zpráv ve dnech, které budou staženy ze vzdáleného umístění<br><small>(0 = ignorovat stáří)</small>';
$lang['edit']['maxbytespersecond'] = 'Max. bajtů za sekundu <br><small>(0 = neomezeno)</small>';
$lang['edit']['automap'] = 'Pokusit se automaticky mapovat složky ("Sent items", "Sent" => "Sent" atd.)';
$lang['edit']['skipcrossduplicates'] = 'Přeskočit duplicitní zprávy ("první přijde, první mele")';
$lang['add']['automap'] = 'Pokusit se automaticky mapovat složky ("Sent items", "Sent" => "Sent" atd.)';
$lang['add']['skipcrossduplicates'] = 'Přeskočit duplicitní zprávy ("první přijde, první mele")';
$lang['edit']['subfolder2'] = 'Synchronizace do podsložky v cílovém umístění<br><small>(prázdné = nepoužívat podsložku)</small>';
$lang['edit']['mins_interval'] = 'Interval (min)';
$lang['edit']['exclude'] = 'Vyloučit objekty (regex)';
$lang['edit']['save'] = 'Uložit změny';
$lang['edit']['username'] = 'Uživatelské jméno';
$lang['edit']['max_mailboxes'] = 'Max. počet poštovních schránek';
$lang['edit']['title'] = 'Úprava objektu';
$lang['edit']['target_address'] = 'Cílová adresa/y <small>(odělené čárkou)</small>';
$lang['edit']['active'] = 'Aktivní';
$lang['edit']['gal'] = 'Globální seznam adres';
$lang['add']['gal'] = 'Globální seznam adres';
$lang['edit']['gal_info'] = 'Globální seznam adres obsahuje všechny objekty v doméně a uživatel jej nemůže měnit. Pokud je vypnut, budou v SOGo chybět informace o obsazenosti! <b>Při změně nutno restartovat SOGo.</b>';
$lang['add']['gal_info'] = 'Globální seznam adres obsahuje všechny objekty v doméně a uživatel jej nemůže měnit. Pokud je vypnut, budou v SOGo chybět informace o obsazenosti! <b>Při změně nutno restartovat SOGo.</b>';
$lang['edit']['force_pw_update'] = 'Vynutit změnu hesla při příštím přihlášení';
$lang['edit']['force_pw_update_info'] = 'Uživatel se bude moci přihlásit pouze do administrace účtu.';
$lang['edit']['sogo_access'] = 'Udělit přístup k SOGo';
$lang['edit']['sogo_access_info'] = 'Toto nastavení neovlivňuje přístup k ostatním službám, ani nezmění existující profil uživatele SOGo.';
$lang['edit']['target_domain'] = 'Cílová doména';
$lang['edit']['password'] = 'Heslo';
$lang['edit']['password_repeat'] = 'Potvrzení nového hesla (opakujte)';
$lang['edit']['domain_admin'] = 'Upravit správce domény';
$lang['edit']['domain'] = 'Úprava domény';
$lang['edit']['edit_alias_domain'] = 'Upravit doménový alias';
$lang['edit']['domains'] = 'Domény';
$lang['edit']['alias'] = 'Upravit alias';
$lang['edit']['mailbox'] = 'Úprava poštovní schránky';
$lang['edit']['description'] = 'Popis';
$lang['edit']['max_aliases'] = 'Max. počet aliasů';
$lang['edit']['max_quota'] = 'Max. kvóta poštovní schránky (MiB)';
$lang['edit']['domain_quota'] = 'Kvóta domény';
$lang['edit']['backup_mx_options'] = 'Možnosti záložního MX';
$lang['edit']['relay_domain'] = 'Přesměrování domény';
$lang['edit']['relay_all'] = 'Přesměrování všech příjemců';
$lang['edit']['relay_all_info'] = '<small>Pokud se rozhodnete <b>nepřesměrovat</b> všechny příjemce, musíte přidat prázdnou poštovní schránku pro každého příjemce, který se má přesměrovávat.</small>';
$lang['edit']['full_name'] = 'Celé jméno';
$lang['edit']['quota_mb'] = 'Kvóta (MiB)';
$lang['edit']['sender_acl'] = 'Povolit odesílání jako';
$lang['edit']['sender_acl_disabled'] = '↳ <span class="label label-danger">Kontrola odesílatele vypnuta</span>';
$lang['user']['sender_acl_disabled'] = '<span class="label label-danger">Kontrola odesílatele vypnuta</span>';
$lang['edit']['previous'] = 'Předchozí stránka';
$lang['edit']['unchanged_if_empty'] = 'Pokud se nemění, ponechte prázdné';
$lang['edit']['dont_check_sender_acl'] = "Vypnout kontrolu odesílatele pro doménu %s (+ doménové aliasy)";
$lang['edit']['multiple_bookings'] = 'Vícenásobné rezervace';
$lang['edit']['kind'] = 'Druh';
$lang['edit']['resource'] = 'Zdroj';
$lang['edit']['relayhost'] = 'Přeposílání závislé na odesílateli';
$lang['edit']['public_comment'] = 'Veřejný komentář';
$lang['mailbox']['public_comment'] = 'Veřejný komentář';
$lang['edit']['private_comment'] = 'Soukromý komentář';
$lang['mailbox']['private_comment'] = 'Soukromý komentář';
$lang['edit']['comment_info'] = 'Soukromý komentář se nezobrazí uživateli; veřejný komentář se zobrazí jako nápověda při zastavení se kurzorem v přehledu uživatelů';
$lang['add']['public_comment'] = 'Veřejný komentář';
$lang['add']['private_comment'] = 'Soukromý komentář';
$lang['add']['comment_info'] = 'Soukromý komentář se nezobrazí uživateli; veřejný komentář se zobrazí jako nápověda při zastavení se kurzorem v přehledu uživatelů';
$lang['acl']['spam_alias'] = 'Dočasné aliasy';
$lang['acl']['tls_policy'] = 'Pravidla TLS';
$lang['acl']['spam_score'] = 'Skóre spamu';
$lang['acl']['spam_policy'] = 'Blacklist/Whitelist';
$lang['acl']['delimiter_action'] = 'Oddělovač akce';
$lang['acl']['syncjobs'] = 'Synchronizační úlohy';
$lang['acl']['eas_reset'] = 'Resetování EAS zařízení';
$lang['acl']['sogo_profile_reset'] = 'Resetování profilu SOGo';
$lang['acl']['quarantine'] = 'Karanténa';
$lang['acl']['quarantine_notification'] = 'Upozornění z karantény';
$lang['acl']['quarantine_attachments'] = 'Přílohy v karanténě';
$lang['acl']['alias_domains'] = 'Přidat doménové aliasy';
$lang['acl']['login_as'] = 'Přihlásit se jako uživatel poštovní schránky';
$lang['acl']['bcc_maps'] = 'BCC mapy';
$lang['acl']['filters'] = 'Filtry';
$lang['acl']['ratelimit'] = 'Omezování provozu';
$lang['acl']['recipient_maps'] = 'Mapy příjemců';
$lang['acl']['unlimited_quota'] = 'Neomezené kvóty pro poštovní schránky';
$lang['acl']['extend_sender_acl'] = 'Povolit rozšíření ACL odesílatele o externí adresy';
$lang['acl']['prohibited'] = 'Zakázáno z důvodu ACL';
$lang['edit']['extended_sender_acl'] = 'Externí adresy odesílatele';
$lang['edit']['extended_sender_acl_info'] = 'Je dobré importovat DKIM klíč domény, pokud existuje.<br>
Nezapoměňte přidat tento server do příslušného záznamu SPF TXT.<br>
Je-li na tomto serveru vytvořena doména nebo doménový alias, který se shoduje s externí adresou, je tato externí adresa smazána.<br>
Použije formát @domain.tld, chcete-li odesílat jako *@domain.tld.';
$lang['edit']['sender_acl_info'] = 'Má-li uživatel schránky A dovoleno odesílat jako uživatel schránky B, nezobrazuje se adresa odesílatele B v seznamu "Od" v SOGo automaticky.<br>
Uživatel schránky A musí nejdříve v SOGo vytvořit pověření, jež umožní uživateli B vybrat svou adresu jako odesílatele. Tento mechanismus neplatí pro aliasy.';
$lang['mailbox']['quarantine_notification'] = 'Upozornění z karantény';
$lang['mailbox']['never'] = 'Nikdy';
$lang['mailbox']['hourly'] = 'Každou hodinu';
$lang['mailbox']['daily'] = 'Každý den';
$lang['mailbox']['weekly'] = 'Každý týden';
$lang['user']['quarantine_notification'] = 'Upozornění z karantény';
$lang['user']['never'] = 'Nikdy';
$lang['user']['hourly'] = 'Každou hodinu';
$lang['user']['daily'] = 'Každý den';
$lang['user']['weekly'] = 'Každý týden';
$lang['user']['quarantine_notification_info'] = 'Jakmile se upozornění odešle, budou příslušné položky vyznačeny jako "upozorněné" a nebude pro ně odesláno žádné další upozornění.';
$lang['add']['generate'] = 'generovat';
$lang['add']['syncjob'] = 'Přidat synchronizační úlohu';
$lang['add']['syncjob_hint'] = 'Upozornění: Heslo bude uloženo jako prostý text!';
$lang['add']['hostname'] = 'Jméno hostitele';
$lang['add']['destination'] = 'Cíl';
$lang['add']['nexthop'] = 'Další skok';
$lang['edit']['nexthop'] = 'Další skok';
$lang['add']['port'] = 'Port';
$lang['add']['username'] = 'Uživatelské jméno';
$lang['add']['enc_method'] = 'Způsob šifrování';
$lang['add']['mins_interval'] = 'Interval kontroly (minuty)';
$lang['add']['exclude'] = 'Vyloučené objekty (regex)';
$lang['add']['delete2duplicates'] = 'Odstranit duplicity v cílovém místě';
$lang['add']['delete1'] = 'Odstranit ze zdroje po dokončení';
$lang['add']['delete2'] = 'Smazat zprávy v cíli, které nejsou ve zdroji';
$lang['add']['custom_params'] = 'Vlastní parametry';
$lang['add']['custom_params_hint'] = 'Správně: --param=xy, špatně: --param xy';
$lang['add']['subscribeall'] = 'Odebírat všechny složky';
$lang['add']['timeout1'] = 'Časový limit pro připojení ke vzdálenému hostiteli';
$lang['add']['timeout2'] = 'Časový limit pro připojení k lokálnímu hostiteli';
$lang['edit']['timeout1'] = 'Časový limit pro připojení ke vzdálenému hostiteli';
$lang['edit']['timeout2'] = 'Časový limit pro připojení k lokálnímu hostiteli';
$lang['edit']['delete2duplicates'] = 'Odstranit duplicity v cílovém místě';
$lang['edit']['delete1'] = 'Odstranit ze zdroje po dokončení';
$lang['edit']['delete2'] = 'Smazat zprávy v cíli, které nejsou ve zdroji';
$lang['add']['domain_matches_hostname'] = 'Doména %s se shoduje s názvem hostitele';
$lang['add']['domain'] = 'Doména';
$lang['add']['active'] = 'Aktivní';
$lang['add']['multiple_bookings'] = 'Vícenásobné rezervace';
$lang['add']['description'] = 'Popis';
$lang['add']['max_aliases'] = 'Max. počet aliasů';
$lang['add']['max_mailboxes'] = 'Max. počet poštovních schránek';
$lang['add']['mailbox_quota_m'] = 'Max. kvóta poštovní schránky (MiB)';
$lang['add']['domain_quota_m'] = 'Celková kvóta domény (MiB)';
$lang['add']['backup_mx_options'] = 'Možnosti záložního MX';
$lang['add']['relay_all'] = 'Přesměrování všech příjemců';
$lang['add']['relay_domain'] = 'Přesměrování domény';
$lang['add']['relay_all_info'] = '<small>Pokud se rozhodnete <b>nepřesměrovat</b> všechny příjemce, musíte přidat prázdnou poštovní schránku pro každého příjemce, který se má přesměrovávat.</small>';
$lang['add']['alias_address'] = 'Adresa/y aliasů';
$lang['add']['alias_address_info'] = '<small>Kompletní emailová adresa/y, nebo @example.com pro zachycení všech zpráv pro doménu (oddělené čárkami). <b>Pouze domény v systému mailcow</b>.</small>';
$lang['add']['alias_domain_info'] = '<small>Platné názvy domén (oddělené čárkami).</small>';
$lang['add']['target_address'] = 'Cílové adresy';
$lang['add']['target_address_info'] = '<small>Kompletní email adresa/y (oddělené čárkami).</small>';
$lang['add']['alias_domain'] = 'Doménový alias';
$lang['add']['select'] = 'Prosím vyberte...';
$lang['add']['target_domain'] = 'Cílová doména';
$lang['add']['kind'] = 'Druh';
$lang['add']['mailbox_username'] = 'Uživatelské jméno (levá část email adresy)';
$lang['add']['full_name'] = 'Celé jméno';
$lang['add']['quota_mb'] = 'Kvóta (MiB)';
$lang['add']['select_domain'] = 'Nejdříve vyberte doménu';
$lang['add']['password'] = 'Heslo';
$lang['add']['password_repeat'] = 'Potvrzení nového hesla (opakujte)';
$lang['add']['restart_sogo_hint'] = 'Po přidání nové domény je nutné restartovat SOGo kontejner!';
$lang['add']['goto_null'] = 'Tiše odmítat poštu';
$lang['add']['goto_ham'] = 'Učit se jako <span class="text-success"><b>ham</b></span>';
$lang['add']['goto_spam'] = 'Učit se jako <span class="text-danger"><b>spam</b></span>';
$lang['add']['validation_success'] = 'Úspěšně ověřeno';
$lang['add']['activate_filter_warn'] = 'Pokud je zaškrtlá volba "Aktivní", budou všechny ostatní filtry deaktivovány.';
$lang['add']['validate'] = 'Ověřit';
$lang['mailbox']['add_filter'] = 'Přidat filtr';
$lang['add']['sieve_desc'] = 'Krátký popis';
$lang['edit']['sieve_desc'] = 'Krátký popis';
$lang['add']['sieve_type'] = 'Typ filtru';
$lang['edit']['sieve_type'] = 'Typ filtru';
$lang['mailbox']['set_prefilter'] = 'Označit jako pre-filtr';
$lang['mailbox']['set_postfilter'] = 'Označit jako post-filtr)';
$lang['mailbox']['filters'] = 'Filtry';
$lang['mailbox']['sync_jobs'] = 'Synchronizační úlohy';
$lang['mailbox']['inactive'] = 'Neaktivní';
$lang['edit']['validate_save'] = 'Ověřit a uložit';
$lang['login']['username'] = 'Uživatelské jméno';
$lang['login']['password'] = 'Heslo';
$lang['login']['login'] = 'Přihlásit';
$lang['login']['delayed'] = 'Přihlášení zpožděno o %s sekund.';
$lang['tfa']['tfa'] = "Dvoufaktorové ověřování";
$lang['tfa']['set_tfa'] = "Nastavení způsobu dvoufaktorového ověřování";
$lang['tfa']['yubi_otp'] = "Yubico OTP ověřování";
$lang['tfa']['key_id'] = "Identifikátor vašeho YubiKey";
$lang['tfa']['key_id_totp'] = "Identifikátor vašeho klíče";
$lang['tfa']['api_register'] = 'mailcow používá Yubico Cloud API. Prosím získejte API klíč pro vaše Yubico <a href="https://upgrade.yubico.com/getapikey/" target="_blank">ZDE</a>';
$lang['tfa']['u2f'] = "U2F ověřování";
$lang['tfa']['none'] = "Deaktivovat";
$lang['tfa']['delete_tfa'] = "Zakázat TFA";
$lang['tfa']['disable_tfa'] = "Zakázat TFA do příštího úspěšného přihlášení";
$lang['tfa']['confirm'] = "Potvrdit";
$lang['tfa']['totp'] = "Časově založené OTP (Google Authenticator, Authy apod.)";
$lang['tfa']['select'] = "Prosím vyberte...";
$lang['tfa']['waiting_usb_auth'] = "<i>Čeká se na USB zařízení...</i><br><br>Prosím stiskněte tlačítko na svém U2F USB zařízení.";
$lang['tfa']['waiting_usb_register'] = "<i>Čeká se na USB zařízení...</i><br><br>Prosím zadejte své heslo výše a potvrďte U2F registraci stiskem tlačítka na svém U2F USB zařízení.";
$lang['tfa']['scan_qr_code'] = "Prosím načtěte následující kód svou aplikací na ověřování nebo zadejte kód ručně.";
$lang['tfa']['enter_qr_code'] = "Váš kód TOTP, pokud vaše zařízení neumí číst QR kódy";
$lang['tfa']['confirm_totp_token'] = "Prosím potvrďte změny zadáním vygenerovaného tokenu";
$lang['admin']['rspamd-com_settings'] = '<a href="https://rspamd.com/doc/configuration/settings.html#settings-structure" target="_blank">Rspamd dokumentace</a>
- Název nastavení bude automaticky vygenerován, viz níže uvedené předvolby.';
$lang['admin']['no_new_rows'] = 'Žádné další řádky nejsou k dispozici';
$lang['admin']['queue_manager'] = 'Správce fronty';
$lang['admin']['additional_rows'] = ' dalších řádků přidáno'; // parses to 'n additional rows were added'
$lang['admin']['private_key'] = 'Soukromý klíč';
$lang['admin']['import'] = 'Importovat';
$lang['admin']['duplicate'] = 'Duplikovat';
$lang['admin']['import_private_key'] = 'Importovat soukromý klíč';
$lang['admin']['duplicate_dkim'] = 'Duplikovat DKIM záznam';
$lang['admin']['dkim_from'] = 'Od';
$lang['admin']['dkim_to'] = 'Komu';
$lang['admin']['dkim_from_title'] = 'Zdrojová doména, z níž se budou kopírovat data';
$lang['admin']['dkim_to_title'] = 'Cílová doména/y - bude přepsáno';
$lang['admin']['f2b_parameters'] = 'Nastavení Fail2ban';
$lang['admin']['f2b_ban_time'] = 'Čas blokování (s)';
$lang['admin']['f2b_max_attempts'] = 'Max. pokusů';
$lang['admin']['f2b_retry_window'] = 'Časový horizont pro maximum pokusů (s)';
$lang['admin']['f2b_netban_ipv4'] = 'Rozsah IPv4 podsítě k zablokování (8-32)';
$lang['admin']['f2b_netban_ipv6'] = 'Rozsah IPv6 podsítě k zablokování (8-128)';
$lang['admin']['f2b_whitelist'] = 'Sítě/hostitelé na whitelistu';
$lang['admin']['f2b_blacklist'] = 'Sítě/hostitelé na blacklistu';
$lang['admin']['f2b_list_info'] = 'Síť nebo hostitelé na blacklistu budou mít vždy větší váhu než položky na whitelistu. Záznamy z blacklistu jsou vytvářeny při startu kontejneru.';
$lang['admin']['search_domain_da'] = 'Hledat domény';
$lang['admin']['r_inactive'] = 'Neaktivní omezení';
$lang['admin']['r_active'] = 'Aktivní omezení';
$lang['admin']['r_info'] = 'Šedé/vypnuté položky v seznamu aktivních omezení neuznává mailcow jako platná a nelze je přesouvat. Neznámá omezení budou však budou stejně seřazena tak, jak jdou za sebou. <br>Nové prvky lze přidat do <code>inc/vars.local.inc.php</code> a pak je zde přepínat.';
$lang['admin']['dkim_key_length'] = 'Délka DKIM klíče (v bitech)';
$lang['admin']['dkim_key_valid'] = 'Klíč je platný';
$lang['admin']['dkim_key_unused'] = 'Klíč nepoužitý';
$lang['admin']['dkim_key_missing'] = 'Klíč chybí';
$lang['admin']['dkim_add_key'] = 'Přidat ARC/DKIM klíč';
$lang['admin']['dkim_keys'] = 'ARC/DKIM klíče';
$lang['admin']['dkim_private_key'] = 'Soukromý klíč';
$lang['admin']['dkim_domains_wo_keys'] = "Vybrat domény bez klíče";
$lang['admin']['dkim_domains_selector'] = "Selektor";
$lang['admin']['add'] = 'Přidat';
$lang['add']['add_domain_restart'] = 'Přidat doménu a restartovat SOGo';
$lang['add']['add_domain_only'] = 'Přidat doménu';
$lang['admin']['configuration'] = 'Nastavení';
$lang['admin']['password'] = 'Heslo';
$lang['admin']['password_repeat'] = 'Potvrzení nového hesla (opakujte)';
$lang['admin']['active'] = 'Aktivní';
$lang['admin']['inactive'] = 'Neaktivní';
$lang['admin']['action'] = 'Akce';
$lang['admin']['add_domain_admin'] = 'Přidat správce domény';
$lang['admin']['add_admin'] = 'Přidat správce';
$lang['admin']['add_settings_rule'] = 'Přidat nastavení';
$lang['admin']['rsetting_desc'] = 'Krátký popis';
$lang['admin']['rsetting_content'] = 'Obsah pravidla';
$lang['admin']['rsetting_none'] = 'Žádné pravidlo není k dispozici';
$lang['admin']['rsetting_no_selection'] = 'Prosím vyberte pravidlo';
$lang['admin']['rsettings_preset_1'] = 'Pro přihlášené uživatele vypnout vše kromě DKIM a omezení provozu';
$lang['admin']['rsettings_preset_2'] = 'Postmasteři chtějí dostávat spam';
$lang['admin']['rsettings_insert_preset'] = 'Vložit příklad nastavení "%s"';
$lang['admin']['rsetting_add_rule'] = 'Přidat pravidlo';
$lang['admin']['queue_ays'] = 'Potvrďte prosím, že chcete odstranit všechny položky z aktuální fronty.';
$lang['admin']['arrival_time'] = 'Čas zařazení do fronty (čas na serveru)';
$lang['admin']['message_size'] = 'Velikost zprávy';
$lang['admin']['sender'] = 'Odesílatel';
$lang['admin']['recipients'] = 'Příjemci';
$lang['admin']['admin_domains'] = 'Přidělené domény';
$lang['admin']['domain_admins'] = 'Správci domén';
$lang['admin']['flush_queue'] = 'Vyprázdnit frontu (opětovně doručit)';
$lang['admin']['delete_queue'] = 'Smazat vše';
$lang['admin']['queue_deliver_mail'] = 'Doručit';
$lang['admin']['queue_hold_mail'] = "Zadržet";
$lang['admin']['queue_unhold_mail'] = 'Propustit';
$lang['admin']['username'] = 'Uživatelské jméno';
$lang['admin']['edit'] = 'Upravit';
$lang['admin']['remove'] = 'Smazat';
$lang['admin']['save'] = 'Uložit změny';
$lang['admin']['admin'] = 'Správce';
$lang['admin']['admin_details'] = 'Upravit správce';
$lang['admin']['unchanged_if_empty'] = 'Pokud se nemění, ponechte prázdné';
$lang['admin']['yes'] = '&#10003;';
$lang['admin']['no'] = '&#10005;';
$lang['admin']['access'] = 'Přístupy';
$lang['admin']['no_record'] = 'Žádný záznam';
$lang['admin']['filter_table'] = 'Tabulka filtrů';
$lang['admin']['empty'] = 'Žádné výsledky';
$lang['admin']['time'] = 'Čas';
$lang['admin']['last_applied'] = 'Naposledy použité';
$lang['admin']['reset_limit'] = 'Odebrat hash';
$lang['admin']['hash_remove_info'] = 'Odebrání hashe omezení provozu (pokud stále existuje) zcela vyresetuje jeho počítadlo.<br>
Každý hash je označen jinou barvou.';
$lang['warning']['hash_not_found'] = 'Hash nenalezen';
$lang['success']['hash_deleted'] = 'Hash smazán';
$lang['admin']['authed_user'] = 'Přihlášený uživatel';
$lang['admin']['priority'] = 'Priorita';
$lang['admin']['message'] = 'Zpráva';
$lang['admin']['rate_name'] = 'Název';
$lang['admin']['refresh'] = 'Obnovit';
$lang['admin']['to_top'] = 'Zpět na začátek';
$lang['admin']['in_use_by'] = 'Používáno';
$lang['admin']['forwarding_hosts'] = 'Přeposílající hostitelé';
$lang['admin']['forwarding_hosts_hint'] = 'Příchozí zprávy od zde uvedených hostitelů jsou bezpodmínečně přijaty. Tito hostitelé nebudou kontrolováni na DNSBL, ani podrobeni greylistingu. Spam od těchto hostitelů se nikdy neodmítá, ale občas může skončit ve složce se spamem. Nejčastěji se používají pro poštovní servery, jež jsou nastaveny, aby předávaly příchozí e-maily na tento poštovní server mailcow.';
$lang['admin']['forwarding_hosts_add_hint'] = 'Lze zadat IPv4/IPv6 adresy, sítě ve formátu CIDR, názvy hostitelů (budou převedeny na IP adresy) nebo názvy domén (budou převedeny na IP pomocí SPF záznamů, příp. MX záznamů).';
$lang['admin']['relayhosts_hint'] = 'Zde definujte transporty závislé na odesílateli, jež pak můžete použít v nastavení domény.<br>
Protokol transportu je vždy "smtp:". Bere se v potaz uživatelské nastavení odchozího TLS.';
$lang['admin']['transports_hint'] = '→ Položka transportní mapy <b>přebíjí</b> transportní mapu závislou na odesílateli</b>.<br>
→ Uživatelské nastavení odchozího TLS se ignoruje a lze je výhradně vynutit mapováním TLS pravidel.<br>
→ Protokol transportu je vždy "smtp:".<br>
→ Adresy, jež odpovídají výrazu "/localhost$/", se vždy předají přes "local:", takže nejsou zahrnuty do definice cíle "*".<br>
→ Pro stanovení přihlašovacích údajů dalšího skoku, např. "[host]:25", bude Postfix <b>vždy</b> hledat nejdříve "host" a teprve pak "[host]:25". Kvůli tomu nelze použít současně "host" a "[host]:25"';
$lang['admin']['add_relayhost_hint'] = 'Pozor: jakékoliv přihlašovací údaje budou uloženy jako prostý text.';
$lang['admin']['add_transports_hint'] = 'Pozor: jakékoliv přihlašovací údaje budou uloženy jako prostý text.';
$lang['admin']['host'] = 'Hostitel';
$lang['admin']['source'] = 'Zdroj';
$lang['admin']['add_forwarding_host'] = 'Přidat předávajícího hostitele';
$lang['admin']['add_relayhost'] = 'Přidat transport závislý na odesílateli';
$lang['admin']['add_transport'] = 'Přidat transport';
$lang['admin']['relayhosts'] = 'Transporty závislé na odesílateli';
$lang['admin']['transport_maps'] = 'Mapy transportů';
$lang['admin']['routing'] = 'Směrování';
$lang['admin']['credentials_transport_warning'] = '<b>Upozornění</b>: Přidání položky do mapy transportů aktualizuje také přihlašovací údaje všech záznamů s odpovídajícím skokem.';
$lang['admin']['destination'] = 'Cíl';
$lang['admin']['nexthop'] = 'Další skok';
$lang['success']['forwarding_host_removed'] = "Předávající hostitel %s odebrán";
$lang['success']['forwarding_host_added'] = "Předávající hostitel %s přidán";
$lang['success']['relayhost_removed'] = "Položka %s odebrána";
$lang['success']['relayhost_added'] = "Položky %s přidána";
$lang['diagnostics']['dns_records'] = 'DNS záznamy';
$lang['diagnostics']['dns_records_24hours'] = 'Upozornění: Změnám v systému DNS může trvat až 24 hodin, než se na této stránce správně zobrazí jejich aktuální stav. Na této stránce můžete snadno zjistit, jak nastavit DNS záznamy a zda jsou všechny záznamy správně uloženy.';
$lang['diagnostics']['dns_records_name'] = 'Název';
$lang['diagnostics']['dns_records_type'] = 'Typ';
$lang['diagnostics']['dns_records_data'] = 'Správný záznam';
$lang['diagnostics']['dns_records_status'] = 'Současný stav';
$lang['diagnostics']['optional'] = 'Tento záznam je volitelný.';
$lang['diagnostics']['cname_from_a'] = 'Hodnota odvozena z A/AAAA záznamu. Lze použít, pokud záznam ukazuje na správný zdroj.';
$lang['admin']['relay_from'] = 'Adresa "Od:"';
$lang['admin']['relay_run'] = "Provést test";
$lang['admin']['api_allow_from'] = "Povolit přístup k API z těchto IP adres (oddělené čárkou nebo novým řádkem)";
$lang['admin']['api_key'] = "API klíč";
$lang['admin']['activate_api'] = "Zapnout API";
$lang['admin']['regen_api_key'] = "Generovat API klíč";
$lang['admin']['ban_list_info'] = "Seznam blokovaných IP adres je zobrazen níže: <b>síť (zbývající čas blokování) - [akce]</b>.<br />IP adresy zařazené pro odblokování budou z aktivního seznamu odebrány během několika sekund.<br />Červeně označené položky jsou pernamentní bloky z blacklistu.";
$lang['admin']['unban_pending'] = "čeká na odblokování";
$lang['admin']['queue_unban'] = "odblokovat";
$lang['admin']['no_active_bans'] = "Žádná aktivní blokování";
$lang['admin']['quarantine'] = "Karanténa";
$lang['admin']['rspamd_settings_map'] = "Nastavení Rspamd";
$lang['admin']['quota_notifications'] = "Upozornění na kvóty";
$lang['admin']['quota_notifications_vars'] = "{{percent}} se rovná aktuální kvótě<br>{{username}} je jméno poštovní schránky";
$lang['admin']['active_rspamd_settings_map'] = "Aktivní nastavení";
$lang['admin']['quota_notifications_info'] = "Upozornění na kvótu se uživateli odesílají při překročení 80 % a 95 % limitu.";
$lang['admin']['quarantine_retention_size'] = "Počet zadržených zpráv na poštovní schránku<br />0 znamená <b>neaktivní</b>.";
$lang['admin']['quarantine_max_size'] = "Maximální velikost v MiB (větší prvky budou smazány)<br />0 <b>neznamená</b> neomezeno.";
$lang['admin']['quarantine_exclude_domains'] = "Vyloučené domény a doménové aliasy";
$lang['admin']['quarantine_release_format'] = "Formát propuštěných položek";
$lang['admin']['quarantine_release_format_raw'] = "Nezměněný originál";
$lang['admin']['quarantine_release_format_att'] = "Jako příloha";
$lang['admin']['quarantine_notification_sender'] = "Odesílatel upozornění";
$lang['admin']['quarantine_notification_subject'] = "Předmět upozornění";
$lang['admin']['quarantine_notification_html'] = "Šablona upozornění:<br><small>Ponechte prázdné, aby se obnovila výchozí šablona.</small>";
$lang['admin']['quota_notification_sender'] = "Odesílatel upozornění";
$lang['admin']['quota_notification_subject'] = "Předmět upozornění";
$lang['admin']['quota_notification_html'] = "Šablona upozornění:<br><small>Ponechte prázdné, aby se obnovila výchozí šablona.</small>";
$lang['admin']['ui_texts'] = "Hlavička a texty UI";
$lang['admin']['help_text'] = "Přepsat text nápovědy pod přihlašovacím formulářem (HTML povoleno)";
$lang['admin']['title_name'] = 'Titulek webu ("mailcow UI")';
$lang['admin']['main_name'] = 'Název webu ("mailcow UI")';
$lang['admin']['apps_name'] = 'Hlavička aplikací ("mailcow Apps")';
$lang['admin']['customize'] = "Přizpůsobení";
$lang['admin']['change_logo'] = "Změnit logo";
$lang['admin']['logo_info'] = "Obrázek bude zmenšen na výšku 40 pixelů pro horní navigační lištu a na max. šířku 250 pixelů pro úvodní stránku.";
$lang['admin']['upload'] = "Nahrát";
$lang['admin']['app_links'] = "Odkazy na aplikace";
$lang['admin']['app_name'] = "Název aplikace";
$lang['admin']['link'] = "Odkaz";
$lang['admin']['remove_row'] = "Smazat řádek";
$lang['admin']['add_row'] = "Přidat řádek";
$lang['admin']['reset_default'] = "Obnovit výchozí nastavení";
$lang['admin']['merged_vars_hint'] = 'Šedé řádky byly přidány z <code>vars.(local.)inc.php</code> a nelze je upravit.';
$lang['mailbox']['waiting'] = "Čekání";
$lang['mailbox']['status'] = "Stav";
$lang['mailbox']['running'] = "Běží";
$lang['mailbox']['enable_x'] = "Zapnout";
$lang['mailbox']['disable_x'] = "Vypnout";
$lang['edit']['spam_score'] = "Nastavte vlastní skóre spamu";
$lang['user']['spam_score_reset'] = "Obnovit výchozí nastavení serveru";
$lang['edit']['spam_policy'] = "Přidat nebo odebrat položky whitelistu/blacklistu";
$lang['edit']['spam_alias'] = "Vytvořit nebo změnit dočasné aliasy";
$lang['danger']['comment_too_long'] = "Moc dlouhý komentář, max. 160 znaků";
$lang['danger']['img_tmp_missing'] = "Nelze ověřit soubor s obrázkem: dočasný soubor nebyl nalezen";
$lang['danger']['img_invalid'] = "Nelze ověřit soubor s obrázkem";
$lang['danger']['invalid_mime_type'] = "Špatný mime typ";
$lang['success']['upload_success'] = "Soubor úspěšně nahrán";
$lang['success']['app_links'] = "Změny odkazů na aplikace uloženy";
$lang['success']['ui_texts'] = "Změny UI textů uloženy";
$lang['success']['reset_main_logo'] = "Obnovit výchozí logo";
$lang['success']['items_released'] = "Vybraná položka propuštěna";
$lang['success']['item_released'] = "Položka %s propuštěna";
$lang['danger']['imagick_exception'] = "Chyba: Výjimka programu Imagick při čtení obrázku";
$lang['quarantine']['quarantine'] = "Karanténa";
$lang['quarantine']['learn_spam_delete'] = "Naučit jako spam a smazat";
$lang['quarantine']['qinfo'] = 'Karanténní systém uloží odmítnutou poštu do databáze a odesílatel <em>nebude</em> informován o nedoručené poště.
<br>"' . $lang['quarantine']['learn_spam_delete'] . '" naučí systém, že zpráva je spam, pomocí Bayes teorému a také vypočítá "fuzzy hashes" pro odmítnutí podobných zpráv v budoucnu.
<br>Upozornění: Učení se vícera zpráv najednou může být v závislosti na výkonu systému časově náročné.';
$lang['quarantine']['release'] = "Propustit";
$lang['quarantine']['empty'] = 'Žádné výsledky';
$lang['quarantine']['toggle_all'] = 'Označit vše';
$lang['quarantine']['quick_actions'] = 'Akce';
$lang['quarantine']['remove'] = 'Smazat';
$lang['quarantine']['received'] = "Přijato";
$lang['quarantine']['action'] = "Akce";
$lang['quarantine']['rcpt'] = "Příjemce";
$lang['quarantine']['qid'] = "Rspamd QID";
$lang['quarantine']['sender'] = "Odesílatel";
$lang['quarantine']['show_item'] = "Zobrazit položku";
$lang['quarantine']['check_hash'] = "Hledat hash na serveru VT";
$lang['quarantine']['qitem'] = "Položka v karanténě";
$lang['quarantine']['subj'] = "Předmět";
$lang['quarantine']['recipients'] = "Příjemci";
$lang['quarantine']['text_plain_content'] = "Obsah (text/plain)";
$lang['quarantine']['text_from_html_content'] = "Obsah (konvertované html)";
$lang['quarantine']['atts'] = "Přílohy";
$lang['quarantine']['low_danger'] = "Malé nebezpečí";
$lang['quarantine']['neutral_danger'] = "Neutrální nebo žádné hodnocení";
$lang['quarantine']['medium_danger'] = "Střední nebezpečí";
$lang['quarantine']['high_danger'] = "Vysoké nebezpečí";
$lang['quarantine']['danger'] = "Nebezpečí";
$lang['quarantine']['spam_score'] = "Skóre";
$lang['quarantine']['confirm_delete'] = "Potvrdit smazání prvku.";
$lang['quarantine']['qhandler_success'] = "Požadavek úspěšně přijat. Můžete nyní zavřít okno.";
$lang['warning']['fuzzy_learn_error'] = "Chyba při učení Fuzzy hash: %s";
$lang['danger']['spam_learn_error'] = "Chyba při učení spamu: %s";
$lang['success']['qlearn_spam'] = "Zpráva ID %s naučena jako spam a smazána";
$lang['debug']['system_containers'] = 'Systém a kontejnery';
$lang['debug']['solr_status'] = 'Stav Solr';
$lang['debug']['solr_dead'] = 'Solr se spouští, je vypnutý nebo spadl.';
$lang['debug']['logs'] = 'Logy';
$lang['debug']['log_info'] = '<p><b>Logy v paměti</b> jsou shromažďovány v Redis seznamech a jsou oříznuty na LOG_LINES (%d) každou minutu, aby se nepřetěžoval server.
<br>Logy v paměti nemají být trvalé. Všechny aplikace, které logují do paměti, zároveň logují i do Docker služby podle nastavení logging driveru.
<br>Logy v paměti lze použít pro ladění drobných problémů s kontejnery.</p>
<p><b>Externí logy</b> jsou shromažďovány pomocí API dané aplikace.</p>
<p><b>Statické logy</b> jsou většinou logy činností, které nejsou zaznamenávány do Docker služby, ale přesto je dobré je schraňovat (výjimkou jsou logy API).</p>';
$lang['debug']['in_memory_logs'] = 'Logy v paměti';
$lang['debug']['external_logs'] = 'Externí logy';
$lang['debug']['static_logs'] = 'Statické logy';
$lang['debug']['solr_uptime'] = 'Doba běhu';
$lang['debug']['solr_started_at'] = 'Spuštěn';
$lang['debug']['solr_last_modified'] = 'Naposledy změněn';
$lang['debug']['solr_size'] = 'Velikost';
$lang['debug']['solr_docs'] = 'Dokumentace';
$lang['debug']['disk_usage'] = 'Využití disku';
$lang['debug']['containers_info'] = "Informace o kontejnerech";
$lang['debug']['restart_container'] = 'Restartovat';
$lang['quarantine']['release_body'] = "Zpráva připojena jako příloha EML k této zprávě.";
$lang['danger']['release_send_failed'] = "Zprávu nelze propustit: %s";
$lang['quarantine']['release_subject'] = "Potenciálně škodlivá položka v karanténě %s";
$lang['mailbox']['bcc_map'] = "BCC mapování";
$lang['mailbox']['bcc_map_type'] = "Typ BCC";
$lang['mailbox']['bcc_type'] = "Typ BCC";
$lang['mailbox']['bcc_sender_map'] = "Mapa odesílatelů";
$lang['mailbox']['bcc_rcpt_map'] = "Mapa příjemců";
$lang['mailbox']['bcc_local_dest'] = "Místní cíl";
$lang['mailbox']['bcc_destinations'] = "BCC cíl";
$lang['mailbox']['bcc_destination'] = "BCC cíl";
$lang['edit']['bcc_dest_format'] = 'BCC cíl musí být jedna platná email adresa.';
$lang['mailbox']['bcc'] = "BCC";
$lang['mailbox']['bcc_maps'] = "BCC mapy";
$lang['mailbox']['bcc_to_sender'] = "Přepnout na mapu odesílatelů";
$lang['mailbox']['bcc_to_rcpt'] = "Přepnout na mapu příjemců";
$lang['mailbox']['add_bcc_entry'] = "Přidat BCC mapu";
$lang['mailbox']['add_tls_policy_map'] = "Přidat mapu TLS pravidel";
$lang['mailbox']['bcc_info'] = "Mapa BCC se používá pro tiché předávání kopií všech zpráv na jinou adresu. Mapa příjemců se používá, pokud je místní cíl příjemcem zprávy.<br/>
Mapa odesílatelů podléhá stejnému principu. Místní cíl nebude informován o neúspěšném doručení.";
$lang['mailbox']['address_rewriting'] = 'Přepisování adres';
$lang['mailbox']['recipient_maps'] = 'Mapy příjemců';
$lang['mailbox']['recipient_map'] = 'Mapa příjemce';
$lang['mailbox']['recipient_map_info'] = 'Mapy příjemců slouží k nahrazení cílové adresy zprávy před doručením.';
$lang['mailbox']['recipient_map_old_info'] = 'Původní příjemce musí být platná emailová adresa nebo název domény.';
$lang['mailbox']['recipient_map_new_info'] = 'Cílová adresa mapy příjemce musí být platná emailová adresa.';
$lang['mailbox']['recipient_map_old'] = 'Původní příjemce';
$lang['mailbox']['recipient_map_new'] = 'Nový přijemce';
$lang['danger']['invalid_recipient_map_new'] = 'Neplatný nový příjemce: %s';
$lang['danger']['invalid_recipient_map_old'] = 'Neplatný původní příjemce: %s';
$lang['danger']['recipient_map_entry_exists'] = 'Položka mapy příjemců "%s" již existuje';
$lang['success']['recipient_map_entry_saved'] = 'Položka mapy příjemců "%s" uložena';
$lang['success']['recipient_map_entry_deleted'] = 'Položka mapy ID %s smazána';
$lang['danger']['tls_policy_map_entry_exists'] = 'Položka mapy TLS pravidel "%s" již existuje';
$lang['success']['tls_policy_map_entry_saved'] = 'Položka mapy TLS pravidel "%s" uložena';
$lang['success']['tls_policy_map_entry_deleted'] = 'Položka mapy TLS pravidel ID %s smazána';
$lang['mailbox']['add_recipient_map_entry'] = 'Přidat mapu příjemce';
$lang['danger']['tls_policy_map_parameter_invalid'] = "Parametr pravidel TLS je neplatný";
$lang['danger']['temp_error'] = "Dočasná chyba";
$lang['oauth2']['scope_ask_permission'] = 'Aplikace požádala o následující oprávnění';
$lang['oauth2']['profile'] = 'Profil';
$lang['oauth2']['profile_desc'] = 'Zobrazení osobních informací: uživatelské jméno, celé jméno, vytvořeno, upraveno, aktivní';
$lang['oauth2']['permit'] = 'Ověření aplikace';
$lang['oauth2']['authorize_app'] = 'Ověření aplikace';
$lang['oauth2']['deny'] = 'Zakázáno';
$lang['oauth2']['access_denied'] = 'Pro povolení přístupu přes OAuth2 se přihlaste jako vlastník poštovní schránky.';
$lang['admin']['sys_mails'] = 'Systémové zprávy';
$lang['admin']['subject'] = 'Předmět';
$lang['admin']['from'] = 'Od';
$lang['admin']['include_exclude'] = 'Zahrnout/Vyloučit';
$lang['admin']['include_exclude_info'] = 'Ve výchozím nastavení (bez výběru), jsou adresovány <b>všechny poštovní schránky</b>';
$lang['admin']['excludes'] = 'Vyloučit tyto příjemce';
$lang['admin']['includes'] = 'Zahrnout tyto přijemce';
$lang['admin']['text'] = 'Text';
$lang['admin']['activate_send'] = 'Povolit tlačítko "Odeslat"';
$lang['admin']['send'] = 'Odeslat';
$lang['warning']['ip_invalid'] = 'Přeskočena neplatná IP: %s';
$lang['danger']['text_empty'] = 'Text nesmí být prázdný';
$lang['danger']['subject_empty'] = 'Předmět nesmí být prázdný';
$lang['danger']['from_invalid'] = 'Odesílatel nesmí být prázdný';
$lang['danger']['network_host_invalid'] = 'Neplatná síť nebo hostitel: %s';
$lang['add']['mailbox_quota_def'] = 'Výchozí kvóta schránky';
$lang['edit']['mailbox_quota_def'] = 'Výchozí kvóta schránky';
$lang['danger']['mailbox_defquota_exceeds_mailbox_maxquota'] = 'Výchozí kvóta překračuje maximální kvótu schránky"';
$lang['danger']['defquota_empty'] = 'Výchozí kvóta schránky nesmí být 0.';
$lang['mailbox']['mailbox_defquota'] = 'Výchozí velikost schránky';
$lang['admin']['api_info'] = 'API je stále ve vývoji.';
$lang['admin']['guid_and_license'] = 'GUID a licence';
$lang['admin']['guid'] = 'GUID - unique instance ID';
$lang['admin']['license_info'] = 'Vlastnit licenci není povinné, ale pomáhá to v dalšímu vývoji.<br><a href="https://www.servercow.de/mailcow?lang=en#sal" target="_blank" alt="SAL order">Registrujte si svoje GUID zde</a>, nebo si <a href="https://www.servercow.de/mailcow?lang=en#support" target="_blank" alt="Support order">zaplaťte podporu pro svou instalaci mailcow.</a>';
$lang['admin']['validate_license_now'] = 'Ověřit GUID na licenčním serveru';
$lang['admin']['customer_id'] = 'ID zákazníka';
$lang['admin']['service_id'] = 'ID podpory';
$lang['admin']['lookup_mx'] = 'Ověřit cíl proti MX záznamu (.outlook.com bude směrovat všechnu poštu pro MX *.outlook.com přes tento uzel)';
$lang['edit']['mbox_rl_info'] = 'Toto omezení provozu se vyhodnocuje podle přihlašovacího jména SASL, porovnává se s jakoukoliv adresou "od" použitou přihlášeným uživatelem. Omezení provozu poštovní schránku má prioritu před omezením provozu domény.';
$lang['add']['relayhost_wrapped_tls_info'] = '<b>Nepoužívejte</b> prosím porty s aktivním protokolem TLS (většinou port 465).<br>
Používejte porty bez TLS a pak pošlete příkaz STARTTLS. Pravidlo k vynucení užití TLS lze vytvořit pomocí mapy TLS pravidel".';
$lang['admin']['transport_dest_format'] = 'Formát: example.org, .example.org, *, box@example.org (vícero položek lze oddělit čárkou)';
$lang['mailbox']['alias_domain_backupmx'] = 'Doménový alias není aktivní pro předávanou doménu';
$lang['danger']['extra_acl_invalid'] = 'Externí adresa odesílatele "%s" je neplatná';
$lang['danger']['extra_acl_invalid_domain'] = 'Externí adresa odesílatele "%s" má neplatnou doménu';
diff --git a/data/web/lang/lang.de.php b/data/web/lang/lang.de.php
index ef1b682e..dadfb8de 100644
--- a/data/web/lang/lang.de.php
+++ b/data/web/lang/lang.de.php
@@ -1,914 +1,914 @@
<?php
/*
* German language file
*/
$lang['footer']['loading'] = 'Einen Moment bitte...';
$lang['header']['restart_sogo'] = 'SOGo neustarten';
$lang['header']['restart_netfilter'] = 'Netfilter neustarten';
$lang['footer']['restart_container'] = 'Container neustarten';
$lang['footer']['restart_now'] = 'Jetzt neustarten';
$lang['footer']['restarting_container'] = 'Container wird neugestartet, bitte warten...';
$lang['footer']['restart_container_info'] = '<b>Wichtig:</b> Der Neustart eines Containers kann eine Weile in Anspruch nehmen.';
$lang['footer']['confirm_delete'] = 'Löschen bestätigen';
$lang['footer']['delete_these_items'] = 'Sind Sie sicher, dass die Änderungen an Elementen mit folgender ID durchgeführt werden sollen?';
$lang['footer']['delete_now'] = 'Jetzt löschen';
$lang['footer']['cancel'] = 'Abbrechen';
$lang['footer']['hibp_nok'] = 'Übereinstimmung gefunden! Dieses Passwort ist potentiell gefährlich!';
$lang['footer']['hibp_ok'] = 'Keine Übereinstimmung gefunden.';
$lang['danger']['transport_dest_exists'] = 'Transport Maps Ziel "%s" existiert bereits';
$lang['danger']['unlimited_quota_acl'] = "Unendliche Quota untersagt durch ACL";
$lang['danger']['mysql_error'] = "MySQL Fehler: %s";
$lang['danger']['redis_error'] = "Redis Fehler: %s";
$lang['danger']['unknown_tfa_method'] = "Unbekannte TFA Methode";
$lang['danger']['totp_verification_failed'] = "TOTP Verifizierung fehlgeschlagen";
$lang['success']['verified_totp_login'] = "TOTP Anmeldung verifiziert";
$lang['danger']['u2f_verification_failed'] = "U2F Verifizierung fehlgeschlagen: %s";
$lang['success']['verified_u2f_login'] = "U2F Anmeldung verifiziert";
$lang['success']['verified_yotp_login'] = "Yubico OTP Anmeldung verifiziert";
$lang['danger']['yotp_verification_failed'] = "Yubico OTP Verifizierung fehlgeschlagen: %s";
$lang['danger']['ip_list_empty'] = "Liste erlaubter IPs darf nicht leer sein";
$lang['danger']['invalid_destination'] = 'Ziel-Format "%s" ist ungültig';
$lang['danger']['invalid_nexthop'] = "Next Hop ist ungültig";
$lang['danger']['invalid_nexthop_authenticated'] = 'Dieser Next Hop existiert bereits mit abweichenden Authentifizierungsdaten. Die bestehenden Authentifizierungsdaten dieses "Next Hops" müssen vorab angepasst werden.';
$lang['danger']['next_hop_interferes'] = "%s verhindert das Hinzufügen von Next Hop %s";
$lang['danger']['next_hop_interferes_any'] = "Ein vorhandener Eintrag verhindert das Hinzufügen von Next Hop %s";
$lang['danger']['rspamd_ui_pw_length'] = "Rspamd UI Passwort muss mindestens 6 Zeichen lang sein";
$lang['success']['rspamd_ui_pw_set'] = "Rspamd UI Passwort wurde gesetzt";
$lang['success']['queue_command_success'] = "Queue-Aufgabe erfolgreich ausgeführt";
$lang['danger']['unknown'] = "Ein unbekannter Fehler trat auf";
$lang['danger']['malformed_username'] = "Benutzername hat ein falsches Format";
$lang['info']['awaiting_tfa_confirmation'] = "Warte auf TFA Verifizierung";
$lang['info']['session_expires'] = "Die Sitzung wird in etwa 15 Sekunden beendet";
$lang['success']['logged_in_as'] = "Eingeloggt als %s";
$lang['danger']['login_failed'] = "Anmeldung fehlgeschlagen";
$lang['danger']['set_acl_failed'] = "ACL konnte nicht gesetzt werden";
$lang['danger']['no_user_defined'] = "Kein Benutzer definiert";
$lang['danger']['script_empty'] = "Script darf nicht leer sein";
$lang['danger']['sieve_error'] = "Sieve Parser: %s";
$lang['danger']['value_missing'] = "Bitte alle Felder ausfüllen";
$lang['danger']['filter_type'] = "Falscher Filtertyp";
$lang['danger']['domain_cannot_match_hostname'] = "Domain darf nicht dem Hostnamen entsprechen";
$lang['warning']['domain_added_sogo_failed'] = "Domain wurde hinzugefügt, aber SOGo konnte nicht neugestartet werden";
$lang['danger']['rl_timeframe'] = "Ratelimit Zeitraum ist inkorrekt";
$lang['success']['rl_saved'] = "Ratelimit für Objekt %s wurde gesetzt";
$lang['success']['acl_saved'] = "ACL für Objekt %s wurde gesetzt";
$lang['success']['deleted_syncjobs'] = "Syncjobs gelöscht: %s";
$lang['success']['deleted_syncjob'] = "Syncjobs ID %s gelöscht";
$lang['success']['delete_filters'] = "Filter gelöscht: %s";
$lang['success']['delete_filter'] = "Filter ID %s wurde gelöscht";
$lang['danger']['invalid_bcc_map_type'] = "Ungültiger BCC Map-Typ";
$lang['danger']['bcc_empty'] = "BCC Ziel darf nicht leer sein";
$lang['danger']['bcc_must_be_email'] = "BCC Ziel %s ist keine gültige E-Mail-Adresse";
$lang['danger']['bcc_exists'] = "Ein BCC Map Eintrag %s existiert bereits als Typ %s";
$lang['success']['bcc_saved'] = "BCC Map Eintrag wurde gespeichert";
$lang['success']['bcc_edited'] = "BCC Map Eintrag %s wurde editiert";
$lang['success']['bcc_deleted'] = "BCC Map Einträge gelöscht: %s";
$lang['danger']['private_key_error'] = "Schlüsselfehler: %s";
$lang['danger']['map_content_empty'] = "Inhalt darf nicht leer sein";
$lang['success']['settings_map_added'] = "Regel wurde gespeichert";
$lang['danger']['settings_map_invalid'] = "Regel ID %s ist ungültig";
$lang['success']['settings_map_removed'] = "Regeln wurden entfernt: %s";
$lang['danger']['invalid_host'] = "Ungültiger Host: %s";
$lang['danger']['relayhost_invalid'] = "Mapeintrag %s ist ungültig";
$lang['success']['saved_settings'] = "Regel wurde gespeichert";
$lang['danger']['dkim_domain_or_sel_invalid'] = 'DKIM-Domain oder Selektor nicht korrekt: %s';
$lang['success']['dkim_removed'] = 'DKIM-Key %s wurde entfernt';
$lang['success']['dkim_added'] = 'DKIM-Key %s wurde hinzugefügt';
$lang['success']['dkim_duplicated'] = "DKIM-Key der Domain %s wurde auf Domain %s kopiert";
$lang['danger']['access_denied'] = 'Zugriff verweigert oder unvollständige/ungültige Daten';
$lang['danger']['domain_invalid'] = 'Domainname ist leer oder ungültig';
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = 'Maximale Größe für Mailboxen überschreitet das Domain Speicherlimit';
$lang['danger']['object_is_not_numeric'] = 'Wert %s ist nicht numerisch';
$lang['success']['domain_added'] = 'Domain %s wurde angelegt';
$lang['success']['items_deleted'] = "Objekt(e) %s wurde(n) erfolgreich entfernt";
$lang['success']['item_deleted'] = "Objekt %s wurde entfernt";
$lang['danger']['alias_empty'] = 'Alias-Adresse darf nicht leer sein';
$lang['danger']['goto_empty'] = 'Ziel-Adresse darf nicht leer sein';
$lang['danger']['policy_list_from_exists'] = 'Ein Eintrag mit diesem Wert existiert bereits';
$lang['danger']['policy_list_from_invalid'] = 'Eintrag hat ein ungültiges Format';
$lang['danger']['alias_invalid'] = 'Alias-Adresse %s ist ungültig';
$lang['danger']['goto_invalid'] = 'Ziel-Adresse %s ist ungültig';
$lang['danger']['last_key'] = 'Letzter Key kann nicht gelöscht werden';
$lang['danger']['alias_domain_invalid'] = 'Alias-Domain %s ist ungültig';
$lang['danger']['target_domain_invalid'] = 'Ziel-Domain %s ist ungültig';
$lang['danger']['object_exists'] = 'Objekt %s existiert bereits';
$lang['danger']['domain_exists'] = 'Domain %s existiert bereits';
$lang['danger']['alias_goto_identical'] = 'Alias- und Ziel-Adresse dürfen nicht identisch sein';
$lang['danger']['aliasd_targetd_identical'] = 'Alias-Domain darf nicht gleich Ziel-Domain sein: %s';
$lang['danger']['maxquota_empty'] = 'Max. Speicherplatz pro Mailbox darf nicht 0 sein.';
$lang['success']['alias_added'] = 'Alias-Adresse %s wurden angelegt';
$lang['success']['alias_modified'] = 'Änderungen an Alias %s wurden gespeichert';
$lang['success']['aliasd_modified'] = 'Änderungen an Alias-Domain %s wurden gespeichert';
$lang['success']['mailbox_modified'] = 'Änderungen an Mailbox %s wurden gespeichert';
$lang['success']['resource_modified'] = "Änderungen an Ressource %s wurden gespeichert";
$lang['success']['object_modified'] = "Änderungen an Objekt %s wurden gespeichert";
$lang['success']['f2b_modified'] = "Änderungen an Fail2ban-Parametern wurden gespeichert";
$lang['danger']['targetd_not_found'] = 'Ziel-Domain %s nicht gefunden';
$lang['danger']['targetd_relay_domain'] = 'Ziel-Domain %s ist eine Relay-Domain';
$lang['success']['aliasd_added'] = 'Alias-Domain %s wurde angelegt';
$lang['success']['aliasd_modified'] = 'Änderungen an Alias-Domain %s wurden gespeichert';
$lang['success']['domain_modified'] = 'Änderungen an Domain %s wurden gespeichert';
$lang['success']['domain_admin_modified'] = 'Änderungen an Domain-Administrator %s wurden gespeichert';
$lang['success']['domain_admin_added'] = 'Domain-Administrator %s wurde angelegt';
$lang['success']['admin_added'] = 'Administrator %s wurde angelegt';
$lang['success']['admin_modified'] = 'Änderungen am Administrator wurden gespeichert';
$lang['success']['admin_api_modified'] = "Änderungen an API wurden gespeichert";
$lang['success']['license_modified'] = "Änderungen an Lizenz wurden gespeichert";
$lang['danger']['username_invalid'] = 'Benutzername %s kann nicht verwendet werden';
$lang['danger']['password_mismatch'] = 'Passwort-Wiederholung stimmt nicht überein';
$lang['danger']['password_complexity'] = 'Passwort entspricht nicht den Richtlinien';
$lang['danger']['password_empty'] = 'Passwort darf nicht leer sein';
$lang['danger']['login_failed'] = 'Anmeldung fehlgeschlagen';
$lang['danger']['mailbox_invalid'] = 'Mailboxname ist ungültig';
$lang['danger']['resource_invalid'] = 'Ressourcenname %s ist ungültig';
$lang['danger']['description_invalid'] = 'Ressourcenbeschreibung für %s ist ungültig';
$lang['danger']['is_alias'] = '%s lautet bereits eine Alias-Adresse';
$lang['danger']['is_alias_or_mailbox'] = "Eine Mailbox, ein Alias oder eine sich aus einer Alias-Domain ergebende Adresse mit dem Namen %s ist bereits vorhanden";
$lang['danger']['is_spam_alias'] = '%s lautet bereits eine Spam-Alias-Adresse';
$lang['danger']['quota_not_0_not_numeric'] = 'Speicherplatz muss numerisch und >= 0 sein';
$lang['danger']['domain_not_found'] = 'Domain %s nicht gefunden';
$lang['danger']['max_mailbox_exceeded'] = 'Anzahl an Mailboxen überschritten (%d von %d)';
$lang['danger']['max_alias_exceeded'] = 'Anzahl an Alias-Adressen überschritten';
$lang['danger']['mailbox_quota_exceeded'] = 'Speicherplatz überschreitet das Limit (max. %d MiB)';
$lang['danger']['mailbox_quota_left_exceeded'] = 'Nicht genügend Speicherplatz vorhanden (Speicherplatz anwendbar: %d MiB)';
$lang['success']['mailbox_added'] = 'Mailbox %s wurde angelegt';
$lang['success']['resource_added'] = 'Ressource %s wurde angelegt';
$lang['success']['domain_removed'] = 'Domain %s wurde entfernt';
$lang['success']['alias_removed'] = 'Alias-Adresse %s wurde entfernt';
$lang['success']['alias_domain_removed'] = 'Alias-Domain %s wurde entfernt';
$lang['success']['domain_admin_removed'] = 'Domain-Administrator %s wurde entfernt';
$lang['success']['admin_removed'] = 'Administrator %s wurde entfernt';
$lang['success']['mailbox_removed'] = 'Mailbox %s wurde entfernt';
$lang['success']['eas_reset'] = "ActiveSync Gerät des Benutzers %s wurde zurückgesetzt";
$lang['success']['sogo_profile_reset'] = "ActiveSync Gerät des Benutzers %s wurde zurückgesetzt";
$lang['success']['resource_removed'] = 'Ressource %s wurde entfernt';
$lang['warning']['cannot_delete_self'] = 'Kann derzeit eingeloggten Benutzer nicht entfernen';
$lang['warning']['no_active_admin'] = 'Kann letzten aktiven Administrator nicht deaktivieren';
$lang['danger']['max_quota_in_use'] = 'Mailbox Speicherplatzlimit muss größer oder gleich %d MiB sein';
$lang['danger']['domain_quota_m_in_use'] = 'Domain Speicherplatzlimit muss größer oder gleich %d MiB sein';
$lang['danger']['mailboxes_in_use'] = 'Maximale Anzahl an Mailboxen muss größer oder gleich %d sein';
$lang['danger']['aliases_in_use'] = 'Maximale Anzahl an Aliassen muss größer oder gleich %d sein';
$lang['danger']['sender_acl_invalid'] = 'Sender ACL %s ist ungültig';
$lang['danger']['domain_not_empty'] = 'Domain %s ist nicht leer';
$lang['danger']['validity_missing'] = 'Bitte geben Sie eine Gültigkeitsdauer an';
$lang['user']['loading'] = "Lade...";
$lang['user']['force_pw_update'] = 'Das Passwort für diesen Benutzer <b>muss</b> geändert werden, damit die Zugriffssperre auf die Groupwarekomponenten wieder freigeschaltet wird.';
$lang['user']['active_sieve'] = "Aktiver Filter";
$lang['user']['show_sieve_filters'] = "Zeige aktiven Filter des Benutzers";
$lang['user']['no_active_filter'] = "Kein aktiver Filter vorhanden";
$lang['user']['messages'] = "Nachrichten";
$lang['user']['in_use'] = "Verwendet";
$lang['user']['user_change_fn'] = '';
$lang['user']['user_settings'] = 'Benutzereinstellungen';
$lang['user']['mailbox_details'] = 'Mailbox-Details';
$lang['user']['change_password'] = 'Passwort ändern';
$lang['user']['client_configuration'] = 'Konfigurationsanleitungen für E-Mail-Programme und Smartphones anzeigen';
$lang['user']['new_password'] = 'Neues Passwort';
$lang['user']['save_changes'] = 'Änderungen speichern';
$lang['user']['password_now'] = 'Aktuelles Passwort (Änderungen bestätigen)';
$lang['user']['new_password_repeat'] = 'Neues Passwort (Wiederholung)';
$lang['user']['new_password_description'] = 'Mindestanforderung: 6 Zeichen lang, Buchstaben und Zahlen.';
$lang['user']['spam_aliases'] = 'Temporäre E-Mail Aliasse';
$lang['user']['alias'] = 'Alias';
$lang['user']['shared_aliases'] = 'Geteilte Alias-Adressen';
$lang['user']['shared_aliases_desc'] = 'Geteilte Alias-Adressen werden nicht bei benutzerdefinierten Einstellungen, wie die des Spam-Filters oder der Verschlüsselungsrichtlinie, berücksichtigt. Entsprechende Spam-Filter können lediglich von einem Administrator vorgenommen werden.';
$lang['user']['direct_aliases'] = 'Direkte Alias-Adressen';
$lang['user']['direct_aliases_desc'] = 'Nur direkte Alias-Adressen werden für benutzerdefinierte Einstellungen berücksichtigt.';
$lang['user']['is_catch_all'] = 'Ist Catch-All Adresse für Domain(s)';
$lang['user']['aliases_also_send_as'] = 'Darf außerdem versenden als Benutzer';
$lang['user']['aliases_send_as_all'] = 'Absender für folgende Domains und zugehörige Alias-Domains nicht prüfen';
$lang['user']['alias_create_random'] = 'Zufälligen Alias generieren';
$lang['user']['alias_extend_all'] = 'Gültigkeit +1h';
$lang['user']['alias_valid_until'] = 'Gültig bis';
$lang['user']['alias_remove_all'] = 'Alle entfernen';
$lang['user']['alias_time_left'] = 'Zeit verbleibend';
$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
$lang['user']['alias_select_validity'] = 'Bitte Gültigkeit auswählen';
$lang['user']['sync_jobs'] = 'Sync Jobs';
$lang['user']['expire_in'] = 'Ungültig in';
$lang['user']['hour'] = 'Stunde';
$lang['user']['hours'] = 'Stunden';
$lang['user']['day'] = 'Tag';
$lang['user']['week'] = 'Woche';
$lang['user']['weeks'] = 'Wochen';
$lang['user']['spamfilter'] = 'Spamfilter';
$lang['admin']['spamfilter'] = 'Spamfilter';
$lang['user']['spamfilter_wl'] = 'Whitelist';
$lang['user']['spamfilter_wl_desc'] = 'Für E-Mail-Adressen, die vom Spamfilter <b>nicht</b> erfasst werden sollen. Die Verwendung von Wildcards ist gestattet. Ein Filter funktioniert lediglich für direkte nicht-"Catch All" Alias-Adressen (Alias-Adressen mit lediglich einer Mailbox als Ziel-Adresse) sowie die Mailbox-Adresse selbst.';
$lang['user']['spamfilter_bl'] = 'Blacklist';
$lang['user']['spamfilter_bl_desc'] = 'Für E-Mail-Adressen, die vom Spamfilter <b>immer</b> als Spam erfasst und abgelehnt werden. Die Verwendung von Wildcards ist gestattet. Ein Filter funktioniert lediglich für direkte nicht-"Catch All" Alias-Adressen (Alias-Adressen mit lediglich einer Mailbox als Ziel-Adresse) sowie die Mailbox-Adresse selbst.';
$lang['user']['spamfilter_table_rule'] = 'Regel';
$lang['user']['spamfilter_table_action'] = 'Aktion';
$lang['user']['spamfilter_table_empty'] = 'Keine Einträge vorhanden';
$lang['user']['spamfilter_table_remove'] = 'Entfernen';
$lang['user']['spamfilter_table_add'] = 'Eintrag hinzufügen';
$lang['user']['spamfilter_behavior'] = 'Bewertung';
$lang['user']['spamfilter_green'] = 'Grün: Die Nachricht ist kein Spam';
$lang['user']['spamfilter_yellow'] = 'Gelb: Die Nachricht ist vielleicht Spam, wird als Spam markiert und in den Junk-Ordner verschoben';
$lang['user']['spamfilter_red'] = 'Rot: Die Nachricht ist eindeutig Spam und wird vom Server abgelehnt';
$lang['user']['spamfilter_default_score'] = 'Standardwert';
$lang['user']['spamfilter_hint'] = 'Der erste Wert beschreibt den "low spam score", der zweite Wert den "high spam score".';
$lang['user']['spamfilter_table_domain_policy'] = "n.v. (Domainrichtlinie)";
$lang['user']['waiting'] = "Warte auf Ausführung";
$lang['user']['status'] = "Status";
$lang['user']['running'] = "Wird ausgeführt";
$lang['user']['tls_policy_warning'] = '<strong>Vorsicht:</strong> Entscheiden Sie sich unverschlüsselte Verbindungen abzulehnen, kann dies dazu führen, dass Kontakte Sie nicht mehr erreichen.<br>Nachrichten, die die Richtlinie nicht erfüllen, werden durch einen Hard-Fail im Mailsystem abgewiesen.<br>Diese Einstellung ist aktiv für die primäre Mailbox, für alle Alias-Adressen, die dieser Mailbox <b>direkt zugeordnet</b> sind (lediglich eine einzige Ziel-Adresse) und der Adressen, die sich aus Alias-Domains ergeben. Ausgeschlossen sind temporäre Aliasse ("Spam-Alias-Adressen"), Catch-All Alias-Adressen sowie Alias-Adressen mit mehreren Zielen.';
$lang['user']['tls_policy'] = 'Verschlüsselungsrichtlinie';
$lang['user']['tls_enforce_in'] = 'TLS eingehend erzwingen';
$lang['user']['tls_enforce_out'] = 'TLS ausgehend erzwingen';
$lang['user']['no_record'] = 'Kein Eintrag';
$lang['user']['tag_handling'] = 'Umgang mit getaggten E-Mails steuern';
$lang['user']['tag_in_subfolder'] = 'In Unterordner';
$lang['user']['tag_in_subject'] = 'In Betreff';
$lang['user']['tag_in_none'] = 'Nichts tun';
$lang['user']['tag_help_explain'] = 'Als Unterordner: Es wird ein Ordner mit dem Namen des Tags unterhalb der Inbox erstellt ("INBOX/Facebook").<br>
In Betreff: Der Name des Tags wird dem Betreff angefügt, etwa "[Facebook] Meine Neuigkeiten".';
$lang['user']['tag_help_example'] = 'Beispiel für eine getaggte E-Mail-Adresse: ich<b>+Facebook</b>@example.org';
$lang['user']['eas_reset'] = 'ActiveSync Geräte-Cache zurücksetzen';
$lang['user']['eas_reset_now'] = 'Jetzt zurücksetzen';
$lang['user']['eas_reset_help'] = 'In vielen Fällen kann ein ActiveSync Profil durch das Zurücksetzen des Caches repariert werden.<br><b>Vorsicht:</b> Alle Elemente werden erneut heruntergeladen!';
$lang['user']['sogo_profile_reset'] = 'SOGo Profil zurücksetzen';
$lang['user']['sogo_profile_reset_now'] = 'Profil jetzt zurücksetzen';
$lang['user']['sogo_profile_reset_help'] = 'Das Profil wird inklusive <strong>aller</strong> Daten <b>unwiederbringlich gelöscht</b>.';
$lang['user']['encryption'] = 'Verschlüsselung';
$lang['user']['username'] = 'Benutzername';
$lang['user']['last_run'] = 'Letzte Ausführung';
$lang['user']['excludes'] = 'Ausschlüsse';
$lang['user']['interval'] = 'Intervall';
$lang['user']['active'] = 'Aktiv';
$lang['user']['action'] = 'Aktion';
$lang['user']['edit'] = 'Bearbeiten';
$lang['user']['remove'] = 'Entfernen';
$lang['user']['create_syncjob'] = 'Neuen Sync-Job erstellen';
$lang['start']['mailcow_apps_detail'] = 'Verwenden Sie mailcow Apps, um E-Mails abzurufen, Kalender und Kontakte zu verwalten und vieles mehr.';
$lang['start']['mailcow_panel_detail'] = '<b>Domain-Administratoren</b> erstellen, verändern oder löschen Mailboxen, verwalten die Domäne und sehen sonstige Einstellungen ein.<br>
Als <b>Mailbox-Benutzer</b> erstellen Sie hier zeitlich limitierte Aliasse, ändern das Verhalten des Spamfilters, setzen ein neues Passwort und vieles mehr.';
$lang['start']['imap_smtp_server_auth_info'] = 'Bitte verwenden Sie Ihre vollständige E-Mail-Adresse sowie das PLAIN-Authentifizierungsverfahren.<br>
Ihre Anmeldedaten werden durch die obligatorische Verschlüsselung entgegen des Begriffes "PLAIN" nicht unverschlüsselt übertragen.';
$lang['start']['help'] = 'Hilfe ein-/ausblenden';
$lang['header']['mailcow_settings'] = 'Konfiguration';
$lang['header']['administration'] = 'Server-Konfiguration';
$lang['header']['mailboxes'] = 'E-Mail-Setup';
$lang['header']['user_settings'] = 'Benutzereinstellungen';
$lang['header']['quarantine'] = "Quarantäne";
$lang['header']['debug'] = "Systeminformation";
$lang['quarantine']['disabled_by_config'] = "Die derzeitige Konfiguration deaktiviert die Funktion des Quarantäne-Systems.";
$lang['mailbox']['tls_policy_maps'] = 'TLS-Richtlinien';
$lang['mailbox']['tls_policy_maps_long'] = 'Ausgehende TLS-Richtlinien';
$lang['mailbox']['tls_policy_maps_info'] = 'Nachstehende Richtlinien erzwingen TLS-Transportregeln unabhängig von TLS-Richtlinieneinstellungen eines Benutzers.<br>
Für weitere Informationen zur Syntax sollte <a href="http://www.postfix.org/postconf.5.html#smtp_tls_policy_maps" target="_blank">die "smtp_tls_policy_maps" Dokumentation</a> konsultiert werden.';
$lang['mailbox']['tls_enforce_in'] = 'TLS eingehend erzwingen';
$lang['mailbox']['tls_enforce_out'] = 'TLS ausgehend erzwingen';
$lang['mailbox']['tls_map_dest'] = 'Ziel';
-$lang['mailbox']['tls_map_dest_info'] = 'Beispiele: example.org, .example.org, mail@example.org, [mail.example.org]:25';
+$lang['mailbox']['tls_map_dest_info'] = 'Beispiele: example.org, .example.org, [mail.example.org]:25';
$lang['mailbox']['tls_map_policy'] = 'Richtlinie';
$lang['mailbox']['tls_map_parameters'] = 'Parameter';
$lang['mailbox']['tls_map_parameters_info'] = 'Leer oder Parameter, Beispiele: protocols=!SSLv2 ciphers=medium exclude=3DES';
$lang['mailbox']['booking_0'] = 'Immer als verfügbar anzeigen';
$lang['mailbox']['booking_lt0'] = 'Unbegrenzt, jedoch anzeigen, wenn gebucht';
$lang['mailbox']['booking_custom'] = 'Benutzerdefiniertes Limit';
$lang['mailbox']['booking_0_short'] = 'Immer verfügbar';
$lang['mailbox']['booking_lt0_short'] = 'Weiches Limit';
$lang['mailbox']['booking_custom_short'] = 'Hartes Limit';
$lang['mailbox']['domain'] = 'Domain';
$lang['mailbox']['spam_aliases'] = 'Temp. Alias';
$lang['mailbox']['alias'] = 'Alias';
$lang['mailbox']['aliases'] = 'Aliasse';
$lang['mailbox']['multiple_bookings'] = 'Mehrfachbuchen';
$lang['mailbox']['kind'] = 'Art';
$lang['mailbox']['description'] = 'Beschreibung';
$lang['mailbox']['resources'] = 'Ressourcen';
$lang['mailbox']['domains'] = 'Domains';
$lang['admin']['domain_s'] = 'Domain(s)';
$lang['mailbox']['mailbox'] = 'Mailbox';
$lang['mailbox']['mailboxes'] = 'Mailboxen';
$lang['mailbox']['mailbox_quota'] = 'Max. Größe einer Mailbox';
$lang['mailbox']['domain_quota'] = 'Gesamtspeicher';
$lang['mailbox']['active'] = 'Aktiv';
$lang['mailbox']['action'] = 'Aktion';
$lang['mailbox']['backup_mx'] = 'Backup MX';
$lang['mailbox']['domain_aliases'] = 'Domain-Aliasse';
$lang['mailbox']['target_domain'] = 'Ziel-Domain';
$lang['mailbox']['target_address'] = 'Ziel-Adresse';
$lang['mailbox']['username'] = 'Benutzername';
$lang['mailbox']['fname'] = 'Name';
$lang['mailbox']['filter_table'] = 'Filtern';
$lang['mailbox']['in_use'] = 'Prozentualer Gebrauch';
$lang['mailbox']['msg_num'] = 'Anzahl Nachrichten';
$lang['mailbox']['remove'] = 'Entfernen';
$lang['mailbox']['edit'] = 'Bearbeiten';
$lang['mailbox']['no_record'] = 'Kein Eintrag für Objekt %s';
$lang['mailbox']['no_record_single'] = 'Kein Eintrag';
$lang['mailbox']['add_domain'] = 'Domain hinzufügen';
$lang['mailbox']['add_domain_alias'] = 'Domain-Alias hinzufügen';
$lang['mailbox']['add_mailbox'] = 'Mailbox hinzufügen';
$lang['mailbox']['add_resource'] = 'Ressource hinzufügen';
$lang['mailbox']['add_alias'] = 'Alias hinzufügen';
$lang['mailbox']['empty'] = 'Keine Einträge vorhanden';
$lang['mailbox']['toggle_all'] = 'Alle';
$lang['mailbox']['quick_actions'] = 'Aktionen';
$lang['mailbox']['activate'] = 'Aktivieren';
$lang['mailbox']['deactivate'] = 'Deaktivieren';
$lang['mailbox']['owner'] = 'Besitzer';
$lang['mailbox']['mins_interval'] = 'Intervall (min)';
$lang['mailbox']['last_run'] = 'Letzte Ausführung';
$lang['mailbox']['last_run_reset'] = 'Als nächstes ausführen';
$lang['mailbox']['excludes'] = 'Ausschlüsse';
$lang['mailbox']['sieve_info'] = 'Es können mehrere Filter pro Benutzer existieren, aber nur ein Filter eines Typs (Pre-/Postfilter) kann gleichzeitig aktiv sein.<br>
Die Ausführung erfolgt in nachstehender Reihenfolge. Ein fehlgeschlagenes Script sowie der Befehl "keep;" stoppen die weitere Verarbeitung <b>nicht</b>.<br>
<a href="https://github.com/mailcow/mailcow-dockerized/blob/master/data/conf/dovecot/global_sieve_before" target="_blank">Global sieve prefilter</a> → Prefilter → User scripts → Postfilter → <a href="https://github.com/mailcow/mailcow-dockerized/blob/master/data/conf/dovecot/global_sieve_after" target="_blank">Global sieve postfilter</a>';
$lang['info']['no_action'] = 'Keine Aktion anwendbar';
$lang['edit']['sogo_visible'] = 'Alias in SOGo sichtbar';
$lang['edit']['sogo_visible_info'] = 'Diese Option hat lediglich Einfluss auf Objekte, die in SOGo darstellbar sind (geteilte oder nicht-geteilte Alias-Adressen mit dem Ziel mindestens einer lokalen Mailbox).';
$lang['mailbox']['sogo_visible'] = 'Alias Sichtbarkeit in SOGo';
$lang['mailbox']['sogo_visible_y'] = 'Alias in SOGo anzeigen';
$lang['mailbox']['sogo_visible_n'] = 'Alias in SOGo verbergen';
$lang['edit']['syncjob'] = 'Sync-Job bearbeiten';
$lang['edit']['save'] = 'Änderungen speichern';
$lang['edit']['username'] = 'Benutzername';
$lang['edit']['hostname'] = 'Servername';
$lang['edit']['encryption'] = 'Verschlüsselung';
$lang['edit']['maxage'] = 'Maximales Alter in Tagen einer Nachricht, die kopiert werden soll</br ><small>(0 = alle Nachrichten kopieren)</small>';
$lang['edit']['subfolder2'] = 'Ziel-Ordner<br><small>(leer = kein Unterordner)</small>';
$lang['edit']['mins_interval'] = 'Intervall (min)';
$lang['edit']['maxbytespersecond'] = 'Max. Übertragungsrate in Bytes/s (0 für unlimitiert)';
$lang['edit']['automap'] = 'Ordner automatisch mappen ("Sent items", "Sent" => "Sent" etc.)';
$lang['edit']['skipcrossduplicates'] = 'Duplikate auch über Ordner hinweg überspringen ("first come, first serve")';
$lang['add']['automap'] = 'Ordner automatisch mappen ("Sent items", "Sent" => "Sent" etc.)';
$lang['add']['skipcrossduplicates'] = 'Duplikate auch über Ordner hinweg überspringen ("first come, first serve")';
$lang['edit']['exclude'] = 'Elemente ausschließen (Regex)';
$lang['edit']['max_mailboxes'] = 'Max. Mailboxanzahl';
$lang['edit']['title'] = 'Objekt bearbeiten';
$lang['edit']['target_address'] = 'Ziel-Adresse(n) <small>(getrennt durch Komma)</small>';
$lang['edit']['active'] = 'Aktiv';
$lang['add']['gal'] = 'Globales Adressbuch';
$lang['edit']['gal'] = 'Globales Adressbuch';
$lang['add']['gal_info'] = 'Das Globale Adressbuch enthält alle Objekte einer Domain und kann durch keinen Benutzer editiert werden. Die Verfügbarkeitsinformation in SOGo ist nur bei eingeschaltetem globalen Adressbuch ersichtlich! <b>Zum Anwenden einer Änderung muss SOGo neugestartet werden.</b>';
$lang['edit']['gal_info'] = 'Das Globale Adressbuch enthält alle Objekte einer Domain und kann durch keinen Benutzer editiert werden. Die Verfügbarkeitsinformation in SOGo ist nur bei eingeschaltetem globalen Adressbuch ersichtlich <b>Zum Anwenden einer Änderung muss SOGo neugestartet werden.</b>';
$lang['edit']['force_pw_update'] = 'Erzwinge Passwortänderung bei nächstem Login';
$lang['edit']['force_pw_update_info'] = 'Dem Benutzer wird lediglich der Zugang zur mailcow UI ermöglicht.';
$lang['edit']['sogo_access'] = 'SOGo Zugriffsrecht';
$lang['edit']['sogo_access_info'] = 'Zugriff auf SOGo erlauben oder verbieten. Diese Einstellung hat weder Einfluss auf den Zugang sonstiger Dienste noch entfernt sie ein vorhandenes SOGo Benutzerprofil.';
$lang['edit']['target_domain'] = 'Ziel-Domain';
$lang['edit']['password'] = 'Passwort';
$lang['edit']['password_repeat'] = 'Passwort (Wiederholung)';
$lang['edit']['domain_admin'] = 'Domain-Administrator bearbeiten';
$lang['edit']['domain'] = 'Domain bearbeiten';
$lang['edit']['edit_alias_domain'] = 'Alias-Domain bearbeiten';
$lang['edit']['domains'] = 'Domains';
$lang['edit']['alias'] = 'Alias bearbeiten';
$lang['edit']['mailbox'] = 'Mailbox bearbeiten';
$lang['edit']['description'] = 'Beschreibung';
$lang['edit']['max_aliases'] = 'Max. Aliasse';
$lang['edit']['max_quota'] = 'Max. Größe per Mailbox (MiB)';
$lang['edit']['domain_quota'] = 'Domain Speicherplatz gesamt (MiB)';
$lang['edit']['backup_mx_options'] = 'Backup MX Optionen';
$lang['edit']['relay_domain'] = 'Diese Domain relayen';
$lang['edit']['relay_all'] = 'Alle Empfänger-Adressen relayen';
$lang['edit']['relay_all_info'] = '<small>Wenn <b>nicht</b> alle Empfänger-Adressen relayt werden sollen, müssen "blinde" Mailboxen für jede Adresse, die relayt werden soll, erstellen werden.</small>';
$lang['edit']['full_name'] = 'Voller Name';
$lang['edit']['quota_mb'] = 'Speicherplatz (MiB)';
$lang['edit']['sender_acl'] = 'Darf Nachrichten versenden als';
$lang['edit']['sender_acl_disabled'] = '↳ <span class="label label-danger">Absenderprüfung deaktiviert</span>';
$lang['user']['sender_acl_disabled'] = '<span class="label label-danger">Absenderprüfung deaktiviert</span>';
$lang['edit']['previous'] = 'Vorherige Seite';
$lang['edit']['unchanged_if_empty'] = 'Unverändert, wenn leer';
$lang['edit']['dont_check_sender_acl'] = 'Absender für Domain %s u. Alias-Dom. nicht prüfen';
$lang['edit']['multiple_bookings'] = 'Mehrfaches Buchen';
$lang['edit']['kind'] = 'Art';
$lang['edit']['resource'] = 'Ressource';
$lang['edit']['public_comment'] = 'Öffentlicher Kommentar';
$lang['mailbox']['public_comment'] = 'Öffentlicher Kommentar';
$lang['edit']['private_comment'] = 'Privater Kommentar';
$lang['mailbox']['private_comment'] = 'Privater Kommentar';
$lang['edit']['comment_info'] = 'Ein privater Kommentar ist für den Benutzer nicht einsehbar. Ein öffentlicher Kommentar wird als Tooltip im Interface des Benutzers angezeigt.';
$lang['add']['public_comment'] = 'Öffentlicher Kommentar';
$lang['add']['private_comment'] = 'Privater Kommentar';
$lang['add']['comment_info'] = 'Ein privater Kommentar ist für den Benutzer nicht einsehbar. Ein öffentlicher Kommentar wird als Tooltip im Interface des Benutzers angezeigt.';
$lang['acl']['spam_alias'] = 'Temporäre E-Mail Aliasse';
$lang['acl']['tls_policy'] = 'Verschlüsselungsrichtlinie';
$lang['acl']['spam_score'] = 'Spam-Bewertung';
$lang['acl']['spam_policy'] = 'Blacklist/Whitelist';
$lang['acl']['delimiter_action'] = 'Delimiter Aktionen (tags)';
$lang['acl']['syncjobs'] = 'Sync Jobs';
$lang['acl']['eas_reset'] = 'EAS-Cache zurücksetzen';
$lang['acl']['sogo_profile_reset'] = 'SOGo Profil zurücksetzen';
$lang['acl']['quarantine'] = 'Quarantäne-Aktionen';
$lang['acl']['quarantine_notification'] = 'Ändern der Quarantäne-Benachrichtigung';
$lang['acl']['quarantine_attachments'] = 'Anhänge aus Quarantäne';
$lang['acl']['alias_domains'] = 'Alias-Domains hinzufügen';
$lang['acl']['login_as'] = 'Einloggen als Mailbox-Benutzer';
$lang['acl']['bcc_maps'] = 'BCC Maps';
$lang['acl']['filters'] = 'Filter';
$lang['acl']['ratelimit'] = 'Rate limit';
$lang['acl']['recipient_maps'] = 'Empfängerumschreibungen';
$lang['acl']['unlimited_quota'] = 'Unendliche Quota für Mailboxen';
$lang['acl']['extend_sender_acl'] = 'Eingabe externer Absenderadressen erlauben';
$lang['acl']['prohibited'] = 'Untersagt durch Richtlinie';
$lang['edit']['extended_sender_acl'] = 'Externe Absenderadressen';
$lang['edit']['extended_sender_acl_info'] = 'Der DKIM Domainkey der externen Absenderdomain sollte in diesen Server importiert werden, falls vorhanden.<br>
Wird SPF verwendet, muss diesem Server der Versand gestattet werden.<br>
Wird eine Domain oder Alias-Domain zu diesem Server hinzugefügt, die sich mit der externen Absenderadresse überschneidet, wird der externe Absender hier entfernt.<br>
Ein Eintrag @domain.tld erlaubt den Versand als *@domain.tld';
$lang['edit']['sender_acl_info'] = 'Wird einem Mailbox-Benutzer A der Versand als Mailbox-Benutzer B gestattet, so erscheint der Absender <b>nicht</b> automatisch in SOGo zur Auswahl.<br>
In SOGo muss zusätzlich eine Delegation eingerichtet werden. Dieses Verhalten trifft nicht auf Alias-Adressen zu.';
$lang['mailbox']['quarantine_notification'] = 'Quarantäne-Benachrichtigung';
$lang['mailbox']['never'] = 'Niemals';
$lang['mailbox']['hourly'] = 'Stündlich';
$lang['mailbox']['daily'] = 'Täglich';
$lang['mailbox']['weekly'] = 'Wöchentlich';
$lang['user']['quarantine_notification'] = 'Quarantäne-Benachrichtigung';
$lang['user']['never'] = 'Niemals';
$lang['user']['hourly'] = 'Stündlich';
$lang['user']['daily'] = 'Täglich';
$lang['user']['weekly'] = 'Wöchentlich';
$lang['user']['quarantine_notification_info'] = 'Wurde über eine E-Mail in Quarantäne informiert, wird sie als "benachrichtigt" markiert und keine weitere Benachrichtigung zu dieser E-Mail versendet.';
$lang['add']['generate'] = 'generieren';
$lang['add']['syncjob'] = 'Syncjob hinzufügen';
$lang['add']['syncjob_hint'] = 'Passwörter werden unverschlüsselt abgelegt!';
$lang['add']['hostname'] = 'Host';
$lang['add']['destination'] = 'Ziel';
$lang['add']['nexthop'] = 'Next Hop';
$lang['edit']['nexthop'] = 'Next Hop';
$lang['add']['port'] = 'Port';
$lang['add']['username'] = 'Benutzername';
$lang['add']['enc_method'] = 'Verschlüsselung';
$lang['add']['mins_interval'] = 'Abrufintervall (Minuten)';
$lang['add']['exclude'] = 'Elemente ausschließen (Regex)';
$lang['add']['delete2duplicates'] = 'Lösche Duplikate im Ziel';
$lang['add']['delete1'] = 'Lösche Nachricht nach Übertragung vom Quell-Server';
$lang['add']['delete2'] = 'Lösche Nachrichten von Ziel-Server, die nicht auf Quell-Server vorhanden sind';
$lang['add']['custom_params'] = 'Eigene Parameter';
$lang['add']['custom_params_hint'] = 'Richtig: --param=xy, falsch: --param xy';
$lang['add']['subscribeall'] = 'Alle synchronisierten Ordner abonnieren';
$lang['add']['timeout1'] = 'Timeout für Verbindung zum Remote-Host';
$lang['add']['timeout2'] = 'Timeout für Verbindung zum lokalen Host';
$lang['edit']['delete2duplicates'] = 'Lösche Duplikate im Ziel';
$lang['edit']['delete1'] = 'Lösche Nachricht nach Übertragung vom Quell-Server';
$lang['edit']['delete2'] = 'Lösche Nachrichten von Ziel-Server, die nicht auf Quell-Server vorhanden sind';
$lang['add']['domain_matches_hostname'] = 'Domain %s darf nicht dem Hostnamen entsprechen';
$lang['add']['domain'] = 'Domain';
$lang['add']['active'] = 'Aktiv';
$lang['add']['multiple_bookings'] = 'Mehrfaches Buchen möglich';
$lang['add']['description'] = 'Beschreibung';
$lang['add']['max_aliases'] = 'Max. mögliche Aliasse';
$lang['add']['max_mailboxes'] = 'Max. mögliche Mailboxen';
$lang['add']['mailbox_quota_m'] = 'Max. Speicherplatz pro Mailbox (MiB)';
$lang['add']['domain_quota_m'] = 'Domain Speicherplatz gesamt (MiB)';
$lang['add']['backup_mx_options'] = 'Backup MX Optionen';
$lang['add']['relay_all'] = 'Alle Empfänger-Adressen relayen';
$lang['add']['relay_domain'] = 'Relay Domain';
$lang['add']['relay_all_info'] = '<small>Wenn Sie <b>nicht</b> alle Empfänger-Adressen relayen möchten, müssen Sie eine Mailbox für jede Adresse, die relayt werden soll, erstellen.</small>';
$lang['add']['alias_address'] = 'Alias-Adresse(n)';
$lang['add']['alias_address_info'] = '<small>Vollständige E-Mail-Adresse(n) oder @example.com, um alle Nachrichten einer Domain weiterzuleiten. Getrennt durch Komma. <b>Nur eigene Domains</b>.</small>';
$lang['add']['alias_domain_info'] = '<small>Nur gültige Domains. Getrennt durch Komma.</small>';
$lang['add']['target_address'] = 'Ziel-Adresse(n)';
$lang['add']['target_address_info'] = '<small>Vollständige E-Mail-Adresse(n). Getrennt durch Komma.</small>';
$lang['add']['alias_domain'] = 'Alias-Domain';
$lang['add']['select'] = 'Bitte auswählen';
$lang['add']['target_domain'] = 'Ziel-Domain';
$lang['add']['kind'] = 'Art';
$lang['add']['mailbox_username'] = 'Benutzername (linker Teil der E-Mail-Adresse)';
$lang['add']['full_name'] = 'Vor- und Nachname';
$lang['add']['quota_mb'] = 'Speicherplatz (MiB)';
$lang['add']['select_domain'] = 'Bitte zuerst eine Domain auswählen';
$lang['add']['password'] = 'Passwort';
$lang['add']['password_repeat'] = 'Passwort (Wiederholung)';
$lang['add']['restart_sogo_hint'] = 'Der SOGo Container muss nach dem Hinzufügen einer neuen Domain neugestartet werden!';
$lang['add']['goto_null'] = 'Nachrichten sofort verwerfen';
$lang['add']['goto_ham'] = 'Nachrichten als <span class="text-success"><b>Ham</b></span> lernen';
$lang['add']['goto_spam'] = 'Nachrichten als <span class="text-danger"><b>Spam</b></span> lernen';
$lang['add']['validation_success'] = 'Erfolgreich validiert';
$lang['add']['activate_filter_warn'] = 'Alle anderen Filter diesen Typs werden deaktiviert, falls dieses Script aktiv markiert wird.';
$lang['add']['validate'] = 'Validieren';
$lang['mailbox']['add_filter'] = 'Filter erstellen';
$lang['add']['sieve_desc'] = 'Kurze Beschreibung';
$lang['edit']['sieve_desc'] = 'Kurze Beschreibung';
$lang['add']['sieve_type'] = 'Filtertyp';
$lang['edit']['sieve_type'] = 'Filtertyp';
$lang['mailbox']['set_prefilter'] = 'Als Prefilter markieren';
$lang['mailbox']['set_postfilter'] = 'Als Postfilter markieren';
$lang['mailbox']['filters'] = 'Filter';
$lang['mailbox']['sync_jobs'] = 'Synchronisationen';
$lang['mailbox']['inactive'] = 'Inaktiv';
$lang['edit']['validate_save'] = 'Validieren und speichern';
$lang['login']['username'] = 'Benutzername';
$lang['login']['password'] = 'Passwort';
$lang['login']['login'] = 'Anmelden';
$lang['login']['delayed'] = 'Login wurde zur Sicherheit um %s Sekunde/n verzögert.';
$lang['tfa']['tfa'] = "Zwei-Faktor-Authentifizierung";
$lang['tfa']['set_tfa'] = "Konfiguriere Zwei-Faktor-Authentifizierungsmethode";
$lang['tfa']['yubi_otp'] = "Yubico OTP Authentifizierung";
$lang['tfa']['key_id'] = "Ein Name für diesen YubiKey";
$lang['tfa']['init_u2f'] = "Initialisiere, bitte warten...";
$lang['tfa']['start_u2f_validation'] = "Starte Validierung";
$lang['tfa']['error_code'] = "Fehlercode";
$lang['tfa']['reload_retry'] = "- (bei persistierendem Fehler, bitte Browserfenster neuladen)";
$lang['tfa']['key_id_totp'] = "Ein eindeutiger Name";
$lang['tfa']['api_register'] = 'mailcow verwendet die Yubico Cloud API. Ein API-Key für den Yubico Stick kann <a href="https://upgrade.yubico.com/getapikey/" target="_blank">hier</a> bezogen werden.';
$lang['tfa']['u2f'] = "U2F Authentifizierung";
$lang['tfa']['totp'] = "TOTP Authentifizierung";
$lang['tfa']['none'] = "Deaktiviert";
$lang['tfa']['delete_tfa'] = "Deaktiviere 2FA";
$lang['tfa']['disable_tfa'] = "Deaktiviere 2FA bis zur nächsten erfolgreichen Anmeldung";
$lang['tfa']['confirm'] = "Bestätigen";
$lang['tfa']['totp'] = "Time-based OTP (Google Authenticator etc.)";
$lang['tfa']['select'] = "Bitte auswählen";
$lang['tfa']['waiting_usb_auth'] = "<i>Warte auf USB-Gerät...</i><br><br>Bitte jetzt den vorgesehenen Taster des U2F USB-Gerätes berühren.";
$lang['tfa']['waiting_usb_register'] = "<i>Warte auf USB-Gerät...</i><br><br>Bitte zuerst das obere Passwortfeld ausfüllen und erst dann den vorgesehenen Taster des U2F USB-Gerätes berühren.";
$lang['tfa']['scan_qr_code'] = "Bitte scannen Sie jetzt den angezeigten QR-Code:.";
$lang['tfa']['enter_qr_code'] = "Falls Sie den angezeigten QR-Code nicht scannen können, verwenden Sie bitte nachstehenden Sicherheitsschlüssel";
$lang['tfa']['confirm_totp_token'] = "Bitte bestätigen Sie die Änderung durch Eingabe eines generierten Tokens";
$lang['admin']['rspamd-com_settings'] = '<a href="https://rspamd.com/doc/configuration/settings.html#settings-structure" target="_blank">Rspamd docs</a>
- Ein Name wird automatisch generiert. Beispielinhalte zur Einsicht stehen nachstehend bereit.';
$lang['admin']['no_new_rows'] = 'Keine weiteren Zeilen vorhanden';
$lang['admin']['additional_rows'] = ' zusätzliche Zeilen geladen'; // parses to 'n additional rows were added'
$lang['admin']['private_key'] = 'Private Key';
$lang['admin']['import'] = 'Importieren';
$lang['admin']['duplicate'] = 'Duplizieren';
$lang['admin']['import_private_key'] = 'Private Key importieren';
$lang['admin']['duplicate_dkim'] = 'DKIM duplizieren';
$lang['admin']['f2b_parameters'] = 'Fail2ban-Parameter';
$lang['admin']['f2b_ban_time'] = 'Bannzeit (s)';
$lang['admin']['f2b_max_attempts'] = 'Max. Versuche';
$lang['admin']['f2b_retry_window'] = 'Wiederholungen im Zeitraum von (s)';
$lang['admin']['f2b_netban_ipv4'] = 'Netzbereich für IPv4-Bans (8-32)';
$lang['admin']['f2b_netban_ipv6'] = 'Netzbereich für IPv6-Bans (8-128)';
$lang['admin']['f2b_whitelist'] = 'Whitelist für Netzwerke und Hosts';
$lang['admin']['r_inactive'] = 'Inaktive Restriktionen';
$lang['admin']['r_active'] = 'Aktive Restriktionen';
$lang['admin']['r_info'] = 'Ausgegraute/deaktivierte Elemente sind mailcow nicht bekannt und können nicht in die Liste inaktiver Elemente verschoben werden. Unbekannte Restriktionen werden trotzdem in Reihenfolge der Erscheinung gesetzt.<br>Sie können ein Element in der Datei <code>inc/vars.local.inc.php</code> als bekannt hinzufügen, um es zu bewegen.';
$lang['admin']['save'] = 'Änderungen speichern';
$lang['admin']['dkim_add_key'] = 'ARC/DKIM-Key hinzufügen';
$lang['admin']['dkim_keys'] = 'ARC/DKIM-Keys';
$lang['admin']['dkim_key_valid'] = 'Key gültig';
$lang['admin']['dkim_key_unused'] = 'Key ohne Zuweisung';
$lang['admin']['dkim_key_missing'] = 'Key fehlt';
$lang['admin']['dkim_from'] = 'Von';
$lang['admin']['dkim_to'] = 'Nach';
$lang['admin']['dkim_from_title'] = 'Quellobjekt für Duplizierung';
$lang['admin']['dkim_to_title'] = 'Ziel-Objekt(e) werden überschrieben';
$lang['admin']['dkim_domains_wo_keys'] = "Domains mit fehlenden Keys auswählen";
$lang['admin']['add'] = 'Hinzufügen';
$lang['admin']['queue_manager'] = 'Queue Manager';
$lang['add']['add_domain_restart'] = 'Domain hinzufügen und SOGo neustarten';
$lang['add']['add_domain_only'] = 'Nur Domain hinzufügen';
$lang['admin']['configuration'] = 'Konfiguration';
$lang['admin']['password'] = 'Passwort';
$lang['admin']['password_repeat'] = 'Passwort (Wiederholung)';
$lang['admin']['active'] = 'Aktiv';
$lang['admin']['inactive'] = 'Inaktiv';
$lang['admin']['action'] = 'Aktion';
$lang['admin']['add_domain_admin'] = 'Domain-Administrator hinzufügen';
$lang['admin']['domain_admin'] = 'Administrator hinzufügen';
$lang['admin']['add_settings_rule'] = 'Rspamd Regel hinzufügen';
$lang['admin']['rsetting_desc'] = 'Kurze Beschreibung';
$lang['admin']['rsetting_content'] = 'Regelinhalt';
$lang['admin']['rsetting_none'] = 'Keine Regel hinterlegt';
$lang['admin']['rsetting_no_selection'] = 'Bitte eine Regel auswählen';
$lang['admin']['rsettings_preset_1'] = 'Alles außer DKIM and Ratelimits für authentifizierte Benutzer deaktivieren"';
$lang['admin']['rsettings_preset_2'] = 'Spam an Postmaster-Addressen nicht blockieren';
$lang['admin']['rsettings_insert_preset'] = 'Beispiel "%s" laden';
$lang['admin']['rsetting_add_rule'] = 'Regel hinzufügen';
$lang['admin']['admin_domains'] = 'Domain-Zuweisungen';
$lang['admin']['queue_ays'] = 'Soll die derzeitige Queue wirklich komplett bereinigt werden?';
$lang['admin']['arrival_time'] = 'Ankunftszeit (Serverzeit)';
$lang['admin']['message_size'] = 'Nachrichtengröße';
$lang['admin']['sender'] = 'Sender';
$lang['admin']['recipients'] = 'Empfänger';
$lang['admin']['flush_queue'] = 'Flush Queue';
$lang['admin']['delete_queue'] = 'Alle löschen';
$lang['admin']['domain_admins'] = 'Domain-Administratoren';
$lang['admin']['username'] = 'Benutzername';
$lang['admin']['edit'] = 'Bearbeiten';
$lang['admin']['remove'] = 'Entfernen';
$lang['admin']['save'] = 'Änderungen speichern';
$lang['admin']['admin'] = 'Administrator';
$lang['admin']['admin_details'] = 'Administrator bearbeiten';
$lang['admin']['unchanged_if_empty'] = 'Unverändert, wenn leer';
$lang['admin']['access'] = 'Zugang';
$lang['admin']['no_record'] = 'Kein Eintrag';
$lang['admin']['filter_table'] = 'Tabelle Filtern';
$lang['admin']['empty'] = 'Keine Einträge vorhanden';
$lang['admin']['time'] = 'Zeit';
$lang['admin']['last_applied'] = 'Zuletzt angewendet';
$lang['admin']['reset_limit'] = 'Hash entfernen';
$lang['admin']['hash_remove_info'] = 'Das Entfernen eines Ratelimit Hashes - sofern noch existent - bewirkt den Reset gezählter Nachrichten dieses Elements.<br>
Jeder Hash wird durch eine eindeutige Farbe gekennzeichnet.';
$lang['warning']['hash_not_found'] = 'Hash nicht gefunden. Möglicherweise wurde dieser bereits gelöscht.';
$lang['success']['hash_deleted'] = 'Hash wurde gelöscht';
$lang['admin']['authed_user'] = 'Auth. Benutzer';
$lang['admin']['priority'] = 'Gewichtung';
$lang['admin']['refresh'] = 'Neu laden';
$lang['admin']['to_top'] = 'Nach oben';
$lang['admin']['in_use_by'] = 'Verwendet von';
$lang['admin']['rate_name'] = 'Rate name';
$lang['admin']['message'] = 'Nachricht';
$lang['admin']['forwarding_hosts'] = 'Weiterleitungs-Hosts';
$lang['admin']['forwarding_hosts_hint'] = 'Eingehende Nachrichten werden von den hier gelisteten Hosts bedingungslos akzeptiert. Diese Hosts werden dann nicht mit DNSBLs abgeglichen oder Greylisting unterworfen. Von ihnen empfangener Spam wird nie abgelehnt, optional kann er aber in den Spam-Ordner einsortiert werden. Die übliche Verwendung für diese Funktion ist, um Mailserver anzugeben, auf denen eine Weiterleitung zu Ihrem mailcow-Server eingerichtet wurde.';
$lang['admin']['forwarding_hosts_add_hint'] = 'Sie können entweder IPv4/IPv6-Adressen, Netzwerke in CIDR-Notation, Hostnamen (die zu IP-Adressen aufgelöst werden), oder Domainnamen (die zu IP-Adressen aufgelöst werden, indem ihr SPF-Record abgefragt wird oder, in dessen Abwesenheit, ihre MX-Records) angeben.';
$lang['admin']['relayhosts_hint'] = 'Erstellen Sie senderabhängige Transporte, um diese im Einstellungsdialog einer Domain auszuwählen.<br>
Der Transporttyp lautet immer "smtp:". Benutzereinstellungen bezüglich Verschlüsselungsrichtlinie werden beim Transport berücksichtigt.<br>
Gilt neben ausgewählter Domain auch für untergeordnete Alias-Domains.';
$lang['admin']['transports_hint'] = '→ Transport Maps <b>überwiegen</b> senderabhängige Transport Maps.<br>
→ Transport Maps ignorieren Mailbox-Einstellungen für ausgehende Verschlüsselung. Eine serverweite TLS-Richtlinie wird jedoch angewendet.<br>
→ Der Transport erfolgt immer via "smtp:".<br>
→ Adressen, die mit "/localhost$/" übereinstimmen, werden immer via "local:" transportiert, daher sind sie von einer Zieldefinition "*" ausgeschlossen.<br>
→ Die Authentifizierung wird anhand des "Next hop" Parameters ermittelt. Hierbei würde bei einem beispielhaften Wert "[host]:25" immer zuerst "host" abfragt und <b>erst im Anschluss</b> "[host]:25". Dieses Verhalten schließt die <b>gleichzeitige Verwendung</b> von Einträgen der Art "host" sowie "[host]:25" aus.';
$lang['admin']['add_relayhost_hint'] = 'Bitte beachten Sie, dass Anmeldedaten unverschlüsselt gespeichert werden.<br>
Angelegte Transporte dieser Art sind <b>senderabhängig</b> und müssen erst einer Domain zugewiesen werden, bevor sie als Transport verwendet werden.<br>
Diese Einstellungen entsprechen demach <i>nicht</i> dem "relayhost" Parameter in Postfix.';
$lang['admin']['add_transports_hint'] = 'Bitte beachten Sie, dass Anmeldedaten unverschlüsselt gespeichert werden.';
$lang['admin']['host'] = 'Host';
$lang['admin']['source'] = 'Quelle';
$lang['admin']['add_forwarding_host'] = 'Weiterleitungs-Host hinzufügen';
$lang['admin']['add_relayhost'] = 'Senderabhängigen Transport hinzufügen';
$lang['admin']['add_transport'] = 'Transport hinzufügen';
$lang['admin']['relayhosts'] = 'Senderabhängige Transport Maps';
$lang['admin']['transport_maps'] = 'Transport Maps';
$lang['admin']['routing'] = 'Routing';
$lang['admin']['credentials_transport_warning'] = '<b>Warnung</b>: Das Hinzufügen einer neuen Regel bewirkt die Aktualisierung der Authentifizierungsdaten aller vorhandenen Einträge mit identischem Host.';
$lang['admin']['destination'] = 'Ziel';
$lang['admin']['nexthop'] = 'Next Hop';
$lang['admin']['api_allow_from'] = "IP-Adressen für Zugriff";
$lang['admin']['api_key'] = "API-Key";
$lang['admin']['activate_api'] = "API aktivieren";
$lang['admin']['regen_api_key'] = "API-Key regenerieren";
$lang['admin']['ban_list_info'] = "Übersicht ausgesperrter Netzwerke: <b>Netzwerk (verbleibende Banzeit) - [Aktionen]</b>.<br />IPs, die zum Unban eingereiht werden, verlassen die Liste aktiver Bans nach wenigen Sekunden.<br />Rote Labels sind Indikatoren für aktive Blacklisteinträge.";
$lang['admin']['unban_pending'] = "ausstehend";
$lang['admin']['queue_unban'] = "Unban einreihen";
$lang['admin']['no_active_bans'] = "Keine aktiven Bans";
$lang['admin']['quota_notifications'] = "Quota Benachrichtigungen";
$lang['admin']['quota_notifications_vars'] = "{{percent}} entspricht der aktuellen Quota in Prozent<br>{{username}} entspricht dem Mailbox-Namen";
$lang['admin']['rspamd_settings_map'] = "Rspamd Settings Map";
$lang['admin']['quarantine'] = "Quarantäne";
$lang['admin']['active_rspamd_settings_map'] = "Derzeit aktive Settings Map";
$lang['admin']['quota_notifications_info'] = "Quota Benachrichtigungen werden an Mailboxen versendet, die 80 respektive 95 Prozent der zur Verfügung stehenden Quota überschreiten.";
$lang['admin']['quarantine_retention_size'] = "Rückhaltungen pro Mailbox:<br><small>0 bedeutet <b>inaktiv</b>.</small>";
$lang['admin']['quarantine_max_size'] = "Maximale Größe in MiB (größere Elemente werden verworfen):<br><small>0 bedeutet <b>nicht</b> unlimitert.</small>";
$lang['admin']['quarantine_max_age'] = "Maximales Alter in Tagen<br><small>Wert muss größer oder gleich 1 Tag sein.</small>";
$lang['admin']['quarantine_exclude_domains'] = "Domains und Alias-Domains ausschließen";
$lang['admin']['quarantine_notification_sender'] = "Benachrichtigungs-E-Mail Absender";
$lang['admin']['quota_notification_sender'] = "Benachrichtigungs-E-Mail Absender";
$lang['admin']['quarantine_notification_subject'] = "Benachrichtigungs-E-Mail Betreff";
$lang['admin']['quota_notification_subject'] = "Benachrichtigungs-E-Mail Betreff";
$lang['admin']['quarantine_notification_html'] = "Benachrichtigungs-E-Mail Inhalt:<br><small>Leer lassen, um Standard-Template wiederherzustellen.</small>";
$lang['admin']['quota_notification_html'] = "Benachrichtigungs-E-Mail Inhalt:<br><small>Leer lassen, um Standard-Template wiederherzustellen.</small>";
$lang['admin']['quarantine_release_format'] = "Format freigegebener Mails";
$lang['admin']['quarantine_release_format_raw'] = "Unverändertes Original";
$lang['admin']['quarantine_release_format_att'] = "Als Anhang";
$lang['success']['forwarding_host_removed'] = "Weiterleitungs-Host %s wurde entfernt";
$lang['success']['forwarding_host_added'] = "Weiterleitungs-Host %s wurde hinzugefügt";
$lang['success']['relayhost_removed'] = "Mapeintrag %s wurde entfernt";
$lang['success']['relayhost_added'] = "Mapeintrag %s wurde hinzugefügt";
$lang['diagnostics']['dns_records'] = 'DNS-Einträge';
$lang['diagnostics']['dns_records_24hours'] = 'Bitte beachten Sie, dass es bis zu 24 Stunden dauern kann, bis Änderungen an Ihren DNS-Einträgen als aktueller Status auf dieser Seite dargestellt werden. Diese Seite ist nur als Hilfsmittel gedacht, um die korrekten Werte für DNS-Einträge anzuzeigen und zu überprüfen, ob die Daten im DNS hinterlegt sind.';
$lang['diagnostics']['dns_records_name'] = 'Name';
$lang['diagnostics']['dns_records_type'] = 'Typ';
$lang['diagnostics']['dns_records_data'] = 'Korrekte Daten';
$lang['diagnostics']['dns_records_status'] = 'Aktueller Status';
$lang['diagnostics']['optional'] = 'Dieser Eintrag ist optional.';
$lang['diagnostics']['cname_from_a'] = 'Wert abgeleitet von A/AAAA Eintrag. Wird unterstützt, sofern der Eintrag auf die korrekte Ressource zeigt.';
$lang['admin']['relay_from'] = "Absenderadresse";
$lang['admin']['relay_run'] = "Test durchführen";
$lang['mailbox']['waiting'] = "Wartend";
$lang['mailbox']['status'] = "Status";
$lang['mailbox']['running'] = "In Ausführung";
$lang['mailbox']['enable_x'] = "Aktiviere";
$lang['mailbox']['disable_x'] = "Deaktiviere";
$lang['admin']['ui_texts'] = "UI Label und Texte";
$lang['admin']['help_text'] = "Hilfstext unter Login-Maske (HTML zulässig)";
$lang['admin']['title_name'] = '"mailcow UI" Webseiten Titel';
$lang['admin']['main_name'] = '"mailcow UI" Name';
$lang['admin']['apps_name'] = '"mailcow Apps" Name';
$lang['admin']['ui_footer'] = 'Footer (HTML zulässig)';
$lang['admin']['oauth2_info'] = 'Die OAuth2 Implementierung untersützt den Grant Type "Authorization Code" mit Refresh Tokens.<br>
Der Server wird automatisch einen neuen Refresh Token ausstellen, sobald ein vorheriger Token gegen einen Access Token eingetauscht wurde.<br><br>
→ Der Standard Scope lautet <i>profile</i>. Nur Mailbox-Benutzer können sich gegen OAuth2 authentifizieren. Wird kein Scope angegeben, verwendet das System per Standard <i>profile</i>.<br>
→ Der <i>state</i> Parameter wird im Zuge des Autorisierungsprozesses benötigt.<br><br>
Die Pfade für die OAuth2 API lauten wie folgt: <br>
<ul>
<li>Authorization Endpoint: <code>/oauth/authorize</code></li>
<li>Token Endpoint: <code>/oauth/token</code></li>
<li>Resource Page: <code>/oauth/profile</code></li>
</ul>
Die Regenerierung des Client Secrets wird vorhandene Authorization Codes nicht invalidieren, dennoch wird der Renew des Access Tokens durch einen Refresh Token nicht mehr gelingen.<br><br>
Das Entfernen aller Client Tokens verursacht die umgehende Terminierung aller aktiven OAuth2 Sessions. Clients müssen sich erneut gegen die OAuth2 Anwendung authentifizieren.';
$lang['admin']['oauth2_client_id'] = "Client ID";
$lang['admin']['oauth2_client_secret'] = "Client Secret";
$lang['admin']['oauth2_redirect_uri'] = "Redirect URI";
$lang['admin']['oauth2_revoke_tokens'] = 'Alle Client Tokens entfernen';
$lang['admin']['oauth2_renew_secret'] = 'Neues Client Secret generieren';
$lang['edit']['client_id'] = 'Client ID';
$lang['edit']['client_secret'] = 'Client Secret';
$lang['edit']['scope'] = 'Scope';
$lang['edit']['grant_types'] = 'Grant types';
$lang['edit']['redirect_uri'] = 'Redirect/Callback URL';
$lang['oauth2']['scope_ask_permission'] = 'Eine Anwendung hat um die folgenden Berechtigungen gebeten';
$lang['oauth2']['profile'] = 'Profil';
$lang['oauth2']['profile_desc'] = 'Persönliche Informationen anzeigen: Benutzername, Name, Erstellzeitpunkt, Änderungszeitpunkt, Status';
$lang['oauth2']['permit'] = 'Anwendung authorisieren';
$lang['oauth2']['authorize_app'] = 'Anwendung authorisieren';
$lang['oauth2']['deny'] = 'Ablehnen';
$lang['oauth2']['access_denied'] = 'Bitte als Mailbox-Nutzer einloggen, um den Zugriff via OAuth2 zu erlauben.';
$lang['admin']['customize'] = "UI Anpassung";
$lang['admin']['change_logo'] = "Logo ändern";
$lang['admin']['logo_info'] = "Die hochgeladene Grafik wird für die Navigationsleiste auf eine Höhe von 40px skaliert. Für die Darstellung auf der Login-Maske beträgt die skalierte Breite maximal 250px. Eine frei skalierbare Grafik (etwa SVG) wird empfohlen.";
$lang['admin']['upload'] = "Hochladen";
$lang['admin']['app_links'] = "App Links";
$lang['admin']['app_name'] = "App Name";
$lang['admin']['link'] = "Link";
$lang['admin']['remove_row'] = "Entfernen";
$lang['admin']['add_row'] = "Reihe hinzufügen";
$lang['admin']['reset_default'] = "Zurücksetzen auf Standard";
$lang['admin']['merged_vars_hint'] = 'Ausgegraute Reihen wurden aus der Datei <code>vars.(local.)inc.php</code> gelesen und können hier nicht verändert werden.';
$lang['edit']['spam_score'] = "Einen benutzerdefiniterten Spam-Score festlegen";
$lang['user']['spam_score_reset'] = "Auf Server-Standard zurücksetzen";
$lang['edit']['spam_policy'] = "Hinzufügen und Entfernen von Einträgen in White- und Blacklists";
$lang['edit']['spam_alias'] = "Anpassen temporärer Alias-Adressen";
$lang['danger']['img_tmp_missing'] = "Grafik konnte nicht validiert werden: Erstellung temporärer Datei fehlgeschlagen";
$lang['danger']['comment_too_long'] = "Kommentarfeld darf maximal 160 Zeichen enthalten";
$lang['danger']['img_invalid'] = "Grafik konnte nicht validiert werden";
$lang['danger']['invalid_mime_type'] = "Grafik konnte nicht validiert werden: Ungültiger MIME-Type";
$lang['success']['upload_success'] = "Datei wurde erfolgreich hochgeladen";
$lang['success']['app_links'] = "Änderungen an App Links wurden gespeichert";
$lang['success']['ui_texts'] = "Änderungen an UI-Texten";
$lang['success']['reset_main_logo'] = "Standardgrafik wurde wiederhergestellt";
$lang['success']['items_released'] = "Ausgewählte Objekte wurden an Mailbox versendet";
$lang['danger']['imagick_exception'] = "Fataler Bildverarbeitungsfehler";
$lang['quarantine']['learn_spam_delete'] = "Als Spam lernen und löschen";
$lang['quarantine']['quarantine'] = "Quarantäne";
$lang['quarantine']['qinfo'] = 'Das Quarantänesystem speichert abgelehnte Nachrichten in der Datenbank. Dem Sender wird <em>nicht</em> signalisiert, dass seine E-Mail zugestellt wurde.
<br>"' . $lang['quarantine']['learn_spam_delete'] . '" lernt Nachrichten nach bayesscher Statistik als Spam und erstellt Fuzzy Hashes ausgehend von der jeweiligen Nachricht, um ähnliche Inhalte zukünftig zu unterbinden.
<br>Der Prozess des Lernens kann abhängig vom System zeitintensiv sein.';
$lang['quarantine']['release'] = "Freigeben";
$lang['quarantine']['empty'] = 'Keine Einträge';
$lang['quarantine']['toggle_all'] = 'Alle auswählen';
$lang['quarantine']['quick_actions'] = 'Aktionen';
$lang['quarantine']['remove'] = 'Entfernen';
$lang['quarantine']['received'] = "Empfangen";
$lang['quarantine']['action'] = "Aktion";
$lang['quarantine']['rcpt'] = "Empfänger";
$lang['quarantine']['qid'] = "Rspamd QID";
$lang['quarantine']['sender'] = "Sender";
$lang['quarantine']['show_item'] = "Details";
$lang['quarantine']['check_hash'] = "Checksumme auf VirusTotal suchen";
$lang['quarantine']['qitem'] = "Quarantäneeintrag";
$lang['quarantine']['subj'] = "Betreff";
$lang['quarantine']['recipients'] = "Empfänger";
$lang['quarantine']['text_plain_content'] = "Inhalt (text/plain)";
$lang['quarantine']['text_from_html_content'] = "Inhalt (html, konvertiert)";
$lang['quarantine']['atts'] = "Anhänge";
$lang['quarantine']['low_danger'] = "Niedrige Gefahr";
$lang['quarantine']['neutral_danger'] = "Neutral/ohne Bewertung";
$lang['quarantine']['medium_danger'] = "Mittlere Gefahr";
$lang['quarantine']['high_danger'] = "Hohe Gefahr";
$lang['quarantine']['danger'] = "Gefahr";
$lang['quarantine']['spam_score'] = "Bewertung";
$lang['quarantine']['qhandler_success'] = "Aktion wurde an das System übergeben. Sie dürfen dieses Fenster nun schließen.";
$lang['warning']['fuzzy_learn_error'] = "Fuzzy Lernfehler: %s";
$lang['danger']['spam_learn_error'] = "Spam Lernfehler: %s";
$lang['success']['qlearn_spam'] = "Nachricht ID %s wurde als Spam gelernt und gelöscht";
$lang['debug']['log_info'] = '<p>mailcow <b>in-memory Logs</b> werden in Redis Listen gespeichert, die maximale Anzahl der Einträge pro Anwendung richtet sich nach LOG_LINES (%d).
<br>In-memory Logs sind vergänglich und nicht zur ständigen Aufbewahrung bestimmt. Alle Anwendungen, die in-memory protokollieren, schreiben ebenso in den Docker Daemon.
<br>Das in-memory Protokoll versteht sich als schnelle Übersicht zum Debugging eines Containers, für komplexere Protokolle sollte der Docker Daemon konsultiert werden.</p>
<p><b>Externe Logs</b> werden via API externer Applikationen bezogen.</p>
<p><b>Statische Logs</b> sind weitestgehend Aktivitätsprotokolle, die nicht in den Docker Daemon geschrieben werden, jedoch permanent verfügbar sein müssen (ausgeschlossen API Logs).</p>';
$lang['debug']['in_memory_logs'] = 'In-memory Logs';
$lang['debug']['started_on'] = 'Gestartet am';
$lang['debug']['jvm_memory_solr'] = 'JVM Speicherauslastung';
$lang['debug']['external_logs'] = 'Externe Logs';
$lang['debug']['static_logs'] = 'Statische Logs';
$lang['debug']['solr_status'] = 'Solr Status';
$lang['debug']['solr_dead'] = 'Solr startet, ist deaktiviert oder temporär nicht erreichbar.';
$lang['debug']['solr_uptime'] = 'Uptime';
$lang['debug']['solr_started_at'] = 'Gestartet am';
$lang['debug']['solr_last_modified'] = 'Zuletzt geändert';
$lang['debug']['solr_size'] = 'Größe';
$lang['debug']['solr_docs'] = 'Dokumente';
$lang['quarantine']['release_body'] = "Die ursprüngliche Nachricht wurde als EML-Datei im Anhang hinterlegt.";
$lang['danger']['release_send_failed'] = "Die Nachricht konnte nicht versendet werden: %s";
$lang['quarantine']['release_subject'] = "Potentiell schädliche Nachricht aus Quarantäne: %s";
$lang['mailbox']['bcc_map'] = "BCC Map";
$lang['mailbox']['bcc_map_type'] = "BCC Typ";
$lang['mailbox']['bcc_type'] = "BCC Typ";
$lang['mailbox']['bcc_sender_map'] = "Senderabhängig";
$lang['mailbox']['bcc_rcpt_map'] = "Empfängerabhängig";
$lang['mailbox']['bcc_local_dest'] = "Lokales Ziel";
$lang['mailbox']['bcc_destinations'] = "BCC-Ziel";
$lang['mailbox']['bcc_destination'] = "BCC-Ziel";
$lang['edit']['bcc_dest_format'] = 'BCC-Ziel muss eine gültige E-Mail-Adresse sein.';
$lang['mailbox']['bcc'] = "BCC";
$lang['mailbox']['bcc_maps'] = "BCC-Maps";
$lang['mailbox']['bcc_to_sender'] = "Map senderabhängig verwenden";
$lang['mailbox']['bcc_to_rcpt'] = "Map empfängerabhängig verwenden";
$lang['mailbox']['add_bcc_entry'] = "BCC-Eintrag hinzufügen";
$lang['mailbox']['bcc_info'] = "Eine empfängerabhängige Map wird verwendet, wenn die BCC-Map Eintragung auf den Eingang einer E-Mail auf das lokale Ziel reagieren soll. Senderabhängige Maps verfahren nach dem gleichen Prinzip.<br/>
Das lokale Ziel wird bei Fehlzustellungen an ein BCC-Ziel nicht informiert.";
$lang['mailbox']['address_rewriting'] = 'Adressumschreibung';
$lang['mailbox']['recipient_maps'] = 'Empfängerumschreibungen';
$lang['mailbox']['recipient_map'] = 'Empfängerumschreibung';
$lang['mailbox']['recipient_map_info'] = 'Empfängerumschreibung ersetzen den Empfänger einer E-Mail vor dem Versand.';
$lang['mailbox']['recipient_map_old_info'] = 'Der originale Empfänger muss eine E-Mail-Adresse oder ein Domainname sein.';
$lang['mailbox']['recipient_map_new_info'] = 'Der neue Empfänger muss eine E-Mail-Adresse sein.';
$lang['mailbox']['recipient_map_old'] = 'Original Empfänger';
$lang['mailbox']['recipient_map_new'] = 'Neuer Empfänger';
$lang['mailbox']['add_recipient_map_entry'] = 'Empfängerumschreibung hinzufügen';
$lang['danger']['invalid_recipient_map_new'] = 'Neuer Empfänger "%s" ist ungültig';
$lang['danger']['invalid_recipient_map_old'] = 'Originaler Empfänger "%s" ist ungültig';
$lang['danger']['recipient_map_entry_exists'] = 'Eine Empfängerumschreibung für Objekt "%s" existiert bereits';
$lang['success']['recipient_map_entry_saved'] = 'Empfängerumschreibung für Objekt "%s" wurde gespeichert';
$lang['success']['recipient_map_entry_deleted'] = 'Empfängerumschreibung mit der ID %s wurde gelöscht';
$lang['danger']['tls_policy_map_entry_exists'] = 'Eine TLS-Richtlinie "%s" existiert bereits';
$lang['success']['tls_policy_map_entry_saved'] = 'TLS-Richtlinieneintrag "%s" wurde gespeichert';
$lang['success']['tls_policy_map_entry_deleted'] = 'TLS-Richtlinie mit der ID %s wurde gelöscht';
$lang['mailbox']['add_tls_policy_map'] = "TLS-Richtlinieneintrag hinzufügen";
$lang['danger']['tls_policy_map_parameter_invalid'] = "Parameter ist ungültig";
$lang['danger']['temp_error'] = "Temporärer Fehler";
$lang['admin']['sys_mails'] = 'System-E-Mails';
$lang['admin']['subject'] = 'Betreff';
$lang['admin']['from'] = 'Absender';
$lang['admin']['include_exclude'] = 'Ein- und Ausschlüsse';
$lang['admin']['include_exclude_info'] = 'Ohne Auswahl werden alle Mailboxen adressiert.';
$lang['admin']['excludes'] = 'Diese Empfänger ausschließen';
$lang['admin']['includes'] = 'Diese Empfänger einschließen';
$lang['admin']['text'] = 'Text';
$lang['admin']['activate_send'] = 'Senden-Button freischalten';
$lang['admin']['send'] = 'Senden';
$lang['warning']['ip_invalid'] = 'Ungültige IP übersprungen: %s';
$lang['danger']['text_empty'] = 'Text darf nicht leer sein';
$lang['danger']['subject_empty'] = 'Betreff darf nicht leer sein';
$lang['danger']['from_invalid'] = 'From address must be a valid email address';
$lang['danger']['network_host_invalid'] = 'Netzwerk oder Host ungültig: %s';
$lang['add']['mailbox_quota_def'] = 'Standard-Quota einer Mailbox';
$lang['edit']['mailbox_quota_def'] = 'Standard-Quota einer Mailbox';
$lang['danger']['mailbox_defquota_exceeds_mailbox_maxquota'] = 'Standard-Quota überschreitet das Limit der maximal erlaubten Größe einer Mailbox';
$lang['danger']['defquota_empty'] = 'Standard-Quota darf nicht 0 sein';
$lang['mailbox']['mailbox_defquota'] = 'Standard-Quota';
$lang['admin']['api_info'] = 'Das API befindet sich noch in Entwicklung, eine Dokumentation ist ausstehend.';
$lang['admin']['guid_and_license'] = 'GUID & Lizenz';
$lang['admin']['guid'] = 'GUID - Eindeutige Instanz-ID';
$lang['admin']['license_info'] = 'Eine Lizenz ist nicht erforderlich, hilft jedoch der Entwicklung mailcows.<br><a href="https://www.servercow.de/mailcow#sal" target="_blank" alt="SAL Bestellung">Hier kann die mailcow GUID registriert werden.</a> Alternativ ist <a href="https://www.servercow.de/mailcow#support" target="_blank" alt="SAL Bestellung">die Bestellung von Support-Paketen möglich</a>.';
$lang['admin']['validate_license_now'] = 'GUID erneut verifizieren';
$lang['admin']['customer_id'] = 'Kunde';
$lang['admin']['service_id'] = 'Service';
$lang['admin']['lookup_mx'] = 'Ziel gegen MX prüfen (etwa .outlook.com, um alle Ziele mit MX *.outlook.com zu routen)';
$lang['edit']['mbox_rl_info'] = 'Dieses Limit wird auf den SASL Loginnamen angewendet und betrifft daher alle Absenderadressen, die der eingeloggte Benutzer verwendet. Bei Mailbox Ratelimit überwiegt ein Domain-weites Ratelimit.';
$lang['add']['relayhost_wrapped_tls_info'] = 'Bitte <b>keine</b> TLS-wrapped Ports verwenden (etwa SMTPS via Port 465/tcp).<br>
Der Transport wird stattdessen STARTTLS anfordern, um TLS zu verwenden. TLS kann unter "TLS Policy Maps" erzwungen werden.';
$lang['admin']['transport_dest_format'] = 'Syntax: example.org, .example.org, *, box@example.org (mehrere Werte getrennt durch Komma einzugeben)';
$lang['mailbox']['alias_domain_backupmx'] = 'Alias-Domain für Relay-Domain inaktiv';
$lang['danger']['extra_acl_invalid'] = 'Externe Absenderadresse "%s" ist ungültig';
$lang['danger']['extra_acl_invalid_domain'] = 'Externe Absenderadresse "%s" verwendet eine ungültige Domain';
diff --git a/data/web/lang/lang.en.php b/data/web/lang/lang.en.php
index de5aaaef..efdb80ee 100644
--- a/data/web/lang/lang.en.php
+++ b/data/web/lang/lang.en.php
@@ -1,939 +1,939 @@
<?php
/*
* English language file
*/
$lang['header']['apps'] = 'Apps';
$lang['footer']['loading'] = "Please wait...";
$lang['header']['restart_sogo'] = 'Restart SOGo';
$lang['header']['restart_netfilter'] = 'Restart netfilter';
$lang['footer']['restart_container'] = 'Restart container';
$lang['footer']['restart_now'] = 'Restart now';
$lang['footer']['restarting_container'] = 'Restarting container, this may take a while...';
$lang['footer']['restart_container_info'] = '<b>Important:</b> A graceful restart may take a while to complete, please wait for it to finish.';
$lang['footer']['confirm_delete'] = 'Confirm deletion';
$lang['footer']['delete_these_items'] = 'Please confirm your changes to the following object id';
$lang['footer']['delete_now'] = 'Delete now';
$lang['footer']['cancel'] = 'Cancel';
$lang['footer']['hibp_nok'] = 'Matched! This is a potentially dangerous password!';
$lang['footer']['hibp_ok'] = 'No match found.';
$lang['danger']['transport_dest_exists'] = 'Transport destination "%s" exists';
$lang['danger']['unlimited_quota_acl'] = "Unlimited quota prohibited by ACL";
$lang['danger']['mysql_error'] = "MySQL error: %s";
$lang['danger']['redis_error'] = "Redis error: %s";
$lang['danger']['unknown_tfa_method'] = "Unknown TFA method";
$lang['danger']['totp_verification_failed'] = "TOTP verification failed";
$lang['success']['verified_totp_login'] = "Verified TOTP login";
$lang['danger']['u2f_verification_failed'] = "U2F verification failed: %s";
$lang['success']['verified_u2f_login'] = "Verified U2F login";
$lang['success']['verified_yotp_login'] = "Verified Yubico OTP login";
$lang['danger']['yotp_verification_failed'] = "Yubico OTP verification failed: %s";
$lang['danger']['ip_list_empty'] = "List of allowed IPs cannot be empty";
$lang['danger']['invalid_destination'] = 'Destination format "%s" is invalid';
$lang['danger']['invalid_nexthop'] = "Next hop format is invalid";
$lang['danger']['invalid_nexthop_authenticated'] = "Next hop exists with different credentials, please update the existing credentials for this next hop first.";
$lang['danger']['next_hop_interferes'] = "%s interferes with nexthop %s";
$lang['danger']['next_hop_interferes_any'] = "An existing next hop interferes with %s";
$lang['danger']['rspamd_ui_pw_length'] = "Rspamd UI password should be at least 6 chars long";
$lang['success']['rspamd_ui_pw_set'] = "Rspamd UI password successfully set";
$lang['success']['queue_command_success'] = "Queue command completed successfully";
$lang['danger']['unknown'] = "An unknown error occurred";
$lang['danger']['malformed_username'] = "Malformed username";
$lang['info']['awaiting_tfa_confirmation'] = "Awaiting TFA confirmation";
$lang['info']['session_expires'] = "Your session will expire in about 15 seconds";
$lang['success']['logged_in_as'] = "Logged in as %s";
$lang['danger']['login_failed'] = "Login failed";
$lang['danger']['set_acl_failed'] = "Failed to set ACL";
$lang['danger']['no_user_defined'] = "No user defined";
$lang['danger']['script_empty'] = "Script cannot be empty";
$lang['danger']['sieve_error'] = "Sieve parser error: %s";
$lang['danger']['value_missing'] = "Please provide all values";
$lang['danger']['filter_type'] = "Wrong filter type";
$lang['danger']['domain_cannot_match_hostname'] = "Domain cannot match hostname";
$lang['warning']['domain_added_sogo_failed'] = "Added domain but failed to restart SOGo, please check your server logs.";
$lang['danger']['rl_timeframe'] = "Rate limit time frame is incorrect";
$lang['success']['rl_saved'] = "Rate limit for object %s saved";
$lang['success']['acl_saved'] = "ACL for object %s saved";
$lang['success']['deleted_syncjobs'] = "Deleted syncjobs: %s";
$lang['success']['deleted_syncjob'] = "Deleted syncjob ID %s";
$lang['success']['delete_filters'] = "Deleted filters: %s";
$lang['success']['delete_filter'] = "Deleted filters ID %s";
$lang['danger']['invalid_bcc_map_type'] = "Invalid BCC map type";
$lang['danger']['bcc_empty'] = "BCC destination cannot be empty";
$lang['danger']['bcc_must_be_email'] = "BCC destination %s is not a valid email address";
$lang['danger']['bcc_exists'] = "A BCC map %s exists for type %s";
$lang['success']['bcc_saved'] = "BCC map entry saved";
$lang['success']['bcc_edited'] = "BCC map entry %s edited";
$lang['success']['bcc_deleted'] = "BCC map entries deleted: %s";
$lang['danger']['private_key_error'] = "Private key error: %s";
$lang['danger']['map_content_empty'] = "Map content cannot be empty";
$lang['success']['settings_map_added'] = "Added settings map entry";
$lang['danger']['settings_map_invalid'] = "Settings map ID %s invalid";
$lang['success']['settings_map_removed'] = "Removed settings map ID %s";
$lang['danger']['invalid_host'] = "Invalid host specified: %s";
$lang['danger']['relayhost_invalid'] = "Map entry %s is invalid";
$lang['success']['saved_settings'] = "Saved settings";
$lang['success']['db_init_complete'] = "Database initialization completed";
$lang['warning']['session_ua'] = "Form token invalid: User-Agent validation error";
$lang['warning']['session_token'] = "Form token invalid: Token mismatch";
$lang['danger']['dkim_domain_or_sel_invalid'] = "DKIM domain or selector invalid: %s";
$lang['success']['dkim_removed'] = "DKIM key %s has been removed";
$lang['success']['dkim_added'] = "DKIM key %s has been saved";
$lang['success']['dkim_duplicated'] = "DKIM key for domain %s has been copied to %s";
$lang['danger']['access_denied'] = "Access denied or invalid form data";
$lang['danger']['domain_invalid'] = "Domain name is empty or invalid";
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = "Max. quota exceeds domain quota limit";
$lang['danger']['object_is_not_numeric'] = "Value %s is not numeric";
$lang['success']['domain_added'] = "Added domain %s";
$lang['success']['items_deleted'] = "Item %s successfully deleted";
$lang['success']['item_deleted'] = "Item %s successfully deleted";
$lang['danger']['alias_empty'] = "Alias address must not be empty";
$lang['danger']['last_key'] = 'Last key cannot be deleted';
$lang['danger']['goto_empty'] = "Goto address must not be empty";
$lang['danger']['policy_list_from_exists'] = "A record with given name exists";
$lang['danger']['policy_list_from_invalid'] = "Record has invalid format";
$lang['danger']['alias_invalid'] = "Alias address %s is invalid";
$lang['danger']['goto_invalid'] = "Goto address %s is invalid";
$lang['danger']['alias_domain_invalid'] = "Alias domain %s is invalid";
$lang['danger']['target_domain_invalid'] = "Target domain %s is invalid";
$lang['danger']['object_exists'] = "Object %s already exists";
$lang['danger']['domain_exists'] = "Domain %s already exists";
$lang['danger']['alias_goto_identical'] = "Alias and goto address must not be identical";
$lang['danger']['aliasd_targetd_identical'] = "Alias domain must not be equal to target domain: %s";
$lang['danger']['maxquota_empty'] = 'Max. quota per mailbox must not be 0.';
$lang['success']['alias_added'] = "Alias address %s has been added";
$lang['success']['alias_modified'] = "Changes to alias address %s have been saved";
$lang['success']['mailbox_modified'] = "Changes to mailbox %s have been saved";
$lang['success']['resource_modified'] = "Changes to mailbox %s have been saved";
$lang['success']['object_modified'] = "Changes to object %s have been saved";
$lang['success']['f2b_modified'] = "Changes to Fail2ban parameters have been saved";
$lang['danger']['targetd_not_found'] = "Target domain %s not found";
$lang['danger']['targetd_relay_domain'] = "Target domain %s is a relay domain";
$lang['success']['aliasd_added'] = "Added alias domain %s";
$lang['success']['aliasd_modified'] = "Changes to alias domain %s have been saved";
$lang['success']['domain_modified'] = "Changes to domain %s have been saved";
$lang['success']['domain_admin_modified'] = "Changes to domain administrator %s have been saved";
$lang['success']['domain_admin_added'] = "Domain administrator %s has been added";
$lang['success']['admin_added'] = "Administrator %s has been added";
$lang['success']['admin_modified'] = "Changes to administrator have been saved";
$lang['success']['admin_api_modified'] = "Changes to API have been saved";
$lang['success']['license_modified'] = "Changes to license have been saved";
$lang['danger']['username_invalid'] = "Username %s cannot be used";
$lang['danger']['password_mismatch'] = "Confirmation password does not match";
$lang['danger']['password_complexity'] = "Password does not meet the policy";
$lang['danger']['password_empty'] = "Password must not be empty";
$lang['danger']['login_failed'] = "Login failed";
$lang['danger']['mailbox_invalid'] = "Mailbox name is invalid";
$lang['danger']['description_invalid'] = 'Resource description for %s is invalid';
$lang['danger']['resource_invalid'] = "Resource name %s is invalid";
$lang['danger']['is_alias'] = "%s is already known as an alias address";
$lang['danger']['is_alias_or_mailbox'] = "%s is already known as an alias, a mailbox or an alias address expanded from an alias domain.";
$lang['danger']['is_spam_alias'] = "%s is already known as a spam alias address";
$lang['danger']['quota_not_0_not_numeric'] = "Quota must be numeric and >= 0";
$lang['danger']['domain_not_found'] = 'Domain %s not found';
$lang['danger']['max_mailbox_exceeded'] = "Max. mailboxes exceeded (%d of %d)";
$lang['danger']['max_alias_exceeded'] = 'Max. aliases exceeded';
$lang['danger']['mailbox_quota_exceeded'] = "Quota exceeds the domain limit (max. %d MiB)";
$lang['danger']['mailbox_quota_left_exceeded'] = "Not enough space left (space left: %d MiB)";
$lang['success']['mailbox_added'] = "Mailbox %s has been added";
$lang['success']['resource_added'] = "Resource %s has been added";
$lang['success']['domain_removed'] = "Domain %s has been removed";
$lang['success']['alias_removed'] = "Alias %s has been removed";
$lang['success']['alias_domain_removed'] = "Alias domain %s has been removed";
$lang['success']['domain_admin_removed'] = "Domain administrator %s has been removed";
$lang['success']['admin_removed'] = "Administrator %s has been removed";
$lang['success']['mailbox_removed'] = "Mailbox %s has been removed";
$lang['success']['eas_reset'] = "ActiveSync devices for user %s were reset";
$lang['success']['sogo_profile_reset'] = "SOGo profile for user %s was reset";
$lang['success']['resource_removed'] = "Resource %s has been removed";
$lang['warning']['cannot_delete_self'] = "Cannot delete logged in user";
$lang['warning']['no_active_admin'] = "Cannot deactivate last active admin";
$lang['danger']['max_quota_in_use'] = "Mailbox quota must be greater or equal to %d MiB";
$lang['danger']['domain_quota_m_in_use'] = "Domain quota must be greater or equal to %s MiB";
$lang['danger']['mailboxes_in_use'] = "Max. mailboxes must be greater or equal to %d";
$lang['danger']['aliases_in_use'] = "Max. aliases must be greater or equal to %d";
$lang['danger']['sender_acl_invalid'] = "Sender ACL value %s is invalid";
$lang['danger']['domain_not_empty'] = "Cannot remove non-empty domain %s";
$lang['danger']['validity_missing'] = 'Please assign a period of validity';
$lang['user']['loading'] = "Loading...";
$lang['user']['force_pw_update'] = 'You <b>must</b> set a new password to be able to access groupware related services.';
$lang['user']['active_sieve'] = "Active filter";
$lang['user']['show_sieve_filters'] = "Show active user sieve filter";
$lang['user']['no_active_filter'] = "No active filter available";
$lang['user']['messages'] = "messages"; // "123 messages"
$lang['user']['in_use'] = "Used";
$lang['user']['user_change_fn'] = "";
$lang['user']['user_settings'] = 'User settings';
$lang['user']['mailbox_details'] = 'Mailbox details';
$lang['user']['change_password'] = 'Change password';
$lang['user']['client_configuration'] = 'Show configuration guides for email clients and smartphones';
$lang['user']['new_password'] = 'New password';
$lang['user']['save_changes'] = 'Save changes';
$lang['user']['password_now'] = 'Current password (confirm changes)';
$lang['user']['new_password_repeat'] = 'Confirmation password (repeat)';
$lang['user']['new_password_description'] = 'Requirement: 6 characters long, letters and numbers.';
$lang['user']['spam_aliases'] = 'Temporary email aliases';
$lang['user']['alias'] = 'Alias';
$lang['user']['shared_aliases'] = 'Shared alias addresses';
$lang['user']['shared_aliases_desc'] = 'Shared aliases are not affected by user specific settings such as the spam filter or encryption policy. Corresponding spam filters can only be made by an administrator as a domain-wide policy.';
$lang['user']['direct_aliases'] = 'Direct alias addresses';
$lang['user']['direct_aliases_desc'] = 'Direct alias addresses are affected by spam filter and TLS policy settings.';
$lang['user']['is_catch_all'] = 'Catch-all for domain/s';
$lang['user']['aliases_also_send_as'] = 'Also allowed to send as user';
$lang['user']['aliases_send_as_all'] = 'Do not check sender access for the following domain(s) and its alias domains';
$lang['user']['alias_create_random'] = 'Generate random alias';
$lang['user']['alias_extend_all'] = 'Extend aliases by 1 hour';
$lang['user']['alias_valid_until'] = 'Valid until';
$lang['user']['alias_remove_all'] = 'Remove all aliases';
$lang['user']['alias_time_left'] = 'Time left';
$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
$lang['user']['alias_select_validity'] = 'Period of validity';
$lang['user']['sync_jobs'] = 'Sync jobs';
$lang['user']['expire_in'] = 'Expire in';
$lang['user']['hour'] = 'hour';
$lang['user']['hours'] = 'hours';
$lang['user']['day'] = 'day';
$lang['user']['week'] = 'week';
$lang['user']['weeks'] = 'weeks';
$lang['user']['spamfilter'] = 'Spam filter';
$lang['admin']['spamfilter'] = 'Spam filter';
$lang['user']['spamfilter_wl'] = 'Whitelist';
$lang['user']['spamfilter_wl_desc'] = 'Whitelisted email addresses to <b>never</b> classify as spam. Wildcards may be used. A filter is only applied to direct aliases (aliases with a single target mailbox) excluding catch-all aliases and a mailbox itself.';
$lang['user']['spamfilter_bl'] = 'Blacklist';
$lang['user']['spamfilter_bl_desc'] = 'Blacklisted email addresses to <b>always</b> classify as spam and reject. Wildcards may be used. A filter is only applied to direct aliases (aliases with a single target mailbox) excluding catch-all aliases and a mailbox itself.';
$lang['user']['spamfilter_behavior'] = 'Rating';
$lang['user']['spamfilter_table_rule'] = 'Rule';
$lang['user']['spamfilter_table_action'] = 'Action';
$lang['user']['spamfilter_table_empty'] = 'No data to display';
$lang['user']['spamfilter_table_remove'] = 'remove';
$lang['user']['spamfilter_table_add'] = 'Add item';
$lang['user']['spamfilter_green'] = 'Green: this message is not spam';
$lang['user']['spamfilter_yellow'] = 'Yellow: this message may be spam, will be tagged as spam and moved to your junk folder';
$lang['user']['spamfilter_red'] = 'Red: This message is spam and will be rejected by the server';
$lang['user']['spamfilter_default_score'] = 'Default values';
$lang['user']['spamfilter_hint'] = 'The first value describes the "low spam score", the second represents the "high spam score".';
$lang['user']['spamfilter_table_domain_policy'] = "n/a (domain policy)";
$lang['user']['waiting'] = "Waiting";
$lang['user']['status'] = "Status";
$lang['user']['running'] = "Running";
$lang['user']['tls_policy_warning'] = '<strong>Warning:</strong> If you decide to enforce encrypted mail transfer, you may lose emails.<br>Messages to not satisfy the policy will be bounced with a hard fail by the mail system.<br>This option applies to your primary email address (login name), all addresses derived from alias domains as well as alias addresses <b>with only this single mailbox</b> as target.';
$lang['user']['tls_policy'] = 'Encryption policy';
$lang['user']['tls_enforce_in'] = 'Enforce TLS incoming';
$lang['user']['tls_enforce_out'] = 'Enforce TLS outgoing';
$lang['user']['no_record'] = 'No record';
$lang['user']['tag_handling'] = 'Set handling for tagged mail';
$lang['user']['tag_in_subfolder'] = 'In subfolder';
$lang['user']['tag_in_subject'] = 'In subject';
$lang['user']['tag_in_none'] = 'Do nothing';
$lang['user']['tag_help_explain'] = 'In subfolder: a new subfolder named after the tag will be created below INBOX ("INBOX/Facebook").<br>
In subject: the tags name will be prepended to the mails subject, example: "[Facebook] My News".';
$lang['user']['tag_help_example'] = 'Example for a tagged email address: me<b>+Facebook</b>@example.org';
$lang['user']['eas_reset'] = 'Reset ActiveSync device cache';
$lang['user']['eas_reset_now'] = 'Reset now';
$lang['user']['eas_reset_help'] = 'In many cases a device cache reset will help to recover a broken ActiveSync profile.<br><b>Attention:</b> All elements will be redownloaded!';
$lang['user']['sogo_profile_reset'] = 'Reset SOGo profile';
$lang['user']['sogo_profile_reset_now'] = 'Reset profile now';
$lang['user']['sogo_profile_reset_help'] = 'This will destroy a users SOGo profile and <b>delete all data irretrievable</b>.';
$lang['user']['encryption'] = 'Encryption';
$lang['user']['username'] = 'Username';
$lang['user']['last_run'] = 'Last run';
$lang['user']['excludes'] = 'Excludes';
$lang['user']['interval'] = 'Interval';
$lang['user']['active'] = 'Active';
$lang['user']['action'] = 'Action';
$lang['user']['edit'] = 'Edit';
$lang['user']['remove'] = 'Remove';
$lang['user']['create_syncjob'] = 'Create new sync job';
$lang['start']['mailcow_apps_detail'] = 'Use a mailcow app to access your mails, calendar, contacts and more.';
$lang['start']['mailcow_panel_detail'] = '<b>Domain administrators</b> create, modify or delete mailboxes and aliases, change domains and read further information about their assigned domains.<br>
<b>Mailbox users</b> are able to create time-limited aliases (spam aliases), change their password and spam filter settings.';
$lang['start']['imap_smtp_server_auth_info'] = 'Please use your full email address and the PLAIN authentication mechanism.<br>
Your login data will be encrypted by the server-side mandatory encryption.';
$lang['start']['help'] = 'Show/Hide help panel';
$lang['header']['mailcow_settings'] = 'Configuration';
$lang['header']['administration'] = 'Configuration & Details';
$lang['header']['mailboxes'] = 'Mail Setup';
$lang['header']['user_settings'] = 'User Settings';
$lang['header']['quarantine'] = "Quarantine";
$lang['header']['debug'] = "System Information";
$lang['quarantine']['disabled_by_config'] = "The current system configuration disables the quarantine functionality.";
$lang['mailbox']['tls_policy_maps'] = 'TLS policy maps';
$lang['mailbox']['tls_policy_maps_long'] = 'Outgoing TLS policy map overrides';
$lang['mailbox']['tls_policy_maps_info'] = 'This policy map overrides outgoing TLS transport rules independently of a users TLS policy settings.<br>
Please check <a href="http://www.postfix.org/postconf.5.html#smtp_tls_policy_maps" target="_blank">the "smtp_tls_policy_maps" docs</a> for further information.';
$lang['mailbox']['tls_enforce_in'] = 'Enforce TLS incoming';
$lang['mailbox']['tls_enforce_out'] = 'Enforce TLS outgoing';
$lang['mailbox']['tls_map_dest'] = 'Destination';
-$lang['mailbox']['tls_map_dest_info'] = 'Examples: example.org, .example.org, mail@example.org, [mail.example.org]:25';
+$lang['mailbox']['tls_map_dest_info'] = 'Examples: example.org, .example.org, [mail.example.org]:25';
$lang['mailbox']['tls_map_policy'] = 'Policy';
$lang['mailbox']['tls_map_parameters'] = 'Parameters';
$lang['mailbox']['tls_map_parameters_info'] = 'Empty or parameters, for example: protocols=!SSLv2 ciphers=medium exclude=3DES';
$lang['mailbox']['booking_0'] = 'Always show as free';
$lang['mailbox']['booking_lt0'] = 'Unlimited, but show as busy when booked';
$lang['mailbox']['booking_custom'] = 'Hard-limit to a custom amount of bookings';
$lang['mailbox']['booking_0_short'] = 'Always free';
$lang['mailbox']['booking_lt0_short'] = 'Soft limit';
$lang['mailbox']['booking_custom_short'] = 'Hard limit';
$lang['mailbox']['domain'] = 'Domain';
$lang['mailbox']['spam_aliases'] = 'Temp. alias';
$lang['mailbox']['multiple_bookings'] = 'Multiple bookings';
$lang['mailbox']['kind'] = 'Kind';
$lang['mailbox']['description'] = 'Description';
$lang['mailbox']['alias'] = 'Alias';
$lang['mailbox']['aliases'] = 'Aliases';
$lang['mailbox']['domains'] = 'Domains';
$lang['admin']['domain'] = 'Domain';
$lang['admin']['domain_s'] = 'Domain/s';
$lang['mailbox']['mailboxes'] = 'Mailboxes';
$lang['mailbox']['mailbox'] = 'Mailbox';
$lang['mailbox']['resources'] = 'Resources';
$lang['mailbox']['mailbox_quota'] = 'Max. size of a mailbox';
$lang['mailbox']['domain_quota'] = 'Quota';
$lang['mailbox']['active'] = 'Active';
$lang['mailbox']['action'] = 'Action';
$lang['mailbox']['backup_mx'] = 'Backup MX';
$lang['mailbox']['domain_aliases'] = 'Domain aliases';
$lang['mailbox']['target_domain'] = 'Target domain';
$lang['mailbox']['target_address'] = 'Goto address';
$lang['mailbox']['username'] = 'Username';
$lang['mailbox']['fname'] = 'Full name';
$lang['mailbox']['filter_table'] = 'Filter table';
$lang['mailbox']['yes'] = '&#10003;';
$lang['mailbox']['no'] = '&#10005;';
$lang['mailbox']['in_use'] = 'In use (%)';
$lang['mailbox']['msg_num'] = 'Message #';
$lang['mailbox']['remove'] = 'Remove';
$lang['mailbox']['edit'] = 'Edit';
$lang['mailbox']['no_record'] = 'No record for object %s';
$lang['mailbox']['no_record_single'] = 'No record';
$lang['mailbox']['add_domain'] = 'Add domain';
$lang['mailbox']['add_domain_alias'] = 'Add domain alias';
$lang['mailbox']['add_mailbox'] = 'Add mailbox';
$lang['mailbox']['add_resource'] = 'Add resource';
$lang['mailbox']['add_alias'] = 'Add alias';
$lang['mailbox']['add_domain_record_first'] = 'Please add a domain first';
$lang['mailbox']['empty'] = 'No results';
$lang['mailbox']['toggle_all'] = 'Toggle all';
$lang['mailbox']['quick_actions'] = 'Actions';
$lang['mailbox']['activate'] = 'Activate';
$lang['mailbox']['deactivate'] = 'Deactivate';
$lang['mailbox']['owner'] = 'Owner';
$lang['mailbox']['mins_interval'] = 'Interval (min)';
$lang['mailbox']['last_run'] = 'Last run';
$lang['mailbox']['excludes'] = 'Excludes';
$lang['mailbox']['last_run_reset'] = 'Schedule next';
$lang['mailbox']['sieve_info'] = 'You can store multiple filters per user, but only one prefilter and one postfilter can be active at the same time.<br>
Each filter will be processed in the described order. Neither a failed script nor an issued "keep;" will stop processing of further scripts.<br>
<a href="https://github.com/mailcow/mailcow-dockerized/blob/master/data/conf/dovecot/global_sieve_before" target="_blank">Global sieve prefilter</a> → Prefilter → User scripts → Postfilter → <a href="https://github.com/mailcow/mailcow-dockerized/blob/master/data/conf/dovecot/global_sieve_after" target="_blank">Global sieve postfilter</a>';
$lang['info']['no_action'] = 'No action applicable';
$lang['edit']['sogo_visible'] = 'Alias is visible in SOGo';
$lang['edit']['sogo_visible_info'] = 'This option only affects objects, that can be displayed in SOGo (shared or non-shared alias addresses pointing to at least one local mailbox).';
$lang['mailbox']['sogo_visible'] = 'Alias is visible in SOGo';
$lang['mailbox']['sogo_visible_y'] = 'Show alias in SOGo';
$lang['mailbox']['sogo_visible_n'] = 'Hide alias in SOGo';
$lang['edit']['syncjob'] = 'Edit sync job';
$lang['edit']['hostname'] = 'Hostname';
$lang['edit']['encryption'] = 'Encryption';
$lang['edit']['maxage'] = 'Maximum age of messages in days that will be polled from remote<br><small>(0 = ignore age)</small>';
$lang['edit']['maxbytespersecond'] = 'Max. bytes per second <br><small>(0 = unlimited)</small>';
$lang['edit']['automap'] = 'Try to automap folders ("Sent items", "Sent" => "Sent" etc.)';
$lang['edit']['skipcrossduplicates'] = 'Skip duplicate messages across folders (first come, first serve)';
$lang['add']['automap'] = 'Try to automap folders ("Sent items", "Sent" => "Sent" etc.)';
$lang['add']['skipcrossduplicates'] = 'Skip duplicate messages across folders (first come, first serve)';
$lang['edit']['subfolder2'] = 'Sync into subfolder on destination<br><small>(empty = do not use subfolder)</small>';
$lang['edit']['mins_interval'] = 'Interval (min)';
$lang['edit']['exclude'] = 'Exclude objects (regex)';
$lang['edit']['save'] = 'Save changes';
$lang['edit']['username'] = 'Username';
$lang['edit']['max_mailboxes'] = 'Max. possible mailboxes';
$lang['edit']['title'] = 'Edit object';
$lang['edit']['target_address'] = 'Goto address/es <small>(comma-separated)</small>';
$lang['edit']['active'] = 'Active';
$lang['edit']['gal'] = 'Global Address List';
$lang['add']['gal'] = 'Global Address List';
$lang['edit']['gal_info'] = 'The GAL contains all objects of a domain and cannot be edited by any user. Free/busy information in SOGo is missing, if disabled! <b>Restart SOGo to apply changes.</b>';
$lang['add']['gal_info'] = 'The GAL contains all objects of a domain and cannot be edited by any user. Free/busy information in SOGo is missing, if disabled! <b>Restart SOGo to apply changes.</b>';
$lang['edit']['force_pw_update'] = 'Force password update at next login';
$lang['edit']['force_pw_update_info'] = 'This user will only be able to login to mailcow UI.';
$lang['edit']['sogo_access'] = 'Grant access to SOGo';
$lang['edit']['sogo_access_info'] = 'Grant or permit access to SOGo. This setting does neither affect access to all other services nor does it delete or change a users existing SOGo profile.';
$lang['edit']['target_domain'] = 'Target domain';
$lang['edit']['password'] = 'Password';
$lang['edit']['password_repeat'] = 'Confirmation password (repeat)';
$lang['edit']['domain_admin'] = 'Edit domain administrator';
$lang['edit']['domain'] = 'Edit domain';
$lang['edit']['edit_alias_domain'] = 'Edit Alias domain';
$lang['edit']['domains'] = 'Domains';
$lang['edit']['alias'] = 'Edit alias';
$lang['edit']['mailbox'] = 'Edit mailbox';
$lang['edit']['description'] = 'Description';
$lang['edit']['max_aliases'] = 'Max. aliases';
$lang['edit']['max_quota'] = 'Max. quota per mailbox (MiB)';
$lang['edit']['domain_quota'] = 'Domain quota';
$lang['edit']['backup_mx_options'] = 'Backup MX options';
$lang['edit']['relay_domain'] = 'Relay domain';
$lang['edit']['relay_all'] = 'Relay all recipients';
$lang['edit']['relay_all_info'] = '<small>If you choose <b>not</b> to relay all recipients, you will need to add a ("blind") mailbox for every single recipient that should be relayed.</small>';
$lang['edit']['full_name'] = 'Full name';
$lang['edit']['quota_mb'] = 'Quota (MiB)';
$lang['edit']['sender_acl'] = 'Allow to send as';
$lang['edit']['sender_acl_disabled'] = '↳ <span class="label label-danger">Sender check is disabled</span>';
$lang['user']['sender_acl_disabled'] = '<span class="label label-danger">Sender check is disabled</span>';
$lang['edit']['previous'] = 'Previous page';
$lang['edit']['unchanged_if_empty'] = 'If unchanged leave blank';
$lang['edit']['dont_check_sender_acl'] = "Disable sender check for domain %s (+ alias domains)";
$lang['edit']['multiple_bookings'] = 'Multiple bookings';
$lang['edit']['kind'] = 'Kind';
$lang['edit']['resource'] = 'Resource';
$lang['edit']['relayhost'] = 'Sender-dependent transports';
$lang['edit']['public_comment'] = 'Public comment';
$lang['mailbox']['public_comment'] = 'Public comment';
$lang['edit']['private_comment'] = 'Private comment';
$lang['mailbox']['private_comment'] = 'Private comment';
$lang['edit']['comment_info'] = 'A private comment is not visible to the user, while a public comment is shown as tooltip when hovering it in a users overview';
$lang['add']['public_comment'] = 'Public comment';
$lang['add']['private_comment'] = 'Private comment';
$lang['add']['comment_info'] = 'A private comment is not visible to the user, while a public comment is shown as tooltip when hovering it in a users overview';
$lang['acl']['spam_alias'] = 'Temporary aliases';
$lang['acl']['tls_policy'] = 'TLS policy';
$lang['acl']['spam_score'] = 'Spam score';
$lang['acl']['spam_policy'] = 'Blacklist/Whitelist';
$lang['acl']['delimiter_action'] = 'Delimiter action';
$lang['acl']['syncjobs'] = 'Sync jobs';
$lang['acl']['eas_reset'] = 'Reset EAS devices';
$lang['acl']['sogo_profile_reset'] = 'Reset SOGo profile';
$lang['acl']['quarantine'] = 'Quarantine actions';
$lang['acl']['quarantine_notification'] = 'Change quarantine notifications';
$lang['acl']['quarantine_attachments'] = 'Quarantine attachments';
$lang['acl']['alias_domains'] = 'Add alias domains';
$lang['acl']['login_as'] = 'Login as mailbox user';
$lang['acl']['bcc_maps'] = 'BCC maps';
$lang['acl']['filters'] = 'Filters';
$lang['acl']['ratelimit'] = 'Rate limit';
$lang['acl']['recipient_maps'] = 'Recipient maps';
$lang['acl']['unlimited_quota'] = 'Unlimited quota for mailboxes';
$lang['acl']['extend_sender_acl'] = 'Allow to extend sender ACL by external addresses';
$lang['acl']['prohibited'] = 'Prohibited by ACL';
$lang['edit']['extended_sender_acl'] = 'External sender addresses';
$lang['edit']['extended_sender_acl_info'] = 'A DKIM domain key should be imported, if available.<br>
Remember to add this server to the corresponding SPF TXT record.<br>
Whenever a domain or alias domain is added to this server, that overlaps with an external address, the external address is removed.<br>
Use @domain.tld to allow to send as *@domain.tld.';
$lang['edit']['sender_acl_info'] = 'If mailbox user A is allowed to send as mailbox user B, the sender address is not automatically displayed as selectable "from" field in SOGo.<br>
Mailbox user A needs to create a delegation in SOGo to allow mailbox user b to select their address as sender. This behaviour does not apply to alias addresses.';
$lang['mailbox']['quarantine_notification'] = 'Quarantine notifications';
$lang['mailbox']['never'] = 'Never';
$lang['mailbox']['hourly'] = 'Hourly';
$lang['mailbox']['daily'] = 'Daily';
$lang['mailbox']['weekly'] = 'Weekly';
$lang['user']['quarantine_notification'] = 'Quarantine notifications';
$lang['user']['never'] = 'Never';
$lang['user']['hourly'] = 'Hourly';
$lang['user']['daily'] = 'Daily';
$lang['user']['weekly'] = 'Weekly';
$lang['user']['quarantine_notification_info'] = 'Once a notification has been sent, items will be marked as "notified" and no further notifications will be sent for this particular item.';
$lang['add']['generate'] = 'generate';
$lang['add']['syncjob'] = 'Add sync job';
$lang['add']['syncjob_hint'] = 'Be aware that passwords need to be saved plain-text!';
$lang['add']['hostname'] = 'Host';
$lang['add']['destination'] = 'Destination';
$lang['add']['nexthop'] = 'Next hop';
$lang['edit']['nexthop'] = 'Next hop';
$lang['add']['port'] = 'Port';
$lang['add']['username'] = 'Username';
$lang['add']['enc_method'] = 'Encryption method';
$lang['add']['mins_interval'] = 'Polling interval (minutes)';
$lang['add']['exclude'] = 'Exclude objects (regex)';
$lang['add']['delete2duplicates'] = 'Delete duplicates on destination';
$lang['add']['delete1'] = 'Delete from source when completed';
$lang['add']['delete2'] = 'Delete messages on destination that are not on source';
$lang['add']['custom_params'] = 'Custom parameters';
$lang['add']['custom_params_hint'] = 'Right: --param=xy, wrong: --param xy';
$lang['add']['subscribeall'] = 'Subscribe all folders';
$lang['add']['timeout1'] = 'Timeout for connection to remote host';
$lang['add']['timeout2'] = 'Timeout for connection to local host';
$lang['edit']['timeout1'] = 'Timeout for connection to remote host';
$lang['edit']['timeout2'] = 'Timeout for connection to local host';
$lang['edit']['delete2duplicates'] = 'Delete duplicates on destination';
$lang['edit']['delete1'] = 'Delete from source when completed';
$lang['edit']['delete2'] = 'Delete messages on destination that are not on source';
$lang['add']['domain_matches_hostname'] = 'Domain %s matches hostname';
$lang['add']['domain'] = 'Domain';
$lang['add']['active'] = 'Active';
$lang['add']['multiple_bookings'] = 'Multiple bookings';
$lang['add']['description'] = 'Description';
$lang['add']['max_aliases'] = 'Max. possible aliases';
$lang['add']['max_mailboxes'] = 'Max. possible mailboxes';
$lang['add']['mailbox_quota_m'] = 'Max. quota per mailbox (MiB)';
$lang['add']['domain_quota_m'] = 'Total domain quota (MiB)';
$lang['add']['backup_mx_options'] = 'Backup MX options';
$lang['add']['relay_all'] = 'Relay all recipients';
$lang['add']['relay_domain'] = 'Relay this domain';
$lang['add']['relay_all_info'] = '<small>If you choose <b>not</b> to relay all recipients, you will need to add a ("blind") mailbox for every single recipient that should be relayed.</small>';
$lang['add']['alias_address'] = 'Alias address/es';
$lang['add']['alias_address_info'] = '<small>Full email address/es or @example.com, to catch all messages for a domain (comma-separated). <b>mailcow domains only</b>.</small>';
$lang['add']['alias_domain_info'] = '<small>Valid domain names only (comma-separated).</small>';
$lang['add']['target_address'] = 'Goto addresses';
$lang['add']['target_address_info'] = '<small>Full email address/es (comma-separated).</small>';
$lang['add']['alias_domain'] = 'Alias domain';
$lang['add']['select'] = 'Please select...';
$lang['add']['target_domain'] = 'Target domain';
$lang['add']['kind'] = 'Kind';
$lang['add']['mailbox_username'] = 'Username (left part of an email address)';
$lang['add']['full_name'] = 'Full name';
$lang['add']['quota_mb'] = 'Quota (MiB)';
$lang['add']['select_domain'] = 'Please select a domain first';
$lang['add']['password'] = 'Password';
$lang['add']['password_repeat'] = 'Confirmation password (repeat)';
$lang['add']['restart_sogo_hint'] = 'You will need to restart the SOGo service container after adding a new domain!';
$lang['add']['goto_null'] = 'Silently discard mail';
$lang['add']['goto_ham'] = 'Learn as <span class="text-success"><b>ham</b></span>';
$lang['add']['goto_spam'] = 'Learn as <span class="text-danger"><b>spam</b></span>';
$lang['add']['validation_success'] = 'Validated successfully';
$lang['add']['activate_filter_warn'] = 'All other filters will be deactivated, when active is checked.';
$lang['add']['validate'] = 'Validate';
$lang['mailbox']['add_filter'] = 'Add filter';
$lang['add']['sieve_desc'] = 'Short description';
$lang['edit']['sieve_desc'] = 'Short description';
$lang['add']['sieve_type'] = 'Filter type';
$lang['edit']['sieve_type'] = 'Filter type';
$lang['mailbox']['set_prefilter'] = 'Mark as prefilter';
$lang['mailbox']['set_postfilter'] = 'Mark as postfilter';
$lang['mailbox']['filters'] = 'Filters';
$lang['mailbox']['sync_jobs'] = 'Sync jobs';
$lang['mailbox']['inactive'] = 'Inactive';
$lang['edit']['validate_save'] = 'Validate and save';
$lang['login']['username'] = 'Username';
$lang['login']['password'] = 'Password';
$lang['login']['login'] = 'Login';
$lang['login']['delayed'] = 'Login was delayed by %s seconds.';
$lang['tfa']['tfa'] = "Two-factor authentication";
$lang['tfa']['set_tfa'] = "Set two-factor authentication method";
$lang['tfa']['yubi_otp'] = "Yubico OTP authentication";
$lang['tfa']['key_id'] = "An identifier for your YubiKey";
$lang['tfa']['init_u2f'] = "Initializing, please wait...";
$lang['tfa']['start_u2f_validation'] = "Start validation";
$lang['tfa']['reload_retry'] = "- (reload browser if the error persists)";
$lang['tfa']['key_id_totp'] = "An identifier for your key";
$lang['tfa']['error_code'] = "Error code";
$lang['tfa']['api_register'] = 'mailcow uses the Yubico Cloud API. Please get an API key for your key <a href="https://upgrade.yubico.com/getapikey/" target="_blank">here</a>';
$lang['tfa']['u2f'] = "U2F authentication";
$lang['tfa']['none'] = "Deactivate";
$lang['tfa']['delete_tfa'] = "Disable TFA";
$lang['tfa']['disable_tfa'] = "Disable TFA until next successful login";
$lang['tfa']['confirm'] = "Confirm";
$lang['tfa']['totp'] = "Time-based OTP (Google Authenticator, Authy, etc.)";
$lang['tfa']['select'] = "Please select";
$lang['tfa']['waiting_usb_auth'] = "<i>Waiting for USB device...</i><br><br>Please tap the button on your U2F USB device now.";
$lang['tfa']['waiting_usb_register'] = "<i>Waiting for USB device...</i><br><br>Please enter your password above and confirm your U2F registration by tapping the button on your U2F USB device.";
$lang['tfa']['scan_qr_code'] = "Please scan the following code with your authenticator app or enter the code manually.";
$lang['tfa']['enter_qr_code'] = "Your TOTP code if your device cannot scan QR codes";
$lang['tfa']['confirm_totp_token'] = "Please confirm your changes by entering the generated token";
$lang['admin']['rspamd-com_settings'] = '<a href="https://rspamd.com/doc/configuration/settings.html#settings-structure" target="_blank">Rspamd docs</a>
- A setting name will be auto-generated, please see the example presets below.';
$lang['admin']['no_new_rows'] = 'No further rows available';
$lang['admin']['queue_manager'] = 'Queue manager';
$lang['admin']['additional_rows'] = ' additional rows were added'; // parses to 'n additional rows were added'
$lang['admin']['private_key'] = 'Private key';
$lang['admin']['import'] = 'Import';
$lang['admin']['duplicate'] = 'Duplicate';
$lang['admin']['import_private_key'] = 'Import private key';
$lang['admin']['duplicate_dkim'] = 'Duplicate DKIM record';
$lang['admin']['dkim_from'] = 'From';
$lang['admin']['dkim_to'] = 'To';
$lang['admin']['dkim_from_title'] = 'Source domain to copy data from';
$lang['admin']['dkim_to_title'] = 'Target domain/s - will be overwritten';
$lang['admin']['f2b_parameters'] = 'Fail2ban parameters';
$lang['admin']['f2b_ban_time'] = 'Ban time (s)';
$lang['admin']['f2b_max_attempts'] = 'Max. attempts';
$lang['admin']['f2b_retry_window'] = 'Retry window (s) for max. attempts';
$lang['admin']['f2b_netban_ipv4'] = 'IPv4 subnet size to apply ban on (8-32)';
$lang['admin']['f2b_netban_ipv6'] = 'IPv6 subnet size to apply ban on (8-128)';
$lang['admin']['f2b_whitelist'] = 'Whitelisted networks/hosts';
$lang['admin']['f2b_blacklist'] = 'Blacklisted networks/hosts';
$lang['admin']['f2b_list_info'] = 'A blacklisted host or network will always outweigh a whitelist entity. <b>List updates will take a few seconds to be applied.</b>';
$lang['admin']['search_domain_da'] = 'Search domains';
$lang['admin']['r_inactive'] = 'Inactive restrictions';
$lang['admin']['r_active'] = 'Active restrictions';
$lang['admin']['r_info'] = 'Greyed out/disabled elements on the list of active restrictions are not known as valid restrictions to mailcow and cannot be moved. Unknown restrictions will be set in order of appearance anyway. <br>You can add new elements in <code>inc/vars.local.inc.php</code> to be able to toggle them.';
$lang['admin']['dkim_key_length'] = 'DKIM key length (bits)';
$lang['admin']['dkim_key_valid'] = 'Key valid';
$lang['admin']['dkim_key_unused'] = 'Key unused';
$lang['admin']['dkim_key_missing'] = 'Key missing';
$lang['admin']['dkim_add_key'] = 'Add ARC/DKIM key';
$lang['admin']['dkim_keys'] = 'ARC/DKIM keys';
$lang['admin']['dkim_private_key'] = 'Private key';
$lang['admin']['dkim_domains_wo_keys'] = "Select domains with missing keys";
$lang['admin']['dkim_domains_selector'] = "Selector";
$lang['admin']['add'] = 'Add';
$lang['add']['add_domain_restart'] = 'Add domain and restart SOGo';
$lang['add']['add_domain_only'] = 'Add domain only';
$lang['admin']['configuration'] = 'Configuration';
$lang['admin']['password'] = 'Password';
$lang['admin']['password_repeat'] = 'Confirmation password (repeat)';
$lang['admin']['active'] = 'Active';
$lang['admin']['inactive'] = 'Inactive';
$lang['admin']['action'] = 'Action';
$lang['admin']['add_domain_admin'] = 'Add domain administrator';
$lang['admin']['add_admin'] = 'Add administrator';
$lang['admin']['add_settings_rule'] = 'Add settings rule';
$lang['admin']['rsetting_desc'] = 'Short description';
$lang['admin']['rsetting_content'] = 'Rule content';
$lang['admin']['rsetting_none'] = 'No rules available';
$lang['admin']['rsetting_no_selection'] = 'Please select a rule';
$lang['admin']['rsettings_preset_1'] = 'Disable all but DKIM and rate limit for authenticated users';
$lang['admin']['rsettings_preset_2'] = 'Postmasters want spam';
$lang['admin']['rsettings_insert_preset'] = 'Insert example preset "%s"';
$lang['admin']['rsetting_add_rule'] = 'Add rule';
$lang['admin']['queue_ays'] = 'Please confirm you want to delete all items from the current queue.';
$lang['admin']['arrival_time'] = 'Arrival time (server time)';
$lang['admin']['message_size'] = 'Message size';
$lang['admin']['sender'] = 'Sender';
$lang['admin']['recipients'] = 'Recipients';
$lang['admin']['admin_domains'] = 'Domain assignments';
$lang['admin']['domain_admins'] = 'Domain administrators';
$lang['admin']['flush_queue'] = 'Flush queue';
$lang['admin']['delete_queue'] = 'Delete all';
$lang['admin']['queue_deliver_mail'] = 'Deliver';
$lang['admin']['queue_hold_mail'] = 'Hold';
$lang['admin']['queue_unhold_mail'] = 'Unhold';
$lang['admin']['username'] = 'Username';
$lang['admin']['edit'] = 'Edit';
$lang['admin']['remove'] = 'Remove';
$lang['admin']['save'] = 'Save changes';
$lang['admin']['admin'] = 'Administrator';
$lang['admin']['admin_details'] = 'Edit administrator details';
$lang['admin']['unchanged_if_empty'] = 'If unchanged leave blank';
$lang['admin']['yes'] = '&#10003;';
$lang['admin']['no'] = '&#10005;';
$lang['admin']['access'] = 'Access';
$lang['admin']['no_record'] = 'No record';
$lang['admin']['filter_table'] = 'Filter table';
$lang['admin']['empty'] = 'No results';
$lang['admin']['time'] = 'Time';
$lang['admin']['last_applied'] = 'Last applied';
$lang['admin']['reset_limit'] = 'Remove hash';
$lang['admin']['hash_remove_info'] = 'Removing a ratelimit hash (if still existing) will reset its counter completely.<br>
Each hash is indicated by an individual color.';
$lang['warning']['hash_not_found'] = 'Hash not found or already deleted';
$lang['success']['hash_deleted'] = 'Hash deleted';
$lang['admin']['authed_user'] = 'Auth. user';
$lang['admin']['priority'] = 'Priority';
$lang['admin']['message'] = 'Message';
$lang['admin']['rate_name'] = 'Rate name';
$lang['admin']['refresh'] = 'Refresh';
$lang['admin']['to_top'] = 'Back to top';
$lang['admin']['in_use_by'] = 'In use by';
$lang['admin']['forwarding_hosts'] = 'Forwarding Hosts';
$lang['admin']['forwarding_hosts_hint'] = 'Incoming messages are unconditionally accepted from any hosts listed here. These hosts are then not checked against DNSBLs or subjected to greylisting. Spam received from them is never rejected, but optionally it can be filed into the Junk folder. The most common use for this is to specify mail servers on which you have set up a rule that forwards incoming emails to your mailcow server.';
$lang['admin']['forwarding_hosts_add_hint'] = 'You can either specify IPv4/IPv6 addresses, networks in CIDR notation, host names (which will be resolved to IP addresses), or domain names (which will be resolved to IP addresses by querying SPF records or, in their absence, MX records).';
$lang['admin']['relayhosts_hint'] = 'Define sender-dependent transports to be able to select them in a domains configuration dialog.<br>
The transport service is always "smtp:". A users individual outbound TLS policy setting is taken into account.<br>
Affects selected domains including alias domains.';
$lang['admin']['transports_hint'] = '→ A transport map entry <b>overrules</b> a sender-dependent transport map</b>.<br>
→ Outbound TLS policy settings per-user are ignored and can only be enforced by TLS policy map entries.<br>
→ The transport service for defined transports is always "smtp:".<br>
→ Addresses matching "/localhost$/" will always be transported via "local:", therefore a "*" destination will not apply to those addresses.<br>
→ To determine credentials for an exemplary next hop "[host]:25", Postfix <b>always</b> queries for "host" before searching for "[host]:25". This behavior makes it impossible to use "host" and "[host]:25" at the same time.';
$lang['admin']['add_relayhost_hint'] = 'Please be aware that authentication data, if any, will be stored as plain text.';
$lang['admin']['add_transports_hint'] = 'Please be aware that authentication data, if any, will be stored as plain text.';
$lang['admin']['host'] = 'Host';
$lang['admin']['source'] = 'Source';
$lang['admin']['add_forwarding_host'] = 'Add forwarding host';
$lang['admin']['add_relayhost'] = 'Add sender-dependent transport';
$lang['admin']['add_transport'] = 'Add transport';
$lang['admin']['relayhosts'] = 'Sender-dependent transports';
$lang['admin']['transport_maps'] = 'Transport Maps';
$lang['admin']['routing'] = 'Routing';
$lang['admin']['credentials_transport_warning'] = '<b>Warning</b>: Adding a new transport map entry will update the credentials for all entries with a matching nexthop column.';
$lang['admin']['destination'] = 'Destination';
$lang['admin']['nexthop'] = 'Next hop';
$lang['admin']['oauth2_info'] = 'The OAuth2 implementation supports the grant type "Authorization Code" and issues refresh tokens.<br>
The server also automatically issues new refresh tokens, after a refresh token has been used.<br><br>
→ The default scope is <i>profile</i>. Only mailbox users can be authenticated against OAuth2. If the scope parameter is omitted, it falls back to <i>profile</i>.<br>
→ The <i>state</i> parameter is required to be sent by the client as part of the authorize request.<br><br>
Pathes for requests to the OAuth2 API: <br>
<ul>
<li>Authorization endpoint: <code>/oauth/authorize</code></li>
<li>Token endpoint: <code>/oauth/token</code></li>
<li>Resource page: <code>/oauth/profile</code></li>
</ul>
Regenerating the client secret will not expire existing authorization codes, but they will fail to renew their token.<br><br>
Revoking client tokens will cause immediate termination of all active sessions. All clients need to re-authenticate.';
$lang['admin']['oauth2_client_id'] = "Client ID";
$lang['admin']['oauth2_client_secret'] = "Client secret";
$lang['admin']['oauth2_redirect_uri'] = "Redirect URI";
$lang['admin']['oauth2_revoke_tokens'] = 'Revoke all client tokens';
$lang['admin']['oauth2_renew_secret'] = 'Generate new client secret';
$lang['edit']['client_id'] = 'Client ID';
$lang['edit']['client_secret'] = 'Client secret';
$lang['edit']['scope'] = 'Scope';
$lang['edit']['grant_types'] = 'Grant types';
$lang['edit']['redirect_uri'] = 'Redirect/Callback URL';
$lang['oauth2']['scope_ask_permission'] = 'An application asked for the following permissions';
$lang['oauth2']['profile'] = 'Profile';
$lang['oauth2']['profile_desc'] = 'View personal information: username, full name, created, modified, active';
$lang['oauth2']['permit'] = 'Authorize application';
$lang['oauth2']['authorize_app'] = 'Authorize application';
$lang['oauth2']['deny'] = 'Deny';
$lang['oauth2']['access_denied'] = 'Please login as mailbox owner to grant access via OAuth2.';
$lang['success']['forwarding_host_removed'] = "Forwarding host %s has been removed";
$lang['success']['forwarding_host_added'] = "Forwarding host %s has been added";
$lang['success']['relayhost_removed'] = "Map entry %s has been removed";
$lang['success']['relayhost_added'] = "Map entry %s has been added";
$lang['diagnostics']['dns_records'] = 'DNS Records';
$lang['diagnostics']['dns_records_24hours'] = 'Please note that changes made to DNS may take up to 24 hours to correctly have their current state reflected on this page. It is intended as a way for you to easily see how to configure your DNS records and to check whether all your records are correctly stored in DNS.';
$lang['diagnostics']['dns_records_name'] = 'Name';
$lang['diagnostics']['dns_records_type'] = 'Type';
$lang['diagnostics']['dns_records_data'] = 'Correct Data';
$lang['diagnostics']['dns_records_status'] = 'Current State';
$lang['diagnostics']['optional'] = 'This record is optional.';
$lang['diagnostics']['cname_from_a'] = 'Value derived from A/AAAA record. This is supported as long as the record points to the correct resource.';
$lang['admin']['relay_from'] = '"From:" address';
$lang['admin']['relay_run'] = "Run test";
$lang['admin']['api_allow_from'] = "Allow API access from these IPs (separated by comma or new line)";
$lang['admin']['api_key'] = "API key";
$lang['admin']['activate_api'] = "Activate API";
$lang['admin']['regen_api_key'] = "Regenerate API key";
$lang['admin']['ban_list_info'] = "See a list of banned IPs below: <b>network (remaining ban time) - [actions]</b>.<br />IPs queued to be unbanned will be removed from the active ban list within a few seconds.<br />Red labels indicate active permanent bans by blacklisting.";
$lang['admin']['unban_pending'] = "unban pending";
$lang['admin']['queue_unban'] = "queue unban";
$lang['admin']['no_active_bans'] = "No active bans";
$lang['admin']['quarantine'] = "Quarantine";
$lang['admin']['rspamd_settings_map'] = "Rspamd settings map";
$lang['admin']['quota_notifications'] = "Quota notifications";
$lang['admin']['quota_notifications_vars'] = "{{percent}} equals the current quota of the user<br>{{username}} is the mailbox name";
$lang['admin']['active_rspamd_settings_map'] = "Active settings map";
$lang['admin']['quota_notifications_info'] = "Quota notications are sent to users once when crossing 80% and once when crossing 95% usage.";
$lang['admin']['quarantine_retention_size'] = "Retentions per mailbox:<br><small>0 indicates <b>inactive</b>.</small>";
$lang['admin']['quarantine_max_size'] = "Maximum size in MiB (larger elements are discarded):<br><small>0 does <b>not</b> indicate unlimited.</small>";
$lang['admin']['quarantine_max_age'] = "Maximum age in days<br><small>Value must be equal to or greater than 1 day.</small>";
$lang['admin']['quarantine_exclude_domains'] = "Exclude domains and alias-domains";
$lang['admin']['quarantine_release_format'] = "Format of released items";
$lang['admin']['quarantine_release_format_raw'] = "Unmodified original";
$lang['admin']['quarantine_release_format_att'] = "As attachment";
$lang['admin']['quarantine_notification_sender'] = "Notification email sender";
$lang['admin']['quarantine_notification_subject'] = "Notification email subject";
$lang['admin']['quarantine_notification_html'] = "Notification email template:<br><small>Leave empty to restore default template.</small>";
$lang['admin']['quota_notification_sender'] = "Notification email sender";
$lang['admin']['quota_notification_subject'] = "Notification email subject";
$lang['admin']['quota_notification_html'] = "Notification email template:<br><small>Leave empty to restore default template.</small>";
$lang['admin']['ui_texts'] = "UI labels and texts";
$lang['admin']['help_text'] = "Override help text below login mask (HTML allowed)";
$lang['admin']['title_name'] = '"mailcow UI" website title';
$lang['admin']['main_name'] = '"mailcow UI" name';
$lang['admin']['apps_name'] = '"mailcow Apps" name';
$lang['admin']['ui_footer'] = 'Footer (HTML allowed)';
$lang['admin']['customize'] = "Customize";
$lang['admin']['change_logo'] = "Change logo";
$lang['admin']['logo_info'] = "Your image will be scaled to a height of 40px for the top navigation bar and a max. width of 250px for the start page. A scalable graphic is highly recommended.";
$lang['admin']['upload'] = "Upload";
$lang['admin']['app_links'] = "App links";
$lang['admin']['app_name'] = "App name";
$lang['admin']['link'] = "Link";
$lang['admin']['remove_row'] = "Remove row";
$lang['admin']['add_row'] = "Add row";
$lang['admin']['reset_default'] = "Reset to default";
$lang['admin']['merged_vars_hint'] = 'Greyed out rows were merged from <code>vars.(local.)inc.php</code> and cannot be modified.';
$lang['mailbox']['waiting'] = "Waiting";
$lang['mailbox']['status'] = "Status";
$lang['mailbox']['running'] = "Running";
$lang['mailbox']['enable_x'] = "Enable";
$lang['mailbox']['disable_x'] = "Disable";
$lang['edit']['spam_score'] = "Set a custom spam score";
$lang['user']['spam_score_reset'] = "Reset to server default";
$lang['edit']['spam_policy'] = "Add or remove items to white-/blacklist";
$lang['edit']['spam_alias'] = "Create or change time limited alias addresses";
$lang['danger']['comment_too_long'] = "Comment too long, max 160 chars allowed";
$lang['danger']['img_tmp_missing'] = "Cannot validate image file: Temporary file not found";
$lang['danger']['img_invalid'] = "Cannot validate image file";
$lang['danger']['invalid_mime_type'] = "Invalid mime type";
$lang['success']['upload_success'] = "File uploaded successfully";
$lang['success']['app_links'] = "Saved changes to app links";
$lang['success']['ui_texts'] = "Saved changes to UI texts";
$lang['success']['reset_main_logo'] = "Reset to default logo";
$lang['success']['items_released'] = "Selected items were released";
$lang['success']['item_released'] = "Item %s released";
$lang['danger']['imagick_exception'] = "Error: Imagick exception while reading image";
$lang['quarantine']['quarantine'] = "Quarantine";
$lang['quarantine']['learn_spam_delete'] = "Learn as spam and delete";
$lang['quarantine']['qinfo'] = 'The quarantine system will save rejected mail to the database, while the sender will <em>not</em> be given the impression of a delivered mail.
<br>"' . $lang['quarantine']['learn_spam_delete'] . '" will learn a message as spam via Bayesian theorem and also calculate fuzzy hashes to deny similar messages in the future.
<br>Please be aware that learning multiple messages can be - depending on your system - time consuming.';
$lang['quarantine']['release'] = "Release";
$lang['quarantine']['empty'] = 'No results';
$lang['quarantine']['toggle_all'] = 'Toggle all';
$lang['quarantine']['quick_actions'] = 'Actions';
$lang['quarantine']['remove'] = 'Remove';
$lang['quarantine']['received'] = "Received";
$lang['quarantine']['action'] = "Action";
$lang['quarantine']['rcpt'] = "Recipient";
$lang['quarantine']['qid'] = "Rspamd QID";
$lang['quarantine']['sender'] = "Sender";
$lang['quarantine']['show_item'] = "Show item";
$lang['quarantine']['check_hash'] = "Search file hash @ VT";
$lang['quarantine']['qitem'] = "Quarantine item";
$lang['quarantine']['subj'] = "Subject";
$lang['quarantine']['recipients'] = "Recipients";
$lang['quarantine']['text_plain_content'] = "Content (text/plain)";
$lang['quarantine']['text_from_html_content'] = "Content (converted html)";
$lang['quarantine']['atts'] = "Attachments";
$lang['quarantine']['low_danger'] = "Low danger";
$lang['quarantine']['neutral_danger'] = "Neutral/no rating";
$lang['quarantine']['medium_danger'] = "Medium danger";
$lang['quarantine']['high_danger'] = "High";
$lang['quarantine']['danger'] = "Danger";
$lang['quarantine']['spam_score'] = "Score";
$lang['quarantine']['confirm_delete'] = "Confirm the deletion of this element.";
$lang['quarantine']['qhandler_success'] = "Request successfully sent to the system. You can now close the window.";
$lang['warning']['fuzzy_learn_error'] = "Fuzzy hash learn error: %s";
$lang['danger']['spam_learn_error'] = "Spam learn error: %s";
$lang['success']['qlearn_spam'] = "Message ID %s was learned as spam and deleted";
$lang['debug']['system_containers'] = 'System & Containers';
$lang['debug']['started_on'] = 'Started on';
$lang['debug']['jvm_memory_solr'] = 'JVM memory usage';
$lang['debug']['solr_status'] = 'Solr status';
$lang['debug']['solr_dead'] = 'Solr is starting, disabled or died.';
$lang['debug']['logs'] = 'Logs';
$lang['debug']['log_info'] = '<p>mailcow <b>in-memory logs</b> are collected in Redis lists and trimmed to LOG_LINES (%d) every minute to reduce hammering.
<br>In-memory logs are not meant to be persistent. All applications that log in-memory, also log to the Docker daemon and therefore to the default logging driver.
<br>The in-memory log type should be used for debugging minor issues with containers.</p>
<p><b>External logs</b> are collected via API of the given application.</p>
<p><b>Static logs</b> are mostly activity logs, that are not logged to the Dockerd but still need to be persistent (except for API logs).</p>';
$lang['debug']['in_memory_logs'] = 'In-memory logs';
$lang['debug']['external_logs'] = 'External logs';
$lang['debug']['static_logs'] = 'Static logs';
$lang['debug']['solr_uptime'] = 'Uptime';
$lang['debug']['solr_started_at'] = 'Started at';
$lang['debug']['solr_last_modified'] = 'Last modified';
$lang['debug']['solr_size'] = 'Size';
$lang['debug']['solr_docs'] = 'Docs';
$lang['debug']['disk_usage'] = 'Disk usage';
$lang['debug']['containers_info'] = "Container information";
$lang['debug']['restart_container'] = 'Restart';
$lang['quarantine']['release_body'] = "We have attached your message as eml file to this message.";
$lang['danger']['release_send_failed'] = "Message could not be released: %s";
$lang['quarantine']['release_subject'] = "Potentially damaging quarantine item %s";
$lang['mailbox']['bcc_map'] = "BCC map";
$lang['mailbox']['bcc_map_type'] = "BCC type";
$lang['mailbox']['bcc_type'] = "BCC type";
$lang['mailbox']['bcc_sender_map'] = "Sender map";
$lang['mailbox']['bcc_rcpt_map'] = "Recipient map";
$lang['mailbox']['bcc_local_dest'] = "Local destination";
$lang['mailbox']['bcc_destinations'] = "BCC destination";
$lang['mailbox']['bcc_destination'] = "BCC destination";
$lang['edit']['bcc_dest_format'] = 'BCC destination must be a single valid email address.';
$lang['mailbox']['bcc'] = "BCC";
$lang['mailbox']['bcc_maps'] = "BCC maps";
$lang['mailbox']['bcc_to_sender'] = "Switch to sender map type";
$lang['mailbox']['bcc_to_rcpt'] = "Switch to recipient map type";
$lang['mailbox']['add_bcc_entry'] = "Add BCC map";
$lang['mailbox']['add_tls_policy_map'] = "Add TLS policy map";
$lang['mailbox']['bcc_info'] = "BCC maps are used to silently forward copies of all messages to another address. A recipient map type entry is used, when the local destination acts as recipient of a mail. Sender maps conform to the same principle.<br/>
The local destination will not be informed about a failed delivery.";
$lang['mailbox']['address_rewriting'] = 'Address rewriting';
$lang['mailbox']['recipient_maps'] = 'Recipient maps';
$lang['mailbox']['recipient_map'] = 'Recipient map';
$lang['mailbox']['recipient_map_info'] = 'Recipient maps are used to replace the destination address on a message before it is delivered.';
$lang['mailbox']['recipient_map_old_info'] = 'A recipient maps original destination must be valid email addresses or a domain name.';
$lang['mailbox']['recipient_map_new_info'] = 'Recipient map destination must be a valid email address.';
$lang['mailbox']['recipient_map_old'] = 'Original recipient';
$lang['mailbox']['recipient_map_new'] = 'New recipient';
$lang['danger']['invalid_recipient_map_new'] = 'Invalid new recipient specified: %s';
$lang['danger']['invalid_recipient_map_old'] = 'Invalid original recipient specified: %s';
$lang['danger']['recipient_map_entry_exists'] = 'A Recipient map entry "%s" exists';
$lang['success']['recipient_map_entry_saved'] = 'Recipient map entry "%s" has been saved';
$lang['success']['recipient_map_entry_deleted'] = 'Recipient map ID %s has been deleted';
$lang['danger']['tls_policy_map_entry_exists'] = 'A TLS policy map entry "%s" exists';
$lang['success']['tls_policy_map_entry_saved'] = 'TLS policy map entry "%s" has been saved';
$lang['success']['tls_policy_map_entry_deleted'] = 'TLS policy map ID %s has been deleted';
$lang['mailbox']['add_recipient_map_entry'] = 'Add recipient map';
$lang['danger']['tls_policy_map_parameter_invalid'] = "Policy parameter is invalid";
$lang['danger']['temp_error'] = "Temporary error";
$lang['admin']['sys_mails'] = 'System mails';
$lang['admin']['subject'] = 'Subject';
$lang['admin']['from'] = 'From';
$lang['admin']['include_exclude'] = 'Include/Exclude';
$lang['admin']['include_exclude_info'] = 'By default - with no selection - <b>all mailboxes</b> are addressed';
$lang['admin']['excludes'] = 'Excludes these recipients';
$lang['admin']['includes'] = 'Include these recipients';
$lang['admin']['text'] = 'Text';
$lang['admin']['activate_send'] = 'Activate send button';
$lang['admin']['send'] = 'Send';
$lang['warning']['ip_invalid'] = 'Skipped invalid IP: %s';
$lang['danger']['text_empty'] = 'Text must not be empty';
$lang['danger']['subject_empty'] = 'Subject must not be empty';
$lang['danger']['from_invalid'] = 'Sender must not be empty';
$lang['danger']['network_host_invalid'] = 'Invalid network or host: %s';
$lang['add']['mailbox_quota_def'] = 'Default mailbox quota';
$lang['edit']['mailbox_quota_def'] = 'Default mailbox quota';
$lang['danger']['mailbox_defquota_exceeds_mailbox_maxquota'] = 'Default quota exceeds max quota limit';
$lang['danger']['defquota_empty'] = 'Default quota per mailbox must not be 0.';
$lang['mailbox']['mailbox_defquota'] = 'Default mailbox size';
$lang['admin']['api_info'] = 'The API is a work in progress.';
$lang['admin']['guid_and_license'] = 'GUID & License';
$lang['admin']['guid'] = 'GUID - unique instance ID';
$lang['admin']['license_info'] = 'A license is not required but helps further development.<br><a href="https://www.servercow.de/mailcow?lang=en#sal" target="_blank" alt="SAL order">Register your GUID here</a> or <a href="https://www.servercow.de/mailcow?lang=en#support" target="_blank" alt="Support order">buy support for your mailcow installation.</a>';
$lang['admin']['validate_license_now'] = 'Validate GUID against license server';
$lang['admin']['customer_id'] = 'Customer ID';
$lang['admin']['service_id'] = 'Service ID';
$lang['admin']['lookup_mx'] = 'Match destination against MX (.outlook.com to route all mail targeted to a MX *.outlook.com over this hop)';
$lang['edit']['mbox_rl_info'] = 'This rate limit is applied on the SASL login name, it matches any "from" address used by the logged-in user. A mailbox rate limit overrides a domain-wide rate limit.';
$lang['add']['relayhost_wrapped_tls_info'] = 'Please do <b>not</b> use TLS-wrapped ports (mostly used on port 465).<br>
Use any non-wrapped port and issue STARTTLS. A TLS policy to enforce TLS can be created in "TLS policy maps".';
$lang['admin']['transport_dest_format'] = 'Syntax: example.org, .example.org, *, box@example.org (multiple values can be comma-separated)';
$lang['mailbox']['alias_domain_backupmx'] = 'Alias domain inactive for relay domain';
$lang['danger']['extra_acl_invalid'] = 'External sender address "%s" is invalid';
$lang['danger']['extra_acl_invalid_domain'] = 'External sender "%s" uses an invalid domain';
diff --git a/data/web/lang/lang.es.php b/data/web/lang/lang.es.php
index 4e3aafa9..d93c185f 100644
--- a/data/web/lang/lang.es.php
+++ b/data/web/lang/lang.es.php
@@ -1,784 +1,784 @@
<?php
/*
* Spanish language file
*/
$lang['footer']['loading'] = "Espera por favor...";
$lang['header']['restart_sogo'] = 'Reiniciar SOGo';
$lang['footer']['restart_sogo'] = 'Reiniciar SOGo';
$lang['footer']['restart_now'] = 'Reiniciar ahora';
$lang['footer']['restart_sogo_info'] = 'Algunas tareas, por ejemplo agregar un dominio, requieren que se reinicie SOGo para detectar cambios hechos en la UI de mailcow.<br><br><b>Importante:</b> Un reinicio sencillo puede tardar un poco en completarse, por favor espera a que termine.';
$lang['danger']['dkim_domain_or_sel_invalid'] = "Dominio DKIM ó selector inválido";
$lang['success']['dkim_removed'] = "Registro DKIM removido";
$lang['success']['dkim_added'] = "Registro DKIM guardado";
$lang['danger']['access_denied'] = "Acceso denegado o datos del formulario inválidos";
$lang['danger']['domain_invalid'] = "Nombre de dominio inválido";
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = "Cuota máx. excede el limite de cuota del dominio";
$lang['danger']['object_is_not_numeric'] = "El valor %s no es numérico";
$lang['success']['domain_added'] = "Dominio agregado %s";
$lang['danger']['alias_empty'] = "Dirección alias no debe estar vacía";
$lang['danger']['goto_empty'] = "Dirección \"goto\" no debe estar vacía";
$lang['danger']['policy_list_from_exists'] = "Un registro con ese nombre ya existe";
$lang['danger']['policy_list_from_invalid'] = "El registro tiene formato inválido";
$lang['danger']['alias_invalid'] = "Dirección alias inválida";
$lang['danger']['goto_invalid'] = "Dirección \"goto\" inválida";
$lang['danger']['alias_domain_invalid'] = "El dominio alias es inválido";
$lang['danger']['target_domain_invalid'] = "El dominio \"goto\" es inválido";
$lang['danger']['object_exists'] = "El objeto %s ya existe";
$lang['danger']['domain_exists'] = "El dominio %s ya existe";
$lang['danger']['alias_goto_identical'] = "Las direcciones alias y \"goto\" no deben ser idénticas";
$lang['danger']['aliasd_targetd_identical'] = "El dominio alias no debe ser igual al dominio destino";
$lang['success']['alias_added'] = "Dirección(es) alias ha/han sidgo agregada(s)";
$lang['success']['alias_modified'] = "Cambios al alias guardados";
$lang['success']['mailbox_modified'] = "Cambios al buzón %s guardados";
$lang['danger']['targetd_not_found'] = "Dominio destino no encontrado";
$lang['success']['aliasd_added'] = "Dominio alias %s agregado";
$lang['success']['aliasd_modified'] = "Cambios al dominio alias %s guardados";
$lang['success']['domain_modified'] = "Cambios al dominio %s guardados";
$lang['success']['domain_admin_modified'] = "Cambios al administrador del dominio %s guardados";
$lang['success']['domain_admin_added'] = "Administrador del dominio %s agregado";
$lang['success']['admin_modified'] = "Cambios al administrador guardados";
$lang['danger']['username_invalid'] = "Nombre de usuario no se puede utilizar";
$lang['danger']['password_mismatch'] = "Confirmación de contraseña no es identica";
$lang['danger']['password_complexity'] = "La contraseña no cumple con los requisitos";
$lang['danger']['password_empty'] = "El campo de la contraseña no debe estar vacío";
$lang['danger']['login_failed'] = "Inicio de sesión fallido";
$lang['danger']['mailbox_invalid'] = "Nombre de buzón inválido";
$lang['info']['fetchmail_planned'] = "La tarea para buscar correos se ha planeado. Por favor verifica el proceso más tarde.";
$lang['danger']['fetchmail_source_empty'] = "Por favor define una carpeta fuente";
$lang['danger']['fetchmail_dest_empty'] = "Por favor define una carpeta destino";
$lang['danger']['is_alias'] = "%s ya está definida como una dirección alias";
$lang['danger']['is_alias_or_mailbox'] = "%s ya está definido como un alias ó como un buzón";
$lang['danger']['is_spam_alias'] = "%s ya está definida como un alias de correo no deseado";
$lang['danger']['quota_not_0_not_numeric'] = "Cuota debe ser numérica y >= 0";
$lang['danger']['domain_not_found'] = "Dominio no encontrado";
$lang['danger']['max_mailbox_exceeded'] = "Máx. de buzones superado (%d de %d)";
$lang['danger']['mailbox_quota_exceeded'] = "Cuota excede el límite de dominio (máx. %d MiB)";
$lang['danger']['mailbox_quota_left_exceeded'] = "No queda espacio suficiente (espacio libre: %d MiB)";
$lang['success']['mailbox_added'] = "Buzón %s agregado";
$lang['success']['domain_removed'] = "Dominio %s removido";
$lang['success']['alias_removed'] = "Alias %s removido";
$lang['success']['alias_domain_removed'] = "Dominio alias %s removido";
$lang['success']['domain_admin_removed'] = "Administrador del dominio %s removido";
$lang['success']['mailbox_removed'] = "Buzón %s removido";
$lang['danger']['max_quota_in_use'] = "Cuota del buzón debe ser mayor o igual a %d MiB";
$lang['danger']['domain_quota_m_in_use'] = "Cuota del dominio debe ser mayor o igual a %d MiB";
$lang['danger']['mailboxes_in_use'] = "Máx. de buzones debe ser mayor o igual a %d";
$lang['danger']['aliases_in_use'] = "Máx. de alias debe ser mayor o igual a %d";
$lang['danger']['sender_acl_invalid'] = "Valor %s del ACL del remitente es inválido";
$lang['danger']['domain_not_empty'] = "No se puede eliminar un dominio que no esté vacío";
$lang['danger']['fetchmail_active'] = "Un proceso ya se está ejecutando, por favor espera a que termine.";
$lang['danger']['validity_missing'] = 'Por favor asigna un periodo de validez';
$lang['user']['user_change_fn'] = "";
$lang['user']['user_settings'] = 'Configuración del usuario';
$lang['user']['mailbox_details'] = 'Detalles del buzón';
$lang['user']['change_password'] = 'Cambiar contraseña';
$lang['user']['new_password'] = 'Nueva contraseña:';
$lang['user']['save_changes'] = 'Guardar cambios';
$lang['user']['password_now'] = 'Contraseña actual (confirmar cambios):';
$lang['user']['new_password_repeat'] = 'Confirmación de contraseña (repetir):';
$lang['user']['new_password_description'] = 'Requisitos: longitud de 6 caracteres, letras y números.';
$lang['user']['spam_aliases'] = 'Alias de email temporales';
$lang['user']['alias'] = 'Alias';
$lang['user']['is_catch_all'] = 'Atrapa-Todo para el/los dominio(s)';
$lang['user']['aliases_also_send_as'] = 'También permitido enviar como';
$lang['user']['aliases_send_as_all'] = 'No verificar permisos del remitente para los siguientes dominios (y sus aliases)';
$lang['user']['alias_create_random'] = 'Generar alias aleatorio';
$lang['user']['alias_extend_all'] = 'Extender alias por 1 hora';
$lang['user']['alias_valid_until'] = 'Válido hasta';
$lang['user']['alias_remove_all'] = 'Eliminar todos los alias';
$lang['user']['alias_time_left'] = 'Tiempo restante';
$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
$lang['user']['alias_select_validity'] = 'Periodo de validez';
$lang['user']['hour'] = 'Hora';
$lang['user']['hours'] = 'Horas';
$lang['user']['day'] = 'Día';
$lang['user']['week'] = 'Semana';
$lang['user']['weeks'] = 'Semanas';
$lang['user']['spamfilter'] = 'Filtro de spam';
$lang['user']['spamfilter_wl'] = 'Lista blanca';
$lang['user']['spamfilter_wl_desc'] = 'Direcciones en la lista blanca <b>nunca</b> clasificarán como spam. Se puede usar comodines. Filtro solo aplica a los alias directos (alias con un solo buzón de destino) excluyendo los alias catch-all.';
$lang['user']['spamfilter_bl'] = 'Lista negra';
$lang['user']['spamfilter_bl_desc'] = 'Direcciones en la lista negra <b>siempre</b> clasificarán como spam. Se puede usar comodines. Filtro solo aplica a los alias directos (alias con un solo buzón de destino) excluyendo los alias catch-all.';
$lang['user']['spamfilter_behavior'] = 'Clasificación';
$lang['user']['spamfilter_table_rule'] = 'Regla';
$lang['user']['spamfilter_table_action'] = 'Acción';
$lang['user']['spamfilter_table_empty'] = 'No hay datos para mostrar';
$lang['user']['spamfilter_table_remove'] = 'Eliminar';
$lang['user']['spamfilter_table_add'] = 'Agregar elemento';
$lang['user']['spamfilter_green'] = 'Verde: éste mensaje no es spam';
$lang['user']['spamfilter_yellow'] = 'Amarillo: éste mensaje puede ser spam, será etiquetado como spam y trasladado a tu carpeta de correo no deseado';
$lang['user']['spamfilter_red'] = 'Rojo: Este mensaje es spam, será rechazado por el servidor y enviado a la quarantena (si esta configurada)';
$lang['user']['spamfilter_default_score'] = 'Valores predeterminados:';
$lang['user']['spamfilter_hint'] = 'El primer valor representa la "calificación baja de spam", el segundo representa la "calificación alta de spam".';
$lang['user']['no_record'] = 'Sin registro';
$lang['user']['tls_policy_warning'] = '<strong>Advertencia:</strong> Si se forza la transmisión de correo cifrado, es posible que no todos los correos lleguen a su destino.<br>Mensajes que no satisfagan la política, o no sean aceptados por el remitente, serán rebotados por el servidor.<br> Esta opción aplica a la dirección de correo electrónico principal (nombre de inicio de sesión), a todas las direcciones derivadas de dominios de alias, así como a las direcciones de alias <b> con este único buzón </b> como destino.';
$lang['user']['tls_policy'] = 'Política de cifrado';
$lang['user']['tls_enforce_in'] = 'Aplicar TLS entrante';
$lang['user']['tls_enforce_out'] = 'Aplicar TLS saliente';
$lang['mailbox']['tls_enforce_in'] = 'Aplicar TLS entrante';
$lang['mailbox']['tls_enforce_out'] = 'Aplicar TLS saliente';
$lang['mailbox']['tls_map_dest'] = 'Destino';
-$lang['mailbox']['tls_map_dest_info'] = 'Ejemplos: example.org, .example.org, mail@example.org, [mail.example.org]:25';
+$lang['mailbox']['tls_map_dest_info'] = 'Ejemplos: example.org, .example.org, [mail.example.org]:25';
$lang['mailbox']['tls_map_policy'] = 'Póliza';
$lang['mailbox']['tls_map_parameters'] = 'Parametros';
$lang['mailbox']['tls_map_parameters_info'] = 'Vacío o parametros, por ejemplo: protocols=!SSLv2 ciphers=medium exclude=3DES';
$lang['user']['shared_aliases'] = 'Alias compartidos';
$lang['user']['shared_aliases_desc'] = 'Los alias compartidos no se ven afectados por la configuración específica del usuario, como el filtro de correo no deseado o la política de cifrado. Los filtros de spam correspondientes solo pueden ser realizados por un administrador como una política de dominio.';
$lang['user']['direct_aliases'] = 'Alias directos';
$lang['user']['direct_aliases_desc'] = 'Los alias directos se ven afectadas por el filtro de correo no deseado y la configuración de la política TLS del usuario.';
$lang['user']['eas_reset'] = 'Resetear el caché ActiveSync';
$lang['user']['eas_reset_now'] = 'Resetear ahora';
$lang['user']['eas_reset_help'] = 'En muchos casos, el restablecimiento de la memoria caché del dispositivo ayudará a recuperar un perfil de ActiveSync dañado.<br> <b>Atención:</b> ¡Todos los elementos se volverán a descargar!';
$lang['user']['tag_handling'] = 'Establecer manejo para el correo etiquetado';
$lang['user']['tag_in_subfolder'] = 'En subcarpeta';
$lang['user']['tag_in_subject'] = 'En asunto';
$lang['user']['tag_in_none'] = 'Hacer nada';
$lang['user']['tag_help_explain'] = 'En subcarpeta: una nueva subcarpeta llamada como la etiqueta será creada debajo de INBOX ("INBOX/Facebook").<br>
En asunto: los nombres de las etiquetas serán añadidos al asunto de los correos, ejemplo: "[Facebook] Mis Noticias".';
$lang['user']['tag_help_example'] = 'Ejemplo de una dirección email etiquetada: mi<b>+Facebook</b>@ejemplo.org';
$lang['user']['encryption'] = 'Cifrado';
$lang['user']['username'] = 'Nombre de usuario';
$lang['user']['last_run'] = 'Última ejecución';
$lang['user']['excludes'] = 'Excluye';
$lang['user']['interval'] = 'Intervalo';
$lang['user']['active'] = 'Activo';
$lang['user']['action'] = 'Acción';
$lang['user']['edit'] = 'Editar';
$lang['user']['remove'] = 'Eliminar';
$lang['user']['create_syncjob'] = 'Crear nuevo trabajo de sincronización';
$lang['start']['mailcow_apps_detail'] = 'Utiliza una aplicación de mailcow para acceder a tus correos, calendario, contactos y más.';
$lang['start']['mailcow_panel_detail'] = '<b>Administradores por dominio</b> pueden crear, modificar o eliminar buzones y alias, modificar los dominios asignados y ver información más detallada sobre los dominios asignados<br>
<b>Usuarios de buzón</b> son capaces de crear alias de tiempo limitado (spam alias), cambiar su contraseña y la configuración del filtro de spam del buzón.';
$lang['start']['imap_smtp_server_auth_info'] = 'Por favor utiliza tu dirección de correo completa y el mecanismo de autenticación PLAIN.<br>
Tus datos para iniciar sesión serán cifrados por el cifrado obligatorio del servidor';
$lang['start']['help'] = 'Mostrar/Ocultar panel de ayuda';
$lang['header']['mailcow_settings'] = 'Configuración';
$lang['header']['administration'] = 'Administración';
$lang['header']['mailboxes'] = 'Buzones';
$lang['header']['user_settings'] = 'Configuraciones de usuario';
$lang['header']['quarantine'] = "Cuarentena";
$lang['header']['debug'] = "Información del sistema";
$lang['mailbox']['domain'] = 'Dominio';
$lang['mailbox']['alias'] = 'Alias';
$lang['mailbox']['aliases'] = 'Alias';
$lang['mailbox']['domains'] = 'Dominios';
$lang['mailbox']['mailboxes'] = 'Buzones';
$lang['mailbox']['mailbox_quota'] = 'Tamaño máx. de cuota';
$lang['mailbox']['domain_quota'] = 'Cuota';
$lang['mailbox']['active'] = 'Activo';
$lang['mailbox']['action'] = 'Acción';
$lang['mailbox']['backup_mx'] = 'MX de respaldo';
$lang['mailbox']['domain_aliases'] = 'Alias de dominio';
$lang['mailbox']['target_domain'] = 'Dominio destino';
$lang['mailbox']['target_address'] = 'Dirección destino';
$lang['mailbox']['username'] = 'Nombre de usuario';
$lang['mailbox']['fname'] = 'Nombre completo';
$lang['mailbox']['filter_table'] = 'Filtrar tabla';
$lang['mailbox']['in_use'] = 'En uso (%)';
$lang['mailbox']['msg_num'] = 'Mensaje #';
$lang['mailbox']['remove'] = 'Eliminar';
$lang['mailbox']['edit'] = 'Editar';
$lang['mailbox']['no_record'] = 'Sin registro';
$lang['mailbox']['add_domain'] = 'Agregar dominio';
$lang['mailbox']['add_domain_alias'] = 'Agregar alias de dominio';
$lang['mailbox']['add_mailbox'] = 'Agregar buzón';
$lang['mailbox']['add_alias'] = 'Agregar alias';
$lang['mailbox']['toggle_all'] = 'Seleccionar todo';
$lang['mailbox']['add_resource'] = 'Añadir recurso';
$lang['mailbox']['add_domain_record_first'] = 'Agrega un dominio primero';
$lang['mailbox']['empty'] = 'Sin resultados';
$lang['mailbox']['toggle_all'] = 'Selecionar todo';
$lang['mailbox']['quick_actions'] = 'Acciones';
$lang['mailbox']['activate'] = 'Activar';
$lang['mailbox']['resources'] = 'Recursos';
$lang['mailbox']['multiple_bookings'] = 'Reservas multiples';
$lang['mailbox']['kind'] = 'Tipo';
$lang['mailbox']['description'] = 'Descripción';
$lang['mailbox']['booking_0'] = 'Mostrar siempre disponible';
$lang['mailbox']['booking_lt0'] = 'Sín limite, pero mostrar ocupado cuando esté reservado';
$lang['mailbox']['booking_custom'] = 'Límite pre-establecido de reservas';
$lang['mailbox']['booking_0_short'] = 'Siempre disponible';
$lang['mailbox']['booking_lt0_short'] = 'Ocupado cuando en uso';
$lang['mailbox']['booking_custom_short'] = 'Límite estricto';
$lang['mailbox']['activate'] = 'Activar';
$lang['mailbox']['deactivate'] = 'Desactivar';
$lang['mailbox']['quarantine_notification'] = 'Notificaciones de cuarentena';
$lang['mailbox']['never'] = 'Nunca';
$lang['mailbox']['hourly'] = 'Cada hora';
$lang['mailbox']['daily'] = 'Cada día';
$lang['mailbox']['weekly'] = 'Cada semana';
$lang['user']['quarantine_notification'] = 'Notificaciones de cuarentena';
$lang['user']['never'] = 'Nunca';
$lang['user']['hourly'] = 'Cada hora';
$lang['user']['daily'] = 'Cada día';
$lang['user']['weekly'] = 'Cada semana';
$lang['user']['quarantine_notification_info'] = 'Una vez que se haya enviado una notificación, los elementos se marcarán como "notificados" y no se enviarán más notificaciones para este elemento en particular.';
$lang['info']['no_action'] = 'No hay acción aplicable';
$lang['add']['kind'] = 'Tipo';
$lang['add']['multiple_bookings'] = 'Múltiples reservas';
$lang['edit']['multiple_bookings'] = 'Múltiples reservas';
$lang['edit']['kind'] = 'Tipo';
$lang['edit']['resource'] = 'Recurso';
$lang['success']['resource_added'] = "Recurso %s añadido";
$lang['edit']['save'] = 'Guardar cambios';
$lang['edit']['max_mailboxes'] = 'Máx. buzones posibles:';
$lang['edit']['title'] = 'Editar objeto';
$lang['edit']['target_address'] = 'Dirección/es destino <small>(separadas por coma)</small>:';
$lang['edit']['active'] = 'Activo';
$lang['edit']['target_domain'] = 'Dominio destino:';
$lang['edit']['password'] = 'Contraseña:';
$lang['edit']['password_repeat'] = 'Confirmación de contraseña (repetir):';
$lang['edit']['domain_admin'] = 'Editar administrador del dominio';
$lang['edit']['domain'] = 'Editar dominio';
$lang['edit']['edit_alias_domain'] = 'Editar alias de dominio';
$lang['edit']['domains'] = 'Dominios';
$lang['edit']['alias'] = 'Editar alias';
$lang['edit']['mailbox'] = 'Editar buzón';
$lang['edit']['description'] = 'Descripción:';
$lang['edit']['max_aliases'] = 'Máx. alias:';
$lang['edit']['max_quota'] = 'Máx. cuota por buzón (MiB):';
$lang['edit']['domain_quota'] = 'Cuota de dominio:';
$lang['edit']['backup_mx_options'] = 'Opciones del respaldo MX:';
$lang['edit']['relay_domain'] = 'Dominio de retransmisión';
$lang['edit']['relay_all'] = 'Retransmitir todos los destinatarios';
$lang['edit']['relay_all_info'] = '<small>Si eliges <b>no</b> retransmitir a todos los destinatarios, necesitas agregar un buzón "ciego" por cada destinatario que debe ser retransmitido.</small>';
$lang['edit']['full_name'] = 'Nombre completo';
$lang['edit']['full_name'] = 'Nombre completo';
$lang['edit']['quota_mb'] = 'Cuota (MiB)';
$lang['edit']['sender_acl'] = 'Permitir envío como:';
$lang['edit']['previous'] = 'Página anterior';
$lang['edit']['unchanged_if_empty'] = 'Si no hay cambios dejalo en blanco';
$lang['edit']['dont_check_sender_acl'] = 'No verificar remitente para el dominio %s';
$lang['add']['domain'] = 'Dominio';
$lang['add']['active'] = 'Activo';
$lang['add']['description'] = 'Descripción:';
$lang['add']['max_aliases'] = 'Máx. alias posibles:';
$lang['add']['max_mailboxes'] = 'Máx. buzones posibles:';
$lang['add']['mailbox_quota_m'] = 'Máx. cuota por buzón (MiB):';
$lang['add']['domain_quota_m'] = 'Cuota total del dominio (MiB):';
$lang['add']['backup_mx_options'] = 'Opciones del respaldo MX:';
$lang['add']['relay_all'] = 'Retransmitir todos los destinatarios';
$lang['add']['relay_domain'] = 'Retransmitir este dominio';
$lang['add']['relay_all_info'] = '<small>Si eliges <b>no</b> retransmitir a todos los destinatarios, necesitas agregar un buzón "ciego" por cada destinatario que debe ser retransmitido.</small>';
$lang['add']['alias_address'] = 'Dirección(es) alias:';
$lang['add']['alias_address_info'] = '<small>Dirección(es) de correo completa(s) ó @dominio.com, para atrapar todos los mensajes para un dominio (separado por coma). <b>Dominios que existan en mailcow solamente</b>.</small>';
$lang['add']['alias_domain_info'] = '<small>Nombres de dominio válidos solamente (separado por coma).</small>';
$lang['add']['target_address'] = 'Direcciones destino:';
$lang['add']['target_address_info'] = '<small>Dirección(es) de correo completa(s) (separado por coma).</small>';
$lang['add']['alias_domain'] = 'Dominio alias';
$lang['add']['select'] = 'Por favor selecciona...';
$lang['add']['target_domain'] = 'Dominio destino:';
$lang['add']['mailbox_username'] = 'Nombre de usuario (parte izquierda de una dirección de correo):';
$lang['add']['full_name'] = 'Nombre completo:';
$lang['add']['quota_mb'] = 'Cuota (MiB):';
$lang['add']['select_domain'] = 'Por favor elige un dominio primero';
$lang['add']['password'] = 'Constraseña:';
$lang['add']['password_repeat'] = 'Confirmación de contraseña (repetir):';
$lang['add']['restart_sogo_hint'] = '<b>Nota:</b> Necesitarás reiniciar el contenedor del servicio SOGo despues de agregar un nuevo dominio';
$lang['add']['port'] = 'Port';
$lang['login']['username'] = 'Nombre de usuario';
$lang['login']['password'] = 'Contraseña';
$lang['login']['login'] = 'Inicio de sesión';
$lang['login']['delayed'] = 'El inicio de sesión ha sido retrasado %s segundos.';
$lang['login']['tfa'] = "Autenticación de dos factores";
$lang['login']['tfa_details'] = "Por favor confirma tu contraseña de un solo uso en el campo de abajo";
$lang['login']['confirm'] = "Confirmar";
$lang['login']['otp'] = "Contraseña de un solo uso";
$lang['login']['trash_login'] = "Inicio de sesión basura";
$lang['admin']['search_domain_da'] = 'Buscar dominios';
$lang['admin']['r_inactive'] = 'Restricciones inactivas';
$lang['admin']['r_active'] = 'Restricciones activas';
$lang['admin']['r_info'] = 'Elementos en gris/deshabilitados en la lista de restricciones activas no son reconocidas como restricciones válidas para mailcow y no pueden ser movidas. Restricciones desconocidas serán establecidas en el orden de aparicion de todas maneras. <br>Puedes agregar nuevos elementos en <code>inc/vars.local.inc.php</code> para ser capaz de habilitarlas.';
$lang['admin']['no_new_rows'] = 'No hay más filas disponibles.';
$lang['admin']['queue_manager'] = 'Administrador de cola';
$lang['admin']['additional_rows'] = ' filas adicionales fueron agregadas'; // parses to 'n additional rows were added'
$lang['admin']['private_key'] = 'Llave privada';
$lang['admin']['import'] = 'Importar';
$lang['admin']['duplicate'] = 'Duplicar';
$lang['admin']['import_private_key'] = 'Importar llave privada';
$lang['admin']['duplicate_dkim'] = 'Duplicar registro DKIM';
$lang['admin']['dkim_from'] = 'De';
$lang['admin']['dkim_to'] = 'A';
$lang['admin']['dkim_from_title'] = 'Dominio de origen para copiar datos desde';
$lang['admin']['dkim_to_title'] = 'Dominio(s) de destino: (se sobrescribirán)';
$lang['admin']['f2b_parameters'] = 'Parametros Fail2ban';
$lang['admin']['f2b_ban_time'] = 'Tiempo de restricción (s)';
$lang['admin']['f2b_max_attempts'] = 'Max num. de intentos';
$lang['admin']['f2b_retry_window'] = 'Ventana de tiempo entre reintentos';
$lang['admin']['f2b_netban_ipv4'] = 'Tamaño de subred IPv4 para aplicar la restricción (8-32)';
$lang['admin']['f2b_netban_ipv6'] = 'Tamaño de subred IPv6 para aplicar la restricción (8-128)';
$lang['admin']['f2b_whitelist'] = 'Redes y hosts en lista blanca';
$lang['admin']['f2b_blacklist'] = 'Redes y hosts en lista negra';
$lang['admin']['f2b_list_info'] = 'Un host o red en lista negra siempre superará a una entidad de la lista blanca. <b>Las actualizaciones de la lista tardarán unos segundos en aplicarse.</b>';
$lang['admin']['search_domain_da'] = 'Buscar dominios';
$lang['admin']['r_inactive'] = 'Restricciones inactivas';
$lang['admin']['r_active'] = 'Restricciones activas';
$lang['admin']['r_info'] = 'Los elementos desactivados en la lista de restricciones activas no son reconocidas como restricciones válidas por mailcow y no se pueden mover. <br>Se puede agregar nuevos elementos en <code>inc/vars.local.inc.php</code> para poder activarlos.';
$lang['admin']['dkim_key_length'] = 'Longitud de la llave DKIM (bits)';
$lang['admin']['dkim_key_valid'] = 'Registro válido';
$lang['admin']['dkim_key_unused'] = 'Registro sin usar';
$lang['admin']['dkim_key_missing'] = 'Registro faltante';
$lang['admin']['dkim_add_key'] = 'Agregar registro ARC/DKIM';
$lang['admin']['dkim_keys'] = 'Registros ARC/DKIM';
$lang['admin']['dkim_private_key'] = 'Private key';
$lang['admin']['dkim_domains_wo_keys'] = "Select domains with missing keys";
$lang['admin']['dkim_domains_selector'] = "Selector";
$lang['admin']['add'] = 'Agregar';
$lang['admin']['configuration'] = 'Configuración';
$lang['admin']['password'] = 'Contraseña';
$lang['admin']['password_repeat'] = 'Confirmación de contraseña (repetir)';
$lang['admin']['active'] = 'Activo';
$lang['admin']['action'] = 'Acción';
$lang['admin']['add_domain_admin'] = 'Agregar Administrador del dominio';
$lang['admin']['admin_domains'] = 'Asignaciones de dominio';
$lang['admin']['domain_admins'] = 'Administradores de dominio';
$lang['admin']['username'] = 'Nombre de usuario';
$lang['admin']['edit'] = 'Editar';
$lang['admin']['remove'] = 'Eliminar';
$lang['admin']['save'] = 'Guardar cambios';
$lang['admin']['admin'] = 'Administrador';
$lang['admin']['admin_details'] = 'Editar detalles del administrador';
$lang['admin']['unchanged_if_empty'] = 'Si no hay cambios déjalo en blanco';
$lang['admin']['access'] = 'Acceso';
$lang['admin']['no_record'] = 'Sin registro';
$lang['edit']['relayhost'] = 'Ruta saliente';
$lang['admin']['forwarding_hosts'] = 'Hosts de reenvío';
$lang['admin']['forwarding_hosts_hint'] = 'Los mensajes entrantes son aceptados incondicionalmente de cualquiera de los hosts enumerados aquí. Estos hosts no se comprueban con listas DNSBL o se someten a greylisting. El spam recibido de ellos nunca se rechaza, pero opcionalmente se puede archivar en la carpeta de correo no deseado. El uso más común para esto es especificar los servidores de correo en los que ha configurado una regla que reenvía los correos electrónicos entrantes al servidor mailcow.';
$lang['admin']['forwarding_hosts_add_hint'] = 'Se puede especificar direcciones IPv4 / IPv6, redes en notación CIDR, nombres de host (que se resolverán en direcciones IP) o dominios (que se resolverán en direcciones IP consultando registros SPF o, en su defecto, registros MX)';
$lang['admin']['relayhosts_hint'] = 'Define rutas de reenvío dependientes del remitente para poder seleccionarlos en la configuración de dominios.<br>
El servicio de transporte es siempre <em>smtp:</em> y se tiene en cuenta la configuración de política TLS saliente individual de los usuarios.';
$lang['admin']['transports_hint'] = '→ Una entrada del ruta de transporte <b> anula </b> la regla de host de reenvío dependiente del remitente</b>.<br>
→ La configuración de la política saliente de TLS por usuario se ignora y solo puede ser aplicada por las entradas del mapa de políticas TLS.<br>
→ El servicio de transporte es siempre <em>smtp:</em><br>
→ Las direcciones que coincidan con "/localhost$/" siempre se transportarán a través de "local:", por lo tanto, un destino "*" no se aplicará a esas direcciones.<br>
→ Para determinar las credenciales para el siguiente destino "[host]:25", Postfix <b>siempre</b> busca "host" antes de buscar "[host]:25". Este comportamiento hace que sea imposible utilizar "host" y "[host]:25" al mismo tiempo.';
$lang['admin']['add_relayhost_hint'] = 'Ten en cuenta que los datos de autenticación, si los hay, se almacenarán sin cifrar.';
$lang['admin']['add_transports_hint'] = 'Ten en cuenta que los datos de autenticación, si los hay, se almacenarán sin cifrar.';
$lang['admin']['host'] = 'Host';
$lang['admin']['source'] = 'Origen';
$lang['admin']['add_forwarding_host'] = 'Añadir host de reenvío';
$lang['admin']['add_relayhost'] = 'Agregar ruta de salida de mensajes';
$lang['admin']['add_transport'] = 'Añadir ruta de transporte';
$lang['admin']['relayhosts'] = 'Enrutamiento de salida de mensajes';
$lang['admin']['transport_maps'] = 'Mapa de rutas de transporte';
$lang['admin']['routing'] = 'Enrutamiento';
$lang['admin']['credentials_transport_warning'] = '<b>Advertencia</b>: al agregar una nueva entrada de ruta de transporte se actualizarán las credenciales para todas las entradas con una columna de "siguiente destino" coincidente.';
$lang['admin']['destination'] = 'Destino';
$lang['admin']['nexthop'] = 'Siguiente destino';
$lang['admin']['relay_from'] = 'Dirección "De:"';
$lang['admin']['relay_run'] = "Probar configuración";
$lang['admin']['api_allow_from'] = "Permitir acceso al API desde estas IPs (separadas por coma o en una nueva línea)";
$lang['admin']['api_key'] = "Clave del API";
$lang['admin']['activate_api'] = "Activar API";
$lang['admin']['regen_api_key'] = "Regenerar clave API";
$lang['admin']['ban_list_info'] = "La lista de IPs bloqueadas sigue a continuación: <b> red (tiempo de prohibición restante) - [acciones]</b>.<br/> Las IPs en cola para ser desbloquadas se eliminarán de la lista de bloqueos en unos pocos segundos. <br/> Las etiquetas rojas indican bloqueos permanentes permanentes mediante la inclusión en una lista negra.";
$lang['admin']['unban_pending'] = "Desbloqueo pendiente";
$lang['admin']['queue_unban'] = "Encolar desbloqueo";
$lang['admin']['no_active_bans'] = "No hay bloqueos pendientes";
$lang['admin']['quarantine'] = "Cuarentena";
$lang['admin']['rspamd_settings_map'] = "Reglas de ajustes de rspamd";
$lang['admin']['quota_notifications'] = "Notificaciones de cuota";
$lang['admin']['quota_notifications_vars'] = "{{percent}} equivale a la cuota actual del usuario<br>{{username}} es el buzón del usuario";
$lang['admin']['active_rspamd_settings_map'] = "Reglas de ajustes activos";
$lang['admin']['quota_notifications_info'] = "Las notificaciones de cuota se envían a los usuarios una vez cuando cruzan el 80% y cuando cruzan el 95% de uso.";
$lang['admin']['quarantine_retention_size'] = "Retenciones por buzón:<br><small>0 indica <b>inactivo</b>.</small>";
$lang['admin']['quarantine_max_size'] = "Tamaño máximo en MiB (elementos más grandes se eliminan):<br><small>0 <b>no</b> indíca ilimitado.</small>";
$lang['admin']['quarantine_max_age'] = "Edad máxima del mensaje en días<br><small>Valor debe ser igual o mayor a un día</small>";
$lang['admin']['quarantine_exclude_domains'] = "Excluir dominios y dominios alias";
$lang['admin']['quarantine_release_format'] = "Formato de mensajes liberados";
$lang['admin']['quarantine_release_format_raw'] = "Original sin modificar";
$lang['admin']['quarantine_release_format_att'] = "Como adjunto";
$lang['admin']['quarantine_notification_sender'] = "Remitente del email de notificación";
$lang['admin']['quarantine_notification_subject'] = "Asunto del email de notificación";
$lang['admin']['quarantine_notification_html'] = "Plantilla del email de notificación:<br><small>Dejar en blanco para usar la planilla predeterminada.</small>";
$lang['admin']['quota_notification_sender'] = "Remitente del email de notificación";
$lang['admin']['quota_notification_subject'] = "Asunto del email de notificación";
$lang['admin']['quota_notification_html'] = "Plantilla del email de notificación:<br><small>Dejar en blanco para usar la planilla predeterminada.</small>";
$lang['admin']['ui_texts'] = "Etiquetas y textos de UI";
$lang['admin']['help_text'] = "Campo de texto debajo del formulario de inicio de sesión (se permite HTML)";
$lang['admin']['title_name'] = '"mailcow UI" (título de la página)';
$lang['admin']['main_name'] = 'Nombre "mailcow UI"';
$lang['admin']['apps_name'] = 'Nombre "mailcow Apps"';
$lang['admin']['queue_ays'] = 'Confirme que desea eliminar todos los elementos de la cola actual.';
$lang['admin']['arrival_time'] = 'Tiempo de llegada (hora del servidor)';
$lang['admin']['message_size'] = 'Tamaño del mensaje';
$lang['admin']['sender'] = 'Remitente';
$lang['admin']['recipients'] = 'Destinatarios';
$lang['admin']['admin_domains'] = 'Dominios asignados';
$lang['admin']['domain_admins'] = 'Administradores por dominio';
$lang['admin']['flush_queue'] = 'Vaciar la cola';
$lang['admin']['delete_queue'] = 'Eliminar todos';
$lang['admin']['queue_deliver_mail'] = 'Entregar';
$lang['admin']['queue_hold_mail'] = 'Retener';
$lang['admin']['queue_unhold_mail'] = 'Liberar retención';
$lang['admin']['sys_mails'] = 'Mails del sistema';
$lang['admin']['subject'] = 'Asunto';
$lang['admin']['from'] = 'De';
$lang['admin']['include_exclude'] = 'Incluir/Excluir';
$lang['admin']['include_exclude_info'] = 'Por defecto - sin selección - <b>todos los buzones</b> son notificados.';
$lang['admin']['excludes'] = 'Excluye a estos destinatarios';
$lang['admin']['includes'] = 'Incluye a estos destinatarios';
$lang['admin']['text'] = 'Texto';
$lang['admin']['activate_send'] = 'Activar botón de envío';
$lang['admin']['send'] = 'Enviar';
$lang['quarantine']['quarantine'] = "Cuarentena";
$lang['quarantine']['learn_spam_delete'] = "Aprender como spam y eliminar";
$lang['quarantine']['qinfo'] = 'El sistema de cuarentena guardará el correo rechazado en la base de datos, mientras que el remitente <em>no</em> tendrá la impresión de un correo entregado.
<br><b>' . $lang['quarantine']['learn_spam_delete'] . '</b> aprenderá un mensaje como correo no deseado a través del teorema bayesiano y también calculará hashes para rechazar mensajes similares en el futuro.
Ten en cuenta que aprender varios mensajes puede ser lento, dependiendo de las especificaciones del servidor.';
$lang['quarantine']['release'] = "Liberar";
$lang['quarantine']['empty'] = 'Sin resultados';
$lang['quarantine']['toggle_all'] = 'Seleccionar todos';
$lang['quarantine']['quick_actions'] = 'Acciones';
$lang['quarantine']['remove'] = 'Remover';
$lang['quarantine']['received'] = "Recibido";
$lang['quarantine']['action'] = "Acción";
$lang['quarantine']['rcpt'] = "Destinatario";
$lang['quarantine']['qid'] = "Rspamd QID";
$lang['quarantine']['sender'] = "Remitente";
$lang['quarantine']['show_item'] = "Mostrar item";
$lang['quarantine']['check_hash'] = "Buscar hash de archivo @ VT";
$lang['quarantine']['qitem'] = "Quarantine item";
$lang['quarantine']['subj'] = "Asunto";
$lang['quarantine']['recipients'] = "Destinatarios";
$lang['quarantine']['text_plain_content'] = "Contenido (text/plain)";
$lang['quarantine']['text_from_html_content'] = "Contenido (html convertido)";
$lang['quarantine']['atts'] = "Adjuntos";
$lang['quarantine']['low_danger'] = "Peligro bajo";
$lang['quarantine']['neutral_danger'] = "Neutral";
$lang['quarantine']['medium_danger'] = "Peligro medio";
$lang['quarantine']['high_danger'] = "Peligro alto";
$lang['quarantine']['danger'] = "Peligro";
$lang['quarantine']['confirm_delete'] = "Confirmar la eliminación del objeto";
$lang['quarantine']['qhandler_success'] = "Solicitud enviada con éxito al sistema, puede cerrar la ventana";
$lang['warning']['fuzzy_learn_error'] = "Error aprendiendo hash: %s";
$lang['danger']['spam_learn_error'] = "Error aprendiendo muestra: %s";
$lang['success']['qlearn_spam'] = "Message ID %s se aprendió como spam y se eliminó";
$lang['debug']['system_containers'] = 'Sistema y Contenedores';
$lang['debug']['solr_status'] = 'Solr status';
$lang['debug']['solr_dead'] = 'Solr está empezando, deshabilitado o caído.';
$lang['debug']['logs'] = 'Logs';
$lang['debug']['log_info'] = '<p>Los <b>logs en memoria</b> son recopilados en listas de Redis y recortados a LOG_LINES (%d) cada minuto para prevenir sobrecarga en el sistema.
<br>Los logs en memoria no están destinados a ser persistentes. Todas las aplicaciones que logean a la memoria, también logean en el daemon de Docker y, por lo tanto, en el controlador de registro predeterminado.
El log en memoria se debe utilizar para analizar problemas menores con los contenedores.</p>
<p>Los <b>logs externos</b> se recopilan a través de la API de la aplicación dada.</p>
<p>Los <b>logs estáticos</b> son principalmente registros de actividad, que no están registrados en Dockerd pero que aún deben ser persistentes (excepto los registros de API).</p>';
$lang['debug']['in_memory_logs'] = 'Logs en memoria';
$lang['debug']['external_logs'] = 'Logs externos';
$lang['debug']['static_logs'] = 'Logs estáticos';
$lang['debug']['solr_uptime'] = 'Uptime';
$lang['debug']['solr_started_at'] = 'Iniciado el';
$lang['debug']['solr_last_modified'] = 'Última modificación';
$lang['debug']['solr_size'] = 'Tamaño';
$lang['debug']['solr_docs'] = 'Docs';
$lang['debug']['disk_usage'] = 'Utilización de disco';
$lang['debug']['containers_info'] = "Información de los contenedores";
$lang['debug']['restart_container'] = 'Reiniciar';
$lang['quarantine']['release_body'] = "Adjuntamos el mensaje en formato eml a este correo.";
$lang['danger']['release_send_failed'] = "El mensaje no pudo ser liberado: %s";
$lang['quarantine']['release_subject'] = "Mensaje de cuarentena potencialmente dañino %s";
$lang['quarantine']['spam_score'] = "Puntaje";
$lang['mailbox']['bcc_map'] = "Reglas BCC";
$lang['mailbox']['bcc_map_type'] = "Tipo de BCC";
$lang['mailbox']['bcc_type'] = "Tipo de BCC";
$lang['mailbox']['bcc_sender_map'] = "Remitente";
$lang['mailbox']['bcc_rcpt_map'] = "Destinatario";
$lang['mailbox']['bcc_local_dest'] = "Destino local";
$lang['mailbox']['bcc_destinations'] = "Destino del BCC";
$lang['mailbox']['bcc_destination'] = "Destino del BCC";
$lang['edit']['bcc_dest_format'] = 'El destino BCC debe ser una única dirección de correo electrónico válida';
$lang['mailbox']['bcc'] = "BCC";
$lang['mailbox']['bcc_maps'] = "Reglas BCC";
$lang['mailbox']['bcc_to_sender'] = "Cambiar tipo de regla a 'Remitente'";
$lang['mailbox']['bcc_to_rcpt'] = "Cambiar tipo de regla a 'Destinatario'";
$lang['mailbox']['add_bcc_entry'] = "Añadir regla de BCC";
$lang['mailbox']['add_tls_policy_map'] = "Añadir regla de póliza de TLS";
$lang['mailbox']['bcc_info'] = "Las reglas BCC se utilizan para enviar silenciosamente copias de todos los mensajes a otra dirección. Se utiliza una regla de destinatario cuando el destino local actúa como destinatario de un correo. Las reglas de remitentes se ajustan al mismo principio.<br/>
El destino local no será informado sobre una entrega fallida al BCC.";
$lang['mailbox']['address_rewriting'] = 'Reescritura de direcciones';
$lang['mailbox']['recipient_maps'] = 'Reglas de destinatario';
$lang['mailbox']['recipient_map'] = 'Regla de destinatario';
$lang['mailbox']['recipient_map_info'] = 'Las reglas de destinatarios se utilizan para reemplazar la dirección de destino en un mensaje antes de que se entregue.';
$lang['mailbox']['recipient_map_old_info'] = 'El destino original de una regla de destinatario debe ser una dirección de correo electrónico válida o un nombre de dominio.';
$lang['mailbox']['recipient_map_new_info'] = 'El destino de la regla debe ser una dirección de correo válida.';
$lang['mailbox']['recipient_map_old'] = 'Destinatario original';
$lang['mailbox']['recipient_map_new'] = 'Destinatario nuevo';
$lang['danger']['invalid_recipient_map_new'] = 'Destinatario nuevo no válido: %s';
$lang['danger']['invalid_recipient_map_old'] = 'Destinatario original no válido: %s';
$lang['danger']['recipient_map_entry_exists'] = 'Una regla de destinatario "%s" existe';
$lang['success']['recipient_map_entry_saved'] = 'Regla de destinatario "%s" ha sido guardada';
$lang['success']['recipient_map_entry_deleted'] = 'Regla de destinatario con ID %s ha sido elimindada';
$lang['danger']['tls_policy_map_entry_exists'] = 'Regla de póliza de TLS "%s" existe';
$lang['success']['tls_policy_map_entry_saved'] = 'Regla de póliza de TLS "%s" ha sido guardada';
$lang['success']['tls_policy_map_entry_deleted'] = 'Regla de póliza de TLS con ID %s ha sido elimindada';
$lang['mailbox']['add_recipient_map_entry'] = 'Añadir regla de destinatario';
$lang['danger']['tls_policy_map_parameter_invalid'] = "El parámetro de póliza no es válido.";
$lang['success']['forwarding_host_removed'] = "Forwarding host %s has been removed";
$lang['success']['forwarding_host_added'] = "Forwarding host %s has been added";
$lang['success']['relayhost_removed'] = "Regla %s ha sido eliminada";
$lang['success']['relayhost_added'] = "Regla %s ha sido añadida";
$lang['diagnostics']['dns_records'] = 'Récords DNS';
$lang['diagnostics']['dns_records_24hours'] = '<b>Nota:</b> Los cambios realizados en DNS pueden tardar hasta 24 horas para que su estado actual quede reflejado correctamente en esta página. Esta herramienta es una forma de ver fácilmente cómo configurar los registros DNS y verificar si todos los registros están correctamente en DNS.';
$lang['diagnostics']['dns_records_name'] = 'Nombre';
$lang['diagnostics']['dns_records_type'] = 'Tipo';
$lang['diagnostics']['dns_records_data'] = 'Información correcta';
$lang['diagnostics']['dns_records_status'] = 'Información actual';
$lang['diagnostics']['optional'] = 'Este récord es opcional.';
$lang['diagnostics']['cname_from_a'] = 'Valor derivado del registro A / AAAA. Esto es permitido siempre que el registro apunte al recurso correcto.';
//To Translate
$lang['warning']['ip_invalid'] = 'IP inválida omitida: %s';
$lang['danger']['text_empty'] = 'Texto no puede estar vacío';
$lang['danger']['subject_empty'] = 'Asunto no puede estar vacío';
$lang['danger']['from_invalid'] = 'Remitente no puede estar vacío';
$lang['danger']['network_host_invalid'] = 'Red o host inválido: %s';
$lang['add']['mailbox_quota_def'] = 'Cuota de buzón predeterminada';
$lang['edit']['mailbox_quota_def'] = 'Cuota de buzón predeterminada';
$lang['danger']['mailbox_defquota_exceeds_mailbox_maxquota'] = 'Cuota predeterminada supera el límite máximo de cuota';
$lang['danger']['defquota_empty'] = 'La cuota predeterminada por buzón no debe ser 0.';
$lang['mailbox']['mailbox_defquota'] = 'Tamaño de buzón predeterminado';
$lang['user']['sync_jobs'] = 'Trabajos de sincronización';
$lang['acl']['syncjobs'] = 'Trabajos de sincronización';
$lang['mailbox']['sync_jobs'] = 'Trabajos de sincronización';
$lang['tfa']['tfa'] = "Autenticación de dos factores";
$lang['tfa']['set_tfa'] = "Establecer el método de autenticación de dos factores";
$lang['tfa']['yubi_otp'] = "Yubico OTP";
$lang['tfa']['key_id'] = "Un identificador para tu YubiKey";
$lang['tfa']['key_id_totp'] = "Un identificador para tu llave";
$lang['tfa']['api_register'] = 'mailcow utiliza la API de la nube de Yubico. Por favor, obtén una clave API para tu llave <a href="https://upgrade.yubico.com/getapikey/" target="_blank">aquí</a>.';
$lang['tfa']['u2f'] = "Autenticación U2F";
$lang['tfa']['none'] = "Desactivar";
$lang['tfa']['delete_tfa'] = "Desactivar TFA";
$lang['tfa']['disable_tfa'] = "Desactivar TFA hasta el próximo inicio de sesión exitoso";
$lang['tfa']['confirm'] = "Confirmar";
$lang['tfa']['totp'] = "OTP basado en tiempo (Google Authenticator, Authy, etc.)";
$lang['tfa']['select'] = "Selecciona";
$lang['tfa']['waiting_usb_auth'] = "<i>Esperando al dispositivo USB...</i><br><br>Toque el botón en su dispositivo USB U2F ahora.";
$lang['tfa']['waiting_usb_register'] = "<i>Esperando al dispositivo USB....</i><br><br>Ingrese su contraseña arriba y confirme su registro U2F tocando el botón en su dispositivo USB U2F.";
$lang['tfa']['scan_qr_code'] = "Escanee el siguiente código con su aplicación de autenticador o ingrese el código manualmente.";
$lang['tfa']['enter_qr_code'] = "Su código TOTP si su dispositivo no puede escanear códigos QR";
$lang['tfa']['confirm_totp_token'] = "Por favor confirma los cambios ingresando el token generado";
$lang['danger']['transport_dest_exists'] = "Destino de la regla de transporte ya existe";
$lang['danger']['unlimited_quota_acl'] = "Cuota ilimitada restringida por controles administrativos";
$lang['danger']['mysql_error'] = "MySQL error: %s";
$lang['danger']['redis_error'] = "Redis error: %s";
$lang['danger']['unknown_tfa_method'] = "Método TFA desconocido";
$lang['danger']['totp_verification_failed'] = "Verificación TOTP fallida";
$lang['success']['verified_totp_login'] = "Inicio de sesión TOTP verificado";
$lang['danger']['u2f_verification_failed'] = "Verificación U2F fallida: %s";
$lang['success']['verified_u2f_login'] = "Inicio de sesión U2F verificado";
$lang['success']['verified_yotp_login'] = "Inicio de sesión Yubico OTP verificado";
$lang['danger']['yotp_verification_failed'] = "Verificación Yubico OTP fallida: %s";
$lang['danger']['ip_list_empty'] = "La lista de IP permitidas no puede estar vacía";
$lang['danger']['invalid_destination'] = "Formato de destino inválido";
$lang['danger']['invalid_nexthop'] = "Formato del siguiente destino es inválido";
$lang['danger']['invalid_nexthop_authenticated'] = "Siguiente destino existe con credenciales diferentes, actualice las credenciales existentes para esta entrada primero.";
$lang['danger']['next_hop_interferes'] = "%s interfiere con el siguiente destino %s";
$lang['danger']['next_hop_interferes_any'] = "Siguiente destino existente interfiere con %s";
$lang['danger']['rspamd_ui_pw_length'] = "Contraseña de Rspamd UI debe tener al menos 6 carácteres";
$lang['success']['rspamd_ui_pw_set'] = "Contraseña de Rspamd UI establecida";
$lang['success']['queue_command_success'] = "Comando de cola completado con éxito";
$lang['danger']['unknown'] = "Se produjo un error desconocido";
$lang['danger']['malformed_username'] = "Nombre de usuario mal formado";
$lang['info']['awaiting_tfa_confirmation'] = "En espera de confirmación de TFA";
$lang['success']['logged_in_as'] = "Conectado como %s";
$lang['danger']['login_failed'] = "Inicio de sesión fallido";
$lang['danger']['set_acl_failed'] = "Error al establecer el ACL";
$lang['danger']['no_user_defined'] = "No hay usuario definido";
$lang['danger']['script_empty'] = "El script no puede estar vacío";
$lang['danger']['sieve_error'] = "Sieve parser error: %s";
$lang['danger']['value_missing'] = "Por favor proporcione todos los valores";
$lang['danger']['filter_type'] = "Tipo de filtro incorrecto";
$lang['danger']['domain_cannot_match_hostname'] = "El dominio no puede coincidir con el nombre de host";
$lang['warning']['domain_added_sogo_failed'] = "Se agregó el dominio pero no se pudo reiniciar SOGo, revisa los logs del servidor.";
$lang['danger']['rl_timeframe'] = "Marco de tiempo del límite de velocidad esta incorrecto";
$lang['success']['rl_saved'] = "Marco de tiempo del límite de velocidad para el objecto %s fue guardado";
$lang['success']['acl_saved'] = "ACL para el objeto %s guardado";
$lang['success']['deleted_syncjobs'] = "Trabajos de sincronización eliminados: %s";
$lang['success']['deleted_syncjob'] = "Se eliminó el trabajo de sincronización con ID %s";
$lang['success']['delete_filters'] = "Filtros eliminados: %s";
$lang['success']['delete_filter'] = "Se eliminó el filtro con ID %s";
$lang['danger']['invalid_bcc_map_type'] = "Tipo de BCC inválido";
$lang['danger']['bcc_empty'] = "Destino del BCC no puede estar vacío";
$lang['danger']['bcc_must_be_email'] = "Destino del BCC %s no es un buzón válido";
$lang['danger']['bcc_exists'] = "BCC %s existe para el tipo %s";
$lang['success']['bcc_saved'] = "BCC guardado";
$lang['success']['bcc_edited'] = "BCC %s editado";
$lang['success']['bcc_deleted'] = "Entrada de BCC elimindada: %s";
$lang['danger']['private_key_error'] = "Error en la llave privada: %s";
$lang['danger']['map_content_empty'] = "Contenido no puede estar vacío";
$lang['success']['settings_map_added'] = "Ajustes agregados";
$lang['danger']['settings_map_invalid'] = "Ajustes de ID %s invalidos";
$lang['success']['settings_map_removed'] = "Ajustes del ID %s removidos";
$lang['danger']['invalid_host'] = "Host no válido especificado: %s";
$lang['danger']['relayhost_invalid'] = "relayhost %s es invalido";
$lang['success']['saved_settings'] = "Ajustes guardados";
$lang['success']['db_init_complete'] = "Inicialización de la base de datos completada";
$lang['mailbox']['sieve_info'] = 'Puedes almacenar múltiples filtros por usuario, pero solo un prefiltro y un postfiltro pueden estar activos al mismo tiempo.<br>
Cada filtro será procesado en el orden descrito. Ni un script fallido ni un "keep;" emitido detendrá el procesamiento de otros scripts.<br>
<a href="https://github.com/mailcow/mailcow-dockerized/blob/master/data/conf/dovecot/global_sieve_before" target="_blank">Prefiltro sieve global</a> → Prefiltro → Scripts del usuario → Posfiltro → <a href="https://github.com/mailcow/mailcow-dockerized/blob/master/data/conf/dovecot/global_sieve_after" target="_blank">Posfiltro sieve global</a>';
$lang['quarantine']['disabled_by_config'] = "La configuración actual del sistema desactiva la funcionalidad de cuarentena.";
$lang['mailbox']['tls_policy_maps'] = 'Políticas de TLS';
$lang['mailbox']['tls_policy_maps_long'] = 'Forzar póliza de TLS saliente';
$lang['mailbox']['tls_policy_maps_info'] = 'Esta póliza anula las reglas de transporte TLS salientes independientemente de la configuración de la política TLS de los usuarios.<br>
Revisa <a href="http://www.postfix.org/postconf.5.html#smtp_tls_policy_maps" target="_blank">the "smtp_tls_policy_maps" docs</a> para mas información.';
$lang['mailbox']['tls_enforce_in'] = 'Forzar TLS entrance';
$lang['mailbox']['tls_enforce_out'] = 'Forzar TLS saliente';
$lang['add']['syncjob'] = 'Añadir trabajo de sincronización';
$lang['add']['syncjob_hint'] = 'Ten en cuenta que las contraseñas deben guardarse en texto sin cifrado';
$lang['edit']['syncjob'] = 'Editar trabajo de sincronización';
$lang['edit']['client_id'] = 'ID de Cliente';
$lang['edit']['client_secret'] = 'Secreto de cliente';
$lang['edit']['scope'] = 'Alcance';
$lang['edit']['grant_types'] = 'Grant types';
$lang['edit']['redirect_uri'] = 'Redirect/Callback URL';
$lang['add']['username'] = 'Usuario';
$lang['edit']['hostname'] = 'Hostname';
$lang['add']['port'] = 'Puerto';
$lang['edit']['encryption'] = 'Cifrado';
$lang['edit']['maxage'] = 'Antigüedad máxima de los mensajes en días que se migrarán<br><small>(0 = ignorar edad)</small>';
$lang['edit']['maxbytespersecond'] = 'Max. bytes por segundo <br><small>(0 = ilimitado)</small>';
$lang['edit']['automap'] = 'Intentar enlazar carpetas ("Sent items", "Sent" => "Sent" etc.)';
$lang['edit']['skipcrossduplicates'] = 'Omitir mensajes duplicados en carpetas (orden de llegada)';
$lang['add']['automap'] = 'Intentar enlazar carpetas ("Sent items", "Sent" => "Sent" etc.)';
$lang['add']['skipcrossduplicates'] = 'Omitir mensajes duplicados en carpetas (orden de llegada)';
$lang['edit']['subfolder2'] = 'Sincronizar en subcarpeta en destino<br><small>(vacío = no usar subcarpeta)</small>';
$lang['edit']['mins_interval'] = 'Intervalo (min)';
$lang['edit']['exclude'] = 'Excluir objectos (regex)';
$lang['add']['enc_method'] = 'Método de cifrado';
$lang['add']['mins_interval'] = 'Intervalo de sondeo (minutos)';
$lang['add']['exclude'] = 'Excluir objectos (regex)';
$lang['add']['delete2duplicates'] = 'Eliminar duplicados en el destino';
$lang['add']['delete1'] = 'Eliminar de la fuente cuando se complete';
$lang['add']['delete2'] = 'Eliminar mensajes en el destino que no están en la fuente';
$lang['add']['custom_params'] = 'Parámetros personalizados';
$lang['add']['custom_params_hint'] = 'Correcto: --param=xy, Incorrecto: --param xy';
$lang['add']['subscribeall'] = 'Suscribirse a todas las carpetas';
$lang['add']['timeout1'] = 'Tiempo de espera para la conexión al host remoto';
$lang['add']['timeout2'] = 'Tiempo de espera para la conexión al host local';
$lang['edit']['timeout1'] = 'Tiempo de espera para la conexión al host remoto';
$lang['edit']['timeout2'] = 'Tiempo de espera para la conexión al host local';
$lang['edit']['delete2duplicates'] = 'Eliminar duplicados en el destino';
$lang['edit']['delete1'] = 'Eliminar de la fuente cuando se complete';
$lang['edit']['delete2'] = 'Eliminar mensajes en el destino que no están en la fuente';
$lang['edit']['save'] = 'Guardar';
$lang['edit']['gal'] = 'Lista global de direcciones (GAL)';
$lang['add']['gal'] = 'Lista global de direcciones (GAL)';
$lang['edit']['gal_info'] = 'El GAL contiene todos los objetos de un dominio y no puede ser editado por ningún usuario. Falta información de disponibilidad en SOGo, si está desactivada. <b>Reinicia SOGo para aplicar los cambios.</b>';
$lang['add']['gal_info'] = 'El GAL contiene todos los objetos de un dominio y no puede ser editado por ningún usuario. Falta información de disponibilidad en SOGo, si está desactivada. <b>Reinicia SOGo para aplicar los cambios.</b>';
$lang['edit']['force_pw_update'] = 'Forzar cambio de contraseña en el próximo inicio de sesión';
$lang['edit']['force_pw_update_info'] = 'Este usuario solo podrá iniciar sesión en la interfaz de usuario de mailcow.';
$lang['edit']['sogo_access'] = 'Permitir acceso a SOGo';
$lang['edit']['sogo_access_info'] = 'Permitir acceso a SOGo. Este ajuste no afecta el acceso a todos los demás servicios ni elimina o cambia el perfil de SOGo existente de un usuario.';
$lang['add']['add_domain_restart'] = 'Agregar dominio y reiniciar SOGo';
$lang['add']['add_domain_only'] = 'Agregar dominio solamente';
$lang['admin']['rsettings_preset_1'] = 'Deshabilita todos menos DKIM y el límite de velocidad para usuarios autenticados';
$lang['mailbox']['filter_table'] = 'Filtrar tabla';
$lang['admin']['filter_table'] = 'Filtrar tabla';
$lang['admin']['add_admin'] = 'Añadir administrador';
$lang['admin']['dkim_domains_wo_keys'] = "Seleccionar dominios con llaves faltantes";
$lang['user']['spamfilter'] = 'Filtro anti-spam';
$lang['admin']['spamfilter'] = 'Filtro anti-spam';
$lang['admin']['empty'] = 'Sin resultados';
$lang['admin']['rsetting_none'] = 'No hay reglas disponibles';
$lang['admin']['rsetting_add_rule'] = 'Añadir regla';
$lang['admin']['add_settings_rule'] = 'Añadir regla de ajustes';
$lang['admin']['rsetting_desc'] = 'Descripción';
$lang['admin']['rsetting_content'] = 'Contenido de la regla';
$lang['admin']['rsettings_preset_2'] = 'Postmaster quiere correo no deseado';
$lang['admin']['rsettings_insert_preset'] = 'Insertar ejemplo preestablecido "%s"';
$lang['admin']['rspamd-com_settings'] = '<a href="https://rspamd.com/doc/configuration/settings.html#settings-structure" target="_blank">Documentación de Rspamd</a>
- Se generará automáticamente un nombre de configuración, consulte los ajustes preestablecidos de ejemplo a continuación:';
$lang['admin']['change_logo'] = "Cambiar logo";
$lang['admin']['customize'] = "Personalizar";
$lang['admin']['logo_info'] = "La imagen se escalará a una altura de 40 px para la barra de navegación superior y un máx. de ancho de 250 px para la página de inicio. Un gráfico escalable es muy recomendable.";
$lang['admin']['upload'] = "Cargar";
$lang['admin']['app_links'] = "Enlaces de las apps";
$lang['admin']['app_name'] = "Nombre de la app";
$lang['admin']['link'] = "Enlace";
$lang['admin']['remove_row'] = "Eliminar fila";
$lang['admin']['add_row'] = "Agregar fila";
$lang['admin']['reset_default'] = "Restablecer valores predeterminados";
$lang['admin']['merged_vars_hint'] = 'Las filas grises fueron incorporadas de <code>vars.(local.)inc.php</code> y no son modificables.';
$lang['mailbox']['waiting'] = "Esperando";
$lang['mailbox']['status'] = "Status";
$lang['mailbox']['running'] = "En marcha";
$lang['mailbox']['enable_x'] = "Activar";
$lang['mailbox']['disable_x'] = "Desactivar";
$lang['admin']['to_top'] = 'Regresar al principio';
$lang['admin']['in_use_by'] = 'En uso por';
$lang['admin']['refresh'] = 'Actualizar';
$lang['add']['validation_success'] = 'Validado exitosamente';
$lang['add']['activate_filter_warn'] = 'Todos los demás filtros se desactivarán cuando este filtro se active.';
$lang['add']['validate'] = 'Validar';
$lang['mailbox']['add_filter'] = 'Añadir filtro';
$lang['add']['sieve_desc'] = 'Descripción';
$lang['edit']['sieve_desc'] = 'Descripción';
$lang['add']['sieve_type'] = 'Tipo de filtro';
$lang['edit']['sieve_type'] = 'Tipo de filtro';
$lang['mailbox']['set_prefilter'] = 'Marcar como prefiltro';
$lang['mailbox']['set_postfilter'] = 'Marcar como posfiltro';
$lang['mailbox']['filters'] = 'Filtros';
$lang['mailbox']['inactive'] = 'Inactivo';
$lang['edit']['validate_save'] = 'Validar y guardar';
$lang['acl']['spam_alias'] = 'Aliases temporales';
$lang['acl']['tls_policy'] = 'Póliza de TLS';
$lang['acl']['spam_score'] = 'Puntuación de spam';
$lang['acl']['spam_policy'] = 'Lista blanca/negra';
$lang['acl']['delimiter_action'] = 'Acción delimitadora';
$lang['acl']['eas_reset'] = 'Resetear dispositivos EAS';
$lang['acl']['sogo_profile_reset'] = 'Resetear perfil SOGo';
$lang['acl']['quarantine'] = 'Acciones de cuarentena';
$lang['acl']['quarantine_notification'] = 'Notificaciones de cuarentena';
$lang['acl']['quarantine_attachments'] = 'Archivos ajuntos en cuarentena';
$lang['acl']['alias_domains'] = 'Añadir dominios alias';
$lang['acl']['login_as'] = 'Inicie sesión como usuario del buzón';
$lang['acl']['bcc_maps'] = 'Rutas BCC';
$lang['acl']['filters'] = 'Filtros';
$lang['acl']['ratelimit'] = 'Rate limit';
$lang['acl']['recipient_maps'] = 'Rutas del destinatario';
$lang['acl']['unlimited_quota'] = 'Cuota ilimitada para buzones';
$lang['acl']['prohibited'] = 'Prohibido por ACL';
$lang['add']['generate'] = 'Generar';
$lang['add']['goto_ham'] = 'Clasificar como <span class="text-success"><b>correo deseado</b></span>';
$lang['add']['goto_spam'] = 'Clasificar como <span class="text-danger"><b>spam</b></span>';
$lang['add']['goto_null'] = 'Descartar correo silenciosamente';
$lang['footer']['hibp_nok'] = '¡Se encontró coincidencia - esta es una contraseña <b>no segura</b>, selecciona otra!';
$lang['footer']['hibp_ok'] = 'No se encontraron coincidencias';
$lang['oauth2']['scope_ask_permission'] = 'Una aplicación solicitó los siguientes permisos';
$lang['oauth2']['profile'] = 'Perfil';
$lang['oauth2']['profile_desc'] = 'Ver información personal: nombre de usuario, nombre completo, creado, modificado, activo';
$lang['oauth2']['permit'] = 'Autorizar aplicación';
$lang['oauth2']['authorize_app'] = 'Autorizar aplicación';
$lang['oauth2']['deny'] = 'Rechazar';
$lang['oauth2']['access_denied'] = 'Inicie sesión como propietario del buzón para otorgar acceso a través de OAuth2.';
\ No newline at end of file
diff --git a/data/web/lang/lang.nl.php b/data/web/lang/lang.nl.php
index b04e727a..b0c36107 100644
--- a/data/web/lang/lang.nl.php
+++ b/data/web/lang/lang.nl.php
@@ -1,895 +1,895 @@
<?php
/*
* Dutch language file
*
* Created and maintained by Geitenijs
*/
$lang['header']['apps'] = 'Apps';
$lang['footer']['loading'] = "Even geduld aub...";
$lang['header']['restart_sogo'] = 'Herstart SOGo';
$lang['header']['restart_netfilter'] = 'Herstart netfilter';
$lang['footer']['restart_container'] = 'Herstart container';
$lang['footer']['restart_now'] = 'Nu herstarten';
$lang['footer']['restarting_container'] = 'Container wordt herstart, even geduld aub...';
$lang['footer']['restart_container_info'] = '<b>Belangrijk:</b> Een herstart kan enige tijd in beslag nemen, wacht aub totdat dit proces voltooid is.<br>Deze pagina zal zichzelf verversen zodra het proces voltooid is.';
$lang['footer']['confirm_delete'] = 'Bevestig verwijdering';
$lang['footer']['delete_these_items'] = 'Bevestig de wijzigingen aan het volgende object';
$lang['footer']['delete_now'] = 'Nu verwijderen';
$lang['footer']['cancel'] = 'Annuleren';
$lang['footer']['hibp_nok'] = 'Dit is een potentieel onveilig wachtwoord!';
$lang['footer']['hibp_ok'] = 'Dit wachtwoord is relatief veilig';
$lang['danger']['transport_dest_exists'] = 'Transportbestemming "%s" bestaat reeds';
$lang['danger']['unlimited_quota_acl'] = "Onbeperkt quotum geweigerd door toegangscontrole";
$lang['danger']['mysql_error'] = "MySQL-fout: %s";
$lang['danger']['redis_error'] = "Redis-fout: %s";
$lang['danger']['unknown_tfa_method'] = "Onbekende tweefactorauthenticatiemethode";
$lang['danger']['totp_verification_failed'] = "TOTP-verificatie mislukt";
$lang['success']['verified_totp_login'] = "TOTP succesvol geverifieerd";
$lang['danger']['u2f_verification_failed'] = "U2F-verificatie mislukt: %s";
$lang['success']['verified_u2f_login'] = "U2F succesvol geverifieerd";
$lang['success']['verified_yotp_login'] = "Yubico OTP succesvol geverifieerd";
$lang['danger']['yotp_verification_failed'] = "Yubico OTP-verificatie mislukt: %s";
$lang['danger']['ip_list_empty'] = "Lijst met toegestane IP-adressen dient ingevuld te worden";
$lang['danger']['invalid_destination'] = 'Formaat van bestemming "%s" is ongeldig';
$lang['danger']['invalid_nexthop'] = "Formaat van nexthop is ongeldig";
$lang['danger']['invalid_nexthop_authenticated'] = "Er bestaat al een nexthop met andere inloggegevens. Pas deze gegevens voor de reeds bestaande nexthop eerst aan.";
$lang['danger']['next_hop_interferes'] = "%s interfereert met nexthop %s";
$lang['danger']['next_hop_interferes_any'] = "Een bestaande nexthop interfereert met %s";
$lang['danger']['rspamd_ui_pw_length'] = "Rspamd-wachtwoord moet minstens 6 tekens lang zijn";
$lang['success']['rspamd_ui_pw_set'] = "Rspamd-wachtwoord succesvol ingesteld";
$lang['success']['queue_command_success'] = "Opdracht succesvol voltooid";
$lang['danger']['unknown'] = "Er is een onbekende fout opgetreden";
$lang['danger']['malformed_username'] = "Ongeldige gebruikersnaam";
$lang['info']['awaiting_tfa_confirmation'] = "In afwachting van tweefactorauthenticatie...";
$lang['info']['session_expires'] = "Je huidige sessie verloopt over ongeveer 15 seconden";
$lang['success']['logged_in_as'] = "Succesvol ingelogd als %s";
$lang['danger']['login_failed'] = "Aanmelding mislukt";
$lang['danger']['set_acl_failed'] = "Toegangscontrole kon niet worden ingesteld";
$lang['danger']['no_user_defined'] = "Geen gebruiker gespecificeerd";
$lang['danger']['script_empty'] = "Script dient ingevuld te worden";
$lang['danger']['sieve_error'] = "Sieve-fout: %s";
$lang['danger']['value_missing'] = "Niet alle waarden zijn ingevuld";
$lang['danger']['filter_type'] = "Verkeerd filtertype";
$lang['danger']['domain_cannot_match_hostname'] = "Het domein dient af te wijken van de hostname";
$lang['warning']['domain_added_sogo_failed'] = "Domein is toegevoegd, maar het hestarten van SOGo mislukte. Controleer de serverlogs.";
$lang['danger']['rl_timeframe'] = "Ratelimit-tijdsbestek is ongeldig";
$lang['success']['rl_saved'] = "Ratelimit voor object %s is opgeslagen";
$lang['success']['acl_saved'] = "Toegangscontrole voor object %s is opgeslagen";
$lang['success']['deleted_syncjobs'] = "Synchronisatietaken %s zijn verwijderd";
$lang['success']['deleted_syncjob'] = "Synchronisatietaak %s is verwijderd";
$lang['success']['delete_filters'] = "Filters %s zijn verwijderd";
$lang['success']['delete_filter'] = "Filter %s is verwijderd";
$lang['danger']['invalid_bcc_map_type'] = "Ongeldig BCC-kaart type";
$lang['danger']['bcc_empty'] = "BCC-bestemming dient ingevuld te worden";
$lang['danger']['bcc_must_be_email'] = "BCC-bestemming %s is geen geldig e-mailadres";
$lang['danger']['bcc_exists'] = "BCC-kaart %s bestaat voor type %s";
$lang['success']['bcc_saved'] = "BCC-kaart is opgeslagen";
$lang['success']['bcc_edited'] = "BCC-kaart %s is gewijzigd";
$lang['success']['bcc_deleted'] = "BCC-kaarten %s zijn verwijderd";
$lang['danger']['private_key_error'] = "Privésleutel-fout: %s";
$lang['danger']['map_content_empty'] = "Inhoud dient ingevuld te zijn";
$lang['success']['settings_map_added'] = "Instellingen toegevoegd";
$lang['danger']['settings_map_invalid'] = "Instellingen ongeldig";
$lang['danger']['settings_map_removed'] = "Instellingen verwijderd: %s";
$lang['danger']['invalid_host'] = "Ongeldige host gespecificeerd: %s";
$lang['danger']['relayhost_invalid'] = "Invoer %s is ongeldig";
$lang['success']['saved_settings'] = "Instellingen opgeslagen";
$lang['success']['db_init_complete'] = "Database-initialisatie voltooid";
$lang['warning']['session_ua'] = "Token ongeldig: gebruikersagentvalidatie mislukt";
$lang['warning']['session_token'] = "Token ongeldig: komt niet overeen";
$lang['danger']['dkim_domain_or_sel_invalid'] = "DKIM-domein %s ongeldig";
$lang['success']['dkim_removed'] = "DKIM-sleutel %s is verwijderd";
$lang['success']['dkim_added'] = "DKIM-sleutel %s is opgeslagen";
$lang['success']['dkim_duplicated'] = "DKIM-sleutel voor domein %s is gekopieerd naar %s";
$lang['danger']['access_denied'] = "Toegang geweigerd of ongeldige gegevens";
$lang['danger']['domain_invalid'] = "Domeinnaam is ongeldig";
$lang['danger']['mailbox_quota_exceeds_domain_quota'] = "Maximaal postvakquotum is groter dan domeinquotum";
$lang['danger']['object_is_not_numeric'] = "Waarde %s is niet numeriek";
$lang['success']['domain_added'] = "Domein %s is toegevoegd";
$lang['success']['items_deleted'] = "Onderdelen %s zijn verwijderd";
$lang['success']['item_deleted'] = "Onderdeel %s is verwijderd";
$lang['danger']['alias_empty'] = "Aliasadres moet ingevuld worden";
$lang['danger']['last_key'] = 'De laatste sleutel kan niet worden verwijderd';
$lang['danger']['goto_empty'] = "Doeladres moet ingevuld worden";
$lang['danger']['policy_list_from_exists'] = "Er bestaat reeds een vermelding met dezelfde naam";
$lang['danger']['policy_list_from_invalid'] = "Invoer is ongeldig";
$lang['danger']['alias_invalid'] = "Aliasadres %s is ongeldig";
$lang['danger']['goto_invalid'] = "Doeladres %s is ongeldig";
$lang['danger']['alias_domain_invalid'] = "Aliasdomein %s is ongeldig";
$lang['danger']['target_domain_invalid'] = "Doeladres %s is ongeldig";
$lang['danger']['object_exists'] = "Object %s bestaat reeds";
$lang['danger']['domain_exists'] = "Domain %s bestaat reeds";
$lang['danger']['alias_goto_identical'] = "Het alias- en doeladres mogen niet identiek zijn";
$lang['danger']['aliasd_targetd_identical'] = "Aliasdomein %s dient af te wijken van het doeldomein";
$lang['danger']['maxquota_empty'] = 'Maximaal postvakquotum moet groter dan 0 zijn.';
$lang['success']['alias_added'] = "Aliasadres %s is toegevoegd";
$lang['success']['alias_modified'] = "Wijzigingen aan alias %s zijn opgeslagen";
$lang['success']['mailbox_modified'] = "Wijzigingen aan postvak %s zijn opgeslagen";
$lang['success']['resource_modified'] = "Wijzigingen aan postvak %s zijn opgeslagen";
$lang['success']['object_modified'] = "Wijzigingen aan object %s zijn opgeslagen";
$lang['success']['f2b_modified'] = "Wijzigingen aan Fail2ban zijn opgeslagen";
$lang['danger']['targetd_not_found'] = "Doeldomein %s niet gevonden";
$lang['danger']['targetd_relay_domain'] = "Doeldomein %s is een doorgeschakeld domein";
$lang['success']['aliasd_added'] = "Aliasdomein %s is toegevoegd";
$lang['success']['aliasd_modified'] = "Wijzigingen aan aliasadres %s zijn opgeslagen";
$lang['success']['domain_modified'] = "Wijzigingen aan domein %s zijn opgeslagen";
$lang['success']['domain_admin_modified'] = "Wijzigingen aan domeinbeheerder %s zijn opgeslagen";
$lang['success']['domain_admin_added'] = "Domeinbeheerder %s is toegevoegd";
$lang['success']['admin_added'] = "Administrator %s is toegevoegd";
$lang['success']['admin_modified'] = "Wijzigingen aan administrator zijn opgeslagen";
$lang['success']['admin_api_modified'] = "Wijzigingen aan de API zijn opgeslagen";
$lang['success']['license_modified'] = "Wijzigingen aan de licentie zijn opgeslagen";
$lang['danger']['username_invalid'] = "Gebruikersnaam %s kan niet worden gebruikt";
$lang['danger']['password_mismatch'] = "De ingevoerde wachtwoorden komen niet overeen";
$lang['danger']['password_complexity'] = "Wachtwoord voldoet niet aan de vereisten (6 tekens lang, letters en nummers)";
$lang['danger']['password_empty'] = "Het wachtwoord moet ingevuld worden";
$lang['danger']['login_failed'] = "Aanmelding mislukt";
$lang['danger']['mailbox_invalid'] = "Naam van het postvak is ongeldig";
$lang['danger']['description_invalid'] = 'Beschrijving voor %s is ongeldig';
$lang['danger']['resource_invalid'] = "Naam van het middel %s is ongeldig";
$lang['danger']['is_alias'] = "Aliasadres %s bestaat reeds";
$lang['danger']['is_alias_or_mailbox'] = "Aliasadres of postvak %s bestaat reeds";
$lang['danger']['is_spam_alias'] = "Spam-aliasadres %s bestaat reeds";
$lang['danger']['quota_not_0_not_numeric'] = "Quotum moet numeriek en groter dan 0 zijn";
$lang['danger']['domain_not_found'] = 'Domein %s niet gevonden';
$lang['danger']['max_mailbox_exceeded'] = "Maximaal aantal postvakken overschreden (%d van %d)";
$lang['danger']['max_alias_exceeded'] = 'Maximaal aantal aliassen overschreden';
$lang['danger']['mailbox_quota_exceeded'] = "Postvakquotum heeft het domeinlimiet overschreden (max. %d MiB)";
$lang['danger']['mailbox_quota_left_exceeded'] = "Onvoldoende ruimte beschikbaar (%d MiB)";
$lang['success']['mailbox_added'] = "Postvak %s is toegevoegd";
$lang['success']['resource_added'] = "Middel %s is toegevoegd";
$lang['success']['domain_removed'] = "Domein %s is verwijderd";
$lang['success']['alias_removed'] = "Alias %s is verwijderd";
$lang['success']['alias_domain_removed'] = "Aliasdomein %s is verwijderd";
$lang['success']['domain_admin_removed'] = "Domeinbeheerder %s is verwijderd";
$lang['success']['admin_removed'] = "Administrator %s is verwijderd";
$lang['success']['mailbox_removed'] = "Postvak %s is verwijderd";
$lang['success']['eas_reset'] = "De ActiveSync-apparaatcache voor gebruiker %s is hersteld";
$lang['success']['resource_removed'] = "Middel %s is verwijderd";
$lang['warning']['cannot_delete_self'] = "Gebruikers kunnen niet worden verwijderd wanneer deze zijn ingelogd";
$lang['warning']['no_active_admin'] = "Het is niet mogelijk om de laatste actieve administrator te verwijderen";
$lang['danger']['max_quota_in_use'] = "Postvakquotum moet gelijk zijn aan, of groter zijn dan %d MiB";
$lang['danger']['domain_quota_m_in_use'] = "Domeinquotum moet gelijk zijn aan, of groter zijn dan %s MiB";
$lang['danger']['mailboxes_in_use'] = "Maximaal aantal postvakken moet gelijk zijn aan, of groter zijn dan %d";
$lang['danger']['aliases_in_use'] = "Maximaal aantal aliassen moet gelijk zijn aan, of groter zijn dan %d";
$lang['danger']['sender_acl_invalid'] = "Toegangscontrole van afzender %s is ongeldig";
$lang['danger']['domain_not_empty'] = "Domein %s is in gebruik, verwijderen niet mogelijk";
$lang['danger']['validity_missing'] = 'Wijs een geldigheidstermijn toe';
$lang['user']['loading'] = "Bezig met laden...";
$lang['user']['force_pw_update'] = 'Er <b>moet</b> een nieuw wachtwoord worden ingesteld voordat er gebruik kan worden gemaakt van deze dienst.';
$lang['user']['active_sieve'] = "Actieve filters";
$lang['user']['show_sieve_filters'] = "Toon actieve filters";
$lang['user']['no_active_filter'] = "Geen actieve filters gevonden";
$lang['user']['messages'] = "berichten"; // "123 messages"
$lang['user']['in_use'] = "Gebruikt";
$lang['user']['user_change_fn'] = "";
$lang['user']['user_settings'] = 'Gebruikersinstellingen';
$lang['user']['mailbox_details'] = 'Postvakdetails';
$lang['user']['change_password'] = 'Verander wachtwoord';
$lang['user']['client_configuration'] = "Toon configuratiegidsen voor e-mailprogramma's";
$lang['user']['new_password'] = 'Nieuw wachtwoord';
$lang['user']['save_changes'] = 'Wijzigingen opslaan';
$lang['user']['password_now'] = 'Huidig wachtwoord';
$lang['user']['new_password_repeat'] = 'Herhaal wachtwoord';
$lang['user']['new_password_description'] = 'Vereisten: 6 tekens lang, letters en nummers';
$lang['user']['spam_aliases'] = 'Tijdelijk e-mailadres';
$lang['user']['alias'] = 'Alias';
$lang['user']['shared_aliases'] = 'Gedeelde aliasadressen';
$lang['user']['shared_aliases_desc'] = 'Een gedeeld aliasadres wordt niet beïnvloedt door gebruiker-specifieke instellingen. Een aangepast spamfilter kan eventueel worden ingesteld door een beheerder.';
$lang['user']['direct_aliases'] = 'Directe aliasadressen';
$lang['user']['direct_aliases_desc'] = 'Directe aliasadressen worden beïnvloedt door spamfilters en het versleutelingsbeleid.';
$lang['user']['is_catch_all'] = 'Catch-all voor domeinen';
$lang['user']['aliases_also_send_as'] = 'Toegestaan om te verzenden als';
$lang['user']['aliases_send_as_all'] = 'Controleer verzendtoegang voor de volgende domeinen, inclusief aliassen, niet';
$lang['user']['alias_create_random'] = 'Creëer willekeurig alias';
$lang['user']['alias_extend_all'] = 'Verleng alias met 1 uur';
$lang['user']['alias_valid_until'] = 'Geldig tot';
$lang['user']['alias_remove_all'] = 'Verwijder alle aliassen';
$lang['user']['alias_time_left'] = 'Resterende tijd';
$lang['user']['alias_full_date'] = 'd.m.Y, H:i:s T';
$lang['user']['alias_select_validity'] = 'Geldigheid';
$lang['user']['sync_jobs'] = 'Synchronisatietaken';
$lang['user']['expire_in'] = 'Verloopt over';
$lang['user']['hour'] = 'uur';
$lang['user']['hours'] = 'uren';
$lang['user']['day'] = 'dag';
$lang['user']['week'] = 'week';
$lang['user']['weeks'] = 'weken';
$lang['user']['spamfilter'] = 'Spamfilter';
$lang['admin']['spamfilter'] = 'Spamfilter';
$lang['user']['spamfilter_wl'] = 'Witte lijst';
$lang['user']['spamfilter_wl_desc'] = 'Zet e-mailadressen op de witte lijst om ze <b>nooit</b> als spam te markeren.<br>Deze lijst wordt niet toegepast op een gedeeld aliasadres.<br>Wildcards (*) zijn toegestaan.';
$lang['user']['spamfilter_bl'] = 'Zwarte lijst';
$lang['user']['spamfilter_bl_desc'] = 'Zet e-mailadressen op de zwarte lijst om ze <b>altijd</b> als spam te markeren.<br>Deze lijst wordt niet toegepast op een gedeeld aliasadres.<br>Wildcards (*) zijn toegestaan.';
$lang['user']['spamfilter_behavior'] = 'Beoordeling';
$lang['user']['spamfilter_table_rule'] = 'Regel';
$lang['user']['spamfilter_table_action'] = 'Handeling';
$lang['user']['spamfilter_table_empty'] = 'Geen gegevens om weer te geven';
$lang['user']['spamfilter_table_remove'] = 'verwijder';
$lang['user']['spamfilter_table_add'] = 'Voeg toe';
$lang['user']['spamfilter_green'] = 'Groen: dit bericht is geen spam.';
$lang['user']['spamfilter_yellow'] = 'Geel: dit bericht is mogelijk spam en zal in de spamfolder geplaatst worden.';
$lang['user']['spamfilter_red'] = 'Rood: dit bericht is spam en zal, op basis van de instellingen, worden geweigerd of in de quarantaine worden geplaatst.';
$lang['user']['spamfilter_default_score'] = 'Standaardwaarden';
$lang['user']['spamfilter_hint'] = 'De eerste waarde omschrijft een lage spamscore, de tweede een hoge spamscore.';
$lang['user']['spamfilter_table_domain_policy'] = "n.v.t. (domeinbeleid)";
$lang['user']['waiting'] = "Wachten";
$lang['user']['status'] = "Status";
$lang['user']['running'] = "Wordt uitgevoerd";
$lang['user']['tls_policy_warning'] = '<strong>Let wel:</strong> Door versleuteling te forceren, worden mogelijk niet alle e-mails afgeleverd.<br>Berichten die niet aan het ingestelde beleid voldoen, worden resoluut geweigerd.<br>Dit is van toepassing op het primaire e-mailadres, inclusief alle <b>directe</b> aliasadressen.';
$lang['user']['tls_policy'] = 'Versleutelingsbeleid';
$lang['user']['tls_enforce_in'] = 'Vereis inkomend';
$lang['user']['tls_enforce_out'] = 'Vereis uitgaand';
$lang['user']['no_record'] = 'Geen vermelding';
$lang['user']['tag_handling'] = 'E-mailtags';
$lang['user']['tag_in_subfolder'] = 'In submap';
$lang['user']['tag_in_subject'] = 'In onderwerp';
$lang['user']['tag_in_none'] = 'Niets doen';
$lang['user']['tag_help_explain'] = 'In submap: er wordt een nieuwe map aangemaakt, genoemd naar de tag (bijv.: "INBOX/Tesla").<br>In onderwerp: de tag wordt vóór het oorspronkelijke onderwerp geplaatst (bijv.: "[Tesla] Uw serviceafspraak").';
$lang['user']['tag_help_example'] = 'Voorbeeld van een e-maildres met tag: ik<b>+Tesla</b>@example.org';
$lang['user']['eas_reset'] = 'Herstel ActiveSync-apparaatcache';
$lang['user']['eas_reset_now'] = 'Herstel nu';
$lang['user']['eas_reset_help'] = 'In de meeste gevallen verhelpt dit problemen met ActiveSync op je apparaten<br><b>Let wel:</b> alle onderdelen zullen opnieuw gedownload moeten worden!';
$lang['user']['sogo_profile_reset'] = 'Herstel SOGo-profiel';
$lang['user']['sogo_profile_reset_now'] = 'Herstel nu';
$lang['user']['sogo_profile_reset_help'] = 'Dit zal het SOGo-profiel van deze gebruiker verwijderen, en daarbij <b>alle gegevens permanent verwijderen</b>.';
$lang['user']['encryption'] = 'Versleuteling';
$lang['user']['username'] = 'Gebruikersnaam';
$lang['user']['last_run'] = 'Laatst uitgevoerd';
$lang['user']['excludes'] = 'Exclusief';
$lang['user']['interval'] = 'Interval';
$lang['user']['active'] = 'Actief';
$lang['user']['action'] = 'Handeling';
$lang['user']['edit'] = 'Wijzig';
$lang['user']['remove'] = 'Verwijder';
$lang['user']['create_syncjob'] = 'Voeg een nieuwe synchronisatietaak toe';
$lang['start']['mailcow_apps_detail'] = 'Gebruik een Mailcow-app om je e-mails, agenda, contacten en meer te bekijken.';
$lang['start']['mailcow_panel_detail'] = '<b>Domeinbeheerders</b> kunnen postvakken en aliassen aanmaken, wijzigen en verwijderen. Ook kunnen ze domeinen aanpassen en informatie over deze verkrijgen.<br><b>Gebruikers</b> kunnen tijdelijke aliassen aanmaken, hun wachtwoord aanpassen en de spamfilterinstellingen wijzigen.';
$lang['start']['imap_smtp_server_auth_info'] = 'Gebruik je volledige e-mailadres en het bijbehorende (onversleutelde) verificatiemechanisme.<br>De aanmeldgegevens worden versleuteld verstuurd.';
$lang['start']['help'] = 'Toon/verberg hulppaneel';
$lang['header']['mailcow_settings'] = 'Instellingen';
$lang['header']['administration'] = 'Configuratie & details';
$lang['header']['mailboxes'] = 'Mailconfiguratie';
$lang['header']['user_settings'] = 'Gebruikersinstellingen';
$lang['header']['quarantine'] = "Quarantaine";
$lang['header']['debug'] = "Systeeminformatie";
$lang['quarantine']['disabled_by_config'] = "De huidige systeemconfiguratie deactiveert de quarantainefunctionaliteit.";
$lang['mailbox']['tls_policy_maps'] = 'Globaal versleutelingsbeleid';
$lang['mailbox']['tls_policy_maps_long'] = 'Uitgaand versleutelingsbeleid';
$lang['mailbox']['tls_policy_maps_info'] = 'Deze opties worden boven het versleutelingsbeleid van een gebruiker verkozen.<br>Bekijk <a href="http://www.postfix.org/postconf.5.html#smtp_tls_policy_maps" target="_blank">de documentatie</a> voor meer informatie.';
$lang['mailbox']['tls_enforce_in'] = 'Forceer inkomende versleuteling';
$lang['mailbox']['tls_enforce_out'] = 'Forceer uitgaande versleuteling';
$lang['mailbox']['tls_map_dest'] = 'Bestemming';
-$lang['mailbox']['tls_map_dest_info'] = 'Voorbeeld: example.org, .example.org, mail@example.org, [mail.example.org]:25';
+$lang['mailbox']['tls_map_dest_info'] = 'Voorbeeld: example.org, .example.org, [mail.example.org]:25';
$lang['mailbox']['tls_map_policy'] = 'Beleid';
$lang['mailbox']['tls_map_parameters'] = 'Parameters';
$lang['mailbox']['tls_map_parameters_info'] = 'Voorbeeld: protocols=!SSLv2 ciphers=medium exclude=3DES';
$lang['mailbox']['booking_0'] = 'Toon altijd als vrij';
$lang['mailbox']['booking_lt0'] = 'Onbeperkt, maar toon als bezet wanneer geboekt';
$lang['mailbox']['booking_custom'] = 'Zet vast op een specifiek aantal boekingen';
$lang['mailbox']['booking_0_short'] = 'Altijd vrij';
$lang['mailbox']['booking_lt0_short'] = 'Softlimiet';
$lang['mailbox']['booking_custom_short'] = 'Hardlimiet';
$lang['mailbox']['domain'] = 'Domein';
$lang['mailbox']['spam_aliases'] = 'Tijdelijk alias';
$lang['mailbox']['multiple_bookings'] = 'Meerdere boekingen';
$lang['mailbox']['kind'] = 'Soort';
$lang['mailbox']['description'] = 'Beschrijving';
$lang['mailbox']['alias'] = 'Alias';
$lang['mailbox']['aliases'] = 'Aliassen';
$lang['mailbox']['domains'] = 'Domeinen';
$lang['admin']['domain'] = 'Domein';
$lang['admin']['domain_s'] = 'Domein(en)';
$lang['mailbox']['mailboxes'] = 'Postvakken';
$lang['mailbox']['mailbox'] = 'Postvak';
$lang['mailbox']['resources'] = 'Middelen';
$lang['mailbox']['mailbox_quota'] = 'Maximale postvakgrootte';
$lang['mailbox']['domain_quota'] = 'Quotum';
$lang['mailbox']['active'] = 'Actief';
$lang['mailbox']['action'] = 'Handeling';
$lang['mailbox']['backup_mx'] = 'Secundaire MX';
$lang['mailbox']['domain_aliases'] = 'Domeinaliassen';
$lang['mailbox']['target_domain'] = 'Doeldomein';
$lang['mailbox']['target_address'] = 'Doeladres';
$lang['mailbox']['username'] = 'Gebruikersnaam';
$lang['mailbox']['fname'] = 'Volledige naam';
$lang['mailbox']['filter_table'] = 'Filtertabel';
$lang['mailbox']['in_use'] = 'In gebruik (%)';
$lang['mailbox']['msg_num'] = 'Bericht #';
$lang['mailbox']['remove'] = 'Verwijder';
$lang['mailbox']['edit'] = 'Wijzig';
$lang['mailbox']['no_record'] = 'Geen vermelding voor object %s';
$lang['mailbox']['no_record_single'] = 'Geen vermelding';
$lang['mailbox']['add_domain'] = 'Voeg domein toe';
$lang['mailbox']['add_domain_alias'] = 'Voeg domeinalias toe';
$lang['mailbox']['add_mailbox'] = 'Voeg postvak toe';
$lang['mailbox']['add_resource'] = 'Voeg middel toe';
$lang['mailbox']['add_alias'] = 'Voeg alias toe';
$lang['mailbox']['add_domain_record_first'] = 'Voeg eerst een domein toe';
$lang['mailbox']['empty'] = 'Geen resultaten';
$lang['mailbox']['toggle_all'] = 'Selecteer alles';
$lang['mailbox']['quick_actions'] = 'Handelingen';
$lang['mailbox']['activate'] = 'Activeer';
$lang['mailbox']['deactivate'] = 'Deactiveer';
$lang['mailbox']['owner'] = 'Eigenaar';
$lang['mailbox']['mins_interval'] = 'Interval (min)';
$lang['mailbox']['last_run'] = 'Laatst uitgevoerd';
$lang['mailbox']['excludes'] = 'Exclusief';
$lang['mailbox']['last_run_reset'] = 'Plan volgende';
$lang['mailbox']['sieve_info'] = 'Het is mogelijk om meerdere filters per gebruiker in te stellen, maar er kan slechts één voorfilter en één nafilter tegelijkertijd actief zijn.<br>Elk filter zal in de aangegeven volgorde worden verwerkt. Noch een mislukt script, noch een gespecificeerde "keep;" stopt met het verwerken van volgende scripts.<br><a href="https://github.com/mailcow/mailcow-dockerized/blob/master/data/conf/dovecot/global_sieve_before" target="_blank">Globaal voorfilter</a> → Voorfilter → Gebruikersscripts → Nafilter → <a href="https://github.com/mailcow/mailcow-dockerized/blob/master/data/conf/dovecot/global_sieve_after" target="_blank">Globaal nafilter</a>';
$lang['info']['no_action'] = 'Geen handeling van toepassing';
$lang['edit']['sogo_visible'] = 'Alias is zichtbaar in SOGo';
$lang['edit']['sogo_visible_info'] = 'Deze optie beïnvloedt enkel objecten die kunnen worden weergegeven in SOGo (gedeelde of niet-gedeelde aliasadressen die naar minstens één postvak verwijzen).';
$lang['mailbox']['sogo_visible'] = 'Alias is zichtbaar in SOGo';
$lang['mailbox']['sogo_visible_y'] = 'Toon alias in SOGo';
$lang['mailbox']['sogo_visible_n'] = 'Verberg alias in SOGo';
$lang['edit']['syncjob'] = 'Wijzig synchronisatietaak';
$lang['edit']['client_id'] = 'Client ID';
$lang['edit']['client_secret'] = 'Client secret';
$lang['edit']['scope'] = 'Omvang';
$lang['edit']['grant_types'] = 'Grant types';
$lang['edit']['redirect_uri'] = 'Doorstuur/Callback URL';
$lang['edit']['hostname'] = 'Hostname';
$lang['edit']['encryption'] = 'Versleuteling';
$lang['edit']['maxage'] = 'Maximale leeftijd van berichten (in dagen) die extern worden opgehaald<br><small>(0 = negeer leeftijd)</small>';
$lang['edit']['maxbytespersecond'] = 'Maximale bytes per seconde <br><small>(0 = onbeperkt)</small>';
$lang['edit']['automap'] = 'Probeer mappen automatisch te koppelen ("Verstuurde items", "Verstuurd" => "Verstuurd" etc.)';
$lang['edit']['skipcrossduplicates'] = 'Sla duplicaten verspreid over mappen over (wie het eerst komt, het eerst maalt)';
$lang['add']['automap'] = 'Probeer mappen automatisch te koppelen ("Verstuurde items", "Verstuurd" => "Verstuurd" etc.)';
$lang['add']['skipcrossduplicates'] = 'Sla duplicaten verspreid over mappen over (wie het eerst komt, het eerst maalt)';
$lang['edit']['subfolder2'] = 'Synchroniseer in submap op bestemming<br><small>(leeg = gebruik geen submappen)</small>';
$lang['edit']['mins_interval'] = 'Interval (min)';
$lang['edit']['exclude'] = 'Sluit objecten uit (regex)';
$lang['edit']['save'] = 'Wijzigingen opslaan';
$lang['edit']['username'] = 'Gebruikersnaam';
$lang['edit']['max_mailboxes'] = 'Maximaal aantal postvakken';
$lang['edit']['title'] = 'Wijzig object';
$lang['edit']['target_address'] = 'Doeladres(sen) <small>(kommagescheiden)</small>';
$lang['edit']['active'] = 'Actief';
$lang['edit']['gal'] = 'Globale adreslijst';
$lang['add']['gal'] = 'Globale adreslijst';
$lang['edit']['gal_info'] = 'De globale adreslijst bevat alle objecten van een domein. Deze kunnen door geen enkele gebruiker worden bewerkt. <b>Herstart SOGo om wijzigingen door te voeren.</b>';
$lang['add']['gal_info'] = 'De globale adreslijst bevat alle objecten van een domein. Deze kunnen door geen enkele gebruiker worden bewerkt. <b>Herstart SOGo om wijzigingen door te voeren.</b>';
$lang['edit']['force_pw_update'] = 'Vereis nieuw wachtwoord bij eerstvolgende login';
$lang['edit']['force_pw_update_info'] = 'Deze gebruiker kan hierdoor enkel inloggen op Mailcow UI, totdat de procedure succesvol doorlopen is.';
$lang['edit']['sogo_access'] = 'Geef toegang to SOGo';
$lang['edit']['sogo_access_info'] = 'Deze gebruiker kan, wanneer ingeschakeld, gebruikmaken van SOGo. Deze instelling heeft niks te maken met de rest van de services. Ook zal het SOGo-profiel van deze gebruiker bewaard blijven.';
$lang['edit']['target_domain'] = 'Doeldomein';
$lang['edit']['password'] = 'Wachtwoord';
$lang['edit']['password_repeat'] = 'Herhaal wachtwoord';
$lang['edit']['domain_admin'] = 'Wijzig domeinbeheerder';
$lang['edit']['domain'] = 'Wijzig domein';
$lang['edit']['edit_alias_domain'] = 'Wijzig aliasdomein';
$lang['edit']['domains'] = 'Domeinen';
$lang['edit']['alias'] = 'Wijzig alias';
$lang['edit']['mailbox'] = 'Wijzig postvak';
$lang['edit']['description'] = 'Beschrijving';
$lang['edit']['max_aliases'] = 'Maximaal aantal aliassen';
$lang['edit']['max_quota'] = 'Postvakquotum (MiB)';
$lang['edit']['domain_quota'] = 'Domeinquotum (MiB)';
$lang['edit']['backup_mx_options'] = 'Secundaire MX';
$lang['edit']['relay_domain'] = 'Schakel dit domein door';
$lang['edit']['relay_all'] = 'Schakel alle ontvangers door';
$lang['edit']['relay_all_info'] = '<small>Wanneer er wordt gekozen om <b>niet</b> alle ontvangers door te schakelen, dient er per ontvanger een leeg postvak aangemaakt te worden.</small>';
$lang['edit']['full_name'] = 'Volledige naam';
$lang['edit']['quota_mb'] = 'Quotum (MiB)';
$lang['edit']['sender_acl'] = 'Sta toe om te verzenden als';
$lang['edit']['sender_acl_disabled'] = '↳ <span class="label label-danger">Verzendcontrole is uitgeschakeld</span>';
$lang['user']['sender_acl_disabled'] = '↳ <span class="label label-danger">Verzendcontrole is uitgeschakeld</span>';
$lang['edit']['previous'] = 'Vorige pagina';
$lang['edit']['unchanged_if_empty'] = 'Laat leeg wanneer onveranderd';
$lang['edit']['dont_check_sender_acl'] = "Schakel verzendcontrole uit voor domein %s (inclusief aliasdomeinen)";
$lang['edit']['multiple_bookings'] = 'Meerdere boekingen';
$lang['edit']['kind'] = 'Soort';
$lang['edit']['resource'] = 'Middel';
$lang['edit']['relayhost'] = 'Afzender-afhankelijke transportkaarten';
$lang['edit']['public_comment'] = 'Publieke opmerking';
$lang['mailbox']['public_comment'] = 'Publieke opmerking';
$lang['edit']['private_comment'] = 'Persoonlijke opmerking';
$lang['mailbox']['private_comment'] = 'Persoonlijke opmerking';
$lang['edit']['comment_info'] = 'Een persoonlijke opmerking is niet zichtbaar voor de gebruiker, terwijl een publieke opmerking wel weergegeven zal worden in het overzicht van deze gebruiker.';
$lang['add']['public_comment'] = 'Publieke opmerking';
$lang['add']['private_comment'] = 'Persoonlijke opmerking';
$lang['add']['comment_info'] = 'Een persoonlijke opmerking is niet zichtbaar voor de gebruiker, terwijl een publieke opmerking wel weergegeven zal worden in het overzicht van deze gebruiker.';
$lang['acl']['spam_alias'] = 'Tijdelijke aliassen';
$lang['acl']['tls_policy'] = 'Versleutelingsbeleid';
$lang['acl']['spam_score'] = 'Spamscore';
$lang['acl']['spam_policy'] = 'Blacklist/Whitelist';
$lang['acl']['delimiter_action'] = 'Delimiter-actie';
$lang['acl']['syncjobs'] = 'Synchronisatietaken';
$lang['acl']['eas_reset'] = 'Herstel ActiveSync-apparaatcache';
$lang['acl']['sogo_profile_reset'] = 'Herstel SOGo-profiel';
$lang['acl']['quarantine'] = 'Quarantaine-acties';
$lang['acl']['quarantine_notification'] = 'Quarantaine-notificaties';
$lang['acl']['quarantine_attachments'] = 'Quarantaine-bijlagen';
$lang['acl']['alias_domains'] = 'Voeg aliasdomeinen toe';
$lang['acl']['login_as'] = 'Log in als postvakgebruiker';
$lang['acl']['bcc_maps'] = 'BCC-kaarten';
$lang['acl']['filters'] = 'Filters';
$lang['acl']['ratelimit'] = 'Ratelimit';
$lang['acl']['recipient_maps'] = 'Ontvanger-kaarten';
$lang['acl']['unlimited_quota'] = 'Onbeperkt quotum voor postvakken';
$lang['acl']['extend_sender_acl'] = 'Sta verzenden via externe adressen toe';
$lang['acl']['prohibited'] = 'Toegang geweigerd';
$lang['edit']['extended_sender_acl'] = 'Externe verzendadressen';
$lang['edit']['extended_sender_acl_info'] = 'Wanneer mogelijk dient er een DKIM-sleutel geïmporteerd te worden. Vergeet niet om deze server toe te voegen aan het SPF-record <br>
Zodra er een domein of aliasdomein wordt toegevoegd aan deze server, overeenkomend met een extern verzendadres, wordt het externe adres verwijderd.<br>
Gebruik @domain.tld om verzenden vanuit *@domain.tld toe te staan.';
$lang['edit']['sender_acl_info'] = 'Als postvakgebruiker A toegestaan is te verzenden als postvakgebruiker B, zal het verzendadres niet automatisch worden weergegeven in het "van"-veld in SOGo. Postvakgebruiker A dient hiervoor een aparte vermelding te maken in SOGo. Dit is niet van toepassing op aliasadressen.';
$lang['mailbox']['quarantine_notification'] = 'Quarantaine-notificaties';
$lang['mailbox']['never'] = 'Nooit';
$lang['mailbox']['hourly'] = 'Ieder uur';
$lang['mailbox']['daily'] = 'Dagelijks';
$lang['mailbox']['weekly'] = 'Wekelijks';
$lang['user']['quarantine_notification'] = 'Quarantaine-notificaties';
$lang['user']['never'] = 'Nooit';
$lang['user']['hourly'] = 'Ieder uur';
$lang['user']['daily'] = 'Dagelijks';
$lang['user']['weekly'] = 'Wekelijks';
$lang['user']['quarantine_notification_info'] = 'Zodra een notificatie is verzonden, worden de items als gelezen gemarkeerd en zullen er geen meldingen meer over diezelfde items verstuurd worden.';
$lang['add']['generate'] = 'genereer';
$lang['add']['syncjob'] = 'Voeg een nieuwe synchronisatietaak toe';
$lang['add']['syncjob_hint'] = 'Wees ervan bewust dat de authenticatiedata onversleuteld wordt opgeslagen!';
$lang['add']['hostname'] = 'Host';
$lang['add']['destination'] = 'Bestemming';
$lang['add']['nexthop'] = 'Nexthop';
$lang['edit']['nexthop'] = 'Nexthop';
$lang['add']['hostname'] = 'Hostname';
$lang['add']['port'] = 'Poort';
$lang['add']['username'] = 'Gebruikersnaam';
$lang['add']['enc_method'] = 'Versleutelingsmethode';
$lang['add']['mins_interval'] = 'Interval (min)';
$lang['add']['exclude'] = 'Sluit objecten uit (regex)';
$lang['add']['delete2duplicates'] = 'Verwijder duplicaten op de bestemming';
$lang['add']['delete1'] = 'Verwijder van oorsprong wanneer voltooid';
$lang['add']['delete2'] = 'Verwijder berichten die zich niet in de oorsprong bevinden';
$lang['edit']['delete2duplicates'] = 'Verwijder duplicaten op de bestemming';
$lang['edit']['delete1'] = 'Verwijder van oorsprong wanneer voltooid';
$lang['edit']['delete2'] = 'Verwijder berichten die zich niet in de oorsprong bevinden';
$lang['add']['custom_params'] = 'Aangepaste parameters';
$lang['add']['custom_params_hint'] = 'Goed: --param=xy, fout: --param xy';
$lang['add']['subscribeall'] = 'Abonneer op alle mappen';
$lang['add']['timeout1'] = 'Time-out voor verbinding met externe hosts';
$lang['add']['timeout2'] = 'Time-out voor verbinding met lokale hosts';
$lang['edit']['timeout1'] = 'Time-out voor verbinding met externe hosts';
$lang['edit']['timeout2'] = 'Time-out voor verbinding met lokale hosts';
$lang['add']['domain_matches_hostname'] = 'Domein %s komt overeen met hostname';
$lang['add']['domain'] = 'Domein';
$lang['add']['active'] = 'Actief';
$lang['add']['multiple_bookings'] = 'Meerdere boekingen';
$lang['add']['description'] = 'Beschrijving';
$lang['add']['max_aliases'] = 'Maximaal aantal aliassen';
$lang['add']['max_mailboxes'] = 'Maximaal aantal postvakken';
$lang['add']['mailbox_quota_m'] = 'Maximaal postvakquotum (MiB)';
$lang['add']['domain_quota_m'] = 'Totale domeinquotum (MiB)';
$lang['add']['backup_mx_options'] = 'Secundaire MX';
$lang['add']['relay_all'] = 'Schakel alle ontvangers door';
$lang['add']['relay_domain'] = 'Schakel dit domein door';
$lang['add']['relay_all_info'] = '<small>Wanneer er wordt gekozen om <b>niet</b> alle ontvangers door te schakelen, dient er per ontvanger een blind postvak aangemaakt te worden.</small>';
$lang['add']['alias_address'] = 'Aliasadres(sen)';
$lang['add']['alias_address_info'] = '<small>Volledig(e) e-mailadres(sen) of @example.com, om een catch-all aan te maken voor een domein (kommagescheiden). <b>Enkel Mailcow-domeinen</b>.</small>';
$lang['add']['alias_domain_info'] = '<small>Alleen geldige domeinnamen (kommagescheiden).</small>';
$lang['add']['target_address'] = 'Doeladressen';
$lang['add']['target_address_info'] = '<small>Volledig(e) e-mailadres(sen) (kommagescheiden).</small>';
$lang['add']['alias_domain'] = 'Aliasdomein';
$lang['add']['select'] = 'Selecteer...';
$lang['add']['target_domain'] = 'Doeldomein';
$lang['add']['kind'] = 'Soort';
$lang['add']['mailbox_username'] = 'Gebruikersnaam (linkergedeelte van een e-mailadres)';
$lang['add']['full_name'] = 'Volledige naam';
$lang['add']['quota_mb'] = 'Quotum (MiB)';
$lang['add']['select_domain'] = 'Selecteer eerst een domein';
$lang['add']['password'] = 'Wachtwoord';
$lang['add']['password_repeat'] = 'Herhaal wachtwoord';
$lang['add']['restart_sogo_hint'] = 'SOGo dient opnieuw opgestart te worden nadat een domein is toegevoegd';
$lang['add']['goto_null'] = 'Houd e-mail achterwege';
$lang['add']['goto_ham'] = 'Leer als <span class="text-success"><b>ham</b></span>';
$lang['add']['goto_spam'] = 'Leer als <span class="text-danger"><b>spam</b></span>';
$lang['add']['validation_success'] = 'Succesvol geverifieerd';
$lang['add']['activate_filter_warn'] = 'Alle overige filters zullen worden gedeactiveerd zodra deze geactiveerd.';
$lang['add']['validate'] = 'Verifieer';
$lang['mailbox']['add_filter'] = 'Voeg filter toe';
$lang['add']['sieve_desc'] = 'Korte beschrijving';
$lang['edit']['sieve_desc'] = 'Korte beschrijving';
$lang['add']['sieve_type'] = 'Filtertype';
$lang['edit']['sieve_type'] = 'Filtertype';
$lang['mailbox']['set_prefilter'] = 'Stel in als voorfilter';
$lang['mailbox']['set_postfilter'] = 'Stel in als nafilter';
$lang['mailbox']['filters'] = 'Filters';
$lang['mailbox']['sync_jobs'] = 'Synchronisatietaken';
$lang['mailbox']['inactive'] = 'Inactief';
$lang['edit']['validate_save'] = 'Verifieer en sla op';
$lang['login']['username'] = 'Gebruikersnaam';
$lang['login']['password'] = 'Wachtwoord';
$lang['login']['login'] = 'Aanmelden';
$lang['login']['delayed'] = 'Aanmelding werd vertraagd met %s seconden.';
$lang['tfa']['tfa'] = "Tweefactorauthenticatie";
$lang['tfa']['set_tfa'] = "Kies tweefactorauthenticatie-methode";
$lang['tfa']['yubi_otp'] = "Yubico OTP";
$lang['tfa']['key_id'] = "Geef deze YubiKey een naam";
$lang['tfa']['init_u2f'] = "Even geduld aub...";
$lang['tfa']['start_u2f_validation'] = "Start validatie";
$lang['tfa']['reload_retry'] = "- (herlaad de pagina als het probleem aanhoudt)";
$lang['tfa']['key_id_totp'] = "Geef deze key een naam";
$lang['tfa']['error_code'] = "Foutcode";
$lang['tfa']['api_register'] = 'Mailcow maakt gebruik van de Yubico Cloud API. Om dit te benutten heeft u een API-sleutel van Yubico nodig, deze kunt u <a href="https://upgrade.yubico.com/getapikey/" target="_blank">hier</a> opvragen';
$lang['tfa']['u2f'] = "U2F";
$lang['tfa']['none'] = "Deactiveer";
$lang['tfa']['delete_tfa'] = "Schakel tweefactorauthenticatie uit";
$lang['tfa']['disable_tfa'] = "Pauzeer tweefactorauthenticatie tot de eerstvolgende succesvolle login";
$lang['tfa']['confirm'] = "Bevestig";
$lang['tfa']['totp'] = "TOTP (Step Two, Authy, etc.)";
$lang['tfa']['select'] = "Selecteer...";
$lang['tfa']['waiting_usb_auth'] = "<i>In afwachting van USB-apparaat...</i><br><br>Druk nu op de knop van je U2F-apparaat.";
$lang['tfa']['waiting_usb_register'] = "<i>In afwachting van USB-apparaat...</i><br><br>Voer je wachtwoord hierboven in en bevestig de registratie van het U2F-apparaat door op de knop van het apparaat te drukken.";
$lang['tfa']['scan_qr_code'] = "Scan de volgende QR-code met je authenticatie-app:";
$lang['tfa']['enter_qr_code'] = "Voer deze code in als je apparaat geen QR-codes kan scannen:";
$lang['tfa']['confirm_totp_token'] = "Bevestig de wijzigingen door de, door je authenticatie-app gegenereerde code, in te voeren.";
$lang['admin']['rspamd-com_settings'] = '<a href="https://rspamd.com/doc/configuration/settings.html#settings-structure" target="_blank">Rspamd documentatie</a> - Een beschrijving voor deze instelling zal automatisch worden gegenereerd, bekijk de onderstaande presets voor meer info.';
$lang['admin']['no_new_rows'] = 'Er zijn geen extra rijen beschikbaar';
$lang['admin']['queue_manager'] = 'Wachtrijbeheerder';
$lang['admin']['additional_rows'] = ' extra rijen zijn toegevoegd'; // parses to 'n additional rows were added'
$lang['admin']['private_key'] = 'Privésleutel';
$lang['admin']['import'] = 'Importeer';
$lang['admin']['duplicate'] = 'Dupliceer';
$lang['admin']['import_private_key'] = 'Importeer privésleutel';
$lang['admin']['duplicate_dkim'] = 'Dupliceer DKIM-sleutel';
$lang['admin']['dkim_from'] = 'Van';
$lang['admin']['dkim_to'] = 'Naar';
$lang['admin']['dkim_from_title'] = 'Kopieer data van domein';
$lang['admin']['dkim_to_title'] = 'Doeldomein(en) - worden overgeschreven';
$lang['admin']['f2b_parameters'] = 'Fail2ban-instellingen';
$lang['admin']['f2b_ban_time'] = 'Verbanningstijd (s)';
$lang['admin']['f2b_max_attempts'] = 'Maximaal aantal pogingen';
$lang['admin']['f2b_retry_window'] = 'Tijdsbestek voor maximale pogingen (s)';
$lang['admin']['f2b_netban_ipv4'] = 'Voer de IPv4-subnetgrootte in waar de verbanning van kracht moet zijn (8-32)';
$lang['admin']['f2b_netban_ipv6'] = 'Voer de IPv6-subnetgrootte in waar de verbanning van kracht moet zijn (8-128)';
$lang['admin']['f2b_whitelist'] = 'Netwerken/hosts op de witte lijst';
$lang['admin']['f2b_blacklist'] = 'Netwerken/hosts op de zwarte lijst';
$lang['admin']['f2b_list_info'] = 'Een host of netwerk op de zwarte lijst gaat altijd boven eenzelfde op de witte lijst <b>Het doorvoeren van wijzigingen kan enkele seconden in beslag nemen.</b>';
$lang['admin']['search_domain_da'] = 'Zoek domeinen';
$lang['admin']['r_inactive'] = 'Inactieve beperkingen';
$lang['admin']['r_active'] = 'Actieve beperkingen';
$lang['admin']['r_info'] = 'Grijze elementen op de lijst van actieve beperkingen zijn niet geldig en kunnen niet worden verplaatst. Onbekende beperkingen zullen hoe dan ook in volgorde van weergave worden ingesteld. <br>Er kunnen nieuwe elementen worden toegevoegd in <code>inc/vars.local.inc.php</code> om ze te kunnen gebruiken.';
$lang['admin']['dkim_key_length'] = 'DKIM-sleutelgrootte (bits)';
$lang['admin']['dkim_key_valid'] = 'Sleutel geldig';
$lang['admin']['dkim_key_unused'] = 'Sleutel ongebruikt';
$lang['admin']['dkim_key_missing'] = 'Sleutel ontbreekt';
$lang['admin']['dkim_add_key'] = 'Voeg DKIM-sleutel toe';
$lang['admin']['dkim_keys'] = 'DKIM-sleutels';
$lang['admin']['dkim_private_key'] = 'Privésleutel';
$lang['admin']['dkim_domains_wo_keys'] = "Selecteer domeinen met ontbrekende sleutels";
$lang['admin']['dkim_domains_selector'] = "Noemer";
$lang['admin']['add'] = 'Toevoegen';
$lang['add']['add_domain_restart'] = 'Voeg domein toe en herstart SOGo';
$lang['add']['add_domain_only'] = 'Voeg enkel domein toe';
$lang['admin']['configuration'] = 'Instellingen';
$lang['admin']['password'] = 'Wachtwoord';
$lang['admin']['password_repeat'] = 'Herhaal wachtwoord';
$lang['admin']['active'] = 'Actief';
$lang['admin']['inactive'] = 'Inactief';
$lang['admin']['action'] = 'Handeling';
$lang['admin']['add_domain_admin'] = 'Voeg domeinbeheerder toe';
$lang['admin']['add_admin'] = 'Voeg administrator toe';
$lang['admin']['add_settings_rule'] = 'Voeg regel toe';
$lang['admin']['rsetting_desc'] = 'Korte beschrijving';
$lang['admin']['rsetting_content'] = 'Regelinhoud';
$lang['admin']['rsetting_none'] = 'Geen regels beschikbaar';
$lang['admin']['rsetting_no_selection'] = 'Selecteer een regel';
$lang['admin']['rsettings_preset_1'] = 'Schakel alles uit voor geauthenticeerde gebruikers, behalve DKIM en ratelimiting';
$lang['admin']['rsettings_preset_2'] = 'Postmeesters willen spam';
$lang['admin']['rsettings_insert_preset'] = 'Voeg voorbeeld "%s" in';
$lang['admin']['rsetting_add_rule'] = 'Voeg regel toe';
$lang['admin']['queue_ays'] = 'Bevestig het verwijderen van alle onderdelen uit de wachtrij.';
$lang['admin']['arrival_time'] = 'Aankomsttijd';
$lang['admin']['message_size'] = 'Berichtgrootte';
$lang['admin']['sender'] = 'Afzender';
$lang['admin']['recipients'] = 'Ontvangers';
$lang['admin']['admin_domains'] = 'Domeintoewijzingen';
$lang['admin']['domain_admins'] = 'Domeinbeheerders';
$lang['admin']['flush_queue'] = 'Leeg wachtrij';
$lang['admin']['delete_queue'] = 'Verwijder alles';
$lang['admin']['queue_deliver_mail'] = 'Lever af';
$lang['admin']['queue_hold_mail'] = 'Houd vast';
$lang['admin']['queue_unhold_mail'] = 'Geef vrij';
$lang['admin']['username'] = 'Gebruikersnaam';
$lang['admin']['edit'] = 'Wijzig';
$lang['admin']['remove'] = 'Verwijder';
$lang['admin']['save'] = 'Sla wijzigingen op';
$lang['admin']['admin'] = 'Administrator';
$lang['admin']['admin_details'] = 'Toegangsinstellingen';
$lang['admin']['unchanged_if_empty'] = 'Laat leeg wanneer onveranderd';
$lang['admin']['access'] = 'Toegang';
$lang['admin']['no_record'] = 'Geen vermelding';
$lang['admin']['filter_table'] = 'Filtertabel';
$lang['admin']['empty'] = 'Geen resultaten';
$lang['admin']['time'] = 'Tijd';
$lang['admin']['last_applied'] = 'Voor het laatst toegepast';
$lang['admin']['reset_limit'] = 'Verwijder hash';
$lang['admin']['hash_remove_info'] = 'Het verwijderen van een ratelimit-hash, indien nog aanwezig, zal zijn teller volledig herstellen.<br>Elke hash wordt aangeduid met een aparte kleur.';
$lang['warning']['hash_not_found'] = 'Hash niet gevonden of reeds verwijderd';
$lang['success']['hash_deleted'] = 'Hash verwijderd';
$lang['admin']['authed_user'] = 'Geauthenticeerde gebruiker';
$lang['admin']['priority'] = 'Prioriteit';
$lang['admin']['message'] = 'Bericht';
$lang['admin']['rate_name'] = 'Rate-naam';
$lang['admin']['refresh'] = 'Ververs';
$lang['admin']['to_top'] = 'Naar boven';
$lang['admin']['in_use_by'] = 'In gebruik door';
$lang['admin']['forwarding_hosts'] = 'Doorstuurhosts';
$lang['admin']['forwarding_hosts_hint'] = 'Inkomende berichten worden onvoorwaardelijk geaccepteerd vanaf iedere host hieronder vermeld. Deze hosts worden hierdoor niet gecontroleerd op DNSBLs, en zullen de greylisting omzeilen. Spam wordt daarentegen zoals gebruikelijk in de spamfolder geplaatst. Dit wordt vaak gebruikt om mailservers te specificeren die mails doorsturen naar deze Mailcow-server.';
$lang['admin']['forwarding_hosts_add_hint'] = 'Het is mogelijk om IPv4- of IPv6-adressen, netwerken in CIDR-notatie, hostnames (worden omgezet naar IP-adressen) of domeinnamen (worden tevens omgezet naar IP-adressen of, bij gebrek daaraan, MX-records) op te geven.';
$lang['admin']['relayhosts_hint'] = 'Stel afzender-afhankelijke transportkaarten in om deze te kunnen gebruiken bij de configuratie van een domein.<br>De transportservice is altijd "smtp:". Er wordt rekening gehouden met het uitgaande versleutelingsbeleid van individuele gebruikers.<br>Beïnvloedt geselecteerde domeinen, inclusief bijbehorende aliasdomeinen.';
$lang['admin']['transports_hint'] = '→ Een transportkaart wordt boven een afzender-afhankelijke transportkaart verkozen.<br>
→ Het uitgaande versleutelingsbeleid van individuele gebruikers wordt genegeerd en kan enkel worden gehandhaafd doormiddel van globaal versleutelingsbeleid.<br>
→ De transportservice is altijd "smtp:".<br>
→ Adressen overeenkomend met "/localhost$/" zullen altijd via "local:" getransporteerd worden, hierdoor zullen "*"-bestemmingen niet van toepassing zijn op deze adressen.<br>
→ Om de inloggegevens van een (voorbeeld) nexthop "[host]:25" te bepalen, zoekt Postfix <b>altijd</b> naar "nexthop" voodat er wordt gekeken naar "[nexthop]:25". Dit maakt het onmogelijk om "nexthop" en "[nexthop]:25" tegelijkertijd te gebruiken.';
$lang['admin']['add_relayhost_hint'] = 'Wees ervan bewust dat de authenticatiedata onversleuteld wordt opgeslagen!';
$lang['admin']['add_transports_hint'] = 'Wees ervan bewust dat de authenticatiedata onversleuteld wordt opgeslagen!';
$lang['admin']['host'] = 'Host';
$lang['admin']['source'] = 'Bron';
$lang['admin']['add_forwarding_host'] = 'Voeg doorstuurhost toe';
$lang['admin']['add_relayhost'] = 'Voeg afzender-afhankelijke transportkaart toe';
$lang['admin']['add_transport'] = 'Voeg transportkaart toe';
$lang['admin']['relayhosts'] = 'Afzender-afhankelijke transportkaarten';
$lang['admin']['transport_maps'] = 'Transportkaarten';
$lang['admin']['routing'] = 'Routing';
$lang['admin']['credentials_transport_warning'] = '<b>Waarschuwing</b>: Bij het toevoegen van een nieuwe transportkaart zullen de inloggegevens voor alle items met een overeenkomende nexthop-kolom worden overgeschreven.';
$lang['admin']['destination'] = 'Bestemming';
$lang['admin']['nexthop'] = 'Nexthop';
$lang['success']['forwarding_host_removed'] = "Doorstuurhost %s is verwijderd";
$lang['success']['forwarding_host_added'] = "Doorstuurhost %s is toegevoegd";
$lang['success']['relayhost_removed'] = "Invoer %s is verwijderd";
$lang['success']['relayhost_added'] = "Invoer %s is toegevoegd";
$lang['diagnostics']['dns_records'] = 'DNS-vermeldingen';
$lang['diagnostics']['dns_records_24hours'] = 'Houd er rekening mee dat veranderingen aan DNS tot wel 24 uur in beslag kunnen nemen voordat ze op deze pagina worden weergegeven. Deze informatie is bedoeld om gemakkelijk in te zien of de DNS-vermeldingen correct zijn geconfigureerd.';
$lang['diagnostics']['dns_records_name'] = 'Naam';
$lang['diagnostics']['dns_records_type'] = 'Type';
$lang['diagnostics']['dns_records_data'] = 'Correcte gegevens';
$lang['diagnostics']['dns_records_status'] = 'Huidige staat';
$lang['diagnostics']['optional'] = 'Deze vermelding is optioneel.';
$lang['diagnostics']['cname_from_a'] = 'Waarde afgeleid van een A- of AAAA-vermelding.';
$lang['admin']['relay_from'] = '"Van:" adres';
$lang['admin']['relay_run'] = "Voer test uit";
$lang['admin']['api_allow_from'] = "Sta API-toegang toe vanaf deze IP-adressen";
$lang['admin']['api_key'] = "API-sleutel";
$lang['admin']['activate_api'] = "Activeer API";
$lang['admin']['regen_api_key'] = "Vernieuw API-sleutel";
$lang['admin']['ban_list_info'] = "Bekijk de lijst met verbannen IP-adressen hieronder: <b>netwerk (resterende tijd) - [acties]</b>.<br />Rode labels geven een permanente verbanning aan.<br />Het kan enkele seconden duren voordat wijzigingen hieronder zichtbaar zijn.";
$lang['admin']['unban_pending'] = "bezig met toestaan";
$lang['admin']['queue_unban'] = "markeer om toe te staan";
$lang['admin']['no_active_bans'] = "Geen actieve verbanningen";
$lang['admin']['quarantine'] = "Quarantaine";
$lang['admin']['rspamd_settings_map'] = "Rspamd-instellingen";
$lang['admin']['quota_notifications'] = "Quotum-notificaties";
$lang['admin']['quota_notifications_vars'] = "{{percent}} toont het huidige quotum van van de gebruiker<br>{{username}} staat voor de naam van het desbetreffende postvak";
$lang['admin']['active_rspamd_settings_map'] = "Huidige instellingen";
$lang['admin']['quota_notifications_info'] = "Quotum-notificaties worden verstuurd naar gebruikers wanneer deze 80% of 95% van hun opslagcapaciteit overschreden hebben.";
$lang['admin']['quarantine_retention_size'] = "Maximale retenties per postvak:<br><small>Gebruik 0 om deze functionaliteit <b>uit te schakelen</b>.</small>";
$lang['admin']['quarantine_max_size'] = "Maximale grootte in MiB (mail die de limiet overschrijdt zal worden verwijderd):<br><small>0 betekent <b>niet</b> onbeperkt!</small>";
$lang['admin']['quarantine_max_age'] = "Maximale leeftijd in dagen<br><small>Dit kan niet minder zijn dan 1 dag.</small>";
$lang['admin']['quarantine_exclude_domains'] = "Sluit de volgende domeinen en aliasdomeinen uit";
$lang['admin']['quarantine_release_format'] = "Verstuur vrijgegeven items als";
$lang['admin']['quarantine_release_format_raw'] = "Origineel";
$lang['admin']['quarantine_release_format_att'] = "Bijlage";
$lang['admin']['quarantine_notification_sender'] = "Afzender van notificaties";
$lang['admin']['quarantine_notification_subject'] = "Onderwerp van notificaties";
$lang['admin']['quarantine_notification_html'] = "Notificatiesjabloon:<br><small>Laat leeg om de standaardsjabloon te herstellen.</small>";
$lang['admin']['quota_notification_sender'] = "Afzender van notificaties";
$lang['admin']['quota_notification_subject'] = "Onderwerp van notificaties";
$lang['admin']['quota_notification_html'] = "Notificatiesjabloon:<br><small>Laat leeg om de standaardsjabloon te herstellen.</small>";
$lang['admin']['ui_texts'] = "Labels en teksten";
$lang['admin']['help_text'] = "Hulpteksten onder inlogvenster (HTML toegestaan)";
$lang['admin']['title_name'] = '"Mailcow" (website-titel)';
$lang['admin']['main_name'] = '"Mailcow"';
$lang['admin']['apps_name'] = '"Mailcow-apps"';
$lang['admin']['ui_footer'] = 'Footer-vermelding (HTML toegestaan)';
$lang['admin']['customize'] = "Uiterlijk";
$lang['admin']['change_logo'] = "Logo";
$lang['admin']['logo_info'] = "De afbeelding zal worden geschaald naar een hoogte van 40px voor de navigatiebar, en naar een breedte van 250px voor de startpagina.";
$lang['admin']['upload'] = "Upload";
$lang['admin']['app_links'] = "Applicatielinks";
$lang['admin']['app_name'] = "Naam";
$lang['admin']['link'] = "Link";
$lang['admin']['remove_row'] = "Verwijder rij";
$lang['admin']['add_row'] = "Voeg rij toe";
$lang['admin']['reset_default'] = "Herstel standaardinstellingen";
$lang['admin']['merged_vars_hint'] = 'Grijze rijen zijn samengevoegd van <code>vars.(local.)inc.php</code> en kunnen niet worden gewijzigd.';
$lang['mailbox']['waiting'] = "Wachten";
$lang['mailbox']['status'] = "Status";
$lang['mailbox']['running'] = "Wordt uitgevoerd";
$lang['mailbox']['enable_x'] = "Schakel in";
$lang['mailbox']['disable_x'] = "Schakel uit";
$lang['edit']['spam_score'] = "Stel een aangepaste spamscore in";
$lang['user']['spam_score_reset'] = "Herstel naar standaardwaarde";
$lang['edit']['spam_policy'] = "Voeg onderdelen toe, of verwijder onderdelen van de witte en zwarte lijst";
$lang['edit']['spam_alias'] = "Maak een nieuw tijdelijk alias aan, of pas deze aan";
$lang['danger']['comment_too_long'] = "Opmerkingen mogen niet langer dan 160 karakters zijn";
$lang['danger']['img_tmp_missing'] = "Kan afbeelding niet valideren, tijdelijk bestand niet gevonden";
$lang['danger']['img_invalid'] = "Kan afbeelding niet valideren";
$lang['danger']['invalid_mime_type'] = "Ongeldig mime-type";
$lang['success']['upload_success'] = "Bestand succesvol geupload";
$lang['success']['app_links'] = "Wijzigingen aan app links zijn opgeslagen";
$lang['success']['ui_texts'] = "Wijzigingen aan UI-labels zijn opgeslagen";
$lang['success']['reset_main_logo'] = "Het standaardlogo is hersteld";
$lang['success']['items_released'] = "Geselecteerde onderdelen zijn vrijgegeven";
$lang['success']['item_released'] = "Onderdeel %s vrijgegeven";
$lang['danger']['imagick_exception'] = "Error: Er is een probleem opgetreden met Imagick tijdens het lezen van de afbeelding";
$lang['quarantine']['quarantine'] = "Quarantaine";
$lang['quarantine']['learn_spam_delete'] = "Onthoud als spam en verwijder";
$lang['quarantine']['qinfo'] = 'Het quarantainesysteem slaat geweigerde e-mail op, terwijl het voor de afzender lijkt alsof deze <em>niet</em> ontvangen is.<br>"' . $lang['quarantine']['learn_spam_delete'] . '" traint het systeem om soortgelijke e-mails in de toekomst weer als spam te markeren.<br>Wees er van bewust dat wanneer er meerdere berichten worden onderzocht, dit mogelijk enige tijd kan duren.';
$lang['quarantine']['release'] = "Geef vrij";
$lang['quarantine']['empty'] = 'Geen resultaten';
$lang['quarantine']['toggle_all'] = 'Selecteer alles';
$lang['quarantine']['quick_actions'] = 'Handelingen';
$lang['quarantine']['remove'] = 'Verwijder';
$lang['quarantine']['received'] = "Ontvangen";
$lang['quarantine']['action'] = "Handeling";
$lang['quarantine']['rcpt'] = "Ontvanger";
$lang['quarantine']['qid'] = "Rspamd QID";
$lang['quarantine']['sender'] = "Afzender";
$lang['quarantine']['show_item'] = "Toon item";
$lang['quarantine']['check_hash'] = "Zoek bestandshash op in VT";
$lang['quarantine']['qitem'] = "Quarantaine-item";
$lang['quarantine']['subj'] = "Onderwerp";
$lang['quarantine']['recipients'] = "Ontvangers";
$lang['quarantine']['text_plain_content'] = "Inhoud (tekst)";
$lang['quarantine']['text_from_html_content'] = "Inhoud (geconverteerde html)";
$lang['quarantine']['atts'] = "Bijlagen";
$lang['quarantine']['low_danger'] = "Laag risico";
$lang['quarantine']['neutral_danger'] = "Neutraal/geen beoordeling";
$lang['quarantine']['medium_danger'] = "Middelmatig risico";
$lang['quarantine']['high_danger'] = "Hoog risico";
$lang['quarantine']['danger'] = "Risico";
$lang['quarantine']['spam_score'] = "Score";
$lang['quarantine']['confirm_delete'] = "Bevestig de verwijdering van dit item.";
$lang['quarantine']['qhandler_success'] = "Verzoek met succes verzonden naar het systeem. Je kunt het venster nu veilig sluiten.";
$lang['warning']['fuzzy_learn_error'] = "Fuzzy hash training-fout: %s";
$lang['danger']['spam_learn_error'] = "Spamtraining-fout: %s";
$lang['success']['qlearn_spam'] = "Bericht %s werd als spam gemarkeerd en is verwijderd";
$lang['debug']['system_containers'] = 'Systeem & containers';
$lang['debug']['started_on'] = 'Gestart op';
$lang['debug']['jvm_memory_solr'] = 'JVM-geheugengebruik';
$lang['debug']['solr_status'] = 'Status van Solr';
$lang['debug']['solr_dead'] = 'Solr is uitgeschakeld, uitgevallen of nog bezig met opstarten.';
$lang['debug']['logs'] = 'Logs';
$lang['debug']['log_info'] = '<p>Mailcows <b>geheugenlogs</b> worden elke minuut afgesneden naar maximaal %d regels om de stabiliteit te garanderen.<br>Geheugenlogs zijn niet bedoeld om opgeslagen te worden. Alle applicaties die geheugenlogs verzamelen, worden ook naar het Docker-proces gelogd.<br>De geheugenlogs kunnen gebruikt worden voor het oplossen van kleine problemen met specifieke containers.</p><p><b>Externe logs</b> worden verzameld doormiddel van de API van deze applicaties.</p><p><b>Statische logs</b> zijn activiteitenlogs. Deze worden niet naar het Docker-proces gestuurd.</p>';
$lang['debug']['in_memory_logs'] = 'Geheugenlogs';
$lang['debug']['external_logs'] = 'Externe logs';
$lang['debug']['static_logs'] = 'Statische logs';
$lang['debug']['solr_uptime'] = 'Uptime';
$lang['debug']['solr_started_at'] = 'Opgestart op';
$lang['debug']['solr_last_modified'] = 'Voor het laatst bijgewerkt op';
$lang['debug']['solr_size'] = 'Grootte';
$lang['debug']['solr_docs'] = 'Documenten';
$lang['debug']['disk_usage'] = 'Schijfgebruik';
$lang['debug']['containers_info'] = "Containerinformatie";
$lang['debug']['restart_container'] = 'Herstart';
$lang['quarantine']['release_body'] = "We hebben het oorspronkelijke bericht als los bestand meegestuurd. Klik erop om deze weer te geven.";
$lang['danger']['release_send_failed'] = "Het volgende bericht kon niet worden vrijgegeven: %s";
$lang['quarantine']['release_subject'] = "Mogelijk schadelijk quarantaine-item %s";
$lang['mailbox']['bcc_map'] = "BCC-kaart";
$lang['mailbox']['bcc_map_type'] = "BCC-type";
$lang['mailbox']['bcc_type'] = "BCC-type";
$lang['mailbox']['bcc_sender_map'] = "Afzenderkaarten";
$lang['mailbox']['bcc_rcpt_map'] = "Ontvangerkaarten";
$lang['mailbox']['bcc_local_dest'] = "Lokale bestemming";
$lang['mailbox']['bcc_destinations'] = "BCC-bestemmingen";
$lang['mailbox']['bcc_destination'] = "BCC-bestemming";
$lang['edit']['bcc_dest_format'] = 'Een BCC-bestemming dient één geldig e-mailadres te zijn.';
$lang['mailbox']['bcc'] = "BCC";
$lang['mailbox']['bcc_maps'] = "BCC-kaarten";
$lang['mailbox']['bcc_to_sender'] = "Schakel over naar afzenderkaarten";
$lang['mailbox']['bcc_to_rcpt'] = "Schakel over naar ontvangerkaarten";
$lang['mailbox']['add_bcc_entry'] = "Voeg BCC-kaart toe";
$lang['mailbox']['add_tls_policy_map'] = "Voeg versleutelingsbeleid toe";
$lang['mailbox']['bcc_info'] = "BCC-kaarten worden gebruikt om kopieën van alle berichten naar een ander adres door te sturen.<br>Wees er van bewust dat er geen melding wordt gedaan van een mislukte aflevering.";
$lang['mailbox']['address_rewriting'] = 'Adresomleidingen';
$lang['mailbox']['recipient_maps'] = 'Ontvangerkaarten';
$lang['mailbox']['recipient_map'] = 'Ontvangerkaart';
$lang['mailbox']['recipient_map_info'] = 'Ontvangerkaarten worden gebruikt om het doeladres van een bericht te vervangen voordat het in een postvak terecht komt.';
$lang['mailbox']['recipient_map_old_info'] = 'De oorspronkelijke bestemming van een ontvangerkaart dient een geldig e-mailadres of domeinnaam te zijn.';
$lang['mailbox']['recipient_map_new_info'] = 'De bestemming van een ontvangerkaart dient een geldig e-mailadres te zijn.';
$lang['mailbox']['recipient_map_old'] = 'Oorspronkelijke ontvanger';
$lang['mailbox']['recipient_map_new'] = 'Nieuwe ontvanger';
$lang['danger']['invalid_recipient_map_new'] = 'Ongeldige nieuwe ontvanger ingevoerd: %s';
$lang['danger']['invalid_recipient_map_old'] = 'Ongeldige oorspronkelijke ontvanger ingevoerd: %s';
$lang['danger']['recipient_map_entry_exists'] = 'Ontvangerkaart met "%s" bestaat reeds';
$lang['success']['recipient_map_entry_saved'] = 'Ontvangerkaart %s is opgeslagen';
$lang['success']['recipient_map_entry_deleted'] = 'Ontvangerkaart %s is verwijderd';
$lang['danger']['tls_policy_map_entry_exists'] = 'Versleutelingsbeleid met "%s" bestaat reeds';
$lang['success']['tls_policy_map_entry_saved'] = 'Versleutelingsbeleid "%s" is opgeslagen';
$lang['success']['tls_policy_map_entry_deleted'] = 'Versleutelingsbeleid %s is verwijderd';
$lang['mailbox']['add_recipient_map_entry'] = 'Voeg ontvangerkaart toe';
$lang['danger']['tls_policy_map_parameter_invalid'] = "Beleidsparameter is ongeldig";
$lang['danger']['temp_error'] = "Tijdelijke fout";
$lang['oauth2']['scope_ask_permission'] = 'Een applicatie heeft toegang tot de volgende onderdelen gevraagd';
$lang['oauth2']['profile'] = 'Profiel';
$lang['oauth2']['profile_desc'] = 'Persoonlijke informatie: gebruikersnaam, volledige naam, aanmaakdatum, bewerkdatum, activiteit';
$lang['oauth2']['permit'] = 'Authoriseer applicatie';
$lang['oauth2']['authorize_app'] = 'Authoriseer applicatie';
$lang['oauth2']['deny'] = 'Weiger';
$lang['oauth2']['access_denied'] = 'Log in als een postvakeigenaar om OAuth-toegang te verlenen';
$lang['admin']['sys_mails'] = 'Systeemmails';
$lang['admin']['subject'] = 'Onderwerp';
$lang['admin']['from'] = 'Afzender';
$lang['admin']['include_exclude'] = 'Ontvangers';
$lang['admin']['include_exclude_info'] = 'Zonder selectie worden <b>alle postvakken</b> benaderd!';
$lang['admin']['excludes'] = 'Exclusief';
$lang['admin']['includes'] = 'Inclusief';
$lang['admin']['text'] = 'Tekst';
$lang['admin']['activate_send'] = 'Bevestig bovenstaande gegevens';
$lang['admin']['send'] = 'Verstuur';
$lang['warning']['ip_invalid'] = 'Ongeldig IP overgeslagen: %s';
$lang['danger']['text_empty'] = 'De tekst dient ingevuld te worden';
$lang['danger']['subject_empty'] = 'Het onderwerp dient ingevuld te worden';
$lang['danger']['from_invalid'] = 'De afzender dient ingevuld te worden';
$lang['danger']['network_host_invalid'] = 'Ongeldig netwerk of host: %s';
$lang['add']['mailbox_quota_def'] = 'Standaard postvakquotum';
$lang['edit']['mailbox_quota_def'] = 'Standaard postvakquotum';
$lang['danger']['mailbox_defquota_exceeds_mailbox_maxquota'] = 'Standaardquotum overschrijdt de quotumlimiet';
$lang['danger']['defquota_empty'] = 'Standaardquotum per postvak dient geen 0 te zijn.';
$lang['mailbox']['mailbox_defquota'] = 'Standaard postvakgrootte';
$lang['admin']['api_info'] = 'De API is nog in ontwikkeling.';
$lang['admin']['guid_and_license'] = 'Licentie en identificatie';
$lang['admin']['guid'] = 'Identificatienummer - GUID';
$lang['admin']['license_info'] = 'Een licentie is niet verplicht, maar je steunt hiermee wel de ontwikkeling.<br><a href="https://www.servercow.de/mailcow?lang=nl#sal" target="_blank" alt="SAL order">Registreer je GUID hier</a>, of <a href="https://www.servercow.de/mailcow?lang=nl#support" target="_blank" alt="Support order">schaf ondersteuning aan voor deze installatie.</a>';
$lang['admin']['validate_license_now'] = 'Valideer licentie';
$lang['admin']['customer_id'] = 'Klantnummer';
$lang['admin']['service_id'] = 'Servicenummer';
$lang['admin']['lookup_mx'] = 'Match bestemming aan MX (gebruik .outlook.com om alle mail gericht aan MX *.outlook.com over deze hop te laten gaan)';
$lang['edit']['mbox_rl_info'] = 'Deze ratelimit wordt toegepast op de postvakgebruiker, en geldt voor elk "van"-adres gebruikt door de huidige postvakgebruiker. Een postvak-ratelimit gaat boven een domein-ratelimit.';
$lang['add']['relayhost_wrapped_tls_info'] = 'Gebruik <b>geen</b> in TLS-gewrapte poorten (meestal gebruikt op poort 465).<br>
Gebruik elke niet-gewrapte poort en initieer STARTTLS. Beleid om verleuteling te forceren kan worden ingesteld bij "Globaal versleutelingsbeleid".';
$lang['admin']['transport_dest_format'] = 'Voorbeeld: example.org, .example.org, *, postvak@example.org (meerdere waarden zijn kommagescheiden)';
$lang['mailbox']['alias_domain_backupmx'] = 'Aliasdomein inactief voor doorstuurdomein';
$lang['danger']['extra_acl_invalid'] = 'Extern verzendadres "%s" is ongeldig';
$lang['danger']['extra_acl_invalid_domain'] = 'Extern verzendadres "%s" gebruikt een ongeldig domein';
diff --git a/data/web/output.html b/data/web/output.html
new file mode 100644
index 00000000..e8a042bf
--- /dev/null
+++ b/data/web/output.html
@@ -0,0 +1,17516 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <title>API</title>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.5/css/bulma.min.css" integrity="sha256-vK3UTo/8wHbaUn+dTQD0X6dzidqc5l7gczvH+Bnowwk=" crossorigin="anonymous" />
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.9.0/css/fontawesome.min.css" integrity="sha256-AaQqnjfGDRZd/lUp0Dvy7URGOyRsh8g9JdWUkyYxNfI=" crossorigin="anonymous" />
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.9.0/css/solid.min.css" integrity="sha256-3FfMfpeajSEpxWZTFowWZPTv7k3GEu7w4rQv49EWsEY=" crossorigin="anonymous" />
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prism-themes@1.1.0/themes/prism-a11y-dark.css" integrity="sha256-d2qy226pP+oHAtEQPujaiXPslYW1Rmtla3Ivu1fFYxU=" crossorigin="anonymous">
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma-switch@2.0.0/dist/css/bulma-switch.min.css" integrity="sha256-jCV/cXwP13w0GNHLgFx6SFgTNAvJPvS5MIhuE30Ng08=" crossorigin="anonymous">
+
+ <style>
+ @media screen and (min-width: 768px) {
+ .navbar-burger {
+ display: none;
+ }
+ }
+ </style>
+ </head>
+ <body class="has-navbar-fixed-top">
+ <script>var main = (function () {
+ 'use strict';
+
+ function noop() { }
+ const identity = x => x;
+ function assign(tar, src) {
+ // @ts-ignore
+ for (const k in src)
+ tar[k] = src[k];
+ return tar;
+ }
+ function is_promise(value) {
+ return value && typeof value === 'object' && typeof value.then === 'function';
+ }
+ function add_location(element, file, line, column, char) {
+ element.__svelte_meta = {
+ loc: { file, line, column, char }
+ };
+ }
+ function run(fn) {
+ return fn();
+ }
+ function blank_object() {
+ return Object.create(null);
+ }
+ function run_all(fns) {
+ fns.forEach(run);
+ }
+ function is_function(thing) {
+ return typeof thing === 'function';
+ }
+ function safe_not_equal(a, b) {
+ return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');
+ }
+ function not_equal(a, b) {
+ return a != a ? b == b : a !== b;
+ }
+ function validate_store(store, name) {
+ if (!store || typeof store.subscribe !== 'function') {
+ throw new Error(`'${name}' is not a store with a 'subscribe' method`);
+ }
+ }
+ function subscribe(store, callback) {
+ const unsub = store.subscribe(callback);
+ return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;
+ }
+ function get_store_value(store) {
+ let value;
+ subscribe(store, _ => value = _)();
+ return value;
+ }
+ function component_subscribe(component, store, callback) {
+ component.$$.on_destroy.push(subscribe(store, callback));
+ }
+ function create_slot(definition, ctx, fn) {
+ if (definition) {
+ const slot_ctx = get_slot_context(definition, ctx, fn);
+ return definition[0](slot_ctx);
+ }
+ }
+ function get_slot_context(definition, ctx, fn) {
+ return definition[1]
+ ? assign({}, assign(ctx.$$scope.ctx, definition[1](fn ? fn(ctx) : {})))
+ : ctx.$$scope.ctx;
+ }
+ function get_slot_changes(definition, ctx, changed, fn) {
+ return definition[1]
+ ? assign({}, assign(ctx.$$scope.changed || {}, definition[1](fn ? fn(changed) : {})))
+ : ctx.$$scope.changed || {};
+ }
+ function exclude_internal_props(props) {
+ const result = {};
+ for (const k in props)
+ if (k[0] !== '$')
+ result[k] = props[k];
+ return result;
+ }
+ function once(fn) {
+ let ran = false;
+ return function (...args) {
+ if (ran)
+ return;
+ ran = true;
+ fn.call(this, ...args);
+ };
+ }
+ function null_to_empty(value) {
+ return value == null ? '' : value;
+ }
+ function set_store_value(store, ret, value = ret) {
+ store.set(value);
+ return ret;
+ }
+
+ const is_client = typeof window !== 'undefined';
+ let now = is_client
+ ? () => window.performance.now()
+ : () => Date.now();
+ let raf = is_client ? cb => requestAnimationFrame(cb) : noop;
+ // used internally for testing
+ function set_now(fn) {
+ now = fn;
+ }
+ function set_raf(fn) {
+ raf = fn;
+ }
+
+ const tasks = new Set();
+ let running = false;
+ function run_tasks() {
+ tasks.forEach(task => {
+ if (!task[0](now())) {
+ tasks.delete(task);
+ task[1]();
+ }
+ });
+ running = tasks.size > 0;
+ if (running)
+ raf(run_tasks);
+ }
+ function clear_loops() {
+ // for testing...
+ tasks.forEach(task => tasks.delete(task));
+ running = false;
+ }
+ function loop(fn) {
+ let task;
+ if (!running) {
+ running = true;
+ raf(run_tasks);
+ }
+ return {
+ promise: new Promise(fulfil => {
+ tasks.add(task = [fn, fulfil]);
+ }),
+ abort() {
+ tasks.delete(task);
+ }
+ };
+ }
+
+ function append(target, node) {
+ target.appendChild(node);
+ }
+ function insert(target, node, anchor) {
+ target.insertBefore(node, anchor || null);
+ }
+ function detach(node) {
+ node.parentNode.removeChild(node);
+ }
+ function destroy_each(iterations, detaching) {
+ for (let i = 0; i < iterations.length; i += 1) {
+ if (iterations[i])
+ iterations[i].d(detaching);
+ }
+ }
+ function element(name) {
+ return document.createElement(name);
+ }
+ function element_is(name, is) {
+ return document.createElement(name, { is });
+ }
+ function object_without_properties(obj, exclude) {
+ // eslint-disable-next-line @typescript-eslint/no-object-literal-type-assertion
+ const target = {};
+ for (const k in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, k)
+ // @ts-ignore
+ && exclude.indexOf(k) === -1) {
+ // @ts-ignore
+ target[k] = obj[k];
+ }
+ }
+ return target;
+ }
+ function svg_element(name) {
+ return document.createElementNS('http://www.w3.org/2000/svg', name);
+ }
+ function text(data) {
+ return document.createTextNode(data);
+ }
+ function space() {
+ return text(' ');
+ }
+ function empty() {
+ return text('');
+ }
+ function listen(node, event, handler, options) {
+ node.addEventListener(event, handler, options);
+ return () => node.removeEventListener(event, handler, options);
+ }
+ function prevent_default(fn) {
+ return function (event) {
+ event.preventDefault();
+ // @ts-ignore
+ return fn.call(this, event);
+ };
+ }
+ function stop_propagation(fn) {
+ return function (event) {
+ event.stopPropagation();
+ // @ts-ignore
+ return fn.call(this, event);
+ };
+ }
+ function self$1(fn) {
+ return function (event) {
+ // @ts-ignore
+ if (event.target === this)
+ fn.call(this, event);
+ };
+ }
+ function attr(node, attribute, value) {
+ if (value == null)
+ node.removeAttribute(attribute);
+ else
+ node.setAttribute(attribute, value);
+ }
+ function set_attributes(node, attributes) {
+ for (const key in attributes) {
+ if (key === 'style') {
+ node.style.cssText = attributes[key];
+ }
+ else if (key in node) {
+ node[key] = attributes[key];
+ }
+ else {
+ attr(node, key, attributes[key]);
+ }
+ }
+ }
+ function set_svg_attributes(node, attributes) {
+ for (const key in attributes) {
+ attr(node, key, attributes[key]);
+ }
+ }
+ function set_custom_element_data(node, prop, value) {
+ if (prop in node) {
+ node[prop] = value;
+ }
+ else {
+ attr(node, prop, value);
+ }
+ }
+ function xlink_attr(node, attribute, value) {
+ node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);
+ }
+ function get_binding_group_value(group) {
+ const value = [];
+ for (let i = 0; i < group.length; i += 1) {
+ if (group[i].checked)
+ value.push(group[i].__value);
+ }
+ return value;
+ }
+ function to_number(value) {
+ return value === '' ? undefined : +value;
+ }
+ function time_ranges_to_array(ranges) {
+ const array = [];
+ for (let i = 0; i < ranges.length; i += 1) {
+ array.push({ start: ranges.start(i), end: ranges.end(i) });
+ }
+ return array;
+ }
+ function children(element) {
+ return Array.from(element.childNodes);
+ }
+ function claim_element(nodes, name, attributes, svg) {
+ for (let i = 0; i < nodes.length; i += 1) {
+ const node = nodes[i];
+ if (node.nodeName === name) {
+ for (let j = 0; j < node.attributes.length; j += 1) {
+ const attribute = node.attributes[j];
+ if (!attributes[attribute.name])
+ node.removeAttribute(attribute.name);
+ }
+ return nodes.splice(i, 1)[0]; // TODO strip unwanted attributes
+ }
+ }
+ return svg ? svg_element(name) : element(name);
+ }
+ function claim_text(nodes, data) {
+ for (let i = 0; i < nodes.length; i += 1) {
+ const node = nodes[i];
+ if (node.nodeType === 3) {
+ node.data = '' + data;
+ return nodes.splice(i, 1)[0];
+ }
+ }
+ return text(data);
+ }
+ function claim_space(nodes) {
+ return claim_text(nodes, ' ');
+ }
+ function set_data(text, data) {
+ data = '' + data;
+ if (text.data !== data)
+ text.data = data;
+ }
+ function set_input_value(input, value) {
+ if (value != null || input.value) {
+ input.value = value;
+ }
+ }
+ function set_input_type(input, type) {
+ try {
+ input.type = type;
+ }
+ catch (e) {
+ // do nothing
+ }
+ }
+ function set_style(node, key, value, important) {
+ node.style.setProperty(key, value, important ? 'important' : '');
+ }
+ function select_option(select, value) {
+ for (let i = 0; i < select.options.length; i += 1) {
+ const option = select.options[i];
+ if (option.__value === value) {
+ option.selected = true;
+ return;
+ }
+ }
+ }
+ function select_options(select, value) {
+ for (let i = 0; i < select.options.length; i += 1) {
+ const option = select.options[i];
+ option.selected = ~value.indexOf(option.__value);
+ }
+ }
+ function select_value(select) {
+ const selected_option = select.querySelector(':checked') || select.options[0];
+ return selected_option && selected_option.__value;
+ }
+ function select_multiple_value(select) {
+ return [].map.call(select.querySelectorAll(':checked'), option => option.__value);
+ }
+ function add_resize_listener(element, fn) {
+ if (getComputedStyle(element).position === 'static') {
+ element.style.position = 'relative';
+ }
+ const object = document.createElement('object');
+ object.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; pointer-events: none; z-index: -1;');
+ object.type = 'text/html';
+ object.tabIndex = -1;
+ let win;
+ object.onload = () => {
+ win = object.contentDocument.defaultView;
+ win.addEventListener('resize', fn);
+ };
+ if (/Trident/.test(navigator.userAgent)) {
+ element.appendChild(object);
+ object.data = 'about:blank';
+ }
+ else {
+ object.data = 'about:blank';
+ element.appendChild(object);
+ }
+ return {
+ cancel: () => {
+ win && win.removeEventListener && win.removeEventListener('resize', fn);
+ element.removeChild(object);
+ }
+ };
+ }
+ function toggle_class(element, name, toggle) {
+ element.classList[toggle ? 'add' : 'remove'](name);
+ }
+ function custom_event(type, detail) {
+ const e = document.createEvent('CustomEvent');
+ e.initCustomEvent(type, false, false, detail);
+ return e;
+ }
+ class HtmlTag {
+ constructor(html, anchor = null) {
+ this.e = element('div');
+ this.a = anchor;
+ this.u(html);
+ }
+ m(target, anchor = null) {
+ for (let i = 0; i < this.n.length; i += 1) {
+ insert(target, this.n[i], anchor);
+ }
+ this.t = target;
+ }
+ u(html) {
+ this.e.innerHTML = html;
+ this.n = Array.from(this.e.childNodes);
+ }
+ p(html) {
+ this.d();
+ this.u(html);
+ this.m(this.t, this.a);
+ }
+ d() {
+ this.n.forEach(detach);
+ }
+ }
+
+ let stylesheet;
+ let active = 0;
+ let current_rules = {};
+ // https://github.com/darkskyapp/string-hash/blob/master/index.js
+ function hash(str) {
+ let hash = 5381;
+ let i = str.length;
+ while (i--)
+ hash = ((hash << 5) - hash) ^ str.charCodeAt(i);
+ return hash >>> 0;
+ }
+ function create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {
+ const step = 16.666 / duration;
+ let keyframes = '{\n';
+ for (let p = 0; p <= 1; p += step) {
+ const t = a + (b - a) * ease(p);
+ keyframes += p * 100 + `%{${fn(t, 1 - t)}}\n`;
+ }
+ const rule = keyframes + `100% {${fn(b, 1 - b)}}\n}`;
+ const name = `__svelte_${hash(rule)}_${uid}`;
+ if (!current_rules[name]) {
+ if (!stylesheet) {
+ const style = element('style');
+ document.head.appendChild(style);
+ stylesheet = style.sheet;
+ }
+ current_rules[name] = true;
+ stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);
+ }
+ const animation = node.style.animation || '';
+ node.style.animation = `${animation ? `${animation}, ` : ``}${name} ${duration}ms linear ${delay}ms 1 both`;
+ active += 1;
+ return name;
+ }
+ function delete_rule(node, name) {
+ node.style.animation = (node.style.animation || '')
+ .split(', ')
+ .filter(name
+ ? anim => anim.indexOf(name) < 0 // remove specific animation
+ : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations
+ )
+ .join(', ');
+ if (name && !--active)
+ clear_rules();
+ }
+ function clear_rules() {
+ raf(() => {
+ if (active)
+ return;
+ let i = stylesheet.cssRules.length;
+ while (i--)
+ stylesheet.deleteRule(i);
+ current_rules = {};
+ });
+ }
+
+ function create_animation(node, from, fn, params) {
+ if (!from)
+ return noop;
+ const to = node.getBoundingClientRect();
+ if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)
+ return noop;
+ const { delay = 0, duration = 300, easing = identity,
+ // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?
+ start: start_time = now() + delay,
+ // @ts-ignore todo:
+ end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);
+ let running = true;
+ let started = false;
+ let name;
+ function start() {
+ if (css) {
+ name = create_rule(node, 0, 1, duration, delay, easing, css);
+ }
+ if (!delay) {
+ started = true;
+ }
+ }
+ function stop() {
+ if (css)
+ delete_rule(node, name);
+ running = false;
+ }
+ loop(now => {
+ if (!started && now >= start_time) {
+ started = true;
+ }
+ if (started && now >= end) {
+ tick(1, 0);
+ stop();
+ }
+ if (!running) {
+ return false;
+ }
+ if (started) {
+ const p = now - start_time;
+ const t = 0 + 1 * easing(p / duration);
+ tick(t, 1 - t);
+ }
+ return true;
+ });
+ start();
+ tick(0, 1);
+ return stop;
+ }
+ function fix_position(node) {
+ const style = getComputedStyle(node);
+ if (style.position !== 'absolute' && style.position !== 'fixed') {
+ const { width, height } = style;
+ const a = node.getBoundingClientRect();
+ node.style.position = 'absolute';
+ node.style.width = width;
+ node.style.height = height;
+ add_transform(node, a);
+ }
+ }
+ function add_transform(node, a) {
+ const b = node.getBoundingClientRect();
+ if (a.left !== b.left || a.top !== b.top) {
+ const style = getComputedStyle(node);
+ const transform = style.transform === 'none' ? '' : style.transform;
+ node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;
+ }
+ }
+
+ let current_component;
+ function set_current_component(component) {
+ current_component = component;
+ }
+ function get_current_component() {
+ if (!current_component)
+ throw new Error(`Function called outside component initialization`);
+ return current_component;
+ }
+ function beforeUpdate(fn) {
+ get_current_component().$$.before_update.push(fn);
+ }
+ function onMount(fn) {
+ get_current_component().$$.on_mount.push(fn);
+ }
+ function afterUpdate(fn) {
+ get_current_component().$$.after_update.push(fn);
+ }
+ function onDestroy(fn) {
+ get_current_component().$$.on_destroy.push(fn);
+ }
+ function createEventDispatcher() {
+ const component = current_component;
+ return (type, detail) => {
+ const callbacks = component.$$.callbacks[type];
+ if (callbacks) {
+ // TODO are there situations where events could be dispatched
+ // in a server (non-DOM) environment?
+ const event = custom_event(type, detail);
+ callbacks.slice().forEach(fn => {
+ fn.call(component, event);
+ });
+ }
+ };
+ }
+ function setContext(key, context) {
+ get_current_component().$$.context.set(key, context);
+ }
+ function getContext(key) {
+ return get_current_component().$$.context.get(key);
+ }
+ // TODO figure out if we still want to support
+ // shorthand events, or if we want to implement
+ // a real bubbling mechanism
+ function bubble(component, event) {
+ const callbacks = component.$$.callbacks[event.type];
+ if (callbacks) {
+ callbacks.slice().forEach(fn => fn(event));
+ }
+ }
+
+ const dirty_components = [];
+ const intros = { enabled: false };
+ const binding_callbacks = [];
+ const render_callbacks = [];
+ const flush_callbacks = [];
+ const resolved_promise = Promise.resolve();
+ let update_scheduled = false;
+ function schedule_update() {
+ if (!update_scheduled) {
+ update_scheduled = true;
+ resolved_promise.then(flush);
+ }
+ }
+ function tick() {
+ schedule_update();
+ return resolved_promise;
+ }
+ function add_render_callback(fn) {
+ render_callbacks.push(fn);
+ }
+ function add_flush_callback(fn) {
+ flush_callbacks.push(fn);
+ }
+ function flush() {
+ const seen_callbacks = new Set();
+ do {
+ // first, call beforeUpdate functions
+ // and update components
+ while (dirty_components.length) {
+ const component = dirty_components.shift();
+ set_current_component(component);
+ update(component.$$);
+ }
+ while (binding_callbacks.length)
+ binding_callbacks.pop()();
+ // then, once components are updated, call
+ // afterUpdate functions. This may cause
+ // subsequent updates...
+ for (let i = 0; i < render_callbacks.length; i += 1) {
+ const callback = render_callbacks[i];
+ if (!seen_callbacks.has(callback)) {
+ callback();
+ // ...so guard against infinite loops
+ seen_callbacks.add(callback);
+ }
+ }
+ render_callbacks.length = 0;
+ } while (dirty_components.length);
+ while (flush_callbacks.length) {
+ flush_callbacks.pop()();
+ }
+ update_scheduled = false;
+ }
+ function update($$) {
+ if ($$.fragment) {
+ $$.update($$.dirty);
+ run_all($$.before_update);
+ $$.fragment.p($$.dirty, $$.ctx);
+ $$.dirty = null;
+ $$.after_update.forEach(add_render_callback);
+ }
+ }
+
+ let promise;
+ function wait() {
+ if (!promise) {
+ promise = Promise.resolve();
+ promise.then(() => {
+ promise = null;
+ });
+ }
+ return promise;
+ }
+ function dispatch(node, direction, kind) {
+ node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));
+ }
+ const outroing = new Set();
+ let outros;
+ function group_outros() {
+ outros = {
+ r: 0,
+ c: [],
+ p: outros // parent group
+ };
+ }
+ function check_outros() {
+ if (!outros.r) {
+ run_all(outros.c);
+ }
+ outros = outros.p;
+ }
+ function transition_in(block, local) {
+ if (block && block.i) {
+ outroing.delete(block);
+ block.i(local);
+ }
+ }
+ function transition_out(block, local, detach, callback) {
+ if (block && block.o) {
+ if (outroing.has(block))
+ return;
+ outroing.add(block);
+ outros.c.push(() => {
+ outroing.delete(block);
+ if (callback) {
+ if (detach)
+ block.d(1);
+ callback();
+ }
+ });
+ block.o(local);
+ }
+ }
+ const null_transition = { duration: 0 };
+ function create_in_transition(node, fn, params) {
+ let config = fn(node, params);
+ let running = false;
+ let animation_name;
+ let task;
+ let uid = 0;
+ function cleanup() {
+ if (animation_name)
+ delete_rule(node, animation_name);
+ }
+ function go() {
+ const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;
+ if (css)
+ animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);
+ tick(0, 1);
+ const start_time = now() + delay;
+ const end_time = start_time + duration;
+ if (task)
+ task.abort();
+ running = true;
+ add_render_callback(() => dispatch(node, true, 'start'));
+ task = loop(now => {
+ if (running) {
+ if (now >= end_time) {
+ tick(1, 0);
+ dispatch(node, true, 'end');
+ cleanup();
+ return running = false;
+ }
+ if (now >= start_time) {
+ const t = easing((now - start_time) / duration);
+ tick(t, 1 - t);
+ }
+ }
+ return running;
+ });
+ }
+ let started = false;
+ return {
+ start() {
+ if (started)
+ return;
+ delete_rule(node);
+ if (is_function(config)) {
+ config = config();
+ wait().then(go);
+ }
+ else {
+ go();
+ }
+ },
+ invalidate() {
+ started = false;
+ },
+ end() {
+ if (running) {
+ cleanup();
+ running = false;
+ }
+ }
+ };
+ }
+ function create_out_transition(node, fn, params) {
+ let config = fn(node, params);
+ let running = true;
+ let animation_name;
+ const group = outros;
+ group.r += 1;
+ function go() {
+ const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;
+ if (css)
+ animation_name = create_rule(node, 1, 0, duration, delay, easing, css);
+ const start_time = now() + delay;
+ const end_time = start_time + duration;
+ add_render_callback(() => dispatch(node, false, 'start'));
+ loop(now => {
+ if (running) {
+ if (now >= end_time) {
+ tick(0, 1);
+ dispatch(node, false, 'end');
+ if (!--group.r) {
+ // this will result in `end()` being called,
+ // so we don't need to clean up here
+ run_all(group.c);
+ }
+ return false;
+ }
+ if (now >= start_time) {
+ const t = easing((now - start_time) / duration);
+ tick(1 - t, t);
+ }
+ }
+ return running;
+ });
+ }
+ if (is_function(config)) {
+ wait().then(() => {
+ // @ts-ignore
+ config = config();
+ go();
+ });
+ }
+ else {
+ go();
+ }
+ return {
+ end(reset) {
+ if (reset && config.tick) {
+ config.tick(1, 0);
+ }
+ if (running) {
+ if (animation_name)
+ delete_rule(node, animation_name);
+ running = false;
+ }
+ }
+ };
+ }
+ function create_bidirectional_transition(node, fn, params, intro) {
+ let config = fn(node, params);
+ let t = intro ? 0 : 1;
+ let running_program = null;
+ let pending_program = null;
+ let animation_name = null;
+ function clear_animation() {
+ if (animation_name)
+ delete_rule(node, animation_name);
+ }
+ function init(program, duration) {
+ const d = program.b - t;
+ duration *= Math.abs(d);
+ return {
+ a: t,
+ b: program.b,
+ d,
+ duration,
+ start: program.start,
+ end: program.start + duration,
+ group: program.group
+ };
+ }
+ function go(b) {
+ const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;
+ const program = {
+ start: now() + delay,
+ b
+ };
+ if (!b) {
+ // @ts-ignore todo: improve typings
+ program.group = outros;
+ outros.r += 1;
+ }
+ if (running_program) {
+ pending_program = program;
+ }
+ else {
+ // if this is an intro, and there's a delay, we need to do
+ // an initial tick and/or apply CSS animation immediately
+ if (css) {
+ clear_animation();
+ animation_name = create_rule(node, t, b, duration, delay, easing, css);
+ }
+ if (b)
+ tick(0, 1);
+ running_program = init(program, duration);
+ add_render_callback(() => dispatch(node, b, 'start'));
+ loop(now => {
+ if (pending_program && now > pending_program.start) {
+ running_program = init(pending_program, duration);
+ pending_program = null;
+ dispatch(node, running_program.b, 'start');
+ if (css) {
+ clear_animation();
+ animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);
+ }
+ }
+ if (running_program) {
+ if (now >= running_program.end) {
+ tick(t = running_program.b, 1 - t);
+ dispatch(node, running_program.b, 'end');
+ if (!pending_program) {
+ // we're done
+ if (running_program.b) {
+ // intro — we can tidy up immediately
+ clear_animation();
+ }
+ else {
+ // outro — needs to be coordinated
+ if (!--running_program.group.r)
+ run_all(running_program.group.c);
+ }
+ }
+ running_program = null;
+ }
+ else if (now >= running_program.start) {
+ const p = now - running_program.start;
+ t = running_program.a + running_program.d * easing(p / running_program.duration);
+ tick(t, 1 - t);
+ }
+ }
+ return !!(running_program || pending_program);
+ });
+ }
+ }
+ return {
+ run(b) {
+ if (is_function(config)) {
+ wait().then(() => {
+ // @ts-ignore
+ config = config();
+ go(b);
+ });
+ }
+ else {
+ go(b);
+ }
+ },
+ end() {
+ clear_animation();
+ running_program = pending_program = null;
+ }
+ };
+ }
+
+ function handle_promise(promise, info) {
+ const token = info.token = {};
+ function update(type, index, key, value) {
+ if (info.token !== token)
+ return;
+ info.resolved = key && { [key]: value };
+ const child_ctx = assign(assign({}, info.ctx), info.resolved);
+ const block = type && (info.current = type)(child_ctx);
+ if (info.block) {
+ if (info.blocks) {
+ info.blocks.forEach((block, i) => {
+ if (i !== index && block) {
+ group_outros();
+ transition_out(block, 1, 1, () => {
+ info.blocks[i] = null;
+ });
+ check_outros();
+ }
+ });
+ }
+ else {
+ info.block.d(1);
+ }
+ block.c();
+ transition_in(block, 1);
+ block.m(info.mount(), info.anchor);
+ flush();
+ }
+ info.block = block;
+ if (info.blocks)
+ info.blocks[index] = block;
+ }
+ if (is_promise(promise)) {
+ const current_component = get_current_component();
+ promise.then(value => {
+ set_current_component(current_component);
+ update(info.then, 1, info.value, value);
+ set_current_component(null);
+ }, error => {
+ set_current_component(current_component);
+ update(info.catch, 2, info.error, error);
+ set_current_component(null);
+ });
+ // if we previously had a then/catch block, destroy it
+ if (info.current !== info.pending) {
+ update(info.pending, 0);
+ return true;
+ }
+ }
+ else {
+ if (info.current !== info.then) {
+ update(info.then, 1, info.value, promise);
+ return true;
+ }
+ info.resolved = { [info.value]: promise };
+ }
+ }
+
+ const globals = (typeof window !== 'undefined' ? window : global);
+
+ function destroy_block(block, lookup) {
+ block.d(1);
+ lookup.delete(block.key);
+ }
+ function outro_and_destroy_block(block, lookup) {
+ transition_out(block, 1, 1, () => {
+ lookup.delete(block.key);
+ });
+ }
+ function fix_and_destroy_block(block, lookup) {
+ block.f();
+ destroy_block(block, lookup);
+ }
+ function fix_and_outro_and_destroy_block(block, lookup) {
+ block.f();
+ outro_and_destroy_block(block, lookup);
+ }
+ function update_keyed_each(old_blocks, changed, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {
+ let o = old_blocks.length;
+ let n = list.length;
+ let i = o;
+ const old_indexes = {};
+ while (i--)
+ old_indexes[old_blocks[i].key] = i;
+ const new_blocks = [];
+ const new_lookup = new Map();
+ const deltas = new Map();
+ i = n;
+ while (i--) {
+ const child_ctx = get_context(ctx, list, i);
+ const key = get_key(child_ctx);
+ let block = lookup.get(key);
+ if (!block) {
+ block = create_each_block(key, child_ctx);
+ block.c();
+ }
+ else if (dynamic) {
+ block.p(changed, child_ctx);
+ }
+ new_lookup.set(key, new_blocks[i] = block);
+ if (key in old_indexes)
+ deltas.set(key, Math.abs(i - old_indexes[key]));
+ }
+ const will_move = new Set();
+ const did_move = new Set();
+ function insert(block) {
+ transition_in(block, 1);
+ block.m(node, next);
+ lookup.set(block.key, block);
+ next = block.first;
+ n--;
+ }
+ while (o && n) {
+ const new_block = new_blocks[n - 1];
+ const old_block = old_blocks[o - 1];
+ const new_key = new_block.key;
+ const old_key = old_block.key;
+ if (new_block === old_block) {
+ // do nothing
+ next = new_block.first;
+ o--;
+ n--;
+ }
+ else if (!new_lookup.has(old_key)) {
+ // remove old block
+ destroy(old_block, lookup);
+ o--;
+ }
+ else if (!lookup.has(new_key) || will_move.has(new_key)) {
+ insert(new_block);
+ }
+ else if (did_move.has(old_key)) {
+ o--;
+ }
+ else if (deltas.get(new_key) > deltas.get(old_key)) {
+ did_move.add(new_key);
+ insert(new_block);
+ }
+ else {
+ will_move.add(old_key);
+ o--;
+ }
+ }
+ while (o--) {
+ const old_block = old_blocks[o];
+ if (!new_lookup.has(old_block.key))
+ destroy(old_block, lookup);
+ }
+ while (n)
+ insert(new_blocks[n - 1]);
+ return new_blocks;
+ }
+ function measure(blocks) {
+ const rects = {};
+ let i = blocks.length;
+ while (i--)
+ rects[blocks[i].key] = blocks[i].node.getBoundingClientRect();
+ return rects;
+ }
+
+ function get_spread_update(levels, updates) {
+ const update = {};
+ const to_null_out = {};
+ const accounted_for = { $$scope: 1 };
+ let i = levels.length;
+ while (i--) {
+ const o = levels[i];
+ const n = updates[i];
+ if (n) {
+ for (const key in o) {
+ if (!(key in n))
+ to_null_out[key] = 1;
+ }
+ for (const key in n) {
+ if (!accounted_for[key]) {
+ update[key] = n[key];
+ accounted_for[key] = 1;
+ }
+ }
+ levels[i] = n;
+ }
+ else {
+ for (const key in o) {
+ accounted_for[key] = 1;
+ }
+ }
+ }
+ for (const key in to_null_out) {
+ if (!(key in update))
+ update[key] = undefined;
+ }
+ return update;
+ }
+ function get_spread_object(spread_props) {
+ return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};
+ }
+
+ const invalid_attribute_name_character = /[\s'">/=\u{FDD0}-\u{FDEF}\u{FFFE}\u{FFFF}\u{1FFFE}\u{1FFFF}\u{2FFFE}\u{2FFFF}\u{3FFFE}\u{3FFFF}\u{4FFFE}\u{4FFFF}\u{5FFFE}\u{5FFFF}\u{6FFFE}\u{6FFFF}\u{7FFFE}\u{7FFFF}\u{8FFFE}\u{8FFFF}\u{9FFFE}\u{9FFFF}\u{AFFFE}\u{AFFFF}\u{BFFFE}\u{BFFFF}\u{CFFFE}\u{CFFFF}\u{DFFFE}\u{DFFFF}\u{EFFFE}\u{EFFFF}\u{FFFFE}\u{FFFFF}\u{10FFFE}\u{10FFFF}]/u;
+ // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
+ // https://infra.spec.whatwg.org/#noncharacter
+ function spread(args) {
+ const attributes = Object.assign({}, ...args);
+ let str = '';
+ Object.keys(attributes).forEach(name => {
+ if (invalid_attribute_name_character.test(name))
+ return;
+ const value = attributes[name];
+ if (value === undefined)
+ return;
+ if (value === true)
+ str += " " + name;
+ const escaped = String(value)
+ .replace(/"/g, '&#34;')
+ .replace(/'/g, '&#39;');
+ str += " " + name + "=" + JSON.stringify(escaped);
+ });
+ return str;
+ }
+ const escaped = {
+ '"': '&quot;',
+ "'": '&#39;',
+ '&': '&amp;',
+ '<': '&lt;',
+ '>': '&gt;'
+ };
+ function escape$1(html) {
+ return String(html).replace(/["'&<>]/g, match => escaped[match]);
+ }
+ function each(items, fn) {
+ let str = '';
+ for (let i = 0; i < items.length; i += 1) {
+ str += fn(items[i], i);
+ }
+ return str;
+ }
+ const missing_component = {
+ $$render: () => ''
+ };
+ function validate_component(component, name) {
+ if (!component || !component.$$render) {
+ if (name === 'svelte:component')
+ name += ' this={...}';
+ throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules`);
+ }
+ return component;
+ }
+ function debug(file, line, column, values) {
+ console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console
+ console.log(values); // eslint-disable-line no-console
+ return '';
+ }
+ let on_destroy;
+ function create_ssr_component(fn) {
+ function $$render(result, props, bindings, slots) {
+ const parent_component = current_component;
+ const $$ = {
+ on_destroy,
+ context: new Map(parent_component ? parent_component.$$.context : []),
+ // these will be immediately discarded
+ on_mount: [],
+ before_update: [],
+ after_update: [],
+ callbacks: blank_object()
+ };
+ set_current_component({ $$ });
+ const html = fn(result, props, bindings, slots);
+ set_current_component(parent_component);
+ return html;
+ }
+ return {
+ render: (props = {}, options = {}) => {
+ on_destroy = [];
+ const result = { head: '', css: new Set() };
+ const html = $$render(result, props, {}, options);
+ run_all(on_destroy);
+ return {
+ html,
+ css: {
+ code: Array.from(result.css).map(css => css.code).join('\n'),
+ map: null // TODO
+ },
+ head: result.head
+ };
+ },
+ $$render
+ };
+ }
+ function add_attribute(name, value, boolean) {
+ if (value == null || (boolean && !value))
+ return '';
+ return ` ${name}${value === true ? '' : `=${typeof value === 'string' ? JSON.stringify(escape$1(value)) : `"${value}"`}`}`;
+ }
+ function add_classes(classes) {
+ return classes ? ` class="${classes}"` : ``;
+ }
+
+ function bind(component, name, callback) {
+ if (component.$$.props.indexOf(name) === -1)
+ return;
+ component.$$.bound[name] = callback;
+ callback(component.$$.ctx[name]);
+ }
+ function mount_component(component, target, anchor) {
+ const { fragment, on_mount, on_destroy, after_update } = component.$$;
+ fragment.m(target, anchor);
+ // onMount happens before the initial afterUpdate
+ add_render_callback(() => {
+ const new_on_destroy = on_mount.map(run).filter(is_function);
+ if (on_destroy) {
+ on_destroy.push(...new_on_destroy);
+ }
+ else {
+ // Edge case - component was destroyed immediately,
+ // most likely as a result of a binding initialising
+ run_all(new_on_destroy);
+ }
+ component.$$.on_mount = [];
+ });
+ after_update.forEach(add_render_callback);
+ }
+ function destroy_component(component, detaching) {
+ if (component.$$.fragment) {
+ run_all(component.$$.on_destroy);
+ component.$$.fragment.d(detaching);
+ // TODO null out other refs, including component.$$ (but need to
+ // preserve final state?)
+ component.$$.on_destroy = component.$$.fragment = null;
+ component.$$.ctx = {};
+ }
+ }
+ function make_dirty(component, key) {
+ if (!component.$$.dirty) {
+ dirty_components.push(component);
+ schedule_update();
+ component.$$.dirty = blank_object();
+ }
+ component.$$.dirty[key] = true;
+ }
+ function init(component, options, instance, create_fragment, not_equal, prop_names) {
+ const parent_component = current_component;
+ set_current_component(component);
+ const props = options.props || {};
+ const $$ = component.$$ = {
+ fragment: null,
+ ctx: null,
+ // state
+ props: prop_names,
+ update: noop,
+ not_equal,
+ bound: blank_object(),
+ // lifecycle
+ on_mount: [],
+ on_destroy: [],
+ before_update: [],
+ after_update: [],
+ context: new Map(parent_component ? parent_component.$$.context : []),
+ // everything else
+ callbacks: blank_object(),
+ dirty: null
+ };
+ let ready = false;
+ $$.ctx = instance
+ ? instance(component, props, (key, ret, value = ret) => {
+ if ($$.ctx && not_equal($$.ctx[key], $$.ctx[key] = value)) {
+ if ($$.bound[key])
+ $$.bound[key](value);
+ if (ready)
+ make_dirty(component, key);
+ }
+ return ret;
+ })
+ : props;
+ $$.update();
+ ready = true;
+ run_all($$.before_update);
+ $$.fragment = create_fragment($$.ctx);
+ if (options.target) {
+ if (options.hydrate) {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ $$.fragment.l(children(options.target));
+ }
+ else {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ $$.fragment.c();
+ }
+ if (options.intro)
+ transition_in(component.$$.fragment);
+ mount_component(component, options.target, options.anchor);
+ flush();
+ }
+ set_current_component(parent_component);
+ }
+ let SvelteElement;
+ if (typeof HTMLElement !== 'undefined') {
+ SvelteElement = class extends HTMLElement {
+ constructor() {
+ super();
+ this.attachShadow({ mode: 'open' });
+ }
+ connectedCallback() {
+ // @ts-ignore todo: improve typings
+ for (const key in this.$$.slotted) {
+ // @ts-ignore todo: improve typings
+ this.appendChild(this.$$.slotted[key]);
+ }
+ }
+ attributeChangedCallback(attr, _oldValue, newValue) {
+ this[attr] = newValue;
+ }
+ $destroy() {
+ destroy_component(this, 1);
+ this.$destroy = noop;
+ }
+ $on(type, callback) {
+ // TODO should this delegate to addEventListener?
+ const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));
+ callbacks.push(callback);
+ return () => {
+ const index = callbacks.indexOf(callback);
+ if (index !== -1)
+ callbacks.splice(index, 1);
+ };
+ }
+ $set() {
+ // overridden by instance, if it has props
+ }
+ };
+ }
+ class SvelteComponent {
+ $destroy() {
+ destroy_component(this, 1);
+ this.$destroy = noop;
+ }
+ $on(type, callback) {
+ const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));
+ callbacks.push(callback);
+ return () => {
+ const index = callbacks.indexOf(callback);
+ if (index !== -1)
+ callbacks.splice(index, 1);
+ };
+ }
+ $set() {
+ // overridden by instance, if it has props
+ }
+ }
+
+ function dispatch_dev(type, detail) {
+ document.dispatchEvent(custom_event(type, detail));
+ }
+ function append_dev(target, node) {
+ dispatch_dev("SvelteDOMInsert", { target, node });
+ append(target, node);
+ }
+ function insert_dev(target, node, anchor) {
+ dispatch_dev("SvelteDOMInsert", { target, node, anchor });
+ insert(target, node, anchor);
+ }
+ function detach_dev(node) {
+ dispatch_dev("SvelteDOMRemove", { node });
+ detach(node);
+ }
+ function detach_between_dev(before, after) {
+ while (before.nextSibling && before.nextSibling !== after) {
+ detach_dev(before.nextSibling);
+ }
+ }
+ function detach_before_dev(after) {
+ while (after.previousSibling) {
+ detach_dev(after.previousSibling);
+ }
+ }
+ function detach_after_dev(before) {
+ while (before.nextSibling) {
+ detach_dev(before.nextSibling);
+ }
+ }
+ function listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) {
+ const modifiers = options === true ? ["capture"] : options ? Array.from(Object.keys(options)) : [];
+ if (has_prevent_default)
+ modifiers.push('preventDefault');
+ if (has_stop_propagation)
+ modifiers.push('stopPropagation');
+ dispatch_dev("SvelteDOMAddEventListener", { node, event, handler, modifiers });
+ const dispose = listen(node, event, handler, options);
+ return () => {
+ dispatch_dev("SvelteDOMRemoveEventListener", { node, event, handler, modifiers });
+ dispose();
+ };
+ }
+ function attr_dev(node, attribute, value) {
+ attr(node, attribute, value);
+ if (value == null)
+ dispatch_dev("SvelteDOMRemoveAttribute", { node, attribute });
+ else
+ dispatch_dev("SvelteDOMSetAttribute", { node, attribute, value });
+ }
+ function prop_dev(node, property, value) {
+ node[property] = value;
+ dispatch_dev("SvelteDOMSetProperty", { node, property, value });
+ }
+ function dataset_dev(node, property, value) {
+ node.dataset[property] = value;
+ dispatch_dev("SvelteDOMSetDataset", { node, property, value });
+ }
+ function set_data_dev(text, data) {
+ data = '' + data;
+ if (text.data === data)
+ return;
+ dispatch_dev("SvelteDOMSetData", { node: text, data });
+ text.data = data;
+ }
+ class SvelteComponentDev extends SvelteComponent {
+ constructor(options) {
+ if (!options || (!options.target && !options.$$inline)) {
+ throw new Error(`'target' is a required option`);
+ }
+ super();
+ }
+ $destroy() {
+ super.$destroy();
+ this.$destroy = () => {
+ console.warn(`Component was already destroyed`); // eslint-disable-line no-console
+ };
+ }
+ }
+
+ 'use strict';
+
+ var has = Object.prototype.hasOwnProperty
+ , undef;
+
+ /**
+ * Decode a URI encoded string.
+ *
+ * @param {String} input The URI encoded string.
+ * @returns {String|Null} The decoded string.
+ * @api private
+ */
+ function decode(input) {
+ try {
+ return decodeURIComponent(input.replace(/\+/g, ' '));
+ } catch (e) {
+ return null;
+ }
+ }
+
+ /**
+ * Attempts to encode a given input.
+ *
+ * @param {String} input The string that needs to be encoded.
+ * @returns {String|Null} The encoded string.
+ * @api private
+ */
+ function encode(input) {
+ try {
+ return encodeURIComponent(input);
+ } catch (e) {
+ return null;
+ }
+ }
+
+ /**
+ * Simple query string parser.
+ *
+ * @param {String} query The query string that needs to be parsed.
+ * @returns {Object}
+ * @api public
+ */
+ function querystring(query) {
+ var parser = /([^=?&]+)=?([^&]*)/g
+ , result = {}
+ , part;
+
+ while (part = parser.exec(query)) {
+ var key = decode(part[1])
+ , value = decode(part[2]);
+
+ //
+ // Prevent overriding of existing properties. This ensures that build-in
+ // methods like `toString` or __proto__ are not overriden by malicious
+ // querystrings.
+ //
+ // In the case if failed decoding, we want to omit the key/value pairs
+ // from the result.
+ //
+ if (key === null || value === null || key in result) continue;
+ result[key] = value;
+ }
+
+ return result;
+ }
+
+ /**
+ * Transform a query string to an object.
+ *
+ * @param {Object} obj Object that should be transformed.
+ * @param {String} prefix Optional prefix.
+ * @returns {String}
+ * @api public
+ */
+ function querystringify(obj, prefix) {
+ prefix = prefix || '';
+
+ var pairs = []
+ , value
+ , key;
+
+ //
+ // Optionally prefix with a '?' if needed
+ //
+ if ('string' !== typeof prefix) prefix = '?';
+
+ for (key in obj) {
+ if (has.call(obj, key)) {
+ value = obj[key];
+
+ //
+ // Edge cases where we actually want to encode the value to an empty
+ // string instead of the stringified value.
+ //
+ if (!value && (value === null || value === undef || isNaN(value))) {
+ value = '';
+ }
+
+ key = encodeURIComponent(key);
+ value = encodeURIComponent(value);
+
+ //
+ // If we failed to encode the strings, we should bail out as we don't
+ // want to add invalid strings to the query.
+ //
+ if (key === null || value === null) continue;
+ pairs.push(key +'='+ value);
+ }
+ }
+
+ return pairs.length ? prefix + pairs.join('&') : '';
+ }
+
+ //
+ // Expose the module.
+ //
+ var stringify = querystringify;
+ var parse = querystring;
+
+ var querystringify_1 = {
+ stringify: stringify,
+ parse: parse
+ };
+
+ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+ function commonjsRequire () {
+ throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs');
+ }
+
+ function unwrapExports (x) {
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
+ }
+
+ function createCommonjsModule(fn, module) {
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
+ }
+
+ function getCjsExportFromNamespace (n) {
+ return n && n['default'] || n;
+ }
+
+ var prism = createCommonjsModule(function (module) {
+ /* **********************************************
+ Begin prism-core.js
+ ********************************************** */
+
+ var _self = (typeof window !== 'undefined')
+ ? window // if in browser
+ : (
+ (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)
+ ? self // if in worker
+ : {} // if in node js
+ );
+
+ /**
+ * Prism: Lightweight, robust, elegant syntax highlighting
+ * MIT license http://www.opensource.org/licenses/mit-license.php/
+ * @author Lea Verou http://lea.verou.me
+ */
+
+ var Prism = (function (_self){
+
+ // Private helper vars
+ var lang = /\blang(?:uage)?-([\w-]+)\b/i;
+ var uniqueId = 0;
+
+ var _ = {
+ manual: _self.Prism && _self.Prism.manual,
+ disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,
+ util: {
+ encode: function (tokens) {
+ if (tokens instanceof Token) {
+ return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias);
+ } else if (Array.isArray(tokens)) {
+ return tokens.map(_.util.encode);
+ } else {
+ return tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\u00a0/g, ' ');
+ }
+ },
+
+ type: function (o) {
+ return Object.prototype.toString.call(o).slice(8, -1);
+ },
+
+ objId: function (obj) {
+ if (!obj['__id']) {
+ Object.defineProperty(obj, '__id', { value: ++uniqueId });
+ }
+ return obj['__id'];
+ },
+
+ // Deep clone a language definition (e.g. to extend it)
+ clone: function deepClone(o, visited) {
+ var clone, id, type = _.util.type(o);
+ visited = visited || {};
+
+ switch (type) {
+ case 'Object':
+ id = _.util.objId(o);
+ if (visited[id]) {
+ return visited[id];
+ }
+ clone = {};
+ visited[id] = clone;
+
+ for (var key in o) {
+ if (o.hasOwnProperty(key)) {
+ clone[key] = deepClone(o[key], visited);
+ }
+ }
+
+ return clone;
+
+ case 'Array':
+ id = _.util.objId(o);
+ if (visited[id]) {
+ return visited[id];
+ }
+ clone = [];
+ visited[id] = clone;
+
+ o.forEach(function (v, i) {
+ clone[i] = deepClone(v, visited);
+ });
+
+ return clone;
+
+ default:
+ return o;
+ }
+ }
+ },
+
+ languages: {
+ extend: function (id, redef) {
+ var lang = _.util.clone(_.languages[id]);
+
+ for (var key in redef) {
+ lang[key] = redef[key];
+ }
+
+ return lang;
+ },
+
+ /**
+ * Insert a token before another token in a language literal
+ * As this needs to recreate the object (we cannot actually insert before keys in object literals),
+ * we cannot just provide an object, we need an object and a key.
+ * @param inside The key (or language id) of the parent
+ * @param before The key to insert before.
+ * @param insert Object with the key/value pairs to insert
+ * @param root The object that contains `inside`. If equal to Prism.languages, it can be omitted.
+ */
+ insertBefore: function (inside, before, insert, root) {
+ root = root || _.languages;
+ var grammar = root[inside];
+ var ret = {};
+
+ for (var token in grammar) {
+ if (grammar.hasOwnProperty(token)) {
+
+ if (token == before) {
+ for (var newToken in insert) {
+ if (insert.hasOwnProperty(newToken)) {
+ ret[newToken] = insert[newToken];
+ }
+ }
+ }
+
+ // Do not insert token which also occur in insert. See #1525
+ if (!insert.hasOwnProperty(token)) {
+ ret[token] = grammar[token];
+ }
+ }
+ }
+
+ var old = root[inside];
+ root[inside] = ret;
+
+ // Update references in other language definitions
+ _.languages.DFS(_.languages, function(key, value) {
+ if (value === old && key != inside) {
+ this[key] = ret;
+ }
+ });
+
+ return ret;
+ },
+
+ // Traverse a language definition with Depth First Search
+ DFS: function DFS(o, callback, type, visited) {
+ visited = visited || {};
+
+ var objId = _.util.objId;
+
+ for (var i in o) {
+ if (o.hasOwnProperty(i)) {
+ callback.call(o, i, o[i], type || i);
+
+ var property = o[i],
+ propertyType = _.util.type(property);
+
+ if (propertyType === 'Object' && !visited[objId(property)]) {
+ visited[objId(property)] = true;
+ DFS(property, callback, null, visited);
+ }
+ else if (propertyType === 'Array' && !visited[objId(property)]) {
+ visited[objId(property)] = true;
+ DFS(property, callback, i, visited);
+ }
+ }
+ }
+ }
+ },
+ plugins: {},
+
+ highlightAll: function(async, callback) {
+ _.highlightAllUnder(document, async, callback);
+ },
+
+ highlightAllUnder: function(container, async, callback) {
+ var env = {
+ callback: callback,
+ selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
+ };
+
+ _.hooks.run('before-highlightall', env);
+
+ var elements = container.querySelectorAll(env.selector);
+
+ for (var i=0, element; element = elements[i++];) {
+ _.highlightElement(element, async === true, env.callback);
+ }
+ },
+
+ highlightElement: function(element, async, callback) {
+ // Find language
+ var language = 'none', grammar, parent = element;
+
+ while (parent && !lang.test(parent.className)) {
+ parent = parent.parentNode;
+ }
+
+ if (parent) {
+ language = (parent.className.match(lang) || [,'none'])[1].toLowerCase();
+ grammar = _.languages[language];
+ }
+
+ // Set language on the element, if not present
+ element.className = element.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
+
+ if (element.parentNode) {
+ // Set language on the parent, for styling
+ parent = element.parentNode;
+
+ if (/pre/i.test(parent.nodeName)) {
+ parent.className = parent.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
+ }
+ }
+
+ var code = element.textContent;
+
+ var env = {
+ element: element,
+ language: language,
+ grammar: grammar,
+ code: code
+ };
+
+ var insertHighlightedCode = function (highlightedCode) {
+ env.highlightedCode = highlightedCode;
+
+ _.hooks.run('before-insert', env);
+
+ env.element.innerHTML = env.highlightedCode;
+
+ _.hooks.run('after-highlight', env);
+ _.hooks.run('complete', env);
+ callback && callback.call(env.element);
+ };
+
+ _.hooks.run('before-sanity-check', env);
+
+ if (!env.code) {
+ _.hooks.run('complete', env);
+ return;
+ }
+
+ _.hooks.run('before-highlight', env);
+
+ if (!env.grammar) {
+ insertHighlightedCode(_.util.encode(env.code));
+ return;
+ }
+
+ if (async && _self.Worker) {
+ var worker = new Worker(_.filename);
+
+ worker.onmessage = function(evt) {
+ insertHighlightedCode(evt.data);
+ };
+
+ worker.postMessage(JSON.stringify({
+ language: env.language,
+ code: env.code,
+ immediateClose: true
+ }));
+ }
+ else {
+ insertHighlightedCode(_.highlight(env.code, env.grammar, env.language));
+ }
+ },
+
+ highlight: function (text, grammar, language) {
+ var env = {
+ code: text,
+ grammar: grammar,
+ language: language
+ };
+ _.hooks.run('before-tokenize', env);
+ env.tokens = _.tokenize(env.code, env.grammar);
+ _.hooks.run('after-tokenize', env);
+ return Token.stringify(_.util.encode(env.tokens), env.language);
+ },
+
+ matchGrammar: function (text, strarr, grammar, index, startPos, oneshot, target) {
+ for (var token in grammar) {
+ if(!grammar.hasOwnProperty(token) || !grammar[token]) {
+ continue;
+ }
+
+ if (token == target) {
+ return;
+ }
+
+ var patterns = grammar[token];
+ patterns = (_.util.type(patterns) === "Array") ? patterns : [patterns];
+
+ for (var j = 0; j < patterns.length; ++j) {
+ var pattern = patterns[j],
+ inside = pattern.inside,
+ lookbehind = !!pattern.lookbehind,
+ greedy = !!pattern.greedy,
+ lookbehindLength = 0,
+ alias = pattern.alias;
+
+ if (greedy && !pattern.pattern.global) {
+ // Without the global flag, lastIndex won't work
+ var flags = pattern.pattern.toString().match(/[imuy]*$/)[0];
+ pattern.pattern = RegExp(pattern.pattern.source, flags + "g");
+ }
+
+ pattern = pattern.pattern || pattern;
+
+ // Don’t cache length as it changes during the loop
+ for (var i = index, pos = startPos; i < strarr.length; pos += strarr[i].length, ++i) {
+
+ var str = strarr[i];
+
+ if (strarr.length > text.length) {
+ // Something went terribly wrong, ABORT, ABORT!
+ return;
+ }
+
+ if (str instanceof Token) {
+ continue;
+ }
+
+ if (greedy && i != strarr.length - 1) {
+ pattern.lastIndex = pos;
+ var match = pattern.exec(text);
+ if (!match) {
+ break;
+ }
+
+ var from = match.index + (lookbehind ? match[1].length : 0),
+ to = match.index + match[0].length,
+ k = i,
+ p = pos;
+
+ for (var len = strarr.length; k < len && (p < to || (!strarr[k].type && !strarr[k - 1].greedy)); ++k) {
+ p += strarr[k].length;
+ // Move the index i to the element in strarr that is closest to from
+ if (from >= p) {
+ ++i;
+ pos = p;
+ }
+ }
+
+ // If strarr[i] is a Token, then the match starts inside another Token, which is invalid
+ if (strarr[i] instanceof Token) {
+ continue;
+ }
+
+ // Number of tokens to delete and replace with the new match
+ delNum = k - i;
+ str = text.slice(pos, p);
+ match.index -= pos;
+ } else {
+ pattern.lastIndex = 0;
+
+ var match = pattern.exec(str),
+ delNum = 1;
+ }
+
+ if (!match) {
+ if (oneshot) {
+ break;
+ }
+
+ continue;
+ }
+
+ if(lookbehind) {
+ lookbehindLength = match[1] ? match[1].length : 0;
+ }
+
+ var from = match.index + lookbehindLength,
+ match = match[0].slice(lookbehindLength),
+ to = from + match.length,
+ before = str.slice(0, from),
+ after = str.slice(to);
+
+ var args = [i, delNum];
+
+ if (before) {
+ ++i;
+ pos += before.length;
+ args.push(before);
+ }
+
+ var wrapped = new Token(token, inside? _.tokenize(match, inside) : match, alias, match, greedy);
+
+ args.push(wrapped);
+
+ if (after) {
+ args.push(after);
+ }
+
+ Array.prototype.splice.apply(strarr, args);
+
+ if (delNum != 1)
+ _.matchGrammar(text, strarr, grammar, i, pos, true, token);
+
+ if (oneshot)
+ break;
+ }
+ }
+ }
+ },
+
+ tokenize: function(text, grammar) {
+ var strarr = [text];
+
+ var rest = grammar.rest;
+
+ if (rest) {
+ for (var token in rest) {
+ grammar[token] = rest[token];
+ }
+
+ delete grammar.rest;
+ }
+
+ _.matchGrammar(text, strarr, grammar, 0, 0, false);
+
+ return strarr;
+ },
+
+ hooks: {
+ all: {},
+
+ add: function (name, callback) {
+ var hooks = _.hooks.all;
+
+ hooks[name] = hooks[name] || [];
+
+ hooks[name].push(callback);
+ },
+
+ run: function (name, env) {
+ var callbacks = _.hooks.all[name];
+
+ if (!callbacks || !callbacks.length) {
+ return;
+ }
+
+ for (var i=0, callback; callback = callbacks[i++];) {
+ callback(env);
+ }
+ }
+ },
+
+ Token: Token
+ };
+
+ _self.Prism = _;
+
+ function Token(type, content, alias, matchedStr, greedy) {
+ this.type = type;
+ this.content = content;
+ this.alias = alias;
+ // Copy of the full string this token was created from
+ this.length = (matchedStr || "").length|0;
+ this.greedy = !!greedy;
+ }
+
+ Token.stringify = function(o, language) {
+ if (typeof o == 'string') {
+ return o;
+ }
+
+ if (Array.isArray(o)) {
+ return o.map(function(element) {
+ return Token.stringify(element, language);
+ }).join('');
+ }
+
+ var env = {
+ type: o.type,
+ content: Token.stringify(o.content, language),
+ tag: 'span',
+ classes: ['token', o.type],
+ attributes: {},
+ language: language
+ };
+
+ if (o.alias) {
+ var aliases = Array.isArray(o.alias) ? o.alias : [o.alias];
+ Array.prototype.push.apply(env.classes, aliases);
+ }
+
+ _.hooks.run('wrap', env);
+
+ var attributes = Object.keys(env.attributes).map(function(name) {
+ return name + '="' + (env.attributes[name] || '').replace(/"/g, '&quot;') + '"';
+ }).join(' ');
+
+ return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + (attributes ? ' ' + attributes : '') + '>' + env.content + '</' + env.tag + '>';
+ };
+
+ if (!_self.document) {
+ if (!_self.addEventListener) {
+ // in Node.js
+ return _;
+ }
+
+ if (!_.disableWorkerMessageHandler) {
+ // In worker
+ _self.addEventListener('message', function (evt) {
+ var message = JSON.parse(evt.data),
+ lang = message.language,
+ code = message.code,
+ immediateClose = message.immediateClose;
+
+ _self.postMessage(_.highlight(code, _.languages[lang], lang));
+ if (immediateClose) {
+ _self.close();
+ }
+ }, false);
+ }
+
+ return _;
+ }
+
+ //Get current script and highlight
+ var script = document.currentScript || [].slice.call(document.getElementsByTagName("script")).pop();
+
+ if (script) {
+ _.filename = script.src;
+
+ if (!_.manual && !script.hasAttribute('data-manual')) {
+ if(document.readyState !== "loading") {
+ if (window.requestAnimationFrame) {
+ window.requestAnimationFrame(_.highlightAll);
+ } else {
+ window.setTimeout(_.highlightAll, 16);
+ }
+ }
+ else {
+ document.addEventListener('DOMContentLoaded', _.highlightAll);
+ }
+ }
+ }
+
+ return _;
+
+ })(_self);
+
+ if ('object' !== 'undefined' && module.exports) {
+ module.exports = Prism;
+ }
+
+ // hack for components to work correctly in node.js
+ if (typeof commonjsGlobal !== 'undefined') {
+ commonjsGlobal.Prism = Prism;
+ }
+
+
+ /* **********************************************
+ Begin prism-markup.js
+ ********************************************** */
+
+ Prism.languages.markup = {
+ 'comment': /<!--[\s\S]*?-->/,
+ 'prolog': /<\?[\s\S]+?\?>/,
+ 'doctype': /<!DOCTYPE[\s\S]+?>/i,
+ 'cdata': /<!\[CDATA\[[\s\S]*?]]>/i,
+ 'tag': {
+ pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i,
+ greedy: true,
+ inside: {
+ 'tag': {
+ pattern: /^<\/?[^\s>\/]+/i,
+ inside: {
+ 'punctuation': /^<\/?/,
+ 'namespace': /^[^\s>\/:]+:/
+ }
+ },
+ 'attr-value': {
+ pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i,
+ inside: {
+ 'punctuation': [
+ /^=/,
+ {
+ pattern: /^(\s*)["']|["']$/,
+ lookbehind: true
+ }
+ ]
+ }
+ },
+ 'punctuation': /\/?>/,
+ 'attr-name': {
+ pattern: /[^\s>\/]+/,
+ inside: {
+ 'namespace': /^[^\s>\/:]+:/
+ }
+ }
+
+ }
+ },
+ 'entity': /&#?[\da-z]{1,8};/i
+ };
+
+ Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] =
+ Prism.languages.markup['entity'];
+
+ // Plugin to make entity title show the real entity, idea by Roman Komarov
+ Prism.hooks.add('wrap', function(env) {
+
+ if (env.type === 'entity') {
+ env.attributes['title'] = env.content.replace(/&amp;/, '&');
+ }
+ });
+
+ Object.defineProperty(Prism.languages.markup.tag, 'addInlined', {
+ /**
+ * Adds an inlined language to markup.
+ *
+ * An example of an inlined language is CSS with `<style>` tags.
+ *
+ * @param {string} tagName The name of the tag that contains the inlined language. This name will be treated as
+ * case insensitive.
+ * @param {string} lang The language key.
+ * @example
+ * addInlined('style', 'css');
+ */
+ value: function addInlined(tagName, lang) {
+ var includedCdataInside = {};
+ includedCdataInside['language-' + lang] = {
+ pattern: /(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,
+ lookbehind: true,
+ inside: Prism.languages[lang]
+ };
+ includedCdataInside['cdata'] = /^<!\[CDATA\[|\]\]>$/i;
+
+ var inside = {
+ 'included-cdata': {
+ pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
+ inside: includedCdataInside
+ }
+ };
+ inside['language-' + lang] = {
+ pattern: /[\s\S]+/,
+ inside: Prism.languages[lang]
+ };
+
+ var def = {};
+ def[tagName] = {
+ pattern: RegExp(/(<__[\s\S]*?>)(?:<!\[CDATA\[[\s\S]*?\]\]>\s*|[\s\S])*?(?=<\/__>)/.source.replace(/__/g, tagName), 'i'),
+ lookbehind: true,
+ greedy: true,
+ inside: inside
+ };
+
+ Prism.languages.insertBefore('markup', 'cdata', def);
+ }
+ });
+
+ Prism.languages.xml = Prism.languages.extend('markup', {});
+ Prism.languages.html = Prism.languages.markup;
+ Prism.languages.mathml = Prism.languages.markup;
+ Prism.languages.svg = Prism.languages.markup;
+
+
+ /* **********************************************
+ Begin prism-css.js
+ ********************************************** */
+
+ (function (Prism) {
+
+ var string = /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;
+
+ Prism.languages.css = {
+ 'comment': /\/\*[\s\S]*?\*\//,
+ 'atrule': {
+ pattern: /@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,
+ inside: {
+ 'rule': /@[\w-]+/
+ // See rest below
+ }
+ },
+ 'url': {
+ pattern: RegExp('url\\((?:' + string.source + '|[^\n\r()]*)\\)', 'i'),
+ inside: {
+ 'function': /^url/i,
+ 'punctuation': /^\(|\)$/
+ }
+ },
+ 'selector': RegExp('[^{}\\s](?:[^{};"\']|' + string.source + ')*?(?=\\s*\\{)'),
+ 'string': {
+ pattern: string,
+ greedy: true
+ },
+ 'property': /[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,
+ 'important': /!important\b/i,
+ 'function': /[-a-z0-9]+(?=\()/i,
+ 'punctuation': /[(){};:,]/
+ };
+
+ Prism.languages.css['atrule'].inside.rest = Prism.languages.css;
+
+ var markup = Prism.languages.markup;
+ if (markup) {
+ markup.tag.addInlined('style', 'css');
+
+ Prism.languages.insertBefore('inside', 'attr-value', {
+ 'style-attr': {
+ pattern: /\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,
+ inside: {
+ 'attr-name': {
+ pattern: /^\s*style/i,
+ inside: markup.tag.inside
+ },
+ 'punctuation': /^\s*=\s*['"]|['"]\s*$/,
+ 'attr-value': {
+ pattern: /.+/i,
+ inside: Prism.languages.css
+ }
+ },
+ alias: 'language-css'
+ }
+ }, markup.tag);
+ }
+
+ }(Prism));
+
+
+ /* **********************************************
+ Begin prism-clike.js
+ ********************************************** */
+
+ Prism.languages.clike = {
+ 'comment': [
+ {
+ pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
+ lookbehind: true
+ },
+ {
+ pattern: /(^|[^\\:])\/\/.*/,
+ lookbehind: true,
+ greedy: true
+ }
+ ],
+ 'string': {
+ pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
+ greedy: true
+ },
+ 'class-name': {
+ pattern: /((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,
+ lookbehind: true,
+ inside: {
+ punctuation: /[.\\]/
+ }
+ },
+ 'keyword': /\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,
+ 'boolean': /\b(?:true|false)\b/,
+ 'function': /\w+(?=\()/,
+ 'number': /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,
+ 'operator': /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,
+ 'punctuation': /[{}[\];(),.:]/
+ };
+
+
+ /* **********************************************
+ Begin prism-javascript.js
+ ********************************************** */
+
+ Prism.languages.javascript = Prism.languages.extend('clike', {
+ 'class-name': [
+ Prism.languages.clike['class-name'],
+ {
+ pattern: /(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,
+ lookbehind: true
+ }
+ ],
+ 'keyword': [
+ {
+ pattern: /((?:^|})\s*)(?:catch|finally)\b/,
+ lookbehind: true
+ },
+ {
+ pattern: /(^|[^.])\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,
+ lookbehind: true
+ },
+ ],
+ 'number': /\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,
+ // Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)
+ 'function': /#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,
+ 'operator': /-[-=]?|\+[+=]?|!=?=?|<<?=?|>>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/
+ });
+
+ Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/;
+
+ Prism.languages.insertBefore('javascript', 'keyword', {
+ 'regex': {
+ pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=\s*($|[\r\n,.;})\]]))/,
+ lookbehind: true,
+ greedy: true
+ },
+ // This must be declared before keyword because we use "function" inside the look-forward
+ 'function-variable': {
+ pattern: /#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,
+ alias: 'function'
+ },
+ 'parameter': [
+ {
+ pattern: /(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,
+ lookbehind: true,
+ inside: Prism.languages.javascript
+ },
+ {
+ pattern: /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,
+ inside: Prism.languages.javascript
+ },
+ {
+ pattern: /(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,
+ lookbehind: true,
+ inside: Prism.languages.javascript
+ },
+ {
+ pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,
+ lookbehind: true,
+ inside: Prism.languages.javascript
+ }
+ ],
+ 'constant': /\b[A-Z](?:[A-Z_]|\dx?)*\b/
+ });
+
+ Prism.languages.insertBefore('javascript', 'string', {
+ 'template-string': {
+ pattern: /`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,
+ greedy: true,
+ inside: {
+ 'template-punctuation': {
+ pattern: /^`|`$/,
+ alias: 'string'
+ },
+ 'interpolation': {
+ pattern: /((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,
+ lookbehind: true,
+ inside: {
+ 'interpolation-punctuation': {
+ pattern: /^\${|}$/,
+ alias: 'punctuation'
+ },
+ rest: Prism.languages.javascript
+ }
+ },
+ 'string': /[\s\S]+/
+ }
+ }
+ });
+
+ if (Prism.languages.markup) {
+ Prism.languages.markup.tag.addInlined('script', 'javascript');
+ }
+
+ Prism.languages.js = Prism.languages.javascript;
+
+
+ /* **********************************************
+ Begin prism-file-highlight.js
+ ********************************************** */
+
+ (function () {
+ if (typeof self === 'undefined' || !self.Prism || !self.document || !document.querySelector) {
+ return;
+ }
+
+ /**
+ * @param {Element} [container=document]
+ */
+ self.Prism.fileHighlight = function(container) {
+ container = container || document;
+
+ var Extensions = {
+ 'js': 'javascript',
+ 'py': 'python',
+ 'rb': 'ruby',
+ 'ps1': 'powershell',
+ 'psm1': 'powershell',
+ 'sh': 'bash',
+ 'bat': 'batch',
+ 'h': 'c',
+ 'tex': 'latex'
+ };
+
+ Array.prototype.slice.call(container.querySelectorAll('pre[data-src]')).forEach(function (pre) {
+ // ignore if already loaded
+ if (pre.hasAttribute('data-src-loaded')) {
+ return;
+ }
+
+ // load current
+ var src = pre.getAttribute('data-src');
+
+ var language, parent = pre;
+ var lang = /\blang(?:uage)?-([\w-]+)\b/i;
+ while (parent && !lang.test(parent.className)) {
+ parent = parent.parentNode;
+ }
+
+ if (parent) {
+ language = (pre.className.match(lang) || [, ''])[1];
+ }
+
+ if (!language) {
+ var extension = (src.match(/\.(\w+)$/) || [, ''])[1];
+ language = Extensions[extension] || extension;
+ }
+
+ var code = document.createElement('code');
+ code.className = 'language-' + language;
+
+ pre.textContent = '';
+
+ code.textContent = 'Loading…';
+
+ pre.appendChild(code);
+
+ var xhr = new XMLHttpRequest();
+
+ xhr.open('GET', src, true);
+
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState == 4) {
+
+ if (xhr.status < 400 && xhr.responseText) {
+ code.textContent = xhr.responseText;
+
+ Prism.highlightElement(code);
+ // mark as loaded
+ pre.setAttribute('data-src-loaded', '');
+ }
+ else if (xhr.status >= 400) {
+ code.textContent = '✖ Error ' + xhr.status + ' while fetching file: ' + xhr.statusText;
+ }
+ else {
+ code.textContent = '✖ Error: File does not exist or is empty';
+ }
+ }
+ };
+
+ xhr.send(null);
+ });
+
+ if (Prism.plugins.toolbar) {
+ Prism.plugins.toolbar.registerButton('download-file', function (env) {
+ var pre = env.element.parentNode;
+ if (!pre || !/pre/i.test(pre.nodeName) || !pre.hasAttribute('data-src') || !pre.hasAttribute('data-download-link')) {
+ return;
+ }
+ var src = pre.getAttribute('data-src');
+ var a = document.createElement('a');
+ a.textContent = pre.getAttribute('data-download-link-label') || 'Download';
+ a.setAttribute('download', '');
+ a.href = src;
+ return a;
+ });
+ }
+
+ };
+
+ document.addEventListener('DOMContentLoaded', function () {
+ // execute inside handler, for dropping Event as argument
+ self.Prism.fileHighlight();
+ });
+
+ })();
+ });
+
+ var marked = createCommonjsModule(function (module, exports) {
+ /**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/markedjs/marked
+ */
+
+ ;(function(root) {
+ 'use strict';
+
+ /**
+ * Block-Level Grammar
+ */
+
+ var block = {
+ newline: /^\n+/,
+ code: /^( {4}[^\n]+\n*)+/,
+ fences: /^ {0,3}(`{3,}|~{3,})([^`~\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
+ hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
+ heading: /^ {0,3}(#{1,6}) +([^\n]*?)(?: +#+)? *(?:\n+|$)/,
+ blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
+ list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
+ html: '^ {0,3}(?:' // optional indentation
+ + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
+ + '|comment[^\\n]*(\\n+|$)' // (2)
+ + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
+ + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
+ + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
+ + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
+ + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
+ + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
+ + ')',
+ def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
+ nptable: noop,
+ table: noop,
+ lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,
+ // regex template, placeholders will be replaced according to different paragraph
+ // interruption rules of commonmark and the original markdown spec:
+ _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html)[^\n]+)*)/,
+ text: /^[^\n]+/
+ };
+
+ block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
+ block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
+ block.def = edit(block.def)
+ .replace('label', block._label)
+ .replace('title', block._title)
+ .getRegex();
+
+ block.bullet = /(?:[*+-]|\d{1,9}\.)/;
+ block.item = /^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/;
+ block.item = edit(block.item, 'gm')
+ .replace(/bull/g, block.bullet)
+ .getRegex();
+
+ block.list = edit(block.list)
+ .replace(/bull/g, block.bullet)
+ .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
+ .replace('def', '\\n+(?=' + block.def.source + ')')
+ .getRegex();
+
+ block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
+ + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
+ + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
+ + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
+ + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
+ + '|track|ul';
+ block._comment = /<!--(?!-?>)[\s\S]*?-->/;
+ block.html = edit(block.html, 'i')
+ .replace('comment', block._comment)
+ .replace('tag', block._tag)
+ .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
+ .getRegex();
+
+ block.paragraph = edit(block._paragraph)
+ .replace('hr', block.hr)
+ .replace('heading', ' {0,3}#{1,6} +')
+ .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs
+ .replace('blockquote', ' {0,3}>')
+ .replace('fences', ' {0,3}(?:`{3,}|~{3,})[^`\\n]*\\n')
+ .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
+ .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)')
+ .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
+ .getRegex();
+
+ block.blockquote = edit(block.blockquote)
+ .replace('paragraph', block.paragraph)
+ .getRegex();
+
+ /**
+ * Normal Block Grammar
+ */
+
+ block.normal = merge({}, block);
+
+ /**
+ * GFM Block Grammar
+ */
+
+ block.gfm = merge({}, block.normal, {
+ nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
+ table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
+ });
+
+ /**
+ * Pedantic grammar (original John Gruber's loose markdown specification)
+ */
+
+ block.pedantic = merge({}, block.normal, {
+ html: edit(
+ '^ *(?:comment *(?:\\n|\\s*$)'
+ + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
+ + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
+ .replace('comment', block._comment)
+ .replace(/tag/g, '(?!(?:'
+ + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
+ + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
+ + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
+ .getRegex(),
+ def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
+ heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
+ fences: noop, // fences not supported
+ paragraph: edit(block.normal._paragraph)
+ .replace('hr', block.hr)
+ .replace('heading', ' *#{1,6} *[^\n]')
+ .replace('lheading', block.lheading)
+ .replace('blockquote', ' {0,3}>')
+ .replace('|fences', '')
+ .replace('|list', '')
+ .replace('|html', '')
+ .getRegex()
+ });
+
+ /**
+ * Block Lexer
+ */
+
+ function Lexer(options) {
+ this.tokens = [];
+ this.tokens.links = Object.create(null);
+ this.options = options || marked.defaults;
+ this.rules = block.normal;
+
+ if (this.options.pedantic) {
+ this.rules = block.pedantic;
+ } else if (this.options.gfm) {
+ this.rules = block.gfm;
+ }
+ }
+
+ /**
+ * Expose Block Rules
+ */
+
+ Lexer.rules = block;
+
+ /**
+ * Static Lex Method
+ */
+
+ Lexer.lex = function(src, options) {
+ var lexer = new Lexer(options);
+ return lexer.lex(src);
+ };
+
+ /**
+ * Preprocessing
+ */
+
+ Lexer.prototype.lex = function(src) {
+ src = src
+ .replace(/\r\n|\r/g, '\n')
+ .replace(/\t/g, ' ')
+ .replace(/\u00a0/g, ' ')
+ .replace(/\u2424/g, '\n');
+
+ return this.token(src, true);
+ };
+
+ /**
+ * Lexing
+ */
+
+ Lexer.prototype.token = function(src, top) {
+ src = src.replace(/^ +$/gm, '');
+ var next,
+ loose,
+ cap,
+ bull,
+ b,
+ item,
+ listStart,
+ listItems,
+ t,
+ space,
+ i,
+ tag,
+ l,
+ isordered,
+ istask,
+ ischecked;
+
+ while (src) {
+ // newline
+ if (cap = this.rules.newline.exec(src)) {
+ src = src.substring(cap[0].length);
+ if (cap[0].length > 1) {
+ this.tokens.push({
+ type: 'space'
+ });
+ }
+ }
+
+ // code
+ if (cap = this.rules.code.exec(src)) {
+ var lastToken = this.tokens[this.tokens.length - 1];
+ src = src.substring(cap[0].length);
+ // An indented code block cannot interrupt a paragraph.
+ if (lastToken && lastToken.type === 'paragraph') {
+ lastToken.text += '\n' + cap[0].trimRight();
+ } else {
+ cap = cap[0].replace(/^ {4}/gm, '');
+ this.tokens.push({
+ type: 'code',
+ codeBlockStyle: 'indented',
+ text: !this.options.pedantic
+ ? rtrim(cap, '\n')
+ : cap
+ });
+ }
+ continue;
+ }
+
+ // fences
+ if (cap = this.rules.fences.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'code',
+ lang: cap[2] ? cap[2].trim() : cap[2],
+ text: cap[3] || ''
+ });
+ continue;
+ }
+
+ // heading
+ if (cap = this.rules.heading.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'heading',
+ depth: cap[1].length,
+ text: cap[2]
+ });
+ continue;
+ }
+
+ // table no leading pipe (gfm)
+ if (cap = this.rules.nptable.exec(src)) {
+ item = {
+ type: 'table',
+ header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
+ align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+ cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
+ };
+
+ if (item.header.length === item.align.length) {
+ src = src.substring(cap[0].length);
+
+ for (i = 0; i < item.align.length; i++) {
+ if (/^ *-+: *$/.test(item.align[i])) {
+ item.align[i] = 'right';
+ } else if (/^ *:-+: *$/.test(item.align[i])) {
+ item.align[i] = 'center';
+ } else if (/^ *:-+ *$/.test(item.align[i])) {
+ item.align[i] = 'left';
+ } else {
+ item.align[i] = null;
+ }
+ }
+
+ for (i = 0; i < item.cells.length; i++) {
+ item.cells[i] = splitCells(item.cells[i], item.header.length);
+ }
+
+ this.tokens.push(item);
+
+ continue;
+ }
+ }
+
+ // hr
+ if (cap = this.rules.hr.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'hr'
+ });
+ continue;
+ }
+
+ // blockquote
+ if (cap = this.rules.blockquote.exec(src)) {
+ src = src.substring(cap[0].length);
+
+ this.tokens.push({
+ type: 'blockquote_start'
+ });
+
+ cap = cap[0].replace(/^ *> ?/gm, '');
+
+ // Pass `top` to keep the current
+ // "toplevel" state. This is exactly
+ // how markdown.pl works.
+ this.token(cap, top);
+
+ this.tokens.push({
+ type: 'blockquote_end'
+ });
+
+ continue;
+ }
+
+ // list
+ if (cap = this.rules.list.exec(src)) {
+ src = src.substring(cap[0].length);
+ bull = cap[2];
+ isordered = bull.length > 1;
+
+ listStart = {
+ type: 'list_start',
+ ordered: isordered,
+ start: isordered ? +bull : '',
+ loose: false
+ };
+
+ this.tokens.push(listStart);
+
+ // Get each top-level item.
+ cap = cap[0].match(this.rules.item);
+
+ listItems = [];
+ next = false;
+ l = cap.length;
+ i = 0;
+
+ for (; i < l; i++) {
+ item = cap[i];
+
+ // Remove the list item's bullet
+ // so it is seen as the next token.
+ space = item.length;
+ item = item.replace(/^ *([*+-]|\d+\.) */, '');
+
+ // Outdent whatever the
+ // list item contains. Hacky.
+ if (~item.indexOf('\n ')) {
+ space -= item.length;
+ item = !this.options.pedantic
+ ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
+ : item.replace(/^ {1,4}/gm, '');
+ }
+
+ // Determine whether the next list item belongs here.
+ // Backpedal if it does not belong in this list.
+ if (i !== l - 1) {
+ b = block.bullet.exec(cap[i + 1])[0];
+ if (bull.length > 1 ? b.length === 1
+ : (b.length > 1 || (this.options.smartLists && b !== bull))) {
+ src = cap.slice(i + 1).join('\n') + src;
+ i = l - 1;
+ }
+ }
+
+ // Determine whether item is loose or not.
+ // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
+ // for discount behavior.
+ loose = next || /\n\n(?!\s*$)/.test(item);
+ if (i !== l - 1) {
+ next = item.charAt(item.length - 1) === '\n';
+ if (!loose) loose = next;
+ }
+
+ if (loose) {
+ listStart.loose = true;
+ }
+
+ // Check for task list items
+ istask = /^\[[ xX]\] /.test(item);
+ ischecked = undefined;
+ if (istask) {
+ ischecked = item[1] !== ' ';
+ item = item.replace(/^\[[ xX]\] +/, '');
+ }
+
+ t = {
+ type: 'list_item_start',
+ task: istask,
+ checked: ischecked,
+ loose: loose
+ };
+
+ listItems.push(t);
+ this.tokens.push(t);
+
+ // Recurse.
+ this.token(item, false);
+
+ this.tokens.push({
+ type: 'list_item_end'
+ });
+ }
+
+ if (listStart.loose) {
+ l = listItems.length;
+ i = 0;
+ for (; i < l; i++) {
+ listItems[i].loose = true;
+ }
+ }
+
+ this.tokens.push({
+ type: 'list_end'
+ });
+
+ continue;
+ }
+
+ // html
+ if (cap = this.rules.html.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: this.options.sanitize
+ ? 'paragraph'
+ : 'html',
+ pre: !this.options.sanitizer
+ && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
+ text: this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0])) : cap[0]
+ });
+ continue;
+ }
+
+ // def
+ if (top && (cap = this.rules.def.exec(src))) {
+ src = src.substring(cap[0].length);
+ if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
+ tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
+ if (!this.tokens.links[tag]) {
+ this.tokens.links[tag] = {
+ href: cap[2],
+ title: cap[3]
+ };
+ }
+ continue;
+ }
+
+ // table (gfm)
+ if (cap = this.rules.table.exec(src)) {
+ item = {
+ type: 'table',
+ header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
+ align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+ cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
+ };
+
+ if (item.header.length === item.align.length) {
+ src = src.substring(cap[0].length);
+
+ for (i = 0; i < item.align.length; i++) {
+ if (/^ *-+: *$/.test(item.align[i])) {
+ item.align[i] = 'right';
+ } else if (/^ *:-+: *$/.test(item.align[i])) {
+ item.align[i] = 'center';
+ } else if (/^ *:-+ *$/.test(item.align[i])) {
+ item.align[i] = 'left';
+ } else {
+ item.align[i] = null;
+ }
+ }
+
+ for (i = 0; i < item.cells.length; i++) {
+ item.cells[i] = splitCells(
+ item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
+ item.header.length);
+ }
+
+ this.tokens.push(item);
+
+ continue;
+ }
+ }
+
+ // lheading
+ if (cap = this.rules.lheading.exec(src)) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'heading',
+ depth: cap[2].charAt(0) === '=' ? 1 : 2,
+ text: cap[1]
+ });
+ continue;
+ }
+
+ // top-level paragraph
+ if (top && (cap = this.rules.paragraph.exec(src))) {
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'paragraph',
+ text: cap[1].charAt(cap[1].length - 1) === '\n'
+ ? cap[1].slice(0, -1)
+ : cap[1]
+ });
+ continue;
+ }
+
+ // text
+ if (cap = this.rules.text.exec(src)) {
+ // Top-level should never reach here.
+ src = src.substring(cap[0].length);
+ this.tokens.push({
+ type: 'text',
+ text: cap[0]
+ });
+ continue;
+ }
+
+ if (src) {
+ throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
+ }
+ }
+
+ return this.tokens;
+ };
+
+ /**
+ * Inline-Level Grammar
+ */
+
+ var inline = {
+ escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
+ autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
+ url: noop,
+ tag: '^comment'
+ + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
+ + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
+ + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
+ + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
+ + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
+ link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,
+ reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
+ nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
+ strong: /^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
+ em: /^_([^\s_])_(?!_)|^\*([^\s*<\[])\*(?!\*)|^_([^\s<][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_<][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s<"][\s\S]*?[^\s\*])\*(?!\*|[^\spunctuation])|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
+ code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
+ br: /^( {2,}|\\)\n(?!\s*$)/,
+ del: noop,
+ text: /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*]|\b_|$)|[^ ](?= {2,}\n))|(?= {2,}\n))/
+ };
+
+ // list of punctuation marks from common mark spec
+ // without ` and ] to workaround Rule 17 (inline code blocks/links)
+ inline._punctuation = '!"#$%&\'()*+,\\-./:;<=>?@\\[^_{|}~';
+ inline.em = edit(inline.em).replace(/punctuation/g, inline._punctuation).getRegex();
+
+ inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
+
+ inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
+ inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
+ inline.autolink = edit(inline.autolink)
+ .replace('scheme', inline._scheme)
+ .replace('email', inline._email)
+ .getRegex();
+
+ inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
+
+ inline.tag = edit(inline.tag)
+ .replace('comment', block._comment)
+ .replace('attribute', inline._attribute)
+ .getRegex();
+
+ inline._label = /(?:\[[^\[\]]*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
+ inline._href = /<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*/;
+ inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
+
+ inline.link = edit(inline.link)
+ .replace('label', inline._label)
+ .replace('href', inline._href)
+ .replace('title', inline._title)
+ .getRegex();
+
+ inline.reflink = edit(inline.reflink)
+ .replace('label', inline._label)
+ .getRegex();
+
+ /**
+ * Normal Inline Grammar
+ */
+
+ inline.normal = merge({}, inline);
+
+ /**
+ * Pedantic Inline Grammar
+ */
+
+ inline.pedantic = merge({}, inline.normal, {
+ strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
+ em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
+ link: edit(/^!?\[(label)\]\((.*?)\)/)
+ .replace('label', inline._label)
+ .getRegex(),
+ reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
+ .replace('label', inline._label)
+ .getRegex()
+ });
+
+ /**
+ * GFM Inline Grammar
+ */
+
+ inline.gfm = merge({}, inline.normal, {
+ escape: edit(inline.escape).replace('])', '~|])').getRegex(),
+ _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
+ url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
+ _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
+ del: /^~+(?=\S)([\s\S]*?\S)~+/,
+ text: /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*~]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?= {2,}\n|[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/
+ });
+
+ inline.gfm.url = edit(inline.gfm.url, 'i')
+ .replace('email', inline.gfm._extended_email)
+ .getRegex();
+ /**
+ * GFM + Line Breaks Inline Grammar
+ */
+
+ inline.breaks = merge({}, inline.gfm, {
+ br: edit(inline.br).replace('{2,}', '*').getRegex(),
+ text: edit(inline.gfm.text)
+ .replace('\\b_', '\\b_| {2,}\\n')
+ .replace(/\{2,\}/g, '*')
+ .getRegex()
+ });
+
+ /**
+ * Inline Lexer & Compiler
+ */
+
+ function InlineLexer(links, options) {
+ this.options = options || marked.defaults;
+ this.links = links;
+ this.rules = inline.normal;
+ this.renderer = this.options.renderer || new Renderer();
+ this.renderer.options = this.options;
+
+ if (!this.links) {
+ throw new Error('Tokens array requires a `links` property.');
+ }
+
+ if (this.options.pedantic) {
+ this.rules = inline.pedantic;
+ } else if (this.options.gfm) {
+ if (this.options.breaks) {
+ this.rules = inline.breaks;
+ } else {
+ this.rules = inline.gfm;
+ }
+ }
+ }
+
+ /**
+ * Expose Inline Rules
+ */
+
+ InlineLexer.rules = inline;
+
+ /**
+ * Static Lexing/Compiling Method
+ */
+
+ InlineLexer.output = function(src, links, options) {
+ var inline = new InlineLexer(links, options);
+ return inline.output(src);
+ };
+
+ /**
+ * Lexing/Compiling
+ */
+
+ InlineLexer.prototype.output = function(src) {
+ var out = '',
+ link,
+ text,
+ href,
+ title,
+ cap,
+ prevCapZero;
+
+ while (src) {
+ // escape
+ if (cap = this.rules.escape.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += escape(cap[1]);
+ continue;
+ }
+
+ // tag
+ if (cap = this.rules.tag.exec(src)) {
+ if (!this.inLink && /^<a /i.test(cap[0])) {
+ this.inLink = true;
+ } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
+ this.inLink = false;
+ }
+ if (!this.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
+ this.inRawBlock = true;
+ } else if (this.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
+ this.inRawBlock = false;
+ }
+
+ src = src.substring(cap[0].length);
+ out += this.options.sanitize
+ ? this.options.sanitizer
+ ? this.options.sanitizer(cap[0])
+ : escape(cap[0])
+ : cap[0];
+ continue;
+ }
+
+ // link
+ if (cap = this.rules.link.exec(src)) {
+ var lastParenIndex = findClosingBracket(cap[2], '()');
+ if (lastParenIndex > -1) {
+ var linkLen = 4 + cap[1].length + lastParenIndex;
+ cap[2] = cap[2].substring(0, lastParenIndex);
+ cap[0] = cap[0].substring(0, linkLen).trim();
+ cap[3] = '';
+ }
+ src = src.substring(cap[0].length);
+ this.inLink = true;
+ href = cap[2];
+ if (this.options.pedantic) {
+ link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
+
+ if (link) {
+ href = link[1];
+ title = link[3];
+ } else {
+ title = '';
+ }
+ } else {
+ title = cap[3] ? cap[3].slice(1, -1) : '';
+ }
+ href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
+ out += this.outputLink(cap, {
+ href: InlineLexer.escapes(href),
+ title: InlineLexer.escapes(title)
+ });
+ this.inLink = false;
+ continue;
+ }
+
+ // reflink, nolink
+ if ((cap = this.rules.reflink.exec(src))
+ || (cap = this.rules.nolink.exec(src))) {
+ src = src.substring(cap[0].length);
+ link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
+ link = this.links[link.toLowerCase()];
+ if (!link || !link.href) {
+ out += cap[0].charAt(0);
+ src = cap[0].substring(1) + src;
+ continue;
+ }
+ this.inLink = true;
+ out += this.outputLink(cap, link);
+ this.inLink = false;
+ continue;
+ }
+
+ // strong
+ if (cap = this.rules.strong.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
+ continue;
+ }
+
+ // em
+ if (cap = this.rules.em.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
+ continue;
+ }
+
+ // code
+ if (cap = this.rules.code.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.codespan(escape(cap[2].trim(), true));
+ continue;
+ }
+
+ // br
+ if (cap = this.rules.br.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.br();
+ continue;
+ }
+
+ // del (gfm)
+ if (cap = this.rules.del.exec(src)) {
+ src = src.substring(cap[0].length);
+ out += this.renderer.del(this.output(cap[1]));
+ continue;
+ }
+
+ // autolink
+ if (cap = this.rules.autolink.exec(src)) {
+ src = src.substring(cap[0].length);
+ if (cap[2] === '@') {
+ text = escape(this.mangle(cap[1]));
+ href = 'mailto:' + text;
+ } else {
+ text = escape(cap[1]);
+ href = text;
+ }
+ out += this.renderer.link(href, null, text);
+ continue;
+ }
+
+ // url (gfm)
+ if (!this.inLink && (cap = this.rules.url.exec(src))) {
+ if (cap[2] === '@') {
+ text = escape(cap[0]);
+ href = 'mailto:' + text;
+ } else {
+ // do extended autolink path validation
+ do {
+ prevCapZero = cap[0];
+ cap[0] = this.rules._backpedal.exec(cap[0])[0];
+ } while (prevCapZero !== cap[0]);
+ text = escape(cap[0]);
+ if (cap[1] === 'www.') {
+ href = 'http://' + text;
+ } else {
+ href = text;
+ }
+ }
+ src = src.substring(cap[0].length);
+ out += this.renderer.link(href, null, text);
+ continue;
+ }
+
+ // text
+ if (cap = this.rules.text.exec(src)) {
+ src = src.substring(cap[0].length);
+ if (this.inRawBlock) {
+ out += this.renderer.text(this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0])) : cap[0]);
+ } else {
+ out += this.renderer.text(escape(this.smartypants(cap[0])));
+ }
+ continue;
+ }
+
+ if (src) {
+ throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
+ }
+ }
+
+ return out;
+ };
+
+ InlineLexer.escapes = function(text) {
+ return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
+ };
+
+ /**
+ * Compile Link
+ */
+
+ InlineLexer.prototype.outputLink = function(cap, link) {
+ var href = link.href,
+ title = link.title ? escape(link.title) : null;
+
+ return cap[0].charAt(0) !== '!'
+ ? this.renderer.link(href, title, this.output(cap[1]))
+ : this.renderer.image(href, title, escape(cap[1]));
+ };
+
+ /**
+ * Smartypants Transformations
+ */
+
+ InlineLexer.prototype.smartypants = function(text) {
+ if (!this.options.smartypants) return text;
+ return text
+ // em-dashes
+ .replace(/---/g, '\u2014')
+ // en-dashes
+ .replace(/--/g, '\u2013')
+ // opening singles
+ .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
+ // closing singles & apostrophes
+ .replace(/'/g, '\u2019')
+ // opening doubles
+ .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
+ // closing doubles
+ .replace(/"/g, '\u201d')
+ // ellipses
+ .replace(/\.{3}/g, '\u2026');
+ };
+
+ /**
+ * Mangle Links
+ */
+
+ InlineLexer.prototype.mangle = function(text) {
+ if (!this.options.mangle) return text;
+ var out = '',
+ l = text.length,
+ i = 0,
+ ch;
+
+ for (; i < l; i++) {
+ ch = text.charCodeAt(i);
+ if (Math.random() > 0.5) {
+ ch = 'x' + ch.toString(16);
+ }
+ out += '&#' + ch + ';';
+ }
+
+ return out;
+ };
+
+ /**
+ * Renderer
+ */
+
+ function Renderer(options) {
+ this.options = options || marked.defaults;
+ }
+
+ Renderer.prototype.code = function(code, infostring, escaped) {
+ var lang = (infostring || '').match(/\S*/)[0];
+ if (this.options.highlight) {
+ var out = this.options.highlight(code, lang);
+ if (out != null && out !== code) {
+ escaped = true;
+ code = out;
+ }
+ }
+
+ if (!lang) {
+ return '<pre><code>'
+ + (escaped ? code : escape(code, true))
+ + '</code></pre>';
+ }
+
+ return '<pre><code class="'
+ + this.options.langPrefix
+ + escape(lang, true)
+ + '">'
+ + (escaped ? code : escape(code, true))
+ + '</code></pre>\n';
+ };
+
+ Renderer.prototype.blockquote = function(quote) {
+ return '<blockquote>\n' + quote + '</blockquote>\n';
+ };
+
+ Renderer.prototype.html = function(html) {
+ return html;
+ };
+
+ Renderer.prototype.heading = function(text, level, raw, slugger) {
+ if (this.options.headerIds) {
+ return '<h'
+ + level
+ + ' id="'
+ + this.options.headerPrefix
+ + slugger.slug(raw)
+ + '">'
+ + text
+ + '</h'
+ + level
+ + '>\n';
+ }
+ // ignore IDs
+ return '<h' + level + '>' + text + '</h' + level + '>\n';
+ };
+
+ Renderer.prototype.hr = function() {
+ return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
+ };
+
+ Renderer.prototype.list = function(body, ordered, start) {
+ var type = ordered ? 'ol' : 'ul',
+ startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
+ return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
+ };
+
+ Renderer.prototype.listitem = function(text) {
+ return '<li>' + text + '</li>\n';
+ };
+
+ Renderer.prototype.checkbox = function(checked) {
+ return '<input '
+ + (checked ? 'checked="" ' : '')
+ + 'disabled="" type="checkbox"'
+ + (this.options.xhtml ? ' /' : '')
+ + '> ';
+ };
+
+ Renderer.prototype.paragraph = function(text) {
+ return '<p>' + text + '</p>\n';
+ };
+
+ Renderer.prototype.table = function(header, body) {
+ if (body) body = '<tbody>' + body + '</tbody>';
+
+ return '<table>\n'
+ + '<thead>\n'
+ + header
+ + '</thead>\n'
+ + body
+ + '</table>\n';
+ };
+
+ Renderer.prototype.tablerow = function(content) {
+ return '<tr>\n' + content + '</tr>\n';
+ };
+
+ Renderer.prototype.tablecell = function(content, flags) {
+ var type = flags.header ? 'th' : 'td';
+ var tag = flags.align
+ ? '<' + type + ' align="' + flags.align + '">'
+ : '<' + type + '>';
+ return tag + content + '</' + type + '>\n';
+ };
+
+ // span level renderer
+ Renderer.prototype.strong = function(text) {
+ return '<strong>' + text + '</strong>';
+ };
+
+ Renderer.prototype.em = function(text) {
+ return '<em>' + text + '</em>';
+ };
+
+ Renderer.prototype.codespan = function(text) {
+ return '<code>' + text + '</code>';
+ };
+
+ Renderer.prototype.br = function() {
+ return this.options.xhtml ? '<br/>' : '<br>';
+ };
+
+ Renderer.prototype.del = function(text) {
+ return '<del>' + text + '</del>';
+ };
+
+ Renderer.prototype.link = function(href, title, text) {
+ href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
+ if (href === null) {
+ return text;
+ }
+ var out = '<a href="' + escape(href) + '"';
+ if (title) {
+ out += ' title="' + title + '"';
+ }
+ out += '>' + text + '</a>';
+ return out;
+ };
+
+ Renderer.prototype.image = function(href, title, text) {
+ href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
+ if (href === null) {
+ return text;
+ }
+
+ var out = '<img src="' + href + '" alt="' + text + '"';
+ if (title) {
+ out += ' title="' + title + '"';
+ }
+ out += this.options.xhtml ? '/>' : '>';
+ return out;
+ };
+
+ Renderer.prototype.text = function(text) {
+ return text;
+ };
+
+ /**
+ * TextRenderer
+ * returns only the textual part of the token
+ */
+
+ function TextRenderer() {}
+
+ // no need for block level renderers
+
+ TextRenderer.prototype.strong =
+ TextRenderer.prototype.em =
+ TextRenderer.prototype.codespan =
+ TextRenderer.prototype.del =
+ TextRenderer.prototype.text = function(text) {
+ return text;
+ };
+
+ TextRenderer.prototype.link =
+ TextRenderer.prototype.image = function(href, title, text) {
+ return '' + text;
+ };
+
+ TextRenderer.prototype.br = function() {
+ return '';
+ };
+
+ /**
+ * Parsing & Compiling
+ */
+
+ function Parser(options) {
+ this.tokens = [];
+ this.token = null;
+ this.options = options || marked.defaults;
+ this.options.renderer = this.options.renderer || new Renderer();
+ this.renderer = this.options.renderer;
+ this.renderer.options = this.options;
+ this.slugger = new Slugger();
+ }
+
+ /**
+ * Static Parse Method
+ */
+
+ Parser.parse = function(src, options) {
+ var parser = new Parser(options);
+ return parser.parse(src);
+ };
+
+ /**
+ * Parse Loop
+ */
+
+ Parser.prototype.parse = function(src) {
+ this.inline = new InlineLexer(src.links, this.options);
+ // use an InlineLexer with a TextRenderer to extract pure text
+ this.inlineText = new InlineLexer(
+ src.links,
+ merge({}, this.options, { renderer: new TextRenderer() })
+ );
+ this.tokens = src.reverse();
+
+ var out = '';
+ while (this.next()) {
+ out += this.tok();
+ }
+
+ return out;
+ };
+
+ /**
+ * Next Token
+ */
+
+ Parser.prototype.next = function() {
+ this.token = this.tokens.pop();
+ return this.token;
+ };
+
+ /**
+ * Preview Next Token
+ */
+
+ Parser.prototype.peek = function() {
+ return this.tokens[this.tokens.length - 1] || 0;
+ };
+
+ /**
+ * Parse Text Tokens
+ */
+
+ Parser.prototype.parseText = function() {
+ var body = this.token.text;
+
+ while (this.peek().type === 'text') {
+ body += '\n' + this.next().text;
+ }
+
+ return this.inline.output(body);
+ };
+
+ /**
+ * Parse Current Token
+ */
+
+ Parser.prototype.tok = function() {
+ switch (this.token.type) {
+ case 'space': {
+ return '';
+ }
+ case 'hr': {
+ return this.renderer.hr();
+ }
+ case 'heading': {
+ return this.renderer.heading(
+ this.inline.output(this.token.text),
+ this.token.depth,
+ unescape(this.inlineText.output(this.token.text)),
+ this.slugger);
+ }
+ case 'code': {
+ return this.renderer.code(this.token.text,
+ this.token.lang,
+ this.token.escaped);
+ }
+ case 'table': {
+ var header = '',
+ body = '',
+ i,
+ row,
+ cell,
+ j;
+
+ // header
+ cell = '';
+ for (i = 0; i < this.token.header.length; i++) {
+ cell += this.renderer.tablecell(
+ this.inline.output(this.token.header[i]),
+ { header: true, align: this.token.align[i] }
+ );
+ }
+ header += this.renderer.tablerow(cell);
+
+ for (i = 0; i < this.token.cells.length; i++) {
+ row = this.token.cells[i];
+
+ cell = '';
+ for (j = 0; j < row.length; j++) {
+ cell += this.renderer.tablecell(
+ this.inline.output(row[j]),
+ { header: false, align: this.token.align[j] }
+ );
+ }
+
+ body += this.renderer.tablerow(cell);
+ }
+ return this.renderer.table(header, body);
+ }
+ case 'blockquote_start': {
+ body = '';
+
+ while (this.next().type !== 'blockquote_end') {
+ body += this.tok();
+ }
+
+ return this.renderer.blockquote(body);
+ }
+ case 'list_start': {
+ body = '';
+ var ordered = this.token.ordered,
+ start = this.token.start;
+
+ while (this.next().type !== 'list_end') {
+ body += this.tok();
+ }
+
+ return this.renderer.list(body, ordered, start);
+ }
+ case 'list_item_start': {
+ body = '';
+ var loose = this.token.loose;
+ var checked = this.token.checked;
+ var task = this.token.task;
+
+ if (this.token.task) {
+ body += this.renderer.checkbox(checked);
+ }
+
+ while (this.next().type !== 'list_item_end') {
+ body += !loose && this.token.type === 'text'
+ ? this.parseText()
+ : this.tok();
+ }
+ return this.renderer.listitem(body, task, checked);
+ }
+ case 'html': {
+ // TODO parse inline content if parameter markdown=1
+ return this.renderer.html(this.token.text);
+ }
+ case 'paragraph': {
+ return this.renderer.paragraph(this.inline.output(this.token.text));
+ }
+ case 'text': {
+ return this.renderer.paragraph(this.parseText());
+ }
+ default: {
+ var errMsg = 'Token with "' + this.token.type + '" type was not found.';
+ if (this.options.silent) {
+ console.log(errMsg);
+ } else {
+ throw new Error(errMsg);
+ }
+ }
+ }
+ };
+
+ /**
+ * Slugger generates header id
+ */
+
+ function Slugger() {
+ this.seen = {};
+ }
+
+ /**
+ * Convert string to unique id
+ */
+
+ Slugger.prototype.slug = function(value) {
+ var slug = value
+ .toLowerCase()
+ .trim()
+ .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '')
+ .replace(/\s/g, '-');
+
+ if (this.seen.hasOwnProperty(slug)) {
+ var originalSlug = slug;
+ do {
+ this.seen[originalSlug]++;
+ slug = originalSlug + '-' + this.seen[originalSlug];
+ } while (this.seen.hasOwnProperty(slug));
+ }
+ this.seen[slug] = 0;
+
+ return slug;
+ };
+
+ /**
+ * Helpers
+ */
+
+ function escape(html, encode) {
+ if (encode) {
+ if (escape.escapeTest.test(html)) {
+ return html.replace(escape.escapeReplace, function(ch) { return escape.replacements[ch]; });
+ }
+ } else {
+ if (escape.escapeTestNoEncode.test(html)) {
+ return html.replace(escape.escapeReplaceNoEncode, function(ch) { return escape.replacements[ch]; });
+ }
+ }
+
+ return html;
+ }
+
+ escape.escapeTest = /[&<>"']/;
+ escape.escapeReplace = /[&<>"']/g;
+ escape.replacements = {
+ '&': '&amp;',
+ '<': '&lt;',
+ '>': '&gt;',
+ '"': '&quot;',
+ "'": '&#39;'
+ };
+
+ escape.escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
+ escape.escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
+
+ function unescape(html) {
+ // explicitly match decimal, hex, and named HTML entities
+ return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
+ n = n.toLowerCase();
+ if (n === 'colon') return ':';
+ if (n.charAt(0) === '#') {
+ return n.charAt(1) === 'x'
+ ? String.fromCharCode(parseInt(n.substring(2), 16))
+ : String.fromCharCode(+n.substring(1));
+ }
+ return '';
+ });
+ }
+
+ function edit(regex, opt) {
+ regex = regex.source || regex;
+ opt = opt || '';
+ return {
+ replace: function(name, val) {
+ val = val.source || val;
+ val = val.replace(/(^|[^\[])\^/g, '$1');
+ regex = regex.replace(name, val);
+ return this;
+ },
+ getRegex: function() {
+ return new RegExp(regex, opt);
+ }
+ };
+ }
+
+ function cleanUrl(sanitize, base, href) {
+ if (sanitize) {
+ try {
+ var prot = decodeURIComponent(unescape(href))
+ .replace(/[^\w:]/g, '')
+ .toLowerCase();
+ } catch (e) {
+ return null;
+ }
+ if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
+ return null;
+ }
+ }
+ if (base && !originIndependentUrl.test(href)) {
+ href = resolveUrl(base, href);
+ }
+ try {
+ href = encodeURI(href).replace(/%25/g, '%');
+ } catch (e) {
+ return null;
+ }
+ return href;
+ }
+
+ function resolveUrl(base, href) {
+ if (!baseUrls[' ' + base]) {
+ // we can ignore everything in base after the last slash of its path component,
+ // but we might need to add _that_
+ // https://tools.ietf.org/html/rfc3986#section-3
+ if (/^[^:]+:\/*[^/]*$/.test(base)) {
+ baseUrls[' ' + base] = base + '/';
+ } else {
+ baseUrls[' ' + base] = rtrim(base, '/', true);
+ }
+ }
+ base = baseUrls[' ' + base];
+
+ if (href.slice(0, 2) === '//') {
+ return base.replace(/:[\s\S]*/, ':') + href;
+ } else if (href.charAt(0) === '/') {
+ return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
+ } else {
+ return base + href;
+ }
+ }
+ var baseUrls = {};
+ var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
+
+ function noop() {}
+ noop.exec = noop;
+
+ function merge(obj) {
+ var i = 1,
+ target,
+ key;
+
+ for (; i < arguments.length; i++) {
+ target = arguments[i];
+ for (key in target) {
+ if (Object.prototype.hasOwnProperty.call(target, key)) {
+ obj[key] = target[key];
+ }
+ }
+ }
+
+ return obj;
+ }
+
+ function splitCells(tableRow, count) {
+ // ensure that every cell-delimiting pipe has a space
+ // before it to distinguish it from an escaped pipe
+ var row = tableRow.replace(/\|/g, function(match, offset, str) {
+ var escaped = false,
+ curr = offset;
+ while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
+ if (escaped) {
+ // odd number of slashes means | is escaped
+ // so we leave it alone
+ return '|';
+ } else {
+ // add space before unescaped |
+ return ' |';
+ }
+ }),
+ cells = row.split(/ \|/),
+ i = 0;
+
+ if (cells.length > count) {
+ cells.splice(count);
+ } else {
+ while (cells.length < count) cells.push('');
+ }
+
+ for (; i < cells.length; i++) {
+ // leading or trailing whitespace is ignored per the gfm spec
+ cells[i] = cells[i].trim().replace(/\\\|/g, '|');
+ }
+ return cells;
+ }
+
+ // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
+ // /c*$/ is vulnerable to REDOS.
+ // invert: Remove suffix of non-c chars instead. Default falsey.
+ function rtrim(str, c, invert) {
+ if (str.length === 0) {
+ return '';
+ }
+
+ // Length of suffix matching the invert condition.
+ var suffLen = 0;
+
+ // Step left until we fail to match the invert condition.
+ while (suffLen < str.length) {
+ var currChar = str.charAt(str.length - suffLen - 1);
+ if (currChar === c && !invert) {
+ suffLen++;
+ } else if (currChar !== c && invert) {
+ suffLen++;
+ } else {
+ break;
+ }
+ }
+
+ return str.substr(0, str.length - suffLen);
+ }
+
+ function findClosingBracket(str, b) {
+ if (str.indexOf(b[1]) === -1) {
+ return -1;
+ }
+ var level = 0;
+ for (var i = 0; i < str.length; i++) {
+ if (str[i] === '\\') {
+ i++;
+ } else if (str[i] === b[0]) {
+ level++;
+ } else if (str[i] === b[1]) {
+ level--;
+ if (level < 0) {
+ return i;
+ }
+ }
+ }
+ return -1;
+ }
+
+ function checkSanitizeDeprecation(opt) {
+ if (opt && opt.sanitize && !opt.silent) {
+ console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');
+ }
+ }
+
+ /**
+ * Marked
+ */
+
+ function marked(src, opt, callback) {
+ // throw error in case of non string input
+ if (typeof src === 'undefined' || src === null) {
+ throw new Error('marked(): input parameter is undefined or null');
+ }
+ if (typeof src !== 'string') {
+ throw new Error('marked(): input parameter is of type '
+ + Object.prototype.toString.call(src) + ', string expected');
+ }
+
+ if (callback || typeof opt === 'function') {
+ if (!callback) {
+ callback = opt;
+ opt = null;
+ }
+
+ opt = merge({}, marked.defaults, opt || {});
+ checkSanitizeDeprecation(opt);
+
+ var highlight = opt.highlight,
+ tokens,
+ pending,
+ i = 0;
+
+ try {
+ tokens = Lexer.lex(src, opt);
+ } catch (e) {
+ return callback(e);
+ }
+
+ pending = tokens.length;
+
+ var done = function(err) {
+ if (err) {
+ opt.highlight = highlight;
+ return callback(err);
+ }
+
+ var out;
+
+ try {
+ out = Parser.parse(tokens, opt);
+ } catch (e) {
+ err = e;
+ }
+
+ opt.highlight = highlight;
+
+ return err
+ ? callback(err)
+ : callback(null, out);
+ };
+
+ if (!highlight || highlight.length < 3) {
+ return done();
+ }
+
+ delete opt.highlight;
+
+ if (!pending) return done();
+
+ for (; i < tokens.length; i++) {
+ (function(token) {
+ if (token.type !== 'code') {
+ return --pending || done();
+ }
+ return highlight(token.text, token.lang, function(err, code) {
+ if (err) return done(err);
+ if (code == null || code === token.text) {
+ return --pending || done();
+ }
+ token.text = code;
+ token.escaped = true;
+ --pending || done();
+ });
+ })(tokens[i]);
+ }
+
+ return;
+ }
+ try {
+ if (opt) opt = merge({}, marked.defaults, opt);
+ checkSanitizeDeprecation(opt);
+ return Parser.parse(Lexer.lex(src, opt), opt);
+ } catch (e) {
+ e.message += '\nPlease report this to https://github.com/markedjs/marked.';
+ if ((opt || marked.defaults).silent) {
+ return '<p>An error occurred:</p><pre>'
+ + escape(e.message + '', true)
+ + '</pre>';
+ }
+ throw e;
+ }
+ }
+
+ /**
+ * Options
+ */
+
+ marked.options =
+ marked.setOptions = function(opt) {
+ merge(marked.defaults, opt);
+ return marked;
+ };
+
+ marked.getDefaults = function() {
+ return {
+ baseUrl: null,
+ breaks: false,
+ gfm: true,
+ headerIds: true,
+ headerPrefix: '',
+ highlight: null,
+ langPrefix: 'language-',
+ mangle: true,
+ pedantic: false,
+ renderer: new Renderer(),
+ sanitize: false,
+ sanitizer: null,
+ silent: false,
+ smartLists: false,
+ smartypants: false,
+ xhtml: false
+ };
+ };
+
+ marked.defaults = marked.getDefaults();
+
+ /**
+ * Expose
+ */
+
+ marked.Parser = Parser;
+ marked.parser = Parser.parse;
+
+ marked.Renderer = Renderer;
+ marked.TextRenderer = TextRenderer;
+
+ marked.Lexer = Lexer;
+ marked.lexer = Lexer.lex;
+
+ marked.InlineLexer = InlineLexer;
+ marked.inlineLexer = InlineLexer.output;
+
+ marked.Slugger = Slugger;
+
+ marked.parse = marked;
+
+ if ('object' !== 'undefined' && 'object' === 'object') {
+ module.exports = marked;
+ } else if (typeof undefined === 'function' && undefined.amd) {
+ undefined(function() { return marked; });
+ } else {
+ root.marked = marked;
+ }
+ })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
+ });
+
+ var speakingurl = createCommonjsModule(function (module) {
+ (function (root) {
+ 'use strict';
+
+ /**
+ * charMap
+ * @type {Object}
+ */
+ var charMap = {
+
+ // latin
+ 'À': 'A',
+ 'Á': 'A',
+ 'Â': 'A',
+ 'Ã': 'A',
+ 'Ä': 'Ae',
+ 'Å': 'A',
+ 'Æ': 'AE',
+ 'Ç': 'C',
+ 'È': 'E',
+ 'É': 'E',
+ 'Ê': 'E',
+ 'Ë': 'E',
+ 'Ì': 'I',
+ 'Í': 'I',
+ 'Î': 'I',
+ 'Ï': 'I',
+ 'Ð': 'D',
+ 'Ñ': 'N',
+ 'Ò': 'O',
+ 'Ó': 'O',
+ 'Ô': 'O',
+ 'Õ': 'O',
+ 'Ö': 'Oe',
+ 'Ő': 'O',
+ 'Ø': 'O',
+ 'Ù': 'U',
+ 'Ú': 'U',
+ 'Û': 'U',
+ 'Ü': 'Ue',
+ 'Ű': 'U',
+ 'Ý': 'Y',
+ 'Þ': 'TH',
+ 'ß': 'ss',
+ 'à': 'a',
+ 'á': 'a',
+ 'â': 'a',
+ 'ã': 'a',
+ 'ä': 'ae',
+ 'å': 'a',
+ 'æ': 'ae',
+ 'ç': 'c',
+ 'è': 'e',
+ 'é': 'e',
+ 'ê': 'e',
+ 'ë': 'e',
+ 'ì': 'i',
+ 'í': 'i',
+ 'î': 'i',
+ 'ï': 'i',
+ 'ð': 'd',
+ 'ñ': 'n',
+ 'ò': 'o',
+ 'ó': 'o',
+ 'ô': 'o',
+ 'õ': 'o',
+ 'ö': 'oe',
+ 'ő': 'o',
+ 'ø': 'o',
+ 'ù': 'u',
+ 'ú': 'u',
+ 'û': 'u',
+ 'ü': 'ue',
+ 'ű': 'u',
+ 'ý': 'y',
+ 'þ': 'th',
+ 'ÿ': 'y',
+ 'ẞ': 'SS',
+
+ // language specific
+
+ // Arabic
+ 'ا': 'a',
+ 'أ': 'a',
+ 'إ': 'i',
+ 'آ': 'aa',
+ 'ؤ': 'u',
+ 'ئ': 'e',
+ 'ء': 'a',
+ 'ب': 'b',
+ 'ت': 't',
+ 'ث': 'th',
+ 'ج': 'j',
+ 'ح': 'h',
+ 'خ': 'kh',
+ 'د': 'd',
+ 'ذ': 'th',
+ 'ر': 'r',
+ 'ز': 'z',
+ 'س': 's',
+ 'ش': 'sh',
+ 'ص': 's',
+ 'ض': 'dh',
+ 'ط': 't',
+ 'ظ': 'z',
+ 'ع': 'a',
+ 'غ': 'gh',
+ 'ف': 'f',
+ 'ق': 'q',
+ 'ك': 'k',
+ 'ل': 'l',
+ 'م': 'm',
+ 'ن': 'n',
+ 'ه': 'h',
+ 'و': 'w',
+ 'ي': 'y',
+ 'ى': 'a',
+ 'ة': 'h',
+ 'ﻻ': 'la',
+ 'ﻷ': 'laa',
+ 'ﻹ': 'lai',
+ 'ﻵ': 'laa',
+
+ // Persian additional characters than Arabic
+ 'گ': 'g',
+ 'چ': 'ch',
+ 'پ': 'p',
+ 'ژ': 'zh',
+ 'ک': 'k',
+ 'ی': 'y',
+
+ // Arabic diactrics
+ 'َ': 'a',
+ 'ً': 'an',
+ 'ِ': 'e',
+ 'ٍ': 'en',
+ 'ُ': 'u',
+ 'ٌ': 'on',
+ 'ْ': '',
+
+ // Arabic numbers
+ '٠': '0',
+ '١': '1',
+ '٢': '2',
+ '٣': '3',
+ '٤': '4',
+ '٥': '5',
+ '٦': '6',
+ '٧': '7',
+ '٨': '8',
+ '٩': '9',
+
+ // Persian numbers
+ '۰': '0',
+ '۱': '1',
+ '۲': '2',
+ '۳': '3',
+ '۴': '4',
+ '۵': '5',
+ '۶': '6',
+ '۷': '7',
+ '۸': '8',
+ '۹': '9',
+
+ // Burmese consonants
+ 'က': 'k',
+ 'ခ': 'kh',
+ 'ဂ': 'g',
+ 'ဃ': 'ga',
+ 'င': 'ng',
+ 'စ': 's',
+ 'ဆ': 'sa',
+ 'ဇ': 'z',
+ 'စျ': 'za',
+ 'ည': 'ny',
+ 'ဋ': 't',
+ 'ဌ': 'ta',
+ 'ဍ': 'd',
+ 'ဎ': 'da',
+ 'ဏ': 'na',
+ 'တ': 't',
+ 'ထ': 'ta',
+ 'ဒ': 'd',
+ 'ဓ': 'da',
+ 'န': 'n',
+ 'ပ': 'p',
+ 'ဖ': 'pa',
+ 'ဗ': 'b',
+ 'ဘ': 'ba',
+ 'မ': 'm',
+ 'ယ': 'y',
+ 'ရ': 'ya',
+ 'လ': 'l',
+ 'ဝ': 'w',
+ 'သ': 'th',
+ 'ဟ': 'h',
+ 'ဠ': 'la',
+ 'အ': 'a',
+ // consonant character combos
+ 'ြ': 'y',
+ 'ျ': 'ya',
+ 'ွ': 'w',
+ 'ြွ': 'yw',
+ 'ျွ': 'ywa',
+ 'ှ': 'h',
+ // independent vowels
+ 'ဧ': 'e',
+ '၏': '-e',
+ 'ဣ': 'i',
+ 'ဤ': '-i',
+ 'ဉ': 'u',
+ 'ဦ': '-u',
+ 'ဩ': 'aw',
+ 'သြော': 'aw',
+ 'ဪ': 'aw',
+ // numbers
+ '၀': '0',
+ '၁': '1',
+ '၂': '2',
+ '၃': '3',
+ '၄': '4',
+ '၅': '5',
+ '၆': '6',
+ '၇': '7',
+ '၈': '8',
+ '၉': '9',
+ // virama and tone marks which are silent in transliteration
+ '္': '',
+ '့': '',
+ 'း': '',
+
+ // Czech
+ 'č': 'c',
+ 'ď': 'd',
+ 'ě': 'e',
+ 'ň': 'n',
+ 'ř': 'r',
+ 'š': 's',
+ 'ť': 't',
+ 'ů': 'u',
+ 'ž': 'z',
+ 'Č': 'C',
+ 'Ď': 'D',
+ 'Ě': 'E',
+ 'Ň': 'N',
+ 'Ř': 'R',
+ 'Š': 'S',
+ 'Ť': 'T',
+ 'Ů': 'U',
+ 'Ž': 'Z',
+
+ // Dhivehi
+ 'ހ': 'h',
+ 'ށ': 'sh',
+ 'ނ': 'n',
+ 'ރ': 'r',
+ 'ބ': 'b',
+ 'ޅ': 'lh',
+ 'ކ': 'k',
+ 'އ': 'a',
+ 'ވ': 'v',
+ 'މ': 'm',
+ 'ފ': 'f',
+ 'ދ': 'dh',
+ 'ތ': 'th',
+ 'ލ': 'l',
+ 'ގ': 'g',
+ 'ޏ': 'gn',
+ 'ސ': 's',
+ 'ޑ': 'd',
+ 'ޒ': 'z',
+ 'ޓ': 't',
+ 'ޔ': 'y',
+ 'ޕ': 'p',
+ 'ޖ': 'j',
+ 'ޗ': 'ch',
+ 'ޘ': 'tt',
+ 'ޙ': 'hh',
+ 'ޚ': 'kh',
+ 'ޛ': 'th',
+ 'ޜ': 'z',
+ 'ޝ': 'sh',
+ 'ޞ': 's',
+ 'ޟ': 'd',
+ 'ޠ': 't',
+ 'ޡ': 'z',
+ 'ޢ': 'a',
+ 'ޣ': 'gh',
+ 'ޤ': 'q',
+ 'ޥ': 'w',
+ 'ަ': 'a',
+ 'ާ': 'aa',
+ 'ި': 'i',
+ 'ީ': 'ee',
+ 'ު': 'u',
+ 'ޫ': 'oo',
+ 'ެ': 'e',
+ 'ޭ': 'ey',
+ 'ޮ': 'o',
+ 'ޯ': 'oa',
+ 'ް': '',
+
+ // Georgian https://en.wikipedia.org/wiki/Romanization_of_Georgian
+ // National system (2002)
+ 'ა': 'a',
+ 'ბ': 'b',
+ 'გ': 'g',
+ 'დ': 'd',
+ 'ე': 'e',
+ 'ვ': 'v',
+ 'ზ': 'z',
+ 'თ': 't',
+ 'ი': 'i',
+ 'კ': 'k',
+ 'ლ': 'l',
+ 'მ': 'm',
+ 'ნ': 'n',
+ 'ო': 'o',
+ 'პ': 'p',
+ 'ჟ': 'zh',
+ 'რ': 'r',
+ 'ს': 's',
+ 'ტ': 't',
+ 'უ': 'u',
+ 'ფ': 'p',
+ 'ქ': 'k',
+ 'ღ': 'gh',
+ 'ყ': 'q',
+ 'შ': 'sh',
+ 'ჩ': 'ch',
+ 'ც': 'ts',
+ 'ძ': 'dz',
+ 'წ': 'ts',
+ 'ჭ': 'ch',
+ 'ხ': 'kh',
+ 'ჯ': 'j',
+ 'ჰ': 'h',
+
+ // Greek
+ 'α': 'a',
+ 'β': 'v',
+ 'γ': 'g',
+ 'δ': 'd',
+ 'ε': 'e',
+ 'ζ': 'z',
+ 'η': 'i',
+ 'θ': 'th',
+ 'ι': 'i',
+ 'κ': 'k',
+ 'λ': 'l',
+ 'μ': 'm',
+ 'ν': 'n',
+ 'ξ': 'ks',
+ 'ο': 'o',
+ 'π': 'p',
+ 'ρ': 'r',
+ 'σ': 's',
+ 'τ': 't',
+ 'υ': 'y',
+ 'φ': 'f',
+ 'χ': 'x',
+ 'ψ': 'ps',
+ 'ω': 'o',
+ 'ά': 'a',
+ 'έ': 'e',
+ 'ί': 'i',
+ 'ό': 'o',
+ 'ύ': 'y',
+ 'ή': 'i',
+ 'ώ': 'o',
+ 'ς': 's',
+ 'ϊ': 'i',
+ 'ΰ': 'y',
+ 'ϋ': 'y',
+ 'ΐ': 'i',
+ 'Α': 'A',
+ 'Β': 'B',
+ 'Γ': 'G',
+ 'Δ': 'D',
+ 'Ε': 'E',
+ 'Ζ': 'Z',
+ 'Η': 'I',
+ 'Θ': 'TH',
+ 'Ι': 'I',
+ 'Κ': 'K',
+ 'Λ': 'L',
+ 'Μ': 'M',
+ 'Ν': 'N',
+ 'Ξ': 'KS',
+ 'Ο': 'O',
+ 'Π': 'P',
+ 'Ρ': 'R',
+ 'Σ': 'S',
+ 'Τ': 'T',
+ 'Υ': 'Y',
+ 'Φ': 'F',
+ 'Χ': 'X',
+ 'Ψ': 'PS',
+ 'Ω': 'O',
+ 'Ά': 'A',
+ 'Έ': 'E',
+ 'Ί': 'I',
+ 'Ό': 'O',
+ 'Ύ': 'Y',
+ 'Ή': 'I',
+ 'Ώ': 'O',
+ 'Ϊ': 'I',
+ 'Ϋ': 'Y',
+
+ // Latvian
+ 'ā': 'a',
+ // 'č': 'c', // duplicate
+ 'ē': 'e',
+ 'ģ': 'g',
+ 'ī': 'i',
+ 'ķ': 'k',
+ 'ļ': 'l',
+ 'ņ': 'n',
+ // 'š': 's', // duplicate
+ 'ū': 'u',
+ // 'ž': 'z', // duplicate
+ 'Ā': 'A',
+ // 'Č': 'C', // duplicate
+ 'Ē': 'E',
+ 'Ģ': 'G',
+ 'Ī': 'I',
+ 'Ķ': 'k',
+ 'Ļ': 'L',
+ 'Ņ': 'N',
+ // 'Š': 'S', // duplicate
+ 'Ū': 'U',
+ // 'Ž': 'Z', // duplicate
+
+ // Macedonian
+ 'Ќ': 'Kj',
+ 'ќ': 'kj',
+ 'Љ': 'Lj',
+ 'љ': 'lj',
+ 'Њ': 'Nj',
+ 'њ': 'nj',
+ 'Тс': 'Ts',
+ 'тс': 'ts',
+
+ // Polish
+ 'ą': 'a',
+ 'ć': 'c',
+ 'ę': 'e',
+ 'ł': 'l',
+ 'ń': 'n',
+ // 'ó': 'o', // duplicate
+ 'ś': 's',
+ 'ź': 'z',
+ 'ż': 'z',
+ 'Ą': 'A',
+ 'Ć': 'C',
+ 'Ę': 'E',
+ 'Ł': 'L',
+ 'Ń': 'N',
+ 'Ś': 'S',
+ 'Ź': 'Z',
+ 'Ż': 'Z',
+
+ // Ukranian
+ 'Є': 'Ye',
+ 'І': 'I',
+ 'Ї': 'Yi',
+ 'Ґ': 'G',
+ 'є': 'ye',
+ 'і': 'i',
+ 'ї': 'yi',
+ 'ґ': 'g',
+
+ // Romanian
+ 'ă': 'a',
+ 'Ă': 'A',
+ 'ș': 's',
+ 'Ș': 'S',
+ // 'ş': 's', // duplicate
+ // 'Ş': 'S', // duplicate
+ 'ț': 't',
+ 'Ț': 'T',
+ 'ţ': 't',
+ 'Ţ': 'T',
+
+ // Russian https://en.wikipedia.org/wiki/Romanization_of_Russian
+ // ICAO
+
+ 'а': 'a',
+ 'б': 'b',
+ 'в': 'v',
+ 'г': 'g',
+ 'д': 'd',
+ 'е': 'e',
+ 'ё': 'yo',
+ 'ж': 'zh',
+ 'з': 'z',
+ 'и': 'i',
+ 'й': 'i',
+ 'к': 'k',
+ 'л': 'l',
+ 'м': 'm',
+ 'н': 'n',
+ 'о': 'o',
+ 'п': 'p',
+ 'р': 'r',
+ 'с': 's',
+ 'т': 't',
+ 'у': 'u',
+ 'ф': 'f',
+ 'х': 'kh',
+ 'ц': 'c',
+ 'ч': 'ch',
+ 'ш': 'sh',
+ 'щ': 'sh',
+ 'ъ': '',
+ 'ы': 'y',
+ 'ь': '',
+ 'э': 'e',
+ 'ю': 'yu',
+ 'я': 'ya',
+ 'А': 'A',
+ 'Б': 'B',
+ 'В': 'V',
+ 'Г': 'G',
+ 'Д': 'D',
+ 'Е': 'E',
+ 'Ё': 'Yo',
+ 'Ж': 'Zh',
+ 'З': 'Z',
+ 'И': 'I',
+ 'Й': 'I',
+ 'К': 'K',
+ 'Л': 'L',
+ 'М': 'M',
+ 'Н': 'N',
+ 'О': 'O',
+ 'П': 'P',
+ 'Р': 'R',
+ 'С': 'S',
+ 'Т': 'T',
+ 'У': 'U',
+ 'Ф': 'F',
+ 'Х': 'Kh',
+ 'Ц': 'C',
+ 'Ч': 'Ch',
+ 'Ш': 'Sh',
+ 'Щ': 'Sh',
+ 'Ъ': '',
+ 'Ы': 'Y',
+ 'Ь': '',
+ 'Э': 'E',
+ 'Ю': 'Yu',
+ 'Я': 'Ya',
+
+ // Serbian
+ 'ђ': 'dj',
+ 'ј': 'j',
+ // 'љ': 'lj', // duplicate
+ // 'њ': 'nj', // duplicate
+ 'ћ': 'c',
+ 'џ': 'dz',
+ 'Ђ': 'Dj',
+ 'Ј': 'j',
+ // 'Љ': 'Lj', // duplicate
+ // 'Њ': 'Nj', // duplicate
+ 'Ћ': 'C',
+ 'Џ': 'Dz',
+
+ // Slovak
+ 'ľ': 'l',
+ 'ĺ': 'l',
+ 'ŕ': 'r',
+ 'Ľ': 'L',
+ 'Ĺ': 'L',
+ 'Ŕ': 'R',
+
+ // Turkish
+ 'ş': 's',
+ 'Ş': 'S',
+ 'ı': 'i',
+ 'İ': 'I',
+ // 'ç': 'c', // duplicate
+ // 'Ç': 'C', // duplicate
+ // 'ü': 'u', // duplicate, see langCharMap
+ // 'Ü': 'U', // duplicate, see langCharMap
+ // 'ö': 'o', // duplicate, see langCharMap
+ // 'Ö': 'O', // duplicate, see langCharMap
+ 'ğ': 'g',
+ 'Ğ': 'G',
+
+ // Vietnamese
+ 'ả': 'a',
+ 'Ả': 'A',
+ 'ẳ': 'a',
+ 'Ẳ': 'A',
+ 'ẩ': 'a',
+ 'Ẩ': 'A',
+ 'đ': 'd',
+ 'Đ': 'D',
+ 'ẹ': 'e',
+ 'Ẹ': 'E',
+ 'ẽ': 'e',
+ 'Ẽ': 'E',
+ 'ẻ': 'e',
+ 'Ẻ': 'E',
+ 'ế': 'e',
+ 'Ế': 'E',
+ 'ề': 'e',
+ 'Ề': 'E',
+ 'ệ': 'e',
+ 'Ệ': 'E',
+ 'ễ': 'e',
+ 'Ễ': 'E',
+ 'ể': 'e',
+ 'Ể': 'E',
+ 'ỏ': 'o',
+ 'ọ': 'o',
+ 'Ọ': 'o',
+ 'ố': 'o',
+ 'Ố': 'O',
+ 'ồ': 'o',
+ 'Ồ': 'O',
+ 'ổ': 'o',
+ 'Ổ': 'O',
+ 'ộ': 'o',
+ 'Ộ': 'O',
+ 'ỗ': 'o',
+ 'Ỗ': 'O',
+ 'ơ': 'o',
+ 'Ơ': 'O',
+ 'ớ': 'o',
+ 'Ớ': 'O',
+ 'ờ': 'o',
+ 'Ờ': 'O',
+ 'ợ': 'o',
+ 'Ợ': 'O',
+ 'ỡ': 'o',
+ 'Ỡ': 'O',
+ 'Ở': 'o',
+ 'ở': 'o',
+ 'ị': 'i',
+ 'Ị': 'I',
+ 'ĩ': 'i',
+ 'Ĩ': 'I',
+ 'ỉ': 'i',
+ 'Ỉ': 'i',
+ 'ủ': 'u',
+ 'Ủ': 'U',
+ 'ụ': 'u',
+ 'Ụ': 'U',
+ 'ũ': 'u',
+ 'Ũ': 'U',
+ 'ư': 'u',
+ 'Ư': 'U',
+ 'ứ': 'u',
+ 'Ứ': 'U',
+ 'ừ': 'u',
+ 'Ừ': 'U',
+ 'ự': 'u',
+ 'Ự': 'U',
+ 'ữ': 'u',
+ 'Ữ': 'U',
+ 'ử': 'u',
+ 'Ử': 'ư',
+ 'ỷ': 'y',
+ 'Ỷ': 'y',
+ 'ỳ': 'y',
+ 'Ỳ': 'Y',
+ 'ỵ': 'y',
+ 'Ỵ': 'Y',
+ 'ỹ': 'y',
+ 'Ỹ': 'Y',
+ 'ạ': 'a',
+ 'Ạ': 'A',
+ 'ấ': 'a',
+ 'Ấ': 'A',
+ 'ầ': 'a',
+ 'Ầ': 'A',
+ 'ậ': 'a',
+ 'Ậ': 'A',
+ 'ẫ': 'a',
+ 'Ẫ': 'A',
+ // 'ă': 'a', // duplicate
+ // 'Ă': 'A', // duplicate
+ 'ắ': 'a',
+ 'Ắ': 'A',
+ 'ằ': 'a',
+ 'Ằ': 'A',
+ 'ặ': 'a',
+ 'Ặ': 'A',
+ 'ẵ': 'a',
+ 'Ẵ': 'A',
+ "⓪": "0",
+ "①": "1",
+ "②": "2",
+ "③": "3",
+ "④": "4",
+ "⑤": "5",
+ "⑥": "6",
+ "⑦": "7",
+ "⑧": "8",
+ "⑨": "9",
+ "⑩": "10",
+ "⑪": "11",
+ "⑫": "12",
+ "⑬": "13",
+ "⑭": "14",
+ "⑮": "15",
+ "⑯": "16",
+ "⑰": "17",
+ "⑱": "18",
+ "⑲": "18",
+ "⑳": "18",
+
+ "⓵": "1",
+ "⓶": "2",
+ "⓷": "3",
+ "⓸": "4",
+ "⓹": "5",
+ "⓺": "6",
+ "⓻": "7",
+ "⓼": "8",
+ "⓽": "9",
+ "⓾": "10",
+
+ "⓿": "0",
+ "⓫": "11",
+ "⓬": "12",
+ "⓭": "13",
+ "⓮": "14",
+ "⓯": "15",
+ "⓰": "16",
+ "⓱": "17",
+ "⓲": "18",
+ "⓳": "19",
+ "⓴": "20",
+
+ "Ⓐ": "A",
+ "Ⓑ": "B",
+ "Ⓒ": "C",
+ "Ⓓ": "D",
+ "Ⓔ": "E",
+ "Ⓕ": "F",
+ "Ⓖ": "G",
+ "Ⓗ": "H",
+ "Ⓘ": "I",
+ "Ⓙ": "J",
+ "Ⓚ": "K",
+ "Ⓛ": "L",
+ "Ⓜ": "M",
+ "Ⓝ": "N",
+ "Ⓞ": "O",
+ "Ⓟ": "P",
+ "Ⓠ": "Q",
+ "Ⓡ": "R",
+ "Ⓢ": "S",
+ "Ⓣ": "T",
+ "Ⓤ": "U",
+ "Ⓥ": "V",
+ "Ⓦ": "W",
+ "Ⓧ": "X",
+ "Ⓨ": "Y",
+ "Ⓩ": "Z",
+
+ "ⓐ": "a",
+ "ⓑ": "b",
+ "ⓒ": "c",
+ "ⓓ": "d",
+ "ⓔ": "e",
+ "ⓕ": "f",
+ "ⓖ": "g",
+ "ⓗ": "h",
+ "ⓘ": "i",
+ "ⓙ": "j",
+ "ⓚ": "k",
+ "ⓛ": "l",
+ "ⓜ": "m",
+ "ⓝ": "n",
+ "ⓞ": "o",
+ "ⓟ": "p",
+ "ⓠ": "q",
+ "ⓡ": "r",
+ "ⓢ": "s",
+ "ⓣ": "t",
+ "ⓤ": "u",
+ "ⓦ": "v",
+ "ⓥ": "w",
+ "ⓧ": "x",
+ "ⓨ": "y",
+ "ⓩ": "z",
+
+ // symbols
+ '“': '"',
+ '”': '"',
+ '‘': "'",
+ '’': "'",
+ '∂': 'd',
+ 'ƒ': 'f',
+ '™': '(TM)',
+ '©': '(C)',
+ 'œ': 'oe',
+ 'Œ': 'OE',
+ '®': '(R)',
+ '†': '+',
+ '℠': '(SM)',
+ '…': '...',
+ '˚': 'o',
+ 'º': 'o',
+ 'ª': 'a',
+ '•': '*',
+ '၊': ',',
+ '။': '.',
+
+ // currency
+ '$': 'USD',
+ '€': 'EUR',
+ '₢': 'BRN',
+ '₣': 'FRF',
+ '£': 'GBP',
+ '₤': 'ITL',
+ '₦': 'NGN',
+ '₧': 'ESP',
+ '₩': 'KRW',
+ '₪': 'ILS',
+ '₫': 'VND',
+ '₭': 'LAK',
+ '₮': 'MNT',
+ '₯': 'GRD',
+ '₱': 'ARS',
+ '₲': 'PYG',
+ '₳': 'ARA',
+ '₴': 'UAH',
+ '₵': 'GHS',
+ '¢': 'cent',
+ '¥': 'CNY',
+ '元': 'CNY',
+ '円': 'YEN',
+ '﷼': 'IRR',
+ '₠': 'EWE',
+ '฿': 'THB',
+ '₨': 'INR',
+ '₹': 'INR',
+ '₰': 'PF',
+ '₺': 'TRY',
+ '؋': 'AFN',
+ '₼': 'AZN',
+ 'лв': 'BGN',
+ '៛': 'KHR',
+ '₡': 'CRC',
+ '₸': 'KZT',
+ 'ден': 'MKD',
+ 'zł': 'PLN',
+ '₽': 'RUB',
+ '₾': 'GEL'
+
+ };
+
+ /**
+ * special look ahead character array
+ * These characters form with consonants to become 'single'/consonant combo
+ * @type [Array]
+ */
+ var lookAheadCharArray = [
+ // burmese
+ '်',
+
+ // Dhivehi
+ 'ް'
+ ];
+
+ /**
+ * diatricMap for languages where transliteration changes entirely as more diatrics are added
+ * @type {Object}
+ */
+ var diatricMap = {
+ // Burmese
+ // dependent vowels
+ 'ာ': 'a',
+ 'ါ': 'a',
+ 'ေ': 'e',
+ 'ဲ': 'e',
+ 'ိ': 'i',
+ 'ီ': 'i',
+ 'ို': 'o',
+ 'ု': 'u',
+ 'ူ': 'u',
+ 'ေါင်': 'aung',
+ 'ော': 'aw',
+ 'ော်': 'aw',
+ 'ေါ': 'aw',
+ 'ေါ်': 'aw',
+ '်': '်', // this is special case but the character will be converted to latin in the code
+ 'က်': 'et',
+ 'ိုက်': 'aik',
+ 'ောက်': 'auk',
+ 'င်': 'in',
+ 'ိုင်': 'aing',
+ 'ောင်': 'aung',
+ 'စ်': 'it',
+ 'ည်': 'i',
+ 'တ်': 'at',
+ 'ိတ်': 'eik',
+ 'ုတ်': 'ok',
+ 'ွတ်': 'ut',
+ 'ေတ်': 'it',
+ 'ဒ်': 'd',
+ 'ိုဒ်': 'ok',
+ 'ုဒ်': 'ait',
+ 'န်': 'an',
+ 'ာန်': 'an',
+ 'ိန်': 'ein',
+ 'ုန်': 'on',
+ 'ွန်': 'un',
+ 'ပ်': 'at',
+ 'ိပ်': 'eik',
+ 'ုပ်': 'ok',
+ 'ွပ်': 'ut',
+ 'န်ုပ်': 'nub',
+ 'မ်': 'an',
+ 'ိမ်': 'ein',
+ 'ုမ်': 'on',
+ 'ွမ်': 'un',
+ 'ယ်': 'e',
+ 'ိုလ်': 'ol',
+ 'ဉ်': 'in',
+ 'ံ': 'an',
+ 'ိံ': 'ein',
+ 'ုံ': 'on',
+
+ // Dhivehi
+ 'ައް': 'ah',
+ 'ަށް': 'ah'
+ };
+
+ /**
+ * langCharMap language specific characters translations
+ * @type {Object}
+ */
+ var langCharMap = {
+ 'en': {}, // default language
+
+ 'az': { // Azerbaijani
+ 'ç': 'c',
+ 'ə': 'e',
+ 'ğ': 'g',
+ 'ı': 'i',
+ 'ö': 'o',
+ 'ş': 's',
+ 'ü': 'u',
+ 'Ç': 'C',
+ 'Ə': 'E',
+ 'Ğ': 'G',
+ 'İ': 'I',
+ 'Ö': 'O',
+ 'Ş': 'S',
+ 'Ü': 'U'
+ },
+
+ 'cs': { // Czech
+ 'č': 'c',
+ 'ď': 'd',
+ 'ě': 'e',
+ 'ň': 'n',
+ 'ř': 'r',
+ 'š': 's',
+ 'ť': 't',
+ 'ů': 'u',
+ 'ž': 'z',
+ 'Č': 'C',
+ 'Ď': 'D',
+ 'Ě': 'E',
+ 'Ň': 'N',
+ 'Ř': 'R',
+ 'Š': 'S',
+ 'Ť': 'T',
+ 'Ů': 'U',
+ 'Ž': 'Z'
+ },
+
+ 'fi': { // Finnish
+ // 'å': 'a', duplicate see charMap/latin
+ // 'Å': 'A', duplicate see charMap/latin
+ 'ä': 'a', // ok
+ 'Ä': 'A', // ok
+ 'ö': 'o', // ok
+ 'Ö': 'O' // ok
+ },
+
+ 'hu': { // Hungarian
+ 'ä': 'a', // ok
+ 'Ä': 'A', // ok
+ // 'á': 'a', duplicate see charMap/latin
+ // 'Á': 'A', duplicate see charMap/latin
+ 'ö': 'o', // ok
+ 'Ö': 'O', // ok
+ // 'ő': 'o', duplicate see charMap/latin
+ // 'Ő': 'O', duplicate see charMap/latin
+ 'ü': 'u',
+ 'Ü': 'U',
+ 'ű': 'u',
+ 'Ű': 'U'
+ },
+
+ 'lt': { // Lithuanian
+ 'ą': 'a',
+ 'č': 'c',
+ 'ę': 'e',
+ 'ė': 'e',
+ 'į': 'i',
+ 'š': 's',
+ 'ų': 'u',
+ 'ū': 'u',
+ 'ž': 'z',
+ 'Ą': 'A',
+ 'Č': 'C',
+ 'Ę': 'E',
+ 'Ė': 'E',
+ 'Į': 'I',
+ 'Š': 'S',
+ 'Ų': 'U',
+ 'Ū': 'U'
+ },
+
+ 'lv': { // Latvian
+ 'ā': 'a',
+ 'č': 'c',
+ 'ē': 'e',
+ 'ģ': 'g',
+ 'ī': 'i',
+ 'ķ': 'k',
+ 'ļ': 'l',
+ 'ņ': 'n',
+ 'š': 's',
+ 'ū': 'u',
+ 'ž': 'z',
+ 'Ā': 'A',
+ 'Č': 'C',
+ 'Ē': 'E',
+ 'Ģ': 'G',
+ 'Ī': 'i',
+ 'Ķ': 'k',
+ 'Ļ': 'L',
+ 'Ņ': 'N',
+ 'Š': 'S',
+ 'Ū': 'u',
+ 'Ž': 'Z'
+ },
+
+ 'pl': { // Polish
+ 'ą': 'a',
+ 'ć': 'c',
+ 'ę': 'e',
+ 'ł': 'l',
+ 'ń': 'n',
+ 'ó': 'o',
+ 'ś': 's',
+ 'ź': 'z',
+ 'ż': 'z',
+ 'Ą': 'A',
+ 'Ć': 'C',
+ 'Ę': 'e',
+ 'Ł': 'L',
+ 'Ń': 'N',
+ 'Ó': 'O',
+ 'Ś': 'S',
+ 'Ź': 'Z',
+ 'Ż': 'Z'
+ },
+
+ 'sv': { // Swedish
+ // 'å': 'a', duplicate see charMap/latin
+ // 'Å': 'A', duplicate see charMap/latin
+ 'ä': 'a', // ok
+ 'Ä': 'A', // ok
+ 'ö': 'o', // ok
+ 'Ö': 'O' // ok
+ },
+
+ 'sk': { // Slovak
+ 'ä': 'a',
+ 'Ä': 'A'
+ },
+
+ 'sr': { // Serbian
+ 'љ': 'lj',
+ 'њ': 'nj',
+ 'Љ': 'Lj',
+ 'Њ': 'Nj',
+ 'đ': 'dj',
+ 'Đ': 'Dj'
+ },
+
+ 'tr': { // Turkish
+ 'Ü': 'U',
+ 'Ö': 'O',
+ 'ü': 'u',
+ 'ö': 'o'
+ }
+ };
+
+ /**
+ * symbolMap language specific symbol translations
+ * translations must be transliterated already
+ * @type {Object}
+ */
+ var symbolMap = {
+ 'ar': {
+ '∆': 'delta',
+ '∞': 'la-nihaya',
+ '♥': 'hob',
+ '&': 'wa',
+ '|': 'aw',
+ '<': 'aqal-men',
+ '>': 'akbar-men',
+ '∑': 'majmou',
+ '¤': 'omla'
+ },
+
+ 'az': {},
+
+ 'ca': {
+ '∆': 'delta',
+ '∞': 'infinit',
+ '♥': 'amor',
+ '&': 'i',
+ '|': 'o',
+ '<': 'menys que',
+ '>': 'mes que',
+ '∑': 'suma dels',
+ '¤': 'moneda'
+ },
+
+ 'cs': {
+ '∆': 'delta',
+ '∞': 'nekonecno',
+ '♥': 'laska',
+ '&': 'a',
+ '|': 'nebo',
+ '<': 'mensi nez',
+ '>': 'vetsi nez',
+ '∑': 'soucet',
+ '¤': 'mena'
+ },
+
+ 'de': {
+ '∆': 'delta',
+ '∞': 'unendlich',
+ '♥': 'Liebe',
+ '&': 'und',
+ '|': 'oder',
+ '<': 'kleiner als',
+ '>': 'groesser als',
+ '∑': 'Summe von',
+ '¤': 'Waehrung'
+ },
+
+ 'dv': {
+ '∆': 'delta',
+ '∞': 'kolunulaa',
+ '♥': 'loabi',
+ '&': 'aai',
+ '|': 'noonee',
+ '<': 'ah vure kuda',
+ '>': 'ah vure bodu',
+ '∑': 'jumula',
+ '¤': 'faisaa'
+ },
+
+ 'en': {
+ '∆': 'delta',
+ '∞': 'infinity',
+ '♥': 'love',
+ '&': 'and',
+ '|': 'or',
+ '<': 'less than',
+ '>': 'greater than',
+ '∑': 'sum',
+ '¤': 'currency'
+ },
+
+ 'es': {
+ '∆': 'delta',
+ '∞': 'infinito',
+ '♥': 'amor',
+ '&': 'y',
+ '|': 'u',
+ '<': 'menos que',
+ '>': 'mas que',
+ '∑': 'suma de los',
+ '¤': 'moneda'
+ },
+
+ 'fa': {
+ '∆': 'delta',
+ '∞': 'bi-nahayat',
+ '♥': 'eshgh',
+ '&': 'va',
+ '|': 'ya',
+ '<': 'kamtar-az',
+ '>': 'bishtar-az',
+ '∑': 'majmooe',
+ '¤': 'vahed'
+ },
+
+ 'fi': {
+ '∆': 'delta',
+ '∞': 'aarettomyys',
+ '♥': 'rakkaus',
+ '&': 'ja',
+ '|': 'tai',
+ '<': 'pienempi kuin',
+ '>': 'suurempi kuin',
+ '∑': 'summa',
+ '¤': 'valuutta'
+ },
+
+ 'fr': {
+ '∆': 'delta',
+ '∞': 'infiniment',
+ '♥': 'Amour',
+ '&': 'et',
+ '|': 'ou',
+ '<': 'moins que',
+ '>': 'superieure a',
+ '∑': 'somme des',
+ '¤': 'monnaie'
+ },
+
+ 'ge': {
+ '∆': 'delta',
+ '∞': 'usasruloba',
+ '♥': 'siqvaruli',
+ '&': 'da',
+ '|': 'an',
+ '<': 'naklebi',
+ '>': 'meti',
+ '∑': 'jami',
+ '¤': 'valuta'
+ },
+
+ 'gr': {},
+
+ 'hu': {
+ '∆': 'delta',
+ '∞': 'vegtelen',
+ '♥': 'szerelem',
+ '&': 'es',
+ '|': 'vagy',
+ '<': 'kisebb mint',
+ '>': 'nagyobb mint',
+ '∑': 'szumma',
+ '¤': 'penznem'
+ },
+
+ 'it': {
+ '∆': 'delta',
+ '∞': 'infinito',
+ '♥': 'amore',
+ '&': 'e',
+ '|': 'o',
+ '<': 'minore di',
+ '>': 'maggiore di',
+ '∑': 'somma',
+ '¤': 'moneta'
+ },
+
+ 'lt': {
+ '∆': 'delta',
+ '∞': 'begalybe',
+ '♥': 'meile',
+ '&': 'ir',
+ '|': 'ar',
+ '<': 'maziau nei',
+ '>': 'daugiau nei',
+ '∑': 'suma',
+ '¤': 'valiuta'
+ },
+
+ 'lv': {
+ '∆': 'delta',
+ '∞': 'bezgaliba',
+ '♥': 'milestiba',
+ '&': 'un',
+ '|': 'vai',
+ '<': 'mazak neka',
+ '>': 'lielaks neka',
+ '∑': 'summa',
+ '¤': 'valuta'
+ },
+
+ 'my': {
+ '∆': 'kwahkhyaet',
+ '∞': 'asaonasme',
+ '♥': 'akhyait',
+ '&': 'nhin',
+ '|': 'tho',
+ '<': 'ngethaw',
+ '>': 'kyithaw',
+ '∑': 'paungld',
+ '¤': 'ngwekye'
+ },
+
+ 'mk': {},
+
+ 'nl': {
+ '∆': 'delta',
+ '∞': 'oneindig',
+ '♥': 'liefde',
+ '&': 'en',
+ '|': 'of',
+ '<': 'kleiner dan',
+ '>': 'groter dan',
+ '∑': 'som',
+ '¤': 'valuta'
+ },
+
+ 'pl': {
+ '∆': 'delta',
+ '∞': 'nieskonczonosc',
+ '♥': 'milosc',
+ '&': 'i',
+ '|': 'lub',
+ '<': 'mniejsze niz',
+ '>': 'wieksze niz',
+ '∑': 'suma',
+ '¤': 'waluta'
+ },
+
+ 'pt': {
+ '∆': 'delta',
+ '∞': 'infinito',
+ '♥': 'amor',
+ '&': 'e',
+ '|': 'ou',
+ '<': 'menor que',
+ '>': 'maior que',
+ '∑': 'soma',
+ '¤': 'moeda'
+ },
+
+ 'ro': {
+ '∆': 'delta',
+ '∞': 'infinit',
+ '♥': 'dragoste',
+ '&': 'si',
+ '|': 'sau',
+ '<': 'mai mic ca',
+ '>': 'mai mare ca',
+ '∑': 'suma',
+ '¤': 'valuta'
+ },
+
+ 'ru': {
+ '∆': 'delta',
+ '∞': 'beskonechno',
+ '♥': 'lubov',
+ '&': 'i',
+ '|': 'ili',
+ '<': 'menshe',
+ '>': 'bolshe',
+ '∑': 'summa',
+ '¤': 'valjuta'
+ },
+
+ 'sk': {
+ '∆': 'delta',
+ '∞': 'nekonecno',
+ '♥': 'laska',
+ '&': 'a',
+ '|': 'alebo',
+ '<': 'menej ako',
+ '>': 'viac ako',
+ '∑': 'sucet',
+ '¤': 'mena'
+ },
+
+ 'sr': {},
+
+ 'tr': {
+ '∆': 'delta',
+ '∞': 'sonsuzluk',
+ '♥': 'ask',
+ '&': 've',
+ '|': 'veya',
+ '<': 'kucuktur',
+ '>': 'buyuktur',
+ '∑': 'toplam',
+ '¤': 'para birimi'
+ },
+
+ 'uk': {
+ '∆': 'delta',
+ '∞': 'bezkinechnist',
+ '♥': 'lubov',
+ '&': 'i',
+ '|': 'abo',
+ '<': 'menshe',
+ '>': 'bilshe',
+ '∑': 'suma',
+ '¤': 'valjuta'
+ },
+
+ 'vn': {
+ '∆': 'delta',
+ '∞': 'vo cuc',
+ '♥': 'yeu',
+ '&': 'va',
+ '|': 'hoac',
+ '<': 'nho hon',
+ '>': 'lon hon',
+ '∑': 'tong',
+ '¤': 'tien te'
+ }
+ };
+
+ var uricChars = [';', '?', ':', '@', '&', '=', '+', '$', ',', '/'].join('');
+
+ var uricNoSlashChars = [';', '?', ':', '@', '&', '=', '+', '$', ','].join('');
+
+ var markChars = ['.', '!', '~', '*', "'", '(', ')'].join('');
+
+ /**
+ * getSlug
+ * @param {string} input input string
+ * @param {object|string} opts config object or separator string/char
+ * @api public
+ * @return {string} sluggified string
+ */
+ var getSlug = function getSlug(input, opts) {
+ var separator = '-';
+ var result = '';
+ var diatricString = '';
+ var convertSymbols = true;
+ var customReplacements = {};
+ var maintainCase;
+ var titleCase;
+ var truncate;
+ var uricFlag;
+ var uricNoSlashFlag;
+ var markFlag;
+ var symbol;
+ var langChar;
+ var lucky;
+ var i;
+ var ch;
+ var l;
+ var lastCharWasSymbol;
+ var lastCharWasDiatric;
+ var allowedChars = '';
+
+ if (typeof input !== 'string') {
+ return '';
+ }
+
+ if (typeof opts === 'string') {
+ separator = opts;
+ }
+
+ symbol = symbolMap.en;
+ langChar = langCharMap.en;
+
+ if (typeof opts === 'object') {
+ maintainCase = opts.maintainCase || false;
+ customReplacements = (opts.custom && typeof opts.custom === 'object') ? opts.custom : customReplacements;
+ truncate = (+opts.truncate > 1 && opts.truncate) || false;
+ uricFlag = opts.uric || false;
+ uricNoSlashFlag = opts.uricNoSlash || false;
+ markFlag = opts.mark || false;
+ convertSymbols = (opts.symbols === false || opts.lang === false) ? false : true;
+ separator = opts.separator || separator;
+
+ if (uricFlag) {
+ allowedChars += uricChars;
+ }
+
+ if (uricNoSlashFlag) {
+ allowedChars += uricNoSlashChars;
+ }
+
+ if (markFlag) {
+ allowedChars += markChars;
+ }
+
+ symbol = (opts.lang && symbolMap[opts.lang] && convertSymbols) ?
+ symbolMap[opts.lang] : (convertSymbols ? symbolMap.en : {});
+
+ langChar = (opts.lang && langCharMap[opts.lang]) ?
+ langCharMap[opts.lang] :
+ opts.lang === false || opts.lang === true ? {} : langCharMap.en;
+
+ // if titleCase config is an Array, rewrite to object format
+ if (opts.titleCase && typeof opts.titleCase.length === 'number' && Array.prototype.toString.call(opts.titleCase)) {
+ opts.titleCase.forEach(function (v) {
+ customReplacements[v + ''] = v + '';
+ });
+
+ titleCase = true;
+ } else {
+ titleCase = !!opts.titleCase;
+ }
+
+ // if custom config is an Array, rewrite to object format
+ if (opts.custom && typeof opts.custom.length === 'number' && Array.prototype.toString.call(opts.custom)) {
+ opts.custom.forEach(function (v) {
+ customReplacements[v + ''] = v + '';
+ });
+ }
+
+ // custom replacements
+ Object.keys(customReplacements).forEach(function (v) {
+ var r;
+
+ if (v.length > 1) {
+ r = new RegExp('\\b' + escapeChars(v) + '\\b', 'gi');
+ } else {
+ r = new RegExp(escapeChars(v), 'gi');
+ }
+
+ input = input.replace(r, customReplacements[v]);
+ });
+
+ // add all custom replacement to allowed charlist
+ for (ch in customReplacements) {
+ allowedChars += ch;
+ }
+ }
+
+ allowedChars += separator;
+
+ // escape all necessary chars
+ allowedChars = escapeChars(allowedChars);
+
+ // trim whitespaces
+ input = input.replace(/(^\s+|\s+$)/g, '');
+
+ lastCharWasSymbol = false;
+ lastCharWasDiatric = false;
+
+ for (i = 0, l = input.length; i < l; i++) {
+ ch = input[i];
+
+ if (isReplacedCustomChar(ch, customReplacements)) {
+ // don't convert a already converted char
+ lastCharWasSymbol = false;
+ } else if (langChar[ch]) {
+ // process language specific diactrics chars conversion
+ ch = lastCharWasSymbol && langChar[ch].match(/[A-Za-z0-9]/) ? ' ' + langChar[ch] : langChar[ch];
+
+ lastCharWasSymbol = false;
+ } else if (ch in charMap) {
+ // the transliteration changes entirely when some special characters are added
+ if (i + 1 < l && lookAheadCharArray.indexOf(input[i + 1]) >= 0) {
+ diatricString += ch;
+ ch = '';
+ } else if (lastCharWasDiatric === true) {
+ ch = diatricMap[diatricString] + charMap[ch];
+ diatricString = '';
+ } else {
+ // process diactrics chars
+ ch = lastCharWasSymbol && charMap[ch].match(/[A-Za-z0-9]/) ? ' ' + charMap[ch] : charMap[ch];
+ }
+
+ lastCharWasSymbol = false;
+ lastCharWasDiatric = false;
+ } else if (ch in diatricMap) {
+ diatricString += ch;
+ ch = '';
+ // end of string, put the whole meaningful word
+ if (i === l - 1) {
+ ch = diatricMap[diatricString];
+ }
+ lastCharWasDiatric = true;
+ } else if (
+ // process symbol chars
+ symbol[ch] && !(uricFlag && uricChars
+ .indexOf(ch) !== -1) && !(uricNoSlashFlag && uricNoSlashChars
+ // .indexOf(ch) !== -1) && !(markFlag && markChars
+ .indexOf(ch) !== -1)) {
+ ch = lastCharWasSymbol || result.substr(-1).match(/[A-Za-z0-9]/) ? separator + symbol[ch] : symbol[ch];
+ ch += input[i + 1] !== void 0 && input[i + 1].match(/[A-Za-z0-9]/) ? separator : '';
+
+ lastCharWasSymbol = true;
+ } else {
+ if (lastCharWasDiatric === true) {
+ ch = diatricMap[diatricString] + ch;
+ diatricString = '';
+ lastCharWasDiatric = false;
+ } else if (lastCharWasSymbol && (/[A-Za-z0-9]/.test(ch) || result.substr(-1).match(/A-Za-z0-9]/))) {
+ // process latin chars
+ ch = ' ' + ch;
+ }
+ lastCharWasSymbol = false;
+ }
+
+ // add allowed chars
+ result += ch.replace(new RegExp('[^\\w\\s' + allowedChars + '_-]', 'g'), separator);
+ }
+
+ if (titleCase) {
+ result = result.replace(/(\w)(\S*)/g, function (_, i, r) {
+ var j = i.toUpperCase() + (r !== null ? r : '');
+ return (Object.keys(customReplacements).indexOf(j.toLowerCase()) < 0) ? j : j.toLowerCase();
+ });
+ }
+
+ // eliminate duplicate separators
+ // add separator
+ // trim separators from start and end
+ result = result.replace(/\s+/g, separator)
+ .replace(new RegExp('\\' + separator + '+', 'g'), separator)
+ .replace(new RegExp('(^\\' + separator + '+|\\' + separator + '+$)', 'g'), '');
+
+ if (truncate && result.length > truncate) {
+ lucky = result.charAt(truncate) === separator;
+ result = result.slice(0, truncate);
+
+ if (!lucky) {
+ result = result.slice(0, result.lastIndexOf(separator));
+ }
+ }
+
+ if (!maintainCase && !titleCase) {
+ result = result.toLowerCase();
+ }
+
+ return result;
+ };
+
+ /**
+ * createSlug curried(opts)(input)
+ * @param {object|string} opts config object or input string
+ * @return {Function} function getSlugWithConfig()
+ **/
+ var createSlug = function createSlug(opts) {
+
+ /**
+ * getSlugWithConfig
+ * @param {string} input string
+ * @return {string} slug string
+ */
+ return function getSlugWithConfig(input) {
+ return getSlug(input, opts);
+ };
+ };
+
+ /**
+ * escape Chars
+ * @param {string} input string
+ */
+ var escapeChars = function escapeChars(input) {
+ return input.replace(/[-\\^$*+?.()|[\]{}\/]/g, '\\$&');
+ };
+
+ /**
+ * check if the char is an already converted char from custom list
+ * @param {char} ch character to check
+ * @param {object} customReplacements custom translation map
+ */
+ var isReplacedCustomChar = function (ch, customReplacements) {
+ for (var c in customReplacements) {
+ if (customReplacements[c] === ch) {
+ return true;
+ }
+ }
+ };
+
+ if ('object' !== 'undefined' && module.exports) {
+
+ // export functions for use in Node
+ module.exports = getSlug;
+ module.exports.createSlug = createSlug;
+ } else if (typeof undefined !== 'undefined' && undefined.amd) {
+
+ // export function for use in AMD
+ undefined([], function () {
+ return getSlug;
+ });
+ } else {
+
+ // don't overwrite global if exists
+ try {
+ if (root.getSlug || root.createSlug) {
+ throw 'speakingurl: globals exists /(getSlug|createSlug)/';
+ } else {
+ root.getSlug = getSlug;
+ root.createSlug = createSlug;
+ }
+ } catch (e) {}
+ }
+ })(commonjsGlobal);
+ });
+ var speakingurl_1 = speakingurl.createSlug;
+
+ var speakingurl$1 = speakingurl;
+
+ var urlJoin = createCommonjsModule(function (module) {
+ (function (name, context, definition) {
+ if ('object' !== 'undefined' && module.exports) module.exports = definition();
+ else if (typeof undefined === 'function' && undefined.amd) undefined(definition);
+ else context[name] = definition();
+ })('urljoin', commonjsGlobal, function () {
+
+ function normalize (strArray) {
+ var resultArray = [];
+ if (strArray.length === 0) { return ''; }
+
+ if (typeof strArray[0] !== 'string') {
+ throw new TypeError('Url must be a string. Received ' + strArray[0]);
+ }
+
+ // If the first part is a plain protocol, we combine it with the next part.
+ if (strArray[0].match(/^[^/:]+:\/*$/) && strArray.length > 1) {
+ var first = strArray.shift();
+ strArray[0] = first + strArray[0];
+ }
+
+ // There must be two or three slashes in the file protocol, two slashes in anything else.
+ if (strArray[0].match(/^file:\/\/\//)) {
+ strArray[0] = strArray[0].replace(/^([^/:]+):\/*/, '$1:///');
+ } else {
+ strArray[0] = strArray[0].replace(/^([^/:]+):\/*/, '$1://');
+ }
+
+ for (var i = 0; i < strArray.length; i++) {
+ var component = strArray[i];
+
+ if (typeof component !== 'string') {
+ throw new TypeError('Url must be a string. Received ' + component);
+ }
+
+ if (component === '') { continue; }
+
+ if (i > 0) {
+ // Removing the starting slashes for each component but the first.
+ component = component.replace(/^[\/]+/, '');
+ }
+ if (i < strArray.length - 1) {
+ // Removing the ending slashes for each component but the last.
+ component = component.replace(/[\/]+$/, '');
+ } else {
+ // For the last component we will combine multiple slashes to a single one.
+ component = component.replace(/[\/]+$/, '/');
+ }
+
+ resultArray.push(component);
+
+ }
+
+ var str = resultArray.join('/');
+ // Each input component is now separated by a single slash except the possible first plain protocol part.
+
+ // remove trailing slash before parameters or hash
+ str = str.replace(/\/(\?|&|#[^!])/g, '$1');
+
+ // replace ? in parameters with &
+ var parts = str.split('?');
+ str = parts.shift() + (parts.length > 0 ? '?': '') + parts.join('&');
+
+ return str;
+ }
+
+ return function () {
+ var input;
+
+ if (typeof arguments[0] === 'object') {
+ input = arguments[0];
+ } else {
+ input = [].slice.call(arguments);
+ }
+
+ return normalize(input);
+ };
+
+ });
+ });
+
+ var uritemplate = createCommonjsModule(function (module) {
+ /*global unescape, module, define, window, global*/
+
+ /*
+ UriTemplate Copyright (c) 2012-2013 Franz Antesberger. All Rights Reserved.
+ Available via the MIT license.
+ */
+
+ (function (exportCallback) {
+ "use strict";
+
+ var UriTemplateError = (function () {
+
+ function UriTemplateError (options) {
+ this.options = options;
+ }
+
+ UriTemplateError.prototype.toString = function () {
+ if (JSON && JSON.stringify) {
+ return JSON.stringify(this.options);
+ }
+ else {
+ return this.options;
+ }
+ };
+
+ return UriTemplateError;
+ }());
+
+ var objectHelper = (function () {
+ function isArray (value) {
+ return Object.prototype.toString.apply(value) === '[object Array]';
+ }
+
+ function isString (value) {
+ return Object.prototype.toString.apply(value) === '[object String]';
+ }
+
+ function isNumber (value) {
+ return Object.prototype.toString.apply(value) === '[object Number]';
+ }
+
+ function isBoolean (value) {
+ return Object.prototype.toString.apply(value) === '[object Boolean]';
+ }
+
+ function join (arr, separator) {
+ var
+ result = '',
+ first = true,
+ index;
+ for (index = 0; index < arr.length; index += 1) {
+ if (first) {
+ first = false;
+ }
+ else {
+ result += separator;
+ }
+ result += arr[index];
+ }
+ return result;
+ }
+
+ function map (arr, mapper) {
+ var
+ result = [],
+ index = 0;
+ for (; index < arr.length; index += 1) {
+ result.push(mapper(arr[index]));
+ }
+ return result;
+ }
+
+ function filter (arr, predicate) {
+ var
+ result = [],
+ index = 0;
+ for (; index < arr.length; index += 1) {
+ if (predicate(arr[index])) {
+ result.push(arr[index]);
+ }
+ }
+ return result;
+ }
+
+ function deepFreezeUsingObjectFreeze (object) {
+ if (typeof object !== "object" || object === null) {
+ return object;
+ }
+ Object.freeze(object);
+ var property, propertyName;
+ for (propertyName in object) {
+ if (object.hasOwnProperty(propertyName)) {
+ property = object[propertyName];
+ // be aware, arrays are 'object', too
+ if (typeof property === "object") {
+ deepFreeze(property);
+ }
+ }
+ }
+ return object;
+ }
+
+ function deepFreeze (object) {
+ if (typeof Object.freeze === 'function') {
+ return deepFreezeUsingObjectFreeze(object);
+ }
+ return object;
+ }
+
+
+ return {
+ isArray: isArray,
+ isString: isString,
+ isNumber: isNumber,
+ isBoolean: isBoolean,
+ join: join,
+ map: map,
+ filter: filter,
+ deepFreeze: deepFreeze
+ };
+ }());
+
+ var charHelper = (function () {
+
+ function isAlpha (chr) {
+ return (chr >= 'a' && chr <= 'z') || ((chr >= 'A' && chr <= 'Z'));
+ }
+
+ function isDigit (chr) {
+ return chr >= '0' && chr <= '9';
+ }
+
+ function isHexDigit (chr) {
+ return isDigit(chr) || (chr >= 'a' && chr <= 'f') || (chr >= 'A' && chr <= 'F');
+ }
+
+ return {
+ isAlpha: isAlpha,
+ isDigit: isDigit,
+ isHexDigit: isHexDigit
+ };
+ }());
+
+ var pctEncoder = (function () {
+ var utf8 = {
+ encode: function (chr) {
+ // see http://ecmanaut.blogspot.de/2006/07/encoding-decoding-utf8-in-javascript.html
+ return unescape(encodeURIComponent(chr));
+ },
+ numBytes: function (firstCharCode) {
+ if (firstCharCode <= 0x7F) {
+ return 1;
+ }
+ else if (0xC2 <= firstCharCode && firstCharCode <= 0xDF) {
+ return 2;
+ }
+ else if (0xE0 <= firstCharCode && firstCharCode <= 0xEF) {
+ return 3;
+ }
+ else if (0xF0 <= firstCharCode && firstCharCode <= 0xF4) {
+ return 4;
+ }
+ // no valid first octet
+ return 0;
+ },
+ isValidFollowingCharCode: function (charCode) {
+ return 0x80 <= charCode && charCode <= 0xBF;
+ }
+ };
+
+ /**
+ * encodes a character, if needed or not.
+ * @param chr
+ * @return pct-encoded character
+ */
+ function encodeCharacter (chr) {
+ var
+ result = '',
+ octets = utf8.encode(chr),
+ octet,
+ index;
+ for (index = 0; index < octets.length; index += 1) {
+ octet = octets.charCodeAt(index);
+ result += '%' + (octet < 0x10 ? '0' : '') + octet.toString(16).toUpperCase();
+ }
+ return result;
+ }
+
+ /**
+ * Returns, whether the given text at start is in the form 'percent hex-digit hex-digit', like '%3F'
+ * @param text
+ * @param start
+ * @return {boolean|*|*}
+ */
+ function isPercentDigitDigit (text, start) {
+ return text.charAt(start) === '%' && charHelper.isHexDigit(text.charAt(start + 1)) && charHelper.isHexDigit(text.charAt(start + 2));
+ }
+
+ /**
+ * Parses a hex number from start with length 2.
+ * @param text a string
+ * @param start the start index of the 2-digit hex number
+ * @return {Number}
+ */
+ function parseHex2 (text, start) {
+ return parseInt(text.substr(start, 2), 16);
+ }
+
+ /**
+ * Returns whether or not the given char sequence is a correctly pct-encoded sequence.
+ * @param chr
+ * @return {boolean}
+ */
+ function isPctEncoded (chr) {
+ if (!isPercentDigitDigit(chr, 0)) {
+ return false;
+ }
+ var firstCharCode = parseHex2(chr, 1);
+ var numBytes = utf8.numBytes(firstCharCode);
+ if (numBytes === 0) {
+ return false;
+ }
+ for (var byteNumber = 1; byteNumber < numBytes; byteNumber += 1) {
+ if (!isPercentDigitDigit(chr, 3*byteNumber) || !utf8.isValidFollowingCharCode(parseHex2(chr, 3*byteNumber + 1))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Reads as much as needed from the text, e.g. '%20' or '%C3%B6'. It does not decode!
+ * @param text
+ * @param startIndex
+ * @return the character or pct-string of the text at startIndex
+ */
+ function pctCharAt(text, startIndex) {
+ var chr = text.charAt(startIndex);
+ if (!isPercentDigitDigit(text, startIndex)) {
+ return chr;
+ }
+ var utf8CharCode = parseHex2(text, startIndex + 1);
+ var numBytes = utf8.numBytes(utf8CharCode);
+ if (numBytes === 0) {
+ return chr;
+ }
+ for (var byteNumber = 1; byteNumber < numBytes; byteNumber += 1) {
+ if (!isPercentDigitDigit(text, startIndex + 3 * byteNumber) || !utf8.isValidFollowingCharCode(parseHex2(text, startIndex + 3 * byteNumber + 1))) {
+ return chr;
+ }
+ }
+ return text.substr(startIndex, 3 * numBytes);
+ }
+
+ return {
+ encodeCharacter: encodeCharacter,
+ isPctEncoded: isPctEncoded,
+ pctCharAt: pctCharAt
+ };
+ }());
+
+ var rfcCharHelper = (function () {
+
+ /**
+ * Returns if an character is an varchar character according 2.3 of rfc 6570
+ * @param chr
+ * @return (Boolean)
+ */
+ function isVarchar (chr) {
+ return charHelper.isAlpha(chr) || charHelper.isDigit(chr) || chr === '_' || pctEncoder.isPctEncoded(chr);
+ }
+
+ /**
+ * Returns if chr is an unreserved character according 1.5 of rfc 6570
+ * @param chr
+ * @return {Boolean}
+ */
+ function isUnreserved (chr) {
+ return charHelper.isAlpha(chr) || charHelper.isDigit(chr) || chr === '-' || chr === '.' || chr === '_' || chr === '~';
+ }
+
+ /**
+ * Returns if chr is an reserved character according 1.5 of rfc 6570
+ * or the percent character mentioned in 3.2.1.
+ * @param chr
+ * @return {Boolean}
+ */
+ function isReserved (chr) {
+ return chr === ':' || chr === '/' || chr === '?' || chr === '#' || chr === '[' || chr === ']' || chr === '@' || chr === '!' || chr === '$' || chr === '&' || chr === '(' ||
+ chr === ')' || chr === '*' || chr === '+' || chr === ',' || chr === ';' || chr === '=' || chr === "'";
+ }
+
+ return {
+ isVarchar: isVarchar,
+ isUnreserved: isUnreserved,
+ isReserved: isReserved
+ };
+
+ }());
+
+ /**
+ * encoding of rfc 6570
+ */
+ var encodingHelper = (function () {
+
+ function encode (text, passReserved) {
+ var
+ result = '',
+ index,
+ chr = '';
+ if (typeof text === "number" || typeof text === "boolean") {
+ text = text.toString();
+ }
+ for (index = 0; index < text.length; index += chr.length) {
+ chr = text.charAt(index);
+ result += rfcCharHelper.isUnreserved(chr) || (passReserved && rfcCharHelper.isReserved(chr)) ? chr : pctEncoder.encodeCharacter(chr);
+ }
+ return result;
+ }
+
+ function encodePassReserved (text) {
+ return encode(text, true);
+ }
+
+ function encodeLiteralCharacter (literal, index) {
+ var chr = pctEncoder.pctCharAt(literal, index);
+ if (chr.length > 1) {
+ return chr;
+ }
+ else {
+ return rfcCharHelper.isReserved(chr) || rfcCharHelper.isUnreserved(chr) ? chr : pctEncoder.encodeCharacter(chr);
+ }
+ }
+
+ function encodeLiteral (literal) {
+ var
+ result = '',
+ index,
+ chr = '';
+ for (index = 0; index < literal.length; index += chr.length) {
+ chr = pctEncoder.pctCharAt(literal, index);
+ if (chr.length > 1) {
+ result += chr;
+ }
+ else {
+ result += rfcCharHelper.isReserved(chr) || rfcCharHelper.isUnreserved(chr) ? chr : pctEncoder.encodeCharacter(chr);
+ }
+ }
+ return result;
+ }
+
+ return {
+ encode: encode,
+ encodePassReserved: encodePassReserved,
+ encodeLiteral: encodeLiteral,
+ encodeLiteralCharacter: encodeLiteralCharacter
+ };
+
+ }());
+
+
+ // the operators defined by rfc 6570
+ var operators = (function () {
+
+ var
+ bySymbol = {};
+
+ function create (symbol) {
+ bySymbol[symbol] = {
+ symbol: symbol,
+ separator: (symbol === '?') ? '&' : (symbol === '' || symbol === '+' || symbol === '#') ? ',' : symbol,
+ named: symbol === ';' || symbol === '&' || symbol === '?',
+ ifEmpty: (symbol === '&' || symbol === '?') ? '=' : '',
+ first: (symbol === '+' ) ? '' : symbol,
+ encode: (symbol === '+' || symbol === '#') ? encodingHelper.encodePassReserved : encodingHelper.encode,
+ toString: function () {
+ return this.symbol;
+ }
+ };
+ }
+
+ create('');
+ create('+');
+ create('#');
+ create('.');
+ create('/');
+ create(';');
+ create('?');
+ create('&');
+ return {
+ valueOf: function (chr) {
+ if (bySymbol[chr]) {
+ return bySymbol[chr];
+ }
+ if ("=,!@|".indexOf(chr) >= 0) {
+ return null;
+ }
+ return bySymbol[''];
+ }
+ };
+ }());
+
+
+ /**
+ * Detects, whether a given element is defined in the sense of rfc 6570
+ * Section 2.3 of the RFC makes clear defintions:
+ * * undefined and null are not defined.
+ * * the empty string is defined
+ * * an array ("list") is defined, if it is not empty (even if all elements are not defined)
+ * * an object ("map") is defined, if it contains at least one property with defined value
+ * @param object
+ * @return {Boolean}
+ */
+ function isDefined (object) {
+ var
+ propertyName;
+ if (object === null || object === undefined) {
+ return false;
+ }
+ if (objectHelper.isArray(object)) {
+ // Section 2.3: A variable defined as a list value is considered undefined if the list contains zero members
+ return object.length > 0;
+ }
+ if (typeof object === "string" || typeof object === "number" || typeof object === "boolean") {
+ // falsy values like empty strings, false or 0 are "defined"
+ return true;
+ }
+ // else Object
+ for (propertyName in object) {
+ if (object.hasOwnProperty(propertyName) && isDefined(object[propertyName])) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ var LiteralExpression = (function () {
+ function LiteralExpression (literal) {
+ this.literal = encodingHelper.encodeLiteral(literal);
+ }
+
+ LiteralExpression.prototype.expand = function () {
+ return this.literal;
+ };
+
+ LiteralExpression.prototype.toString = LiteralExpression.prototype.expand;
+
+ return LiteralExpression;
+ }());
+
+ var parse = (function () {
+
+ function parseExpression (expressionText) {
+ var
+ operator,
+ varspecs = [],
+ varspec = null,
+ varnameStart = null,
+ maxLengthStart = null,
+ index,
+ chr = '';
+
+ function closeVarname () {
+ var varname = expressionText.substring(varnameStart, index);
+ if (varname.length === 0) {
+ throw new UriTemplateError({expressionText: expressionText, message: "a varname must be specified", position: index});
+ }
+ varspec = {varname: varname, exploded: false, maxLength: null};
+ varnameStart = null;
+ }
+
+ function closeMaxLength () {
+ if (maxLengthStart === index) {
+ throw new UriTemplateError({expressionText: expressionText, message: "after a ':' you have to specify the length", position: index});
+ }
+ varspec.maxLength = parseInt(expressionText.substring(maxLengthStart, index), 10);
+ maxLengthStart = null;
+ }
+
+ operator = (function (operatorText) {
+ var op = operators.valueOf(operatorText);
+ if (op === null) {
+ throw new UriTemplateError({expressionText: expressionText, message: "illegal use of reserved operator", position: index, operator: operatorText});
+ }
+ return op;
+ }(expressionText.charAt(0)));
+ index = operator.symbol.length;
+
+ varnameStart = index;
+
+ for (; index < expressionText.length; index += chr.length) {
+ chr = pctEncoder.pctCharAt(expressionText, index);
+
+ if (varnameStart !== null) {
+ // the spec says: varname = varchar *( ["."] varchar )
+ // so a dot is allowed except for the first char
+ if (chr === '.') {
+ if (varnameStart === index) {
+ throw new UriTemplateError({expressionText: expressionText, message: "a varname MUST NOT start with a dot", position: index});
+ }
+ continue;
+ }
+ if (rfcCharHelper.isVarchar(chr)) {
+ continue;
+ }
+ closeVarname();
+ }
+ if (maxLengthStart !== null) {
+ if (index === maxLengthStart && chr === '0') {
+ throw new UriTemplateError({expressionText: expressionText, message: "A :prefix must not start with digit 0", position: index});
+ }
+ if (charHelper.isDigit(chr)) {
+ if (index - maxLengthStart >= 4) {
+ throw new UriTemplateError({expressionText: expressionText, message: "A :prefix must have max 4 digits", position: index});
+ }
+ continue;
+ }
+ closeMaxLength();
+ }
+ if (chr === ':') {
+ if (varspec.maxLength !== null) {
+ throw new UriTemplateError({expressionText: expressionText, message: "only one :maxLength is allowed per varspec", position: index});
+ }
+ if (varspec.exploded) {
+ throw new UriTemplateError({expressionText: expressionText, message: "an exploeded varspec MUST NOT be varspeced", position: index});
+ }
+ maxLengthStart = index + 1;
+ continue;
+ }
+ if (chr === '*') {
+ if (varspec === null) {
+ throw new UriTemplateError({expressionText: expressionText, message: "exploded without varspec", position: index});
+ }
+ if (varspec.exploded) {
+ throw new UriTemplateError({expressionText: expressionText, message: "exploded twice", position: index});
+ }
+ if (varspec.maxLength) {
+ throw new UriTemplateError({expressionText: expressionText, message: "an explode (*) MUST NOT follow to a prefix", position: index});
+ }
+ varspec.exploded = true;
+ continue;
+ }
+ // the only legal character now is the comma
+ if (chr === ',') {
+ varspecs.push(varspec);
+ varspec = null;
+ varnameStart = index + 1;
+ continue;
+ }
+ throw new UriTemplateError({expressionText: expressionText, message: "illegal character", character: chr, position: index});
+ } // for chr
+ if (varnameStart !== null) {
+ closeVarname();
+ }
+ if (maxLengthStart !== null) {
+ closeMaxLength();
+ }
+ varspecs.push(varspec);
+ return new VariableExpression(expressionText, operator, varspecs);
+ }
+
+ function parse (uriTemplateText) {
+ // assert filled string
+ var
+ index,
+ chr,
+ expressions = [],
+ braceOpenIndex = null,
+ literalStart = 0;
+ for (index = 0; index < uriTemplateText.length; index += 1) {
+ chr = uriTemplateText.charAt(index);
+ if (literalStart !== null) {
+ if (chr === '}') {
+ throw new UriTemplateError({templateText: uriTemplateText, message: "unopened brace closed", position: index});
+ }
+ if (chr === '{') {
+ if (literalStart < index) {
+ expressions.push(new LiteralExpression(uriTemplateText.substring(literalStart, index)));
+ }
+ literalStart = null;
+ braceOpenIndex = index;
+ }
+ continue;
+ }
+
+ if (braceOpenIndex !== null) {
+ // here just { is forbidden
+ if (chr === '{') {
+ throw new UriTemplateError({templateText: uriTemplateText, message: "brace already opened", position: index});
+ }
+ if (chr === '}') {
+ if (braceOpenIndex + 1 === index) {
+ throw new UriTemplateError({templateText: uriTemplateText, message: "empty braces", position: braceOpenIndex});
+ }
+ try {
+ expressions.push(parseExpression(uriTemplateText.substring(braceOpenIndex + 1, index)));
+ }
+ catch (error) {
+ if (error.prototype === UriTemplateError.prototype) {
+ throw new UriTemplateError({templateText: uriTemplateText, message: error.options.message, position: braceOpenIndex + error.options.position, details: error.options});
+ }
+ throw error;
+ }
+ braceOpenIndex = null;
+ literalStart = index + 1;
+ }
+ continue;
+ }
+ throw new Error('reached unreachable code');
+ }
+ if (braceOpenIndex !== null) {
+ throw new UriTemplateError({templateText: uriTemplateText, message: "unclosed brace", position: braceOpenIndex});
+ }
+ if (literalStart < uriTemplateText.length) {
+ expressions.push(new LiteralExpression(uriTemplateText.substr(literalStart)));
+ }
+ return new UriTemplate(uriTemplateText, expressions);
+ }
+
+ return parse;
+ }());
+
+ var VariableExpression = (function () {
+ // helper function if JSON is not available
+ function prettyPrint (value) {
+ return (JSON && JSON.stringify) ? JSON.stringify(value) : value;
+ }
+
+ function isEmpty (value) {
+ if (!isDefined(value)) {
+ return true;
+ }
+ if (objectHelper.isString(value)) {
+ return value === '';
+ }
+ if (objectHelper.isNumber(value) || objectHelper.isBoolean(value)) {
+ return false;
+ }
+ if (objectHelper.isArray(value)) {
+ return value.length === 0;
+ }
+ for (var propertyName in value) {
+ if (value.hasOwnProperty(propertyName)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function propertyArray (object) {
+ var
+ result = [],
+ propertyName;
+ for (propertyName in object) {
+ if (object.hasOwnProperty(propertyName)) {
+ result.push({name: propertyName, value: object[propertyName]});
+ }
+ }
+ return result;
+ }
+
+ function VariableExpression (templateText, operator, varspecs) {
+ this.templateText = templateText;
+ this.operator = operator;
+ this.varspecs = varspecs;
+ }
+
+ VariableExpression.prototype.toString = function () {
+ return this.templateText;
+ };
+
+ function expandSimpleValue(varspec, operator, value) {
+ var result = '';
+ value = value.toString();
+ if (operator.named) {
+ result += encodingHelper.encodeLiteral(varspec.varname);
+ if (value === '') {
+ result += operator.ifEmpty;
+ return result;
+ }
+ result += '=';
+ }
+ if (varspec.maxLength !== null) {
+ value = value.substr(0, varspec.maxLength);
+ }
+ result += operator.encode(value);
+ return result;
+ }
+
+ function valueDefined (nameValue) {
+ return isDefined(nameValue.value);
+ }
+
+ function expandNotExploded(varspec, operator, value) {
+ var
+ arr = [],
+ result = '';
+ if (operator.named) {
+ result += encodingHelper.encodeLiteral(varspec.varname);
+ if (isEmpty(value)) {
+ result += operator.ifEmpty;
+ return result;
+ }
+ result += '=';
+ }
+ if (objectHelper.isArray(value)) {
+ arr = value;
+ arr = objectHelper.filter(arr, isDefined);
+ arr = objectHelper.map(arr, operator.encode);
+ result += objectHelper.join(arr, ',');
+ }
+ else {
+ arr = propertyArray(value);
+ arr = objectHelper.filter(arr, valueDefined);
+ arr = objectHelper.map(arr, function (nameValue) {
+ return operator.encode(nameValue.name) + ',' + operator.encode(nameValue.value);
+ });
+ result += objectHelper.join(arr, ',');
+ }
+ return result;
+ }
+
+ function expandExplodedNamed (varspec, operator, value) {
+ var
+ isArray = objectHelper.isArray(value),
+ arr = [];
+ if (isArray) {
+ arr = value;
+ arr = objectHelper.filter(arr, isDefined);
+ arr = objectHelper.map(arr, function (listElement) {
+ var tmp = encodingHelper.encodeLiteral(varspec.varname);
+ if (isEmpty(listElement)) {
+ tmp += operator.ifEmpty;
+ }
+ else {
+ tmp += '=' + operator.encode(listElement);
+ }
+ return tmp;
+ });
+ }
+ else {
+ arr = propertyArray(value);
+ arr = objectHelper.filter(arr, valueDefined);
+ arr = objectHelper.map(arr, function (nameValue) {
+ var tmp = encodingHelper.encodeLiteral(nameValue.name);
+ if (isEmpty(nameValue.value)) {
+ tmp += operator.ifEmpty;
+ }
+ else {
+ tmp += '=' + operator.encode(nameValue.value);
+ }
+ return tmp;
+ });
+ }
+ return objectHelper.join(arr, operator.separator);
+ }
+
+ function expandExplodedUnnamed (operator, value) {
+ var
+ arr = [],
+ result = '';
+ if (objectHelper.isArray(value)) {
+ arr = value;
+ arr = objectHelper.filter(arr, isDefined);
+ arr = objectHelper.map(arr, operator.encode);
+ result += objectHelper.join(arr, operator.separator);
+ }
+ else {
+ arr = propertyArray(value);
+ arr = objectHelper.filter(arr, function (nameValue) {
+ return isDefined(nameValue.value);
+ });
+ arr = objectHelper.map(arr, function (nameValue) {
+ return operator.encode(nameValue.name) + '=' + operator.encode(nameValue.value);
+ });
+ result += objectHelper.join(arr, operator.separator);
+ }
+ return result;
+ }
+
+
+ VariableExpression.prototype.expand = function (variables) {
+ var
+ expanded = [],
+ index,
+ varspec,
+ value,
+ valueIsArr,
+ oneExploded = false,
+ operator = this.operator;
+
+ // expand each varspec and join with operator's separator
+ for (index = 0; index < this.varspecs.length; index += 1) {
+ varspec = this.varspecs[index];
+ value = variables[varspec.varname];
+ // if (!isDefined(value)) {
+ // if (variables.hasOwnProperty(varspec.name)) {
+ if (value === null || value === undefined) {
+ continue;
+ }
+ if (varspec.exploded) {
+ oneExploded = true;
+ }
+ valueIsArr = objectHelper.isArray(value);
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
+ expanded.push(expandSimpleValue(varspec, operator, value));
+ }
+ else if (varspec.maxLength && isDefined(value)) {
+ // 2.4.1 of the spec says: "Prefix modifiers are not applicable to variables that have composite values."
+ throw new Error('Prefix modifiers are not applicable to variables that have composite values. You tried to expand ' + this + " with " + prettyPrint(value));
+ }
+ else if (!varspec.exploded) {
+ if (operator.named || !isEmpty(value)) {
+ expanded.push(expandNotExploded(varspec, operator, value));
+ }
+ }
+ else if (isDefined(value)) {
+ if (operator.named) {
+ expanded.push(expandExplodedNamed(varspec, operator, value));
+ }
+ else {
+ expanded.push(expandExplodedUnnamed(operator, value));
+ }
+ }
+ }
+
+ if (expanded.length === 0) {
+ return "";
+ }
+ else {
+ return operator.first + objectHelper.join(expanded, operator.separator);
+ }
+ };
+
+ return VariableExpression;
+ }());
+
+ var UriTemplate = (function () {
+ function UriTemplate (templateText, expressions) {
+ this.templateText = templateText;
+ this.expressions = expressions;
+ objectHelper.deepFreeze(this);
+ }
+
+ UriTemplate.prototype.toString = function () {
+ return this.templateText;
+ };
+
+ UriTemplate.prototype.expand = function (variables) {
+ // this.expressions.map(function (expression) {return expression.expand(variables);}).join('');
+ var
+ index,
+ result = '';
+ for (index = 0; index < this.expressions.length; index += 1) {
+ result += this.expressions[index].expand(variables);
+ }
+ return result;
+ };
+
+ UriTemplate.parse = parse;
+ UriTemplate.UriTemplateError = UriTemplateError;
+ return UriTemplate;
+ }());
+
+ exportCallback(UriTemplate);
+
+ }(function (UriTemplate) {
+ "use strict";
+ // export UriTemplate, when module is present, or pass it to window or global
+ if ('object' !== "undefined") {
+ module.exports = UriTemplate;
+ }
+ else if (typeof undefined === "function") {
+ undefined([],function() {
+ return UriTemplate;
+ });
+ }
+ else if (typeof window !== "undefined") {
+ window.UriTemplate = UriTemplate;
+ }
+ else {
+ commonjsGlobal.UriTemplate = UriTemplate;
+ }
+ }
+ ));
+ });
+
+ var store2 = createCommonjsModule(function (module) {
+ /*! store2 - v2.10.0 - 2019-09-27
+ * Copyright (c) 2019 Nathan Bubna; Licensed (MIT OR GPL-3.0) */
+ ;(function(window, define) {
+ var _ = {
+ version: "2.10.0",
+ areas: {},
+ apis: {},
+
+ // utilities
+ inherit: function(api, o) {
+ for (var p in api) {
+ if (!o.hasOwnProperty(p)) {
+ Object.defineProperty(o, p, Object.getOwnPropertyDescriptor(api, p));
+ }
+ }
+ return o;
+ },
+ stringify: function(d) {
+ return d === undefined || typeof d === "function" ? d+'' : JSON.stringify(d);
+ },
+ parse: function(s) {
+ // if it doesn't parse, return as is
+ try{ return JSON.parse(s); }catch(e){ return s; }
+ },
+
+ // extension hooks
+ fn: function(name, fn) {
+ _.storeAPI[name] = fn;
+ for (var api in _.apis) {
+ _.apis[api][name] = fn;
+ }
+ },
+ get: function(area, key){ return area.getItem(key); },
+ set: function(area, key, string){ area.setItem(key, string); },
+ remove: function(area, key){ area.removeItem(key); },
+ key: function(area, i){ return area.key(i); },
+ length: function(area){ return area.length; },
+ clear: function(area){ area.clear(); },
+
+ // core functions
+ Store: function(id, area, namespace) {
+ var store = _.inherit(_.storeAPI, function(key, data, overwrite) {
+ if (arguments.length === 0){ return store.getAll(); }
+ if (typeof data === "function"){ return store.transact(key, data, overwrite); }// fn=data, alt=overwrite
+ if (data !== undefined){ return store.set(key, data, overwrite); }
+ if (typeof key === "string" || typeof key === "number"){ return store.get(key); }
+ if (typeof key === "function"){ return store.each(key); }
+ if (!key){ return store.clear(); }
+ return store.setAll(key, data);// overwrite=data, data=key
+ });
+ store._id = id;
+ try {
+ var testKey = '_-bad-_';
+ area.setItem(testKey, 'wolf');
+ store._area = area;
+ area.removeItem(testKey);
+ } catch (e) {}
+ if (!store._area) {
+ store._area = _.storage('fake');
+ }
+ store._ns = namespace || '';
+ if (!_.areas[id]) {
+ _.areas[id] = store._area;
+ }
+ if (!_.apis[store._ns+store._id]) {
+ _.apis[store._ns+store._id] = store;
+ }
+ return store;
+ },
+ storeAPI: {
+ // admin functions
+ area: function(id, area) {
+ var store = this[id];
+ if (!store || !store.area) {
+ store = _.Store(id, area, this._ns);//new area-specific api in this namespace
+ if (!this[id]){ this[id] = store; }
+ }
+ return store;
+ },
+ namespace: function(namespace, singleArea) {
+ if (!namespace){
+ return this._ns ? this._ns.substring(0,this._ns.length-1) : '';
+ }
+ var ns = namespace, store = this[ns];
+ if (!store || !store.namespace) {
+ store = _.Store(this._id, this._area, this._ns+ns+'.');//new namespaced api
+ if (!this[ns]){ this[ns] = store; }
+ if (!singleArea) {
+ for (var name in _.areas) {
+ store.area(name, _.areas[name]);
+ }
+ }
+ }
+ return store;
+ },
+ isFake: function(){ return this._area.name === 'fake'; },
+ toString: function() {
+ return 'store'+(this._ns?'.'+this.namespace():'')+'['+this._id+']';
+ },
+
+ // storage functions
+ has: function(key) {
+ if (this._area.has) {
+ return this._area.has(this._in(key));//extension hook
+ }
+ return !!(this._in(key) in this._area);
+ },
+ size: function(){ return this.keys().length; },
+ each: function(fn, fill) {// fill is used by keys(fillList) and getAll(fillList))
+ for (var i=0, m=_.length(this._area); i<m; i++) {
+ var key = this._out(_.key(this._area, i));
+ if (key !== undefined) {
+ if (fn.call(this, key, this.get(key), fill) === false) {
+ break;
+ }
+ }
+ if (m > _.length(this._area)) { m--; i--; }// in case of removeItem
+ }
+ return fill || this;
+ },
+ keys: function(fillList) {
+ return this.each(function(k, v, list){ list.push(k); }, fillList || []);
+ },
+ get: function(key, alt) {
+ var s = _.get(this._area, this._in(key));
+ return s !== null ? _.parse(s) : alt || s;// support alt for easy default mgmt
+ },
+ getAll: function(fillObj) {
+ return this.each(function(k, v, all){ all[k] = v; }, fillObj || {});
+ },
+ transact: function(key, fn, alt) {
+ var val = this.get(key, alt),
+ ret = fn(val);
+ this.set(key, ret === undefined ? val : ret);
+ return this;
+ },
+ set: function(key, data, overwrite) {
+ var d = this.get(key);
+ if (d != null && overwrite === false) {
+ return data;
+ }
+ return _.set(this._area, this._in(key), _.stringify(data), overwrite) || d;
+ },
+ setAll: function(data, overwrite) {
+ var changed, val;
+ for (var key in data) {
+ val = data[key];
+ if (this.set(key, val, overwrite) !== val) {
+ changed = true;
+ }
+ }
+ return changed;
+ },
+ add: function(key, data) {
+ var d = this.get(key);
+ if (d instanceof Array) {
+ data = d.concat(data);
+ } else if (d !== null) {
+ var type = typeof d;
+ if (type === typeof data && type === 'object') {
+ for (var k in data) {
+ d[k] = data[k];
+ }
+ data = d;
+ } else {
+ data = d + data;
+ }
+ }
+ _.set(this._area, this._in(key), _.stringify(data));
+ return data;
+ },
+ remove: function(key, alt) {
+ var d = this.get(key, alt);
+ _.remove(this._area, this._in(key));
+ return d;
+ },
+ clear: function() {
+ if (!this._ns) {
+ _.clear(this._area);
+ } else {
+ this.each(function(k){ _.remove(this._area, this._in(k)); }, 1);
+ }
+ return this;
+ },
+ clearAll: function() {
+ var area = this._area;
+ for (var id in _.areas) {
+ if (_.areas.hasOwnProperty(id)) {
+ this._area = _.areas[id];
+ this.clear();
+ }
+ }
+ this._area = area;
+ return this;
+ },
+
+ // internal use functions
+ _in: function(k) {
+ if (typeof k !== "string"){ k = _.stringify(k); }
+ return this._ns ? this._ns + k : k;
+ },
+ _out: function(k) {
+ return this._ns ?
+ k && k.indexOf(this._ns) === 0 ?
+ k.substring(this._ns.length) :
+ undefined : // so each() knows to skip it
+ k;
+ }
+ },// end _.storeAPI
+ storage: function(name) {
+ return _.inherit(_.storageAPI, { items: {}, name: name });
+ },
+ storageAPI: {
+ length: 0,
+ has: function(k){ return this.items.hasOwnProperty(k); },
+ key: function(i) {
+ var c = 0;
+ for (var k in this.items){
+ if (this.has(k) && i === c++) {
+ return k;
+ }
+ }
+ },
+ setItem: function(k, v) {
+ if (!this.has(k)) {
+ this.length++;
+ }
+ this.items[k] = v;
+ },
+ removeItem: function(k) {
+ if (this.has(k)) {
+ delete this.items[k];
+ this.length--;
+ }
+ },
+ getItem: function(k){ return this.has(k) ? this.items[k] : null; },
+ clear: function(){ for (var k in this.items){ this.removeItem(k); } }
+ }// end _.storageAPI
+ };
+
+ var store =
+ // safely set this up (throws error in IE10/32bit mode for local files)
+ _.Store("local", (function(){try{ return localStorage; }catch(e){}})());
+ store.local = store;// for completeness
+ store._ = _;// for extenders and debuggers...
+ // safely setup store.session (throws exception in FF for file:/// urls)
+ store.area("session", (function(){try{ return sessionStorage; }catch(e){}})());
+ store.area("page", _.storage("page"));
+
+ if (typeof define === 'function' && define.amd !== undefined) {
+ define('store2', [], function () {
+ return store;
+ });
+ } else if ('object' !== 'undefined' && module.exports) {
+ module.exports = store;
+ } else {
+ // expose the primary store fn to the global object and save conflicts
+ if (window.store){ _.conflict = window.store; }
+ window.store = store;
+ }
+
+ })(commonjsGlobal, commonjsGlobal && commonjsGlobal.define);
+ });
+
+ 'use strict';
+
+ var bind$1 = function bind(fn, thisArg) {
+ return function wrap() {
+ var args = new Array(arguments.length);
+ for (var i = 0; i < args.length; i++) {
+ args[i] = arguments[i];
+ }
+ return fn.apply(thisArg, args);
+ };
+ };
+
+ /*!
+ * Determine if an object is a Buffer
+ *
+ * @author Feross Aboukhadijeh <https://feross.org>
+ * @license MIT
+ */
+
+ var isBuffer = function isBuffer (obj) {
+ return obj != null && obj.constructor != null &&
+ typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
+ };
+
+ 'use strict';
+
+
+
+
+ /*global toString:true*/
+
+ // utils is a library of generic helper functions non-specific to axios
+
+ var toString = Object.prototype.toString;
+
+ /**
+ * Determine if a value is an Array
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is an Array, otherwise false
+ */
+ function isArray(val) {
+ return toString.call(val) === '[object Array]';
+ }
+
+ /**
+ * Determine if a value is an ArrayBuffer
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is an ArrayBuffer, otherwise false
+ */
+ function isArrayBuffer(val) {
+ return toString.call(val) === '[object ArrayBuffer]';
+ }
+
+ /**
+ * Determine if a value is a FormData
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is an FormData, otherwise false
+ */
+ function isFormData(val) {
+ return (typeof FormData !== 'undefined') && (val instanceof FormData);
+ }
+
+ /**
+ * Determine if a value is a view on an ArrayBuffer
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
+ */
+ function isArrayBufferView(val) {
+ var result;
+ if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {
+ result = ArrayBuffer.isView(val);
+ } else {
+ result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);
+ }
+ return result;
+ }
+
+ /**
+ * Determine if a value is a String
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a String, otherwise false
+ */
+ function isString(val) {
+ return typeof val === 'string';
+ }
+
+ /**
+ * Determine if a value is a Number
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a Number, otherwise false
+ */
+ function isNumber(val) {
+ return typeof val === 'number';
+ }
+
+ /**
+ * Determine if a value is undefined
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if the value is undefined, otherwise false
+ */
+ function isUndefined(val) {
+ return typeof val === 'undefined';
+ }
+
+ /**
+ * Determine if a value is an Object
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is an Object, otherwise false
+ */
+ function isObject(val) {
+ return val !== null && typeof val === 'object';
+ }
+
+ /**
+ * Determine if a value is a Date
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a Date, otherwise false
+ */
+ function isDate(val) {
+ return toString.call(val) === '[object Date]';
+ }
+
+ /**
+ * Determine if a value is a File
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a File, otherwise false
+ */
+ function isFile(val) {
+ return toString.call(val) === '[object File]';
+ }
+
+ /**
+ * Determine if a value is a Blob
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a Blob, otherwise false
+ */
+ function isBlob(val) {
+ return toString.call(val) === '[object Blob]';
+ }
+
+ /**
+ * Determine if a value is a Function
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a Function, otherwise false
+ */
+ function isFunction(val) {
+ return toString.call(val) === '[object Function]';
+ }
+
+ /**
+ * Determine if a value is a Stream
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a Stream, otherwise false
+ */
+ function isStream(val) {
+ return isObject(val) && isFunction(val.pipe);
+ }
+
+ /**
+ * Determine if a value is a URLSearchParams object
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a URLSearchParams object, otherwise false
+ */
+ function isURLSearchParams(val) {
+ return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;
+ }
+
+ /**
+ * Trim excess whitespace off the beginning and end of a string
+ *
+ * @param {String} str The String to trim
+ * @returns {String} The String freed of excess whitespace
+ */
+ function trim(str) {
+ return str.replace(/^\s*/, '').replace(/\s*$/, '');
+ }
+
+ /**
+ * Determine if we're running in a standard browser environment
+ *
+ * This allows axios to run in a web worker, and react-native.
+ * Both environments support XMLHttpRequest, but not fully standard globals.
+ *
+ * web workers:
+ * typeof window -> undefined
+ * typeof document -> undefined
+ *
+ * react-native:
+ * navigator.product -> 'ReactNative'
+ * nativescript
+ * navigator.product -> 'NativeScript' or 'NS'
+ */
+ function isStandardBrowserEnv() {
+ if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||
+ navigator.product === 'NativeScript' ||
+ navigator.product === 'NS')) {
+ return false;
+ }
+ return (
+ typeof window !== 'undefined' &&
+ typeof document !== 'undefined'
+ );
+ }
+
+ /**
+ * Iterate over an Array or an Object invoking a function for each item.
+ *
+ * If `obj` is an Array callback will be called passing
+ * the value, index, and complete array for each item.
+ *
+ * If 'obj' is an Object callback will be called passing
+ * the value, key, and complete object for each property.
+ *
+ * @param {Object|Array} obj The object to iterate
+ * @param {Function} fn The callback to invoke for each item
+ */
+ function forEach(obj, fn) {
+ // Don't bother if no value provided
+ if (obj === null || typeof obj === 'undefined') {
+ return;
+ }
+
+ // Force an array if not already something iterable
+ if (typeof obj !== 'object') {
+ /*eslint no-param-reassign:0*/
+ obj = [obj];
+ }
+
+ if (isArray(obj)) {
+ // Iterate over array values
+ for (var i = 0, l = obj.length; i < l; i++) {
+ fn.call(null, obj[i], i, obj);
+ }
+ } else {
+ // Iterate over object keys
+ for (var key in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
+ fn.call(null, obj[key], key, obj);
+ }
+ }
+ }
+ }
+
+ /**
+ * Accepts varargs expecting each argument to be an object, then
+ * immutably merges the properties of each object and returns result.
+ *
+ * When multiple objects contain the same key the later object in
+ * the arguments list will take precedence.
+ *
+ * Example:
+ *
+ * ```js
+ * var result = merge({foo: 123}, {foo: 456});
+ * console.log(result.foo); // outputs 456
+ * ```
+ *
+ * @param {Object} obj1 Object to merge
+ * @returns {Object} Result of all merge properties
+ */
+ function merge(/* obj1, obj2, obj3, ... */) {
+ var result = {};
+ function assignValue(val, key) {
+ if (typeof result[key] === 'object' && typeof val === 'object') {
+ result[key] = merge(result[key], val);
+ } else {
+ result[key] = val;
+ }
+ }
+
+ for (var i = 0, l = arguments.length; i < l; i++) {
+ forEach(arguments[i], assignValue);
+ }
+ return result;
+ }
+
+ /**
+ * Function equal to merge with the difference being that no reference
+ * to original objects is kept.
+ *
+ * @see merge
+ * @param {Object} obj1 Object to merge
+ * @returns {Object} Result of all merge properties
+ */
+ function deepMerge(/* obj1, obj2, obj3, ... */) {
+ var result = {};
+ function assignValue(val, key) {
+ if (typeof result[key] === 'object' && typeof val === 'object') {
+ result[key] = deepMerge(result[key], val);
+ } else if (typeof val === 'object') {
+ result[key] = deepMerge({}, val);
+ } else {
+ result[key] = val;
+ }
+ }
+
+ for (var i = 0, l = arguments.length; i < l; i++) {
+ forEach(arguments[i], assignValue);
+ }
+ return result;
+ }
+
+ /**
+ * Extends object a by mutably adding to it the properties of object b.
+ *
+ * @param {Object} a The object to be extended
+ * @param {Object} b The object to copy properties from
+ * @param {Object} thisArg The object to bind function to
+ * @return {Object} The resulting value of object a
+ */
+ function extend(a, b, thisArg) {
+ forEach(b, function assignValue(val, key) {
+ if (thisArg && typeof val === 'function') {
+ a[key] = bind$1(val, thisArg);
+ } else {
+ a[key] = val;
+ }
+ });
+ return a;
+ }
+
+ var utils = {
+ isArray: isArray,
+ isArrayBuffer: isArrayBuffer,
+ isBuffer: isBuffer,
+ isFormData: isFormData,
+ isArrayBufferView: isArrayBufferView,
+ isString: isString,
+ isNumber: isNumber,
+ isObject: isObject,
+ isUndefined: isUndefined,
+ isDate: isDate,
+ isFile: isFile,
+ isBlob: isBlob,
+ isFunction: isFunction,
+ isStream: isStream,
+ isURLSearchParams: isURLSearchParams,
+ isStandardBrowserEnv: isStandardBrowserEnv,
+ forEach: forEach,
+ merge: merge,
+ deepMerge: deepMerge,
+ extend: extend,
+ trim: trim
+ };
+ var utils_1 = utils.isArray;
+ var utils_2 = utils.isArrayBuffer;
+ var utils_3 = utils.isBuffer;
+ var utils_4 = utils.isFormData;
+ var utils_5 = utils.isArrayBufferView;
+ var utils_6 = utils.isString;
+ var utils_7 = utils.isNumber;
+ var utils_8 = utils.isObject;
+ var utils_9 = utils.isUndefined;
+ var utils_10 = utils.isDate;
+ var utils_11 = utils.isFile;
+ var utils_12 = utils.isBlob;
+ var utils_13 = utils.isFunction;
+ var utils_14 = utils.isStream;
+ var utils_15 = utils.isURLSearchParams;
+ var utils_16 = utils.isStandardBrowserEnv;
+ var utils_17 = utils.forEach;
+ var utils_18 = utils.merge;
+ var utils_19 = utils.deepMerge;
+ var utils_20 = utils.extend;
+ var utils_21 = utils.trim;
+
+ 'use strict';
+
+
+
+ function encode$1(val) {
+ return encodeURIComponent(val).
+ replace(/%40/gi, '@').
+ replace(/%3A/gi, ':').
+ replace(/%24/g, '$').
+ replace(/%2C/gi, ',').
+ replace(/%20/g, '+').
+ replace(/%5B/gi, '[').
+ replace(/%5D/gi, ']');
+ }
+
+ /**
+ * Build a URL by appending params to the end
+ *
+ * @param {string} url The base of the url (e.g., http://www.google.com)
+ * @param {object} [params] The params to be appended
+ * @returns {string} The formatted url
+ */
+ var buildURL = function buildURL(url, params, paramsSerializer) {
+ /*eslint no-param-reassign:0*/
+ if (!params) {
+ return url;
+ }
+
+ var serializedParams;
+ if (paramsSerializer) {
+ serializedParams = paramsSerializer(params);
+ } else if (utils.isURLSearchParams(params)) {
+ serializedParams = params.toString();
+ } else {
+ var parts = [];
+
+ utils.forEach(params, function serialize(val, key) {
+ if (val === null || typeof val === 'undefined') {
+ return;
+ }
+
+ if (utils.isArray(val)) {
+ key = key + '[]';
+ } else {
+ val = [val];
+ }
+
+ utils.forEach(val, function parseValue(v) {
+ if (utils.isDate(v)) {
+ v = v.toISOString();
+ } else if (utils.isObject(v)) {
+ v = JSON.stringify(v);
+ }
+ parts.push(encode$1(key) + '=' + encode$1(v));
+ });
+ });
+
+ serializedParams = parts.join('&');
+ }
+
+ if (serializedParams) {
+ var hashmarkIndex = url.indexOf('#');
+ if (hashmarkIndex !== -1) {
+ url = url.slice(0, hashmarkIndex);
+ }
+
+ url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
+ }
+
+ return url;
+ };
+
+ 'use strict';
+
+
+
+ function InterceptorManager() {
+ this.handlers = [];
+ }
+
+ /**
+ * Add a new interceptor to the stack
+ *
+ * @param {Function} fulfilled The function to handle `then` for a `Promise`
+ * @param {Function} rejected The function to handle `reject` for a `Promise`
+ *
+ * @return {Number} An ID used to remove interceptor later
+ */
+ InterceptorManager.prototype.use = function use(fulfilled, rejected) {
+ this.handlers.push({
+ fulfilled: fulfilled,
+ rejected: rejected
+ });
+ return this.handlers.length - 1;
+ };
+
+ /**
+ * Remove an interceptor from the stack
+ *
+ * @param {Number} id The ID that was returned by `use`
+ */
+ InterceptorManager.prototype.eject = function eject(id) {
+ if (this.handlers[id]) {
+ this.handlers[id] = null;
+ }
+ };
+
+ /**
+ * Iterate over all the registered interceptors
+ *
+ * This method is particularly useful for skipping over any
+ * interceptors that may have become `null` calling `eject`.
+ *
+ * @param {Function} fn The function to call for each interceptor
+ */
+ InterceptorManager.prototype.forEach = function forEach(fn) {
+ utils.forEach(this.handlers, function forEachHandler(h) {
+ if (h !== null) {
+ fn(h);
+ }
+ });
+ };
+
+ var InterceptorManager_1 = InterceptorManager;
+
+ 'use strict';
+
+
+
+ /**
+ * Transform the data for a request or a response
+ *
+ * @param {Object|String} data The data to be transformed
+ * @param {Array} headers The headers for the request or response
+ * @param {Array|Function} fns A single function or Array of functions
+ * @returns {*} The resulting transformed data
+ */
+ var transformData = function transformData(data, headers, fns) {
+ /*eslint no-param-reassign:0*/
+ utils.forEach(fns, function transform(fn) {
+ data = fn(data, headers);
+ });
+
+ return data;
+ };
+
+ 'use strict';
+
+ var isCancel = function isCancel(value) {
+ return !!(value && value.__CANCEL__);
+ };
+
+ 'use strict';
+
+
+
+ var normalizeHeaderName = function normalizeHeaderName(headers, normalizedName) {
+ utils.forEach(headers, function processHeader(value, name) {
+ if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
+ headers[normalizedName] = value;
+ delete headers[name];
+ }
+ });
+ };
+
+ 'use strict';
+
+ /**
+ * Update an Error with the specified config, error code, and response.
+ *
+ * @param {Error} error The error to update.
+ * @param {Object} config The config.
+ * @param {string} [code] The error code (for example, 'ECONNABORTED').
+ * @param {Object} [request] The request.
+ * @param {Object} [response] The response.
+ * @returns {Error} The error.
+ */
+ var enhanceError = function enhanceError(error, config, code, request, response) {
+ error.config = config;
+ if (code) {
+ error.code = code;
+ }
+
+ error.request = request;
+ error.response = response;
+ error.isAxiosError = true;
+
+ error.toJSON = function() {
+ return {
+ // Standard
+ message: this.message,
+ name: this.name,
+ // Microsoft
+ description: this.description,
+ number: this.number,
+ // Mozilla
+ fileName: this.fileName,
+ lineNumber: this.lineNumber,
+ columnNumber: this.columnNumber,
+ stack: this.stack,
+ // Axios
+ config: this.config,
+ code: this.code
+ };
+ };
+ return error;
+ };
+
+ 'use strict';
+
+
+
+ /**
+ * Create an Error with the specified message, config, error code, request and response.
+ *
+ * @param {string} message The error message.
+ * @param {Object} config The config.
+ * @param {string} [code] The error code (for example, 'ECONNABORTED').
+ * @param {Object} [request] The request.
+ * @param {Object} [response] The response.
+ * @returns {Error} The created error.
+ */
+ var createError = function createError(message, config, code, request, response) {
+ var error = new Error(message);
+ return enhanceError(error, config, code, request, response);
+ };
+
+ 'use strict';
+
+
+
+ /**
+ * Resolve or reject a Promise based on response status.
+ *
+ * @param {Function} resolve A function that resolves the promise.
+ * @param {Function} reject A function that rejects the promise.
+ * @param {object} response The response.
+ */
+ var settle = function settle(resolve, reject, response) {
+ var validateStatus = response.config.validateStatus;
+ if (!validateStatus || validateStatus(response.status)) {
+ resolve(response);
+ } else {
+ reject(createError(
+ 'Request failed with status code ' + response.status,
+ response.config,
+ null,
+ response.request,
+ response
+ ));
+ }
+ };
+
+ 'use strict';
+
+
+
+ // Headers whose duplicates are ignored by node
+ // c.f. https://nodejs.org/api/http.html#http_message_headers
+ var ignoreDuplicateOf = [
+ 'age', 'authorization', 'content-length', 'content-type', 'etag',
+ 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',
+ 'last-modified', 'location', 'max-forwards', 'proxy-authorization',
+ 'referer', 'retry-after', 'user-agent'
+ ];
+
+ /**
+ * Parse headers into an object
+ *
+ * ```
+ * Date: Wed, 27 Aug 2014 08:58:49 GMT
+ * Content-Type: application/json
+ * Connection: keep-alive
+ * Transfer-Encoding: chunked
+ * ```
+ *
+ * @param {String} headers Headers needing to be parsed
+ * @returns {Object} Headers parsed into an object
+ */
+ var parseHeaders = function parseHeaders(headers) {
+ var parsed = {};
+ var key;
+ var val;
+ var i;
+
+ if (!headers) { return parsed; }
+
+ utils.forEach(headers.split('\n'), function parser(line) {
+ i = line.indexOf(':');
+ key = utils.trim(line.substr(0, i)).toLowerCase();
+ val = utils.trim(line.substr(i + 1));
+
+ if (key) {
+ if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {
+ return;
+ }
+ if (key === 'set-cookie') {
+ parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);
+ } else {
+ parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
+ }
+ }
+ });
+
+ return parsed;
+ };
+
+ 'use strict';
+
+
+
+ var isURLSameOrigin = (
+ utils.isStandardBrowserEnv() ?
+
+ // Standard browser envs have full support of the APIs needed to test
+ // whether the request URL is of the same origin as current location.
+ (function standardBrowserEnv() {
+ var msie = /(msie|trident)/i.test(navigator.userAgent);
+ var urlParsingNode = document.createElement('a');
+ var originURL;
+
+ /**
+ * Parse a URL to discover it's components
+ *
+ * @param {String} url The URL to be parsed
+ * @returns {Object}
+ */
+ function resolveURL(url) {
+ var href = url;
+
+ if (msie) {
+ // IE needs attribute set twice to normalize properties
+ urlParsingNode.setAttribute('href', href);
+ href = urlParsingNode.href;
+ }
+
+ urlParsingNode.setAttribute('href', href);
+
+ // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
+ return {
+ href: urlParsingNode.href,
+ protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
+ host: urlParsingNode.host,
+ search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
+ hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
+ hostname: urlParsingNode.hostname,
+ port: urlParsingNode.port,
+ pathname: (urlParsingNode.pathname.charAt(0) === '/') ?
+ urlParsingNode.pathname :
+ '/' + urlParsingNode.pathname
+ };
+ }
+
+ originURL = resolveURL(window.location.href);
+
+ /**
+ * Determine if a URL shares the same origin as the current location
+ *
+ * @param {String} requestURL The URL to test
+ * @returns {boolean} True if URL shares the same origin, otherwise false
+ */
+ return function isURLSameOrigin(requestURL) {
+ var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;
+ return (parsed.protocol === originURL.protocol &&
+ parsed.host === originURL.host);
+ };
+ })() :
+
+ // Non standard browser envs (web workers, react-native) lack needed support.
+ (function nonStandardBrowserEnv() {
+ return function isURLSameOrigin() {
+ return true;
+ };
+ })()
+ );
+
+ 'use strict';
+
+
+
+ var cookies = (
+ utils.isStandardBrowserEnv() ?
+
+ // Standard browser envs support document.cookie
+ (function standardBrowserEnv() {
+ return {
+ write: function write(name, value, expires, path, domain, secure) {
+ var cookie = [];
+ cookie.push(name + '=' + encodeURIComponent(value));
+
+ if (utils.isNumber(expires)) {
+ cookie.push('expires=' + new Date(expires).toGMTString());
+ }
+
+ if (utils.isString(path)) {
+ cookie.push('path=' + path);
+ }
+
+ if (utils.isString(domain)) {
+ cookie.push('domain=' + domain);
+ }
+
+ if (secure === true) {
+ cookie.push('secure');
+ }
+
+ document.cookie = cookie.join('; ');
+ },
+
+ read: function read(name) {
+ var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
+ return (match ? decodeURIComponent(match[3]) : null);
+ },
+
+ remove: function remove(name) {
+ this.write(name, '', Date.now() - 86400000);
+ }
+ };
+ })() :
+
+ // Non standard browser env (web workers, react-native) lack needed support.
+ (function nonStandardBrowserEnv() {
+ return {
+ write: function write() {},
+ read: function read() { return null; },
+ remove: function remove() {}
+ };
+ })()
+ );
+
+ 'use strict';
+
+
+
+
+
+
+
+
+ var xhr = function xhrAdapter(config) {
+ return new Promise(function dispatchXhrRequest(resolve, reject) {
+ var requestData = config.data;
+ var requestHeaders = config.headers;
+
+ if (utils.isFormData(requestData)) {
+ delete requestHeaders['Content-Type']; // Let the browser set it
+ }
+
+ var request = new XMLHttpRequest();
+
+ // HTTP basic authentication
+ if (config.auth) {
+ var username = config.auth.username || '';
+ var password = config.auth.password || '';
+ requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);
+ }
+
+ request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true);
+
+ // Set the request timeout in MS
+ request.timeout = config.timeout;
+
+ // Listen for ready state
+ request.onreadystatechange = function handleLoad() {
+ if (!request || request.readyState !== 4) {
+ return;
+ }
+
+ // The request errored out and we didn't get a response, this will be
+ // handled by onerror instead
+ // With one exception: request that using file: protocol, most browsers
+ // will return status as 0 even though it's a successful request
+ if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
+ return;
+ }
+
+ // Prepare the response
+ var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
+ var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;
+ var response = {
+ data: responseData,
+ status: request.status,
+ statusText: request.statusText,
+ headers: responseHeaders,
+ config: config,
+ request: request
+ };
+
+ settle(resolve, reject, response);
+
+ // Clean up request
+ request = null;
+ };
+
+ // Handle browser request cancellation (as opposed to a manual cancellation)
+ request.onabort = function handleAbort() {
+ if (!request) {
+ return;
+ }
+
+ reject(createError('Request aborted', config, 'ECONNABORTED', request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Handle low level network errors
+ request.onerror = function handleError() {
+ // Real errors are hidden from us by the browser
+ // onerror should only fire if it's a network error
+ reject(createError('Network Error', config, null, request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Handle timeout
+ request.ontimeout = function handleTimeout() {
+ reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',
+ request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Add xsrf header
+ // This is only done if running in a standard browser environment.
+ // Specifically not if we're in a web worker, or react-native.
+ if (utils.isStandardBrowserEnv()) {
+ var cookies$1 = cookies;
+
+ // Add xsrf header
+ var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ?
+ cookies$1.read(config.xsrfCookieName) :
+ undefined;
+
+ if (xsrfValue) {
+ requestHeaders[config.xsrfHeaderName] = xsrfValue;
+ }
+ }
+
+ // Add headers to the request
+ if ('setRequestHeader' in request) {
+ utils.forEach(requestHeaders, function setRequestHeader(val, key) {
+ if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
+ // Remove Content-Type if data is undefined
+ delete requestHeaders[key];
+ } else {
+ // Otherwise add header to the request
+ request.setRequestHeader(key, val);
+ }
+ });
+ }
+
+ // Add withCredentials to request if needed
+ if (config.withCredentials) {
+ request.withCredentials = true;
+ }
+
+ // Add responseType to request if needed
+ if (config.responseType) {
+ try {
+ request.responseType = config.responseType;
+ } catch (e) {
+ // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.
+ // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.
+ if (config.responseType !== 'json') {
+ throw e;
+ }
+ }
+ }
+
+ // Handle progress if needed
+ if (typeof config.onDownloadProgress === 'function') {
+ request.addEventListener('progress', config.onDownloadProgress);
+ }
+
+ // Not all browsers support upload events
+ if (typeof config.onUploadProgress === 'function' && request.upload) {
+ request.upload.addEventListener('progress', config.onUploadProgress);
+ }
+
+ if (config.cancelToken) {
+ // Handle cancellation
+ config.cancelToken.promise.then(function onCanceled(cancel) {
+ if (!request) {
+ return;
+ }
+
+ request.abort();
+ reject(cancel);
+ // Clean up request
+ request = null;
+ });
+ }
+
+ if (requestData === undefined) {
+ requestData = null;
+ }
+
+ // Send the request
+ request.send(requestData);
+ });
+ };
+
+ 'use strict';
+
+
+
+
+ var DEFAULT_CONTENT_TYPE = {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ };
+
+ function setContentTypeIfUnset(headers, value) {
+ if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
+ headers['Content-Type'] = value;
+ }
+ }
+
+ function getDefaultAdapter() {
+ var adapter;
+ // Only Node.JS has a process variable that is of [[Class]] process
+ if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
+ // For node use HTTP adapter
+ adapter = xhr;
+ } else if (typeof XMLHttpRequest !== 'undefined') {
+ // For browsers use XHR adapter
+ adapter = xhr;
+ }
+ return adapter;
+ }
+
+ var defaults = {
+ adapter: getDefaultAdapter(),
+
+ transformRequest: [function transformRequest(data, headers) {
+ normalizeHeaderName(headers, 'Accept');
+ normalizeHeaderName(headers, 'Content-Type');
+ if (utils.isFormData(data) ||
+ utils.isArrayBuffer(data) ||
+ utils.isBuffer(data) ||
+ utils.isStream(data) ||
+ utils.isFile(data) ||
+ utils.isBlob(data)
+ ) {
+ return data;
+ }
+ if (utils.isArrayBufferView(data)) {
+ return data.buffer;
+ }
+ if (utils.isURLSearchParams(data)) {
+ setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
+ return data.toString();
+ }
+ if (utils.isObject(data)) {
+ setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
+ return JSON.stringify(data);
+ }
+ return data;
+ }],
+
+ transformResponse: [function transformResponse(data) {
+ /*eslint no-param-reassign:0*/
+ if (typeof data === 'string') {
+ try {
+ data = JSON.parse(data);
+ } catch (e) { /* Ignore */ }
+ }
+ return data;
+ }],
+
+ /**
+ * A timeout in milliseconds to abort a request. If set to 0 (default) a
+ * timeout is not created.
+ */
+ timeout: 0,
+
+ xsrfCookieName: 'XSRF-TOKEN',
+ xsrfHeaderName: 'X-XSRF-TOKEN',
+
+ maxContentLength: -1,
+
+ validateStatus: function validateStatus(status) {
+ return status >= 200 && status < 300;
+ }
+ };
+
+ defaults.headers = {
+ common: {
+ 'Accept': 'application/json, text/plain, */*'
+ }
+ };
+
+ utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
+ defaults.headers[method] = {};
+ });
+
+ utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
+ defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
+ });
+
+ var defaults_1 = defaults;
+
+ 'use strict';
+
+ /**
+ * Determines whether the specified URL is absolute
+ *
+ * @param {string} url The URL to test
+ * @returns {boolean} True if the specified URL is absolute, otherwise false
+ */
+ var isAbsoluteURL = function isAbsoluteURL(url) {
+ // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
+ // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
+ // by any combination of letters, digits, plus, period, or hyphen.
+ return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
+ };
+
+ 'use strict';
+
+ /**
+ * Creates a new URL by combining the specified URLs
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} relativeURL The relative URL
+ * @returns {string} The combined URL
+ */
+ var combineURLs = function combineURLs(baseURL, relativeURL) {
+ return relativeURL
+ ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
+ : baseURL;
+ };
+
+ 'use strict';
+
+
+
+
+
+
+
+
+ /**
+ * Throws a `Cancel` if cancellation has been requested.
+ */
+ function throwIfCancellationRequested(config) {
+ if (config.cancelToken) {
+ config.cancelToken.throwIfRequested();
+ }
+ }
+
+ /**
+ * Dispatch a request to the server using the configured adapter.
+ *
+ * @param {object} config The config that is to be used for the request
+ * @returns {Promise} The Promise to be fulfilled
+ */
+ var dispatchRequest = function dispatchRequest(config) {
+ throwIfCancellationRequested(config);
+
+ // Support baseURL config
+ if (config.baseURL && !isAbsoluteURL(config.url)) {
+ config.url = combineURLs(config.baseURL, config.url);
+ }
+
+ // Ensure headers exist
+ config.headers = config.headers || {};
+
+ // Transform request data
+ config.data = transformData(
+ config.data,
+ config.headers,
+ config.transformRequest
+ );
+
+ // Flatten headers
+ config.headers = utils.merge(
+ config.headers.common || {},
+ config.headers[config.method] || {},
+ config.headers || {}
+ );
+
+ utils.forEach(
+ ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
+ function cleanHeaderConfig(method) {
+ delete config.headers[method];
+ }
+ );
+
+ var adapter = config.adapter || defaults_1.adapter;
+
+ return adapter(config).then(function onAdapterResolution(response) {
+ throwIfCancellationRequested(config);
+
+ // Transform response data
+ response.data = transformData(
+ response.data,
+ response.headers,
+ config.transformResponse
+ );
+
+ return response;
+ }, function onAdapterRejection(reason) {
+ if (!isCancel(reason)) {
+ throwIfCancellationRequested(config);
+
+ // Transform response data
+ if (reason && reason.response) {
+ reason.response.data = transformData(
+ reason.response.data,
+ reason.response.headers,
+ config.transformResponse
+ );
+ }
+ }
+
+ return Promise.reject(reason);
+ });
+ };
+
+ 'use strict';
+
+
+
+ /**
+ * Config-specific merge-function which creates a new config-object
+ * by merging two configuration objects together.
+ *
+ * @param {Object} config1
+ * @param {Object} config2
+ * @returns {Object} New object resulting from merging config2 to config1
+ */
+ var mergeConfig = function mergeConfig(config1, config2) {
+ // eslint-disable-next-line no-param-reassign
+ config2 = config2 || {};
+ var config = {};
+
+ utils.forEach(['url', 'method', 'params', 'data'], function valueFromConfig2(prop) {
+ if (typeof config2[prop] !== 'undefined') {
+ config[prop] = config2[prop];
+ }
+ });
+
+ utils.forEach(['headers', 'auth', 'proxy'], function mergeDeepProperties(prop) {
+ if (utils.isObject(config2[prop])) {
+ config[prop] = utils.deepMerge(config1[prop], config2[prop]);
+ } else if (typeof config2[prop] !== 'undefined') {
+ config[prop] = config2[prop];
+ } else if (utils.isObject(config1[prop])) {
+ config[prop] = utils.deepMerge(config1[prop]);
+ } else if (typeof config1[prop] !== 'undefined') {
+ config[prop] = config1[prop];
+ }
+ });
+
+ utils.forEach([
+ 'baseURL', 'transformRequest', 'transformResponse', 'paramsSerializer',
+ 'timeout', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName',
+ 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'maxContentLength',
+ 'validateStatus', 'maxRedirects', 'httpAgent', 'httpsAgent', 'cancelToken',
+ 'socketPath'
+ ], function defaultToConfig2(prop) {
+ if (typeof config2[prop] !== 'undefined') {
+ config[prop] = config2[prop];
+ } else if (typeof config1[prop] !== 'undefined') {
+ config[prop] = config1[prop];
+ }
+ });
+
+ return config;
+ };
+
+ 'use strict';
+
+
+
+
+
+
+
+ /**
+ * Create a new instance of Axios
+ *
+ * @param {Object} instanceConfig The default config for the instance
+ */
+ function Axios(instanceConfig) {
+ this.defaults = instanceConfig;
+ this.interceptors = {
+ request: new InterceptorManager_1(),
+ response: new InterceptorManager_1()
+ };
+ }
+
+ /**
+ * Dispatch a request
+ *
+ * @param {Object} config The config specific for this request (merged with this.defaults)
+ */
+ Axios.prototype.request = function request(config) {
+ /*eslint no-param-reassign:0*/
+ // Allow for axios('example/url'[, config]) a la fetch API
+ if (typeof config === 'string') {
+ config = arguments[1] || {};
+ config.url = arguments[0];
+ } else {
+ config = config || {};
+ }
+
+ config = mergeConfig(this.defaults, config);
+ config.method = config.method ? config.method.toLowerCase() : 'get';
+
+ // Hook up interceptors middleware
+ var chain = [dispatchRequest, undefined];
+ var promise = Promise.resolve(config);
+
+ this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
+ chain.unshift(interceptor.fulfilled, interceptor.rejected);
+ });
+
+ this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
+ chain.push(interceptor.fulfilled, interceptor.rejected);
+ });
+
+ while (chain.length) {
+ promise = promise.then(chain.shift(), chain.shift());
+ }
+
+ return promise;
+ };
+
+ Axios.prototype.getUri = function getUri(config) {
+ config = mergeConfig(this.defaults, config);
+ return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, '');
+ };
+
+ // Provide aliases for supported request methods
+ utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
+ /*eslint func-names:0*/
+ Axios.prototype[method] = function(url, config) {
+ return this.request(utils.merge(config || {}, {
+ method: method,
+ url: url
+ }));
+ };
+ });
+
+ utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
+ /*eslint func-names:0*/
+ Axios.prototype[method] = function(url, data, config) {
+ return this.request(utils.merge(config || {}, {
+ method: method,
+ url: url,
+ data: data
+ }));
+ };
+ });
+
+ var Axios_1 = Axios;
+
+ 'use strict';
+
+ /**
+ * A `Cancel` is an object that is thrown when an operation is canceled.
+ *
+ * @class
+ * @param {string=} message The message.
+ */
+ function Cancel(message) {
+ this.message = message;
+ }
+
+ Cancel.prototype.toString = function toString() {
+ return 'Cancel' + (this.message ? ': ' + this.message : '');
+ };
+
+ Cancel.prototype.__CANCEL__ = true;
+
+ var Cancel_1 = Cancel;
+
+ 'use strict';
+
+
+
+ /**
+ * A `CancelToken` is an object that can be used to request cancellation of an operation.
+ *
+ * @class
+ * @param {Function} executor The executor function.
+ */
+ function CancelToken(executor) {
+ if (typeof executor !== 'function') {
+ throw new TypeError('executor must be a function.');
+ }
+
+ var resolvePromise;
+ this.promise = new Promise(function promiseExecutor(resolve) {
+ resolvePromise = resolve;
+ });
+
+ var token = this;
+ executor(function cancel(message) {
+ if (token.reason) {
+ // Cancellation has already been requested
+ return;
+ }
+
+ token.reason = new Cancel_1(message);
+ resolvePromise(token.reason);
+ });
+ }
+
+ /**
+ * Throws a `Cancel` if cancellation has been requested.
+ */
+ CancelToken.prototype.throwIfRequested = function throwIfRequested() {
+ if (this.reason) {
+ throw this.reason;
+ }
+ };
+
+ /**
+ * Returns an object that contains a new `CancelToken` and a function that, when called,
+ * cancels the `CancelToken`.
+ */
+ CancelToken.source = function source() {
+ var cancel;
+ var token = new CancelToken(function executor(c) {
+ cancel = c;
+ });
+ return {
+ token: token,
+ cancel: cancel
+ };
+ };
+
+ var CancelToken_1 = CancelToken;
+
+ 'use strict';
+
+ /**
+ * Syntactic sugar for invoking a function and expanding an array for arguments.
+ *
+ * Common use case would be to use `Function.prototype.apply`.
+ *
+ * ```js
+ * function f(x, y, z) {}
+ * var args = [1, 2, 3];
+ * f.apply(null, args);
+ * ```
+ *
+ * With `spread` this example can be re-written.
+ *
+ * ```js
+ * spread(function(x, y, z) {})([1, 2, 3]);
+ * ```
+ *
+ * @param {Function} callback
+ * @returns {Function}
+ */
+ var spread$1 = function spread(callback) {
+ return function wrap(arr) {
+ return callback.apply(null, arr);
+ };
+ };
+
+ 'use strict';
+
+
+
+
+
+
+
+ /**
+ * Create an instance of Axios
+ *
+ * @param {Object} defaultConfig The default config for the instance
+ * @return {Axios} A new instance of Axios
+ */
+ function createInstance(defaultConfig) {
+ var context = new Axios_1(defaultConfig);
+ var instance = bind$1(Axios_1.prototype.request, context);
+
+ // Copy axios.prototype to instance
+ utils.extend(instance, Axios_1.prototype, context);
+
+ // Copy context to instance
+ utils.extend(instance, context);
+
+ return instance;
+ }
+
+ // Create the default instance to be exported
+ var axios = createInstance(defaults_1);
+
+ // Expose Axios class to allow class inheritance
+ axios.Axios = Axios_1;
+
+ // Factory for creating new instances
+ axios.create = function create(instanceConfig) {
+ return createInstance(mergeConfig(axios.defaults, instanceConfig));
+ };
+
+ // Expose Cancel & CancelToken
+ axios.Cancel = Cancel_1;
+ axios.CancelToken = CancelToken_1;
+ axios.isCancel = isCancel;
+
+ // Expose all/spread
+ axios.all = function all(promises) {
+ return Promise.all(promises);
+ };
+ axios.spread = spread$1;
+
+ var axios_1 = axios;
+
+ // Allow use of default import syntax in TypeScript
+ var default_1 = axios;
+ axios_1.default = default_1;
+
+ var axios$1 = axios_1;
+
+ 'use strict';
+
+ var has$1 = Object.prototype.hasOwnProperty;
+ var isArray$1 = Array.isArray;
+
+ var hexTable = (function () {
+ var array = [];
+ for (var i = 0; i < 256; ++i) {
+ array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());
+ }
+
+ return array;
+ }());
+
+ var compactQueue = function compactQueue(queue) {
+ while (queue.length > 1) {
+ var item = queue.pop();
+ var obj = item.obj[item.prop];
+
+ if (isArray$1(obj)) {
+ var compacted = [];
+
+ for (var j = 0; j < obj.length; ++j) {
+ if (typeof obj[j] !== 'undefined') {
+ compacted.push(obj[j]);
+ }
+ }
+
+ item.obj[item.prop] = compacted;
+ }
+ }
+ };
+
+ var arrayToObject = function arrayToObject(source, options) {
+ var obj = options && options.plainObjects ? Object.create(null) : {};
+ for (var i = 0; i < source.length; ++i) {
+ if (typeof source[i] !== 'undefined') {
+ obj[i] = source[i];
+ }
+ }
+
+ return obj;
+ };
+
+ var merge$1 = function merge(target, source, options) {
+ if (!source) {
+ return target;
+ }
+
+ if (typeof source !== 'object') {
+ if (isArray$1(target)) {
+ target.push(source);
+ } else if (target && typeof target === 'object') {
+ if ((options && (options.plainObjects || options.allowPrototypes)) || !has$1.call(Object.prototype, source)) {
+ target[source] = true;
+ }
+ } else {
+ return [target, source];
+ }
+
+ return target;
+ }
+
+ if (!target || typeof target !== 'object') {
+ return [target].concat(source);
+ }
+
+ var mergeTarget = target;
+ if (isArray$1(target) && !isArray$1(source)) {
+ mergeTarget = arrayToObject(target, options);
+ }
+
+ if (isArray$1(target) && isArray$1(source)) {
+ source.forEach(function (item, i) {
+ if (has$1.call(target, i)) {
+ var targetItem = target[i];
+ if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {
+ target[i] = merge(targetItem, item, options);
+ } else {
+ target.push(item);
+ }
+ } else {
+ target[i] = item;
+ }
+ });
+ return target;
+ }
+
+ return Object.keys(source).reduce(function (acc, key) {
+ var value = source[key];
+
+ if (has$1.call(acc, key)) {
+ acc[key] = merge(acc[key], value, options);
+ } else {
+ acc[key] = value;
+ }
+ return acc;
+ }, mergeTarget);
+ };
+
+ var assign$1 = function assignSingleSource(target, source) {
+ return Object.keys(source).reduce(function (acc, key) {
+ acc[key] = source[key];
+ return acc;
+ }, target);
+ };
+
+ var decode$1 = function (str, decoder, charset) {
+ var strWithoutPlus = str.replace(/\+/g, ' ');
+ if (charset === 'iso-8859-1') {
+ // unescape never throws, no try...catch needed:
+ return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);
+ }
+ // utf-8
+ try {
+ return decodeURIComponent(strWithoutPlus);
+ } catch (e) {
+ return strWithoutPlus;
+ }
+ };
+
+ var encode$2 = function encode(str, defaultEncoder, charset) {
+ // This code was originally written by Brian White (mscdex) for the io.js core querystring library.
+ // It has been adapted here for stricter adherence to RFC 3986
+ if (str.length === 0) {
+ return str;
+ }
+
+ var string = str;
+ if (typeof str === 'symbol') {
+ string = Symbol.prototype.toString.call(str);
+ } else if (typeof str !== 'string') {
+ string = String(str);
+ }
+
+ if (charset === 'iso-8859-1') {
+ return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {
+ return '%26%23' + parseInt($0.slice(2), 16) + '%3B';
+ });
+ }
+
+ var out = '';
+ for (var i = 0; i < string.length; ++i) {
+ var c = string.charCodeAt(i);
+
+ if (
+ c === 0x2D // -
+ || c === 0x2E // .
+ || c === 0x5F // _
+ || c === 0x7E // ~
+ || (c >= 0x30 && c <= 0x39) // 0-9
+ || (c >= 0x41 && c <= 0x5A) // a-z
+ || (c >= 0x61 && c <= 0x7A) // A-Z
+ ) {
+ out += string.charAt(i);
+ continue;
+ }
+
+ if (c < 0x80) {
+ out = out + hexTable[c];
+ continue;
+ }
+
+ if (c < 0x800) {
+ out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
+ continue;
+ }
+
+ if (c < 0xD800 || c >= 0xE000) {
+ out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
+ continue;
+ }
+
+ i += 1;
+ c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
+ out += hexTable[0xF0 | (c >> 18)]
+ + hexTable[0x80 | ((c >> 12) & 0x3F)]
+ + hexTable[0x80 | ((c >> 6) & 0x3F)]
+ + hexTable[0x80 | (c & 0x3F)];
+ }
+
+ return out;
+ };
+
+ var compact = function compact(value) {
+ var queue = [{ obj: { o: value }, prop: 'o' }];
+ var refs = [];
+
+ for (var i = 0; i < queue.length; ++i) {
+ var item = queue[i];
+ var obj = item.obj[item.prop];
+
+ var keys = Object.keys(obj);
+ for (var j = 0; j < keys.length; ++j) {
+ var key = keys[j];
+ var val = obj[key];
+ if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {
+ queue.push({ obj: obj, prop: key });
+ refs.push(val);
+ }
+ }
+ }
+
+ compactQueue(queue);
+
+ return value;
+ };
+
+ var isRegExp = function isRegExp(obj) {
+ return Object.prototype.toString.call(obj) === '[object RegExp]';
+ };
+
+ var isBuffer$1 = function isBuffer(obj) {
+ if (!obj || typeof obj !== 'object') {
+ return false;
+ }
+
+ return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
+ };
+
+ var combine = function combine(a, b) {
+ return [].concat(a, b);
+ };
+
+ var utils$1 = {
+ arrayToObject: arrayToObject,
+ assign: assign$1,
+ combine: combine,
+ compact: compact,
+ decode: decode$1,
+ encode: encode$2,
+ isBuffer: isBuffer$1,
+ isRegExp: isRegExp,
+ merge: merge$1
+ };
+ var utils_1$1 = utils$1.arrayToObject;
+ var utils_2$1 = utils$1.assign;
+ var utils_3$1 = utils$1.combine;
+ var utils_4$1 = utils$1.compact;
+ var utils_5$1 = utils$1.decode;
+ var utils_6$1 = utils$1.encode;
+ var utils_7$1 = utils$1.isBuffer;
+ var utils_8$1 = utils$1.isRegExp;
+ var utils_9$1 = utils$1.merge;
+
+ 'use strict';
+
+ var replace = String.prototype.replace;
+ var percentTwenties = /%20/g;
+
+
+
+ var Format = {
+ RFC1738: 'RFC1738',
+ RFC3986: 'RFC3986'
+ };
+
+ var formats = utils$1.assign(
+ {
+ 'default': Format.RFC3986,
+ formatters: {
+ RFC1738: function (value) {
+ return replace.call(value, percentTwenties, '+');
+ },
+ RFC3986: function (value) {
+ return String(value);
+ }
+ }
+ },
+ Format
+ );
+
+ 'use strict';
+
+
+
+ var has$2 = Object.prototype.hasOwnProperty;
+
+ var arrayPrefixGenerators = {
+ brackets: function brackets(prefix) {
+ return prefix + '[]';
+ },
+ comma: 'comma',
+ indices: function indices(prefix, key) {
+ return prefix + '[' + key + ']';
+ },
+ repeat: function repeat(prefix) {
+ return prefix;
+ }
+ };
+
+ var isArray$2 = Array.isArray;
+ var push = Array.prototype.push;
+ var pushToArray = function (arr, valueOrArray) {
+ push.apply(arr, isArray$2(valueOrArray) ? valueOrArray : [valueOrArray]);
+ };
+
+ var toISO = Date.prototype.toISOString;
+
+ var defaultFormat = formats['default'];
+ var defaults$1 = {
+ addQueryPrefix: false,
+ allowDots: false,
+ charset: 'utf-8',
+ charsetSentinel: false,
+ delimiter: '&',
+ encode: true,
+ encoder: utils$1.encode,
+ encodeValuesOnly: false,
+ format: defaultFormat,
+ formatter: formats.formatters[defaultFormat],
+ // deprecated
+ indices: false,
+ serializeDate: function serializeDate(date) {
+ return toISO.call(date);
+ },
+ skipNulls: false,
+ strictNullHandling: false
+ };
+
+ var isNonNullishPrimitive = function isNonNullishPrimitive(v) {
+ return typeof v === 'string'
+ || typeof v === 'number'
+ || typeof v === 'boolean'
+ || typeof v === 'symbol'
+ || typeof v === 'bigint';
+ };
+
+ var stringify$1 = function stringify(
+ object,
+ prefix,
+ generateArrayPrefix,
+ strictNullHandling,
+ skipNulls,
+ encoder,
+ filter,
+ sort,
+ allowDots,
+ serializeDate,
+ formatter,
+ encodeValuesOnly,
+ charset
+ ) {
+ var obj = object;
+ if (typeof filter === 'function') {
+ obj = filter(prefix, obj);
+ } else if (obj instanceof Date) {
+ obj = serializeDate(obj);
+ } else if (generateArrayPrefix === 'comma' && isArray$2(obj)) {
+ obj = obj.join(',');
+ }
+
+ if (obj === null) {
+ if (strictNullHandling) {
+ return encoder && !encodeValuesOnly ? encoder(prefix, defaults$1.encoder, charset, 'key') : prefix;
+ }
+
+ obj = '';
+ }
+
+ if (isNonNullishPrimitive(obj) || utils$1.isBuffer(obj)) {
+ if (encoder) {
+ var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults$1.encoder, charset, 'key');
+ return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults$1.encoder, charset, 'value'))];
+ }
+ return [formatter(prefix) + '=' + formatter(String(obj))];
+ }
+
+ var values = [];
+
+ if (typeof obj === 'undefined') {
+ return values;
+ }
+
+ var objKeys;
+ if (isArray$2(filter)) {
+ objKeys = filter;
+ } else {
+ var keys = Object.keys(obj);
+ objKeys = sort ? keys.sort(sort) : keys;
+ }
+
+ for (var i = 0; i < objKeys.length; ++i) {
+ var key = objKeys[i];
+
+ if (skipNulls && obj[key] === null) {
+ continue;
+ }
+
+ if (isArray$2(obj)) {
+ pushToArray(values, stringify(
+ obj[key],
+ typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix,
+ generateArrayPrefix,
+ strictNullHandling,
+ skipNulls,
+ encoder,
+ filter,
+ sort,
+ allowDots,
+ serializeDate,
+ formatter,
+ encodeValuesOnly,
+ charset
+ ));
+ } else {
+ pushToArray(values, stringify(
+ obj[key],
+ prefix + (allowDots ? '.' + key : '[' + key + ']'),
+ generateArrayPrefix,
+ strictNullHandling,
+ skipNulls,
+ encoder,
+ filter,
+ sort,
+ allowDots,
+ serializeDate,
+ formatter,
+ encodeValuesOnly,
+ charset
+ ));
+ }
+ }
+
+ return values;
+ };
+
+ var normalizeStringifyOptions = function normalizeStringifyOptions(opts) {
+ if (!opts) {
+ return defaults$1;
+ }
+
+ if (opts.encoder !== null && opts.encoder !== undefined && typeof opts.encoder !== 'function') {
+ throw new TypeError('Encoder has to be a function.');
+ }
+
+ var charset = opts.charset || defaults$1.charset;
+ if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
+ throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');
+ }
+
+ var format = formats['default'];
+ if (typeof opts.format !== 'undefined') {
+ if (!has$2.call(formats.formatters, opts.format)) {
+ throw new TypeError('Unknown format option provided.');
+ }
+ format = opts.format;
+ }
+ var formatter = formats.formatters[format];
+
+ var filter = defaults$1.filter;
+ if (typeof opts.filter === 'function' || isArray$2(opts.filter)) {
+ filter = opts.filter;
+ }
+
+ return {
+ addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults$1.addQueryPrefix,
+ allowDots: typeof opts.allowDots === 'undefined' ? defaults$1.allowDots : !!opts.allowDots,
+ charset: charset,
+ charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults$1.charsetSentinel,
+ delimiter: typeof opts.delimiter === 'undefined' ? defaults$1.delimiter : opts.delimiter,
+ encode: typeof opts.encode === 'boolean' ? opts.encode : defaults$1.encode,
+ encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults$1.encoder,
+ encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults$1.encodeValuesOnly,
+ filter: filter,
+ formatter: formatter,
+ serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults$1.serializeDate,
+ skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults$1.skipNulls,
+ sort: typeof opts.sort === 'function' ? opts.sort : null,
+ strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults$1.strictNullHandling
+ };
+ };
+
+ var stringify_1 = function (object, opts) {
+ var obj = object;
+ var options = normalizeStringifyOptions(opts);
+
+ var objKeys;
+ var filter;
+
+ if (typeof options.filter === 'function') {
+ filter = options.filter;
+ obj = filter('', obj);
+ } else if (isArray$2(options.filter)) {
+ filter = options.filter;
+ objKeys = filter;
+ }
+
+ var keys = [];
+
+ if (typeof obj !== 'object' || obj === null) {
+ return '';
+ }
+
+ var arrayFormat;
+ if (opts && opts.arrayFormat in arrayPrefixGenerators) {
+ arrayFormat = opts.arrayFormat;
+ } else if (opts && 'indices' in opts) {
+ arrayFormat = opts.indices ? 'indices' : 'repeat';
+ } else {
+ arrayFormat = 'indices';
+ }
+
+ var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];
+
+ if (!objKeys) {
+ objKeys = Object.keys(obj);
+ }
+
+ if (options.sort) {
+ objKeys.sort(options.sort);
+ }
+
+ for (var i = 0; i < objKeys.length; ++i) {
+ var key = objKeys[i];
+
+ if (options.skipNulls && obj[key] === null) {
+ continue;
+ }
+ pushToArray(keys, stringify$1(
+ obj[key],
+ key,
+ generateArrayPrefix,
+ options.strictNullHandling,
+ options.skipNulls,
+ options.encode ? options.encoder : null,
+ options.filter,
+ options.sort,
+ options.allowDots,
+ options.serializeDate,
+ options.formatter,
+ options.encodeValuesOnly,
+ options.charset
+ ));
+ }
+
+ var joined = keys.join(options.delimiter);
+ var prefix = options.addQueryPrefix === true ? '?' : '';
+
+ if (options.charsetSentinel) {
+ if (options.charset === 'iso-8859-1') {
+ // encodeURIComponent('&#10003;'), the "numeric entity" representation of a checkmark
+ prefix += 'utf8=%26%2310003%3B&';
+ } else {
+ // encodeURIComponent('✓')
+ prefix += 'utf8=%E2%9C%93&';
+ }
+ }
+
+ return joined.length > 0 ? prefix + joined : '';
+ };
+
+ 'use strict';
+
+
+
+ var has$3 = Object.prototype.hasOwnProperty;
+
+ var defaults$2 = {
+ allowDots: false,
+ allowPrototypes: false,
+ arrayLimit: 20,
+ charset: 'utf-8',
+ charsetSentinel: false,
+ comma: false,
+ decoder: utils$1.decode,
+ delimiter: '&',
+ depth: 5,
+ ignoreQueryPrefix: false,
+ interpretNumericEntities: false,
+ parameterLimit: 1000,
+ parseArrays: true,
+ plainObjects: false,
+ strictNullHandling: false
+ };
+
+ var interpretNumericEntities = function (str) {
+ return str.replace(/&#(\d+);/g, function ($0, numberStr) {
+ return String.fromCharCode(parseInt(numberStr, 10));
+ });
+ };
+
+ // This is what browsers will submit when the ✓ character occurs in an
+ // application/x-www-form-urlencoded body and the encoding of the page containing
+ // the form is iso-8859-1, or when the submitted form has an accept-charset
+ // attribute of iso-8859-1. Presumably also with other charsets that do not contain
+ // the ✓ character, such as us-ascii.
+ var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('&#10003;')
+
+ // These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded.
+ var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓')
+
+ var parseValues = function parseQueryStringValues(str, options) {
+ var obj = {};
+ var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str;
+ var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;
+ var parts = cleanStr.split(options.delimiter, limit);
+ var skipIndex = -1; // Keep track of where the utf8 sentinel was found
+ var i;
+
+ var charset = options.charset;
+ if (options.charsetSentinel) {
+ for (i = 0; i < parts.length; ++i) {
+ if (parts[i].indexOf('utf8=') === 0) {
+ if (parts[i] === charsetSentinel) {
+ charset = 'utf-8';
+ } else if (parts[i] === isoSentinel) {
+ charset = 'iso-8859-1';
+ }
+ skipIndex = i;
+ i = parts.length; // The eslint settings do not allow break;
+ }
+ }
+ }
+
+ for (i = 0; i < parts.length; ++i) {
+ if (i === skipIndex) {
+ continue;
+ }
+ var part = parts[i];
+
+ var bracketEqualsPos = part.indexOf(']=');
+ var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;
+
+ var key, val;
+ if (pos === -1) {
+ key = options.decoder(part, defaults$2.decoder, charset, 'key');
+ val = options.strictNullHandling ? null : '';
+ } else {
+ key = options.decoder(part.slice(0, pos), defaults$2.decoder, charset, 'key');
+ val = options.decoder(part.slice(pos + 1), defaults$2.decoder, charset, 'value');
+ }
+
+ if (val && options.interpretNumericEntities && charset === 'iso-8859-1') {
+ val = interpretNumericEntities(val);
+ }
+
+ if (val && options.comma && val.indexOf(',') > -1) {
+ val = val.split(',');
+ }
+
+ if (has$3.call(obj, key)) {
+ obj[key] = utils$1.combine(obj[key], val);
+ } else {
+ obj[key] = val;
+ }
+ }
+
+ return obj;
+ };
+
+ var parseObject = function (chain, val, options) {
+ var leaf = val;
+
+ for (var i = chain.length - 1; i >= 0; --i) {
+ var obj;
+ var root = chain[i];
+
+ if (root === '[]' && options.parseArrays) {
+ obj = [].concat(leaf);
+ } else {
+ obj = options.plainObjects ? Object.create(null) : {};
+ var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;
+ var index = parseInt(cleanRoot, 10);
+ if (!options.parseArrays && cleanRoot === '') {
+ obj = { 0: leaf };
+ } else if (
+ !isNaN(index)
+ && root !== cleanRoot
+ && String(index) === cleanRoot
+ && index >= 0
+ && (options.parseArrays && index <= options.arrayLimit)
+ ) {
+ obj = [];
+ obj[index] = leaf;
+ } else {
+ obj[cleanRoot] = leaf;
+ }
+ }
+
+ leaf = obj;
+ }
+
+ return leaf;
+ };
+
+ var parseKeys = function parseQueryStringKeys(givenKey, val, options) {
+ if (!givenKey) {
+ return;
+ }
+
+ // Transform dot notation to bracket notation
+ var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey;
+
+ // The regex chunks
+
+ var brackets = /(\[[^[\]]*])/;
+ var child = /(\[[^[\]]*])/g;
+
+ // Get the parent
+
+ var segment = options.depth > 0 && brackets.exec(key);
+ var parent = segment ? key.slice(0, segment.index) : key;
+
+ // Stash the parent if it exists
+
+ var keys = [];
+ if (parent) {
+ // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties
+ if (!options.plainObjects && has$3.call(Object.prototype, parent)) {
+ if (!options.allowPrototypes) {
+ return;
+ }
+ }
+
+ keys.push(parent);
+ }
+
+ // Loop through children appending to the array until we hit depth
+
+ var i = 0;
+ while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) {
+ i += 1;
+ if (!options.plainObjects && has$3.call(Object.prototype, segment[1].slice(1, -1))) {
+ if (!options.allowPrototypes) {
+ return;
+ }
+ }
+ keys.push(segment[1]);
+ }
+
+ // If there's a remainder, just add whatever is left
+
+ if (segment) {
+ keys.push('[' + key.slice(segment.index) + ']');
+ }
+
+ return parseObject(keys, val, options);
+ };
+
+ var normalizeParseOptions = function normalizeParseOptions(opts) {
+ if (!opts) {
+ return defaults$2;
+ }
+
+ if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') {
+ throw new TypeError('Decoder has to be a function.');
+ }
+
+ if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {
+ throw new Error('The charset option must be either utf-8, iso-8859-1, or undefined');
+ }
+ var charset = typeof opts.charset === 'undefined' ? defaults$2.charset : opts.charset;
+
+ return {
+ allowDots: typeof opts.allowDots === 'undefined' ? defaults$2.allowDots : !!opts.allowDots,
+ allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults$2.allowPrototypes,
+ arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults$2.arrayLimit,
+ charset: charset,
+ charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults$2.charsetSentinel,
+ comma: typeof opts.comma === 'boolean' ? opts.comma : defaults$2.comma,
+ decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults$2.decoder,
+ delimiter: typeof opts.delimiter === 'string' || utils$1.isRegExp(opts.delimiter) ? opts.delimiter : defaults$2.delimiter,
+ // eslint-disable-next-line no-implicit-coercion, no-extra-parens
+ depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults$2.depth,
+ ignoreQueryPrefix: opts.ignoreQueryPrefix === true,
+ interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults$2.interpretNumericEntities,
+ parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults$2.parameterLimit,
+ parseArrays: opts.parseArrays !== false,
+ plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults$2.plainObjects,
+ strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults$2.strictNullHandling
+ };
+ };
+
+ var parse$1 = function (str, opts) {
+ var options = normalizeParseOptions(opts);
+
+ if (str === '' || str === null || typeof str === 'undefined') {
+ return options.plainObjects ? Object.create(null) : {};
+ }
+
+ var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
+ var obj = options.plainObjects ? Object.create(null) : {};
+
+ // Iterate over the keys and setup the new object
+
+ var keys = Object.keys(tempObj);
+ for (var i = 0; i < keys.length; ++i) {
+ var key = keys[i];
+ var newObj = parseKeys(key, tempObj[key], options);
+ obj = utils$1.merge(obj, newObj, options);
+ }
+
+ return utils$1.compact(obj);
+ };
+
+ 'use strict';
+
+
+
+
+
+ var lib = {
+ formats: formats,
+ parse: parse$1,
+ stringify: stringify_1
+ };
+ var lib_1 = lib.formats;
+ var lib_2 = lib.parse;
+ var lib_3 = lib.stringify;
+
+ var client = function(axios, { url, ...credentials }) {
+ const config = {
+ url,
+ method: 'post',
+ data: lib.stringify(credentials)
+ };
+
+ return () => axios(config).then(res => res.data);
+ };
+
+ function getMaxAge(res) {
+ return res.expires_in;
+ }
+
+ function headerFormatter(res) {
+ return 'Bearer ' + res.access_token;
+ }
+
+ var interceptor = function (tokenProvider, authenticate) {
+ const getToken = tokenProvider.tokenCache(authenticate, { getMaxAge });
+ return tokenProvider({ getToken, headerFormatter });
+ };
+
+ var src = {
+ client: client,
+ interceptor: interceptor
+ };
+ var src_1 = src.client;
+ var src_2 = src.interceptor;
+
+ 'use strict';
+
+ /**
+ * Check if we're required to add a port number.
+ *
+ * @see https://url.spec.whatwg.org/#default-port
+ * @param {Number|String} port Port number we need to check
+ * @param {String} protocol Protocol we need to check against.
+ * @returns {Boolean} Is it a default port for the given protocol
+ * @api private
+ */
+ var requiresPort = function required(port, protocol) {
+ protocol = protocol.split(':')[0];
+ port = +port;
+
+ if (!port) return false;
+
+ switch (protocol) {
+ case 'http':
+ case 'ws':
+ return port !== 80;
+
+ case 'https':
+ case 'wss':
+ return port !== 443;
+
+ case 'ftp':
+ return port !== 21;
+
+ case 'gopher':
+ return port !== 70;
+
+ case 'file':
+ return false;
+ }
+
+ return port !== 0;
+ };
+
+ 'use strict';
+
+ var slashes = /^[A-Za-z][A-Za-z0-9+-.]*:\/\//
+ , protocolre = /^([a-z][a-z0-9.+-]*:)?(\/\/)?([\S\s]*)/i
+ , whitespace = '[\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF]'
+ , left = new RegExp('^'+ whitespace +'+');
+
+ /**
+ * Trim a given string.
+ *
+ * @param {String} str String to trim.
+ * @public
+ */
+ function trimLeft(str) {
+ return (str ? str : '').toString().replace(left, '');
+ }
+
+ /**
+ * These are the parse rules for the URL parser, it informs the parser
+ * about:
+ *
+ * 0. The char it Needs to parse, if it's a string it should be done using
+ * indexOf, RegExp using exec and NaN means set as current value.
+ * 1. The property we should set when parsing this value.
+ * 2. Indication if it's backwards or forward parsing, when set as number it's
+ * the value of extra chars that should be split off.
+ * 3. Inherit from location if non existing in the parser.
+ * 4. `toLowerCase` the resulting value.
+ */
+ var rules = [
+ ['#', 'hash'], // Extract from the back.
+ ['?', 'query'], // Extract from the back.
+ function sanitize(address) { // Sanitize what is left of the address
+ return address.replace('\\', '/');
+ },
+ ['/', 'pathname'], // Extract from the back.
+ ['@', 'auth', 1], // Extract from the front.
+ [NaN, 'host', undefined, 1, 1], // Set left over value.
+ [/:(\d+)$/, 'port', undefined, 1], // RegExp the back.
+ [NaN, 'hostname', undefined, 1, 1] // Set left over.
+ ];
+
+ /**
+ * These properties should not be copied or inherited from. This is only needed
+ * for all non blob URL's as a blob URL does not include a hash, only the
+ * origin.
+ *
+ * @type {Object}
+ * @private
+ */
+ var ignore = { hash: 1, query: 1 };
+
+ /**
+ * The location object differs when your code is loaded through a normal page,
+ * Worker or through a worker using a blob. And with the blobble begins the
+ * trouble as the location object will contain the URL of the blob, not the
+ * location of the page where our code is loaded in. The actual origin is
+ * encoded in the `pathname` so we can thankfully generate a good "default"
+ * location from it so we can generate proper relative URL's again.
+ *
+ * @param {Object|String} loc Optional default location object.
+ * @returns {Object} lolcation object.
+ * @public
+ */
+ function lolcation(loc) {
+ var globalVar;
+
+ if (typeof window !== 'undefined') globalVar = window;
+ else if (typeof commonjsGlobal !== 'undefined') globalVar = commonjsGlobal;
+ else if (typeof self !== 'undefined') globalVar = self;
+ else globalVar = {};
+
+ var location = globalVar.location || {};
+ loc = loc || location;
+
+ var finaldestination = {}
+ , type = typeof loc
+ , key;
+
+ if ('blob:' === loc.protocol) {
+ finaldestination = new Url(unescape(loc.pathname), {});
+ } else if ('string' === type) {
+ finaldestination = new Url(loc, {});
+ for (key in ignore) delete finaldestination[key];
+ } else if ('object' === type) {
+ for (key in loc) {
+ if (key in ignore) continue;
+ finaldestination[key] = loc[key];
+ }
+
+ if (finaldestination.slashes === undefined) {
+ finaldestination.slashes = slashes.test(loc.href);
+ }
+ }
+
+ return finaldestination;
+ }
+
+ /**
+ * @typedef ProtocolExtract
+ * @type Object
+ * @property {String} protocol Protocol matched in the URL, in lowercase.
+ * @property {Boolean} slashes `true` if protocol is followed by "//", else `false`.
+ * @property {String} rest Rest of the URL that is not part of the protocol.
+ */
+
+ /**
+ * Extract protocol information from a URL with/without double slash ("//").
+ *
+ * @param {String} address URL we want to extract from.
+ * @return {ProtocolExtract} Extracted information.
+ * @private
+ */
+ function extractProtocol(address) {
+ address = trimLeft(address);
+ var match = protocolre.exec(address);
+
+ return {
+ protocol: match[1] ? match[1].toLowerCase() : '',
+ slashes: !!match[2],
+ rest: match[3]
+ };
+ }
+
+ /**
+ * Resolve a relative URL pathname against a base URL pathname.
+ *
+ * @param {String} relative Pathname of the relative URL.
+ * @param {String} base Pathname of the base URL.
+ * @return {String} Resolved pathname.
+ * @private
+ */
+ function resolve(relative, base) {
+ if (relative === '') return base;
+
+ var path = (base || '/').split('/').slice(0, -1).concat(relative.split('/'))
+ , i = path.length
+ , last = path[i - 1]
+ , unshift = false
+ , up = 0;
+
+ while (i--) {
+ if (path[i] === '.') {
+ path.splice(i, 1);
+ } else if (path[i] === '..') {
+ path.splice(i, 1);
+ up++;
+ } else if (up) {
+ if (i === 0) unshift = true;
+ path.splice(i, 1);
+ up--;
+ }
+ }
+
+ if (unshift) path.unshift('');
+ if (last === '.' || last === '..') path.push('');
+
+ return path.join('/');
+ }
+
+ /**
+ * The actual URL instance. Instead of returning an object we've opted-in to
+ * create an actual constructor as it's much more memory efficient and
+ * faster and it pleases my OCD.
+ *
+ * It is worth noting that we should not use `URL` as class name to prevent
+ * clashes with the global URL instance that got introduced in browsers.
+ *
+ * @constructor
+ * @param {String} address URL we want to parse.
+ * @param {Object|String} [location] Location defaults for relative paths.
+ * @param {Boolean|Function} [parser] Parser for the query string.
+ * @private
+ */
+ function Url(address, location, parser) {
+ address = trimLeft(address);
+
+ if (!(this instanceof Url)) {
+ return new Url(address, location, parser);
+ }
+
+ var relative, extracted, parse, instruction, index, key
+ , instructions = rules.slice()
+ , type = typeof location
+ , url = this
+ , i = 0;
+
+ //
+ // The following if statements allows this module two have compatibility with
+ // 2 different API:
+ //
+ // 1. Node.js's `url.parse` api which accepts a URL, boolean as arguments
+ // where the boolean indicates that the query string should also be parsed.
+ //
+ // 2. The `URL` interface of the browser which accepts a URL, object as
+ // arguments. The supplied object will be used as default values / fall-back
+ // for relative paths.
+ //
+ if ('object' !== type && 'string' !== type) {
+ parser = location;
+ location = null;
+ }
+
+ if (parser && 'function' !== typeof parser) parser = querystringify_1.parse;
+
+ location = lolcation(location);
+
+ //
+ // Extract protocol information before running the instructions.
+ //
+ extracted = extractProtocol(address || '');
+ relative = !extracted.protocol && !extracted.slashes;
+ url.slashes = extracted.slashes || relative && location.slashes;
+ url.protocol = extracted.protocol || location.protocol || '';
+ address = extracted.rest;
+
+ //
+ // When the authority component is absent the URL starts with a path
+ // component.
+ //
+ if (!extracted.slashes) instructions[3] = [/(.*)/, 'pathname'];
+
+ for (; i < instructions.length; i++) {
+ instruction = instructions[i];
+
+ if (typeof instruction === 'function') {
+ address = instruction(address);
+ continue;
+ }
+
+ parse = instruction[0];
+ key = instruction[1];
+
+ if (parse !== parse) {
+ url[key] = address;
+ } else if ('string' === typeof parse) {
+ if (~(index = address.indexOf(parse))) {
+ if ('number' === typeof instruction[2]) {
+ url[key] = address.slice(0, index);
+ address = address.slice(index + instruction[2]);
+ } else {
+ url[key] = address.slice(index);
+ address = address.slice(0, index);
+ }
+ }
+ } else if ((index = parse.exec(address))) {
+ url[key] = index[1];
+ address = address.slice(0, index.index);
+ }
+
+ url[key] = url[key] || (
+ relative && instruction[3] ? location[key] || '' : ''
+ );
+
+ //
+ // Hostname, host and protocol should be lowercased so they can be used to
+ // create a proper `origin`.
+ //
+ if (instruction[4]) url[key] = url[key].toLowerCase();
+ }
+
+ //
+ // Also parse the supplied query string in to an object. If we're supplied
+ // with a custom parser as function use that instead of the default build-in
+ // parser.
+ //
+ if (parser) url.query = parser(url.query);
+
+ //
+ // If the URL is relative, resolve the pathname against the base URL.
+ //
+ if (
+ relative
+ && location.slashes
+ && url.pathname.charAt(0) !== '/'
+ && (url.pathname !== '' || location.pathname !== '')
+ ) {
+ url.pathname = resolve(url.pathname, location.pathname);
+ }
+
+ //
+ // We should not add port numbers if they are already the default port number
+ // for a given protocol. As the host also contains the port number we're going
+ // override it with the hostname which contains no port number.
+ //
+ if (!requiresPort(url.port, url.protocol)) {
+ url.host = url.hostname;
+ url.port = '';
+ }
+
+ //
+ // Parse down the `auth` for the username and password.
+ //
+ url.username = url.password = '';
+ if (url.auth) {
+ instruction = url.auth.split(':');
+ url.username = instruction[0] || '';
+ url.password = instruction[1] || '';
+ }
+
+ url.origin = url.protocol && url.host && url.protocol !== 'file:'
+ ? url.protocol +'//'+ url.host
+ : 'null';
+
+ //
+ // The href is just the compiled result.
+ //
+ url.href = url.toString();
+ }
+
+ /**
+ * This is convenience method for changing properties in the URL instance to
+ * insure that they all propagate correctly.
+ *
+ * @param {String} part Property we need to adjust.
+ * @param {Mixed} value The newly assigned value.
+ * @param {Boolean|Function} fn When setting the query, it will be the function
+ * used to parse the query.
+ * When setting the protocol, double slash will be
+ * removed from the final url if it is true.
+ * @returns {URL} URL instance for chaining.
+ * @public
+ */
+ function set(part, value, fn) {
+ var url = this;
+
+ switch (part) {
+ case 'query':
+ if ('string' === typeof value && value.length) {
+ value = (fn || querystringify_1.parse)(value);
+ }
+
+ url[part] = value;
+ break;
+
+ case 'port':
+ url[part] = value;
+
+ if (!requiresPort(value, url.protocol)) {
+ url.host = url.hostname;
+ url[part] = '';
+ } else if (value) {
+ url.host = url.hostname +':'+ value;
+ }
+
+ break;
+
+ case 'hostname':
+ url[part] = value;
+
+ if (url.port) value += ':'+ url.port;
+ url.host = value;
+ break;
+
+ case 'host':
+ url[part] = value;
+
+ if (/:\d+$/.test(value)) {
+ value = value.split(':');
+ url.port = value.pop();
+ url.hostname = value.join(':');
+ } else {
+ url.hostname = value;
+ url.port = '';
+ }
+
+ break;
+
+ case 'protocol':
+ url.protocol = value.toLowerCase();
+ url.slashes = !fn;
+ break;
+
+ case 'pathname':
+ case 'hash':
+ if (value) {
+ var char = part === 'pathname' ? '/' : '#';
+ url[part] = value.charAt(0) !== char ? char + value : value;
+ } else {
+ url[part] = value;
+ }
+ break;
+
+ default:
+ url[part] = value;
+ }
+
+ for (var i = 0; i < rules.length; i++) {
+ var ins = rules[i];
+
+ if (ins[4]) url[ins[1]] = url[ins[1]].toLowerCase();
+ }
+
+ url.origin = url.protocol && url.host && url.protocol !== 'file:'
+ ? url.protocol +'//'+ url.host
+ : 'null';
+
+ url.href = url.toString();
+
+ return url;
+ }
+
+ /**
+ * Transform the properties back in to a valid and full URL string.
+ *
+ * @param {Function} stringify Optional query stringify function.
+ * @returns {String} Compiled version of the URL.
+ * @public
+ */
+ function toString$1(stringify) {
+ if (!stringify || 'function' !== typeof stringify) stringify = querystringify_1.stringify;
+
+ var query
+ , url = this
+ , protocol = url.protocol;
+
+ if (protocol && protocol.charAt(protocol.length - 1) !== ':') protocol += ':';
+
+ var result = protocol + (url.slashes ? '//' : '');
+
+ if (url.username) {
+ result += url.username;
+ if (url.password) result += ':'+ url.password;
+ result += '@';
+ }
+
+ result += url.host + url.pathname;
+
+ query = 'object' === typeof url.query ? stringify(url.query) : url.query;
+ if (query) result += '?' !== query.charAt(0) ? '?'+ query : query;
+
+ if (url.hash) result += url.hash;
+
+ return result;
+ }
+
+ Url.prototype = { set: set, toString: toString$1 };
+
+ //
+ // Expose the URL parser and some additional properties that might be useful for
+ // others or testing.
+ //
+ Url.extractProtocol = extractProtocol;
+ Url.location = lolcation;
+ Url.trimLeft = trimLeft;
+ Url.qs = querystringify_1;
+
+ var urlParse = Url;
+
+ var index_min = createCommonjsModule(function (module) {
+ module.exports=function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n});},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0});},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){"use strict";r.r(t);var n={statusCodes:[401]};t.default=function e(t,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},u=t.interceptors.response.use(function(e){return e},function(s){var i=o.hasOwnProperty("statusCodes")&&o.statusCodes.length?o.statusCodes:n.statusCodes;if(!s.response||s.response.status&&-1===i.indexOf(+s.response.status))return Promise.reject(s);t.interceptors.response.eject(u);var c=r(s),f=t.interceptors.request.use(function(e){return c.then(function(){return e})});return c.then(function(){return t.interceptors.request.eject(f),t(s.response.config)}).catch(function(e){return t.interceptors.request.eject(f),Promise.reject(e)}).finally(function(){return e(t,r,o)})});return t};}]);
+ });
+
+ var createAuthRefreshInterceptor = unwrapExports(index_min);
+
+ /* global DOMException */
+
+ var clipboardCopy_1 = clipboardCopy;
+
+ function clipboardCopy (text) {
+ // Use the Async Clipboard API when available. Requires a secure browing
+ // context (i.e. HTTPS)
+ if (navigator.clipboard) {
+ return navigator.clipboard.writeText(text).catch(function (err) {
+ throw (err !== undefined ? err : new DOMException('The request is not allowed', 'NotAllowedError'))
+ })
+ }
+
+ // ...Otherwise, use document.execCommand() fallback
+
+ // Put the text to copy into a <span>
+ var span = document.createElement('span');
+ span.textContent = text;
+
+ // Preserve consecutive spaces and newlines
+ span.style.whiteSpace = 'pre';
+
+ // Add the <span> to the page
+ document.body.appendChild(span);
+
+ // Make a selection object representing the range of text selected by the user
+ var selection = window.getSelection();
+ var range = window.document.createRange();
+ selection.removeAllRanges();
+ range.selectNode(span);
+ selection.addRange(range);
+
+ // Copy text to the clipboard
+ var success = false;
+ try {
+ success = window.document.execCommand('copy');
+ } catch (err) {
+ console.log('error', err);
+ }
+
+ // Cleanup
+ selection.removeAllRanges();
+ window.document.body.removeChild(span);
+
+ return success
+ ? Promise.resolve()
+ : Promise.reject(new DOMException('The request is not allowed', 'NotAllowedError'))
+ }
+
+ const subscriber_queue = [];
+ /**
+ * Creates a `Readable` store that allows reading by subscription.
+ * @param value initial value
+ * @param {StartStopNotifier}start start and stop notifications for subscriptions
+ */
+ function readable(value, start) {
+ return {
+ subscribe: writable(value, start).subscribe,
+ };
+ }
+ /**
+ * Create a `Writable` store that allows both updating and reading by subscription.
+ * @param {*=}value initial value
+ * @param {StartStopNotifier=}start start and stop notifications for subscriptions
+ */
+ function writable(value, start = noop) {
+ let stop;
+ const subscribers = [];
+ function set(new_value) {
+ if (safe_not_equal(value, new_value)) {
+ value = new_value;
+ if (stop) { // store is ready
+ const run_queue = !subscriber_queue.length;
+ for (let i = 0; i < subscribers.length; i += 1) {
+ const s = subscribers[i];
+ s[1]();
+ subscriber_queue.push(s, value);
+ }
+ if (run_queue) {
+ for (let i = 0; i < subscriber_queue.length; i += 2) {
+ subscriber_queue[i][0](subscriber_queue[i + 1]);
+ }
+ subscriber_queue.length = 0;
+ }
+ }
+ }
+ }
+ function update(fn) {
+ set(fn(value));
+ }
+ function subscribe(run, invalidate = noop) {
+ const subscriber = [run, invalidate];
+ subscribers.push(subscriber);
+ if (subscribers.length === 1) {
+ stop = start(set) || noop;
+ }
+ run(value);
+ return () => {
+ const index = subscribers.indexOf(subscriber);
+ if (index !== -1) {
+ subscribers.splice(index, 1);
+ }
+ if (subscribers.length === 0) {
+ stop();
+ stop = null;
+ }
+ };
+ }
+ return { set, update, subscribe };
+ }
+ /**
+ * Derived value store by synchronizing one or more readable stores and
+ * applying an aggregation function over its input values.
+ * @param {Stores} stores input stores
+ * @param {function(Stores=, function(*)=):*}fn function callback that aggregates the values
+ * @param {*=}initial_value when used asynchronously
+ */
+ function derived(stores, fn, initial_value) {
+ const single = !Array.isArray(stores);
+ const stores_array = single
+ ? [stores]
+ : stores;
+ const auto = fn.length < 2;
+ return readable(initial_value, (set) => {
+ let inited = false;
+ const values = [];
+ let pending = 0;
+ let cleanup = noop;
+ const sync = () => {
+ if (pending) {
+ return;
+ }
+ cleanup();
+ const result = fn(single ? values[0] : values, set);
+ if (auto) {
+ set(result);
+ }
+ else {
+ cleanup = is_function(result) ? result : noop;
+ }
+ };
+ const unsubscribers = stores_array.map((store, i) => store.subscribe((value) => {
+ values[i] = value;
+ pending &= ~(1 << i);
+ if (inited) {
+ sync();
+ }
+ }, () => {
+ pending |= (1 << i);
+ }));
+ inited = true;
+ sync();
+ return function stop() {
+ run_all(unsubscribers);
+ cleanup();
+ };
+ });
+ }
+
+ const env = writable("");
+ const token = writable("");
+
+ env.subscribe(val => {
+ if (val != "") {
+ store2.set("env", val);
+ }
+ });
+
+ function unique(value, index, self) {
+ return self.indexOf(value) === index;
+ }
+
+ function add(data, val) {
+ const arr = data.split(";");
+ arr.push(val);
+
+ return arr
+ .filter(unique)
+ .filter(String)
+ .join(";");
+ }
+
+ function remove(data, val) {
+ return data
+ .split(";")
+ .filter(v => v != val)
+ .join(";");
+ }
+
+ function createAuth() {
+ const { subscribe, update } = writable("");
+
+ return {
+ subscribe,
+ add: val => update(data => add(data, val)),
+ remove: val => update(data => remove(data, val))
+ };
+ }
+
+ const auth = createAuth();
+
+ prism.languages.json = {
+ property: {
+ pattern: /"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,
+ greedy: true
+ },
+ string: {
+ pattern: /"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,
+ greedy: true
+ },
+ comment: /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
+ number: /-?\d+\.?\d*(e[+-]?\d+)?/i,
+ punctuation: /[{}[\],]/,
+ operator: /:/,
+ boolean: /\b(?:true|false)\b/,
+ null: {
+ pattern: /\bnull\b/,
+ alias: "keyword"
+ }
+ };
+
+ const highlight = function(code, lang) {
+ const supported = ["xml", "json"];
+
+ if (!supported.includes(lang)) {
+ lang = "markup";
+ }
+
+ return prism.highlight(code, prism.languages[lang], lang);
+ };
+
+ marked.setOptions({
+ highlight
+ });
+
+ const renderer = new marked.Renderer();
+
+ renderer.pre = renderer.code;
+ renderer.code = function(code, infostring, escaped) {
+ const out = this.pre(code, infostring, escaped);
+ return out.replace("<pre>", `<pre class="language-${infostring}">`);
+ };
+
+ const markdown = function(source) {
+ return source ? marked(source, { renderer: renderer }) : "";
+ };
+
+ const toc = function(source) {
+ if (!source) {
+ return [];
+ }
+
+ const tokens = marked.lexer(source);
+ const headings = tokens.filter(elem => elem.type === "heading");
+ const depths = headings.map(head => head.depth);
+ const minDepth = Math.min(...depths);
+
+ return headings.map(head => ({
+ text: head.text,
+ level: head.depth - minDepth
+ }));
+ };
+
+ const colorize = function(str, prefix = "is-") {
+ switch (str) {
+ case "get":
+ return `${prefix}success`;
+ case "post":
+ return `${prefix}link`;
+ case "put":
+ return `${prefix}primary`;
+ case "patch":
+ return `${prefix}info`;
+ case "delete":
+ return `${prefix}danger`;
+ case 200:
+ case 201:
+ case 202:
+ case 204:
+ return `${prefix}info`;
+ case 401:
+ case 403:
+ case 404:
+ case 422:
+ return `${prefix}warning`;
+ case 500:
+ return `${prefix}danger`;
+ }
+ };
+
+ const slugify = function(str) {
+ return speakingurl$1(str, "-");
+ };
+
+ const alias = str => {
+ return str && str.match("json") ? "json" : "markup";
+ };
+
+ const stringify$2 = obj => {
+ if (typeof obj === "string") {
+ return obj;
+ }
+
+ if (obj) {
+ return JSON.stringify(obj, null, " ");
+ }
+
+ return "";
+ };
+
+ const expandUrl = (uri, obj) => {
+ const tpl = uritemplate.parse(uri);
+ return tpl.expand(obj);
+ };
+
+ const actionFilter = (act, regex) => {
+ return (
+ act.path.match(regex) || act.method.match(regex) || act.title.match(regex)
+ );
+ };
+
+ const filteredItem = (title, key, items) => {
+ if (items.length === 0) {
+ return false;
+ }
+
+ return { title: title, [key]: items };
+ };
+
+ const filterActions = (tagActions, regex) => {
+ return tagActions
+ .map(tag => {
+ const children = tag.children.map(child => {
+ const actions = child.actions.filter(act => actionFilter(act, regex));
+ return filteredItem(child.title, "actions", actions);
+ });
+
+ return filteredItem(tag.title, "children", children.filter(Boolean));
+ })
+ .filter(Boolean);
+ };
+
+ const basePath = config => {
+ if (config.basePath.endsWith("/")) {
+ return config.basePath;
+ } else {
+ return config.basePath + "/";
+ }
+ };
+
+ const tokenName = env => `token:${env}`;
+ const setToken = (env, token) => store2.session.set(tokenName(env), token);
+ const getToken = env => store2.session.get(tokenName(env));
+ const removeToken = env => store2.session.remove(tokenName(env));
+
+ const refreshTokenName = env => `refresh-token:${env}`;
+ const setRefreshToken = (env, token) =>
+ store2.session.set(refreshTokenName(env), token);
+ const getRefreshToken = env => store2.session.get(refreshTokenName(env));
+ const removeRefreshToken = env => store2.session.remove(refreshTokenName(env));
+
+ const isAuth = (environment, name) => {
+ return environment.auth && environment.auth.name === name;
+ };
+
+ const pushHistory = href => history.pushState(history.state, "", href);
+
+ const requestToken = async (client, options) => {
+ const authRequest = src.client(client, options);
+ const authCode = await authRequest();
+
+ if (typeof authCode === "string") {
+ const authParsed = querystringify_1.parse(authCode);
+ return {
+ accessToken: authParsed.access_token,
+ refreshToken: authParsed.refresh_token
+ };
+ }
+
+ return {
+ accessToken: authCode.access_token,
+ refreshToken: authCode.refresh_token
+ };
+ };
+
+ const exchangeToken = async (code, options) => {
+ return requestToken(axios$1.create(), {
+ url: options.tokenUrl,
+ grant_type: "authorization_code",
+ client_id: options.clientId,
+ client_secret: options.clientSecret,
+ redirect_uri: options.callbackUrl,
+ code: code
+ });
+ };
+
+ const populate = arr => {
+ return arr
+ .filter(obj => obj.used)
+ .reduce((prev, cur) => {
+ prev[cur.name] = cur.value;
+ return prev;
+ }, {});
+ };
+
+ const allowBody = action => {
+ return ["put", "post", "patch"].includes(action.method);
+ };
+
+ const refreshInterceptor = (env, options) => {
+ const refreshToken = getRefreshToken(env);
+
+ return async failedRequest => {
+ const {
+ accessToken: newAccessToken,
+ refreshToken: newRefreshToken
+ } = await requestToken(axios$1, {
+ url: options.tokenUrl,
+ grant_type: "refresh_token",
+ client_id: options.clientId,
+ client_secret: options.clientSecret,
+ refresh_token: refreshToken
+ });
+
+ if (newAccessToken) {
+ token.set(newAccessToken);
+ setToken(env, newAccessToken);
+ }
+
+ if (newRefreshToken) {
+ setRefreshToken(env, newRefreshToken);
+ }
+
+ failedRequest.response.config.headers[
+ "Authorization"
+ ] = `Bearer ${newAccessToken}`;
+ };
+ };
+
+ const sendRequest = (
+ env,
+ environment,
+ action,
+ { headers, parameters, body }
+ ) => {
+ const client = axios$1.create({
+ baseURL: environment.url
+ });
+
+ const options = {
+ method: action.method,
+ headers: populate(headers)
+ };
+
+ if (environment.auth) {
+ switch (environment.auth.name) {
+ case "basic":
+ options.auth = environment.auth.options;
+ break;
+ case "apikey":
+ options.headers[environment.auth.options.header] =
+ environment.auth.options.key;
+ break;
+ case "oauth2":
+ options.headers["Authorization"] = `Bearer ${getToken(env)}`;
+ break;
+ }
+ }
+
+ const expandedUrl = expandUrl(action.pathTemplate, populate(parameters));
+ const destUrl = urlParse(expandedUrl, true);
+
+ options.params = destUrl.query;
+ options.url = destUrl.pathname;
+
+ if (allowBody(action)) {
+ options.data = body;
+ }
+
+ if (isAuth(environment, "oauth2")) {
+ createAuthRefreshInterceptor(
+ client,
+ refreshInterceptor(env, environment.auth.options)
+ );
+ }
+
+ return client.request(options);
+ };
+
+ const copyUrl = (url, parameters) => {
+ const expandedUrl = expandUrl(url.pathname, populate(parameters));
+
+ clipboardCopy_1(url.origin + expandedUrl);
+ };
+
+ const getEnv = () => store2.get("env");
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/components/MenuItem.svelte generated by Svelte v3.12.1 */
+
+ function add_css() {
+ var style = element("style");
+ style.id = 'svelte-39af3j-style';
+ style.textContent = ".tag.svelte-39af3j{width:3.5rem}.menu-ellipsis.svelte-39af3j{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;padding:0.25em 0.75em}.menu-action.svelte-39af3j{vertical-align:middle}";
+ append(document.head, style);
+ }
+
+ function get_each_context(ctx, list, i) {
+ const child_ctx = Object.create(ctx);
+ child_ctx.action = list[i];
+ return child_ctx;
+ }
+
+ // (29:0) {#if title}
+ function create_if_block_1(ctx) {
+ var li, a, span, i, t0, t1, dispose;
+
+ return {
+ c() {
+ li = element("li");
+ a = element("a");
+ span = element("span");
+ i = element("i");
+ t0 = space();
+ t1 = text(ctx.title);
+ attr(i, "class", "fas");
+ toggle_class(i, "fa-chevron-right", ctx.hidden);
+ toggle_class(i, "fa-chevron-down", !ctx.hidden);
+ attr(span, "class", "icon has-text-grey-light");
+ attr(a, "href", "javascript:void(0)");
+ dispose = listen(a, "click", ctx.click_handler);
+ },
+
+ m(target, anchor) {
+ insert(target, li, anchor);
+ append(li, a);
+ append(a, span);
+ append(span, i);
+ append(a, t0);
+ append(a, t1);
+ },
+
+ p(changed, ctx) {
+ if (changed.hidden) {
+ toggle_class(i, "fa-chevron-right", ctx.hidden);
+ toggle_class(i, "fa-chevron-down", !ctx.hidden);
+ }
+
+ if (changed.title) {
+ set_data(t1, ctx.title);
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(li);
+ }
+
+ dispose();
+ }
+ };
+ }
+
+ // (43:0) {#if actions.length > 0}
+ function create_if_block(ctx) {
+ var li, ul;
+
+ let each_value = ctx.actions;
+
+ let each_blocks = [];
+
+ for (let i = 0; i < each_value.length; i += 1) {
+ each_blocks[i] = create_each_block(get_each_context(ctx, each_value, i));
+ }
+
+ return {
+ c() {
+ li = element("li");
+ ul = element("ul");
+
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].c();
+ }
+ toggle_class(li, "is-hidden", ctx.hidden);
+ },
+
+ m(target, anchor) {
+ insert(target, li, anchor);
+ append(li, ul);
+
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].m(ul, null);
+ }
+ },
+
+ p(changed, ctx) {
+ if (changed.actions || changed.currentSlug || changed.colorize) {
+ each_value = ctx.actions;
+
+ let i;
+ for (i = 0; i < each_value.length; i += 1) {
+ const child_ctx = get_each_context(ctx, each_value, i);
+
+ if (each_blocks[i]) {
+ each_blocks[i].p(changed, child_ctx);
+ } else {
+ each_blocks[i] = create_each_block(child_ctx);
+ each_blocks[i].c();
+ each_blocks[i].m(ul, null);
+ }
+ }
+
+ for (; i < each_blocks.length; i += 1) {
+ each_blocks[i].d(1);
+ }
+ each_blocks.length = each_value.length;
+ }
+
+ if (changed.hidden) {
+ toggle_class(li, "is-hidden", ctx.hidden);
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(li);
+ }
+
+ destroy_each(each_blocks, detaching);
+ }
+ };
+ }
+
+ // (46:6) {#each actions as action}
+ function create_each_block(ctx) {
+ var li, a, code, t0_value = ctx.action.method + "", t0, code_class_value, t1, span, t2_value = ctx.action.title + "", t2, a_data_slug_value, a_href_value, t3, dispose;
+
+ return {
+ c() {
+ li = element("li");
+ a = element("a");
+ code = element("code");
+ t0 = text(t0_value);
+ t1 = space();
+ span = element("span");
+ t2 = text(t2_value);
+ t3 = space();
+ attr(code, "class", code_class_value = "tag " + colorize(ctx.action.method) + " is-uppercase" + " svelte-39af3j");
+ attr(span, "class", "menu-action svelte-39af3j");
+ attr(a, "data-slug", a_data_slug_value = ctx.action.slug);
+ attr(a, "href", a_href_value = "#/" + ctx.action.slug);
+ attr(a, "class", "menu-ellipsis svelte-39af3j");
+ toggle_class(a, "is-active", ctx.action.slug === ctx.currentSlug);
+ dispose = listen(a, "click", ctx.handleClick);
+ },
+
+ m(target, anchor) {
+ insert(target, li, anchor);
+ append(li, a);
+ append(a, code);
+ append(code, t0);
+ append(a, t1);
+ append(a, span);
+ append(span, t2);
+ append(li, t3);
+ },
+
+ p(changed, ctx) {
+ if ((changed.actions) && t0_value !== (t0_value = ctx.action.method + "")) {
+ set_data(t0, t0_value);
+ }
+
+ if ((changed.actions) && code_class_value !== (code_class_value = "tag " + colorize(ctx.action.method) + " is-uppercase" + " svelte-39af3j")) {
+ attr(code, "class", code_class_value);
+ }
+
+ if ((changed.actions) && t2_value !== (t2_value = ctx.action.title + "")) {
+ set_data(t2, t2_value);
+ }
+
+ if ((changed.actions) && a_data_slug_value !== (a_data_slug_value = ctx.action.slug)) {
+ attr(a, "data-slug", a_data_slug_value);
+ }
+
+ if ((changed.actions) && a_href_value !== (a_href_value = "#/" + ctx.action.slug)) {
+ attr(a, "href", a_href_value);
+ }
+
+ if ((changed.actions || changed.currentSlug)) {
+ toggle_class(a, "is-active", ctx.action.slug === ctx.currentSlug);
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(li);
+ }
+
+ dispose();
+ }
+ };
+ }
+
+ function create_fragment(ctx) {
+ var t, if_block1_anchor;
+
+ var if_block0 = (ctx.title) && create_if_block_1(ctx);
+
+ var if_block1 = (ctx.actions.length > 0) && create_if_block(ctx);
+
+ return {
+ c() {
+ if (if_block0) if_block0.c();
+ t = space();
+ if (if_block1) if_block1.c();
+ if_block1_anchor = empty();
+ },
+
+ m(target, anchor) {
+ if (if_block0) if_block0.m(target, anchor);
+ insert(target, t, anchor);
+ if (if_block1) if_block1.m(target, anchor);
+ insert(target, if_block1_anchor, anchor);
+ },
+
+ p(changed, ctx) {
+ if (ctx.title) {
+ if (if_block0) {
+ if_block0.p(changed, ctx);
+ } else {
+ if_block0 = create_if_block_1(ctx);
+ if_block0.c();
+ if_block0.m(t.parentNode, t);
+ }
+ } else if (if_block0) {
+ if_block0.d(1);
+ if_block0 = null;
+ }
+
+ if (ctx.actions.length > 0) {
+ if (if_block1) {
+ if_block1.p(changed, ctx);
+ } else {
+ if_block1 = create_if_block(ctx);
+ if_block1.c();
+ if_block1.m(if_block1_anchor.parentNode, if_block1_anchor);
+ }
+ } else if (if_block1) {
+ if_block1.d(1);
+ if_block1 = null;
+ }
+ },
+
+ i: noop,
+ o: noop,
+
+ d(detaching) {
+ if (if_block0) if_block0.d(detaching);
+
+ if (detaching) {
+ detach(t);
+ }
+
+ if (if_block1) if_block1.d(detaching);
+
+ if (detaching) {
+ detach(if_block1_anchor);
+ }
+ }
+ };
+ }
+
+ function instance($$self, $$props, $$invalidate) {
+ let { title, actions, currentSlug, hidden = false, handleClick } = $$props;
+
+ const click_handler = () => ($$invalidate('hidden', hidden = !hidden));
+
+ $$self.$set = $$props => {
+ if ('title' in $$props) $$invalidate('title', title = $$props.title);
+ if ('actions' in $$props) $$invalidate('actions', actions = $$props.actions);
+ if ('currentSlug' in $$props) $$invalidate('currentSlug', currentSlug = $$props.currentSlug);
+ if ('hidden' in $$props) $$invalidate('hidden', hidden = $$props.hidden);
+ if ('handleClick' in $$props) $$invalidate('handleClick', handleClick = $$props.handleClick);
+ };
+
+ return {
+ title,
+ actions,
+ currentSlug,
+ hidden,
+ handleClick,
+ click_handler
+ };
+ }
+
+ class MenuItem extends SvelteComponent {
+ constructor(options) {
+ super();
+ if (!document.getElementById("svelte-39af3j-style")) add_css();
+ init(this, options, instance, create_fragment, safe_not_equal, ["title", "actions", "currentSlug", "hidden", "handleClick"]);
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/panels/MenuPanel.svelte generated by Svelte v3.12.1 */
+
+ function add_css$1() {
+ var style = element("style");
+ style.id = 'svelte-1xl6iim-style';
+ style.textContent = ".hero.svelte-1xl6iim,.menu-wrapper.svelte-1xl6iim{padding:0 2.75rem 0 2rem}.hero.svelte-1xl6iim{position:sticky;top:54px;background-color:#fafafa;margin-bottom:1.5rem}.hero-body.svelte-1xl6iim{padding:1.5rem 0;box-shadow:0 2px 0 0 #f5f5f5}.menu-wrapper.svelte-1xl6iim::-webkit-scrollbar{display:none}@media screen and (min-width: 768px){.hero.svelte-1xl6iim,.menu-wrapper.svelte-1xl6iim{width:-moz-calc(25% - 0.5rem);width:-webkit-calc(25% - 0.5rem);width:-o-calc(25% - 0.5rem);width:calc(25% - 0.5rem)}.hero.svelte-1xl6iim{position:fixed;padding:0 1.25rem}.menu-wrapper.svelte-1xl6iim{position:fixed;top:140px;padding:1.5rem 1.25rem 1.25rem;height:-moz-calc(100% - 150px - 2.5rem);height:-webkit-calc(100% - 150px - 2.5rem);height:-o-calc(100% - 150px - 2.5rem);height:calc(100% - 150px - 2.5rem);overflow:-moz-scrollbars-none;-ms-overflow-style:none;overflow-x:hidden;overflow-y:auto;transition:opacity 0.3s, left 0.3s}.menu.is-collapsed.svelte-1xl6iim{width:3rem}.is-collapsed.svelte-1xl6iim .hero.svelte-1xl6iim,.is-collapsed.svelte-1xl6iim .hero-body.svelte-1xl6iim{width:calc(3rem - 2px)}.is-collapsed.svelte-1xl6iim .hero.svelte-1xl6iim{padding-left:0;padding-right:0}.is-collapsed.svelte-1xl6iim .hero-body.svelte-1xl6iim{padding-left:0.3175rem;padding-right:0.3175rem;box-shadow:none}.is-collapsed.svelte-1xl6iim .input.is-rounded.svelte-1xl6iim{padding-left:0;padding-right:0;opacity:0}.is-collapsed.svelte-1xl6iim .icon-input-search.svelte-1xl6iim{color:#b5b5b5;background-color:#eee;-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;cursor:pointer;pointer-events:auto}.is-collapsed.svelte-1xl6iim .icon-input-search.svelte-1xl6iim:hover{color:#999;background-color:#e0e0e0}.is-collapsed.svelte-1xl6iim .menu-wrapper.svelte-1xl6iim{left:-30%;opacity:0}}";
+ append(document.head, style);
+ }
+
+ function get_each_context_1(ctx, list, i) {
+ const child_ctx = Object.create(ctx);
+ child_ctx.child = list[i];
+ return child_ctx;
+ }
+
+ function get_each_context$1(ctx, list, i) {
+ const child_ctx = Object.create(ctx);
+ child_ctx.tag = list[i];
+ return child_ctx;
+ }
+
+ function get_each_context_2(ctx, list, i) {
+ const child_ctx = Object.create(ctx);
+ child_ctx.header = list[i];
+ return child_ctx;
+ }
+
+ // (156:6) {#if tagHeaders}
+ function create_if_block_1$1(ctx) {
+ var li, ul;
+
+ let each_value_2 = ctx.tagHeaders;
+
+ let each_blocks = [];
+
+ for (let i = 0; i < each_value_2.length; i += 1) {
+ each_blocks[i] = create_each_block_2(get_each_context_2(ctx, each_value_2, i));
+ }
+
+ return {
+ c() {
+ li = element("li");
+ ul = element("ul");
+
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].c();
+ }
+ },
+
+ m(target, anchor) {
+ insert(target, li, anchor);
+ append(li, ul);
+
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].m(ul, null);
+ }
+ },
+
+ p(changed, ctx) {
+ if (changed.tagHeaders || changed.headerLink) {
+ each_value_2 = ctx.tagHeaders;
+
+ let i;
+ for (i = 0; i < each_value_2.length; i += 1) {
+ const child_ctx = get_each_context_2(ctx, each_value_2, i);
+
+ if (each_blocks[i]) {
+ each_blocks[i].p(changed, child_ctx);
+ } else {
+ each_blocks[i] = create_each_block_2(child_ctx);
+ each_blocks[i].c();
+ each_blocks[i].m(ul, null);
+ }
+ }
+
+ for (; i < each_blocks.length; i += 1) {
+ each_blocks[i].d(1);
+ }
+ each_blocks.length = each_value_2.length;
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(li);
+ }
+
+ destroy_each(each_blocks, detaching);
+ }
+ };
+ }
+
+ // (160:14) {#if header.level === 0}
+ function create_if_block_2(ctx) {
+ var li, a, t0_value = ctx.header.text + "", t0, a_href_value, t1, dispose;
+
+ return {
+ c() {
+ li = element("li");
+ a = element("a");
+ t0 = text(t0_value);
+ t1 = space();
+ attr(a, "href", a_href_value = "#" + headerLink(ctx.header.text));
+ dispose = listen(a, "click", ctx.tocClick);
+ },
+
+ m(target, anchor) {
+ insert(target, li, anchor);
+ append(li, a);
+ append(a, t0);
+ append(li, t1);
+ },
+
+ p(changed, ctx) {
+ if ((changed.tagHeaders) && t0_value !== (t0_value = ctx.header.text + "")) {
+ set_data(t0, t0_value);
+ }
+
+ if ((changed.tagHeaders) && a_href_value !== (a_href_value = "#" + headerLink(ctx.header.text))) {
+ attr(a, "href", a_href_value);
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(li);
+ }
+
+ dispose();
+ }
+ };
+ }
+
+ // (159:12) {#each tagHeaders as header}
+ function create_each_block_2(ctx) {
+ var if_block_anchor;
+
+ var if_block = (ctx.header.level === 0) && create_if_block_2(ctx);
+
+ return {
+ c() {
+ if (if_block) if_block.c();
+ if_block_anchor = empty();
+ },
+
+ m(target, anchor) {
+ if (if_block) if_block.m(target, anchor);
+ insert(target, if_block_anchor, anchor);
+ },
+
+ p(changed, ctx) {
+ if (ctx.header.level === 0) {
+ if (if_block) {
+ if_block.p(changed, ctx);
+ } else {
+ if_block = create_if_block_2(ctx);
+ if_block.c();
+ if_block.m(if_block_anchor.parentNode, if_block_anchor);
+ }
+ } else if (if_block) {
+ if_block.d(1);
+ if_block = null;
+ }
+ },
+
+ d(detaching) {
+ if (if_block) if_block.d(detaching);
+
+ if (detaching) {
+ detach(if_block_anchor);
+ }
+ }
+ };
+ }
+
+ // (174:6) {#if tag.title}
+ function create_if_block$1(ctx) {
+ var p, t_value = ctx.tag.title + "", t;
+
+ return {
+ c() {
+ p = element("p");
+ t = text(t_value);
+ attr(p, "class", "menu-label");
+ },
+
+ m(target, anchor) {
+ insert(target, p, anchor);
+ append(p, t);
+ },
+
+ p(changed, ctx) {
+ if ((changed.filteredActions) && t_value !== (t_value = ctx.tag.title + "")) {
+ set_data(t, t_value);
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(p);
+ }
+ }
+ };
+ }
+
+ // (179:8) {#each tag.children as child}
+ function create_each_block_1(ctx) {
+ var current;
+
+ var menuitem = new MenuItem({
+ props: {
+ title: ctx.child.title,
+ actions: ctx.child.actions,
+ hidden: ctx.actionsCount > 50,
+ currentSlug: ctx.currentSlug,
+ handleClick: ctx.handleClick
+ }
+ });
+
+ return {
+ c() {
+ menuitem.$$.fragment.c();
+ },
+
+ m(target, anchor) {
+ mount_component(menuitem, target, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ var menuitem_changes = {};
+ if (changed.filteredActions) menuitem_changes.title = ctx.child.title;
+ if (changed.filteredActions) menuitem_changes.actions = ctx.child.actions;
+ if (changed.actionsCount) menuitem_changes.hidden = ctx.actionsCount > 50;
+ if (changed.currentSlug) menuitem_changes.currentSlug = ctx.currentSlug;
+ if (changed.handleClick) menuitem_changes.handleClick = ctx.handleClick;
+ menuitem.$set(menuitem_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(menuitem.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(menuitem.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ destroy_component(menuitem, detaching);
+ }
+ };
+ }
+
+ // (173:4) {#each filteredActions as tag}
+ function create_each_block$1(ctx) {
+ var t0, ul, t1, current;
+
+ var if_block = (ctx.tag.title) && create_if_block$1(ctx);
+
+ let each_value_1 = ctx.tag.children;
+
+ let each_blocks = [];
+
+ for (let i = 0; i < each_value_1.length; i += 1) {
+ each_blocks[i] = create_each_block_1(get_each_context_1(ctx, each_value_1, i));
+ }
+
+ const out = i => transition_out(each_blocks[i], 1, 1, () => {
+ each_blocks[i] = null;
+ });
+
+ return {
+ c() {
+ if (if_block) if_block.c();
+ t0 = space();
+ ul = element("ul");
+
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].c();
+ }
+
+ t1 = space();
+ attr(ul, "class", "menu-list");
+ },
+
+ m(target, anchor) {
+ if (if_block) if_block.m(target, anchor);
+ insert(target, t0, anchor);
+ insert(target, ul, anchor);
+
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].m(ul, null);
+ }
+
+ append(ul, t1);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if (ctx.tag.title) {
+ if (if_block) {
+ if_block.p(changed, ctx);
+ } else {
+ if_block = create_if_block$1(ctx);
+ if_block.c();
+ if_block.m(t0.parentNode, t0);
+ }
+ } else if (if_block) {
+ if_block.d(1);
+ if_block = null;
+ }
+
+ if (changed.filteredActions || changed.actionsCount || changed.currentSlug || changed.handleClick) {
+ each_value_1 = ctx.tag.children;
+
+ let i;
+ for (i = 0; i < each_value_1.length; i += 1) {
+ const child_ctx = get_each_context_1(ctx, each_value_1, i);
+
+ if (each_blocks[i]) {
+ each_blocks[i].p(changed, child_ctx);
+ transition_in(each_blocks[i], 1);
+ } else {
+ each_blocks[i] = create_each_block_1(child_ctx);
+ each_blocks[i].c();
+ transition_in(each_blocks[i], 1);
+ each_blocks[i].m(ul, t1);
+ }
+ }
+
+ group_outros();
+ for (i = each_value_1.length; i < each_blocks.length; i += 1) {
+ out(i);
+ }
+ check_outros();
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ for (let i = 0; i < each_value_1.length; i += 1) {
+ transition_in(each_blocks[i]);
+ }
+
+ current = true;
+ },
+
+ o(local) {
+ each_blocks = each_blocks.filter(Boolean);
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ transition_out(each_blocks[i]);
+ }
+
+ current = false;
+ },
+
+ d(detaching) {
+ if (if_block) if_block.d(detaching);
+
+ if (detaching) {
+ detach(t0);
+ detach(ul);
+ }
+
+ destroy_each(each_blocks, detaching);
+ }
+ };
+ }
+
+ function create_fragment$1(ctx) {
+ var aside, section, div1, div0, p0, input, t0, span, t1, div2, p1, t3, ul, li, a, t4, a_href_value, t5, t6, current, dispose;
+
+ var if_block = (ctx.tagHeaders) && create_if_block_1$1(ctx);
+
+ let each_value = ctx.filteredActions;
+
+ let each_blocks = [];
+
+ for (let i_1 = 0; i_1 < each_value.length; i_1 += 1) {
+ each_blocks[i_1] = create_each_block$1(get_each_context$1(ctx, each_value, i_1));
+ }
+
+ const out = i => transition_out(each_blocks[i], 1, 1, () => {
+ each_blocks[i] = null;
+ });
+
+ return {
+ c() {
+ aside = element("aside");
+ section = element("section");
+ div1 = element("div");
+ div0 = element("div");
+ p0 = element("p");
+ input = element("input");
+ t0 = space();
+ span = element("span");
+ span.innerHTML = `<i class="fas fa-search"></i>`;
+ t1 = space();
+ div2 = element("div");
+ p1 = element("p");
+ p1.textContent = "API";
+ t3 = space();
+ ul = element("ul");
+ li = element("li");
+ a = element("a");
+ t4 = text("Introduction");
+ t5 = space();
+ if (if_block) if_block.c();
+ t6 = space();
+
+ for (let i_1 = 0; i_1 < each_blocks.length; i_1 += 1) {
+ each_blocks[i_1].c();
+ }
+ attr(input, "id", "search-input-text");
+ attr(input, "class", "input is-rounded svelte-1xl6iim");
+ attr(input, "placeholder", "Filter by path, method, and title...");
+ attr(span, "class", "icon is-right icon-input-search svelte-1xl6iim");
+ attr(p0, "class", "control has-icons-right");
+ attr(div0, "class", "field");
+ attr(div1, "class", "hero-body svelte-1xl6iim");
+ attr(section, "class", "hero is-sticky svelte-1xl6iim");
+ attr(p1, "class", "menu-label");
+ attr(a, "href", a_href_value = basePath(ctx.config));
+ attr(ul, "class", "menu-list");
+ attr(div2, "class", "menu-wrapper svelte-1xl6iim");
+ attr(aside, "class", "menu svelte-1xl6iim");
+ toggle_class(aside, "is-collapsed", ctx.isCollapsed);
+
+ dispose = [
+ listen(input, "input", ctx.input_input_handler),
+ listen(span, "click", ctx.searchClick),
+ listen(a, "click", prevent_default(ctx.tocClick))
+ ];
+ },
+
+ m(target, anchor) {
+ insert(target, aside, anchor);
+ append(aside, section);
+ append(section, div1);
+ append(div1, div0);
+ append(div0, p0);
+ append(p0, input);
+
+ set_input_value(input, ctx.query);
+
+ append(p0, t0);
+ append(p0, span);
+ append(aside, t1);
+ append(aside, div2);
+ append(div2, p1);
+ append(div2, t3);
+ append(div2, ul);
+ append(ul, li);
+ append(li, a);
+ append(a, t4);
+ append(ul, t5);
+ if (if_block) if_block.m(ul, null);
+ append(div2, t6);
+
+ for (let i_1 = 0; i_1 < each_blocks.length; i_1 += 1) {
+ each_blocks[i_1].m(div2, null);
+ }
+
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if (changed.query && (input.value !== ctx.query)) set_input_value(input, ctx.query);
+
+ if ((!current || changed.config) && a_href_value !== (a_href_value = basePath(ctx.config))) {
+ attr(a, "href", a_href_value);
+ }
+
+ if (ctx.tagHeaders) {
+ if (if_block) {
+ if_block.p(changed, ctx);
+ } else {
+ if_block = create_if_block_1$1(ctx);
+ if_block.c();
+ if_block.m(ul, null);
+ }
+ } else if (if_block) {
+ if_block.d(1);
+ if_block = null;
+ }
+
+ if (changed.filteredActions || changed.actionsCount || changed.currentSlug || changed.handleClick) {
+ each_value = ctx.filteredActions;
+
+ let i_1;
+ for (i_1 = 0; i_1 < each_value.length; i_1 += 1) {
+ const child_ctx = get_each_context$1(ctx, each_value, i_1);
+
+ if (each_blocks[i_1]) {
+ each_blocks[i_1].p(changed, child_ctx);
+ transition_in(each_blocks[i_1], 1);
+ } else {
+ each_blocks[i_1] = create_each_block$1(child_ctx);
+ each_blocks[i_1].c();
+ transition_in(each_blocks[i_1], 1);
+ each_blocks[i_1].m(div2, null);
+ }
+ }
+
+ group_outros();
+ for (i_1 = each_value.length; i_1 < each_blocks.length; i_1 += 1) {
+ out(i_1);
+ }
+ check_outros();
+ }
+
+ if (changed.isCollapsed) {
+ toggle_class(aside, "is-collapsed", ctx.isCollapsed);
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ for (let i_1 = 0; i_1 < each_value.length; i_1 += 1) {
+ transition_in(each_blocks[i_1]);
+ }
+
+ current = true;
+ },
+
+ o(local) {
+ each_blocks = each_blocks.filter(Boolean);
+ for (let i_1 = 0; i_1 < each_blocks.length; i_1 += 1) {
+ transition_out(each_blocks[i_1]);
+ }
+
+ current = false;
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(aside);
+ }
+
+ if (if_block) if_block.d();
+
+ destroy_each(each_blocks, detaching);
+
+ run_all(dispose);
+ }
+ };
+ }
+
+ function escape$2(text) {
+ return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+ }
+
+ function headerLink(text) {
+ return text.toLowerCase().replace(/\s/g, "-");
+ }
+
+ function instance$1($$self, $$props, $$invalidate) {
+
+
+ let { config = {}, tagActions = [], tagHeaders = [], currentSlug, actionsCount, isCollapsed, handleClick, tocClick, searchClick } = $$props;
+
+ let query = "";
+
+ function input_input_handler() {
+ query = this.value;
+ $$invalidate('query', query);
+ }
+
+ $$self.$set = $$props => {
+ if ('config' in $$props) $$invalidate('config', config = $$props.config);
+ if ('tagActions' in $$props) $$invalidate('tagActions', tagActions = $$props.tagActions);
+ if ('tagHeaders' in $$props) $$invalidate('tagHeaders', tagHeaders = $$props.tagHeaders);
+ if ('currentSlug' in $$props) $$invalidate('currentSlug', currentSlug = $$props.currentSlug);
+ if ('actionsCount' in $$props) $$invalidate('actionsCount', actionsCount = $$props.actionsCount);
+ if ('isCollapsed' in $$props) $$invalidate('isCollapsed', isCollapsed = $$props.isCollapsed);
+ if ('handleClick' in $$props) $$invalidate('handleClick', handleClick = $$props.handleClick);
+ if ('tocClick' in $$props) $$invalidate('tocClick', tocClick = $$props.tocClick);
+ if ('searchClick' in $$props) $$invalidate('searchClick', searchClick = $$props.searchClick);
+ };
+
+ let regex, filteredActions;
+
+ $$self.$$.update = ($$dirty = { query: 1, tagActions: 1, regex: 1 }) => {
+ if ($$dirty.query) { $$invalidate('regex', regex = new RegExp(escape$2(query), "gi")); }
+ if ($$dirty.tagActions || $$dirty.regex) { $$invalidate('filteredActions', filteredActions = filterActions(tagActions, regex)); }
+ };
+
+ return {
+ config,
+ tagActions,
+ tagHeaders,
+ currentSlug,
+ actionsCount,
+ isCollapsed,
+ handleClick,
+ tocClick,
+ searchClick,
+ query,
+ filteredActions,
+ input_input_handler
+ };
+ }
+
+ class MenuPanel extends SvelteComponent {
+ constructor(options) {
+ super();
+ if (!document.getElementById("svelte-1xl6iim-style")) add_css$1();
+ init(this, options, instance$1, create_fragment$1, safe_not_equal, ["config", "tagActions", "tagHeaders", "currentSlug", "actionsCount", "isCollapsed", "handleClick", "tocClick", "searchClick"]);
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/tables/HeaderTable.svelte generated by Svelte v3.12.1 */
+
+ function get_each_context$2(ctx, list, i) {
+ const child_ctx = Object.create(ctx);
+ child_ctx.name = list[i].name;
+ child_ctx.example = list[i].example;
+ return child_ctx;
+ }
+
+ // (5:0) {#if headers.length > 0}
+ function create_if_block$2(ctx) {
+ var table, thead, t_1, tbody;
+
+ let each_value = ctx.headers;
+
+ let each_blocks = [];
+
+ for (let i = 0; i < each_value.length; i += 1) {
+ each_blocks[i] = create_each_block$2(get_each_context$2(ctx, each_value, i));
+ }
+
+ return {
+ c() {
+ table = element("table");
+ thead = element("thead");
+ thead.innerHTML = `<tr><th colspan="2">Headers</th></tr>`;
+ t_1 = space();
+ tbody = element("tbody");
+
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].c();
+ }
+ attr(table, "class", "table is-stripped is-fullwidth");
+ },
+
+ m(target, anchor) {
+ insert(target, table, anchor);
+ append(table, thead);
+ append(table, t_1);
+ append(table, tbody);
+
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].m(tbody, null);
+ }
+ },
+
+ p(changed, ctx) {
+ if (changed.headers) {
+ each_value = ctx.headers;
+
+ let i;
+ for (i = 0; i < each_value.length; i += 1) {
+ const child_ctx = get_each_context$2(ctx, each_value, i);
+
+ if (each_blocks[i]) {
+ each_blocks[i].p(changed, child_ctx);
+ } else {
+ each_blocks[i] = create_each_block$2(child_ctx);
+ each_blocks[i].c();
+ each_blocks[i].m(tbody, null);
+ }
+ }
+
+ for (; i < each_blocks.length; i += 1) {
+ each_blocks[i].d(1);
+ }
+ each_blocks.length = each_value.length;
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(table);
+ }
+
+ destroy_each(each_blocks, detaching);
+ }
+ };
+ }
+
+ // (13:6) {#each headers as { name, example }}
+ function create_each_block$2(ctx) {
+ var tr, td0, t0_value = ctx.name + "", t0, t1, td1, code, t2_value = ctx.example + "", t2, t3;
+
+ return {
+ c() {
+ tr = element("tr");
+ td0 = element("td");
+ t0 = text(t0_value);
+ t1 = space();
+ td1 = element("td");
+ code = element("code");
+ t2 = text(t2_value);
+ t3 = space();
+ },
+
+ m(target, anchor) {
+ insert(target, tr, anchor);
+ append(tr, td0);
+ append(td0, t0);
+ append(tr, t1);
+ append(tr, td1);
+ append(td1, code);
+ append(code, t2);
+ append(tr, t3);
+ },
+
+ p(changed, ctx) {
+ if ((changed.headers) && t0_value !== (t0_value = ctx.name + "")) {
+ set_data(t0, t0_value);
+ }
+
+ if ((changed.headers) && t2_value !== (t2_value = ctx.example + "")) {
+ set_data(t2, t2_value);
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(tr);
+ }
+ }
+ };
+ }
+
+ function create_fragment$2(ctx) {
+ var if_block_anchor;
+
+ var if_block = (ctx.headers.length > 0) && create_if_block$2(ctx);
+
+ return {
+ c() {
+ if (if_block) if_block.c();
+ if_block_anchor = empty();
+ },
+
+ m(target, anchor) {
+ if (if_block) if_block.m(target, anchor);
+ insert(target, if_block_anchor, anchor);
+ },
+
+ p(changed, ctx) {
+ if (ctx.headers.length > 0) {
+ if (if_block) {
+ if_block.p(changed, ctx);
+ } else {
+ if_block = create_if_block$2(ctx);
+ if_block.c();
+ if_block.m(if_block_anchor.parentNode, if_block_anchor);
+ }
+ } else if (if_block) {
+ if_block.d(1);
+ if_block = null;
+ }
+ },
+
+ i: noop,
+ o: noop,
+
+ d(detaching) {
+ if (if_block) if_block.d(detaching);
+
+ if (detaching) {
+ detach(if_block_anchor);
+ }
+ }
+ };
+ }
+
+ function instance$2($$self, $$props, $$invalidate) {
+ let { headers = [] } = $$props;
+
+ $$self.$set = $$props => {
+ if ('headers' in $$props) $$invalidate('headers', headers = $$props.headers);
+ };
+
+ return { headers };
+ }
+
+ class HeaderTable extends SvelteComponent {
+ constructor(options) {
+ super();
+ init(this, options, instance$2, create_fragment$2, safe_not_equal, ["headers"]);
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/components/CodeBlock.svelte generated by Svelte v3.12.1 */
+
+ // (10:0) {#if body}
+ function create_if_block$3(ctx) {
+ var pre, code, raw_value = highlight(stringify$2(ctx.body), ctx.mime) + "", code_class_value, pre_class_value;
+
+ return {
+ c() {
+ pre = element("pre");
+ code = element("code");
+ attr(code, "class", code_class_value = "language-" + ctx.mime);
+ attr(pre, "class", pre_class_value = "language-" + ctx.mime);
+ },
+
+ m(target, anchor) {
+ insert(target, pre, anchor);
+ append(pre, code);
+ code.innerHTML = raw_value;
+ },
+
+ p(changed, ctx) {
+ if ((changed.body || changed.mime) && raw_value !== (raw_value = highlight(stringify$2(ctx.body), ctx.mime) + "")) {
+ code.innerHTML = raw_value;
+ }
+
+ if ((changed.mime) && code_class_value !== (code_class_value = "language-" + ctx.mime)) {
+ attr(code, "class", code_class_value);
+ }
+
+ if ((changed.mime) && pre_class_value !== (pre_class_value = "language-" + ctx.mime)) {
+ attr(pre, "class", pre_class_value);
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(pre);
+ }
+ }
+ };
+ }
+
+ function create_fragment$3(ctx) {
+ var if_block_anchor;
+
+ var if_block = (ctx.body) && create_if_block$3(ctx);
+
+ return {
+ c() {
+ if (if_block) if_block.c();
+ if_block_anchor = empty();
+ },
+
+ m(target, anchor) {
+ if (if_block) if_block.m(target, anchor);
+ insert(target, if_block_anchor, anchor);
+ },
+
+ p(changed, ctx) {
+ if (ctx.body) {
+ if (if_block) {
+ if_block.p(changed, ctx);
+ } else {
+ if_block = create_if_block$3(ctx);
+ if_block.c();
+ if_block.m(if_block_anchor.parentNode, if_block_anchor);
+ }
+ } else if (if_block) {
+ if_block.d(1);
+ if_block = null;
+ }
+ },
+
+ i: noop,
+ o: noop,
+
+ d(detaching) {
+ if (if_block) if_block.d(detaching);
+
+ if (detaching) {
+ detach(if_block_anchor);
+ }
+ }
+ };
+ }
+
+ function instance$3($$self, $$props, $$invalidate) {
+ let { type, body } = $$props;
+
+ $$self.$set = $$props => {
+ if ('type' in $$props) $$invalidate('type', type = $$props.type);
+ if ('body' in $$props) $$invalidate('body', body = $$props.body);
+ };
+
+ let mime;
+
+ $$self.$$.update = ($$dirty = { type: 1 }) => {
+ if ($$dirty.type) { $$invalidate('mime', mime = alias(type)); }
+ };
+
+ return { type, body, mime };
+ }
+
+ class CodeBlock extends SvelteComponent {
+ constructor(options) {
+ super();
+ init(this, options, instance$3, create_fragment$3, safe_not_equal, ["type", "body"]);
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/panels/CodePanel.svelte generated by Svelte v3.12.1 */
+
+ function add_css$2() {
+ var style = element("style");
+ style.id = 'svelte-15v28ah-style';
+ style.textContent = ".tab-content.svelte-15v28ah{display:none}.tab-content.is-active.svelte-15v28ah{display:block}";
+ append(document.head, style);
+ }
+
+ // (32:0) {#if example || schema}
+ function create_if_block$4(ctx) {
+ var div2, div0, ul, li0, a0, t1, li1, a1, t3, div1, section0, section0_class_value, t4, section1, section1_class_value, current, dispose;
+
+ var codeblock0 = new CodeBlock({
+ props: { type: ctx.contentType, body: ctx.example }
+ });
+
+ var codeblock1 = new CodeBlock({
+ props: {
+ type: "application/json",
+ body: ctx.schema
+ }
+ });
+
+ return {
+ c() {
+ div2 = element("div");
+ div0 = element("div");
+ ul = element("ul");
+ li0 = element("li");
+ a0 = element("a");
+ a0.textContent = "Body";
+ t1 = space();
+ li1 = element("li");
+ a1 = element("a");
+ a1.textContent = "Schema";
+ t3 = space();
+ div1 = element("div");
+ section0 = element("section");
+ codeblock0.$$.fragment.c();
+ t4 = space();
+ section1 = element("section");
+ codeblock1.$$.fragment.c();
+ attr(a0, "data-index", "0");
+ attr(a0, "href", "javascript:void(0)");
+ toggle_class(li0, "is-active", ctx.tabIndex === 0);
+ attr(a1, "data-index", "1");
+ attr(a1, "href", "javascript:void(0)");
+ toggle_class(li1, "is-active", ctx.tabIndex === 1);
+ attr(div0, "class", "tabs is-fullwidth");
+ toggle_class(div0, "is-toggle", ctx.asToggle);
+ attr(section0, "class", section0_class_value = "tab-content " + ctx.activeBody + " svelte-15v28ah");
+ attr(section1, "class", section1_class_value = "tab-content " + ctx.activeSchema + " svelte-15v28ah");
+ attr(div2, "class", "tabs-with-content");
+
+ dispose = [
+ listen(a0, "click", ctx.tabSelect),
+ listen(a1, "click", ctx.tabSelect)
+ ];
+ },
+
+ m(target, anchor) {
+ insert(target, div2, anchor);
+ append(div2, div0);
+ append(div0, ul);
+ append(ul, li0);
+ append(li0, a0);
+ append(ul, t1);
+ append(ul, li1);
+ append(li1, a1);
+ append(div2, t3);
+ append(div2, div1);
+ append(div1, section0);
+ mount_component(codeblock0, section0, null);
+ append(div1, t4);
+ append(div1, section1);
+ mount_component(codeblock1, section1, null);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if (changed.tabIndex) {
+ toggle_class(li0, "is-active", ctx.tabIndex === 0);
+ toggle_class(li1, "is-active", ctx.tabIndex === 1);
+ }
+
+ if (changed.asToggle) {
+ toggle_class(div0, "is-toggle", ctx.asToggle);
+ }
+
+ var codeblock0_changes = {};
+ if (changed.contentType) codeblock0_changes.type = ctx.contentType;
+ if (changed.example) codeblock0_changes.body = ctx.example;
+ codeblock0.$set(codeblock0_changes);
+
+ if ((!current || changed.activeBody) && section0_class_value !== (section0_class_value = "tab-content " + ctx.activeBody + " svelte-15v28ah")) {
+ attr(section0, "class", section0_class_value);
+ }
+
+ var codeblock1_changes = {};
+ if (changed.schema) codeblock1_changes.body = ctx.schema;
+ codeblock1.$set(codeblock1_changes);
+
+ if ((!current || changed.activeSchema) && section1_class_value !== (section1_class_value = "tab-content " + ctx.activeSchema + " svelte-15v28ah")) {
+ attr(section1, "class", section1_class_value);
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(codeblock0.$$.fragment, local);
+
+ transition_in(codeblock1.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(codeblock0.$$.fragment, local);
+ transition_out(codeblock1.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(div2);
+ }
+
+ destroy_component(codeblock0);
+
+ destroy_component(codeblock1);
+
+ run_all(dispose);
+ }
+ };
+ }
+
+ function create_fragment$4(ctx) {
+ var if_block_anchor, current;
+
+ var if_block = (ctx.example || ctx.schema) && create_if_block$4(ctx);
+
+ return {
+ c() {
+ if (if_block) if_block.c();
+ if_block_anchor = empty();
+ },
+
+ m(target, anchor) {
+ if (if_block) if_block.m(target, anchor);
+ insert(target, if_block_anchor, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if (ctx.example || ctx.schema) {
+ if (if_block) {
+ if_block.p(changed, ctx);
+ transition_in(if_block, 1);
+ } else {
+ if_block = create_if_block$4(ctx);
+ if_block.c();
+ transition_in(if_block, 1);
+ if_block.m(if_block_anchor.parentNode, if_block_anchor);
+ }
+ } else if (if_block) {
+ group_outros();
+ transition_out(if_block, 1, 1, () => {
+ if_block = null;
+ });
+ check_outros();
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(if_block);
+ current = true;
+ },
+
+ o(local) {
+ transition_out(if_block);
+ current = false;
+ },
+
+ d(detaching) {
+ if (if_block) if_block.d(detaching);
+
+ if (detaching) {
+ detach(if_block_anchor);
+ }
+ }
+ };
+ }
+
+ function instance$4($$self, $$props, $$invalidate) {
+ let { contentType, example, schema, asToggle } = $$props;
+
+ let activeBody = "is-active";
+ let activeSchema = "";
+ let tabIndex = 0;
+
+ const tabSelect = event => {
+ const index = event.target.dataset["index"];
+ $$invalidate('tabIndex', tabIndex = parseInt(index, 10));
+ };
+
+ $$self.$set = $$props => {
+ if ('contentType' in $$props) $$invalidate('contentType', contentType = $$props.contentType);
+ if ('example' in $$props) $$invalidate('example', example = $$props.example);
+ if ('schema' in $$props) $$invalidate('schema', schema = $$props.schema);
+ if ('asToggle' in $$props) $$invalidate('asToggle', asToggle = $$props.asToggle);
+ };
+
+ $$self.$$.update = ($$dirty = { tabIndex: 1 }) => {
+ if ($$dirty.tabIndex) { $$invalidate('activeBody', activeBody = tabIndex === 0 ? "is-active" : ""); }
+ if ($$dirty.tabIndex) { $$invalidate('activeSchema', activeSchema = tabIndex === 1 ? "is-active" : ""); }
+ };
+
+ return {
+ contentType,
+ example,
+ schema,
+ asToggle,
+ activeBody,
+ activeSchema,
+ tabIndex,
+ tabSelect
+ };
+ }
+
+ class CodePanel extends SvelteComponent {
+ constructor(options) {
+ super();
+ if (!document.getElementById("svelte-15v28ah-style")) add_css$2();
+ init(this, options, instance$4, create_fragment$4, safe_not_equal, ["contentType", "example", "schema", "asToggle", "tabSelect"]);
+ }
+
+ get tabSelect() {
+ return this.$$.ctx.tabSelect;
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/panels/RequestPanel.svelte generated by Svelte v3.12.1 */
+
+ // (16:0) {#if description}
+ function create_if_block_1$2(ctx) {
+ var div, raw_value = markdown(ctx.description) + "";
+
+ return {
+ c() {
+ div = element("div");
+ attr(div, "class", "content");
+ },
+
+ m(target, anchor) {
+ insert(target, div, anchor);
+ div.innerHTML = raw_value;
+ },
+
+ p(changed, ctx) {
+ if ((changed.description) && raw_value !== (raw_value = markdown(ctx.description) + "")) {
+ div.innerHTML = raw_value;
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ }
+ };
+ }
+
+ // (26:0) {#if showRequest}
+ function create_if_block$5(ctx) {
+ var hr;
+
+ return {
+ c() {
+ hr = element("hr");
+ },
+
+ m(target, anchor) {
+ insert(target, hr, anchor);
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(hr);
+ }
+ }
+ };
+ }
+
+ function create_fragment$5(ctx) {
+ var t0, t1, t2, if_block1_anchor, current;
+
+ var if_block0 = (ctx.description) && create_if_block_1$2(ctx);
+
+ var headertable = new HeaderTable({ props: { headers: ctx.headers } });
+
+ var codepanel = new CodePanel({
+ props: {
+ contentType: ctx.contentType,
+ example: ctx.example,
+ schema: ctx.schema,
+ asToggle: true
+ }
+ });
+
+ var if_block1 = (ctx.showRequest) && create_if_block$5(ctx);
+
+ return {
+ c() {
+ if (if_block0) if_block0.c();
+ t0 = space();
+ headertable.$$.fragment.c();
+ t1 = space();
+ codepanel.$$.fragment.c();
+ t2 = space();
+ if (if_block1) if_block1.c();
+ if_block1_anchor = empty();
+ },
+
+ m(target, anchor) {
+ if (if_block0) if_block0.m(target, anchor);
+ insert(target, t0, anchor);
+ mount_component(headertable, target, anchor);
+ insert(target, t1, anchor);
+ mount_component(codepanel, target, anchor);
+ insert(target, t2, anchor);
+ if (if_block1) if_block1.m(target, anchor);
+ insert(target, if_block1_anchor, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if (ctx.description) {
+ if (if_block0) {
+ if_block0.p(changed, ctx);
+ } else {
+ if_block0 = create_if_block_1$2(ctx);
+ if_block0.c();
+ if_block0.m(t0.parentNode, t0);
+ }
+ } else if (if_block0) {
+ if_block0.d(1);
+ if_block0 = null;
+ }
+
+ var headertable_changes = {};
+ if (changed.headers) headertable_changes.headers = ctx.headers;
+ headertable.$set(headertable_changes);
+
+ var codepanel_changes = {};
+ if (changed.contentType) codepanel_changes.contentType = ctx.contentType;
+ if (changed.example) codepanel_changes.example = ctx.example;
+ if (changed.schema) codepanel_changes.schema = ctx.schema;
+ codepanel.$set(codepanel_changes);
+
+ if (ctx.showRequest) {
+ if (!if_block1) {
+ if_block1 = create_if_block$5(ctx);
+ if_block1.c();
+ if_block1.m(if_block1_anchor.parentNode, if_block1_anchor);
+ }
+ } else if (if_block1) {
+ if_block1.d(1);
+ if_block1 = null;
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(headertable.$$.fragment, local);
+
+ transition_in(codepanel.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(headertable.$$.fragment, local);
+ transition_out(codepanel.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ if (if_block0) if_block0.d(detaching);
+
+ if (detaching) {
+ detach(t0);
+ }
+
+ destroy_component(headertable, detaching);
+
+ if (detaching) {
+ detach(t1);
+ }
+
+ destroy_component(codepanel, detaching);
+
+ if (detaching) {
+ detach(t2);
+ }
+
+ if (if_block1) if_block1.d(detaching);
+
+ if (detaching) {
+ detach(if_block1_anchor);
+ }
+ }
+ };
+ }
+
+ function instance$5($$self, $$props, $$invalidate) {
+
+
+ let { description, headers, contentType, example, schema } = $$props;
+
+ $$self.$set = $$props => {
+ if ('description' in $$props) $$invalidate('description', description = $$props.description);
+ if ('headers' in $$props) $$invalidate('headers', headers = $$props.headers);
+ if ('contentType' in $$props) $$invalidate('contentType', contentType = $$props.contentType);
+ if ('example' in $$props) $$invalidate('example', example = $$props.example);
+ if ('schema' in $$props) $$invalidate('schema', schema = $$props.schema);
+ };
+
+ let showRequest;
+
+ $$self.$$.update = ($$dirty = { description: 1, headers: 1, example: 1 }) => {
+ if ($$dirty.description || $$dirty.headers || $$dirty.example) { $$invalidate('showRequest', showRequest = !!(description || headers.length !== 0 || example)); }
+ };
+
+ return {
+ description,
+ headers,
+ contentType,
+ example,
+ schema,
+ showRequest
+ };
+ }
+
+ class RequestPanel extends SvelteComponent {
+ constructor(options) {
+ super();
+ init(this, options, instance$5, create_fragment$5, safe_not_equal, ["description", "headers", "contentType", "example", "schema"]);
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/panels/ResponsePanel.svelte generated by Svelte v3.12.1 */
+
+ // (20:6) {#if title}
+ function create_if_block_1$3(ctx) {
+ var t;
+
+ return {
+ c() {
+ t = text(ctx.title);
+ },
+
+ m(target, anchor) {
+ insert(target, t, anchor);
+ },
+
+ p(changed, ctx) {
+ if (changed.title) {
+ set_data(t, ctx.title);
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(t);
+ }
+ }
+ };
+ }
+
+ // (29:4) {#if description}
+ function create_if_block$6(ctx) {
+ var div, raw_value = markdown(ctx.description) + "";
+
+ return {
+ c() {
+ div = element("div");
+ attr(div, "class", "content");
+ },
+
+ m(target, anchor) {
+ insert(target, div, anchor);
+ div.innerHTML = raw_value;
+ },
+
+ p(changed, ctx) {
+ if ((changed.description) && raw_value !== (raw_value = markdown(ctx.description) + "")) {
+ div.innerHTML = raw_value;
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ }
+ };
+ }
+
+ function create_fragment$6(ctx) {
+ var div1, header, p, t0, t1, a, span, t2_value = ctx.contentType || '' + "", t2, t3, code, t4, code_class_value, t5, div0, t6, t7, current;
+
+ var if_block0 = (ctx.title) && create_if_block_1$3(ctx);
+
+ var if_block1 = (ctx.description) && create_if_block$6(ctx);
+
+ var headertable = new HeaderTable({ props: { headers: ctx.headers } });
+
+ var codepanel = new CodePanel({
+ props: {
+ contentType: ctx.contentType,
+ example: ctx.example,
+ schema: ctx.schema
+ }
+ });
+
+ return {
+ c() {
+ div1 = element("div");
+ header = element("header");
+ p = element("p");
+ t0 = text("Response\n ");
+ if (if_block0) if_block0.c();
+ t1 = space();
+ a = element("a");
+ span = element("span");
+ t2 = text(t2_value);
+ t3 = space();
+ code = element("code");
+ t4 = text(ctx.statusCode);
+ t5 = space();
+ div0 = element("div");
+ if (if_block1) if_block1.c();
+ t6 = space();
+ headertable.$$.fragment.c();
+ t7 = space();
+ codepanel.$$.fragment.c();
+ attr(p, "class", "card-header-title");
+ attr(span, "class", "tag is-medium is-white");
+ attr(code, "class", code_class_value = "tag is-medium " + colorize(ctx.statusCode));
+ attr(a, "href", "javascript:void(0)");
+ attr(a, "class", "card-header-icon is-family-code");
+ attr(header, "class", "card-header");
+ attr(div0, "class", "card-content");
+ attr(div1, "class", "card");
+ },
+
+ m(target, anchor) {
+ insert(target, div1, anchor);
+ append(div1, header);
+ append(header, p);
+ append(p, t0);
+ if (if_block0) if_block0.m(p, null);
+ append(header, t1);
+ append(header, a);
+ append(a, span);
+ append(span, t2);
+ append(a, t3);
+ append(a, code);
+ append(code, t4);
+ append(div1, t5);
+ append(div1, div0);
+ if (if_block1) if_block1.m(div0, null);
+ append(div0, t6);
+ mount_component(headertable, div0, null);
+ append(div0, t7);
+ mount_component(codepanel, div0, null);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if (ctx.title) {
+ if (if_block0) {
+ if_block0.p(changed, ctx);
+ } else {
+ if_block0 = create_if_block_1$3(ctx);
+ if_block0.c();
+ if_block0.m(p, null);
+ }
+ } else if (if_block0) {
+ if_block0.d(1);
+ if_block0 = null;
+ }
+
+ if ((!current || changed.contentType) && t2_value !== (t2_value = ctx.contentType || '' + "")) {
+ set_data(t2, t2_value);
+ }
+
+ if (!current || changed.statusCode) {
+ set_data(t4, ctx.statusCode);
+ }
+
+ if ((!current || changed.statusCode) && code_class_value !== (code_class_value = "tag is-medium " + colorize(ctx.statusCode))) {
+ attr(code, "class", code_class_value);
+ }
+
+ if (ctx.description) {
+ if (if_block1) {
+ if_block1.p(changed, ctx);
+ } else {
+ if_block1 = create_if_block$6(ctx);
+ if_block1.c();
+ if_block1.m(div0, t6);
+ }
+ } else if (if_block1) {
+ if_block1.d(1);
+ if_block1 = null;
+ }
+
+ var headertable_changes = {};
+ if (changed.headers) headertable_changes.headers = ctx.headers;
+ headertable.$set(headertable_changes);
+
+ var codepanel_changes = {};
+ if (changed.contentType) codepanel_changes.contentType = ctx.contentType;
+ if (changed.example) codepanel_changes.example = ctx.example;
+ if (changed.schema) codepanel_changes.schema = ctx.schema;
+ codepanel.$set(codepanel_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(headertable.$$.fragment, local);
+
+ transition_in(codepanel.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(headertable.$$.fragment, local);
+ transition_out(codepanel.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(div1);
+ }
+
+ if (if_block0) if_block0.d();
+ if (if_block1) if_block1.d();
+
+ destroy_component(headertable);
+
+ destroy_component(codepanel);
+ }
+ };
+ }
+
+ function instance$6($$self, $$props, $$invalidate) {
+
+
+ let { title, description, headers, statusCode, contentType, example, schema } = $$props;
+
+ $$self.$set = $$props => {
+ if ('title' in $$props) $$invalidate('title', title = $$props.title);
+ if ('description' in $$props) $$invalidate('description', description = $$props.description);
+ if ('headers' in $$props) $$invalidate('headers', headers = $$props.headers);
+ if ('statusCode' in $$props) $$invalidate('statusCode', statusCode = $$props.statusCode);
+ if ('contentType' in $$props) $$invalidate('contentType', contentType = $$props.contentType);
+ if ('example' in $$props) $$invalidate('example', example = $$props.example);
+ if ('schema' in $$props) $$invalidate('schema', schema = $$props.schema);
+ };
+
+ return {
+ title,
+ description,
+ headers,
+ statusCode,
+ contentType,
+ example,
+ schema
+ };
+ }
+
+ class ResponsePanel extends SvelteComponent {
+ constructor(options) {
+ super();
+ init(this, options, instance$6, create_fragment$6, safe_not_equal, ["title", "description", "headers", "statusCode", "contentType", "example", "schema"]);
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/tables/ParameterTable.svelte generated by Svelte v3.12.1 */
+
+ function get_each_context$3(ctx, list, i) {
+ const child_ctx = Object.create(ctx);
+ child_ctx.name = list[i].name;
+ child_ctx.example = list[i].example;
+ child_ctx.required = list[i].required;
+ child_ctx.description = list[i].description;
+ child_ctx.schema = list[i].schema;
+ return child_ctx;
+ }
+
+ // (36:10) {:else}
+ function create_else_block(ctx) {
+ var div;
+
+ return {
+ c() {
+ div = element("div");
+ div.textContent = "-";
+ attr(div, "class", "content");
+ },
+
+ m(target, anchor) {
+ insert(target, div, anchor);
+ },
+
+ p: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ }
+ };
+ }
+
+ // (32:10) {#if description}
+ function create_if_block_2$1(ctx) {
+ var div, raw_value = markdown(ctx.description) + "";
+
+ return {
+ c() {
+ div = element("div");
+ attr(div, "class", "content");
+ },
+
+ m(target, anchor) {
+ insert(target, div, anchor);
+ div.innerHTML = raw_value;
+ },
+
+ p(changed, ctx) {
+ if ((changed.parameters) && raw_value !== (raw_value = markdown(ctx.description) + "")) {
+ div.innerHTML = raw_value;
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ }
+ };
+ }
+
+ // (40:10) {#if example}
+ function create_if_block_1$4(ctx) {
+ var div, span, t1, code, t2_value = ctx.example + "", t2;
+
+ return {
+ c() {
+ div = element("div");
+ span = element("span");
+ span.textContent = "Example:";
+ t1 = space();
+ code = element("code");
+ t2 = text(t2_value);
+ attr(code, "class", "tag");
+ },
+
+ m(target, anchor) {
+ insert(target, div, anchor);
+ append(div, span);
+ append(div, t1);
+ append(div, code);
+ append(code, t2);
+ },
+
+ p(changed, ctx) {
+ if ((changed.parameters) && t2_value !== (t2_value = ctx.example + "")) {
+ set_data(t2, t2_value);
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ }
+ };
+ }
+
+ // (47:10) {#if schema.enum}
+ function create_if_block$7(ctx) {
+ var div, span, t1, code, t2_value = ctx.schema.enum + "", t2;
+
+ return {
+ c() {
+ div = element("div");
+ span = element("span");
+ span.textContent = "Values:";
+ t1 = space();
+ code = element("code");
+ t2 = text(t2_value);
+ },
+
+ m(target, anchor) {
+ insert(target, div, anchor);
+ append(div, span);
+ append(div, t1);
+ append(div, code);
+ append(code, t2);
+ },
+
+ p(changed, ctx) {
+ if ((changed.parameters) && t2_value !== (t2_value = ctx.schema.enum + "")) {
+ set_data(t2, t2_value);
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ }
+ };
+ }
+
+ // (15:4) {#each parameters as { name, example, required, description, schema }}
+ function create_each_block$3(ctx) {
+ var tr, td0, code, t0_value = ctx.name + "", t0, t1, td1, div, span0, t2_value = ctx.schema.type + "", t2, t3, span1, t4_value = ctx.required ? 'required' : 'optional' + "", t4, t5, td2, t6, t7, t8;
+
+ function select_block_type(changed, ctx) {
+ if (ctx.description) return create_if_block_2$1;
+ return create_else_block;
+ }
+
+ var current_block_type = select_block_type(null, ctx);
+ var if_block0 = current_block_type(ctx);
+
+ var if_block1 = (ctx.example) && create_if_block_1$4(ctx);
+
+ var if_block2 = (ctx.schema.enum) && create_if_block$7(ctx);
+
+ return {
+ c() {
+ tr = element("tr");
+ td0 = element("td");
+ code = element("code");
+ t0 = text(t0_value);
+ t1 = space();
+ td1 = element("td");
+ div = element("div");
+ span0 = element("span");
+ t2 = text(t2_value);
+ t3 = space();
+ span1 = element("span");
+ t4 = text(t4_value);
+ t5 = space();
+ td2 = element("td");
+ if_block0.c();
+ t6 = space();
+ if (if_block1) if_block1.c();
+ t7 = space();
+ if (if_block2) if_block2.c();
+ t8 = space();
+ attr(span0, "class", "tag");
+ attr(span1, "class", "tag");
+ toggle_class(span1, "is-dark", ctx.required);
+ toggle_class(span1, "is-white", !ctx.required);
+ attr(div, "class", "tags has-addons");
+ },
+
+ m(target, anchor) {
+ insert(target, tr, anchor);
+ append(tr, td0);
+ append(td0, code);
+ append(code, t0);
+ append(tr, t1);
+ append(tr, td1);
+ append(td1, div);
+ append(div, span0);
+ append(span0, t2);
+ append(div, t3);
+ append(div, span1);
+ append(span1, t4);
+ append(tr, t5);
+ append(tr, td2);
+ if_block0.m(td2, null);
+ append(td2, t6);
+ if (if_block1) if_block1.m(td2, null);
+ append(td2, t7);
+ if (if_block2) if_block2.m(td2, null);
+ append(tr, t8);
+ },
+
+ p(changed, ctx) {
+ if ((changed.parameters) && t0_value !== (t0_value = ctx.name + "")) {
+ set_data(t0, t0_value);
+ }
+
+ if ((changed.parameters) && t2_value !== (t2_value = ctx.schema.type + "")) {
+ set_data(t2, t2_value);
+ }
+
+ if ((changed.parameters) && t4_value !== (t4_value = ctx.required ? 'required' : 'optional' + "")) {
+ set_data(t4, t4_value);
+ }
+
+ if (changed.parameters) {
+ toggle_class(span1, "is-dark", ctx.required);
+ toggle_class(span1, "is-white", !ctx.required);
+ }
+
+ if (current_block_type === (current_block_type = select_block_type(changed, ctx)) && if_block0) {
+ if_block0.p(changed, ctx);
+ } else {
+ if_block0.d(1);
+ if_block0 = current_block_type(ctx);
+ if (if_block0) {
+ if_block0.c();
+ if_block0.m(td2, t6);
+ }
+ }
+
+ if (ctx.example) {
+ if (if_block1) {
+ if_block1.p(changed, ctx);
+ } else {
+ if_block1 = create_if_block_1$4(ctx);
+ if_block1.c();
+ if_block1.m(td2, t7);
+ }
+ } else if (if_block1) {
+ if_block1.d(1);
+ if_block1 = null;
+ }
+
+ if (ctx.schema.enum) {
+ if (if_block2) {
+ if_block2.p(changed, ctx);
+ } else {
+ if_block2 = create_if_block$7(ctx);
+ if_block2.c();
+ if_block2.m(td2, null);
+ }
+ } else if (if_block2) {
+ if_block2.d(1);
+ if_block2 = null;
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(tr);
+ }
+
+ if_block0.d();
+ if (if_block1) if_block1.d();
+ if (if_block2) if_block2.d();
+ }
+ };
+ }
+
+ function create_fragment$7(ctx) {
+ var table, thead, tr, th, t0, t1, tbody;
+
+ let each_value = ctx.parameters;
+
+ let each_blocks = [];
+
+ for (let i = 0; i < each_value.length; i += 1) {
+ each_blocks[i] = create_each_block$3(get_each_context$3(ctx, each_value, i));
+ }
+
+ return {
+ c() {
+ table = element("table");
+ thead = element("thead");
+ tr = element("tr");
+ th = element("th");
+ t0 = text(ctx.title);
+ t1 = space();
+ tbody = element("tbody");
+
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].c();
+ }
+ attr(th, "colspan", "3");
+ attr(table, "class", "table table-bordered is-bordered is-fullwidth");
+ },
+
+ m(target, anchor) {
+ insert(target, table, anchor);
+ append(table, thead);
+ append(thead, tr);
+ append(tr, th);
+ append(th, t0);
+ append(table, t1);
+ append(table, tbody);
+
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].m(tbody, null);
+ }
+ },
+
+ p(changed, ctx) {
+ if (changed.title) {
+ set_data(t0, ctx.title);
+ }
+
+ if (changed.parameters || changed.markdown) {
+ each_value = ctx.parameters;
+
+ let i;
+ for (i = 0; i < each_value.length; i += 1) {
+ const child_ctx = get_each_context$3(ctx, each_value, i);
+
+ if (each_blocks[i]) {
+ each_blocks[i].p(changed, child_ctx);
+ } else {
+ each_blocks[i] = create_each_block$3(child_ctx);
+ each_blocks[i].c();
+ each_blocks[i].m(tbody, null);
+ }
+ }
+
+ for (; i < each_blocks.length; i += 1) {
+ each_blocks[i].d(1);
+ }
+ each_blocks.length = each_value.length;
+ }
+ },
+
+ i: noop,
+ o: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(table);
+ }
+
+ destroy_each(each_blocks, detaching);
+ }
+ };
+ }
+
+ function instance$7($$self, $$props, $$invalidate) {
+ let { title, parameters } = $$props;
+
+ $$self.$set = $$props => {
+ if ('title' in $$props) $$invalidate('title', title = $$props.title);
+ if ('parameters' in $$props) $$invalidate('parameters', parameters = $$props.parameters);
+ };
+
+ return { title, parameters };
+ }
+
+ class ParameterTable extends SvelteComponent {
+ constructor(options) {
+ super();
+ init(this, options, instance$7, create_fragment$7, safe_not_equal, ["title", "parameters"]);
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/panels/ParameterPanel.svelte generated by Svelte v3.12.1 */
+
+ // (10:0) {#if pathParameters.length > 0}
+ function create_if_block_1$5(ctx) {
+ var current;
+
+ var parametertable = new ParameterTable({
+ props: {
+ parameters: ctx.pathParameters,
+ title: "Path Parameters"
+ }
+ });
+
+ return {
+ c() {
+ parametertable.$$.fragment.c();
+ },
+
+ m(target, anchor) {
+ mount_component(parametertable, target, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ var parametertable_changes = {};
+ if (changed.pathParameters) parametertable_changes.parameters = ctx.pathParameters;
+ parametertable.$set(parametertable_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(parametertable.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(parametertable.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ destroy_component(parametertable, detaching);
+ }
+ };
+ }
+
+ // (14:0) {#if queryParameters.length > 0}
+ function create_if_block$8(ctx) {
+ var current;
+
+ var parametertable = new ParameterTable({
+ props: {
+ parameters: ctx.queryParameters,
+ title: "Query Parameters"
+ }
+ });
+
+ return {
+ c() {
+ parametertable.$$.fragment.c();
+ },
+
+ m(target, anchor) {
+ mount_component(parametertable, target, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ var parametertable_changes = {};
+ if (changed.queryParameters) parametertable_changes.parameters = ctx.queryParameters;
+ parametertable.$set(parametertable_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(parametertable.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(parametertable.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ destroy_component(parametertable, detaching);
+ }
+ };
+ }
+
+ function create_fragment$8(ctx) {
+ var t, if_block1_anchor, current;
+
+ var if_block0 = (ctx.pathParameters.length > 0) && create_if_block_1$5(ctx);
+
+ var if_block1 = (ctx.queryParameters.length > 0) && create_if_block$8(ctx);
+
+ return {
+ c() {
+ if (if_block0) if_block0.c();
+ t = space();
+ if (if_block1) if_block1.c();
+ if_block1_anchor = empty();
+ },
+
+ m(target, anchor) {
+ if (if_block0) if_block0.m(target, anchor);
+ insert(target, t, anchor);
+ if (if_block1) if_block1.m(target, anchor);
+ insert(target, if_block1_anchor, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if (ctx.pathParameters.length > 0) {
+ if (if_block0) {
+ if_block0.p(changed, ctx);
+ transition_in(if_block0, 1);
+ } else {
+ if_block0 = create_if_block_1$5(ctx);
+ if_block0.c();
+ transition_in(if_block0, 1);
+ if_block0.m(t.parentNode, t);
+ }
+ } else if (if_block0) {
+ group_outros();
+ transition_out(if_block0, 1, 1, () => {
+ if_block0 = null;
+ });
+ check_outros();
+ }
+
+ if (ctx.queryParameters.length > 0) {
+ if (if_block1) {
+ if_block1.p(changed, ctx);
+ transition_in(if_block1, 1);
+ } else {
+ if_block1 = create_if_block$8(ctx);
+ if_block1.c();
+ transition_in(if_block1, 1);
+ if_block1.m(if_block1_anchor.parentNode, if_block1_anchor);
+ }
+ } else if (if_block1) {
+ group_outros();
+ transition_out(if_block1, 1, 1, () => {
+ if_block1 = null;
+ });
+ check_outros();
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(if_block0);
+ transition_in(if_block1);
+ current = true;
+ },
+
+ o(local) {
+ transition_out(if_block0);
+ transition_out(if_block1);
+ current = false;
+ },
+
+ d(detaching) {
+ if (if_block0) if_block0.d(detaching);
+
+ if (detaching) {
+ detach(t);
+ }
+
+ if (if_block1) if_block1.d(detaching);
+
+ if (detaching) {
+ detach(if_block1_anchor);
+ }
+ }
+ };
+ }
+
+ function instance$8($$self, $$props, $$invalidate) {
+ let { parameters = [] } = $$props;
+
+ $$self.$set = $$props => {
+ if ('parameters' in $$props) $$invalidate('parameters', parameters = $$props.parameters);
+ };
+
+ let pathParameters, queryParameters;
+
+ $$self.$$.update = ($$dirty = { parameters: 1 }) => {
+ if ($$dirty.parameters) { $$invalidate('pathParameters', pathParameters = parameters.filter(param => param.location === "path")); }
+ if ($$dirty.parameters) { $$invalidate('queryParameters', queryParameters = parameters.filter(param => param.location === "query")); }
+ };
+
+ return {
+ parameters,
+ pathParameters,
+ queryParameters
+ };
+ }
+
+ class ParameterPanel extends SvelteComponent {
+ constructor(options) {
+ super();
+ init(this, options, instance$8, create_fragment$8, safe_not_equal, ["parameters"]);
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/components/LoginButton.svelte generated by Svelte v3.12.1 */
+
+ function create_fragment$9(ctx) {
+ var a, span0, t, span1;
+
+ return {
+ c() {
+ a = element("a");
+ span0 = element("span");
+ span0.innerHTML = `<i class="fas fa-sign-in-alt" aria-hidden="true"></i>`;
+ t = space();
+ span1 = element("span");
+ span1.textContent = "Login";
+ attr(span0, "class", "icon");
+ attr(a, "href", ctx.authorizeUrl);
+ attr(a, "class", "button is-dark is-rounded");
+ toggle_class(a, "is-fullwidth", ctx.fullWidth);
+ },
+
+ m(target, anchor) {
+ insert(target, a, anchor);
+ append(a, span0);
+ append(a, t);
+ append(a, span1);
+ },
+
+ p(changed, ctx) {
+ if (changed.authorizeUrl) {
+ attr(a, "href", ctx.authorizeUrl);
+ }
+
+ if (changed.fullWidth) {
+ toggle_class(a, "is-fullwidth", ctx.fullWidth);
+ }
+ },
+
+ i: noop,
+ o: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(a);
+ }
+ }
+ };
+ }
+
+ function instance$9($$self, $$props, $$invalidate) {
+ let { authOptions, fullWidth } = $$props;
+
+ $$self.$set = $$props => {
+ if ('authOptions' in $$props) $$invalidate('authOptions', authOptions = $$props.authOptions);
+ if ('fullWidth' in $$props) $$invalidate('fullWidth', fullWidth = $$props.fullWidth);
+ };
+
+ let authorizeParams, authorizeUrl;
+
+ $$self.$$.update = ($$dirty = { authOptions: 1, authorizeParams: 1 }) => {
+ if ($$dirty.authOptions) { $$invalidate('authorizeParams', authorizeParams = querystringify_1.stringify(
+ {
+ client_id: authOptions.clientId,
+ redirect_uri: authOptions.callbackUrl,
+ response_type: "code",
+ scope: authOptions.scopes || ""
+ },
+ true
+ )); }
+ if ($$dirty.authOptions || $$dirty.authorizeParams) { $$invalidate('authorizeUrl', authorizeUrl = `${authOptions.authorizeUrl}${authorizeParams}`); }
+ };
+
+ return { authOptions, fullWidth, authorizeUrl };
+ }
+
+ class LoginButton extends SvelteComponent {
+ constructor(options) {
+ super();
+ init(this, options, instance$9, create_fragment$9, safe_not_equal, ["authOptions", "fullWidth"]);
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/components/LogoutButton.svelte generated by Svelte v3.12.1 */
+
+ function create_fragment$a(ctx) {
+ var a, dispose;
+
+ return {
+ c() {
+ a = element("a");
+ a.innerHTML = `<span class="icon has-text-grey"><i class="fas fa-sign-out-alt" aria-hidden="true"></i></span> <span>Logout</span>`;
+ attr(a, "href", "javascript:void(0)");
+ attr(a, "class", "button is-light");
+ dispose = listen(a, "click", ctx.handleClick);
+ },
+
+ m(target, anchor) {
+ insert(target, a, anchor);
+ },
+
+ p: noop,
+ i: noop,
+ o: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(a);
+ }
+
+ dispose();
+ }
+ };
+ }
+
+ function instance$a($$self, $$props, $$invalidate) {
+ let $env;
+
+ component_subscribe($$self, env, $$value => { $env = $$value; $$invalidate('$env', $env); });
+
+
+
+ function handleClick() {
+ auth.remove($env);
+ removeToken($env);
+ removeRefreshToken($env);
+ }
+
+ return { handleClick };
+ }
+
+ class LogoutButton extends SvelteComponent {
+ constructor(options) {
+ super();
+ init(this, options, instance$a, create_fragment$a, safe_not_equal, []);
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/panels/SelectorPanel.svelte generated by Svelte v3.12.1 */
+
+ function add_css$3() {
+ var style = element("style");
+ style.id = 'svelte-cjzzpf-style';
+ style.textContent = ".icon-info.svelte-cjzzpf{cursor:pointer}.content.svelte-cjzzpf{padding:1rem 1.5rem}";
+ append(document.head, style);
+ }
+
+ function get_each_context$4(ctx, list, i) {
+ const child_ctx = Object.create(ctx);
+ child_ctx.envName = list[i];
+ return child_ctx;
+ }
+
+ // (44:0) {#if isAuth(environment, 'oauth2')}
+ function create_if_block_1$6(ctx) {
+ var show_if, current_block_type_index, if_block, if_block_anchor, current;
+
+ var if_block_creators = [
+ create_if_block_2$2,
+ create_if_block_3,
+ create_else_block_1
+ ];
+
+ var if_blocks = [];
+
+ function select_block_type(changed, ctx) {
+ if (ctx.authenticating) return 0;
+ if ((show_if == null) || changed.$auth || changed.$env) show_if = !!(ctx.$auth.includes(ctx.$env));
+ if (show_if) return 1;
+ return 2;
+ }
+
+ current_block_type_index = select_block_type(null, ctx);
+ if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
+
+ return {
+ c() {
+ if_block.c();
+ if_block_anchor = empty();
+ },
+
+ m(target, anchor) {
+ if_blocks[current_block_type_index].m(target, anchor);
+ insert(target, if_block_anchor, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ var previous_block_index = current_block_type_index;
+ current_block_type_index = select_block_type(changed, ctx);
+ if (current_block_type_index === previous_block_index) {
+ if_blocks[current_block_type_index].p(changed, ctx);
+ } else {
+ group_outros();
+ transition_out(if_blocks[previous_block_index], 1, 1, () => {
+ if_blocks[previous_block_index] = null;
+ });
+ check_outros();
+
+ if_block = if_blocks[current_block_type_index];
+ if (!if_block) {
+ if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
+ if_block.c();
+ }
+ transition_in(if_block, 1);
+ if_block.m(if_block_anchor.parentNode, if_block_anchor);
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(if_block);
+ current = true;
+ },
+
+ o(local) {
+ transition_out(if_block);
+ current = false;
+ },
+
+ d(detaching) {
+ if_blocks[current_block_type_index].d(detaching);
+
+ if (detaching) {
+ detach(if_block_anchor);
+ }
+ }
+ };
+ }
+
+ // (59:2) {:else}
+ function create_else_block_1(ctx) {
+ var div1, div0, p, current;
+
+ var loginbutton = new LoginButton({ props: { authOptions: ctx.environment.auth.options } });
+
+ return {
+ c() {
+ div1 = element("div");
+ div0 = element("div");
+ p = element("p");
+ loginbutton.$$.fragment.c();
+ attr(p, "class", "control");
+ attr(div0, "class", "field is-grouped");
+ attr(div1, "class", "navbar-item");
+ },
+
+ m(target, anchor) {
+ insert(target, div1, anchor);
+ append(div1, div0);
+ append(div0, p);
+ mount_component(loginbutton, p, null);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ var loginbutton_changes = {};
+ if (changed.environment) loginbutton_changes.authOptions = ctx.environment.auth.options;
+ loginbutton.$set(loginbutton_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(loginbutton.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(loginbutton.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(div1);
+ }
+
+ destroy_component(loginbutton);
+ }
+ };
+ }
+
+ // (51:33)
+ function create_if_block_3(ctx) {
+ var div1, div0, p, current;
+
+ var logoutbutton = new LogoutButton({});
+
+ return {
+ c() {
+ div1 = element("div");
+ div0 = element("div");
+ p = element("p");
+ logoutbutton.$$.fragment.c();
+ attr(p, "class", "control");
+ attr(div0, "class", "field is-grouped");
+ attr(div1, "class", "navbar-item");
+ },
+
+ m(target, anchor) {
+ insert(target, div1, anchor);
+ append(div1, div0);
+ append(div0, p);
+ mount_component(logoutbutton, p, null);
+ current = true;
+ },
+
+ p: noop,
+
+ i(local) {
+ if (current) return;
+ transition_in(logoutbutton.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(logoutbutton.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(div1);
+ }
+
+ destroy_component(logoutbutton);
+ }
+ };
+ }
+
+ // (45:2) {#if authenticating}
+ function create_if_block_2$2(ctx) {
+ var div;
+
+ return {
+ c() {
+ div = element("div");
+ div.innerHTML = `<span class="icon is-medium has-text-danger"><i class="fas fa-2x fa-spinner fa-pulse"></i></span>`;
+ attr(div, "class", "navbar-item");
+ },
+
+ m(target, anchor) {
+ insert(target, div, anchor);
+ },
+
+ p: noop,
+ i: noop,
+ o: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ }
+ };
+ }
+
+ // (76:4) {#each Object.keys(environments) as envName}
+ function create_each_block$4(ctx) {
+ var a, t0_value = ctx.envName + "", t0, t1, a_data_name_value, dispose;
+
+ return {
+ c() {
+ a = element("a");
+ t0 = text(t0_value);
+ t1 = space();
+ attr(a, "data-name", a_data_name_value = ctx.envName);
+ attr(a, "href", "javascript:void(0)");
+ attr(a, "class", "navbar-item");
+ dispose = listen(a, "click", ctx.handleClick);
+ },
+
+ m(target, anchor) {
+ insert(target, a, anchor);
+ append(a, t0);
+ append(a, t1);
+ },
+
+ p(changed, ctx) {
+ if ((changed.environments) && t0_value !== (t0_value = ctx.envName + "")) {
+ set_data(t0, t0_value);
+ }
+
+ if ((changed.environments) && a_data_name_value !== (a_data_name_value = ctx.envName)) {
+ attr(a, "data-name", a_data_name_value);
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(a);
+ }
+
+ dispose();
+ }
+ };
+ }
+
+ // (102:8) {:else}
+ function create_else_block$1(ctx) {
+ var span;
+
+ return {
+ c() {
+ span = element("span");
+ span.textContent = "None";
+ attr(span, "class", "is-capitalized");
+ },
+
+ m(target, anchor) {
+ insert(target, span, anchor);
+ },
+
+ p: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(span);
+ }
+ }
+ };
+ }
+
+ // (100:8) {#if environment.auth}
+ function create_if_block$9(ctx) {
+ var span, t_value = ctx.environment.auth.name + "", t;
+
+ return {
+ c() {
+ span = element("span");
+ t = text(t_value);
+ attr(span, "class", "is-capitalized");
+ },
+
+ m(target, anchor) {
+ insert(target, span, anchor);
+ append(span, t);
+ },
+
+ p(changed, ctx) {
+ if ((changed.environment) && t_value !== (t_value = ctx.environment.auth.name + "")) {
+ set_data(t, t_value);
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(span);
+ }
+ }
+ };
+ }
+
+ function create_fragment$b(ctx) {
+ var show_if = isAuth(ctx.environment, 'oauth2'), t0, div1, a0, t1, t2, div0, t3, div4, a1, t4, div3, div2, p0, t5, t6_value = ctx.environment.url + "", t6, t7, p1, t8, current, dispose;
+
+ var if_block0 = (show_if) && create_if_block_1$6(ctx);
+
+ let each_value = Object.keys(ctx.environments);
+
+ let each_blocks = [];
+
+ for (let i_1 = 0; i_1 < each_value.length; i_1 += 1) {
+ each_blocks[i_1] = create_each_block$4(get_each_context$4(ctx, each_value, i_1));
+ }
+
+ function select_block_type_1(changed, ctx) {
+ if (ctx.environment.auth) return create_if_block$9;
+ return create_else_block$1;
+ }
+
+ var current_block_type = select_block_type_1(null, ctx);
+ var if_block1 = current_block_type(ctx);
+
+ return {
+ c() {
+ if (if_block0) if_block0.c();
+ t0 = space();
+ div1 = element("div");
+ a0 = element("a");
+ t1 = text(ctx.$env);
+ t2 = space();
+ div0 = element("div");
+
+ for (let i_1 = 0; i_1 < each_blocks.length; i_1 += 1) {
+ each_blocks[i_1].c();
+ }
+
+ t3 = space();
+ div4 = element("div");
+ a1 = element("a");
+ a1.innerHTML = `<span class="icon icon-info is-medium has-text-grey-light svelte-cjzzpf"><i class="fas fa-lg fa-info-circle"></i></span>`;
+ t4 = space();
+ div3 = element("div");
+ div2 = element("div");
+ p0 = element("p");
+ t5 = text("BaseURL: ");
+ t6 = text(t6_value);
+ t7 = space();
+ p1 = element("p");
+ t8 = text("Auth:\n ");
+ if_block1.c();
+ attr(a0, "href", "javascript:void(0)");
+ attr(a0, "class", "navbar-link");
+ attr(div0, "class", "navbar-dropdown is-right");
+ attr(div1, "class", "navbar-item has-dropdown is-capitalized");
+ toggle_class(div1, "is-active", ctx.show);
+ attr(a1, "href", "javascript:void(0)");
+ attr(a1, "class", "navbar-link is-arrowless");
+ attr(div2, "class", "content svelte-cjzzpf");
+ attr(div3, "class", "navbar-dropdown is-right");
+ attr(div4, "class", "navbar-item has-dropdown is-hoverable");
+ dispose = listen(a0, "click", ctx.toggleClick);
+ },
+
+ m(target, anchor) {
+ if (if_block0) if_block0.m(target, anchor);
+ insert(target, t0, anchor);
+ insert(target, div1, anchor);
+ append(div1, a0);
+ append(a0, t1);
+ append(div1, t2);
+ append(div1, div0);
+
+ for (let i_1 = 0; i_1 < each_blocks.length; i_1 += 1) {
+ each_blocks[i_1].m(div0, null);
+ }
+
+ insert(target, t3, anchor);
+ insert(target, div4, anchor);
+ append(div4, a1);
+ append(div4, t4);
+ append(div4, div3);
+ append(div3, div2);
+ append(div2, p0);
+ append(p0, t5);
+ append(p0, t6);
+ append(div2, t7);
+ append(div2, p1);
+ append(p1, t8);
+ if_block1.m(p1, null);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if (changed.environment) show_if = isAuth(ctx.environment, 'oauth2');
+
+ if (show_if) {
+ if (if_block0) {
+ if_block0.p(changed, ctx);
+ transition_in(if_block0, 1);
+ } else {
+ if_block0 = create_if_block_1$6(ctx);
+ if_block0.c();
+ transition_in(if_block0, 1);
+ if_block0.m(t0.parentNode, t0);
+ }
+ } else if (if_block0) {
+ group_outros();
+ transition_out(if_block0, 1, 1, () => {
+ if_block0 = null;
+ });
+ check_outros();
+ }
+
+ if (!current || changed.$env) {
+ set_data(t1, ctx.$env);
+ }
+
+ if (changed.environments) {
+ each_value = Object.keys(ctx.environments);
+
+ let i_1;
+ for (i_1 = 0; i_1 < each_value.length; i_1 += 1) {
+ const child_ctx = get_each_context$4(ctx, each_value, i_1);
+
+ if (each_blocks[i_1]) {
+ each_blocks[i_1].p(changed, child_ctx);
+ } else {
+ each_blocks[i_1] = create_each_block$4(child_ctx);
+ each_blocks[i_1].c();
+ each_blocks[i_1].m(div0, null);
+ }
+ }
+
+ for (; i_1 < each_blocks.length; i_1 += 1) {
+ each_blocks[i_1].d(1);
+ }
+ each_blocks.length = each_value.length;
+ }
+
+ if (changed.show) {
+ toggle_class(div1, "is-active", ctx.show);
+ }
+
+ if ((!current || changed.environment) && t6_value !== (t6_value = ctx.environment.url + "")) {
+ set_data(t6, t6_value);
+ }
+
+ if (current_block_type === (current_block_type = select_block_type_1(changed, ctx)) && if_block1) {
+ if_block1.p(changed, ctx);
+ } else {
+ if_block1.d(1);
+ if_block1 = current_block_type(ctx);
+ if (if_block1) {
+ if_block1.c();
+ if_block1.m(p1, null);
+ }
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(if_block0);
+ current = true;
+ },
+
+ o(local) {
+ transition_out(if_block0);
+ current = false;
+ },
+
+ d(detaching) {
+ if (if_block0) if_block0.d(detaching);
+
+ if (detaching) {
+ detach(t0);
+ detach(div1);
+ }
+
+ destroy_each(each_blocks, detaching);
+
+ if (detaching) {
+ detach(t3);
+ detach(div4);
+ }
+
+ if_block1.d();
+ dispose();
+ }
+ };
+ }
+
+ function instance$b($$self, $$props, $$invalidate) {
+ let $env, $auth;
+
+ component_subscribe($$self, env, $$value => { $env = $$value; $$invalidate('$env', $env); });
+ component_subscribe($$self, auth, $$value => { $auth = $$value; $$invalidate('$auth', $auth); });
+
+
+
+ let { environments, authenticating } = $$props;
+
+ let show = false;
+
+ function handleClick(event) {
+ $$invalidate('show', show = false);
+ const envName = event.target.dataset["name"];
+
+ env.set(envName);
+
+ const authToken = getToken($env);
+
+ if (authToken) {
+ auth.add(envName);
+ token.set(authToken);
+ }
+ }
+
+ function toggleClick() {
+ $$invalidate('show', show = !show);
+ }
+
+ $$self.$set = $$props => {
+ if ('environments' in $$props) $$invalidate('environments', environments = $$props.environments);
+ if ('authenticating' in $$props) $$invalidate('authenticating', authenticating = $$props.authenticating);
+ };
+
+ let environment;
+
+ $$self.$$.update = ($$dirty = { environments: 1, $env: 1 }) => {
+ if ($$dirty.environments || $$dirty.$env) { $$invalidate('environment', environment = environments[$env]); }
+ };
+
+ return {
+ environments,
+ authenticating,
+ show,
+ handleClick,
+ toggleClick,
+ environment,
+ $env,
+ $auth
+ };
+ }
+
+ class SelectorPanel extends SvelteComponent {
+ constructor(options) {
+ super();
+ if (!document.getElementById("svelte-cjzzpf-style")) add_css$3();
+ init(this, options, instance$b, create_fragment$b, safe_not_equal, ["environments", "authenticating"]);
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/components/ToggleIcon.svelte generated by Svelte v3.12.1 */
+
+ function add_css$4() {
+ var style = element("style");
+ style.id = 'svelte-o7a14x-style';
+ style.textContent = ".toggle-icon.svelte-o7a14x{cursor:pointer}";
+ append(document.head, style);
+ }
+
+ function create_fragment$c(ctx) {
+ var span, i, span_class_value, dispose;
+
+ return {
+ c() {
+ span = element("span");
+ i = element("i");
+ attr(i, "class", "fas");
+ toggle_class(i, "fa-chevron-up", !ctx.show);
+ toggle_class(i, "fa-chevron-down", ctx.show);
+ attr(span, "class", span_class_value = "toggle-icon icon " + ctx.additionalClass + " svelte-o7a14x");
+ toggle_class(span, "has-text-grey", !ctx.dark);
+ dispose = listen(span, "click", ctx.toggle);
+ },
+
+ m(target, anchor) {
+ insert(target, span, anchor);
+ append(span, i);
+ },
+
+ p(changed, ctx) {
+ if (changed.show) {
+ toggle_class(i, "fa-chevron-up", !ctx.show);
+ toggle_class(i, "fa-chevron-down", ctx.show);
+ }
+
+ if ((changed.additionalClass) && span_class_value !== (span_class_value = "toggle-icon icon " + ctx.additionalClass + " svelte-o7a14x")) {
+ attr(span, "class", span_class_value);
+ }
+
+ if ((changed.additionalClass || changed.dark)) {
+ toggle_class(span, "has-text-grey", !ctx.dark);
+ }
+ },
+
+ i: noop,
+ o: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(span);
+ }
+
+ dispose();
+ }
+ };
+ }
+
+ function instance$c($$self, $$props, $$invalidate) {
+ let { dark = false, show = false, additionalClass = "", handleClick } = $$props;
+
+ function toggle(event) {
+ $$invalidate('show', show = !show);
+ handleClick(event);
+ }
+
+ $$self.$set = $$props => {
+ if ('dark' in $$props) $$invalidate('dark', dark = $$props.dark);
+ if ('show' in $$props) $$invalidate('show', show = $$props.show);
+ if ('additionalClass' in $$props) $$invalidate('additionalClass', additionalClass = $$props.additionalClass);
+ if ('handleClick' in $$props) $$invalidate('handleClick', handleClick = $$props.handleClick);
+ };
+
+ return {
+ dark,
+ show,
+ additionalClass,
+ handleClick,
+ toggle
+ };
+ }
+
+ class ToggleIcon extends SvelteComponent {
+ constructor(options) {
+ super();
+ if (!document.getElementById("svelte-o7a14x-style")) add_css$4();
+ init(this, options, instance$c, create_fragment$c, safe_not_equal, ["dark", "show", "additionalClass", "handleClick"]);
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/panels/CollapsiblePanel.svelte generated by Svelte v3.12.1 */
+
+ function add_css$5() {
+ var style = element("style");
+ style.id = 'svelte-ymjevm-style';
+ style.textContent = ".panel-section.svelte-ymjevm{padding:1em;border:1px solid #dbdbdb;border-top:none}.panel-button.svelte-ymjevm{border-radius:4px}.panel-dark.svelte-ymjevm{border:1px solid #363636}";
+ append(document.head, style);
+ }
+
+ const get_body_slot_changes = () => ({});
+ const get_body_slot_context = () => ({});
+
+ const get_heading_slot_changes = () => ({});
+ const get_heading_slot_context = () => ({});
+
+ function create_fragment$d(ctx) {
+ var div2, div0, t0, t1, div1, current;
+
+ const heading_slot_template = ctx.$$slots.heading;
+ const heading_slot = create_slot(heading_slot_template, ctx, get_heading_slot_context);
+
+ var toggleicon = new ToggleIcon({
+ props: {
+ dark: ctx.dark,
+ show: ctx.show,
+ additionalClass: "is-pulled-right",
+ handleClick: ctx.func
+ }
+ });
+
+ const body_slot_template = ctx.$$slots.body;
+ const body_slot = create_slot(body_slot_template, ctx, get_body_slot_context);
+
+ return {
+ c() {
+ div2 = element("div");
+ div0 = element("div");
+
+ if (heading_slot) heading_slot.c();
+ t0 = space();
+ toggleicon.$$.fragment.c();
+ t1 = space();
+ div1 = element("div");
+
+ if (body_slot) body_slot.c();
+
+ attr(div0, "class", "panel-heading svelte-ymjevm");
+ toggle_class(div0, "has-background-dark", ctx.dark);
+ toggle_class(div0, "has-text-white", ctx.dark);
+ toggle_class(div0, "panel-dark", ctx.dark);
+ toggle_class(div0, "panel-button", !ctx.show);
+
+ attr(div1, "class", "panel-section has-background-white svelte-ymjevm");
+ toggle_class(div1, "is-hidden", !ctx.show);
+ attr(div2, "class", "panel");
+ },
+
+ l(nodes) {
+ if (heading_slot) heading_slot.l(div0_nodes);
+
+ if (body_slot) body_slot.l(div1_nodes);
+ },
+
+ m(target, anchor) {
+ insert(target, div2, anchor);
+ append(div2, div0);
+
+ if (heading_slot) {
+ heading_slot.m(div0, null);
+ }
+
+ append(div0, t0);
+ mount_component(toggleicon, div0, null);
+ append(div2, t1);
+ append(div2, div1);
+
+ if (body_slot) {
+ body_slot.m(div1, null);
+ }
+
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if (heading_slot && heading_slot.p && changed.$$scope) {
+ heading_slot.p(
+ get_slot_changes(heading_slot_template, ctx, changed, get_heading_slot_changes),
+ get_slot_context(heading_slot_template, ctx, get_heading_slot_context)
+ );
+ }
+
+ var toggleicon_changes = {};
+ if (changed.dark) toggleicon_changes.dark = ctx.dark;
+ if (changed.show) toggleicon_changes.show = ctx.show;
+ if (changed.show) toggleicon_changes.handleClick = ctx.func;
+ toggleicon.$set(toggleicon_changes);
+
+ if (changed.dark) {
+ toggle_class(div0, "has-background-dark", ctx.dark);
+ toggle_class(div0, "has-text-white", ctx.dark);
+ toggle_class(div0, "panel-dark", ctx.dark);
+ }
+
+ if (changed.show) {
+ toggle_class(div0, "panel-button", !ctx.show);
+ }
+
+ if (body_slot && body_slot.p && changed.$$scope) {
+ body_slot.p(
+ get_slot_changes(body_slot_template, ctx, changed, get_body_slot_changes),
+ get_slot_context(body_slot_template, ctx, get_body_slot_context)
+ );
+ }
+
+ if (changed.show) {
+ toggle_class(div1, "is-hidden", !ctx.show);
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(heading_slot, local);
+
+ transition_in(toggleicon.$$.fragment, local);
+
+ transition_in(body_slot, local);
+ current = true;
+ },
+
+ o(local) {
+ transition_out(heading_slot, local);
+ transition_out(toggleicon.$$.fragment, local);
+ transition_out(body_slot, local);
+ current = false;
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(div2);
+ }
+
+ if (heading_slot) heading_slot.d(detaching);
+
+ destroy_component(toggleicon);
+
+ if (body_slot) body_slot.d(detaching);
+ }
+ };
+ }
+
+ function instance$d($$self, $$props, $$invalidate) {
+ let { dark = false, show = false } = $$props;
+
+ let { $$slots = {}, $$scope } = $$props;
+
+ const func = () => ($$invalidate('show', show = !show));
+
+ $$self.$set = $$props => {
+ if ('dark' in $$props) $$invalidate('dark', dark = $$props.dark);
+ if ('show' in $$props) $$invalidate('show', show = $$props.show);
+ if ('$$scope' in $$props) $$invalidate('$$scope', $$scope = $$props.$$scope);
+ };
+
+ return { dark, show, func, $$slots, $$scope };
+ }
+
+ class CollapsiblePanel extends SvelteComponent {
+ constructor(options) {
+ super();
+ if (!document.getElementById("svelte-ymjevm-style")) add_css$5();
+ init(this, options, instance$d, create_fragment$d, safe_not_equal, ["dark", "show"]);
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/components/FieldDisabled.svelte generated by Svelte v3.12.1 */
+
+ function add_css$6() {
+ var style = element("style");
+ style.id = 'svelte-a7ak6u-style';
+ style.textContent = ".control-switch.svelte-a7ak6u{padding-top:0.4rem}.has-border.svelte-a7ak6u{border-color:#dbdbdb}";
+ append(document.head, style);
+ }
+
+ function create_fragment$e(ctx) {
+ var div, p0, input0, input0_id_value, t0, label, label_for_value, t1, p1, input1, t2, p2, input2;
+
+ return {
+ c() {
+ div = element("div");
+ p0 = element("p");
+ input0 = element("input");
+ t0 = space();
+ label = element("label");
+ t1 = space();
+ p1 = element("p");
+ input1 = element("input");
+ t2 = space();
+ p2 = element("p");
+ input2 = element("input");
+ attr(input0, "class", "switch is-rounded is-success");
+ attr(input0, "id", input0_id_value = "h-" + ctx.name);
+ attr(input0, "type", "checkbox");
+ input0.checked = true;
+ input0.disabled = true;
+ attr(label, "for", label_for_value = "h-" + ctx.name);
+ attr(p0, "class", "control control-switch svelte-a7ak6u");
+ attr(input1, "class", "input is-rounded has-border svelte-a7ak6u");
+ attr(input1, "type", "text");
+ attr(input1, "placeholder", ctx.placeholder);
+ input1.disabled = true;
+ attr(p1, "class", "control");
+ attr(input2, "class", "input is-rounded has-border is-family-code svelte-a7ak6u");
+ attr(input2, "type", "text");
+ input2.value = ctx.value;
+ input2.disabled = true;
+ attr(p2, "class", "control is-expanded");
+ attr(div, "class", "field has-addons");
+ },
+
+ m(target, anchor) {
+ insert(target, div, anchor);
+ append(div, p0);
+ append(p0, input0);
+ append(p0, t0);
+ append(p0, label);
+ append(div, t1);
+ append(div, p1);
+ append(p1, input1);
+ append(div, t2);
+ append(div, p2);
+ append(p2, input2);
+ },
+
+ p(changed, ctx) {
+ if ((changed.name) && input0_id_value !== (input0_id_value = "h-" + ctx.name)) {
+ attr(input0, "id", input0_id_value);
+ }
+
+ if ((changed.name) && label_for_value !== (label_for_value = "h-" + ctx.name)) {
+ attr(label, "for", label_for_value);
+ }
+
+ if (changed.placeholder) {
+ attr(input1, "placeholder", ctx.placeholder);
+ }
+
+ if (changed.value) {
+ input2.value = ctx.value;
+ }
+ },
+
+ i: noop,
+ o: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ }
+ };
+ }
+
+ function instance$e($$self, $$props, $$invalidate) {
+ let { name, placeholder, value } = $$props;
+
+ $$self.$set = $$props => {
+ if ('name' in $$props) $$invalidate('name', name = $$props.name);
+ if ('placeholder' in $$props) $$invalidate('placeholder', placeholder = $$props.placeholder);
+ if ('value' in $$props) $$invalidate('value', value = $$props.value);
+ };
+
+ return { name, placeholder, value };
+ }
+
+ class FieldDisabled extends SvelteComponent {
+ constructor(options) {
+ super();
+ if (!document.getElementById("svelte-a7ak6u-style")) add_css$6();
+ init(this, options, instance$e, create_fragment$e, safe_not_equal, ["name", "placeholder", "value"]);
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/components/FieldSwitch.svelte generated by Svelte v3.12.1 */
+
+ function add_css$7() {
+ var style = element("style");
+ style.id = 'svelte-a7ak6u-style';
+ style.textContent = ".control-switch.svelte-a7ak6u{padding-top:0.4rem}.has-border.svelte-a7ak6u{border-color:#dbdbdb}";
+ append(document.head, style);
+ }
+
+ function create_fragment$f(ctx) {
+ var div, p0, input0, input0_id_value, t0, label, label_for_value, t1, p1, input1, t2, p2, input2, dispose;
+
+ return {
+ c() {
+ div = element("div");
+ p0 = element("p");
+ input0 = element("input");
+ t0 = space();
+ label = element("label");
+ t1 = space();
+ p1 = element("p");
+ input1 = element("input");
+ t2 = space();
+ p2 = element("p");
+ input2 = element("input");
+ attr(input0, "class", "switch is-rounded is-success");
+ attr(input0, "id", input0_id_value = "p-" + ctx.name);
+ attr(input0, "type", "checkbox");
+ input0.disabled = ctx.required;
+ attr(label, "for", label_for_value = "p-" + ctx.name);
+ attr(p0, "class", "control control-switch svelte-a7ak6u");
+ attr(input1, "class", "input is-rounded has-border svelte-a7ak6u");
+ attr(input1, "type", "text");
+ attr(input1, "placeholder", ctx.name);
+ input1.disabled = true;
+ attr(p1, "class", "control");
+ attr(input2, "class", "input has-border is-family-code svelte-a7ak6u");
+ attr(input2, "type", "text");
+ toggle_class(input2, "is-rounded", ctx.rounded);
+ attr(p2, "class", "control is-expanded");
+ attr(div, "class", "field has-addons");
+
+ dispose = [
+ listen(input0, "change", ctx.input0_change_handler),
+ listen(input2, "input", ctx.input2_input_handler)
+ ];
+ },
+
+ m(target, anchor) {
+ insert(target, div, anchor);
+ append(div, p0);
+ append(p0, input0);
+
+ input0.checked = ctx.used;
+
+ append(p0, t0);
+ append(p0, label);
+ append(div, t1);
+ append(div, p1);
+ append(p1, input1);
+ append(div, t2);
+ append(div, p2);
+ append(p2, input2);
+
+ set_input_value(input2, ctx.value);
+ },
+
+ p(changed, ctx) {
+ if (changed.used) input0.checked = ctx.used;
+
+ if ((changed.name) && input0_id_value !== (input0_id_value = "p-" + ctx.name)) {
+ attr(input0, "id", input0_id_value);
+ }
+
+ if (changed.required) {
+ input0.disabled = ctx.required;
+ }
+
+ if ((changed.name) && label_for_value !== (label_for_value = "p-" + ctx.name)) {
+ attr(label, "for", label_for_value);
+ }
+
+ if (changed.name) {
+ attr(input1, "placeholder", ctx.name);
+ }
+
+ if (changed.value && (input2.value !== ctx.value)) set_input_value(input2, ctx.value);
+
+ if (changed.rounded) {
+ toggle_class(input2, "is-rounded", ctx.rounded);
+ }
+ },
+
+ i: noop,
+ o: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+
+ run_all(dispose);
+ }
+ };
+ }
+
+ function instance$f($$self, $$props, $$invalidate) {
+ let { used, required, name, value, rounded } = $$props;
+
+ function input0_change_handler() {
+ used = this.checked;
+ $$invalidate('used', used);
+ }
+
+ function input2_input_handler() {
+ value = this.value;
+ $$invalidate('value', value);
+ }
+
+ $$self.$set = $$props => {
+ if ('used' in $$props) $$invalidate('used', used = $$props.used);
+ if ('required' in $$props) $$invalidate('required', required = $$props.required);
+ if ('name' in $$props) $$invalidate('name', name = $$props.name);
+ if ('value' in $$props) $$invalidate('value', value = $$props.value);
+ if ('rounded' in $$props) $$invalidate('rounded', rounded = $$props.rounded);
+ };
+
+ return {
+ used,
+ required,
+ name,
+ value,
+ rounded,
+ input0_change_handler,
+ input2_input_handler
+ };
+ }
+
+ class FieldSwitch extends SvelteComponent {
+ constructor(options) {
+ super();
+ if (!document.getElementById("svelte-a7ak6u-style")) add_css$7();
+ init(this, options, instance$f, create_fragment$f, safe_not_equal, ["used", "required", "name", "value", "rounded"]);
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/panels/PlaygroundPanel.svelte generated by Svelte v3.12.1 */
+
+ function add_css$8() {
+ var style = element("style");
+ style.id = 'svelte-c3oocm-style';
+ style.textContent = ".small-section.svelte-c3oocm{padding-top:0.5rem}.button-left.svelte-c3oocm{justify-content:left}.control-switch.svelte-c3oocm{padding-top:0.4rem}.container-content.svelte-c3oocm{padding:0.5rem 1rem;border-radius:4px;margin-top:0.5rem;background-color:#2b2b2b}.content-header.svelte-c3oocm{color:#fff;border-bottom:dashed 1px #777;padding-top:0.5rem;padding-bottom:1rem}.hero-small.svelte-c3oocm{padding:1.5rem}.has-border.svelte-c3oocm{border-color:#dbdbdb}.hero-rounded.svelte-c3oocm{border-radius:4px}";
+ append(document.head, style);
+ }
+
+ function get_each_context$5(ctx, list, i) {
+ const child_ctx = Object.create(ctx);
+ child_ctx.key = list[i][0];
+ child_ctx.val = list[i][1];
+ return child_ctx;
+ }
+
+ function get_each_context_1$1(ctx, list, i) {
+ const child_ctx = Object.create(ctx);
+ child_ctx.param = list[i];
+ child_ctx.each_value_1 = list;
+ child_ctx.param_index = i;
+ return child_ctx;
+ }
+
+ function get_each_context_2$1(ctx, list, i) {
+ const child_ctx = Object.create(ctx);
+ child_ctx.header = list[i];
+ child_ctx.each_value_2 = list;
+ child_ctx.header_index = i;
+ return child_ctx;
+ }
+
+ // (125:2) <span slot="heading">
+ function create_heading_slot(ctx) {
+ var span;
+
+ return {
+ c() {
+ span = element("span");
+ span.textContent = "Playground";
+ attr(span, "slot", "heading");
+ },
+
+ m(target, anchor) {
+ insert(target, span, anchor);
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(span);
+ }
+ }
+ };
+ }
+
+ // (134:8) {:else}
+ function create_else_block_4(ctx) {
+ var a, span0, t0_value = ctx.currentAction.method + "", t0, t1, span1, t2_value = ctx.currentUrl.origin + "", t2, t3, span2, t4_value = ctx.currentUrl.pathname + "", t4, dispose;
+
+ return {
+ c() {
+ a = element("a");
+ span0 = element("span");
+ t0 = text(t0_value);
+ t1 = text("\n  \n ");
+ span1 = element("span");
+ t2 = text(t2_value);
+ t3 = space();
+ span2 = element("span");
+ t4 = text(t4_value);
+ attr(span0, "class", "is-uppercase has-text-weight-bold");
+ attr(span2, "class", "has-text-weight-bold");
+ attr(a, "href", "javascript:void(0)");
+ attr(a, "class", "button button-left is-warning is-family-code is-fullwidth svelte-c3oocm");
+ dispose = listen(a, "click", ctx.handleCopy);
+ },
+
+ m(target, anchor) {
+ insert(target, a, anchor);
+ append(a, span0);
+ append(span0, t0);
+ append(a, t1);
+ append(a, span1);
+ append(span1, t2);
+ append(a, t3);
+ append(a, span2);
+ append(span2, t4);
+ },
+
+ p(changed, ctx) {
+ if ((changed.currentAction) && t0_value !== (t0_value = ctx.currentAction.method + "")) {
+ set_data(t0, t0_value);
+ }
+
+ if ((changed.currentUrl) && t2_value !== (t2_value = ctx.currentUrl.origin + "")) {
+ set_data(t2, t2_value);
+ }
+
+ if ((changed.currentUrl) && t4_value !== (t4_value = ctx.currentUrl.pathname + "")) {
+ set_data(t4, t4_value);
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(a);
+ }
+
+ dispose();
+ }
+ };
+ }
+
+ // (129:8) {#if copying}
+ function create_if_block_11(ctx) {
+ var button;
+
+ return {
+ c() {
+ button = element("button");
+ button.innerHTML = `<span>URL has been copied to clipboard.</span>`;
+ attr(button, "class", "button button-left is-warning is-family-code is-fullwidth svelte-c3oocm");
+ },
+
+ m(target, anchor) {
+ insert(target, button, anchor);
+ },
+
+ p: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(button);
+ }
+ }
+ };
+ }
+
+ // (153:8) {:else}
+ function create_else_block_3(ctx) {
+ var button, dispose;
+
+ return {
+ c() {
+ button = element("button");
+ button.innerHTML = `<span class="icon"><i class="fas fa-paper-plane"></i></span> <span>Send</span>`;
+ attr(button, "class", "button is-success is-fullwidth");
+ dispose = listen(button, "click", ctx.handleClick);
+ },
+
+ m(target, anchor) {
+ insert(target, button, anchor);
+ },
+
+ p: noop,
+ i: noop,
+ o: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(button);
+ }
+
+ dispose();
+ }
+ };
+ }
+
+ // (149:8) {#if isAuth(environment, 'oauth2') && !$auth.includes($env)}
+ function create_if_block_10(ctx) {
+ var current;
+
+ var loginbutton = new LoginButton({
+ props: {
+ authOptions: ctx.environment.auth.options,
+ fullWidth: true
+ }
+ });
+
+ return {
+ c() {
+ loginbutton.$$.fragment.c();
+ },
+
+ m(target, anchor) {
+ mount_component(loginbutton, target, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ var loginbutton_changes = {};
+ if (changed.environment) loginbutton_changes.authOptions = ctx.environment.auth.options;
+ loginbutton.$set(loginbutton_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(loginbutton.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(loginbutton.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ destroy_component(loginbutton, detaching);
+ }
+ };
+ }
+
+ // (185:6) {:else}
+ function create_else_block_2(ctx) {
+ var each_1_anchor, current;
+
+ let each_value_2 = ctx.requestHeaders;
+
+ let each_blocks = [];
+
+ for (let i = 0; i < each_value_2.length; i += 1) {
+ each_blocks[i] = create_each_block_2$1(get_each_context_2$1(ctx, each_value_2, i));
+ }
+
+ const out = i => transition_out(each_blocks[i], 1, 1, () => {
+ each_blocks[i] = null;
+ });
+
+ return {
+ c() {
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].c();
+ }
+
+ each_1_anchor = empty();
+ },
+
+ m(target, anchor) {
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].m(target, anchor);
+ }
+
+ insert(target, each_1_anchor, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if (changed.requestHeaders) {
+ each_value_2 = ctx.requestHeaders;
+
+ let i;
+ for (i = 0; i < each_value_2.length; i += 1) {
+ const child_ctx = get_each_context_2$1(ctx, each_value_2, i);
+
+ if (each_blocks[i]) {
+ each_blocks[i].p(changed, child_ctx);
+ transition_in(each_blocks[i], 1);
+ } else {
+ each_blocks[i] = create_each_block_2$1(child_ctx);
+ each_blocks[i].c();
+ transition_in(each_blocks[i], 1);
+ each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor);
+ }
+ }
+
+ group_outros();
+ for (i = each_value_2.length; i < each_blocks.length; i += 1) {
+ out(i);
+ }
+ check_outros();
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ for (let i = 0; i < each_value_2.length; i += 1) {
+ transition_in(each_blocks[i]);
+ }
+
+ current = true;
+ },
+
+ o(local) {
+ each_blocks = each_blocks.filter(Boolean);
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ transition_out(each_blocks[i]);
+ }
+
+ current = false;
+ },
+
+ d(detaching) {
+ destroy_each(each_blocks, detaching);
+
+ if (detaching) {
+ detach(each_1_anchor);
+ }
+ }
+ };
+ }
+
+ // (181:6) {#if requestHeaders.length === 0 && !environment.auth}
+ function create_if_block_9(ctx) {
+ var p;
+
+ return {
+ c() {
+ p = element("p");
+ p.innerHTML = `<em>No configurable headers.</em>`;
+ },
+
+ m(target, anchor) {
+ insert(target, p, anchor);
+ },
+
+ p: noop,
+ i: noop,
+ o: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(p);
+ }
+ }
+ };
+ }
+
+ // (186:8) {#each requestHeaders as header}
+ function create_each_block_2$1(ctx) {
+ var updating_used, updating_value, current;
+
+ function fieldswitch_used_binding(value) {
+ ctx.fieldswitch_used_binding.call(null, value, ctx);
+ updating_used = true;
+ add_flush_callback(() => updating_used = false);
+ }
+
+ function fieldswitch_value_binding(value_1) {
+ ctx.fieldswitch_value_binding.call(null, value_1, ctx);
+ updating_value = true;
+ add_flush_callback(() => updating_value = false);
+ }
+
+ let fieldswitch_props = {
+ name: ctx.header.name,
+ required: ctx.header.required,
+ rounded: true
+ };
+ if (ctx.header.used !== void 0) {
+ fieldswitch_props.used = ctx.header.used;
+ }
+ if (ctx.header.value !== void 0) {
+ fieldswitch_props.value = ctx.header.value;
+ }
+ var fieldswitch = new FieldSwitch({ props: fieldswitch_props });
+
+ binding_callbacks.push(() => bind(fieldswitch, 'used', fieldswitch_used_binding));
+ binding_callbacks.push(() => bind(fieldswitch, 'value', fieldswitch_value_binding));
+
+ return {
+ c() {
+ fieldswitch.$$.fragment.c();
+ },
+
+ m(target, anchor) {
+ mount_component(fieldswitch, target, anchor);
+ current = true;
+ },
+
+ p(changed, new_ctx) {
+ ctx = new_ctx;
+ var fieldswitch_changes = {};
+ if (changed.requestHeaders) fieldswitch_changes.name = ctx.header.name;
+ if (changed.requestHeaders) fieldswitch_changes.required = ctx.header.required;
+ if (!updating_used && changed.requestHeaders) {
+ fieldswitch_changes.used = ctx.header.used;
+ }
+ if (!updating_value && changed.requestHeaders) {
+ fieldswitch_changes.value = ctx.header.value;
+ }
+ fieldswitch.$set(fieldswitch_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(fieldswitch.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(fieldswitch.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ destroy_component(fieldswitch, detaching);
+ }
+ };
+ }
+
+ // (196:6) {#if isAuth(environment, 'basic')}
+ function create_if_block_8(ctx) {
+ var current;
+
+ var fielddisabled = new FieldDisabled({
+ props: {
+ name: "authorization",
+ placeholder: "Authorization",
+ value: "Basic " + basicAuth(ctx.environment.auth.options.username, ctx.environment.auth.options.password)
+ }
+ });
+
+ return {
+ c() {
+ fielddisabled.$$.fragment.c();
+ },
+
+ m(target, anchor) {
+ mount_component(fielddisabled, target, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ var fielddisabled_changes = {};
+ if (changed.environment) fielddisabled_changes.value = "Basic " + basicAuth(ctx.environment.auth.options.username, ctx.environment.auth.options.password);
+ fielddisabled.$set(fielddisabled_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(fielddisabled.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(fielddisabled.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ destroy_component(fielddisabled, detaching);
+ }
+ };
+ }
+
+ // (203:6) {#if isAuth(environment, 'apikey')}
+ function create_if_block_7(ctx) {
+ var current;
+
+ var fielddisabled = new FieldDisabled({
+ props: {
+ name: "authorization",
+ placeholder: ctx.environment.auth.options.header,
+ value: ctx.environment.auth.options.key
+ }
+ });
+
+ return {
+ c() {
+ fielddisabled.$$.fragment.c();
+ },
+
+ m(target, anchor) {
+ mount_component(fielddisabled, target, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ var fielddisabled_changes = {};
+ if (changed.environment) fielddisabled_changes.placeholder = ctx.environment.auth.options.header;
+ if (changed.environment) fielddisabled_changes.value = ctx.environment.auth.options.key;
+ fielddisabled.$set(fielddisabled_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(fielddisabled.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(fielddisabled.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ destroy_component(fielddisabled, detaching);
+ }
+ };
+ }
+
+ // (210:6) {#if isAuth(environment, 'oauth2')}
+ function create_if_block_5(ctx) {
+ var show_if = ctx.$auth.includes(ctx.$env), if_block_anchor, current;
+
+ var if_block = (show_if) && create_if_block_6(ctx);
+
+ return {
+ c() {
+ if (if_block) if_block.c();
+ if_block_anchor = empty();
+ },
+
+ m(target, anchor) {
+ if (if_block) if_block.m(target, anchor);
+ insert(target, if_block_anchor, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if (changed.$auth || changed.$env) show_if = ctx.$auth.includes(ctx.$env);
+
+ if (show_if) {
+ if (if_block) {
+ if_block.p(changed, ctx);
+ transition_in(if_block, 1);
+ } else {
+ if_block = create_if_block_6(ctx);
+ if_block.c();
+ transition_in(if_block, 1);
+ if_block.m(if_block_anchor.parentNode, if_block_anchor);
+ }
+ } else if (if_block) {
+ group_outros();
+ transition_out(if_block, 1, 1, () => {
+ if_block = null;
+ });
+ check_outros();
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(if_block);
+ current = true;
+ },
+
+ o(local) {
+ transition_out(if_block);
+ current = false;
+ },
+
+ d(detaching) {
+ if (if_block) if_block.d(detaching);
+
+ if (detaching) {
+ detach(if_block_anchor);
+ }
+ }
+ };
+ }
+
+ // (211:8) {#if $auth.includes($env)}
+ function create_if_block_6(ctx) {
+ var current;
+
+ var fielddisabled = new FieldDisabled({
+ props: {
+ name: "authorization",
+ placeholder: "Authorization",
+ value: "Bearer " + ctx.$token
+ }
+ });
+
+ return {
+ c() {
+ fielddisabled.$$.fragment.c();
+ },
+
+ m(target, anchor) {
+ mount_component(fielddisabled, target, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ var fielddisabled_changes = {};
+ if (changed.$token) fielddisabled_changes.value = "Bearer " + ctx.$token;
+ fielddisabled.$set(fielddisabled_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(fielddisabled.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(fielddisabled.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ destroy_component(fielddisabled, detaching);
+ }
+ };
+ }
+
+ // (225:6) {:else}
+ function create_else_block_1$1(ctx) {
+ var each_1_anchor, current;
+
+ let each_value_1 = ctx.requestParameters;
+
+ let each_blocks = [];
+
+ for (let i = 0; i < each_value_1.length; i += 1) {
+ each_blocks[i] = create_each_block_1$1(get_each_context_1$1(ctx, each_value_1, i));
+ }
+
+ const out = i => transition_out(each_blocks[i], 1, 1, () => {
+ each_blocks[i] = null;
+ });
+
+ return {
+ c() {
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].c();
+ }
+
+ each_1_anchor = empty();
+ },
+
+ m(target, anchor) {
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].m(target, anchor);
+ }
+
+ insert(target, each_1_anchor, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if (changed.requestParameters) {
+ each_value_1 = ctx.requestParameters;
+
+ let i;
+ for (i = 0; i < each_value_1.length; i += 1) {
+ const child_ctx = get_each_context_1$1(ctx, each_value_1, i);
+
+ if (each_blocks[i]) {
+ each_blocks[i].p(changed, child_ctx);
+ transition_in(each_blocks[i], 1);
+ } else {
+ each_blocks[i] = create_each_block_1$1(child_ctx);
+ each_blocks[i].c();
+ transition_in(each_blocks[i], 1);
+ each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor);
+ }
+ }
+
+ group_outros();
+ for (i = each_value_1.length; i < each_blocks.length; i += 1) {
+ out(i);
+ }
+ check_outros();
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ for (let i = 0; i < each_value_1.length; i += 1) {
+ transition_in(each_blocks[i]);
+ }
+
+ current = true;
+ },
+
+ o(local) {
+ each_blocks = each_blocks.filter(Boolean);
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ transition_out(each_blocks[i]);
+ }
+
+ current = false;
+ },
+
+ d(detaching) {
+ destroy_each(each_blocks, detaching);
+
+ if (detaching) {
+ detach(each_1_anchor);
+ }
+ }
+ };
+ }
+
+ // (221:6) {#if requestParameters.length === 0}
+ function create_if_block_4(ctx) {
+ var p;
+
+ return {
+ c() {
+ p = element("p");
+ p.innerHTML = `<em>No configurable parameters.</em>`;
+ },
+
+ m(target, anchor) {
+ insert(target, p, anchor);
+ },
+
+ p: noop,
+ i: noop,
+ o: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(p);
+ }
+ }
+ };
+ }
+
+ // (226:8) {#each requestParameters as param}
+ function create_each_block_1$1(ctx) {
+ var updating_used, updating_value, current;
+
+ function fieldswitch_used_binding_1(value) {
+ ctx.fieldswitch_used_binding_1.call(null, value, ctx);
+ updating_used = true;
+ add_flush_callback(() => updating_used = false);
+ }
+
+ function fieldswitch_value_binding_1(value_1) {
+ ctx.fieldswitch_value_binding_1.call(null, value_1, ctx);
+ updating_value = true;
+ add_flush_callback(() => updating_value = false);
+ }
+
+ let fieldswitch_props = {
+ name: ctx.param.name,
+ required: ctx.param.required
+ };
+ if (ctx.param.used !== void 0) {
+ fieldswitch_props.used = ctx.param.used;
+ }
+ if (ctx.param.value !== void 0) {
+ fieldswitch_props.value = ctx.param.value;
+ }
+ var fieldswitch = new FieldSwitch({ props: fieldswitch_props });
+
+ binding_callbacks.push(() => bind(fieldswitch, 'used', fieldswitch_used_binding_1));
+ binding_callbacks.push(() => bind(fieldswitch, 'value', fieldswitch_value_binding_1));
+
+ return {
+ c() {
+ fieldswitch.$$.fragment.c();
+ },
+
+ m(target, anchor) {
+ mount_component(fieldswitch, target, anchor);
+ current = true;
+ },
+
+ p(changed, new_ctx) {
+ ctx = new_ctx;
+ var fieldswitch_changes = {};
+ if (changed.requestParameters) fieldswitch_changes.name = ctx.param.name;
+ if (changed.requestParameters) fieldswitch_changes.required = ctx.param.required;
+ if (!updating_used && changed.requestParameters) {
+ fieldswitch_changes.used = ctx.param.used;
+ }
+ if (!updating_value && changed.requestParameters) {
+ fieldswitch_changes.value = ctx.param.value;
+ }
+ fieldswitch.$set(fieldswitch_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(fieldswitch.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(fieldswitch.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ destroy_component(fieldswitch, detaching);
+ }
+ };
+ }
+
+ // (242:6) {:else}
+ function create_else_block$2(ctx) {
+ var p;
+
+ return {
+ c() {
+ p = element("p");
+ p.innerHTML = `<i>Body is only available for POST, PUT and PATCH.</i>`;
+ },
+
+ m(target, anchor) {
+ insert(target, p, anchor);
+ },
+
+ p: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(p);
+ }
+ }
+ };
+ }
+
+ // (237:6) {#if allowBody(currentAction)}
+ function create_if_block_3$1(ctx) {
+ var textarea, dispose;
+
+ return {
+ c() {
+ textarea = element("textarea");
+ attr(textarea, "class", "textarea is-family-code");
+ attr(textarea, "rows", "8");
+ dispose = listen(textarea, "input", ctx.textarea_input_handler);
+ },
+
+ m(target, anchor) {
+ insert(target, textarea, anchor);
+
+ set_input_value(textarea, ctx.requestBody);
+ },
+
+ p(changed, ctx) {
+ if (changed.requestBody) set_input_value(textarea, ctx.requestBody);
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(textarea);
+ }
+
+ dispose();
+ }
+ };
+ }
+
+ // (282:4) {:catch}
+ function create_catch_block(ctx) {
+ var div;
+
+ return {
+ c() {
+ div = element("div");
+ div.textContent = " ";
+ },
+
+ m(target, anchor) {
+ insert(target, div, anchor);
+ },
+
+ p: noop,
+ i: noop,
+ o: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ }
+ };
+ }
+
+ // (255:4) {:then value}
+ function create_then_block(ctx) {
+ var show_if = Object.keys(ctx.value).length > 0, if_block_anchor, current;
+
+ var if_block = (show_if) && create_if_block_1$7(ctx);
+
+ return {
+ c() {
+ if (if_block) if_block.c();
+ if_block_anchor = empty();
+ },
+
+ m(target, anchor) {
+ if (if_block) if_block.m(target, anchor);
+ insert(target, if_block_anchor, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if (changed.response) show_if = Object.keys(ctx.value).length > 0;
+
+ if (show_if) {
+ if (if_block) {
+ if_block.p(changed, ctx);
+ transition_in(if_block, 1);
+ } else {
+ if_block = create_if_block_1$7(ctx);
+ if_block.c();
+ transition_in(if_block, 1);
+ if_block.m(if_block_anchor.parentNode, if_block_anchor);
+ }
+ } else if (if_block) {
+ group_outros();
+ transition_out(if_block, 1, 1, () => {
+ if_block = null;
+ });
+ check_outros();
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(if_block);
+ current = true;
+ },
+
+ o(local) {
+ transition_out(if_block);
+ current = false;
+ },
+
+ d(detaching) {
+ if (if_block) if_block.d(detaching);
+
+ if (detaching) {
+ detach(if_block_anchor);
+ }
+ }
+ };
+ }
+
+ // (256:6) {#if Object.keys(value).length > 0}
+ function create_if_block_1$7(ctx) {
+ var div1, section1, section0, div0, h1, t0_value = ctx.value.status + "", t0, t1, t2_value = ctx.value.statusText + "", t2, section1_class_value, t3, show_if = Object.keys(ctx.value.headers).length > 0, current;
+
+ var if_block = (show_if) && create_if_block_2$3(ctx);
+
+ return {
+ c() {
+ div1 = element("div");
+ section1 = element("section");
+ section0 = element("section");
+ div0 = element("div");
+ h1 = element("h1");
+ t0 = text(t0_value);
+ t1 = space();
+ t2 = text(t2_value);
+ t3 = space();
+ if (if_block) if_block.c();
+ attr(h1, "class", "title");
+ attr(div0, "class", "container has-text-centered");
+ attr(section0, "class", "hero-body hero-small svelte-c3oocm");
+ attr(section1, "class", section1_class_value = "hero hero-rounded " + colorize(ctx.value.status) + " svelte-c3oocm");
+ attr(div1, "class", "small-section svelte-c3oocm");
+ },
+
+ m(target, anchor) {
+ insert(target, div1, anchor);
+ append(div1, section1);
+ append(section1, section0);
+ append(section0, div0);
+ append(div0, h1);
+ append(h1, t0);
+ append(h1, t1);
+ append(h1, t2);
+ append(div1, t3);
+ if (if_block) if_block.m(div1, null);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if ((!current || changed.response) && t0_value !== (t0_value = ctx.value.status + "")) {
+ set_data(t0, t0_value);
+ }
+
+ if ((!current || changed.response) && t2_value !== (t2_value = ctx.value.statusText + "")) {
+ set_data(t2, t2_value);
+ }
+
+ if ((!current || changed.response) && section1_class_value !== (section1_class_value = "hero hero-rounded " + colorize(ctx.value.status) + " svelte-c3oocm")) {
+ attr(section1, "class", section1_class_value);
+ }
+
+ if (changed.response) show_if = Object.keys(ctx.value.headers).length > 0;
+
+ if (show_if) {
+ if (if_block) {
+ if_block.p(changed, ctx);
+ transition_in(if_block, 1);
+ } else {
+ if_block = create_if_block_2$3(ctx);
+ if_block.c();
+ transition_in(if_block, 1);
+ if_block.m(div1, null);
+ }
+ } else if (if_block) {
+ group_outros();
+ transition_out(if_block, 1, 1, () => {
+ if_block = null;
+ });
+ check_outros();
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(if_block);
+ current = true;
+ },
+
+ o(local) {
+ transition_out(if_block);
+ current = false;
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(div1);
+ }
+
+ if (if_block) if_block.d();
+ }
+ };
+ }
+
+ // (266:10) {#if Object.keys(value.headers).length > 0}
+ function create_if_block_2$3(ctx) {
+ var div1, div0, t, current;
+
+ let each_value = Object.entries(ctx.value.headers);
+
+ let each_blocks = [];
+
+ for (let i = 0; i < each_value.length; i += 1) {
+ each_blocks[i] = create_each_block$5(get_each_context$5(ctx, each_value, i));
+ }
+
+ var codeblock = new CodeBlock({
+ props: { type: contentType(ctx.value.headers), body: ctx.value.data }
+ });
+
+ return {
+ c() {
+ div1 = element("div");
+ div0 = element("div");
+
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].c();
+ }
+
+ t = space();
+ codeblock.$$.fragment.c();
+ attr(div0, "class", "content-header svelte-c3oocm");
+ attr(div1, "class", "container container-content svelte-c3oocm");
+ },
+
+ m(target, anchor) {
+ insert(target, div1, anchor);
+ append(div1, div0);
+
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].m(div0, null);
+ }
+
+ append(div1, t);
+ mount_component(codeblock, div1, null);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if (changed.response) {
+ each_value = Object.entries(ctx.value.headers);
+
+ let i;
+ for (i = 0; i < each_value.length; i += 1) {
+ const child_ctx = get_each_context$5(ctx, each_value, i);
+
+ if (each_blocks[i]) {
+ each_blocks[i].p(changed, child_ctx);
+ } else {
+ each_blocks[i] = create_each_block$5(child_ctx);
+ each_blocks[i].c();
+ each_blocks[i].m(div0, null);
+ }
+ }
+
+ for (; i < each_blocks.length; i += 1) {
+ each_blocks[i].d(1);
+ }
+ each_blocks.length = each_value.length;
+ }
+
+ var codeblock_changes = {};
+ if (changed.response) codeblock_changes.type = contentType(ctx.value.headers);
+ if (changed.response) codeblock_changes.body = ctx.value.data;
+ codeblock.$set(codeblock_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(codeblock.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(codeblock.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(div1);
+ }
+
+ destroy_each(each_blocks, detaching);
+
+ destroy_component(codeblock);
+ }
+ };
+ }
+
+ // (269:16) {#each Object.entries(value.headers) as [key, val]}
+ function create_each_block$5(ctx) {
+ var p, span, t0_value = ctx.key + "", t0, t1, t2_value = ctx.val + "", t2, t3;
+
+ return {
+ c() {
+ p = element("p");
+ span = element("span");
+ t0 = text(t0_value);
+ t1 = text("\n : ");
+ t2 = text(t2_value);
+ t3 = space();
+ attr(span, "class", "is-capitalized");
+ attr(p, "class", "is-family-code");
+ },
+
+ m(target, anchor) {
+ insert(target, p, anchor);
+ append(p, span);
+ append(span, t0);
+ append(p, t1);
+ append(p, t2);
+ append(p, t3);
+ },
+
+ p(changed, ctx) {
+ if ((changed.response) && t0_value !== (t0_value = ctx.key + "")) {
+ set_data(t0, t0_value);
+ }
+
+ if ((changed.response) && t2_value !== (t2_value = ctx.val + "")) {
+ set_data(t2, t2_value);
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(p);
+ }
+ }
+ };
+ }
+
+ // (249:21) <div class="section has-text-centered"> <span class="icon is-medium has-text-danger"> <i class="fas fa-2x fa-spinner fa-pulse" /> </span> </div> {:then value}
+ function create_pending_block(ctx) {
+ var div;
+
+ return {
+ c() {
+ div = element("div");
+ div.innerHTML = `<span class="icon is-medium has-text-danger"><i class="fas fa-2x fa-spinner fa-pulse"></i></span>`;
+ attr(div, "class", "section has-text-centered");
+ },
+
+ m(target, anchor) {
+ insert(target, div, anchor);
+ },
+
+ p: noop,
+ i: noop,
+ o: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ }
+ };
+ }
+
+ // (286:4) {#if error}
+ function create_if_block$a(ctx) {
+ var div1, section1, section0, div0, p, t;
+
+ return {
+ c() {
+ div1 = element("div");
+ section1 = element("section");
+ section0 = element("section");
+ div0 = element("div");
+ p = element("p");
+ t = text(ctx.error);
+ attr(p, "class", "subtitle");
+ attr(div0, "class", "container");
+ attr(section0, "class", "hero-body");
+ attr(section1, "class", "hero is-danger");
+ attr(div1, "class", "small-section svelte-c3oocm");
+ },
+
+ m(target, anchor) {
+ insert(target, div1, anchor);
+ append(div1, section1);
+ append(section1, section0);
+ append(section0, div0);
+ append(div0, p);
+ append(p, t);
+ },
+
+ p(changed, ctx) {
+ if (changed.error) {
+ set_data(t, ctx.error);
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(div1);
+ }
+ }
+ };
+ }
+
+ // (126:2) <div slot="body">
+ function create_body_slot(ctx) {
+ var div0, div3, div1, t0, div2, show_if_4, current_block_type_index, if_block1, t1, div4, ul, li0, a0, t3, li1, a1, t5, li2, a2, t7, div5, current_block_type_index_1, if_block2, t8, show_if_3 = isAuth(ctx.environment, 'basic'), t9, show_if_2 = isAuth(ctx.environment, 'apikey'), t10, show_if_1 = isAuth(ctx.environment, 'oauth2'), t11, div6, current_block_type_index_2, if_block6, t12, div7, show_if, t13, promise, t14, current, dispose;
+
+ function select_block_type(changed, ctx) {
+ if (ctx.copying) return create_if_block_11;
+ return create_else_block_4;
+ }
+
+ var current_block_type = select_block_type(null, ctx);
+ var if_block0 = current_block_type(ctx);
+
+ var if_block_creators = [
+ create_if_block_10,
+ create_else_block_3
+ ];
+
+ var if_blocks = [];
+
+ function select_block_type_1(changed, ctx) {
+ if ((show_if_4 == null) || changed.environment || changed.$auth || changed.$env) show_if_4 = !!(isAuth(ctx.environment, 'oauth2') && !ctx.$auth.includes(ctx.$env));
+ if (show_if_4) return 0;
+ return 1;
+ }
+
+ current_block_type_index = select_block_type_1(null, ctx);
+ if_block1 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
+
+ var if_block_creators_1 = [
+ create_if_block_9,
+ create_else_block_2
+ ];
+
+ var if_blocks_1 = [];
+
+ function select_block_type_2(changed, ctx) {
+ if (ctx.requestHeaders.length === 0 && !ctx.environment.auth) return 0;
+ return 1;
+ }
+
+ current_block_type_index_1 = select_block_type_2(null, ctx);
+ if_block2 = if_blocks_1[current_block_type_index_1] = if_block_creators_1[current_block_type_index_1](ctx);
+
+ var if_block3 = (show_if_3) && create_if_block_8(ctx);
+
+ var if_block4 = (show_if_2) && create_if_block_7(ctx);
+
+ var if_block5 = (show_if_1) && create_if_block_5(ctx);
+
+ var if_block_creators_2 = [
+ create_if_block_4,
+ create_else_block_1$1
+ ];
+
+ var if_blocks_2 = [];
+
+ function select_block_type_3(changed, ctx) {
+ if (ctx.requestParameters.length === 0) return 0;
+ return 1;
+ }
+
+ current_block_type_index_2 = select_block_type_3(null, ctx);
+ if_block6 = if_blocks_2[current_block_type_index_2] = if_block_creators_2[current_block_type_index_2](ctx);
+
+ function select_block_type_4(changed, ctx) {
+ if ((show_if == null) || changed.currentAction) show_if = !!(allowBody(ctx.currentAction));
+ if (show_if) return create_if_block_3$1;
+ return create_else_block$2;
+ }
+
+ var current_block_type_1 = select_block_type_4(null, ctx);
+ var if_block7 = current_block_type_1(ctx);
+
+ let info = {
+ ctx,
+ current: null,
+ token: null,
+ pending: create_pending_block,
+ then: create_then_block,
+ catch: create_catch_block,
+ value: 'value',
+ error: 'null',
+ blocks: [,,,]
+ };
+
+ handle_promise(promise = ctx.response, info);
+
+ var if_block8 = (ctx.error) && create_if_block$a(ctx);
+
+ return {
+ c() {
+ div0 = element("div");
+ div3 = element("div");
+ div1 = element("div");
+ if_block0.c();
+ t0 = space();
+ div2 = element("div");
+ if_block1.c();
+ t1 = space();
+ div4 = element("div");
+ ul = element("ul");
+ li0 = element("li");
+ a0 = element("a");
+ a0.textContent = "Headers";
+ t3 = space();
+ li1 = element("li");
+ a1 = element("a");
+ a1.textContent = "Parameters";
+ t5 = space();
+ li2 = element("li");
+ a2 = element("a");
+ a2.textContent = "Body";
+ t7 = space();
+ div5 = element("div");
+ if_block2.c();
+ t8 = space();
+ if (if_block3) if_block3.c();
+ t9 = space();
+ if (if_block4) if_block4.c();
+ t10 = space();
+ if (if_block5) if_block5.c();
+ t11 = space();
+ div6 = element("div");
+ if_block6.c();
+ t12 = space();
+ div7 = element("div");
+ if_block7.c();
+ t13 = space();
+
+ info.block.c();
+
+ t14 = space();
+ if (if_block8) if_block8.c();
+ attr(div1, "class", "column");
+ attr(div2, "class", "column is-one-fifth");
+ attr(div3, "class", "columns");
+ attr(a0, "href", "javascript:void(0)");
+ toggle_class(li0, "is-active", ctx.requestTab === 0);
+ attr(a1, "href", "javascript:void(0)");
+ toggle_class(li1, "is-active", ctx.requestTab === 1);
+ attr(a2, "href", "javascript:void(0)");
+ toggle_class(li2, "is-active", ctx.requestTab === 2);
+ attr(div4, "class", "tabs is-boxed");
+ attr(div5, "class", "section-headers");
+ toggle_class(div5, "is-hidden", ctx.requestTab != 0);
+ attr(div6, "class", "section-parameters");
+ toggle_class(div6, "is-hidden", ctx.requestTab != 1);
+ attr(div7, "class", "section-body");
+ toggle_class(div7, "is-hidden", ctx.requestTab != 2);
+ attr(div0, "slot", "body");
+
+ dispose = [
+ listen(a0, "click", ctx.click_handler),
+ listen(a1, "click", ctx.click_handler_1),
+ listen(a2, "click", ctx.click_handler_2)
+ ];
+ },
+
+ m(target, anchor) {
+ insert(target, div0, anchor);
+ append(div0, div3);
+ append(div3, div1);
+ if_block0.m(div1, null);
+ append(div3, t0);
+ append(div3, div2);
+ if_blocks[current_block_type_index].m(div2, null);
+ append(div0, t1);
+ append(div0, div4);
+ append(div4, ul);
+ append(ul, li0);
+ append(li0, a0);
+ append(ul, t3);
+ append(ul, li1);
+ append(li1, a1);
+ append(ul, t5);
+ append(ul, li2);
+ append(li2, a2);
+ append(div0, t7);
+ append(div0, div5);
+ if_blocks_1[current_block_type_index_1].m(div5, null);
+ append(div5, t8);
+ if (if_block3) if_block3.m(div5, null);
+ append(div5, t9);
+ if (if_block4) if_block4.m(div5, null);
+ append(div5, t10);
+ if (if_block5) if_block5.m(div5, null);
+ append(div0, t11);
+ append(div0, div6);
+ if_blocks_2[current_block_type_index_2].m(div6, null);
+ append(div0, t12);
+ append(div0, div7);
+ if_block7.m(div7, null);
+ append(div0, t13);
+
+ info.block.m(div0, info.anchor = null);
+ info.mount = () => div0;
+ info.anchor = t14;
+
+ append(div0, t14);
+ if (if_block8) if_block8.m(div0, null);
+ current = true;
+ },
+
+ p(changed, new_ctx) {
+ ctx = new_ctx;
+ if (current_block_type === (current_block_type = select_block_type(changed, ctx)) && if_block0) {
+ if_block0.p(changed, ctx);
+ } else {
+ if_block0.d(1);
+ if_block0 = current_block_type(ctx);
+ if (if_block0) {
+ if_block0.c();
+ if_block0.m(div1, null);
+ }
+ }
+
+ var previous_block_index = current_block_type_index;
+ current_block_type_index = select_block_type_1(changed, ctx);
+ if (current_block_type_index === previous_block_index) {
+ if_blocks[current_block_type_index].p(changed, ctx);
+ } else {
+ group_outros();
+ transition_out(if_blocks[previous_block_index], 1, 1, () => {
+ if_blocks[previous_block_index] = null;
+ });
+ check_outros();
+
+ if_block1 = if_blocks[current_block_type_index];
+ if (!if_block1) {
+ if_block1 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
+ if_block1.c();
+ }
+ transition_in(if_block1, 1);
+ if_block1.m(div2, null);
+ }
+
+ if (changed.requestTab) {
+ toggle_class(li0, "is-active", ctx.requestTab === 0);
+ toggle_class(li1, "is-active", ctx.requestTab === 1);
+ toggle_class(li2, "is-active", ctx.requestTab === 2);
+ }
+
+ var previous_block_index_1 = current_block_type_index_1;
+ current_block_type_index_1 = select_block_type_2(changed, ctx);
+ if (current_block_type_index_1 === previous_block_index_1) {
+ if_blocks_1[current_block_type_index_1].p(changed, ctx);
+ } else {
+ group_outros();
+ transition_out(if_blocks_1[previous_block_index_1], 1, 1, () => {
+ if_blocks_1[previous_block_index_1] = null;
+ });
+ check_outros();
+
+ if_block2 = if_blocks_1[current_block_type_index_1];
+ if (!if_block2) {
+ if_block2 = if_blocks_1[current_block_type_index_1] = if_block_creators_1[current_block_type_index_1](ctx);
+ if_block2.c();
+ }
+ transition_in(if_block2, 1);
+ if_block2.m(div5, t8);
+ }
+
+ if (changed.environment) show_if_3 = isAuth(ctx.environment, 'basic');
+
+ if (show_if_3) {
+ if (if_block3) {
+ if_block3.p(changed, ctx);
+ transition_in(if_block3, 1);
+ } else {
+ if_block3 = create_if_block_8(ctx);
+ if_block3.c();
+ transition_in(if_block3, 1);
+ if_block3.m(div5, t9);
+ }
+ } else if (if_block3) {
+ group_outros();
+ transition_out(if_block3, 1, 1, () => {
+ if_block3 = null;
+ });
+ check_outros();
+ }
+
+ if (changed.environment) show_if_2 = isAuth(ctx.environment, 'apikey');
+
+ if (show_if_2) {
+ if (if_block4) {
+ if_block4.p(changed, ctx);
+ transition_in(if_block4, 1);
+ } else {
+ if_block4 = create_if_block_7(ctx);
+ if_block4.c();
+ transition_in(if_block4, 1);
+ if_block4.m(div5, t10);
+ }
+ } else if (if_block4) {
+ group_outros();
+ transition_out(if_block4, 1, 1, () => {
+ if_block4 = null;
+ });
+ check_outros();
+ }
+
+ if (changed.environment) show_if_1 = isAuth(ctx.environment, 'oauth2');
+
+ if (show_if_1) {
+ if (if_block5) {
+ if_block5.p(changed, ctx);
+ transition_in(if_block5, 1);
+ } else {
+ if_block5 = create_if_block_5(ctx);
+ if_block5.c();
+ transition_in(if_block5, 1);
+ if_block5.m(div5, null);
+ }
+ } else if (if_block5) {
+ group_outros();
+ transition_out(if_block5, 1, 1, () => {
+ if_block5 = null;
+ });
+ check_outros();
+ }
+
+ if (changed.requestTab) {
+ toggle_class(div5, "is-hidden", ctx.requestTab != 0);
+ }
+
+ var previous_block_index_2 = current_block_type_index_2;
+ current_block_type_index_2 = select_block_type_3(changed, ctx);
+ if (current_block_type_index_2 === previous_block_index_2) {
+ if_blocks_2[current_block_type_index_2].p(changed, ctx);
+ } else {
+ group_outros();
+ transition_out(if_blocks_2[previous_block_index_2], 1, 1, () => {
+ if_blocks_2[previous_block_index_2] = null;
+ });
+ check_outros();
+
+ if_block6 = if_blocks_2[current_block_type_index_2];
+ if (!if_block6) {
+ if_block6 = if_blocks_2[current_block_type_index_2] = if_block_creators_2[current_block_type_index_2](ctx);
+ if_block6.c();
+ }
+ transition_in(if_block6, 1);
+ if_block6.m(div6, null);
+ }
+
+ if (changed.requestTab) {
+ toggle_class(div6, "is-hidden", ctx.requestTab != 1);
+ }
+
+ if (current_block_type_1 === (current_block_type_1 = select_block_type_4(changed, ctx)) && if_block7) {
+ if_block7.p(changed, ctx);
+ } else {
+ if_block7.d(1);
+ if_block7 = current_block_type_1(ctx);
+ if (if_block7) {
+ if_block7.c();
+ if_block7.m(div7, null);
+ }
+ }
+
+ if (changed.requestTab) {
+ toggle_class(div7, "is-hidden", ctx.requestTab != 2);
+ }
+
+ info.ctx = ctx;
+
+ if (('response' in changed) && promise !== (promise = ctx.response) && handle_promise(promise, info)) {
+ // nothing
+ } else {
+ info.block.p(changed, assign(assign({}, ctx), info.resolved));
+ }
+
+ if (ctx.error) {
+ if (if_block8) {
+ if_block8.p(changed, ctx);
+ } else {
+ if_block8 = create_if_block$a(ctx);
+ if_block8.c();
+ if_block8.m(div0, null);
+ }
+ } else if (if_block8) {
+ if_block8.d(1);
+ if_block8 = null;
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(if_block1);
+ transition_in(if_block2);
+ transition_in(if_block3);
+ transition_in(if_block4);
+ transition_in(if_block5);
+ transition_in(if_block6);
+ transition_in(info.block);
+ current = true;
+ },
+
+ o(local) {
+ transition_out(if_block1);
+ transition_out(if_block2);
+ transition_out(if_block3);
+ transition_out(if_block4);
+ transition_out(if_block5);
+ transition_out(if_block6);
+
+ for (let i = 0; i < 3; i += 1) {
+ const block = info.blocks[i];
+ transition_out(block);
+ }
+
+ current = false;
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(div0);
+ }
+
+ if_block0.d();
+ if_blocks[current_block_type_index].d();
+ if_blocks_1[current_block_type_index_1].d();
+ if (if_block3) if_block3.d();
+ if (if_block4) if_block4.d();
+ if (if_block5) if_block5.d();
+ if_blocks_2[current_block_type_index_2].d();
+ if_block7.d();
+
+ info.block.d();
+ info.token = null;
+ info = null;
+
+ if (if_block8) if_block8.d();
+ run_all(dispose);
+ }
+ };
+ }
+
+ // (124:0) <CollapsiblePanel dark={true} {show}>
+ function create_default_slot(ctx) {
+ var t, current;
+
+ return {
+ c() {
+ t = space();
+ },
+
+ m(target, anchor) {
+ insert(target, t, anchor);
+ },
+
+ p: noop,
+ i: noop,
+ o: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(t);
+ }
+ }
+ };
+ }
+
+ function create_fragment$g(ctx) {
+ var current;
+
+ var collapsiblepanel = new CollapsiblePanel({
+ props: {
+ dark: true,
+ show: ctx.show,
+ $$slots: {
+ default: [create_default_slot],
+ body: [create_body_slot],
+ heading: [create_heading_slot]
+ },
+ $$scope: { ctx }
+ }
+ });
+
+ return {
+ c() {
+ collapsiblepanel.$$.fragment.c();
+ },
+
+ m(target, anchor) {
+ mount_component(collapsiblepanel, target, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ var collapsiblepanel_changes = {};
+ if (changed.show) collapsiblepanel_changes.show = ctx.show;
+ if (changed.$$scope || changed.error || changed.response || changed.requestTab || changed.currentAction || changed.requestBody || changed.requestParameters || changed.environment || changed.$auth || changed.$env || changed.$token || changed.requestHeaders || changed.copying || changed.currentUrl) collapsiblepanel_changes.$$scope = { changed, ctx };
+ collapsiblepanel.$set(collapsiblepanel_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(collapsiblepanel.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(collapsiblepanel.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ destroy_component(collapsiblepanel, detaching);
+ }
+ };
+ }
+
+ function contentType(headers) {
+ return headers && headers["content-type"];
+ }
+
+ function basicAuth(username, password) {
+ return btoa(`${username}:${password}`);
+ }
+
+ function instance$g($$self, $$props, $$invalidate) {
+ let $env, $auth, $token;
+
+ component_subscribe($$self, env, $$value => { $env = $$value; $$invalidate('$env', $env); });
+ component_subscribe($$self, auth, $$value => { $auth = $$value; $$invalidate('$auth', $auth); });
+ component_subscribe($$self, token, $$value => { $token = $$value; $$invalidate('$token', $token); });
+
+
+
+ let { show = true, environments, currentAction, currentSample, requestHeaders, requestParameters, requestBody } = $$props;
+
+ let response = {};
+ let requestTab = 0;
+ let error;
+ let copying = false;
+
+ afterUpdate(() => {
+ $$invalidate('response', response = {});
+ });
+
+ function handleClick() {
+ $$invalidate('error', error = undefined);
+ $$invalidate('response', response = sendRequest($env, environment, currentAction, {
+ headers: requestHeaders,
+ parameters: requestParameters,
+ body: requestBody
+ }).catch(function(err) {
+ $$invalidate('error', error = err);
+ return Promise.reject(err);
+ }));
+ }
+
+ function handleTab(index) {
+ $$invalidate('error', error = undefined);
+ $$invalidate('requestTab', requestTab = index);
+ }
+
+ function handleCopy() {
+ $$invalidate('copying', copying = true);
+
+ setTimeout(() => {
+ $$invalidate('copying', copying = false);
+ }, 2000);
+
+ copyUrl(currentUrl, requestParameters);
+ }
+
+ const click_handler = () => handleTab(0);
+
+ const click_handler_1 = () => handleTab(1);
+
+ const click_handler_2 = () => handleTab(2);
+
+ function fieldswitch_used_binding(value, { header }) {
+ header.used = value;
+ $$invalidate('requestHeaders', requestHeaders);
+ }
+
+ function fieldswitch_value_binding(value_1, { header }) {
+ header.value = value_1;
+ $$invalidate('requestHeaders', requestHeaders);
+ }
+
+ function fieldswitch_used_binding_1(value, { param }) {
+ param.used = value;
+ $$invalidate('requestParameters', requestParameters);
+ }
+
+ function fieldswitch_value_binding_1(value_1, { param }) {
+ param.value = value_1;
+ $$invalidate('requestParameters', requestParameters);
+ }
+
+ function textarea_input_handler() {
+ requestBody = this.value;
+ $$invalidate('requestBody', requestBody);
+ }
+
+ $$self.$set = $$props => {
+ if ('show' in $$props) $$invalidate('show', show = $$props.show);
+ if ('environments' in $$props) $$invalidate('environments', environments = $$props.environments);
+ if ('currentAction' in $$props) $$invalidate('currentAction', currentAction = $$props.currentAction);
+ if ('currentSample' in $$props) $$invalidate('currentSample', currentSample = $$props.currentSample);
+ if ('requestHeaders' in $$props) $$invalidate('requestHeaders', requestHeaders = $$props.requestHeaders);
+ if ('requestParameters' in $$props) $$invalidate('requestParameters', requestParameters = $$props.requestParameters);
+ if ('requestBody' in $$props) $$invalidate('requestBody', requestBody = $$props.requestBody);
+ };
+
+ let environment, currentUrl;
+
+ $$self.$$.update = ($$dirty = { environments: 1, $env: 1, environment: 1, currentAction: 1, currentUrl: 1 }) => {
+ if ($$dirty.environments || $$dirty.$env) { $$invalidate('environment', environment = environments[$env]); }
+ if ($$dirty.environment || $$dirty.currentAction) { $$invalidate('currentUrl', currentUrl = urlParse(urlJoin(environment.url, currentAction.path))); }
+ if ($$dirty.currentUrl) { {
+ $$invalidate('error', error = currentUrl && undefined);
+ } }
+ };
+
+ return {
+ show,
+ environments,
+ currentAction,
+ currentSample,
+ requestHeaders,
+ requestParameters,
+ requestBody,
+ response,
+ requestTab,
+ error,
+ copying,
+ handleClick,
+ handleTab,
+ handleCopy,
+ environment,
+ $env,
+ currentUrl,
+ $auth,
+ $token,
+ click_handler,
+ click_handler_1,
+ click_handler_2,
+ fieldswitch_used_binding,
+ fieldswitch_value_binding,
+ fieldswitch_used_binding_1,
+ fieldswitch_value_binding_1,
+ textarea_input_handler
+ };
+ }
+
+ class PlaygroundPanel extends SvelteComponent {
+ constructor(options) {
+ super();
+ if (!document.getElementById("svelte-c3oocm-style")) add_css$8();
+ init(this, options, instance$g, create_fragment$g, safe_not_equal, ["show", "environments", "currentAction", "currentSample", "requestHeaders", "requestParameters", "requestBody"]);
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter/panels/ScenarioPanel.svelte generated by Svelte v3.12.1 */
+
+ // (30:2) <span slot="heading">
+ function create_heading_slot$1(ctx) {
+ var span, t_value = ctx.title(ctx.index) + "", t;
+
+ return {
+ c() {
+ span = element("span");
+ t = text(t_value);
+ attr(span, "slot", "heading");
+ },
+
+ m(target, anchor) {
+ insert(target, span, anchor);
+ append(span, t);
+ },
+
+ p(changed, ctx) {
+ if ((changed.index) && t_value !== (t_value = ctx.title(ctx.index) + "")) {
+ set_data(t, t_value);
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(span);
+ }
+ }
+ };
+ }
+
+ // (31:2) <div slot="body">
+ function create_body_slot$1(ctx) {
+ var div, t, current;
+
+ var requestpanel = new RequestPanel({
+ props: {
+ description: ctx.request.description,
+ headers: ctx.request.headers,
+ contentType: ctx.request.contentType,
+ example: ctx.request.example,
+ schema: ctx.request.schema
+ }
+ });
+
+ var responsepanel = new ResponsePanel({
+ props: {
+ title: ctx.response.title,
+ description: ctx.response.description,
+ statusCode: ctx.response.statusCode,
+ headers: ctx.response.headers,
+ contentType: ctx.response.contentType,
+ example: ctx.response.example,
+ schema: ctx.response.schema
+ }
+ });
+
+ return {
+ c() {
+ div = element("div");
+ requestpanel.$$.fragment.c();
+ t = space();
+ responsepanel.$$.fragment.c();
+ attr(div, "slot", "body");
+ },
+
+ m(target, anchor) {
+ insert(target, div, anchor);
+ mount_component(requestpanel, div, null);
+ append(div, t);
+ mount_component(responsepanel, div, null);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ var requestpanel_changes = {};
+ if (changed.request) requestpanel_changes.description = ctx.request.description;
+ if (changed.request) requestpanel_changes.headers = ctx.request.headers;
+ if (changed.request) requestpanel_changes.contentType = ctx.request.contentType;
+ if (changed.request) requestpanel_changes.example = ctx.request.example;
+ if (changed.request) requestpanel_changes.schema = ctx.request.schema;
+ requestpanel.$set(requestpanel_changes);
+
+ var responsepanel_changes = {};
+ if (changed.response) responsepanel_changes.title = ctx.response.title;
+ if (changed.response) responsepanel_changes.description = ctx.response.description;
+ if (changed.response) responsepanel_changes.statusCode = ctx.response.statusCode;
+ if (changed.response) responsepanel_changes.headers = ctx.response.headers;
+ if (changed.response) responsepanel_changes.contentType = ctx.response.contentType;
+ if (changed.response) responsepanel_changes.example = ctx.response.example;
+ if (changed.response) responsepanel_changes.schema = ctx.response.schema;
+ responsepanel.$set(responsepanel_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(requestpanel.$$.fragment, local);
+
+ transition_in(responsepanel.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(requestpanel.$$.fragment, local);
+ transition_out(responsepanel.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+
+ destroy_component(requestpanel);
+
+ destroy_component(responsepanel);
+ }
+ };
+ }
+
+ // (29:0) <CollapsiblePanel {show}>
+ function create_default_slot$1(ctx) {
+ var t, current;
+
+ return {
+ c() {
+ t = space();
+ },
+
+ m(target, anchor) {
+ insert(target, t, anchor);
+ },
+
+ p: noop,
+ i: noop,
+ o: noop,
+
+ d(detaching) {
+ if (detaching) {
+ detach(t);
+ }
+ }
+ };
+ }
+
+ function create_fragment$h(ctx) {
+ var current;
+
+ var collapsiblepanel = new CollapsiblePanel({
+ props: {
+ show: ctx.show,
+ $$slots: {
+ default: [create_default_slot$1],
+ body: [create_body_slot$1],
+ heading: [create_heading_slot$1]
+ },
+ $$scope: { ctx }
+ }
+ });
+
+ return {
+ c() {
+ collapsiblepanel.$$.fragment.c();
+ },
+
+ m(target, anchor) {
+ mount_component(collapsiblepanel, target, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ var collapsiblepanel_changes = {};
+ if (changed.show) collapsiblepanel_changes.show = ctx.show;
+ if (changed.$$scope || changed.response || changed.request || changed.index) collapsiblepanel_changes.$$scope = { changed, ctx };
+ collapsiblepanel.$set(collapsiblepanel_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(collapsiblepanel.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(collapsiblepanel.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ destroy_component(collapsiblepanel, detaching);
+ }
+ };
+ }
+
+ function instance$h($$self, $$props, $$invalidate) {
+
+
+ let { show, count, index, request, response } = $$props;
+
+ function title(index) {
+ if (request.title) {
+ return `Request ${request.title}`;
+ }
+
+ if (count === 1) {
+ return "Request";
+ } else {
+ return `Request ${index + 1}`;
+ }
+ }
+
+ $$self.$set = $$props => {
+ if ('show' in $$props) $$invalidate('show', show = $$props.show);
+ if ('count' in $$props) $$invalidate('count', count = $$props.count);
+ if ('index' in $$props) $$invalidate('index', index = $$props.index);
+ if ('request' in $$props) $$invalidate('request', request = $$props.request);
+ if ('response' in $$props) $$invalidate('response', response = $$props.response);
+ };
+
+ return {
+ show,
+ count,
+ index,
+ request,
+ response,
+ title
+ };
+ }
+
+ class ScenarioPanel extends SvelteComponent {
+ constructor(options) {
+ super();
+ init(this, options, instance$h, create_fragment$h, safe_not_equal, ["show", "count", "index", "request", "response"]);
+ }
+ }
+
+ /* home/tnowitzki/.npm-global/lib/node_modules/snowboard/templates/winter.svelte generated by Svelte v3.12.1 */
+ const { Object: Object_1, document: document_1 } = globals;
+
+ function add_css$9() {
+ var style = element("style");
+ style.id = 'svelte-t5bxdu-style';
+ style.textContent = ".sidenav.svelte-t5bxdu{padding:1rem 0 1rem 0.75rem}.main.svelte-t5bxdu{padding:3rem;background-color:#fff;box-shadow:0 2px 0 2px #f5f5f5}.breadcrumb-right.svelte-t5bxdu{margin-top:0.3em}.box-wrapper.svelte-t5bxdu{border-radius:0}body{background-color:#fafafa}code[class*=\"language-\"], pre[class*=\"language-\"]{font-family:monospace}.token.number, .token.tag{display:inline;padding:inherit;font-size:inherit;line-height:inherit;text-align:inherit;vertical-align:inherit;border-radius:inherit;font-weight:inherit;white-space:inherit;background:inherit;margin:inherit}.icon-brand.svelte-t5bxdu{margin-right:0.5rem}.menu-collapsible.svelte-t5bxdu{display:none}.footer.svelte-t5bxdu .content.svelte-t5bxdu{transition:margin 0.3s}@media screen and (min-width: 768px){.menu-collapsible.svelte-t5bxdu{display:block;position:fixed;border-top:1px solid #eee;width:calc(25% - 0.5rem);height:calc(2.5rem + 10px);left:0;bottom:0;font-size:1.33333em;line-height:calc(2.5rem + 5px);text-align:center;color:#b5b5b5;font-weight:300;box-shadow:2px 0 0 #f5f5f5;cursor:pointer}.menu-collapsible.svelte-t5bxdu:hover{background:rgba(0, 0, 0, 0.05);box-shadow:2px 0 0 #eee;border-color:#e8e8e8}.is-collapsed.svelte-t5bxdu .sidenav.svelte-t5bxdu{width:3.75rem}.is-collapsed.svelte-t5bxdu .main.svelte-t5bxdu{width:calc(100% - 4.5rem)}.is-collapsed.svelte-t5bxdu .menu-collapsible.svelte-t5bxdu{width:calc(3rem - 2px)}.menu-collapsible.svelte-t5bxdu,.sidenav.svelte-t5bxdu,.main.svelte-t5bxdu{transition:width 0.3s}}";
+ append(document_1.head, style);
+ }
+
+ function get_each_context$6(ctx, list, i) {
+ const child_ctx = Object_1.create(ctx);
+ child_ctx.request = list[i].request;
+ child_ctx.response = list[i].response;
+ child_ctx.index = i;
+ return child_ctx;
+ }
+
+ function get_each_context_1$2(ctx, list, i) {
+ const child_ctx = Object_1.create(ctx);
+ child_ctx.tag = list[i];
+ return child_ctx;
+ }
+
+ // (311:6) {#if config.playground.enabled}
+ function create_if_block_6$1(ctx) {
+ var current;
+
+ var selectorpanel = new SelectorPanel({
+ props: {
+ environments: ctx.config.playground.environments,
+ authenticating: ctx.authenticating
+ }
+ });
+
+ return {
+ c() {
+ selectorpanel.$$.fragment.c();
+ },
+
+ m(target, anchor) {
+ mount_component(selectorpanel, target, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ var selectorpanel_changes = {};
+ if (changed.config) selectorpanel_changes.environments = ctx.config.playground.environments;
+ if (changed.authenticating) selectorpanel_changes.authenticating = ctx.authenticating;
+ selectorpanel.$set(selectorpanel_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(selectorpanel.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(selectorpanel.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ destroy_component(selectorpanel, detaching);
+ }
+ };
+ }
+
+ // (336:6) {#if collapsed}
+ function create_if_block_5$1(ctx) {
+ var span;
+
+ return {
+ c() {
+ span = element("span");
+ span.textContent = "»";
+ attr(span, "class", "icon");
+ attr(span, "title", "Expand [");
+ },
+
+ m(target, anchor) {
+ insert(target, span, anchor);
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(span);
+ }
+ }
+ };
+ }
+
+ // (339:6) {#if !collapsed}
+ function create_if_block_4$1(ctx) {
+ var span0, t_1, span1;
+
+ return {
+ c() {
+ span0 = element("span");
+ span0.textContent = "«";
+ t_1 = space();
+ span1 = element("span");
+ span1.textContent = "Collapse sidebar";
+ attr(span0, "class", "icon");
+ attr(span1, "class", "fa-xs");
+ },
+
+ m(target, anchor) {
+ insert(target, span0, anchor);
+ insert(target, t_1, anchor);
+ insert(target, span1, anchor);
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(span0);
+ detach(t_1);
+ detach(span1);
+ }
+ }
+ };
+ }
+
+ // (347:4) {#if index === -1}
+ function create_if_block_3$2(ctx) {
+ var div, raw_value = markdown(ctx.description) + "";
+
+ return {
+ c() {
+ div = element("div");
+ attr(div, "class", "content");
+ },
+
+ m(target, anchor) {
+ insert(target, div, anchor);
+ div.innerHTML = raw_value;
+ },
+
+ p(changed, ctx) {
+ if ((changed.description) && raw_value !== (raw_value = markdown(ctx.description) + "")) {
+ div.innerHTML = raw_value;
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(div);
+ }
+ }
+ };
+ }
+
+ // (353:4) {#if currentAction}
+ function create_if_block$b(ctx) {
+ var div2, div0, h1, t0_value = ctx.currentAction.title + "", t0, t1, div1, nav, ul, t2, hr, t3, div3, code0, t4_value = ctx.currentAction.method + "", t4, code0_class_value, t5, code1, t6_value = ctx.currentAction.pathTemplate + "", t6, t7, div4, raw_value = markdown(ctx.currentAction.description) + "", t8, t9, t10, each1_anchor, current;
+
+ let each_value_1 = ctx.currentAction.tags;
+
+ let each_blocks_1 = [];
+
+ for (let i = 0; i < each_value_1.length; i += 1) {
+ each_blocks_1[i] = create_each_block_1$2(get_each_context_1$2(ctx, each_value_1, i));
+ }
+
+ var if_block = (ctx.config.playground.enabled) && create_if_block_1$8(ctx);
+
+ var parameterpanel = new ParameterPanel({ props: { parameters: ctx.currentAction.parameters } });
+
+ let each_value = ctx.currentAction.transactions;
+
+ let each_blocks = [];
+
+ for (let i = 0; i < each_value.length; i += 1) {
+ each_blocks[i] = create_each_block$6(get_each_context$6(ctx, each_value, i));
+ }
+
+ const out = i => transition_out(each_blocks[i], 1, 1, () => {
+ each_blocks[i] = null;
+ });
+
+ return {
+ c() {
+ div2 = element("div");
+ div0 = element("div");
+ h1 = element("h1");
+ t0 = text(t0_value);
+ t1 = space();
+ div1 = element("div");
+ nav = element("nav");
+ ul = element("ul");
+
+ for (let i = 0; i < each_blocks_1.length; i += 1) {
+ each_blocks_1[i].c();
+ }
+
+ t2 = space();
+ hr = element("hr");
+ t3 = space();
+ div3 = element("div");
+ code0 = element("code");
+ t4 = text(t4_value);
+ t5 = space();
+ code1 = element("code");
+ t6 = text(t6_value);
+ t7 = space();
+ div4 = element("div");
+ t8 = space();
+ if (if_block) if_block.c();
+ t9 = space();
+ parameterpanel.$$.fragment.c();
+ t10 = space();
+
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].c();
+ }
+
+ each1_anchor = empty();
+ attr(h1, "class", "title is-4");
+ attr(div0, "class", "column");
+ attr(nav, "class", "breadcrumb breadcrumb-right is-pulled-right svelte-t5bxdu");
+ attr(nav, "aria-label", "breadcrumbs");
+ attr(div1, "class", "column");
+ attr(div2, "class", "columns");
+ attr(code0, "class", code0_class_value = "tag is-uppercase " + colorize(ctx.currentAction.method) + " svelte-t5bxdu");
+ attr(code1, "class", "tag ");
+ attr(div3, "class", "tags has-addons are-large");
+ attr(div4, "class", "content");
+ },
+
+ m(target, anchor) {
+ insert(target, div2, anchor);
+ append(div2, div0);
+ append(div0, h1);
+ append(h1, t0);
+ append(div2, t1);
+ append(div2, div1);
+ append(div1, nav);
+ append(nav, ul);
+
+ for (let i = 0; i < each_blocks_1.length; i += 1) {
+ each_blocks_1[i].m(ul, null);
+ }
+
+ insert(target, t2, anchor);
+ insert(target, hr, anchor);
+ insert(target, t3, anchor);
+ insert(target, div3, anchor);
+ append(div3, code0);
+ append(code0, t4);
+ append(div3, t5);
+ append(div3, code1);
+ append(code1, t6);
+ insert(target, t7, anchor);
+ insert(target, div4, anchor);
+ div4.innerHTML = raw_value;
+ insert(target, t8, anchor);
+ if (if_block) if_block.m(target, anchor);
+ insert(target, t9, anchor);
+ mount_component(parameterpanel, target, anchor);
+ insert(target, t10, anchor);
+
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ each_blocks[i].m(target, anchor);
+ }
+
+ insert(target, each1_anchor, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if ((!current || changed.currentAction) && t0_value !== (t0_value = ctx.currentAction.title + "")) {
+ set_data(t0, t0_value);
+ }
+
+ if (changed.currentAction) {
+ each_value_1 = ctx.currentAction.tags;
+
+ let i;
+ for (i = 0; i < each_value_1.length; i += 1) {
+ const child_ctx = get_each_context_1$2(ctx, each_value_1, i);
+
+ if (each_blocks_1[i]) {
+ each_blocks_1[i].p(changed, child_ctx);
+ } else {
+ each_blocks_1[i] = create_each_block_1$2(child_ctx);
+ each_blocks_1[i].c();
+ each_blocks_1[i].m(ul, null);
+ }
+ }
+
+ for (; i < each_blocks_1.length; i += 1) {
+ each_blocks_1[i].d(1);
+ }
+ each_blocks_1.length = each_value_1.length;
+ }
+
+ if ((!current || changed.currentAction) && t4_value !== (t4_value = ctx.currentAction.method + "")) {
+ set_data(t4, t4_value);
+ }
+
+ if ((!current || changed.currentAction) && code0_class_value !== (code0_class_value = "tag is-uppercase " + colorize(ctx.currentAction.method) + " svelte-t5bxdu")) {
+ attr(code0, "class", code0_class_value);
+ }
+
+ if ((!current || changed.currentAction) && t6_value !== (t6_value = ctx.currentAction.pathTemplate + "")) {
+ set_data(t6, t6_value);
+ }
+
+ if ((!current || changed.currentAction) && raw_value !== (raw_value = markdown(ctx.currentAction.description) + "")) {
+ div4.innerHTML = raw_value;
+ }
+
+ if (ctx.config.playground.enabled) {
+ if (if_block) {
+ if_block.p(changed, ctx);
+ transition_in(if_block, 1);
+ } else {
+ if_block = create_if_block_1$8(ctx);
+ if_block.c();
+ transition_in(if_block, 1);
+ if_block.m(t9.parentNode, t9);
+ }
+ } else if (if_block) {
+ group_outros();
+ transition_out(if_block, 1, 1, () => {
+ if_block = null;
+ });
+ check_outros();
+ }
+
+ var parameterpanel_changes = {};
+ if (changed.currentAction) parameterpanel_changes.parameters = ctx.currentAction.parameters;
+ parameterpanel.$set(parameterpanel_changes);
+
+ if (changed.currentAction) {
+ each_value = ctx.currentAction.transactions;
+
+ let i;
+ for (i = 0; i < each_value.length; i += 1) {
+ const child_ctx = get_each_context$6(ctx, each_value, i);
+
+ if (each_blocks[i]) {
+ each_blocks[i].p(changed, child_ctx);
+ transition_in(each_blocks[i], 1);
+ } else {
+ each_blocks[i] = create_each_block$6(child_ctx);
+ each_blocks[i].c();
+ transition_in(each_blocks[i], 1);
+ each_blocks[i].m(each1_anchor.parentNode, each1_anchor);
+ }
+ }
+
+ group_outros();
+ for (i = each_value.length; i < each_blocks.length; i += 1) {
+ out(i);
+ }
+ check_outros();
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(if_block);
+
+ transition_in(parameterpanel.$$.fragment, local);
+
+ for (let i = 0; i < each_value.length; i += 1) {
+ transition_in(each_blocks[i]);
+ }
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(if_block);
+ transition_out(parameterpanel.$$.fragment, local);
+
+ each_blocks = each_blocks.filter(Boolean);
+ for (let i = 0; i < each_blocks.length; i += 1) {
+ transition_out(each_blocks[i]);
+ }
+
+ current = false;
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(div2);
+ }
+
+ destroy_each(each_blocks_1, detaching);
+
+ if (detaching) {
+ detach(t2);
+ detach(hr);
+ detach(t3);
+ detach(div3);
+ detach(t7);
+ detach(div4);
+ detach(t8);
+ }
+
+ if (if_block) if_block.d(detaching);
+
+ if (detaching) {
+ detach(t9);
+ }
+
+ destroy_component(parameterpanel, detaching);
+
+ if (detaching) {
+ detach(t10);
+ }
+
+ destroy_each(each_blocks, detaching);
+
+ if (detaching) {
+ detach(each1_anchor);
+ }
+ }
+ };
+ }
+
+ // (363:14) {#each currentAction.tags as tag}
+ function create_each_block_1$2(ctx) {
+ var li, a, t0_value = ctx.tag + "", t0, t1;
+
+ return {
+ c() {
+ li = element("li");
+ a = element("a");
+ t0 = text(t0_value);
+ t1 = space();
+ attr(a, "href", "javascript:void(0)");
+ },
+
+ m(target, anchor) {
+ insert(target, li, anchor);
+ append(li, a);
+ append(a, t0);
+ append(li, t1);
+ },
+
+ p(changed, ctx) {
+ if ((changed.currentAction) && t0_value !== (t0_value = ctx.tag + "")) {
+ set_data(t0, t0_value);
+ }
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(li);
+ }
+ }
+ };
+ }
+
+ // (386:6) {#if config.playground.enabled}
+ function create_if_block_1$8(ctx) {
+ var if_block_anchor, current;
+
+ var if_block = (ctx.environment.playground !== false) && create_if_block_2$4(ctx);
+
+ return {
+ c() {
+ if (if_block) if_block.c();
+ if_block_anchor = empty();
+ },
+
+ m(target, anchor) {
+ if (if_block) if_block.m(target, anchor);
+ insert(target, if_block_anchor, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if (ctx.environment.playground !== false) {
+ if (if_block) {
+ if_block.p(changed, ctx);
+ transition_in(if_block, 1);
+ } else {
+ if_block = create_if_block_2$4(ctx);
+ if_block.c();
+ transition_in(if_block, 1);
+ if_block.m(if_block_anchor.parentNode, if_block_anchor);
+ }
+ } else if (if_block) {
+ group_outros();
+ transition_out(if_block, 1, 1, () => {
+ if_block = null;
+ });
+ check_outros();
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(if_block);
+ current = true;
+ },
+
+ o(local) {
+ transition_out(if_block);
+ current = false;
+ },
+
+ d(detaching) {
+ if (if_block) if_block.d(detaching);
+
+ if (detaching) {
+ detach(if_block_anchor);
+ }
+ }
+ };
+ }
+
+ // (387:8) {#if environment.playground !== false}
+ function create_if_block_2$4(ctx) {
+ var current;
+
+ var playgroundpanel = new PlaygroundPanel({
+ props: {
+ currentAction: ctx.currentAction,
+ environments: ctx.config.playground.environments,
+ currentSample: sample(ctx.currentAction),
+ requestHeaders: headersMap(ctx.currentAction),
+ requestParameters: parametersMap(ctx.currentAction),
+ requestBody: bodyMap(ctx.currentAction)
+ }
+ });
+
+ return {
+ c() {
+ playgroundpanel.$$.fragment.c();
+ },
+
+ m(target, anchor) {
+ mount_component(playgroundpanel, target, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ var playgroundpanel_changes = {};
+ if (changed.currentAction) playgroundpanel_changes.currentAction = ctx.currentAction;
+ if (changed.config) playgroundpanel_changes.environments = ctx.config.playground.environments;
+ if (changed.currentAction) playgroundpanel_changes.currentSample = sample(ctx.currentAction);
+ if (changed.currentAction) playgroundpanel_changes.requestHeaders = headersMap(ctx.currentAction);
+ if (changed.currentAction) playgroundpanel_changes.requestParameters = parametersMap(ctx.currentAction);
+ if (changed.currentAction) playgroundpanel_changes.requestBody = bodyMap(ctx.currentAction);
+ playgroundpanel.$set(playgroundpanel_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(playgroundpanel.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(playgroundpanel.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ destroy_component(playgroundpanel, detaching);
+ }
+ };
+ }
+
+ // (400:6) {#each currentAction.transactions as { request, response }
+ function create_each_block$6(ctx) {
+ var current;
+
+ var scenariopanel = new ScenarioPanel({
+ props: {
+ show: ctx.index === 0,
+ request: ctx.request,
+ response: ctx.response,
+ index: ctx.index,
+ count: ctx.currentAction.transactions.length
+ }
+ });
+
+ return {
+ c() {
+ scenariopanel.$$.fragment.c();
+ },
+
+ m(target, anchor) {
+ mount_component(scenariopanel, target, anchor);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ var scenariopanel_changes = {};
+ if (changed.currentAction) scenariopanel_changes.request = ctx.request;
+ if (changed.currentAction) scenariopanel_changes.response = ctx.response;
+ if (changed.currentAction) scenariopanel_changes.count = ctx.currentAction.transactions.length;
+ scenariopanel.$set(scenariopanel_changes);
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(scenariopanel.$$.fragment, local);
+
+ current = true;
+ },
+
+ o(local) {
+ transition_out(scenariopanel.$$.fragment, local);
+ current = false;
+ },
+
+ d(detaching) {
+ destroy_component(scenariopanel, detaching);
+ }
+ };
+ }
+
+ function create_fragment$i(ctx) {
+ var nav, div0, a0, span0, t0, span1, t1, t2, a1, t5, div2, div1, t6, div6, div4, t7, div3, t8, t9, div5, t10, t11, footer, div7, p, strong, t12, t13, a2, current, dispose;
+
+ var if_block0 = (ctx.config.playground.enabled) && create_if_block_6$1(ctx);
+
+ var menupanel = new MenuPanel({
+ props: {
+ tagActions: ctx.tagActions,
+ tagHeaders: toc(ctx.description),
+ currentSlug: ctx.currentAction && ctx.currentAction.slug,
+ actionsCount: ctx.actions.length,
+ isCollapsed: ctx.collapsed,
+ config: ctx.config,
+ handleClick: ctx.handleClick,
+ tocClick: ctx.tocClick,
+ searchClick: ctx.searchClick
+ }
+ });
+
+ var if_block1 = (ctx.collapsed) && create_if_block_5$1(ctx);
+
+ var if_block2 = (!ctx.collapsed) && create_if_block_4$1(ctx);
+
+ var if_block3 = (ctx.index === -1) && create_if_block_3$2(ctx);
+
+ var if_block4 = (ctx.currentAction) && create_if_block$b(ctx);
+
+ return {
+ c() {
+ nav = element("nav");
+ div0 = element("div");
+ a0 = element("a");
+ span0 = element("span");
+ span0.innerHTML = `<i class="fas fa-lg fa-chalkboard"></i>`;
+ t0 = space();
+ span1 = element("span");
+ t1 = text(ctx.title);
+ t2 = space();
+ a1 = element("a");
+ a1.innerHTML = `<span aria-hidden="true"></span> <span aria-hidden="true"></span> <span aria-hidden="true"></span>`;
+ t5 = space();
+ div2 = element("div");
+ div1 = element("div");
+ if (if_block0) if_block0.c();
+ t6 = space();
+ div6 = element("div");
+ div4 = element("div");
+ menupanel.$$.fragment.c();
+ t7 = space();
+ div3 = element("div");
+ if (if_block1) if_block1.c();
+ t8 = space();
+ if (if_block2) if_block2.c();
+ t9 = space();
+ div5 = element("div");
+ if (if_block3) if_block3.c();
+ t10 = space();
+ if (if_block4) if_block4.c();
+ t11 = space();
+ footer = element("footer");
+ div7 = element("div");
+ p = element("p");
+ strong = element("strong");
+ t12 = text(ctx.title);
+ t13 = text("\n powered by\n ");
+ a2 = element("a");
+ a2.innerHTML = `<strong>Snowboard.</strong>`;
+ attr(span0, "class", "icon icon-brand is-medium has-text-grey-light svelte-t5bxdu");
+ attr(span1, "class", "title is-4");
+ attr(a0, "href", "javascript:void(0)");
+ attr(a0, "class", "navbar-item");
+ attr(a1, "href", "javascript:void(0)");
+ attr(a1, "role", "button");
+ attr(a1, "class", "navbar-burger");
+ attr(a1, "aria-label", "menu");
+ attr(a1, "aria-expanded", "false");
+ attr(a1, "data-target", "mainnav");
+ attr(div0, "class", "navbar-brand");
+ attr(div1, "class", "navbar-end");
+ attr(div2, "class", "navbar-menu");
+ attr(nav, "class", "navbar is-fixed-top has-shadow");
+ attr(nav, "role", "navigation");
+ attr(nav, "aria-label", "main navigation");
+ attr(div3, "class", "menu-collapsible svelte-t5bxdu");
+ attr(div4, "class", "column is-one-quarter sidenav svelte-t5bxdu");
+ attr(div4, "id", "mainnav");
+ toggle_class(div4, "is-hidden-mobile", ctx.showMenu);
+ attr(div5, "class", "column is-three-quarters main svelte-t5bxdu");
+ attr(div6, "class", "columns svelte-t5bxdu");
+ toggle_class(div6, "is-collapsed", ctx.collapsed);
+ attr(a2, "href", "https://github.com/bukalapak/snowboard");
+ attr(a2, "target", "_blank");
+ attr(div7, "class", "content column is-paddingless has-text-centered svelte-t5bxdu");
+ toggle_class(div7, "is-offset-one-quarter", !ctx.collapsed);
+ attr(footer, "class", "footer svelte-t5bxdu");
+
+ dispose = [
+ listen(a1, "click", ctx.burgerClick),
+ listen(div3, "click", ctx.collapseToggle)
+ ];
+ },
+
+ m(target, anchor) {
+ insert(target, nav, anchor);
+ append(nav, div0);
+ append(div0, a0);
+ append(a0, span0);
+ append(a0, t0);
+ append(a0, span1);
+ append(span1, t1);
+ append(div0, t2);
+ append(div0, a1);
+ append(nav, t5);
+ append(nav, div2);
+ append(div2, div1);
+ if (if_block0) if_block0.m(div1, null);
+ insert(target, t6, anchor);
+ insert(target, div6, anchor);
+ append(div6, div4);
+ mount_component(menupanel, div4, null);
+ append(div4, t7);
+ append(div4, div3);
+ if (if_block1) if_block1.m(div3, null);
+ append(div3, t8);
+ if (if_block2) if_block2.m(div3, null);
+ append(div6, t9);
+ append(div6, div5);
+ if (if_block3) if_block3.m(div5, null);
+ append(div5, t10);
+ if (if_block4) if_block4.m(div5, null);
+ insert(target, t11, anchor);
+ insert(target, footer, anchor);
+ append(footer, div7);
+ append(div7, p);
+ append(p, strong);
+ append(strong, t12);
+ append(p, t13);
+ append(p, a2);
+ current = true;
+ },
+
+ p(changed, ctx) {
+ if (!current || changed.title) {
+ set_data(t1, ctx.title);
+ }
+
+ if (ctx.config.playground.enabled) {
+ if (if_block0) {
+ if_block0.p(changed, ctx);
+ transition_in(if_block0, 1);
+ } else {
+ if_block0 = create_if_block_6$1(ctx);
+ if_block0.c();
+ transition_in(if_block0, 1);
+ if_block0.m(div1, null);
+ }
+ } else if (if_block0) {
+ group_outros();
+ transition_out(if_block0, 1, 1, () => {
+ if_block0 = null;
+ });
+ check_outros();
+ }
+
+ var menupanel_changes = {};
+ if (changed.tagActions) menupanel_changes.tagActions = ctx.tagActions;
+ if (changed.description) menupanel_changes.tagHeaders = toc(ctx.description);
+ if (changed.currentAction) menupanel_changes.currentSlug = ctx.currentAction && ctx.currentAction.slug;
+ if (changed.actions) menupanel_changes.actionsCount = ctx.actions.length;
+ if (changed.collapsed) menupanel_changes.isCollapsed = ctx.collapsed;
+ if (changed.config) menupanel_changes.config = ctx.config;
+ menupanel.$set(menupanel_changes);
+
+ if (ctx.collapsed) {
+ if (!if_block1) {
+ if_block1 = create_if_block_5$1(ctx);
+ if_block1.c();
+ if_block1.m(div3, t8);
+ }
+ } else if (if_block1) {
+ if_block1.d(1);
+ if_block1 = null;
+ }
+
+ if (!ctx.collapsed) {
+ if (!if_block2) {
+ if_block2 = create_if_block_4$1(ctx);
+ if_block2.c();
+ if_block2.m(div3, null);
+ }
+ } else if (if_block2) {
+ if_block2.d(1);
+ if_block2 = null;
+ }
+
+ if (changed.showMenu) {
+ toggle_class(div4, "is-hidden-mobile", ctx.showMenu);
+ }
+
+ if (ctx.index === -1) {
+ if (if_block3) {
+ if_block3.p(changed, ctx);
+ } else {
+ if_block3 = create_if_block_3$2(ctx);
+ if_block3.c();
+ if_block3.m(div5, t10);
+ }
+ } else if (if_block3) {
+ if_block3.d(1);
+ if_block3 = null;
+ }
+
+ if (ctx.currentAction) {
+ if (if_block4) {
+ if_block4.p(changed, ctx);
+ transition_in(if_block4, 1);
+ } else {
+ if_block4 = create_if_block$b(ctx);
+ if_block4.c();
+ transition_in(if_block4, 1);
+ if_block4.m(div5, null);
+ }
+ } else if (if_block4) {
+ group_outros();
+ transition_out(if_block4, 1, 1, () => {
+ if_block4 = null;
+ });
+ check_outros();
+ }
+
+ if (changed.collapsed) {
+ toggle_class(div6, "is-collapsed", ctx.collapsed);
+ }
+
+ if (!current || changed.title) {
+ set_data(t12, ctx.title);
+ }
+
+ if (changed.collapsed) {
+ toggle_class(div7, "is-offset-one-quarter", !ctx.collapsed);
+ }
+ },
+
+ i(local) {
+ if (current) return;
+ transition_in(if_block0);
+
+ transition_in(menupanel.$$.fragment, local);
+
+ transition_in(if_block4);
+ current = true;
+ },
+
+ o(local) {
+ transition_out(if_block0);
+ transition_out(menupanel.$$.fragment, local);
+ transition_out(if_block4);
+ current = false;
+ },
+
+ d(detaching) {
+ if (detaching) {
+ detach(nav);
+ }
+
+ if (if_block0) if_block0.d();
+
+ if (detaching) {
+ detach(t6);
+ detach(div6);
+ }
+
+ destroy_component(menupanel);
+
+ if (if_block1) if_block1.d();
+ if (if_block2) if_block2.d();
+ if (if_block3) if_block3.d();
+ if (if_block4) if_block4.d();
+
+ if (detaching) {
+ detach(t11);
+ detach(footer);
+ }
+
+ run_all(dispose);
+ }
+ };
+ }
+
+ function sample(action) {
+ return action.transactions[0].request;
+ }
+
+ function headersMap(action) {
+ return sample(action)
+ .headers.filter(header => header.name != "Authorization")
+ .map(header => {
+ return {
+ used: true,
+ required: false,
+ name: header.name,
+ value: header.example || ""
+ };
+ });
+ }
+
+ function parametersMap(action) {
+ return action.parameters.map(param => {
+ return {
+ used: param.required,
+ required: param.required,
+ name: param.name,
+ value: param.example || ""
+ };
+ });
+ }
+
+ function bodyMap(action) {
+ const example = sample(action).example;
+ return stringify$2(example);
+ }
+
+ function instance$i($$self, $$props, $$invalidate) {
+ let $env;
+
+ component_subscribe($$self, env, $$value => { $env = $$value; $$invalidate('$env', $env); });
+
+
+
+ let { title, description, actions, tagActions, config } = $$props;
+
+ let index = -1;
+
+ function handleClick(event) {
+ let target = event.target;
+
+ if (target.nodeName == "SPAN") {
+ target = target.parentElement;
+ }
+
+ const slug = target.dataset["slug"];
+ $$invalidate('index', index = actions.findIndex(el => el.slug === slug));
+
+ document.body.scrollTop = document.documentElement.scrollTop = 0;
+ }
+
+ function tocClick(event) {
+ $$invalidate('index', index = -1);
+ let href = event.target.getAttribute("href");
+ pushHistory(href);
+ }
+
+ if (config.playground.enabled) {
+ const savedEnv = getEnv();
+
+ if (
+ savedEnv &&
+ Object.keys(config.playground.environments).includes(savedEnv)
+ ) {
+ env.set(savedEnv);
+ } else {
+ env.set(config.playground.env);
+ }
+
+ const authToken = getToken($env);
+
+ if (authToken) {
+ auth.add($env);
+ token.set(authToken);
+ }
+ }
+
+ let showMenu = true;
+ let collapsed = false;
+ let authenticating = false;
+
+ function burgerClick() {
+ $$invalidate('showMenu', showMenu = !showMenu);
+ }
+
+ function collapseToggle() {
+ $$invalidate('collapsed', collapsed = !collapsed);
+ }
+
+ function searchClick() {
+ collapseToggle();
+
+ const searchInput = document.getElementById("search-input-text");
+ if (searchInput) {
+ searchInput.focus();
+ }
+ }
+
+ onMount(async () => {
+ // handle oauth2 callback
+ if (isAuth(environment, "oauth2")) {
+ const authParam = querystringify_1.parse(location.search);
+
+ if (authParam.code) {
+ $$invalidate('authenticating', authenticating = true);
+
+ pushHistory(basePath(config));
+
+ const { accessToken, refreshToken } = await exchangeToken(
+ authParam.code,
+ environment.auth.options
+ );
+
+ if (accessToken) {
+ setToken($env, accessToken);
+ auth.add($env);
+ token.set(accessToken);
+
+ if (refreshToken) {
+ setRefreshToken($env, refreshToken);
+ }
+ }
+
+ $$invalidate('authenticating', authenticating = false);
+ }
+ }
+
+ // handle permalink
+ const hash = location.hash;
+
+ if (hash.match("#/")) {
+ const slug = hash.replace("#/", "");
+ $$invalidate('index', index = actions.findIndex(el => el.slug === slug));
+ }
+ });
+
+ document.onkeyup = function(e) {
+ if ((e.which || e.keyCode) == 219) {
+ collapseToggle();
+ }
+ };
+
+ $$self.$set = $$props => {
+ if ('title' in $$props) $$invalidate('title', title = $$props.title);
+ if ('description' in $$props) $$invalidate('description', description = $$props.description);
+ if ('actions' in $$props) $$invalidate('actions', actions = $$props.actions);
+ if ('tagActions' in $$props) $$invalidate('tagActions', tagActions = $$props.tagActions);
+ if ('config' in $$props) $$invalidate('config', config = $$props.config);
+ };
+
+ let currentAction, environment;
+
+ $$self.$$.update = ($$dirty = { actions: 1, index: 1, currentAction: 1, title: 1, config: 1, $env: 1 }) => {
+ if ($$dirty.actions || $$dirty.index) { $$invalidate('currentAction', currentAction = actions[index]); }
+ if ($$dirty.currentAction || $$dirty.title) { {
+ document.title =
+ (currentAction && `${currentAction.title} - ${title}`) || title;
+ } }
+ if ($$dirty.config || $$dirty.$env) { $$invalidate('environment', environment =
+ config.playground.enabled && config.playground.environments[$env]); }
+ };
+
+ return {
+ title,
+ description,
+ actions,
+ tagActions,
+ config,
+ index,
+ handleClick,
+ tocClick,
+ showMenu,
+ collapsed,
+ authenticating,
+ burgerClick,
+ collapseToggle,
+ searchClick,
+ currentAction,
+ environment
+ };
+ }
+
+ class Winter extends SvelteComponent {
+ constructor(options) {
+ super();
+ if (!document_1.getElementById("svelte-t5bxdu-style")) add_css$9();
+ init(this, options, instance$i, create_fragment$i, safe_not_equal, ["title", "description", "actions", "tagActions", "config"]);
+ }
+ }
+
+ const app = new Winter({
+ target: document.body,
+ props: {"title":"mailcow API","description":"mailcow is complete e-mailing solution with advanced antispam, antivirus, nice UI and API.\n\nIn order to use this API you have to create a API key and add your IP Address to the whitelist of allowed IPs this can be done by logging into the Mailcow UI using your admin account, then on the Access page under confirmation & Details scroll down to API.\n\n**This documentation is in Work In Progress status. It contains only few endpoints.**","version":"","servers":[{"url":"https://mailcow.host/"}],"tags":[{"title":"Domains","description":"","children":[{"title":"List all domains","description":"","children":[]},{"title":"Create new domain","description":"","children":[]},{"title":"Update domain","description":"","children":[]},{"title":"Delete domain","description":"","children":[]}]},{"title":"Domain antispam policies","description":"You can create antispam whitelist and blacklist policies","children":[{"title":"List whitelist domain policy","description":"","children":[]},{"title":"List blacklist domain policy","description":"","children":[]},{"title":"Create domain policy","description":"","children":[]},{"title":"Delete domain policy","description":"","children":[]}]},{"title":"Mailboxes","description":"","children":[{"title":"List all mailboxes","description":"","children":[]},{"title":"Create mailbox","description":"","children":[]},{"title":"Update mailbox","description":"","children":[]},{"title":"Delete mailbox","description":"","children":[]},{"title":"Quarantine Notifications","description":"","children":[]}]},{"title":"Aliases","description":"","children":[{"title":"List all aliases","description":"","children":[]},{"title":"Create alias","description":"","children":[]},{"title":"Update alias","description":"","children":[]},{"title":"Delete alias","description":"","children":[]}]},{"title":"Sync jobs","description":"","children":[{"title":"List all sync jobs","description":"","children":[]},{"title":"Create sync job","description":"","children":[]},{"title":"Update sync job","description":"","children":[]},{"title":"Delete sync job","description":"","children":[]}]},{"title":"Fordwarding Hosts","description":"","children":[{"title":"Get Forwarding Hosts","description":"","children":[]},{"title":"Add Forward Host","description":"","children":[]}]},{"title":"Logs","description":"","children":[{"title":"Get Postfix logs","description":"","children":[]},{"title":"Get Rspamd logs","description":"","children":[]},{"title":"Get Dovecot logs","description":"","children":[]},{"title":"Get ACME logs","description":"","children":[]},{"title":"Get SOGo logs","description":"","children":[]},{"title":"Get Watchdog logs","description":"","children":[]},{"title":"Get Api logs","description":"","children":[]},{"title":"Get Ratelimit logs","description":"","children":[]},{"title":"Get Netfilter logs","description":"","children":[]},{"title":"Get Autodiscover logs","description":"","children":[]}]},{"title":"Queue Manager","description":"","children":[{"title":"Get Queue","description":"","children":[]},{"title":"Flush Queue","description":"","children":[]},{"title":"Delete Queue","description":"","children":[]}]},{"title":"Quarantine","description":"","children":[{"title":"Get mails in Quarantine","description":"","children":[]}]},{"title":"Fail2Ban","description":"","children":[{"title":"Get Fail2Ban Config","description":"","children":[]}]},{"title":"DKIM","description":"","children":[{"title":"Generate DKIM Key","description":"","children":[]},{"title":"Duplicate DKIM Key","description":"","children":[]},{"title":"Delete DKIM Key","description":"","children":[]}]},{"title":"Domain admin","description":"","children":[{"title":"Get list Domain Admins","description":"","children":[]},{"title":"Create Domain Admin user","description":"","children":[]},{"title":"Delete Domain Admin","description":"","children":[]}]},{"title":"Address Rewriting","description":"","children":[{"title":"Get BCC Map","description":"","children":[]},{"title":"Create BCC Map","description":"","children":[]},{"title":"Delete BCC Map","description":"","children":[]},{"title":"Get Recipient Map","description":"","children":[]},{"title":"Create Recipient Map","description":"","children":[]},{"title":"Delete Recipient Map","description":"","children":[]}]},{"title":"Outgoing TLS Policy Map Overrides","description":"","children":[{"title":"Get TLS Policy Map","description":"","children":[]},{"title":"Create TLS Policy Map","description":"","children":[]},{"title":"Delete TLS Policy Map","description":"","children":[]}]}],"actions":[{"title":"List all domains","path":"/api/v1/get/domain/all","pathTemplate":"/api/v1/get/domain/all","slug":"get~api~v1~get~domain~all","method":"get","description":"\nYou can list all domains existing in system.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"max_new_mailbox_quota\": 10737418240,\n \"def_new_mailbox_quota\": 3221225472,\n \"quota_used_in_domain\": \"0\",\n \"mboxes_in_domain\": 0,\n \"mboxes_left\": 10,\n \"domain_name\": \"domain.tld\",\n \"description\": \"Some description\",\n \"max_num_aliases_for_domain\": 400,\n \"max_num_mboxes_for_domain\": 10,\n \"def_quota_for_mbox\": 3221225472,\n \"max_quota_for_mbox\": 10737418240,\n \"max_quota_for_domain\": 10737418240,\n \"relayhost\": \"0\",\n \"backupmx\": \"&#10008;\",\n \"gal\": \"&#10008;\",\n \"backupmx_int\": 0,\n \"gal_int\": 0,\n \"lang\": \"en\",\n \"rl\": false,\n \"active\": \"&#10004;\",\n \"active_int\": 1,\n \"relay_all_recipients\": \"&#10008;\",\n \"relay_all_recipients_int\": 0,\n \"aliases_in_domain\": 0,\n \"aliases_left\": 400\n },\n {\n \"max_new_mailbox_quota\": 10737418240,\n \"def_new_mailbox_quota\": 3221225472,\n \"quota_used_in_domain\": \"0\",\n \"mboxes_in_domain\": 0,\n \"mboxes_left\": 10,\n \"domain_name\": \"domain2.tld\",\n \"description\": \"domain description\",\n \"max_num_aliases_for_domain\": 400,\n \"max_num_mboxes_for_domain\": 10,\n \"def_quota_for_mbox\": 3221225472,\n \"max_quota_for_mbox\": 10737418240,\n \"max_quota_for_domain\": 10737418240,\n \"relayhost\": \"0\",\n \"backupmx\": \"&#10004;\",\n \"gal\": \"&#10008;\",\n \"backupmx_int\": 1,\n \"gal_int\": 0,\n \"lang\": \"cs\",\n \"rl\": false,\n \"active\": \"&#10004;\",\n \"active_int\": 1,\n \"relay_all_recipients\": \"&#10008;\",\n \"relay_all_recipients_int\": 0,\n \"aliases_in_domain\": 0,\n \"aliases_left\": 400\n }\n]\n","schema":""}}],"tags":["Domains","List all domains"]},{"title":"Create new domain","path":"/api/v1/add/domain","pathTemplate":"/api/v1/add/domain","slug":"post~api~v1~add~domain","method":"post","description":"\nYou may create your own domain using this action. It takes a JSON object containing a domain informations.","parameters":[],"transactions":[{"request":{"title":"","description":"You can also define rate limiting. If `rl_value` is not empty string, them ratelimit object is created and returned in response.","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"domain","description":"Fully qualified domain name","required":false,"members":[],"schema":{"type":"string"}},{"key":"description","description":"Description of domain","required":false,"members":[],"schema":{"type":"string"}},{"key":"aliases","description":"limit count of aliases associated with this domain","required":false,"members":[],"schema":{"type":"number"}},{"key":"mailboxes","description":"limit count of mailboxes associated with this domain","required":false,"members":[],"schema":{"type":"number"}},{"key":"defquota","description":"predefined mailbox quota in `add mailbox` form","required":false,"members":[],"schema":{"type":"number"}},{"key":"maxquota","description":"maximum quota per mailbox","required":false,"members":[],"schema":{"type":"number"}},{"key":"quota","description":"maximum quota for this domain (for all mailboxes in sum)","required":false,"members":[],"schema":{"type":"number"}},{"key":"active","description":"is domain active or not","required":false,"members":[],"schema":{"type":"boolean"}},{"key":"rl_value","description":"rate limit value","required":false,"members":[],"schema":{"type":"number"}},{"key":"rl_frame","required":false,"members":[],"schema":{"type":"enum"}},{"key":"backupmx","description":"relay domain or not","required":false,"members":[],"schema":{"type":"boolean"}},{"key":"relay_all_recipients","description":"if not, them you have to create \"dummy\" mailbox for each address to relay","required":false,"members":[],"schema":{"type":"boolean"}},{"key":"lang","description":"language code","required":false,"members":[],"schema":{"type":"enum"}}]},"example":"{\n \"domain\":\"domain.tld\",\n \"description\":\"some decsription\",\n \"aliases\":\"400\",\n \"mailboxes\":\"10\",\n \"defquota\":\"3072\",\n \"maxquota\":\"10240\",\n \"quota\":\"10240\",\n \"active\":\"1\",\n \"rl_value\":\"10\",\n \"rl_frame\":\"s\",\n \"backupmx\":\"0\",\n \"relay_all_recipients\":\"0\",\n \"lang\":\"cs\"\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"domain\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"aliases\": {\n \"type\": \"number\"\n },\n \"mailboxes\": {\n \"type\": \"number\"\n },\n \"defquota\": {\n \"type\": \"number\"\n },\n \"maxquota\": {\n \"type\": \"number\"\n },\n \"quota\": {\n \"type\": \"number\"\n },\n \"active\": {\n \"type\": \"boolean\"\n },\n \"rl_value\": {\n \"type\": \"number\"\n },\n \"rl_frame\": {\n \"enum\": [\n \"s\",\n \"m\",\n \"h\"\n ]\n },\n \"backupmx\": {\n \"type\": \"boolean\"\n },\n \"relay_all_recipients\": {\n \"type\": \"boolean\"\n },\n \"lang\": {\n \"enum\": [\n \"sk\",\n \"cs\",\n \"de\",\n \"en\",\n \"es\",\n \"fr\",\n \"lv\",\n \"nl\",\n \"pl\",\n \"pt\",\n \"ru\",\n \"it\",\n \"ca\"\n ]\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":" [\n {\n \"type\": \"success\",\n \"log\": [\n \"ratelimit\",\n \"edit\",\n \"domain\",\n {\n \"rl_value\": \"10\",\n \"rl_frame\": \"s\",\n \"object\": \"domain.tld\"\n }\n ],\n \"msg\": [\n \"rl_saved\",\n \"domain.tld\"\n ]\n },\n {\n \"type\": \"success\",\n \"log\": [\n \"mailbox\",\n \"add\",\n \"domain\",\n {\n \"domain\": \"domain.tld\",\n \"description\": \"some decsription\",\n \"aliases\": \"400\",\n \"mailboxes\": \"10\",\n \"defquota\": \"3072\",\n \"maxquota\": \"10240\",\n \"quota\": \"10240\",\n \"active\": \"1\",\n \"rl_value\": \"10\",\n \"rl_frame\": \"s\",\n \"backupmx\": \"0\",\n \"relay_all_recipients\": \"0\",\n \"lang\":\"cs\"\n },\n null\n ],\n \"msg\": [\n \"domain_added\",\n \"domain.tld\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Domains","Create new domain"]},{"title":"Update domain","path":"/api/v1/edit/domain","pathTemplate":"/api/v1/edit/domain","slug":"post~api~v1~edit~domain","method":"post","description":"\nYou can update one or more domains per request. You can also send just attributes you want to change. \nExample: You can add domain names to items list and in attr object just include `\"active\": \"0\"` to deactivate domains.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"items","value":["domain_name"],"description":"contains list of domain names you want update","required":false,"members":[],"schema":{"type":"array"}},{"key":"attr","value":{},"required":false,"members":[],"schema":{"type":"object"}}]},"example":"{\n \"items\":[\n \"domain.tld\"\n ],\n \"attr\":{\n \"description\":\"domain description\",\n \"aliases\":\"400\",\n \"mailboxes\":\"10\",\n \"defquota\":\"3072\",\n \"maxquota\":\"10240\",\n \"quota\":\"10240\",\n \"active\":\"1\",\n \"gal\":\"1\",\n \"relayhost\":\"2\",\n \"backupmx\":\"1\",\n \"relay_all_recipients\":\"0\",\n \"lang\":\"cs\"\n }\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"items\": {\n \"type\": \"array\"\n },\n \"attr\": {\n \"type\": \"object\",\n \"properties\": {\n \"description\": {\n \"type\": \"string\"\n },\n \"aliases\": {\n \"type\": \"number\"\n },\n \"mailboxes\": {\n \"type\": \"number\"\n },\n \"defquota\": {\n \"type\": \"number\"\n },\n \"maxquota\": {\n \"type\": \"number\"\n },\n \"quota\": {\n \"type\": \"number\"\n },\n \"active\": {\n \"type\": \"boolean\"\n },\n \"gal\": {\n \"type\": \"boolean\"\n },\n \"relayhost\": {\n \"type\": \"number\"\n },\n \"backupmx\": {\n \"type\": \"boolean\"\n },\n \"relay_all_recipients\": {\n \"type\": \"boolean\"\n },\n \"lang\": {\n \"enum\": [\n \"sk\",\n \"cs\",\n \"de\",\n \"en\",\n \"es\",\n \"fr\",\n \"lv\",\n \"nl\",\n \"pl\",\n \"pt\",\n \"ru\",\n \"it\",\n \"ca\"\n ]\n }\n }\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\":\"success\",\n \"log\":[\n \"mailbox\",\n \"edit\",\n \"domain\",\n {\n \"domain\":[\n \"domain.tld\"\n ],\n \"description\":\"domain description\",\n \"aliases\":\"400\",\n \"mailboxes\":\"10\",\n \"defquota\":\"3072\",\n \"maxquota\":\"10240\",\n \"quota\":\"10240\",\n \"active\":\"1\",\n \"gal\":\"1\",\n \"relayhost\":\"2\",\n \"backupmx\":\"1\",\n \"relay_all_recipients\":\"0\",\n \"lang:\"cs\"\n },\n null\n ],\n \"msg\":[\n \"domain_modified\",\n \"domain.tld\"\n ]\n }\n] \n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Domains","Update domain"]},{"title":"Delete domain","path":"/api/v1/delete/domain","pathTemplate":"/api/v1/delete/domain","slug":"post~api~v1~delete~domain","method":"post","description":"\nYou can delete one or more domains.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"items","value":["domain_name"],"description":"contains list of domains you want to delete","required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n \"domain.tld\",\n \"domain2.tld\"\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"items\": {\n \"type\": \"array\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\":\"success\",\n \"log\":[\n \"mailbox\",\n \"delete\",\n \"domain\",\n {\n \"domain\":[\n \"domain.tld\",\n \"domain2.tld\"\n ]\n },\n null\n ],\n \"msg\":[\n \"domain_removed\",\n \"domain.tld\"\n ]\n },\n {\n \"type\":\"success\",\n \"log\":[\n \"mailbox\",\n \"delete\",\n \"domain\",\n {\n \"domain\":[\n \"domain.tld\",\n \"domain2.tld\"\n ]\n },\n null\n ],\n \"msg\":[\n \"domain_removed\",\n \"domain2.tld\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Domains","Delete domain"]},{"title":"List whitelist domain policy","path":"/api/v1/get/policy_wl_domain/{domain}","pathTemplate":"/api/v1/get/policy_wl_domain/{domain}","slug":"get~api~v1~get~policy~wl~domain~domain","method":"get","description":"\nYou can list all whitelist policies per domain.","parameters":[{"location":"path","name":"domain","description":"name of domain","required":true,"schema":{"type":"string"}}],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"object\": \"domain.tld\",\n \"value\": \"*@gooddomain.tld\",\n \"prefid\": 1\n }\n]\n","schema":""}}],"tags":["Domain antispam policies","List whitelist domain policy"]},{"title":"List blacklist domain policy","path":"/api/v1/get/policy_bl_domain/{domain}","pathTemplate":"/api/v1/get/policy_bl_domain/{domain}","slug":"get~api~v1~get~policy~bl~domain~domain","method":"get","description":"\nYou can list all blacklist policies per domain.","parameters":[{"location":"path","name":"domain","description":"name of domain","required":true,"schema":{"type":"string"}}],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"object\": \"domain.tld\",\n \"value\": \"*@baddomain.tld\",\n \"prefid\": 2\n }\n]\n","schema":""}}],"tags":["Domain antispam policies","List blacklist domain policy"]},{"title":"Create domain policy","path":"/api/v1/add/domain-policy","pathTemplate":"/api/v1/add/domain-policy","slug":"post~api~v1~add~domain-policy","method":"post","description":"\nYou may create your own domain policy using this action. It takes a JSON object containing a domain informations.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"domain","description":"domain name to which policy is associated to","required":false,"members":[],"schema":{"type":"string"}},{"key":"object_list","required":false,"members":[],"schema":{"type":"enum"}},{"key":"object_from","description":"exact address or use wildcard to match whole domain","required":false,"members":[],"schema":{"type":"string"}}]},"example":"{\n \"domain\":\"domain.tld\",\n \"object_list\":\"bl\",\n \"object_from\":\"*@baddomain.tld\"\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"domain\": {\n \"type\": \"string\"\n },\n \"object_list\": {\n \"enum\": [\n \"wl\",\n \"bl\"\n ]\n },\n \"object_from\": {\n \"type\": \"string\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\":\"success\",\n \"log\":[\n \"policy\",\n \"add\",\n \"domain\",\n {\n \"domain\":\"domain.tld\",\n \"object_list\":\"bl\",\n \"object_from\":\"*@baddomain.tld\"\n }\n ],\n \"msg\":[\n \"domain_modified\",\n \"domain.tld\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Domain antispam policies","Create domain policy"]},{"title":"Delete domain policy","path":"/api/v1/delete/domain-policy","pathTemplate":"/api/v1/delete/domain-policy","slug":"post~api~v1~delete~domain-policy","method":"post","description":"\nYou can delete one o more domain policies.","parameters":[],"transactions":[{"request":{"title":"","description":"Delete domain policy by ID","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"items","value":["id"],"description":"contains list of domain policys you want to delete","required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n \"1\",\n \"2\"\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"items\": {\n \"type\": \"array\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":" [\n {\n \"type\":\"success\",\n \"log\":[\n \"policy\",\n \"delete\",\n \"domain\",\n {\n \"prefid\":[\n \"1\",\n \"2\"\n ]\n }\n ],\n \"msg\":[\n \"item_deleted\",\n \"1\"\n ]\n },\n {\n \"type\":\"success\",\n \"log\":[\n \"policy\",\n \"delete\",\n \"domain\",\n {\n \"prefid\":[\n \"1\",\n \"2\"\n ]\n }\n ],\n \"msg\":[\n \"item_deleted\",\n \"2\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Domain antispam policies","Delete domain policy"]},{"title":"List all mailboxes","path":"/api/v1/get/mailbox/all","pathTemplate":"/api/v1/get/mailbox/all","slug":"get~api~v1~get~mailbox~all","method":"get","description":"\nYou can list all mailboxes existing in system.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"max_new_quota\":10737418240,\n \"username\":\"info@doman3.tld\",\n \"rl\":false,\n \"is_relayed\":0,\n \"name\":\"Full name\",\n \"active\":\"&#10004;\",\n \"active_int\":1,\n \"domain\":\"doman3.tld\",\n \"local_part\":\"info\",\n \"quota\":3221225472,\n \"attributes\":{\n \"force_pw_update\":\"0\",\n \"tls_enforce_in\":\"0\",\n \"tls_enforce_out\":\"0\",\n \"sogo_access\":\"1\",\n \"mailbox_format\":\"maildir:\",\n \"quarantine_notification\":\"never\"\n },\n \"quota_used\":0,\n \"percent_in_use\":0,\n \"messages\":0,\n \"spam_aliases\":0,\n \"percent_class\":\"success\"\n }\n]\n","schema":""}}],"tags":["Mailboxes","List all mailboxes"]},{"title":"Create mailbox","path":"/api/v1/add/mailbox","pathTemplate":"/api/v1/add/mailbox","slug":"post~api~v1~add~mailbox","method":"post","description":"\nYou may create your own mailbox using this action. It takes a JSON object containing a domain informations.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"local_part","description":"left part of email address","required":false,"members":[],"schema":{"type":"string"}},{"key":"domain","description":"domain name","required":false,"members":[],"schema":{"type":"string"}},{"key":"name","description":"Full name of the mailbox user","required":false,"members":[],"schema":{"type":"string"}},{"key":"quota","description":"mailbox quota","required":false,"members":[],"schema":{"type":"number"}},{"key":"pasword","description":"mailbox password","required":false,"members":[],"schema":{"type":"string"}},{"key":"password2","description":"mailbox password for confirmation","required":false,"members":[],"schema":{"type":"string"}},{"key":"active","description":"is mailbox active or not","required":false,"members":[],"schema":{"type":"boolean"}}]},"example":"{\n \"local_part\":\"info\",\n \"domain\":\"domain.tld\",\n \"name\":\"Full name\",\n \"quota\":\"3072\",\n \"password\":\"atedismonsin\",\n \"password2\":\"atedismonsin\",\n \"active\":\"1\"\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"local_part\": {\n \"type\": \"string\"\n },\n \"domain\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"quota\": {\n \"type\": \"number\"\n },\n \"pasword\": {\n \"type\": \"string\"\n },\n \"password2\": {\n \"type\": \"string\"\n },\n \"active\": {\n \"type\": \"boolean\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\":\"success\",\n \"log\":[\n \"mailbox\",\n \"add\",\n \"mailbox\",\n {\n \"local_part\":\"info\",\n \"domain\":\"domain.tld\",\n \"name\":\"Full name\",\n \"quota\":\"3072\",\n \"password\":\"*\",\n \"password2\":\"*\",\n \"active\":\"1\"\n },\n null\n ],\n \"msg\":[\n \"mailbox_added\",\n \"info@domain.tld\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Mailboxes","Create mailbox"]},{"title":"Update mailbox","path":"/api/v1/edit/mailbox","pathTemplate":"/api/v1/edit/mailbox","slug":"post~api~v1~edit~mailbox","method":"post","description":"\nYou can update one or more mailboxes per request. You can also send just attributes you want to change","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"items","value":["mailbox_name"],"description":"contains list of mailboxes you want update","required":false,"members":[],"schema":{"type":"array"}},{"key":"attr","value":{"sender_acl":["default","info@domain2.tld","domain3.tld","asterix"]},"required":false,"members":[],"schema":{"type":"object"}}]},"example":"{\n \"items\":[\n \"info@domain.tld\"\n ],\n \"attr\":{\n \"name\":\"Full name\",\n \"quota\":\"3072\",\n \"password\":\"\",\n \"password2\":\"\",\n \"active\":\"1\",\n \"sender_acl\":[\n \"default\",\n \"info@domain2.tld\",\n \"domain3.tld\",\n \"*\"\n ],\n \"force_pw_update\":\"0\",\n \"sogo_access\":\"1\"\n }\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"items\": {\n \"type\": \"array\"\n },\n \"attr\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"quota\": {\n \"type\": \"number\"\n },\n \"pasword\": {\n \"type\": \"string\"\n },\n \"password2\": {\n \"type\": \"string\"\n },\n \"active\": {\n \"type\": \"boolean\"\n },\n \"sender_acl\": {\n \"type\": \"array\"\n },\n \"force_pw_update\": {\n \"type\": \"boolean\"\n },\n \"sogo_access\": {\n \"type\": \"boolean\"\n }\n }\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\":\"success\",\n \"log\":[\n \"mailbox\",\n \"edit\",\n \"mailbox\",\n {\n \"username\":[\n \"info@domain.tld\"\n ],\n \"name\":\"Full name\",\n \"quota\":\"3072\",\n \"password\":\"*\",\n \"password2\":\"*\",\n \"active\":\"1\",\n \"sender_acl\":[\n \"default\",\n \"info@domain2.tld\",\n \"domain3.tld\",\n \"*\"\n ],\n \"force_pw_update\":\"0\",\n \"sogo_access\":\"1\"\n },\n null\n ],\n \"msg\":[\n \"mailbox_modified\",\n \"info@domain.tld\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Mailboxes","Update mailbox"]},{"title":"Delete mailbox","path":"/api/v1/delete/mailbox","pathTemplate":"/api/v1/delete/mailbox","slug":"post~api~v1~delete~mailbox","method":"post","description":"\nYou can delete one or more mailboxes.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"items","value":["local_part@domain"],"description":"contains list of mailboxes you want to delete","required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n \"info@domain.tld\",\n \"sales@domain.tld\"\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"items\": {\n \"type\": \"array\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\":\"success\",\n \"log\":[\n \"mailbox\",\n \"delete\",\n \"mailbox\",\n {\n \"username\":[\n \"info@domain.tld\",\n \"sales@domain.tld\"\n ]\n },\n null\n ],\n \"msg\":[\n \"mailbox_removed\",\n \"info@domain.tld\"\n ]\n },\n {\n \"type\":\"success\",\n \"log\":[\n \"mailbox\",\n \"delete\",\n \"mailbox\",\n {\n \"username\":[\n \"info@domain.tld\",\n \"sales@domain.tld\"\n ]\n },\n null\n ],\n \"msg\":[\n \"mailbox_removed\",\n \"sales@domain.tld\"\n ]\n }\n] \n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Mailboxes","Delete mailbox"]},{"title":"Quarantine Notifications","path":"/api/v1/edit/quarantine_notification","pathTemplate":"/api/v1/edit/quarantine_notification","slug":"post~api~v1~edit~quarantine~notification","method":"post","description":"\nYou can update one or more mailboxes per request.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"items","value":["mailbox_name"],"description":"contains list of mailboxes you want set qurantine notifications","required":false,"members":[],"schema":{"type":"array"}},{"key":"attr","value":{},"required":false,"members":[],"schema":{"type":"object"}}]},"example":"{\n \"items\":[\n \"mailbox1@domain.tld\",\n \"mailbox2@domain.tld\"\n ],\n \"attr\":{\n \"quarantine_notification\":\"hourly\"\n }\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"items\": {\n \"type\": \"array\"\n },\n \"attr\": {\n \"type\": \"object\",\n \"properties\": {\n \"quarantine_notification\": {\n \"enum\": [\n \"hourly\",\n \"daily\",\n \"weekly\",\n \"never\"\n ]\n }\n }\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"","schema":""}}],"tags":["Mailboxes","Quarantine Notifications"]},{"title":"List all aliases","path":"/api/v1/get/alias/all","pathTemplate":"/api/v1/get/alias/all","slug":"get~api~v1~get~alias~all","method":"get","description":"\nYou can list all mailbox aliases existing in system.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"in_primary_domain\": \"\",\n \"id\": 6,\n \"domain\": \"domain.tld\",\n \"public_comment\": null,\n \"private_comment\": null,\n \"goto\": \"destination@domain.tld\",\n \"address\": \"alias@domain.tld\",\n \"is_catch_all\": 0,\n \"active\": \"&#10004;\",\n \"active_int\": 1,\n \"created\": \"2019-04-04 19:29:49\",\n \"modified\": null\n },\n {\n \"in_primary_domain\": \"\",\n \"id\": 10,\n \"domain\": \"domain.tld\",\n \"public_comment\": null,\n \"private_comment\": null,\n \"goto\": \"destination@domain.tld\",\n \"address\": \"@domain.tld\",\n \"is_catch_all\": 1,\n \"active\": \"&#10004;\",\n \"active_int\": 1,\n \"created\": \"2019-04-27 13:42:39\",\n \"modified\": null\n }\n]\n","schema":""}}],"tags":["Aliases","List all aliases"]},{"title":"Create alias","path":"/api/v1/add/alias","pathTemplate":"/api/v1/add/alias","slug":"post~api~v1~add~alias","method":"post","description":"\nYou may create your own mailbox alias using this action. It takes a JSON object containing a domain informations. \nOnly one `goto*` option can be used, for ex. if you want learn as spam, then send just `goto_spam = 1` in request body.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"address","description":"alias address, for catchall use \"@domain.tld\"","required":false,"members":[],"schema":{"type":"string"}},{"key":"goto","description":"destination address, comma separated","required":false,"members":[],"schema":{"type":"string"}},{"key":"goto_null","description":"silently ignore","required":false,"members":[],"schema":{"type":"boolean"}},{"key":"goto_spam","description":"learn as spam","required":false,"members":[],"schema":{"type":"boolean"}},{"key":"goto_ham","description":"learn as ham","required":false,"members":[],"schema":{"type":"boolean"}},{"key":"active","description":"is alias active or not","required":false,"members":[],"schema":{"type":"boolean"}}]},"example":"{\n \"address\":\"alias@domain.tld\",\n \"goto\":\"destination@domain.tld\",\n \"active\":\"1\"\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"address\": {\n \"type\": \"string\"\n },\n \"goto\": {\n \"type\": \"string\"\n },\n \"goto_null\": {\n \"type\": \"boolean\"\n },\n \"goto_spam\": {\n \"type\": \"boolean\"\n },\n \"goto_ham\": {\n \"type\": \"boolean\"\n },\n \"active\": {\n \"type\": \"boolean\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\":\"success\",\n \"log\":[\n \"mailbox\",\n \"add\",\n \"alias\",\n {\n \"address\":\"alias@domain.tld\",\n \"goto\":\"destination@domain.tld\",\n \"active\":\"1\"\n },\n null\n ],\n \"msg\":[\n \"alias_added\",\n \"alias@domain.tld\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Aliases","Create alias"]},{"title":"Update alias","path":"/api/v1/edit/alias","pathTemplate":"/api/v1/edit/alias","slug":"post~api~v1~edit~alias","method":"post","description":"\nYou can update one or more aliases per request. You can also send just attributes you want to change","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"items","value":["id"],"description":"contains list of aliases you want update","required":false,"members":[],"schema":{"type":"array"}},{"key":"attr","value":{},"required":false,"members":[],"schema":{"type":"object"}}]},"example":"{\n \"items\":[\n \"6\"\n ],\n \"attr\":{\n \"address\":\"alias@domain.tld\",\n \"goto\":\"destination@domain.tld\",\n \"private_comment\":\"private comment\",\n \"public_comment\":\"public comment\",\n \"active\":\"1\"\n }\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"items\": {\n \"type\": \"array\"\n },\n \"attr\": {\n \"type\": \"object\",\n \"properties\": {\n \"address\": {\n \"type\": \"string\"\n },\n \"goto\": {\n \"type\": \"string\"\n },\n \"goto_null\": {\n \"type\": \"boolean\"\n },\n \"goto_spam\": {\n \"type\": \"boolean\"\n },\n \"goto_ham\": {\n \"type\": \"boolean\"\n },\n \"private_comment\": {\n \"type\": \"string\"\n },\n \"public_comment\": {\n \"type\": \"string\"\n },\n \"active\": {\n \"type\": \"boolean\"\n }\n }\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\":\"success\",\n \"log\":[\n \"mailbox\",\n \"edit\",\n \"alias\",\n {\n \"id\":[\n \"6\"\n ],\n \"address\":\"alias@domain.tld\",\n \"goto\":\"destination@domain.tld\",\n \"private_comment\":\"private comment\",\n \"public_comment\":\"public comment\",\n \"active\":\"1\"\n },\n null\n ],\n \"msg\":[\n \"alias_modified\",\n \"alias@domain.tld\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Aliases","Update alias"]},{"title":"Delete alias","path":"/api/v1/delete/alias","pathTemplate":"/api/v1/delete/alias","slug":"post~api~v1~delete~alias","method":"post","description":"\nYou can delete one or more aliases.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"[\n \"6\",\n \"9\"\n]\n","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\":\"success\",\n \"log\":[\n \"mailbox\",\n \"delete\",\n \"alias\",\n {\n \"id\":[\n \"6\",\n \"9\"\n ]\n },\n null\n ],\n \"msg\":[\n \"alias_removed\",\n \"alias@domain.tld\"\n ]\n },\n {\n \"type\":\"success\",\n \"log\":[\n \"mailbox\",\n \"delete\",\n \"alias\",\n {\n \"id\":[\n \"6\",\n \"9\"\n ]\n },\n null\n ],\n \"msg\":[\n \"alias_removed\",\n \"alias2@domain.tld\"\n ]\n }\n] \n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Aliases","Delete alias"]},{"title":"List all sync jobs","path":"/api/v1/get/syncjobs/all/no_log","pathTemplate":"/api/v1/get/syncjobs/all/no_log","slug":"get~api~v1~get~syncjobs~all~no~log","method":"get","description":"\nYou can list all syn jobs existing in system.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"id\": 1,\n \"user2\": \"mailbox@domain.tld\",\n \"host1\": \"imap.server.tld\",\n \"authmech1\": \"PLAIN\",\n \"regextrans2\": \"\",\n \"authmd51\": 0,\n \"domain2\": \"\",\n \"subfolder2\": \"External\",\n \"user1\": \"username\",\n \"exclude\": \"(?i)spam|(?i)junk\",\n \"maxage\": 0,\n \"mins_interval\": \"20\",\n \"maxbytespersecond\": \"0\",\n \"port1\": 993,\n \"enc1\": \"TLS\",\n \"delete2duplicates\": 1,\n \"delete1\": 0,\n \"delete2\": 0,\n \"automap\": 1,\n \"skipcrossduplicates\": 0,\n \"custom_params\": \"\",\n \"timeout1\": 600,\n \"timeout2\": 600,\n \"subscribeall\": 1,\n \"is_running\": 0,\n \"last_run\": \"2019-05-22 11:40:02\",\n \"created\": \"2019-05-22 11:37:25\",\n \"modified\": \"2019-05-22 11:40:02\",\n \"active\": \"&#10003;\",\n \"active_int\": 1,\n \"log\": \"\"\n }\n]\n","schema":""}}],"tags":["Sync jobs","List all sync jobs"]},{"title":"Create sync job","path":"/api/v1/add/syncjob","pathTemplate":"/api/v1/add/syncjob","slug":"post~api~v1~add~syncjob","method":"post","description":"\nYou can create new sync job using this action. It takes a JSON object containing a domain informations.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"username","description":"The target mailbox","required":false,"members":[],"schema":{"type":"string"}},{"key":"delete2duplicates","description":"Delete duplicates on destination","required":false,"members":[],"schema":{"type":"boolean"}},{"key":"delete1","description":"Delete from source when completed","required":false,"members":[],"schema":{"type":"boolean"}},{"key":"delete2","description":"Delete messages on destination that are not on source","required":false,"members":[],"schema":{"type":"boolean"}},{"key":"automap","description":"Try to automap folders (\"Sent items\", \"Sent\" => \"Sent\" etc.)","required":false,"members":[],"schema":{"type":"boolean"}},{"key":"skipcrossduplicates","description":"Skip duplicate messages across folders (first come, first serve)","required":false,"members":[],"schema":{"type":"boolean"}},{"key":"active","description":"Is sync job active","required":false,"members":[],"schema":{"type":"boolean"}},{"key":"subscribeall","description":"Subscribe all folders","required":false,"members":[],"schema":{"type":"boolean"}},{"key":"host1","description":"Hostname","required":false,"members":[],"schema":{"type":"string"}},{"key":"port1","description":"Port","required":false,"members":[],"schema":{"type":"string"}},{"key":"user1","description":"Username","required":false,"members":[],"schema":{"type":"string"}},{"key":"password1","description":"Password","required":false,"members":[],"schema":{"type":"string"}},{"key":"enc1","description":"Encryption","required":false,"members":[],"schema":{"type":"enum"}},{"key":"mins_interval","description":"Interval (min)","required":false,"members":[],"schema":{"type":"number"}},{"key":"subfolder2","description":"Sync into subfolder on destination (empty = do not use subfolder)","required":false,"members":[],"schema":{"type":"string"}},{"key":"maxage","description":"Maximum age of messages in days that will be polled from remote (0 = ignore age)","required":false,"members":[],"schema":{"type":"number"}},{"key":"maxbytespersecond","description":"Max. bytes per second (0 = unlimited)","required":false,"members":[],"schema":{"type":"number"}},{"key":"timeout1","description":"Timeout for connection to remote host","required":false,"members":[],"schema":{"type":"number"}},{"key":"timeout2","description":"Timeout for connection to local host","required":false,"members":[],"schema":{"type":"number"}},{"key":"exclude","description":"Exclude objects (regex)","required":false,"members":[],"schema":{"type":"string"}},{"key":"custom_params","description":"Custom parameters passed to imapsync command","required":false,"members":[],"schema":{"type":"string"}}]},"example":"{\n \"username\":\"mailbox@domain.tld\",\n \"host1\":\"imap.server.tld\",\n \"port1\":\"993\",\n \"user1\":\"username\",\n \"password1\":\"supersecret\",\n \"enc1\":\"SSL\",\n \"mins_interval\":\"20\",\n \"subfolder2\":\"External\",\n \"maxage\":\"0\",\n \"maxbytespersecond\":\"0\",\n \"timeout1\":\"600\",\n \"timeout2\":\"600\",\n \"exclude\":\"(?i)spam|(?i)junk\",\n \"custom_params\":\"\",\n \"delete2duplicates\":\"1\",\n \"delete1\":\"0\",\n \"delete2\":\"0\",\n \"automap\":\"1\",\n \"skipcrossduplicates\":\"0\",\n \"subscribeall\":\"1\",\n \"active\":\"1\",\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"username\": {\n \"type\": \"string\"\n },\n \"delete2duplicates\": {\n \"type\": \"boolean\"\n },\n \"delete1\": {\n \"type\": \"boolean\"\n },\n \"delete2\": {\n \"type\": \"boolean\"\n },\n \"automap\": {\n \"type\": \"boolean\"\n },\n \"skipcrossduplicates\": {\n \"type\": \"boolean\"\n },\n \"active\": {\n \"type\": \"boolean\"\n },\n \"subscribeall\": {\n \"type\": \"boolean\"\n },\n \"host1\": {\n \"type\": \"string\"\n },\n \"port1\": {\n \"type\": \"string\"\n },\n \"user1\": {\n \"type\": \"string\"\n },\n \"password1\": {\n \"type\": \"string\"\n },\n \"enc1\": {\n \"enum\": [\n \"TLS\",\n \"SSL\",\n \"PLAIN\"\n ]\n },\n \"mins_interval\": {\n \"type\": \"number\"\n },\n \"subfolder2\": {\n \"type\": \"string\"\n },\n \"maxage\": {\n \"type\": \"number\"\n },\n \"maxbytespersecond\": {\n \"type\": \"number\"\n },\n \"timeout1\": {\n \"type\": \"number\"\n },\n \"timeout2\": {\n \"type\": \"number\"\n },\n \"exclude\": {\n \"type\": \"string\"\n },\n \"custom_params\": {\n \"type\": \"string\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\":\"success\",\n \"log\":[\n \"mailbox\",\n \"add\",\n \"syncjob\",\n {\n \"username\":\"mailbox@domain.tld\",\n \"host1\":\"imap.server.tld\",\n \"port1\":993,\n \"user1\":\"username\",\n \"password1\":\"supersecret\",\n \"enc1\":\"SSL\",\n \"mins_interval\":\"20\",\n \"subfolder2\":\"External\",\n \"maxage\":\"0\",\n \"maxbytespersecond\":\"0\",\n \"timeout1\":\"600\",\n \"timeout2\":\"600\",\n \"exclude\":\"(?i)spam|(?i)junk\",\n \"custom_params\":\"\",\n \"delete2duplicates\":\"1\",\n \"delete1\":\"0\",\n \"delete2\":\"0\",\n \"automap\":\"1\",\n \"skipcrossduplicates\":\"0\",\n \"subscribeall\":\"1\",\n \"active\":\"1\"\n },\n null\n ],\n \"msg\":[\n \"mailbox_modified\",\n \"mailbox@domain.tld\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Sync jobs","Create sync job"]},{"title":"Update sync job","path":"/api/v1/edit/syncjob","pathTemplate":"/api/v1/edit/syncjob","slug":"post~api~v1~edit~syncjob","method":"post","description":"\nYou can update one or more sync jobs per request. You can also send just attributes you want to change.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"items","value":["id"],"description":"contains list of aliases you want update","required":false,"members":[],"schema":{"type":"array"}},{"key":"attr","value":{},"required":false,"members":[],"schema":{"type":"object"}}]},"example":"{\n \"items\":[\n \"1\"\n ],\n \"attr\":{\n \"delete2duplicates\":\"1\",\n \"delete1\":\"0\",\n \"delete2\":\"0\",\n \"automap\":\"1\",\n \"skipcrossduplicates\":\"0\",\n \"active\":\"1\",\n \"subscribeall\":\"1\",\n \"host1\":\"imap.server.tld\",\n \"port1\":\"993\",\n \"user1\":\"username\",\n \"password1\":\"supersecret\",\n \"enc1\":\"SSL\",\n \"mins_interval\":\"20\",\n \"subfolder2\":\"External\",\n \"maxage\":\"0\",\n \"maxbytespersecond\":\"0\",\n \"timeout1\":\"600\",\n \"timeout2\":\"600\",\n \"exclude\":\"(?i)spam|(?i)junk\",\n \"custom_params\":\"\"\n }\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"items\": {\n \"type\": \"array\"\n },\n \"attr\": {\n \"type\": \"object\",\n \"properties\": {\n \"delete2duplicates\": {\n \"type\": \"boolean\"\n },\n \"delete1\": {\n \"type\": \"boolean\"\n },\n \"delete2\": {\n \"type\": \"boolean\"\n },\n \"automap\": {\n \"type\": \"boolean\"\n },\n \"skipcrossduplicates\": {\n \"type\": \"boolean\"\n },\n \"active\": {\n \"type\": \"boolean\"\n },\n \"subscribeall\": {\n \"type\": \"boolean\"\n },\n \"host1\": {\n \"type\": \"string\"\n },\n \"port1\": {\n \"type\": \"string\"\n },\n \"user1\": {\n \"type\": \"string\"\n },\n \"password1\": {\n \"type\": \"string\"\n },\n \"enc1\": {\n \"enum\": [\n \"TLS\",\n \"SSL\",\n \"PLAIN\"\n ]\n },\n \"mins_interval\": {\n \"type\": \"number\"\n },\n \"subfolder2\": {\n \"type\": \"string\"\n },\n \"maxage\": {\n \"type\": \"number\"\n },\n \"maxbytespersecond\": {\n \"type\": \"number\"\n },\n \"timeout1\": {\n \"type\": \"number\"\n },\n \"timeout2\": {\n \"type\": \"number\"\n },\n \"exclude\": {\n \"type\": \"string\"\n },\n \"custom_params\": {\n \"type\": \"string\"\n }\n }\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"{\n \"type\": \"success\",\n \"log\": [\n \"entity\",\n \"action\",\n \"object\",\n {}\n ],\n \"msg\": [\n \"message\",\n \"entity name\"\n ]\n}","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Sync jobs","Update sync job"]},{"title":"Delete sync job","path":"/api/v1/delete/syncjob","pathTemplate":"/api/v1/delete/syncjob","slug":"post~api~v1~delete~syncjob","method":"post","description":"\nYou can delete one or more sync jobs.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"items","value":["id"],"description":"contains list of aliases you want to delete","required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n \"6\",\n \"9\"\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"items\": {\n \"type\": \"array\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"{\n \"type\": \"success\",\n \"log\": [\n \"entity\",\n \"action\",\n \"object\",\n {}\n ],\n \"msg\": [\n \"message\",\n \"entity name\"\n ]\n}","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Sync jobs","Delete sync job"]},{"title":"Get Forwarding Hosts","path":"/api/v1/get/fwdhost/all","pathTemplate":"/api/v1/get/fwdhost/all","slug":"get~api~v1~get~fwdhost~all","method":"get","description":"\nYou can list all Forwarding Hosts in your system.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"host\": \"5.1.76.202\",\n \"source\": \"hosted.mailcow.de\",\n \"keep_spam\": \"yes\"\n },\n {\n \"host\": \"2a00:f820:417::202\",\n \"source\": \"hosted.mailcow.de\",\n \"keep_spam\": \"yes\"\n }\n]\n","schema":""}}],"tags":["Fordwarding Hosts","Get Forwarding Hosts"]},{"title":"Add Forward Host","path":"/api/v1/add/fwdhost","pathTemplate":"/api/v1/add/fwdhost","slug":"post~api~v1~add~fwdhost","method":"post","description":"\nAdd a new Forwarding host to mailcow. You can chose to enable or disable spam filtering of incoming emails by specifing `filter_spam` 0 = inactive, 1 = active.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"hostname","description":"contains the hostname you want to add","required":false,"members":[],"schema":{"type":"string"}},{"key":"filter_spam","description":"1 to enable spam filter, 0 to disable spam filter","required":false,"members":[],"schema":{"type":"number"}}]},"example":"{\n \"hostname\": \"hosted.mailcow.de\",\n \"filter_spam\": \"0\"\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"hostname\": {\n \"type\": \"string\"\n },\n \"filter_spam\": {\n \"type\": \"number\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\": \"success\",\n \"log\": [\n \"fwdhost\",\n \"add\",\n {\n \"hostname\": \"hosted.mailcow.de\",\n \"filter_spam\": \"0\"\n }\n ],\n \"msg\": [\n \"forwarding_host_added\",\n \"5.1.76.202, 2a00:f820:417::202\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Fordwarding Hosts","Add Forward Host"]},{"title":"Get Postfix logs","path":"/api/v1/get/logs/postfix","pathTemplate":"/api/v1/get/logs/postfix","slug":"get~api~v1~get~logs~postfix","method":"get","description":"\nThis Api endpoint lists all Postfix logs. \nTip: You can limit how many logs you want to get by using `/<number>` at the end of the api url.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"JSON\": [\n {\n \"time\": \"1569937433\",\n \"program\": \"postfix/qmgr\",\n \"priority\": \"info\",\n \"message\": \"EF1711500458: removed\"\n }\n ]\n }\n]\n","schema":""}}],"tags":["Logs","Get Postfix logs"]},{"title":"Get Rspamd logs","path":"/api/v1/get/logs/rspamd-history","pathTemplate":"/api/v1/get/logs/rspamd-history","slug":"get~api~v1~get~logs~rspamd-history","method":"get","description":"\nThis Api endpoint lists all Rspamd logs. \nTip: You can limit how many logs you want to get by using `/<number>` at the end of the api url.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":null,"title":"","description":"","headers":[],"example":"","schema":""}}],"tags":["Logs","Get Rspamd logs"]},{"title":"Get Dovecot logs","path":"/api/v1/get/logs/dovecot","pathTemplate":"/api/v1/get/logs/dovecot","slug":"get~api~v1~get~logs~dovecot","method":"get","description":"\nThis Api endpoint lists all Dovecot logs. \nTip: You can limit how many logs you want to get by using `/<number>` at the end of the api url.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"time\": \"1569938740\",\n \"program\": \"dovecot\",\n \"priority\": \"info\",\n \"message\": \"managesieve-login: Disconnected (no auth attempts in 0 secs): user=<>, rip=172.22.1.3, lip=172.22.1.250\"\n }\n]\n","schema":""}}],"tags":["Logs","Get Dovecot logs"]},{"title":"Get ACME logs","path":"/api/v1/get/logs/acme","pathTemplate":"/api/v1/get/logs/acme","slug":"get~api~v1~get~logs~acme","method":"get","description":"\nThis Api endpoint lists all ACME logs from issued Lets Enctypts certificates. \nTip: You can limit how many logs you want to get by using `/<number>` at the end of the api url.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"time\": \"1569927728\",\n \"message\": \"Certificate validation done, neither changed nor due for renewal, sleeping for another day.\"\n }\n]\n","schema":""}}],"tags":["Logs","Get ACME logs"]},{"title":"Get SOGo logs","path":"/api/v1/get/logs/sogo","pathTemplate":"/api/v1/get/logs/sogo","slug":"get~api~v1~get~logs~sogo","method":"get","description":"\nThis Api endpoint lists all SOGo logs. \nTip: You can limit how many logs you want to get by using `/<number>` at the end of the api url.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"time\": \"1569938874\",\n \"program\": \"sogod\",\n \"priority\": \"notice\",\n \"message\": \"[109]: mailcowdockerized_watchdog-mailcow_1.mailcowdockerized_mailcow-network \\\"GET \\/SOGo.index\\/ HTTP\\/1.1\\\" 200 2531\\/0 0.005 - - 0\"\n }\n]\n","schema":""}}],"tags":["Logs","Get SOGo logs"]},{"title":"Get Watchdog logs","path":"/api/v1/get/logs/watchdog","pathTemplate":"/api/v1/get/logs/watchdog","slug":"get~api~v1~get~logs~watchdog","method":"get","description":"\nThis Api endpoint lists all Watchdog logs. \nTip: You can limit how many logs you want to get by using `/<number>` at the end of the api url.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"time\": \"1569938958\",\n \"service\": \"Fail2ban\",\n \"lvl\": \"100\",\n \"hpnow\": \"1\",\n \"hptotal\": \"1\",\n \"hpdiff\": \"0\"\n },\n {\n \"time\": \"1569938956\",\n \"service\": \"Rspamd\",\n \"lvl\": \"100\",\n \"hpnow\": \"5\",\n \"hptotal\": \"5\",\n \"hpdiff\": \"0\"\n }\n]\n","schema":""}}],"tags":["Logs","Get Watchdog logs"]},{"title":"Get Api logs","path":"/api/v1/get/logs/api","pathTemplate":"/api/v1/get/logs/api","slug":"get~api~v1~get~logs~api","method":"get","description":"\nThis Api endpoint lists all Api logs. \nTip: You can limit how many logs you want to get by using `/<number>` at the end of the api url.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"time\": 1569939001,\n \"uri\": \"\\/api\\/v1\\/get\\/logs\\/api\\/2\",\n \"method\": \"GET\",\n \"remote\": \"1.1.1.1\",\n \"data\": \"\"\n }\n]\n","schema":""}}],"tags":["Logs","Get Api logs"]},{"title":"Get Ratelimit logs","path":"/api/v1/get/logs/ratelimited","pathTemplate":"/api/v1/get/logs/ratelimited","slug":"get~api~v1~get~logs~ratelimited","method":"get","description":"\nThis Api endpoint lists all Ratelimit logs. \nTip: You can limit how many logs you want to get by using `/<number>` at the end of the api url.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"time\": 1569269003,\n \"rcpt\": \"hello@mailcow.email\",\n \"from\": \"awesome@mailcow.email\",\n \"user\": \"awesome@mailcow.email\",\n \"rl_info\": \"mailcow(RLsdz3tuabozgd4oacbdh8kc78)\",\n \"rl_name\": \"mailcow\",\n \"rl_hash\": \"RLsdz3tuabozgd4oacbdh8kc78\",\n \"qid\": \"E3CF91500458\",\n \"ip\": \"172.22.1.248\",\n \"message_id\": \"6a-5d892500-7-240abd80@90879116\",\n \"header_subject\": \"Mailcow is amazing\",\n \"header_from\": \"\\\"Awesome\\\" <awesome@mailcow.email>\"\n }\n]\n","schema":""}}],"tags":["Logs","Get Ratelimit logs"]},{"title":"Get Netfilter logs","path":"/api/v1/get/logs/netfilter","pathTemplate":"/api/v1/get/logs/netfilter","slug":"get~api~v1~get~logs~netfilter","method":"get","description":"\nThis Api endpoint lists all Netfilter logs. \nTip: You can limit how many logs you want to get by using `/<number>` at the end of the api url.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"time\": 1569754911,\n \"priority\": \"info\",\n \"message\": \"Whitelist was changed, it has 1 entries\"\n },\n {\n \"time\": 1569754911,\n \"priority\": \"crit\",\n \"message\": \"Add host\\/network 1.1.1.1\\/32 to blacklist\"\n }\n]\n","schema":""}}],"tags":["Logs","Get Netfilter logs"]},{"title":"Get Autodiscover logs","path":"/api/v1/get/logs/autodiscover","pathTemplate":"/api/v1/get/logs/autodiscover","slug":"get~api~v1~get~logs~autodiscover","method":"get","description":"\nThis Api endpoint lists all Autodiscover logs. \nTip: You can limit how many logs you want to get by using `/<number>` at the end of the api url.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"time\": 1569684212,\n \"ua\": \"Microsoft Office\\/16.0 (Windows NT 6.2; MAPICPL 16.0.11328; Pro)\",\n \"user\": \"awesome@mailcow.de\",\n \"service\": \"activesync\"\n }\n]\n","schema":""}}],"tags":["Logs","Get Autodiscover logs"]},{"title":"Get Queue","path":"/api/v1/get/mailq/all","pathTemplate":"/api/v1/get/mailq/all","slug":"get~api~v1~get~mailq~all","method":"get","description":"\nGet the current mail queue and everything it contains.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":null,"title":"","description":"","headers":[],"example":"","schema":""}}],"tags":["Queue Manager","Get Queue"]},{"title":"Flush Queue","path":"/api/v1/edit/mailq","pathTemplate":"/api/v1/edit/mailq","slug":"post~api~v1~edit~mailq","method":"post","description":"\nUsing this API you can flush the current mail queue. This will try to deliver all mails currently in it.\nThis API uses the command: `postqueue -f`","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"action","description":"use flush to flush the mail queue","required":false,"members":[],"schema":{"type":"string"}}]},"example":"{ \n \"action\":\"flush\"\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"{\n \"type\": \"success\",\n \"msg\": \"Task completed\"\n}\n","schema":""}}],"tags":["Queue Manager","Flush Queue"]},{"title":"Delete Queue","path":"/api/v1/edit/mailq","pathTemplate":"/api/v1/edit/mailq","slug":"post~api~v1~edit~mailq~2","method":"post","description":"\nUsing this API you can delete the current mail queue. This will delete all mails in it.\nThis API uses the command: `postsuper -d`","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"action","description":"use super_delete to delete the mail queue","required":false,"members":[],"schema":{"type":"string"}}]},"example":"{\n \"action\":\"super_delete\"\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"action\": {\n \"type\": \"string\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"{\n \"type\": \"success\",\n \"msg\": \"Task completed\"\n}\n","schema":""}}],"tags":["Queue Manager","Delete Queue"]},{"title":"Get mails in Quarantine","path":"/api/v1/get/quarantine/all","pathTemplate":"/api/v1/get/quarantine/all","slug":"get~api~v1~get~quarantine~all","method":"get","description":"\nGet all mails that are currently in Quarantine.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":null,"title":"","description":"","headers":[],"example":"","schema":""}}],"tags":["Quarantine","Get mails in Quarantine"]},{"title":"Get Fail2Ban Config","path":"/api/v1/get/fail2ban","pathTemplate":"/api/v1/get/fail2ban","slug":"get~api~v1~get~fail2ban","method":"get","description":"\nGets the current Fail2Ban configuration.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"{\n \"ban_time\": 604800,\n \"netban_ipv4\": 32,\n \"netban_ipv6\": 128,\n \"max_attempts\": 1,\n \"retry_window\": 7200,\n \"whitelist\": \"1.1.1.1\",\n \"blacklist\": \"45.82.153.37\\/32\\n92.118.38.52\\/32\",\n \"perm_bans\": [\n \"45.82.153.37\\/32\",\n \"92.118.38.52\\/32\"\n ]\n}\n","schema":""}}],"tags":["Fail2Ban","Get Fail2Ban Config"]},{"title":"Generate DKIM Key","path":"/api/v1/add/dkim","pathTemplate":"/api/v1/add/dkim","slug":"post~api~v1~add~dkim","method":"post","description":"\nUsing this endpoint you can generate new DKIM keys.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"domain","description":"the domain which a key should be generated for","required":false,"members":[],"schema":{"type":"string"}},{"key":"dkim_selector","description":"the DKIM selector default dkim","required":false,"members":[],"schema":{"type":"string"}},{"key":"key_size","description":"the key size (1024 or 2048)","required":false,"members":[],"schema":{"type":"number"}}]},"example":"{\n \"domains\":\"mailcow.tld\",\n \"dkim_selector\":\"dkim\",\n \"key_size\":\"2048\"\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"domain\": {\n \"type\": \"string\"\n },\n \"dkim_selector\": {\n \"type\": \"string\"\n },\n \"key_size\": {\n \"type\": \"number\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\": \"success\",\n \"log\": [\n \"dkim\",\n \"add\",\n {\n \"domains\": \"hanspeterlol.de\",\n \"dkim_selector\": \"dkim\",\n \"key_size\": \"2048\"\n }\n ],\n \"msg\": [\n \"dkim_added\",\n \"hanspeterlol.de\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["DKIM","Generate DKIM Key"]},{"title":"Duplicate DKIM Key","path":"/api/v1/add/dkim_duplicate","pathTemplate":"/api/v1/add/dkim_duplicate","slug":"post~api~v1~add~dkim~duplicate","method":"post","description":"\nUsing this endpoint you can duplicate the DKIM Key of one domain.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"fron_domain","description":"the domain where the dkim key should be copied from","required":false,"members":[],"schema":{"type":"string"}},{"key":"to_domain","description":"the domain where the dkim key should be copied to","required":false,"members":[],"schema":{"type":"string"}}]},"example":"{\n \"from_domain\":\"mailcow.tld\",\n \"to_domain\":\"awesomecow.tld\"\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"fron_domain\": {\n \"type\": \"string\"\n },\n \"to_domain\": {\n \"type\": \"string\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\": \"success\",\n \"log\": [\n \"dkim\",\n \"duplicate\",\n {\n \"from_domain\": \"mailcow.tld\",\n \"to_domain\": \"awesomecow.tld\"\n }\n ],\n \"msg\": [\n \"dkim_duplicated\",\n \"mailcow.tld\",\n \"awesomecow.tld\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["DKIM","Duplicate DKIM Key"]},{"title":"Delete DKIM Key","path":"/api/v1/delete/dkim","pathTemplate":"/api/v1/delete/dkim","slug":"post~api~v1~delete~dkim","method":"post","description":"\nUsing this endpoint a existing DKIM Key can be deleted","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"[\"mailcow.tld\"]\n","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\": \"success\",\n \"log\": [\n \"dkim\",\n \"delete\",\n {\n \"domains\": [\n \"mailcow.tld\"\n ]\n }\n ],\n \"msg\": [\n \"dkim_removed\",\n \"mailcow.tld\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["DKIM","Delete DKIM Key"]},{"title":"Get list Domain Admins","path":"/api/v1/get/domain-admin/all","pathTemplate":"/api/v1/get/domain-admin/all","slug":"get~api~v1~get~domain-admin~all","method":"get","description":"\n","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"username\": \"testadmin\",\n \"tfa_active\": \"&#10005;\",\n \"active\": \"&#10003;\",\n \"tfa_active_int\": null,\n \"active_int\": 1,\n \"created\": \"2019-10-02 10:29:41\",\n \"selected_domains\": [\n \"mailcow.tld\"\n ],\n \"unselected_domains\": [\n \"awesomemailcow.de\",\n \"mailcowisgreat.de\"\n ]\n }\n]\n","schema":""}}],"tags":["Domain admin","Get list Domain Admins"]},{"title":"Create Domain Admin user","path":"/api/v1/add/domain-admin","pathTemplate":"/api/v1/add/domain-admin","slug":"post~api~v1~add~domain-admin","method":"post","description":"\nUsing this endpoint you can create a new Domain Admin user. This user has full control over a domain, and can create new mailboxes and aliases.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"username","description":"the username for the admin user","required":false,"members":[],"schema":{"type":"string"}},{"key":"domains","description":"the domains the user should be a admin of","required":false,"members":[],"schema":{"type":"string"}},{"key":"password","description":"domain admin user password","required":false,"members":[],"schema":{"type":"string"}},{"key":"password2","description":"domain admin user password","required":false,"members":[],"schema":{"type":"string"}},{"key":"active","description":"1 for a active user account 0 for a disabled user account","required":false,"members":[],"schema":{"type":"number"}}]},"example":"{\n \"username\": \"testadmin\",\n \"domains\": \"mailcow.tld\",\n \"password\": \"supersecurepw\",\n \"password2\": \"supersecurepw\",\n \"active\": \"1\"\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"username\": {\n \"type\": \"string\"\n },\n \"domains\": {\n \"type\": \"string\"\n },\n \"password\": {\n \"type\": \"string\"\n },\n \"password2\": {\n \"type\": \"string\"\n },\n \"active\": {\n \"type\": \"number\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\": \"success\",\n \"log\": [\n \"domain_admin\",\n \"add\",\n {\n \"username\": \"testadmin\",\n \"domains\": \"mailcow.tld\",\n \"password\": \"*\",\n \"password2\": \"*\",\n \"active\": \"1\"\n }\n ],\n \"msg\": [\n \"domain_admin_added\",\n \"testadmin\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Domain admin","Create Domain Admin user"]},{"title":"Delete Domain Admin","path":"/api/v1/delete/domain-admin","pathTemplate":"/api/v1/delete/domain-admin","slug":"post~api~v1~delete~domain-admin","method":"post","description":"\nUsing this endpoint a existing Domain Admin user can be deleted.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"items","value":["username"],"description":"contains list of usernames of the users you want to delete","required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\"testadmin\"]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"items\": {\n \"type\": \"array\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\": \"success\",\n \"log\": [\n \"domain_admin\",\n \"delete\",\n {\n \"username\": [\n \"testadmin\"\n ]\n }\n ],\n \"msg\": [\n \"domain_admin_removed\",\n \"testadmin\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Domain admin","Delete Domain Admin"]},{"title":"Get BCC Map","path":"/api/v1/get/bcc/all","pathTemplate":"/api/v1/get/bcc/all","slug":"get~api~v1~get~bcc~all","method":"get","description":"\nUsing this endpoint you can get all BCC maps.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"id\": 3,\n \"local_dest\": \"@mailcow.tld\",\n \"bcc_dest\": \"bcc@awesomecow.tld\",\n \"active_int\": 1,\n \"active\": \"&#10003;\",\n \"type\": \"sender\",\n \"created\": \"2019-10-02 21:44:34\",\n \"domain\": \"mailcow.tld\",\n \"modified\": null\n }\n]\n","schema":""}}],"tags":["Address Rewriting","Get BCC Map"]},{"title":"Create BCC Map","path":"/api/v1/add/bcc","pathTemplate":"/api/v1/add/bcc","slug":"post~api~v1~add~bcc","method":"post","description":"\nUsing this endpoint you can create a BCC map to forward all mails via a bcc for a given domain.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"local_dest","description":"the domain which emails should be forwarded","required":false,"members":[],"schema":{"type":"string"}},{"key":"type","description":"the type of bcc map can be `sender` or `recipient`","required":false,"members":[],"schema":{"type":"string"}},{"key":"bcc_dest","description":"the email address where all mails should be send to","required":false,"members":[],"schema":{"type":"string"}},{"key":"active","description":"1 for a active user account 0 for a disabled user account","required":false,"members":[],"schema":{"type":"number"}}]},"example":"{\n \"local_dest\": \"mailcow.tld\",\n \"type\": \"sender\",\n \"bcc_dest\": \"bcc@awesomecow.tld\",\n \"active\": \"1\"\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"local_dest\": {\n \"type\": \"string\"\n },\n \"type\": {\n \"type\": \"string\"\n },\n \"bcc_dest\": {\n \"type\": \"string\"\n },\n \"active\": {\n \"type\": \"number\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\": \"success\",\n \"log\": [\n \"bcc\",\n \"add\",\n {\n \"local_dest\": \"mailcow.tld\",\n \"type\": \"sender\",\n \"bcc_dest\": \"bcc@awesomecow.tld\",\n \"active\": \"1\"\n },\n null\n ],\n \"msg\": \"bcc_saved\"\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Address Rewriting","Create BCC Map"]},{"title":"Delete BCC Map","path":"/api/v1/delete/bcc","pathTemplate":"/api/v1/delete/bcc","slug":"post~api~v1~delete~bcc","method":"post","description":"\nUsing this endpoint you can delete a BCC map, for this you have to know its ID. You can get the ID using the GET method.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"items","value":["id"],"description":"contains list of bcc maps you want to delete","required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\"3\"]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"items\": {\n \"type\": \"array\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\": \"success\",\n \"log\": [\n \"bcc\",\n \"delete\",\n {\n \"id\": [\n \"4\"\n ]\n },\n null\n ],\n \"msg\": [\n \"bcc_deleted\",\n \"4\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Address Rewriting","Delete BCC Map"]},{"title":"Get Recipient Map","path":"/api/v1/get/recipient_map/all","pathTemplate":"/api/v1/get/recipient_map/all","slug":"get~api~v1~get~recipient~map~all","method":"get","description":"\nUsing this endpoint you can get all recipient maps.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"id\": 3,\n \"recipient_map_old\": \"recipient@mailcow.tld\",\n \"recipient_map_new\": \"target@mailcow.tld\",\n \"active_int\": 1,\n \"active\": \"&#10003;\",\n \"created\": \"2019-10-02 22:06:29\",\n \"modified\": null\n }\n]\n","schema":""}}],"tags":["Address Rewriting","Get Recipient Map"]},{"title":"Create Recipient Map","path":"/api/v1/add/recipient_map","pathTemplate":"/api/v1/add/recipient_map","slug":"post~api~v1~add~recipient~map","method":"post","description":"\nUsing this endpoint you can create a recipient map to forward all mails from one email address to another.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"recipient_map_old","description":"the email address which emails should be forwarded","required":false,"members":[],"schema":{"type":"string"}},{"key":"recipient_map_new","description":"the email address that should receive the forwarded emails","required":false,"members":[],"schema":{"type":"string"}},{"key":"active","description":"1 for a active user account 0 for a disabled user account","required":false,"members":[],"schema":{"type":"number"}}]},"example":"{\n \"recipient_map_old\": \"recipient@mailcow.tld\",\n \"recipient_map_new\": \"target@mailcow.tld\",\n \"active\": \"1\"\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"recipient_map_old\": {\n \"type\": \"string\"\n },\n \"recipient_map_new\": {\n \"type\": \"string\"\n },\n \"active\": {\n \"type\": \"number\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\": \"success\",\n \"log\": [\n \"recipient_map\",\n \"add\",\n {\n \"recipient_map_old\": \"recipient@mailcow.tld\",\n \"recipient_map_new\": \"target@mailcow.tld\",\n \"active\": \"1\"\n },\n null\n ],\n \"msg\": [\n \"recipient_map_entry_saved\",\n \"recipient@mailcow.tld\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Address Rewriting","Create Recipient Map"]},{"title":"Delete Recipient Map","path":"/api/v1/delete/recipient_map","pathTemplate":"/api/v1/delete/recipient_map","slug":"post~api~v1~delete~recipient~map","method":"post","description":"\nUsing this endpoint you can delete a recipient map, for this you have to know its ID. You can get the ID using the GET method.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"items","value":["id"],"description":"contains list of recipient maps you want to delete","required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\"1\"]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"items\": {\n \"type\": \"array\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\": \"success\",\n \"log\": [\n \"recipient_map\",\n \"delete\",\n {\n \"id\": [\n \"1\"\n ]\n },\n null\n ],\n \"msg\": [\n \"recipient_map_entry_deleted\",\n \"1\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Address Rewriting","Delete Recipient Map"]},{"title":"Get TLS Policy Map","path":"/api/v1/get/tls-policy-map/all","pathTemplate":"/api/v1/get/tls-policy-map/all","slug":"get~api~v1~get~tls-policy-map~all","method":"get","description":"\nUsing this endpoint you can get all TLS policy map override maps.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"example":"","schema":""},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"example":"[\n {\n \"id\": 1,\n \"dest\": \"mailcow.tld\",\n \"policy\": \"encrypt\",\n \"parameters\": \"\",\n \"active_int\": 1,\n \"active\": \"&#10003;\",\n \"created\": \"2019-10-03 08:42:12\",\n \"modified\": null\n }\n]\n","schema":""}}],"tags":["Outgoing TLS Policy Map Overrides","Get TLS Policy Map"]},{"title":"Create TLS Policy Map","path":"/api/v1/add/tls-policy-map","pathTemplate":"/api/v1/add/tls-policy-map","slug":"post~api~v1~add~tls-policy-map","method":"post","description":"\nUsing this endpoint you can create a TLS policy map override.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"dest","description":"the target domain or email address","required":false,"members":[],"schema":{"type":"string"}},{"key":"policy","description":"the policy","required":false,"members":[],"schema":{"type":"enum"}},{"key":"parameters","description":"custom parameters you find out more about them [here](http://www.postfix.org/postconf.5.html#smtp_tls_policy_maps)","required":false,"members":[],"schema":{"type":"string"}},{"key":"active","description":"1 for a active user account 0 for a disabled user account","required":false,"members":[],"schema":{"type":"number"}}]},"example":"{\n \"dest\": \"220022.xyz\",\n \"policy\": \"encrypt\",\n \"parameters\": \"\",\n \"active\": \"1\"\n}\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"dest\": {\n \"type\": \"string\"\n },\n \"policy\": {\n \"enum\": [\n \"none\",\n \"may\",\n \"encrypt\",\n \"dane\",\n \"fingerprint\",\n \"verify\",\n \"secure\"\n ]\n },\n \"parameters\": {\n \"type\": \"string\"\n },\n \"active\": {\n \"type\": \"number\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\": \"success\",\n \"log\": [\n \"tls_policy_maps\",\n \"add\",\n {\n \"dest\": \"mailcow.tld\",\n \"policy\": \"encrypt\",\n \"parameters\": \"\",\n \"active\": \"1\"\n },\n null\n ],\n \"msg\": [\n \"tls_policy_map_entry_saved\",\n \"mailcow.tld\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Outgoing TLS Policy Map Overrides","Create TLS Policy Map"]},{"title":"Delete TLS Policy Map","path":"/api/v1/delete/tls-policy-map","pathTemplate":"/api/v1/delete/tls-policy-map","slug":"post~api~v1~delete~tls-policy-map","method":"post","description":"\nUsing this endpoint you can delete a TLS Policy Map, for this you have to know its ID. You can get the ID using the GET method.","parameters":[],"transactions":[{"request":{"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}},{"name":"X-API-Key","example":"api-key-string","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"items","value":["id"],"description":"contains list of tls policy maps you want to delete","required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\"3\"]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"items\": {\n \"type\": \"array\"\n }\n }\n}"},"response":{"statusCode":200,"title":"","description":"","contentType":"application/json","headers":[{"name":"Content-Type","example":"application/json","required":false,"schema":{"type":"string"}}],"structure":{"schema":{"type":"object"},"members":[{"key":"type","required":false,"members":[],"schema":{"type":"enum"}},{"key":"log","value":["entity","action","object",{}],"description":"contains request object","required":false,"members":[[]],"schema":{"type":"array"}},{"key":"msg","value":["message","entity name"],"required":false,"members":[],"schema":{"type":"array"}}]},"example":"[\n {\n \"type\": \"success\",\n \"log\": [\n \"tls_policy_maps\",\n \"delete\",\n {\n \"id\": [\n \"1\"\n ]\n },\n null\n ],\n \"msg\": [\n \"tls_policy_map_entry_deleted\",\n \"1\"\n ]\n }\n]\n","schema":"{\n \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n \"type\": \"object\",\n \"properties\": {\n \"type\": {\n \"enum\": [\n \"success\",\n \"danger\",\n \"error\"\n ]\n },\n \"log\": {\n \"type\": \"array\"\n },\n \"msg\": {\n \"type\": \"array\"\n }\n }\n}"}}],"tags":["Outgoing TLS Policy Map Overrides","Delete TLS Policy Map"]}],"tagActions":[{"title":"Address Rewriting","children":[{"title":"Create BCC Map","actions":[{"title":"Create BCC Map","method":"post","path":"/api/v1/add/bcc","slug":"post~api~v1~add~bcc"}]},{"title":"Create Recipient Map","actions":[{"title":"Create Recipient Map","method":"post","path":"/api/v1/add/recipient_map","slug":"post~api~v1~add~recipient~map"}]},{"title":"Delete BCC Map","actions":[{"title":"Delete BCC Map","method":"post","path":"/api/v1/delete/bcc","slug":"post~api~v1~delete~bcc"}]},{"title":"Delete Recipient Map","actions":[{"title":"Delete Recipient Map","method":"post","path":"/api/v1/delete/recipient_map","slug":"post~api~v1~delete~recipient~map"}]},{"title":"Get BCC Map","actions":[{"title":"Get BCC Map","method":"get","path":"/api/v1/get/bcc/all","slug":"get~api~v1~get~bcc~all"}]},{"title":"Get Recipient Map","actions":[{"title":"Get Recipient Map","method":"get","path":"/api/v1/get/recipient_map/all","slug":"get~api~v1~get~recipient~map~all"}]}]},{"title":"Aliases","children":[{"title":"Create alias","actions":[{"title":"Create alias","method":"post","path":"/api/v1/add/alias","slug":"post~api~v1~add~alias"}]},{"title":"Delete alias","actions":[{"title":"Delete alias","method":"post","path":"/api/v1/delete/alias","slug":"post~api~v1~delete~alias"}]},{"title":"List all aliases","actions":[{"title":"List all aliases","method":"get","path":"/api/v1/get/alias/all","slug":"get~api~v1~get~alias~all"}]},{"title":"Update alias","actions":[{"title":"Update alias","method":"post","path":"/api/v1/edit/alias","slug":"post~api~v1~edit~alias"}]}]},{"title":"DKIM","children":[{"title":"Delete DKIM Key","actions":[{"title":"Delete DKIM Key","method":"post","path":"/api/v1/delete/dkim","slug":"post~api~v1~delete~dkim"}]},{"title":"Duplicate DKIM Key","actions":[{"title":"Duplicate DKIM Key","method":"post","path":"/api/v1/add/dkim_duplicate","slug":"post~api~v1~add~dkim~duplicate"}]},{"title":"Generate DKIM Key","actions":[{"title":"Generate DKIM Key","method":"post","path":"/api/v1/add/dkim","slug":"post~api~v1~add~dkim"}]}]},{"title":"Domain admin","children":[{"title":"Create Domain Admin user","actions":[{"title":"Create Domain Admin user","method":"post","path":"/api/v1/add/domain-admin","slug":"post~api~v1~add~domain-admin"}]},{"title":"Delete Domain Admin","actions":[{"title":"Delete Domain Admin","method":"post","path":"/api/v1/delete/domain-admin","slug":"post~api~v1~delete~domain-admin"}]},{"title":"Get list Domain Admins","actions":[{"title":"Get list Domain Admins","method":"get","path":"/api/v1/get/domain-admin/all","slug":"get~api~v1~get~domain-admin~all"}]}]},{"title":"Domain antispam policies","children":[{"title":"Create domain policy","actions":[{"title":"Create domain policy","method":"post","path":"/api/v1/add/domain-policy","slug":"post~api~v1~add~domain-policy"}]},{"title":"Delete domain policy","actions":[{"title":"Delete domain policy","method":"post","path":"/api/v1/delete/domain-policy","slug":"post~api~v1~delete~domain-policy"}]},{"title":"List blacklist domain policy","actions":[{"title":"List blacklist domain policy","method":"get","path":"/api/v1/get/policy_bl_domain/{domain}","slug":"get~api~v1~get~policy~bl~domain~domain"}]},{"title":"List whitelist domain policy","actions":[{"title":"List whitelist domain policy","method":"get","path":"/api/v1/get/policy_wl_domain/{domain}","slug":"get~api~v1~get~policy~wl~domain~domain"}]}]},{"title":"Domains","children":[{"title":"Create new domain","actions":[{"title":"Create new domain","method":"post","path":"/api/v1/add/domain","slug":"post~api~v1~add~domain"}]},{"title":"Delete domain","actions":[{"title":"Delete domain","method":"post","path":"/api/v1/delete/domain","slug":"post~api~v1~delete~domain"}]},{"title":"List all domains","actions":[{"title":"List all domains","method":"get","path":"/api/v1/get/domain/all","slug":"get~api~v1~get~domain~all"}]},{"title":"Update domain","actions":[{"title":"Update domain","method":"post","path":"/api/v1/edit/domain","slug":"post~api~v1~edit~domain"}]}]},{"title":"Fail2Ban","children":[{"title":"Get Fail2Ban Config","actions":[{"title":"Get Fail2Ban Config","method":"get","path":"/api/v1/get/fail2ban","slug":"get~api~v1~get~fail2ban"}]}]},{"title":"Fordwarding Hosts","children":[{"title":"Add Forward Host","actions":[{"title":"Add Forward Host","method":"post","path":"/api/v1/add/fwdhost","slug":"post~api~v1~add~fwdhost"}]},{"title":"Get Forwarding Hosts","actions":[{"title":"Get Forwarding Hosts","method":"get","path":"/api/v1/get/fwdhost/all","slug":"get~api~v1~get~fwdhost~all"}]}]},{"title":"Logs","children":[{"title":"Get ACME logs","actions":[{"title":"Get ACME logs","method":"get","path":"/api/v1/get/logs/acme","slug":"get~api~v1~get~logs~acme"}]},{"title":"Get Api logs","actions":[{"title":"Get Api logs","method":"get","path":"/api/v1/get/logs/api","slug":"get~api~v1~get~logs~api"}]},{"title":"Get Autodiscover logs","actions":[{"title":"Get Autodiscover logs","method":"get","path":"/api/v1/get/logs/autodiscover","slug":"get~api~v1~get~logs~autodiscover"}]},{"title":"Get Dovecot logs","actions":[{"title":"Get Dovecot logs","method":"get","path":"/api/v1/get/logs/dovecot","slug":"get~api~v1~get~logs~dovecot"}]},{"title":"Get Netfilter logs","actions":[{"title":"Get Netfilter logs","method":"get","path":"/api/v1/get/logs/netfilter","slug":"get~api~v1~get~logs~netfilter"}]},{"title":"Get Postfix logs","actions":[{"title":"Get Postfix logs","method":"get","path":"/api/v1/get/logs/postfix","slug":"get~api~v1~get~logs~postfix"}]},{"title":"Get Ratelimit logs","actions":[{"title":"Get Ratelimit logs","method":"get","path":"/api/v1/get/logs/ratelimited","slug":"get~api~v1~get~logs~ratelimited"}]},{"title":"Get Rspamd logs","actions":[{"title":"Get Rspamd logs","method":"get","path":"/api/v1/get/logs/rspamd-history","slug":"get~api~v1~get~logs~rspamd-history"}]},{"title":"Get SOGo logs","actions":[{"title":"Get SOGo logs","method":"get","path":"/api/v1/get/logs/sogo","slug":"get~api~v1~get~logs~sogo"}]},{"title":"Get Watchdog logs","actions":[{"title":"Get Watchdog logs","method":"get","path":"/api/v1/get/logs/watchdog","slug":"get~api~v1~get~logs~watchdog"}]}]},{"title":"Mailboxes","children":[{"title":"Create mailbox","actions":[{"title":"Create mailbox","method":"post","path":"/api/v1/add/mailbox","slug":"post~api~v1~add~mailbox"}]},{"title":"Delete mailbox","actions":[{"title":"Delete mailbox","method":"post","path":"/api/v1/delete/mailbox","slug":"post~api~v1~delete~mailbox"}]},{"title":"List all mailboxes","actions":[{"title":"List all mailboxes","method":"get","path":"/api/v1/get/mailbox/all","slug":"get~api~v1~get~mailbox~all"}]},{"title":"Quarantine Notifications","actions":[{"title":"Quarantine Notifications","method":"post","path":"/api/v1/edit/quarantine_notification","slug":"post~api~v1~edit~quarantine~notification"}]},{"title":"Update mailbox","actions":[{"title":"Update mailbox","method":"post","path":"/api/v1/edit/mailbox","slug":"post~api~v1~edit~mailbox"}]}]},{"title":"Outgoing TLS Policy Map Overrides","children":[{"title":"Create TLS Policy Map","actions":[{"title":"Create TLS Policy Map","method":"post","path":"/api/v1/add/tls-policy-map","slug":"post~api~v1~add~tls-policy-map"}]},{"title":"Delete TLS Policy Map","actions":[{"title":"Delete TLS Policy Map","method":"post","path":"/api/v1/delete/tls-policy-map","slug":"post~api~v1~delete~tls-policy-map"}]},{"title":"Get TLS Policy Map","actions":[{"title":"Get TLS Policy Map","method":"get","path":"/api/v1/get/tls-policy-map/all","slug":"get~api~v1~get~tls-policy-map~all"}]}]},{"title":"Quarantine","children":[{"title":"Get mails in Quarantine","actions":[{"title":"Get mails in Quarantine","method":"get","path":"/api/v1/get/quarantine/all","slug":"get~api~v1~get~quarantine~all"}]}]},{"title":"Queue Manager","children":[{"title":"Delete Queue","actions":[{"title":"Delete Queue","method":"post","path":"/api/v1/edit/mailq","slug":"post~api~v1~edit~mailq~2"}]},{"title":"Flush Queue","actions":[{"title":"Flush Queue","method":"post","path":"/api/v1/edit/mailq","slug":"post~api~v1~edit~mailq"}]},{"title":"Get Queue","actions":[{"title":"Get Queue","method":"get","path":"/api/v1/get/mailq/all","slug":"get~api~v1~get~mailq~all"}]}]},{"title":"Sync jobs","children":[{"title":"Create sync job","actions":[{"title":"Create sync job","method":"post","path":"/api/v1/add/syncjob","slug":"post~api~v1~add~syncjob"}]},{"title":"Delete sync job","actions":[{"title":"Delete sync job","method":"post","path":"/api/v1/delete/syncjob","slug":"post~api~v1~delete~syncjob"}]},{"title":"List all sync jobs","actions":[{"title":"List all sync jobs","method":"get","path":"/api/v1/get/syncjobs/all/no_log","slug":"get~api~v1~get~syncjobs~all~no~log"}]},{"title":"Update sync job","actions":[{"title":"Update sync job","method":"post","path":"/api/v1/edit/syncjob","slug":"post~api~v1~edit~syncjob"}]}]}],"config":{"playground":{"enabled":false},"optimized":false,"stylesheets":[],"basePath":"/"}}
+ });
+
+ return app;
+
+}());
+</script>
+ </body>
+</html>
diff --git a/docker-compose.yml b/docker-compose.yml
index f8c833c7..9baa1d28 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,501 +1,501 @@
version: '2.1'
services:
unbound-mailcow:
image: mailcow/unbound:1.8
build: ./data/Dockerfiles/unbound
command: /usr/sbin/unbound
environment:
- TZ=${TZ}
volumes:
- ./data/conf/unbound/unbound.conf:/etc/unbound/unbound.conf:ro
restart: always
tty: true
networks:
mailcow-network:
ipv4_address: ${IPV4_NETWORK:-172.22.1}.254
aliases:
- unbound
mysql-mailcow:
image: mariadb:10.3
stop_grace_period: 45s
volumes:
- mysql-vol-1:/var/lib/mysql/
- mysql-socket-vol-1:/var/run/mysqld/
- ./data/conf/mysql/:/etc/mysql/conf.d/:ro
environment:
- TZ=${TZ}
- MYSQL_ROOT_PASSWORD=${DBROOT}
- MYSQL_DATABASE=${DBNAME}
- MYSQL_USER=${DBUSER}
- MYSQL_PASSWORD=${DBPASS}
restart: always
ports:
- "${SQL_PORT:-127.0.0.1:13306}:3306"
networks:
mailcow-network:
aliases:
- mysql
redis-mailcow:
image: redis:5-alpine
volumes:
- redis-vol-1:/data/
restart: always
environment:
- TZ=${TZ}
networks:
mailcow-network:
ipv4_address: ${IPV4_NETWORK:-172.22.1}.249
aliases:
- redis
clamd-mailcow:
image: mailcow/clamd:1.29
build: ./data/Dockerfiles/clamd
restart: always
dns:
- ${IPV4_NETWORK:-172.22.1}.254
environment:
- TZ=${TZ}
- SKIP_CLAMD=${SKIP_CLAMD:-n}
volumes:
- ./data/conf/clamav/:/etc/clamav/
networks:
mailcow-network:
aliases:
- clamd
rspamd-mailcow:
image: mailcow/rspamd:1.46
build: ./data/Dockerfiles/rspamd
stop_grace_period: 30s
depends_on:
- nginx-mailcow
- dovecot-mailcow
environment:
- TZ=${TZ}
volumes:
- ./data/conf/rspamd/custom/:/etc/rspamd/custom
- ./data/conf/rspamd/override.d/:/etc/rspamd/override.d
- ./data/conf/rspamd/local.d/:/etc/rspamd/local.d
- ./data/conf/rspamd/plugins.d/:/etc/rspamd/plugins.d
- ./data/conf/rspamd/lua/:/etc/rspamd/lua/:ro
- ./data/conf/rspamd/rspamd.conf.local:/etc/rspamd/rspamd.conf.local
- ./data/conf/rspamd/rspamd.conf.override:/etc/rspamd/rspamd.conf.override
- rspamd-vol-1:/var/lib/rspamd
restart: always
dns:
- ${IPV4_NETWORK:-172.22.1}.254
hostname: rspamd
networks:
mailcow-network:
aliases:
- rspamd
php-fpm-mailcow:
image: mailcow/phpfpm:1.48
build: ./data/Dockerfiles/phpfpm
command: "php-fpm -d date.timezone=${TZ} -d expose_php=0"
depends_on:
- redis-mailcow
volumes:
- ./data/web:/web:rw
- ./data/conf/rspamd/dynmaps:/dynmaps:ro
- rspamd-vol-1:/var/lib/rspamd
- mysql-socket-vol-1:/var/run/mysqld/
- ./data/conf/sogo/:/etc/sogo/
- ./data/conf/rspamd/meta_exporter:/meta_exporter:ro
- ./data/conf/phpfpm/sogo-sso/:/etc/sogo-sso/
- ./data/conf/phpfpm/php-fpm.d/pools.conf:/usr/local/etc/php-fpm.d/z-pools.conf
- ./data/conf/phpfpm/php-conf.d/opcache-recommended.ini:/usr/local/etc/php/conf.d/opcache-recommended.ini
- ./data/conf/phpfpm/php-conf.d/upload.ini:/usr/local/etc/php/conf.d/upload.ini
- ./data/conf/phpfpm/php-conf.d/other.ini:/usr/local/etc/php/conf.d/zzz-other.ini
- ./data/assets/templates:/tpls
dns:
- ${IPV4_NETWORK:-172.22.1}.254
environment:
- LOG_LINES=${LOG_LINES:-9999}
- TZ=${TZ}
- DBNAME=${DBNAME}
- DBUSER=${DBUSER}
- DBPASS=${DBPASS}
- MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
- IMAP_PORT=${IMAP_PORT:-143}
- IMAPS_PORT=${IMAPS_PORT:-993}
- POP_PORT=${POP_PORT:-110}
- POPS_PORT=${POPS_PORT:-995}
- SIEVE_PORT=${SIEVE_PORT:-4190}
- SUBMISSION_PORT=${SUBMISSION_PORT:-587}
- SMTPS_PORT=${SMTPS_PORT:-465}
- SMTP_PORT=${SMTP_PORT:-25}
- API_KEY=${API_KEY:-invalid}
- API_ALLOW_FROM=${API_ALLOW_FROM:-invalid}
- COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME:-mailcow-dockerized}
- SKIP_SOLR=${SKIP_SOLR:-y}
- ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n}
restart: always
networks:
mailcow-network:
aliases:
- phpfpm
sogo-mailcow:
image: mailcow/sogo:1.61
build: ./data/Dockerfiles/sogo
environment:
- DBNAME=${DBNAME}
- DBUSER=${DBUSER}
- DBPASS=${DBPASS}
- TZ=${TZ}
- LOG_LINES=${LOG_LINES:-9999}
- MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
- ACL_ANYONE=${ACL_ANYONE:-disallow}
- ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n}
- IPV4_NETWORK=${IPV4_NETWORK:-172.22.1}
- SOGO_EXPIRE_SESSION=${SOGO_EXPIRE_SESSION:-480}
dns:
- ${IPV4_NETWORK:-172.22.1}.254
volumes:
- ./data/conf/sogo/:/etc/sogo/
- ./data/web/inc/init_db.inc.php:/init_db.inc.php
- ./data/conf/sogo/custom-sogo.js:/usr/lib/GNUstep/SOGo/WebServerResources/js/custom-sogo.js
- mysql-socket-vol-1:/var/run/mysqld/
- sogo-web-vol-1:/sogo_web
restart: always
networks:
mailcow-network:
ipv4_address: ${IPV4_NETWORK:-172.22.1}.248
aliases:
- sogo
dovecot-mailcow:
image: mailcow/dovecot:1.89
build: ./data/Dockerfiles/dovecot
dns:
- ${IPV4_NETWORK:-172.22.1}.254
cap_add:
- NET_BIND_SERVICE
volumes:
- ./data/conf/dovecot:/etc/dovecot
- ./data/assets/ssl:/etc/ssl/mail/:ro
- ./data/conf/sogo/:/etc/sogo/
- ./data/conf/phpfpm/sogo-sso/:/etc/phpfpm/
- vmail-vol-1:/var/vmail
- vmail-attachments-vol-1:/var/attachments
- crypt-vol-1:/mail_crypt/
- ./data/conf/rspamd/custom/:/etc/rspamd/custom
- ./data/assets/templates:/templates
- rspamd-vol-1:/var/lib/rspamd
- mysql-socket-vol-1:/var/run/mysqld/
environment:
- LOG_LINES=${LOG_LINES:-9999}
- DBNAME=${DBNAME}
- DBUSER=${DBUSER}
- DBPASS=${DBPASS}
- TZ=${TZ}
- MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
- IPV4_NETWORK=${IPV4_NETWORK:-172.22.1}
- ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n}
- MAILDIR_GC_TIME=${MAILDIR_GC_TIME:-1440}
- ACL_ANYONE=${ACL_ANYONE:-disallow}
- SKIP_SOLR=${SKIP_SOLR:-y}
- MAILDIR_SUB=${MAILDIR_SUB:-}
ports:
- "${DOVEADM_PORT:-127.0.0.1:19991}:12345"
- "${IMAP_PORT:-143}:143"
- "${IMAPS_PORT:-993}:993"
- "${POP_PORT:-110}:110"
- "${POPS_PORT:-995}:995"
- "${SIEVE_PORT:-4190}:4190"
restart: always
tty: true
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
hostname: ${MAILCOW_HOSTNAME}
networks:
mailcow-network:
ipv4_address: ${IPV4_NETWORK:-172.22.1}.250
aliases:
- dovecot
postfix-mailcow:
image: mailcow/postfix:1.40
build: ./data/Dockerfiles/postfix
volumes:
- ./data/conf/postfix:/opt/postfix/conf
- ./data/assets/ssl:/etc/ssl/mail/:ro
- postfix-vol-1:/var/spool/postfix
- crypt-vol-1:/var/lib/zeyple
- rspamd-vol-1:/var/lib/rspamd
- mysql-socket-vol-1:/var/run/mysqld/
environment:
- LOG_LINES=${LOG_LINES:-9999}
- TZ=${TZ}
- DBNAME=${DBNAME}
- DBUSER=${DBUSER}
- DBPASS=${DBPASS}
cap_add:
- NET_BIND_SERVICE
ports:
- "${SMTP_PORT:-25}:25"
- "${SMTPS_PORT:-465}:465"
- "${SUBMISSION_PORT:-587}:587"
restart: always
dns:
- ${IPV4_NETWORK:-172.22.1}.254
hostname: ${MAILCOW_HOSTNAME}
networks:
mailcow-network:
aliases:
- postfix
memcached-mailcow:
image: memcached:alpine
restart: always
environment:
- TZ=${TZ}
networks:
mailcow-network:
aliases:
- memcached
nginx-mailcow:
depends_on:
- sogo-mailcow
- php-fpm-mailcow
- redis-mailcow
image: nginx:mainline-alpine
dns:
- ${IPV4_NETWORK:-172.22.1}.254
command: /bin/sh -c "envsubst < /etc/nginx/conf.d/templates/listen_plain.template > /etc/nginx/conf.d/listen_plain.active &&
envsubst < /etc/nginx/conf.d/templates/listen_ssl.template > /etc/nginx/conf.d/listen_ssl.active &&
envsubst < /etc/nginx/conf.d/templates/server_name.template > /etc/nginx/conf.d/server_name.active &&
envsubst < /etc/nginx/conf.d/templates/sogo.template > /etc/nginx/conf.d/sogo.active &&
envsubst < /etc/nginx/conf.d/templates/sogo_eas.template > /etc/nginx/conf.d/sogo_eas.active &&
. /etc/nginx/conf.d/templates/sogo.auth_request.template.sh > /etc/nginx/conf.d/sogo_proxy_auth.active &&
nginx -qt &&
until ping phpfpm -c1 > /dev/null; do sleep 1; done &&
until ping sogo -c1 > /dev/null; do sleep 1; done &&
until ping redis -c1 > /dev/null; do sleep 1; done &&
until ping rspamd -c1 > /dev/null; do sleep 1; done &&
exec nginx -g 'daemon off;'"
environment:
- HTTPS_PORT=${HTTPS_PORT:-443}
- HTTP_PORT=${HTTP_PORT:-80}
- MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
- IPV4_NETWORK=${IPV4_NETWORK:-172.22.1}
- TZ=${TZ}
- ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n}
volumes:
- ./data/web:/web:ro
- ./data/conf/rspamd/dynmaps:/dynmaps:ro
- ./data/assets/ssl/:/etc/ssl/mail/:ro
- ./data/conf/nginx/:/etc/nginx/conf.d/:rw
- ./data/conf/rspamd/meta_exporter:/meta_exporter:ro
- sogo-web-vol-1:/usr/lib/GNUstep/SOGo/
ports:
- "${HTTPS_BIND:-0.0.0.0}:${HTTPS_PORT:-443}:${HTTPS_PORT:-443}"
- "${HTTP_BIND:-0.0.0.0}:${HTTP_PORT:-80}:${HTTP_PORT:-80}"
restart: always
networks:
mailcow-network:
aliases:
- nginx
acme-mailcow:
depends_on:
- nginx-mailcow
image: mailcow/acme:1.61
build: ./data/Dockerfiles/acme
dns:
- ${IPV4_NETWORK:-172.22.1}.254
environment:
- LOG_LINES=${LOG_LINES:-9999}
- ADDITIONAL_SAN=${ADDITIONAL_SAN}
- MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
- DBNAME=${DBNAME}
- DBUSER=${DBUSER}
- DBPASS=${DBPASS}
- SKIP_LETS_ENCRYPT=${SKIP_LETS_ENCRYPT:-n}
- SKIP_IP_CHECK=${SKIP_IP_CHECK:-n}
- SKIP_HTTP_VERIFICATION=${SKIP_HTTP_VERIFICATION:-n}
- ONLY_MAILCOW_HOSTNAME=${ONLY_MAILCOW_HOSTNAME:-n}
- LE_STAGING=${LE_STAGING:-n}
- TZ=${TZ}
volumes:
- ./data/web/.well-known/acme-challenge:/var/www/acme:rw
- ./data/assets/ssl:/var/lib/acme/:rw
- ./data/assets/ssl-example:/var/lib/ssl-example/:ro
- mysql-socket-vol-1:/var/run/mysqld/
restart: always
networks:
mailcow-network:
aliases:
- acme
netfilter-mailcow:
image: mailcow/netfilter:1.29
build: ./data/Dockerfiles/netfilter
stop_grace_period: 30s
depends_on:
- dovecot-mailcow
- postfix-mailcow
- sogo-mailcow
- php-fpm-mailcow
- redis-mailcow
restart: always
privileged: true
environment:
- TZ=${TZ}
- IPV4_NETWORK=${IPV4_NETWORK:-172.22.1}
- IPV6_NETWORK=${IPV6_NETWORK:-fd4d:6169:6c63:6f77::/64}
- SNAT_TO_SOURCE=${SNAT_TO_SOURCE:-n}
- SNAT6_TO_SOURCE=${SNAT6_TO_SOURCE:-n}
network_mode: "host"
volumes:
- /lib/modules:/lib/modules:ro
watchdog-mailcow:
image: mailcow/watchdog:1.59
# Debug
#command: /watchdog.sh
build: ./data/Dockerfiles/watchdog
dns:
- ${IPV4_NETWORK:-172.22.1}.254
volumes:
- rspamd-vol-1:/var/lib/rspamd
- mysql-socket-vol-1:/var/run/mysqld/
- ./data/assets/ssl:/etc/ssl/mail/:ro
restart: always
environment:
- LOG_LINES=${LOG_LINES:-9999}
- TZ=${TZ}
- DBNAME=${DBNAME}
- DBUSER=${DBUSER}
- DBPASS=${DBPASS}
- USE_WATCHDOG=${USE_WATCHDOG:-n}
- WATCHDOG_NOTIFY_EMAIL=${WATCHDOG_NOTIFY_EMAIL}
- WATCHDOG_NOTIFY_BAN=${WATCHDOG_NOTIFY_BAN:-y}
- MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
- IPV4_NETWORK=${IPV4_NETWORK:-172.22.1}
- IP_BY_DOCKER_API=${IP_BY_DOCKER_API:-0}
- CHECK_UNBOUND=${CHECK_UNBOUND:-1}
- SKIP_CLAMD=${SKIP_CLAMD:-n}
- SKIP_LETS_ENCRYPT=${SKIP_LETS_ENCRYPT:-n}
- HTTPS_PORT=${HTTPS_PORT:-443}
networks:
mailcow-network:
aliases:
- watchdog
dockerapi-mailcow:
- image: mailcow/dockerapi:1.35
+ image: mailcow/dockerapi:1.34
restart: always
build: ./data/Dockerfiles/dockerapi
oom_kill_disable: true
dns:
- ${IPV4_NETWORK:-172.22.1}.254
environment:
- DBROOT=${DBROOT}
- TZ=${TZ}
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
mailcow-network:
aliases:
- dockerapi
solr-mailcow:
image: mailcow/solr:1.6
build: ./data/Dockerfiles/solr
restart: always
volumes:
- solr-vol-1:/opt/solr/server/solr/dovecot-fts/data
ports:
- "${SOLR_PORT:-127.0.0.1:18983}:8983"
environment:
- TZ=${TZ}
- SOLR_HEAP=${SOLR_HEAP:-1024}
- SKIP_SOLR=${SKIP_SOLR:-y}
networks:
mailcow-network:
aliases:
- solr
olefy-mailcow:
image: mailcow/olefy:1.1
restart: always
build: ./data/Dockerfiles/olefy
environment:
- TZ=${TZ}
- OLEFY_BINDADDRESS=0.0.0.0
- OLEFY_BINDPORT=10055
- OLEFY_TMPDIR=/tmp
- OLEFY_PYTHON_PATH=/usr/bin/python3
- OLEFY_OLEVBA_PATH=/usr/bin/olevba3
- OLEFY_LOGLVL=20
- OLEFY_MINLENGTH=500
- OLEFY_DEL_TMP=1
networks:
mailcow-network:
aliases:
- olefy
ipv6nat-mailcow:
depends_on:
- unbound-mailcow
- mysql-mailcow
- redis-mailcow
- clamd-mailcow
- rspamd-mailcow
- php-fpm-mailcow
- sogo-mailcow
- dovecot-mailcow
- postfix-mailcow
- memcached-mailcow
- nginx-mailcow
- acme-mailcow
- netfilter-mailcow
- watchdog-mailcow
- dockerapi-mailcow
- solr-mailcow
environment:
- TZ=${TZ}
image: robbertkl/ipv6nat
restart: always
privileged: true
network_mode: "host"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /lib/modules:/lib/modules:ro
networks:
mailcow-network:
driver: bridge
driver_opts:
com.docker.network.bridge.name: br-mailcow
enable_ipv6: true
ipam:
driver: default
config:
- subnet: ${IPV4_NETWORK:-172.22.1}.0/24
- subnet: ${IPV6_NETWORK:-fd4d:6169:6c63:6f77::/64}
volumes:
# Storage for email files
vmail-vol-1:
# Storage for attachments (deduplicated)
vmail-attachments-vol-1:
mysql-vol-1:
mysql-socket-vol-1:
redis-vol-1:
rspamd-vol-1:
solr-vol-1:
postfix-vol-1:
crypt-vol-1:
sogo-web-vol-1:

File Metadata

Mime Type
text/x-diff
Expires
9月 9 Tue, 5:52 AM (10 h, 53 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
35/d8/65d0c2be9fcc75d3074c68fc3163
默认替代文本
(981 KB)

Event Timeline