diff --git a/.github/workflows/dependabot-automerge-js.yml b/.github/workflows/dependabot-automerge-js.yml new file mode 100644 index 000000000..f29eb4e59 --- /dev/null +++ b/.github/workflows/dependabot-automerge-js.yml @@ -0,0 +1,25 @@ +name: Auto-merge Dependabot JS +on: pull_request_target + +permissions: + pull-requests: write + contents: write + +jobs: + dependabot: + runs-on: ubuntu-latest + if: ${{ github.actor == 'dependabot[bot]' }} + steps: + - name: Dependabot metadata + id: metadata + uses: dependabot/fetch-metadata@v1.3.4 + with: + github-token: '${{ secrets.GITHUB_TOKEN }}' + - name: Approve and merge minor updates + if: ${{ steps.metadata.outputs.package-ecosystem == 'npm_and_yarn' && (steps.metadata.outputs.update-type == 'version-update:semver-minor' || steps.metadata.outputs.update-type == 'version-update:semver-patch') }} + run: | + gh pr review --approve "$PR_URL" + gh pr merge --auto --merge "$PR_URL" + env: + PR_URL: ${{ github.event.pull_request.html_url }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.it.yml b/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.it.yml index ebd33344f..8629f3d31 100644 --- a/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.it.yml +++ b/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.it.yml @@ -1,18 +1,18 @@ download_pictures: Scarica le immagini sul tuo server -carrot: Abilita la condivisione con Carrot +carrot: Abilita condivisione con Carrot diaspora_url: URL di diaspora*, se il servizio è abilitato export_epub: Abilita esportazione ePub -export_mobi: Abilita esportazione .mobi +export_mobi: Abilita esportazione .mobi (deprecato, verrà rimosso presto) export_pdf: Abilita esportazione PDF export_csv: Abilita esportazione CSV export_json: Abilita esportazione JSON export_txt: Abilita esportazione TXT export_xml: Abilita esportazione XML -shaarli_url: Shaarli URL, se il servizio è abilitato -scuttle_url: Scuttle URL, se il servizio è abilitato -unmark_url: Unmark URL, se il servizio è abilitato +shaarli_url: URL Shaarli, se il servizio è abilitato +scuttle_url: URL Scuttle, se il servizio è abilitato +unmark_url: URL Unmark, se il servizio è abilitato share_diaspora: Abilita la condivisione con diaspora* -share_mail: Abilita la condivisione per e-mail +share_mail: Abilita la condivisione via e-mail share_shaarli: Abilita la condivisione con Shaarli share_scuttle: Abilita la condivisione con Scuttle share_twitter: Abilita la condivisione con Twitter diff --git a/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.pl.yml b/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.pl.yml index f789475ee..83dde93ad 100644 --- a/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.pl.yml +++ b/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.pl.yml @@ -3,7 +3,7 @@ download_pictures: Pobierz obrazy na swój serwer carrot: Włącz udostępnianie dla Carrot diaspora_url: Adres URL Diaspora, jeżeli usługa jest włączona export_epub: Włącz eksport do ePub -export_mobi: Włącz eksport do .mobi +export_mobi: Włącz eksport do plików .mobi (przestarzałe, zostanie wkrótce usunięte) export_pdf: Włącz eksport do PDF export_csv: Włącz eksport do CSV export_json: Włącz eksport do JSON @@ -29,13 +29,12 @@ modify_settings: zatwierdź matomo_host: Host twojej strony Matomo (bez http:// lub https://) matomo_site_id: ID twojej strony Matomo matomo_enabled: Włacz Matomo -demo_mode_enabled: Włącz tryb demo? (używany wyłącznie dla publicznej demonstracji - Wallabag) -demo_mode_username: Użytkownik Demonstracyjny -share_public: Zezwalaj na publiczne adresy url dla wpisów +demo_mode_enabled: Włączyć tryb demonstracyjny? (Używany wyłącznie do publicznej demonstracji wallabag) +demo_mode_username: Użytkownik demonstracyjny +share_public: Zezwalaj na publiczne adresy URL dla wpisów download_images_enabled: Pobierz obrazy lokalnie restricted_access: Włącz autoryzację dla stron za paywallem api_user_registration: Włącz rejestrację użytkownika przy użyciu API unmark_url: Odznacz URL, jeżeli usługa jest włączona -store_article_headers: Włącz, jeżeli Wallabag zapisuje nagłówki HTTP dla każdego artykułu -shaarli_share_origin_url: Włącz udostępnianie URL Shaarli, jeżeli usługa jest włączona +store_article_headers: Włącz, jeżeli wallabag zapisuje nagłówki HTTP dla każdego artykułu +shaarli_share_origin_url: Włącz udostępnianie oryginalnego adresu URL do Shaarli, jeśli usługa jest włączona diff --git a/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.zh_Hant.yml b/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.zh_Hant.yml index 0967ef424..a3f6f83d3 100644 --- a/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.zh_Hant.yml +++ b/app/Resources/CraueConfigBundle/translations/CraueConfigBundle.zh_Hant.yml @@ -1 +1,5 @@ -{} +download_pictures: 下載圖片至你的服務器上 +diaspora_url: diaspora* URL(如果該服務已啟用) +settings_changed: 已更新設定 +export_epub: 啟用 ePub 輸出 +carrot: 啟用分享至 Carrot diff --git a/package.json b/package.json index bfa2d43c8..ff42b77e9 100644 --- a/package.json +++ b/package.json @@ -36,35 +36,35 @@ "url": "https://github.com/wallabag/wallabag/issues" }, "devDependencies": { - "@babel/core": "^7.18.13", - "@babel/eslint-parser": "^7.18.9", - "@babel/preset-env": "^7.18.10", - "autoprefixer": "^10.4.8", + "@babel/core": "^7.19.3", + "@babel/eslint-parser": "^7.19.1", + "@babel/preset-env": "^7.19.4", + "autoprefixer": "^10.4.12", "babel-loader": "^8.2.5", "css-loader": "^6.7.1", - "eslint": "^8.22.0", + "eslint": "^8.25.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.26.0", "eslint-webpack-plugin": "^3.2.0", "file-loader": "^6.2.0", "lato-font": "^3.0.0", "mini-css-extract-plugin": "^2.6.1", - "node-sass": "^7.0.1", - "postcss": "^8.4.16", + "node-sass": "^7.0.3", + "postcss": "^8.4.18", "postcss-loader": "^7.0.1", - "postcss-scss": "^4.0.4", - "sass": "^1.54.5", - "sass-loader": "^13.0.2", + "postcss-scss": "^4.0.5", + "sass": "^1.55.0", + "sass-loader": "^13.1.0", "style-loader": "^3.3.1", - "stylelint": "^14.11.0", - "stylelint-config-standard": "^26.0.0", + "stylelint": "^14.14.0", + "stylelint-config-standard": "^28.0.0", "stylelint-scss": "^4.3.0", "stylelint-webpack-plugin": "^3.3.0", - "terser-webpack-plugin": "^5.3.5", + "terser-webpack-plugin": "^5.3.6", "url-loader": "^4.1.1", "webpack": "^5.74.0", "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.10.0", + "webpack-dev-server": "^4.11.1", "webpack-manifest-plugin": "^5.0.0", "webpack-merge": "^5.7.3" }, @@ -74,7 +74,7 @@ "hammerjs": "^2.0.8", "highlight.js": "^11.6.0", "icomoon-free-npm": "^0.0.0", - "jquery": "^3.6.0", + "jquery": "^3.6.1", "jquery.cookie": "^1.4.1", "jr-qrcode": "^1.0.7", "material-design-icons-iconfont": "^6.7.0", diff --git a/src/Wallabag/ApiBundle/Controller/EntryRestController.php b/src/Wallabag/ApiBundle/Controller/EntryRestController.php index 6bb90f01d..3b898368c 100644 --- a/src/Wallabag/ApiBundle/Controller/EntryRestController.php +++ b/src/Wallabag/ApiBundle/Controller/EntryRestController.php @@ -119,6 +119,7 @@ class EntryRestController extends WallabagRestController * {"name"="since", "dataType"="integer", "required"=false, "format"="default '0'", "description"="The timestamp since when you want entries updated."}, * {"name"="public", "dataType"="integer", "required"=false, "format"="1 or 0, all entries by default", "description"="filter by entries with a public link"}, * {"name"="detail", "dataType"="string", "required"=false, "format"="metadata or full, metadata by default", "description"="include content field if 'full'. 'full' by default for backward compatibility."}, + * {"name"="domain_name", "dataType"="string", "required"=false, "format"="example.com", "description"="filter entries with the given domain name"}, * } * ) * @@ -138,6 +139,7 @@ class EntryRestController extends WallabagRestController $tags = \is_array($request->query->get('tags')) ? '' : (string) $request->query->get('tags', ''); $since = $request->query->get('since', 0); $detail = strtolower($request->query->get('detail', 'full')); + $domainName = (null === $request->query->get('domain_name')) ? '' : (string) $request->query->get('domain_name'); try { /** @var Pagerfanta $pager */ @@ -150,7 +152,8 @@ class EntryRestController extends WallabagRestController $order, $since, $tags, - $detail + $detail, + $domainName ); } catch (\Exception $e) { throw new BadRequestHttpException($e->getMessage()); diff --git a/src/Wallabag/ApiBundle/Controller/TagRestController.php b/src/Wallabag/ApiBundle/Controller/TagRestController.php index 7d9cc9b85..7e14e8d1c 100644 --- a/src/Wallabag/ApiBundle/Controller/TagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/TagRestController.php @@ -24,7 +24,7 @@ class TagRestController extends WallabagRestController $tags = $this->getDoctrine() ->getRepository(Tag::class) - ->findAllTags($this->getUser()->getId()); + ->findAllFlatTagsWithNbEntries($this->getUser()->getId()); $json = $this->get(SerializerInterface::class)->serialize($tags, 'json'); diff --git a/src/Wallabag/CoreBundle/Helper/ContentProxy.php b/src/Wallabag/CoreBundle/Helper/ContentProxy.php index d80bec87d..cb64b4b74 100644 --- a/src/Wallabag/CoreBundle/Helper/ContentProxy.php +++ b/src/Wallabag/CoreBundle/Helper/ContentProxy.php @@ -346,7 +346,7 @@ class ContentProxy * parse_url arrays. * * As array_diff_assoc only computes changes to go from the left array - * to the right one, we make two differents arrays to have both + * to the right one, we make two different arrays to have both * directions. We merge these two arrays and sort keys before passing * the result to the switch. * diff --git a/src/Wallabag/CoreBundle/Helper/CryptoProxy.php b/src/Wallabag/CoreBundle/Helper/CryptoProxy.php index 67d739156..5d73df70e 100644 --- a/src/Wallabag/CoreBundle/Helper/CryptoProxy.php +++ b/src/Wallabag/CoreBundle/Helper/CryptoProxy.php @@ -33,7 +33,7 @@ class CryptoProxy /** * Ensure the given value will be crypted. * - * @param string $secretValue Secret valye to crypt + * @param string $secretValue Secret value to crypt * * @return string */ diff --git a/src/Wallabag/CoreBundle/Helper/DetectActiveTheme.php b/src/Wallabag/CoreBundle/Helper/DetectActiveTheme.php index 9f90ee3e2..ec951be84 100644 --- a/src/Wallabag/CoreBundle/Helper/DetectActiveTheme.php +++ b/src/Wallabag/CoreBundle/Helper/DetectActiveTheme.php @@ -10,7 +10,7 @@ use Wallabag\UserBundle\Entity\User; * This class intend to detect the active theme for the logged in user. * It will retrieve the configured theme of the user. * - * If no user where logged in, it will returne the default theme + * If no user where logged in, it will return the default theme */ class DetectActiveTheme implements DeviceDetectionInterface { diff --git a/src/Wallabag/CoreBundle/Helper/EntriesExport.php b/src/Wallabag/CoreBundle/Helper/EntriesExport.php index 62217079b..30727ba1f 100644 --- a/src/Wallabag/CoreBundle/Helper/EntriesExport.php +++ b/src/Wallabag/CoreBundle/Helper/EntriesExport.php @@ -167,7 +167,7 @@ class EntriesExport $book->setAuthor($this->author, $this->author); - // I hope this is a non existant address :) + // I hope this is a non-existent address :) $book->setPublisher('wallabag', 'wallabag'); // Strictly not needed as the book date defaults to time(). $book->setDate(time()); diff --git a/src/Wallabag/CoreBundle/Repository/EntryRepository.php b/src/Wallabag/CoreBundle/Repository/EntryRepository.php index 4874f2790..7cadb091a 100644 --- a/src/Wallabag/CoreBundle/Repository/EntryRepository.php +++ b/src/Wallabag/CoreBundle/Repository/EntryRepository.php @@ -204,12 +204,13 @@ class EntryRepository extends ServiceEntityRepository * @param int $since * @param string $tags * @param string $detail 'metadata' or 'full'. Include content field if 'full' + * @param string $domainName * * @todo Breaking change: replace default detail=full by detail=metadata in a future version * * @return Pagerfanta */ - public function findEntries($userId, $isArchived = null, $isStarred = null, $isPublic = null, $sort = 'created', $order = 'asc', $since = 0, $tags = '', $detail = 'full') + public function findEntries($userId, $isArchived = null, $isStarred = null, $isPublic = null, $sort = 'created', $order = 'asc', $since = 0, $tags = '', $detail = 'full', $domainName = '') { if (!\in_array(strtolower($detail), ['full', 'metadata'], true)) { throw new \Exception('Detail "' . $detail . '" parameter is wrong, allowed: full or metadata'); @@ -248,7 +249,7 @@ class EntryRepository extends ServiceEntityRepository $entryAlias = 'e' . $i; $tagAlias = 't' . $i; - // Complexe queries to ensure multiple tags are associated to an entry + // Complex queries to ensure multiple tags are associated to an entry // https://stackoverflow.com/a/6638146/569101 $qb->andWhere($qb->expr()->in( 'e.id', @@ -264,6 +265,10 @@ class EntryRepository extends ServiceEntityRepository } } + if (\is_string($domainName) && '' !== $domainName) { + $qb->andWhere('e.domainName = :domainName')->setParameter('domainName', $domainName); + } + if (!\in_array(strtolower($order), ['asc', 'desc'], true)) { throw new \Exception('Order "' . $order . '" parameter is wrong, allowed: asc or desc'); } diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml index a65b03c8b..a25a4a27c 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml @@ -508,14 +508,14 @@ import: wallabag_v1: page_title: Aus wallabag v1 importieren description: Dieser Import wird all deine Artikel aus wallabag v1 importieren. Klicke in der Konfigurationsseite auf "JSON-Export" im "wallabag-Daten exportieren"-Abschnitt. Du erhältst eine "wallabag-export-1-xxxx-xx-xx.json"-Datei. - how_to: Wähle die exportierte Datei aus und klicke den nachfolgenden Button, um diese hochzuladen und zu importieren. + how_to: Wähle die exportierte Datei aus und klicke auf den nachfolgenden Button, um diese hochzuladen und zu importieren. wallabag_v2: page_title: Aus wallabag v2 importieren description: Dieser Import wird all deine Artikel aus wallabag v2 importieren. Gehe auf "Alle Artikel" und dann, in der Exportieren-Seitenleiste auf "JSON". Dabei erhältst du eine "All articles.json"-Datei. readability: page_title: Aus Readability importieren description: Dieser Importer wird all deine Artikel aus Readability importieren. Auf der Werkzeugseite (https://www.readability.com/tools/) klickst du auf „Exportiere deine Daten“ in dem Abschnitt „Datenexport“. Du wirst eine E-Mail mit einem Herunterladenlink zu einer json Datei, die aber nicht auf .json endet, erhalten. - how_to: Bitte wähle deinen Readability Export aus und klicke den unteren Button für das Hochladen und Importieren dessen. + how_to: Bitte wähl deinen Readability-Export aus und klick den unteren Button für das Hochladen und Importieren dessen an. worker: enabled: 'Der Import erfolgt asynchron. Sobald der Import gestartet ist, wird diese Aufgabe extern abgearbeitet. Der aktuelle Service dafür ist:' download_images_warning: Du hast das Herunterladen von Bildern für deine Artikel aktiviert. Verbunden mit dem klassischen Import kann es ewig dauern fortzufahren (oder sogar fehlschlagen). Wir empfehlen den asynchronen Import zu aktivieren, um Fehler zu vermeiden. @@ -530,11 +530,11 @@ import: instapaper: page_title: Aus Instapaper importieren description: Dieser Import wird all deine Instapaper Artikel importieren. Auf der Einstellungsseite (https://www.instapaper.com/user) klickst du auf "Download .CSV Datei" in dem Abschnitt "Export". Eine CSV Datei wird heruntergeladen (z.B. "instapaper-export.csv"). - how_to: Bitte wähle deine Instapaper Sicherungsdatei aus und klicke den nachfolgenden Button zum Importieren. + how_to: Bitte wähle deine Instapaper-Sicherungsdatei aus und klicke auf den nachfolgenden Button zum Importieren. pinboard: page_title: Aus Pinboard importieren description: Dieser Import wird all deine Pinboard Artikel importieren. Auf der Seite Backup (https://pinboard.in/settings/backup) klickst du auf "JSON" in dem Abschnitt "Lesezeichen". Eine JSON Datei wird dann heruntergeladen (z.B. "pinboard_export"). - how_to: Bitte wähle deinen Pinboard Export aus und klicke den nachfolgenden Button zum Importieren. + how_to: Bitte wähle deinen Pinboard-Export aus und klicke auf den nachfolgenden Button zum Importieren. elcurator: page_title: Importieren > elCurator description: Dieses Tool wird all deine ElCurator-Artikel importieren. Öffne die Einstellungen in deinem ElCurator-Konto und exportiere dort den Inhalt; du wirst eine JSON-Datei erhalten. diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml index 8989195e2..bbe3a5366 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml @@ -26,7 +26,7 @@ menu: howto: Come fare developer: Gestione client API logout: Esci - about: A proposito + about: Informazioni search: Cerca save_link: Salva collegamento back_to_unread: Torna ai contenuti non letti @@ -37,6 +37,7 @@ menu: theme_toggle_auto: Tema automatico theme_toggle_dark: Tema scuro theme_toggle_light: Tema chiaro + with_annotations: Con annotazioni top: add_new_entry: Aggiungi un nuovo contenuto search: Cerca diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml index 4c188ac4c..523db54ee 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml @@ -16,14 +16,14 @@ security: menu: left: unread: Nieprzeczytane - starred: Oznaczone gwiazdką + starred: Wyróżnione archive: Archiwum all_articles: Wszystkie config: Konfiguracja tags: Tagi internal_settings: Wewnętrzne ustawienia import: Importuj - howto: How to + howto: Jak to zrobić developer: Zarządzanie klientami API logout: Wyloguj about: O nas @@ -33,10 +33,11 @@ menu: users_management: Zarządzanie użytkownikami site_credentials: Poświadczenia strony quickstart: Szybki start - ignore_origin_instance_rules: Ignoruj globalne zasady pochodzenia + ignore_origin_instance_rules: Globalne zasady ignorowania pochodzenia theme_toggle_auto: Automatyczny motyw theme_toggle_dark: Ciemny motyw theme_toggle_light: Jasny motyw + with_annotations: Z adnotacjami top: add_new_entry: Dodaj nowy wpis search: Szukaj @@ -63,13 +64,13 @@ config: rules: Zasady tagowania new_user: Dodaj użytkownika reset: Zresetuj obszar - ignore_origin: Ignoruj zasady pochodzenia + ignore_origin: Zasady ignorowania pochodzenia feed: Źródła form: save: Zapisz form_settings: theme_label: Temat - items_per_page_label: Ilość elementów na stronie + items_per_page_label: Liczba elementów na stronie language_label: Język reading_speed: label: Prędkość czytania @@ -86,8 +87,8 @@ config: android_configuration: Skonfiguruj swoją androidową aplikację android_instruction: Dotknij tutaj, aby wstępnie uzupełnij androidową aplikację help_theme: Dopasuj wallabag do swoich potrzeb. Tutaj możesz wybrać preferowany przez ciebie motyw. - help_items_per_page: Możesz zmienić ilość artykułów wyświetlanych na każdej stronie. - help_reading_speed: wallabag oblicza czas czytania każdego artykułu. Dzięki tej liście możesz określić swoje tempo. Wallabag przeliczy ponownie czas potrzebny, na przeczytanie każdego z artykułów. + help_items_per_page: Możesz zmienić liczbę artykułów wyświetlanych na każdej stronie. + help_reading_speed: wallabag oblicza czas czytania każdego artykułu. Możesz tutaj określić, dzięki tej liście, czy jesteś szybkim czy powolnym czytelnikiem. wallabag przeliczy czas czytania każdego artykułu. help_language: Możesz zmienić język interfejsu wallabag. help_pocket_consumer_key: Wymagane dla importu z Pocket. Możesz go stworzyć na swoim koncie Pocket. form_rss: @@ -106,32 +107,32 @@ config: form_user: two_factor_description: Włączenie autoryzacji dwuetapowej oznacza, że będziesz otrzymywał maile z kodem przy każdym nowym, niezaufanym połączeniu. name_label: Nazwa - email_label: Adres email + email_label: Adres e-mail twoFactorAuthentication_label: Autoryzacja dwuetapowa help_twoFactorAuthentication: Jeżeli włączysz autoryzację dwuetapową. Za każdym razem, kiedy będziesz chciał się zalogować, dostaniesz kod na swój e-mail. delete: - title: Usuń moje konto (niebezpieczna strefa !) + title: Usuń moje konto (niebezpieczna strefa!) description: Jeżeli usuniesz swoje konto, wszystkie twoje artykuły, tagi, adnotacje, oraz konto zostaną trwale usunięte (operacja jest NIEODWRACALNA). Następnie zostaniesz wylogowany. confirm: Jesteś pewien? (tej operacji NIE MOŻNA cofnąć) button: Usuń moje konto two_factor: action_app: Użyj aplikacji do jednorazowych kodów - action_email: Użyj e-mail’a + action_email: Użyj e-maila state_disabled: Wyłączone state_enabled: Włączone table_action: Akcja table_state: Stan table_method: Metoda googleTwoFactor_label: Używając aplikacji do jednorazowych kodów logowania (uruchom aplikacje w stylu Google Authenticator, Authy lub FreeOTP by uzyskać kod) - emailTwoFactor_label: Używając email’a (otrzymasz kod na podany adres) + emailTwoFactor_label: Używając e-maila (otrzymasz kod na podany adres) login_label: Login (nie może zostać później zmieniony) reset: title: Reset (niebezpieczna strefa) description: Poniższe przyciski pozwalają usunąć pewne informacje z twojego konta. Uważaj te operacje są NIEODWRACALNE. annotations: Usuń WSZYSTKIE adnotacje tags: Usuń WSZYSTKIE tagi - entries: usuń WSZYTSTKIE wpisy - archived: usuń WSZYSTKIE zarchiwizowane wpisy + entries: Usuń WSZYTSTKIE wpisy + archived: Usuń WSZYSTKIE zarchiwizowane wpisy confirm: Jesteś pewien? (tej operacji NIE MOŻNA cofnąć) form_password: description: Tutaj możesz zmienić swoje hasło. Twoje nowe hasło powinno mieć conajmniej 8 znaków. @@ -143,7 +144,7 @@ config: then_tag_as_label: wtedy otaguj jako delete_rule_label: usuń edit_rule_label: edytuj - rule_label: Reguła + rule_label: Zasada tags_label: Tagi faq: title: FAQ @@ -162,7 +163,7 @@ config: isStarred: Czy wpis został oznaczony gwiazdką czy nie content: Zawartość wpisu language: Język wpisu - mimetype: Mime-type wpisu + mimetype: Typ mediów wpisu readingTime: Szacunkowy czas czytania wpisu w minutach domainName: Nazwa domeny wpisu operator_description: @@ -179,7 +180,7 @@ config: notmatches: 'Sprawdź czy temat nie zawiera szukaj (duże lub małe litery).
Przykład: tytuł nie zawiera "piłka nożna"' card: export_tagging_rules_detail: Pobierz plik JSON z ustawieniami tagowania. - import_tagging_rules_detail: Musisz zaznaczyć plik z rozszerzeniem JSON który wcześniej zapisałeś. + import_tagging_rules_detail: Musisz wybrać wcześniej wyeksportowany plik JSON. export_tagging_rules: Eksportuj/zapisz plik z zasadami tagowania import_tagging_rules: Importuj zasady tagowania new_tagging_rule: Utwórz zasadę oznaczania tagami @@ -187,33 +188,61 @@ config: file_label: Plik JSON export: Eksportuj form_feed: - description: Lista artykułów Atom pozwala czytać zapisane artykuły w twoim ulubionym programie. Musisz najpierw wygenerować token Atom’a. + description: Kanały Atom dostarczane przez wallabag umożliwiają czytanie zapisanych artykułów za pomocą ulubionego czytnika Atom. Musisz najpierw wygenerować token. feed_limit: Liczba artykułów w aktualnościach feed_link: all: Wszystko archive: Zarchiwizowane starred: Wyróżnione - unread: Nieodczytane + unread: Nieprzeczytane feed_links: Linki do aktualności token_revoke: Anuluj token token_reset: Stwórz ponownie token token_create: Stwórz swój token - no_token: Brak token’a + no_token: Brak tokena token_label: Token listy form_ignore_origin_rules: faq: title: FAQ + meaning: Znaczenie + variable_description: + label: Zmienna + host: Host adresu + _all: Pełny adres, głównie do dopasowywania wzorów + ignore_origin_rules_definition_title: Co oznacza "Ignoruj zasady pochodzenia"? + how_to_use_them_description: Załóżmy, że chcesz zignorować pochodzenie wpisu pochodzącego z « rss.example.com » (wiedząc, że po przekierowaniu faktyczny adres to example.com).
W takim przypadku należy umieścić « host = "rss.example.com" » w polu Reguła. + variables_available_title: Jakich zmiennych i operatorów mogę użyć przy pisaniu reguł? + operator_description: + matches: 'Sprawdza, czy temat pasuje do wyszukiwania (wielkość liter nie ma znaczenia).
Przykład: _all ~ "https?://rss.example.com/foobar/.*"' + label: Operator + equal_to: Równe… + ignore_origin_rules_definition_description: Są one używane przez wallabag do automatycznego ignorowania adresu źródłowego po przekierowaniu.
Jeśli przekierowanie nastąpi podczas pobierania nowego wpisu, wszystkie reguły ignorowania pochodzenia (zdefiniowane przez użytkownika i zdefiniowane przez instancję) zostaną użyte do zignorowania adresu pochodzenia. + how_to_use_them_title: Jak ich użyć? + variables_available_description: 'Następujące zmienne i operatory mogą być użyte do tworzenia reguł ignorowania pochodzenia:' + otp: + app: + enable: Włącz + two_factor_code_description_5: 'Jeśli nie widzisz kodu QR lub nie możesz go zeskanować, wprowadź następujący sekret w swojej aplikacji:' + two_factor_code_description_4: 'Przetestuj kod OTP ze skonfigurowanej aplikacji:' + cancel: Anuluj + qrcode_label: Kod QR + two_factor_code_description_1: Właśnie włączono uwierzytelnianie dwuskładnikowe OTP, otwórz aplikację OTP i użyj tego kodu, aby uzyskać jednorazowe hasło. Zniknie po przeładowaniu strony. + two_factor_code_description_2: 'Możesz zeskanować ten kod QR za pomocą swojej aplikacji:' + two_factor_code_description_3: 'Zapisz też te kody zapasowe w bezpiecznym miejscu, możesz ich użyć w przypadku utraty dostępu do aplikacji OTP:' + page_title: Uwierzytelnianie dwuskładnikowe entry: default_title: Tytuł wpisu page_titles: unread: Nieprzeczytane wpisy - starred: Wpisy oznaczone gwiazdką + starred: Wpisy wyróżnione archived: Zarchiwizowane wpisy filtered: Odfiltrowane wpisy filtered_tags: 'Filtrowane po tagach:' filtered_search: 'Filtrowanie po wyszukiwaniu:' untagged: Odtaguj wpisy all: Wszystkie przedmioty + with_annotations: Wpisy z adnotacjami + same_domain: Ta sama domena list: number_on_the_page: '{0} Nie ma wpisów.|{1} Jest jeden wpis.|]1,Inf[ Są %count% wpisy.' reading_time: szacunkowy czas czytania @@ -224,14 +253,16 @@ entry: reading_time_less_one_minute_short: '< 1 min' original_article: oryginał toogle_as_read: Oznacz jako przeczytane - toogle_as_star: Oznacz jako ulubione + toogle_as_star: Przełącz wyróżnienie delete: Usuń - export_title: Export + export_title: Eksportuj + show_same_domain: Pokaż artykuły z tej samej domeny + assign_search_tag: Przypisz to wyszukiwanie jako tag do każdego wyniku filters: title: Filtry status_label: Status archived_label: Zarchiwizowane - starred_label: Oznaczone gwiazdką + starred_label: Wyróżnione unread_label: Nieprzeczytane preview_picture_label: Posiada podgląd obrazu preview_picture_help: Podgląd obrazu @@ -251,26 +282,31 @@ entry: action: clear: Wyczyść filter: Filtruj + annotated_label: Z adnotacjami view: left_menu: back_to_top: Wróć na górę back_to_homepage: Cofnij set_as_read: Oznacz jako przeczytane set_as_unread: Oznacz jako nieprzeczytane - set_as_starred: Ulubione + set_as_starred: Przełącz wyróżnienie view_original_article: Oryginalny artykuł re_fetch_content: Pobierz ponownie treść delete: Usuń add_a_tag: Dodaj tag share_content: Udostępnij - share_email_label: Adres email + share_email_label: Adres e-mail public_link: Publiczny link delete_public_link: Usuń publiczny link - export: Export + export: Eksportuj print: Drukuj problem: label: Problemy? description: Czy ten artykuł wygląda źle? + theme_toggle: Przełącznik motywu + theme_toggle_light: Jasny + theme_toggle_dark: Ciemny + theme_toggle_auto: Automatyczny edit_title: Edytuj tytuł original_article: oryginalny annotations_on_the_entry: '{0} Nie ma adnotacji |{1} Jedna adnotacja |]1,Inf[ %count% adnotacji' @@ -282,25 +318,26 @@ entry: page_title: Zapisz nowy wpis placeholder: http://website.com form_new: - url_label: Url + url_label: Adres URL search: placeholder: Czego szukasz? edit: page_title: Edytuj wpis title_label: Tytuł url_label: Adres URL - origin_url_label: Oryginalny url (gdzie znalazłeś ten wpis) + origin_url_label: Oryginalny adres URL (gdzie znaleziono ten wpis) save_label: Zapisz public: shared_by_wallabag: Ten artykuł został udostępniony przez wallabag confirm: delete: Czy jesteś pewien, że chcesz usunąć ten artykuł? - delete_tag: Czy jesteś pewien, że chcesz usunąć ten tag, z tego artykułu? + delete_tag: Czy jesteś pewien, że chcesz usunąć ten tag z tego artykułu? metadata: reading_time: Szacowany czas czytania reading_time_minutes_short: '%readingTime% min' address: Adres added_on: Dodano + published_on: Opublikowano dnia about: page_title: O nas top_menu: @@ -308,7 +345,7 @@ about: getting_help: Pomoc helping: Pomóż wallabagowi contributors: Osoby, które pomogły przy projekcie - third_party: Biblioteki Third-party + third_party: Biblioteki zewnętrzne who_behind_wallabag: developped_by: Stworzony przez website: strona internetowa @@ -328,11 +365,11 @@ about: contributors: description: Podziękuj osobą, które przyczyniły się do projektu przez aplikację webową third_party: - description: 'Tutaj znajduje się lista Third-party bibliotek użytych w wallabag (z ich licencjami):' + description: 'Tutaj znajduje się lista bibliotek zewnętrznych użytych w wallabag (z ich licencjami):' package: Paczka license: Licencja howto: - page_title: How to + page_title: Jak to zrobić page_description: 'Sposoby zapisania artykułu:' tab_menu: add_link: Dodaj link @@ -361,14 +398,14 @@ howto: action: Akcja all_pages_title: Skróty dostępne na wszystkich stronach go_unread: Idź do nieprzeczytanych - go_starred: Idź do oznaczonych gwiazdką + go_starred: Idź do wyróżnionych go_archive: Idź do archiwum go_all: Idź do wszystkich wpisów go_tags: Idź do tagów go_config: Idź do konfiguracji go_import: Idź do importu go_developers: Idź do deweloperów - go_howto: Idź do howto (tej strony!) + go_howto: Idź do jak to zrobić (tej strony!) go_logout: Wyloguj list_title: Skróty dostępne w spisie stron search: Pokaż formularz wyszukiwania @@ -395,9 +432,10 @@ quickstart: language: Zmień język i wygląd rss: Włącz kanały RSS tagging_rules: Napisz reguły pozwalające na automatyczne otagowanie twoich artykułów + feed: Włącz kanały admin: title: Administracja - description: 'Jako administrator wallabag, możesz:' + description: 'Jako administrator masz uprawnienia w wallabag. Możesz:' new_user: Tworzyć nowego użytkownika analytics: Konfigurować analityki sharing: Włączyć pewne parametry dotyczące udostępniania artykułów @@ -405,11 +443,11 @@ quickstart: import: Skonfigurować import first_steps: title: Pierwsze kroki - description: Teraz wallabag jest poprawnie skonfigurowany, więc czas zarchiwizować Internet. Kliknij w prawym górnym rogu na znak +, aby dodać link. + description: Teraz wallabag jest poprawnie skonfigurowany, więc czas zarchiwizować Internet. Kliknij w prawym górnym rogu znak +, aby dodać link. new_article: Zapisz swój pierwszy artukuł unread_articles: I sklasyfikuj go! migrate: - title: Migruj w istniejącej usługi + title: Migruj z istniejącej usługi description: Używasz innej usługi? Pomożemy ci pobrać twoje dane do wallabag. pocket: Migruj z Pocket wallabag_v1: Migruj z wallabag v1 @@ -422,8 +460,8 @@ quickstart: create_application: Stwórz swoją aplikację use_docker: Użyj Dockera aby zainstalować wallabag docs: - title: Pełna Dokumentacja - description: Wallabag powiada wiele funkcji. Nie wahaj się przeczytać instrukcji, aby je poznać i nauczyć się jak ich używać. + title: Pełna dokumentacja + description: wallabag ma wiele funkcji. Nie wahaj się przeczytać instrukcji, aby je poznać i nauczyć się z nich korzystać. annotate: Dadaj adnotację do swojego artykułu export: Konwertuj swoje artykuły do ePUB lub PDF search_filters: Zabacz jak możesz znaleźć artykuł dzięku użyciu silnika wyszukiwarki i filtrów @@ -433,7 +471,7 @@ quickstart: title: Wsparcie description: Jeżeli potrzebujesz pomocy, jesteśmy tutaj dla ciebie. github: na GitHubie - email: przez email + email: przez e-mail gitter: na Gitterze tag: page_title: Tagi @@ -441,6 +479,7 @@ tag: number_on_the_page: '{0} Nie ma tagów.|{1} Jest jeden tag.|]1,Inf[ Są %count% tagi.' see_untagged_entries: Zobacz nieotagowane wpisy untagged: Odtaguj wpisy + no_untagged_entries: Nie ma nieoznaczonych wpisów. new: add: Dodaj placeholder: Możesz dodać kilka tagów, oddzielając je przecinkami. @@ -448,35 +487,35 @@ export: footer_template:

Stworzone przez wallabag z %method%

Proszę zgłoś sprawę, jeżeli masz problem z wyświetleniem tego e-booka na swoim urządzeniu.

unknown: Nieznany import: - page_title: Import - page_description: Witaj w importerze Wallabag. Wybierz swoją poprzednią usługę, z której chcesz migrować. + page_title: Importuj + page_description: Witaj w importerze wallabag. Wybierz swoją poprzednią usługę, z której chcesz migrować. action: import_contents: Import zawartości form: mark_as_read_title: Oznaczyć wszystkie jako przeczytane? mark_as_read_label: Oznacz wszystkie zaimportowane wpisy jako przeczytane file_label: Plik - save_label: Właduj plik + save_label: Prześlij plik pocket: page_title: Importuj > Pocket description: Ten importer, zaimportuje dane z usługi Pocket. Pocket nie pozwala na nam na pobranie zawartości ze swojej usługi, więc kontent każdego artykułu zostanie ponownie pobrany przez wallabag. config_missing: description: Import z Pocket nie jest skonfigurowany. admin_message: Musisz zdefiniować %keyurls%a pocket_consumer_key%keyurle%. - user_message: Admin twojego servera musi zdefiniować API Key dla Pocket. - authorize_message: Możesz zaimportować dane ze swojego konta Pocket. Kliknij poniższy przycisk i autoryzuj aplikacje aby połączyć się z getpocket.com. + user_message: Administrator serwera musi zdefiniować klucz API dla Pocket. + authorize_message: Możesz zaimportować swoje dane z konta Pocket. Wystarczy, że klikniesz w poniższy przycisk i autoryzujesz aplikację do połączenia z getpocket.com. connect_to_pocket: Połącz z Pocket i importuj dane wallabag_v1: page_title: Importuj > Wallabag v1 description: Ten importer, zaimportuje wszystkie twoje artykułu z wallabag v1. Na swojej stronie konfiguracyjnej kliknij "JSON eksport" w sekcji "Eksportuj swoje dane wallabag". Otrzymasz plik "wallabag-export-1-xxxx-xx-xx.json". - how_to: Wybierz swój plik eksportu z wallabag i kliknij poniższy przycisk, aby go załadować. + how_to: Wybierz swój plik eksportu z wallabag i kliknij przycisk poniżej, aby go przesłać i zaimportować. wallabag_v2: page_title: Importuj > Wallabag v2 description: Ten importer, zaimportuje wszystkie twoje artykułu z wallabag v2. Idź do wszystkich artykułów, a następnie na panelu exportu kliknij na "JSON". Otrzymasz plik "All articles.json". readability: page_title: Importuj > Readability description: Ten importer, zaimportuje wszystkie twoje artykuły z Readability. Na stronie narzędzi (https://www.readability.com/tools/), kliknij na "Export your data" w sekcji "Data Export". Otrzymach email z plikiem JSON (plik nie będzie zawierał rozszerzenia .json). - how_to: Wybierz swój plik eksportu z Readability i kliknij poniższy przycisk, aby go załadować. + how_to: Wybierz swój plik eksportu z Readability i kliknij przycisk poniżej, aby go przesłać i zaimportować. worker: enabled: 'Import jest wykonywany asynchronicznie. Od momentu rozpoczęcia importu, zewnętrzna usługa może zajmować się na raz tylko jednym zadaniem. Bieżącą usługą jest:' download_images_warning: Włączyłeś pobieranie obrazów dla swoich artykułów. W połączeniu z klasycznym importem, może to zająć dużo czasu (lub zakończyć się niepowodzeniem).Zdecydowanie zalecamy włączenie asynchronicznego importu, w celu uniknięcia błędów. @@ -491,11 +530,18 @@ import: instapaper: page_title: Importuj > Instapaper description: Ten importer, zaimportuje wszystkie twoje artykuły z Instapaper. W ustawieniach (https://www.instapaper.com/user), kliknij na "Download .CSV file" w sekcji "Export". Otrzymasz plik CSV. - how_to: Wybierz swój plik eksportu z Instapaper i kliknij poniższy przycisk, aby go załadować. + how_to: Wybierz swój plik eksportu z Instapaper i kliknij przycisk poniżej, aby go przesłać i zaimportować. pinboard: page_title: Importuj > Pinboard description: Ten importer, zaimportuje wszystkie twoje artykuły z Pinboard. W ustawieniach kopii zapasowej (https://pinboard.in/settings/backup), kliknij na "JSON" w sekcji "Bookmarks". Otrzymasz plik "pinboard_export". - how_to: Wybierz swój plik eksportu z Pinboard i kliknij poniższy przycisk, aby go załadować. + how_to: Wybierz swój plik eksportu z Pinboard i kliknij przycisk poniżej, aby go przesłać i zaimportować. + elcurator: + page_title: Importuj > elCurator + description: Ten importer zaimportuje wszystkie artykuły elCurator. Przejdź do swoich preferencji na koncie elCurator, a następnie wyeksportuj treści. Otrzymasz plik JSON. + delicious: + page_title: Importuj > del.icio.us + description: Ten importer zaimportuje wszystkie zakładki Delicious. Od 2021 r. możesz ponownie wyeksportować z niego swoje dane za pomocą strony eksportu (https://del.icio.us/export). Wybierz format "JSON" i pobierz go (np. "delicious_export.2021.02.06_21.10.json"). + how_to: Wybierz plik eksportu Delicious i kliknij przycisk poniżej, aby go przesłać i zaimportować. developer: page_title: Zarządzanie klientami API welcome_message: Witaj w API wallabag @@ -510,7 +556,7 @@ developer: title: Istniejący klienci field_id: ID klienta field_secret: Sekret klienta - field_uris: Przekieruj URIs + field_uris: Przekieruj identyfikatory URI field_grant_types: Przyznaj pozwolenie no_client: Nie ma jeszcze klienta. remove: @@ -525,11 +571,12 @@ developer: redirect_uris_label: Przekieruj adresy URI save_label: Stwórz nowego klienta action_back: Cofnij + copy_to_clipboard: Kopiuj client_parameter: page_title: Zarządzanie klientami API > Parametry klienta page_description: Tutaj znajdują się parametry klienta. field_name: Nazwa klienta - field_id: Client ID + field_id: ID klienta field_secret: Sekret klienta back: Cofnij read_howto: Przeczytaj jak "Stworzyć moją pierwszą aplikację" @@ -562,14 +609,16 @@ user: password_label: Hasło repeat_new_password_label: Powtórz nowe hasło plain_password_label: Jawne hasło - email_label: Adres email + email_label: Adres e-mail enabled_label: Włączony last_login_label: Ostatnie logowanie twofactor_label: Autoryzacja dwuetapowa save: Zapisz delete: Usuń - delete_confirm: Jesteś pewien? + delete_confirm: Czy na pewno? back_to_list: Powrót do listy + twofactor_google_label: Uwierzytelnianie dwuskładnikowe przez aplikację OTP + twofactor_email_label: Uwierzytelnianie dwuskładnikowe przez e-mail search: placeholder: Filtruj po nazwie użytkownika lub adresie e-mail site_credential: @@ -589,7 +638,7 @@ site_credential: password_label: Hasło save: Zapisz delete: Usuń - delete_confirm: Jesteś pewien? + delete_confirm: Czy na pewno? back_to_list: Powrót do listy error: page_title: Wystąpił błąd @@ -608,6 +657,15 @@ flashes: tags_reset: Zresetuj tagi entries_reset: Zresetuj wpisy archived_reset: Zarchiwizowane wpisy usunięte + feed_updated: Zaktualizowano informacje o kanale + feed_token_updated: Zaktualizowano token kanału + ignore_origin_rules_updated: Zaktualizowano zasadę ignorowania pochodzenia + otp_enabled: Włączono uwierzytelnianie dwuskładnikowe + tagging_rules_imported: Zaimportowano zasady tagowania + feed_token_revoked: Unieważniono token kanału + otp_disabled: Wyłączono uwierzytelnianie dwuskładnikowe + tagging_rules_not_imported: Błąd podczas importowania zasad tagowania + ignore_origin_rules_deleted: Usunięto zasadę ignorowania pochodzenia entry: notice: entry_already_saved: Wpis już został dodany %date% @@ -618,12 +676,14 @@ flashes: entry_reloaded_failed: Wpis ponownie załadowany, ale wystąpił bład pobierania treści entry_archived: Wpis dodany do archiwum entry_unarchived: Wpis usunięty z archiwum - entry_starred: Wpis oznaczony gwiazdką - entry_unstarred: Wpis odznaczony gwiazdką + entry_starred: Wpis wyróżniony + entry_unstarred: Wpis bez wyróżnienia entry_deleted: Wpis usunięty + no_random_entry: Nie znaleziono artykułu spełniającego te kryteria tag: notice: tag_added: Tag dodany + tag_renamed: Zmieniono nazwę tagu import: notice: failed: Nieudany import, prosimy spróbować ponownie. @@ -647,3 +707,25 @@ flashes: added: Poświadczenie dla "%host%" dodane updated: Poświadczenie dla "%host%" zaktualizowane deleted: Poświadczenie dla "%host%" usuniętę + ignore_origin_instance_rule: + notice: + added: Dodano globalną zasadę ignorowania pochodzenia + updated: Zaktualizowano globalną zasadę ignorowania pochodzenia + deleted: Usunięto globalną zasadę ignorowania pochodzenia +ignore_origin_instance_rule: + page_title: Globalne zasady ignorowania pochodzenia + new_ignore_origin_instance_rule: Utwórz globalną zasadę ignorowania pochodzenia + edit_ignore_origin_instance_rule: Edytuj globalną zasadę ignorowania pochodzenia + form: + delete: Usuń + rule_label: Zasada + delete_confirm: Czy na pewno? + back_to_list: Powrót do listy + save: Zapisz + list: + create_new_one: Utwórz nową globalną zasadę ignorowania pochodzenia + yes: Tak + no: Nie + actions: Akcje + edit_action: Edytuj + description: Tutaj możesz zarządzać globalnymi zasadami ignorowania pochodzenia, używanymi do ignorowania niektórych wzorców oryginalnych adresów URL. diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.zh_Hant.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.zh_Hant.yml index 0967ef424..3eb266348 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.zh_Hant.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.zh_Hant.yml @@ -1 +1,107 @@ -{} +config: + tab_menu: + feed: 訂閱源 + settings: 設定 + password: 密碼 + rules: 標籤規則 + ignore_origin: 忽略原始規則 + reset: 重設區域 + new_user: 新增使用者 + user_info: 使用者資訊 + page_title: 設定 + form_settings: + theme_label: 主題 + reading_speed: + 300_word: 我每分鐘約可讀 300 個字 + label: 閱讀速度 + help_message: 你可以使用線上工具來預估你的閱讀速度: + 100_word: 我每分鐘約可讀 100 個字 + 200_word: 我每分鐘約可讀 200 個字 + 400_word: 我每分鐘約可讀 400 個字 + action_mark_as_read: + redirect_homepage: 回到首頁 + redirect_current_page: 停留在本頁 + label: 將一個項目刪除、收藏或標記為已讀後該做什麼呢? + help_items_per_page: 你可以調整每頁呈現的項目數量。 + items_per_page_label: 每頁項目數量 + language_label: 語言 + form_feed: + description: 你可以使用你喜愛的 Atom 閱讀器來閱讀由 wallabag 提供的 Atom 訂閱源。為此你需要先產生一組 token。 + form_user: + delete: + description: 如果你移除了你自己的帳號,你所有的項目、標籤、註釋包含你的帳號本身都會被 "用久" 的移除(無法復原)。然後你將會被自動登出。 + form: + save: 儲存 +menu: + left: + quickstart: 快速開始 + ignore_origin_instance_rules: 全域忽略原始規則 + howto: 指南 + with_annotations: 附有註釋的 + tags: 標籤 + internal_settings: 內部設定 + import: 匯入 + logout: 登出 + search: 搜尋 + back_to_unread: 回到未讀項目 + users_management: 使用者管理 + site_credentials: 網站憑證 + theme_toggle_light: 淺色主題 + theme_toggle_dark: 深色主題 + theme_toggle_auto: 根據系統設定自動設定主題 + developer: 客戶端 API 管理 + config: 設定 + unread: 未讀 + starred: 收藏 + about: 關於 + save_link: 儲存連結 + all_articles: 所有項目 + archive: 歸檔 + top: + random_entry: 由列表中隨機選擇項目 + account: 我的帳號 + export: 匯出 + filter_entries: 項目篩選 + search: 搜尋 + add_new_entry: 新增項目 + search_form: + input_label: 請在此輸入搜尋字串 +security: + login: + submit: 登入 + register: 註冊 + page_title: 歡迎使用 wallabag! + keep_logged_in: 保持登入狀態 + forgot_password: 忘記密碼了嗎? + cancel: 取消 + username: 使用者名稱 + password: 密碼 + register: + page_title: 建立一個新帳號 + go_to_account: 前往你的帳號 + resetting: + description: 請輸入您的電子郵件地址,我們將會寄送密碼重製操作指示。 +footer: + wallabag: + elsewhere: 將 wallabag 隨身攜帶 + social: 社群 + powered_by: 運行於 + about: 關於 + stats: 自從 %user_creation% 以來,你已閱讀 %nb_archives% 篇項目. 這大約是 %per_day% 篇一天! +entry: + list: + show_same_domain: 顯示同一域名的項目 +howto: + shortcuts: + arrows_navigation: 在項目間導覽 +quickstart: + first_steps: + unread_articles: 然後將他分類! + docs: + all_docs: 還有另外許多的項目! + export: 將你的項目轉換為 ePUB 或 PDF 版本 + configure: + tagging_rules: 撰寫規則來自動化標籤你的項目 +import: + wallabag_v1: + description: 這個匯入器將會匯入 wallabag v1 中你所有的項目。在設定頁面的 "匯出 wallabag 資料" 頁簽中,點選 "匯出 JSON 檔",你將會得到檔名為 "wallabag-export-1-xxxx-xx-xx.json" 檔案。 diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig index 880461b2f..ce4101ec7 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig @@ -36,8 +36,4 @@ {% endfor %} - -
- -
{% endblock %} diff --git a/src/Wallabag/ImportBundle/Command/RedisWorkerCommand.php b/src/Wallabag/ImportBundle/Command/RedisWorkerCommand.php index 25d065d79..015824f99 100644 --- a/src/Wallabag/ImportBundle/Command/RedisWorkerCommand.php +++ b/src/Wallabag/ImportBundle/Command/RedisWorkerCommand.php @@ -18,7 +18,7 @@ class RedisWorkerCommand extends ContainerAwareCommand ->setName('wallabag:import:redis-worker') ->setDescription('Launch Redis worker') ->addArgument('serviceName', InputArgument::REQUIRED, 'Service to use: wallabag_v1, wallabag_v2, pocket, readability, pinboard, delicious, firefox, chrome or instapaper') - ->addOption('maxIterations', '', InputOption::VALUE_OPTIONAL, 'Number of iterations before stoping', false) + ->addOption('maxIterations', '', InputOption::VALUE_OPTIONAL, 'Number of iterations before stopping', false) ; } diff --git a/src/Wallabag/UserBundle/Resources/translations/wallabag_user.pl.yml b/src/Wallabag/UserBundle/Resources/translations/wallabag_user.pl.yml index 7e6eff353..2a96e91c5 100644 --- a/src/Wallabag/UserBundle/Resources/translations/wallabag_user.pl.yml +++ b/src/Wallabag/UserBundle/Resources/translations/wallabag_user.pl.yml @@ -1,12 +1,10 @@ auth_code: - on: włączony - mailer: - subject: Kod autoryzacyjny Wallabag - body: - hello: Cześć %user%, - first_para: Od momentu włączenia na swoim koncie autoryzacji dwuetapowej i zalogowaniu - się na nowym urządzeniu (komputer, telefon, etc.), wyślemy do ciebie kod potwierdzający - twoje połączenie. - second_para: 'Tutaj jest twój kod:' - support: 'Nie wahaj się skontaktować z nami, jeżeli masz jakiekolwiek problemy:' - signature: Zespół wallabag + on: włączony + mailer: + subject: Kod uwierzytelniający wallabag + body: + hello: Cześć, %user%, + first_para: Ponieważ do zalogowania się na konto wallabag wymagane jest uwierzytelnianie dwuskładnikowe, a nowe urządzenie właśnie z niego korzystało, wyślemy Ci kod, aby zweryfikować jego połączenie. + second_para: 'Oto kod:' + support: 'Nie wahaj się skontaktować z nami, jeżeli masz jakiekolwiek problemy:' + signature: Zespół wallabag diff --git a/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php b/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php index 9399844e1..69b3bb7e5 100644 --- a/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php +++ b/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php @@ -159,6 +159,25 @@ class EntryRestControllerTest extends WallabagApiTestCase $this->assertSame('application/json', $this->client->getResponse()->headers->get('Content-Type')); } + public function testGetEntriesByDomainName() + { + $this->client->request('GET', '/api/entries?domain_name=domain.io'); + + $this->assertSame(200, $this->client->getResponse()->getStatusCode()); + + $content = json_decode($this->client->getResponse()->getContent(), true); + + $this->assertGreaterThanOrEqual(1, \count($content)); + $this->assertNotEmpty($content['_embedded']['items']); + $this->assertGreaterThanOrEqual(1, $content['total']); + $this->assertSame(1, $content['page']); + $this->assertGreaterThanOrEqual(1, $content['pages']); + + $this->assertSame('test title entry6', $content['_embedded']['items'][0]['title']); + + $this->assertSame('application/json', $this->client->getResponse()->headers->get('Content-Type')); + } + public function testGetEntriesWithFullOptions() { $this->client->request('GET', '/api/entries', [ diff --git a/tests/Wallabag/ApiBundle/Controller/TagRestControllerTest.php b/tests/Wallabag/ApiBundle/Controller/TagRestControllerTest.php index a453939f6..804748afa 100644 --- a/tests/Wallabag/ApiBundle/Controller/TagRestControllerTest.php +++ b/tests/Wallabag/ApiBundle/Controller/TagRestControllerTest.php @@ -22,14 +22,13 @@ class TagRestControllerTest extends WallabagApiTestCase $this->assertGreaterThan(0, $content); $this->assertArrayHasKey('id', $content[0]); $this->assertArrayHasKey('label', $content[0]); + $this->assertArrayHasKey('nbEntries', $content[0]); $tagLabels = array_map(function ($i) { return $i['label']; }, $content); $this->assertNotContains($this->otherUserTagLabel, $tagLabels, 'There is a possible tag leak'); - - return end($content); } public function testDeleteUserTag() diff --git a/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php index 7cdf20ab6..b34a28e03 100644 --- a/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php +++ b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php @@ -1502,8 +1502,8 @@ class EntryControllerTest extends WallabagCoreTestCase 'pt_BR', ], 'es-ES' => [ - 'https://www.20minutos.es/noticia/3360685/0/gobierno-sanchez-primero-historia-mas-mujeres-que-hombres/', - 'es_ES', + 'https://elpais.com/internacional/2022-10-09/ultima-hora-de-la-guerra-en-ucrania-hoy-en-directo.html', + 'es', ], ]; } diff --git a/tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php b/tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php index 6b33cbc13..0732b4375 100644 --- a/tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php +++ b/tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php @@ -202,7 +202,7 @@ class DownloadImagesTest extends TestCase $this->assertFalse($res); } - public function testEnsureOnlyFirstOccurenceIsReplaced() + public function testEnsureOnlyFirstOccurrenceIsReplaced() { $httpMockClient = new HttpMockClient(); $httpMockClient->addResponse(new Response(200, ['content-type' => 'image/png'], file_get_contents(__DIR__ . '/../fixtures/unnamed.png'))); diff --git a/tests/Wallabag/ImportBundle/Controller/FirefoxControllerTest.php b/tests/Wallabag/ImportBundle/Controller/FirefoxControllerTest.php index 1c744eae8..ff1d602e9 100644 --- a/tests/Wallabag/ImportBundle/Controller/FirefoxControllerTest.php +++ b/tests/Wallabag/ImportBundle/Controller/FirefoxControllerTest.php @@ -118,7 +118,7 @@ class FirefoxControllerTest extends WallabagCoreTestCase ->get(EntityManagerInterface::class) ->getRepository(Entry::class) ->findByUrlAndUserId( - 'https://lexpansion.lexpress.fr/high-tech/orange-offre-un-meilleur-reseau-mobile-que-bouygues-et-sfr-free-derriere_1811554.html', + 'https://www.20minutes.fr/sport/4002755-20220928-tarn-lapins-ravagent-terrain-match-rugby-doit-etre-annule', $this->getLoggedInUserId() ); diff --git a/tests/Wallabag/ImportBundle/fixtures/firefox-bookmarks.json b/tests/Wallabag/ImportBundle/fixtures/firefox-bookmarks.json index 9bc922a6d..2491ea978 100644 --- a/tests/Wallabag/ImportBundle/fixtures/firefox-bookmarks.json +++ b/tests/Wallabag/ImportBundle/fixtures/firefox-bookmarks.json @@ -28,14 +28,14 @@ "children": [ { "guid": "tard77lzbC5H", - "title": "Orange offre un meilleur réseau mobile que Bouygues et SFR, Free derrière - L'Express L'Expansion", + "title": "Tarn : Des lapins ravagent le terrain, le match de rugby doit être annulé", "index": 1, "dateAdded": 1388166091644000, "lastModified": 1388166091644000, "tags": "test,tag", "id": 4, "type": "text/x-moz-place", - "uri": "http://lexpansion.lexpress.fr/high-tech/orange-offre-un-meilleur-reseau-mobile-que-bouygues-et-sfr-free-derriere_1811554.html" + "uri": "https://www.20minutes.fr/sport/4002755-20220928-tarn-lapins-ravagent-terrain-match-rugby-doit-etre-annule" }, { "guid": "E385l9vZ_LVn", diff --git a/web/wallassets/baggy.js b/web/wallassets/baggy.js index acc33aea9..26cf791be 100644 --- a/web/wallassets/baggy.js +++ b/web/wallassets/baggy.js @@ -1,2 +1,2 @@ -(()=>{var __webpack_modules__={5641:(e,t,n)=>{"use strict";n(8186)(n(262));var r=n(9731),i=n(9999);t.gV=r.App,n(1849),n(5587),t.notification=n(3612),t.storage=n(4623),t.ui=n(5443);var o=n.g.wgxpath;null!=o&&"function"==typeof o.install&&o.install();var a=n.g.annotator},9731:(e,t,n)=>{"use strict";var r=n(280),i=n(2702).Promise,o=n(1849),a=n(5587),s=n(3612),l=n(1258),c=n(4623);function T(){this.modules=[],this.registry=new l.Registry,this._started=!1,this.registry.registerUtility(s.defaultNotifier,"notifier"),this.include(o.acl),this.include(a.simple),this.include(c.noop)}T.prototype.include=function(e,t){var n=e(t);return"function"==typeof n.configure&&n.configure(this.registry),this.modules.push(n),this},T.prototype.start=function(){if(!this._started){this._started=!0;var e=this,t=this.registry;return this.authz=t.getUtility("authorizationPolicy"),this.ident=t.getUtility("identityPolicy"),this.notify=t.getUtility("notifier"),this.annotations=new c.StorageAdapter(t.getUtility("storage"),(function(){return e.runHook.apply(e,arguments)})),this.runHook("start",[this])}},T.prototype.destroy=function(){return this.runHook("destroy")},T.prototype.runHook=function(e,t){for(var n=[],r=0,o=this.modules.length;r{"use strict";var n;t.acl=function(){var e=new n;return{configure:function(t){t.registerUtility(e,"authorizationPolicy")}}},(n=t.AclAuthzPolicy=function(){}).prototype.permits=function(e,t,n){var r=this.authorizedUserId(n),i=t.permissions;if(i){var o=i[e];if(null==o)return!0;for(var a=0,s=o.length;a{"use strict";var n;t.simple=function(){var e=new n;return{configure:function(t){t.registerUtility(e,"identityPolicy")},beforeAnnotationCreated:function(t){t.user=e.who()}}},n=function(){this.identity=null},t.SimpleIdentityPolicy=n,n.prototype.who=function(){return this.identity}},3612:(e,t,n)=>{"use strict";var r=n(9999),i=r.$,o="info",a={show:"annotator-notice-show",info:"annotator-notice-info",success:"annotator-notice-success",error:"annotator-notice-error"};function s(e,t){null==t&&(t=o);var s=i("
")[0],l=!1,c=function(){l||(l=!0,i(s).removeClass(a.show).removeClass(a[t]),setTimeout((function(){i(s).remove()}),500))};return i(s).addClass(a.show).addClass(a[t]).html(r.escapeHtml(e||"")).appendTo(n.g.document.body),i(s).on("click",c),setTimeout(c,5e3),{close:c}}t.banner=s,t.defaultNotifier=s,t.INFO=o,t.SUCCESS="success",t.ERROR="error"},1258:(e,t)=>{"use strict";function n(){this.utilities={}}function r(e){this.name="LookupError",this.message='No utility registered for interface "'+e+'".'}n.prototype.registerUtility=function(e,t){this.utilities[t]=e},n.prototype.getUtility=function(e){var t=this.queryUtility(e);if(null===t)throw new r(e);return t},n.prototype.queryUtility=function(e){var t=this.utilities[e];return null==t?null:t},r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,t.LookupError=r,t.Registry=n},4623:(e,t,n)=>{"use strict";var r,i,o=n(9999),a=o.$,s=o.gettext,l=o.Promise,c=(r=-1,function(){return r+=1});function T(e,t){this.store=e,this.runHook=t}t.debug=function(){function e(e,t){var n=JSON.parse(JSON.stringify(t));console.debug("annotator.storage.debug: "+e,n)}return{create:function(t){return t.id=c(),e("create",t),t},update:function(t){return e("update",t),t},delete:function(t){return e("destroy",t),t},query:function(t){return e("query",t),{results:[],meta:{total:0}}},configure:function(e){e.registerUtility(this,"storage")}}},t.noop=function(){return{create:function(e){return void 0!==e.id&&null!==e.id||(e.id=c()),e},update:function(e){return e},delete:function(e){return e},query:function(){return{results:[]}},configure:function(e){e.registerUtility(this,"storage")}}},t.http=function(e){var t=function(){};null==e&&(e={}),e.onError=e.onError||function(e,n){console.error(e,n),t(e,"error")};var n=new i(e);return{configure:function(e){e.registerUtility(n,"storage")},start:function(e){t=e.notify}}},(i=t.HttpStorage=function e(t){this.options=a.extend(!0,{},e.options,t),this.onError=this.options.onError}).prototype.create=function(e){return this._apiRequest("create",e)},i.prototype.update=function(e){return this._apiRequest("update",e)},i.prototype.delete=function(e){return this._apiRequest("destroy",e)},i.prototype.query=function(e){return this._apiRequest("search",e).then((function(e){var t=e.rows;return delete e.rows,{results:t,meta:e}}))},i.prototype.setHeader=function(e,t){this.options.headers[e]=t},i.prototype._apiRequest=function(e,t){var n=t&&t.id,r=this._urlFor(e,n),i=this._apiRequestOptions(e,t),o=a.ajax(r,i);return o._id=n,o._action=e,o},i.prototype._apiRequestOptions=function(e,t){var n=this._methodFor(e),r=this,i={type:n,dataType:"json",error:function(){r._onError.apply(r,arguments)},headers:this.options.headers};if(!this.options.emulateHTTP||"PUT"!==n&&"DELETE"!==n||(i.headers=a.extend(i.headers,{"X-HTTP-Method-Override":n}),i.type="POST"),"search"===e)return i=a.extend(i,{data:t});var o=t&&JSON.stringify(t);return this.options.emulateJSON?(i.data={json:o},this.options.emulateHTTP&&(i.data._method=n),i):i=a.extend(i,{data:o,contentType:"application/json; charset=utf-8"})},i.prototype._urlFor=function(e,t){null==t&&(t="");var n="";return void 0!==this.options.prefix&&null!==this.options.prefix&&(n=this.options.prefix),n=(n+=this.options.urls[e]).replace(/idAnnotation/,t)},i.prototype._methodFor=function(e){return{create:"POST",update:"PUT",destroy:"DELETE",search:"GET"}[e]},i.prototype._onError=function(e){var t;"function"==typeof this.onError&&(t=400===e.status?s("The annotation store did not understand the request! (Error 400)"):401===e.status?s("You must be logged in to perform this operation! (Error 401)"):403===e.status?s("You don't have permission to perform this operation! (Error 403)"):404===e.status?s("Could not connect to the annotation store! (Error 404)"):500===e.status?s("Internal error in annotation store! (Error 500)"):s("Unknown error while speaking to annotation store!"),this.onError(t,e))},i.options={emulateHTTP:!1,emulateJSON:!1,headers:{},onError:function(e){console.error("API request failed: "+e)},prefix:"/store",urls:{create:"/annotations",update:"/annotations/idAnnotation",destroy:"/annotations/idAnnotation",search:"/search"}},T.prototype.create=function(e){return null==e&&(e={}),this._cycle(e,"create","beforeAnnotationCreated","annotationCreated")},T.prototype.update=function(e){if(void 0===e.id||null===e.id)throw new TypeError("annotation must have an id for update()");return this._cycle(e,"update","beforeAnnotationUpdated","annotationUpdated")},T.prototype.delete=function(e){if(void 0===e.id||null===e.id)throw new TypeError("annotation must have an id for delete()");return this._cycle(e,"delete","beforeAnnotationDeleted","annotationDeleted")},T.prototype.query=function(e){return l.resolve(this.store.query(e))},T.prototype.load=function(e){var t=this;return this.query(e).then((function(e){t.runHook("annotationsLoaded",[e.results])}))},T.prototype._cycle=function(e,t,n,r){var i=this;return this.runHook(n,[e]).then((function(){var n=a.extend(!0,{},e);delete n._local;var r=i.store[t](n);return l.resolve(r)})).then((function(t){for(var n in e)e.hasOwnProperty(n)&&"_local"!==n&&delete e[n];return a.extend(e,t),i.runHook(r,[e]),e}))},t.StorageAdapter=T},5443:(e,t,n)=>{t.main=n(3735).main,n(5107),n(8486),n(3826),n(7930),n(863),n(6996),n(7224),n(4233),n(3553)},5107:(e,t,n)=>{"use strict";var r=n(3553).$,i=n(9999),o=i.$,a=i.gettext,s="annotator-adder",l=r.extend({constructor:function(e){r.call(this,e),this.ignoreMouseup=!1,this.annotation=null,this.onCreate=this.options.onCreate;var t=this;this.element.on("click."+s,"button",(function(e){t._onClick(e)})).on("mousedown."+s,"button",(function(e){t._onMousedown(e)})),this.document=this.element[0].ownerDocument,o(this.document.body).on("mouseup."+s,(function(e){t._onMouseup(e)}))},destroy:function(){this.element.off("."+s),o(this.document.body).off("."+s),r.prototype.destroy.call(this)},load:function(e,t){this.annotation=e,this.show(t)},show:function(e){null!=e&&this.element.css({top:e.top,left:e.left}),r.prototype.show.call(this)},_onMousedown:function(e){e.which>1||(e.preventDefault(),this.ignoreMouseup=!0)},_onMouseup:function(e){e.which>1||this.ignoreMouseup&&e.stopImmediatePropagation()},_onClick:function(e){e.which>1||(e.preventDefault(),this.hide(),this.ignoreMouseup=!1,null!==this.annotation&&"function"==typeof this.onCreate&&this.onCreate(this.annotation,e))}});l.template=['
',' ","
"].join("\n"),l.options={onCreate:null},t.Adder=l},8486:(e,t,n)=>{"use strict";var r,i=n(3553).$,o=n(9999),a=o.$,s=o.gettext,l=o.Promise,c="annotator-editor",T=(r=-1,function(){return r+=1});function u(e){null!=e&&"function"==typeof e.preventDefault&&e.preventDefault()}var Q=t.dragTracker=function(e,t){var n=null,r=!1;function i(e){if(!r&&null!==n){var i={y:e.pageY-n.top,x:e.pageX-n.left},o=!0;"function"==typeof t&&(o=t(i)),!1!==o&&(n={top:e.pageY,left:e.pageX}),r=!0,setTimeout((function(){r=!1}),1e3/60)}}function o(){n=null,a(e.ownerDocument).off("mouseup",o).off("mousemove",i)}function s(t){t.target===e&&(n={top:t.pageY,left:t.pageX},a(e.ownerDocument).on("mouseup",o).on("mousemove",i),t.preventDefault())}return a(e).on("mousedown",s),{destroy:function(){a(e).off("mousedown",s)}}},d=t.resizer=function(e,t,n){var r=a(e);return null==n&&(n={}),Q(t,(function(e){var t=r.height(),i=r.width(),o=function(e){var t=1,r=-1;return"function"==typeof n.invertedX&&n.invertedX()&&(t=-1),"function"==typeof n.invertedY&&n.invertedY()&&(r=1),{x:e.x*t,y:e.y*r}}(e);return Math.abs(o.x)>0&&r.width(i+o.x),Math.abs(o.y)>0&&r.height(t+o.y),r.height()!==t||r.width()!==i}))},p=t.mover=function(e,t){return Q(t,(function(t){a(e).css({top:parseInt(a(e).css("top"),10)+t.y,left:parseInt(a(e).css("left"),10)+t.x})}))},_=t.Editor=i.extend({constructor:function(e){i.call(this,e),this.fields=[],this.annotation={},this.options.defaultFields&&this.addField({type:"textarea",label:s("Comments")+"…",load:function(e,t){a(e).find("textarea").val(t.text||"")},submit:function(e,t){t.text=a(e).find("textarea").val()}});var t=this;this.element.on("submit."+c,"form",(function(e){t._onFormSubmit(e)})).on("click."+c,".annotator-save",(function(e){t._onSaveClick(e)})).on("click."+c,".annotator-cancel",(function(e){t._onCancelClick(e)})).on("mouseover."+c,".annotator-cancel",(function(e){t._onCancelMouseover(e)})).on("keydown."+c,"textarea",(function(e){t._onTextareaKeydown(e)}))},destroy:function(){this.element.off("."+c),i.prototype.destroy.call(this)},show:function(e){null!=e&&this.element.css({top:e.top,left:e.left}),this.element.find(".annotator-save").addClass(this.classes.focus),i.prototype.show.call(this),this.element.find(":input:first").focus(),this._setupDraggables()},load:function(e,t){this.annotation=e;for(var n=0,r=this.fields.length;n');return t.element=r[0],"textarea"===t.type?n=a("",h.noCloneChecked=!!pe.cloneNode(!0).lastChild.defaultValue,pe.innerHTML="",h.option=!!pe.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function be(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&M(e,t)?L.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var ye=/<|&#?\w+;/;function Se(e,t,n,r,i){for(var o,a,s,l,c,T,u=t.createDocumentFragment(),Q=[],d=0,p=e.length;d-1)i&&i.push(o);else if(c=se(o),a=be(u.appendChild(o),"script"),c&&Ee(a),n)for(T=0;o=a[T++];)me.test(o.type||"")&&n.push(o);return u}var Le=/^([^.]*)(?:\.(.+)|)/;function ve(){return!0}function Oe(){return!1}function Ce(e,t){return e===function(){try{return g.activeElement}catch(e){}}()==("focus"===t)}function Ne(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ne(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Oe;else if(!i)return e;return 1===o&&(a=i,i=function(e){return L().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=L.guid++)),e.each((function(){L.event.add(this,t,i,r,n)}))}function Ae(e,t,n){n?(X.set(e,t,!1),L.event.add(e,t,{namespace:!1,handler:function(e){var r,i,o=X.get(this,t);if(1&e.isTrigger&&this[t]){if(o.length)(L.event.special[t]||{}).delegateType&&e.stopPropagation();else if(o=s.call(arguments),X.set(this,t,o),r=n(this,t),this[t](),o!==(i=X.get(this,t))||r?X.set(this,t,!1):i={},o!==i)return e.stopImmediatePropagation(),e.preventDefault(),i&&i.value}else o.length&&(X.set(this,t,{value:L.event.trigger(L.extend(o[0],L.Event.prototype),o.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===X.get(e,t)&&L.event.add(e,t,ve)}L.event={global:{},add:function(e,t,n,r,i){var o,a,s,l,c,T,u,Q,d,p,_,h=X.get(e);if($(e))for(n.handler&&(n=(o=n).handler,i=o.selector),i&&L.find.matchesSelector(ae,i),n.guid||(n.guid=L.guid++),(l=h.events)||(l=h.events=Object.create(null)),(a=h.handle)||(a=h.handle=function(t){return void 0!==L&&L.event.triggered!==t.type?L.event.dispatch.apply(e,arguments):void 0}),c=(t=(t||"").match(k)||[""]).length;c--;)d=_=(s=Le.exec(t[c])||[])[1],p=(s[2]||"").split(".").sort(),d&&(u=L.event.special[d]||{},d=(i?u.delegateType:u.bindType)||d,u=L.event.special[d]||{},T=L.extend({type:d,origType:_,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&L.expr.match.needsContext.test(i),namespace:p.join(".")},o),(Q=l[d])||((Q=l[d]=[]).delegateCount=0,u.setup&&!1!==u.setup.call(e,r,p,a)||e.addEventListener&&e.addEventListener(d,a)),u.add&&(u.add.call(e,T),T.handler.guid||(T.handler.guid=n.guid)),i?Q.splice(Q.delegateCount++,0,T):Q.push(T),L.event.global[d]=!0)},remove:function(e,t,n,r,i){var o,a,s,l,c,T,u,Q,d,p,_,h=X.hasData(e)&&X.get(e);if(h&&(l=h.events)){for(c=(t=(t||"").match(k)||[""]).length;c--;)if(d=_=(s=Le.exec(t[c])||[])[1],p=(s[2]||"").split(".").sort(),d){for(u=L.event.special[d]||{},Q=l[d=(r?u.delegateType:u.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=Q.length;o--;)T=Q[o],!i&&_!==T.origType||n&&n.guid!==T.guid||s&&!s.test(T.namespace)||r&&r!==T.selector&&("**"!==r||!T.selector)||(Q.splice(o,1),T.selector&&Q.delegateCount--,u.remove&&u.remove.call(e,T));a&&!Q.length&&(u.teardown&&!1!==u.teardown.call(e,p,h.handle)||L.removeEvent(e,d,h.handle),delete l[d])}else for(d in l)L.event.remove(e,d+t[c],n,r,!0);L.isEmptyObject(l)&&X.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),l=L.event.fix(e),c=(X.get(this,"events")||Object.create(null))[l.type]||[],T=L.event.special[l.type]||{};for(s[0]=l,t=1;t=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==e.type||!0!==c.disabled)){for(o=[],a={},n=0;n-1:L.find(i,this,null,[c]).length),a[i]&&o.push(r);o.length&&s.push({elem:c,handlers:o})}return c=this,l\s*$/g;function He(e,t){return M(e,"table")&&M(11!==t.nodeType?t:t.firstChild,"tr")&&L(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function we(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function De(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(X.hasData(e)&&(s=X.get(e).events))for(i in X.remove(t,"handle events"),s)for(n=0,r=s[i].length;n1&&"string"==typeof p&&!h.checkClone&&Re.test(p))return e.each((function(i){var o=e.eq(i);_&&(t[0]=p.call(this,i,o.html())),ke(o,t,n,r)}));if(Q&&(o=(i=Se(t,e[0].ownerDocument,!1,e,r)).firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=(a=L.map(be(i,"script"),Ie)).length;u0&&Ee(a,!l&&be(e,"script")),s},cleanData:function(e){for(var t,n,r,i=L.event.special,o=0;void 0!==(n=e[o]);o++)if($(n)){if(t=n[X.expando]){if(t.events)for(r in t.events)i[r]?L.event.remove(n,r):L.removeEvent(n,r,t.handle);n[X.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),L.fn.extend({detach:function(e){return Ve(this,e,!0)},remove:function(e){return Ve(this,e)},text:function(e){return q(this,(function(e){return void 0===e?L.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)}))}),null,e,arguments.length)},append:function(){return ke(this,arguments,(function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||He(this,e).appendChild(e)}))},prepend:function(){return ke(this,arguments,(function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=He(this,e);t.insertBefore(e,t.firstChild)}}))},before:function(){return ke(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this)}))},after:function(){return ke(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)}))},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(L.cleanData(be(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map((function(){return L.clone(this,e,t)}))},html:function(e){return q(this,(function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Me.test(e)&&!ge[(fe.exec(e)||["",""])[1].toLowerCase()]){e=L.htmlPrefilter(e);try{for(;n=0&&(l+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-l-s-.5))||0),l}function nt(e,t,n){var r=Be(e),i=(!h.boxSizingReliable()||n)&&"border-box"===L.css(e,"boxSizing",!1,r),o=i,a=je(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Fe.test(a)){if(!n)return a;a="auto"}return(!h.boxSizingReliable()&&i||!h.reliableTrDimensions()&&M(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===L.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===L.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+tt(e,t,n||(i?"border":"content"),o,r,a)+"px"}function rt(e,t,n,r,i){return new rt.prototype.init(e,t,n,r,i)}L.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=je(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=Z(t),l=Ke.test(t),c=e.style;if(l||(t=Ze(s)),a=L.cssHooks[t]||L.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:c[t];"string"===(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=Te(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||l||(n+=i&&i[3]||(L.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(c[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(l?c.setProperty(t,n):c[t]=n))}},css:function(e,t,n,r){var i,o,a,s=Z(t);return Ke.test(t)||(t=Ze(s)),(a=L.cssHooks[t]||L.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=je(e,t,r)),"normal"===i&&t in Je&&(i=Je[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),L.each(["height","width"],(function(e,t){L.cssHooks[t]={get:function(e,n,r){if(n)return!$e.test(L.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?nt(e,t,r):Ue(e,Xe,(function(){return nt(e,t,r)}))},set:function(e,n,r){var i,o=Be(e),a=!h.scrollboxSize()&&"absolute"===o.position,s=(a||r)&&"border-box"===L.css(e,"boxSizing",!1,o),l=r?tt(e,t,r,s,o):0;return s&&a&&(l-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-tt(e,t,"border",!1,o)-.5)),l&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=L.css(e,t)),et(0,n,l)}}})),L.cssHooks.marginLeft=qe(h.reliableMarginLeft,(function(e,t){if(t)return(parseFloat(je(e,"marginLeft"))||e.getBoundingClientRect().left-Ue(e,{marginLeft:0},(function(){return e.getBoundingClientRect().left})))+"px"})),L.each({margin:"",padding:"",border:"Width"},(function(e,t){L.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(L.cssHooks[e+t].set=et)})),L.fn.extend({css:function(e,t){return q(this,(function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Be(e),i=t.length;a1)}}),L.Tween=rt,rt.prototype={constructor:rt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||L.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(L.cssNumber[n]?"":"px")},cur:function(){var e=rt.propHooks[this.prop];return e&&e.get?e.get(this):rt.propHooks._default.get(this)},run:function(e){var t,n=rt.propHooks[this.prop];return this.options.duration?this.pos=t=L.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rt.propHooks._default.set(this),this}},rt.prototype.init.prototype=rt.prototype,rt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=L.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){L.fx.step[e.prop]?L.fx.step[e.prop](e):1!==e.elem.nodeType||!L.cssHooks[e.prop]&&null==e.elem.style[Ze(e.prop)]?e.elem[e.prop]=e.now:L.style(e.elem,e.prop,e.now+e.unit)}}},rt.propHooks.scrollTop=rt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},L.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},L.fx=rt.prototype.init,L.fx.step={};var it,ot,at=/^(?:toggle|show|hide)$/,st=/queueHooks$/;function lt(){ot&&(!1===g.hidden&&r.requestAnimationFrame?r.requestAnimationFrame(lt):r.setTimeout(lt,L.fx.interval),L.fx.tick())}function ct(){return r.setTimeout((function(){it=void 0})),it=Date.now()}function Tt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(Qt.tweeners[t]||[]).concat(Qt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each((function(){L.removeAttr(this,e)}))}}),L.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===e.getAttribute?L.prop(e,t,n):(1===o&&L.isXMLDoc(e)||(i=L.attrHooks[t.toLowerCase()]||(L.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void L.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=L.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&M(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(k);if(i&&1===e.nodeType)for(;n=i[r++];)e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?L.removeAttr(e,n):e.setAttribute(n,n),n}},L.each(L.expr.match.bool.source.match(/\w+/g),(function(e,t){var n=pt[t]||L.find.attr;pt[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=pt[a],pt[a]=i,i=null!=n(e,t,r)?a:null,pt[a]=o),i}}));var _t=/^(?:input|select|textarea|button)$/i,ht=/^(?:a|area)$/i;function ft(e){return(e.match(k)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function gt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(k)||[]}L.fn.extend({prop:function(e,t){return q(this,L.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each((function(){delete this[L.propFix[e]||e]}))}}),L.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&L.isXMLDoc(e)||(t=L.propFix[t]||t,i=L.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=L.find.attr(e,"tabindex");return t?parseInt(t,10):_t.test(e.nodeName)||ht.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),h.optSelected||(L.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),L.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){L.propFix[this.toLowerCase()]=this})),L.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,l=0;if(f(e))return this.each((function(t){L(this).addClass(e.call(this,t,mt(this)))}));if((t=gt(e)).length)for(;n=this[l++];)if(i=mt(n),r=1===n.nodeType&&" "+ft(i)+" "){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ft(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,l=0;if(f(e))return this.each((function(t){L(this).removeClass(e.call(this,t,mt(this)))}));if(!arguments.length)return this.attr("class","");if((t=gt(e)).length)for(;n=this[l++];)if(i=mt(n),r=1===n.nodeType&&" "+ft(i)+" "){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");i!==(s=ft(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):f(e)?this.each((function(n){L(this).toggleClass(e.call(this,n,mt(this),t),t)})):this.each((function(){var t,i,o,a;if(r)for(i=0,o=L(this),a=gt(e);t=a[i++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||((t=mt(this))&&X.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":X.get(this,"__className__")||""))}))},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+ft(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;L.fn.extend({val:function(e){var t,n,r,i=this[0];return arguments.length?(r=f(e),this.each((function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,L(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=L.map(i,(function(e){return null==e?"":e+""}))),(t=L.valHooks[this.type]||L.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))}))):i?(t=L.valHooks[i.type]||L.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n:void 0}}),L.extend({valHooks:{option:{get:function(e){var t=L.find.attr(e,"value");return null!=t?t:ft(L.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],l=a?o+1:i.length;for(r=o<0?l:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),L.each(["radio","checkbox"],(function(){L.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=L.inArray(L(e).val(),t)>-1}},h.checkOn||(L.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})})),h.focusin="onfocusin"in r;var Et=/^(?:focusinfocus|focusoutblur)$/,yt=function(e){e.stopPropagation()};L.extend(L.event,{trigger:function(e,t,n,i){var o,a,s,l,c,T,u,Q,p=[n||g],_=d.call(e,"type")?e.type:e,h=d.call(e,"namespace")?e.namespace.split("."):[];if(a=Q=s=n=n||g,3!==n.nodeType&&8!==n.nodeType&&!Et.test(_+L.event.triggered)&&(_.indexOf(".")>-1&&(h=_.split("."),_=h.shift(),h.sort()),c=_.indexOf(":")<0&&"on"+_,(e=e[L.expando]?e:new L.Event(_,"object"==typeof e&&e)).isTrigger=i?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:L.makeArray(t,[e]),u=L.event.special[_]||{},i||!u.trigger||!1!==u.trigger.apply(n,t))){if(!i&&!u.noBubble&&!m(n)){for(l=u.delegateType||_,Et.test(l+_)||(a=a.parentNode);a;a=a.parentNode)p.push(a),s=a;s===(n.ownerDocument||g)&&p.push(s.defaultView||s.parentWindow||r)}for(o=0;(a=p[o++])&&!e.isPropagationStopped();)Q=a,e.type=o>1?l:u.bindType||_,(T=(X.get(a,"events")||Object.create(null))[e.type]&&X.get(a,"handle"))&&T.apply(a,t),(T=c&&a[c])&&T.apply&&$(a)&&(e.result=T.apply(a,t),!1===e.result&&e.preventDefault());return e.type=_,i||e.isDefaultPrevented()||u._default&&!1!==u._default.apply(p.pop(),t)||!$(n)||c&&f(n[_])&&!m(n)&&((s=n[c])&&(n[c]=null),L.event.triggered=_,e.isPropagationStopped()&&Q.addEventListener(_,yt),n[_](),e.isPropagationStopped()&&Q.removeEventListener(_,yt),L.event.triggered=void 0,s&&(n[c]=s)),e.result}},simulate:function(e,t,n){var r=L.extend(new L.Event,n,{type:e,isSimulated:!0});L.event.trigger(r,null,t)}}),L.fn.extend({trigger:function(e,t){return this.each((function(){L.event.trigger(e,t,this)}))},triggerHandler:function(e,t){var n=this[0];if(n)return L.event.trigger(e,t,n,!0)}}),h.focusin||L.each({focus:"focusin",blur:"focusout"},(function(e,t){var n=function(e){L.event.simulate(t,e.target,L.event.fix(e))};L.event.special[t]={setup:function(){var r=this.ownerDocument||this.document||this,i=X.access(r,t);i||r.addEventListener(e,n,!0),X.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this.document||this,i=X.access(r,t)-1;i?X.access(r,t,i):(r.removeEventListener(e,n,!0),X.remove(r,t))}}}));var St=r.location,Lt={guid:Date.now()},vt=/\?/;L.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new r.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||L.error("Invalid XML: "+(n?L.map(n.childNodes,(function(e){return e.textContent})).join("\n"):e)),t};var Ot=/\[\]$/,Ct=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function Mt(e,t,n,r){var i;if(Array.isArray(t))L.each(t,(function(t,i){n||Ot.test(e)?r(e,i):Mt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)}));else if(n||"object"!==y(t))r(e,t);else for(i in t)Mt(e+"["+i+"]",t[i],n,r)}L.param=function(e,t){var n,r=[],i=function(e,t){var n=f(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!L.isPlainObject(e))L.each(e,(function(){i(this.name,this.value)}));else for(n in e)Mt(n,e[n],t,i);return r.join("&")},L.fn.extend({serialize:function(){return L.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var e=L.prop(this,"elements");return e?L.makeArray(e):this})).filter((function(){var e=this.type;return this.name&&!L(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!he.test(e))})).map((function(e,t){var n=L(this).val();return null==n?null:Array.isArray(n)?L.map(n,(function(e){return{name:t.name,value:e.replace(Ct,"\r\n")}})):{name:t.name,value:n.replace(Ct,"\r\n")}})).get()}});var Rt=/%20/g,xt=/#.*$/,Ht=/([?&])_=[^&]*/,It=/^(.*?):[ \t]*([^\r\n]*)$/gm,wt=/^(?:GET|HEAD)$/,Dt=/^\/\//,Pt={},kt={},Vt="*/".concat("*"),Ft=g.createElement("a");function Bt(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(k)||[];if(f(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function Ut(e,t,n,r){var i={},o=e===kt;function a(s){var l;return i[s]=!0,L.each(e[s]||[],(function(e,s){var c=s(t,n,r);return"string"!=typeof c||o||i[c]?o?!(l=c):void 0:(t.dataTypes.unshift(c),a(c),!1)})),l}return a(t.dataTypes[0])||!i["*"]&&a("*")}function Gt(e,t){var n,r,i=L.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&L.extend(!0,e,r),e}Ft.href=St.href,L.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:St.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(St.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Vt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":L.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Gt(Gt(e,L.ajaxSettings),t):Gt(L.ajaxSettings,e)},ajaxPrefilter:Bt(Pt),ajaxTransport:Bt(kt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var n,i,o,a,s,l,c,T,u,Q,d=L.ajaxSetup({},t),p=d.context||d,_=d.context&&(p.nodeType||p.jquery)?L(p):L.event,h=L.Deferred(),f=L.Callbacks("once memory"),m=d.statusCode||{},b={},E={},y="canceled",S={readyState:0,getResponseHeader:function(e){var t;if(c){if(!a)for(a={};t=It.exec(o);)a[t[1].toLowerCase()+" "]=(a[t[1].toLowerCase()+" "]||[]).concat(t[2]);t=a[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return c?o:null},setRequestHeader:function(e,t){return null==c&&(e=E[e.toLowerCase()]=E[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)S.always(e[S.status]);else for(t in e)m[t]=[m[t],e[t]];return this},abort:function(e){var t=e||y;return n&&n.abort(t),v(0,t),this}};if(h.promise(S),d.url=((e||d.url||St.href)+"").replace(Dt,St.protocol+"//"),d.type=t.method||t.type||d.method||d.type,d.dataTypes=(d.dataType||"*").toLowerCase().match(k)||[""],null==d.crossDomain){l=g.createElement("a");try{l.href=d.url,l.href=l.href,d.crossDomain=Ft.protocol+"//"+Ft.host!=l.protocol+"//"+l.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&"string"!=typeof d.data&&(d.data=L.param(d.data,d.traditional)),Ut(Pt,d,t,S),c)return S;for(u in(T=L.event&&d.global)&&0==L.active++&&L.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!wt.test(d.type),i=d.url.replace(xt,""),d.hasContent?d.data&&d.processData&&0===(d.contentType||"").indexOf("application/x-www-form-urlencoded")&&(d.data=d.data.replace(Rt,"+")):(Q=d.url.slice(i.length),d.data&&(d.processData||"string"==typeof d.data)&&(i+=(vt.test(i)?"&":"?")+d.data,delete d.data),!1===d.cache&&(i=i.replace(Ht,"$1"),Q=(vt.test(i)?"&":"?")+"_="+Lt.guid+++Q),d.url=i+Q),d.ifModified&&(L.lastModified[i]&&S.setRequestHeader("If-Modified-Since",L.lastModified[i]),L.etag[i]&&S.setRequestHeader("If-None-Match",L.etag[i])),(d.data&&d.hasContent&&!1!==d.contentType||t.contentType)&&S.setRequestHeader("Content-Type",d.contentType),S.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Vt+"; q=0.01":""):d.accepts["*"]),d.headers)S.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(!1===d.beforeSend.call(p,S,d)||c))return S.abort();if(y="abort",f.add(d.complete),S.done(d.success),S.fail(d.error),n=Ut(kt,d,t,S)){if(S.readyState=1,T&&_.trigger("ajaxSend",[S,d]),c)return S;d.async&&d.timeout>0&&(s=r.setTimeout((function(){S.abort("timeout")}),d.timeout));try{c=!1,n.send(b,v)}catch(e){if(c)throw e;v(-1,e)}}else v(-1,"No Transport");function v(e,t,a,l){var u,Q,g,b,E,y=t;c||(c=!0,s&&r.clearTimeout(s),n=void 0,o=l||"",S.readyState=e>0?4:0,u=e>=200&&e<300||304===e,a&&(b=function(e,t,n){for(var r,i,o,a,s=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){l.unshift(i);break}if(l[0]in n)o=l[0];else{for(i in n){if(!l[0]||e.converters[i+" "+l[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==l[0]&&l.unshift(o),n[o]}(d,S,a)),!u&&L.inArray("script",d.dataTypes)>-1&&L.inArray("json",d.dataTypes)<0&&(d.converters["text script"]=function(){}),b=function(e,t,n,r){var i,o,a,s,l,c={},T=e.dataTypes.slice();if(T[1])for(a in e.converters)c[a.toLowerCase()]=e.converters[a];for(o=T.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=T.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(!(a=c[l+" "+o]||c["* "+o]))for(i in c)if((s=i.split(" "))[1]===o&&(a=c[l+" "+s[0]]||c["* "+s[0]])){!0===a?a=c[i]:!0!==c[i]&&(o=s[0],T.unshift(s[1]));break}if(!0!==a)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}(d,b,S,u),u?(d.ifModified&&((E=S.getResponseHeader("Last-Modified"))&&(L.lastModified[i]=E),(E=S.getResponseHeader("etag"))&&(L.etag[i]=E)),204===e||"HEAD"===d.type?y="nocontent":304===e?y="notmodified":(y=b.state,Q=b.data,u=!(g=b.error))):(g=y,!e&&y||(y="error",e<0&&(e=0))),S.status=e,S.statusText=(t||y)+"",u?h.resolveWith(p,[Q,y,S]):h.rejectWith(p,[S,y,g]),S.statusCode(m),m=void 0,T&&_.trigger(u?"ajaxSuccess":"ajaxError",[S,d,u?Q:g]),f.fireWith(p,[S,y]),T&&(_.trigger("ajaxComplete",[S,d]),--L.active||L.event.trigger("ajaxStop")))}return S},getJSON:function(e,t,n){return L.get(e,t,n,"json")},getScript:function(e,t){return L.get(e,void 0,t,"script")}}),L.each(["get","post"],(function(e,t){L[t]=function(e,n,r,i){return f(n)&&(i=i||r,r=n,n=void 0),L.ajax(L.extend({url:e,type:t,dataType:i,data:n,success:r},L.isPlainObject(e)&&e))}})),L.ajaxPrefilter((function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")})),L._evalUrl=function(e,t,n){return L.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){L.globalEval(e,t,n)}})},L.fn.extend({wrapAll:function(e){var t;return this[0]&&(f(e)&&(e=e.call(this[0])),t=L(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map((function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e})).append(this)),this},wrapInner:function(e){return f(e)?this.each((function(t){L(this).wrapInner(e.call(this,t))})):this.each((function(){var t=L(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)}))},wrap:function(e){var t=f(e);return this.each((function(n){L(this).wrapAll(t?e.call(this,n):e)}))},unwrap:function(e){return this.parent(e).not("body").each((function(){L(this).replaceWith(this.childNodes)})),this}}),L.expr.pseudos.hidden=function(e){return!L.expr.pseudos.visible(e)},L.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},L.ajaxSettings.xhr=function(){try{return new r.XMLHttpRequest}catch(e){}};var jt={0:200,1223:204},qt=L.ajaxSettings.xhr();h.cors=!!qt&&"withCredentials"in qt,h.ajax=qt=!!qt,L.ajaxTransport((function(e){var t,n;if(h.cors||qt&&!e.crossDomain)return{send:function(i,o){var a,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(a in e.xhrFields)s[a]=e.xhrFields[a];for(a in e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest"),i)s.setRequestHeader(a,i[a]);t=function(e){return function(){t&&(t=n=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(jt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=t(),n=s.onerror=s.ontimeout=t("error"),void 0!==s.onabort?s.onabort=n:s.onreadystatechange=function(){4===s.readyState&&r.setTimeout((function(){t&&n()}))},t=t("abort");try{s.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}})),L.ajaxPrefilter((function(e){e.crossDomain&&(e.contents.script=!1)})),L.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return L.globalEval(e),e}}}),L.ajaxPrefilter("script",(function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")})),L.ajaxTransport("script",(function(e){var t,n;if(e.crossDomain||e.scriptAttrs)return{send:function(r,i){t=L("